+++ /dev/null
---- linux-2.6.0/arch/alpha/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/alpha/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -252,9 +252,11 @@ static int
- irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%016lx\n", irq_affinity[(long)data]);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static unsigned int
-@@ -331,10 +333,11 @@ static int
- prof_cpu_mask_read_proc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- unsigned long *mask = (unsigned long *) data;
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%016lx\n", *mask);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static int
-@@ -529,19 +532,21 @@ show_interrupts(struct seq_file *p, void
- #ifdef CONFIG_SMP
- int j;
- #endif
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
-
- #ifdef CONFIG_SMP
-- seq_puts(p, " ");
-- for (i = 0; i < NR_CPUS; i++)
-- if (cpu_online(i))
-- seq_printf(p, "CPU%d ", i);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_puts(p, " ");
-+ for (i = 0; i < NR_CPUS; i++)
-+ if (cpu_online(i))
-+ seq_printf(p, "CPU%d ", i);
-+ seq_putc(p, '\n');
-+ }
- #endif
-
-- for (i = 0; i < ACTUAL_NR_IRQS; i++) {
-+ if (i < ACTUAL_NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -568,15 +573,16 @@ show_interrupts(struct seq_file *p, void
- seq_putc(p, '\n');
- unlock:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-- }
-+ } else if (i == ACTUAL_NR_IRQS) {
- #ifdef CONFIG_SMP
-- seq_puts(p, "IPI: ");
-- for (i = 0; i < NR_CPUS; i++)
-- if (cpu_online(i))
-- seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
-- seq_putc(p, '\n');
-+ seq_puts(p, "IPI: ");
-+ for (i = 0; i < NR_CPUS; i++)
-+ if (cpu_online(i))
-+ seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
-+ seq_putc(p, '\n');
- #endif
-- seq_printf(p, "ERR: %10lu\n", irq_err_count);
-+ seq_printf(p, "ERR: %10lu\n", irq_err_count);
-+ }
- return 0;
- }
-
---- linux-2.6.0/arch/alpha/kernel/traps.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/alpha/kernel/traps.c 2003-12-28 23:22:11.000000000 -0800
-@@ -636,6 +636,7 @@ do_entUna(void * va, unsigned long opcod
- lock_kernel();
- printk("Bad unaligned kernel access at %016lx: %p %lx %ld\n",
- pc, va, opcode, reg);
-+ dump_stack();
- do_exit(SIGSEGV);
-
- got_exception:
---- linux-2.6.0/arch/arm26/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/arm26/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -135,10 +135,10 @@ void enable_irq(unsigned int irq)
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- action = irq_desc[i].action;
- if (!action)
- continue;
-@@ -148,10 +148,10 @@ int show_interrupts(struct seq_file *p,
- seq_printf(p, ", %s", action->name);
- }
- seq_putc(p, '\n');
-+ } else if (i == NR_IRQS) {
-+ show_fiq_list(p, v);
-+ seq_printf(p, "Err: %10lu\n", irq_err_count);
- }
--
-- show_fiq_list(p, v);
-- seq_printf(p, "Err: %10lu\n", irq_err_count);
- return 0;
- }
-
---- linux-2.6.0/arch/arm/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/arm/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -169,11 +169,11 @@ void disable_irq_wake(unsigned int irq)
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_controller_lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -187,12 +187,12 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- unlock:
- spin_unlock_irqrestore(&irq_controller_lock, flags);
-- }
--
-+ } else if (i == NR_IRQS) {
- #ifdef CONFIG_ARCH_ACORN
-- show_fiq_list(p, v);
-+ show_fiq_list(p, v);
- #endif
-- seq_printf(p, "Err: %10lu\n", irq_err_count);
-+ seq_printf(p, "Err: %10lu\n", irq_err_count);
-+ }
- return 0;
- }
-
---- linux-2.6.0/arch/arm/mach-sa1100/Kconfig 2003-06-14 12:18:52.000000000 -0700
-+++ 25/arch/arm/mach-sa1100/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -304,7 +304,7 @@ config SA1100_YOPY
- depends on ARCH_SA1100
- help
- Say Y here to support the Yopy PDA. Product information at
-- <http://www.yopy.com/>. See Documentation/arm/SA110/Yopy
-+ <http://www.yopy.com/>. See Documentation/arm/SA1100/Yopy
- for more.
-
- config SA1100_STORK
---- linux-2.6.0/arch/arm/Makefile 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/arm/Makefile 2003-12-28 23:21:55.000000000 -0800
-@@ -14,8 +14,6 @@ OBJCOPYFLAGS :=-O binary -R .note -R .co
- GZFLAGS :=-9
- #CFLAGS +=-pipe
-
--CFLAGS :=$(CFLAGS:-O2=-Os)
--
- ifeq ($(CONFIG_FRAME_POINTER),y)
- CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
- endif
---- linux-2.6.0/arch/cris/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/cris/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -89,11 +89,11 @@ static struct irqaction *irq_action[NR_I
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- local_irq_save(flags);
- action = irq_action[i];
- if (!action)
---- linux-2.6.0/arch/h8300/Kconfig 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/h8300/Kconfig 2003-12-28 23:21:55.000000000 -0800
-@@ -5,6 +5,10 @@
-
- mainmenu "uClinux/h8300 (w/o MMU) Kernel Configuration"
-
-+config H8300
-+ bool
-+ default y
-+
- config MMU
- bool
- default n
---- linux-2.6.0/arch/h8300/Makefile 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/h8300/Makefile 2003-12-28 23:21:55.000000000 -0800
-@@ -34,7 +34,7 @@ cflags-$(CONFIG_CPU_H8S) := -ms
- ldflags-$(CONFIG_CPU_H8S) := -mh8300self
-
- CFLAGS += $(cflags-y)
--CFLAGS += -mint32 -fno-builtin -Os
-+CFLAGS += -mint32 -fno-builtin
- CFLAGS += -g
- CFLAGS += -D__linux__
- CFLAGS += -DUTS_SYSNAME=\"uClinux\"
---- linux-2.6.0/arch/h8300/platform/h8300h/ints.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/h8300/platform/h8300h/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -228,9 +228,9 @@ asmlinkage void process_int(int vec, str
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- if (irq_list[i]) {
- seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
- seq_printf(p, "%s\n", irq_list[i]->devname);
---- linux-2.6.0/arch/h8300/platform/h8s/ints.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/h8300/platform/h8s/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -280,9 +280,9 @@ asmlinkage void process_int(unsigned lon
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- if (irq_list[i]) {
- seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
- seq_printf(p, "%s\n", irq_list[i]->devname);
---- linux-2.6.0/arch/i386/boot/setup.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/boot/setup.S 2003-12-28 23:26:36.000000000 -0800
-@@ -162,7 +162,7 @@ cmd_line_ptr: .long 0 # (Header versio
- # can be located anywhere in
- # low memory 0x10000 or higher.
-
--ramdisk_max: .long MAXMEM-1 # (Header version 0x0203 or later)
-+ramdisk_max: .long __MAXMEM-1 # (Header version 0x0203 or later)
- # The highest safe address for
- # the contents of an initrd
-
---- linux-2.6.0/arch/i386/Kconfig 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/Kconfig 2003-12-28 23:26:36.000000000 -0800
-@@ -115,10 +115,15 @@ config ACPI_SRAT
- default y
- depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
-
-+config X86_SUMMIT_NUMA
-+ bool
-+ default y
-+ depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
-+
- config X86_CYCLONE_TIMER
-- bool
-- default y
-- depends on X86_SUMMIT || X86_GENERICARCH
-+ bool
-+ default y
-+ depends on X86_SUMMIT || X86_GENERICARCH
-
- config ES7000_CLUSTERED_APIC
- bool
-@@ -397,6 +402,54 @@ config X86_OOSTORE
- depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6
- default y
-
-+config X86_4G
-+ bool "4 GB kernel-space and 4 GB user-space virtual memory support"
-+ help
-+ This option is only useful for systems that have more than 1 GB
-+ of RAM.
-+
-+ The default kernel VM layout leaves 1 GB of virtual memory for
-+ kernel-space mappings, and 3 GB of VM for user-space applications.
-+ This option ups both the kernel-space VM and the user-space VM to
-+ 4 GB.
-+
-+ The cost of this option is additional TLB flushes done at
-+ system-entry points that transition from user-mode into kernel-mode.
-+ I.e. system calls and page faults, and IRQs that interrupt user-mode
-+ code. There's also additional overhead to kernel operations that copy
-+ memory to/from user-space. The overhead from this is hard to tell and
-+ depends on the workload - it can be anything from no visible overhead
-+ to 20-30% overhead. A good rule of thumb is to count with a runtime
-+ overhead of 20%.
-+
-+ The upside is the much increased kernel-space VM, which more than
-+ quadruples the maximum amount of RAM supported. Kernels compiled with
-+ this option boot on 64GB of RAM and still have more than 3.1 GB of
-+ 'lowmem' left. Another bonus is that highmem IO bouncing decreases,
-+ if used with drivers that still use bounce-buffers.
-+
-+ There's also a 33% increase in user-space VM size - database
-+ applications might see a boost from this.
-+
-+ But the cost of the TLB flushes and the runtime overhead has to be
-+ weighed against the bonuses offered by the larger VM spaces. The
-+ dividing line depends on the actual workload - there might be 4 GB
-+ systems that benefit from this option. Systems with less than 4 GB
-+ of RAM will rarely see a benefit from this option - but it's not
-+ out of question, the exact circumstances have to be considered.
-+
-+config X86_SWITCH_PAGETABLES
-+ def_bool X86_4G
-+
-+config X86_4G_VM_LAYOUT
-+ def_bool X86_4G
-+
-+config X86_UACCESS_INDIRECT
-+ def_bool X86_4G
-+
-+config X86_HIGH_ENTRY
-+ def_bool X86_4G
-+
- config HPET_TIMER
- bool "HPET Timer Support"
- help
-@@ -784,6 +837,25 @@ config MTRR
-
- See <file:Documentation/mtrr.txt> for more information.
-
-+config EFI
-+ bool "Boot from EFI support (EXPERIMENTAL)"
-+ depends on ACPI
-+ default n
-+ ---help---
-+
-+ This enables the the kernel to boot on EFI platforms using
-+ system configuration information passed to it from the firmware.
-+ This also enables the kernel to use any EFI runtime services that are
-+ available (such as the EFI variable services).
-+
-+ This option is only useful on systems that have EFI firmware
-+ and will result in a kernel image that is ~8k larger. In addition,
-+ you must use the latest ELILO loader available at
-+ ftp.hpl.hp.com/pub/linux-ia64/ in order to take advantage of kernel
-+ initialization using EFI information (neither GRUB nor LILO know
-+ anything about EFI). However, even with this option, the resultant
-+ kernel should continue to boot on existing non-EFI platforms.
-+
- config HAVE_DEC_LOCK
- bool
- depends on (SMP || PREEMPT) && X86_CMPXCHG
-@@ -793,7 +865,7 @@ config HAVE_DEC_LOCK
- # Summit needs it only when NUMA is on
- config BOOT_IOREMAP
- bool
-- depends on ((X86_SUMMIT || X86_GENERICARCH) && NUMA)
-+ depends on (((X86_SUMMIT || X86_GENERICARCH) && NUMA) || (X86 && EFI))
- default y
-
- endmenu
-@@ -1030,6 +1102,25 @@ config PCI_DIRECT
- depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS)
- default y
-
-+config PCI_USE_VECTOR
-+ bool "Vector-based interrupt indexing"
-+ depends on X86_LOCAL_APIC
-+ default n
-+ help
-+ This replaces the current existing IRQ-based index interrupt scheme
-+ with the vector-base index scheme. The advantages of vector base
-+ over IRQ base are listed below:
-+ 1) Support MSI implementation.
-+ 2) Support future IOxAPIC hotplug
-+
-+ Note that this enables MSI, Message Signaled Interrupt, on all
-+ MSI capable device functions detected if users also install the
-+ MSI patch. Message Signal Interrupt enables an MSI-capable
-+ hardware device to send an inbound Memory Write on its PCI bus
-+ instead of asserting IRQ signal on device IRQ pin.
-+
-+ If you don't know what to do here, say N.
-+
- source "drivers/pci/Kconfig"
-
- config ISA
-@@ -1187,6 +1278,15 @@ config DEBUG_PAGEALLOC
- This results in a large slowdown, but helps to find certain types
- of memory corruptions.
-
-+config SPINLINE
-+ bool "Spinlock inlining"
-+ depends on DEBUG_KERNEL
-+ help
-+ This will change spinlocks from out of line to inline, making them
-+ account cost to the callers in readprofile, rather than the lock
-+ itself (as ".text.lock.filename"). This can be helpful for finding
-+ the callers of locks.
-+
- config DEBUG_HIGHMEM
- bool "Highmem debugging"
- depends on DEBUG_KERNEL && HIGHMEM
-@@ -1203,20 +1303,208 @@ config DEBUG_INFO
- Say Y here only if you plan to use gdb to debug the kernel.
- If you don't debug the kernel, you can say N.
-
-+config LOCKMETER
-+ bool "Kernel lock metering"
-+ depends on SMP
-+ help
-+ Say Y to enable kernel lock metering, which adds overhead to SMP locks,
-+ but allows you to see various statistics using the lockstat command.
-+
- config DEBUG_SPINLOCK_SLEEP
- bool "Sleep-inside-spinlock checking"
- help
- If you say Y here, various routines which may sleep will become very
- noisy if they are called with a spinlock held.
-
-+config KGDB
-+ bool "Include kgdb kernel debugger"
-+ depends on DEBUG_KERNEL
-+ help
-+ If you say Y here, the system will be compiled with the debug
-+ option (-g) and a debugging stub will be included in the
-+ kernel. This stub communicates with gdb on another (host)
-+ computer via a serial port. The host computer should have
-+ access to the kernel binary file (vmlinux) and a serial port
-+ that is connected to the target machine. Gdb can be made to
-+ configure the serial port or you can use stty and setserial to
-+ do this. See the 'target' command in gdb. This option also
-+ configures in the ability to request a breakpoint early in the
-+ boot process. To request the breakpoint just include 'kgdb'
-+ as a boot option when booting the target machine. The system
-+ will then break as soon as it looks at the boot options. This
-+ option also installs a breakpoint in panic and sends any
-+ kernel faults to the debugger. For more information see the
-+ Documentation/i386/kgdb.txt file.
-+
-+choice
-+ depends on KGDB
-+ prompt "Debug serial port BAUD"
-+ default KGDB_115200BAUD
-+ help
-+ Gdb and the kernel stub need to agree on the baud rate to be
-+ used. Some systems (x86 family at this writing) allow this to
-+ be configured.
-+
-+config KGDB_9600BAUD
-+ bool "9600"
-+
-+config KGDB_19200BAUD
-+ bool "19200"
-+
-+config KGDB_38400BAUD
-+ bool "38400"
-+
-+config KGDB_57600BAUD
-+ bool "57600"
-+
-+config KGDB_115200BAUD
-+ bool "115200"
-+endchoice
-+
-+config KGDB_PORT
-+ hex "hex I/O port address of the debug serial port"
-+ depends on KGDB
-+ default 3f8
-+ help
-+ Some systems (x86 family at this writing) allow the port
-+ address to be configured. The number entered is assumed to be
-+ hex, don't put 0x in front of it. The standard address are:
-+ COM1 3f8 , irq 4 and COM2 2f8 irq 3. Setserial /dev/ttySx
-+ will tell you what you have. It is good to test the serial
-+ connection with a live system before trying to debug.
-+
-+config KGDB_IRQ
-+ int "IRQ of the debug serial port"
-+ depends on KGDB
-+ default 4
-+ help
-+ This is the irq for the debug port. If everything is working
-+ correctly and the kernel has interrupts on a control C to the
-+ port should cause a break into the kernel debug stub.
-+
-+config DEBUG_INFO
-+ bool
-+ depends on KGDB
-+ default y
-+
-+config KGDB_MORE
-+ bool "Add any additional compile options"
-+ depends on KGDB
-+ default n
-+ help
-+ Saying yes here turns on the ability to enter additional
-+ compile options.
-+
-+
-+config KGDB_OPTIONS
-+ depends on KGDB_MORE
-+ string "Additional compile arguments"
-+ default "-O1"
-+ help
-+ This option allows you enter additional compile options for
-+ the whole kernel compile. Each platform will have a default
-+ that seems right for it. For example on PPC "-ggdb -O1", and
-+ for i386 "-O1". Note that by configuring KGDB "-g" is already
-+ turned on. In addition, on i386 platforms
-+ "-fomit-frame-pointer" is deleted from the standard compile
-+ options.
-+
-+config NO_KGDB_CPUS
-+ int "Number of CPUs"
-+ depends on KGDB && SMP
-+ default NR_CPUS
-+ help
-+
-+ This option sets the number of cpus for kgdb ONLY. It is used
-+ to prune some internal structures so they look "nice" when
-+ displayed with gdb. This is to overcome possibly larger
-+ numbers that may have been entered above. Enter the real
-+ number to get nice clean kgdb_info displays.
-+
-+config KGDB_TS
-+ bool "Enable kgdb time stamp macros?"
-+ depends on KGDB
-+ default n
-+ help
-+ Kgdb event macros allow you to instrument your code with calls
-+ to the kgdb event recording function. The event log may be
-+ examined with gdb at a break point. Turning on this
-+ capability also allows you to choose how many events to
-+ keep. Kgdb always keeps the lastest events.
-+
-+choice
-+ depends on KGDB_TS
-+ prompt "Max number of time stamps to save?"
-+ default KGDB_TS_128
-+
-+config KGDB_TS_64
-+ bool "64"
-+
-+config KGDB_TS_128
-+ bool "128"
-+
-+config KGDB_TS_256
-+ bool "256"
-+
-+config KGDB_TS_512
-+ bool "512"
-+
-+config KGDB_TS_1024
-+ bool "1024"
-+
-+endchoice
-+
-+config STACK_OVERFLOW_TEST
-+ bool "Turn on kernel stack overflow testing?"
-+ depends on KGDB
-+ default n
-+ help
-+ This option enables code in the front line interrupt handlers
-+ to check for kernel stack overflow on interrupts and system
-+ calls. This is part of the kgdb code on x86 systems.
-+
-+config KGDB_CONSOLE
-+ bool "Enable serial console thru kgdb port"
-+ depends on KGDB
-+ default n
-+ help
-+ This option enables the command line "console=kgdb" option.
-+ When the system is booted with this option in the command line
-+ all kernel printk output is sent to gdb (as well as to other
-+ consoles). For this to work gdb must be connected. For this
-+ reason, this command line option will generate a breakpoint if
-+ gdb has not yet connected. After the gdb continue command is
-+ given all pent up console output will be printed by gdb on the
-+ host machine. Neither this option, nor KGDB require the
-+ serial driver to be configured.
-+
-+config KGDB_SYSRQ
-+ bool "Turn on SysRq 'G' command to do a break?"
-+ depends on KGDB
-+ default y
-+ help
-+ This option includes an option in the SysRq code that allows
-+ you to enter SysRq G which generates a breakpoint to the KGDB
-+ stub. This will work if the keyboard is alive and can
-+ interrupt the system. Because of constraints on when the
-+ serial port interrupt can be enabled, this code may allow you
-+ to interrupt the system before the serial port control C is
-+ available. Just say yes here.
-+
- config FRAME_POINTER
- bool "Compile the kernel with frame pointers"
-+ default KGDB
- help
- If you say Y here the resulting kernel image will be slightly larger
- and slower, but it will give very useful debugging information.
- If you don't debug the kernel, you can say N, but we may not be able
- to solve problems without frame pointers.
-
-+config MAGIC_SYSRQ
-+ bool
-+ depends on KGDB_SYSRQ
-+ default y
-+
- config X86_EXTRA_IRQS
- bool
- depends on X86_LOCAL_APIC || X86_VOYAGER
---- linux-2.6.0/arch/i386/kernel/acpi/boot.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/acpi/boot.c 2003-12-28 23:21:57.000000000 -0800
-@@ -26,6 +26,7 @@
- #include <linux/init.h>
- #include <linux/config.h>
- #include <linux/acpi.h>
-+#include <linux/efi.h>
- #include <asm/pgalloc.h>
- #include <asm/io_apic.h>
- #include <asm/apic.h>
-@@ -40,9 +41,8 @@
-
- #define PREFIX "ACPI: "
-
--extern int acpi_disabled;
--extern int acpi_irq;
--extern int acpi_ht;
-+int acpi_noirq __initdata = 0; /* skip ACPI IRQ initialization */
-+int acpi_ht __initdata = 1; /* enable HT */
-
- int acpi_lapic = 0;
- int acpi_ioapic = 0;
-@@ -249,29 +249,66 @@ acpi_parse_nmi_src (
-
- #ifdef CONFIG_ACPI_BUS
- /*
-- * Set specified PIC IRQ to level triggered mode.
-+ * "acpi_pic_sci=level" (current default)
-+ * programs the PIC-mode SCI to Level Trigger.
-+ * (NO-OP if the BIOS set Level Trigger already)
-+ *
-+ * If a PIC-mode SCI is not recogznied or gives spurious IRQ7's
-+ * it may require Edge Trigger -- use "acpi_pic_sci=edge"
-+ * (NO-OP if the BIOS set Edge Trigger already)
- *
- * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
- * for the 8259 PIC. bit[n] = 1 means irq[n] is Level, otherwise Edge.
- * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0)
- * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0)
-- *
-- * As the BIOS should have done this for us,
-- * print a warning if the IRQ wasn't already set to level.
- */
-
--void acpi_pic_set_level_irq(unsigned int irq)
-+static int __initdata acpi_pic_sci_trigger; /* 0: level, 1: edge */
-+
-+void __init
-+acpi_pic_sci_set_trigger(unsigned int irq)
- {
- unsigned char mask = 1 << (irq & 7);
- unsigned int port = 0x4d0 + (irq >> 3);
- unsigned char val = inb(port);
-
-+
-+ printk(PREFIX "IRQ%d SCI:", irq);
- if (!(val & mask)) {
-- printk(KERN_WARNING PREFIX "IRQ %d was Edge Triggered, "
-- "setting to Level Triggerd\n", irq);
-- outb(val | mask, port);
-+ printk(" Edge");
-+
-+ if (!acpi_pic_sci_trigger) {
-+ printk(" set to Level");
-+ outb(val | mask, port);
-+ }
-+ } else {
-+ printk(" Level");
-+
-+ if (acpi_pic_sci_trigger) {
-+ printk(" set to Edge");
-+ outb(val | mask, port);
-+ }
-+ }
-+ printk(" Trigger.\n");
-+}
-+
-+int __init
-+acpi_pic_sci_setup(char *str)
-+{
-+ while (str && *str) {
-+ if (strncmp(str, "level", 5) == 0)
-+ acpi_pic_sci_trigger = 0; /* force level trigger */
-+ if (strncmp(str, "edge", 4) == 0)
-+ acpi_pic_sci_trigger = 1; /* force edge trigger */
-+ str = strchr(str, ',');
-+ if (str)
-+ str += strspn(str, ", \t");
- }
-+ return 1;
- }
-+
-+__setup("acpi_pic_sci=", acpi_pic_sci_setup);
-+
- #endif /* CONFIG_ACPI_BUS */
-
-
-@@ -326,11 +363,48 @@ static int __init acpi_parse_hpet(unsign
- }
- #endif
-
-+/* detect the location of the ACPI PM Timer */
-+#ifdef CONFIG_X86_PM_TIMER
-+extern u32 pmtmr_ioport;
-+
-+static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
-+{
-+ struct fadt_descriptor_rev2 *fadt =0;
-+
-+ fadt = (struct fadt_descriptor_rev2*) __acpi_map_table(phys,size);
-+ if(!fadt) {
-+ printk(KERN_WARNING PREFIX "Unable to map FADT\n");
-+ return 0;
-+ }
-+
-+ if (fadt->revision >= FADT2_REVISION_ID) {
-+ /* FADT rev. 2 */
-+ if (fadt->xpm_tmr_blk.address_space_id != ACPI_ADR_SPACE_SYSTEM_IO)
-+ return 0;
-+
-+ pmtmr_ioport = fadt->xpm_tmr_blk.address;
-+ } else {
-+ /* FADT rev. 1 */
-+ pmtmr_ioport = fadt->V1_pm_tmr_blk;
-+ }
-+ if (pmtmr_ioport)
-+ printk(KERN_INFO PREFIX "PM-Timer IO Port: %#x\n", pmtmr_ioport);
-+ return 0;
-+}
-+#endif
-+
-+
- unsigned long __init
- acpi_find_rsdp (void)
- {
- unsigned long rsdp_phys = 0;
-
-+ if (efi_enabled) {
-+ if (efi.acpi20)
-+ return __pa(efi.acpi20);
-+ else if (efi.acpi)
-+ return __pa(efi.acpi);
-+ }
- /*
- * Scan memory looking for the RSDP signature. First search EBDA (low
- * memory) paragraphs and then search upper memory (E0000-FFFFF).
-@@ -380,8 +454,10 @@ acpi_boot_init (void)
- * Initialize the ACPI boot-time table parser.
- */
- result = acpi_table_init();
-- if (result)
-+ if (result) {
-+ acpi_disabled = 1;
- return result;
-+ }
-
- result = acpi_blacklisted();
- if (result) {
-@@ -462,7 +538,7 @@ acpi_boot_init (void)
- * If MPS is present, it will handle them,
- * otherwise the system will stay in PIC mode
- */
-- if (acpi_disabled || !acpi_irq) {
-+ if (acpi_disabled || acpi_noirq) {
- return 1;
- }
-
-@@ -504,6 +580,8 @@ acpi_boot_init (void)
-
- acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
-
-+ acpi_irq_balance_set(NULL);
-+
- acpi_ioapic = 1;
-
- #endif /* CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER */
-@@ -519,5 +597,9 @@ acpi_boot_init (void)
- acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
- #endif
-
-+#ifdef CONFIG_X86_PM_TIMER
-+ acpi_table_parse(ACPI_FADT, acpi_parse_fadt);
-+#endif
-+
- return 0;
- }
---- linux-2.6.0/arch/i386/kernel/asm-offsets.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/asm-offsets.c 2003-12-28 23:26:36.000000000 -0800
-@@ -4,9 +4,11 @@
- * to extract and format the required data.
- */
-
-+#include <linux/sched.h>
- #include <linux/signal.h>
- #include <asm/ucontext.h>
- #include "sigframe.h"
-+#include <asm/fixmap.h>
-
- #define DEFINE(sym, val) \
- asm volatile("\n->" #sym " %0 " #val : : "i" (val))
-@@ -28,4 +30,17 @@ void foo(void)
-
- DEFINE(RT_SIGFRAME_sigcontext,
- offsetof (struct rt_sigframe, uc.uc_mcontext));
-+ DEFINE(TI_task, offsetof (struct thread_info, task));
-+ DEFINE(TI_exec_domain, offsetof (struct thread_info, exec_domain));
-+ DEFINE(TI_flags, offsetof (struct thread_info, flags));
-+ DEFINE(TI_preempt_count, offsetof (struct thread_info, preempt_count));
-+ DEFINE(TI_addr_limit, offsetof (struct thread_info, addr_limit));
-+ DEFINE(TI_real_stack, offsetof (struct thread_info, real_stack));
-+ DEFINE(TI_virtual_stack, offsetof (struct thread_info, virtual_stack));
-+ DEFINE(TI_user_pgd, offsetof (struct thread_info, user_pgd));
-+
-+ DEFINE(FIX_ENTRY_TRAMPOLINE_0_addr, __fix_to_virt(FIX_ENTRY_TRAMPOLINE_0));
-+ DEFINE(FIX_VSYSCALL_addr, __fix_to_virt(FIX_VSYSCALL));
-+ DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
-+ DEFINE(task_thread_db7, offsetof (struct task_struct, thread.debugreg[7]));
- }
---- linux-2.6.0/arch/i386/kernel/cpu/common.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/cpu/common.c 2003-12-28 23:26:36.000000000 -0800
-@@ -510,16 +510,20 @@ void __init cpu_init (void)
- BUG();
- enter_lazy_tlb(&init_mm, current);
-
-- load_esp0(t, thread->esp0);
-+ load_esp0(t, thread);
- set_tss_desc(cpu,t);
- cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
- load_TR_desc();
-- load_LDT(&init_mm.context);
-+ if (cpu)
-+ load_LDT(&init_mm.context);
-
- /* Set up doublefault TSS pointer in the GDT */
- __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
- cpu_gdt_table[cpu][GDT_ENTRY_DOUBLEFAULT_TSS].b &= 0xfffffdff;
-
-+ if (cpu)
-+ trap_init_virtual_GDT();
-+
- /* Clear %fs and %gs. */
- asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs");
-
---- linux-2.6.0/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c 2003-09-08 13:58:55.000000000 -0700
-+++ 25/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c 2003-12-28 23:22:07.000000000 -0800
-@@ -73,6 +73,16 @@ static struct cpufreq_frequency_table op
- { .frequency = CPUFREQ_TABLE_END }
- };
-
-+/* Ultra Low Voltage Intel Pentium M processor 1000MHz */
-+static struct cpufreq_frequency_table op_1000[] =
-+ {
-+ OP(600, 844),
-+ OP(800, 972),
-+ OP(900, 988),
-+ OP(1000, 1004),
-+ { .frequency = CPUFREQ_TABLE_END }
-+ };
-+
- /* Low Voltage Intel Pentium M processor 1.10GHz */
- static struct cpufreq_frequency_table op_1100[] =
- {
-@@ -165,6 +175,7 @@ static struct cpufreq_frequency_table op
- static const struct cpu_model models[] =
- {
- _CPU( 900, " 900"),
-+ CPU(1000),
- CPU(1100),
- CPU(1200),
- CPU(1300),
---- linux-2.6.0/arch/i386/kernel/cpu/intel.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/cpu/intel.c 2003-12-28 23:26:36.000000000 -0800
-@@ -1,5 +1,7 @@
-+#include <linux/config.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
-+
- #include <linux/string.h>
- #include <linux/bitops.h>
- #include <linux/smp.h>
-@@ -8,10 +10,15 @@
- #include <asm/processor.h>
- #include <asm/msr.h>
- #include <asm/uaccess.h>
-+#include <asm/desc.h>
-
- #include "cpu.h"
-
--extern int trap_init_f00f_bug(void);
-+#ifdef CONFIG_X86_LOCAL_APIC
-+#include <asm/mpspec.h>
-+#include <asm/apic.h>
-+#include <mach_apic.h>
-+#endif
-
- #ifdef CONFIG_X86_INTEL_USERCOPY
- /*
-@@ -157,7 +164,7 @@ static void __init init_intel(struct cpu
-
- c->f00f_bug = 1;
- if ( !f00f_workaround_enabled ) {
-- trap_init_f00f_bug();
-+ trap_init_virtual_IDT();
- printk(KERN_NOTICE "Intel Pentium with F0 0F bug - workaround enabled.\n");
- f00f_workaround_enabled = 1;
- }
-@@ -240,6 +247,12 @@ static void __init init_intel(struct cpu
- /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until model 3 mask 3 */
- if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633)
- clear_bit(X86_FEATURE_SEP, c->x86_capability);
-+ /*
-+ * FIXME: SEP is disabled for 4G/4G for now:
-+ */
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ clear_bit(X86_FEATURE_SEP, c->x86_capability);
-+#endif
-
- /* Names for the Pentium II/Celeron processors
- detectable only by also checking the cache size.
-@@ -277,6 +290,7 @@ static void __init init_intel(struct cpu
- extern int phys_proc_id[NR_CPUS];
-
- u32 eax, ebx, ecx, edx;
-+ int index_lsb, index_msb, tmp;
- int cpu = smp_processor_id();
-
- cpuid(1, &eax, &ebx, &ecx, &edx);
-@@ -285,6 +299,8 @@ static void __init init_intel(struct cpu
- if (smp_num_siblings == 1) {
- printk(KERN_INFO "CPU: Hyper-Threading is disabled\n");
- } else if (smp_num_siblings > 1 ) {
-+ index_lsb = 0;
-+ index_msb = 31;
- /*
- * At this point we only support two siblings per
- * processor package.
-@@ -295,13 +311,19 @@ static void __init init_intel(struct cpu
- smp_num_siblings = 1;
- goto too_many_siblings;
- }
-- /* cpuid returns the value latched in the HW at reset,
-- * not the APIC ID register's value. For any box
-- * whose BIOS changes APIC IDs, like clustered APIC
-- * systems, we must use hard_smp_processor_id.
-- * See Intel's IA-32 SW Dev's Manual Vol2 under CPUID.
-- */
-- phys_proc_id[cpu] = hard_smp_processor_id() & ~(smp_num_siblings - 1);
-+ tmp = smp_num_siblings;
-+ while ((tmp & 1) == 0) {
-+ tmp >>=1 ;
-+ index_lsb++;
-+ }
-+ tmp = smp_num_siblings;
-+ while ((tmp & 0x80000000 ) == 0) {
-+ tmp <<=1 ;
-+ index_msb--;
-+ }
-+ if (index_lsb != index_msb )
-+ index_msb++;
-+ phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
-
- printk(KERN_INFO "CPU: Physical Processor ID: %d\n",
- phys_proc_id[cpu]);
---- linux-2.6.0/arch/i386/kernel/dmi_scan.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/i386/kernel/dmi_scan.c 2003-12-28 23:21:33.000000000 -0800
-@@ -6,6 +6,7 @@
- #include <linux/module.h>
- #include <linux/apm_bios.h>
- #include <linux/slab.h>
-+#include <asm/acpi.h>
- #include <asm/io.h>
- #include <linux/pm.h>
- #include <asm/system.h>
-@@ -16,6 +17,7 @@ EXPORT_SYMBOL(dmi_broken);
-
- int is_sony_vaio_laptop;
- int is_unsafe_smbus;
-+int es7000_plat = 0;
-
- struct dmi_header
- {
-@@ -504,6 +506,7 @@ static __init int print_if_true(struct d
- }
-
-
-+#ifdef CONFIG_ACPI_BOOT
- extern int acpi_disabled, acpi_force;
-
- static __init __attribute__((unused)) int acpi_disable(struct dmi_blacklist *d)
-@@ -518,8 +521,6 @@ static __init __attribute__((unused)) in
- return 0;
- }
-
--
--#ifdef CONFIG_ACPI_BOOT
- extern int acpi_ht;
-
- /*
-@@ -542,10 +543,8 @@ static __init __attribute__((unused)) in
- #ifdef CONFIG_ACPI_PCI
- static __init int disable_acpi_pci(struct dmi_blacklist *d)
- {
-- extern __init void pci_disable_acpi(void) ;
--
- printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident);
-- pci_disable_acpi();
-+ acpi_noirq_set();
- return 0;
- }
- #endif
-@@ -1011,6 +1010,7 @@ static __init void dmi_check_blacklist(v
- printk(KERN_NOTICE "ACPI disabled because your bios is from %s and too old\n", s);
- printk(KERN_NOTICE "You can enable it with acpi=force\n");
- acpi_disabled = 1;
-+ acpi_ht = 0;
- }
- }
- }
---- linux-2.6.0/arch/i386/kernel/doublefault.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/doublefault.c 2003-12-28 23:26:36.000000000 -0800
-@@ -7,12 +7,13 @@
- #include <asm/uaccess.h>
- #include <asm/pgtable.h>
- #include <asm/desc.h>
-+#include <asm/fixmap.h>
-
- #define DOUBLEFAULT_STACKSIZE (1024)
- static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE];
- #define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE)
-
--#define ptr_ok(x) ((x) > 0xc0000000 && (x) < 0xc1000000)
-+#define ptr_ok(x) (((x) > __PAGE_OFFSET && (x) < (__PAGE_OFFSET + 0x01000000)) || ((x) >= FIXADDR_START))
-
- static void doublefault_fn(void)
- {
-@@ -38,8 +39,8 @@ static void doublefault_fn(void)
-
- printk("eax = %08lx, ebx = %08lx, ecx = %08lx, edx = %08lx\n",
- t->eax, t->ebx, t->ecx, t->edx);
-- printk("esi = %08lx, edi = %08lx\n",
-- t->esi, t->edi);
-+ printk("esi = %08lx, edi = %08lx, ebp = %08lx\n",
-+ t->esi, t->edi, t->ebp);
- }
- }
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/efi.c 2003-12-28 23:21:45.000000000 -0800
-@@ -0,0 +1,645 @@
-+/*
-+ * Extensible Firmware Interface
-+ *
-+ * Based on Extensible Firmware Interface Specification version 1.0
-+ *
-+ * Copyright (C) 1999 VA Linux Systems
-+ * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
-+ * Copyright (C) 1999-2002 Hewlett-Packard Co.
-+ * David Mosberger-Tang <davidm@hpl.hp.com>
-+ * Stephane Eranian <eranian@hpl.hp.com>
-+ *
-+ * All EFI Runtime Services are not implemented yet as EFI only
-+ * supports physical mode addressing on SoftSDV. This is to be fixed
-+ * in a future version. --drummond 1999-07-20
-+ *
-+ * Implemented EFI runtime services and virtual mode calls. --davidm
-+ *
-+ * Goutham Rao: <goutham.rao@intel.com>
-+ * Skip non-WB memory and ignore empty memory ranges.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/types.h>
-+#include <linux/time.h>
-+#include <linux/spinlock.h>
-+#include <linux/bootmem.h>
-+#include <linux/ioport.h>
-+#include <linux/proc_fs.h>
-+#include <linux/efi.h>
-+
-+#include <asm/setup.h>
-+#include <asm/io.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/processor.h>
-+#include <asm/desc.h>
-+#include <asm/pgalloc.h>
-+#include <asm/tlbflush.h>
-+
-+#define EFI_DEBUG 0
-+#define PFX "EFI: "
-+
-+extern efi_status_t asmlinkage efi_call_phys(void *, ...);
-+
-+struct efi efi;
-+struct efi efi_phys __initdata;
-+struct efi_memory_map memmap __initdata;
-+
-+/*
-+ * We require an early boot_ioremap mapping mechanism initially
-+ */
-+extern void * boot_ioremap(unsigned long, unsigned long);
-+
-+/*
-+ * efi_dir is allocated here, but the directory isn't created
-+ * here, as proc_mkdir() doesn't work this early in the bootup
-+ * process. Therefore, each module, like efivars, must test for
-+ * if (!efi_dir) efi_dir = proc_mkdir("efi", NULL);
-+ * prior to creating their own entries under /proc/efi.
-+ */
-+#ifdef CONFIG_PROC_FS
-+struct proc_dir_entry *efi_dir;
-+#endif
-+
-+
-+/*
-+ * To make EFI call EFI runtime service in physical addressing mode we need
-+ * prelog/epilog before/after the invocation to disable interrupt, to
-+ * claim EFI runtime service handler exclusively and to duplicate a memory in
-+ * low memory space say 0 - 3G.
-+ */
-+
-+static unsigned long efi_rt_eflags;
-+static spinlock_t efi_rt_lock = SPIN_LOCK_UNLOCKED;
-+static pgd_t efi_bak_pg_dir_pointer[2];
-+
-+static void efi_call_phys_prelog(void)
-+{
-+ unsigned long cr4;
-+ unsigned long temp;
-+
-+ spin_lock(&efi_rt_lock);
-+ local_irq_save(efi_rt_eflags);
-+
-+ /*
-+ * If I don't have PSE, I should just duplicate two entries in page
-+ * directory. If I have PSE, I just need to duplicate one entry in
-+ * page directory.
-+ */
-+ __asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
-+
-+ if (cr4 & X86_CR4_PSE) {
-+ efi_bak_pg_dir_pointer[0].pgd =
-+ swapper_pg_dir[pgd_index(0)].pgd;
-+ swapper_pg_dir[0].pgd =
-+ swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
-+ } else {
-+ efi_bak_pg_dir_pointer[0].pgd =
-+ swapper_pg_dir[pgd_index(0)].pgd;
-+ efi_bak_pg_dir_pointer[1].pgd =
-+ swapper_pg_dir[pgd_index(0x400000)].pgd;
-+ swapper_pg_dir[pgd_index(0)].pgd =
-+ swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
-+ temp = PAGE_OFFSET + 0x400000;
-+ swapper_pg_dir[pgd_index(0x400000)].pgd =
-+ swapper_pg_dir[pgd_index(temp)].pgd;
-+ }
-+
-+ /*
-+ * After the lock is released, the original page table is restored.
-+ */
-+ local_flush_tlb();
-+
-+ cpu_gdt_descr[0].address = __pa(cpu_gdt_descr[0].address);
-+ __asm__ __volatile__("lgdt %0":"=m"
-+ (*(struct Xgt_desc_struct *) __pa(&cpu_gdt_descr[0])));
-+}
-+
-+static void efi_call_phys_epilog(void)
-+{
-+ unsigned long cr4;
-+
-+ cpu_gdt_descr[0].address =
-+ (unsigned long) __va(cpu_gdt_descr[0].address);
-+ __asm__ __volatile__("lgdt %0":"=m"(cpu_gdt_descr));
-+ __asm__ __volatile__("movl %%cr4, %0":"=r"(cr4));
-+
-+ if (cr4 & X86_CR4_PSE) {
-+ swapper_pg_dir[pgd_index(0)].pgd =
-+ efi_bak_pg_dir_pointer[0].pgd;
-+ } else {
-+ swapper_pg_dir[pgd_index(0)].pgd =
-+ efi_bak_pg_dir_pointer[0].pgd;
-+ swapper_pg_dir[pgd_index(0x400000)].pgd =
-+ efi_bak_pg_dir_pointer[1].pgd;
-+ }
-+
-+ /*
-+ * After the lock is released, the original page table is restored.
-+ */
-+ local_flush_tlb();
-+
-+ local_irq_restore(efi_rt_eflags);
-+ spin_unlock(&efi_rt_lock);
-+}
-+
-+static efi_status_t
-+phys_efi_set_virtual_address_map(unsigned long memory_map_size,
-+ unsigned long descriptor_size,
-+ u32 descriptor_version,
-+ efi_memory_desc_t *virtual_map)
-+{
-+ efi_status_t status;
-+
-+ efi_call_phys_prelog();
-+ status = efi_call_phys(efi_phys.set_virtual_address_map,
-+ memory_map_size, descriptor_size,
-+ descriptor_version, virtual_map);
-+ efi_call_phys_epilog();
-+ return status;
-+}
-+
-+efi_status_t
-+phys_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
-+{
-+ efi_status_t status;
-+
-+ efi_call_phys_prelog();
-+ status = efi_call_phys(efi_phys.get_time, tm, tc);
-+ efi_call_phys_epilog();
-+ return status;
-+}
-+
-+int inline efi_set_rtc_mmss(unsigned long nowtime)
-+{
-+ int real_seconds, real_minutes;
-+ efi_status_t status;
-+ efi_time_t eft;
-+ efi_time_cap_t cap;
-+
-+ spin_lock(&efi_rt_lock);
-+ status = efi.get_time(&eft, &cap);
-+ spin_unlock(&efi_rt_lock);
-+ if (status != EFI_SUCCESS)
-+ panic("Ooops, efitime: can't read time!\n");
-+ real_seconds = nowtime % 60;
-+ real_minutes = nowtime / 60;
-+
-+ if (((abs(real_minutes - eft.minute) + 15)/30) & 1)
-+ real_minutes += 30;
-+ real_minutes %= 60;
-+
-+ eft.minute = real_minutes;
-+ eft.second = real_seconds;
-+
-+ if (status != EFI_SUCCESS) {
-+ printk("Ooops: efitime: can't read time!\n");
-+ return -1;
-+ }
-+ return 0;
-+}
-+/*
-+ * This should only be used during kernel init and before runtime
-+ * services have been remapped, therefore, we'll need to call in physical
-+ * mode. Note, this call isn't used later, so mark it __init.
-+ */
-+unsigned long inline __init efi_get_time(void)
-+{
-+ efi_status_t status;
-+ efi_time_t eft;
-+ efi_time_cap_t cap;
-+
-+ status = phys_efi_get_time(&eft, &cap);
-+ if (status != EFI_SUCCESS)
-+ printk("Oops: efitime: can't read time status: 0x%lx\n",status);
-+
-+ return mktime(eft.year, eft.month, eft.day, eft.hour,
-+ eft.minute, eft.second);
-+}
-+
-+int is_available_memory(efi_memory_desc_t * md)
-+{
-+ if (!(md->attribute & EFI_MEMORY_WB))
-+ return 0;
-+
-+ switch (md->type) {
-+ case EFI_LOADER_CODE:
-+ case EFI_LOADER_DATA:
-+ case EFI_BOOT_SERVICES_CODE:
-+ case EFI_BOOT_SERVICES_DATA:
-+ case EFI_CONVENTIONAL_MEMORY:
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * We need to map the EFI memory map again after paging_init().
-+ */
-+void __init efi_map_memmap(void)
-+{
-+ memmap.map = NULL;
-+
-+ memmap.map = (efi_memory_desc_t *)
-+ bt_ioremap((unsigned long) memmap.phys_map,
-+ (memmap.nr_map * sizeof(efi_memory_desc_t)));
-+
-+ if (memmap.map == NULL)
-+ printk(KERN_ERR PFX "Could not remap the EFI memmap!\n");
-+}
-+
-+void __init print_efi_memmap(void)
-+{
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+ printk(KERN_INFO "mem%02u: type=%u, attr=0x%llx, "
-+ "range=[0x%016llx-0x%016llx) (%lluMB)\n",
-+ i, md->type, md->attribute, md->phys_addr,
-+ md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
-+ (md->num_pages >> (20 - EFI_PAGE_SHIFT)));
-+ }
-+}
-+
-+/*
-+ * Walks the EFI memory map and calls CALLBACK once for each EFI
-+ * memory descriptor that has memory that is available for kernel use.
-+ */
-+void efi_memmap_walk(efi_freemem_callback_t callback, void *arg)
-+{
-+ int prev_valid = 0;
-+ struct range {
-+ unsigned long start;
-+ unsigned long end;
-+ } prev, curr;
-+ efi_memory_desc_t *md;
-+ unsigned long start, end;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+
-+ if ((md->num_pages == 0) || (!is_available_memory(md)))
-+ continue;
-+
-+ curr.start = md->phys_addr;
-+ curr.end = curr.start + (md->num_pages << EFI_PAGE_SHIFT);
-+
-+ if (!prev_valid) {
-+ prev = curr;
-+ prev_valid = 1;
-+ } else {
-+ if (curr.start < prev.start)
-+ printk(KERN_INFO PFX "Unordered memory map\n");
-+ if (prev.end == curr.start)
-+ prev.end = curr.end;
-+ else {
-+ start =
-+ (unsigned long) (PAGE_ALIGN(prev.start));
-+ end = (unsigned long) (prev.end & PAGE_MASK);
-+ if ((end > start)
-+ && (*callback) (start, end, arg) < 0)
-+ return;
-+ prev = curr;
-+ }
-+ }
-+ }
-+ if (prev_valid) {
-+ start = (unsigned long) PAGE_ALIGN(prev.start);
-+ end = (unsigned long) (prev.end & PAGE_MASK);
-+ if (end > start)
-+ (*callback) (start, end, arg);
-+ }
-+}
-+
-+void __init efi_init(void)
-+{
-+ efi_config_table_t *config_tables;
-+ efi_runtime_services_t *runtime;
-+ efi_char16_t *c16;
-+ char vendor[100] = "unknown";
-+ unsigned long num_config_tables;
-+ int i = 0;
-+
-+ memset(&efi, 0, sizeof(efi) );
-+ memset(&efi_phys, 0, sizeof(efi_phys));
-+
-+ efi_phys.systab = EFI_SYSTAB;
-+ memmap.phys_map = EFI_MEMMAP;
-+ memmap.nr_map = EFI_MEMMAP_SIZE/EFI_MEMDESC_SIZE;
-+ memmap.desc_version = EFI_MEMDESC_VERSION;
-+
-+ efi.systab = (efi_system_table_t *)
-+ boot_ioremap((unsigned long) efi_phys.systab,
-+ sizeof(efi_system_table_t));
-+ /*
-+ * Verify the EFI Table
-+ */
-+ if (efi.systab == NULL)
-+ printk(KERN_ERR PFX "Woah! Couldn't map the EFI system table.\n");
-+ if (efi.systab->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
-+ printk(KERN_ERR PFX "Woah! EFI system table signature incorrect\n");
-+ if ((efi.systab->hdr.revision ^ EFI_SYSTEM_TABLE_REVISION) >> 16 != 0)
-+ printk(KERN_ERR PFX
-+ "Warning: EFI system table major version mismatch: "
-+ "got %d.%02d, expected %d.%02d\n",
-+ efi.systab->hdr.revision >> 16,
-+ efi.systab->hdr.revision & 0xffff,
-+ EFI_SYSTEM_TABLE_REVISION >> 16,
-+ EFI_SYSTEM_TABLE_REVISION & 0xffff);
-+ /*
-+ * Grab some details from the system table
-+ */
-+ num_config_tables = efi.systab->nr_tables;
-+ config_tables = (efi_config_table_t *)efi.systab->tables;
-+ runtime = efi.systab->runtime;
-+
-+ /*
-+ * Show what we know for posterity
-+ */
-+ c16 = (efi_char16_t *) boot_ioremap(efi.systab->fw_vendor, 2);
-+ if (c16) {
-+ for (i = 0; i < sizeof(vendor) && *c16; ++i)
-+ vendor[i] = *c16++;
-+ vendor[i] = '\0';
-+ } else
-+ printk(KERN_ERR PFX "Could not map the firmware vendor!\n");
-+
-+ printk(KERN_INFO PFX "EFI v%u.%.02u by %s \n",
-+ efi.systab->hdr.revision >> 16,
-+ efi.systab->hdr.revision & 0xffff, vendor);
-+
-+ /*
-+ * Let's see what config tables the firmware passed to us.
-+ */
-+ config_tables = (efi_config_table_t *)
-+ boot_ioremap((unsigned long) config_tables,
-+ num_config_tables * sizeof(efi_config_table_t));
-+
-+ if (config_tables == NULL)
-+ printk(KERN_ERR PFX "Could not map EFI Configuration Table!\n");
-+
-+ for (i = 0; i < num_config_tables; i++) {
-+ if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) {
-+ efi.mps = (void *)config_tables[i].table;
-+ printk(KERN_INFO " MPS=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) {
-+ efi.acpi20 = __va(config_tables[i].table);
-+ printk(KERN_INFO " ACPI 2.0=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) {
-+ efi.acpi = __va(config_tables[i].table);
-+ printk(KERN_INFO " ACPI=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) {
-+ efi.smbios = (void *) config_tables[i].table;
-+ printk(KERN_INFO " SMBIOS=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) {
-+ efi.hcdp = (void *)config_tables[i].table;
-+ printk(KERN_INFO " HCDP=0x%lx ", config_tables[i].table);
-+ } else
-+ if (efi_guidcmp(config_tables[i].guid, UGA_IO_PROTOCOL_GUID) == 0) {
-+ efi.uga = (void *)config_tables[i].table;
-+ printk(KERN_INFO " UGA=0x%lx ", config_tables[i].table);
-+ }
-+ }
-+ printk("\n");
-+
-+ /*
-+ * Check out the runtime services table. We need to map
-+ * the runtime services table so that we can grab the physical
-+ * address of several of the EFI runtime functions, needed to
-+ * set the firmware into virtual mode.
-+ */
-+
-+ runtime = (efi_runtime_services_t *) boot_ioremap((unsigned long)
-+ runtime,
-+ sizeof(efi_runtime_services_t));
-+ if (runtime != NULL) {
-+ /*
-+ * We will only need *early* access to the following
-+ * two EFI runtime services before set_virtual_address_map
-+ * is invoked.
-+ */
-+ efi_phys.get_time = (efi_get_time_t *) runtime->get_time;
-+ efi_phys.set_virtual_address_map =
-+ (efi_set_virtual_address_map_t *)
-+ runtime->set_virtual_address_map;
-+ } else
-+ printk(KERN_ERR PFX "Could not map the runtime service table!\n");
-+
-+ /* Map the EFI memory map for use until paging_init() */
-+
-+ memmap.map = (efi_memory_desc_t *)
-+ boot_ioremap((unsigned long) EFI_MEMMAP, EFI_MEMMAP_SIZE);
-+
-+ if (memmap.map == NULL)
-+ printk(KERN_ERR PFX "Could not map the EFI memory map!\n");
-+
-+ if (EFI_MEMDESC_SIZE != sizeof(efi_memory_desc_t)) {
-+ printk(KERN_WARNING PFX "Warning! Kernel-defined memdesc doesn't "
-+ "match the one from EFI!\n");
-+ }
-+#if EFI_DEBUG
-+ print_efi_memmap();
-+#endif
-+}
-+
-+/*
-+ * This function will switch the EFI runtime services to virtual mode.
-+ * Essentially, look through the EFI memmap and map every region that
-+ * has the runtime attribute bit set in its memory descriptor and update
-+ * that memory descriptor with the virtual address obtained from ioremap().
-+ * This enables the runtime services to be called without having to
-+ * thunk back into physical mode for every invocation.
-+ */
-+
-+void __init efi_enter_virtual_mode(void)
-+{
-+ efi_memory_desc_t *md;
-+ efi_status_t status;
-+ int i;
-+
-+ efi.systab = NULL;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+
-+ if (md->attribute & EFI_MEMORY_RUNTIME) {
-+ md->virt_addr =
-+ (unsigned long)ioremap(md->phys_addr,
-+ md->num_pages << EFI_PAGE_SHIFT);
-+ if (!(unsigned long)md->virt_addr) {
-+ printk(KERN_ERR PFX "ioremap of 0x%lX failed\n",
-+ (unsigned long)md->phys_addr);
-+ }
-+
-+ if (((unsigned long)md->phys_addr <=
-+ (unsigned long)efi_phys.systab) &&
-+ ((unsigned long)efi_phys.systab <
-+ md->phys_addr +
-+ ((unsigned long)md->num_pages <<
-+ EFI_PAGE_SHIFT))) {
-+ unsigned long addr;
-+
-+ addr = md->virt_addr - md->phys_addr +
-+ (unsigned long)efi_phys.systab;
-+ efi.systab = (efi_system_table_t *)addr;
-+ }
-+ }
-+ }
-+
-+ if (!efi.systab)
-+ BUG();
-+
-+ status = phys_efi_set_virtual_address_map(
-+ sizeof(efi_memory_desc_t) * memmap.nr_map,
-+ sizeof(efi_memory_desc_t),
-+ memmap.desc_version,
-+ memmap.phys_map);
-+
-+ if (status != EFI_SUCCESS) {
-+ printk (KERN_ALERT "You are screwed! "
-+ "Unable to switch EFI into virtual mode "
-+ "(status=%lx)\n", status);
-+ panic("EFI call to SetVirtualAddressMap() failed!");
-+ }
-+
-+ /*
-+ * Now that EFI is in virtual mode, update the function
-+ * pointers in the runtime service table to the new virtual addresses.
-+ */
-+
-+ efi.get_time = (efi_get_time_t *) efi.systab->runtime->get_time;
-+ efi.set_time = (efi_set_time_t *) efi.systab->runtime->set_time;
-+ efi.get_wakeup_time = (efi_get_wakeup_time_t *)
-+ efi.systab->runtime->get_wakeup_time;
-+ efi.set_wakeup_time = (efi_set_wakeup_time_t *)
-+ efi.systab->runtime->set_wakeup_time;
-+ efi.get_variable = (efi_get_variable_t *)
-+ efi.systab->runtime->get_variable;
-+ efi.get_next_variable = (efi_get_next_variable_t *)
-+ efi.systab->runtime->get_next_variable;
-+ efi.set_variable = (efi_set_variable_t *)
-+ efi.systab->runtime->set_variable;
-+ efi.get_next_high_mono_count = (efi_get_next_high_mono_count_t *)
-+ efi.systab->runtime->get_next_high_mono_count;
-+ efi.reset_system = (efi_reset_system_t *)
-+ efi.systab->runtime->reset_system;
-+}
-+
-+void __init
-+efi_initialize_iomem_resources(struct resource *code_resource,
-+ struct resource *data_resource)
-+{
-+ struct resource *res;
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+
-+ if ((md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >
-+ 0x100000000ULL)
-+ continue;
-+ res = alloc_bootmem_low(sizeof(struct resource));
-+ switch (md->type) {
-+ case EFI_RESERVED_TYPE:
-+ res->name = "Reserved Memory";
-+ break;
-+ case EFI_LOADER_CODE:
-+ res->name = "Loader Code";
-+ break;
-+ case EFI_LOADER_DATA:
-+ res->name = "Loader Data";
-+ break;
-+ case EFI_BOOT_SERVICES_DATA:
-+ res->name = "BootServices Data";
-+ break;
-+ case EFI_BOOT_SERVICES_CODE:
-+ res->name = "BootServices Code";
-+ break;
-+ case EFI_RUNTIME_SERVICES_CODE:
-+ res->name = "Runtime Service Code";
-+ break;
-+ case EFI_RUNTIME_SERVICES_DATA:
-+ res->name = "Runtime Service Data";
-+ break;
-+ case EFI_CONVENTIONAL_MEMORY:
-+ res->name = "Conventional Memory";
-+ break;
-+ case EFI_UNUSABLE_MEMORY:
-+ res->name = "Unusable Memory";
-+ break;
-+ case EFI_ACPI_RECLAIM_MEMORY:
-+ res->name = "ACPI Reclaim";
-+ break;
-+ case EFI_ACPI_MEMORY_NVS:
-+ res->name = "ACPI NVS";
-+ break;
-+ case EFI_MEMORY_MAPPED_IO:
-+ res->name = "Memory Mapped IO";
-+ break;
-+ case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
-+ res->name = "Memory Mapped IO Port Space";
-+ break;
-+ default:
-+ res->name = "Reserved";
-+ break;
-+ }
-+ res->start = md->phys_addr;
-+ res->end = res->start + ((md->num_pages << EFI_PAGE_SHIFT) - 1);
-+ res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-+ if (request_resource(&iomem_resource, res) < 0)
-+ printk(KERN_ERR PFX "Failed to allocate res %s : 0x%lx-0x%lx\n",
-+ res->name, res->start, res->end);
-+ /*
-+ * We don't know which region contains kernel data so we try
-+ * it repeatedly and let the resource manager test it.
-+ */
-+ if (md->type == EFI_CONVENTIONAL_MEMORY) {
-+ request_resource(res, code_resource);
-+ request_resource(res, data_resource);
-+ }
-+ }
-+}
-+
-+/*
-+ * Convenience functions to obtain memory types and attributes
-+ */
-+
-+u32 efi_mem_type(unsigned long phys_addr)
-+{
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+ if ((md->phys_addr <= phys_addr) && (phys_addr <
-+ (md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
-+ return md->type;
-+ }
-+ return 0;
-+}
-+
-+u64 efi_mem_attributes(unsigned long phys_addr)
-+{
-+ efi_memory_desc_t *md;
-+ int i;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+ if ((md->phys_addr <= phys_addr) && (phys_addr <
-+ (md->phys_addr + (md-> num_pages << EFI_PAGE_SHIFT)) ))
-+ return md->attribute;
-+ }
-+ return 0;
-+}
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/efi_stub.S 2003-12-28 23:21:45.000000000 -0800
-@@ -0,0 +1,124 @@
-+/*
-+ * EFI call stub for IA32.
-+ *
-+ * This stub allows us to make EFI calls in physical mode with interrupts
-+ * turned off.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/linkage.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+
-+/*
-+ * efi_call_phys(void *, ...) is a function with variable parameters.
-+ * All the callers of this function assure that all the parameters are 4-bytes.
-+ */
-+
-+/*
-+ * In gcc calling convention, EBX, ESP, EBP, ESI and EDI are all callee save.
-+ * So we'd better save all of them at the beginning of this function and restore
-+ * at the end no matter how many we use, because we can not assure EFI runtime
-+ * service functions will comply with gcc calling convention, too.
-+ */
-+
-+.text
-+ENTRY(efi_call_phys)
-+ /*
-+ * 0. The function can only be called in Linux kernel. So CS has been
-+ * set to 0x0010, DS and SS have been set to 0x0018. In EFI, I found
-+ * the values of these registers are the same. And, the corresponding
-+ * GDT entries are identical. So I will do nothing about segment reg
-+ * and GDT, but change GDT base register in prelog and epilog.
-+ */
-+
-+ /*
-+ * 1. Now I am running with EIP = <physical address> + PAGE_OFFSET.
-+ * But to make it smoothly switch from virtual mode to flat mode.
-+ * The mapping of lower virtual memory has been created in prelog and
-+ * epilog.
-+ */
-+ movl $1f, %edx
-+ subl $__PAGE_OFFSET, %edx
-+ jmp *%edx
-+1:
-+
-+ /*
-+ * 2. Now on the top of stack is the return
-+ * address in the caller of efi_call_phys(), then parameter 1,
-+ * parameter 2, ..., param n. To make things easy, we save the return
-+ * address of efi_call_phys in a global variable.
-+ */
-+ popl %edx
-+ movl %edx, saved_return_addr
-+ /* get the function pointer into ECX*/
-+ popl %ecx
-+ movl %ecx, efi_rt_function_ptr
-+ movl $2f, %edx
-+ subl $__PAGE_OFFSET, %edx
-+ pushl %edx
-+
-+ /*
-+ * 3. Clear PG bit in %CR0.
-+ */
-+ movl %cr0, %edx
-+ andl $0x7fffffff, %edx
-+ movl %edx, %cr0
-+ jmp 1f
-+1:
-+
-+ /*
-+ * 4. Adjust stack pointer.
-+ */
-+ subl $__PAGE_OFFSET, %esp
-+
-+ /*
-+ * 5. Call the physical function.
-+ */
-+ jmp *%ecx
-+
-+2:
-+ /*
-+ * 6. After EFI runtime service returns, control will return to
-+ * following instruction. We'd better readjust stack pointer first.
-+ */
-+ addl $__PAGE_OFFSET, %esp
-+
-+ /*
-+ * 7. Restore PG bit
-+ */
-+ movl %cr0, %edx
-+ orl $0x80000000, %edx
-+ movl %edx, %cr0
-+ jmp 1f
-+1:
-+ /*
-+ * 8. Now restore the virtual mode from flat mode by
-+ * adding EIP with PAGE_OFFSET.
-+ */
-+ movl $1f, %edx
-+ jmp *%edx
-+1:
-+
-+ /*
-+ * 9. Balance the stack. And because EAX contain the return value,
-+ * we'd better not clobber it.
-+ */
-+ leal efi_rt_function_ptr, %edx
-+ movl (%edx), %ecx
-+ pushl %ecx
-+
-+ /*
-+ * 10. Push the saved return address onto the stack and return.
-+ */
-+ leal saved_return_addr, %edx
-+ movl (%edx), %ecx
-+ pushl %ecx
-+ ret
-+.previous
-+
-+.data
-+saved_return_addr:
-+ .long 0
-+efi_rt_function_ptr:
-+ .long 0
---- linux-2.6.0/arch/i386/kernel/entry.S 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/entry.S 2003-12-28 23:26:36.000000000 -0800
-@@ -43,11 +43,25 @@
- #include <linux/config.h>
- #include <linux/linkage.h>
- #include <asm/thread_info.h>
-+#include <asm/asm_offsets.h>
- #include <asm/errno.h>
- #include <asm/segment.h>
-+#include <asm/page.h>
- #include <asm/smp.h>
- #include <asm/page.h>
- #include "irq_vectors.h"
-+ /* We do not recover from a stack overflow, but at least
-+ * we know it happened and should be able to track it down.
-+ */
-+#ifdef CONFIG_STACK_OVERFLOW_TEST
-+#define STACK_OVERFLOW_TEST \
-+ testl $7680,%esp; \
-+ jnz 10f; \
-+ call stack_overflow; \
-+10:
-+#else
-+#define STACK_OVERFLOW_TEST
-+#endif
-
- #define nr_syscalls ((syscall_table_size)/4)
-
-@@ -87,7 +101,102 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- #define resume_kernel restore_all
- #endif
-
--#define SAVE_ALL \
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+
-+#ifdef CONFIG_X86_SWITCH_PAGETABLES
-+
-+#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
-+/*
-+ * If task is preempted in __SWITCH_KERNELSPACE, and moved to another cpu,
-+ * __switch_to repoints %esp to the appropriate virtual stack; but %ebp is
-+ * left stale, so we must check whether to repeat the real stack calculation.
-+ */
-+#define repeat_if_esp_changed \
-+ xorl %esp, %ebp; \
-+ testl $0xffffe000, %ebp; \
-+ jnz 0b
-+#else
-+#define repeat_if_esp_changed
-+#endif
-+
-+/* clobbers ebx, edx and ebp */
-+
-+#define __SWITCH_KERNELSPACE \
-+ cmpl $0xff000000, %esp; \
-+ jb 1f; \
-+ \
-+ /* \
-+ * switch pagetables and load the real stack, \
-+ * keep the stack offset: \
-+ */ \
-+ \
-+ movl $swapper_pg_dir-__PAGE_OFFSET, %edx; \
-+ \
-+ /* GET_THREAD_INFO(%ebp) intermixed */ \
-+0: \
-+ movl %esp, %ebp; \
-+ movl %esp, %ebx; \
-+ andl $0xffffe000, %ebp; \
-+ andl $0x00001fff, %ebx; \
-+ orl TI_real_stack(%ebp), %ebx; \
-+ repeat_if_esp_changed; \
-+ \
-+ movl %edx, %cr3; \
-+ movl %ebx, %esp; \
-+1:
-+
-+#endif
-+
-+
-+#define __SWITCH_USERSPACE \
-+ /* interrupted any of the user return paths? */ \
-+ \
-+ movl EIP(%esp), %eax; \
-+ \
-+ cmpl $int80_ret_start_marker, %eax; \
-+ jb 33f; /* nope - continue with sysexit check */\
-+ cmpl $int80_ret_end_marker, %eax; \
-+ jb 22f; /* yes - switch to virtual stack */ \
-+33: \
-+ cmpl $sysexit_ret_start_marker, %eax; \
-+ jb 44f; /* nope - continue with user check */ \
-+ cmpl $sysexit_ret_end_marker, %eax; \
-+ jb 22f; /* yes - switch to virtual stack */ \
-+ /* return to userspace? */ \
-+44: \
-+ movl EFLAGS(%esp),%ecx; \
-+ movb CS(%esp),%cl; \
-+ testl $(VM_MASK | 3),%ecx; \
-+ jz 2f; \
-+22: \
-+ /* \
-+ * switch to the virtual stack, then switch to \
-+ * the userspace pagetables. \
-+ */ \
-+ \
-+ GET_THREAD_INFO(%ebp); \
-+ movl TI_virtual_stack(%ebp), %edx; \
-+ movl TI_user_pgd(%ebp), %ecx; \
-+ \
-+ movl %esp, %ebx; \
-+ andl $0x1fff, %ebx; \
-+ orl %ebx, %edx; \
-+int80_ret_start_marker: \
-+ movl %edx, %esp; \
-+ movl %ecx, %cr3; \
-+ \
-+ __RESTORE_ALL; \
-+int80_ret_end_marker: \
-+2:
-+
-+#else /* !CONFIG_X86_HIGH_ENTRY */
-+
-+#define __SWITCH_KERNELSPACE
-+#define __SWITCH_USERSPACE
-+
-+#endif
-+
-+#define __SAVE_ALL \
- cld; \
- pushl %es; \
- pushl %ds; \
-@@ -102,7 +211,7 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- movl %edx, %ds; \
- movl %edx, %es;
-
--#define RESTORE_INT_REGS \
-+#define __RESTORE_INT_REGS \
- popl %ebx; \
- popl %ecx; \
- popl %edx; \
-@@ -111,29 +220,28 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- popl %ebp; \
- popl %eax
-
--#define RESTORE_REGS \
-- RESTORE_INT_REGS; \
--1: popl %ds; \
--2: popl %es; \
-+#define __RESTORE_REGS \
-+ __RESTORE_INT_REGS; \
-+111: popl %ds; \
-+222: popl %es; \
- .section .fixup,"ax"; \
--3: movl $0,(%esp); \
-- jmp 1b; \
--4: movl $0,(%esp); \
-- jmp 2b; \
-+444: movl $0,(%esp); \
-+ jmp 111b; \
-+555: movl $0,(%esp); \
-+ jmp 222b; \
- .previous; \
- .section __ex_table,"a";\
- .align 4; \
-- .long 1b,3b; \
-- .long 2b,4b; \
-+ .long 111b,444b;\
-+ .long 222b,555b;\
- .previous
-
--
--#define RESTORE_ALL \
-- RESTORE_REGS \
-+#define __RESTORE_ALL \
-+ __RESTORE_REGS \
- addl $4, %esp; \
--1: iret; \
-+333: iret; \
- .section .fixup,"ax"; \
--2: sti; \
-+666: sti; \
- movl $(__USER_DS), %edx; \
- movl %edx, %ds; \
- movl %edx, %es; \
-@@ -142,10 +250,19 @@ TSS_ESP0_OFFSET = (4 - 0x200)
- .previous; \
- .section __ex_table,"a";\
- .align 4; \
-- .long 1b,2b; \
-+ .long 333b,666b;\
- .previous
-
-+#define SAVE_ALL \
-+ __SAVE_ALL; \
-+ __SWITCH_KERNELSPACE; \
-+ STACK_OVERFLOW_TEST;
-+
-+#define RESTORE_ALL \
-+ __SWITCH_USERSPACE; \
-+ __RESTORE_ALL;
-
-+.section .entry.text,"ax"
-
- ENTRY(lcall7)
- pushfl # We get a different stack layout with call
-@@ -163,7 +280,7 @@ do_lcall:
- movl %edx,EIP(%ebp) # Now we move them to their "normal" places
- movl %ecx,CS(%ebp) #
- andl $-8192, %ebp # GET_THREAD_INFO
-- movl TI_EXEC_DOMAIN(%ebp), %edx # Get the execution domain
-+ movl TI_exec_domain(%ebp), %edx # Get the execution domain
- call *4(%edx) # Call the lcall7 handler for the domain
- addl $4, %esp
- popl %eax
-@@ -208,7 +325,7 @@ ENTRY(resume_userspace)
- cli # make sure we don't miss an interrupt
- # setting need_resched or sigpending
- # between sampling and the iret
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
- # int/exception return?
- jne work_pending
-@@ -216,18 +333,18 @@ ENTRY(resume_userspace)
-
- #ifdef CONFIG_PREEMPT
- ENTRY(resume_kernel)
-- cmpl $0,TI_PRE_COUNT(%ebp) # non-zero preempt_count ?
-+ cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
- jnz restore_all
- need_resched:
-- movl TI_FLAGS(%ebp), %ecx # need_resched set ?
-+ movl TI_flags(%ebp), %ecx # need_resched set ?
- testb $_TIF_NEED_RESCHED, %cl
- jz restore_all
- testl $IF_MASK,EFLAGS(%esp) # interrupts off (exception path) ?
- jz restore_all
-- movl $PREEMPT_ACTIVE,TI_PRE_COUNT(%ebp)
-+ movl $PREEMPT_ACTIVE,TI_preempt_count(%ebp)
- sti
- call schedule
-- movl $0,TI_PRE_COUNT(%ebp)
-+ movl $0,TI_preempt_count(%ebp)
- cli
- jmp need_resched
- #endif
-@@ -246,37 +363,50 @@ sysenter_past_esp:
- pushl $(__USER_CS)
- pushl $SYSENTER_RETURN
-
--/*
-- * Load the potential sixth argument from user stack.
-- * Careful about security.
-- */
-- cmpl $__PAGE_OFFSET-3,%ebp
-- jae syscall_fault
--1: movl (%ebp),%ebp
--.section __ex_table,"a"
-- .align 4
-- .long 1b,syscall_fault
--.previous
--
- pushl %eax
- SAVE_ALL
- GET_THREAD_INFO(%ebp)
- cmpl $(nr_syscalls), %eax
- jae syscall_badsys
-
-- testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
-+ testb $_TIF_SYSCALL_TRACE,TI_flags(%ebp)
- jnz syscall_trace_entry
- call *sys_call_table(,%eax,4)
- movl %eax,EAX(%esp)
- cli
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- testw $_TIF_ALLWORK_MASK, %cx
- jne syscall_exit_work
-+
-+#ifdef CONFIG_X86_SWITCH_PAGETABLES
-+
-+ GET_THREAD_INFO(%ebp)
-+ movl TI_virtual_stack(%ebp), %edx
-+ movl TI_user_pgd(%ebp), %ecx
-+ movl %esp, %ebx
-+ andl $0x1fff, %ebx
-+ orl %ebx, %edx
-+sysexit_ret_start_marker:
-+ movl %edx, %esp
-+ movl %ecx, %cr3
-+#endif
-+ /*
-+ * only ebx is not restored by the userspace sysenter vsyscall
-+ * code, it assumes it to be callee-saved.
-+ */
-+ movl EBX(%esp), %ebx
-+
- /* if something modifies registers it must also disable sysexit */
-+
- movl EIP(%esp), %edx
- movl OLDESP(%esp), %ecx
-+
- sti
- sysexit
-+#ifdef CONFIG_X86_SWITCH_PAGETABLES
-+sysexit_ret_end_marker:
-+ nop
-+#endif
-
-
- # system call handler stub
-@@ -287,7 +417,7 @@ ENTRY(system_call)
- cmpl $(nr_syscalls), %eax
- jae syscall_badsys
- # system call tracing in operation
-- testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
-+ testb $_TIF_SYSCALL_TRACE,TI_flags(%ebp)
- jnz syscall_trace_entry
- syscall_call:
- call *sys_call_table(,%eax,4)
-@@ -296,10 +426,23 @@ syscall_exit:
- cli # make sure we don't miss an interrupt
- # setting need_resched or sigpending
- # between sampling and the iret
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- testw $_TIF_ALLWORK_MASK, %cx # current->work
- jne syscall_exit_work
- restore_all:
-+#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
-+ movl EFLAGS(%esp), %eax # mix EFLAGS and CS
-+ movb CS(%esp), %al
-+ testl $(VM_MASK | 3), %eax
-+ jz resume_kernelX # returning to kernel or vm86-space
-+
-+ cmpl $0,TI_preempt_count(%ebp) # non-zero preempt_count ?
-+ jz resume_kernelX
-+
-+ int $3
-+
-+resume_kernelX:
-+#endif
- RESTORE_ALL
-
- # perform work that needs to be done immediately before resumption
-@@ -312,7 +455,7 @@ work_resched:
- cli # make sure we don't miss an interrupt
- # setting need_resched or sigpending
- # between sampling and the iret
-- movl TI_FLAGS(%ebp), %ecx
-+ movl TI_flags(%ebp), %ecx
- andl $_TIF_WORK_MASK, %ecx # is there any work to be done other
- # than syscall tracing?
- jz restore_all
-@@ -327,6 +470,22 @@ work_notifysig: # deal with pending s
- # vm86-space
- xorl %edx, %edx
- call do_notify_resume
-+
-+#if CONFIG_X86_HIGH_ENTRY
-+ /*
-+ * Reload db7 if necessary:
-+ */
-+ movl TI_flags(%ebp), %ecx
-+ testb $_TIF_DB7, %cl
-+ jnz work_db7
-+
-+ jmp restore_all
-+
-+work_db7:
-+ movl TI_task(%ebp), %edx;
-+ movl task_thread_db7(%edx), %edx;
-+ movl %edx, %db7;
-+#endif
- jmp restore_all
-
- ALIGN
-@@ -382,7 +541,7 @@ syscall_badsys:
- */
- .data
- ENTRY(interrupt)
--.text
-+.previous
-
- vector=0
- ENTRY(irq_entries_start)
-@@ -392,7 +551,7 @@ ENTRY(irq_entries_start)
- jmp common_interrupt
- .data
- .long 1b
--.text
-+.previous
- vector=vector+1
- .endr
-
-@@ -433,12 +592,17 @@ error_code:
- movl ES(%esp), %edi # get the function address
- movl %eax, ORIG_EAX(%esp)
- movl %ecx, ES(%esp)
-- movl %esp, %edx
- pushl %esi # push the error code
-- pushl %edx # push the pt_regs pointer
- movl $(__USER_DS), %edx
- movl %edx, %ds
- movl %edx, %es
-+
-+/* clobbers edx, ebx and ebp */
-+ __SWITCH_KERNELSPACE
-+
-+ leal 4(%esp), %edx # prepare pt_regs
-+ pushl %edx # push pt_regs
-+
- call *%edi
- addl $8, %esp
- jmp ret_from_exception
-@@ -529,7 +693,7 @@ nmi_stack_correct:
- pushl %edx
- call do_nmi
- addl $8, %esp
-- RESTORE_ALL
-+ jmp restore_all
-
- nmi_stack_fixup:
- FIX_STACK(12,nmi_stack_correct, 1)
-@@ -606,6 +770,8 @@ ENTRY(spurious_interrupt_bug)
- pushl $do_spurious_interrupt_bug
- jmp error_code
-
-+.previous
-+
- .data
- ENTRY(sys_call_table)
- .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/entry_trampoline.c 2003-12-28 23:26:36.000000000 -0800
-@@ -0,0 +1,75 @@
-+/*
-+ * linux/arch/i386/kernel/entry_trampoline.c
-+ *
-+ * (C) Copyright 2003 Ingo Molnar
-+ *
-+ * This file contains the needed support code for 4GB userspace
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/smp.h>
-+#include <linux/mm.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/highmem.h>
-+#include <asm/desc.h>
-+#include <asm/atomic_kmap.h>
-+
-+extern char __entry_tramp_start, __entry_tramp_end, __start___entry_text;
-+
-+void __init init_entry_mappings(void)
-+{
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ void *tramp;
-+
-+ /*
-+ * We need a high IDT and GDT for the 4G/4G split:
-+ */
-+ trap_init_virtual_IDT();
-+
-+ __set_fixmap(FIX_ENTRY_TRAMPOLINE_0, __pa((unsigned long)&__entry_tramp_start), PAGE_KERNEL);
-+ __set_fixmap(FIX_ENTRY_TRAMPOLINE_1, __pa((unsigned long)&__entry_tramp_start) + PAGE_SIZE, PAGE_KERNEL);
-+ tramp = (void *)fix_to_virt(FIX_ENTRY_TRAMPOLINE_0);
-+
-+ printk("mapped 4G/4G trampoline to %p.\n", tramp);
-+ BUG_ON((void *)&__start___entry_text != tramp);
-+ /*
-+ * Virtual kernel stack:
-+ */
-+ BUG_ON(__kmap_atomic_vaddr(KM_VSTACK0) & 8191);
-+ BUG_ON(sizeof(struct desc_struct)*NR_CPUS*GDT_ENTRIES > 2*PAGE_SIZE);
-+ BUG_ON((unsigned int)&__entry_tramp_end - (unsigned int)&__entry_tramp_start > 2*PAGE_SIZE);
-+
-+ /*
-+ * set up the initial thread's virtual stack related
-+ * fields:
-+ */
-+ current->thread.stack_page0 = virt_to_page((char *)current->thread_info);
-+ current->thread.stack_page1 = virt_to_page((char *)current->thread_info + PAGE_SIZE);
-+ current->thread_info->virtual_stack = (void *)__kmap_atomic_vaddr(KM_VSTACK0);
-+
-+ __kunmap_atomic_type(KM_VSTACK0);
-+ __kunmap_atomic_type(KM_VSTACK1);
-+ __kmap_atomic(current->thread.stack_page0, KM_VSTACK0);
-+ __kmap_atomic(current->thread.stack_page1, KM_VSTACK1);
-+
-+#endif
-+ printk("current: %p\n", current);
-+ printk("current->thread_info: %p\n", current->thread_info);
-+ current->thread_info->real_stack = (void *)current->thread_info;
-+ current->thread_info->user_pgd = NULL;
-+ current->thread.esp0 = (unsigned long)current->thread_info->real_stack + THREAD_SIZE;
-+}
-+
-+
-+
-+void __init entry_trampoline_setup(void)
-+{
-+ /*
-+ * old IRQ entries set up by the boot code will still hang
-+ * around - they are a sign of hw trouble anyway, now they'll
-+ * produce a double fault message.
-+ */
-+ trap_init_virtual_GDT();
-+}
---- linux-2.6.0/arch/i386/kernel/head.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/head.S 2003-12-28 23:26:36.000000000 -0800
-@@ -16,6 +16,7 @@
- #include <asm/pgtable.h>
- #include <asm/desc.h>
- #include <asm/cache.h>
-+#include <asm/asm_offsets.h>
-
- #define OLD_CL_MAGIC_ADDR 0x90020
- #define OLD_CL_MAGIC 0xA33F
-@@ -330,7 +331,7 @@ ENTRY(stack_start)
-
- /* This is the default interrupt "handler" :-) */
- int_msg:
-- .asciz "Unknown interrupt\n"
-+ .asciz "Unknown interrupt or fault at EIP %p %p %p\n"
- ALIGN
- ignore_int:
- cld
-@@ -342,9 +343,17 @@ ignore_int:
- movl $(__KERNEL_DS),%eax
- movl %eax,%ds
- movl %eax,%es
-+ pushl 16(%esp)
-+ pushl 24(%esp)
-+ pushl 32(%esp)
-+ pushl 40(%esp)
- pushl $int_msg
- call printk
- popl %eax
-+ popl %eax
-+ popl %eax
-+ popl %eax
-+ popl %eax
- popl %ds
- popl %es
- popl %edx
-@@ -377,23 +386,27 @@ cpu_gdt_descr:
- .fill NR_CPUS-1,8,0 # space for the other GDT descriptors
-
- /*
-- * This is initialized to create an identity-mapping at 0-8M (for bootup
-- * purposes) and another mapping of the 0-8M area at virtual address
-+ * This is initialized to create an identity-mapping at 0-16M (for bootup
-+ * purposes) and another mapping of the 0-16M area at virtual address
- * PAGE_OFFSET.
- */
- .org 0x1000
- ENTRY(swapper_pg_dir)
- .long 0x00102007
- .long 0x00103007
-- .fill BOOT_USER_PGD_PTRS-2,4,0
-- /* default: 766 entries */
-+ .long 0x00104007
-+ .long 0x00105007
-+ .fill BOOT_USER_PGD_PTRS-4,4,0
-+ /* default: 764 entries */
- .long 0x00102007
- .long 0x00103007
-- /* default: 254 entries */
-- .fill BOOT_KERNEL_PGD_PTRS-2,4,0
-+ .long 0x00104007
-+ .long 0x00105007
-+ /* default: 252 entries */
-+ .fill BOOT_KERNEL_PGD_PTRS-4,4,0
-
- /*
-- * The page tables are initialized to only 8MB here - the final page
-+ * The page tables are initialized to only 16MB here - the final page
- * tables are set up later depending on memory size.
- */
- .org 0x2000
-@@ -402,15 +415,21 @@ ENTRY(pg0)
- .org 0x3000
- ENTRY(pg1)
-
-+.org 0x4000
-+ENTRY(pg2)
-+
-+.org 0x5000
-+ENTRY(pg3)
-+
- /*
- * empty_zero_page must immediately follow the page tables ! (The
- * initialization loop counts until empty_zero_page)
- */
-
--.org 0x4000
-+.org 0x6000
- ENTRY(empty_zero_page)
-
--.org 0x5000
-+.org 0x7000
-
- /*
- * Real beginning of normal "text" segment
-@@ -419,12 +438,12 @@ ENTRY(stext)
- ENTRY(_stext)
-
- /*
-- * This starts the data section. Note that the above is all
-- * in the text section because it has alignment requirements
-- * that we cannot fulfill any other way.
-+ * This starts the data section.
- */
- .data
-
-+.align PAGE_SIZE_asm
-+
- /*
- * The Global Descriptor Table contains 28 quadwords, per-CPU.
- */
-@@ -439,7 +458,9 @@ ENTRY(boot_gdt_table)
- .quad 0x00cf9a000000ffff /* kernel 4GB code at 0x00000000 */
- .quad 0x00cf92000000ffff /* kernel 4GB data at 0x00000000 */
- #endif
-- .align L1_CACHE_BYTES
-+
-+.align PAGE_SIZE_asm
-+
- ENTRY(cpu_gdt_table)
- .quad 0x0000000000000000 /* NULL descriptor */
- .quad 0x0000000000000000 /* 0x0b reserved */
---- linux-2.6.0/arch/i386/kernel/i386_ksyms.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/i386_ksyms.c 2003-12-28 23:26:36.000000000 -0800
-@@ -98,7 +98,6 @@ EXPORT_SYMBOL_NOVERS(__down_failed_inter
- EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
- EXPORT_SYMBOL_NOVERS(__up_wakeup);
- /* Networking helper routines. */
--EXPORT_SYMBOL(csum_partial_copy_generic);
- /* Delay loops */
- EXPORT_SYMBOL(__ndelay);
- EXPORT_SYMBOL(__udelay);
-@@ -112,13 +111,17 @@ EXPORT_SYMBOL_NOVERS(__get_user_4);
- EXPORT_SYMBOL(strpbrk);
- EXPORT_SYMBOL(strstr);
-
-+#if !defined(CONFIG_X86_UACCESS_INDIRECT)
- EXPORT_SYMBOL(strncpy_from_user);
--EXPORT_SYMBOL(__strncpy_from_user);
-+EXPORT_SYMBOL(__direct_strncpy_from_user);
- EXPORT_SYMBOL(clear_user);
- EXPORT_SYMBOL(__clear_user);
- EXPORT_SYMBOL(__copy_from_user_ll);
- EXPORT_SYMBOL(__copy_to_user_ll);
- EXPORT_SYMBOL(strnlen_user);
-+#else /* CONFIG_X86_UACCESS_INDIRECT */
-+EXPORT_SYMBOL(direct_csum_partial_copy_generic);
-+#endif
-
- EXPORT_SYMBOL(dma_alloc_coherent);
- EXPORT_SYMBOL(dma_free_coherent);
---- linux-2.6.0/arch/i386/kernel/i387.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/i387.c 2003-12-28 23:26:36.000000000 -0800
-@@ -218,6 +218,7 @@ void set_fpu_mxcsr( struct task_struct *
- static int convert_fxsr_to_user( struct _fpstate __user *buf,
- struct i387_fxsave_struct *fxsave )
- {
-+ struct _fpreg tmp[8]; /* 80 bytes scratch area */
- unsigned long env[7];
- struct _fpreg __user *to;
- struct _fpxreg *from;
-@@ -234,23 +235,25 @@ static int convert_fxsr_to_user( struct
- if ( __copy_to_user( buf, env, 7 * sizeof(unsigned long) ) )
- return 1;
-
-- to = &buf->_st[0];
-+ to = tmp;
- from = (struct _fpxreg *) &fxsave->st_space[0];
- for ( i = 0 ; i < 8 ; i++, to++, from++ ) {
- unsigned long *t = (unsigned long *)to;
- unsigned long *f = (unsigned long *)from;
-
-- if (__put_user(*f, t) ||
-- __put_user(*(f + 1), t + 1) ||
-- __put_user(from->exponent, &to->exponent))
-- return 1;
-+ *t = *f;
-+ *(t + 1) = *(f+1);
-+ to->exponent = from->exponent;
- }
-+ if (copy_to_user(buf->_st, tmp, sizeof(struct _fpreg [8])))
-+ return 1;
- return 0;
- }
-
- static int convert_fxsr_from_user( struct i387_fxsave_struct *fxsave,
- struct _fpstate __user *buf )
- {
-+ struct _fpreg tmp[8]; /* 80 bytes scratch area */
- unsigned long env[7];
- struct _fpxreg *to;
- struct _fpreg __user *from;
-@@ -258,6 +261,8 @@ static int convert_fxsr_from_user( struc
-
- if ( __copy_from_user( env, buf, 7 * sizeof(long) ) )
- return 1;
-+ if (copy_from_user(tmp, buf->_st, sizeof(struct _fpreg [8])))
-+ return 1;
-
- fxsave->cwd = (unsigned short)(env[0] & 0xffff);
- fxsave->swd = (unsigned short)(env[1] & 0xffff);
-@@ -269,15 +274,14 @@ static int convert_fxsr_from_user( struc
- fxsave->fos = env[6];
-
- to = (struct _fpxreg *) &fxsave->st_space[0];
-- from = &buf->_st[0];
-+ from = tmp;
- for ( i = 0 ; i < 8 ; i++, to++, from++ ) {
- unsigned long *t = (unsigned long *)to;
- unsigned long *f = (unsigned long *)from;
-
-- if (__get_user(*t, f) ||
-- __get_user(*(t + 1), f + 1) ||
-- __get_user(to->exponent, &from->exponent))
-- return 1;
-+ *t = *f;
-+ *(t + 1) = *(f + 1);
-+ to->exponent = from->exponent;
- }
- return 0;
- }
---- linux-2.6.0/arch/i386/kernel/i8259.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/i8259.c 2003-12-28 23:21:44.000000000 -0800
-@@ -419,8 +419,10 @@ void __init init_IRQ(void)
- * us. (some of these will be overridden and become
- * 'special' SMP interrupts)
- */
-- for (i = 0; i < NR_IRQS; i++) {
-+ for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
- int vector = FIRST_EXTERNAL_VECTOR + i;
-+ if (i >= NR_IRQS)
-+ break;
- if (vector != SYSCALL_VECTOR)
- set_intr_gate(vector, interrupt[i]);
- }
---- linux-2.6.0/arch/i386/kernel/init_task.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/init_task.c 2003-12-28 23:26:36.000000000 -0800
-@@ -26,7 +26,7 @@ EXPORT_SYMBOL(init_mm);
- */
- union thread_union init_thread_union
- __attribute__((__section__(".data.init_task"))) =
-- { INIT_THREAD_INFO(init_task) };
-+ { INIT_THREAD_INFO(init_task, init_thread_union) };
-
- /*
- * Initial task structure.
-@@ -44,5 +44,5 @@ EXPORT_SYMBOL(init_task);
- * section. Since TSS's are completely CPU-local, we want them
- * on exact cacheline boundaries, to eliminate cacheline ping-pong.
- */
--struct tss_struct init_tss[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = INIT_TSS };
-+struct tss_struct init_tss[NR_CPUS] __attribute__((__section__(".data.tss"))) = { [0 ... NR_CPUS-1] = INIT_TSS };
-
---- linux-2.6.0/arch/i386/kernel/io_apic.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/io_apic.c 2003-12-28 23:21:44.000000000 -0800
-@@ -76,6 +76,14 @@ static struct irq_pin_list {
- int apic, pin, next;
- } irq_2_pin[PIN_MAP_SIZE];
-
-+#ifdef CONFIG_PCI_USE_VECTOR
-+int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
-+#define vector_to_irq(vector) \
-+ (platform_legacy_irq(vector) ? vector : vector_irq[vector])
-+#else
-+#define vector_to_irq(vector) (vector)
-+#endif
-+
- /*
- * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
- * shared ISA-space IRQs, so we have to support them. We are super
-@@ -249,7 +257,7 @@ static void clear_IO_APIC (void)
- clear_IO_APIC_pin(apic, pin);
- }
-
--static void set_ioapic_affinity(unsigned int irq, cpumask_t cpumask)
-+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
- {
- unsigned long flags;
- int pin;
-@@ -288,7 +296,7 @@ static void set_ioapic_affinity(unsigned
-
- extern cpumask_t irq_affinity[NR_IRQS];
-
--static cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
-+cpumask_t __cacheline_aligned pending_irq_balance_cpumask[NR_IRQS];
-
- #define IRQBALANCE_CHECK_ARCH -999
- static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH;
-@@ -670,13 +678,11 @@ static int __init irqbalance_disable(cha
-
- __setup("noirqbalance", irqbalance_disable);
-
--static void set_ioapic_affinity(unsigned int irq, cpumask_t mask);
--
- static inline void move_irq(int irq)
- {
- /* note - we hold the desc->lock */
- if (unlikely(!cpus_empty(pending_irq_balance_cpumask[irq]))) {
-- set_ioapic_affinity(irq, pending_irq_balance_cpumask[irq]);
-+ set_ioapic_affinity_irq(irq, pending_irq_balance_cpumask[irq]);
- cpus_clear(pending_irq_balance_cpumask[irq]);
- }
- }
-@@ -853,7 +859,7 @@ void __init setup_ioapic_dest(cpumask_t
- if (irq_entry == -1)
- continue;
- irq = pin_2_irq(irq_entry, ioapic, pin);
-- set_ioapic_affinity(irq, mask);
-+ set_ioapic_affinity_irq(irq, mask);
- }
-
- }
-@@ -1141,7 +1147,8 @@ static inline int IO_APIC_irq_trigger(in
- /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
- u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
-
--static int __init assign_irq_vector(int irq)
-+#ifndef CONFIG_PCI_USE_VECTOR
-+int __init assign_irq_vector(int irq)
- {
- static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
- BUG_ON(irq >= NR_IRQ_VECTORS);
-@@ -1158,11 +1165,36 @@ next:
- }
-
- IO_APIC_VECTOR(irq) = current_vector;
-+
- return current_vector;
- }
-+#endif
-+
-+static struct hw_interrupt_type ioapic_level_type;
-+static struct hw_interrupt_type ioapic_edge_type;
-
--static struct hw_interrupt_type ioapic_level_irq_type;
--static struct hw_interrupt_type ioapic_edge_irq_type;
-+#define IOAPIC_AUTO -1
-+#define IOAPIC_EDGE 0
-+#define IOAPIC_LEVEL 1
-+
-+static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger)
-+{
-+ if (use_pci_vector() && !platform_legacy_irq(irq)) {
-+ if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-+ trigger == IOAPIC_LEVEL)
-+ irq_desc[vector].handler = &ioapic_level_type;
-+ else
-+ irq_desc[vector].handler = &ioapic_edge_type;
-+ set_intr_gate(vector, interrupt[vector]);
-+ } else {
-+ if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-+ trigger == IOAPIC_LEVEL)
-+ irq_desc[irq].handler = &ioapic_level_type;
-+ else
-+ irq_desc[irq].handler = &ioapic_edge_type;
-+ set_intr_gate(vector, interrupt[irq]);
-+ }
-+}
-
- void __init setup_IO_APIC_irqs(void)
- {
-@@ -1220,13 +1252,7 @@ void __init setup_IO_APIC_irqs(void)
- if (IO_APIC_IRQ(irq)) {
- vector = assign_irq_vector(irq);
- entry.vector = vector;
--
-- if (IO_APIC_irq_trigger(irq))
-- irq_desc[irq].handler = &ioapic_level_irq_type;
-- else
-- irq_desc[irq].handler = &ioapic_edge_irq_type;
--
-- set_intr_gate(vector, interrupt[irq]);
-+ ioapic_register_intr(irq, vector, IOAPIC_AUTO);
-
- if (!apic && (irq < 16))
- disable_8259A_irq(irq);
-@@ -1273,7 +1299,7 @@ void __init setup_ExtINT_IRQ0_pin(unsign
- * The timer IRQ doesn't have to know that behind the
- * scene we have a 8259A-master in AEOI mode ...
- */
-- irq_desc[0].handler = &ioapic_edge_irq_type;
-+ irq_desc[0].handler = &ioapic_edge_type;
-
- /*
- * Add it to the IO-APIC irq-routing table:
-@@ -1624,10 +1650,6 @@ static void __init setup_ioapic_ids_from
- unsigned char old_id;
- unsigned long flags;
-
-- if (acpi_ioapic)
-- /* This gets done during IOAPIC enumeration for ACPI. */
-- return;
--
- /*
- * This is broken; anything with a real cpu count has to
- * circumvent this idiocy regardless.
-@@ -1763,9 +1785,6 @@ static int __init timer_irq_works(void)
- * that was delayed but this is now handled in the device
- * independent code.
- */
--#define enable_edge_ioapic_irq unmask_IO_APIC_irq
--
--static void disable_edge_ioapic_irq (unsigned int irq) { /* nothing */ }
-
- /*
- * Starting up a edge-triggered IO-APIC interrupt is
-@@ -1776,7 +1795,6 @@ static void disable_edge_ioapic_irq (uns
- * This is not complete - we should be able to fake
- * an edge even if it isn't on the 8259A...
- */
--
- static unsigned int startup_edge_ioapic_irq(unsigned int irq)
- {
- int was_pending = 0;
-@@ -1794,8 +1812,6 @@ static unsigned int startup_edge_ioapic_
- return was_pending;
- }
-
--#define shutdown_edge_ioapic_irq disable_edge_ioapic_irq
--
- /*
- * Once we have recorded IRQ_PENDING already, we can mask the
- * interrupt for real. This prevents IRQ storms from unhandled
-@@ -1810,9 +1826,6 @@ static void ack_edge_ioapic_irq(unsigned
- ack_APIC_irq();
- }
-
--static void end_edge_ioapic_irq (unsigned int i) { /* nothing */ }
--
--
- /*
- * Level triggered interrupts can just be masked,
- * and shutting down and starting up the interrupt
-@@ -1834,10 +1847,6 @@ static unsigned int startup_level_ioapic
- return 0; /* don't check for pending */
- }
-
--#define shutdown_level_ioapic_irq mask_IO_APIC_irq
--#define enable_level_ioapic_irq unmask_IO_APIC_irq
--#define disable_level_ioapic_irq mask_IO_APIC_irq
--
- static void end_level_ioapic_irq (unsigned int irq)
- {
- unsigned long v;
-@@ -1864,6 +1873,7 @@ static void end_level_ioapic_irq (unsign
- * The idea is from Manfred Spraul. --macro
- */
- i = IO_APIC_VECTOR(irq);
-+
- v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
-
- ack_APIC_irq();
-@@ -1898,7 +1908,57 @@ static void end_level_ioapic_irq (unsign
- }
- }
-
--static void mask_and_ack_level_ioapic_irq (unsigned int irq) { /* nothing */ }
-+#ifdef CONFIG_PCI_USE_VECTOR
-+static unsigned int startup_edge_ioapic_vector(unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ return startup_edge_ioapic_irq(irq);
-+}
-+
-+static void ack_edge_ioapic_vector(unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ ack_edge_ioapic_irq(irq);
-+}
-+
-+static unsigned int startup_level_ioapic_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ return startup_level_ioapic_irq (irq);
-+}
-+
-+static void end_level_ioapic_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ end_level_ioapic_irq(irq);
-+}
-+
-+static void mask_IO_APIC_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ mask_IO_APIC_irq(irq);
-+}
-+
-+static void unmask_IO_APIC_vector (unsigned int vector)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ unmask_IO_APIC_irq(irq);
-+}
-+
-+static void set_ioapic_affinity_vector (unsigned int vector,
-+ cpumask_t cpu_mask)
-+{
-+ int irq = vector_to_irq(vector);
-+
-+ set_ioapic_affinity_irq(irq, cpu_mask);
-+}
-+#endif
-
- /*
- * Level and edge triggered IO-APIC interrupts need different handling,
-@@ -1908,26 +1968,25 @@ static void mask_and_ack_level_ioapic_ir
- * edge-triggered handler, without risking IRQ storms and other ugly
- * races.
- */
--
--static struct hw_interrupt_type ioapic_edge_irq_type = {
-+static struct hw_interrupt_type ioapic_edge_type = {
- .typename = "IO-APIC-edge",
-- .startup = startup_edge_ioapic_irq,
-- .shutdown = shutdown_edge_ioapic_irq,
-- .enable = enable_edge_ioapic_irq,
-- .disable = disable_edge_ioapic_irq,
-- .ack = ack_edge_ioapic_irq,
-- .end = end_edge_ioapic_irq,
-+ .startup = startup_edge_ioapic,
-+ .shutdown = shutdown_edge_ioapic,
-+ .enable = enable_edge_ioapic,
-+ .disable = disable_edge_ioapic,
-+ .ack = ack_edge_ioapic,
-+ .end = end_edge_ioapic,
- .set_affinity = set_ioapic_affinity,
- };
-
--static struct hw_interrupt_type ioapic_level_irq_type = {
-+static struct hw_interrupt_type ioapic_level_type = {
- .typename = "IO-APIC-level",
-- .startup = startup_level_ioapic_irq,
-- .shutdown = shutdown_level_ioapic_irq,
-- .enable = enable_level_ioapic_irq,
-- .disable = disable_level_ioapic_irq,
-- .ack = mask_and_ack_level_ioapic_irq,
-- .end = end_level_ioapic_irq,
-+ .startup = startup_level_ioapic,
-+ .shutdown = shutdown_level_ioapic,
-+ .enable = enable_level_ioapic,
-+ .disable = disable_level_ioapic,
-+ .ack = mask_and_ack_level_ioapic,
-+ .end = end_level_ioapic,
- .set_affinity = set_ioapic_affinity,
- };
-
-@@ -1947,7 +2006,13 @@ static inline void init_IO_APIC_traps(vo
- * 0x80, because int 0x80 is hm, kind of importantish. ;)
- */
- for (irq = 0; irq < NR_IRQS ; irq++) {
-- if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq)) {
-+ int tmp = irq;
-+ if (use_pci_vector()) {
-+ if (!platform_legacy_irq(tmp))
-+ if ((tmp = vector_to_irq(tmp)) == -1)
-+ continue;
-+ }
-+ if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
- /*
- * Hmm.. We don't have an entry for this,
- * so default to an old-fashioned 8259
-@@ -2217,12 +2282,14 @@ void __init setup_IO_APIC(void)
- /*
- * Set up IO-APIC IRQ routing.
- */
-- setup_ioapic_ids_from_mpc();
-+ if (!acpi_ioapic)
-+ setup_ioapic_ids_from_mpc();
- sync_Arb_IDs();
- setup_IO_APIC_irqs();
- init_IO_APIC_traps();
- check_timer();
-- print_IO_APIC();
-+ if (!acpi_ioapic)
-+ print_IO_APIC();
- }
-
- /*
-@@ -2379,10 +2446,12 @@ int io_apic_set_pci_routing (int ioapic,
- "IRQ %d Mode:%i Active:%i)\n", ioapic,
- mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low);
-
-+ if (use_pci_vector() && !platform_legacy_irq(irq))
-+ irq = IO_APIC_VECTOR(irq);
- if (edge_level) {
-- irq_desc[irq].handler = &ioapic_level_irq_type;
-+ irq_desc[irq].handler = &ioapic_level_type;
- } else {
-- irq_desc[irq].handler = &ioapic_edge_irq_type;
-+ irq_desc[irq].handler = &ioapic_edge_type;
- }
-
- set_intr_gate(entry.vector, interrupt[irq]);
---- linux-2.6.0/arch/i386/kernel/irq.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -138,17 +138,19 @@ atomic_t irq_mis_count;
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_printf(p, " ");
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_printf(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -170,28 +172,32 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-- }
-- seq_printf(p, "NMI: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", nmi_count(j));
-- seq_putc(p, '\n');
-+ } else if (i == NR_IRQS) {
-+ seq_printf(p, "NMI: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", nmi_count(j));
-+ seq_putc(p, '\n');
- #ifdef CONFIG_X86_LOCAL_APIC
-- seq_printf(p, "LOC: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-- seq_putc(p, '\n');
-+ seq_printf(p, "LOC: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-+ seq_putc(p, '\n');
- #endif
-- seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-+ seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
- #ifdef CONFIG_X86_IO_APIC
- #ifdef APIC_MISMATCH_DEBUG
-- seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-+ seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
- #endif
- #endif
-+ }
- return 0;
- }
-
-+
-+
-+
- #ifdef CONFIG_SMP
- inline void synchronize_irq(unsigned int irq)
- {
-@@ -502,6 +508,8 @@ out:
-
- irq_exit();
-
-+ kgdb_process_breakpoint();
-+
- return 1;
- }
-
-@@ -898,48 +906,6 @@ int setup_irq(unsigned int irq, struct i
- static struct proc_dir_entry * root_irq_dir;
- static struct proc_dir_entry * irq_dir [NR_IRQS];
-
--#define HEX_DIGITS (2*sizeof(cpumask_t))
--
--static unsigned int parse_hex_value(const char __user *buffer,
-- unsigned long count, cpumask_t *ret)
--{
-- unsigned char hexnum[HEX_DIGITS];
-- cpumask_t value = CPU_MASK_NONE;
-- int i;
--
-- if (!count)
-- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
--
-- for (i = 0; i < count; i++) {
-- unsigned int c = hexnum[i];
-- int k;
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- cpus_shift_left(value, value, 4);
-- for (k = 0; k < 4; ++k)
-- if (test_bit(k, (unsigned long *)&c))
-- cpu_set(k, value);
-- }
--out:
-- *ret = value;
-- return 0;
--}
--
- #ifdef CONFIG_SMP
-
- static struct proc_dir_entry *smp_affinity_entry[NR_IRQS];
-@@ -949,20 +915,10 @@ cpumask_t irq_affinity[NR_IRQS] = { [0 .
- static int irq_affinity_read_proc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- int k, len;
-- cpumask_t tmp = irq_affinity[(long)data];
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
--
-- len = 0;
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -975,7 +931,7 @@ static int irq_affinity_write_proc(struc
- if (!irq_desc[irq].handler->set_affinity)
- return -EIO;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
-@@ -1000,10 +956,11 @@ static int irq_affinity_write_proc(struc
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- unsigned long *mask = (unsigned long *) data;
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%08lx\n", *mask);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
-@@ -1013,7 +970,7 @@ static int prof_cpu_mask_write_proc (str
- unsigned long full_count = count, err;
- cpumask_t new_value;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/kgdb_stub.c 2003-12-28 23:21:09.000000000 -0800
-@@ -0,0 +1,2457 @@
-+/*
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2, or (at your option) any
-+ * later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ */
-+
-+/*
-+ * Copyright (c) 2000 VERITAS Software Corporation.
-+ *
-+ */
-+/****************************************************************************
-+ * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
-+ *
-+ * Module name: remcom.c $
-+ * Revision: 1.34 $
-+ * Date: 91/03/09 12:29:49 $
-+ * Contributor: Lake Stevens Instrument Division$
-+ *
-+ * Description: low level support for gdb debugger. $
-+ *
-+ * Considerations: only works on target hardware $
-+ *
-+ * Written by: Glenn Engel $
-+ * Updated by: David Grothe <dave@gcom.com>
-+ * Updated by: Robert Walsh <rjwalsh@durables.org>
-+ * Updated by: wangdi <wangdi@clusterfs.com>
-+ * ModuleState: Experimental $
-+ *
-+ * NOTES: See Below $
-+ *
-+ * Modified for 386 by Jim Kingdon, Cygnus Support.
-+ * Compatibility with 2.1.xx kernel by David Grothe <dave@gcom.com>
-+ *
-+ * Changes to allow auto initilization. All that is needed is that it
-+ * be linked with the kernel and a break point (int 3) be executed.
-+ * The header file <asm/kgdb.h> defines BREAKPOINT to allow one to do
-+ * this. It should also be possible, once the interrupt system is up, to
-+ * call putDebugChar("+"). Once this is done, the remote debugger should
-+ * get our attention by sending a ^C in a packet. George Anzinger
-+ * <george@mvista.com>
-+ * Integrated into 2.2.5 kernel by Tigran Aivazian <tigran@sco.com>
-+ * Added thread support, support for multiple processors,
-+ * support for ia-32(x86) hardware debugging.
-+ * Amit S. Kale ( akale@veritas.com )
-+ *
-+ * Modified to support debugging over ethernet by Robert Walsh
-+ * <rjwalsh@durables.org> and wangdi <wangdi@clusterfs.com>, based on
-+ * code by San Mehat.
-+ *
-+ *
-+ * To enable debugger support, two things need to happen. One, a
-+ * call to set_debug_traps() is necessary in order to allow any breakpoints
-+ * or error conditions to be properly intercepted and reported to gdb.
-+ * Two, a breakpoint needs to be generated to begin communication. This
-+ * is most easily accomplished by a call to breakpoint(). Breakpoint()
-+ * simulates a breakpoint by executing an int 3.
-+ *
-+ *************
-+ *
-+ * The following gdb commands are supported:
-+ *
-+ * command function Return value
-+ *
-+ * g return the value of the CPU registers hex data or ENN
-+ * G set the value of the CPU registers OK or ENN
-+ *
-+ * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
-+ * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
-+ *
-+ * c Resume at current address SNN ( signal NN)
-+ * cAA..AA Continue at address AA..AA SNN
-+ *
-+ * s Step one instruction SNN
-+ * sAA..AA Step one instruction from AA..AA SNN
-+ *
-+ * k kill
-+ *
-+ * ? What was the last sigval ? SNN (signal NN)
-+ *
-+ * All commands and responses are sent with a packet which includes a
-+ * checksum. A packet consists of
-+ *
-+ * $<packet info>#<checksum>.
-+ *
-+ * where
-+ * <packet info> :: <characters representing the command or response>
-+ * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
-+ *
-+ * When a packet is received, it is first acknowledged with either '+' or '-'.
-+ * '+' indicates a successful transfer. '-' indicates a failed transfer.
-+ *
-+ * Example:
-+ *
-+ * Host: Reply:
-+ * $m0,10#2a +$00010203040506070809101112131415#42
-+ *
-+ ****************************************************************************/
-+#define KGDB_VERSION "<20030915.1651.33>"
-+#include <linux/config.h>
-+#include <linux/types.h>
-+#include <asm/string.h> /* for strcpy */
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <asm/vm86.h>
-+#include <asm/system.h>
-+#include <asm/ptrace.h> /* for linux pt_regs struct */
-+#include <asm/kgdb_local.h>
-+#include <linux/list.h>
-+#include <asm/atomic.h>
-+#include <asm/processor.h>
-+#include <linux/irq.h>
-+#include <asm/desc.h>
-+#include <linux/inet.h>
-+#include <linux/netpoll.h>
-+
-+/************************************************************************
-+ *
-+ * external low-level support routines
-+ */
-+typedef void (*Function) (void); /* pointer to a function */
-+
-+/* Thread reference */
-+typedef unsigned char threadref[8];
-+
-+extern int tty_putDebugChar(int); /* write a single character */
-+extern int tty_getDebugChar(void); /* read and return a single char */
-+extern void tty_flushDebugChar(void); /* flush pending characters */
-+extern int eth_putDebugChar(int); /* write a single character */
-+extern int eth_getDebugChar(void); /* read and return a single char */
-+extern void eth_flushDebugChar(void); /* flush pending characters */
-+
-+/************************************************************************/
-+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
-+/* at least NUMREGBYTES*2 are needed for register packets */
-+/* Longer buffer is needed to list all threads */
-+#define BUFMAX 400
-+
-+char *kgdb_version = KGDB_VERSION;
-+
-+/* debug > 0 prints ill-formed commands in valid packets & checksum errors */
-+int debug_regs = 0; /* set to non-zero to print registers */
-+
-+/* filled in by an external module */
-+char *gdb_module_offsets;
-+
-+static const char hexchars[] = "0123456789abcdef";
-+
-+/* Number of bytes of registers. */
-+#define NUMREGBYTES 64
-+/*
-+ * Note that this register image is in a different order than
-+ * the register image that Linux produces at interrupt time.
-+ *
-+ * Linux's register image is defined by struct pt_regs in ptrace.h.
-+ * Just why GDB uses a different order is a historical mystery.
-+ */
-+enum regnames { _EAX, /* 0 */
-+ _ECX, /* 1 */
-+ _EDX, /* 2 */
-+ _EBX, /* 3 */
-+ _ESP, /* 4 */
-+ _EBP, /* 5 */
-+ _ESI, /* 6 */
-+ _EDI, /* 7 */
-+ _PC /* 8 also known as eip */ ,
-+ _PS /* 9 also known as eflags */ ,
-+ _CS, /* 10 */
-+ _SS, /* 11 */
-+ _DS, /* 12 */
-+ _ES, /* 13 */
-+ _FS, /* 14 */
-+ _GS /* 15 */
-+};
-+
-+/*************************** ASSEMBLY CODE MACROS *************************/
-+/*
-+ * Put the error code here just in case the user cares.
-+ * Likewise, the vector number here (since GDB only gets the signal
-+ * number through the usual means, and that's not very specific).
-+ * The called_from is the return address so he can tell how we entered kgdb.
-+ * This will allow him to seperate out the various possible entries.
-+ */
-+#define REMOTE_DEBUG 0 /* set != to turn on printing (also available in info) */
-+
-+#define PID_MAX PID_MAX_DEFAULT
-+
-+#ifdef CONFIG_SMP
-+void smp_send_nmi_allbutself(void);
-+#define IF_SMP(x) x
-+#undef MAX_NO_CPUS
-+#ifndef CONFIG_NO_KGDB_CPUS
-+#define CONFIG_NO_KGDB_CPUS 2
-+#endif
-+#if CONFIG_NO_KGDB_CPUS > NR_CPUS
-+#define MAX_NO_CPUS NR_CPUS
-+#else
-+#define MAX_NO_CPUS CONFIG_NO_KGDB_CPUS
-+#endif
-+#define hold_init hold_on_sstep: 1,
-+#define MAX_CPU_MASK (unsigned long)((1LL << MAX_NO_CPUS) - 1LL)
-+#define NUM_CPUS num_online_cpus()
-+#else
-+#define IF_SMP(x)
-+#define hold_init
-+#undef MAX_NO_CPUS
-+#define MAX_NO_CPUS 1
-+#define NUM_CPUS 1
-+#endif
-+#define NOCPU (struct task_struct *)0xbad1fbad
-+/* *INDENT-OFF* */
-+struct kgdb_info {
-+ int used_malloc;
-+ void *called_from;
-+ long long entry_tsc;
-+ int errcode;
-+ int vector;
-+ int print_debug_info;
-+#ifdef CONFIG_SMP
-+ int hold_on_sstep;
-+ struct {
-+ volatile struct task_struct *task;
-+ int pid;
-+ int hold;
-+ struct pt_regs *regs;
-+ } cpus_waiting[MAX_NO_CPUS];
-+#endif
-+} kgdb_info = {hold_init print_debug_info:REMOTE_DEBUG, vector:-1};
-+
-+/* *INDENT-ON* */
-+
-+#define used_m kgdb_info.used_malloc
-+/*
-+ * This is little area we set aside to contain the stack we
-+ * need to build to allow gdb to call functions. We use one
-+ * per cpu to avoid locking issues. We will do all this work
-+ * with interrupts off so that should take care of the protection
-+ * issues.
-+ */
-+#define LOOKASIDE_SIZE 200 /* should be more than enough */
-+#define MALLOC_MAX 200 /* Max malloc size */
-+struct {
-+ unsigned int esp;
-+ int array[LOOKASIDE_SIZE];
-+} fn_call_lookaside[MAX_NO_CPUS];
-+
-+static int trap_cpu;
-+static unsigned int OLD_esp;
-+
-+#define END_OF_LOOKASIDE &fn_call_lookaside[trap_cpu].array[LOOKASIDE_SIZE]
-+#define IF_BIT 0x200
-+#define TF_BIT 0x100
-+
-+#define MALLOC_ROUND 8-1
-+
-+static char malloc_array[MALLOC_MAX];
-+IF_SMP(static void to_gdb(const char *mess));
-+void *
-+malloc(int size)
-+{
-+
-+ if (size <= (MALLOC_MAX - used_m)) {
-+ int old_used = used_m;
-+ used_m += ((size + MALLOC_ROUND) & (~MALLOC_ROUND));
-+ return &malloc_array[old_used];
-+ } else {
-+ return NULL;
-+ }
-+}
-+
-+/*
-+ * I/O dispatch functions...
-+ * Based upon kgdboe, either call the ethernet
-+ * handler or the serial one..
-+ */
-+void
-+putDebugChar(int c)
-+{
-+ if (!kgdboe) {
-+ tty_putDebugChar(c);
-+ } else {
-+ eth_putDebugChar(c);
-+ }
-+}
-+
-+int
-+getDebugChar(void)
-+{
-+ if (!kgdboe) {
-+ return tty_getDebugChar();
-+ } else {
-+ return eth_getDebugChar();
-+ }
-+}
-+
-+void
-+flushDebugChar(void)
-+{
-+ if (!kgdboe) {
-+ tty_flushDebugChar();
-+ } else {
-+ eth_flushDebugChar();
-+ }
-+}
-+
-+/*
-+ * Gdb calls functions by pushing agruments, including a return address
-+ * on the stack and the adjusting EIP to point to the function. The
-+ * whole assumption in GDB is that we are on a different stack than the
-+ * one the "user" i.e. code that hit the break point, is on. This, of
-+ * course is not true in the kernel. Thus various dodges are needed to
-+ * do the call without directly messing with EIP (which we can not change
-+ * as it is just a location and not a register. To adjust it would then
-+ * require that we move every thing below EIP up or down as needed. This
-+ * will not work as we may well have stack relative pointer on the stack
-+ * (such as the pointer to regs, for example).
-+
-+ * So here is what we do:
-+ * We detect gdb attempting to store into the stack area and instead, store
-+ * into the fn_call_lookaside.array at the same relative location as if it
-+ * were the area ESP pointed at. We also trap ESP modifications
-+ * and uses these to adjust fn_call_lookaside.esp. On entry
-+ * fn_call_lookaside.esp will be set to point at the last entry in
-+ * fn_call_lookaside.array. This allows us to check if it has changed, and
-+ * if so, on exit, we add the registers we will use to do the move and a
-+ * trap/ interrupt return exit sequence. We then adjust the eflags in the
-+ * regs array (remember we now have a copy in the fn_call_lookaside.array) to
-+ * kill the interrupt bit, AND we change EIP to point at our set up stub.
-+ * As part of the register set up we preset the registers to point at the
-+ * begining and end of the fn_call_lookaside.array, so all the stub needs to
-+ * do is move words from the array to the stack until ESP= the desired value
-+ * then do the rti. This will then transfer to the desired function with
-+ * all the correct registers. Nifty huh?
-+ */
-+extern asmlinkage void fn_call_stub(void);
-+extern asmlinkage void fn_rtn_stub(void);
-+/* *INDENT-OFF* */
-+__asm__("fn_rtn_stub:\n\t"
-+ "movl %eax,%esp\n\t"
-+ "fn_call_stub:\n\t"
-+ "1:\n\t"
-+ "addl $-4,%ebx\n\t"
-+ "movl (%ebx), %eax\n\t"
-+ "pushl %eax\n\t"
-+ "cmpl %esp,%ecx\n\t"
-+ "jne 1b\n\t"
-+ "popl %eax\n\t"
-+ "popl %ebx\n\t"
-+ "popl %ecx\n\t"
-+ "iret \n\t");
-+/* *INDENT-ON* */
-+#define gdb_i386vector kgdb_info.vector
-+#define gdb_i386errcode kgdb_info.errcode
-+#define waiting_cpus kgdb_info.cpus_waiting
-+#define remote_debug kgdb_info.print_debug_info
-+#define hold_cpu(cpu) kgdb_info.cpus_waiting[cpu].hold
-+/* gdb locks */
-+
-+#ifdef CONFIG_SMP
-+static int in_kgdb_called;
-+static spinlock_t waitlocks[MAX_NO_CPUS] =
-+ {[0 ... MAX_NO_CPUS - 1] = SPIN_LOCK_UNLOCKED };
-+/*
-+ * The following array has the thread pointer of each of the "other"
-+ * cpus. We make it global so it can be seen by gdb.
-+ */
-+volatile int in_kgdb_entry_log[MAX_NO_CPUS];
-+volatile struct pt_regs *in_kgdb_here_log[MAX_NO_CPUS];
-+/*
-+static spinlock_t continuelocks[MAX_NO_CPUS];
-+*/
-+spinlock_t kgdb_spinlock = SPIN_LOCK_UNLOCKED;
-+/* waiters on our spinlock plus us */
-+static atomic_t spinlock_waiters = ATOMIC_INIT(1);
-+static int spinlock_count = 0;
-+static int spinlock_cpu = 0;
-+/*
-+ * Note we use nested spin locks to account for the case where a break
-+ * point is encountered when calling a function by user direction from
-+ * kgdb. Also there is the memory exception recursion to account for.
-+ * Well, yes, but this lets other cpus thru too. Lets add a
-+ * cpu id to the lock.
-+ */
-+#define KGDB_SPIN_LOCK(x) if( spinlock_count == 0 || \
-+ spinlock_cpu != smp_processor_id()){\
-+ atomic_inc(&spinlock_waiters); \
-+ while (! spin_trylock(x)) {\
-+ in_kgdb(®s);\
-+ }\
-+ atomic_dec(&spinlock_waiters); \
-+ spinlock_count = 1; \
-+ spinlock_cpu = smp_processor_id(); \
-+ }else{ \
-+ spinlock_count++; \
-+ }
-+#define KGDB_SPIN_UNLOCK(x) if( --spinlock_count == 0) spin_unlock(x)
-+#else
-+unsigned kgdb_spinlock = 0;
-+#define KGDB_SPIN_LOCK(x) --*x
-+#define KGDB_SPIN_UNLOCK(x) ++*x
-+#endif
-+
-+int
-+hex(char ch)
-+{
-+ if ((ch >= 'a') && (ch <= 'f'))
-+ return (ch - 'a' + 10);
-+ if ((ch >= '0') && (ch <= '9'))
-+ return (ch - '0');
-+ if ((ch >= 'A') && (ch <= 'F'))
-+ return (ch - 'A' + 10);
-+ return (-1);
-+}
-+
-+/* scan for the sequence $<data>#<checksum> */
-+void
-+getpacket(char *buffer)
-+{
-+ unsigned char checksum;
-+ unsigned char xmitcsum;
-+ int i;
-+ int count;
-+ char ch;
-+
-+ do {
-+ /* wait around for the start character, ignore all other characters */
-+ while ((ch = (getDebugChar() & 0x7f)) != '$') ;
-+ checksum = 0;
-+ xmitcsum = -1;
-+
-+ count = 0;
-+
-+ /* now, read until a # or end of buffer is found */
-+ while (count < BUFMAX) {
-+ ch = getDebugChar() & 0x7f;
-+ if (ch == '#')
-+ break;
-+ checksum = checksum + ch;
-+ buffer[count] = ch;
-+ count = count + 1;
-+ }
-+ buffer[count] = 0;
-+
-+ if (ch == '#') {
-+ xmitcsum = hex(getDebugChar() & 0x7f) << 4;
-+ xmitcsum += hex(getDebugChar() & 0x7f);
-+ if ((remote_debug) && (checksum != xmitcsum)) {
-+ printk
-+ ("bad checksum. My count = 0x%x, sent=0x%x. buf=%s\n",
-+ checksum, xmitcsum, buffer);
-+ }
-+
-+ if (checksum != xmitcsum)
-+ putDebugChar('-'); /* failed checksum */
-+ else {
-+ putDebugChar('+'); /* successful transfer */
-+ /* if a sequence char is present, reply the sequence ID */
-+ if (buffer[2] == ':') {
-+ putDebugChar(buffer[0]);
-+ putDebugChar(buffer[1]);
-+ /* remove sequence chars from buffer */
-+ count = strlen(buffer);
-+ for (i = 3; i <= count; i++)
-+ buffer[i - 3] = buffer[i];
-+ }
-+ }
-+ }
-+ } while (checksum != xmitcsum);
-+
-+ if (remote_debug)
-+ printk("R:%s\n", buffer);
-+ flushDebugChar();
-+}
-+
-+/* send the packet in buffer. */
-+
-+void
-+putpacket(char *buffer)
-+{
-+ unsigned char checksum;
-+ int count;
-+ char ch;
-+
-+ /* $<packet info>#<checksum>. */
-+
-+ if (!kgdboe) {
-+ do {
-+ if (remote_debug)
-+ printk("T:%s\n", buffer);
-+ putDebugChar('$');
-+ checksum = 0;
-+ count = 0;
-+
-+ while ((ch = buffer[count])) {
-+ putDebugChar(ch);
-+ checksum += ch;
-+ count += 1;
-+ }
-+
-+ putDebugChar('#');
-+ putDebugChar(hexchars[checksum >> 4]);
-+ putDebugChar(hexchars[checksum % 16]);
-+ flushDebugChar();
-+
-+ } while ((getDebugChar() & 0x7f) != '+');
-+ } else {
-+ /*
-+ * For udp, we can not transfer too much bytes once.
-+ * We only transfer MAX_SEND_COUNT size bytes each time
-+ */
-+
-+#define MAX_SEND_COUNT 30
-+
-+ int send_count = 0, i = 0;
-+ char send_buf[MAX_SEND_COUNT];
-+
-+ do {
-+ if (remote_debug)
-+ printk("T:%s\n", buffer);
-+ putDebugChar('$');
-+ checksum = 0;
-+ count = 0;
-+ send_count = 0;
-+ while ((ch = buffer[count])) {
-+ if (send_count >= MAX_SEND_COUNT) {
-+ for(i = 0; i < MAX_SEND_COUNT; i++) {
-+ putDebugChar(send_buf[i]);
-+ }
-+ flushDebugChar();
-+ send_count = 0;
-+ } else {
-+ send_buf[send_count] = ch;
-+ checksum += ch;
-+ count ++;
-+ send_count++;
-+ }
-+ }
-+ for(i = 0; i < send_count; i++)
-+ putDebugChar(send_buf[i]);
-+ putDebugChar('#');
-+ putDebugChar(hexchars[checksum >> 4]);
-+ putDebugChar(hexchars[checksum % 16]);
-+ flushDebugChar();
-+ } while ((getDebugChar() & 0x7f) != '+');
-+ }
-+}
-+
-+static char remcomInBuffer[BUFMAX];
-+static char remcomOutBuffer[BUFMAX];
-+static short error;
-+
-+void
-+debug_error(char *format, char *parm)
-+{
-+ if (remote_debug)
-+ printk(format, parm);
-+}
-+
-+static void
-+print_regs(struct pt_regs *regs)
-+{
-+ printk("EAX=%08lx ", regs->eax);
-+ printk("EBX=%08lx ", regs->ebx);
-+ printk("ECX=%08lx ", regs->ecx);
-+ printk("EDX=%08lx ", regs->edx);
-+ printk("\n");
-+ printk("ESI=%08lx ", regs->esi);
-+ printk("EDI=%08lx ", regs->edi);
-+ printk("EBP=%08lx ", regs->ebp);
-+ printk("ESP=%08lx ", (long) ®s->esp);
-+ printk("\n");
-+ printk(" DS=%08x ", regs->xds);
-+ printk(" ES=%08x ", regs->xes);
-+ printk(" SS=%08x ", __KERNEL_DS);
-+ printk(" FL=%08lx ", regs->eflags);
-+ printk("\n");
-+ printk(" CS=%08x ", regs->xcs);
-+ printk(" IP=%08lx ", regs->eip);
-+#if 0
-+ printk(" FS=%08x ", regs->fs);
-+ printk(" GS=%08x ", regs->gs);
-+#endif
-+ printk("\n");
-+
-+} /* print_regs */
-+
-+#define NEW_esp fn_call_lookaside[trap_cpu].esp
-+
-+static void
-+regs_to_gdb_regs(int *gdb_regs, struct pt_regs *regs)
-+{
-+ gdb_regs[_EAX] = regs->eax;
-+ gdb_regs[_EBX] = regs->ebx;
-+ gdb_regs[_ECX] = regs->ecx;
-+ gdb_regs[_EDX] = regs->edx;
-+ gdb_regs[_ESI] = regs->esi;
-+ gdb_regs[_EDI] = regs->edi;
-+ gdb_regs[_EBP] = regs->ebp;
-+ gdb_regs[_DS] = regs->xds;
-+ gdb_regs[_ES] = regs->xes;
-+ gdb_regs[_PS] = regs->eflags;
-+ gdb_regs[_CS] = regs->xcs;
-+ gdb_regs[_PC] = regs->eip;
-+ /* Note, as we are a debugging the kernel, we will always
-+ * trap in kernel code, this means no priviledge change,
-+ * and so the pt_regs structure is not completely valid. In a non
-+ * privilege change trap, only EFLAGS, CS and EIP are put on the stack,
-+ * SS and ESP are not stacked, this means that the last 2 elements of
-+ * pt_regs is not valid (they would normally refer to the user stack)
-+ * also, using regs+1 is no good because you end up will a value that is
-+ * 2 longs (8) too high. This used to cause stepping over functions
-+ * to fail, so my fix is to use the address of regs->esp, which
-+ * should point at the end of the stack frame. Note I have ignored
-+ * completely exceptions that cause an error code to be stacked, such
-+ * as double fault. Stuart Hughes, Zentropix.
-+ * original code: gdb_regs[_ESP] = (int) (regs + 1) ;
-+
-+ * this is now done on entry and moved to OLD_esp (as well as NEW_esp).
-+ */
-+ gdb_regs[_ESP] = NEW_esp;
-+ gdb_regs[_SS] = __KERNEL_DS;
-+ gdb_regs[_FS] = 0xFFFF;
-+ gdb_regs[_GS] = 0xFFFF;
-+} /* regs_to_gdb_regs */
-+
-+static void
-+gdb_regs_to_regs(int *gdb_regs, struct pt_regs *regs)
-+{
-+ regs->eax = gdb_regs[_EAX];
-+ regs->ebx = gdb_regs[_EBX];
-+ regs->ecx = gdb_regs[_ECX];
-+ regs->edx = gdb_regs[_EDX];
-+ regs->esi = gdb_regs[_ESI];
-+ regs->edi = gdb_regs[_EDI];
-+ regs->ebp = gdb_regs[_EBP];
-+ regs->xds = gdb_regs[_DS];
-+ regs->xes = gdb_regs[_ES];
-+ regs->eflags = gdb_regs[_PS];
-+ regs->xcs = gdb_regs[_CS];
-+ regs->eip = gdb_regs[_PC];
-+ NEW_esp = gdb_regs[_ESP]; /* keep the value */
-+#if 0 /* can't change these */
-+ regs->esp = gdb_regs[_ESP];
-+ regs->xss = gdb_regs[_SS];
-+ regs->fs = gdb_regs[_FS];
-+ regs->gs = gdb_regs[_GS];
-+#endif
-+
-+} /* gdb_regs_to_regs */
-+extern void scheduling_functions_start_here(void);
-+extern void scheduling_functions_end_here(void);
-+#define first_sched ((unsigned long) scheduling_functions_start_here)
-+#define last_sched ((unsigned long) scheduling_functions_end_here)
-+
-+int thread_list = 0;
-+
-+void
-+get_gdb_regs(struct task_struct *p, struct pt_regs *regs, int *gdb_regs)
-+{
-+ unsigned long stack_page;
-+ int count = 0;
-+ IF_SMP(int i);
-+ if (!p || p == current) {
-+ regs_to_gdb_regs(gdb_regs, regs);
-+ return;
-+ }
-+#ifdef CONFIG_SMP
-+ for (i = 0; i < MAX_NO_CPUS; i++) {
-+ if (p == kgdb_info.cpus_waiting[i].task) {
-+ regs_to_gdb_regs(gdb_regs,
-+ kgdb_info.cpus_waiting[i].regs);
-+ gdb_regs[_ESP] =
-+ (int) &kgdb_info.cpus_waiting[i].regs->esp;
-+
-+ return;
-+ }
-+ }
-+#endif
-+ memset(gdb_regs, 0, NUMREGBYTES);
-+ gdb_regs[_ESP] = p->thread.esp;
-+ gdb_regs[_PC] = p->thread.eip;
-+ gdb_regs[_EBP] = *(int *) gdb_regs[_ESP];
-+ gdb_regs[_EDI] = *(int *) (gdb_regs[_ESP] + 4);
-+ gdb_regs[_ESI] = *(int *) (gdb_regs[_ESP] + 8);
-+
-+/*
-+ * This code is to give a more informative notion of where a process
-+ * is waiting. It is used only when the user asks for a thread info
-+ * list. If he then switches to the thread, s/he will find the task
-+ * is in schedule, but a back trace should show the same info we come
-+ * up with. This code was shamelessly purloined from process.c. It was
-+ * then enhanced to provide more registers than simply the program
-+ * counter.
-+ */
-+
-+ if (!thread_list) {
-+ return;
-+ }
-+
-+ if (p->state == TASK_RUNNING)
-+ return;
-+ stack_page = (unsigned long) p->thread_info;
-+ if (gdb_regs[_ESP] < stack_page || gdb_regs[_ESP] > 8188 + stack_page)
-+ return;
-+ /* include/asm-i386/system.h:switch_to() pushes ebp last. */
-+ do {
-+ if (gdb_regs[_EBP] < stack_page ||
-+ gdb_regs[_EBP] > 8184 + stack_page)
-+ return;
-+ gdb_regs[_PC] = *(unsigned long *) (gdb_regs[_EBP] + 4);
-+ gdb_regs[_ESP] = gdb_regs[_EBP] + 8;
-+ gdb_regs[_EBP] = *(unsigned long *) gdb_regs[_EBP];
-+ if (gdb_regs[_PC] < first_sched || gdb_regs[_PC] >= last_sched)
-+ return;
-+ } while (count++ < 16);
-+ return;
-+}
-+
-+/* Indicate to caller of mem2hex or hex2mem that there has been an
-+ error. */
-+static volatile int mem_err = 0;
-+static volatile int mem_err_expected = 0;
-+static volatile int mem_err_cnt = 0;
-+static int garbage_loc = -1;
-+
-+int
-+get_char(char *addr)
-+{
-+ return *addr;
-+}
-+
-+void
-+set_char(char *addr, int val, int may_fault)
-+{
-+ /*
-+ * This code traps references to the area mapped to the kernel
-+ * stack as given by the regs and, instead, stores to the
-+ * fn_call_lookaside[cpu].array
-+ */
-+ if (may_fault &&
-+ (unsigned int) addr < OLD_esp &&
-+ ((unsigned int) addr > (OLD_esp - (unsigned int) LOOKASIDE_SIZE))) {
-+ addr = (char *) END_OF_LOOKASIDE - ((char *) OLD_esp - addr);
-+ }
-+ *addr = val;
-+}
-+
-+/* convert the memory pointed to by mem into hex, placing result in buf */
-+/* return a pointer to the last char put in buf (null) */
-+/* If MAY_FAULT is non-zero, then we should set mem_err in response to
-+ a fault; if zero treat a fault like any other fault in the stub. */
-+char *
-+mem2hex(char *mem, char *buf, int count, int may_fault)
-+{
-+ int i;
-+ unsigned char ch;
-+
-+ if (may_fault) {
-+ mem_err_expected = 1;
-+ mem_err = 0;
-+ }
-+ for (i = 0; i < count; i++) {
-+ /* printk("%lx = ", mem) ; */
-+
-+ ch = get_char(mem++);
-+
-+ /* printk("%02x\n", ch & 0xFF) ; */
-+ if (may_fault && mem_err) {
-+ if (remote_debug)
-+ printk("Mem fault fetching from addr %lx\n",
-+ (long) (mem - 1));
-+ *buf = 0; /* truncate buffer */
-+ return (buf);
-+ }
-+ *buf++ = hexchars[ch >> 4];
-+ *buf++ = hexchars[ch % 16];
-+ }
-+ *buf = 0;
-+ if (may_fault)
-+ mem_err_expected = 0;
-+ return (buf);
-+}
-+
-+/* convert the hex array pointed to by buf into binary to be placed in mem */
-+/* return a pointer to the character AFTER the last byte written */
-+/* NOTE: We use the may fault flag to also indicate if the write is to
-+ * the registers (0) or "other" memory (!=0)
-+ */
-+char *
-+hex2mem(char *buf, char *mem, int count, int may_fault)
-+{
-+ int i;
-+ unsigned char ch;
-+
-+ if (may_fault) {
-+ mem_err_expected = 1;
-+ mem_err = 0;
-+ }
-+ for (i = 0; i < count; i++) {
-+ ch = hex(*buf++) << 4;
-+ ch = ch + hex(*buf++);
-+ set_char(mem++, ch, may_fault);
-+
-+ if (may_fault && mem_err) {
-+ if (remote_debug)
-+ printk("Mem fault storing to addr %lx\n",
-+ (long) (mem - 1));
-+ return (mem);
-+ }
-+ }
-+ if (may_fault)
-+ mem_err_expected = 0;
-+ return (mem);
-+}
-+
-+/**********************************************/
-+/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
-+/* RETURN NUMBER OF CHARS PROCESSED */
-+/**********************************************/
-+int
-+hexToInt(char **ptr, int *intValue)
-+{
-+ int numChars = 0;
-+ int hexValue;
-+
-+ *intValue = 0;
-+
-+ while (**ptr) {
-+ hexValue = hex(**ptr);
-+ if (hexValue >= 0) {
-+ *intValue = (*intValue << 4) | hexValue;
-+ numChars++;
-+ } else
-+ break;
-+
-+ (*ptr)++;
-+ }
-+
-+ return (numChars);
-+}
-+
-+#define stubhex(h) hex(h)
-+#ifdef old_thread_list
-+
-+static int
-+stub_unpack_int(char *buff, int fieldlength)
-+{
-+ int nibble;
-+ int retval = 0;
-+
-+ while (fieldlength) {
-+ nibble = stubhex(*buff++);
-+ retval |= nibble;
-+ fieldlength--;
-+ if (fieldlength)
-+ retval = retval << 4;
-+ }
-+ return retval;
-+}
-+#endif
-+static char *
-+pack_hex_byte(char *pkt, int byte)
-+{
-+ *pkt++ = hexchars[(byte >> 4) & 0xf];
-+ *pkt++ = hexchars[(byte & 0xf)];
-+ return pkt;
-+}
-+
-+#define BUF_THREAD_ID_SIZE 16
-+
-+static char *
-+pack_threadid(char *pkt, threadref * id)
-+{
-+ char *limit;
-+ unsigned char *altid;
-+
-+ altid = (unsigned char *) id;
-+ limit = pkt + BUF_THREAD_ID_SIZE;
-+ while (pkt < limit)
-+ pkt = pack_hex_byte(pkt, *altid++);
-+ return pkt;
-+}
-+
-+#ifdef old_thread_list
-+static char *
-+unpack_byte(char *buf, int *value)
-+{
-+ *value = stub_unpack_int(buf, 2);
-+ return buf + 2;
-+}
-+
-+static char *
-+unpack_threadid(char *inbuf, threadref * id)
-+{
-+ char *altref;
-+ char *limit = inbuf + BUF_THREAD_ID_SIZE;
-+ int x, y;
-+
-+ altref = (char *) id;
-+
-+ while (inbuf < limit) {
-+ x = stubhex(*inbuf++);
-+ y = stubhex(*inbuf++);
-+ *altref++ = (x << 4) | y;
-+ }
-+ return inbuf;
-+}
-+#endif
-+void
-+int_to_threadref(threadref * id, int value)
-+{
-+ unsigned char *scan;
-+
-+ scan = (unsigned char *) id;
-+ {
-+ int i = 4;
-+ while (i--)
-+ *scan++ = 0;
-+ }
-+ *scan++ = (value >> 24) & 0xff;
-+ *scan++ = (value >> 16) & 0xff;
-+ *scan++ = (value >> 8) & 0xff;
-+ *scan++ = (value & 0xff);
-+}
-+int
-+int_to_hex_v(unsigned char * id, int value)
-+{
-+ unsigned char *start = id;
-+ int shift;
-+ int ch;
-+
-+ for (shift = 28; shift >= 0; shift -= 4) {
-+ if ((ch = (value >> shift) & 0xf) || (id != start)) {
-+ *id = hexchars[ch];
-+ id++;
-+ }
-+ }
-+ if (id == start)
-+ *id++ = '0';
-+ return id - start;
-+}
-+#ifdef old_thread_list
-+
-+static int
-+threadref_to_int(threadref * ref)
-+{
-+ int i, value = 0;
-+ unsigned char *scan;
-+
-+ scan = (char *) ref;
-+ scan += 4;
-+ i = 4;
-+ while (i-- > 0)
-+ value = (value << 8) | ((*scan++) & 0xff);
-+ return value;
-+}
-+#endif
-+static int
-+cmp_str(char *s1, char *s2, int count)
-+{
-+ while (count--) {
-+ if (*s1++ != *s2++)
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+#if 1 /* this is a hold over from 2.4 where O(1) was "sometimes" */
-+extern struct task_struct *kgdb_get_idle(int cpu);
-+#define idle_task(cpu) kgdb_get_idle(cpu)
-+#else
-+#define idle_task(cpu) init_tasks[cpu]
-+#endif
-+
-+extern int kgdb_pid_init_done;
-+
-+struct task_struct *
-+getthread(int pid)
-+{
-+ struct task_struct *thread;
-+ if (pid >= PID_MAX && pid <= (PID_MAX + MAX_NO_CPUS)) {
-+
-+ return idle_task(pid - PID_MAX);
-+ } else {
-+ /*
-+ * find_task_by_pid is relatively safe all the time
-+ * Other pid functions require lock downs which imply
-+ * that we may be interrupting them (as we get here
-+ * in the middle of most any lock down).
-+ * Still we don't want to call until the table exists!
-+ */
-+ if (kgdb_pid_init_done){
-+ thread = find_task_by_pid(pid);
-+ if (thread) {
-+ return thread;
-+ }
-+ }
-+ }
-+ return NULL;
-+}
-+/* *INDENT-OFF* */
-+struct hw_breakpoint {
-+ unsigned enabled;
-+ unsigned type;
-+ unsigned len;
-+ unsigned addr;
-+} breakinfo[4] = { {enabled:0},
-+ {enabled:0},
-+ {enabled:0},
-+ {enabled:0}};
-+/* *INDENT-ON* */
-+unsigned hw_breakpoint_status;
-+void
-+correct_hw_break(void)
-+{
-+ int breakno;
-+ int correctit;
-+ int breakbit;
-+ unsigned dr7;
-+
-+ asm volatile ("movl %%db7, %0\n":"=r" (dr7)
-+ :);
-+ /* *INDENT-OFF* */
-+ do {
-+ unsigned addr0, addr1, addr2, addr3;
-+ asm volatile ("movl %%db0, %0\n"
-+ "movl %%db1, %1\n"
-+ "movl %%db2, %2\n"
-+ "movl %%db3, %3\n"
-+ :"=r" (addr0), "=r"(addr1),
-+ "=r"(addr2), "=r"(addr3)
-+ :);
-+ } while (0);
-+ /* *INDENT-ON* */
-+ correctit = 0;
-+ for (breakno = 0; breakno < 3; breakno++) {
-+ breakbit = 2 << (breakno << 1);
-+ if (!(dr7 & breakbit) && breakinfo[breakno].enabled) {
-+ correctit = 1;
-+ dr7 |= breakbit;
-+ dr7 &= ~(0xf0000 << (breakno << 2));
-+ dr7 |= (((breakinfo[breakno].len << 2) |
-+ breakinfo[breakno].type) << 16) <<
-+ (breakno << 2);
-+ switch (breakno) {
-+ case 0:
-+ asm volatile ("movl %0, %%dr0\n"::"r"
-+ (breakinfo[breakno].addr));
-+ break;
-+
-+ case 1:
-+ asm volatile ("movl %0, %%dr1\n"::"r"
-+ (breakinfo[breakno].addr));
-+ break;
-+
-+ case 2:
-+ asm volatile ("movl %0, %%dr2\n"::"r"
-+ (breakinfo[breakno].addr));
-+ break;
-+
-+ case 3:
-+ asm volatile ("movl %0, %%dr3\n"::"r"
-+ (breakinfo[breakno].addr));
-+ break;
-+ }
-+ } else if ((dr7 & breakbit) && !breakinfo[breakno].enabled) {
-+ correctit = 1;
-+ dr7 &= ~breakbit;
-+ dr7 &= ~(0xf0000 << (breakno << 2));
-+ }
-+ }
-+ if (correctit) {
-+ asm volatile ("movl %0, %%db7\n"::"r" (dr7));
-+ }
-+}
-+
-+int
-+remove_hw_break(unsigned breakno)
-+{
-+ if (!breakinfo[breakno].enabled) {
-+ return -1;
-+ }
-+ breakinfo[breakno].enabled = 0;
-+ return 0;
-+}
-+
-+int
-+set_hw_break(unsigned breakno, unsigned type, unsigned len, unsigned addr)
-+{
-+ if (breakinfo[breakno].enabled) {
-+ return -1;
-+ }
-+ breakinfo[breakno].enabled = 1;
-+ breakinfo[breakno].type = type;
-+ breakinfo[breakno].len = len;
-+ breakinfo[breakno].addr = addr;
-+ return 0;
-+}
-+
-+#ifdef CONFIG_SMP
-+static int in_kgdb_console = 0;
-+
-+int
-+in_kgdb(struct pt_regs *regs)
-+{
-+ unsigned flags;
-+ int cpu = smp_processor_id();
-+ in_kgdb_called = 1;
-+ if (!spin_is_locked(&kgdb_spinlock)) {
-+ if (in_kgdb_here_log[cpu] || /* we are holding this cpu */
-+ in_kgdb_console) { /* or we are doing slow i/o */
-+ return 1;
-+ }
-+ return 0;
-+ }
-+
-+ /* As I see it the only reason not to let all cpus spin on
-+ * the same spin_lock is to allow selected ones to proceed.
-+ * This would be a good thing, so we leave it this way.
-+ * Maybe someday.... Done !
-+
-+ * in_kgdb() is called from an NMI so we don't pretend
-+ * to have any resources, like printk() for example.
-+ */
-+
-+ kgdb_local_irq_save(flags); /* only local here, to avoid hanging */
-+ /*
-+ * log arival of this cpu
-+ * The NMI keeps on ticking. Protect against recurring more
-+ * than once, and ignor the cpu that has the kgdb lock
-+ */
-+ in_kgdb_entry_log[cpu]++;
-+ in_kgdb_here_log[cpu] = regs;
-+ if (cpu == spinlock_cpu || waiting_cpus[cpu].task)
-+ goto exit_in_kgdb;
-+
-+ /*
-+ * For protection of the initilization of the spin locks by kgdb
-+ * it locks the kgdb spinlock before it gets the wait locks set
-+ * up. We wait here for the wait lock to be taken. If the
-+ * kgdb lock goes away first?? Well, it could be a slow exit
-+ * sequence where the wait lock is removed prior to the kgdb lock
-+ * so if kgdb gets unlocked, we just exit.
-+ */
-+
-+ while (spin_is_locked(&kgdb_spinlock) &&
-+ !spin_is_locked(waitlocks + cpu)) ;
-+ if (!spin_is_locked(&kgdb_spinlock))
-+ goto exit_in_kgdb;
-+
-+ waiting_cpus[cpu].task = current;
-+ waiting_cpus[cpu].pid = (current->pid) ? : (PID_MAX + cpu);
-+ waiting_cpus[cpu].regs = regs;
-+
-+ spin_unlock_wait(waitlocks + cpu);
-+
-+ /*
-+ * log departure of this cpu
-+ */
-+ waiting_cpus[cpu].task = 0;
-+ waiting_cpus[cpu].pid = 0;
-+ waiting_cpus[cpu].regs = 0;
-+ correct_hw_break();
-+ exit_in_kgdb:
-+ in_kgdb_here_log[cpu] = 0;
-+ kgdb_local_irq_restore(flags);
-+ return 1;
-+ /*
-+ spin_unlock(continuelocks + smp_processor_id());
-+ */
-+}
-+
-+void
-+smp__in_kgdb(struct pt_regs regs)
-+{
-+ ack_APIC_irq();
-+ in_kgdb(®s);
-+}
-+#else
-+int
-+in_kgdb(struct pt_regs *regs)
-+{
-+ return (kgdb_spinlock);
-+}
-+#endif
-+
-+void
-+printexceptioninfo(int exceptionNo, int errorcode, char *buffer)
-+{
-+ unsigned dr6;
-+ int i;
-+ switch (exceptionNo) {
-+ case 1: /* debug exception */
-+ break;
-+ case 3: /* breakpoint */
-+ sprintf(buffer, "Software breakpoint");
-+ return;
-+ default:
-+ sprintf(buffer, "Details not available");
-+ return;
-+ }
-+ asm volatile ("movl %%db6, %0\n":"=r" (dr6)
-+ :);
-+ if (dr6 & 0x4000) {
-+ sprintf(buffer, "Single step");
-+ return;
-+ }
-+ for (i = 0; i < 4; ++i) {
-+ if (dr6 & (1 << i)) {
-+ sprintf(buffer, "Hardware breakpoint %d", i);
-+ return;
-+ }
-+ }
-+ sprintf(buffer, "Unknown trap");
-+ return;
-+}
-+
-+/*
-+ * This function does all command procesing for interfacing to gdb.
-+ *
-+ * NOTE: The INT nn instruction leaves the state of the interrupt
-+ * enable flag UNCHANGED. That means that when this routine
-+ * is entered via a breakpoint (INT 3) instruction from code
-+ * that has interrupts enabled, then interrupts will STILL BE
-+ * enabled when this routine is entered. The first thing that
-+ * we do here is disable interrupts so as to prevent recursive
-+ * entries and bothersome serial interrupts while we are
-+ * trying to run the serial port in polled mode.
-+ *
-+ * For kernel version 2.1.xx the kgdb_cli() actually gets a spin lock so
-+ * it is always necessary to do a restore_flags before returning
-+ * so as to let go of that lock.
-+ */
-+int
-+kgdb_handle_exception(int exceptionVector,
-+ int signo, int err_code, struct pt_regs *linux_regs)
-+{
-+ struct task_struct *usethread = NULL;
-+ struct task_struct *thread_list_start = 0, *thread = NULL;
-+ int addr, length;
-+ int breakno, breaktype;
-+ char *ptr;
-+ int newPC;
-+ threadref thref;
-+ int threadid;
-+ int thread_min = PID_MAX + MAX_NO_CPUS;
-+#ifdef old_thread_list
-+ int maxthreads;
-+#endif
-+ int nothreads;
-+ unsigned long flags;
-+ int gdb_regs[NUMREGBYTES / 4];
-+ int dr6;
-+ IF_SMP(int entry_state = 0); /* 0, ok, 1, no nmi, 2 sync failed */
-+#define NO_NMI 1
-+#define NO_SYNC 2
-+#define regs (*linux_regs)
-+#define NUMREGS NUMREGBYTES/4
-+ /*
-+ * If the entry is not from the kernel then return to the Linux
-+ * trap handler and let it process the interrupt normally.
-+ */
-+ if ((linux_regs->eflags & VM_MASK) || (3 & linux_regs->xcs)) {
-+ printk("ignoring non-kernel exception\n");
-+ print_regs(®s);
-+ return (0);
-+ }
-+ /*
-+ * If we're using eth mode, set the 'mode' in the netdevice.
-+ */
-+
-+ if (kgdboe)
-+ netpoll_set_trap(1);
-+
-+ kgdb_local_irq_save(flags);
-+
-+ /* Get kgdb spinlock */
-+
-+ KGDB_SPIN_LOCK(&kgdb_spinlock);
-+ rdtscll(kgdb_info.entry_tsc);
-+ /*
-+ * We depend on this spinlock and the NMI watch dog to control the
-+ * other cpus. They will arrive at "in_kgdb()" as a result of the
-+ * NMI and will wait there for the following spin locks to be
-+ * released.
-+ */
-+#ifdef CONFIG_SMP
-+
-+#if 0
-+ if (cpu_callout_map & ~MAX_CPU_MASK) {
-+ printk("kgdb : too many cpus, possibly not mapped"
-+ " in contiguous space, change MAX_NO_CPUS"
-+ " in kgdb_stub and make new kernel.\n"
-+ " cpu_callout_map is %lx\n", cpu_callout_map);
-+ goto exit_just_unlock;
-+ }
-+#endif
-+ if (spinlock_count == 1) {
-+ int time, end_time, dum;
-+ int i;
-+ int cpu_logged_in[MAX_NO_CPUS] = {[0 ... MAX_NO_CPUS - 1] = (0)
-+ };
-+ if (remote_debug) {
-+ printk("kgdb : cpu %d entry, syncing others\n",
-+ smp_processor_id());
-+ }
-+ for (i = 0; i < MAX_NO_CPUS; i++) {
-+ /*
-+ * Use trylock as we may already hold the lock if
-+ * we are holding the cpu. Net result is all
-+ * locked.
-+ */
-+ spin_trylock(&waitlocks[i]);
-+ }
-+ for (i = 0; i < MAX_NO_CPUS; i++)
-+ cpu_logged_in[i] = 0;
-+ /*
-+ * Wait for their arrival. We know the watch dog is active if
-+ * in_kgdb() has ever been called, as it is always called on a
-+ * watchdog tick.
-+ */
-+ rdtsc(dum, time);
-+ end_time = time + 2; /* Note: we use the High order bits! */
-+ i = 1;
-+ if (num_online_cpus() > 1) {
-+ int me_in_kgdb = in_kgdb_entry_log[smp_processor_id()];
-+ smp_send_nmi_allbutself();
-+
-+ while (i < num_online_cpus() && time != end_time) {
-+ int j;
-+ for (j = 0; j < MAX_NO_CPUS; j++) {
-+ if (waiting_cpus[j].task &&
-+ waiting_cpus[j].task != NOCPU &&
-+ !cpu_logged_in[j]) {
-+ i++;
-+ cpu_logged_in[j] = 1;
-+ if (remote_debug) {
-+ printk
-+ ("kgdb : cpu %d arrived at kgdb\n",
-+ j);
-+ }
-+ break;
-+ } else if (!waiting_cpus[j].task &&
-+ !cpu_online(j)) {
-+ waiting_cpus[j].task = NOCPU;
-+ cpu_logged_in[j] = 1;
-+ waiting_cpus[j].hold = 1;
-+ break;
-+ }
-+ if (!waiting_cpus[j].task &&
-+ in_kgdb_here_log[j]) {
-+
-+ int wait = 100000;
-+ while (wait--) ;
-+ if (!waiting_cpus[j].task &&
-+ in_kgdb_here_log[j]) {
-+ printk
-+ ("kgdb : cpu %d stall"
-+ " in in_kgdb\n",
-+ j);
-+ i++;
-+ cpu_logged_in[j] = 1;
-+ waiting_cpus[j].task =
-+ (struct task_struct
-+ *) 1;
-+ }
-+ }
-+ }
-+
-+ if (in_kgdb_entry_log[smp_processor_id()] >
-+ (me_in_kgdb + 10)) {
-+ break;
-+ }
-+
-+ rdtsc(dum, time);
-+ }
-+ if (i < num_online_cpus()) {
-+ printk
-+ ("kgdb : time out, proceeding without sync\n");
-+#if 0
-+ printk("kgdb : Waiting_cpus: 0 = %d, 1 = %d\n",
-+ waiting_cpus[0].task != 0,
-+ waiting_cpus[1].task != 0);
-+ printk("kgdb : Cpu_logged in: 0 = %d, 1 = %d\n",
-+ cpu_logged_in[0], cpu_logged_in[1]);
-+ printk
-+ ("kgdb : in_kgdb_here_log in: 0 = %d, 1 = %d\n",
-+ in_kgdb_here_log[0] != 0,
-+ in_kgdb_here_log[1] != 0);
-+#endif
-+ entry_state = NO_SYNC;
-+ } else {
-+#if 0
-+ int ent =
-+ in_kgdb_entry_log[smp_processor_id()] -
-+ me_in_kgdb;
-+ printk("kgdb : sync after %d entries\n", ent);
-+#endif
-+ }
-+ } else {
-+ if (remote_debug) {
-+ printk
-+ ("kgdb : %d cpus, but watchdog not active\n"
-+ "proceeding without locking down other cpus\n",
-+ num_online_cpus());
-+ entry_state = NO_NMI;
-+ }
-+ }
-+ }
-+#endif
-+
-+ if (remote_debug) {
-+ unsigned long *lp = (unsigned long *) &linux_regs;
-+
-+ printk("handle_exception(exceptionVector=%d, "
-+ "signo=%d, err_code=%d, linux_regs=%p)\n",
-+ exceptionVector, signo, err_code, linux_regs);
-+ if (debug_regs) {
-+ print_regs(®s);
-+ printk("Stk: %8lx %8lx %8lx %8lx"
-+ " %8lx %8lx %8lx %8lx\n",
-+ lp[0], lp[1], lp[2], lp[3],
-+ lp[4], lp[5], lp[6], lp[7]);
-+ printk(" %8lx %8lx %8lx %8lx"
-+ " %8lx %8lx %8lx %8lx\n",
-+ lp[8], lp[9], lp[10], lp[11],
-+ lp[12], lp[13], lp[14], lp[15]);
-+ printk(" %8lx %8lx %8lx %8lx "
-+ "%8lx %8lx %8lx %8lx\n",
-+ lp[16], lp[17], lp[18], lp[19],
-+ lp[20], lp[21], lp[22], lp[23]);
-+ printk(" %8lx %8lx %8lx %8lx "
-+ "%8lx %8lx %8lx %8lx\n",
-+ lp[24], lp[25], lp[26], lp[27],
-+ lp[28], lp[29], lp[30], lp[31]);
-+ }
-+ }
-+
-+ /* Disable hardware debugging while we are in kgdb */
-+ /* Get the debug register status register */
-+/* *INDENT-OFF* */
-+ __asm__("movl %0,%%db7"
-+ : /* no output */
-+ :"r"(0));
-+
-+ asm volatile ("movl %%db6, %0\n"
-+ :"=r" (hw_breakpoint_status)
-+ :);
-+
-+/* *INDENT-ON* */
-+ switch (exceptionVector) {
-+ case 0: /* divide error */
-+ case 1: /* debug exception */
-+ case 2: /* NMI */
-+ case 3: /* breakpoint */
-+ case 4: /* overflow */
-+ case 5: /* bounds check */
-+ case 6: /* invalid opcode */
-+ case 7: /* device not available */
-+ case 8: /* double fault (errcode) */
-+ case 10: /* invalid TSS (errcode) */
-+ case 12: /* stack fault (errcode) */
-+ case 16: /* floating point error */
-+ case 17: /* alignment check (errcode) */
-+ default: /* any undocumented */
-+ break;
-+ case 11: /* segment not present (errcode) */
-+ case 13: /* general protection (errcode) */
-+ case 14: /* page fault (special errcode) */
-+ case 19: /* cache flush denied */
-+ if (mem_err_expected) {
-+ /*
-+ * This fault occured because of the
-+ * get_char or set_char routines. These
-+ * two routines use either eax of edx to
-+ * indirectly reference the location in
-+ * memory that they are working with.
-+ * For a page fault, when we return the
-+ * instruction will be retried, so we
-+ * have to make sure that these
-+ * registers point to valid memory.
-+ */
-+ mem_err = 1; /* set mem error flag */
-+ mem_err_expected = 0;
-+ mem_err_cnt++; /* helps in debugging */
-+ /* make valid address */
-+ regs.eax = (long) &garbage_loc;
-+ /* make valid address */
-+ regs.edx = (long) &garbage_loc;
-+ if (remote_debug)
-+ printk("Return after memory error: "
-+ "mem_err_cnt=%d\n", mem_err_cnt);
-+ if (debug_regs)
-+ print_regs(®s);
-+ goto exit_kgdb;
-+ }
-+ break;
-+ }
-+ if (remote_debug)
-+ printk("kgdb : entered kgdb on cpu %d\n", smp_processor_id());
-+
-+ gdb_i386vector = exceptionVector;
-+ gdb_i386errcode = err_code;
-+ kgdb_info.called_from = __builtin_return_address(0);
-+#ifdef CONFIG_SMP
-+ /*
-+ * OK, we can now communicate, lets tell gdb about the sync.
-+ * but only if we had a problem.
-+ */
-+ switch (entry_state) {
-+ case NO_NMI:
-+ to_gdb("NMI not active, other cpus not stopped\n");
-+ break;
-+ case NO_SYNC:
-+ to_gdb("Some cpus not stopped, see 'kgdb_info' for details\n");
-+ default:;
-+ }
-+
-+#endif
-+/*
-+ * Set up the gdb function call area.
-+ */
-+ trap_cpu = smp_processor_id();
-+ OLD_esp = NEW_esp = (int) (&linux_regs->esp);
-+
-+ IF_SMP(once_again:)
-+ /* reply to host that an exception has occurred */
-+ remcomOutBuffer[0] = 'S';
-+ remcomOutBuffer[1] = hexchars[signo >> 4];
-+ remcomOutBuffer[2] = hexchars[signo % 16];
-+ remcomOutBuffer[3] = 0;
-+
-+ putpacket(remcomOutBuffer);
-+
-+ while (1 == 1) {
-+ error = 0;
-+ remcomOutBuffer[0] = 0;
-+ getpacket(remcomInBuffer);
-+ switch (remcomInBuffer[0]) {
-+ case '?':
-+ remcomOutBuffer[0] = 'S';
-+ remcomOutBuffer[1] = hexchars[signo >> 4];
-+ remcomOutBuffer[2] = hexchars[signo % 16];
-+ remcomOutBuffer[3] = 0;
-+ break;
-+ case 'd':
-+ remote_debug = !(remote_debug); /* toggle debug flag */
-+ printk("Remote debug %s\n",
-+ remote_debug ? "on" : "off");
-+ break;
-+ case 'g': /* return the value of the CPU registers */
-+ get_gdb_regs(usethread, ®s, gdb_regs);
-+ mem2hex((char *) gdb_regs,
-+ remcomOutBuffer, NUMREGBYTES, 0);
-+ break;
-+ case 'G': /* set the value of the CPU registers - return OK */
-+ hex2mem(&remcomInBuffer[1],
-+ (char *) gdb_regs, NUMREGBYTES, 0);
-+ if (!usethread || usethread == current) {
-+ gdb_regs_to_regs(gdb_regs, ®s);
-+ strcpy(remcomOutBuffer, "OK");
-+ } else {
-+ strcpy(remcomOutBuffer, "E00");
-+ }
-+ break;
-+
-+ case 'P':{ /* set the value of a single CPU register -
-+ return OK */
-+ /*
-+ * For some reason, gdb wants to talk about psudo
-+ * registers (greater than 15). These may have
-+ * meaning for ptrace, but for us it is safe to
-+ * ignor them. We do this by dumping them into
-+ * _GS which we also ignor, but do have memory for.
-+ */
-+ int regno;
-+
-+ ptr = &remcomInBuffer[1];
-+ regs_to_gdb_regs(gdb_regs, ®s);
-+ if ((!usethread || usethread == current) &&
-+ hexToInt(&ptr, ®no) &&
-+ *ptr++ == '=' && (regno >= 0)) {
-+ regno =
-+ (regno >= NUMREGS ? _GS : regno);
-+ hex2mem(ptr, (char *) &gdb_regs[regno],
-+ 4, 0);
-+ gdb_regs_to_regs(gdb_regs, ®s);
-+ strcpy(remcomOutBuffer, "OK");
-+ break;
-+ }
-+ strcpy(remcomOutBuffer, "E01");
-+ break;
-+ }
-+
-+ /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
-+ case 'm':
-+ /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
-+ ptr = &remcomInBuffer[1];
-+ if (hexToInt(&ptr, &addr) &&
-+ (*(ptr++) == ',') && (hexToInt(&ptr, &length))) {
-+ ptr = 0;
-+ /*
-+ * hex doubles the byte count
-+ */
-+ if (length > (BUFMAX / 2))
-+ length = BUFMAX / 2;
-+ mem2hex((char *) addr,
-+ remcomOutBuffer, length, 1);
-+ if (mem_err) {
-+ strcpy(remcomOutBuffer, "E03");
-+ debug_error("memory fault\n", NULL);
-+ }
-+ }
-+
-+ if (ptr) {
-+ strcpy(remcomOutBuffer, "E01");
-+ debug_error
-+ ("malformed read memory command: %s\n",
-+ remcomInBuffer);
-+ }
-+ break;
-+
-+ /* MAA..AA,LLLL:
-+ Write LLLL bytes at address AA.AA return OK */
-+ case 'M':
-+ /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
-+ ptr = &remcomInBuffer[1];
-+ if (hexToInt(&ptr, &addr) &&
-+ (*(ptr++) == ',') &&
-+ (hexToInt(&ptr, &length)) && (*(ptr++) == ':')) {
-+ hex2mem(ptr, (char *) addr, length, 1);
-+
-+ if (mem_err) {
-+ strcpy(remcomOutBuffer, "E03");
-+ debug_error("memory fault\n", NULL);
-+ } else {
-+ strcpy(remcomOutBuffer, "OK");
-+ }
-+
-+ ptr = 0;
-+ }
-+ if (ptr) {
-+ strcpy(remcomOutBuffer, "E02");
-+ debug_error
-+ ("malformed write memory command: %s\n",
-+ remcomInBuffer);
-+ }
-+ break;
-+ case 'S':
-+ remcomInBuffer[0] = 's';
-+ case 'C':
-+ /* Csig;AA..AA where ;AA..AA is optional
-+ * continue with signal
-+ * Since signals are meaning less to us, delete that
-+ * part and then fall into the 'c' code.
-+ */
-+ ptr = &remcomInBuffer[1];
-+ length = 2;
-+ while (*ptr && *ptr != ';') {
-+ length++;
-+ ptr++;
-+ }
-+ if (*ptr) {
-+ do {
-+ ptr++;
-+ *(ptr - length++) = *ptr;
-+ } while (*ptr);
-+ } else {
-+ remcomInBuffer[1] = 0;
-+ }
-+
-+ /* cAA..AA Continue at address AA..AA(optional) */
-+ /* sAA..AA Step one instruction from AA..AA(optional) */
-+ /* D detach, reply OK and then continue */
-+ case 'c':
-+ case 's':
-+ case 'D':
-+
-+ /* try to read optional parameter,
-+ pc unchanged if no parm */
-+ ptr = &remcomInBuffer[1];
-+ if (hexToInt(&ptr, &addr)) {
-+ if (remote_debug)
-+ printk("Changing EIP to 0x%x\n", addr);
-+
-+ regs.eip = addr;
-+ }
-+
-+ newPC = regs.eip;
-+
-+ /* clear the trace bit */
-+ regs.eflags &= 0xfffffeff;
-+
-+ /* set the trace bit if we're stepping */
-+ if (remcomInBuffer[0] == 's')
-+ regs.eflags |= 0x100;
-+
-+ /* detach is a friendly version of continue. Note that
-+ debugging is still enabled (e.g hit control C)
-+ */
-+ if (remcomInBuffer[0] == 'D') {
-+ strcpy(remcomOutBuffer, "OK");
-+ putpacket(remcomOutBuffer);
-+ }
-+
-+ if (remote_debug) {
-+ printk("Resuming execution\n");
-+ print_regs(®s);
-+ }
-+ asm volatile ("movl %%db6, %0\n":"=r" (dr6)
-+ :);
-+ if (!(dr6 & 0x4000)) {
-+ for (breakno = 0; breakno < 4; ++breakno) {
-+ if (dr6 & (1 << breakno) &&
-+ (breakinfo[breakno].type == 0)) {
-+ /* Set restore flag */
-+ regs.eflags |= 0x10000;
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (kgdboe)
-+ netpoll_set_trap(0);
-+
-+ correct_hw_break();
-+ asm volatile ("movl %0, %%db6\n"::"r" (0));
-+ goto exit_kgdb;
-+
-+ /* kill the program */
-+ case 'k': /* do nothing */
-+ break;
-+
-+ /* query */
-+ case 'q':
-+ nothreads = 0;
-+ switch (remcomInBuffer[1]) {
-+ case 'f':
-+ threadid = 1;
-+ thread_list = 2;
-+ thread_list_start = (usethread ? : current);
-+ case 's':
-+ if (!cmp_str(&remcomInBuffer[2],
-+ "ThreadInfo", 10))
-+ break;
-+
-+ remcomOutBuffer[nothreads++] = 'm';
-+ for (; threadid < PID_MAX + MAX_NO_CPUS;
-+ threadid++) {
-+ thread = getthread(threadid);
-+ if (thread) {
-+ nothreads += int_to_hex_v(
-+ &remcomOutBuffer[
-+ nothreads],
-+ threadid);
-+ if (thread_min > threadid)
-+ thread_min = threadid;
-+ remcomOutBuffer[
-+ nothreads] = ',';
-+ nothreads++;
-+ if (nothreads > BUFMAX - 10)
-+ break;
-+ }
-+ }
-+ if (remcomOutBuffer[nothreads - 1] == 'm') {
-+ remcomOutBuffer[nothreads - 1] = 'l';
-+ } else {
-+ nothreads--;
-+ }
-+ remcomOutBuffer[nothreads] = 0;
-+ break;
-+
-+#ifdef old_thread_list /* Old thread info request */
-+ case 'L':
-+ /* List threads */
-+ thread_list = 2;
-+ thread_list_start = (usethread ? : current);
-+ unpack_byte(remcomInBuffer + 3, &maxthreads);
-+ unpack_threadid(remcomInBuffer + 5, &thref);
-+ do {
-+ int buf_thread_limit =
-+ (BUFMAX - 22) / BUF_THREAD_ID_SIZE;
-+ if (maxthreads > buf_thread_limit) {
-+ maxthreads = buf_thread_limit;
-+ }
-+ } while (0);
-+ remcomOutBuffer[0] = 'q';
-+ remcomOutBuffer[1] = 'M';
-+ remcomOutBuffer[4] = '0';
-+ pack_threadid(remcomOutBuffer + 5, &thref);
-+
-+ threadid = threadref_to_int(&thref);
-+ for (nothreads = 0;
-+ nothreads < maxthreads &&
-+ threadid < PID_MAX + MAX_NO_CPUS;
-+ threadid++) {
-+ thread = getthread(threadid);
-+ if (thread) {
-+ int_to_threadref(&thref,
-+ threadid);
-+ pack_threadid(remcomOutBuffer +
-+ 21 +
-+ nothreads * 16,
-+ &thref);
-+ nothreads++;
-+ if (thread_min > threadid)
-+ thread_min = threadid;
-+ }
-+ }
-+
-+ if (threadid == PID_MAX + MAX_NO_CPUS) {
-+ remcomOutBuffer[4] = '1';
-+ }
-+ pack_hex_byte(remcomOutBuffer + 2, nothreads);
-+ remcomOutBuffer[21 + nothreads * 16] = '\0';
-+ break;
-+#endif
-+ case 'C':
-+ /* Current thread id */
-+ remcomOutBuffer[0] = 'Q';
-+ remcomOutBuffer[1] = 'C';
-+ threadid = current->pid;
-+ if (!threadid) {
-+ /*
-+ * idle thread
-+ */
-+ for (threadid = PID_MAX;
-+ threadid < PID_MAX + MAX_NO_CPUS;
-+ threadid++) {
-+ if (current ==
-+ idle_task(threadid -
-+ PID_MAX))
-+ break;
-+ }
-+ }
-+ int_to_threadref(&thref, threadid);
-+ pack_threadid(remcomOutBuffer + 2, &thref);
-+ remcomOutBuffer[18] = '\0';
-+ break;
-+
-+ case 'E':
-+ /* Print exception info */
-+ printexceptioninfo(exceptionVector,
-+ err_code, remcomOutBuffer);
-+ break;
-+ case 'T':{
-+ char * nptr;
-+ /* Thread extra info */
-+ if (!cmp_str(&remcomInBuffer[2],
-+ "hreadExtraInfo,", 15)) {
-+ break;
-+ }
-+ ptr = &remcomInBuffer[17];
-+ hexToInt(&ptr, &threadid);
-+ thread = getthread(threadid);
-+ nptr = &thread->comm[0];
-+ length = 0;
-+ ptr = &remcomOutBuffer[0];
-+ do {
-+ length++;
-+ ptr = pack_hex_byte(ptr, *nptr++);
-+ } while (*nptr && length < 16);
-+ /*
-+ * would like that 16 to be the size of
-+ * task_struct.comm but don't know the
-+ * syntax..
-+ */
-+ *ptr = 0;
-+ }
-+ }
-+ break;
-+
-+ /* task related */
-+ case 'H':
-+ switch (remcomInBuffer[1]) {
-+ case 'g':
-+ ptr = &remcomInBuffer[2];
-+ hexToInt(&ptr, &threadid);
-+ thread = getthread(threadid);
-+ if (!thread) {
-+ remcomOutBuffer[0] = 'E';
-+ remcomOutBuffer[1] = '\0';
-+ break;
-+ }
-+ /*
-+ * Just in case I forget what this is all about,
-+ * the "thread info" command to gdb causes it
-+ * to ask for a thread list. It then switches
-+ * to each thread and asks for the registers.
-+ * For this (and only this) usage, we want to
-+ * fudge the registers of tasks not on the run
-+ * list (i.e. waiting) to show the routine that
-+ * called schedule. Also, gdb, is a minimalist
-+ * in that if the current thread is the last
-+ * it will not re-read the info when done.
-+ * This means that in this case we must show
-+ * the real registers. So here is how we do it:
-+ * Each entry we keep track of the min
-+ * thread in the list (the last that gdb will)
-+ * get info for. We also keep track of the
-+ * starting thread.
-+ * "thread_list" is cleared when switching back
-+ * to the min thread if it is was current, or
-+ * if it was not current, thread_list is set
-+ * to 1. When the switch to current comes,
-+ * if thread_list is 1, clear it, else do
-+ * nothing.
-+ */
-+ usethread = thread;
-+ if ((thread_list == 1) &&
-+ (thread == thread_list_start)) {
-+ thread_list = 0;
-+ }
-+ if (thread_list && (threadid == thread_min)) {
-+ if (thread == thread_list_start) {
-+ thread_list = 0;
-+ } else {
-+ thread_list = 1;
-+ }
-+ }
-+ /* follow through */
-+ case 'c':
-+ remcomOutBuffer[0] = 'O';
-+ remcomOutBuffer[1] = 'K';
-+ remcomOutBuffer[2] = '\0';
-+ break;
-+ }
-+ break;
-+
-+ /* Query thread status */
-+ case 'T':
-+ ptr = &remcomInBuffer[1];
-+ hexToInt(&ptr, &threadid);
-+ thread = getthread(threadid);
-+ if (thread) {
-+ remcomOutBuffer[0] = 'O';
-+ remcomOutBuffer[1] = 'K';
-+ remcomOutBuffer[2] = '\0';
-+ if (thread_min > threadid)
-+ thread_min = threadid;
-+ } else {
-+ remcomOutBuffer[0] = 'E';
-+ remcomOutBuffer[1] = '\0';
-+ }
-+ break;
-+
-+ case 'Y': /* set up a hardware breakpoint */
-+ ptr = &remcomInBuffer[1];
-+ hexToInt(&ptr, &breakno);
-+ ptr++;
-+ hexToInt(&ptr, &breaktype);
-+ ptr++;
-+ hexToInt(&ptr, &length);
-+ ptr++;
-+ hexToInt(&ptr, &addr);
-+ if (set_hw_break(breakno & 0x3,
-+ breaktype & 0x3,
-+ length & 0x3, addr) == 0) {
-+ strcpy(remcomOutBuffer, "OK");
-+ } else {
-+ strcpy(remcomOutBuffer, "ERROR");
-+ }
-+ break;
-+
-+ /* Remove hardware breakpoint */
-+ case 'y':
-+ ptr = &remcomInBuffer[1];
-+ hexToInt(&ptr, &breakno);
-+ if (remove_hw_break(breakno & 0x3) == 0) {
-+ strcpy(remcomOutBuffer, "OK");
-+ } else {
-+ strcpy(remcomOutBuffer, "ERROR");
-+ }
-+ break;
-+
-+ case 'r': /* reboot */
-+ strcpy(remcomOutBuffer, "OK");
-+ putpacket(remcomOutBuffer);
-+ /*to_gdb("Rebooting\n"); */
-+ /* triplefault no return from here */
-+ {
-+ static long no_idt[2];
-+ __asm__ __volatile__("lidt %0"::"m"(no_idt[0]));
-+ BREAKPOINT;
-+ }
-+
-+ } /* switch */
-+
-+ /* reply to the request */
-+ putpacket(remcomOutBuffer);
-+ } /* while(1==1) */
-+ /*
-+ * reached by goto only.
-+ */
-+ exit_kgdb:
-+ /*
-+ * Here is where we set up to trap a gdb function call. NEW_esp
-+ * will be changed if we are trying to do this. We handle both
-+ * adding and subtracting, thus allowing gdb to put grung on
-+ * the stack which it removes later.
-+ */
-+ if (NEW_esp != OLD_esp) {
-+ int *ptr = END_OF_LOOKASIDE;
-+ if (NEW_esp < OLD_esp)
-+ ptr -= (OLD_esp - NEW_esp) / sizeof (int);
-+ *--ptr = linux_regs->eflags;
-+ *--ptr = linux_regs->xcs;
-+ *--ptr = linux_regs->eip;
-+ *--ptr = linux_regs->ecx;
-+ *--ptr = linux_regs->ebx;
-+ *--ptr = linux_regs->eax;
-+ linux_regs->ecx = NEW_esp - (sizeof (int) * 6);
-+ linux_regs->ebx = (unsigned int) END_OF_LOOKASIDE;
-+ if (NEW_esp < OLD_esp) {
-+ linux_regs->eip = (unsigned int) fn_call_stub;
-+ } else {
-+ linux_regs->eip = (unsigned int) fn_rtn_stub;
-+ linux_regs->eax = NEW_esp;
-+ }
-+ linux_regs->eflags &= ~(IF_BIT | TF_BIT);
-+ }
-+#ifdef CONFIG_SMP
-+ /*
-+ * Release gdb wait locks
-+ * Sanity check time. Must have at least one cpu to run. Also single
-+ * step must not be done if the current cpu is on hold.
-+ */
-+ if (spinlock_count == 1) {
-+ int ss_hold = (regs.eflags & 0x100) && kgdb_info.hold_on_sstep;
-+ int cpu_avail = 0;
-+ int i;
-+
-+ for (i = 0; i < MAX_NO_CPUS; i++) {
-+ if (!cpu_online(i))
-+ break;
-+ if (!hold_cpu(i)) {
-+ cpu_avail = 1;
-+ }
-+ }
-+ /*
-+ * Early in the bring up there will be NO cpus on line...
-+ */
-+ if (!cpu_avail && !cpus_empty(cpu_online_map)) {
-+ to_gdb("No cpus unblocked, see 'kgdb_info.hold_cpu'\n");
-+ goto once_again;
-+ }
-+ if (hold_cpu(smp_processor_id()) && (regs.eflags & 0x100)) {
-+ to_gdb
-+ ("Current cpu must be unblocked to single step\n");
-+ goto once_again;
-+ }
-+ if (!(ss_hold)) {
-+ int i;
-+ for (i = 0; i < MAX_NO_CPUS; i++) {
-+ if (!hold_cpu(i)) {
-+ spin_unlock(&waitlocks[i]);
-+ }
-+ }
-+ } else {
-+ spin_unlock(&waitlocks[smp_processor_id()]);
-+ }
-+ /* Release kgdb spinlock */
-+ KGDB_SPIN_UNLOCK(&kgdb_spinlock);
-+ /*
-+ * If this cpu is on hold, this is where we
-+ * do it. Note, the NMI will pull us out of here,
-+ * but will return as the above lock is not held.
-+ * We will stay here till another cpu releases the lock for us.
-+ */
-+ spin_unlock_wait(waitlocks + smp_processor_id());
-+ kgdb_local_irq_restore(flags);
-+ return (0);
-+ }
-+#if 0
-+exit_just_unlock:
-+#endif
-+#endif
-+ /* Release kgdb spinlock */
-+ KGDB_SPIN_UNLOCK(&kgdb_spinlock);
-+ kgdb_local_irq_restore(flags);
-+ return (0);
-+}
-+
-+/* this function is used to set up exception handlers for tracing and
-+ * breakpoints.
-+ * This function is not needed as the above line does all that is needed.
-+ * We leave it for backward compatitability...
-+ */
-+void
-+set_debug_traps(void)
-+{
-+ /*
-+ * linux_debug_hook is defined in traps.c. We store a pointer
-+ * to our own exception handler into it.
-+
-+ * But really folks, every hear of labeled common, an old Fortran
-+ * concept. Lots of folks can reference it and it is define if
-+ * anyone does. Only one can initialize it at link time. We do
-+ * this with the hook. See the statement above. No need for any
-+ * executable code and it is ready as soon as the kernel is
-+ * loaded. Very desirable in kernel debugging.
-+
-+ linux_debug_hook = handle_exception ;
-+ */
-+
-+ /* In case GDB is started before us, ack any packets (presumably
-+ "$?#xx") sitting there.
-+ putDebugChar ('+');
-+
-+ initialized = 1;
-+ */
-+}
-+
-+/* This function will generate a breakpoint exception. It is used at the
-+ beginning of a program to sync up with a debugger and can be used
-+ otherwise as a quick means to stop program execution and "break" into
-+ the debugger. */
-+/* But really, just use the BREAKPOINT macro. We will handle the int stuff
-+ */
-+
-+#ifdef later
-+/*
-+ * possibly we should not go thru the traps.c code at all? Someday.
-+ */
-+void
-+do_kgdb_int3(struct pt_regs *regs, long error_code)
-+{
-+ kgdb_handle_exception(3, 5, error_code, regs);
-+ return;
-+}
-+#endif
-+#undef regs
-+#ifdef CONFIG_TRAP_BAD_SYSCALL_EXITS
-+asmlinkage void
-+bad_sys_call_exit(int stuff)
-+{
-+ struct pt_regs *regs = (struct pt_regs *) &stuff;
-+ printk("Sys call %d return with %x preempt_count\n",
-+ (int) regs->orig_eax, preempt_count());
-+}
-+#endif
-+#ifdef CONFIG_STACK_OVERFLOW_TEST
-+#include <asm/kgdb.h>
-+asmlinkage void
-+stack_overflow(void)
-+{
-+#ifdef BREAKPOINT
-+ BREAKPOINT;
-+#else
-+ printk("Kernel stack overflow, looping forever\n");
-+#endif
-+ while (1) {
-+ }
-+}
-+#endif
-+
-+#if defined(CONFIG_SMP) || defined(CONFIG_KGDB_CONSOLE)
-+char gdbconbuf[BUFMAX];
-+
-+static void
-+kgdb_gdb_message(const char *s, unsigned count)
-+{
-+ int i;
-+ int wcount;
-+ char *bufptr;
-+ /*
-+ * This takes care of NMI while spining out chars to gdb
-+ */
-+ IF_SMP(in_kgdb_console = 1);
-+ gdbconbuf[0] = 'O';
-+ bufptr = gdbconbuf + 1;
-+ while (count > 0) {
-+ if ((count << 1) > (BUFMAX - 2)) {
-+ wcount = (BUFMAX - 2) >> 1;
-+ } else {
-+ wcount = count;
-+ }
-+ count -= wcount;
-+ for (i = 0; i < wcount; i++) {
-+ bufptr = pack_hex_byte(bufptr, s[i]);
-+ }
-+ *bufptr = '\0';
-+ s += wcount;
-+
-+ putpacket(gdbconbuf);
-+
-+ }
-+ IF_SMP(in_kgdb_console = 0);
-+}
-+#endif
-+#ifdef CONFIG_SMP
-+static void
-+to_gdb(const char *s)
-+{
-+ int count = 0;
-+ while (s[count] && (count++ < BUFMAX)) ;
-+ kgdb_gdb_message(s, count);
-+}
-+#endif
-+#ifdef CONFIG_KGDB_CONSOLE
-+#include <linux/console.h>
-+#include <linux/init.h>
-+#include <linux/fs.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+void
-+kgdb_console_write(struct console *co, const char *s, unsigned count)
-+{
-+
-+ if (gdb_i386vector == -1) {
-+ /*
-+ * We have not yet talked to gdb. What to do...
-+ * lets break, on continue we can do the write.
-+ * But first tell him whats up. Uh, well no can do,
-+ * as this IS the console. Oh well...
-+ * We do need to wait or the messages will be lost.
-+ * Other option would be to tell the above code to
-+ * ignore this breakpoint and do an auto return,
-+ * but that might confuse gdb. Also this happens
-+ * early enough in boot up that we don't have the traps
-+ * set up yet, so...
-+ */
-+ breakpoint();
-+ }
-+ kgdb_gdb_message(s, count);
-+}
-+
-+/*
-+ * ------------------------------------------------------------
-+ * Serial KGDB driver
-+ * ------------------------------------------------------------
-+ */
-+
-+static struct console kgdbcons = {
-+ name:"kgdb",
-+ write:kgdb_console_write,
-+#ifdef CONFIG_KGDB_USER_CONSOLE
-+ device:kgdb_console_device,
-+#endif
-+ flags:CON_PRINTBUFFER | CON_ENABLED,
-+ index:-1,
-+};
-+
-+/*
-+ * The trick here is that this file gets linked before printk.o
-+ * That means we get to peer at the console info in the command
-+ * line before it does. If we are up, we register, otherwise,
-+ * do nothing. By returning 0, we allow printk to look also.
-+ */
-+static int kgdb_console_enabled;
-+
-+int __init
-+kgdb_console_init(char *str)
-+{
-+ if ((strncmp(str, "kgdb", 4) == 0) || (strncmp(str, "gdb", 3) == 0)) {
-+ register_console(&kgdbcons);
-+ kgdb_console_enabled = 1;
-+ }
-+ return 0; /* let others look at the string */
-+}
-+
-+__setup("console=", kgdb_console_init);
-+
-+#ifdef CONFIG_KGDB_USER_CONSOLE
-+static kdev_t kgdb_console_device(struct console *c);
-+/* This stuff sort of works, but it knocks out telnet devices
-+ * we are leaving it here in case we (or you) find time to figure it out
-+ * better..
-+ */
-+
-+/*
-+ * We need a real char device as well for when the console is opened for user
-+ * space activities.
-+ */
-+
-+static int
-+kgdb_consdev_open(struct inode *inode, struct file *file)
-+{
-+ return 0;
-+}
-+
-+static ssize_t
-+kgdb_consdev_write(struct file *file, const char *buf,
-+ size_t count, loff_t * ppos)
-+{
-+ int size, ret = 0;
-+ static char kbuf[128];
-+ static DECLARE_MUTEX(sem);
-+
-+ /* We are not reentrant... */
-+ if (down_interruptible(&sem))
-+ return -ERESTARTSYS;
-+
-+ while (count > 0) {
-+ /* need to copy the data from user space */
-+ size = count;
-+ if (size > sizeof (kbuf))
-+ size = sizeof (kbuf);
-+ if (copy_from_user(kbuf, buf, size)) {
-+ ret = -EFAULT;
-+ break;;
-+ }
-+ kgdb_console_write(&kgdbcons, kbuf, size);
-+ count -= size;
-+ ret += size;
-+ buf += size;
-+ }
-+
-+ up(&sem);
-+
-+ return ret;
-+}
-+
-+struct file_operations kgdb_consdev_fops = {
-+ open:kgdb_consdev_open,
-+ write:kgdb_consdev_write
-+};
-+static kdev_t
-+kgdb_console_device(struct console *c)
-+{
-+ return MKDEV(TTYAUX_MAJOR, 1);
-+}
-+
-+/*
-+ * This routine gets called from the serial stub in the i386/lib
-+ * This is so it is done late in bring up (just before the console open).
-+ */
-+void
-+kgdb_console_finit(void)
-+{
-+ if (kgdb_console_enabled) {
-+ char *cptr = cdevname(MKDEV(TTYAUX_MAJOR, 1));
-+ char *cp = cptr;
-+ while (*cptr && *cptr != '(')
-+ cptr++;
-+ *cptr = 0;
-+ unregister_chrdev(TTYAUX_MAJOR, cp);
-+ register_chrdev(TTYAUX_MAJOR, "kgdb", &kgdb_consdev_fops);
-+ }
-+}
-+#endif
-+#endif
-+#ifdef CONFIG_KGDB_TS
-+#include <asm/msr.h> /* time stamp code */
-+#include <asm/hardirq.h> /* in_interrupt */
-+#ifdef CONFIG_KGDB_TS_64
-+#define DATA_POINTS 64
-+#endif
-+#ifdef CONFIG_KGDB_TS_128
-+#define DATA_POINTS 128
-+#endif
-+#ifdef CONFIG_KGDB_TS_256
-+#define DATA_POINTS 256
-+#endif
-+#ifdef CONFIG_KGDB_TS_512
-+#define DATA_POINTS 512
-+#endif
-+#ifdef CONFIG_KGDB_TS_1024
-+#define DATA_POINTS 1024
-+#endif
-+#ifndef DATA_POINTS
-+#define DATA_POINTS 128 /* must be a power of two */
-+#endif
-+#define INDEX_MASK (DATA_POINTS - 1)
-+#if (INDEX_MASK & DATA_POINTS)
-+#error "CONFIG_KGDB_TS_COUNT must be a power of 2"
-+#endif
-+struct kgdb_and_then_struct {
-+#ifdef CONFIG_SMP
-+ int on_cpu;
-+#endif
-+ struct task_struct *task;
-+ long long at_time;
-+ int from_ln;
-+ char *in_src;
-+ void *from;
-+ int *with_shpf;
-+ int data0;
-+ int data1;
-+};
-+struct kgdb_and_then_struct2 {
-+#ifdef CONFIG_SMP
-+ int on_cpu;
-+#endif
-+ struct task_struct *task;
-+ long long at_time;
-+ int from_ln;
-+ char *in_src;
-+ void *from;
-+ int *with_shpf;
-+ struct task_struct *t1;
-+ struct task_struct *t2;
-+};
-+struct kgdb_and_then_struct kgdb_data[DATA_POINTS];
-+
-+struct kgdb_and_then_struct *kgdb_and_then = &kgdb_data[0];
-+int kgdb_and_then_count;
-+
-+void
-+kgdb_tstamp(int line, char *source, int data0, int data1)
-+{
-+ static spinlock_t ts_spin = SPIN_LOCK_UNLOCKED;
-+ int flags;
-+ kgdb_local_irq_save(flags);
-+ spin_lock(&ts_spin);
-+ rdtscll(kgdb_and_then->at_time);
-+#ifdef CONFIG_SMP
-+ kgdb_and_then->on_cpu = smp_processor_id();
-+#endif
-+ kgdb_and_then->task = current;
-+ kgdb_and_then->from_ln = line;
-+ kgdb_and_then->in_src = source;
-+ kgdb_and_then->from = __builtin_return_address(0);
-+ kgdb_and_then->with_shpf = (int *) (((flags & IF_BIT) >> 9) |
-+ (preempt_count() << 8));
-+ kgdb_and_then->data0 = data0;
-+ kgdb_and_then->data1 = data1;
-+ kgdb_and_then = &kgdb_data[++kgdb_and_then_count & INDEX_MASK];
-+ spin_unlock(&ts_spin);
-+ kgdb_local_irq_restore(flags);
-+#ifdef CONFIG_PREEMPT
-+
-+#endif
-+ return;
-+}
-+#endif
-+typedef int gdb_debug_hook(int exceptionVector,
-+ int signo, int err_code, struct pt_regs *linux_regs);
-+gdb_debug_hook *linux_debug_hook = &kgdb_handle_exception; /* histerical reasons... */
-+
-+static int kgdb_need_breakpoint[NR_CPUS];
-+
-+void kgdb_schedule_breakpoint(void)
-+{
-+ kgdb_need_breakpoint[smp_processor_id()] = 1;
-+}
-+
-+void kgdb_process_breakpoint(void)
-+{
-+ /*
-+ * Handle a breakpoint queued from inside network driver code
-+ * to avoid reentrancy issues
-+ */
-+ if (kgdb_need_breakpoint[smp_processor_id()]) {
-+ kgdb_need_breakpoint[smp_processor_id()] = 0;
-+ BREAKPOINT;
-+ }
-+}
-+
---- linux-2.6.0/arch/i386/kernel/ldt.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/ldt.c 2003-12-28 23:26:36.000000000 -0800
-@@ -2,7 +2,7 @@
- * linux/kernel/ldt.c
- *
- * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
-- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
-+ * Copyright (C) 1999, 2003 Ingo Molnar <mingo@redhat.com>
- */
-
- #include <linux/errno.h>
-@@ -18,6 +18,8 @@
- #include <asm/system.h>
- #include <asm/ldt.h>
- #include <asm/desc.h>
-+#include <linux/highmem.h>
-+#include <asm/atomic_kmap.h>
-
- #ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
- static void flush_ldt(void *null)
-@@ -29,34 +31,31 @@ static void flush_ldt(void *null)
-
- static int alloc_ldt(mm_context_t *pc, int mincount, int reload)
- {
-- void *oldldt;
-- void *newldt;
-- int oldsize;
-+ int oldsize, newsize, i;
-
- if (mincount <= pc->size)
- return 0;
-+ /*
-+ * LDT got larger - reallocate if necessary.
-+ */
- oldsize = pc->size;
- mincount = (mincount+511)&(~511);
-- if (mincount*LDT_ENTRY_SIZE > PAGE_SIZE)
-- newldt = vmalloc(mincount*LDT_ENTRY_SIZE);
-- else
-- newldt = kmalloc(mincount*LDT_ENTRY_SIZE, GFP_KERNEL);
--
-- if (!newldt)
-- return -ENOMEM;
--
-- if (oldsize)
-- memcpy(newldt, pc->ldt, oldsize*LDT_ENTRY_SIZE);
-- oldldt = pc->ldt;
-- memset(newldt+oldsize*LDT_ENTRY_SIZE, 0, (mincount-oldsize)*LDT_ENTRY_SIZE);
-- pc->ldt = newldt;
-- wmb();
-+ newsize = mincount*LDT_ENTRY_SIZE;
-+ for (i = 0; i < newsize; i += PAGE_SIZE) {
-+ int nr = i/PAGE_SIZE;
-+ BUG_ON(i >= 64*1024);
-+ if (!pc->ldt_pages[nr]) {
-+ pc->ldt_pages[nr] = alloc_page(GFP_HIGHUSER);
-+ if (!pc->ldt_pages[nr])
-+ return -ENOMEM;
-+ clear_highpage(pc->ldt_pages[nr]);
-+ }
-+ }
- pc->size = mincount;
-- wmb();
--
- if (reload) {
- #ifdef CONFIG_SMP
- cpumask_t mask;
-+
- preempt_disable();
- load_LDT(pc);
- mask = cpumask_of_cpu(smp_processor_id());
-@@ -67,21 +66,20 @@ static int alloc_ldt(mm_context_t *pc, i
- load_LDT(pc);
- #endif
- }
-- if (oldsize) {
-- if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
-- vfree(oldldt);
-- else
-- kfree(oldldt);
-- }
- return 0;
- }
-
- static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
- {
-- int err = alloc_ldt(new, old->size, 0);
-- if (err < 0)
-+ int i, err, size = old->size, nr_pages = (size*LDT_ENTRY_SIZE + PAGE_SIZE-1)/PAGE_SIZE;
-+
-+ err = alloc_ldt(new, size, 0);
-+ if (err < 0) {
-+ new->size = 0;
- return err;
-- memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
-+ }
-+ for (i = 0; i < nr_pages; i++)
-+ copy_user_highpage(new->ldt_pages[i], old->ldt_pages[i], 0);
- return 0;
- }
-
-@@ -96,6 +94,7 @@ int init_new_context(struct task_struct
-
- init_MUTEX(&mm->context.sem);
- mm->context.size = 0;
-+ memset(mm->context.ldt_pages, 0, sizeof(struct page *) * MAX_LDT_PAGES);
- old_mm = current->mm;
- if (old_mm && old_mm->context.size > 0) {
- down(&old_mm->context.sem);
-@@ -107,23 +106,21 @@ int init_new_context(struct task_struct
-
- /*
- * No need to lock the MM as we are the last user
-+ * Do not touch the ldt register, we are already
-+ * in the next thread.
- */
- void destroy_context(struct mm_struct *mm)
- {
-- if (mm->context.size) {
-- if (mm == current->active_mm)
-- clear_LDT();
-- if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
-- vfree(mm->context.ldt);
-- else
-- kfree(mm->context.ldt);
-- mm->context.size = 0;
-- }
-+ int i, nr_pages = (mm->context.size*LDT_ENTRY_SIZE + PAGE_SIZE-1) / PAGE_SIZE;
-+
-+ for (i = 0; i < nr_pages; i++)
-+ __free_page(mm->context.ldt_pages[i]);
-+ mm->context.size = 0;
- }
-
- static int read_ldt(void __user * ptr, unsigned long bytecount)
- {
-- int err;
-+ int err, i;
- unsigned long size;
- struct mm_struct * mm = current->mm;
-
-@@ -138,8 +135,25 @@ static int read_ldt(void __user * ptr, u
- size = bytecount;
-
- err = 0;
-- if (copy_to_user(ptr, mm->context.ldt, size))
-- err = -EFAULT;
-+ /*
-+ * This is necessary just in case we got here straight from a
-+ * context-switch where the ptes were set but no tlb flush
-+ * was done yet. We rather avoid doing a TLB flush in the
-+ * context-switch path and do it here instead.
-+ */
-+ __flush_tlb_global();
-+
-+ for (i = 0; i < size; i += PAGE_SIZE) {
-+ int nr = i / PAGE_SIZE, bytes;
-+ char *kaddr = kmap(mm->context.ldt_pages[nr]);
-+
-+ bytes = size - i;
-+ if (bytes > PAGE_SIZE)
-+ bytes = PAGE_SIZE;
-+ if (copy_to_user(ptr + i, kaddr, size - i))
-+ err = -EFAULT;
-+ kunmap(mm->context.ldt_pages[nr]);
-+ }
- up(&mm->context.sem);
- if (err < 0)
- return err;
-@@ -158,7 +172,7 @@ static int read_default_ldt(void __user
-
- err = 0;
- address = &default_ldt[0];
-- size = 5*sizeof(struct desc_struct);
-+ size = 5*LDT_ENTRY_SIZE;
- if (size > bytecount)
- size = bytecount;
-
-@@ -200,7 +214,15 @@ static int write_ldt(void __user * ptr,
- goto out_unlock;
- }
-
-- lp = (__u32 *) ((ldt_info.entry_number << 3) + (char *) mm->context.ldt);
-+ /*
-+ * No rescheduling allowed from this point to the install.
-+ *
-+ * We do a TLB flush for the same reason as in the read_ldt() path.
-+ */
-+ preempt_disable();
-+ __flush_tlb_global();
-+ lp = (__u32 *) ((ldt_info.entry_number << 3) +
-+ (char *) __kmap_atomic_vaddr(KM_LDT_PAGE0));
-
- /* Allow LDTs to be cleared by the user. */
- if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
-@@ -221,6 +243,7 @@ install:
- *lp = entry_1;
- *(lp+1) = entry_2;
- error = 0;
-+ preempt_enable();
-
- out_unlock:
- up(&mm->context.sem);
-@@ -248,3 +271,26 @@ asmlinkage int sys_modify_ldt(int func,
- }
- return ret;
- }
-+
-+/*
-+ * load one particular LDT into the current CPU
-+ */
-+void load_LDT_nolock(mm_context_t *pc, int cpu)
-+{
-+ struct page **pages = pc->ldt_pages;
-+ int count = pc->size;
-+ int nr_pages, i;
-+
-+ if (likely(!count)) {
-+ pages = &default_ldt_page;
-+ count = 5;
-+ }
-+ nr_pages = (count*LDT_ENTRY_SIZE + PAGE_SIZE-1) / PAGE_SIZE;
-+
-+ for (i = 0; i < nr_pages; i++) {
-+ __kunmap_atomic_type(KM_LDT_PAGE0 - i);
-+ __kmap_atomic(pages[i], KM_LDT_PAGE0 - i);
-+ }
-+ set_ldt_desc(cpu, (void *)__kmap_atomic_vaddr(KM_LDT_PAGE0), count);
-+ load_LDT_desc();
-+}
---- linux-2.6.0/arch/i386/kernel/Makefile 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/Makefile 2003-12-28 23:26:36.000000000 -0800
-@@ -7,13 +7,14 @@ extra-y := head.o init_task.o vmlinux.ld
- obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \
- ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \
- pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \
-- doublefault.o
-+ doublefault.o entry_trampoline.o
-
- obj-y += cpu/
- obj-y += timers/
- obj-$(CONFIG_ACPI_BOOT) += acpi/
- obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o
- obj-$(CONFIG_MCA) += mca.o
-+obj-$(CONFIG_KGDB) += kgdb_stub.o
- obj-$(CONFIG_X86_MSR) += msr.o
- obj-$(CONFIG_X86_CPUID) += cpuid.o
- obj-$(CONFIG_MICROCODE) += microcode.o
-@@ -24,12 +25,13 @@ obj-$(CONFIG_X86_MPPARSE) += mpparse.o
- obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
- obj-$(CONFIG_X86_IO_APIC) += io_apic.o
- obj-$(CONFIG_X86_NUMAQ) += numaq.o
--obj-$(CONFIG_X86_SUMMIT) += summit.o
-+obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o
- obj-$(CONFIG_EDD) += edd.o
- obj-$(CONFIG_MODULES) += module.o
- obj-y += sysenter.o vsyscall.o
- obj-$(CONFIG_ACPI_SRAT) += srat.o
- obj-$(CONFIG_HPET_TIMER) += time_hpet.o
-+obj-$(CONFIG_EFI) += efi.o efi_stub.o
-
- EXTRA_AFLAGS := -traditional
-
---- linux-2.6.0/arch/i386/kernel/mpparse.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/mpparse.c 2003-12-28 23:26:36.000000000 -0800
-@@ -668,7 +668,7 @@ void __init get_smp_config (void)
- * Read the physical hardware table. Anything here will
- * override the defaults.
- */
-- if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
-+ if (!smp_read_mpc((void *)phys_to_virt(mpf->mpf_physptr))) {
- smp_found_config = 0;
- printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
- printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
-@@ -962,7 +962,8 @@ void __init mp_override_legacy_irq (
- */
- for (i = 0; i < mp_irq_entries; i++) {
- if ((mp_irqs[i].mpc_dstapic == intsrc.mpc_dstapic)
-- && (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)) {
-+ && (mp_irqs[i].mpc_srcbusirq == intsrc.mpc_srcbusirq)
-+ && (mp_irqs[i].mpc_irqtype == intsrc.mpc_irqtype)) {
- mp_irqs[i] = intsrc;
- found = 1;
- break;
-@@ -1081,8 +1082,14 @@ found:
-
- ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;
-
-+ /*
-+ * MPS INTI flags:
-+ * trigger: 0=default, 1=edge, 3=level
-+ * polarity: 0=default, 1=high, 3=low
-+ * Per ACPI spec, default for SCI means level/low.
-+ */
- io_apic_set_pci_routing(ioapic, ioapic_pin, irq,
-- (flags.trigger >> 1) , (flags.polarity >> 1));
-+ (flags.trigger == 1 ? 0 : 1), (flags.polarity == 1 ? 0 : 1));
- }
-
- #ifdef CONFIG_ACPI_PCI
-@@ -1129,8 +1136,11 @@ void __init mp_parse_prt (void)
- continue;
- ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;
-
-- if (!ioapic && (irq < 16))
-- irq += 16;
-+ if (es7000_plat) {
-+ if (!ioapic && (irq < 16))
-+ irq += 16;
-+ }
-+
- /*
- * Avoid pin reprogramming. PRTs typically include entries
- * with redundant pin->irq mappings (but unique PCI devices);
-@@ -1147,21 +1157,29 @@ void __init mp_parse_prt (void)
- if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
- printk(KERN_DEBUG "Pin %d-%d already programmed\n",
- mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
-- entry->irq = irq;
-+ if (use_pci_vector() && !platform_legacy_irq(irq))
-+ irq = IO_APIC_VECTOR(irq);
-+ entry->irq = irq;
- continue;
- }
-
- mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
-
-- if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low))
-- entry->irq = irq;
--
-+ if (!io_apic_set_pci_routing(ioapic, ioapic_pin, irq, edge_level, active_high_low)) {
-+ if (use_pci_vector() && !platform_legacy_irq(irq))
-+ irq = IO_APIC_VECTOR(irq);
-+ entry->irq = irq;
-+ }
- printk(KERN_DEBUG "%02x:%02x:%02x[%c] -> %d-%d -> IRQ %d\n",
- entry->id.segment, entry->id.bus,
- entry->id.device, ('A' + entry->pin),
- mp_ioapic_routing[ioapic].apic_id, ioapic_pin,
- entry->irq);
- }
-+
-+ print_IO_APIC();
-+
-+ return;
- }
-
- #endif /*CONFIG_ACPI_PCI*/
---- linux-2.6.0/arch/i386/kernel/nmi.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/nmi.c 2003-12-28 23:21:06.000000000 -0800
-@@ -31,7 +31,16 @@
- #include <asm/mpspec.h>
- #include <asm/nmi.h>
-
-+#ifdef CONFIG_KGDB
-+#include <asm/kgdb.h>
-+#ifdef CONFIG_SMP
-+unsigned int nmi_watchdog = NMI_IO_APIC;
-+#else
-+unsigned int nmi_watchdog = NMI_LOCAL_APIC;
-+#endif
-+#else
- unsigned int nmi_watchdog = NMI_NONE;
-+#endif
- static unsigned int nmi_hz = HZ;
- unsigned int nmi_perfctr_msr; /* the MSR to reset in NMI handler */
- extern void show_registers(struct pt_regs *regs);
-@@ -408,6 +417,9 @@ void touch_nmi_watchdog (void)
- for (i = 0; i < NR_CPUS; i++)
- alert_counter[i] = 0;
- }
-+#ifdef CONFIG_KGDB
-+int tune_watchdog = 5*HZ;
-+#endif
-
- void nmi_watchdog_tick (struct pt_regs * regs)
- {
-@@ -421,12 +433,24 @@ void nmi_watchdog_tick (struct pt_regs *
-
- sum = irq_stat[cpu].apic_timer_irqs;
-
-+#ifdef CONFIG_KGDB
-+ if (! in_kgdb(regs) && last_irq_sums[cpu] == sum ) {
-+
-+#else
- if (last_irq_sums[cpu] == sum) {
-+#endif
- /*
- * Ayiee, looks like this CPU is stuck ...
- * wait a few IRQs (5 seconds) before doing the oops ...
- */
- alert_counter[cpu]++;
-+#ifdef CONFIG_KGDB
-+ if (alert_counter[cpu] == tune_watchdog) {
-+ kgdb_handle_exception(2, SIGPWR, 0, regs);
-+ last_irq_sums[cpu] = sum;
-+ alert_counter[cpu] = 0;
-+ }
-+#endif
- if (alert_counter[cpu] == 5*nmi_hz) {
- spin_lock(&nmi_print_lock);
- /*
---- linux-2.6.0/arch/i386/kernel/process.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/process.c 2003-12-28 23:26:36.000000000 -0800
-@@ -47,6 +47,7 @@
- #include <asm/i387.h>
- #include <asm/irq.h>
- #include <asm/desc.h>
-+#include <asm/atomic_kmap.h>
- #ifdef CONFIG_MATH_EMULATION
- #include <asm/math_emu.h>
- #endif
-@@ -302,6 +303,9 @@ void flush_thread(void)
- struct task_struct *tsk = current;
-
- memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ clear_thread_flag(TIF_DB7);
-+#endif
- memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));
- /*
- * Forget coprocessor state..
-@@ -315,9 +319,8 @@ void release_thread(struct task_struct *
- if (dead_task->mm) {
- // temporary debugging check
- if (dead_task->mm->context.size) {
-- printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
-+ printk("WARNING: dead process %8s still has LDT? <%d>\n",
- dead_task->comm,
-- dead_task->mm->context.ldt,
- dead_task->mm->context.size);
- BUG();
- }
-@@ -352,7 +355,17 @@ int copy_thread(int nr, unsigned long cl
- p->thread.esp = (unsigned long) childregs;
- p->thread.esp0 = (unsigned long) (childregs+1);
-
-+ /*
-+ * get the two stack pages, for the virtual stack.
-+ *
-+ * IMPORTANT: this code relies on the fact that the task
-+ * structure is an 8K aligned piece of physical memory.
-+ */
-+ p->thread.stack_page0 = virt_to_page((unsigned long)p->thread_info);
-+ p->thread.stack_page1 = virt_to_page((unsigned long)p->thread_info + PAGE_SIZE);
-+
- p->thread.eip = (unsigned long) ret_from_fork;
-+ p->thread_info->real_stack = p->thread_info;
-
- savesegment(fs,p->thread.fs);
- savesegment(gs,p->thread.gs);
-@@ -504,10 +517,41 @@ struct task_struct * __switch_to(struct
-
- __unlazy_fpu(prev_p);
-
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ /*
-+ * Set the ptes of the virtual stack. (NOTE: a one-page TLB flush is
-+ * needed because otherwise NMIs could interrupt the
-+ * user-return code with a virtual stack and stale TLBs.)
-+ */
-+ __kunmap_atomic_type(KM_VSTACK0);
-+ __kunmap_atomic_type(KM_VSTACK1);
-+ __kmap_atomic(next->stack_page0, KM_VSTACK0);
-+ __kmap_atomic(next->stack_page1, KM_VSTACK1);
-+
-+ /*
-+ * NOTE: here we rely on the task being the stack as well
-+ */
-+ next_p->thread_info->virtual_stack =
-+ (void *)__kmap_atomic_vaddr(KM_VSTACK0);
-+
-+#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
-+ /*
-+ * If next was preempted on entry from userspace to kernel,
-+ * and now it's on a different cpu, we need to adjust %esp.
-+ * This assumes that entry.S does not copy %esp while on the
-+ * virtual stack (with interrupts enabled): which is so,
-+ * except within __SWITCH_KERNELSPACE itself.
-+ */
-+ if (unlikely(next->esp >= TASK_SIZE)) {
-+ next->esp &= THREAD_SIZE - 1;
-+ next->esp |= (unsigned long) next_p->thread_info->virtual_stack;
-+ }
-+#endif
-+#endif
- /*
- * Reload esp0, LDT and the page table pointer:
- */
-- load_esp0(tss, next->esp0);
-+ load_virtual_esp0(tss, next_p);
-
- /*
- * Load the per-thread Thread-Local Storage descriptor.
---- linux-2.6.0/arch/i386/kernel/reboot.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/reboot.c 2003-12-28 23:26:36.000000000 -0800
-@@ -8,6 +8,7 @@
- #include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/mc146818rtc.h>
-+#include <linux/efi.h>
- #include <asm/uaccess.h>
- #include <asm/apic.h>
- #include "mach_reboot.h"
-@@ -154,12 +155,11 @@ void machine_real_restart(unsigned char
- CMOS_WRITE(0x00, 0x8f);
- spin_unlock_irqrestore(&rtc_lock, flags);
-
-- /* Remap the kernel at virtual address zero, as well as offset zero
-- from the kernel segment. This assumes the kernel segment starts at
-- virtual address PAGE_OFFSET. */
--
-- memcpy (swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
-- sizeof (swapper_pg_dir [0]) * KERNEL_PGD_PTRS);
-+ /*
-+ * Remap the first 16 MB of RAM (which includes the kernel image)
-+ * at virtual address zero:
-+ */
-+ setup_identity_mappings(swapper_pg_dir, 0, 16*1024*1024);
-
- /*
- * Use `swapper_pg_dir' as our page directory.
-@@ -263,7 +263,12 @@ void machine_restart(char * __unused)
- disable_IO_APIC();
- #endif
-
-- if(!reboot_thru_bios) {
-+ if (!reboot_thru_bios) {
-+ if (efi_enabled) {
-+ efi.reset_system(EFI_RESET_COLD, EFI_SUCCESS, 0, 0);
-+ __asm__ __volatile__("lidt %0": :"m" (no_idt));
-+ __asm__ __volatile__("int3");
-+ }
- /* rebooting needs to touch the page at absolute addr 0 */
- *((unsigned short *)__va(0x472)) = reboot_mode;
- for (;;) {
-@@ -273,6 +278,8 @@ void machine_restart(char * __unused)
- __asm__ __volatile__("int3");
- }
- }
-+ if (efi_enabled)
-+ efi.reset_system(EFI_RESET_WARM, EFI_SUCCESS, 0, 0);
-
- machine_real_restart(jump_to_bios, sizeof(jump_to_bios));
- }
-@@ -287,6 +294,8 @@ EXPORT_SYMBOL(machine_halt);
-
- void machine_power_off(void)
- {
-+ if (efi_enabled)
-+ efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, 0);
- if (pm_power_off)
- pm_power_off();
- }
---- linux-2.6.0/arch/i386/kernel/setup.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/setup.c 2003-12-28 23:21:45.000000000 -0800
-@@ -36,6 +36,8 @@
- #include <linux/root_dev.h>
- #include <linux/highmem.h>
- #include <linux/module.h>
-+#include <linux/efi.h>
-+#include <linux/init.h>
- #include <video/edid.h>
- #include <asm/e820.h>
- #include <asm/mpspec.h>
-@@ -56,6 +58,10 @@ static inline char * __init machine_spec
- * Machine setup..
- */
-
-+#ifdef CONFIG_EFI
-+int efi_enabled = 0;
-+#endif
-+
- /* cpu data as detected by the assembly code in head.S */
- struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
- /* common cpu data for all cpus */
-@@ -72,13 +78,10 @@ EXPORT_SYMBOL_GPL(mmu_cr4_features);
- EXPORT_SYMBOL(acpi_disabled);
-
- #ifdef CONFIG_ACPI_BOOT
-- int acpi_irq __initdata = 1; /* enable IRQ */
-- int acpi_ht __initdata = 1; /* enable HT */
-+extern int __initdata acpi_ht;
-+int __initdata acpi_force = 0;
- #endif
-
--int acpi_force __initdata = 0;
--
--
- int MCA_bus;
- /* for MCA, but anyone else can use it if they want */
- unsigned int machine_id;
-@@ -144,6 +147,20 @@ static void __init limit_regions(unsigne
- unsigned long long current_addr = 0;
- int i;
-
-+ if (efi_enabled) {
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ current_addr = memmap.map[i].phys_addr +
-+ (memmap.map[i].num_pages << 12);
-+ if (memmap.map[i].type == EFI_CONVENTIONAL_MEMORY) {
-+ if (current_addr >= size) {
-+ memmap.map[i].num_pages -=
-+ (((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT);
-+ memmap.nr_map = i + 1;
-+ return;
-+ }
-+ }
-+ }
-+ }
- for (i = 0; i < e820.nr_map; i++) {
- if (e820.map[i].type == E820_RAM) {
- current_addr = e820.map[i].addr + e820.map[i].size;
-@@ -159,17 +176,21 @@ static void __init limit_regions(unsigne
- static void __init add_memory_region(unsigned long long start,
- unsigned long long size, int type)
- {
-- int x = e820.nr_map;
-+ int x;
-
-- if (x == E820MAX) {
-- printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-- return;
-- }
-+ if (!efi_enabled) {
-+ x = e820.nr_map;
-+
-+ if (x == E820MAX) {
-+ printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-+ return;
-+ }
-
-- e820.map[x].addr = start;
-- e820.map[x].size = size;
-- e820.map[x].type = type;
-- e820.nr_map++;
-+ e820.map[x].addr = start;
-+ e820.map[x].size = size;
-+ e820.map[x].type = type;
-+ e820.nr_map++;
-+ }
- } /* add_memory_region */
-
- #define E820_DEBUG 1
-@@ -446,7 +467,6 @@ static inline void copy_edd(void)
- static void __init setup_memory_region(void)
- {
- char *who = machine_specific_memory_setup();
--
- printk(KERN_INFO "BIOS-provided physical RAM map:\n");
- print_memory_map(who);
- } /* setup_memory_region */
-@@ -550,7 +570,7 @@ static void __init parse_cmdline_early (
-
- /* "pci=noacpi" disables ACPI interrupt routing */
- else if (!memcmp(from, "pci=noacpi", 10)) {
-- acpi_irq = 0;
-+ acpi_noirq_set();
- }
-
- #ifdef CONFIG_X86_LOCAL_APIC
-@@ -584,6 +604,23 @@ static void __init parse_cmdline_early (
- }
-
- /*
-+ * Callback for efi_memory_walk.
-+ */
-+static int __init
-+efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
-+{
-+ unsigned long *max_pfn = arg, pfn;
-+
-+ if (start < end) {
-+ pfn = PFN_UP(end -1);
-+ if (pfn > *max_pfn)
-+ *max_pfn = pfn;
-+ }
-+ return 0;
-+}
-+
-+
-+/*
- * Find the highest page frame number we have available
- */
- void __init find_max_pfn(void)
-@@ -591,6 +628,11 @@ void __init find_max_pfn(void)
- int i;
-
- max_pfn = 0;
-+ if (efi_enabled) {
-+ efi_memmap_walk(efi_find_max_pfn, &max_pfn);
-+ return;
-+ }
-+
- for (i = 0; i < e820.nr_map; i++) {
- unsigned long start, end;
- /* RAM? */
-@@ -665,6 +707,25 @@ unsigned long __init find_max_low_pfn(vo
- }
-
- #ifndef CONFIG_DISCONTIGMEM
-+
-+/*
-+ * Free all available memory for boot time allocation. Used
-+ * as a callback function by efi_memory_walk()
-+ */
-+
-+static int __init
-+free_available_memory(unsigned long start, unsigned long end, void *arg)
-+{
-+ /* check max_low_pfn */
-+ if (start >= ((max_low_pfn + 1) << PAGE_SHIFT))
-+ return 0;
-+ if (end >= ((max_low_pfn + 1) << PAGE_SHIFT))
-+ end = (max_low_pfn + 1) << PAGE_SHIFT;
-+ if (start < end)
-+ free_bootmem(start, end - start);
-+
-+ return 0;
-+}
- /*
- * Register fully available low RAM pages with the bootmem allocator.
- */
-@@ -672,6 +733,10 @@ static void __init register_bootmem_low_
- {
- int i;
-
-+ if (efi_enabled) {
-+ efi_memmap_walk(free_available_memory, NULL);
-+ return;
-+ }
- for (i = 0; i < e820.nr_map; i++) {
- unsigned long curr_pfn, last_pfn, size;
- /*
-@@ -799,9 +864,9 @@ extern unsigned long setup_memory(void);
- * Request address space for all standard RAM and ROM resources
- * and also for regions reported as reserved by the e820.
- */
--static void __init register_memory(unsigned long max_low_pfn)
-+static void __init
-+legacy_init_iomem_resources(struct resource *code_resource, struct resource *data_resource)
- {
-- unsigned long low_mem_size;
- int i;
-
- probe_roms();
-@@ -826,11 +891,26 @@ static void __init register_memory(unsig
- * so we try it repeatedly and let the resource manager
- * test it.
- */
-- request_resource(res, &code_resource);
-- request_resource(res, &data_resource);
-+ request_resource(res, code_resource);
-+ request_resource(res, data_resource);
- }
- }
-+}
-+
-+/*
-+ * Request address space for all standard resources
-+ */
-+static void __init register_memory(unsigned long max_low_pfn)
-+{
-+ unsigned long low_mem_size;
-+ int i;
-+
-+ if (efi_enabled)
-+ efi_initialize_iomem_resources(&code_resource, &data_resource);
-+ else
-+ legacy_init_iomem_resources(&code_resource, &data_resource);
-
-+ /* EFI systems may still have VGA */
- request_graphics_resource();
-
- /* request I/O space for devices used on all i[345]86 PCs */
-@@ -950,6 +1030,13 @@ static int __init noreplacement_setup(ch
-
- __setup("noreplacement", noreplacement_setup);
-
-+/*
-+ * Determine if we were loaded by an EFI loader. If so, then we have also been
-+ * passed the efi memmap, systab, etc., so we should use these data structures
-+ * for initialization. Note, the efi init code path is determined by the
-+ * global efi_enabled. This allows the same kernel image to be used on existing
-+ * systems (with a traditional BIOS) as well as on EFI systems.
-+ */
- void __init setup_arch(char **cmdline_p)
- {
- unsigned long max_low_pfn;
-@@ -958,6 +1045,18 @@ void __init setup_arch(char **cmdline_p)
- pre_setup_arch_hook();
- early_cpu_init();
-
-+ /*
-+ * FIXME: This isn't an official loader_type right
-+ * now but does currently work with elilo.
-+ * If we were configured as an EFI kernel, check to make
-+ * sure that we were loaded correctly from elilo and that
-+ * the system table is valid. If not, then initialize normally.
-+ */
-+#ifdef CONFIG_EFI
-+ if ((LOADER_TYPE == 0x50) && EFI_SYSTAB)
-+ efi_enabled = 1;
-+#endif
-+
- ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
- drive_info = DRIVE_INFO;
- screen_info = SCREEN_INFO;
-@@ -979,7 +1078,11 @@ void __init setup_arch(char **cmdline_p)
- rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
- #endif
- ARCH_SETUP
-- setup_memory_region();
-+ if (efi_enabled)
-+ efi_init();
-+ else
-+ setup_memory_region();
-+
- copy_edd();
-
- if (!MOUNT_ROOT_RDONLY)
-@@ -1013,6 +1116,8 @@ void __init setup_arch(char **cmdline_p)
- #ifdef CONFIG_X86_GENERICARCH
- generic_apic_probe(*cmdline_p);
- #endif
-+ if (efi_enabled)
-+ efi_map_memmap();
-
- /*
- * Parse the ACPI tables for possible boot-time SMP configuration.
-@@ -1028,7 +1133,8 @@ void __init setup_arch(char **cmdline_p)
-
- #ifdef CONFIG_VT
- #if defined(CONFIG_VGA_CONSOLE)
-- conswitchp = &vga_con;
-+ if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
-+ conswitchp = &vga_con;
- #elif defined(CONFIG_DUMMY_CONSOLE)
- conswitchp = &dummy_con;
- #endif
---- linux-2.6.0/arch/i386/kernel/signal.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/signal.c 2003-12-28 23:26:36.000000000 -0800
-@@ -128,28 +128,29 @@ sys_sigaltstack(const stack_t __user *us
- */
-
- static int
--restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax)
-+restore_sigcontext(struct pt_regs *regs,
-+ struct sigcontext __user *__sc, int *peax)
- {
-- unsigned int err = 0;
-+ struct sigcontext scratch; /* 88 bytes of scratch area */
-
- /* Always make any pending restarted system calls return -EINTR */
- current_thread_info()->restart_block.fn = do_no_restart_syscall;
-
--#define COPY(x) err |= __get_user(regs->x, &sc->x)
-+ if (copy_from_user(&scratch, __sc, sizeof(scratch)))
-+ return -EFAULT;
-+
-+#define COPY(x) regs->x = scratch.x
-
- #define COPY_SEG(seg) \
-- { unsigned short tmp; \
-- err |= __get_user(tmp, &sc->seg); \
-+ { unsigned short tmp = scratch.seg; \
- regs->x##seg = tmp; }
-
- #define COPY_SEG_STRICT(seg) \
-- { unsigned short tmp; \
-- err |= __get_user(tmp, &sc->seg); \
-+ { unsigned short tmp = scratch.seg; \
- regs->x##seg = tmp|3; }
-
- #define GET_SEG(seg) \
-- { unsigned short tmp; \
-- err |= __get_user(tmp, &sc->seg); \
-+ { unsigned short tmp = scratch.seg; \
- loadsegment(seg,tmp); }
-
- GET_SEG(gs);
-@@ -168,27 +169,23 @@ restore_sigcontext(struct pt_regs *regs,
- COPY_SEG_STRICT(ss);
-
- {
-- unsigned int tmpflags;
-- err |= __get_user(tmpflags, &sc->eflags);
-+ unsigned int tmpflags = scratch.eflags;
- regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
- regs->orig_eax = -1; /* disable syscall checks */
- }
-
- {
-- struct _fpstate __user * buf;
-- err |= __get_user(buf, &sc->fpstate);
-+ struct _fpstate * buf = scratch.fpstate;
- if (buf) {
- if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
-- goto badframe;
-- err |= restore_i387(buf);
-+ return -EFAULT;
-+ if (restore_i387(buf))
-+ return -EFAULT;
- }
- }
-
-- err |= __get_user(*peax, &sc->eax);
-- return err;
--
--badframe:
-- return 1;
-+ *peax = scratch.eax;
-+ return 0;
- }
-
- asmlinkage int sys_sigreturn(unsigned long __unused)
-@@ -266,46 +263,47 @@ badframe:
- */
-
- static int
--setup_sigcontext(struct sigcontext __user *sc, struct _fpstate __user *fpstate,
-+setup_sigcontext(struct sigcontext __user *__sc, struct _fpstate __user *fpstate,
- struct pt_regs *regs, unsigned long mask)
- {
-- int tmp, err = 0;
-+ struct sigcontext sc; /* 88 bytes of scratch area */
-+ int tmp;
-
- tmp = 0;
- __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
-- err |= __put_user(tmp, (unsigned int *)&sc->gs);
-+ *(unsigned int *)&sc.gs = tmp;
- __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
-- err |= __put_user(tmp, (unsigned int *)&sc->fs);
--
-- err |= __put_user(regs->xes, (unsigned int *)&sc->es);
-- err |= __put_user(regs->xds, (unsigned int *)&sc->ds);
-- err |= __put_user(regs->edi, &sc->edi);
-- err |= __put_user(regs->esi, &sc->esi);
-- err |= __put_user(regs->ebp, &sc->ebp);
-- err |= __put_user(regs->esp, &sc->esp);
-- err |= __put_user(regs->ebx, &sc->ebx);
-- err |= __put_user(regs->edx, &sc->edx);
-- err |= __put_user(regs->ecx, &sc->ecx);
-- err |= __put_user(regs->eax, &sc->eax);
-- err |= __put_user(current->thread.trap_no, &sc->trapno);
-- err |= __put_user(current->thread.error_code, &sc->err);
-- err |= __put_user(regs->eip, &sc->eip);
-- err |= __put_user(regs->xcs, (unsigned int *)&sc->cs);
-- err |= __put_user(regs->eflags, &sc->eflags);
-- err |= __put_user(regs->esp, &sc->esp_at_signal);
-- err |= __put_user(regs->xss, (unsigned int *)&sc->ss);
-+ *(unsigned int *)&sc.fs = tmp;
-+ *(unsigned int *)&sc.es = regs->xes;
-+ *(unsigned int *)&sc.ds = regs->xds;
-+ sc.edi = regs->edi;
-+ sc.esi = regs->esi;
-+ sc.ebp = regs->ebp;
-+ sc.esp = regs->esp;
-+ sc.ebx = regs->ebx;
-+ sc.edx = regs->edx;
-+ sc.ecx = regs->ecx;
-+ sc.eax = regs->eax;
-+ sc.trapno = current->thread.trap_no;
-+ sc.err = current->thread.error_code;
-+ sc.eip = regs->eip;
-+ *(unsigned int *)&sc.cs = regs->xcs;
-+ sc.eflags = regs->eflags;
-+ sc.esp_at_signal = regs->esp;
-+ *(unsigned int *)&sc.ss = regs->xss;
-
- tmp = save_i387(fpstate);
- if (tmp < 0)
-- err = 1;
-- else
-- err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
-+ return 1;
-+ sc.fpstate = tmp ? fpstate : NULL;
-
- /* non-iBCS2 extensions.. */
-- err |= __put_user(mask, &sc->oldmask);
-- err |= __put_user(current->thread.cr2, &sc->cr2);
-+ sc.oldmask = mask;
-+ sc.cr2 = current->thread.cr2;
-
-- return err;
-+ if (copy_to_user(__sc, &sc, sizeof(sc)))
-+ return 1;
-+ return 0;
- }
-
- /*
-@@ -443,7 +441,7 @@ static void setup_rt_frame(int sig, stru
- /* Create the ucontext. */
- err |= __put_user(0, &frame->uc.uc_flags);
- err |= __put_user(0, &frame->uc.uc_link);
-- err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-+ err |= __put_user(current->sas_ss_sp, (unsigned long *)&frame->uc.uc_stack.ss_sp);
- err |= __put_user(sas_ss_flags(regs->esp),
- &frame->uc.uc_stack.ss_flags);
- err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
---- linux-2.6.0/arch/i386/kernel/smp.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/smp.c 2003-12-28 23:26:36.000000000 -0800
-@@ -327,10 +327,12 @@ asmlinkage void smp_invalidate_interrupt
-
- if (flush_mm == cpu_tlbstate[cpu].active_mm) {
- if (cpu_tlbstate[cpu].state == TLBSTATE_OK) {
-+#ifndef CONFIG_X86_SWITCH_PAGETABLES
- if (flush_va == FLUSH_ALL)
- local_flush_tlb();
- else
- __flush_tlb_one(flush_va);
-+#endif
- } else
- leave_mm(cpu);
- }
-@@ -396,21 +398,6 @@ static void flush_tlb_others(cpumask_t c
- spin_unlock(&tlbstate_lock);
- }
-
--void flush_tlb_current_task(void)
--{
-- struct mm_struct *mm = current->mm;
-- cpumask_t cpu_mask;
--
-- preempt_disable();
-- cpu_mask = mm->cpu_vm_mask;
-- cpu_clear(smp_processor_id(), cpu_mask);
--
-- local_flush_tlb();
-- if (!cpus_empty(cpu_mask))
-- flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-- preempt_enable();
--}
--
- void flush_tlb_mm (struct mm_struct * mm)
- {
- cpumask_t cpu_mask;
-@@ -442,7 +429,10 @@ void flush_tlb_page(struct vm_area_struc
-
- if (current->active_mm == mm) {
- if(current->mm)
-- __flush_tlb_one(va);
-+#ifndef CONFIG_X86_SWITCH_PAGETABLES
-+ __flush_tlb_one(va)
-+#endif
-+ ;
- else
- leave_mm(smp_processor_id());
- }
-@@ -466,7 +456,17 @@ void flush_tlb_all(void)
- {
- on_each_cpu(do_flush_tlb_all, 0, 1, 1);
- }
--
-+#ifdef CONFIG_KGDB
-+/*
-+ * By using the NMI code instead of a vector we just sneak thru the
-+ * word generator coming out with just what we want. AND it does
-+ * not matter if clustered_apic_mode is set or not.
-+ */
-+void smp_send_nmi_allbutself(void)
-+{
-+ send_IPI_allbutself(APIC_DM_NMI);
-+}
-+#endif
- /*
- * this function sends a 'reschedule' IPI to another CPU.
- * it goes straight through and wastes no time serializing
---- linux-2.6.0/arch/i386/kernel/summit.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/arch/i386/kernel/summit.c 2003-12-28 23:22:43.000000000 -0800
-@@ -29,86 +29,85 @@
- #include <linux/mm.h>
- #include <linux/init.h>
- #include <asm/io.h>
--#include <mach_mpparse.h>
-+#include <asm/mach-summit/mach_mpparse.h>
-
--#ifdef CONFIG_NUMA
--static void __init setup_pci_node_map_for_wpeg(int wpeg_num, struct rio_table_hdr *rth,
-- struct scal_detail **scal_nodes, struct rio_detail **rio_nodes){
-- int twst_num = 0, node = 0, first_bus = 0;
-- int i, bus, num_busses;
--
-- for(i = 0; i < rth->num_rio_dev; i++){
-- if (rio_nodes[i]->node_id == rio_nodes[wpeg_num]->owner_id){
-- twst_num = rio_nodes[i]->owner_id;
-+static struct rio_table_hdr *rio_table_hdr __initdata;
-+static struct scal_detail *scal_devs[MAX_NUMNODES] __initdata;
-+static struct rio_detail *rio_devs[MAX_NUMNODES*4] __initdata;
-+
-+static int __init setup_pci_node_map_for_wpeg(int wpeg_num, int last_bus)
-+{
-+ int twister = 0, node = 0;
-+ int i, bus, num_buses;
-+
-+ for(i = 0; i < rio_table_hdr->num_rio_dev; i++){
-+ if (rio_devs[i]->node_id == rio_devs[wpeg_num]->owner_id){
-+ twister = rio_devs[i]->owner_id;
- break;
- }
- }
-- if (i == rth->num_rio_dev){
-- printk("%s: Couldn't find owner Cyclone for Winnipeg!\n", __FUNCTION__);
-- return;
-+ if (i == rio_table_hdr->num_rio_dev){
-+ printk(KERN_ERR "%s: Couldn't find owner Cyclone for Winnipeg!\n", __FUNCTION__);
-+ return last_bus;
- }
-
-- for(i = 0; i < rth->num_scal_dev; i++){
-- if (scal_nodes[i]->node_id == twst_num){
-- node = scal_nodes[i]->node_id;
-+ for(i = 0; i < rio_table_hdr->num_scal_dev; i++){
-+ if (scal_devs[i]->node_id == twister){
-+ node = scal_devs[i]->node_id;
- break;
- }
- }
-- if (i == rth->num_scal_dev){
-- printk("%s: Couldn't find owner Twister for Cyclone!\n", __FUNCTION__);
-- return;
-+ if (i == rio_table_hdr->num_scal_dev){
-+ printk(KERN_ERR "%s: Couldn't find owner Twister for Cyclone!\n", __FUNCTION__);
-+ return last_bus;
- }
-
-- switch (rio_nodes[wpeg_num]->type){
-+ switch (rio_devs[wpeg_num]->type){
- case CompatWPEG:
-- /* The Compatability Winnipeg controls the legacy busses
-- (busses 0 & 1), the 66MHz PCI bus [2 slots] (bus 2),
-- and the "extra" busses in case a PCI-PCI bridge card is
-- used in either slot (busses 3 & 4): total 5 busses. */
-- num_busses = 5;
-- /* The BIOS numbers the busses starting at 1, and in a
-- slightly wierd manner. You'll have to trust that
-- the math used below to determine the number of the
-- first bus works. */
-- first_bus = (rio_nodes[wpeg_num]->first_slot - 1) * 2;
-+ /* The Compatability Winnipeg controls the 2 legacy buses,
-+ * the 66MHz PCI bus [2 slots] and the 2 "extra" buses in case
-+ * a PCI-PCI bridge card is used in either slot: total 5 buses.
-+ */
-+ num_buses = 5;
- break;
- case AltWPEG:
-- /* The Alternate/Secondary Winnipeg controls the 1st 133MHz
-- bus [1 slot] & its "extra" bus (busses 0 & 1), the 2nd
-- 133MHz bus [1 slot] & its "extra" bus (busses 2 & 3), the
-- 100MHz bus [2 slots] (bus 4), and the "extra" busses for
-- the 2 100MHz slots (busses 5 & 6): total 7 busses. */
-- num_busses = 7;
-- first_bus = (rio_nodes[wpeg_num]->first_slot * 2) - 1;
-+ /* The Alternate Winnipeg controls the 2 133MHz buses [1 slot
-+ * each], their 2 "extra" buses, the 100MHz bus [2 slots] and
-+ * the "extra" buses for each of those slots: total 7 buses.
-+ */
-+ num_buses = 7;
- break;
- case LookOutAWPEG:
- case LookOutBWPEG:
-- printk("%s: LookOut Winnipegs not supported yet!\n", __FUNCTION__);
-- return;
-+ /* A Lookout Winnipeg controls 3 100MHz buses [2 slots each]
-+ * & the "extra" buses for each of those slots: total 9 buses.
-+ */
-+ num_buses = 9;
-+ break;
- default:
-- printk("%s: Unsupported Winnipeg type!\n", __FUNCTION__);
-- return;
-+ printk(KERN_INFO "%s: Unsupported Winnipeg type!\n", __FUNCTION__);
-+ return last_bus;
- }
-
-- for(bus = first_bus; bus < first_bus + num_busses; bus++)
-+ for(bus = last_bus; bus < last_bus + num_buses; bus++)
- mp_bus_id_to_node[bus] = node;
-+ return bus;
- }
-
--static int __init build_detail_arrays(struct rio_table_hdr *rth,
-- struct scal_detail **sd, struct rio_detail **rd){
-+static int __init build_detail_arrays(void)
-+{
- unsigned long ptr;
- int i, scal_detail_size, rio_detail_size;
-
-- if ((rth->num_scal_dev > MAX_NUMNODES) ||
-- (rth->num_rio_dev > MAX_NUMNODES * 2)){
-- printk("%s: MAX_NUMNODES too low! Defined as %d, but system has %d nodes.\n", __FUNCTION__, MAX_NUMNODES, rth->num_scal_dev);
-- return 1;
-+ if (rio_table_hdr->num_scal_dev > MAX_NUMNODES){
-+ printk(KERN_WARNING "%s: MAX_NUMNODES too low! Defined as %d, but system has %d nodes.\n", __FUNCTION__, MAX_NUMNODES, rio_table_hdr->num_scal_dev);
-+ return 0;
- }
-
-- switch (rth->version){
-+ switch (rio_table_hdr->version){
- default:
-- printk("%s: Bad Rio Grande Table Version: %d\n", __FUNCTION__, rth->version);
-- return 1;
-+ printk(KERN_WARNING "%s: Invalid Rio Grande Table Version: %d\n", __FUNCTION__, rio_table_hdr->version);
-+ return 0;
- case 2:
- scal_detail_size = 11;
- rio_detail_size = 13;
-@@ -119,32 +118,27 @@ static int __init build_detail_arrays(st
- break;
- }
-
-- ptr = (unsigned long)rth + 3;
-- for(i = 0; i < rth->num_scal_dev; i++)
-- sd[i] = (struct scal_detail *)(ptr + (scal_detail_size * i));
--
-- ptr += scal_detail_size * rth->num_scal_dev;
-- for(i = 0; i < rth->num_rio_dev; i++)
-- rd[i] = (struct rio_detail *)(ptr + (rio_detail_size * i));
-+ ptr = (unsigned long)rio_table_hdr + 3;
-+ for(i = 0; i < rio_table_hdr->num_scal_dev; i++, ptr += scal_detail_size)
-+ scal_devs[i] = (struct scal_detail *)ptr;
-
-- return 0;
-+ for(i = 0; i < rio_table_hdr->num_rio_dev; i++, ptr += rio_detail_size)
-+ rio_devs[i] = (struct rio_detail *)ptr;
-+
-+ return 1;
- }
-
- void __init setup_summit(void)
- {
-- struct rio_table_hdr *rio_table_hdr = NULL;
-- struct scal_detail *scal_devs[MAX_NUMNODES];
-- struct rio_detail *rio_devs[MAX_NUMNODES*2];
- unsigned long ptr;
- unsigned short offset;
-- int i;
--
-- memset(mp_bus_id_to_node, -1, sizeof(mp_bus_id_to_node));
-+ int i, next_wpeg, next_bus = 0;
-
- /* The pointer to the EBDA is stored in the word @ phys 0x40E(40:0E) */
- ptr = *(unsigned short *)phys_to_virt(0x40Eul);
- ptr = (unsigned long)phys_to_virt(ptr << 4);
-
-+ rio_table_hdr = NULL;
- offset = 0x180;
- while (offset){
- /* The block id is stored in the 2nd word */
-@@ -157,16 +151,30 @@ void __init setup_summit(void)
- offset = *((unsigned short *)(ptr + offset));
- }
- if (!rio_table_hdr){
-- printk("%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __FUNCTION__);
-+ printk(KERN_ERR "%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __FUNCTION__);
- return;
- }
-
-- if (build_detail_arrays(rio_table_hdr, scal_devs, rio_devs))
-+ if (!build_detail_arrays())
- return;
-
-- for(i = 0; i < rio_table_hdr->num_rio_dev; i++)
-- if (is_WPEG(rio_devs[i]->type))
-- /* It's a Winnipeg, it's got PCI Busses */
-- setup_pci_node_map_for_wpeg(i, rio_table_hdr, scal_devs, rio_devs);
-+ /* The first Winnipeg we're looking for has an index of 0 */
-+ next_wpeg = 0;
-+ do {
-+ for(i = 0; i < rio_table_hdr->num_rio_dev; i++){
-+ if (is_WPEG(rio_devs[i]) && rio_devs[i]->WP_index == next_wpeg){
-+ /* It's the Winnipeg we're looking for! */
-+ next_bus = setup_pci_node_map_for_wpeg(i, next_bus);
-+ next_wpeg++;
-+ break;
-+ }
-+ }
-+ /*
-+ * If we go through all Rio devices and don't find one with
-+ * the next index, it means we've found all the Winnipegs,
-+ * and thus all the PCI buses.
-+ */
-+ if (i == rio_table_hdr->num_rio_dev)
-+ next_wpeg = 0;
-+ } while (next_wpeg != 0);
- }
--#endif /* CONFIG_NUMA */
---- linux-2.6.0/arch/i386/kernel/sysenter.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/sysenter.c 2003-12-28 23:26:36.000000000 -0800
-@@ -18,13 +18,18 @@
- #include <asm/msr.h>
- #include <asm/pgtable.h>
- #include <asm/unistd.h>
-+#include <linux/highmem.h>
-
- extern asmlinkage void sysenter_entry(void);
-
- void enable_sep_cpu(void *info)
- {
- int cpu = get_cpu();
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ struct tss_struct *tss = (struct tss_struct *) __fix_to_virt(FIX_TSS_0) + cpu;
-+#else
- struct tss_struct *tss = init_tss + cpu;
-+#endif
-
- tss->ss1 = __KERNEL_CS;
- tss->esp1 = sizeof(struct tss_struct) + (unsigned long) tss;
---- linux-2.6.0/arch/i386/kernel/time.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/time.c 2003-12-28 23:22:19.000000000 -0800
-@@ -44,6 +44,7 @@
- #include <linux/module.h>
- #include <linux/sysdev.h>
- #include <linux/bcd.h>
-+#include <linux/efi.h>
-
- #include <asm/io.h>
- #include <asm/smp.h>
-@@ -94,7 +95,7 @@ void do_gettimeofday(struct timeval *tv)
- {
- unsigned long seq;
- unsigned long usec, sec;
-- unsigned long max_ntp_tick = tick_usec - tickadj;
-+ unsigned long max_ntp_tick;
-
- do {
- unsigned long lost;
-@@ -110,13 +111,14 @@ void do_gettimeofday(struct timeval *tv)
- * Better to lose some accuracy than have time go backwards..
- */
- if (unlikely(time_adjust < 0)) {
-+ max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
- usec = min(usec, max_ntp_tick);
-
- if (lost)
- usec += lost * max_ntp_tick;
- }
- else if (unlikely(lost))
-- usec += lost * tick_usec;
-+ usec += lost * (USEC_PER_SEC / HZ);
-
- sec = xtime.tv_sec;
- usec += (xtime.tv_nsec / 1000);
-@@ -174,7 +176,10 @@ static int set_rtc_mmss(unsigned long no
-
- /* gets recalled with irq locally disabled */
- spin_lock(&rtc_lock);
-- retval = mach_set_rtc_mmss(nowtime);
-+ if (efi_enabled)
-+ retval = efi_set_rtc_mmss(nowtime);
-+ else
-+ retval = mach_set_rtc_mmss(nowtime);
- spin_unlock(&rtc_lock);
-
- return retval;
-@@ -232,7 +237,13 @@ static inline void do_timer_interrupt(in
- >= USEC_AFTER - ((unsigned) TICK_SIZE) / 2 &&
- (xtime.tv_nsec / 1000)
- <= USEC_BEFORE + ((unsigned) TICK_SIZE) / 2) {
-- if (set_rtc_mmss(xtime.tv_sec) == 0)
-+ /* horrible...FIXME */
-+ if (efi_enabled) {
-+ if (efi_set_rtc_mmss(xtime.tv_sec) == 0)
-+ last_rtc_update = xtime.tv_sec;
-+ else
-+ last_rtc_update = xtime.tv_sec - 600;
-+ } else if (set_rtc_mmss(xtime.tv_sec) == 0)
- last_rtc_update = xtime.tv_sec;
- else
- last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
-@@ -286,7 +297,10 @@ unsigned long get_cmos_time(void)
-
- spin_lock(&rtc_lock);
-
-- retval = mach_get_cmos_time();
-+ if (efi_enabled)
-+ retval = efi_get_time();
-+ else
-+ retval = mach_get_cmos_time();
-
- spin_unlock(&rtc_lock);
-
-@@ -297,6 +311,7 @@ static struct sysdev_class pit_sysclass
- set_kset_name("pit"),
- };
-
-+
- /* XXX this driverfs stuff should probably go elsewhere later -john */
- static struct sys_device device_i8253 = {
- .id = 0,
-@@ -328,6 +343,8 @@ void __init hpet_time_init(void)
- }
-
- cur_timer = select_timer();
-+ printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
-+
- time_init_hook();
- }
- #endif
-@@ -344,12 +361,13 @@ void __init time_init(void)
- return;
- }
- #endif
--
- xtime.tv_sec = get_cmos_time();
- wall_to_monotonic.tv_sec = -xtime.tv_sec;
- xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
- wall_to_monotonic.tv_nsec = -xtime.tv_nsec;
-
- cur_timer = select_timer();
-+ printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
-+
- time_init_hook();
- }
---- linux-2.6.0/arch/i386/kernel/timers/common.c 2003-09-27 18:57:43.000000000 -0700
-+++ 25/arch/i386/kernel/timers/common.c 2003-12-28 23:21:57.000000000 -0800
-@@ -137,3 +137,23 @@ bad_calibration:
- }
- #endif
-
-+/* calculate cpu_khz */
-+void __init init_cpu_khz(void)
-+{
-+ if (cpu_has_tsc) {
-+ unsigned long tsc_quotient = calibrate_tsc();
-+ if (tsc_quotient) {
-+ /* report CPU clock rate in Hz.
-+ * The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) =
-+ * clock/second. Our precision is about 100 ppm.
-+ */
-+ { unsigned long eax=0, edx=1000;
-+ __asm__("divl %2"
-+ :"=a" (cpu_khz), "=d" (edx)
-+ :"r" (tsc_quotient),
-+ "0" (eax), "1" (edx));
-+ printk("Detected %lu.%03lu MHz processor.\n", cpu_khz / 1000, cpu_khz % 1000);
-+ }
-+ }
-+ }
-+}
---- linux-2.6.0/arch/i386/kernel/timers/Makefile 2003-09-27 18:57:43.000000000 -0700
-+++ 25/arch/i386/kernel/timers/Makefile 2003-12-28 23:21:57.000000000 -0800
-@@ -6,3 +6,4 @@ obj-y := timer.o timer_none.o timer_tsc.
-
- obj-$(CONFIG_X86_CYCLONE_TIMER) += timer_cyclone.o
- obj-$(CONFIG_HPET_TIMER) += timer_hpet.o
-+obj-$(CONFIG_X86_PM_TIMER) += timer_pm.o
---- linux-2.6.0/arch/i386/kernel/timers/timer.c 2003-09-08 13:58:55.000000000 -0700
-+++ 25/arch/i386/kernel/timers/timer.c 2003-12-28 23:21:57.000000000 -0800
-@@ -19,6 +19,9 @@ static struct timer_opts* timers[] = {
- #ifdef CONFIG_HPET_TIMER
- &timer_hpet,
- #endif
-+#ifdef CONFIG_X86_PM_TIMER
-+ &timer_pmtmr,
-+#endif
- &timer_tsc,
- &timer_pit,
- NULL,
---- linux-2.6.0/arch/i386/kernel/timers/timer_cyclone.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/timers/timer_cyclone.c 2003-12-28 23:22:29.000000000 -0800
-@@ -71,7 +71,7 @@ static void mark_offset_cyclone(void)
- lost = delta/(1000000/HZ);
- delay = delta%(1000000/HZ);
- if (lost >= 2)
-- jiffies += lost-1;
-+ jiffies_64 += lost-1;
-
- /* update the monotonic base value */
- this_offset = ((unsigned long long)last_cyclone_high<<32)|last_cyclone_low;
-@@ -88,7 +88,7 @@ static void mark_offset_cyclone(void)
- * usec delta is > 90% # of usecs/tick)
- */
- if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
-- jiffies++;
-+ jiffies_64++;
- }
-
- static unsigned long get_offset_cyclone(void)
-@@ -212,26 +212,7 @@ static int __init init_cyclone(char* ove
- }
- }
-
-- /* init cpu_khz.
-- * XXX - This should really be done elsewhere,
-- * and in a more generic fashion. -johnstul@us.ibm.com
-- */
-- if (cpu_has_tsc) {
-- unsigned long tsc_quotient = calibrate_tsc();
-- if (tsc_quotient) {
-- /* report CPU clock rate in Hz.
-- * The formula is (10^6 * 2^32) / (2^32 * 1 / (clocks/us)) =
-- * clock/second. Our precision is about 100 ppm.
-- */
-- { unsigned long eax=0, edx=1000;
-- __asm__("divl %2"
-- :"=a" (cpu_khz), "=d" (edx)
-- :"r" (tsc_quotient),
-- "0" (eax), "1" (edx));
-- printk("Detected %lu.%03lu MHz processor.\n", cpu_khz / 1000, cpu_khz % 1000);
-- }
-- }
-- }
-+ init_cpu_khz();
-
- /* Everything looks good! */
- return 0;
-@@ -253,6 +234,7 @@ static void delay_cyclone(unsigned long
-
- /* cyclone timer_opts struct */
- struct timer_opts timer_cyclone = {
-+ .name = "cyclone",
- .init = init_cyclone,
- .mark_offset = mark_offset_cyclone,
- .get_offset = get_offset_cyclone,
---- linux-2.6.0/arch/i386/kernel/timers/timer_hpet.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/timers/timer_hpet.c 2003-12-28 23:22:29.000000000 -0800
-@@ -108,7 +108,7 @@ static void mark_offset_hpet(void)
- offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
- if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
- int lost_ticks = (offset - hpet_last) / hpet_tick;
-- jiffies += lost_ticks;
-+ jiffies_64 += lost_ticks;
- }
- hpet_last = offset;
-
-@@ -178,6 +178,7 @@ static int __init init_hpet(char* overri
-
- /* tsc timer_opts struct */
- struct timer_opts timer_hpet = {
-+ .name = "hpet",
- .init = init_hpet,
- .mark_offset = mark_offset_hpet,
- .get_offset = get_offset_hpet,
---- linux-2.6.0/arch/i386/kernel/timers/timer_none.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/timers/timer_none.c 2003-12-28 23:21:56.000000000 -0800
-@@ -36,6 +36,7 @@ static void delay_none(unsigned long loo
-
- /* tsc timer_opts struct */
- struct timer_opts timer_none = {
-+ .name = "none",
- .init = init_none,
- .mark_offset = mark_offset_none,
- .get_offset = get_offset_none,
---- linux-2.6.0/arch/i386/kernel/timers/timer_pit.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/timers/timer_pit.c 2003-12-28 23:21:56.000000000 -0800
-@@ -149,6 +149,7 @@ static unsigned long get_offset_pit(void
-
- /* tsc timer_opts struct */
- struct timer_opts timer_pit = {
-+ .name = "pit",
- .init = init_pit,
- .mark_offset = mark_offset_pit,
- .get_offset = get_offset_pit,
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/kernel/timers/timer_pm.c 2003-12-28 23:21:57.000000000 -0800
-@@ -0,0 +1,203 @@
-+/*
-+ * (C) Dominik Brodowski <linux@brodo.de> 2003
-+ *
-+ * Driver to use the Power Management Timer (PMTMR) available in some
-+ * southbridges as primary timing source for the Linux kernel.
-+ *
-+ * Based on parts of linux/drivers/acpi/hardware/hwtimer.c, timer_pit.c,
-+ * timer_hpet.c, and on Arjan van de Ven's implementation for 2.4.
-+ *
-+ * This file is licensed under the GPL v2.
-+ */
-+
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/init.h>
-+#include <asm/types.h>
-+#include <asm/timer.h>
-+#include <asm/smp.h>
-+#include <asm/io.h>
-+#include <asm/arch_hooks.h>
-+
-+
-+/* The I/O port the PMTMR resides at.
-+ * The location is detected during setup_arch(),
-+ * in arch/i386/acpi/boot.c */
-+u32 pmtmr_ioport = 0;
-+
-+
-+/* value of the Power timer at last timer interrupt */
-+static u32 offset_tick;
-+static u32 offset_delay;
-+
-+static unsigned long long monotonic_base;
-+static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED;
-+
-+#define ACPI_PM_MASK 0xFFFFFF /* limit it to 24 bits */
-+
-+static int init_pmtmr(char* override)
-+{
-+ u32 value1, value2;
-+ unsigned int i;
-+
-+ if (override[0] && strncmp(override,"pmtmr",5))
-+ return -ENODEV;
-+
-+ if (!pmtmr_ioport)
-+ return -ENODEV;
-+
-+ /* "verify" this timing source */
-+ value1 = inl(pmtmr_ioport);
-+ value1 &= ACPI_PM_MASK;
-+ for (i=0; i < 10000; i++) {
-+ value2 = inl(pmtmr_ioport);
-+ value2 &= ACPI_PM_MASK;
-+ if (value2 == value1)
-+ continue;
-+ if (value2 > value1)
-+ goto pm_good;
-+ if ((value2 < value1) && ((value2) < 0xFFF))
-+ goto pm_good;
-+ printk(KERN_INFO "PM-Timer had inconsistent results: 0x%#x, 0x%#x - aborting.\n", value1, value2);
-+ return -EINVAL;
-+ }
-+ printk(KERN_INFO "PM-Timer had no reasonable result: 0x%#x - aborting.\n", value1);
-+ return -ENODEV;
-+
-+pm_good:
-+ init_cpu_khz();
-+ return 0;
-+}
-+
-+static inline u32 cyc2us(u32 cycles)
-+{
-+ /* The Power Management Timer ticks at 3.579545 ticks per microsecond.
-+ * 1 / PM_TIMER_FREQUENCY == 0.27936511 =~ 286/1024 [error: 0.024%]
-+ *
-+ * Even with HZ = 100, delta is at maximum 35796 ticks, so it can
-+ * easily be multiplied with 286 (=0x11E) without having to fear
-+ * u32 overflows.
-+ */
-+ cycles *= 286;
-+ return (cycles >> 10);
-+}
-+
-+/*
-+ * this gets called during each timer interrupt
-+ * - Called while holding the writer xtime_lock
-+ */
-+static void mark_offset_pmtmr(void)
-+{
-+ u32 lost, delta, last_offset;
-+ static int first_run = 1;
-+ last_offset = offset_tick;
-+
-+ write_seqlock(&monotonic_lock);
-+
-+ offset_tick = inl(pmtmr_ioport);
-+ offset_tick &= ACPI_PM_MASK; /* limit it to 24 bits */
-+
-+ /* calculate tick interval */
-+ delta = (offset_tick - last_offset) & ACPI_PM_MASK;
-+
-+ /* convert to usecs */
-+ delta = cyc2us(delta);
-+
-+ /* update the monotonic base value */
-+ monotonic_base += delta*NSEC_PER_USEC;
-+ write_sequnlock(&monotonic_lock);
-+
-+ /* convert to ticks */
-+ delta += offset_delay;
-+ lost = delta/(USEC_PER_SEC/HZ);
-+ offset_delay = delta%(USEC_PER_SEC/HZ);
-+
-+
-+ /* compensate for lost ticks */
-+ if (lost >= 2)
-+ jiffies += lost - 1;
-+
-+ /* don't calculate delay for first run,
-+ or if we've got less then a tick */
-+ if (first_run || (lost < 1)) {
-+ first_run = 0;
-+ offset_delay = 0;
-+ }
-+
-+ return;
-+}
-+
-+
-+static unsigned long long monotonic_clock_pmtmr(void)
-+{
-+ u32 last_offset, this_offset;
-+ unsigned long long base, ret;
-+ unsigned seq;
-+
-+
-+ /* atomically read monotonic base & last_offset */
-+ do {
-+ seq = read_seqbegin(&monotonic_lock);
-+ last_offset = offset_tick;
-+ base = monotonic_base;
-+ } while (read_seqretry(&monotonic_lock, seq));
-+
-+ /* Read the pmtmr */
-+ this_offset = inl(pmtmr_ioport) & ACPI_PM_MASK;
-+
-+ /* convert to nanoseconds */
-+ ret = (this_offset - last_offset) & ACPI_PM_MASK;
-+ ret = base + (cyc2us(ret)*NSEC_PER_USEC);
-+ return ret;
-+}
-+
-+/*
-+ * copied from delay_pit
-+ */
-+static void delay_pmtmr(unsigned long loops)
-+{
-+ int d0;
-+ __asm__ __volatile__(
-+ "\tjmp 1f\n"
-+ ".align 16\n"
-+ "1:\tjmp 2f\n"
-+ ".align 16\n"
-+ "2:\tdecl %0\n\tjns 2b"
-+ :"=&a" (d0)
-+ :"0" (loops));
-+}
-+
-+
-+/*
-+ * get the offset (in microseconds) from the last call to mark_offset()
-+ * - Called holding a reader xtime_lock
-+ */
-+static unsigned long get_offset_pmtmr(void)
-+{
-+ u32 now, offset, delta = 0;
-+
-+ offset = offset_tick;
-+ now = inl(pmtmr_ioport);
-+ now &= ACPI_PM_MASK;
-+ delta = (now - offset)&ACPI_PM_MASK;
-+
-+ return (unsigned long) offset_delay + cyc2us(delta);
-+}
-+
-+
-+/* acpi timer_opts struct */
-+struct timer_opts timer_pmtmr = {
-+ .name = "acpi_pm_timer",
-+ .init = init_pmtmr,
-+ .mark_offset = mark_offset_pmtmr,
-+ .get_offset = get_offset_pmtmr,
-+ .monotonic_clock = monotonic_clock_pmtmr,
-+ .delay = delay_pmtmr,
-+};
-+
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Dominik Brodowski <linux@brodo.de>");
-+MODULE_DESCRIPTION("Power Management Timer (PMTMR) as primary timing source for x86");
---- linux-2.6.0/arch/i386/kernel/timers/timer_tsc.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/timers/timer_tsc.c 2003-12-28 23:26:25.000000000 -0800
-@@ -30,7 +30,6 @@ struct timer_opts timer_tsc;
- int tsc_disable __initdata = 0;
-
- extern spinlock_t i8253_lock;
--extern volatile unsigned long jiffies;
-
- static int use_tsc;
- /* Number of usecs that the last interrupt was delayed */
-@@ -141,6 +140,7 @@ unsigned long long sched_clock(void)
- #ifndef CONFIG_NUMA
- if (!use_tsc)
- #endif
-+ /* jiffies might overflow but this is not a big deal here */
- return (unsigned long long)jiffies * (1000000000 / HZ);
-
- /* Read the Time Stamp Counter */
-@@ -184,6 +184,18 @@ static void mark_offset_tsc(void)
-
- count = inb_p(PIT_CH0); /* read the latched count */
- count |= inb(PIT_CH0) << 8;
-+
-+ /*
-+ * VIA686a test code... reset the latch if count > max + 1
-+ * from timer_pit.c - cjb
-+ */
-+ if (count > LATCH) {
-+ outb_p(0x34, PIT_MODE);
-+ outb_p(LATCH & 0xff, PIT_CH0);
-+ outb(LATCH >> 8, PIT_CH0);
-+ count = LATCH - 1;
-+ }
-+
- spin_unlock(&i8253_lock);
-
- if (pit_latch_buggy) {
-@@ -215,7 +227,7 @@ static void mark_offset_tsc(void)
- lost = delta/(1000000/HZ);
- delay = delta%(1000000/HZ);
- if (lost >= 2) {
-- jiffies += lost-1;
-+ jiffies_64 += lost-1;
-
- /* sanity check to ensure we're not always losing ticks */
- if (lost_count++ > 100) {
-@@ -241,7 +253,7 @@ static void mark_offset_tsc(void)
- * usec delta is > 90% # of usecs/tick)
- */
- if (lost && abs(delay - delay_at_last_interrupt) > (900000/HZ))
-- jiffies++;
-+ jiffies_64++;
- }
-
- static void delay_tsc(unsigned long loops)
-@@ -283,7 +295,7 @@ static void mark_offset_tsc_hpet(void)
- offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
- if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
- int lost_ticks = (offset - hpet_last) / hpet_tick;
-- jiffies += lost_ticks;
-+ jiffies_64 += lost_ticks;
- }
- hpet_last = hpet_current;
-
-@@ -472,6 +484,7 @@ __setup("notsc", tsc_setup);
-
- /* tsc timer_opts struct */
- struct timer_opts timer_tsc = {
-+ .name = "tsc",
- .init = init_tsc,
- .mark_offset = mark_offset_tsc,
- .get_offset = get_offset_tsc,
---- linux-2.6.0/arch/i386/kernel/traps.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/traps.c 2003-12-28 23:26:36.000000000 -0800
-@@ -54,12 +54,8 @@
-
- #include "mach_traps.h"
-
--asmlinkage int system_call(void);
--asmlinkage void lcall7(void);
--asmlinkage void lcall27(void);
--
--struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 },
-- { 0, 0 }, { 0, 0 } };
-+struct desc_struct default_ldt[] __attribute__((__section__(".data.default_ldt"))) = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
-+struct page *default_ldt_page;
-
- /* Do we ignore FPU interrupts ? */
- char ignore_fpu_irq = 0;
-@@ -91,6 +87,43 @@ asmlinkage void alignment_check(void);
- asmlinkage void spurious_interrupt_bug(void);
- asmlinkage void machine_check(void);
-
-+#ifdef CONFIG_KGDB
-+extern void sysenter_entry(void);
-+#include <asm/kgdb.h>
-+#include <linux/init.h>
-+extern void int3(void);
-+extern void debug(void);
-+void set_intr_gate(unsigned int n, void *addr);
-+static void set_intr_usr_gate(unsigned int n, void *addr);
-+/*
-+ * Should be able to call this breakpoint() very early in
-+ * bring up. Just hard code the call where needed.
-+ * The breakpoint() code is here because set_?_gate() functions
-+ * are local (static) to trap.c. They need be done only once,
-+ * but it does not hurt to do them over.
-+ */
-+void breakpoint(void)
-+{
-+ init_entry_mappings();
-+ set_intr_usr_gate(3,&int3); /* disable ints on trap */
-+ set_intr_gate(1,&debug);
-+ set_intr_gate(14,&page_fault);
-+
-+ BREAKPOINT;
-+}
-+#define CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after) \
-+ { \
-+ if (!user_mode(regs) ) \
-+ { \
-+ kgdb_handle_exception(trapnr, signr, error_code, regs); \
-+ after; \
-+ } else if ((trapnr == 3) && (regs->eflags &0x200)) local_irq_enable(); \
-+ }
-+#else
-+#define CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,after)
-+#endif
-+
-+
- static int kstack_depth_to_print = 24;
-
- void show_trace(struct task_struct *task, unsigned long * stack)
-@@ -175,8 +208,9 @@ void show_registers(struct pt_regs *regs
- ss = regs->xss & 0xffff;
- }
- print_modules();
-- printk("CPU: %d\nEIP: %04x:[<%08lx>] %s\nEFLAGS: %08lx\n",
-- smp_processor_id(), 0xffff & regs->xcs, regs->eip, print_tainted(), regs->eflags);
-+ printk("CPU: %d\nEIP: %04x:[<%08lx>] %s VLI\nEFLAGS: %08lx\n",
-+ smp_processor_id(), 0xffff & regs->xcs,
-+ regs->eip, print_tainted(), regs->eflags);
-
- print_symbol("EIP is at %s\n", regs->eip);
- printk("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n",
-@@ -192,23 +226,27 @@ void show_registers(struct pt_regs *regs
- * time of the fault..
- */
- if (in_kernel) {
-+ u8 *eip;
-
- printk("\nStack: ");
- show_stack(NULL, (unsigned long*)esp);
-
- printk("Code: ");
-- if(regs->eip < PAGE_OFFSET)
-- goto bad;
-
-- for(i=0;i<20;i++)
-- {
-- unsigned char c;
-- if(__get_user(c, &((unsigned char*)regs->eip)[i])) {
--bad:
-+ eip = (u8 *)regs->eip - 43;
-+ for (i = 0; i < 64; i++, eip++) {
-+ unsigned char c = 0xff;
-+
-+ if ((user_mode(regs) && get_user(c, eip)) ||
-+ (!user_mode(regs) && __direct_get_user(c, eip))) {
-+
- printk(" Bad EIP value.");
- break;
- }
-- printk("%02x ", c);
-+ if (eip == (u8 *)regs->eip)
-+ printk("<%02x> ", c);
-+ else
-+ printk("%02x ", c);
- }
- }
- printk("\n");
-@@ -255,12 +293,36 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED
- void die(const char * str, struct pt_regs * regs, long err)
- {
- static int die_counter;
-+ int nl = 0;
-
- console_verbose();
- spin_lock_irq(&die_lock);
- bust_spinlocks(1);
- handle_BUG(regs);
- printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
-+#ifdef CONFIG_PREEMPT
-+ printk("PREEMPT ");
-+ nl = 1;
-+#endif
-+#ifdef CONFIG_SMP
-+ printk("SMP ");
-+ nl = 1;
-+#endif
-+#ifdef CONFIG_DEBUG_PAGEALLOC
-+ printk("DEBUG_PAGEALLOC");
-+ nl = 1;
-+#endif
-+ if (nl)
-+ printk("\n");
-+#ifdef CONFIG_KGDB
-+ /* This is about the only place we want to go to kgdb even if in
-+ * user mode. But we must go in via a trap so within kgdb we will
-+ * always be in kernel mode.
-+ */
-+ if (user_mode(regs))
-+ BREAKPOINT;
-+#endif
-+ CHK_REMOTE_DEBUG(0,SIGTRAP,err,regs,)
- show_registers(regs);
- bust_spinlocks(0);
- spin_unlock_irq(&die_lock);
-@@ -330,6 +392,7 @@ static inline void do_trap(int trapnr, i
- #define DO_ERROR(trapnr, signr, str, name) \
- asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
- { \
-+ CHK_REMOTE_DEBUG(trapnr,signr,error_code,regs,)\
- do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
- }
-
-@@ -347,7 +410,9 @@ asmlinkage void do_##name(struct pt_regs
- #define DO_VM86_ERROR(trapnr, signr, str, name) \
- asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
- { \
-+ CHK_REMOTE_DEBUG(trapnr, signr, error_code,regs, return)\
- do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
-+ return; \
- }
-
- #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-@@ -394,8 +459,10 @@ gp_in_vm86:
- return;
-
- gp_in_kernel:
-- if (!fixup_exception(regs))
-+ if (!fixup_exception(regs)){
-+ CHK_REMOTE_DEBUG(13,SIGSEGV,error_code,regs,)
- die("general protection fault", regs, error_code);
-+ }
- }
-
- static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
-@@ -534,10 +601,18 @@ asmlinkage void do_debug(struct pt_regs
- if (regs->eflags & X86_EFLAGS_IF)
- local_irq_enable();
-
-- /* Mask out spurious debug traps due to lazy DR7 setting */
-+ /*
-+ * Mask out spurious debug traps due to lazy DR7 setting or
-+ * due to 4G/4G kernel mode:
-+ */
- if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
- if (!tsk->thread.debugreg[7])
- goto clear_dr7;
-+ if (!user_mode(regs)) {
-+ // restore upon return-to-userspace:
-+ set_thread_flag(TIF_DB7);
-+ goto clear_dr7;
-+ }
- }
-
- if (regs->eflags & VM_MASK)
-@@ -557,8 +632,18 @@ asmlinkage void do_debug(struct pt_regs
- * allowing programs to debug themselves without the ptrace()
- * interface.
- */
-+#ifdef CONFIG_KGDB
-+ /*
-+ * I think this is the only "real" case of a TF in the kernel
-+ * that really belongs to user space. Others are
-+ * "Ours all ours!"
-+ */
-+ if (((regs->xcs & 3) == 0) && ((void *)regs->eip == sysenter_entry))
-+ goto clear_TF_reenable;
-+#else
- if ((regs->xcs & 3) == 0)
- goto clear_TF_reenable;
-+#endif
- if ((tsk->ptrace & (PT_DTRACE|PT_PTRACED)) == PT_DTRACE)
- goto clear_TF;
- }
-@@ -570,6 +655,17 @@ asmlinkage void do_debug(struct pt_regs
- info.si_errno = 0;
- info.si_code = TRAP_BRKPT;
-
-+#ifdef CONFIG_KGDB
-+ /*
-+ * If this is a kernel mode trap, we need to reset db7 to allow us
-+ * to continue sanely ALSO skip the signal delivery
-+ */
-+ if ((regs->xcs & 3) == 0)
-+ goto clear_dr7;
-+
-+ /* if not kernel, allow ints but only if they were on */
-+ if ( regs->eflags & 0x200) local_irq_enable();
-+#endif
- /* If this is a kernel mode trap, save the user PC on entry to
- * the kernel, that's what the debugger can make sense of.
- */
-@@ -584,6 +680,7 @@ clear_dr7:
- __asm__("movl %0,%%db7"
- : /* no output */
- : "r" (0));
-+ CHK_REMOTE_DEBUG(1,SIGTRAP,error_code,regs,)
- return;
-
- debug_vm86:
-@@ -779,19 +876,53 @@ asmlinkage void math_emulate(long arg)
-
- #endif /* CONFIG_MATH_EMULATION */
-
--#ifdef CONFIG_X86_F00F_BUG
--void __init trap_init_f00f_bug(void)
-+void __init trap_init_virtual_IDT(void)
- {
-- __set_fixmap(FIX_F00F_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
--
- /*
-- * Update the IDT descriptor and reload the IDT so that
-- * it uses the read-only mapped virtual address.
-+ * "idt" is magic - it overlaps the idt_descr
-+ * variable so that updating idt will automatically
-+ * update the idt descriptor..
- */
-- idt_descr.address = fix_to_virt(FIX_F00F_IDT);
-+ __set_fixmap(FIX_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
-+ idt_descr.address = __fix_to_virt(FIX_IDT);
-+
- __asm__ __volatile__("lidt %0" : : "m" (idt_descr));
- }
-+
-+void __init trap_init_virtual_GDT(void)
-+{
-+ int cpu = smp_processor_id();
-+ struct Xgt_desc_struct *gdt_desc = cpu_gdt_descr + cpu;
-+ struct Xgt_desc_struct tmp_desc = {0, 0};
-+ struct tss_struct * t;
-+
-+ __asm__ __volatile__("sgdt %0": "=m" (tmp_desc): :"memory");
-+
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ if (!cpu) {
-+ __set_fixmap(FIX_GDT_0, __pa(cpu_gdt_table), PAGE_KERNEL);
-+ __set_fixmap(FIX_GDT_1, __pa(cpu_gdt_table) + PAGE_SIZE, PAGE_KERNEL);
-+ __set_fixmap(FIX_TSS_0, __pa(init_tss), PAGE_KERNEL);
-+ __set_fixmap(FIX_TSS_1, __pa(init_tss) + 1*PAGE_SIZE, PAGE_KERNEL);
-+ __set_fixmap(FIX_TSS_2, __pa(init_tss) + 2*PAGE_SIZE, PAGE_KERNEL);
-+ __set_fixmap(FIX_TSS_3, __pa(init_tss) + 3*PAGE_SIZE, PAGE_KERNEL);
-+ }
-+
-+ gdt_desc->address = __fix_to_virt(FIX_GDT_0) + sizeof(cpu_gdt_table[0]) * cpu;
-+#else
-+ gdt_desc->address = (unsigned long)cpu_gdt_table[cpu];
-+#endif
-+ __asm__ __volatile__("lgdt %0": "=m" (*gdt_desc));
-+
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+ t = (struct tss_struct *) __fix_to_virt(FIX_TSS_0) + cpu;
-+#else
-+ t = init_tss + cpu;
- #endif
-+ set_tss_desc(cpu, t);
-+ cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;
-+ load_TR_desc();
-+}
-
- #define _set_gate(gate_addr,type,dpl,addr,seg) \
- do { \
-@@ -818,20 +949,26 @@ void set_intr_gate(unsigned int n, void
- _set_gate(idt_table+n,14,0,addr,__KERNEL_CS);
- }
-
--static void __init set_trap_gate(unsigned int n, void *addr)
-+void __init set_trap_gate(unsigned int n, void *addr)
- {
- _set_gate(idt_table+n,15,0,addr,__KERNEL_CS);
- }
-
--static void __init set_system_gate(unsigned int n, void *addr)
-+void __init set_system_gate(unsigned int n, void *addr)
- {
- _set_gate(idt_table+n,15,3,addr,__KERNEL_CS);
- }
-
--static void __init set_call_gate(void *a, void *addr)
-+void __init set_call_gate(void *a, void *addr)
- {
- _set_gate(a,12,3,addr,__KERNEL_CS);
- }
-+#ifdef CONFIG_KGDB
-+void set_intr_usr_gate(unsigned int n, void *addr)
-+{
-+ _set_gate(idt_table+n,14,3,addr,__KERNEL_CS);
-+}
-+#endif
-
- static void __init set_task_gate(unsigned int n, unsigned int gdt_entry)
- {
-@@ -850,11 +987,16 @@ void __init trap_init(void)
- #ifdef CONFIG_X86_LOCAL_APIC
- init_apic_mappings();
- #endif
-+ init_entry_mappings();
-
- set_trap_gate(0,÷_error);
- set_intr_gate(1,&debug);
- set_intr_gate(2,&nmi);
-+#ifndef CONFIG_KGDB
- set_system_gate(3,&int3); /* int3-5 can be called from all */
-+#else
-+ set_intr_usr_gate(3,&int3); /* int3-5 can be called from all */
-+#endif
- set_system_gate(4,&overflow);
- set_system_gate(5,&bounds);
- set_trap_gate(6,&invalid_op);
---- linux-2.6.0/arch/i386/kernel/vm86.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/kernel/vm86.c 2003-12-28 23:26:36.000000000 -0800
-@@ -124,7 +124,8 @@ struct pt_regs * save_v86_state(struct k
-
- tss = init_tss + get_cpu();
- current->thread.esp0 = current->thread.saved_esp0;
-- load_esp0(tss, current->thread.esp0);
-+ current->thread.sysenter_cs = __KERNEL_CS;
-+ load_virtual_esp0(tss, current);
- current->thread.saved_esp0 = 0;
- put_cpu();
-
-@@ -301,8 +302,10 @@ static void do_sys_vm86(struct kernel_vm
- asm volatile("movl %%gs,%0":"=m" (tsk->thread.saved_gs));
-
- tss = init_tss + get_cpu();
-- tss->esp0 = tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
-- disable_sysenter(tss);
-+ tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
-+ if (cpu_has_sep)
-+ tsk->thread.sysenter_cs = 0;
-+ load_virtual_esp0(tss, tsk);
- put_cpu();
-
- tsk->thread.screen_bitmap = info->screen_bitmap;
---- linux-2.6.0/arch/i386/kernel/vmlinux.lds.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/vmlinux.lds.S 2003-12-28 23:26:36.000000000 -0800
-@@ -3,6 +3,9 @@
- */
-
- #include <asm-generic/vmlinux.lds.h>
-+#include <linux/config.h>
-+#include <asm/page.h>
-+#include <asm/asm_offsets.h>
-
- OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
- OUTPUT_ARCH(i386)
-@@ -10,7 +13,7 @@ ENTRY(startup_32)
- jiffies = jiffies_64;
- SECTIONS
- {
-- . = 0xC0000000 + 0x100000;
-+ . = __PAGE_OFFSET + 0x100000;
- /* read-only */
- _text = .; /* Text and read-only data */
- .text : {
-@@ -19,6 +22,19 @@ SECTIONS
- *(.gnu.warning)
- } = 0x9090
-
-+#ifdef CONFIG_X86_4G
-+ . = ALIGN(PAGE_SIZE_asm);
-+ __entry_tramp_start = .;
-+ . = FIX_ENTRY_TRAMPOLINE_0_addr;
-+ __start___entry_text = .;
-+ .entry.text : AT (__entry_tramp_start) { *(.entry.text) }
-+ __entry_tramp_end = __entry_tramp_start + SIZEOF(.entry.text);
-+ . = __entry_tramp_end;
-+ . = ALIGN(PAGE_SIZE_asm);
-+#else
-+ .entry.text : { *(.entry.text) }
-+#endif
-+
- _etext = .; /* End of text section */
-
- . = ALIGN(16); /* Exception table */
-@@ -34,15 +50,12 @@ SECTIONS
- CONSTRUCTORS
- }
-
-- . = ALIGN(4096);
-+ . = ALIGN(PAGE_SIZE_asm);
- __nosave_begin = .;
- .data_nosave : { *(.data.nosave) }
-- . = ALIGN(4096);
-+ . = ALIGN(PAGE_SIZE_asm);
- __nosave_end = .;
-
-- . = ALIGN(4096);
-- .data.page_aligned : { *(.data.idt) }
--
- . = ALIGN(32);
- .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-
-@@ -52,7 +65,7 @@ SECTIONS
- .data.init_task : { *(.data.init_task) }
-
- /* will be freed after init */
-- . = ALIGN(4096); /* Init code and data */
-+ . = ALIGN(PAGE_SIZE_asm); /* Init code and data */
- __init_begin = .;
- .init.text : {
- _sinittext = .;
-@@ -91,7 +104,7 @@ SECTIONS
- from .altinstructions and .eh_frame */
- .exit.text : { *(.exit.text) }
- .exit.data : { *(.exit.data) }
-- . = ALIGN(4096);
-+ . = ALIGN(PAGE_SIZE_asm);
- __initramfs_start = .;
- .init.ramfs : { *(.init.ramfs) }
- __initramfs_end = .;
-@@ -99,10 +112,22 @@ SECTIONS
- __per_cpu_start = .;
- .data.percpu : { *(.data.percpu) }
- __per_cpu_end = .;
-- . = ALIGN(4096);
-+ . = ALIGN(PAGE_SIZE_asm);
- __init_end = .;
- /* freed after init ends here */
--
-+
-+ . = ALIGN(PAGE_SIZE_asm);
-+ .data.page_aligned_tss : { *(.data.tss) }
-+
-+ . = ALIGN(PAGE_SIZE_asm);
-+ .data.page_aligned_default_ldt : { *(.data.default_ldt) }
-+
-+ . = ALIGN(PAGE_SIZE_asm);
-+ .data.page_aligned_idt : { *(.data.idt) }
-+
-+ . = ALIGN(PAGE_SIZE_asm);
-+ .data.page_aligned_gdt : { *(.data.gdt) }
-+
- __bss_start = .; /* BSS */
- .bss : { *(.bss) }
- __bss_stop = .;
-@@ -122,4 +147,6 @@ SECTIONS
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
-+
-+
- }
---- linux-2.6.0/arch/i386/kernel/vsyscall.lds 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/vsyscall.lds 2003-12-28 23:26:36.000000000 -0800
-@@ -5,7 +5,7 @@
- */
-
- /* This must match <asm/fixmap.h>. */
--VSYSCALL_BASE = 0xffffe000;
-+VSYSCALL_BASE = 0xffffd000;
-
- SECTIONS
- {
---- linux-2.6.0/arch/i386/kernel/vsyscall-sysenter.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/kernel/vsyscall-sysenter.S 2003-12-28 23:26:36.000000000 -0800
-@@ -7,6 +7,11 @@
- .type __kernel_vsyscall,@function
- __kernel_vsyscall:
- .LSTART_vsyscall:
-+ cmpl $192, %eax
-+ jne 1f
-+ int $0x80
-+ ret
-+1:
- push %ecx
- .Lpush_ecx:
- push %edx
---- linux-2.6.0/arch/i386/lib/checksum.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/lib/checksum.S 2003-12-28 23:26:36.000000000 -0800
-@@ -280,14 +280,14 @@ unsigned int csum_partial_copy_generic (
- .previous
-
- .align 4
--.globl csum_partial_copy_generic
-+.globl direct_csum_partial_copy_generic
-
- #ifndef CONFIG_X86_USE_PPRO_CHECKSUM
-
- #define ARGBASE 16
- #define FP 12
-
--csum_partial_copy_generic:
-+direct_csum_partial_copy_generic:
- subl $4,%esp
- pushl %edi
- pushl %esi
-@@ -422,7 +422,7 @@ DST( movb %cl, (%edi) )
-
- #define ARGBASE 12
-
--csum_partial_copy_generic:
-+direct_csum_partial_copy_generic:
- pushl %ebx
- pushl %edi
- pushl %esi
---- linux-2.6.0/arch/i386/lib/dec_and_lock.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/lib/dec_and_lock.c 2003-12-28 23:26:33.000000000 -0800
-@@ -10,6 +10,7 @@
- #include <linux/spinlock.h>
- #include <asm/atomic.h>
-
-+#ifndef ATOMIC_DEC_AND_LOCK
- int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
- {
- int counter;
-@@ -38,3 +39,5 @@ slow_path:
- spin_unlock(lock);
- return 0;
- }
-+#endif
-+
---- linux-2.6.0/arch/i386/lib/getuser.S 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/lib/getuser.S 2003-12-28 23:26:36.000000000 -0800
-@@ -9,6 +9,7 @@
- * return value.
- */
- #include <asm/thread_info.h>
-+#include <asm/asm_offsets.h>
-
-
- /*
-@@ -28,7 +29,7 @@
- .globl __get_user_1
- __get_user_1:
- GET_THREAD_INFO(%edx)
-- cmpl TI_ADDR_LIMIT(%edx),%eax
-+ cmpl TI_addr_limit(%edx),%eax
- jae bad_get_user
- 1: movzbl (%eax),%edx
- xorl %eax,%eax
-@@ -40,7 +41,7 @@ __get_user_2:
- addl $1,%eax
- jc bad_get_user
- GET_THREAD_INFO(%edx)
-- cmpl TI_ADDR_LIMIT(%edx),%eax
-+ cmpl TI_addr_limit(%edx),%eax
- jae bad_get_user
- 2: movzwl -1(%eax),%edx
- xorl %eax,%eax
-@@ -52,7 +53,7 @@ __get_user_4:
- addl $3,%eax
- jc bad_get_user
- GET_THREAD_INFO(%edx)
-- cmpl TI_ADDR_LIMIT(%edx),%eax
-+ cmpl TI_addr_limit(%edx),%eax
- jae bad_get_user
- 3: movl -3(%eax),%edx
- xorl %eax,%eax
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/i386/lib/kgdb_serial.c 2003-12-28 23:21:09.000000000 -0800
-@@ -0,0 +1,499 @@
-+/*
-+ * Serial interface GDB stub
-+ *
-+ * Written (hacked together) by David Grothe (dave@gcom.com)
-+ * Modified to allow invokation early in boot see also
-+ * kgdb.h for instructions by George Anzinger(george@mvista.com)
-+ * Modified to handle debugging over ethernet by Robert Walsh
-+ * <rjwalsh@durables.org> and wangdi <wangdi@clusterfs.com>, based on
-+ * code by San Mehat.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/timer.h>
-+#include <linux/interrupt.h>
-+#include <linux/tty.h>
-+#include <linux/tty_flip.h>
-+#include <linux/serial.h>
-+#include <linux/serial_reg.h>
-+#include <linux/config.h>
-+#include <linux/major.h>
-+#include <linux/string.h>
-+#include <linux/fcntl.h>
-+#include <linux/ptrace.h>
-+#include <linux/ioport.h>
-+#include <linux/mm.h>
-+#include <linux/init.h>
-+#include <linux/highmem.h>
-+#include <asm/system.h>
-+#include <asm/io.h>
-+#include <asm/segment.h>
-+#include <asm/bitops.h>
-+#include <asm/system.h>
-+#include <asm/kgdb_local.h>
-+#ifdef CONFIG_KGDB_USER_CONSOLE
-+extern void kgdb_console_finit(void);
-+#endif
-+#define PRNT_off
-+#define TEST_EXISTANCE
-+#ifdef PRNT
-+#define dbprintk(s) printk s
-+#else
-+#define dbprintk(s)
-+#endif
-+#define TEST_INTERRUPT_off
-+#ifdef TEST_INTERRUPT
-+#define intprintk(s) printk s
-+#else
-+#define intprintk(s)
-+#endif
-+
-+#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)
-+
-+#define GDB_BUF_SIZE 512 /* power of 2, please */
-+
-+static char gdb_buf[GDB_BUF_SIZE];
-+static int gdb_buf_in_inx;
-+static atomic_t gdb_buf_in_cnt;
-+static int gdb_buf_out_inx;
-+
-+struct async_struct *gdb_async_info;
-+static int gdb_async_irq;
-+
-+#define outb_px(a,b) outb_p(b,a)
-+
-+static void program_uart(struct async_struct *info);
-+static void write_char(struct async_struct *info, int chr);
-+/*
-+ * Get a byte from the hardware data buffer and return it
-+ */
-+static int
-+read_data_bfr(struct async_struct *info)
-+{
-+ char it = inb_p(info->port + UART_LSR);
-+
-+ if (it & UART_LSR_DR)
-+ return (inb_p(info->port + UART_RX));
-+ /*
-+ * If we have a framing error assume somebody messed with
-+ * our uart. Reprogram it and send '-' both ways...
-+ */
-+ if (it & 0xc) {
-+ program_uart(info);
-+ write_char(info, '-');
-+ return ('-');
-+ }
-+ return (-1);
-+
-+} /* read_data_bfr */
-+
-+/*
-+ * Get a char if available, return -1 if nothing available.
-+ * Empty the receive buffer first, then look at the interface hardware.
-+
-+ * Locking here is a bit of a problem. We MUST not lock out communication
-+ * if we are trying to talk to gdb about a kgdb entry. ON the other hand
-+ * we can loose chars in the console pass thru if we don't lock. It is also
-+ * possible that we could hold the lock or be waiting for it when kgdb
-+ * NEEDS to talk. Since kgdb locks down the world, it does not need locks.
-+ * We do, of course have possible issues with interrupting a uart operation,
-+ * but we will just depend on the uart status to help keep that straight.
-+
-+ */
-+static spinlock_t uart_interrupt_lock = SPIN_LOCK_UNLOCKED;
-+#ifdef CONFIG_SMP
-+extern spinlock_t kgdb_spinlock;
-+#endif
-+
-+static int
-+read_char(struct async_struct *info)
-+{
-+ int chr;
-+ unsigned long flags;
-+ local_irq_save(flags);
-+#ifdef CONFIG_SMP
-+ if (!spin_is_locked(&kgdb_spinlock)) {
-+ spin_lock(&uart_interrupt_lock);
-+ }
-+#endif
-+ if (atomic_read(&gdb_buf_in_cnt) != 0) { /* intr routine has q'd chars */
-+ chr = gdb_buf[gdb_buf_out_inx++];
-+ gdb_buf_out_inx &= (GDB_BUF_SIZE - 1);
-+ atomic_dec(&gdb_buf_in_cnt);
-+ } else {
-+ chr = read_data_bfr(info);
-+ }
-+#ifdef CONFIG_SMP
-+ if (!spin_is_locked(&kgdb_spinlock)) {
-+ spin_unlock(&uart_interrupt_lock);
-+ }
-+#endif
-+ local_irq_restore(flags);
-+ return (chr);
-+}
-+
-+/*
-+ * Wait until the interface can accept a char, then write it.
-+ */
-+static void
-+write_char(struct async_struct *info, int chr)
-+{
-+ while (!(inb_p(info->port + UART_LSR) & UART_LSR_THRE)) ;
-+
-+ outb_p(chr, info->port + UART_TX);
-+
-+} /* write_char */
-+
-+/*
-+ * Mostly we don't need a spinlock, but since the console goes
-+ * thru here with interrutps on, well, we need to catch those
-+ * chars.
-+ */
-+/*
-+ * This is the receiver interrupt routine for the GDB stub.
-+ * It will receive a limited number of characters of input
-+ * from the gdb host machine and save them up in a buffer.
-+ *
-+ * When the gdb stub routine tty_getDebugChar() is called it
-+ * draws characters out of the buffer until it is empty and
-+ * then reads directly from the serial port.
-+ *
-+ * We do not attempt to write chars from the interrupt routine
-+ * since the stubs do all of that via tty_putDebugChar() which
-+ * writes one byte after waiting for the interface to become
-+ * ready.
-+ *
-+ * The debug stubs like to run with interrupts disabled since,
-+ * after all, they run as a consequence of a breakpoint in
-+ * the kernel.
-+ *
-+ * Perhaps someone who knows more about the tty driver than I
-+ * care to learn can make this work for any low level serial
-+ * driver.
-+ */
-+static irqreturn_t
-+gdb_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ struct async_struct *info;
-+ unsigned long flags;
-+
-+ info = gdb_async_info;
-+ if (!info || !info->tty || irq != gdb_async_irq)
-+ return IRQ_NONE;
-+
-+ local_irq_save(flags);
-+ spin_lock(&uart_interrupt_lock);
-+ do {
-+ int chr = read_data_bfr(info);
-+ intprintk(("Debug char on int: %x hex\n", chr));
-+ if (chr < 0)
-+ continue;
-+
-+ if (chr == 3) { /* Ctrl-C means remote interrupt */
-+ BREAKPOINT;
-+ continue;
-+ }
-+
-+ if (atomic_read(&gdb_buf_in_cnt) >= GDB_BUF_SIZE) {
-+ /* buffer overflow tosses early char */
-+ read_char(info);
-+ }
-+ gdb_buf[gdb_buf_in_inx++] = chr;
-+ gdb_buf_in_inx &= (GDB_BUF_SIZE - 1);
-+ } while (inb_p(info->port + UART_IIR) & UART_IIR_RDI);
-+ spin_unlock(&uart_interrupt_lock);
-+ local_irq_restore(flags);
-+ return IRQ_HANDLED;
-+} /* gdb_interrupt */
-+
-+/*
-+ * Just a NULL routine for testing.
-+ */
-+void
-+gdb_null(void)
-+{
-+} /* gdb_null */
-+
-+/* These structure are filled in with values defined in asm/kgdb_local.h
-+ */
-+static struct serial_state state = SB_STATE;
-+static struct async_struct local_info = SB_INFO;
-+static int ok_to_enable_ints = 0;
-+static void kgdb_enable_ints_now(void);
-+
-+extern char *kgdb_version;
-+/*
-+ * Hook an IRQ for KGDB.
-+ *
-+ * This routine is called from tty_putDebugChar, below.
-+ */
-+static int ints_disabled = 1;
-+int
-+gdb_hook_interrupt(struct async_struct *info, int verb)
-+{
-+ struct serial_state *state = info->state;
-+ unsigned long flags;
-+ int port;
-+#ifdef TEST_EXISTANCE
-+ int scratch, scratch2;
-+#endif
-+
-+ /* The above fails if memory managment is not set up yet.
-+ * Rather than fail the set up, just keep track of the fact
-+ * and pick up the interrupt thing later.
-+ */
-+ gdb_async_info = info;
-+ port = gdb_async_info->port;
-+ gdb_async_irq = state->irq;
-+ if (verb) {
-+ printk("kgdb %s : port =%x, IRQ=%d, divisor =%d\n",
-+ kgdb_version,
-+ port,
-+ gdb_async_irq, gdb_async_info->state->custom_divisor);
-+ }
-+ local_irq_save(flags);
-+#ifdef TEST_EXISTANCE
-+ /* Existance test */
-+ /* Should not need all this, but just in case.... */
-+
-+ scratch = inb_p(port + UART_IER);
-+ outb_px(port + UART_IER, 0);
-+ outb_px(0xff, 0x080);
-+ scratch2 = inb_p(port + UART_IER);
-+ outb_px(port + UART_IER, scratch);
-+ if (scratch2) {
-+ printk
-+ ("gdb_hook_interrupt: Could not clear IER, not a UART!\n");
-+ local_irq_restore(flags);
-+ return 1; /* We failed; there's nothing here */
-+ }
-+ scratch2 = inb_p(port + UART_LCR);
-+ outb_px(port + UART_LCR, 0xBF); /* set up for StarTech test */
-+ outb_px(port + UART_EFR, 0); /* EFR is the same as FCR */
-+ outb_px(port + UART_LCR, 0);
-+ outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO);
-+ scratch = inb_p(port + UART_IIR) >> 6;
-+ if (scratch == 1) {
-+ printk("gdb_hook_interrupt: Undefined UART type!"
-+ " Not a UART! \n");
-+ local_irq_restore(flags);
-+ return 1;
-+ } else {
-+ dbprintk(("gdb_hook_interrupt: UART type "
-+ "is %d where 0=16450, 2=16550 3=16550A\n", scratch));
-+ }
-+ scratch = inb_p(port + UART_MCR);
-+ outb_px(port + UART_MCR, UART_MCR_LOOP | scratch);
-+ outb_px(port + UART_MCR, UART_MCR_LOOP | 0x0A);
-+ scratch2 = inb_p(port + UART_MSR) & 0xF0;
-+ outb_px(port + UART_MCR, scratch);
-+ if (scratch2 != 0x90) {
-+ printk("gdb_hook_interrupt: "
-+ "Loop back test failed! Not a UART!\n");
-+ local_irq_restore(flags);
-+ return scratch2 + 1000; /* force 0 to fail */
-+ }
-+#endif /* test existance */
-+ program_uart(info);
-+ local_irq_restore(flags);
-+
-+ return (0);
-+
-+} /* gdb_hook_interrupt */
-+
-+static void
-+program_uart(struct async_struct *info)
-+{
-+ int port = info->port;
-+
-+ (void) inb_p(port + UART_RX);
-+ outb_px(port + UART_IER, 0);
-+
-+ (void) inb_p(port + UART_RX); /* serial driver comments say */
-+ (void) inb_p(port + UART_IIR); /* this clears the interrupt regs */
-+ (void) inb_p(port + UART_MSR);
-+ outb_px(port + UART_LCR, UART_LCR_WLEN8 | UART_LCR_DLAB);
-+ outb_px(port + UART_DLL, info->state->custom_divisor & 0xff); /* LS */
-+ outb_px(port + UART_DLM, info->state->custom_divisor >> 8); /* MS */
-+ outb_px(port + UART_MCR, info->MCR);
-+
-+ outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1 | UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR); /* set fcr */
-+ outb_px(port + UART_LCR, UART_LCR_WLEN8); /* reset DLAB */
-+ outb_px(port + UART_FCR, UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1); /* set fcr */
-+ if (!ints_disabled) {
-+ intprintk(("KGDB: Sending %d to port %x offset %d\n",
-+ gdb_async_info->IER,
-+ (int) gdb_async_info->port, UART_IER));
-+ outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
-+ }
-+ return;
-+}
-+
-+/*
-+ * tty_getDebugChar
-+ *
-+ * This is a GDB stub routine. It waits for a character from the
-+ * serial interface and then returns it. If there is no serial
-+ * interface connection then it returns a bogus value which will
-+ * almost certainly cause the system to hang. In the
-+ */
-+int kgdb_in_isr = 0;
-+int kgdb_in_lsr = 0;
-+extern spinlock_t kgdb_spinlock;
-+
-+/* Caller takes needed protections */
-+
-+int
-+tty_getDebugChar(void)
-+{
-+ volatile int chr, dum, time, end_time;
-+
-+ dbprintk(("tty_getDebugChar(port %x): ", gdb_async_info->port));
-+
-+ if (gdb_async_info == NULL) {
-+ gdb_hook_interrupt(&local_info, 0);
-+ }
-+ /*
-+ * This trick says if we wait a very long time and get
-+ * no char, return the -1 and let the upper level deal
-+ * with it.
-+ */
-+ rdtsc(dum, time);
-+ end_time = time + 2;
-+ while (((chr = read_char(gdb_async_info)) == -1) &&
-+ (end_time - time) > 0) {
-+ rdtsc(dum, time);
-+ };
-+ /*
-+ * This covers our butts if some other code messes with
-+ * our uart, hay, it happens :o)
-+ */
-+ if (chr == -1)
-+ program_uart(gdb_async_info);
-+
-+ dbprintk(("%c\n", chr > ' ' && chr < 0x7F ? chr : ' '));
-+ return (chr);
-+
-+} /* tty_getDebugChar */
-+
-+static int count = 3;
-+static spinlock_t one_at_atime = SPIN_LOCK_UNLOCKED;
-+
-+static int __init
-+kgdb_enable_ints(void)
-+{
-+ if (kgdboe) {
-+ return 0;
-+ }
-+ if (gdb_async_info == NULL) {
-+ gdb_hook_interrupt(&local_info, 1);
-+ }
-+ ok_to_enable_ints = 1;
-+ kgdb_enable_ints_now();
-+#ifdef CONFIG_KGDB_USER_CONSOLE
-+ kgdb_console_finit();
-+#endif
-+ return 0;
-+}
-+
-+#ifdef CONFIG_SERIAL_8250
-+void shutdown_for_kgdb(struct async_struct *gdb_async_info);
-+#endif
-+
-+#ifdef CONFIG_DISCONTIGMEM
-+static inline int kgdb_mem_init_done(void)
-+{
-+ return highmem_start_page != NULL;
-+}
-+#else
-+static inline int kgdb_mem_init_done(void)
-+{
-+ return max_mapnr != 0;
-+}
-+#endif
-+
-+static void
-+kgdb_enable_ints_now(void)
-+{
-+ if (!spin_trylock(&one_at_atime))
-+ return;
-+ if (!ints_disabled)
-+ goto exit;
-+ if (kgdb_mem_init_done() &&
-+ ints_disabled) { /* don't try till mem init */
-+#ifdef CONFIG_SERIAL_8250
-+ /*
-+ * The ifdef here allows the system to be configured
-+ * without the serial driver.
-+ * Don't make it a module, however, it will steal the port
-+ */
-+ shutdown_for_kgdb(gdb_async_info);
-+#endif
-+ ints_disabled = request_irq(gdb_async_info->state->irq,
-+ gdb_interrupt,
-+ IRQ_T(gdb_async_info),
-+ "KGDB-stub", NULL);
-+ intprintk(("KGDB: request_irq returned %d\n", ints_disabled));
-+ }
-+ if (!ints_disabled) {
-+ intprintk(("KGDB: Sending %d to port %x offset %d\n",
-+ gdb_async_info->IER,
-+ (int) gdb_async_info->port, UART_IER));
-+ outb_px(gdb_async_info->port + UART_IER, gdb_async_info->IER);
-+ }
-+ exit:
-+ spin_unlock(&one_at_atime);
-+}
-+
-+/*
-+ * tty_putDebugChar
-+ *
-+ * This is a GDB stub routine. It waits until the interface is ready
-+ * to transmit a char and then sends it. If there is no serial
-+ * interface connection then it simply returns to its caller, having
-+ * pretended to send the char. Caller takes needed protections.
-+ */
-+void
-+tty_putDebugChar(int chr)
-+{
-+ dbprintk(("tty_putDebugChar(port %x): chr=%02x '%c', ints_on=%d\n",
-+ gdb_async_info->port,
-+ chr,
-+ chr > ' ' && chr < 0x7F ? chr : ' ', ints_disabled ? 0 : 1));
-+
-+ if (gdb_async_info == NULL) {
-+ gdb_hook_interrupt(&local_info, 0);
-+ }
-+
-+ write_char(gdb_async_info, chr); /* this routine will wait */
-+ count = (chr == '#') ? 0 : count + 1;
-+ if ((count == 2)) { /* try to enable after */
-+ if (ints_disabled & ok_to_enable_ints)
-+ kgdb_enable_ints_now(); /* try to enable after */
-+
-+ /* We do this a lot because, well we really want to get these
-+ * interrupts. The serial driver will clear these bits when it
-+ * initializes the chip. Every thing else it does is ok,
-+ * but this.
-+ */
-+ if (!ints_disabled) {
-+ outb_px(gdb_async_info->port + UART_IER,
-+ gdb_async_info->IER);
-+ }
-+ }
-+
-+} /* tty_putDebugChar */
-+
-+/*
-+ * This does nothing for the serial port, since it doesn't buffer.
-+ */
-+
-+void tty_flushDebugChar(void)
-+{
-+}
-+
-+module_init(kgdb_enable_ints);
---- linux-2.6.0/arch/i386/lib/Makefile 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/lib/Makefile 2003-12-28 23:21:06.000000000 -0800
-@@ -9,4 +9,5 @@ lib-y = checksum.o delay.o \
-
- lib-$(CONFIG_X86_USE_3DNOW) += mmx.o
- lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
-+lib-$(CONFIG_KGDB) += kgdb_serial.o
- lib-$(CONFIG_DEBUG_IOVIRT) += iodebug.o
---- linux-2.6.0/arch/i386/lib/usercopy.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/lib/usercopy.c 2003-12-28 23:26:36.000000000 -0800
-@@ -76,7 +76,7 @@ do { \
- * and returns @count.
- */
- long
--__strncpy_from_user(char *dst, const char __user *src, long count)
-+__direct_strncpy_from_user(char *dst, const char __user *src, long count)
- {
- long res;
- __do_strncpy_from_user(dst, src, count, res);
-@@ -102,7 +102,7 @@ __strncpy_from_user(char *dst, const cha
- * and returns @count.
- */
- long
--strncpy_from_user(char *dst, const char __user *src, long count)
-+direct_strncpy_from_user(char *dst, const char __user *src, long count)
- {
- long res = -EFAULT;
- if (access_ok(VERIFY_READ, src, 1))
-@@ -147,7 +147,7 @@ do { \
- * On success, this will be zero.
- */
- unsigned long
--clear_user(void __user *to, unsigned long n)
-+direct_clear_user(void __user *to, unsigned long n)
- {
- might_sleep();
- if (access_ok(VERIFY_WRITE, to, n))
-@@ -167,7 +167,7 @@ clear_user(void __user *to, unsigned lon
- * On success, this will be zero.
- */
- unsigned long
--__clear_user(void __user *to, unsigned long n)
-+__direct_clear_user(void __user *to, unsigned long n)
- {
- __do_clear_user(to, n);
- return n;
-@@ -184,7 +184,7 @@ __clear_user(void __user *to, unsigned l
- * On exception, returns 0.
- * If the string is too long, returns a value greater than @n.
- */
--long strnlen_user(const char __user *s, long n)
-+long direct_strnlen_user(const char __user *s, long n)
- {
- unsigned long mask = -__addr_ok(s);
- unsigned long res, tmp;
-@@ -541,8 +541,10 @@ survive:
- goto survive;
- }
-
-- if (retval != 1)
-+ if (retval != 1) {
-+ up_read(¤t->mm->mmap_sem);
- break;
-+ }
-
- maddr = kmap_atomic(pg, KM_USER0);
- memcpy(maddr + offset, from, len);
-@@ -573,3 +575,4 @@ unsigned long __copy_from_user_ll(void *
- n = __copy_user_zeroing_intel(to, (const void *) from, n);
- return n;
- }
-+
---- linux-2.6.0/arch/i386/mach-es7000/es7000.c 2003-06-16 22:32:20.000000000 -0700
-+++ 25/arch/i386/mach-es7000/es7000.c 2003-12-28 23:21:33.000000000 -0800
-@@ -51,8 +51,6 @@ struct mip_reg *host_reg;
- int mip_port;
- unsigned long mip_addr, host_addr;
-
--static int es7000_plat;
--
- /*
- * Parse the OEM Table
- */
---- linux-2.6.0/arch/i386/Makefile 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/Makefile 2003-12-28 23:21:06.000000000 -0800
-@@ -84,6 +84,9 @@ mcore-$(CONFIG_X86_ES7000) := mach-es700
- # default subarch .h files
- mflags-y += -Iinclude/asm-i386/mach-default
-
-+mflags-$(CONFIG_KGDB) += -gdwarf-2
-+mflags-$(CONFIG_KGDB_MORE) += $(shell echo $(CONFIG_KGDB_OPTIONS) | sed -e 's/"//g')
-+
- head-y := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
-
- libs-y += arch/i386/lib/
---- linux-2.6.0/arch/i386/math-emu/fpu_system.h 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/math-emu/fpu_system.h 2003-12-28 23:26:36.000000000 -0800
-@@ -15,6 +15,7 @@
- #include <linux/sched.h>
- #include <linux/kernel.h>
- #include <linux/mm.h>
-+#include <asm/atomic_kmap.h>
-
- /* This sets the pointer FPU_info to point to the argument part
- of the stack frame of math_emulate() */
-@@ -22,7 +23,7 @@
-
- /* s is always from a cpu register, and the cpu does bounds checking
- * during register load --> no further bounds checks needed */
--#define LDT_DESCRIPTOR(s) (((struct desc_struct *)current->mm->context.ldt)[(s) >> 3])
-+#define LDT_DESCRIPTOR(s) (((struct desc_struct *)__kmap_atomic_vaddr(KM_LDT_PAGE0))[(s) >> 3])
- #define SEG_D_SIZE(x) ((x).b & (3 << 21))
- #define SEG_G_BIT(x) ((x).b & (1 << 23))
- #define SEG_GRANULARITY(x) (((x).b & (1 << 23)) ? 4096 : 1)
---- linux-2.6.0/arch/i386/mm/extable.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/mm/extable.c 2003-12-28 23:26:36.000000000 -0800
-@@ -6,6 +6,52 @@
- #include <linux/module.h>
- #include <linux/spinlock.h>
- #include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+
-+extern struct exception_table_entry __start___ex_table[];
-+extern struct exception_table_entry __stop___ex_table[];
-+
-+/*
-+ * The exception table needs to be sorted because we use the macros
-+ * which put things into the exception table in a variety of sections
-+ * as well as the init section and the main kernel text section.
-+ */
-+static inline void
-+sort_ex_table(struct exception_table_entry *start,
-+ struct exception_table_entry *finish)
-+{
-+ struct exception_table_entry el, *p, *q;
-+
-+ /* insertion sort */
-+ for (p = start + 1; p < finish; ++p) {
-+ /* start .. p-1 is sorted */
-+ if (p[0].insn < p[-1].insn) {
-+ /* move element p down to its right place */
-+ el = *p;
-+ q = p;
-+ do {
-+ /* el comes before q[-1], move q[-1] up one */
-+ q[0] = q[-1];
-+ --q;
-+ } while (q > start && el.insn < q[-1].insn);
-+ *q = el;
-+ }
-+ }
-+}
-+
-+void fixup_sort_exception_table(void)
-+{
-+ struct exception_table_entry *p;
-+
-+ /*
-+ * Fix up the trampoline exception addresses:
-+ */
-+ for (p = __start___ex_table; p < __stop___ex_table; p++) {
-+ p->insn = (unsigned long)(void *)p->insn;
-+ p->fixup = (unsigned long)(void *)p->fixup;
-+ }
-+ sort_ex_table(__start___ex_table, __stop___ex_table);
-+}
-
- /* Simple binary search */
- const struct exception_table_entry *
-@@ -15,13 +61,15 @@ search_extable(const struct exception_ta
- {
- while (first <= last) {
- const struct exception_table_entry *mid;
-- long diff;
-
- mid = (last - first) / 2 + first;
-- diff = mid->insn - value;
-- if (diff == 0)
-+ /*
-+ * careful, the distance between entries can be
-+ * larger than 2GB:
-+ */
-+ if (mid->insn == value)
- return mid;
-- else if (diff < 0)
-+ else if (mid->insn < value)
- first = mid+1;
- else
- last = mid-1;
---- linux-2.6.0/arch/i386/mm/fault.c 2003-12-17 21:20:01.000000000 -0800
-+++ 25/arch/i386/mm/fault.c 2003-12-28 23:26:36.000000000 -0800
-@@ -27,6 +27,7 @@
- #include <asm/pgalloc.h>
- #include <asm/hardirq.h>
- #include <asm/desc.h>
-+#include <asm/tlbflush.h>
-
- extern void die(const char *,struct pt_regs *,long);
-
-@@ -104,8 +105,17 @@ static inline unsigned long get_segment_
- if (seg & (1<<2)) {
- /* Must lock the LDT while reading it. */
- down(¤t->mm->context.sem);
-+#if 1
-+ /* horrible hack for 4/4 disabled kernels.
-+ I'm not quite sure what the TLB flush is good for,
-+ it's mindlessly copied from the read_ldt code */
-+ __flush_tlb_global();
-+ desc = kmap(current->mm->context.ldt_pages[(seg&~7)/PAGE_SIZE]);
-+ desc = (void *)desc + ((seg & ~7) % PAGE_SIZE);
-+#else
- desc = current->mm->context.ldt;
- desc = (void *)desc + (seg & ~7);
-+#endif
- } else {
- /* Must disable preemption while reading the GDT. */
- desc = (u32 *)&cpu_gdt_table[get_cpu()];
-@@ -118,6 +128,9 @@ static inline unsigned long get_segment_
- (desc[1] & 0xff000000);
-
- if (seg & (1<<2)) {
-+#if 1
-+ kunmap((void *)((unsigned long)desc & PAGE_MASK));
-+#endif
- up(¤t->mm->context.sem);
- } else
- put_cpu();
-@@ -243,6 +256,19 @@ asmlinkage void do_page_fault(struct pt_
- * (error_code & 4) == 0, and that the fault was not a
- * protection error (error_code & 1) == 0.
- */
-+#ifdef CONFIG_X86_4G
-+ /*
-+ * On 4/4 all kernels faults are either bugs, vmalloc or prefetch
-+ */
-+ if (unlikely((regs->xcs & 3) == 0)) {
-+ if (error_code & 3)
-+ goto bad_area_nosemaphore;
-+
-+ /* If it's vm86 fall through */
-+ if (!(regs->eflags & VM_MASK))
-+ goto vmalloc_fault;
-+ }
-+#else
- if (unlikely(address >= TASK_SIZE)) {
- if (!(error_code & 5))
- goto vmalloc_fault;
-@@ -252,6 +278,7 @@ asmlinkage void do_page_fault(struct pt_
- */
- goto bad_area_nosemaphore;
- }
-+#endif
-
- mm = tsk->mm;
-
-@@ -403,6 +430,12 @@ no_context:
- * Oops. The kernel tried to access some bad page. We'll have to
- * terminate things with extreme prejudice.
- */
-+#ifdef CONFIG_KGDB
-+ if (!user_mode(regs)){
-+ kgdb_handle_exception(14,SIGBUS, error_code, regs);
-+ return;
-+ }
-+#endif
-
- bust_spinlocks(1);
-
---- linux-2.6.0/arch/i386/mm/highmem.c 2003-06-14 12:18:22.000000000 -0700
-+++ 25/arch/i386/mm/highmem.c 2003-12-28 23:22:58.000000000 -0800
-@@ -30,6 +30,7 @@ void *kmap_atomic(struct page *page, enu
- enum fixed_addresses idx;
- unsigned long vaddr;
-
-+ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
- inc_preempt_count();
- if (page < highmem_start_page)
- return page_address(page);
-@@ -54,6 +55,7 @@ void kunmap_atomic(void *kvaddr, enum km
-
- if (vaddr < FIXADDR_START) { // FIXME
- dec_preempt_count();
-+ preempt_check_resched();
- return;
- }
-
-@@ -69,6 +71,7 @@ void kunmap_atomic(void *kvaddr, enum km
- #endif
-
- dec_preempt_count();
-+ preempt_check_resched();
- }
-
- struct page *kmap_atomic_to_page(void *ptr)
---- linux-2.6.0/arch/i386/mm/hugetlbpage.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/mm/hugetlbpage.c 2003-12-28 23:22:12.000000000 -0800
-@@ -534,7 +534,7 @@ int is_hugepage_mem_enough(size_t size)
- * this far.
- */
- static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-- unsigned long address, int unused)
-+ unsigned long address, int *unused)
- {
- BUG();
- return NULL;
---- linux-2.6.0/arch/i386/mm/init.c 2003-11-09 16:45:04.000000000 -0800
-+++ 25/arch/i386/mm/init.c 2003-12-28 23:26:36.000000000 -0800
-@@ -26,6 +26,7 @@
- #include <linux/bootmem.h>
- #include <linux/slab.h>
- #include <linux/proc_fs.h>
-+#include <linux/efi.h>
-
- #include <asm/processor.h>
- #include <asm/system.h>
-@@ -39,125 +40,13 @@
- #include <asm/tlb.h>
- #include <asm/tlbflush.h>
- #include <asm/sections.h>
-+#include <asm/desc.h>
-
- DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
- unsigned long highstart_pfn, highend_pfn;
-
- static int do_test_wp_bit(void);
-
--/*
-- * Creates a middle page table and puts a pointer to it in the
-- * given global directory entry. This only returns the gd entry
-- * in non-PAE compilation mode, since the middle layer is folded.
-- */
--static pmd_t * __init one_md_table_init(pgd_t *pgd)
--{
-- pmd_t *pmd_table;
--
--#ifdef CONFIG_X86_PAE
-- pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-- set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
-- if (pmd_table != pmd_offset(pgd, 0))
-- BUG();
--#else
-- pmd_table = pmd_offset(pgd, 0);
--#endif
--
-- return pmd_table;
--}
--
--/*
-- * Create a page table and place a pointer to it in a middle page
-- * directory entry.
-- */
--static pte_t * __init one_page_table_init(pmd_t *pmd)
--{
-- if (pmd_none(*pmd)) {
-- pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-- set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
-- if (page_table != pte_offset_kernel(pmd, 0))
-- BUG();
--
-- return page_table;
-- }
--
-- return pte_offset_kernel(pmd, 0);
--}
--
--/*
-- * This function initializes a certain range of kernel virtual memory
-- * with new bootmem page tables, everywhere page tables are missing in
-- * the given range.
-- */
--
--/*
-- * NOTE: The pagetables are allocated contiguous on the physical space
-- * so we can cache the place of the first one and move around without
-- * checking the pgd every time.
-- */
--static void __init page_table_range_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
--{
-- pgd_t *pgd;
-- pmd_t *pmd;
-- int pgd_idx, pmd_idx;
-- unsigned long vaddr;
--
-- vaddr = start;
-- pgd_idx = pgd_index(vaddr);
-- pmd_idx = pmd_index(vaddr);
-- pgd = pgd_base + pgd_idx;
--
-- for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) {
-- if (pgd_none(*pgd))
-- one_md_table_init(pgd);
--
-- pmd = pmd_offset(pgd, vaddr);
-- for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) {
-- if (pmd_none(*pmd))
-- one_page_table_init(pmd);
--
-- vaddr += PMD_SIZE;
-- }
-- pmd_idx = 0;
-- }
--}
--
--/*
-- * This maps the physical memory to kernel virtual address space, a total
-- * of max_low_pfn pages, by creating page tables starting from address
-- * PAGE_OFFSET.
-- */
--static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
--{
-- unsigned long pfn;
-- pgd_t *pgd;
-- pmd_t *pmd;
-- pte_t *pte;
-- int pgd_idx, pmd_idx, pte_ofs;
--
-- pgd_idx = pgd_index(PAGE_OFFSET);
-- pgd = pgd_base + pgd_idx;
-- pfn = 0;
--
-- for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) {
-- pmd = one_md_table_init(pgd);
-- if (pfn >= max_low_pfn)
-- continue;
-- for (pmd_idx = 0; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++) {
-- /* Map with big pages if possible, otherwise create normal page tables. */
-- if (cpu_has_pse) {
-- set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
-- pfn += PTRS_PER_PTE;
-- } else {
-- pte = one_page_table_init(pmd);
--
-- for (pte_ofs = 0; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++)
-- set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
-- }
-- }
-- }
--}
--
- static inline int page_kills_ppro(unsigned long pagenr)
- {
- if (pagenr >= 0x70000 && pagenr <= 0x7003F)
-@@ -165,12 +54,30 @@ static inline int page_kills_ppro(unsign
- return 0;
- }
-
-+extern int is_available_memory(efi_memory_desc_t *);
-+
- static inline int page_is_ram(unsigned long pagenr)
- {
- int i;
-+ unsigned long addr, end;
-+
-+ if (efi_enabled) {
-+ efi_memory_desc_t *md;
-+
-+ for (i = 0; i < memmap.nr_map; i++) {
-+ md = &memmap.map[i];
-+ if (!is_available_memory(md))
-+ continue;
-+ addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT;
-+ end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT;
-+
-+ if ((pagenr >= addr) && (pagenr < end))
-+ return 1;
-+ }
-+ return 0;
-+ }
-
- for (i = 0; i < e820.nr_map; i++) {
-- unsigned long addr, end;
-
- if (e820.map[i].type != E820_RAM) /* not usable memory */
- continue;
-@@ -187,11 +94,8 @@ static inline int page_is_ram(unsigned l
- return 0;
- }
-
--#ifdef CONFIG_HIGHMEM
- pte_t *kmap_pte;
--pgprot_t kmap_prot;
-
--EXPORT_SYMBOL(kmap_prot);
- EXPORT_SYMBOL(kmap_pte);
-
- #define kmap_get_fixmap_pte(vaddr) \
-@@ -199,29 +103,7 @@ EXPORT_SYMBOL(kmap_pte);
-
- void __init kmap_init(void)
- {
-- unsigned long kmap_vstart;
--
-- /* cache the first kmap pte */
-- kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
-- kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
--
-- kmap_prot = PAGE_KERNEL;
--}
--
--void __init permanent_kmaps_init(pgd_t *pgd_base)
--{
-- pgd_t *pgd;
-- pmd_t *pmd;
-- pte_t *pte;
-- unsigned long vaddr;
--
-- vaddr = PKMAP_BASE;
-- page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
--
-- pgd = swapper_pg_dir + pgd_index(vaddr);
-- pmd = pmd_offset(pgd, vaddr);
-- pte = pte_offset_kernel(pmd, vaddr);
-- pkmap_page_table = pte;
-+ kmap_pte = kmap_get_fixmap_pte(__fix_to_virt(FIX_KMAP_BEGIN));
- }
-
- void __init one_highpage_init(struct page *page, int pfn, int bad_ppro)
-@@ -236,6 +118,8 @@ void __init one_highpage_init(struct pag
- SetPageReserved(page);
- }
-
-+#ifdef CONFIG_HIGHMEM
-+
- #ifndef CONFIG_DISCONTIGMEM
- void __init set_highmem_pages_init(int bad_ppro)
- {
-@@ -247,12 +131,9 @@ void __init set_highmem_pages_init(int b
- #else
- extern void set_highmem_pages_init(int);
- #endif /* !CONFIG_DISCONTIGMEM */
--
- #else
--#define kmap_init() do { } while (0)
--#define permanent_kmaps_init(pgd_base) do { } while (0)
--#define set_highmem_pages_init(bad_ppro) do { } while (0)
--#endif /* CONFIG_HIGHMEM */
-+# define set_highmem_pages_init(bad_ppro) do { } while (0)
-+#endif
-
- unsigned long __PAGE_KERNEL = _PAGE_KERNEL;
-
-@@ -262,30 +143,125 @@ unsigned long __PAGE_KERNEL = _PAGE_KERN
- extern void __init remap_numa_kva(void);
- #endif
-
--static void __init pagetable_init (void)
-+static __init void prepare_pagetables(pgd_t *pgd_base, unsigned long address)
-+{
-+ pgd_t *pgd;
-+ pmd_t *pmd;
-+ pte_t *pte;
-+
-+ pgd = pgd_base + pgd_index(address);
-+ pmd = pmd_offset(pgd, address);
-+ if (!pmd_present(*pmd)) {
-+ pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-+ set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)));
-+ }
-+}
-+
-+static void __init fixrange_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
-+{
-+ unsigned long vaddr;
-+
-+ for (vaddr = start; vaddr != end; vaddr += PAGE_SIZE)
-+ prepare_pagetables(pgd_base, vaddr);
-+}
-+
-+void setup_identity_mappings(pgd_t *pgd_base, unsigned long start, unsigned long end)
- {
- unsigned long vaddr;
-- pgd_t *pgd_base = swapper_pg_dir;
-+ pgd_t *pgd;
-+ int i, j, k;
-+ pmd_t *pmd;
-+ pte_t *pte, *pte_base;
-+
-+ pgd = pgd_base;
-+
-+ for (i = 0; i < PTRS_PER_PGD; pgd++, i++) {
-+ vaddr = i*PGDIR_SIZE;
-+ if (end && (vaddr >= end))
-+ break;
-+ pmd = pmd_offset(pgd, 0);
-+ for (j = 0; j < PTRS_PER_PMD; pmd++, j++) {
-+ vaddr = i*PGDIR_SIZE + j*PMD_SIZE;
-+ if (end && (vaddr >= end))
-+ break;
-+ if (vaddr < start)
-+ continue;
-+ if (cpu_has_pse) {
-+ unsigned long __pe;
-+
-+ set_in_cr4(X86_CR4_PSE);
-+ boot_cpu_data.wp_works_ok = 1;
-+ __pe = _KERNPG_TABLE + _PAGE_PSE + vaddr - start;
-+ /* Make it "global" too if supported */
-+ if (cpu_has_pge) {
-+ set_in_cr4(X86_CR4_PGE);
-+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
-+ __pe += _PAGE_GLOBAL;
-+ __PAGE_KERNEL |= _PAGE_GLOBAL;
-+#endif
-+ }
-+ set_pmd(pmd, __pmd(__pe));
-+ continue;
-+ }
-+ if (!pmd_present(*pmd))
-+ pte_base = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-+ else
-+ pte_base = (pte_t *) page_address(pmd_page(*pmd));
-+ pte = pte_base;
-+ for (k = 0; k < PTRS_PER_PTE; pte++, k++) {
-+ vaddr = i*PGDIR_SIZE + j*PMD_SIZE + k*PAGE_SIZE;
-+ if (end && (vaddr >= end))
-+ break;
-+ if (vaddr < start)
-+ continue;
-+ *pte = mk_pte_phys(vaddr-start, PAGE_KERNEL);
-+ }
-+ set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte_base)));
-+ }
-+ }
-+}
-
-+static void __init pagetable_init (void)
-+{
-+ unsigned long vaddr, end;
-+ pgd_t *pgd_base;
- #ifdef CONFIG_X86_PAE
- int i;
-- /* Init entries of the first-level page table to the zero page */
-- for (i = 0; i < PTRS_PER_PGD; i++)
-- set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
- #endif
-
-- /* Enable PSE if available */
-- if (cpu_has_pse) {
-- set_in_cr4(X86_CR4_PSE);
-- }
-+ /*
-+ * This can be zero as well - no problem, in that case we exit
-+ * the loops anyway due to the PTRS_PER_* conditions.
-+ */
-+ end = (unsigned long)__va(max_low_pfn*PAGE_SIZE);
-
-- /* Enable PGE if available */
-- if (cpu_has_pge) {
-- set_in_cr4(X86_CR4_PGE);
-- __PAGE_KERNEL |= _PAGE_GLOBAL;
-+ pgd_base = swapper_pg_dir;
-+#ifdef CONFIG_X86_PAE
-+ /*
-+ * It causes too many problems if there's no proper pmd set up
-+ * for all 4 entries of the PGD - so we allocate all of them.
-+ * PAE systems will not miss this extra 4-8K anyway ...
-+ */
-+ for (i = 0; i < PTRS_PER_PGD; i++) {
-+ pmd_t *pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-+ set_pgd(pgd_base + i, __pgd(__pa(pmd) + 0x1));
- }
-+#endif
-+ /*
-+ * Set up lowmem-sized identity mappings at PAGE_OFFSET:
-+ */
-+ setup_identity_mappings(pgd_base, PAGE_OFFSET, end);
-
-- kernel_physical_mapping_init(pgd_base);
-+ /*
-+ * Add flat-mode identity-mappings - SMP needs it when
-+ * starting up on an AP from real-mode. (In the non-PAE
-+ * case we already have these mappings through head.S.)
-+ * All user-space mappings are explicitly cleared after
-+ * SMP startup.
-+ */
-+#if CONFIG_SMP && CONFIG_X86_PAE
-+ setup_identity_mappings(pgd_base, 0, 16*1024*1024);
-+#endif
- remap_numa_kva();
-
- /*
-@@ -293,38 +269,64 @@ static void __init pagetable_init (void)
- * created - mappings will be set by set_fixmap():
- */
- vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
-- page_table_range_init(vaddr, 0, pgd_base);
-+ fixrange_init(vaddr, 0, pgd_base);
-
-- permanent_kmaps_init(pgd_base);
-+#if CONFIG_HIGHMEM
-+ {
-+ pgd_t *pgd;
-+ pmd_t *pmd;
-+ pte_t *pte;
-
--#ifdef CONFIG_X86_PAE
-- /*
-- * Add low memory identity-mappings - SMP needs it when
-- * starting up on an AP from real-mode. In the non-PAE
-- * case we already have these mappings through head.S.
-- * All user-space mappings are explicitly cleared after
-- * SMP startup.
-- */
-- pgd_base[0] = pgd_base[USER_PTRS_PER_PGD];
-+ /*
-+ * Permanent kmaps:
-+ */
-+ vaddr = PKMAP_BASE;
-+ fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
-+
-+ pgd = swapper_pg_dir + pgd_index(vaddr);
-+ pmd = pmd_offset(pgd, vaddr);
-+ pte = pte_offset_kernel(pmd, vaddr);
-+ pkmap_page_table = pte;
-+ }
- #endif
- }
-
--void zap_low_mappings (void)
-+/*
-+ * Clear kernel pagetables in a PMD_SIZE-aligned range.
-+ */
-+static void clear_mappings(pgd_t *pgd_base, unsigned long start, unsigned long end)
- {
-- int i;
-+ unsigned long vaddr;
-+ pgd_t *pgd;
-+ pmd_t *pmd;
-+ int i, j;
-+
-+ pgd = pgd_base;
-+
-+ for (i = 0; i < PTRS_PER_PGD; pgd++, i++) {
-+ vaddr = i*PGDIR_SIZE;
-+ if (end && (vaddr >= end))
-+ break;
-+ pmd = pmd_offset(pgd, 0);
-+ for (j = 0; j < PTRS_PER_PMD; pmd++, j++) {
-+ vaddr = i*PGDIR_SIZE + j*PMD_SIZE;
-+ if (end && (vaddr >= end))
-+ break;
-+ if (vaddr < start)
-+ continue;
-+ pmd_clear(pmd);
-+ }
-+ }
-+ flush_tlb_all();
-+}
-+
-+void __init zap_low_mappings(void)
-+{
-+ printk("zapping low mappings.\n");
- /*
- * Zap initial low-memory mappings.
-- *
-- * Note that "pgd_clear()" doesn't do it for
-- * us, because pgd_clear() is a no-op on i386.
- */
-- for (i = 0; i < USER_PTRS_PER_PGD; i++)
--#ifdef CONFIG_X86_PAE
-- set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page)));
--#else
-- set_pgd(swapper_pg_dir+i, __pgd(0));
--#endif
-- flush_tlb_all();
-+ clear_mappings(swapper_pg_dir, 0, 16*1024*1024);
- }
-
- #ifndef CONFIG_DISCONTIGMEM
-@@ -388,12 +390,6 @@ void __init paging_init(void)
-
- void __init test_wp_bit(void)
- {
-- if (cpu_has_pse) {
-- /* Ok, all PSE-capable CPUs are definitely handling the WP bit right. */
-- boot_cpu_data.wp_works_ok = 1;
-- return;
-- }
--
- printk("Checking if this processor honours the WP bit even in supervisor mode... ");
-
- /* Any page-aligned address will do, the test is non-destructive */
-@@ -428,6 +424,7 @@ extern void set_max_mapnr_init(void);
- #endif /* !CONFIG_DISCONTIGMEM */
-
- static struct kcore_list kcore_mem, kcore_vmalloc;
-+extern void fixup_sort_exception_table(void);
-
- void __init mem_init(void)
- {
-@@ -436,6 +433,8 @@ void __init mem_init(void)
- int tmp;
- int bad_ppro;
-
-+ fixup_sort_exception_table();
-+
- #ifndef CONFIG_DISCONTIGMEM
- if (!mem_map)
- BUG();
-@@ -511,13 +510,18 @@ void __init mem_init(void)
- #ifndef CONFIG_SMP
- zap_low_mappings();
- #endif
-+ entry_trampoline_setup();
-+ default_ldt_page = virt_to_page(default_ldt);
-+ load_LDT(&init_mm.context);
- }
-
--kmem_cache_t *pgd_cache;
--kmem_cache_t *pmd_cache;
-+kmem_cache_t *pgd_cache, *pmd_cache, *kpmd_cache;
-
- void __init pgtable_cache_init(void)
- {
-+ void (*ctor)(void *, kmem_cache_t *, unsigned long);
-+ void (*dtor)(void *, kmem_cache_t *, unsigned long);
-+
- if (PTRS_PER_PMD > 1) {
- pmd_cache = kmem_cache_create("pmd",
- PTRS_PER_PMD*sizeof(pmd_t),
-@@ -527,13 +531,36 @@ void __init pgtable_cache_init(void)
- NULL);
- if (!pmd_cache)
- panic("pgtable_cache_init(): cannot create pmd cache");
-+
-+ if (TASK_SIZE > PAGE_OFFSET) {
-+ kpmd_cache = kmem_cache_create("kpmd",
-+ PTRS_PER_PMD*sizeof(pmd_t),
-+ 0,
-+ SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
-+ kpmd_ctor,
-+ NULL);
-+ if (!kpmd_cache)
-+ panic("pgtable_cache_init(): "
-+ "cannot create kpmd cache");
-+ }
- }
-+
-+ if (PTRS_PER_PMD == 1 || TASK_SIZE <= PAGE_OFFSET)
-+ ctor = pgd_ctor;
-+ else
-+ ctor = NULL;
-+
-+ if (PTRS_PER_PMD == 1 && TASK_SIZE <= PAGE_OFFSET)
-+ dtor = pgd_dtor;
-+ else
-+ dtor = NULL;
-+
- pgd_cache = kmem_cache_create("pgd",
- PTRS_PER_PGD*sizeof(pgd_t),
- 0,
- SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
-- pgd_ctor,
-- PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
-+ ctor,
-+ dtor);
- if (!pgd_cache)
- panic("pgtable_cache_init(): Cannot create pgd cache");
- }
---- linux-2.6.0/arch/i386/mm/pgtable.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/i386/mm/pgtable.c 2003-12-28 23:26:36.000000000 -0800
-@@ -21,6 +21,7 @@
- #include <asm/e820.h>
- #include <asm/tlb.h>
- #include <asm/tlbflush.h>
-+#include <asm/atomic_kmap.h>
-
- void show_mem(void)
- {
-@@ -157,11 +158,20 @@ void pmd_ctor(void *pmd, kmem_cache_t *c
- memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
- }
-
-+void kpmd_ctor(void *__pmd, kmem_cache_t *cache, unsigned long flags)
-+{
-+ pmd_t *kpmd, *pmd;
-+ kpmd = pmd_offset(&swapper_pg_dir[PTRS_PER_PGD-1],
-+ (PTRS_PER_PMD - NR_SHARED_PMDS)*PMD_SIZE);
-+ pmd = (pmd_t *)__pmd + (PTRS_PER_PMD - NR_SHARED_PMDS);
-+
-+ memset(__pmd, 0, (PTRS_PER_PMD - NR_SHARED_PMDS)*sizeof(pmd_t));
-+ memcpy(pmd, kpmd, NR_SHARED_PMDS*sizeof(pmd_t));
-+}
-+
- /*
-- * List of all pgd's needed for non-PAE so it can invalidate entries
-- * in both cached and uncached pgd's; not needed for PAE since the
-- * kernel pmd is shared. If PAE were not to share the pmd a similar
-- * tactic would be needed. This is essentially codepath-based locking
-+ * List of all pgd's needed so it can invalidate entries in both cached
-+ * and uncached pgd's. This is essentially codepath-based locking
- * against pageattr.c; it is the unique case in which a valid change
- * of kernel pagetables can't be lazily synchronized by vmalloc faults.
- * vmalloc faults work because attached pagetables are never freed.
-@@ -170,30 +180,60 @@ void pmd_ctor(void *pmd, kmem_cache_t *c
- * could be used. The locking scheme was chosen on the basis of
- * manfred's recommendations and having no core impact whatsoever.
- * -- wli
-+ *
-+ * The entire issue goes away when XKVA is configured.
- */
- spinlock_t pgd_lock = SPIN_LOCK_UNLOCKED;
- LIST_HEAD(pgd_list);
-
--void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
-+/*
-+ * This is not that hard to figure out.
-+ * (a) PTRS_PER_PMD == 1 means non-PAE.
-+ * (b) PTRS_PER_PMD > 1 means PAE.
-+ * (c) TASK_SIZE > PAGE_OFFSET means XKVA.
-+ * (d) TASK_SIZE <= PAGE_OFFSET means non-XKVA.
-+ *
-+ * Do *NOT* back out the preconstruction like the patch I'm cleaning
-+ * up after this very instant did, or at all, for that matter.
-+ * This is never called when PTRS_PER_PMD > 1 && TASK_SIZE > PAGE_OFFSET.
-+ * -- wli
-+ */
-+void pgd_ctor(void *__pgd, kmem_cache_t *cache, unsigned long unused)
- {
-+ pgd_t *pgd = (pgd_t *)__pgd;
- unsigned long flags;
-
-- if (PTRS_PER_PMD == 1)
-- spin_lock_irqsave(&pgd_lock, flags);
-+ if (PTRS_PER_PMD == 1) {
-+ if (TASK_SIZE <= PAGE_OFFSET)
-+ spin_lock_irqsave(&pgd_lock, flags);
-+ else
-+ memcpy(&pgd[PTRS_PER_PGD - NR_SHARED_PMDS],
-+ &swapper_pg_dir[PTRS_PER_PGD - NR_SHARED_PMDS],
-+ NR_SHARED_PMDS * sizeof(pgd_t));
-+ }
-
-- memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
-- swapper_pg_dir + USER_PTRS_PER_PGD,
-- (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
-+ if (TASK_SIZE <= PAGE_OFFSET)
-+ memcpy(pgd + USER_PTRS_PER_PGD,
-+ swapper_pg_dir + USER_PTRS_PER_PGD,
-+ (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
-
- if (PTRS_PER_PMD > 1)
- return;
-
-- list_add(&virt_to_page(pgd)->lru, &pgd_list);
-- spin_unlock_irqrestore(&pgd_lock, flags);
-- memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
-+ if (TASK_SIZE > PAGE_OFFSET)
-+ memset(pgd, 0, (PTRS_PER_PGD - NR_SHARED_PMDS)*sizeof(pgd_t));
-+ else {
-+ list_add(&virt_to_page(pgd)->lru, &pgd_list);
-+ spin_unlock_irqrestore(&pgd_lock, flags);
-+ memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
-+ }
- }
-
--/* never called when PTRS_PER_PMD > 1 */
-+/*
-+ * Never called when PTRS_PER_PMD > 1 || TASK_SIZE > PAGE_OFFSET
-+ * for with PAE we would list_del() multiple times, and for non-PAE
-+ * with XKVA all the AGP pgd shootdown code is unnecessary.
-+ */
- void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
- {
- unsigned long flags; /* can be called from interrupt context */
-@@ -203,6 +243,12 @@ void pgd_dtor(void *pgd, kmem_cache_t *c
- spin_unlock_irqrestore(&pgd_lock, flags);
- }
-
-+/*
-+ * See the comments above pgd_ctor() wrt. preconstruction.
-+ * Do *NOT* memcpy() here. If you do, you back out important
-+ * anti- cache pollution code.
-+ *
-+ */
- pgd_t *pgd_alloc(struct mm_struct *mm)
- {
- int i;
-@@ -211,15 +257,33 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
- if (PTRS_PER_PMD == 1 || !pgd)
- return pgd;
-
-+ /*
-+ * In the 4G userspace case alias the top 16 MB virtual
-+ * memory range into the user mappings as well (these
-+ * include the trampoline and CPU data structures).
-+ */
- for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-- pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-+ kmem_cache_t *cache;
-+ pmd_t *pmd;
-+
-+ if (TASK_SIZE > PAGE_OFFSET && i == USER_PTRS_PER_PGD - 1)
-+ cache = kpmd_cache;
-+ else
-+ cache = pmd_cache;
-+
-+ pmd = kmem_cache_alloc(cache, GFP_KERNEL);
- if (!pmd)
- goto out_oom;
- set_pgd(&pgd[i], __pgd(1 + __pa((u64)((u32)pmd))));
- }
-- return pgd;
-
-+ return pgd;
- out_oom:
-+ /*
-+ * we don't have to handle the kpmd_cache here, since it's the
-+ * last allocation, and has either nothing to free or when it
-+ * succeeds the whole operation succeeds.
-+ */
- for (i--; i >= 0; i--)
- kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
- kmem_cache_free(pgd_cache, pgd);
-@@ -230,10 +294,29 @@ void pgd_free(pgd_t *pgd)
- {
- int i;
-
-- /* in the PAE case user pgd entries are overwritten before usage */
-- if (PTRS_PER_PMD > 1)
-- for (i = 0; i < USER_PTRS_PER_PGD; ++i)
-- kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
- /* in the non-PAE case, clear_page_tables() clears user pgd entries */
-+ if (PTRS_PER_PMD == 1)
-+ goto out_free;
-+
-+ /* in the PAE case user pgd entries are overwritten before usage */
-+ for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-+ kmem_cache_t *cache;
-+ pmd_t *pmd = __va(pgd_val(pgd[i]) - 1);
-+
-+ /*
-+ * only userspace pmd's are cleared for us
-+ * by mm/memory.c; it's a slab cache invariant
-+ * that we must separate the kernel pmd slab
-+ * all times, else we'll have bad pmd's.
-+ */
-+ if (TASK_SIZE > PAGE_OFFSET && i == USER_PTRS_PER_PGD - 1)
-+ cache = kpmd_cache;
-+ else
-+ cache = pmd_cache;
-+
-+ kmem_cache_free(cache, pmd);
-+ }
-+out_free:
- kmem_cache_free(pgd_cache, pgd);
- }
-+
---- linux-2.6.0/arch/i386/pci/acpi.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/i386/pci/acpi.c 2003-12-28 23:21:33.000000000 -0800
-@@ -18,7 +18,7 @@ static int __init pci_acpi_init(void)
- if (pcibios_scanned)
- return 0;
-
-- if (!(pci_probe & PCI_NO_ACPI_ROUTING)) {
-+ if (!acpi_noirq) {
- if (!acpi_pci_irq_init()) {
- printk(KERN_INFO "PCI: Using ACPI for IRQ routing\n");
- printk(KERN_INFO "PCI: if you experience problems, try using option 'pci=noacpi' or even 'acpi=off'\n");
-@@ -31,15 +31,4 @@ static int __init pci_acpi_init(void)
-
- return 0;
- }
--
--/*
-- * pci_disable_acpi()
-- * act like pci=noacpi seen on command line
-- * called by DMI blacklist code
-- */
--__init void pci_disable_acpi(void)
--{
-- pci_probe |= PCI_NO_ACPI_ROUTING;
--}
--
- subsys_initcall(pci_acpi_init);
---- linux-2.6.0/arch/i386/pci/common.c 2003-09-08 13:58:55.000000000 -0700
-+++ 25/arch/i386/pci/common.c 2003-12-28 23:21:33.000000000 -0800
-@@ -9,6 +9,7 @@
- #include <linux/ioport.h>
- #include <linux/init.h>
-
-+#include <asm/acpi.h>
- #include <asm/segment.h>
- #include <asm/io.h>
- #include <asm/smp.h>
-@@ -197,12 +198,10 @@ char * __devinit pcibios_setup(char *st
- return NULL;
- }
- #endif
--#ifdef CONFIG_ACPI_PCI
- else if (!strcmp(str, "noacpi")) {
-- pci_probe |= PCI_NO_ACPI_ROUTING;
-+ acpi_noirq_set();
- return NULL;
- }
--#endif
- #ifndef CONFIG_X86_VISWS
- else if (!strcmp(str, "usepirqmask")) {
- pci_probe |= PCI_USE_PIRQ_MASK;
---- linux-2.6.0/arch/i386/pci/fixup.c 2003-08-08 22:55:10.000000000 -0700
-+++ 25/arch/i386/pci/fixup.c 2003-12-28 23:26:29.000000000 -0800
-@@ -6,27 +6,52 @@
- #include <linux/init.h>
- #include "pci.h"
-
-+static void __devinit i450nx_scan_bus(struct pci_bus *parent, u8 busnr)
-+{
-+ struct list_head *tmp;
-+
-+ pci_scan_bus(busnr, &pci_root_ops, NULL);
-+
-+ list_for_each(tmp, &parent->children) {
-+ u8 childnr;
-+ struct pci_dev *dev = pci_dev_b(tmp);
-+
-+ if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE)
-+ continue;
-+ pci_read_config_byte(dev, PCI_PRIMARY_BUS, &childnr);
-+ if (childnr != busnr)
-+ continue;
-+
-+ printk(KERN_WARNING "PCI: Removing fake PCI bridge %s\n",
-+ pci_name(dev));
-+ pci_remove_bus_device(dev);
-+ break;
-+ }
-+}
-
- static void __devinit pci_fixup_i450nx(struct pci_dev *d)
- {
- /*
- * i450NX -- Find and scan all secondary buses on all PXB's.
-+ * Some manufacturers added fake PCI-PCI bridges that also point
-+ * to the peer busses. Look for them and delete them.
- */
- int pxb, reg;
- u8 busno, suba, subb;
-
-- printk(KERN_WARNING "PCI: Searching for i450NX host bridges on %s\n", pci_name(d));
-+ printk(KERN_NOTICE "PCI: Searching for i450NX host bridges on %s\n", pci_name(d));
- reg = 0xd0;
-- for(pxb=0; pxb<2; pxb++) {
-+ for (pxb = 0; pxb < 2; pxb++) {
- pci_read_config_byte(d, reg++, &busno);
- pci_read_config_byte(d, reg++, &suba);
- pci_read_config_byte(d, reg++, &subb);
- DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb);
- if (busno)
-- pci_scan_bus(busno, &pci_root_ops, NULL); /* Bus A */
-+ i450nx_scan_bus(d->bus, busno); /* Bus A */
- if (suba < subb)
-- pci_scan_bus(suba+1, &pci_root_ops, NULL); /* Bus B */
-+ i450nx_scan_bus(d->bus, suba+1); /* Bus B */
- }
-+
- pcibios_last_bus = -1;
- }
-
-@@ -187,6 +212,22 @@ static void __devinit pci_fixup_transpar
- dev->transparent = 1;
- }
-
-+/*
-+ * Halt Disconnect and Stop Grant Disconnect (bit 4 at offset 0x6F)
-+ * must be disabled when APIC is used (or lockups will happen).
-+ */
-+static void __devinit pci_fixup_nforce2_disconnect(struct pci_dev *d)
-+{
-+ u8 t;
-+
-+ pci_read_config_byte(d, 0x6F, &t);
-+ if (t & 0x10) {
-+ printk(KERN_INFO "PCI: disabling nForce2 Halt Disconnect"
-+ " and Stop Grant Disconnect\n");
-+ pci_write_config_byte(d, 0x6F, (t & 0xef));
-+ }
-+}
-+
- struct pci_fixup pcibios_fixups[] = {
- { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx },
- { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx },
-@@ -205,5 +246,6 @@ struct pci_fixup pcibios_fixups[] = {
- { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8367_0, pci_fixup_via_northbridge_bug },
- { PCI_FIXUP_HEADER, PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, pci_fixup_ncr53c810 },
- { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_fixup_transparent_bridge },
-+ { PCI_FIXUP_HEADER, PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2, pci_fixup_nforce2_disconnect },
- { 0 }
- };
---- linux-2.6.0/arch/i386/pci/irq.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/i386/pci/irq.c 2003-12-28 23:22:07.000000000 -0800
-@@ -455,7 +455,10 @@ static __init int intel_router_probe(str
- #if 0 /* Let's see what chip this is supposed to be ... */
- /* We must not touch 440GX even if we have tables. 440GX has
- different IRQ routing weirdness */
-- if (pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82440GX, NULL))
-+ if ( pci_find_device(PCI_VENDOR_ID_INTEL,
-+ PCI_DEVICE_ID_INTEL_82443GX_0, NULL) ||
-+ pci_find_device(PCI_VENDOR_ID_INTEL,
-+ PCI_DEVICE_ID_INTEL_82443GX_2, NULL))
- return 0;
- #endif
-
-@@ -695,9 +698,10 @@ static struct irq_info *pirq_get_info(st
- return NULL;
- }
-
--static irqreturn_t pcibios_test_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
-+static irqreturn_t
-+pcibios_test_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
- {
-- return IRQ_NONE;
-+ return IRQ_HANDLED;
- }
-
- static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
-@@ -813,8 +817,10 @@ static int pcibios_lookup_irq(struct pci
- if ( dev2->irq && dev2->irq != irq && \
- (!(pci_probe & PCI_USE_PIRQ_MASK) || \
- ((1 << dev2->irq) & mask)) ) {
-+#ifndef CONFIG_PCI_USE_VECTOR
- printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
- pci_name(dev2), dev2->irq, irq);
-+#endif
- continue;
- }
- dev2->irq = irq;
-@@ -878,6 +884,10 @@ static void __init pcibios_fixup_irqs(vo
- bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
- }
- if (irq >= 0) {
-+ if (use_pci_vector() &&
-+ !platform_legacy_irq(irq))
-+ irq = IO_APIC_VECTOR(irq);
-+
- printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
- dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
- dev->irq = irq;
---- linux-2.6.0/arch/i386/pci/pci.h 2003-06-22 12:04:43.000000000 -0700
-+++ 25/arch/i386/pci/pci.h 2003-12-28 23:21:33.000000000 -0800
-@@ -22,7 +22,6 @@
- #define PCI_ASSIGN_ROMS 0x1000
- #define PCI_BIOS_IRQ_SCAN 0x2000
- #define PCI_ASSIGN_ALL_BUSSES 0x4000
--#define PCI_NO_ACPI_ROUTING 0x8000
-
- extern unsigned int pci_probe;
-
---- linux-2.6.0/arch/ia64/defconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/ia64/defconfig 2003-12-28 23:21:45.000000000 -0800
-@@ -48,7 +48,6 @@ CONFIG_IA64_HP_ZX1=y
- CONFIG_IA64_PAGE_SIZE_16KB=y
- # CONFIG_IA64_PAGE_SIZE_64KB is not set
- CONFIG_ACPI=y
--CONFIG_ACPI_EFI=y
- CONFIG_ACPI_INTERPRETER=y
- CONFIG_ACPI_KERNEL_CONFIG=y
- CONFIG_IA64_L1_CACHE_SHIFT=7
-@@ -76,6 +75,7 @@ CONFIG_IA32_SUPPORT=y
- CONFIG_COMPAT=y
- CONFIG_PERFMON=y
- CONFIG_IA64_PALINFO=y
-+CONFIG_EFI=y
- CONFIG_EFI_VARS=y
- CONFIG_NR_CPUS=16
- CONFIG_BINFMT_ELF=y
---- linux-2.6.0/arch/ia64/ia32/binfmt_elf32.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/arch/ia64/ia32/binfmt_elf32.c 2003-12-28 23:22:12.000000000 -0800
-@@ -60,10 +60,12 @@ extern struct page *ia32_shared_page[];
- extern unsigned long *ia32_gdt;
-
- struct page *
--ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int no_share)
-+ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int *type)
- {
- struct page *pg = ia32_shared_page[smp_processor_id()];
- get_page(pg);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return pg;
- }
-
---- linux-2.6.0/arch/ia64/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/ia64/Kconfig 2003-12-28 23:26:35.000000000 -0800
-@@ -164,11 +164,6 @@ config ACPI
- The ACPI Sourceforge project may also be of interest:
- <http://sf.net/projects/acpi/>
-
--config ACPI_EFI
-- bool
-- depends on !IA64_HP_SIM
-- default y
--
- config ACPI_INTERPRETER
- bool
- depends on !IA64_HP_SIM
-@@ -404,6 +399,11 @@ config IA64_SALINFO
- To use this option, you have to ensure that the "/proc file system
- support" (CONFIG_PROC_FS) is enabled, too.
-
-+config EFI
-+ bool
-+ depends on !IA64_HP_SIM
-+ default y
-+
- config EFI_VARS
- tristate "/proc/efi/vars support"
- help
-@@ -670,6 +670,13 @@ config DEBUG_INFO
- Say Y here only if you plan to use gdb to debug the kernel.
- If you don't debug the kernel, you can say N.
-
-+config LOCKMETER
-+ bool "Kernel lock metering"
-+ depends on SMP
-+ help
-+ Say Y to enable kernel lock metering, which adds overhead to SMP locks,
-+ but allows you to see various statistics using the lockstat command.
-+
- endmenu
-
- source "security/Kconfig"
---- linux-2.6.0/arch/ia64/kernel/irq.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/ia64/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -160,18 +160,20 @@ atomic_t irq_mis_count;
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int j, i = *(loff_t *) v;
- struct irqaction * action;
- irq_desc_t *idesc;
- unsigned long flags;
-
-- seq_puts(p, " ");
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_puts(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- idesc = irq_descp(i);
- spin_lock_irqsave(&idesc->lock, flags);
- action = idesc->action;
-@@ -194,25 +196,26 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&idesc->lock, flags);
-- }
-- seq_puts(p, "NMI: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", nmi_count(j));
-- seq_putc(p, '\n');
-+ } else if (i == NR_IRQS) {
-+ seq_puts(p, "NMI: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", nmi_count(j));
-+ seq_putc(p, '\n');
- #ifdef CONFIG_X86_LOCAL_APIC
-- seq_puts(p, "LOC: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-- seq_putc(p, '\n');
-+ seq_puts(p, "LOC: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
-+ seq_putc(p, '\n');
- #endif
-- seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-+ seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
- #ifdef CONFIG_X86_IO_APIC
- #ifdef APIC_MISMATCH_DEBUG
-- seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-+ seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
- #endif
- #endif
-+ }
- return 0;
- }
-
-@@ -910,47 +913,6 @@ int setup_irq(unsigned int irq, struct i
- static struct proc_dir_entry * root_irq_dir;
- static struct proc_dir_entry * irq_dir [NR_IRQS];
-
--#define HEX_DIGITS (2*sizeof(cpumask_t))
--
--static unsigned int parse_hex_value(const char *buffer,
-- unsigned long count, cpumask_t *ret)
--{
-- unsigned char hexnum[HEX_DIGITS];
-- cpumask_t value = CPU_MASK_NONE;
-- unsigned long i;
--
-- if (!count)
-- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first 8 characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
-- for (i = 0; i < count; i++) {
-- unsigned int c = hexnum[i];
-- int k;
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- cpus_shift_left(value, value, 4);
-- for (k = 0; k < 4; ++k)
-- if (test_bit(k, (unsigned long *)&c))
-- cpu_set(k, value);
-- }
--out:
-- *ret = value;
-- return 0;
--}
--
- #ifdef CONFIG_SMP
-
- static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
-@@ -974,20 +936,10 @@ void set_irq_affinity_info (unsigned int
- static int irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- int k, len;
-- cpumask_t tmp = irq_affinity[(long)data];
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
--
-- len = 0;
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -1011,7 +963,7 @@ static int irq_affinity_write_proc (stru
- } else
- redir = 0;
-
-- err = parse_hex_value(buf, count, &new_value);
-+ err = cpumask_parse(buf, count - (buf-buffer), new_value);
- if (err)
- return err;
-
-@@ -1033,19 +985,10 @@ static int irq_affinity_write_proc (stru
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- cpumask_t *mask = (cpumask_t *)data;
-- int k, len = 0;
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
--
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(*mask));
-- len += j;
-- page += j;
-- cpus_shift_right(*mask, *mask, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -1056,7 +999,7 @@ static int prof_cpu_mask_write_proc (str
- unsigned long full_count = count, err;
- cpumask_t new_value;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- linux-2.6.0/arch/ia64/kernel/perfmon.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/ia64/kernel/perfmon.c 2003-12-28 23:21:18.000000000 -0800
-@@ -2157,6 +2157,7 @@ pfm_alloc_fd(struct file **cfile)
-
- d_add(file->f_dentry, inode);
- file->f_vfsmnt = mntget(pfmfs_mnt);
-+ file->f_mapping = inode->i_mapping;
-
- file->f_op = &pfm_file_ops;
- file->f_mode = FMODE_READ;
---- linux-2.6.0/arch/ia64/kernel/setup.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/ia64/kernel/setup.c 2003-12-28 23:21:45.000000000 -0800
-@@ -54,6 +54,10 @@
- # error "struct cpuinfo_ia64 too big!"
- #endif
-
-+#ifdef CONFIG_EFI
-+int efi_enabled = 1;
-+#endif
-+
- #ifdef CONFIG_SMP
- unsigned long __per_cpu_offset[NR_CPUS];
- #endif
---- linux-2.6.0/arch/ia64/mm/hugetlbpage.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/ia64/mm/hugetlbpage.c 2003-12-28 23:22:12.000000000 -0800
-@@ -518,7 +518,7 @@ int is_hugepage_mem_enough(size_t size)
- return 1;
- }
-
--static struct page *hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int unused)
-+static struct page *hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int *unused)
- {
- BUG();
- return NULL;
---- linux-2.6.0/arch/m68k/Kconfig 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/m68k/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -1025,7 +1025,7 @@ config WATCHDOG
- implementation entirely in software (which can sometimes fail to
- reboot the machine) and a driver for hardware watchdog boards, which
- are more robust and can also keep track of the temperature inside
-- your computer. For details, read <file:Documentation/watchdog.txt>
-+ your computer. For details, read <file:Documentation/watchdog/watchdog.txt>
- in the kernel source.
-
- The watchdog is usually used together with the watchdog daemon
---- linux-2.6.0/arch/m68k/kernel/ints.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/m68k/kernel/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -253,19 +253,18 @@ asmlinkage void process_int(unsigned lon
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
- /* autovector interrupts */
- if (mach_default_handler) {
-- for (i = 0; i < SYS_IRQS; i++) {
-+ if (i < SYS_IRQS) {
- seq_printf(p, "auto %2d: %10u ", i,
- i ? kstat_cpu(0).irqs[i] : num_spurious);
- seq_puts(p, " ");
- seq_printf(p, "%s\n", irq_list[i].devname);
- }
-- }
--
-- mach_get_irq_list(p, v);
-+ } else if (i == SYS_IRQS)
-+ mach_get_irq_list(p, v);
- return 0;
- }
-
---- linux-2.6.0/arch/m68knommu/platform/5307/ints.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/m68knommu/platform/5307/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -254,9 +254,9 @@ asmlinkage void process_int(unsigned lon
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- if (irq_list[i].flags & IRQ_FLG_STD)
- continue;
-
-@@ -269,7 +269,7 @@ int show_interrupts(struct seq_file *p,
- seq_printf(p, "%s\n", irq_list[i].devname);
- }
-
-- if (mach_get_irq_list)
-+ if (i == NR_IRQS && mach_get_irq_list)
- mach_get_irq_list(p, v);
- return(0);
- }
---- linux-2.6.0/arch/m68knommu/platform/68328/ints.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/m68knommu/platform/68328/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -198,9 +198,9 @@ EXPORT_SYMBOL(free_irq);
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- if (int_irq_list[i].flags & IRQ_FLG_STD)
- continue;
-
-@@ -211,7 +211,8 @@ int show_interrupts(struct seq_file *p,
- seq_printf(p, " ");
- seq_printf(p, "%s\n", int_irq_list[i].devname);
- }
-- seq_printf(p, " : %10u spurious\n", num_spurious);
-+ if (i == NR_IRQS)
-+ seq_printf(p, " : %10u spurious\n", num_spurious);
-
- return 0;
- }
---- linux-2.6.0/arch/m68knommu/platform/68360/ints.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/m68knommu/platform/68360/ints.c 2003-12-28 23:22:06.000000000 -0800
-@@ -278,9 +278,9 @@ void M68360_disable_irq(unsigned int irq
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
-
-- for (i = 0; i < NR_IRQS; i++) {
-+ if (i < NR_IRQS) {
- if (int_irq_list[i].flags & IRQ_FLG_STD)
- continue;
-
-@@ -291,7 +291,8 @@ int show_interrupts(struct seq_file *p,
- seq_printf(p, " ");
- seq_printf(p, "%s\n", int_irq_list[i].devname);
- }
-- seq_printf(p, " : %10u spurious\n", num_spurious);
-+ if (i == NR_IRQS)
-+ seq_printf(p, " : %10u spurious\n", num_spurious);
-
- return 0;
- }
---- linux-2.6.0/arch/mips/Kconfig 2003-09-27 18:57:43.000000000 -0700
-+++ 25/arch/mips/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -1261,8 +1261,8 @@ config SOUND
- You want to read the Sound-HOWTO, available from
- <http://www.tldp.org/docs.html#howto>. General information about
- the modular sound system is contained in the files
-- <file:Documentation/sound/Introduction>. The file
-- <file:Documentation/sound/README.OSS> contains some slightly
-+ <file:Documentation/sound/oss/Introduction>. The file
-+ <file:Documentation/sound/oss/README.OSS> contains some slightly
- outdated but still useful information as well.
-
- If you have a PnP sound card and you want to configure it at boot
-@@ -1270,7 +1270,7 @@ config SOUND
- <http://www.roestock.demon.co.uk/isapnptools/>), then you need to
- compile the sound card support as a module and load that module
- after the PnP configuration is finished. To do this, choose M here
-- and read <file:Documentation/sound/README.modules>; the module
-+ and read <file:Documentation/sound/oss/README.modules>; the module
- will be called soundcore.
-
- I'm told that even without a sound card, you can make your computer
---- linux-2.6.0/arch/mips/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/mips/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -85,17 +85,19 @@ atomic_t irq_err_count;
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_printf(p, " ");
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_printf(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -117,10 +119,10 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-+ } else if (i == NR_IRQS) {
-+ seq_putc(p, '\n');
-+ seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
- }
-- seq_putc(p, '\n');
-- seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
--
- return 0;
- }
-
-@@ -825,45 +827,6 @@ EXPORT_SYMBOL(probe_irq_mask);
- static struct proc_dir_entry * root_irq_dir;
- static struct proc_dir_entry * irq_dir [NR_IRQS];
-
--#define HEX_DIGITS 8
--
--static unsigned int parse_hex_value (const char *buffer,
-- unsigned long count, unsigned long *ret)
--{
-- unsigned char hexnum [HEX_DIGITS];
-- unsigned long value;
-- int i;
--
-- if (!count)
-- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first 8 characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
-- value = 0;
--
-- for (i = 0; i < count; i++) {
-- unsigned int c = hexnum[i];
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- value = (value << 4) | c;
-- }
--out:
-- *ret = value;
-- return 0;
--}
--
- #ifdef CONFIG_SMP
-
- static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
-@@ -872,18 +835,10 @@ static cpumask_t irq_affinity [NR_IRQS]
- static int irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- int len, k;
-- cpumask_t tmp = irq_affinity[(long)data];
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -896,7 +851,7 @@ static int irq_affinity_write_proc (stru
- if (!irq_desc[irq].handler->set_affinity)
- return -EIO;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
-
- /*
- * Do not allow disabling IRQs completely - it's a too easy
-@@ -918,20 +873,10 @@ static int irq_affinity_write_proc (stru
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- int len, k;
-- cpumask_t *mask = (cpumask_t *)data, tmp;
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
-- tmp = *mask;
--
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -941,7 +886,7 @@ static int prof_cpu_mask_write_proc (str
- cpumask_t *mask = (cpumask_t *)data, new_value;
- unsigned long full_count = count, err;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- linux-2.6.0/arch/mips/mm/highmem.c 2003-07-02 14:53:13.000000000 -0700
-+++ 25/arch/mips/mm/highmem.c 2003-12-28 23:22:58.000000000 -0800
-@@ -40,6 +40,7 @@ void *kmap_atomic(struct page *page, enu
- enum fixed_addresses idx;
- unsigned long vaddr;
-
-+ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
- inc_preempt_count();
- if (page < highmem_start_page)
- return page_address(page);
-@@ -64,6 +65,7 @@ void kunmap_atomic(void *kvaddr, enum km
-
- if (vaddr < FIXADDR_START) { // FIXME
- dec_preempt_count();
-+ preempt_check_resched();
- return;
- }
-
-@@ -79,6 +81,7 @@ void kunmap_atomic(void *kvaddr, enum km
- #endif
-
- dec_preempt_count();
-+ preempt_check_resched();
- }
-
- struct page *kmap_atomic_to_page(void *ptr)
---- linux-2.6.0/arch/parisc/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/parisc/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -215,29 +215,30 @@ EXPORT_SYMBOL(enable_irq);
- int show_interrupts(struct seq_file *p, void *v)
- {
- #ifdef CONFIG_PROC_FS
-- unsigned int regnr = 0;
-+ unsigned int regnr = *(loff_t *) v, i;
-
-- seq_puts(p, " ");
-+ if (regnr == 0) {
-+ seq_puts(p, " ");
- #ifdef CONFIG_SMP
-- for (regnr = 0; regnr < NR_CPUS; regnr++)
-+ for (i = 0; i < NR_CPUS; i++)
- #endif
-- seq_printf(p, " CPU%02d ", regnr);
-+ seq_printf(p, " CPU%02d ", i);
-
- #ifdef PARISC_IRQ_CR16_COUNTS
-- seq_printf(p, "[min/avg/max] (CPU cycle counts)");
-+ seq_printf(p, "[min/avg/max] (CPU cycle counts)");
- #endif
-- seq_putc(p, '\n');
-+ seq_putc(p, '\n');
-+ }
-
- /* We don't need *irqsave lock variants since this is
- ** only allowed to change while in the base context.
- */
- spin_lock(&irq_lock);
-- for (regnr = 0; regnr < NR_IRQ_REGS; regnr++) {
-- unsigned int i;
-+ if (regnr < NR_IRQ_REGS) {
- struct irq_region *region = irq_region[regnr];
-
- if (!region || !region->action)
-- continue;
-+ goto skip;
-
- for (i = 0; i <= MAX_CPU_IRQ; i++) {
- struct irqaction *action = ®ion->action[i];
-@@ -286,9 +287,9 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- }
- }
-+ skip:
- spin_unlock(&irq_lock);
-
-- seq_putc(p, '\n');
- #endif /* CONFIG_PROC_FS */
- return 0;
- }
---- linux-2.6.0/arch/parisc/kernel/sys_parisc.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/parisc/kernel/sys_parisc.c 2003-12-28 23:21:20.000000000 -0800
-@@ -93,17 +93,13 @@ static unsigned long get_shared_area(str
- unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
- unsigned long len, unsigned long pgoff, unsigned long flags)
- {
-- struct inode *inode;
--
- if (len > TASK_SIZE)
- return -ENOMEM;
- if (!addr)
- addr = TASK_UNMAPPED_BASE;
-
-- inode = filp ? filp->f_dentry->d_inode : NULL;
--
-- if (inode && (flags & MAP_SHARED)) {
-- addr = get_shared_area(inode->i_mapping, addr, len, pgoff);
-+ if (filp && (flags & MAP_SHARED)) {
-+ addr = get_shared_area(filp->f_mapping, addr, len, pgoff);
- } else {
- addr = get_unshared_area(addr, len);
- }
---- linux-2.6.0/arch/ppc64/kernel/irq.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/ppc64/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -300,7 +300,7 @@ void enable_irq(unsigned int irq)
- spin_lock_irqsave(&desc->lock, flags);
- switch (desc->depth) {
- case 1: {
-- unsigned int status = desc->status & ~(IRQ_DISABLED | IRQ_INPROGRESS);
-+ unsigned int status = desc->status & ~IRQ_DISABLED;
- desc->status = status;
- if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
- desc->status = status | IRQ_REPLAY;
-@@ -323,18 +323,20 @@ EXPORT_SYMBOL(enable_irq);
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_printf(p, " ");
-- for (j=0; j<NR_CPUS; j++) {
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
-+ if (i == 0) {
-+ seq_printf(p, " ");
-+ for (j=0; j<NR_CPUS; j++) {
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ }
-+ seq_putc(p, '\n');
- }
-- seq_putc(p, '\n');
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action || !action->handler)
-@@ -359,8 +361,8 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-- }
-- seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
-+ } else if (i == NR_IRQS)
-+ seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
- return 0;
- }
-
-@@ -652,67 +654,16 @@ cpumask_t irq_affinity [NR_IRQS] = { [0
- cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_NONE };
- #endif /* CONFIG_IRQ_ALL_CPUS */
-
--#define HEX_DIGITS (2*sizeof(cpumask_t))
--
- static int irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- int k, len;
-- cpumask_t tmp = irq_affinity[(long)data];
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
--
-- for (k = 0; k < sizeof(cpumask_t) / sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
--static unsigned int parse_hex_value (const char *buffer,
-- unsigned long count, cpumask_t *ret)
--{
-- unsigned char hexnum[HEX_DIGITS];
-- cpumask_t value = CPU_MASK_NONE;
-- int i;
--
-- if (!count)
-- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first HEX_DIGITS characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
--
-- for (i = 0; i < count; i++) {
-- unsigned int c = hexnum[i];
-- int k;
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- cpus_shift_left(value, value, 4);
-- for (k = 0; k < 4; ++k)
-- if (test_bit(k, (unsigned long *)&c))
-- cpu_set(k, value);
-- }
--out:
-- *ret = value;
-- return 0;
--}
--
- static int irq_affinity_write_proc (struct file *file, const char *buffer,
- unsigned long count, void *data)
- {
-@@ -722,7 +673,7 @@ static int irq_affinity_write_proc (stru
- if (!irq_desc[irq].handler->set_affinity)
- return -EIO;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
-@@ -744,10 +695,11 @@ static int irq_affinity_write_proc (stru
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- unsigned long *mask = (unsigned long *) data;
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%08lx\n", *mask);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static int prof_cpu_mask_write_proc (struct file *file, const char __user *buffer,
-@@ -757,7 +709,7 @@ static int prof_cpu_mask_write_proc (str
- unsigned long full_count = count, err;
- cpumask_t new_value;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- linux-2.6.0/arch/ppc64/kernel/misc.S 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/ppc64/kernel/misc.S 2003-12-28 23:21:37.000000000 -0800
-@@ -843,15 +843,15 @@ _GLOBAL(sys_call_table32)
- .llong .sys_ni_syscall
- .llong .sys_ni_syscall
- .llong .sys_ni_syscall
-- .llong .sys_ni_syscall /* 245 */
-- .llong .sys_ni_syscall
-- .llong .sys_ni_syscall
-- .llong .sys_ni_syscall
-- .llong .sys_ni_syscall
-+ .llong .compat_clock_settime /* 245 */
-+ .llong .compat_clock_gettime
-+ .llong .compat_clock_getres
-+ .llong .compat_clock_nanosleep
-+ .llong .sys_ni_syscall /* 249 swapcontext */
- .llong .sys32_tgkill /* 250 */
- .llong .sys32_utimes
-- .llong .sys_statfs64
-- .llong .sys_fstatfs64
-+ .llong .compat_statfs64
-+ .llong .compat_fstatfs64
-
- .balign 8
- _GLOBAL(sys_call_table)
---- linux-2.6.0/arch/ppc64/kernel/time.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/ppc64/kernel/time.c 2003-12-28 23:21:36.000000000 -0800
-@@ -91,6 +91,9 @@ unsigned tb_to_us;
- unsigned long processor_freq;
- spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
-
-+unsigned long tb_to_ns_scale;
-+unsigned long tb_to_ns_shift;
-+
- struct gettimeofday_struct do_gtod;
-
- extern unsigned long wall_jiffies;
-@@ -313,11 +316,13 @@ int timer_interrupt(struct pt_regs * reg
- /*
- * Scheduler clock - returns current time in nanosec units.
- *
-- * This is wrong, but my CPUs run at 1GHz, so nyer nyer.
-+ * Note: mulhdu(a, b) (multiply high double unsigned) returns
-+ * the high 64 bits of a * b, i.e. (a * b) >> 64, where a and b
-+ * are 64-bit unsigned numbers.
- */
- unsigned long long sched_clock(void)
- {
-- return get_tb();
-+ return mulhdu(get_tb(), tb_to_ns_scale) << tb_to_ns_shift;
- }
-
- /*
-@@ -473,9 +478,30 @@ void __init time_init(void)
- /* This function is only called on the boot processor */
- unsigned long flags;
- struct rtc_time tm;
-+ struct div_result res;
-+ unsigned long scale, shift;
-
- ppc_md.calibrate_decr();
-
-+ /*
-+ * Compute scale factor for sched_clock.
-+ * The calibrate_decr() function has set tb_ticks_per_sec,
-+ * which is the timebase frequency.
-+ * We compute 1e9 * 2^64 / tb_ticks_per_sec and interpret
-+ * the 128-bit result as a 64.64 fixed-point number.
-+ * We then shift that number right until it is less than 1.0,
-+ * giving us the scale factor and shift count to use in
-+ * sched_clock().
-+ */
-+ div128_by_32(1000000000, 0, tb_ticks_per_sec, &res);
-+ scale = res.result_low;
-+ for (shift = 0; res.result_high != 0; ++shift) {
-+ scale = (scale >> 1) | (res.result_high << 63);
-+ res.result_high >>= 1;
-+ }
-+ tb_to_ns_scale = scale;
-+ tb_to_ns_shift = shift;
-+
- #ifdef CONFIG_PPC_ISERIES
- if (!piranha_simulator)
- #endif
---- linux-2.6.0/arch/ppc64/mm/hugetlbpage.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/ppc64/mm/hugetlbpage.c 2003-12-28 23:22:12.000000000 -0800
-@@ -921,7 +921,7 @@ int is_hugepage_mem_enough(size_t size)
- * this far.
- */
- static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-- unsigned long address, int unused)
-+ unsigned long address, int *unused)
- {
- BUG();
- return NULL;
---- linux-2.6.0/arch/ppc64/mm/numa.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/ppc64/mm/numa.c 2003-12-28 23:21:37.000000000 -0800
-@@ -108,7 +108,7 @@ static int __init parse_numa_properties(
-
- for (memory = find_type_devices("memory"); memory;
- memory = memory->next) {
-- int *tmp1, *tmp2;
-+ unsigned int *tmp1, *tmp2;
- unsigned long i;
- unsigned long start = 0;
- unsigned long size = 0;
---- linux-2.6.0/arch/ppc/boot/ld.script 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/ppc/boot/ld.script 2003-12-28 23:26:37.000000000 -0800
-@@ -82,6 +82,7 @@ SECTIONS
- *(__ksymtab)
- *(__ksymtab_strings)
- *(__bug_table)
-+ *(__kcrctab)
- }
-
- }
---- linux-2.6.0/arch/ppc/boot/simple/Makefile 2003-09-27 18:57:43.000000000 -0700
-+++ 25/arch/ppc/boot/simple/Makefile 2003-12-28 23:22:26.000000000 -0800
-@@ -4,30 +4,38 @@
- # Author: Tom Rini <trini@mvista.com>
- #
- # Notes:
--# (1) For machine targets which produce more than one image, define
--# ZNETBOOT and ZNETBOOTRD to the image which should be available for
--# 'znetboot' and 'znetboot.initrd`
--# (2) Also, for machine targets which just need to remove the ELF header,
--# define END to be the machine name you want in the image.
--# (3) For machine targets which use the mktree program, define END to be
--# the machine name you want in the image, and you can optionally set
--# ENTRYPOINT which the image should be loaded at. The optimal setting
--# for ENTRYPOINT is the link address.
-+# (1) For machines that do not want to use the ELF image directly (including
-+# stripping just the ELF header off), they must set the variables
-+# zimage-$(CONFIG_MACHINE) and zimagerd-$(CONFIG_MACHINE) to the target
-+# that produces the desired image and they must set end-$(CONFIG_MACHINE)
-+# to what will be suffixed to the image filename.
-+# (2) Regardless of (1), to have the resulting image be something other
-+# than 'zImage.elf', set end-$(CONFIG_MACHINE) to be the suffix used for
-+# the zImage, znetboot, and znetbootrd targets.
-+# (3) For machine targets which use the mktree program, you can optionally
-+# set entrypoint-$(CONFIG_MACHINE) to the location which the image should be
-+# loaded at. The optimal setting for entrypoint-$(CONFIG_MACHINE) is the link
-+# address.
- # (4) It is advisable to pass in the memory size using BI_MEMSIZE and
- # get_mem_size(), which is memory controller dependent. Add in the correct
--# XXX_memory.o file for this to work, as well as editing the $(MISC) file.
--
-+# XXX_memory.o file for this to work, as well as editing the
-+# misc-$(CONFIG_MACHINE) variable.
-
- boot := arch/ppc/boot
- common := $(boot)/common
- utils := $(boot)/utils
- bootlib := $(boot)/lib
- images := $(boot)/images
-+tftpboot := /tftpboot
-
- # Normally, we use the 'misc.c' file for decompress_kernel and
- # whatnot. Sometimes we need to override this however.
- misc-y := misc.o
-
-+# Normally, we have our images end in .elf, but something we want to
-+# change this.
-+end-y := elf
-+
- # Additionally, we normally don't need to mess with the L2 / L3 caches
- # if present on 'classic' PPC.
- cacheflag-y := -DCLEAR_CACHES=""
-@@ -41,48 +49,43 @@ clear_L2_L3 := $(boot)/simple/clear.S
- zimage-$(CONFIG_IBM_OPENBIOS) := zImage-TREE
- zimageinitrd-$(CONFIG_IBM_OPENBIOS) := zImage.initrd-TREE
- end-$(CONFIG_IBM_OPENBIOS) := treeboot
-- tftpimage-$(CONFIG_IBM_OPENBIOS) := /tftpboot/zImage.$(end-y)
- misc-$(CONFIG_IBM_OPENBIOS) := misc-embedded.o
-
-- tftpimage-$(CONFIG_EMBEDDEDBOOT) := /tftpboot/zImage.embedded
-+ end-$(CONFIG_EMBEDDEDBOOT) := embedded
- misc-$(CONFIG_EMBEDDEDBOOT) := misc-embedded.o
-
- zimage-$(CONFIG_EBONY) := zImage-TREE
- zimageinitrd-$(CONFIG_EBONY) := zImage.initrd-TREE
- end-$(CONFIG_EBONY) := ebony
- entrypoint-$(CONFIG_EBONY) := 0x01000000
-- tftpimage-$(CONFIG_EBONY) := /tftpboot/zImage.$(end-y)
-
- zimage-$(CONFIG_OCOTEA) := zImage-TREE
- zimageinitrd-$(CONFIG_OCOTEA) := zImage.initrd-TREE
- end-$(CONFIG_OCOTEA) := ocotea
- entrypoint-$(CONFIG_OCOTEA) := 0x01000000
-- tftpimage-$(CONFIG_OCOTEA) := /tftpboot/zImage.$(end-y)
-
- extra.o-$(CONFIG_EV64260) := direct.o misc-ev64260.o
-- tftpimage-$(CONFIG_EV64260) := /tftpboot/zImage.ev64260
-+ end-$(CONFIG_EV64260) := ev64260
- cacheflag-$(CONFIG_EV64260) := -include $(clear_L2_L3)
-
- zimage-$(CONFIG_GEMINI) := zImage-STRIPELF
- zimageinitrd-$(CONFIG_GEMINI) := zImage.initrd-STRIPELF
- end-$(CONFIG_GEMINI) := gemini
-- tftpimage-$(CONFIG_GEMINI) := /tftpboot/zImage.$(end-y)
-
- extra.o-$(CONFIG_K2) := legacy.o
-- tftpimage-$(CONFIG_K2) := /tftpboot/zImage.k2
-+ end-$(CONFIG_K2) := k2
- cacheflag-$(CONFIG_K2) := -include $(clear_L2_L3)
-
- # kconfig 'feature', only one of these will ever be 'y' at a time.
- # The rest will be unset.
- motorola := $(CONFIG_MCPN765)$(CONFIG_MVME5100)$(CONFIG_PRPMC750) \
- $(CONFIG_PRPMC800)$(CONFIG_LOPEC)$(CONFIG_PPLUS)
-+motorola := $(strip $(motorola))
- pcore := $(CONFIG_PCORE)$(CONFIG_POWERPMC250)
-
- zimage-$(motorola) := zImage-PPLUS
- zimageinitrd-$(motorola) := zImage.initrd-PPLUS
-- tftpimage-$(motorola) := /tftpboot/zImage.pplus
-- znetboot-$(motorola) := zImage.pplus
-- znetbootrd-$(motorola) := zImage.initrd.pplus
-+ end-$(motorola) := pplus
-
- # Overrides previous assingment
- extra.o-$(CONFIG_PPLUS) := legacy.o
-@@ -91,10 +94,9 @@ zimageinitrd-$(motorola) := zImage.init
- zimageinitrd-$(pcore) := zImage.initrd-STRIPELF
- extra.o-$(pcore) := chrpmap.o
- end-$(pcore) := pcore
-- tftpimage-$(pcore) := /tftpboot/zImage.$(end-y)
- cacheflag-$(pcore) := -include $(clear_L2_L3)
-
-- tftpimage-$(CONFIG_SANDPOINT) := /tftpboot/zImage.sandpoint
-+ end-$(CONFIG_SANDPOINT) := sandpoint
- cacheflag-$(CONFIG_SANDPOINT) := -include $(clear_L2_L3)
-
- zimage-$(CONFIG_SPRUCE) := zImage-TREE
-@@ -102,11 +104,9 @@ zimageinitrd-$(CONFIG_SPRUCE) := zImage
- end-$(CONFIG_SPRUCE) := spruce
- entrypoint-$(CONFIG_SPRUCE) := 0x00800000
- misc-$(CONFIG_SPRUCE) := misc-spruce.o
-- tftpimage-$(CONFIG_SPRUCE) := /tftpboot/zImage.$(end-y)
--
-
--# tftp image is prefixed with .smp if compiled for SMP
--tftpimage-$(CONFIG_SMP) += .smp
-+# SMP images should have a '.smp' suffix.
-+ end-$(CONFIG_SMP) += .smp
-
- # This is a treeboot that needs init functions until the
- # boot rom is sorted out (i.e. this is short lived)
-@@ -180,18 +180,10 @@ zImage.initrd: $(images)/$(zimageinitrd-
- rm -f $(obj)/zvmlinux.initrd
-
- znetboot: zImage
--ifneq ($(ZNETBOOT),)
-- cp $(images)/$(ZNETBOOT) $(tftpimage-y)
--else
-- cp $(images)/zImage.* $(tftpimage-y)
--endif
-+ cp $(images)/zImage.$(end-y) $(tftpboot)/zImage.$(end-y)
-
- znetboot.initrd: zImage.initrd
--ifneq ($(znetbootrd-y),)
-- cp $(images)/$(znetbootrd-y) $(tftpimage-y)
--else
-- cp $(images)/zImage.* $(tftpimage-y)
--endif
-+ cp $(images)/zImage.initrd.$(end-y) $(tftpboot)/zImage.initrd.$(end-y)
-
- $(images)/zImage-STRIPELF: $(obj)/zvmlinux
- dd if=$(obj)/zvmlinux of=$(images)/zImage.$(end-y) skip=64 bs=1k
---- linux-2.6.0/arch/ppc/boot/utils/mkprep.c 2003-09-27 18:57:43.000000000 -0700
-+++ 25/arch/ppc/boot/utils/mkprep.c 2003-12-28 23:22:26.000000000 -0800
-@@ -12,12 +12,14 @@
- * -- Cort
- *
- * Modified for x86 hosted builds by Matt Porter <porter@neta.com>
-+ * Modified for Sparc hosted builds by Peter Wahl <PeterWahl@web.de>
- */
-
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#include <strings.h>
- #include <sys/stat.h>
- #include <unistd.h>
-
-@@ -147,7 +149,7 @@ int main(int argc, char *argv[])
- void write_prep_partition(int in, int out)
- {
- unsigned char block[512];
-- partition_entry_t *pe = (partition_entry_t *)&block[0x1BE];
-+ partition_entry_t pe;
- dword_t *entry = (dword_t *)&block[0];
- dword_t *length = (dword_t *)&block[sizeof(long)];
- struct stat info;
-@@ -177,8 +179,8 @@ void write_prep_partition(int in, int ou
- * Build a "PReP" partition table entry in the boot record
- * - "PReP" may only look at the system_indicator
- */
-- pe->boot_indicator = BootActive;
-- pe->system_indicator = SystemPrep;
-+ pe.boot_indicator = BootActive;
-+ pe.system_indicator = SystemPrep;
- /*
- * The first block of the diskette is used by this "boot record" which
- * actually contains the partition table. (The first block of the
-@@ -186,12 +188,12 @@ void write_prep_partition(int in, int ou
- * one partition on the diskette and it shall contain the rest of the
- * diskette.
- */
-- pe->starting_head = 0; /* zero-based */
-- pe->starting_sector = 2; /* one-based */
-- pe->starting_cylinder = 0; /* zero-based */
-- pe->ending_head = 1; /* assumes two heads */
-- pe->ending_sector = 18; /* assumes 18 sectors/track */
-- pe->ending_cylinder = 79; /* assumes 80 cylinders/diskette */
-+ pe.starting_head = 0; /* zero-based */
-+ pe.starting_sector = 2; /* one-based */
-+ pe.starting_cylinder = 0; /* zero-based */
-+ pe.ending_head = 1; /* assumes two heads */
-+ pe.ending_sector = 18; /* assumes 18 sectors/track */
-+ pe.ending_cylinder = 79; /* assumes 80 cylinders/diskette */
-
- /*
- * The "PReP" software ignores the above fields and just looks at
-@@ -201,20 +203,20 @@ void write_prep_partition(int in, int ou
- * - unlike the above sector numbers, the beginning sector is zero-based!
- */
- #if 0
-- pe->beginning_sector = cpu_to_le32(1);
-+ pe.beginning_sector = cpu_to_le32(1);
- #else
- /* This has to be 0 on the PowerStack? */
- #ifdef __i386__
-- pe->beginning_sector = 0;
-+ pe.beginning_sector = 0;
- #else
-- pe->beginning_sector = cpu_to_le32(0);
-+ pe.beginning_sector = cpu_to_le32(0);
- #endif /* __i386__ */
- #endif
-
- #ifdef __i386__
-- pe->number_of_sectors = 2*18*80-1;
-+ pe.number_of_sectors = 2*18*80-1;
- #else
-- pe->number_of_sectors = cpu_to_le32(2*18*80-1);
-+ pe.number_of_sectors = cpu_to_le32(2*18*80-1);
- #endif /* __i386__ */
-
- write( out, block, sizeof(block) );
---- linux-2.6.0/arch/ppc/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/ppc/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -346,17 +346,19 @@ void enable_irq(unsigned int irq)
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_puts(p, " ");
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ", j);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_puts(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ", j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if ( !action || !action->handler )
-@@ -381,22 +383,23 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-- }
-+ } else if (i == NR_IRQS) {
- #ifdef CONFIG_TAU_INT
-- if (tau_initialized){
-- seq_puts(p, "TAU: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", tau_interrupts(j));
-- seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n");
-- }
-+ if (tau_initialized){
-+ seq_puts(p, "TAU: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", tau_interrupts(j));
-+ seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n");
-+ }
- #endif
- #ifdef CONFIG_SMP
-- /* should this be per processor send/receive? */
-- seq_printf(p, "IPI (recv/sent): %10u/%u\n",
-- atomic_read(&ipi_recv), atomic_read(&ipi_sent));
-+ /* should this be per processor send/receive? */
-+ seq_printf(p, "IPI (recv/sent): %10u/%u\n",
-+ atomic_read(&ipi_recv), atomic_read(&ipi_sent));
- #endif
-- seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
-+ seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
-+ }
- return 0;
- }
-
-@@ -569,67 +572,16 @@ static struct proc_dir_entry *smp_affini
-
- cpumask_t irq_affinity [NR_IRQS];
-
--#define HEX_DIGITS (2*sizeof(cpumask_t))
--
- static int irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- cpumask_t tmp = irq_affinity[(long)data];
-- int k, len = 0;
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
--
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
--
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
--static unsigned int parse_hex_value (const char __user *buffer,
-- unsigned long count, cpumask_t *ret)
--{
-- unsigned char hexnum [HEX_DIGITS];
-- cpumask_t value = CPU_MASK_NONE;
-- int i;
--
-- if (!count)
-- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first 8 characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
-- for (i = 0; i < count; i++) {
-- unsigned int c = hexnum[i];
-- int k;
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- cpus_shift_left(value, value, 4);
-- for (k = 0; k < 4; ++k)
-- if (c & (1 << k))
-- cpu_set(k, value);
-- }
--out:
-- *ret = value;
-- return 0;
--}
--
- static int irq_affinity_write_proc (struct file *file, const char __user *buffer,
- unsigned long count, void *data)
- {
-@@ -639,7 +591,7 @@ static int irq_affinity_write_proc (stru
- if (!irq_desc[irq].handler->set_affinity)
- return -EIO;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
-
- /*
- * Do not allow disabling IRQs completely - it's a too easy
-@@ -664,19 +616,10 @@ static int irq_affinity_write_proc (stru
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- cpumask_t mask = *(cpumask_t *)data;
-- int k, len = 0;
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
--
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(mask));
-- len += j;
-- page += j;
-- cpus_shift_right(mask, mask, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -686,7 +629,7 @@ static int prof_cpu_mask_write_proc (str
- cpumask_t *mask = (cpumask_t *)data, full_count = count, err;
- cpumask_t new_value;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- linux-2.6.0/arch/ppc/kernel/Makefile 2003-09-27 18:57:43.000000000 -0700
-+++ 25/arch/ppc/kernel/Makefile 2003-12-28 23:22:27.000000000 -0800
-@@ -9,8 +9,7 @@ ifdef CONFIG_4xx
- EXTRA_AFLAGS := -Wa,-m405
- endif
-
--# Start off with 'head.o', change as needed.
--extra-y := head.o
-+extra-$(CONFIG_PPC_STD_MMU) := head.o
- extra-$(CONFIG_40x) := head_4xx.o
- extra-$(CONFIG_44x) := head_44x.o
- extra-$(CONFIG_8xx) := head_8xx.o
---- linux-2.6.0/arch/ppc/kernel/ppc_ksyms.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/ppc/kernel/ppc_ksyms.c 2003-12-28 23:22:27.000000000 -0800
-@@ -92,7 +92,7 @@ EXPORT_SYMBOL(disable_irq_nosync);
- EXPORT_SYMBOL(probe_irq_mask);
-
- EXPORT_SYMBOL(ISA_DMA_THRESHOLD);
--EXPORT_SYMBOL_NOVERS(DMA_MODE_READ);
-+EXPORT_SYMBOL(DMA_MODE_READ);
- EXPORT_SYMBOL(DMA_MODE_WRITE);
- #if defined(CONFIG_PPC_PREP)
- EXPORT_SYMBOL(_prep_type);
-@@ -167,9 +167,9 @@ EXPORT_SYMBOL(ppc_ide_md);
- #endif
-
- #ifdef CONFIG_PCI
--EXPORT_SYMBOL_NOVERS(isa_io_base);
--EXPORT_SYMBOL_NOVERS(isa_mem_base);
--EXPORT_SYMBOL_NOVERS(pci_dram_offset);
-+EXPORT_SYMBOL(isa_io_base);
-+EXPORT_SYMBOL(isa_mem_base);
-+EXPORT_SYMBOL(pci_dram_offset);
- EXPORT_SYMBOL(pci_alloc_consistent);
- EXPORT_SYMBOL(pci_free_consistent);
- EXPORT_SYMBOL(pci_bus_io_base);
-@@ -246,7 +246,7 @@ EXPORT_SYMBOL(register_backlight_control
- EXPORT_SYMBOL(_machine);
- #endif
- #ifdef CONFIG_PPC_PMAC
--EXPORT_SYMBOL_NOVERS(sys_ctrler);
-+EXPORT_SYMBOL(sys_ctrler);
- EXPORT_SYMBOL(pmac_newworld);
- #endif
- #ifdef CONFIG_PPC_OF
-@@ -294,15 +294,15 @@ EXPORT_SYMBOL(to_tm);
-
- EXPORT_SYMBOL(pm_power_off);
-
--EXPORT_SYMBOL_NOVERS(__ashrdi3);
--EXPORT_SYMBOL_NOVERS(__ashldi3);
--EXPORT_SYMBOL_NOVERS(__lshrdi3);
--EXPORT_SYMBOL_NOVERS(memcpy);
--EXPORT_SYMBOL_NOVERS(memset);
--EXPORT_SYMBOL_NOVERS(memmove);
--EXPORT_SYMBOL_NOVERS(memscan);
--EXPORT_SYMBOL_NOVERS(memcmp);
--EXPORT_SYMBOL_NOVERS(memchr);
-+EXPORT_SYMBOL(__ashrdi3);
-+EXPORT_SYMBOL(__ashldi3);
-+EXPORT_SYMBOL(__lshrdi3);
-+EXPORT_SYMBOL(memcpy);
-+EXPORT_SYMBOL(memset);
-+EXPORT_SYMBOL(memmove);
-+EXPORT_SYMBOL(memscan);
-+EXPORT_SYMBOL(memcmp);
-+EXPORT_SYMBOL(memchr);
-
- EXPORT_SYMBOL(abs);
-
-@@ -366,10 +366,10 @@ EXPORT_SYMBOL(request_8xxirq);
- EXPORT_SYMBOL(next_mmu_context);
- EXPORT_SYMBOL(set_context);
- EXPORT_SYMBOL(handle_mm_fault); /* For MOL */
--EXPORT_SYMBOL_NOVERS(disarm_decr);
-+EXPORT_SYMBOL(disarm_decr);
-+#ifdef CONFIG_PPC_STD_MMU
- extern long mol_trampoline;
- EXPORT_SYMBOL(mol_trampoline); /* For MOL */
--#ifdef CONFIG_PPC_STD_MMU
- EXPORT_SYMBOL(flush_hash_pages); /* For MOL */
- #ifdef CONFIG_SMP
- extern int mmu_hash_lock;
-@@ -381,5 +381,5 @@ EXPORT_SYMBOL(intercept_table);
- EXPORT_SYMBOL(cur_cpu_spec);
- #ifdef CONFIG_PPC_PMAC
- extern unsigned long agp_special_page;
--EXPORT_SYMBOL_NOVERS(agp_special_page);
-+EXPORT_SYMBOL(agp_special_page);
- #endif
---- linux-2.6.0/arch/ppc/mm/cachemap.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/ppc/mm/cachemap.c 2003-12-28 23:22:26.000000000 -0800
-@@ -170,3 +170,5 @@ void consistent_sync_page(struct page *p
- start = (unsigned long)page_address(page) + offset;
- consistent_sync((void *)start, size, direction);
- }
-+
-+EXPORT_SYMBOL(consistent_sync_page);
---- linux-2.6.0/arch/ppc/platforms/mpc82xx.h 2003-09-27 18:57:43.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,42 +0,0 @@
--/*
-- * arch/ppc/platforms/mpc82xx.h
-- *
-- * Board specific support for various 82xx platforms.
-- *
-- * Author: Allen Curtis <acurtis@onz.com>
-- *
-- * Copyright 2002 Ones and Zeros, 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; either version 2 of the License, or (at your
-- * option) any later version.
-- */
--#ifndef __CONFIG_82XX_PLATFORMS
--#define __CONFIG_82XX_PLATFORMS
--
--#ifdef CONFIG_8260
--
--#ifdef CONFIG_EST8260
--#include <platforms/est8260.h>
--#endif
--
--#ifdef CONFIG_SBS8260
--#include <platforms/sbs8260.h>
--#endif
--
--#ifdef CONFIG_RPX6
--#include <platforms/rpxsuper.h>
--#endif
--
--#ifdef CONFIG_WILLOW
--#include <platforms/willow.h>
--#endif
--
--#ifdef CONFIG_TQM8260
--#include <platforms/tqm8260.h>
--#endif
--
--#endif /* CONFIG_8260 */
--
--#endif
---- linux-2.6.0/arch/s390/kernel/compat_wrapper.S 2003-06-14 12:18:51.000000000 -0700
-+++ 25/arch/s390/kernel/compat_wrapper.S 2003-12-28 23:21:47.000000000 -0800
-@@ -5,6 +5,7 @@
- * S390 version
- * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- * Author(s): Gerhard Tonn (ton@de.ibm.com),
-+* Thomas Spatzier (tspat@de.ibm.com)
- */
-
- .globl sys32_exit_wrapper
-@@ -1230,3 +1231,37 @@ sys_epoll_wait_wrapper:
- lgfr %r4,%r4 # int
- lgfr %r5,%r5 # int
- jg sys_epoll_wait # branch to system call
-+
-+ .globl sys32_io_setup_wrapper
-+sys32_io_setup_wrapper:
-+ llgfr %r2,%r2 # unsigned int
-+ llgtr %r3,%r3 # u32 *
-+ jg compat_sys_io_setup
-+
-+ .globl sys32_io_destroy_wrapper
-+sys32_io_destroy_wrapper:
-+ llgfr %r2,%r2 # (aio_context_t) u32
-+ jg sys_io_destroy
-+
-+ .globl sys32_io_getevents_wrapper
-+sys32_io_getevents_wrapper:
-+ llgfr %r2,%r2 # (aio_context_t) u32
-+ lgfr %r3,%r3 # long
-+ lgfr %r4,%r4 # long
-+ llgtr %r5,%r5 # struct io_event *
-+ llgtr %r6,%r6 # struct compat_timespec *
-+ jg compat_sys_io_getevents
-+
-+ .globl sys32_io_submit_wrapper
-+sys32_io_submit_wrapper:
-+ llgfr %r2,%r2 # (aio_context_t) u32
-+ lgfr %r3,%r3 # long
-+ llgtr %r4,%r4 # struct iocb **
-+ jg compat_sys_io_submit
-+
-+ .globl sys32_io_cancel_wrapper
-+sys32_io_cancel_wrapper:
-+ llgfr %r2,%r2 # (aio_context_t) u32
-+ llgtr %r3,%r3 # struct iocb *
-+ llgtr %r4,%r4 # struct io_event *
-+ jg sys_io_cancel
---- linux-2.6.0/arch/s390/kernel/setup.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/s390/kernel/setup.c 2003-12-28 23:22:06.000000000 -0800
-@@ -617,17 +617,17 @@ static const char *intrclass_names[] = {
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
-
-- seq_puts(p, " ");
--
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
--
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_puts(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- seq_printf(p, "%s: ", intrclass_names[i]);
- #ifndef CONFIG_SMP
- seq_printf(p, "%10u ", kstat_irqs(i));
---- linux-2.6.0/arch/s390/kernel/syscalls.S 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/s390/kernel/syscalls.S 2003-12-28 23:21:47.000000000 -0800
-@@ -251,11 +251,11 @@ SYSCALL(sys_sched_setaffinity,sys_sched_
- SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper) /* 240 */
- SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill)
- NI_SYSCALL /* reserved for TUX */
--SYSCALL(sys_io_setup,sys_io_setup,sys_ni_syscall)
--SYSCALL(sys_io_destroy,sys_io_destroy,sys_ni_syscall)
--SYSCALL(sys_io_getevents,sys_io_getevents,sys_ni_syscall) /* 245 */
--SYSCALL(sys_io_submit,sys_io_submit,sys_ni_syscall)
--SYSCALL(sys_io_cancel,sys_io_cancel,sys_ni_syscall)
-+SYSCALL(sys_io_setup,sys_io_setup,sys32_io_setup_wrapper)
-+SYSCALL(sys_io_destroy,sys_io_destroy,sys32_io_destroy_wrapper)
-+SYSCALL(sys_io_getevents,sys_io_getevents,sys32_io_getevents_wrapper) /* 245 */
-+SYSCALL(sys_io_submit,sys_io_submit,sys32_io_submit_wrapper)
-+SYSCALL(sys_io_cancel,sys_io_cancel,sys32_io_cancel_wrapper)
- SYSCALL(sys_exit_group,sys_exit_group,sys32_exit_group_wrapper)
- SYSCALL(sys_epoll_create,sys_epoll_create,sys_epoll_create_wrapper)
- SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_epoll_ctl_wrapper) /* 250 */
---- linux-2.6.0/arch/sh/Kconfig 2003-09-27 18:57:44.000000000 -0700
-+++ 25/arch/sh/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -1053,7 +1053,7 @@ config WATCHDOG
- implementation entirely in software (which can sometimes fail to
- reboot the machine) and a driver for hardware watchdog boards, which
- are more robust and can also keep track of the temperature inside
-- your computer. For details, read <file:Documentation/watchdog.txt>
-+ your computer. For details, read <file:Documentation/watchdog/watchdog.txt>
- in the kernel source.
-
- The watchdog is usually used together with the watchdog daemon
---- linux-2.6.0/arch/sh/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/sh/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -93,17 +93,19 @@ struct hw_interrupt_type no_irq_type = {
- #if defined(CONFIG_PROC_FS)
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_puts(p, " ");
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_puts(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < ACTUAL_NR_IRQS ; i++) {
-+ if (i < ACTUAL_NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action)
---- linux-2.6.0/arch/sparc64/Kconfig 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/sparc64/Kconfig 2003-12-28 23:26:33.000000000 -0800
-@@ -808,12 +808,19 @@ config DEBUG_SPINLOCK
- best used in conjunction with the NMI watchdog so that spinlock
- deadlocks are also debuggable.
-
-+config LOCKMETER
-+ bool "Kernel lock metering"
-+ depends on SMP && !PREEMPT
-+ help
-+ Say Y to enable kernel lock metering, which adds overhead to SMP locks,
-+ but allows you to see various statistics using the lockstat command.
-+
- # We have a custom atomic_dec_and_lock() implementation but it's not
- # compatible with spinlock debugging so we need to fall back on
- # the generic version in that case.
- config HAVE_DEC_LOCK
- bool
-- depends on SMP && !DEBUG_SPINLOCK
-+ depends on SMP && !DEBUG_SPINLOCK && !LOCKMETER
- default y
-
- config DEBUG_SPINLOCK_SLEEP
---- linux-2.6.0/arch/sparc64/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/sparc64/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -128,14 +128,14 @@ static void register_irq_proc (unsigned
- int show_interrupts(struct seq_file *p, void *v)
- {
- unsigned long flags;
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction *action;
- #ifdef CONFIG_SMP
- int j;
- #endif
-
- spin_lock_irqsave(&irq_action_lock, flags);
-- for (i = 0; i < (NR_IRQS + 1); i++) {
-+ if (i <= NR_IRQS) {
- if (!(action = *(i + irq_action)))
- continue;
- seq_printf(p, "%3d: ", i);
-@@ -1204,11 +1204,17 @@ static int irq_affinity_read_proc (char
- {
- struct ino_bucket *bp = ivector_table + (long)data;
- struct irqaction *ap = bp->irq_info;
-- unsigned long mask = get_smpaff_in_irqaction(ap);
-+ cpumask_t mask = get_smpaff_in_irqaction(ap);
-+ int len;
-+
-+ if (cpus_empty(mask))
-+ mask = cpu_online_map;
-
-- if (count < HEX_DIGITS+1)
-+ len = cpumask_snprintf(page, count, mask);
-+ if (count - len < 2)
- return -EINVAL;
-- return sprintf (page, "%016lx\n", mask == 0 ? ~0UL : mask);
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static inline void set_intr_affinity(int irq, unsigned long hw_aff)
---- linux-2.6.0/arch/sparc64/kernel/systbls.S 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/sparc64/kernel/systbls.S 2003-12-28 23:21:47.000000000 -0800
-@@ -72,8 +72,8 @@ sys_call_table32:
- /*250*/ .word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, sys32_nfsservctl
- .word sys_ni_syscall, compat_clock_settime, compat_clock_gettime, compat_clock_getres, compat_clock_nanosleep
- /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, compat_timer_settime, compat_timer_gettime, sys_timer_getoverrun
-- .word sys_timer_delete, sys32_timer_create, sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
--/*270*/ .word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
-+ .word sys_timer_delete, sys32_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
-+/*270*/ .word compat_sys_io_submit, sys_io_cancel, compat_sys_io_getevents, sys_ni_syscall
-
- /* Now the 64-bit native Linux syscall table. */
-
---- linux-2.6.0/arch/sparc64/lib/rwlock.S 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/sparc64/lib/rwlock.S 2003-12-28 23:26:34.000000000 -0800
-@@ -85,5 +85,20 @@ __write_trylock_succeed:
- __write_trylock_fail:
- retl
- mov 0, %o0
-+
-+ .globl __read_trylock
-+__read_trylock: /* %o0 = lock_ptr */
-+ ldsw [%o0], %g5
-+ brlz,pn %g5, 100f
-+ add %g5, 1, %g7
-+ cas [%o0], %g5, %g7
-+ cmp %g5, %g7
-+ bne,pn %icc, __read_trylock
-+ membar #StoreLoad | #StoreStore
-+ retl
-+ mov 1, %o0
-+100: retl
-+ mov 0, %o0
-+
- rwlock_impl_end:
-
---- linux-2.6.0/arch/sparc64/mm/hugetlbpage.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/arch/sparc64/mm/hugetlbpage.c 2003-12-28 23:22:12.000000000 -0800
-@@ -504,7 +504,7 @@ int is_hugepage_mem_enough(size_t size)
- * this far.
- */
- static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-- unsigned long address, int unused)
-+ unsigned long address, int *unused)
- {
- BUG();
- return NULL;
---- linux-2.6.0/arch/sparc/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/sparc/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -102,7 +102,7 @@ struct irqaction *irq_action[NR_IRQS] =
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
- #ifdef CONFIG_SMP
-@@ -114,7 +114,7 @@ int show_interrupts(struct seq_file *p,
-
- return show_sun4d_interrupts(p, v);
- }
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- local_irq_save(flags);
- action = *(i + irq_action);
- if (!action)
---- linux-2.6.0/arch/sparc/kernel/sun4d_irq.c 2003-06-14 12:17:55.000000000 -0700
-+++ 25/arch/sparc/kernel/sun4d_irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -75,13 +75,13 @@ spinlock_t sun4d_imsk_lock = SPIN_LOCK_U
-
- int show_sun4d_interrupts(struct seq_file *p, void *v)
- {
-- int i, j = 0, k = 0, sbusl;
-+ int i = *(loff_t *) v, j = 0, k = 0, sbusl;
- struct irqaction * action;
- #ifdef CONFIG_SMP
- int x;
- #endif
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- sbusl = pil_to_sbus[i];
- if (!sbusl) {
- action = *(i + irq_action);
---- linux-2.6.0/arch/sparc/mm/highmem.c 2003-06-14 12:18:04.000000000 -0700
-+++ 25/arch/sparc/mm/highmem.c 2003-12-28 23:22:58.000000000 -0800
-@@ -33,6 +33,7 @@ void *kmap_atomic(struct page *page, enu
- unsigned long idx;
- unsigned long vaddr;
-
-+ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
- inc_preempt_count();
- if (page < highmem_start_page)
- return page_address(page);
-@@ -69,6 +70,7 @@ void kunmap_atomic(void *kvaddr, enum km
-
- if (vaddr < fix_kmap_begin) { // FIXME
- dec_preempt_count();
-+ preempt_check_resched();
- return;
- }
-
-@@ -96,4 +98,5 @@ void kunmap_atomic(void *kvaddr, enum km
- #endif
- #endif
- dec_preempt_count();
-+ preempt_check_resched();
- }
---- linux-2.6.0/arch/um/drivers/ubd_kern.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/um/drivers/ubd_kern.c 2003-12-28 23:21:17.000000000 -0800
-@@ -49,9 +49,9 @@ static spinlock_t ubd_lock = SPIN_LOCK_U
-
- static void (*do_ubd)(void);
-
--static int ubd_open(struct inode * inode, struct file * filp);
--static int ubd_release(struct inode * inode, struct file * file);
--static int ubd_ioctl(struct inode * inode, struct file * file,
-+static int ubd_open(struct block_device *bdev, struct file * filp);
-+static int ubd_release(struct gendisk *disk);
-+static int ubd_ioctl(struct block_device *bdev, struct file * file,
- unsigned int cmd, unsigned long arg);
-
- #define MAX_DEV (8)
-@@ -710,9 +710,9 @@ int ubd_driver_init(void){
-
- device_initcall(ubd_driver_init);
-
--static int ubd_open(struct inode *inode, struct file *filp)
-+static int ubd_open(struct block_device *bdev, struct file *filp)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct ubd *dev = disk->private_data;
- int err = -EISDIR;
-
-@@ -739,9 +739,8 @@ static int ubd_open(struct inode *inode,
- return(err);
- }
-
--static int ubd_release(struct inode * inode, struct file * file)
-+static int ubd_release(struct gendisk *disk)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
- struct ubd *dev = disk->private_data;
-
- if(--dev->count == 0)
-@@ -865,11 +864,11 @@ static void do_ubd_request(request_queue
- }
- }
-
--static int ubd_ioctl(struct inode * inode, struct file * file,
-+static int ubd_ioctl(struct block_device *bdev, struct file * file,
- unsigned int cmd, unsigned long arg)
- {
- struct hd_geometry *loc = (struct hd_geometry *) arg;
-- struct ubd *dev = inode->i_bdev->bd_disk->private_data;
-+ struct ubd *dev = bdev->bd_disk->private_data;
- int err;
- struct hd_driveid ubd_id = {
- .cyls = 0,
-@@ -890,7 +889,7 @@ static int ubd_ioctl(struct inode * inod
-
- case HDIO_SET_UNMASKINTR:
- if(!capable(CAP_SYS_ADMIN)) return(-EACCES);
-- if((arg > 1) || (inode->i_bdev->bd_contains != inode->i_bdev))
-+ if((arg > 1) || (bdev->bd_contains != bdev))
- return(-EINVAL);
- return(0);
-
-@@ -910,7 +909,7 @@ static int ubd_ioctl(struct inode * inod
-
- case HDIO_SET_MULTCOUNT:
- if(!capable(CAP_SYS_ADMIN)) return(-EACCES);
-- if(inode->i_bdev->bd_contains != inode->i_bdev)
-+ if(bdev->bd_contains != bdev)
- return(-EINVAL);
- return(0);
-
---- linux-2.6.0/arch/um/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/um/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -572,53 +572,14 @@ static struct proc_dir_entry * smp_affin
- */
- static cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
-
--#define HEX_DIGITS (2*sizeof(cpumask_t))
--
- static int irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- if (count < HEX_DIGITS+1)
-- return -EINVAL;
-- return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
--}
--
--static unsigned int parse_hex_value (const char *buffer,
-- unsigned long count, cpumask_t *ret)
--{
-- unsigned char hexnum [HEX_DIGITS];
-- cpumask_t value = CPU_MASK_NONE;
-- int i;
--
-- if (!count)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first 8 characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
--
-- for (i = 0; i < count; i++) {
-- unsigned int k, c = hexnum[i];
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- cpus_shift_left(value, value, 16);
-- for (k = 0; k < 4; ++k)
-- if (c & (1 << k))
-- cpu_set(k, value);
-- }
--out:
-- *ret = value;
-- return 0;
-+ len += sprintf(page + len, "\n");
-+ return len;
- }
-
- static int irq_affinity_write_proc (struct file *file, const char *buffer,
-@@ -630,7 +591,7 @@ static int irq_affinity_write_proc (stru
- if (!irq_desc[irq].handler->set_affinity)
- return -EIO;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
-
- #ifdef CONFIG_SMP
- /*
-@@ -652,19 +613,10 @@ static int irq_affinity_write_proc (stru
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- cpumask_t tmp, *mask = (cpumask_t *) data;
-- int k, len = 0;
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
-- tmp = *mask;
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -674,7 +626,7 @@ static int prof_cpu_mask_write_proc (str
- cpumask_t *mask = (cpumask_t *)data, new_value;
- unsigned long full_count = count, err;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- linux-2.6.0/arch/v850/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/v850/kernel/irq.c 2003-12-28 23:22:06.000000000 -0800
-@@ -81,16 +81,18 @@ volatile unsigned long irq_err_count, sp
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i;
-+ int i = *(loff_t *) v;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_puts(p, " ");
-- for (i=0; i < 1 /*smp_num_cpus*/; i++)
-- seq_printf(p, "CPU%d ", i);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_puts(p, " ");
-+ for (i=0; i < 1 /*smp_num_cpus*/; i++)
-+ seq_printf(p, "CPU%d ", i);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- int j, count, num;
- const char *type_name = irq_desc[i].handler->typename;
- spin_lock_irqsave(&irq_desc[j].lock, flags);
-@@ -121,8 +123,8 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&irq_desc[j].lock, flags);
-- }
-- seq_printf(p, "ERR: %10lu\n", irq_err_count);
-+ } else if (i == NR_IRQS)
-+ seq_printf(p, "ERR: %10lu\n", irq_err_count);
- return 0;
- }
-
---- linux-2.6.0/arch/x86_64/boot/compressed/head.S 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/x86_64/boot/compressed/head.S 2003-12-28 23:21:09.000000000 -0800
-@@ -26,6 +26,7 @@
- .code32
- .text
-
-+#define IN_BOOTLOADER
- #include <linux/linkage.h>
- #include <asm/segment.h>
-
---- linux-2.6.0/arch/x86_64/boot/compressed/misc.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/arch/x86_64/boot/compressed/misc.c 2003-12-28 23:21:09.000000000 -0800
-@@ -9,6 +9,7 @@
- * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
- */
-
-+#define IN_BOOTLOADER
- #include "miscsetup.h"
- #include <asm/io.h>
-
---- linux-2.6.0/arch/x86_64/defconfig 2003-09-27 18:57:44.000000000 -0700
-+++ 25/arch/x86_64/defconfig 2003-12-28 23:26:30.000000000 -0800
-@@ -743,7 +743,7 @@ CONFIG_MAGIC_SYSRQ=y
- # CONFIG_INIT_DEBUG is not set
- # CONFIG_DEBUG_INFO is not set
- # CONFIG_FRAME_POINTER is not set
--CONFIG_IOMMU_DEBUG=y
-+# CONFIG_IOMMU_DEBUG is not set
- CONFIG_IOMMU_LEAK=y
- CONFIG_MCE_DEBUG=y
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/arch/x86_64/ia32/ia32_aout.c 2003-12-28 23:22:16.000000000 -0800
-@@ -0,0 +1,506 @@
-+/*
-+ * a.out loader for x86-64
-+ *
-+ * Copyright (C) 1991, 1992, 1996 Linus Torvalds
-+ * Hacked together by Andi Kleen
-+ */
-+
-+#include <linux/module.h>
-+
-+#include <linux/time.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/mman.h>
-+#include <linux/a.out.h>
-+#include <linux/errno.h>
-+#include <linux/signal.h>
-+#include <linux/string.h>
-+#include <linux/fs.h>
-+#include <linux/file.h>
-+#include <linux/stat.h>
-+#include <linux/fcntl.h>
-+#include <linux/ptrace.h>
-+#include <linux/user.h>
-+#include <linux/slab.h>
-+#include <linux/binfmts.h>
-+#include <linux/personality.h>
-+#include <linux/init.h>
-+
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/pgalloc.h>
-+#include <asm/cacheflush.h>
-+#include <asm/user32.h>
-+
-+#undef WARN_OLD
-+
-+extern int ia32_setup_arg_pages(struct linux_binprm *bprm);
-+
-+static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs);
-+static int load_aout_library(struct file*);
-+static int aout_core_dump(long signr, struct pt_regs * regs, struct file *file);
-+
-+/*
-+ * fill in the user structure for a core dump..
-+ */
-+static void dump_thread32(struct pt_regs * regs, struct user32 * dump)
-+{
-+ u32 fs,gs;
-+
-+/* changed the size calculations - should hopefully work better. lbt */
-+ dump->magic = CMAGIC;
-+ dump->start_code = 0;
-+ dump->start_stack = regs->rsp & ~(PAGE_SIZE - 1);
-+ dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
-+ dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
-+ dump->u_dsize -= dump->u_tsize;
-+ dump->u_ssize = 0;
-+ dump->u_debugreg[0] = current->thread.debugreg0;
-+ dump->u_debugreg[1] = current->thread.debugreg1;
-+ dump->u_debugreg[2] = current->thread.debugreg2;
-+ dump->u_debugreg[3] = current->thread.debugreg3;
-+ dump->u_debugreg[4] = 0;
-+ dump->u_debugreg[5] = 0;
-+ dump->u_debugreg[6] = current->thread.debugreg6;
-+ dump->u_debugreg[7] = current->thread.debugreg7;
-+
-+ if (dump->start_stack < 0xc0000000)
-+ dump->u_ssize = ((unsigned long) (0xc0000000 - dump->start_stack)) >> PAGE_SHIFT;
-+
-+ dump->regs.ebx = regs->rbx;
-+ dump->regs.ecx = regs->rcx;
-+ dump->regs.edx = regs->rdx;
-+ dump->regs.esi = regs->rsi;
-+ dump->regs.edi = regs->rdi;
-+ dump->regs.ebp = regs->rbp;
-+ dump->regs.eax = regs->rax;
-+ dump->regs.ds = current->thread.ds;
-+ dump->regs.es = current->thread.es;
-+ asm("movl %%fs,%0" : "=r" (fs)); dump->regs.fs = fs;
-+ asm("movl %%gs,%0" : "=r" (gs)); dump->regs.gs = gs;
-+ dump->regs.orig_eax = regs->orig_rax;
-+ dump->regs.eip = regs->rip;
-+ dump->regs.cs = regs->cs;
-+ dump->regs.eflags = regs->eflags;
-+ dump->regs.esp = regs->rsp;
-+ dump->regs.ss = regs->ss;
-+
-+#if 1 /* FIXME */
-+ dump->u_fpvalid = 0;
-+#else
-+ dump->u_fpvalid = dump_fpu (regs, &dump->i387);
-+#endif
-+}
-+
-+static struct linux_binfmt aout_format = {
-+ .module = THIS_MODULE,
-+ .load_binary = load_aout_binary,
-+ .load_shlib = load_aout_library,
-+ .core_dump = aout_core_dump,
-+ .min_coredump = PAGE_SIZE
-+};
-+
-+static void set_brk(unsigned long start, unsigned long end)
-+{
-+ start = PAGE_ALIGN(start);
-+ end = PAGE_ALIGN(end);
-+ if (end <= start)
-+ return;
-+ do_brk(start, end - start);
-+}
-+
-+/*
-+ * These are the only things you should do on a core-file: use only these
-+ * macros to write out all the necessary info.
-+ */
-+
-+static int dump_write(struct file *file, const void *addr, int nr)
-+{
-+ return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
-+}
-+
-+#define DUMP_WRITE(addr, nr) \
-+ if (!dump_write(file, (void *)(addr), (nr))) \
-+ goto end_coredump;
-+
-+#define DUMP_SEEK(offset) \
-+if (file->f_op->llseek) { \
-+ if (file->f_op->llseek(file,(offset),0) != (offset)) \
-+ goto end_coredump; \
-+} else file->f_pos = (offset)
-+
-+/*
-+ * Routine writes a core dump image in the current directory.
-+ * Currently only a stub-function.
-+ *
-+ * Note that setuid/setgid files won't make a core-dump if the uid/gid
-+ * changed due to the set[u|g]id. It's enforced by the "current->mm->dumpable"
-+ * field, which also makes sure the core-dumps won't be recursive if the
-+ * dumping of the process results in another error..
-+ */
-+
-+static int aout_core_dump(long signr, struct pt_regs * regs, struct file *file)
-+{
-+ mm_segment_t fs;
-+ int has_dumped = 0;
-+ unsigned long dump_start, dump_size;
-+ struct user32 dump;
-+# define START_DATA(u) (u.u_tsize << PAGE_SHIFT)
-+# define START_STACK(u) (u.start_stack)
-+
-+ fs = get_fs();
-+ set_fs(KERNEL_DS);
-+ has_dumped = 1;
-+ current->flags |= PF_DUMPCORE;
-+ strncpy(dump.u_comm, current->comm, sizeof(current->comm));
-+ dump.u_ar0 = (u32)(((unsigned long)(&dump.regs)) - ((unsigned long)(&dump)));
-+ dump.signal = signr;
-+ dump_thread32(regs, &dump);
-+
-+/* If the size of the dump file exceeds the rlimit, then see what would happen
-+ if we wrote the stack, but not the data area. */
-+ if ((dump.u_dsize+dump.u_ssize+1) * PAGE_SIZE >
-+ current->rlim[RLIMIT_CORE].rlim_cur)
-+ dump.u_dsize = 0;
-+
-+/* Make sure we have enough room to write the stack and data areas. */
-+ if ((dump.u_ssize+1) * PAGE_SIZE >
-+ current->rlim[RLIMIT_CORE].rlim_cur)
-+ dump.u_ssize = 0;
-+
-+/* make sure we actually have a data and stack area to dump */
-+ set_fs(USER_DS);
-+ if (verify_area(VERIFY_READ, (void *) (unsigned long)START_DATA(dump), dump.u_dsize << PAGE_SHIFT))
-+ dump.u_dsize = 0;
-+ if (verify_area(VERIFY_READ, (void *) (unsigned long)START_STACK(dump), dump.u_ssize << PAGE_SHIFT))
-+ dump.u_ssize = 0;
-+
-+ set_fs(KERNEL_DS);
-+/* struct user */
-+ DUMP_WRITE(&dump,sizeof(dump));
-+/* Now dump all of the user data. Include malloced stuff as well */
-+ DUMP_SEEK(PAGE_SIZE);
-+/* now we start writing out the user space info */
-+ set_fs(USER_DS);
-+/* Dump the data area */
-+ if (dump.u_dsize != 0) {
-+ dump_start = START_DATA(dump);
-+ dump_size = dump.u_dsize << PAGE_SHIFT;
-+ DUMP_WRITE(dump_start,dump_size);
-+ }
-+/* Now prepare to dump the stack area */
-+ if (dump.u_ssize != 0) {
-+ dump_start = START_STACK(dump);
-+ dump_size = dump.u_ssize << PAGE_SHIFT;
-+ DUMP_WRITE(dump_start,dump_size);
-+ }
-+/* Finally dump the task struct. Not be used by gdb, but could be useful */
-+ set_fs(KERNEL_DS);
-+ DUMP_WRITE(current,sizeof(*current));
-+end_coredump:
-+ set_fs(fs);
-+ return has_dumped;
-+}
-+
-+/*
-+ * create_aout_tables() parses the env- and arg-strings in new user
-+ * memory and creates the pointer tables from them, and puts their
-+ * addresses on the "stack", returning the new stack pointer value.
-+ */
-+static u32 * create_aout_tables(char * p, struct linux_binprm * bprm)
-+{
-+ u32 *argv, *envp;
-+ u32 * sp;
-+ int argc = bprm->argc;
-+ int envc = bprm->envc;
-+
-+ sp = (u32 *) ((-(unsigned long)sizeof(u32)) & (unsigned long) p);
-+ sp -= envc+1;
-+ envp = (u32 *) sp;
-+ sp -= argc+1;
-+ argv = (u32 *) sp;
-+ put_user((unsigned long) envp,--sp);
-+ put_user((unsigned long) argv,--sp);
-+ put_user(argc,--sp);
-+ current->mm->arg_start = (unsigned long) p;
-+ while (argc-->0) {
-+ char c;
-+ put_user((u32)(unsigned long)p,argv++);
-+ do {
-+ get_user(c,p++);
-+ } while (c);
-+ }
-+ put_user(NULL,argv);
-+ current->mm->arg_end = current->mm->env_start = (unsigned long) p;
-+ while (envc-->0) {
-+ char c;
-+ put_user((u32)(unsigned long)p,envp++);
-+ do {
-+ get_user(c,p++);
-+ } while (c);
-+ }
-+ put_user(NULL,envp);
-+ current->mm->env_end = (unsigned long) p;
-+ return sp;
-+}
-+
-+/*
-+ * These are the functions used to load a.out style executables and shared
-+ * libraries. There is no binary dependent code anywhere else.
-+ */
-+
-+static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs)
-+{
-+ struct exec ex;
-+ unsigned long error;
-+ unsigned long fd_offset;
-+ unsigned long rlim;
-+ int retval;
-+
-+ ex = *((struct exec *) bprm->buf); /* exec-header */
-+ if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&
-+ N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) ||
-+ N_TRSIZE(ex) || N_DRSIZE(ex) ||
-+ i_size_read(bprm->file->f_dentry->d_inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
-+ return -ENOEXEC;
-+ }
-+
-+ fd_offset = N_TXTOFF(ex);
-+
-+ /* Check initial limits. This avoids letting people circumvent
-+ * size limits imposed on them by creating programs with large
-+ * arrays in the data or bss.
-+ */
-+ rlim = current->rlim[RLIMIT_DATA].rlim_cur;
-+ if (rlim >= RLIM_INFINITY)
-+ rlim = ~0;
-+ if (ex.a_data + ex.a_bss > rlim)
-+ return -ENOMEM;
-+
-+ /* Flush all traces of the currently running executable */
-+ retval = flush_old_exec(bprm);
-+ if (retval)
-+ return retval;
-+
-+ regs->cs = __USER32_CS;
-+ regs->r8 = regs->r9 = regs->r10 = regs->r11 = regs->r12 =
-+ regs->r13 = regs->r14 = regs->r15 = 0;
-+ set_thread_flag(TIF_IA32);
-+
-+ /* OK, This is the point of no return */
-+ set_personality(PER_LINUX);
-+
-+ current->mm->end_code = ex.a_text +
-+ (current->mm->start_code = N_TXTADDR(ex));
-+ current->mm->end_data = ex.a_data +
-+ (current->mm->start_data = N_DATADDR(ex));
-+ current->mm->brk = ex.a_bss +
-+ (current->mm->start_brk = N_BSSADDR(ex));
-+ current->mm->free_area_cache = TASK_UNMAPPED_BASE;
-+
-+ current->mm->rss = 0;
-+ current->mm->mmap = NULL;
-+ compute_creds(bprm);
-+ current->flags &= ~PF_FORKNOEXEC;
-+
-+ if (N_MAGIC(ex) == OMAGIC) {
-+ unsigned long text_addr, map_size;
-+ loff_t pos;
-+
-+ text_addr = N_TXTADDR(ex);
-+
-+ pos = 32;
-+ map_size = ex.a_text+ex.a_data;
-+
-+ error = do_brk(text_addr & PAGE_MASK, map_size);
-+ if (error != (text_addr & PAGE_MASK)) {
-+ send_sig(SIGKILL, current, 0);
-+ return error;
-+ }
-+
-+ error = bprm->file->f_op->read(bprm->file, (char *)text_addr,
-+ ex.a_text+ex.a_data, &pos);
-+ if ((signed long)error < 0) {
-+ send_sig(SIGKILL, current, 0);
-+ return error;
-+ }
-+
-+ flush_icache_range(text_addr, text_addr+ex.a_text+ex.a_data);
-+ } else {
-+#ifdef WARN_OLD
-+ static unsigned long error_time, error_time2;
-+ if ((ex.a_text & 0xfff || ex.a_data & 0xfff) &&
-+ (N_MAGIC(ex) != NMAGIC) && (jiffies-error_time2) > 5*HZ)
-+ {
-+ printk(KERN_NOTICE "executable not page aligned\n");
-+ error_time2 = jiffies;
-+ }
-+
-+ if ((fd_offset & ~PAGE_MASK) != 0 &&
-+ (jiffies-error_time) > 5*HZ)
-+ {
-+ printk(KERN_WARNING
-+ "fd_offset is not page aligned. Please convert program: %s\n",
-+ bprm->file->f_dentry->d_name.name);
-+ error_time = jiffies;
-+ }
-+#endif
-+
-+ if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
-+ loff_t pos = fd_offset;
-+ do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
-+ bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex),
-+ ex.a_text+ex.a_data, &pos);
-+ flush_icache_range((unsigned long) N_TXTADDR(ex),
-+ (unsigned long) N_TXTADDR(ex) +
-+ ex.a_text+ex.a_data);
-+ goto beyond_if;
-+ }
-+
-+ down_write(¤t->mm->mmap_sem);
-+ error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
-+ PROT_READ | PROT_EXEC,
-+ MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE | MAP_32BIT,
-+ fd_offset);
-+ up_write(¤t->mm->mmap_sem);
-+
-+ if (error != N_TXTADDR(ex)) {
-+ send_sig(SIGKILL, current, 0);
-+ return error;
-+ }
-+
-+ down_write(¤t->mm->mmap_sem);
-+ error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
-+ PROT_READ | PROT_WRITE | PROT_EXEC,
-+ MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE | MAP_32BIT,
-+ fd_offset + ex.a_text);
-+ up_write(¤t->mm->mmap_sem);
-+ if (error != N_DATADDR(ex)) {
-+ send_sig(SIGKILL, current, 0);
-+ return error;
-+ }
-+ }
-+beyond_if:
-+ set_binfmt(&aout_format);
-+
-+ set_brk(current->mm->start_brk, current->mm->brk);
-+
-+ retval = ia32_setup_arg_pages(bprm);
-+ if (retval < 0) {
-+ /* Someone check-me: is this error path enough? */
-+ send_sig(SIGKILL, current, 0);
-+ return retval;
-+ }
-+
-+ current->mm->start_stack =
-+ (unsigned long) create_aout_tables((char *) bprm->p, bprm);
-+ /* start thread */
-+ asm volatile("movl %0,%%fs" :: "r" (0)); \
-+ asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS));
-+ load_gs_index(0);
-+ (regs)->rip = ex.a_entry;
-+ (regs)->rsp = current->mm->start_stack;
-+ (regs)->eflags = 0x200;
-+ (regs)->cs = __USER32_CS;
-+ (regs)->ss = __USER32_DS;
-+ set_fs(USER_DS);
-+ if (unlikely(current->ptrace & PT_PTRACED)) {
-+ if (current->ptrace & PT_TRACE_EXEC)
-+ ptrace_notify ((PTRACE_EVENT_EXEC << 8) | SIGTRAP);
-+ else
-+ send_sig(SIGTRAP, current, 0);
-+ }
-+ return 0;
-+}
-+
-+static int load_aout_library(struct file *file)
-+{
-+ struct inode * inode;
-+ unsigned long bss, start_addr, len;
-+ unsigned long error;
-+ int retval;
-+ struct exec ex;
-+
-+ inode = file->f_dentry->d_inode;
-+
-+ retval = -ENOEXEC;
-+ error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
-+ if (error != sizeof(ex))
-+ goto out;
-+
-+ /* We come in here for the regular a.out style of shared libraries */
-+ if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != QMAGIC) || N_TRSIZE(ex) ||
-+ N_DRSIZE(ex) || ((ex.a_entry & 0xfff) && N_MAGIC(ex) == ZMAGIC) ||
-+ i_size_read(inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
-+ goto out;
-+ }
-+
-+ if (N_FLAGS(ex))
-+ goto out;
-+
-+ /* For QMAGIC, the starting address is 0x20 into the page. We mask
-+ this off to get the starting address for the page */
-+
-+ start_addr = ex.a_entry & 0xfffff000;
-+
-+ if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) {
-+ loff_t pos = N_TXTOFF(ex);
-+
-+#ifdef WARN_OLD
-+ static unsigned long error_time;
-+ if ((jiffies-error_time) > 5*HZ)
-+ {
-+ printk(KERN_WARNING
-+ "N_TXTOFF is not page aligned. Please convert library: %s\n",
-+ file->f_dentry->d_name.name);
-+ error_time = jiffies;
-+ }
-+#endif
-+
-+ do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
-+
-+ file->f_op->read(file, (char *)start_addr,
-+ ex.a_text + ex.a_data, &pos);
-+ flush_icache_range((unsigned long) start_addr,
-+ (unsigned long) start_addr + ex.a_text + ex.a_data);
-+
-+ retval = 0;
-+ goto out;
-+ }
-+ /* Now use mmap to map the library into memory. */
-+ down_write(¤t->mm->mmap_sem);
-+ error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
-+ PROT_READ | PROT_WRITE | PROT_EXEC,
-+ MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT,
-+ N_TXTOFF(ex));
-+ up_write(¤t->mm->mmap_sem);
-+ retval = error;
-+ if (error != start_addr)
-+ goto out;
-+
-+ len = PAGE_ALIGN(ex.a_text + ex.a_data);
-+ bss = ex.a_text + ex.a_data + ex.a_bss;
-+ if (bss > len) {
-+ error = do_brk(start_addr + len, bss - len);
-+ retval = error;
-+ if (error != start_addr + len)
-+ goto out;
-+ }
-+ retval = 0;
-+out:
-+ return retval;
-+}
-+
-+static int __init init_aout_binfmt(void)
-+{
-+ return register_binfmt(&aout_format);
-+}
-+
-+static void __exit exit_aout_binfmt(void)
-+{
-+ unregister_binfmt(&aout_format);
-+}
-+
-+module_init(init_aout_binfmt);
-+module_exit(exit_aout_binfmt);
-+MODULE_LICENSE("GPL");
---- linux-2.6.0/arch/x86_64/ia32/ia32entry.S 2003-09-08 13:58:56.000000000 -0700
-+++ 25/arch/x86_64/ia32/ia32entry.S 2003-12-28 23:26:31.000000000 -0800
-@@ -221,7 +221,7 @@ ia32_sys_call_table:
- .quad sys_chmod /* 15 */
- .quad sys_lchown16
- .quad ni_syscall /* old break syscall holder */
-- .quad ni_syscall /* (old)stat */
-+ .quad sys_stat
- .quad sys32_lseek
- .quad sys_getpid /* 20 */
- .quad sys_mount /* mount */
-@@ -231,7 +231,7 @@ ia32_sys_call_table:
- .quad sys_stime /* stime */ /* 25 */
- .quad sys32_ptrace /* ptrace */
- .quad sys_alarm /* XXX sign extension??? */
-- .quad ni_syscall /* (old)fstat */
-+ .quad sys_fstat /* (old)fstat */
- .quad sys_pause
- .quad compat_sys_utime /* 30 */
- .quad ni_syscall /* old stty syscall holder */
-@@ -287,7 +287,7 @@ ia32_sys_call_table:
- .quad sys_setgroups16
- .quad sys32_old_select
- .quad sys_symlink
-- .quad ni_syscall /* (old)lstat */
-+ .quad sys_lstat
- .quad sys_readlink /* 85 */
- .quad sys_uselib
- .quad sys_swapon
-@@ -396,8 +396,8 @@ ia32_sys_call_table:
- .quad stub32_vfork /* 190 */
- .quad compat_sys_getrlimit
- .quad sys32_mmap2
-- .quad sys_truncate
-- .quad sys_ftruncate
-+ .quad sys32_truncate64
-+ .quad sys32_ftruncate64
- .quad sys32_stat64 /* 195 */
- .quad sys32_lstat64
- .quad sys32_fstat64
---- linux-2.6.0/arch/x86_64/ia32/ia32_signal.c 2003-09-08 13:58:56.000000000 -0700
-+++ 25/arch/x86_64/ia32/ia32_signal.c 2003-12-28 23:26:32.000000000 -0800
-@@ -46,25 +46,25 @@ void signal_fault(struct pt_regs *regs,
-
- static int ia32_copy_siginfo_to_user(siginfo_t32 *to, siginfo_t *from)
- {
-+ int err;
- if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
- return -EFAULT;
-- if (from->si_code < 0) {
-- /* the only field that's different is the alignment
-- of the pointer in sigval_t. Move that 4 bytes down including
-- padding. */
-- memmove(&((siginfo_t32 *)&from)->si_int,
-- &from->si_int,
-- sizeof(siginfo_t) - offsetof(siginfo_t, si_int));
-- /* last 4 bytes stay the same */
-- return __copy_to_user(to, from, sizeof(siginfo_t32));
-- } else {
-- int err;
-
-- /* If you change siginfo_t structure, please be sure
-+ /* If you change siginfo_t structure, please make sure that
- this code is fixed accordingly.
- It should never copy any pad contained in the structure
- to avoid security leaks, but must copy the generic
- 3 ints plus the relevant union member. */
-+
-+ if (from->si_code < 0) {
-+ err = __put_user(from->si_signo, &to->si_signo);
-+ err |= __put_user(from->si_errno, &to->si_errno);
-+ err |= __put_user(from->si_code, &to->si_code);
-+ err |= __put_user(from->_sifields._rt._pid, &to->_sifields._rt._pid);
-+ err |= __put_user(from->_sifields._rt._uid, &to->_sifields._rt._uid);
-+ err |= __put_user((u32)(u64)from->_sifields._rt._sigval.sival_ptr,
-+ &to->_sifields._rt._sigval.sival_ptr);
-+ } else {
- err = __put_user(from->si_signo, &to->si_signo);
- err |= __put_user(from->si_errno, &to->si_errno);
- err |= __put_user(from->si_code, &to->si_code);
-@@ -86,8 +86,8 @@ static int ia32_copy_siginfo_to_user(sig
- break;
- /* case __SI_RT: This is not generated by the kernel as of now. */
- }
-- return err;
- }
-+ return err;
- }
-
- asmlinkage long
-@@ -173,6 +173,9 @@ ia32_restore_sigcontext(struct pt_regs *
- {
- unsigned int err = 0;
-
-+ /* Always make any pending restarted system calls return -EINTR */
-+ current_thread_info()->restart_block.fn = do_no_restart_syscall;
-+
- #if DEBUG_SIG
- printk("SIG restore_sigcontext: sc=%p err(%x) eip(%x) cs(%x) flg(%x)\n",
- sc, sc->err, sc->eip, sc->cs, sc->eflags);
---- linux-2.6.0/arch/x86_64/ia32/Makefile 2003-09-27 18:57:44.000000000 -0700
-+++ 25/arch/x86_64/ia32/Makefile 2003-12-28 23:22:16.000000000 -0800
-@@ -6,6 +6,8 @@ obj-$(CONFIG_IA32_EMULATION) := ia32entr
- ia32_signal.o tls32.o \
- ia32_binfmt.o fpu32.o ptrace32.o ipc32.o syscall32.o
-
-+obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
-+
- $(obj)/syscall32.o: $(src)/syscall32.c $(obj)/vsyscall.so
-
- # Teach kbuild about targets
---- linux-2.6.0/arch/x86_64/ia32/sys_ia32.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/x86_64/ia32/sys_ia32.c 2003-12-28 23:26:31.000000000 -0800
-@@ -110,6 +110,21 @@ int cp_compat_stat(struct kstat *kbuf, s
- return 0;
- }
-
-+extern long sys_truncate(char *, loff_t);
-+extern long sys_ftruncate(int, loff_t);
-+
-+asmlinkage long
-+sys32_truncate64(char * filename, unsigned long offset_low, unsigned long offset_high)
-+{
-+ return sys_truncate(filename, ((loff_t) offset_high << 32) | offset_low);
-+}
-+
-+asmlinkage long
-+sys32_ftruncate64(unsigned int fd, unsigned long offset_low, unsigned long offset_high)
-+{
-+ return sys_ftruncate(fd, ((loff_t) offset_high << 32) | offset_low);
-+}
-+
- /* Another set for IA32/LFS -- x86_64 struct stat is different due to
- support for 64bit inode numbers. */
-
---- linux-2.6.0/arch/x86_64/Kconfig 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/x86_64/Kconfig 2003-12-28 23:26:30.000000000 -0800
-@@ -314,7 +314,7 @@ config SOFTWARE_SUSPEND
- This option is close to getting stable. However there is still some
- absence of features.
-
-- For more information take a look at Documentation/swsusp.txt.
-+ For more information take a look at Documentation/power/swsusp.txt.
-
- source "drivers/acpi/Kconfig"
-
-@@ -371,6 +371,12 @@ config IA32_EMULATION
- turn this on, unless you're 100% sure that you don't have any 32-bit programs
- left.
-
-+config IA32_AOUT
-+ bool "IA32 a.out support"
-+ depends on IA32_EMULATION
-+ help
-+ Support old a.out binaries in the 32bit emulation.
-+
- config COMPAT
- bool
- depends on IA32_EMULATION
-@@ -505,6 +511,7 @@ config FRAME_POINTER
- Normally you should say N.
-
- config IOMMU_DEBUG
-+ depends on GART_IOMMU && DEBUG_KERNEL
- bool "Force IOMMU to on"
- help
- Force the IOMMU to on even when you have less than 4GB of memory and add
---- linux-2.6.0/arch/x86_64/kernel/acpi/boot.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/x86_64/kernel/acpi/boot.c 2003-12-28 23:21:33.000000000 -0800
-@@ -46,11 +46,13 @@
- #include <asm/proto.h>
- #include <asm/tlbflush.h>
-
--int acpi_lapic = 0;
--int acpi_ioapic = 0;
--
- #define PREFIX "ACPI: "
-
-+int acpi_noirq __initdata = 0; /* skip ACPI IRQ initialization */
-+int acpi_ht __initdata = 1; /* enable HT */
-+
-+int acpi_lapic = 0;
-+int acpi_ioapic = 0;
-
- /* --------------------------------------------------------------------------
- Boot-time Configuration
-@@ -253,29 +255,66 @@ acpi_parse_hpet (
-
- #ifdef CONFIG_ACPI_BUS
- /*
-- * Set specified PIC IRQ to level triggered mode.
-+ * "acpi_pic_sci=level" (current default)
-+ * programs the PIC-mode SCI to Level Trigger.
-+ * (NO-OP if the BIOS set Level Trigger already)
-+ *
-+ * If a PIC-mode SCI is not recogznied or gives spurious IRQ7's
-+ * it may require Edge Trigger -- use "acpi_pic_sci=edge"
-+ * (NO-OP if the BIOS set Edge Trigger already)
- *
- * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers
- * for the 8259 PIC. bit[n] = 1 means irq[n] is Level, otherwise Edge.
- * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0)
- * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0)
-- *
-- * As the BIOS should have done this for us,
-- * print a warning if the IRQ wasn't already set to level.
- */
-
--void acpi_pic_set_level_irq(unsigned int irq)
-+static int __initdata acpi_pic_sci_trigger; /* 0: level, 1: edge */
-+
-+void __init
-+acpi_pic_sci_set_trigger(unsigned int irq)
- {
- unsigned char mask = 1 << (irq & 7);
- unsigned int port = 0x4d0 + (irq >> 3);
- unsigned char val = inb(port);
-
-+
-+ printk(PREFIX "IRQ%d SCI:", irq);
- if (!(val & mask)) {
-- printk(KERN_WARNING PREFIX "IRQ %d was Edge Triggered, "
-- "setting to Level Triggerd\n", irq);
-- outb(val | mask, port);
-+ printk(" Edge");
-+
-+ if (!acpi_pic_sci_trigger) {
-+ printk(" set to Level");
-+ outb(val | mask, port);
-+ }
-+ } else {
-+ printk(" Level");
-+
-+ if (acpi_pic_sci_trigger) {
-+ printk(" set to Edge");
-+ outb(val | mask, port);
-+ }
- }
-+ printk(" Trigger.\n");
- }
-+
-+int __init
-+acpi_pic_sci_setup(char *str)
-+{
-+ while (str && *str) {
-+ if (strncmp(str, "level", 5) == 0)
-+ acpi_pic_sci_trigger = 0; /* force level trigger */
-+ if (strncmp(str, "edge", 4) == 0)
-+ acpi_pic_sci_trigger = 1; /* force edge trigger */
-+ str = strchr(str, ',');
-+ if (str)
-+ str += strspn(str, ", \t");
-+ }
-+ return 1;
-+}
-+
-+__setup("acpi_pic_sci=", acpi_pic_sci_setup);
-+
- #endif /* CONFIG_ACPI_BUS */
-
- static unsigned long __init
-@@ -354,8 +393,10 @@ acpi_boot_init (void)
- * Initialize the ACPI boot-time table parser.
- */
- result = acpi_table_init();
-- if (result)
-+ if (result) {
-+ acpi_disabled = 1;
- return result;
-+ }
-
- result = acpi_blacklisted();
- if (result) {
-@@ -442,7 +483,7 @@ acpi_boot_init (void)
- * If MPS is present, it will handle them,
- * otherwise the system will stay in PIC mode
- */
-- if (acpi_disabled) {
-+ if (acpi_disabled || acpi_noirq) {
- return 1;
- }
-
-@@ -484,6 +525,8 @@ acpi_boot_init (void)
-
- acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
-
-+ acpi_irq_balance_set(NULL);
-+
- acpi_ioapic = 1;
-
- #endif /*CONFIG_X86_IO_APIC*/
---- linux-2.6.0/arch/x86_64/kernel/io_apic.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/x86_64/kernel/io_apic.c 2003-12-28 23:21:33.000000000 -0800
-@@ -1087,8 +1087,6 @@ static void __init setup_ioapic_ids_from
- unsigned char old_id;
- unsigned long flags;
-
-- if (acpi_ioapic) return; /* ACPI does that already */
--
- /*
- * Set the IOAPIC ID to the value stored in the MPC table.
- */
-@@ -1673,12 +1671,14 @@ void __init setup_IO_APIC(void)
- /*
- * Set up the IO-APIC IRQ routing table.
- */
-- setup_ioapic_ids_from_mpc();
-+ if (!acpi_ioapic)
-+ setup_ioapic_ids_from_mpc();
- sync_Arb_IDs();
- setup_IO_APIC_irqs();
- init_IO_APIC_traps();
- check_timer();
-- print_IO_APIC();
-+ if (!acpi_ioapic)
-+ print_IO_APIC();
- }
-
- /* Ensure the ACPI SCI interrupt level is active low, edge-triggered */
---- linux-2.6.0/arch/x86_64/kernel/irq.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/x86_64/kernel/irq.c 2003-12-28 23:22:10.000000000 -0800
-@@ -138,17 +138,19 @@ atomic_t irq_mis_count;
-
- int show_interrupts(struct seq_file *p, void *v)
- {
-- int i, j;
-+ int i = *(loff_t *) v, j;
- struct irqaction * action;
- unsigned long flags;
-
-- seq_printf(p, " ");
-- for (j=0; j<NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "CPU%d ",j);
-- seq_putc(p, '\n');
-+ if (i == 0) {
-+ seq_printf(p, " ");
-+ for (j=0; j<NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "CPU%d ",j);
-+ seq_putc(p, '\n');
-+ }
-
-- for (i = 0 ; i < NR_IRQS ; i++) {
-+ if (i < NR_IRQS) {
- spin_lock_irqsave(&irq_desc[i].lock, flags);
- action = irq_desc[i].action;
- if (!action)
-@@ -170,25 +172,26 @@ int show_interrupts(struct seq_file *p,
- seq_putc(p, '\n');
- skip:
- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-- }
-- seq_printf(p, "NMI: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
-- seq_putc(p, '\n');
-+ } else if (i == NR_IRQS) {
-+ seq_printf(p, "NMI: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
-+ seq_putc(p, '\n');
- #ifdef CONFIG_X86_LOCAL_APIC
-- seq_printf(p, "LOC: ");
-- for (j = 0; j < NR_CPUS; j++)
-- if (cpu_online(j))
-- seq_printf(p, "%10u ", cpu_pda[j].apic_timer_irqs);
-- seq_putc(p, '\n');
-+ seq_printf(p, "LOC: ");
-+ for (j = 0; j < NR_CPUS; j++)
-+ if (cpu_online(j))
-+ seq_printf(p, "%10u ", cpu_pda[j].apic_timer_irqs);
-+ seq_putc(p, '\n');
- #endif
-- seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-+ seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
- #ifdef CONFIG_X86_IO_APIC
- #ifdef APIC_MISMATCH_DEBUG
-- seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-+ seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
- #endif
- #endif
-+ }
- return 0;
- }
-
-@@ -801,47 +804,6 @@ int setup_irq(unsigned int irq, struct i
- static struct proc_dir_entry * root_irq_dir;
- static struct proc_dir_entry * irq_dir [NR_IRQS];
-
--#define HEX_DIGITS (2*sizeof(cpumask_t))
--
--static unsigned int parse_hex_value (const char *buffer,
-- unsigned long count, cpumask_t *ret)
--{
-- unsigned char hexnum [HEX_DIGITS];
-- cpumask_t value = CPU_MASK_NONE;
-- unsigned i;
--
-- if (!count)
-- return -EINVAL;
-- if (count > HEX_DIGITS)
-- count = HEX_DIGITS;
-- if (copy_from_user(hexnum, buffer, count))
-- return -EFAULT;
--
-- /*
-- * Parse the first 8 characters as a hex string, any non-hex char
-- * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-- */
--
-- for (i = 0; i < count; i++) {
-- unsigned int k, c = hexnum[i];
--
-- switch (c) {
-- case '0' ... '9': c -= '0'; break;
-- case 'a' ... 'f': c -= 'a'-10; break;
-- case 'A' ... 'F': c -= 'A'-10; break;
-- default:
-- goto out;
-- }
-- cpus_shift_left(value, value, 4);
-- for (k = 0; k < 4; ++k)
-- if (c & (1 << k))
-- cpu_set(k, value);
-- }
--out:
-- *ret = value;
-- return 0;
--}
--
- #ifdef CONFIG_SMP
-
- static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
-@@ -850,19 +812,10 @@ static cpumask_t irq_affinity [NR_IRQS]
- static int irq_affinity_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- int k, len;
-- cpumask_t tmp = irq_affinity[(long)data];
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, irq_affinity[(long)data]);
-+ if (count - len < 2)
- return -EINVAL;
--
-- for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -875,7 +828,7 @@ static int irq_affinity_write_proc (stru
- if (!irq_desc[irq].handler->set_affinity)
- return -EIO;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
-
- /*
- * Do not allow disabling IRQs completely - it's a too easy
-@@ -897,20 +850,10 @@ static int irq_affinity_write_proc (stru
- static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
-- cpumask_t tmp, *mask = (cpumask_t *) data;
-- int k, len;
--
-- if (count < HEX_DIGITS+1)
-+ int len = cpumask_snprintf(page, count, *(cpumask_t *)data);
-+ if (count - len < 2)
- return -EINVAL;
--
-- tmp = *mask;
-- for (k = len = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(page, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- page += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(page, "\n");
-+ len += sprintf(page + len, "\n");
- return len;
- }
-
-@@ -920,7 +863,7 @@ static int prof_cpu_mask_write_proc (str
- unsigned long full_count = count, err;
- cpumask_t new_value, *mask = (cpumask_t *)data;
-
-- err = parse_hex_value(buffer, count, &new_value);
-+ err = cpumask_parse(buffer, count, new_value);
- if (err)
- return err;
-
---- linux-2.6.0/arch/x86_64/kernel/Makefile 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/x86_64/kernel/Makefile 2003-12-28 23:26:30.000000000 -0800
-@@ -25,6 +25,6 @@ obj-$(CONFIG_DUMMY_IOMMU) += pci-nommu.o
- obj-$(CONFIG_MODULES) += module.o
-
- bootflag-y += ../../i386/kernel/bootflag.o
--cpuid-$(CONFIG_X86_CPUID) += ../../i386/kernel/cpuid.o
-+cpuid-$(subst m,y,$(CONFIG_X86_CPUID)) += ../../i386/kernel/cpuid.o
-
- obj-$(CONFIG_CPU_FREQ) += cpufreq/
---- linux-2.6.0/arch/x86_64/kernel/mpparse.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/arch/x86_64/kernel/mpparse.c 2003-12-28 23:26:32.000000000 -0800
-@@ -226,7 +226,7 @@ static int __init smp_read_mpc(struct mp
- unsigned char *mpt=((unsigned char *)mpc)+count;
-
- if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
-- panic("SMP mptable: bad signature [%c%c%c%c]!\n",
-+ printk("SMP mptable: bad signature [%c%c%c%c]!\n",
- mpc->mpc_signature[0],
- mpc->mpc_signature[1],
- mpc->mpc_signature[2],
-@@ -234,7 +234,7 @@ static int __init smp_read_mpc(struct mp
- return 0;
- }
- if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) {
-- panic("SMP mptable: checksum error!\n");
-+ printk("SMP mptable: checksum error!\n");
- return 0;
- }
- if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) {
-@@ -950,6 +950,8 @@ void __init mp_parse_prt (void)
- entry->irq);
- }
-
-+ print_IO_APIC();
-+
- return;
- }
-
---- linux-2.6.0/arch/x86_64/kernel/pci-gart.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/x86_64/kernel/pci-gart.c 2003-12-28 23:26:30.000000000 -0800
-@@ -44,12 +44,13 @@ static int no_agp;
- #ifdef CONFIG_IOMMU_DEBUG
- int panic_on_overflow = 1;
- int force_iommu = 1;
--int sac_force_size = 0;
- #else
--int panic_on_overflow = 1; /* for testing */
-+int panic_on_overflow = 0;
- int force_iommu = 0;
--int sac_force_size = 256*1024*1024;
- #endif
-+int iommu_merge = 0;
-+int iommu_sac_force = 0;
-+int iommu_fullflush = 1;
-
- /* Allocation bitmap for the remapping area */
- static spinlock_t iommu_bitmap_lock = SPIN_LOCK_UNLOCKED;
-@@ -125,7 +126,7 @@ static void free_iommu(unsigned long off
- /*
- * Use global flush state to avoid races with multiple flushers.
- */
--static void __flush_gart(struct pci_dev *dev)
-+static void flush_gart(struct pci_dev *dev)
- {
- unsigned long flags;
- int bus = dev ? dev->bus->number : -1;
-@@ -134,13 +135,17 @@ static void __flush_gart(struct pci_dev
- int i;
-
- spin_lock_irqsave(&iommu_bitmap_lock, flags);
-- /* recheck flush count inside lock */
-- if (need_flush) {
-+ if (need_flush || iommu_fullflush) {
- for (i = 0; northbridges[i]; i++) {
-+ u32 w;
- if (bus >= 0 && !(cpu_isset_const(i, bus_cpumask)))
- continue;
- pci_write_config_dword(northbridges[i], 0x9c,
- northbridge_flush_word[i] | 1);
-+ /* Make sure the hardware actually executed the flush. */
-+ do {
-+ pci_read_config_dword(northbridges[i], 0x9c, &w);
-+ } while (w & 1);
- flushed++;
- }
- if (!flushed)
-@@ -150,12 +155,6 @@ static void __flush_gart(struct pci_dev
- spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
- }
-
--static inline void flush_gart(struct pci_dev *dev)
--{
-- if (need_flush)
-- __flush_gart(dev);
--}
--
- /*
- * Allocate memory for a consistent mapping.
- * All mappings are consistent here, so this is just a wrapper around
-@@ -174,11 +173,16 @@ void *pci_alloc_consistent(struct pci_de
- } else {
- dma_mask = hwdev->consistent_dma_mask;
- }
-+
- if (dma_mask == 0)
- dma_mask = 0xffffffff;
- if (dma_mask < 0xffffffff || no_iommu)
- gfp |= GFP_DMA;
-
-+ /* Kludge to make it bug-to-bug compatible with i386. i386
-+ uses the normal dma_mask for alloc_consistent. */
-+ dma_mask &= hwdev->dma_mask;
-+
- memory = (void *)__get_free_pages(gfp, get_order(size));
- if (memory == NULL) {
- return NULL;
-@@ -394,7 +398,9 @@ static int __pci_map_cont(struct scatter
-
- for (i = start; i < stopat; i++) {
- struct scatterlist *s = &sg[i];
-- unsigned long start_addr = s->dma_address;
-+ unsigned long pages, addr;
-+ unsigned long phys_addr = s->dma_address;
-+
- BUG_ON(i > start && s->offset);
- if (i == start) {
- *sout = *s;
-@@ -403,8 +409,10 @@ static int __pci_map_cont(struct scatter
- } else {
- sout->length += s->length;
- }
-- unsigned long addr = start_addr;
-- while (addr < start_addr + s->length) {
-+
-+ addr = phys_addr;
-+ pages = to_pages(s->offset, s->length);
-+ while (pages--) {
- iommu_gatt_base[iommu_page] = GPTE_ENCODE(addr);
- SET_LEAK(iommu_page);
- addr += PAGE_SIZE;
-@@ -437,7 +445,7 @@ int pci_map_sg(struct pci_dev *dev, stru
- int out;
- int start;
- unsigned long pages = 0;
-- int need = 0;
-+ int need = 0, nextneed;
-
- unsigned long size = 0;
-
-@@ -453,13 +461,14 @@ int pci_map_sg(struct pci_dev *dev, stru
- BUG_ON(s->length == 0);
-
- size += s->length;
-+ nextneed = need_iommu(dev, addr, s->length);
-
- /* Handle the previous not yet processed entries */
- if (i > start) {
- struct scatterlist *ps = &sg[i-1];
- /* Can only merge when the last chunk ends on a page
-- boundary. */
-- if (!force_iommu || !need || (i-1 > start && ps->offset) ||
-+ boundary and the new one doesn't have an offset. */
-+ if (!iommu_merge || !nextneed || !need || s->offset ||
- (ps->offset + ps->length) % PAGE_SIZE) {
- if (pci_map_cont(sg, start, i, sg+out, pages,
- need) < 0)
-@@ -470,7 +479,7 @@ int pci_map_sg(struct pci_dev *dev, stru
- }
- }
-
-- need = need_iommu(dev, addr, s->length);
-+ need = nextneed;
- pages += to_pages(s->offset, s->length);
- }
- if (pci_map_cont(sg, start, i, sg+out, pages, need) < 0)
-@@ -544,14 +553,12 @@ int pci_dma_supported(struct pci_dev *de
-
- Problem with this is that if we overflow the IOMMU area
- and return DAC as fallback address the device may not handle it correctly.
-- As a compromise we only do this if the IOMMU area is >= 256MB
-- which should make overflow unlikely enough.
-
- As a special case some controllers have a 39bit address mode
- that is as efficient as 32bit (aic79xx). Don't force SAC for these.
- Assume all masks <= 40 bits are of this type. Normally this doesn't
- make any difference, but gives more gentle handling of IOMMU overflow. */
-- if (force_iommu && (mask > 0xffffffffffULL) && (iommu_size >= sac_force_size)){
-+ if (iommu_sac_force && (mask >= 0xffffffffffULL)) {
- printk(KERN_INFO "%s: Force SAC with mask %Lx\n", dev->slot_name,mask);
- return 0;
- }
-@@ -680,7 +687,7 @@ static int __init pci_iommu_init(void)
- unsigned long iommu_start;
- struct pci_dev *dev;
-
--#ifndef CONFIG_AGP_AMD_8151
-+#ifndef CONFIG_AGP_AMD64
- no_agp = 1;
- #else
- /* Makefile puts PCI initialization via subsys_initcall first. */
---- linux-2.6.0/arch/x86_64/kernel/pci-nommu.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/arch/x86_64/kernel/pci-nommu.c 2003-12-28 23:26:30.000000000 -0800
-@@ -4,6 +4,8 @@
- #include <linux/string.h>
- #include <asm/proto.h>
-
-+int iommu_merge = 0;
-+
- /*
- * Dummy IO MMU functions
- */
---- linux-2.6.0/arch/x86_64/kernel/setup.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/arch/x86_64/kernel/setup.c 2003-12-28 23:21:33.000000000 -0800
-@@ -65,7 +65,11 @@ unsigned long mmu_cr4_features;
- EXPORT_SYMBOL_GPL(mmu_cr4_features);
-
- int acpi_disabled = 0;
--int acpi_ht = 0;
-+
-+#ifdef CONFIG_ACPI_BOOT
-+extern int __initdata acpi_ht;
-+/* int __initdata acpi_force = 0; */
-+#endif
-
- /* For PCI or other memory-mapped resources */
- unsigned long pci_mem_start = 0x10000000;
-@@ -195,6 +199,7 @@ static __init void parse_cmdline_early (
- if (c != ' ')
- goto next_char;
-
-+#ifdef CONFIG_ACPI_BOOT
- /* "acpi=off" disables both ACPI table parsing and interpreter init */
- if (!memcmp(from, "acpi=off", 8))
- acpi_disabled = 1;
-@@ -210,6 +215,7 @@ static __init void parse_cmdline_early (
- if (!memcmp(from, "acpi=ht", 7)) {
- acpi_ht = 1;
- }
-+#endif
-
- if (!memcmp(from, "nolapic", 7) ||
- !memcmp(from, "disableapic", 11))
---- linux-2.6.0/arch/x86_64/kernel/signal.c 2003-06-16 22:32:20.000000000 -0700
-+++ 25/arch/x86_64/kernel/signal.c 2003-12-28 23:26:31.000000000 -0800
-@@ -93,6 +93,8 @@ restore_sigcontext(struct pt_regs *regs,
- {
- unsigned int err = 0;
-
-+ /* Always make any pending restarted system calls return -EINTR */
-+ current_thread_info()->restart_block.fn = do_no_restart_syscall;
-
- #define COPY(x) err |= __get_user(regs->x, &sc->x)
-
-@@ -355,8 +357,6 @@ handle_signal(unsigned long sig, siginfo
- /* If so, check system call restarting.. */
- switch (regs->rax) {
- case -ERESTART_RESTARTBLOCK:
-- current_thread_info()->restart_block.fn = do_no_restart_syscall;
-- /* FALL THROUGH */
- case -ERESTARTNOHAND:
- regs->rax = -EINTR;
- break;
-@@ -371,10 +371,6 @@ handle_signal(unsigned long sig, siginfo
- regs->rax = regs->orig_rax;
- regs->rip -= 2;
- }
-- if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK){
-- regs->rax = __NR_restart_syscall;
-- regs->rip -= 2;
-- }
- }
-
- #ifdef CONFIG_IA32_EMULATION
-@@ -453,6 +449,10 @@ int do_signal(struct pt_regs *regs, sigs
- regs->rax = regs->orig_rax;
- regs->rip -= 2;
- }
-+ if (regs->rax == (unsigned long)-ERESTART_RESTARTBLOCK) {
-+ regs->rax = __NR_restart_syscall;
-+ regs->rip -= 2;
-+ }
- }
- return 0;
- }
---- linux-2.6.0/arch/x86_64/kernel/traps.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/arch/x86_64/kernel/traps.c 2003-12-28 23:26:30.000000000 -0800
-@@ -218,8 +218,12 @@ void show_stack(struct task_struct *tsk,
- // debugging aid: "show_stack(NULL, NULL);" prints the
- // back trace for this cpu.
-
-- if(rsp==NULL)
-- rsp=(unsigned long*)&rsp;
-+ if (rsp == NULL) {
-+ if (tsk)
-+ rsp = (unsigned long *)tsk->thread.rsp;
-+ else
-+ rsp = (unsigned long *)&rsp;
-+ }
-
- stack = rsp;
- for(i=0; i < kstack_depth_to_print; i++) {
---- linux-2.6.0/arch/x86_64/mm/fault.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/arch/x86_64/mm/fault.c 2003-12-28 23:26:31.000000000 -0800
-@@ -73,6 +73,9 @@ static int is_prefetch(struct pt_regs *r
- if (regs->cs & (1<<2))
- return 0;
-
-+ if ((regs->cs & 3) != 0 && regs->rip >= TASK_SIZE)
-+ return 0;
-+
- while (scan_more && instr < max_instr) {
- unsigned char opcode;
- unsigned char instr_hi;
-@@ -337,7 +340,8 @@ bad_area_nosemaphore:
- }
-
- tsk->thread.cr2 = address;
-- tsk->thread.error_code = error_code;
-+ /* Kernel addresses are always protection faults */
-+ tsk->thread.error_code = error_code | (address >= TASK_SIZE);
- tsk->thread.trap_no = 14;
- info.si_signo = SIGSEGV;
- info.si_errno = 0;
---- linux-2.6.0/crypto/tcrypt.c 2003-09-08 13:58:56.000000000 -0700
-+++ 25/crypto/tcrypt.c 2003-12-28 23:22:31.000000000 -0800
-@@ -6,2384 +6,409 @@
- *
- * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
- * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
-- *
-- * This program is free software; you can redistribute it and/or modify it
-- * under the terms of the GNU General Public License as published by the Free
-- * Software Foundation; either version 2 of the License, or (at your option)
-- * any later version.
-- *
-- */
--#include <linux/init.h>
--#include <linux/module.h>
--#include <linux/mm.h>
--#include <linux/slab.h>
--#include <asm/scatterlist.h>
--#include <linux/string.h>
--#include <linux/crypto.h>
--#include <linux/highmem.h>
--#include "tcrypt.h"
--
--/*
-- * Need to kmalloc() memory for testing kmap().
-- */
--#define TVMEMSIZE 4096
--#define XBUFSIZE 32768
--
--/*
-- * Indexes into the xbuf to simulate cross-page access.
-- */
--#define IDX1 37
--#define IDX2 32400
--#define IDX3 1
--#define IDX4 8193
--#define IDX5 22222
--#define IDX6 17101
--#define IDX7 27333
--#define IDX8 3000
--
--static int mode;
--static char *xbuf;
--static char *tvmem;
--
--static char *check[] = {
-- "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
-- "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
-- "deflate", NULL
--};
--
--static void
--hexdump(unsigned char *buf, unsigned int len)
--{
-- while (len--)
-- printk("%02x", *buf++);
--
-- printk("\n");
--}
--
--static void
--test_md5(void)
--{
-- char *p;
-- unsigned int i;
-- struct scatterlist sg[2];
-- char result[128];
-- struct crypto_tfm *tfm;
-- struct md5_testvec *md5_tv;
-- unsigned int tsize;
--
-- printk("\ntesting md5\n");
--
-- tsize = sizeof (md5_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, md5_tv_template, tsize);
-- md5_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("md5", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for md5\n");
-- return;
-- }
--
-- for (i = 0; i < MD5_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = md5_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(md5_tv[i].plaintext);
--
-- crypto_digest_init(tfm);
-- crypto_digest_update(tfm, sg, 1);
-- crypto_digest_final(tfm, result);
--
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, md5_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- printk("\ntesting md5 across pages\n");
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, XBUFSIZE);
-- memcpy(&xbuf[IDX1], "abcdefghijklm", 13);
-- memcpy(&xbuf[IDX2], "nopqrstuvwxyz", 13);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 13;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 13;
--
-- memset(result, 0, sizeof (result));
-- crypto_digest_digest(tfm, sg, 2, result);
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
--
-- printk("%s\n",
-- memcmp(result, md5_tv[4].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-- crypto_free_tfm(tfm);
--}
--
--#ifdef CONFIG_CRYPTO_HMAC
--static void
--test_hmac_md5(void)
--{
-- char *p;
-- unsigned int i, klen;
-- struct scatterlist sg[2];
-- char result[128];
-- struct crypto_tfm *tfm;
-- struct hmac_md5_testvec *hmac_md5_tv;
-- unsigned int tsize;
--
-- tfm = crypto_alloc_tfm("md5", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for md5\n");
-- return;
-- }
--
-- printk("\ntesting hmac_md5\n");
--
-- tsize = sizeof (hmac_md5_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- goto out;
-- }
--
-- memcpy(tvmem, hmac_md5_tv_template, tsize);
-- hmac_md5_tv = (void *) tvmem;
--
-- for (i = 0; i < HMAC_MD5_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = hmac_md5_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(hmac_md5_tv[i].plaintext);
--
-- klen = strlen(hmac_md5_tv[i].key);
-- crypto_hmac(tfm, hmac_md5_tv[i].key, &klen, sg, 1, result);
--
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, hmac_md5_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- printk("\ntesting hmac_md5 across pages\n");
--
-- memset(xbuf, 0, XBUFSIZE);
--
-- memcpy(&xbuf[IDX1], "what do ya want ", 16);
-- memcpy(&xbuf[IDX2], "for nothing?", 12);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 16;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 12;
--
-- memset(result, 0, sizeof (result));
-- klen = strlen(hmac_md5_tv[7].key);
-- crypto_hmac(tfm, hmac_md5_tv[7].key, &klen, sg, 2, result);
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
--
-- printk("%s\n",
-- memcmp(result, hmac_md5_tv[7].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
--out:
-- crypto_free_tfm(tfm);
--}
--
--static void
--test_hmac_sha1(void)
--{
-- char *p;
-- unsigned int i, klen;
-- struct crypto_tfm *tfm;
-- struct hmac_sha1_testvec *hmac_sha1_tv;
-- struct scatterlist sg[2];
-- unsigned int tsize;
-- char result[SHA1_DIGEST_SIZE];
--
-- tfm = crypto_alloc_tfm("sha1", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for sha1\n");
-- return;
-- }
--
-- printk("\ntesting hmac_sha1\n");
--
-- tsize = sizeof (hmac_sha1_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- goto out;
-- }
--
-- memcpy(tvmem, hmac_sha1_tv_template, tsize);
-- hmac_sha1_tv = (void *) tvmem;
--
-- for (i = 0; i < HMAC_SHA1_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = hmac_sha1_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(hmac_sha1_tv[i].plaintext);
--
-- klen = strlen(hmac_sha1_tv[i].key);
--
-- crypto_hmac(tfm, hmac_sha1_tv[i].key, &klen, sg, 1, result);
--
-- hexdump(result, sizeof (result));
-- printk("%s\n",
-- memcmp(result, hmac_sha1_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- printk("\ntesting hmac_sha1 across pages\n");
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, XBUFSIZE);
--
-- memcpy(&xbuf[IDX1], "what do ya want ", 16);
-- memcpy(&xbuf[IDX2], "for nothing?", 12);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 16;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 12;
--
-- memset(result, 0, sizeof (result));
-- klen = strlen(hmac_sha1_tv[7].key);
-- crypto_hmac(tfm, hmac_sha1_tv[7].key, &klen, sg, 2, result);
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
--
-- printk("%s\n",
-- memcmp(result, hmac_sha1_tv[7].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
--out:
-- crypto_free_tfm(tfm);
--}
--
--static void
--test_hmac_sha256(void)
--{
-- char *p;
-- unsigned int i, klen;
-- struct crypto_tfm *tfm;
-- struct hmac_sha256_testvec *hmac_sha256_tv;
-- struct scatterlist sg[2];
-- unsigned int tsize;
-- char result[SHA256_DIGEST_SIZE];
--
-- tfm = crypto_alloc_tfm("sha256", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for sha256\n");
-- return;
-- }
--
-- printk("\ntesting hmac_sha256\n");
--
-- tsize = sizeof (hmac_sha256_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- goto out;
-- }
--
-- memcpy(tvmem, hmac_sha256_tv_template, tsize);
-- hmac_sha256_tv = (void *) tvmem;
--
-- for (i = 0; i < HMAC_SHA256_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = hmac_sha256_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(hmac_sha256_tv[i].plaintext);
--
-- klen = strlen(hmac_sha256_tv[i].key);
--
-- hexdump(hmac_sha256_tv[i].key, strlen(hmac_sha256_tv[i].key));
-- crypto_hmac(tfm, hmac_sha256_tv[i].key, &klen, sg, 1, result);
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, hmac_sha256_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-- }
--
--out:
-- crypto_free_tfm(tfm);
--}
--
--#endif /* CONFIG_CRYPTO_HMAC */
--
--static void
--test_md4(void)
--{
-- char *p;
-- unsigned int i;
-- struct scatterlist sg[1];
-- char result[128];
-- struct crypto_tfm *tfm;
-- struct md4_testvec *md4_tv;
-- unsigned int tsize;
--
-- printk("\ntesting md4\n");
--
-- tsize = sizeof (md4_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, md4_tv_template, tsize);
-- md4_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("md4", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for md4\n");
-- return;
-- }
--
-- for (i = 0; i < MD4_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = md4_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(md4_tv[i].plaintext);
--
-- crypto_digest_digest(tfm, sg, 1, result);
--
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, md4_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- crypto_free_tfm(tfm);
--}
--
--static void
--test_sha1(void)
--{
-- char *p;
-- unsigned int i;
-- struct crypto_tfm *tfm;
-- struct sha1_testvec *sha1_tv;
-- struct scatterlist sg[2];
-- unsigned int tsize;
-- char result[SHA1_DIGEST_SIZE];
--
-- printk("\ntesting sha1\n");
--
-- tsize = sizeof (sha1_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, sha1_tv_template, tsize);
-- sha1_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("sha1", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for sha1\n");
-- return;
-- }
--
-- for (i = 0; i < SHA1_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = sha1_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(sha1_tv[i].plaintext);
--
-- crypto_digest_init(tfm);
-- crypto_digest_update(tfm, sg, 1);
-- crypto_digest_final(tfm, result);
--
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, sha1_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- printk("\ntesting sha1 across pages\n");
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, XBUFSIZE);
-- memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
-- memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 28;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 28;
--
-- memset(result, 0, sizeof (result));
-- crypto_digest_digest(tfm, sg, 2, result);
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, sha1_tv[1].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
-- crypto_free_tfm(tfm);
--}
--
--static void
--test_sha256(void)
--{
-- char *p;
-- unsigned int i;
-- struct crypto_tfm *tfm;
-- struct sha256_testvec *sha256_tv;
-- struct scatterlist sg[2];
-- unsigned int tsize;
-- char result[SHA256_DIGEST_SIZE];
--
-- printk("\ntesting sha256\n");
--
-- tsize = sizeof (sha256_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, sha256_tv_template, tsize);
-- sha256_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("sha256", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for sha256\n");
-- return;
-- }
--
-- for (i = 0; i < SHA256_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = sha256_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(sha256_tv[i].plaintext);
--
-- crypto_digest_init(tfm);
-- crypto_digest_update(tfm, sg, 1);
-- crypto_digest_final(tfm, result);
--
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, sha256_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- printk("\ntesting sha256 across pages\n");
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, XBUFSIZE);
-- memcpy(&xbuf[IDX1], "abcdbcdecdefdefgefghfghighij", 28);
-- memcpy(&xbuf[IDX2], "hijkijkljklmklmnlmnomnopnopq", 28);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 28;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 28;
--
-- memset(result, 0, sizeof (result));
-- crypto_digest_digest(tfm, sg, 2, result);
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, sha256_tv[1].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" : "pass");
--
-- crypto_free_tfm(tfm);
--}
--
--static void
--test_sha384(void)
--{
-- char *p;
-- unsigned int i;
-- struct crypto_tfm *tfm;
-- struct sha384_testvec *sha384_tv;
-- struct scatterlist sg[2];
-- unsigned int tsize;
-- char result[SHA384_DIGEST_SIZE];
--
-- printk("\ntesting sha384\n");
--
-- tsize = sizeof (sha384_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, sha384_tv_template, tsize);
-- sha384_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("sha384", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for sha384\n");
-- return;
-- }
--
-- for (i = 0; i < SHA384_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = sha384_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(sha384_tv[i].plaintext);
--
-- crypto_digest_init(tfm);
-- crypto_digest_update(tfm, sg, 1);
-- crypto_digest_final(tfm, result);
--
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, sha384_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- crypto_free_tfm(tfm);
--}
--
--static void
--test_sha512(void)
--{
-- char *p;
-- unsigned int i;
-- struct crypto_tfm *tfm;
-- struct sha512_testvec *sha512_tv;
-- struct scatterlist sg[2];
-- unsigned int tsize;
-- char result[SHA512_DIGEST_SIZE];
--
-- printk("\ntesting sha512\n");
--
-- tsize = sizeof (sha512_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, sha512_tv_template, tsize);
-- sha512_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("sha512", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for sha512\n");
-- return;
-- }
--
-- for (i = 0; i < SHA512_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
-- memset(result, 0, sizeof (result));
--
-- p = sha512_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = strlen(sha512_tv[i].plaintext);
--
-- crypto_digest_init(tfm);
-- crypto_digest_update(tfm, sg, 1);
-- crypto_digest_final(tfm, result);
--
-- hexdump(result, crypto_tfm_alg_digestsize(tfm));
-- printk("%s\n",
-- memcmp(result, sha512_tv[i].digest,
-- crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-- "pass");
-- }
--
-- crypto_free_tfm(tfm);
--}
--
--void
--test_des(void)
--{
-- unsigned int ret, i, len;
-- unsigned int tsize;
-- char *p, *q;
-- struct crypto_tfm *tfm;
-- char *key;
-- char res[8];
-- struct des_tv *des_tv;
-- struct scatterlist sg[8];
--
-- printk("\ntesting des encryption\n");
--
-- tsize = sizeof (des_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, des_enc_tv_template, tsize);
-- des_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("des", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for des (default ecb)\n");
-- return;
-- }
--
-- for (i = 0; i < DES_ENC_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
--
-- key = des_tv[i].key;
-- tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!des_tv[i].fail)
-- goto out;
-- }
--
-- len = des_tv[i].len;
--
-- p = des_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = len;
-- ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, len);
--
-- printk("%s\n",
-- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
--
-- }
--
-- printk("\ntesting des ecb encryption across pages\n");
--
-- i = 5;
-- key = des_tv[i].key;
-- tfm->crt_flags = 0;
--
-- hexdump(key, 8);
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
-- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
-- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 8;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 8;
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 8);
-- printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 8);
-- printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
--
-- printk("\ntesting des ecb encryption chunking scenario A\n");
--
-- /*
-- * Scenario A:
-- *
-- * F1 F2 F3
-- * [8 + 6] [2 + 8] [8]
-- * ^^^^^^ ^
-- * a b c
-- *
-- * Chunking should begin at a, then end with b, and
-- * continue encrypting at an offset of 2 until c.
-- *
-- */
-- i = 7;
--
-- key = des_tv[i].key;
-- tfm->crt_flags = 0;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
--
-- /* Frag 1: 8 + 6 */
-- memcpy(&xbuf[IDX3], des_tv[i].plaintext, 14);
--
-- /* Frag 2: 2 + 8 */
-- memcpy(&xbuf[IDX4], des_tv[i].plaintext + 14, 10);
--
-- /* Frag 3: 8 */
-- memcpy(&xbuf[IDX5], des_tv[i].plaintext + 24, 8);
--
-- p = &xbuf[IDX3];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 14;
--
-- p = &xbuf[IDX4];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 10;
--
-- p = &xbuf[IDX5];
-- sg[2].page = virt_to_page(p);
-- sg[2].offset = offset_in_page(p);
-- sg[2].length = 8;
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, 32);
--
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 14);
-- printk("%s\n", memcmp(q, des_tv[i].result, 14) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 10);
-- printk("%s\n", memcmp(q, des_tv[i].result + 14, 10) ? "fail" : "pass");
--
-- printk("page 3\n");
-- q = kmap(sg[2].page) + sg[2].offset;
-- hexdump(q, 8);
-- printk("%s\n", memcmp(q, des_tv[i].result + 24, 8) ? "fail" : "pass");
--
-- printk("\ntesting des ecb encryption chunking scenario B\n");
--
-- /*
-- * Scenario B:
-- *
-- * F1 F2 F3 F4
-- * [2] [1] [3] [2 + 8 + 8]
-- */
-- i = 7;
--
-- key = des_tv[i].key;
-- tfm->crt_flags = 0;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
--
-- /* Frag 1: 2 */
-- memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
--
-- /* Frag 2: 1 */
-- memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 1);
--
-- /* Frag 3: 3 */
-- memcpy(&xbuf[IDX5], des_tv[i].plaintext + 3, 3);
--
-- /* Frag 4: 2 + 8 + 8 */
-- memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 18);
--
-- p = &xbuf[IDX3];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 2;
--
-- p = &xbuf[IDX4];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 1;
--
-- p = &xbuf[IDX5];
-- sg[2].page = virt_to_page(p);
-- sg[2].offset = offset_in_page(p);
-- sg[2].length = 3;
--
-- p = &xbuf[IDX6];
-- sg[3].page = virt_to_page(p);
-- sg[3].offset = offset_in_page(p);
-- sg[3].length = 18;
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
--
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 2);
-- printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 1);
-- printk("%s\n", memcmp(q, des_tv[i].result + 2, 1) ? "fail" : "pass");
--
-- printk("page 3\n");
-- q = kmap(sg[2].page) + sg[2].offset;
-- hexdump(q, 3);
-- printk("%s\n", memcmp(q, des_tv[i].result + 3, 3) ? "fail" : "pass");
--
-- printk("page 4\n");
-- q = kmap(sg[3].page) + sg[3].offset;
-- hexdump(q, 18);
-- printk("%s\n", memcmp(q, des_tv[i].result + 6, 18) ? "fail" : "pass");
--
-- printk("\ntesting des ecb encryption chunking scenario C\n");
--
-- /*
-- * Scenario B:
-- *
-- * F1 F2 F3 F4 F5
-- * [2] [2] [2] [2] [8]
-- */
-- i = 7;
--
-- key = des_tv[i].key;
-- tfm->crt_flags = 0;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
--
-- /* Frag 1: 2 */
-- memcpy(&xbuf[IDX3], des_tv[i].plaintext, 2);
--
-- /* Frag 2: 2 */
-- memcpy(&xbuf[IDX4], des_tv[i].plaintext + 2, 2);
--
-- /* Frag 3: 2 */
-- memcpy(&xbuf[IDX5], des_tv[i].plaintext + 4, 2);
--
-- /* Frag 4: 2 */
-- memcpy(&xbuf[IDX6], des_tv[i].plaintext + 6, 2);
--
-- /* Frag 5: 8 */
-- memcpy(&xbuf[IDX7], des_tv[i].plaintext + 8, 8);
--
-- p = &xbuf[IDX3];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 2;
--
-- p = &xbuf[IDX4];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 2;
--
-- p = &xbuf[IDX5];
-- sg[2].page = virt_to_page(p);
-- sg[2].offset = offset_in_page(p);
-- sg[2].length = 2;
--
-- p = &xbuf[IDX6];
-- sg[3].page = virt_to_page(p);
-- sg[3].offset = offset_in_page(p);
-- sg[3].length = 2;
--
-- p = &xbuf[IDX7];
-- sg[4].page = virt_to_page(p);
-- sg[4].offset = offset_in_page(p);
-- sg[4].length = 8;
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, 16);
--
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 2);
-- printk("%s\n", memcmp(q, des_tv[i].result, 2) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 2);
-- printk("%s\n", memcmp(q, des_tv[i].result + 2, 2) ? "fail" : "pass");
--
-- printk("page 3\n");
-- q = kmap(sg[2].page) + sg[2].offset;
-- hexdump(q, 2);
-- printk("%s\n", memcmp(q, des_tv[i].result + 4, 2) ? "fail" : "pass");
--
-- printk("page 4\n");
-- q = kmap(sg[3].page) + sg[3].offset;
-- hexdump(q, 2);
-- printk("%s\n", memcmp(q, des_tv[i].result + 6, 2) ? "fail" : "pass");
--
-- printk("page 5\n");
-- q = kmap(sg[4].page) + sg[4].offset;
-- hexdump(q, 8);
-- printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
--
-- printk("\ntesting des ecb encryption chunking scenario D\n");
--
-- /*
-- * Scenario D, torture test, one byte per frag.
-- */
-- i = 7;
-- key = des_tv[i].key;
-- tfm->crt_flags = 0;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, XBUFSIZE);
--
-- xbuf[IDX1] = des_tv[i].plaintext[0];
-- xbuf[IDX2] = des_tv[i].plaintext[1];
-- xbuf[IDX3] = des_tv[i].plaintext[2];
-- xbuf[IDX4] = des_tv[i].plaintext[3];
-- xbuf[IDX5] = des_tv[i].plaintext[4];
-- xbuf[IDX6] = des_tv[i].plaintext[5];
-- xbuf[IDX7] = des_tv[i].plaintext[6];
-- xbuf[IDX8] = des_tv[i].plaintext[7];
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 1;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 1;
--
-- p = &xbuf[IDX3];
-- sg[2].page = virt_to_page(p);
-- sg[2].offset = offset_in_page(p);
-- sg[2].length = 1;
--
-- p = &xbuf[IDX4];
-- sg[3].page = virt_to_page(p);
-- sg[3].offset = offset_in_page(p);
-- sg[3].length = 1;
--
-- p = &xbuf[IDX5];
-- sg[4].page = virt_to_page(p);
-- sg[4].offset = offset_in_page(p);
-- sg[4].length = 1;
--
-- p = &xbuf[IDX6];
-- sg[5].page = virt_to_page(p);
-- sg[5].offset = offset_in_page(p);
-- sg[5].length = 1;
--
-- p = &xbuf[IDX7];
-- sg[6].page = virt_to_page(p);
-- sg[6].offset = offset_in_page(p);
-- sg[6].length = 1;
--
-- p = &xbuf[IDX8];
-- sg[7].page = virt_to_page(p);
-- sg[7].offset = offset_in_page(p);
-- sg[7].length = 1;
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, 8);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- for (i = 0; i < 8; i++)
-- res[i] = *(char *) (kmap(sg[i].page) + sg[i].offset);
--
-- hexdump(res, 8);
-- printk("%s\n", memcmp(res, des_tv[7].result, 8) ? "fail" : "pass");
--
-- printk("\ntesting des decryption\n");
--
-- tsize = sizeof (des_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
-- memcpy(tvmem, des_dec_tv_template, tsize);
-- des_tv = (void *) tvmem;
--
-- for (i = 0; i < DES_DEC_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
--
-- key = des_tv[i].key;
--
-- tfm->crt_flags = 0;
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- len = des_tv[i].len;
--
-- p = des_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = len;
--
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("des_decrypt() failed flags=%x\n",
-- tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, len);
--
-- printk("%s\n",
-- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
--
-- }
--
-- printk("\ntesting des ecb decryption across pages\n");
--
-- i = 6;
--
-- key = des_tv[i].key;
-- tfm->crt_flags = 0;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
-- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 8);
-- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 8, 8);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 8;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 8;
--
-- ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 8);
-- printk("%s\n", memcmp(q, des_tv[i].result, 8) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 8);
-- printk("%s\n", memcmp(q, des_tv[i].result + 8, 8) ? "fail" : "pass");
--
-- /*
-- * Scenario E:
-- *
-- * F1 F2 F3
-- * [3] [5 + 7] [1]
-- *
-- */
-- printk("\ntesting des ecb decryption chunking scenario E\n");
-- i = 2;
--
-- key = des_tv[i].key;
-- tfm->crt_flags = 0;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
--
-- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 3);
-- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 3, 12);
-- memcpy(&xbuf[IDX3], des_tv[i].plaintext + 15, 1);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 3;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 12;
--
-- p = &xbuf[IDX3];
-- sg[2].page = virt_to_page(p);
-- sg[2].offset = offset_in_page(p);
-- sg[2].length = 1;
--
-- ret = crypto_cipher_decrypt(tfm, sg, sg, 16);
--
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 3);
-- printk("%s\n", memcmp(q, des_tv[i].result, 3) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 12);
-- printk("%s\n", memcmp(q, des_tv[i].result + 3, 12) ? "fail" : "pass");
--
-- printk("page 3\n");
-- q = kmap(sg[2].page) + sg[2].offset;
-- hexdump(q, 1);
-- printk("%s\n", memcmp(q, des_tv[i].result + 15, 1) ? "fail" : "pass");
--
-- crypto_free_tfm(tfm);
--
-- tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
-- if (tfm == NULL) {
-- printk("failed to load transform for des cbc\n");
-- return;
-- }
--
-- printk("\ntesting des cbc encryption\n");
--
-- tsize = sizeof (des_cbc_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
-- memcpy(tvmem, des_cbc_enc_tv_template, tsize);
-- des_tv = (void *) tvmem;
--
-- crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
-- crypto_cipher_get_iv(tfm, res, crypto_tfm_alg_ivsize(tfm));
--
-- if (memcmp(res, des_tv[i].iv, sizeof(res))) {
-- printk("crypto_cipher_[set|get]_iv() failed\n");
-- goto out;
-- }
--
-- for (i = 0; i < DES_CBC_ENC_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
--
-- key = des_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- len = des_tv[i].len;
-- p = des_tv[i].plaintext;
--
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = len;
--
-- crypto_cipher_set_iv(tfm, des_tv[i].iv,
-- crypto_tfm_alg_ivsize(tfm));
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-- if (ret) {
-- printk("des_cbc_encrypt() failed flags=%x\n",
-- tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, len);
--
-- printk("%s\n",
-- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-- }
--
-- crypto_free_tfm(tfm);
--
-- /*
-- * Scenario F:
-- *
-- * F1 F2
-- * [8 + 5] [3 + 8]
-- *
-- */
-- printk("\ntesting des cbc encryption chunking scenario F\n");
-- i = 4;
--
-- tfm = crypto_alloc_tfm("des", CRYPTO_TFM_MODE_CBC);
-- if (tfm == NULL) {
-- printk("failed to load transform for CRYPTO_ALG_DES_CCB\n");
-- return;
-- }
--
-- tfm->crt_flags = 0;
-- key = des_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
--
-- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 13);
-- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 13, 11);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 13;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 11;
--
-- crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, 24);
-- if (ret) {
-- printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 13);
-- printk("%s\n", memcmp(q, des_tv[i].result, 13) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 11);
-- printk("%s\n", memcmp(q, des_tv[i].result + 13, 11) ? "fail" : "pass");
--
-- tsize = sizeof (des_cbc_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
-- memcpy(tvmem, des_cbc_dec_tv_template, tsize);
-- des_tv = (void *) tvmem;
--
-- printk("\ntesting des cbc decryption\n");
--
-- for (i = 0; i < DES_CBC_DEC_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
--
-- tfm->crt_flags = 0;
-- key = des_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- len = des_tv[i].len;
-- p = des_tv[i].plaintext;
--
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = len;
--
-- crypto_cipher_set_iv(tfm, des_tv[i].iv,
-- crypto_tfm_alg_blocksize(tfm));
--
-- ret = crypto_cipher_decrypt(tfm, sg, sg, len);
-- if (ret) {
-- printk("des_cbc_decrypt() failed flags=%x\n",
-- tfm->crt_flags);
-- goto out;
-- }
--
-- hexdump(tfm->crt_cipher.cit_iv, 8);
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, len);
--
-- printk("%s\n",
-- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-- }
--
-- /*
-- * Scenario G:
-- *
-- * F1 F2
-- * [4] [4]
-- *
-- */
-- printk("\ntesting des cbc decryption chunking scenario G\n");
-- i = 3;
--
-- tfm->crt_flags = 0;
-- key = des_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, 8);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- /* setup the dummy buffer first */
-- memset(xbuf, 0, sizeof (xbuf));
-- memcpy(&xbuf[IDX1], des_tv[i].plaintext, 4);
-- memcpy(&xbuf[IDX2], des_tv[i].plaintext + 4, 4);
--
-- p = &xbuf[IDX1];
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = 4;
--
-- p = &xbuf[IDX2];
-- sg[1].page = virt_to_page(p);
-- sg[1].offset = offset_in_page(p);
-- sg[1].length = 4;
--
-- crypto_cipher_set_iv(tfm, des_tv[i].iv, crypto_tfm_alg_ivsize(tfm));
--
-- ret = crypto_cipher_decrypt(tfm, sg, sg, 8);
-- if (ret) {
-- printk("des_cbc_decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- printk("page 1\n");
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, 4);
-- printk("%s\n", memcmp(q, des_tv[i].result, 4) ? "fail" : "pass");
--
-- printk("page 2\n");
-- q = kmap(sg[1].page) + sg[1].offset;
-- hexdump(q, 4);
-- printk("%s\n", memcmp(q, des_tv[i].result + 4, 4) ? "fail" : "pass");
--
-- out:
-- crypto_free_tfm(tfm);
--}
--
--void
--test_des3_ede(void)
--{
-- unsigned int ret, i, len;
-- unsigned int tsize;
-- char *p, *q;
-- struct crypto_tfm *tfm;
-- char *key;
-- /*char res[8]; */
-- struct des_tv *des_tv;
-- struct scatterlist sg[8];
--
-- printk("\ntesting des3 ede encryption\n");
--
-- tsize = sizeof (des3_ede_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, des3_ede_enc_tv_template, tsize);
-- des_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("des3_ede", CRYPTO_TFM_MODE_ECB);
-- if (tfm == NULL) {
-- printk("failed to load transform for 3des ecb\n");
-- return;
-- }
--
-- for (i = 0; i < DES3_EDE_ENC_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
--
-- key = des_tv[i].key;
-- ret = crypto_cipher_setkey(tfm, key, 24);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!des_tv[i].fail)
-- goto out;
-- }
--
-- len = des_tv[i].len;
--
-- p = des_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = len;
-- ret = crypto_cipher_encrypt(tfm, sg, sg, len);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, len);
--
-- printk("%s\n",
-- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-- }
--
-- printk("\ntesting des3 ede decryption\n");
--
-- tsize = sizeof (des3_ede_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, des3_ede_dec_tv_template, tsize);
-- des_tv = (void *) tvmem;
--
-- for (i = 0; i < DES3_EDE_DEC_TEST_VECTORS; i++) {
-- printk("test %u:\n", i + 1);
--
-- key = des_tv[i].key;
-- ret = crypto_cipher_setkey(tfm, key, 24);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!des_tv[i].fail)
-- goto out;
-- }
--
-- len = des_tv[i].len;
--
-- p = des_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = len;
-- ret = crypto_cipher_decrypt(tfm, sg, sg, len);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, len);
--
-- printk("%s\n",
-- memcmp(q, des_tv[i].result, len) ? "fail" : "pass");
-- }
--
-- out:
-- crypto_free_tfm(tfm);
--}
--
--void
--test_blowfish(void)
--{
-- unsigned int ret, i;
-- unsigned int tsize;
-- char *p, *q;
-- struct crypto_tfm *tfm;
-- char *key;
-- struct bf_tv *bf_tv;
-- struct scatterlist sg[1];
--
-- printk("\ntesting blowfish encryption\n");
--
-- tsize = sizeof (bf_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, bf_enc_tv_template, tsize);
-- bf_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("blowfish", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for blowfish (default ecb)\n");
-- return;
-- }
--
-- for (i = 0; i < BF_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, bf_tv[i].keylen * 8);
-- key = bf_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!bf_tv[i].fail)
-- goto out;
-- }
--
-- p = bf_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = bf_tv[i].plen;
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, bf_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
-- "fail" : "pass");
-- }
--
-- printk("\ntesting blowfish decryption\n");
--
-- tsize = sizeof (bf_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, bf_dec_tv_template, tsize);
-- bf_tv = (void *) tvmem;
--
-- for (i = 0; i < BF_DEC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, bf_tv[i].keylen * 8);
-- key = bf_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!bf_tv[i].fail)
-- goto out;
-- }
--
-- p = bf_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = bf_tv[i].plen;
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, bf_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen) ?
-- "fail" : "pass");
-- }
--
-- crypto_free_tfm(tfm);
--
-- tfm = crypto_alloc_tfm("blowfish", CRYPTO_TFM_MODE_CBC);
-- if (tfm == NULL) {
-- printk("failed to load transform for blowfish cbc\n");
-- return;
-- }
--
-- printk("\ntesting blowfish cbc encryption\n");
--
-- tsize = sizeof (bf_cbc_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- goto out;
-- }
-- memcpy(tvmem, bf_cbc_enc_tv_template, tsize);
-- bf_tv = (void *) tvmem;
--
-- for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, bf_tv[i].keylen * 8);
--
-- key = bf_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- p = bf_tv[i].plaintext;
--
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = bf_tv[i].plen;
--
-- crypto_cipher_set_iv(tfm, bf_tv[i].iv,
-- crypto_tfm_alg_ivsize(tfm));
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("blowfish_cbc_encrypt() failed flags=%x\n",
-- tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, bf_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
-- ? "fail" : "pass");
-- }
--
-- printk("\ntesting blowfish cbc decryption\n");
--
-- tsize = sizeof (bf_cbc_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- goto out;
-- }
-- memcpy(tvmem, bf_cbc_dec_tv_template, tsize);
-- bf_tv = (void *) tvmem;
--
-- for (i = 0; i < BF_CBC_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, bf_tv[i].keylen * 8);
-- key = bf_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, bf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- p = bf_tv[i].plaintext;
--
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = bf_tv[i].plen;
--
-- crypto_cipher_set_iv(tfm, bf_tv[i].iv,
-- crypto_tfm_alg_ivsize(tfm));
--
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("blowfish_cbc_decrypt() failed flags=%x\n",
-- tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, bf_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, bf_tv[i].result, bf_tv[i].rlen)
-- ? "fail" : "pass");
-- }
--
--out:
-- crypto_free_tfm(tfm);
--}
--
--
--void
--test_twofish(void)
--{
-- unsigned int ret, i;
-- unsigned int tsize;
-- char *p, *q;
-- struct crypto_tfm *tfm;
-- char *key;
-- struct tf_tv *tf_tv;
-- struct scatterlist sg[1];
--
-- printk("\ntesting twofish encryption\n");
--
-- tsize = sizeof (tf_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, tf_enc_tv_template, tsize);
-- tf_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("twofish", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for blowfish (default ecb)\n");
-- return;
-- }
--
-- for (i = 0; i < TF_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, tf_tv[i].keylen * 8);
-- key = tf_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!tf_tv[i].fail)
-- goto out;
-- }
--
-- p = tf_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = tf_tv[i].plen;
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, tf_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
-- "fail" : "pass");
-- }
--
-- printk("\ntesting twofish decryption\n");
--
-- tsize = sizeof (tf_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, tf_dec_tv_template, tsize);
-- tf_tv = (void *) tvmem;
--
-- for (i = 0; i < TF_DEC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, tf_tv[i].keylen * 8);
-- key = tf_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!tf_tv[i].fail)
-- goto out;
-- }
--
-- p = tf_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = tf_tv[i].plen;
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, tf_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen) ?
-- "fail" : "pass");
-- }
--
-- crypto_free_tfm(tfm);
--
-- tfm = crypto_alloc_tfm("twofish", CRYPTO_TFM_MODE_CBC);
-- if (tfm == NULL) {
-- printk("failed to load transform for twofish cbc\n");
-- return;
-- }
--
-- printk("\ntesting twofish cbc encryption\n");
--
-- tsize = sizeof (tf_cbc_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- goto out;
-- }
-- memcpy(tvmem, tf_cbc_enc_tv_template, tsize);
-- tf_tv = (void *) tvmem;
--
-- for (i = 0; i < TF_CBC_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, tf_tv[i].keylen * 8);
--
-- key = tf_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- p = tf_tv[i].plaintext;
--
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = tf_tv[i].plen;
--
-- crypto_cipher_set_iv(tfm, tf_tv[i].iv,
-- crypto_tfm_alg_ivsize(tfm));
--
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("blowfish_cbc_encrypt() failed flags=%x\n",
-- tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, tf_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
-- ? "fail" : "pass");
-- }
--
-- printk("\ntesting twofish cbc decryption\n");
--
-- tsize = sizeof (tf_cbc_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- goto out;
-- }
-- memcpy(tvmem, tf_cbc_dec_tv_template, tsize);
-- tf_tv = (void *) tvmem;
--
-- for (i = 0; i < TF_CBC_DEC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, tf_tv[i].keylen * 8);
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the Free
-+ * Software Foundation; either version 2 of the License, or (at your option)
-+ * any later version.
-+ *
-+ * 14 - 09 - 2003
-+ * Rewritten by Kartikey Mahendra Bhatt
-+ */
-
-- key = tf_tv[i].key;
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/mm.h>
-+#include <linux/slab.h>
-+#include <asm/scatterlist.h>
-+#include <linux/string.h>
-+#include <linux/crypto.h>
-+#include <linux/highmem.h>
-+#include "tcrypt.h"
-
-- ret = crypto_cipher_setkey(tfm, key, tf_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
-+/*
-+ * Need to kmalloc() memory for testing kmap().
-+ */
-+#define TVMEMSIZE 4096
-+#define XBUFSIZE 32768
-
-- p = tf_tv[i].plaintext;
-+/*
-+ * Indexes into the xbuf to simulate cross-page access.
-+ */
-+#define IDX1 37
-+#define IDX2 32400
-+#define IDX3 1
-+#define IDX4 8193
-+#define IDX5 22222
-+#define IDX6 17101
-+#define IDX7 27333
-+#define IDX8 3000
-
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = tf_tv[i].plen;
-+/*
-+* Used by test_cipher()
-+*/
-+#define ENCRYPT 1
-+#define DECRYPT 0
-+#define MODE_ECB 1
-+#define MODE_CBC 0
-
-- crypto_cipher_set_iv(tfm, tf_tv[i].iv,
-- crypto_tfm_alg_ivsize(tfm));
-+static unsigned int IDX[8] = { IDX1, IDX2, IDX3, IDX4, IDX5, IDX6, IDX7, IDX8 };
-
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("blowfish_cbc_decrypt() failed flags=%x\n",
-- tfm->crt_flags);
-- goto out;
-- }
-+static int mode;
-+static char *xbuf;
-+static char *tvmem;
-
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, tf_tv[i].rlen);
-+static char *check[] = {
-+ "des", "md5", "des3_ede", "rot13", "sha1", "sha256", "blowfish",
-+ "twofish", "serpent", "sha384", "sha512", "md4", "aes", "cast6",
-+ "deflate", NULL
-+};
-
-- printk("%s\n", memcmp(q, tf_tv[i].result, tf_tv[i].rlen)
-- ? "fail" : "pass");
-- }
-+static void
-+hexdump(unsigned char *buf, unsigned int len)
-+{
-+ while (len--)
-+ printk("%02x", *buf++);
-
--out:
-- crypto_free_tfm(tfm);
-+ printk("\n");
- }
-
--void
--test_serpent(void)
-+static void
-+test_hash (char * algo, struct hash_testvec * template, unsigned int tcount)
- {
-- unsigned int ret, i, tsize;
-- u8 *p, *q, *key;
-- struct crypto_tfm *tfm;
-- struct serpent_tv *serp_tv;
-- struct scatterlist sg[1];
--
-- printk("\ntesting serpent encryption\n");
-+ char *p;
-+ unsigned int i, j, k, temp;
-+ struct scatterlist sg[8];
-+ char result[64];
-+ struct crypto_tfm *tfm;
-+ struct hash_testvec *hash_tv;
-+ unsigned int tsize;
-+
-+ printk("\ntesting %s\n", algo);
-
-- tfm = crypto_alloc_tfm("serpent", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for serpent (default ecb)\n");
-+ tsize = sizeof (struct hash_testvec);
-+ tsize *= tcount;
-+
-+ if (tsize > TVMEMSIZE) {
-+ printk("template (%u) too big for tvmem (%u)\n", tsize, TVMEMSIZE);
- return;
- }
-
-- tsize = sizeof (serpent_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-+ memcpy(tvmem, template, tsize);
-+ hash_tv = (void *) tvmem;
-+ tfm = crypto_alloc_tfm(algo, 0);
-+ if (tfm == NULL) {
-+ printk("failed to load transform for %s\n", algo);
- return;
- }
-
-- memcpy(tvmem, serpent_enc_tv_template, tsize);
-- serp_tv = (void *) tvmem;
-- for (i = 0; i < SERPENT_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
-- key = serp_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!serp_tv[i].fail)
-- goto out;
-- }
-+ for (i = 0; i < tcount; i++) {
-+ printk ("test %u:\n", i + 1);
-+ memset (result, 0, 64);
-
-- p = serp_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = sizeof(serp_tv[i].plaintext);
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
-+ p = hash_tv[i].plaintext;
-+ sg[0].page = virt_to_page (p);
-+ sg[0].offset = offset_in_page (p);
-+ sg[0].length = hash_tv[i].psize;
-
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, sizeof(serp_tv[i].result));
-+ crypto_digest_init (tfm);
-+ crypto_digest_update (tfm, sg, 1);
-+ crypto_digest_final (tfm, result);
-
-- printk("%s\n", memcmp(q, serp_tv[i].result,
-- sizeof(serp_tv[i].result)) ? "fail" : "pass");
-+ hexdump (result, crypto_tfm_alg_digestsize (tfm));
-+ printk("%s\n",
-+ memcmp(result, hash_tv[i].digest,
-+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-+ "pass");
- }
-
-- printk("\ntesting serpent decryption\n");
--
-- tsize = sizeof (serpent_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
-+ printk ("testing %s across pages\n", algo);
-
-- memcpy(tvmem, serpent_dec_tv_template, tsize);
-- serp_tv = (void *) tvmem;
-- for (i = 0; i < SERPENT_DEC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n", i + 1, serp_tv[i].keylen * 8);
-- key = serp_tv[i].key;
-+ /* setup the dummy buffer first */
-+ memset(xbuf, 0, XBUFSIZE);
-
-- ret = crypto_cipher_setkey(tfm, key, serp_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-+ j = 0;
-+ for (i = 0; i < tcount; i++) {
-+ if (hash_tv[i].np) {
-+ j++;
-+ printk ("test %u:\n", j);
-+ memset (result, 0, 64);
-
-- if (!serp_tv[i].fail)
-- goto out;
-- }
-+ temp = 0;
-+ for (k = 0; k < hash_tv[i].np; k++) {
-+ memcpy (&xbuf[IDX[k]], hash_tv[i].plaintext + temp,
-+ hash_tv[i].tap[k]);
-+ temp += hash_tv[i].tap[k];
-+ p = &xbuf[IDX[k]];
-+ sg[k].page = virt_to_page (p);
-+ sg[k].offset = offset_in_page (p);
-+ sg[k].length = hash_tv[i].tap[k];
-+ }
-
-- p = serp_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = sizeof(serp_tv[i].plaintext);
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-+ crypto_digest_digest (tfm, sg, hash_tv[i].np, result);
-+
-+ hexdump (result, crypto_tfm_alg_digestsize (tfm));
-+ printk("%s\n",
-+ memcmp(result, hash_tv[i].digest,
-+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-+ "pass");
- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, sizeof(serp_tv[i].result));
--
-- printk("%s\n", memcmp(q, serp_tv[i].result,
-- sizeof(serp_tv[i].result)) ? "fail" : "pass");
- }
--
--out:
-- crypto_free_tfm(tfm);
-+
-+ crypto_free_tfm (tfm);
- }
-
-+
-+#ifdef CONFIG_CRYPTO_HMAC
-+
- static void
--test_cast6(void)
-+test_hmac(char *algo, struct hmac_testvec * template, unsigned int tcount)
- {
-- unsigned int ret, i, tsize;
-- u8 *p, *q, *key;
-+ char *p;
-+ unsigned int i, j, k, temp;
-+ struct scatterlist sg[8];
-+ char result[64];
- struct crypto_tfm *tfm;
-- struct cast6_tv *cast_tv;
-- struct scatterlist sg[1];
-+ struct hmac_testvec *hmac_tv;
-+ unsigned int tsize, klen;
-
-- printk("\ntesting cast6 encryption\n");
--
-- tfm = crypto_alloc_tfm("cast6", 0);
-+ tfm = crypto_alloc_tfm(algo, 0);
- if (tfm == NULL) {
-- printk("failed to load transform for cast6 (default ecb)\n");
-+ printk("failed to load transform for %s\n", algo);
- return;
- }
-
-- tsize = sizeof (cast6_enc_tv_template);
-+ printk("\ntesting hmac_%s\n", algo);
-+
-+ tsize = sizeof (struct hmac_testvec);
-+ tsize *= tcount;
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
-- return;
-+ goto out;
- }
-
-- memcpy(tvmem, cast6_enc_tv_template, tsize);
-- cast_tv = (void *) tvmem;
-- for (i = 0; i < CAST6_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n", i + 1, cast_tv[i].keylen * 8);
-- key = cast_tv[i].key;
-+ memcpy(tvmem, template, tsize);
-+ hmac_tv = (void *) tvmem;
-
-- ret = crypto_cipher_setkey(tfm, key, cast_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!cast_tv[i].fail)
-- goto out;
-- }
-+ for (i = 0; i < tcount; i++) {
-+ printk("test %u:\n", i + 1);
-+ memset(result, 0, sizeof (result));
-
-- p = cast_tv[i].plaintext;
-+ p = hmac_tv[i].plaintext;
-+ klen = hmac_tv[i].ksize;
- sg[0].page = virt_to_page(p);
-- sg[0].offset = ((long) p & ~PAGE_MASK);
-- sg[0].length = sizeof(cast_tv[i].plaintext);
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, sizeof(cast_tv[i].result));
--
-- printk("%s\n", memcmp(q, cast_tv[i].result,
-- sizeof(cast_tv[i].result)) ? "fail" : "pass");
-- }
-+ sg[0].offset = offset_in_page(p);
-+ sg[0].length = hmac_tv[i].psize;
-
-- printk("\ntesting cast6 decryption\n");
-+ crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result);
-
-- tsize = sizeof (cast6_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-+ hexdump(result, crypto_tfm_alg_digestsize(tfm));
-+ printk("%s\n",
-+ memcmp(result, hmac_tv[i].digest,
-+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-+ "pass");
- }
-
-- memcpy(tvmem, cast6_dec_tv_template, tsize);
-- cast_tv = (void *) tvmem;
-- for (i = 0; i < CAST6_DEC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n", i + 1, cast_tv[i].keylen * 8);
-- key = cast_tv[i].key;
-+ printk("\ntesting hmac_%s across pages\n", algo);
-
-- ret = crypto_cipher_setkey(tfm, key, cast_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!cast_tv[i].fail)
-- goto out;
-- }
--
-- p = cast_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = ((long) p & ~PAGE_MASK);
-- sg[0].length = sizeof(cast_tv[i].plaintext);
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-+ memset(xbuf, 0, XBUFSIZE);
-+
-+ j = 0;
-+ for (i = 0; i < tcount; i++) {
-+ if (hmac_tv[i].np) {
-+ j++;
-+ printk ("test %u:\n",j);
-+ memset (result, 0, 64);
-+
-+ temp = 0;
-+ klen = hmac_tv[i].ksize;
-+ for (k = 0; k < hmac_tv[i].np; k++) {
-+ memcpy (&xbuf[IDX[k]], hmac_tv[i].plaintext + temp,
-+ hmac_tv[i].tap[k]);
-+ temp += hmac_tv[i].tap[k];
-+ p = &xbuf[IDX[k]];
-+ sg[k].page = virt_to_page (p);
-+ sg[k].offset = offset_in_page (p);
-+ sg[k].length = hmac_tv[i].tap[k];
-+ }
-+
-+ crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, hmac_tv[i].np,
-+ result);
-+ hexdump(result, crypto_tfm_alg_digestsize(tfm));
-+
-+ printk("%s\n",
-+ memcmp(result, hmac_tv[i].digest,
-+ crypto_tfm_alg_digestsize(tfm)) ? "fail" :
-+ "pass");
- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, sizeof(cast_tv[i].result));
--
-- printk("%s\n", memcmp(q, cast_tv[i].result,
-- sizeof(cast_tv[i].result)) ? "fail" : "pass");
- }
--
- out:
- crypto_free_tfm(tfm);
- }
-
-+#endif /* CONFIG_CRYPTO_HMAC */
-+
- void
--test_aes(void)
-+test_cipher(char * algo, int mode, int enc, struct cipher_testvec * template, unsigned int tcount)
- {
-- unsigned int ret, i;
-+ unsigned int ret, i, j, k, temp;
- unsigned int tsize;
- char *p, *q;
- struct crypto_tfm *tfm;
- char *key;
-- struct aes_tv *aes_tv;
-- struct scatterlist sg[1];
--
-- printk("\ntesting aes encryption\n");
--
-- tsize = sizeof (aes_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, aes_enc_tv_template, tsize);
-- aes_tv = (void *) tvmem;
--
-- tfm = crypto_alloc_tfm("aes", 0);
-- if (tfm == NULL) {
-- printk("failed to load transform for aes (default ecb)\n");
-- return;
-- }
--
-- for (i = 0; i < AES_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, aes_tv[i].keylen * 8);
-- key = aes_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!aes_tv[i].fail)
-- goto out;
-- }
-+ struct cipher_testvec *cipher_tv;
-+ struct scatterlist sg[8];
-+ char e[11], m[4];
-
-- p = aes_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = aes_tv[i].plen;
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
-+ if (enc == ENCRYPT)
-+ strncpy(e, "encryption", 11);
-+ else
-+ strncpy(e, "decryption", 11);
-+ if (mode == MODE_ECB)
-+ strncpy(m, "ECB", 4);
-+ else
-+ strncpy(m, "CBC", 4);
-
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, aes_tv[i].rlen);
-+ printk("\ntesting %s %s %s \n", algo, m, e);
-
-- printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
-- "fail" : "pass");
-- }
-+ tsize = sizeof (struct cipher_testvec);
-+ tsize *= tcount;
-
-- printk("\ntesting aes decryption\n");
--
-- tsize = sizeof (aes_dec_tv_template);
- if (tsize > TVMEMSIZE) {
- printk("template (%u) too big for tvmem (%u)\n", tsize,
- TVMEMSIZE);
- return;
- }
-
-- memcpy(tvmem, aes_dec_tv_template, tsize);
-- aes_tv = (void *) tvmem;
--
-- for (i = 0; i < AES_DEC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n",
-- i + 1, aes_tv[i].keylen * 8);
-- key = aes_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, aes_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!aes_tv[i].fail)
-- goto out;
-- }
--
-- p = aes_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = offset_in_page(p);
-- sg[0].length = aes_tv[i].plen;
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, aes_tv[i].rlen);
--
-- printk("%s\n", memcmp(q, aes_tv[i].result, aes_tv[i].rlen) ?
-- "fail" : "pass");
-- }
--
--out:
-- crypto_free_tfm(tfm);
--}
--
--void
--test_cast5(void)
--{
-- unsigned int ret, i, tsize;
-- u8 *p, *q, *key;
-- struct crypto_tfm *tfm;
-- struct cast5_tv *c5_tv;
-- struct scatterlist sg[1];
--
-- printk("\ntesting cast5 encryption\n");
-+ memcpy(tvmem, template, tsize);
-+ cipher_tv = (void *) tvmem;
-
-- tfm = crypto_alloc_tfm("cast5", 0);
-+ if (mode)
-+ tfm = crypto_alloc_tfm (algo, 0);
-+ else
-+ tfm = crypto_alloc_tfm (algo, CRYPTO_TFM_MODE_CBC);
-+
- if (tfm == NULL) {
-- printk("failed to load transform for cast5 (default ecb)\n");
-- return;
-- }
--
-- tsize = sizeof (cast5_enc_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-+ printk("failed to load transform for %s %s\n", algo, m);
- return;
- }
-+
-+ j = 0;
-+ for (i = 0; i < tcount; i++) {
-+ if (!(cipher_tv[i].np)) {
-+ j++;
-+ printk("test %u (%d bit key):\n",
-+ j, cipher_tv[i].klen * 8);
-
-- memcpy(tvmem, cast5_enc_tv_template, tsize);
-- c5_tv = (void *) tvmem;
-- for (i = 0; i < CAST5_ENC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
-- key = c5_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
-+ tfm->crt_flags = 0;
-+ if (cipher_tv[i].wk)
-+ tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
-+ key = cipher_tv[i].key;
-+
-+ ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
-+ if (ret) {
-+ printk("setkey() failed flags=%x\n", tfm->crt_flags);
-+
-+ if (!cipher_tv[i].fail)
-+ goto out;
-+ }
-
-- if (!c5_tv[i].fail)
-+ p = cipher_tv[i].input;
-+ sg[0].page = virt_to_page(p);
-+ sg[0].offset = offset_in_page(p);
-+ sg[0].length = cipher_tv[i].ilen;
-+
-+ if (!mode) {
-+ crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
-+ crypto_tfm_alg_ivsize (tfm));
-+ }
-+
-+ if (enc)
-+ ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
-+ else
-+ ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
-+
-+
-+ if (ret) {
-+ printk("%s () failed flags=%x\n", e, tfm->crt_flags);
- goto out;
-+ }
-+
-+ q = kmap(sg[0].page) + sg[0].offset;
-+ hexdump(q, cipher_tv[i].rlen);
-+
-+ printk("%s\n",
-+ memcmp(q, cipher_tv[i].result, cipher_tv[i].rlen) ? "fail" :
-+ "pass");
- }
--
-- p = c5_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = ((long) p & ~PAGE_MASK);
-- sg[0].length = sizeof(c5_tv[i].plaintext);
-- ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("encrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, sizeof(c5_tv[i].ciphertext));
--
-- printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
-- sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
- }
-
-- tsize = sizeof (cast5_dec_tv_template);
-- if (tsize > TVMEMSIZE) {
-- printk("template (%u) too big for tvmem (%u)\n", tsize,
-- TVMEMSIZE);
-- return;
-- }
--
-- memcpy(tvmem, cast5_dec_tv_template, tsize);
-- c5_tv = (void *) tvmem;
-- for (i = 0; i < CAST5_DEC_TEST_VECTORS; i++) {
-- printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8);
-- key = c5_tv[i].key;
--
-- ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen);
-- if (ret) {
-- printk("setkey() failed flags=%x\n", tfm->crt_flags);
--
-- if (!c5_tv[i].fail)
-- goto out;
-- }
--
-- p = c5_tv[i].plaintext;
-- sg[0].page = virt_to_page(p);
-- sg[0].offset = ((long) p & ~PAGE_MASK);
-- sg[0].length = sizeof(c5_tv[i].plaintext);
-- ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length);
-- if (ret) {
-- printk("decrypt() failed flags=%x\n", tfm->crt_flags);
-- goto out;
-+ printk("\ntesting %s %s %s across pages (chunking) \n", algo, m, e);
-+ memset(xbuf, 0, XBUFSIZE);
-+
-+ j = 0;
-+ for (i = 0; i < tcount; i++) {
-+ if (cipher_tv[i].np) {
-+ j++;
-+ printk("test %u (%d bit key):\n",
-+ j, cipher_tv[i].klen * 8);
-+
-+ tfm->crt_flags = 0;
-+ if (cipher_tv[i].wk)
-+ tfm->crt_flags |= CRYPTO_TFM_REQ_WEAK_KEY;
-+ key = cipher_tv[i].key;
-+
-+ ret = crypto_cipher_setkey(tfm, key, cipher_tv[i].klen);
-+ if (ret) {
-+ printk("setkey() failed flags=%x\n", tfm->crt_flags);
-+
-+ if (!cipher_tv[i].fail)
-+ goto out;
-+ }
-+
-+ temp = 0;
-+ for (k = 0; k < cipher_tv[i].np; k++) {
-+ memcpy (&xbuf[IDX[k]], cipher_tv[i].input + temp,
-+ cipher_tv[i].tap[k]);
-+ temp += cipher_tv[i].tap[k];
-+ p = &xbuf[IDX[k]];
-+ sg[k].page = virt_to_page (p);
-+ sg[k].offset = offset_in_page (p);
-+ sg[k].length = cipher_tv[i].tap[k];
-+ }
-+
-+ if (!mode) {
-+ crypto_cipher_set_iv(tfm, cipher_tv[i].iv,
-+ crypto_tfm_alg_ivsize (tfm));
-+ }
-+
-+ if (enc)
-+ ret = crypto_cipher_encrypt(tfm, sg, sg, cipher_tv[i].ilen);
-+ else
-+ ret = crypto_cipher_decrypt(tfm, sg, sg, cipher_tv[i].ilen);
-+
-+ if (ret) {
-+ printk("%s () failed flags=%x\n", e, tfm->crt_flags);
-+ goto out;
-+ }
-+
-+ temp = 0;
-+ for (k = 0; k < cipher_tv[i].np; k++) {
-+ printk("page %u\n", k);
-+ q = kmap(sg[k].page) + sg[k].offset;
-+ hexdump(q, cipher_tv[i].tap[k]);
-+ printk("%s\n",
-+ memcmp(q, cipher_tv[i].result + temp,
-+ cipher_tv[i].tap[k]) ? "fail" :
-+ "pass");
-+ temp += cipher_tv[i].tap[k];
-+ }
- }
--
-- q = kmap(sg[0].page) + sg[0].offset;
-- hexdump(q, sizeof(c5_tv[i].ciphertext));
--
-- printk("%s\n", memcmp(q, c5_tv[i].ciphertext,
-- sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass");
- }
-+
- out:
-- crypto_free_tfm (tfm);
-+ crypto_free_tfm(tfm);
- }
-
- static void
-@@ -2485,75 +510,118 @@ do_test(void)
- switch (mode) {
-
- case 0:
-- test_md5();
-- test_sha1();
-- test_des();
-- test_des3_ede();
-- test_md4();
-- test_sha256();
-- test_blowfish();
-- test_twofish();
-- test_serpent();
-- test_cast6();
-- test_aes();
-- test_sha384();
-- test_sha512();
-- test_deflate();
-- test_cast5();
-- test_cast6();
-+ test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
-+
-+ test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
-+
-+ //DES
-+ test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
-+ test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
-+ test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
-+ test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
-+
-+ //DES3_EDE
-+ test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
-+ test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
-+
-+ test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
-+
-+ test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
-+
-+ //BLOWFISH
-+ test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
-+ test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
-+ test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
-+ test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
-+
-+ //TWOFISH
-+ test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
-+ test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
-+ test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
-+ test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
-+
-+ //SERPENT
-+ test_cipher ("serpent", MODE_ECB, ENCRYPT, serpent_enc_tv_template, SERPENT_ENC_TEST_VECTORS);
-+ test_cipher ("serpent", MODE_ECB, DECRYPT, serpent_dec_tv_template, SERPENT_DEC_TEST_VECTORS);
-+
-+ //AES
-+ test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
-+ test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
-+
-+ //CAST5
-+ test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
-+ test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
-+
-+ //CAST6
-+ test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
-+ test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
-+
-+ test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
-+ test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
-+ test_deflate();
- #ifdef CONFIG_CRYPTO_HMAC
-- test_hmac_md5();
-- test_hmac_sha1();
-- test_hmac_sha256();
-+ test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
-+ test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
-+ test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
- #endif
- break;
-
- case 1:
-- test_md5();
-+ test_hash("md5", md5_tv_template, MD5_TEST_VECTORS);
- break;
-
- case 2:
-- test_sha1();
-+ test_hash("sha1", sha1_tv_template, SHA1_TEST_VECTORS);
- break;
-
- case 3:
-- test_des();
-+ test_cipher ("des", MODE_ECB, ENCRYPT, des_enc_tv_template, DES_ENC_TEST_VECTORS);
-+ test_cipher ("des", MODE_ECB, DECRYPT, des_dec_tv_template, DES_DEC_TEST_VECTORS);
-+ test_cipher ("des", MODE_CBC, ENCRYPT, des_cbc_enc_tv_template, DES_CBC_ENC_TEST_VECTORS);
-+ test_cipher ("des", MODE_CBC, DECRYPT, des_cbc_dec_tv_template, DES_CBC_DEC_TEST_VECTORS);
- break;
-
- case 4:
-- test_des3_ede();
-+ test_cipher ("des3_ede", MODE_ECB, ENCRYPT, des3_ede_enc_tv_template, DES3_EDE_ENC_TEST_VECTORS);
-+ test_cipher ("des3_ede", MODE_ECB, DECRYPT, des3_ede_dec_tv_template, DES3_EDE_DEC_TEST_VECTORS);
- break;
-
- case 5:
-- test_md4();
-+ test_hash("md4", md4_tv_template, MD4_TEST_VECTORS);
- break;
-
- case 6:
-- test_sha256();
-+ test_hash("sha256", sha256_tv_template, SHA256_TEST_VECTORS);
- break;
-
- case 7:
-- test_blowfish();
-+ test_cipher ("blowfish", MODE_ECB, ENCRYPT, bf_enc_tv_template, BF_ENC_TEST_VECTORS);
-+ test_cipher ("blowfish", MODE_ECB, DECRYPT, bf_dec_tv_template, BF_DEC_TEST_VECTORS);
-+ test_cipher ("blowfish", MODE_CBC, ENCRYPT, bf_cbc_enc_tv_template, BF_CBC_ENC_TEST_VECTORS);
-+ test_cipher ("blowfish", MODE_CBC, DECRYPT, bf_cbc_dec_tv_template, BF_CBC_DEC_TEST_VECTORS);
- break;
-
- case 8:
-- test_twofish();
-+ test_cipher ("twofish", MODE_ECB, ENCRYPT, tf_enc_tv_template, TF_ENC_TEST_VECTORS);
-+ test_cipher ("twofish", MODE_ECB, DECRYPT, tf_dec_tv_template, TF_DEC_TEST_VECTORS);
-+ test_cipher ("twofish", MODE_CBC, ENCRYPT, tf_cbc_enc_tv_template, TF_CBC_ENC_TEST_VECTORS);
-+ test_cipher ("twofish", MODE_CBC, DECRYPT, tf_cbc_dec_tv_template, TF_CBC_DEC_TEST_VECTORS);
- break;
--
-+
- case 9:
-- test_serpent();
- break;
-
- case 10:
-- test_aes();
-+ test_cipher ("aes", MODE_ECB, ENCRYPT, aes_enc_tv_template, AES_ENC_TEST_VECTORS);
-+ test_cipher ("aes", MODE_ECB, DECRYPT, aes_dec_tv_template, AES_DEC_TEST_VECTORS);
- break;
-
- case 11:
-- test_sha384();
-+ test_hash("sha384", sha384_tv_template, SHA384_TEST_VECTORS);
- break;
-
- case 12:
-- test_sha512();
-+ test_hash("sha512", sha512_tv_template, SHA512_TEST_VECTORS);
- break;
-
- case 13:
-@@ -2561,24 +629,26 @@ do_test(void)
- break;
-
- case 14:
-- test_cast5();
-+ test_cipher ("cast5", MODE_ECB, ENCRYPT, cast5_enc_tv_template, CAST5_ENC_TEST_VECTORS);
-+ test_cipher ("cast5", MODE_ECB, DECRYPT, cast5_dec_tv_template, CAST5_DEC_TEST_VECTORS);
- break;
-
- case 15:
-- test_cast6();
-+ test_cipher ("cast6", MODE_ECB, ENCRYPT, cast6_enc_tv_template, CAST6_ENC_TEST_VECTORS);
-+ test_cipher ("cast6", MODE_ECB, DECRYPT, cast6_dec_tv_template, CAST6_DEC_TEST_VECTORS);
- break;
-
- #ifdef CONFIG_CRYPTO_HMAC
- case 100:
-- test_hmac_md5();
-+ test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS);
- break;
-
- case 101:
-- test_hmac_sha1();
-+ test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS);
- break;
-
- case 102:
-- test_hmac_sha256();
-+ test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS);
- break;
-
- #endif
-@@ -2614,7 +684,14 @@ init(void)
- return 0;
- }
-
-+/*
-+ * If an init function is provided, an exit function must also be provided
-+ * to allow module unload.
-+ */
-+static void __exit fini(void) { }
-+
- module_init(init);
-+module_exit(fini);
-
- MODULE_PARM(mode, "i");
-
---- linux-2.6.0/crypto/tcrypt.h 2003-08-22 19:23:40.000000000 -0700
-+++ 25/crypto/tcrypt.h 2003-12-28 23:22:31.000000000 -0800
-@@ -1,4 +1,4 @@
--/*
-+/*
- * Quick & dirty crypto testing module.
- *
- * This will only exist until we have a better testing mechanism
-@@ -6,565 +6,165 @@
- *
- * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
- * Copyright (c) 2002 Jean-Francois Dive <jef@linuxbe.org>
-- *
-+ *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
-+ * 14 - 09 - 2003 Changes by Kartikey Mahendra Bhatt
-+ *
- */
- #ifndef _CRYPTO_TCRYPT_H
- #define _CRYPTO_TCRYPT_H
-
--#define MD5_DIGEST_SIZE 16
--#define MD4_DIGEST_SIZE 16
--#define SHA1_DIGEST_SIZE 20
--#define SHA256_DIGEST_SIZE 32
--#define SHA384_DIGEST_SIZE 48
--#define SHA512_DIGEST_SIZE 64
--
--/*
-- * MD4 test vectors from RFC1320
-- */
--#define MD4_TEST_VECTORS 7
--
--struct md4_testvec {
-- char plaintext[128];
-- char digest[MD4_DIGEST_SIZE];
--} md4_tv_template[] = {
-- { "",
-- { 0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31,
-- 0xb7, 0x3c, 0x59, 0xd7, 0xe0, 0xc0, 0x89, 0xc0 }
-- },
--
-- { "a",
-- { 0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46,
-- 0x24, 0x5e, 0x05, 0xfb, 0xdb, 0xd6, 0xfb, 0x24 }
-- },
--
-- { "abc",
-- { 0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52,
-- 0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d }
-- },
--
-- { "message digest",
-- { 0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8,
-- 0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b }
-- },
--
-- { "abcdefghijklmnopqrstuvwxyz",
-- { 0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd,
-- 0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9 }
-- },
--
-- { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-- { 0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35,
-- 0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4 }
-- },
--
-- { "123456789012345678901234567890123456789012345678901234567890123"
-- "45678901234567890",
-- { 0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19,
-- 0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36 }
-- },
--};
-+#define MAX_DIGEST_SIZE 64
-+#define MAX_TAP 8
-
--/*
-- * MD5 test vectors from RFC1321
-- */
--#define MD5_TEST_VECTORS 7
-+#define MAX_KEYLEN 56
-+#define MAX_IVLEN 32
-
--struct md5_testvec {
-+struct hash_testvec {
- char plaintext[128];
-- char digest[MD5_DIGEST_SIZE];
--} md5_tv_template[] = {
-- { "",
-- { 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
-- 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e } },
--
-- { "a",
-- { 0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8,
-- 0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61 } },
--
-- { "abc",
-- { 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0,
-- 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72 } },
--
-- { "message digest",
-- { 0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d,
-- 0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0 } },
--
-- { "abcdefghijklmnopqrstuvwxyz",
-- { 0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00,
-- 0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b } },
--
-- { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-- { 0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5,
-- 0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f } },
--
-- { "12345678901234567890123456789012345678901234567890123456789012"
-- "345678901234567890",
-- { 0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55,
-- 0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a } }
-+ unsigned char psize;
-+ char digest[MAX_DIGEST_SIZE];
-+ unsigned char np;
-+ unsigned char tap[MAX_TAP];
- };
-
--#ifdef CONFIG_CRYPTO_HMAC
--/*
-- * HMAC-MD5 test vectors from RFC2202
-- * (These need to be fixed to not use strlen).
-- */
--#define HMAC_MD5_TEST_VECTORS 7
--
--struct hmac_md5_testvec {
-+struct hmac_testvec {
- char key[128];
-+ unsigned char ksize;
- char plaintext[128];
-- char digest[MD5_DIGEST_SIZE];
-+ unsigned char psize;
-+ char digest[MAX_DIGEST_SIZE];
-+ unsigned char np;
-+ unsigned char tap[MAX_TAP];
- };
-
--struct hmac_md5_testvec hmac_md5_tv_template[] =
--{
--
-- {
-- { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00},
--
-- "Hi There",
--
-- { 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
-- 0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d }
-- },
--
-- {
-- { 'J', 'e', 'f', 'e', 0 },
--
-- "what do ya want for nothing?",
--
-- { 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
-- 0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 }
-- },
--
-- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
--
-- { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0x00 },
--
-- { 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
-- 0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 }
-- },
--
-- {
-- { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00 },
--
-- {
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0x00 },
--
-- { 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea,
-- 0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 }
-- },
--
-- {
-- { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00 },
--
-- "Test With Truncation",
--
-- { 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00,
-- 0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c }
-- },
--
-- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0x00 },
--
-- "Test Using Larger Than Block-Size Key - Hash Key First",
--
-- { 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f,
-- 0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd }
-- },
--
-- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0x00 },
--
-- "Test Using Larger Than Block-Size Key and Larger Than One "
-- "Block-Size Data",
--
-- { 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee,
-- 0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e }
-- },
--
-- /* cross page test, need to retain key */
--
-- {
-- { 'J', 'e', 'f', 'e', 0 },
--
-- "what do ya want for nothing?",
--
-- { 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
-- 0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 }
-- },
--
-+struct cipher_testvec {
-+ unsigned char fail;
-+ unsigned char wk; /* weak key flag */
-+ char key[MAX_KEYLEN];
-+ unsigned char klen;
-+ char iv[MAX_IVLEN];
-+ char input[48];
-+ unsigned char ilen;
-+ char result[48];
-+ unsigned char rlen;
-+ int np;
-+ unsigned char tap[MAX_TAP];
- };
-
--
- /*
-- * HMAC-SHA1 test vectors from RFC2202
-+ * MD4 test vectors from RFC1320
- */
-+#define MD4_TEST_VECTORS 7
-
--#define HMAC_SHA1_TEST_VECTORS 7
--
--struct hmac_sha1_testvec {
-- char key[128];
-- char plaintext[128];
-- char digest[SHA1_DIGEST_SIZE];
--} hmac_sha1_tv_template[] = {
--
-- {
-- { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-- 0x00},
--
-- "Hi There",
--
-- { 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64,
-- 0xe2, 0x8b, 0xc0, 0xb6, 0xfb ,0x37, 0x8c, 0x8e, 0xf1,
-- 0x46, 0xbe, 0x00 }
-- },
--
-- {
-- { 'J', 'e', 'f', 'e', 0 },
--
-- "what do ya want for nothing?",
--
-- { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74,
-- 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }
--
-- },
--
-- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0x00},
--
--
-- { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0x00 },
--
-- { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3,
-- 0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 }
--
-- },
--
-- {
-- { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00 },
--
-- {
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0x00 },
--
-- { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84,
-- 0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda }
--
-- },
--
-- {
-- { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x00 },
--
-- "Test With Truncation",
--
-- { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2,
-- 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 }
--
-- },
--
-- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0x00 },
--
-- "Test Using Larger Than Block-Size Key - Hash Key First",
--
-- { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70,
-- 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 }
--
-- },
--
-+struct hash_testvec md4_tv_template [] = {
- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0x00 },
--
-- "Test Using Larger Than Block-Size Key and Larger Than One "
-- "Block-Size Data",
--
-- { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b,
-- 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 }
-+ .plaintext = "",
-+ .digest = { 0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31,
-+ 0xb7, 0x3c, 0x59, 0xd7, 0xe0, 0xc0, 0x89, 0xc0 },
-+ }, {
-+ .plaintext = "a",
-+ .psize = 1,
-+ .digest = { 0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46,
-+ 0x24, 0x5e, 0x05, 0xfb, 0xdb, 0xd6, 0xfb, 0x24 },
-+ }, {
-+ .plaintext = "abc",
-+ .psize = 3,
-+ .digest = { 0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52,
-+ 0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d },
-+ }, {
-+ .plaintext = "message digest",
-+ .psize = 14,
-+ .digest = { 0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8,
-+ 0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b },
-+ }, {
-+ .plaintext = "abcdefghijklmnopqrstuvwxyz",
-+ .psize = 26,
-+ .digest = { 0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd,
-+ 0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9 },
-+ .np = 2,
-+ .tap = { 13, 13 },
-+ }, {
-+ .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-+ .psize = 62,
-+ .digest = { 0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35,
-+ 0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4 },
-+ }, {
-+ .plaintext = "123456789012345678901234567890123456789012345678901234567890123"
-+ "45678901234567890",
-+ .psize = 80,
-+ .digest = { 0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19,
-+ 0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36 },
- },
--
-- /* cross page test */
-- {
-- { 'J', 'e', 'f', 'e', 0 },
--
-- "what do ya want for nothing?",
--
-- { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74,
-- 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }
--
-- },
--
- };
-
- /*
-- * HMAC-SHA256 test vectors from
-- * draft-ietf-ipsec-ciph-sha-256-01.txt
-+ * MD5 test vectors from RFC1321
- */
--#define HMAC_SHA256_TEST_VECTORS 10
--
--struct hmac_sha256_testvec {
-- char key[128];
-- char plaintext[128];
-- char digest[SHA256_DIGEST_SIZE];
--} hmac_sha256_tv_template[] = {
--
-- {
-- { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-- 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
--
--
-- { "abc" },
--
-- { 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
-- 0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
-- 0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
-- 0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81 },
--
-- },
--
-- {
-- { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-- 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
--
-- { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
--
-- { 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
-- 0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
-- 0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
-- 0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30 }
-- },
--
-- {
-- { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-- 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00 },
--
-- { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
-- "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
--
-- { 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
-- 0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
-- 0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
-- 0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3 }
-- },
--
-- {
-- { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00 },
--
-- { "Hi There" },
--
-- { 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
-- 0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
-- 0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
-- 0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7 }
-- },
--
-- {
-- { "Jefe" },
--
-- { "what do ya want for nothing?" },
--
-- { 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
-- 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
-- 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
-- 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 }
-- },
--
-- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
--
-- { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
-- 0xdd, 0xdd, 0x00 },
--
-- { 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
-- 0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
-- 0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
-- 0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0 }
-- },
--
-- {
-- { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-- 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-- 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
-- 0x21, 0x22, 0x23, 0x24, 0x25, 0x00 },
--
-- { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
-- 0xcd, 0xcd, 0x00 },
--
-- { 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
-- 0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
-- 0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
-- 0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17 }
-- },
--
-- {
-- { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00 },
--
-- { "Test With Truncation" },
--
-- { 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
-- 0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
-- 0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
-- 0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42 }
-- },
--
-- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
--
-- { "Test Using Larger Than Block-Size Key - Hash Key First" },
--
-- { 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
-- 0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
-- 0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
-- 0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f }
-- },
-+#define MD5_TEST_VECTORS 7
-
-+struct hash_testvec md5_tv_template[] = {
- {
-- { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-- 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00 },
--
-- { "Test Using Larger Than Block-Size Key and Larger Than "
-- "One Block-Size Data" },
--
-- { 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
-- 0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
-- 0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
-- 0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6 }
-- },
-+ .digest = { 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
-+ 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e },
-+ }, {
-+ .plaintext = "a",
-+ .psize = 1,
-+ .digest = { 0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8,
-+ 0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61 },
-+ }, {
-+ .plaintext = "abc",
-+ .psize = 3,
-+ .digest = { 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0,
-+ 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72 },
-+ }, {
-+ .plaintext = "message digest",
-+ .psize = 14,
-+ .digest = { 0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d,
-+ 0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0 },
-+ }, {
-+ .plaintext = "abcdefghijklmnopqrstuvwxyz",
-+ .psize = 26,
-+ .digest = { 0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00,
-+ 0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b },
-+ .np = 2,
-+ .tap = {13, 13}
-+ }, {
-+ .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
-+ .psize = 62,
-+ .digest = { 0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5,
-+ 0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f },
-+ }, {
-+ .plaintext = "12345678901234567890123456789012345678901234567890123456789012"
-+ "345678901234567890",
-+ .psize = 80,
-+ .digest = { 0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55,
-+ 0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a },
-+ }
- };
-
--
--#endif /* CONFIG_CRYPTO_HMAC */
--
- /*
- * SHA1 test vectors from from FIPS PUB 180-1
- */
- #define SHA1_TEST_VECTORS 2
-
--struct sha1_testvec {
-- char plaintext[128];
-- char digest[SHA1_DIGEST_SIZE];
--} sha1_tv_template[] = {
-- { "abc",
-- { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
-- 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C ,0x9C, 0xD0, 0xD8, 0x9D }
-- },
--
-- { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
--
-- { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E ,0xBA, 0xAE,
-- 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }
-+struct hash_testvec sha1_tv_template[] = {
-+ {
-+ .plaintext = "abc",
-+ .psize = 3,
-+ .digest = { 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
-+ 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d },
-+ }, {
-+ .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-+ .psize = 56,
-+ .digest = { 0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2, 0x6e, 0xba, 0xae,
-+ 0x4a, 0xa1, 0xf9, 0x51, 0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1 },
-+ .np = 2,
-+ .tap = { 28, 28 }
- }
- };
-
-@@ -573,22 +173,23 @@ struct sha1_testvec {
- */
- #define SHA256_TEST_VECTORS 2
-
--struct sha256_testvec {
-- char plaintext[128];
-- char digest[SHA256_DIGEST_SIZE];
--} sha256_tv_template[] = {
-- { "abc",
-- { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
-- 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
-- 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
-- 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad }
-- },
--
-- { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-- { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
-- 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
-- 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
-- 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 }
-+struct hash_testvec sha256_tv_template[] = {
-+ {
-+ .plaintext = "abc",
-+ .psize = 3,
-+ .digest = { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
-+ 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
-+ 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
-+ 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad },
-+ }, {
-+ .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-+ .psize = 56,
-+ .digest = { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
-+ 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
-+ 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
-+ 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 },
-+ .np = 2,
-+ .tap = { 28, 28 }
- },
- };
-
-@@ -597,47 +198,47 @@ struct sha256_testvec {
- */
- #define SHA384_TEST_VECTORS 4
-
--struct sha384_testvec {
-- char plaintext[128];
-- char digest[SHA384_DIGEST_SIZE];
--} sha384_tv_template[] = {
--
-- { "abc",
-- { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
-- 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
-- 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
-- 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
-- 0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
-- 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 }
-- },
--
-- { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-- { 0x33, 0x91, 0xfd, 0xdd, 0xfc, 0x8d, 0xc7, 0x39,
-- 0x37, 0x07, 0xa6, 0x5b, 0x1b, 0x47, 0x09, 0x39,
-- 0x7c, 0xf8, 0xb1, 0xd1, 0x62, 0xaf, 0x05, 0xab,
-- 0xfe, 0x8f, 0x45, 0x0d, 0xe5, 0xf3, 0x6b, 0xc6,
-- 0xb0, 0x45, 0x5a, 0x85, 0x20, 0xbc, 0x4e, 0x6f,
-- 0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b }
-- },
--
-- { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-- "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-- { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
-- 0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
-- 0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
-- 0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
-- 0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
-- 0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39 }
-- },
--
-- { "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-- "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-- { 0x3d, 0x20, 0x89, 0x73, 0xab, 0x35, 0x08, 0xdb,
-- 0xbd, 0x7e, 0x2c, 0x28, 0x62, 0xba, 0x29, 0x0a,
-- 0xd3, 0x01, 0x0e, 0x49, 0x78, 0xc1, 0x98, 0xdc,
-- 0x4d, 0x8f, 0xd0, 0x14, 0xe5, 0x82, 0x82, 0x3a,
-- 0x89, 0xe1, 0x6f, 0x9b, 0x2a, 0x7b, 0xbc, 0x1a,
-- 0xc9, 0x38, 0xe2, 0xd1, 0x99, 0xe8, 0xbe, 0xa4 }
-+struct hash_testvec sha384_tv_template[] = {
-+ {
-+ .plaintext= "abc",
-+ .psize = 3,
-+ .digest = { 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
-+ 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
-+ 0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
-+ 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
-+ 0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
-+ 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7 },
-+ }, {
-+ .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-+ .psize = 56,
-+ .digest = { 0x33, 0x91, 0xfd, 0xdd, 0xfc, 0x8d, 0xc7, 0x39,
-+ 0x37, 0x07, 0xa6, 0x5b, 0x1b, 0x47, 0x09, 0x39,
-+ 0x7c, 0xf8, 0xb1, 0xd1, 0x62, 0xaf, 0x05, 0xab,
-+ 0xfe, 0x8f, 0x45, 0x0d, 0xe5, 0xf3, 0x6b, 0xc6,
-+ 0xb0, 0x45, 0x5a, 0x85, 0x20, 0xbc, 0x4e, 0x6f,
-+ 0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b},
-+ }, {
-+ .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-+ "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-+ .psize = 112,
-+ .digest = { 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
-+ 0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
-+ 0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
-+ 0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
-+ 0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
-+ 0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39 },
-+ }, {
-+ .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-+ "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-+ .psize = 104,
-+ .digest = { 0x3d, 0x20, 0x89, 0x73, 0xab, 0x35, 0x08, 0xdb,
-+ 0xbd, 0x7e, 0x2c, 0x28, 0x62, 0xba, 0x29, 0x0a,
-+ 0xd3, 0x01, 0x0e, 0x49, 0x78, 0xc1, 0x98, 0xdc,
-+ 0x4d, 0x8f, 0xd0, 0x14, 0xe5, 0x82, 0x82, 0x3a,
-+ 0x89, 0xe1, 0x6f, 0x9b, 0x2a, 0x7b, 0xbc, 0x1a,
-+ 0xc9, 0x38, 0xe2, 0xd1, 0x99, 0xe8, 0xbe, 0xa4 },
-+ .np = 4,
-+ .tap = { 26, 26, 26, 26 }
- },
- };
-
-@@ -646,439 +247,616 @@ struct sha384_testvec {
- */
- #define SHA512_TEST_VECTORS 4
-
--struct sha512_testvec {
-- char plaintext[128];
-- char digest[SHA512_DIGEST_SIZE];
--} sha512_tv_template[] = {
--
-- { "abc",
-- { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
-- 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
-- 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
-- 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
-- 0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
-- 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
-- 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
-- 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f }
-- },
--
-- { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-- { 0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a,
-- 0x0c, 0xed, 0x7b, 0xeb, 0x8e, 0x08, 0xa4, 0x16,
-- 0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2, 0x28, 0xa8,
-- 0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35,
-- 0x96, 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9,
-- 0xaa, 0x1d, 0x3b, 0xea, 0x57, 0x78, 0x9c, 0xa0,
-- 0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7, 0x03,
-- 0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45 }
-- },
--
-- { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-- "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-- { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
-- 0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
-- 0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
-- 0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
-- 0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
-- 0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
-- 0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
-- 0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09 }
-- },
--
-- { "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-- "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-- { 0x93, 0x0d, 0x0c, 0xef, 0xcb, 0x30, 0xff, 0x11,
-- 0x33, 0xb6, 0x89, 0x81, 0x21, 0xf1, 0xcf, 0x3d,
-- 0x27, 0x57, 0x8a, 0xfc, 0xaf, 0xe8, 0x67, 0x7c,
-- 0x52, 0x57, 0xcf, 0x06, 0x99, 0x11, 0xf7, 0x5d,
-- 0x8f, 0x58, 0x31, 0xb5, 0x6e, 0xbf, 0xda, 0x67,
-- 0xb2, 0x78, 0xe6, 0x6d, 0xff, 0x8b, 0x84, 0xfe,
-- 0x2b, 0x28, 0x70, 0xf7, 0x42, 0xa5, 0x80, 0xd8,
-- 0xed, 0xb4, 0x19, 0x87, 0x23, 0x28, 0x50, 0xc9
-- }
-+struct hash_testvec sha512_tv_template[] = {
-+ {
-+ .plaintext = "abc",
-+ .psize = 3,
-+ .digest = { 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
-+ 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
-+ 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
-+ 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
-+ 0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
-+ 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
-+ 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
-+ 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f },
-+ }, {
-+ .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-+ .psize = 56,
-+ .digest = { 0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a,
-+ 0x0c, 0xed, 0x7b, 0xeb, 0x8e, 0x08, 0xa4, 0x16,
-+ 0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2, 0x28, 0xa8,
-+ 0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35,
-+ 0x96, 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9,
-+ 0xaa, 0x1d, 0x3b, 0xea, 0x57, 0x78, 0x9c, 0xa0,
-+ 0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7, 0x03,
-+ 0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45 },
-+ }, {
-+ .plaintext = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
-+ "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
-+ .psize = 112,
-+ .digest = { 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
-+ 0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
-+ 0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
-+ 0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
-+ 0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
-+ 0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
-+ 0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
-+ 0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09 },
-+ }, {
-+ .plaintext = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
-+ "efghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
-+ .psize = 104,
-+ .digest = { 0x93, 0x0d, 0x0c, 0xef, 0xcb, 0x30, 0xff, 0x11,
-+ 0x33, 0xb6, 0x89, 0x81, 0x21, 0xf1, 0xcf, 0x3d,
-+ 0x27, 0x57, 0x8a, 0xfc, 0xaf, 0xe8, 0x67, 0x7c,
-+ 0x52, 0x57, 0xcf, 0x06, 0x99, 0x11, 0xf7, 0x5d,
-+ 0x8f, 0x58, 0x31, 0xb5, 0x6e, 0xbf, 0xda, 0x67,
-+ 0xb2, 0x78, 0xe6, 0x6d, 0xff, 0x8b, 0x84, 0xfe,
-+ 0x2b, 0x28, 0x70, 0xf7, 0x42, 0xa5, 0x80, 0xd8,
-+ 0xed, 0xb4, 0x19, 0x87, 0x23, 0x28, 0x50, 0xc9 },
-+ .np = 4,
-+ .tap = { 26, 26, 26, 26 }
- },
- };
-
-+#ifdef CONFIG_CRYPTO_HMAC
- /*
-- * DES test vectors.
-+ * HMAC-MD5 test vectors from RFC2202
-+ * (These need to be fixed to not use strlen).
- */
--#define DES_ENC_TEST_VECTORS 5
--#define DES_DEC_TEST_VECTORS 2
--#define DES_CBC_ENC_TEST_VECTORS 4
--#define DES_CBC_DEC_TEST_VECTORS 3
--#define DES3_EDE_ENC_TEST_VECTORS 3
--#define DES3_EDE_DEC_TEST_VECTORS 3
--
--struct des_tv {
-- unsigned int len;
-- int fail;
-- char key[24];
-- char iv[8];
-- char plaintext[128];
-- char result[128];
--};
--
--struct des_tv des_enc_tv_template[] = {
--
-- /* From Applied Cryptography */
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0 },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d }
-- },
--
-- /* Same key, different plaintext block */
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0 },
-- { 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-- { 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }
-- },
--
-- /* Sbox test from NBS */
-- {
-- 8, 0,
--
-- { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
-- { 0 },
-- { 0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42 },
-- { 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B }
-- },
--
-- /* Three blocks */
-- {
-- 24, 0,
--
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
--
-- { 0 },
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-- 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-- 0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
--
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-- 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-- 0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
-- },
--
-- /* Weak key */
-- {
-- 8, 1,
--
-- { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
-- { 0 },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d }
-- },
--
-- /* Two blocks -- for testing encryption across pages */
-- {
-- 16, 0,
--
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
--
-- { 0 },
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-- 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
--
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-- 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b }
-- },
-+#define HMAC_MD5_TEST_VECTORS 7
-
-- /* Two blocks -- for testing decryption across pages */
-- {
-- 16, 0,
--
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
--
-- { 0 },
--
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-- 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-- 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-- },
--
-- /* Four blocks -- for testing encryption with chunking */
-+struct hmac_testvec hmac_md5_tv_template[] =
-+{
- {
-- 24, 0,
--
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
--
-- { 0 },
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-- 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-- 0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef,
-- 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
--
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-- 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-- 0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90,
-- 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
-+ .key = { [0 ... 15] = 0x0b },
-+ .ksize = 16,
-+ .plaintext = "Hi There",
-+ .psize = 8,
-+ .digest = { 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c,
-+ 0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d },
-+ }, {
-+ .key = { 'J', 'e', 'f', 'e' },
-+ .ksize = 4,
-+ .plaintext = "what do ya want for nothing?",
-+ .psize = 28,
-+ .digest = { 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03,
-+ 0xea, 0xa8, 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 },
-+ .np = 2,
-+ .tap = {14, 14}
-+ }, {
-+ .key = { [0 ... 15] = 0xaa },
-+ .ksize = 16,
-+ .plaintext = { [0 ... 49] = 0xdd },
-+ .psize = 50,
-+ .digest = { 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88,
-+ 0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 },
-+ }, {
-+ .key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, },
-+ .ksize = 25,
-+ .plaintext = { [0 ... 49] = 0xcd },
-+ .psize = 50,
-+ .digest = { 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea,
-+ 0x3a, 0x75, 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 },
-+ }, {
-+ .key = { [0 ... 15] = 0x0c },
-+ .ksize = 16,
-+ .plaintext = "Test With Truncation",
-+ .psize = 20,
-+ .digest = { 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00,
-+ 0xf9, 0xba, 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c },
-+ }, {
-+ .key = { [0 ... 79] = 0xaa },
-+ .ksize = 80,
-+ .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
-+ .psize = 54,
-+ .digest = { 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f,
-+ 0x0b, 0x62, 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd },
-+ }, {
-+ .key = { [0 ... 79] = 0xaa },
-+ .ksize = 80,
-+ .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
-+ "Block-Size Data",
-+ .psize = 73,
-+ .digest = { 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee,
-+ 0x1f, 0xb1, 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e },
- },
--
- };
-
--struct des_tv des_dec_tv_template[] = {
--
-- /* From Applied Cryptography */
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0 },
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-- },
--
-- /* Sbox test from NBS */
-- {
-- 8, 0,
-+/*
-+ * HMAC-SHA1 test vectors from RFC2202
-+ */
-+#define HMAC_SHA1_TEST_VECTORS 7
-
-- { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
-- { 0 },
-- { 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B },
-- { 0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42 }
-- },
--
-- /* Two blocks, for chunking test */
-+struct hmac_testvec hmac_sha1_tv_template[] = {
- {
-- 16, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0 },
--
-- { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-- 0x69, 0x0F, 0x5B, 0x0D, 0x9A, 0x26, 0x93, 0x9B },
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-- 0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 }
-+ .key = { [0 ... 19] = 0x0b },
-+ .ksize = 20,
-+ .plaintext = "Hi There",
-+ .psize = 8,
-+ .digest = { 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64,
-+ 0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1,
-+ 0x46, 0xbe },
-+ }, {
-+ .key = { 'J', 'e', 'f', 'e' },
-+ .ksize = 4,
-+ .plaintext = "what do ya want for nothing?",
-+ .psize = 28,
-+ .digest = { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74,
-+ 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 },
-+ .np = 2,
-+ .tap = { 14, 14 }
-+ }, {
-+ .key = { [0 ... 19] = 0xaa },
-+ .ksize = 20,
-+ .plaintext = { [0 ... 49] = 0xdd },
-+ .psize = 50,
-+ .digest = { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3,
-+ 0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 },
-+ }, {
-+ .key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19 },
-+ .ksize = 25,
-+ .plaintext = { [0 ... 49] = 0xcd },
-+ .psize = 50,
-+ .digest = { 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84,
-+ 0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda },
-+ }, {
-+ .key = { [0 ... 19] = 0x0c },
-+ .ksize = 20,
-+ .plaintext = "Test With Truncation",
-+ .psize = 20,
-+ .digest = { 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2,
-+ 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 },
-+ }, {
-+ .key = { [0 ... 79] = 0xaa },
-+ .ksize = 80,
-+ .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
-+ .psize = 54,
-+ .digest = { 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70,
-+ 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 },
-+ }, {
-+ .key = { [0 ... 79] = 0xaa },
-+ .ksize = 80,
-+ .plaintext = "Test Using Larger Than Block-Size Key and Larger Than One "
-+ "Block-Size Data",
-+ .psize = 73,
-+ .digest = { 0xe8, 0xe9, 0x9d, 0x0f, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b,
-+ 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x08, 0xbb, 0xff, 0x1a, 0x91 },
- },
--
- };
-
--struct des_tv des_cbc_enc_tv_template[] = {
-- /* From OpenSSL */
-- {
-- 24, 0,
--
-- {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-- {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
--
-- { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-- 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-- 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-- 0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00 },
--
-- { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
-- 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
-- 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68,
-- 0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 }
-- },
-+/*
-+ * HMAC-SHA256 test vectors from
-+ * draft-ietf-ipsec-ciph-sha-256-01.txt
-+ */
-+#define HMAC_SHA256_TEST_VECTORS 10
-
-- /* FIPS Pub 81 */
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-- { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-- { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
--
-- },
--
-+struct hmac_testvec hmac_sha256_tv_template[] = {
- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-- { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-- { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-- },
--
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-- { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-- { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-- },
--
-- /* Copy of openssl vector for chunk testing */
--
-- /* From OpenSSL */
-- {
-- 24, 0,
--
-- {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-- {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
--
-- { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-- 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-- 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-- 0x66, 0x6F, 0x72, 0x20, 0x00, 0x31, 0x00, 0x00 },
--
-- { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
-- 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
-- 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68,
-- 0x1d, 0x26, 0x93, 0x97, 0xf7, 0xfe, 0x62, 0xb4 }
-+ .key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-+ 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20},
-+ .ksize = 32,
-+ .plaintext = "abc",
-+ .psize = 3,
-+ .digest = { 0xa2, 0x1b, 0x1f, 0x5d, 0x4c, 0xf4, 0xf7, 0x3a,
-+ 0x4d, 0xd9, 0x39, 0x75, 0x0f, 0x7a, 0x06, 0x6a,
-+ 0x7f, 0x98, 0xcc, 0x13, 0x1c, 0xb1, 0x6a, 0x66,
-+ 0x92, 0x75, 0x90, 0x21, 0xcf, 0xab, 0x81, 0x81 },
-+ }, {
-+ .key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-+ 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 },
-+ .ksize = 32,
-+ .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-+ .psize = 56,
-+ .digest = { 0x10, 0x4f, 0xdc, 0x12, 0x57, 0x32, 0x8f, 0x08,
-+ 0x18, 0x4b, 0xa7, 0x31, 0x31, 0xc5, 0x3c, 0xae,
-+ 0xe6, 0x98, 0xe3, 0x61, 0x19, 0x42, 0x11, 0x49,
-+ 0xea, 0x8c, 0x71, 0x24, 0x56, 0x69, 0x7d, 0x30 },
-+ }, {
-+ .key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-+ 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 },
-+ .ksize = 32,
-+ .plaintext = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
-+ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
-+ .psize = 112,
-+ .digest = { 0x47, 0x03, 0x05, 0xfc, 0x7e, 0x40, 0xfe, 0x34,
-+ 0xd3, 0xee, 0xb3, 0xe7, 0x73, 0xd9, 0x5a, 0xab,
-+ 0x73, 0xac, 0xf0, 0xfd, 0x06, 0x04, 0x47, 0xa5,
-+ 0xeb, 0x45, 0x95, 0xbf, 0x33, 0xa9, 0xd1, 0xa3 },
-+ }, {
-+ .key = { [0 ... 31] = 0x0b },
-+ .ksize = 32,
-+ .plaintext = "Hi There",
-+ .psize = 8,
-+ .digest = { 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
-+ 0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5,
-+ 0xba, 0x0a, 0xa3, 0xf3, 0xd9, 0xae, 0x3c, 0x1c,
-+ 0x7a, 0x3b, 0x16, 0x96, 0xa0, 0xb6, 0x8c, 0xf7 },
-+ }, {
-+ .key = "Jefe",
-+ .ksize = 4,
-+ .plaintext = "what do ya want for nothing?",
-+ .psize = 28,
-+ .digest = { 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
-+ 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
-+ 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
-+ 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 },
-+ .np = 2,
-+ .tap = { 14, 14 }
-+ }, {
-+ .key = { [0 ... 31] = 0xaa },
-+ .ksize = 32,
-+ .plaintext = { [0 ... 49] = 0xdd },
-+ .psize = 50,
-+ .digest = { 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
-+ 0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62,
-+ 0xe5, 0x49, 0xfe, 0x6c, 0xe9, 0xed, 0x7f, 0xdc,
-+ 0x43, 0x19, 0x1f, 0xbd, 0xe4, 0x5c, 0x30, 0xb0 },
-+ }, {
-+ .key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
-+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
-+ 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
-+ 0x21, 0x22, 0x23, 0x24, 0x25 },
-+ .ksize = 37,
-+ .plaintext = { [0 ... 49] = 0xcd },
-+ .psize = 50,
-+ .digest = { 0xd4, 0x63, 0x3c, 0x17, 0xf6, 0xfb, 0x8d, 0x74,
-+ 0x4c, 0x66, 0xde, 0xe0, 0xf8, 0xf0, 0x74, 0x55,
-+ 0x6e, 0xc4, 0xaf, 0x55, 0xef, 0x07, 0x99, 0x85,
-+ 0x41, 0x46, 0x8e, 0xb4, 0x9b, 0xd2, 0xe9, 0x17 },
-+ }, {
-+ .key = { [0 ... 31] = 0x0c },
-+ .ksize = 32,
-+ .plaintext = "Test With Truncation",
-+ .psize = 20,
-+ .digest = { 0x75, 0x46, 0xaf, 0x01, 0x84, 0x1f, 0xc0, 0x9b,
-+ 0x1a, 0xb9, 0xc3, 0x74, 0x9a, 0x5f, 0x1c, 0x17,
-+ 0xd4, 0xf5, 0x89, 0x66, 0x8a, 0x58, 0x7b, 0x27,
-+ 0x00, 0xa9, 0xc9, 0x7c, 0x11, 0x93, 0xcf, 0x42 },
-+ }, {
-+ .key = { [0 ... 79] = 0xaa },
-+ .ksize = 80,
-+ .plaintext = "Test Using Larger Than Block-Size Key - Hash Key First",
-+ .psize = 54,
-+ .digest = { 0x69, 0x53, 0x02, 0x5e, 0xd9, 0x6f, 0x0c, 0x09,
-+ 0xf8, 0x0a, 0x96, 0xf7, 0x8e, 0x65, 0x38, 0xdb,
-+ 0xe2, 0xe7, 0xb8, 0x20, 0xe3, 0xdd, 0x97, 0x0e,
-+ 0x7d, 0xdd, 0x39, 0x09, 0x1b, 0x32, 0x35, 0x2f },
-+ }, {
-+ .key = { [0 ... 79] = 0xaa },
-+ .ksize = 80,
-+ .plaintext = "Test Using Larger Than Block-Size Key and Larger Than "
-+ "One Block-Size Data",
-+ .psize = 73,
-+ .digest = { 0x63, 0x55, 0xac, 0x22, 0xe8, 0x90, 0xd0, 0xa3,
-+ 0xc8, 0x48, 0x1a, 0x5c, 0xa4, 0x82, 0x5b, 0xc8,
-+ 0x84, 0xd3, 0xe7, 0xa1, 0xff, 0x98, 0xa2, 0xfc,
-+ 0x2a, 0xc7, 0xd8, 0xe0, 0x64, 0xc3, 0xb2, 0xe6 },
- },
--
--
- };
-
--struct des_tv des_cbc_dec_tv_template[] = {
-+#endif /* CONFIG_CRYPTO_HMAC */
-
-- /* FIPS Pub 81 */
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-- { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-- { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-- },
--
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-- { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-- { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-- },
--
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-- { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-- { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-- },
--
-- /* Copy of above, for chunk testing */
--
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-- { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-- { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-+/*
-+ * DES test vectors.
-+ */
-+#define DES_ENC_TEST_VECTORS 10
-+#define DES_DEC_TEST_VECTORS 4
-+#define DES_CBC_ENC_TEST_VECTORS 5
-+#define DES_CBC_DEC_TEST_VECTORS 4
-+#define DES3_EDE_ENC_TEST_VECTORS 3
-+#define DES3_EDE_DEC_TEST_VECTORS 3
-+
-+struct cipher_testvec des_enc_tv_template[] = {
-+ { /* From Applied Cryptography */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-+ .ilen = 8,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
-+ .rlen = 8,
-+ }, { /* Same key, different plaintext block */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-+ .ilen = 8,
-+ .result = { 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
-+ .rlen = 8,
-+ }, { /* Sbox test from NBS */
-+ .key = { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 },
-+ .klen = 8,
-+ .input = { 0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42 },
-+ .ilen = 8,
-+ .result = { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
-+ .rlen = 8,
-+ }, { /* Three blocks */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-+ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-+ 0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
-+ .ilen = 24,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-+ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-+ 0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
-+ .rlen = 24,
-+ }, { /* Weak key */
-+ .fail = 1,
-+ .wk = 1,
-+ .key = { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-+ .ilen = 8,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
-+ .rlen = 8,
-+ }, { /* Two blocks -- for testing encryption across pages */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-+ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-+ .ilen = 16,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-+ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
-+ .rlen = 16,
-+ .np = 2,
-+ .tap = { 8, 8 }
-+ }, { /* Four blocks -- for testing encryption with chunking */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-+ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-+ 0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef,
-+ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-+ .ilen = 32,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-+ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-+ 0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90,
-+ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
-+ .rlen = 32,
-+ .np = 3,
-+ .tap = { 14, 10, 8 }
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-+ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
-+ 0xca, 0xfe, 0xba, 0xbe, 0xfe, 0xed, 0xbe, 0xef },
-+ .ilen = 24,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-+ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b,
-+ 0xb4, 0x99, 0x26, 0xf7, 0x1f, 0xe1, 0xd4, 0x90 },
-+ .rlen = 24,
-+ .np = 4,
-+ .tap = { 2, 1, 3, 18 }
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-+ 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99 },
-+ .ilen = 16,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-+ 0xf7, 0x9c, 0x89, 0x2a, 0x33, 0x8f, 0x4a, 0x8b },
-+ .rlen = 16,
-+ .np = 5,
-+ .tap = { 2, 2, 2, 2, 8 }
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-+ .ilen = 8,
-+ .result = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
-+ .rlen = 8,
-+ .np = 8,
-+ .tap = { 1, 1, 1, 1, 1, 1, 1, 1 }
-+ },
-+};
-+
-+struct cipher_testvec des_dec_tv_template[] = {
-+ { /* From Applied Cryptography */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d },
-+ .ilen = 8,
-+ .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 },
-+ .rlen = 8,
-+ }, { /* Sbox test from NBS */
-+ .key = { 0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57 },
-+ .klen = 8,
-+ .input = { 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
-+ .ilen = 8,
-+ .result = { 0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42 },
-+ .rlen = 8,
-+ }, { /* Two blocks, for chunking test */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-+ 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
-+ .ilen = 16,
-+ .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-+ 0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 },
-+ .rlen = 16,
-+ .np = 2,
-+ .tap = { 8, 8 }
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .input = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d,
-+ 0x69, 0x0f, 0x5b, 0x0d, 0x9a, 0x26, 0x93, 0x9b },
-+ .ilen = 16,
-+ .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7,
-+ 0xa3, 0x99, 0x7b, 0xca, 0xaf, 0x69, 0xa0, 0xf5 },
-+ .rlen = 16,
-+ .np = 3,
-+ .tap = { 3, 12, 1 }
-+ },
-+};
-+
-+struct cipher_testvec des_cbc_enc_tv_template[] = {
-+ { /* From OpenSSL */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-+ .klen = 8,
-+ .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-+ .input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-+ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-+ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-+ .ilen = 24,
-+ .result = { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
-+ 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
-+ 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 },
-+ .rlen = 24,
-+ }, { /* FIPS Pub 81 */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-+ .input = { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-+ .ilen = 8,
-+ .result = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .iv = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-+ .input = { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-+ .ilen = 8,
-+ .result = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-+ .input = { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-+ .ilen = 8,
-+ .result = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-+ .rlen = 8,
-+ }, { /* Copy of openssl vector for chunk testing */
-+ /* From OpenSSL */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef},
-+ .klen = 8,
-+ .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-+ .input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-+ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-+ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-+ .ilen = 24,
-+ .result = { 0xcc, 0xd1, 0x73, 0xff, 0xab, 0x20, 0x39, 0xf4,
-+ 0xac, 0xd8, 0xae, 0xfd, 0xdf, 0xd8, 0xa1, 0xeb,
-+ 0x46, 0x8e, 0x91, 0x15, 0x78, 0x88, 0xba, 0x68 },
-+ .rlen = 24,
-+ .np = 2,
-+ .tap = { 13, 11 }
-+ },
-+};
-+
-+struct cipher_testvec des_cbc_dec_tv_template[] = {
-+ { /* FIPS Pub 81 */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef },
-+ .input = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-+ .ilen = 8,
-+ .result = { 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .iv = { 0xe5, 0xc7, 0xcd, 0xde, 0x87, 0x2b, 0xf2, 0x7c },
-+ .input = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-+ .ilen = 8,
-+ .result = { 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-+ .input = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-+ .ilen = 8,
-+ .result = { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-+ .rlen = 8,
-+ }, { /* Copy of above, for chunk testing */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .klen = 8,
-+ .iv = { 0x43, 0xe9, 0x34, 0x00, 0x8c, 0x38, 0x9c, 0x0f },
-+ .input = { 0x68, 0x37, 0x88, 0x49, 0x9a, 0x7c, 0x05, 0xf6 },
-+ .ilen = 8,
-+ .result = { 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20 },
-+ .rlen = 8,
-+ .np = 2,
-+ .tap = { 4, 4 }
- },
- };
-
- /*
- * We really need some more test vectors, especially for DES3 CBC.
- */
--struct des_tv des3_ede_enc_tv_template[] = {
--
-- /* These are from openssl */
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
--
-- { 0 },
--
-- { 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61 },
--
-- { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
-- },
--
-- {
-- 8, 0,
--
-- { 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
-- 0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
-- 0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57 },
--
-- { 0 },
--
-- { 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65 },
--
-- { 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30 }
-- },
--
--
-- {
-- 8, 0,
--
-- { 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
-- 0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
-- 0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01 },
--
-- { 0 },
--
-- { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
--
-- { 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b }
-+struct cipher_testvec des3_ede_enc_tv_template[] = {
-+ { /* These are from openssl */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-+ .klen = 24,
-+ .input = { 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x61, 0x74, 0x61 },
-+ .ilen = 8,
-+ .result = { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
-+ 0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
-+ 0x64, 0x05, 0x6a, 0xbd, 0xfe, 0xa9, 0x34, 0x57 },
-+ .klen = 24,
-+ .input = { 0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6c, 0x65 },
-+ .ilen = 8,
-+ .result = { 0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-+ 0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
-+ 0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01 },
-+ .klen = 24,
-+ .input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .ilen = 8,
-+ .result = { 0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b },
-+ .rlen = 8,
- },
- };
-
--struct des_tv des3_ede_dec_tv_template[] = {
--
-- /* These are from openssl */
-- {
-- 8, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
--
-- { 0 },
--
--
-- { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
--
-- { 0x73, 0x6F, 0x6D, 0x65, 0x64, 0x61, 0x74, 0x61 },
-- },
--
-- {
-- 8, 0,
--
-- { 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
-- 0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
-- 0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57 },
--
-- { 0 },
--
-- { 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30 },
--
-- { 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65 },
--
-- },
--
--
-- {
-- 8, 0,
--
-- { 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
-- 0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
-- 0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01 },
--
-- { 0 },
--
-- { 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b },
--
-- { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
-+struct cipher_testvec des3_ede_dec_tv_template[] = {
-+ { /* These are from openssl */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
-+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10},
-+ .klen = 24,
-+ .input = { 0x18, 0xd7, 0x48, 0xe5, 0x63, 0x62, 0x05, 0x72 },
-+ .ilen = 8,
-+ .result = { 0x73, 0x6f, 0x6d, 0x65, 0x64, 0x61, 0x74, 0x61 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x03, 0x52, 0x02, 0x07, 0x67, 0x20, 0x82, 0x17,
-+ 0x86, 0x02, 0x87, 0x66, 0x59, 0x08, 0x21, 0x98,
-+ 0x64, 0x05, 0x6a, 0xbd, 0xfe, 0xa9, 0x34, 0x57 },
-+ .klen = 24,
-+ .input = { 0xc0, 0x7d, 0x2a, 0x0f, 0xa5, 0x66, 0xfa, 0x30 },
-+ .ilen = 8,
-+ .result = { 0x73, 0x71, 0x75, 0x69, 0x67, 0x67, 0x6c, 0x65 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x10, 0x46, 0x10, 0x34, 0x89, 0x98, 0x80, 0x20,
-+ 0x91, 0x07, 0xd0, 0x15, 0x89, 0x19, 0x01, 0x01,
-+ 0x19, 0x07, 0x92, 0x10, 0x98, 0x1a, 0x01, 0x01 },
-+ .klen = 24,
-+ .input = { 0xe1, 0xef, 0x62, 0xc3, 0x32, 0xfe, 0x82, 0x5b },
-+ .ilen = 8,
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .rlen = 8,
- },
- };
-
-@@ -1090,189 +868,151 @@ struct des_tv des3_ede_dec_tv_template[]
- #define BF_CBC_ENC_TEST_VECTORS 1
- #define BF_CBC_DEC_TEST_VECTORS 1
-
--struct bf_tv {
-- unsigned int keylen;
-- unsigned int plen;
-- unsigned int rlen;
-- int fail;
-- char key[56];
-- char iv[8];
-- char plaintext[32];
-- char result[32];
--};
--
--struct bf_tv bf_enc_tv_template[] = {
--
-- /* DES test vectors from OpenSSL */
-- {
-- 8, 8, 8, 0,
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
-- { 0 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78 },
-- },
--
-- {
-- 8, 8, 8, 0,
-- { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E, },
-- { 0 },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
-- { 0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE },
-- },
--
-- {
-- 8, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87, },
-- { 0 },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-- { 0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82 }
-- },
--
-- /* Vary the keylength... */
--
-- {
-- 16, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-- 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F },
-- { 0 },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-- { 0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C }
-- },
--
-- {
-- 21, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-- 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-- 0x00, 0x11, 0x22, 0x33, 0x44 },
-- { 0 },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-- { 0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F }
-- },
--
-- /* Generated with bf488 */
-- {
-- 56, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-- 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F,
-- 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76,
-- 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E,
-- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
-- { 0 },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
-- { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 }
-- }
--
--};
--
--struct bf_tv bf_dec_tv_template[] = {
--
-- /* DES test vectors from OpenSSL */
-- {
-- 8, 8, 8, 0,
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
-- { 0 },
-- { 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
-- },
--
-- {
-- 8, 8, 8, 0,
-- { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E, },
-- { 0 },
-- { 0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }
-- },
--
-- {
-- 8, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87, },
-- { 0 },
-- { 0xE8, 0x7A, 0x24, 0x4E, 0x2C, 0xC8, 0x5E, 0x82 },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-- },
--
-- /* Vary the keylength... */
--
-- {
-- 16, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-- 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F },
-- { 0 },
-- { 0x93, 0x14, 0x28, 0x87, 0xEE, 0x3B, 0xE1, 0x5C },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-- },
--
-- {
-- 21, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-- 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-- 0x00, 0x11, 0x22, 0x33, 0x44 },
-- { 0 },
-- { 0xE6, 0xF5, 0x1E, 0xD7, 0x9B, 0x9D, 0xB2, 0x1F },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-- },
--
-- /* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
-- {
-- 56, 8, 8, 0,
-- { 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
-- 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
-- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F,
-- 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76,
-- 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E,
-- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
-- { 0 },
-- { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
-- }
--};
--
--struct bf_tv bf_cbc_enc_tv_template[] = {
--
-- /* From OpenSSL */
-- {
-- 16, 32, 32, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 },
--
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
--
-- { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-- 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-- 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-- 0x66, 0x6F, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
--
-- { 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
-- 0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
-- 0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
-- 0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC }
-- },
--};
--
--struct bf_tv bf_cbc_dec_tv_template[] = {
--
-- /* From OpenSSL */
-- {
-- 16, 32, 32, 0,
--
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87 },
--
-- { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
--
-- { 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
-- 0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
-- 0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
-- 0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC },
--
-- { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-- 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-- 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
-- 0x66, 0x6F, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 }
-+struct cipher_testvec bf_enc_tv_template[] = {
-+ { /* DES test vectors from OpenSSL */
-+ .key = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, },
-+ .klen = 8,
-+ .input = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .ilen = 8,
-+ .result = { 0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e },
-+ .klen = 8,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .ilen = 8,
-+ .result = { 0xa7, 0x90, 0x79, 0x51, 0x08, 0xea, 0x3c, 0xae },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
-+ .klen = 8,
-+ .input = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .ilen = 8,
-+ .result = { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 },
-+ .rlen = 8,
-+ }, { /* Vary the keylength... */
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
-+ 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
-+ .klen = 16,
-+ .input = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .ilen = 8,
-+ .result = { 0x93, 0x14, 0x28, 0x87, 0xee, 0x3b, 0xe1, 0x5c },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
-+ 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
-+ 0x00, 0x11, 0x22, 0x33, 0x44 },
-+ .klen = 21,
-+ .input = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .ilen = 8,
-+ .result = { 0xe6, 0xf5, 0x1e, 0xd7, 0x9b, 0x9d, 0xb2, 0x1f },
-+ .rlen = 8,
-+ }, { /* Generated with bf488 */
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
-+ 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
-+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
-+ 0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
-+ 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .klen = 56,
-+ .input = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .ilen = 8,
-+ .result = { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
-+ .rlen = 8,
-+ },
-+};
-+
-+struct cipher_testvec bf_dec_tv_template[] = {
-+ { /* DES test vectors from OpenSSL */
-+ .key = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .klen = 8,
-+ .input = { 0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78 },
-+ .ilen = 8,
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e },
-+ .klen = 8,
-+ .input = { 0xa7, 0x90, 0x79, 0x51, 0x08, 0xea, 0x3c, 0xae },
-+ .ilen = 8,
-+ .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
-+ .klen = 8,
-+ .input = { 0xe8, 0x7a, 0x24, 0x4e, 0x2c, 0xc8, 0x5e, 0x82 },
-+ .ilen = 8,
-+ .result = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .rlen = 8,
-+ }, { /* Vary the keylength... */
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
-+ 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f },
-+ .klen = 16,
-+ .input = { 0x93, 0x14, 0x28, 0x87, 0xee, 0x3b, 0xe1, 0x5c },
-+ .ilen = 8,
-+ .result = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
-+ 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
-+ 0x00, 0x11, 0x22, 0x33, 0x44 },
-+ .klen = 21,
-+ .input = { 0xe6, 0xf5, 0x1e, 0xd7, 0x9b, 0x9d, 0xb2, 0x1f },
-+ .ilen = 8,
-+ .result = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .rlen = 8,
-+ }, { /* Generated with bf488, using OpenSSL, Libgcrypt and Nettle */
-+ .key = { 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
-+ 0x78, 0x69, 0x5a, 0x4b, 0x3c, 0x2d, 0x1e, 0x0f,
-+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f,
-+ 0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76,
-+ 0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .klen = 56,
-+ .input = { 0xc0, 0x45, 0x04, 0x01, 0x2e, 0x4e, 0x1f, 0x53 },
-+ .ilen = 8,
-+ .result = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .rlen = 8,
-+ },
-+};
-+
-+struct cipher_testvec bf_cbc_enc_tv_template[] = {
-+ { /* From OpenSSL */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
-+ .klen = 16,
-+ .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .input = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-+ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-+ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
-+ 0x66, 0x6f, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
-+ .ilen = 32,
-+ .result = { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6,
-+ 0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93,
-+ 0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9,
-+ 0x59, 0xf1, 0x65, 0x2b, 0xd5, 0xff, 0x92, 0xcc },
-+ .rlen = 32,
-+ },
-+};
-+
-+struct cipher_testvec bf_cbc_dec_tv_template[] = {
-+ { /* From OpenSSL */
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87 },
-+ .klen = 16,
-+ .iv = { 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },
-+ .input = { 0x6b, 0x77, 0xb4, 0xd6, 0x30, 0x06, 0xde, 0xe6,
-+ 0x05, 0xb1, 0x56, 0xe2, 0x74, 0x03, 0x97, 0x93,
-+ 0x58, 0xde, 0xb9, 0xe7, 0x15, 0x46, 0x16, 0xd9,
-+ 0x59, 0xf1, 0x65, 0x2b, 0xd5, 0xff, 0x92, 0xcc },
-+ .ilen = 32,
-+ .result = { 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
-+ 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
-+ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
-+ 0x66, 0x6f, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00 },
-+ .rlen = 32,
- },
- };
-
-@@ -1284,212 +1024,161 @@ struct bf_tv bf_cbc_dec_tv_template[] =
- #define TF_CBC_ENC_TEST_VECTORS 4
- #define TF_CBC_DEC_TEST_VECTORS 4
-
--struct tf_tv {
-- unsigned int keylen;
-- unsigned int plen;
-- unsigned int rlen;
-- int fail;
-- char key[32];
-- char iv[16];
-- char plaintext[48];
-- char result[48];
--};
--
--struct tf_tv tf_enc_tv_template[] = {
-- {
-- 16, 16, 16, 0,
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
-- 0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A }
-- },
-- {
-- 24, 16, 16, 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-- { 0 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0xCF, 0xD1, 0xD2, 0xE5, 0xA9, 0xBE, 0x9C, 0xDF,
-- 0x50, 0x1F, 0x13, 0xB8, 0x92, 0xBD, 0x22, 0x48 }
-- },
-- {
-- 32, 16, 16, 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF },
-- { 0 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x37, 0x52, 0x7B, 0xE0, 0x05, 0x23, 0x34, 0xB8,
-- 0x9F, 0x0C, 0xFC, 0xCA, 0xE8, 0x7C, 0xFA, 0x20 }
-- },
--};
--
--struct tf_tv tf_dec_tv_template[] = {
-- {
-- 16, 16, 16, 0,
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0 },
-- { 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
-- 0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- },
-- {
-- 24, 16, 16, 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-- { 0 },
-- { 0xCF, 0xD1, 0xD2, 0xE5, 0xA9, 0xBE, 0x9C, 0xDF,
-- 0x50, 0x1F, 0x13, 0xB8, 0x92, 0xBD, 0x22, 0x48 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- },
-- {
-- 32, 16, 16, 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
-- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
-- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF },
-- { 0 },
-- { 0x37, 0x52, 0x7B, 0xE0, 0x05, 0x23, 0x34, 0xB8,
-- 0x9F, 0x0C, 0xFC, 0xCA, 0xE8, 0x7C, 0xFA, 0x20 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- },
--};
--
--struct tf_tv tf_cbc_enc_tv_template[] = {
-- /* Generated with Nettle */
-- {
-- 16, 16, 16, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-- 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-- },
--
-- {
-- 16, 16, 16, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-- 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-- 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-- },
--
-- {
-- 16, 16, 16, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-- 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-- 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-- },
--
-- {
-- 16, 48, 48, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-- 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-- 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-- 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-- 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-- 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-- },
--};
--
--struct tf_tv tf_cbc_dec_tv_template[] = {
-- /* Reverse of the first four above */
-- {
-- 16, 16, 16, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-- 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- },
--
-- {
-- 16, 16, 16, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-- 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-- { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-- 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- },
--
-- {
-- 16, 16, 16, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-- 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-- { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-- 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- },
--
-+struct cipher_testvec tf_enc_tv_template[] = {
- {
-- 16, 48, 48, 0,
--
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-- 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-- 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-- 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-- 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-- 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
-+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-+ .klen = 24,
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0xcf, 0xd1, 0xd2, 0xe5, 0xa9, 0xbe, 0x9c, 0xdf,
-+ 0x50, 0x1f, 0x13, 0xb8, 0x92, 0xbd, 0x22, 0x48 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
-+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .klen = 32,
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0x37, 0x52, 0x7b, 0xe0, 0x05, 0x23, 0x34, 0xb8,
-+ 0x9f, 0x0c, 0xfc, 0xca, 0xe8, 0x7c, 0xfa, 0x20 },
-+ .rlen = 16,
-+ },
-+};
-+
-+struct cipher_testvec tf_dec_tv_template[] = {
-+ {
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .input = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
-+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
-+ .klen = 24,
-+ .input = { 0xcf, 0xd1, 0xd2, 0xe5, 0xa9, 0xbe, 0x9c, 0xdf,
-+ 0x50, 0x1f, 0x13, 0xb8, 0x92, 0xbd, 0x22, 0x48 },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
-+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
-+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .klen = 32,
-+ .input = { 0x37, 0x52, 0x7b, 0xe0, 0x05, 0x23, 0x34, 0xb8,
-+ 0x9f, 0x0c, 0xfc, 0xca, 0xe8, 0x7c, 0xfa, 0x20 },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ },
-+};
-+
-+struct cipher_testvec tf_cbc_enc_tv_template[] = {
-+ { /* Generated with Nettle */
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { [0 ... 15] = 0x00 },
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-+ .rlen = 16,
-+ }, {
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-+ 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-+ .rlen = 16,
-+ }, {
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-+ 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-+ 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-+ .rlen = 16,
-+ }, {
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { [0 ... 15] = 0x00 },
-+ .input = { [0 ... 47] = 0x00 },
-+ .ilen = 48,
-+ .result = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-+ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-+ 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-+ 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-+ 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-+ .rlen = 48,
-+ },
-+};
-+
-+struct cipher_testvec tf_cbc_dec_tv_template[] = {
-+ { /* Reverse of the first four above */
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { [0 ... 15] = 0x00 },
-+ .input = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ }, {
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a },
-+ .input = { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-+ 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ }, {
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-+ 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19 },
-+ .input = { 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-+ 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ }, {
-+ .key = { [0 ... 15] = 0x00 },
-+ .klen = 16,
-+ .iv = { [0 ... 15] = 0x00 },
-+ .input = { 0x9f, 0x58, 0x9f, 0x5c, 0xf6, 0x12, 0x2c, 0x32,
-+ 0xb6, 0xbf, 0xec, 0x2f, 0x2a, 0xe8, 0xc3, 0x5a,
-+ 0xd4, 0x91, 0xdb, 0x16, 0xe7, 0xb1, 0xc3, 0x9e,
-+ 0x86, 0xcb, 0x08, 0x6b, 0x78, 0x9f, 0x54, 0x19,
-+ 0x05, 0xef, 0x8c, 0x61, 0xa8, 0x11, 0x58, 0x26,
-+ 0x34, 0xba, 0x5c, 0xb7, 0x10, 0x6a, 0xa6, 0x41 },
-+ .ilen = 48,
-+ .result = { [0 ... 47] = 0x00 },
-+ .rlen = 48,
- },
- };
-
-@@ -1500,179 +1189,162 @@ struct tf_tv tf_cbc_dec_tv_template[] =
- #define SERPENT_ENC_TEST_VECTORS 4
- #define SERPENT_DEC_TEST_VECTORS 4
-
--struct serpent_tv {
-- unsigned int keylen, fail;
-- u8 key[32], plaintext[16], result[16];
--};
--
--struct serpent_tv serpent_enc_tv_template[] =
-+struct cipher_testvec serpent_enc_tv_template[] =
- {
- {
-- 0, 0,
-- { 0 },
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-- 0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 }
-+ .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .ilen = 16,
-+ .result = { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-+ 0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .klen = 16,
-+ .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .ilen = 16,
-+ .result = { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-+ 0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-+ .klen = 32,
-+ .input = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .ilen = 16,
-+ .result = { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-+ 0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
-+ .rlen = 16,
-+ }, {
-+ .key = { [15] = 0x80 },
-+ .klen = 16,
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-+ 0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
-+ .rlen = 16,
- },
-- {
-- 16, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-- 0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d }
-- },
-- {
-- 32, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-- 0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c }
-- },
-- {
-- 16, 0,
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-- 0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49}
-- }
- };
-
--struct serpent_tv serpent_dec_tv_template[] =
-+struct cipher_testvec serpent_dec_tv_template[] =
- {
- {
-- 0, 0,
-- { 0 },
-- { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-- 0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
--
-- },
-- {
-- 16, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-- 0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- },
-- {
-- 32, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
--
-- { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-- 0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .input = { 0x12, 0x07, 0xfc, 0xce, 0x9b, 0xd0, 0xd6, 0x47,
-+ 0x6a, 0xe9, 0x8f, 0xbe, 0xd1, 0x43, 0xa0, 0xe2 },
-+ .ilen = 16,
-+ .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .klen = 16,
-+ .input = { 0x4c, 0x7d, 0x8a, 0x32, 0x80, 0x72, 0xa2, 0x2c,
-+ 0x82, 0x3e, 0x4a, 0x1f, 0x3a, 0xcd, 0xa1, 0x6d },
-+ .ilen = 16,
-+ .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-+ .klen = 32,
-+ .input = { 0xde, 0x26, 0x9f, 0xf8, 0x33, 0xe4, 0x32, 0xb8,
-+ 0x5b, 0x2e, 0x88, 0xd2, 0x70, 0x1c, 0xe7, 0x5c },
-+ .ilen = 16,
-+ .result = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .rlen = 16,
-+ }, {
-+ .key = { [15] = 0x80 },
-+ .klen = 16,
-+ .input = { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-+ 0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
- },
-- {
-- 16, 0,
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-- { 0xdd, 0xd2, 0x6b, 0x98, 0xa5, 0xff, 0xd8, 0x2c,
-- 0x05, 0x34, 0x5a, 0x9d, 0xad, 0xbf, 0xaf, 0x49},
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- }
- };
-
- /* Cast6 test vectors from RFC 2612 */
- #define CAST6_ENC_TEST_VECTORS 3
- #define CAST6_DEC_TEST_VECTORS 3
-
--struct cast6_tv {
-- unsigned keylen;
-- unsigned fail;
-- u8 key[32];
-- u8 plaintext[16];
-- u8 result[16];
--};
--
--struct cast6_tv cast6_enc_tv_template[] =
-+struct cipher_testvec cast6_enc_tv_template[] =
- {
- {
-- 16,
-- 0,
-- { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-- 0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20,
-- 0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
-+ .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-+ 0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-+ .klen = 16,
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20,
-+ 0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-+ 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-+ 0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-+ .klen = 24,
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb,
-+ 0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-+ 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-+ 0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-+ 0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },
-+ .klen = 32,
-+ .input = { [0 ... 15] = 0x00 },
-+ .ilen = 16,
-+ .result = { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9,
-+ 0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-+ .rlen = 16,
- },
-- {
-- 24,
-- 0,
-- { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-- 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-- 0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb,
-- 0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-- },
-- {
-- 32,
-- 0,
-- { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-- 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-- 0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-- 0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9,
-- 0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-- }
- };
-
--struct cast6_tv cast6_dec_tv_template[] =
-+struct cipher_testvec cast6_dec_tv_template[] =
- {
- {
-- 16,
-- 0,
-- { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-- 0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-- { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20,
-- 0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- },
-- {
-- 24,
-- 0,
-- { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-- 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-- 0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-- { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb,
-- 0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-+ 0x0a, 0xf7, 0x56, 0x47, 0xf2, 0x9f, 0x61, 0x5d },
-+ .klen = 16,
-+ .input = { 0xc8, 0x42, 0xa0, 0x89, 0x72, 0xb4, 0x3d, 0x20,
-+ 0x83, 0x6c, 0x91, 0xd1, 0xb7, 0x53, 0x0f, 0x6b },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-+ 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-+ 0xba, 0xc7, 0x7a, 0x77, 0x17, 0x94, 0x28, 0x63 },
-+ .klen = 24,
-+ .input = { 0x1b, 0x38, 0x6c, 0x02, 0x10, 0xdc, 0xad, 0xcb,
-+ 0xdd, 0x0e, 0x41, 0xaa, 0x08, 0xa7, 0xa7, 0xe8 },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-+ 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-+ 0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-+ 0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },
-+ .klen = 32,
-+ .input = { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9,
-+ 0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-+ .ilen = 16,
-+ .result = { [0 ... 15] = 0x00 },
-+ .rlen = 16,
- },
-- {
-- 32,
-- 0,
-- { 0x23, 0x42, 0xbb, 0x9e, 0xfa, 0x38, 0x54, 0x2c,
-- 0xbe, 0xd0, 0xac, 0x83, 0x94, 0x0a, 0xc2, 0x98,
-- 0x8d, 0x7c, 0x47, 0xce, 0x26, 0x49, 0x08, 0x46,
-- 0x1c, 0xc1, 0xb5, 0x13, 0x7a, 0xe6, 0xb6, 0x04 },
-- { 0x4f, 0x6a, 0x20, 0x38, 0x28, 0x68, 0x97, 0xb9,
-- 0xc9, 0x87, 0x01, 0x36, 0x55, 0x33, 0x17, 0xfa },
-- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-- }
- };
-
-
-@@ -1682,90 +1354,77 @@ struct cast6_tv cast6_dec_tv_template[]
- #define AES_ENC_TEST_VECTORS 3
- #define AES_DEC_TEST_VECTORS 3
-
--struct aes_tv {
-- unsigned int keylen;
-- unsigned int plen;
-- unsigned int rlen;
-- int fail;
-- char key[32];
-- char iv[8];
-- char plaintext[16];
-- char result[16];
--};
--
--struct aes_tv aes_enc_tv_template[] = {
-- /* From FIPS-197 */
-- {
-- 16, 16, 16, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- { 0 },
-- { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-- { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-- 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-- },
-- {
-- 24, 16, 16, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-- { 0 },
-- { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-- { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-- 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-- },
-- {
-- 32, 16, 16, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-- { 0 },
-- { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-- { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-- 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-- },
--};
--
--struct aes_tv aes_dec_tv_template[] = {
-- /* From FIPS-197 */
-- {
-- 16, 16, 16, 0,
--
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-- { 0 },
-- { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-- 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-- { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-- },
--
-- {
-- 24, 16, 16, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-- { 0 },
-- { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-- 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-- { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-- },
-- {
-- 32, 16, 16, 0,
-- { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-- { 0 },
-- { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-- 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-- { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-- 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+struct cipher_testvec aes_enc_tv_template[] = {
-+ { /* From FIPS-197 */
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .klen = 16,
-+ .input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .ilen = 16,
-+ .result = { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-+ 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-+ .klen = 24,
-+ .input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .ilen = 16,
-+ .result = { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-+ 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-+ .klen = 32,
-+ .input = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .ilen = 16,
-+ .result = { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-+ 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-+ .rlen = 16,
-+ },
-+};
-+
-+struct cipher_testvec aes_dec_tv_template[] = {
-+ { /* From FIPS-197 */
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
-+ .klen = 16,
-+ .input = { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
-+ 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a },
-+ .ilen = 16,
-+ .result = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
-+ .klen = 24,
-+ .input = { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
-+ 0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 },
-+ .ilen = 16,
-+ .result = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .rlen = 16,
-+ }, {
-+ .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
-+ .klen = 32,
-+ .input = { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
-+ 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 },
-+ .ilen = 16,
-+ .result = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
-+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
-+ .rlen = 16,
- },
- };
-
-@@ -1773,68 +1432,60 @@ struct aes_tv aes_dec_tv_template[] = {
- #define CAST5_ENC_TEST_VECTORS 3
- #define CAST5_DEC_TEST_VECTORS 3
-
--struct cast5_tv {
-- unsigned keylen;
-- unsigned fail;
-- u8 key[16];
-- u8 plaintext[8];
-- u8 ciphertext[8];
--};
--
--struct cast5_tv cast5_enc_tv_template[] =
-+struct cipher_testvec cast5_enc_tv_template[] =
- {
- {
-- 16,
-- 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-- 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
--
-- },
-- {
-- 10,
-- 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-- 0x23, 0x45 },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-+ 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
-+ .klen = 16,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .ilen = 8,
-+ .result = { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-+ 0x23, 0x45 },
-+ .klen = 10,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .ilen = 8,
-+ .result = { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x12 },
-+ .klen = 5,
-+ .input = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .ilen = 8,
-+ .result = { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-+ .rlen = 8,
- },
-- {
-- 5,
-- 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x12 },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-- }
- };
-
--struct cast5_tv cast5_dec_tv_template[] =
-+struct cipher_testvec cast5_dec_tv_template[] =
- {
- {
-- 16,
-- 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-- 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A },
-- { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
--
-- },
-- {
-- 10,
-- 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-- 0x23, 0x45 },
-- { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-+ 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9a },
-+ .klen = 16,
-+ .input = { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 },
-+ .ilen = 8,
-+ .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
-+ 0x23, 0x45 },
-+ .klen = 10,
-+ .input = { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b },
-+ .ilen = 8,
-+ .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .rlen = 8,
-+ }, {
-+ .key = { 0x01, 0x23, 0x45, 0x67, 0x12 },
-+ .klen = 5,
-+ .input = { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-+ .ilen = 8,
-+ .result = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-+ .rlen = 8,
- },
-- {
-- 5,
-- 0,
-- { 0x01, 0x23, 0x45, 0x67, 0x12 },
-- { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e },
-- { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
-- }
- };
-
- /*
-@@ -1857,83 +1508,73 @@ struct comp_testvec {
-
- struct comp_testvec deflate_comp_tv_template[] = {
- {
-- 70, 38,
--
-- "Join us now and share the software "
-- "Join us now and share the software ",
--
-- { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-- 0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-- 0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-- 0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-- 0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00
-- },
-- },
--
-- {
-- 191, 122,
--
-- "This document describes a compression method based on the DEFLATE"
-- "compression algorithm. This document defines the application of "
-- "the DEFLATE algorithm to the IP Payload Compression Protocol.",
--
-- { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-- 0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-- 0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-- 0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-- 0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-- 0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-- 0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-- 0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-- 0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-- 0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-- 0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-- 0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-- 0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-- 0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-- 0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-- 0xfa, 0x02 },
-+ .inlen = 70,
-+ .outlen = 38,
-+ .input = "Join us now and share the software "
-+ "Join us now and share the software ",
-+ .output = { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-+ 0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-+ 0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-+ 0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-+ 0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 },
-+ }, {
-+ .inlen = 191,
-+ .outlen = 122,
-+ .input = "This document describes a compression method based on the DEFLATE"
-+ "compression algorithm. This document defines the application of "
-+ "the DEFLATE algorithm to the IP Payload Compression Protocol.",
-+ .output = { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-+ 0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-+ 0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-+ 0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-+ 0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-+ 0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-+ 0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-+ 0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-+ 0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-+ 0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-+ 0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-+ 0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-+ 0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-+ 0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-+ 0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-+ 0xfa, 0x02 },
- },
- };
-
- struct comp_testvec deflate_decomp_tv_template[] = {
- {
-- 122, 191,
--
-- { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-- 0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-- 0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-- 0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-- 0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-- 0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-- 0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-- 0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-- 0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-- 0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-- 0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-- 0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-- 0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-- 0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-- 0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-- 0xfa, 0x02 },
--
-- "This document describes a compression method based on the DEFLATE"
-- "compression algorithm. This document defines the application of "
-- "the DEFLATE algorithm to the IP Payload Compression Protocol.",
-- },
--
-- {
-- 38, 70,
--
-- { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-- 0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-- 0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-- 0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-- 0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00
-- },
--
-- "Join us now and share the software "
-- "Join us now and share the software ",
-+ .inlen = 122,
-+ .outlen = 191,
-+ .input = { 0x5d, 0x8d, 0x31, 0x0e, 0xc2, 0x30, 0x10, 0x04,
-+ 0xbf, 0xb2, 0x2f, 0xc8, 0x1f, 0x10, 0x04, 0x09,
-+ 0x89, 0xc2, 0x85, 0x3f, 0x70, 0xb1, 0x2f, 0xf8,
-+ 0x24, 0xdb, 0x67, 0xd9, 0x47, 0xc1, 0xef, 0x49,
-+ 0x68, 0x12, 0x51, 0xae, 0x76, 0x67, 0xd6, 0x27,
-+ 0x19, 0x88, 0x1a, 0xde, 0x85, 0xab, 0x21, 0xf2,
-+ 0x08, 0x5d, 0x16, 0x1e, 0x20, 0x04, 0x2d, 0xad,
-+ 0xf3, 0x18, 0xa2, 0x15, 0x85, 0x2d, 0x69, 0xc4,
-+ 0x42, 0x83, 0x23, 0xb6, 0x6c, 0x89, 0x71, 0x9b,
-+ 0xef, 0xcf, 0x8b, 0x9f, 0xcf, 0x33, 0xca, 0x2f,
-+ 0xed, 0x62, 0xa9, 0x4c, 0x80, 0xff, 0x13, 0xaf,
-+ 0x52, 0x37, 0xed, 0x0e, 0x52, 0x6b, 0x59, 0x02,
-+ 0xd9, 0x4e, 0xe8, 0x7a, 0x76, 0x1d, 0x02, 0x98,
-+ 0xfe, 0x8a, 0x87, 0x83, 0xa3, 0x4f, 0x56, 0x8a,
-+ 0xb8, 0x9e, 0x8e, 0x5c, 0x57, 0xd3, 0xa0, 0x79,
-+ 0xfa, 0x02 },
-+ .output = "This document describes a compression method based on the DEFLATE"
-+ "compression algorithm. This document defines the application of "
-+ "the DEFLATE algorithm to the IP Payload Compression Protocol.",
-+ }, {
-+ .inlen = 38,
-+ .outlen = 70,
-+ .input = { 0xf3, 0xca, 0xcf, 0xcc, 0x53, 0x28, 0x2d, 0x56,
-+ 0xc8, 0xcb, 0x2f, 0x57, 0x48, 0xcc, 0x4b, 0x51,
-+ 0x28, 0xce, 0x48, 0x2c, 0x4a, 0x55, 0x28, 0xc9,
-+ 0x48, 0x55, 0x28, 0xce, 0x4f, 0x2b, 0x29, 0x07,
-+ 0x71, 0xbc, 0x08, 0x2b, 0x01, 0x00 },
-+ .output = "Join us now and share the software "
-+ "Join us now and share the software ",
- },
- };
-
---- linux-2.6.0/Documentation/block/biodoc.txt 2003-09-27 18:57:43.000000000 -0700
-+++ 25/Documentation/block/biodoc.txt 2003-12-28 23:23:06.000000000 -0800
-@@ -323,7 +323,7 @@ involved. In the latter case, the driver
- request->buffer, request->sector and request->nr_sectors or
- request->current_nr_sectors fields itself rather than using the block layer
- end_request or end_that_request_first completion interfaces.
--(See 2.3 or Documentation/bio/request.txt for a brief explanation of
-+(See 2.3 or Documentation/block/request.txt for a brief explanation of
- the request structure fields)
-
- [TBD: end_that_request_last should be usable even in this case;
-@@ -517,7 +517,7 @@ request structure.
- Only some relevant fields (mainly those which changed or may be referred
- to in some of the discussion here) are listed below, not necessarily in
- the order in which they occur in the structure (see include/linux/blkdev.h)
--Refer to Documentation/bio/request.txt for details about all the request
-+Refer to Documentation/block/request.txt for details about all the request
- structure fields and a quick reference about the layers which are
- supposed to use or modify those fields.
-
---- linux-2.6.0/Documentation/Changes 2003-10-08 15:07:08.000000000 -0700
-+++ 25/Documentation/Changes 2003-12-28 23:22:28.000000000 -0800
-@@ -56,7 +56,7 @@ o module-init-tools 0.9.10
- o e2fsprogs 1.29 # tune2fs
- o jfsutils 1.1.3 # fsck.jfs -V
- o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
--o xfsprogs 2.1.0 # xfs_db -V
-+o xfsprogs 2.6.0 # xfs_db -V
- o pcmcia-cs 3.1.21 # cardmgr -V
- o quota-tools 3.09 # quota -V
- o PPP 2.4.0 # pppd --version
-@@ -183,9 +183,8 @@ Xfsprogs
- The latest version of xfsprogs contains mkfs.xfs, xfs_db, and the
- xfs_repair utilities, among others, for the XFS filesystem. It is
- architecture independent and any version from 2.0.0 onward should
--work correctly with this version of the XFS kernel code. For the new
--(v2) log format that has better support for stripe-size aligning on
--LVM and MD devices at least xfsprogs 2.1.0 is needed.
-+work correctly with this version of the XFS kernel code (2.6.0 or
-+later is recommended, due to some significant improvements).
-
-
- Pcmcia-cs
-@@ -359,7 +358,7 @@ o <http://www.namesys.com/pub/reiserfsp
-
- Xfsprogs
- --------
--o <ftp://oss.sgi.com/projects/xfs/download/cmd_tars/xfsprogs-2.1.0.src.tar.gz>
-+o <ftp://oss.sgi.com/projects/xfs/download/>
-
- Pcmcia-cs
- ---------
---- linux-2.6.0/Documentation/DocBook/kernel-locking.tmpl 2003-09-27 18:57:43.000000000 -0700
-+++ 25/Documentation/DocBook/kernel-locking.tmpl 2003-12-28 23:22:34.000000000 -0800
-@@ -6,8 +6,7 @@
-
- <authorgroup>
- <author>
-- <firstname>Paul</firstname>
-- <othername>Rusty</othername>
-+ <firstname>Rusty</firstname>
- <surname>Russell</surname>
- <affiliation>
- <address>
-@@ -18,8 +17,8 @@
- </authorgroup>
-
- <copyright>
-- <year>2000</year>
-- <holder>Paul Russell</holder>
-+ <year>2003</year>
-+ <holder>Rusty Russell</holder>
- </copyright>
-
- <legalnotice>
-@@ -58,16 +57,17 @@
- <para>
- Welcome, to Rusty's Remarkably Unreliable Guide to Kernel
- Locking issues. This document describes the locking systems in
-- the Linux Kernel as we approach 2.4.
-+ the Linux Kernel in 2.6.
- </para>
- <para>
-- It looks like <firstterm linkend="gloss-smp"><acronym>SMP</acronym>
-- </firstterm> is here to stay; so everyone hacking on the kernel
-- these days needs to know the fundamentals of concurrency and locking
-- for SMP.
-+ With the wide availability of HyperThreading, and <firstterm
-+ linkend="gloss-preemption">preemption </firstterm> in the Linux
-+ Kernel, everyone hacking on the kernel needs to know the
-+ fundamentals of concurrency and locking for
-+ <firstterm linkend="gloss-smp"><acronym>SMP</acronym></firstterm>.
- </para>
-
-- <sect1 id="races">
-+ <chapter id="races">
- <title>The Problem With Concurrency</title>
- <para>
- (Skip this if you know what a Race Condition is).
-@@ -169,15 +169,23 @@
- </tgroup>
- </table>
-
-+ <sect1 id="race-condition">
-+ <title>Race Conditions and Critical Regions</title>
- <para>
-- This overlap, where what actually happens depends on the
-- relative timing of multiple tasks, is called a race condition.
-+ This overlap, where the result depends on the
-+ relative timing of multiple tasks, is called a <firstterm>race condition</firstterm>.
- The piece of code containing the concurrency issue is called a
-- critical region. And especially since Linux starting running
-+ <firstterm>critical region</firstterm>. And especially since Linux starting running
- on SMP machines, they became one of the major issues in kernel
- design and implementation.
- </para>
- <para>
-+ Preemption can have the same effect, even if there is only one
-+ CPU: by preempting one task during the critical region, we have
-+ exactly the same race condition. In this case the thread which
-+ preempts might run the critical region itself.
-+ </para>
-+ <para>
- The solution is to recognize when these simultaneous accesses
- occur, and use locks to make sure that only one instance can
- enter the critical region at any time. There are many
-@@ -185,10 +193,28 @@
- And then there are the unfriendly primitives, but I'll pretend
- they don't exist.
- </para>
-- </sect1>
- </chapter>
-
- <chapter id="locks">
-+ <title>Locking in the Linux Kernel</title>
-+
-+ <para>
-+ If I could give you one piece of advice: never sleep with anyone
-+ crazier than yourself. But if I had to give you advice on
-+ locking: <emphasis>keep it simple</emphasis>.
-+ </para>
-+
-+ <para>
-+ Be reluctant to introduce new locks.
-+ </para>
-+
-+ <para>
-+ Strangely enough, this last one is the exact reverse of my advice when
-+ you <emphasis>have</emphasis> slept with someone crazier than yourself.
-+ And you should think about getting a big dog.
-+ </para>
-+
-+ <sect1 id="lock-intro">
- <title>Two Main Types of Kernel Locks: Spinlocks and Semaphores</title>
-
- <para>
-@@ -213,23 +239,32 @@
- </para>
- <para>
- Neither type of lock is recursive: see
-- <xref linkend="techniques-deadlocks">.
-+ <xref linkend="deadlock">.
- </para>
-+ </sect1>
-
- <sect1 id="uniprocessor">
- <title>Locks and Uniprocessor Kernels</title>
-
- <para>
-- For kernels compiled without <symbol>CONFIG_SMP</symbol>, spinlocks
-- do not exist at all. This is an excellent design decision: when
-- no-one else can run at the same time, there is no reason to
-- have a lock at all.
-+ For kernels compiled without <symbol>CONFIG_SMP</symbol>, and
-+ without <symbol>CONFIG_PREEMPT</symbol> spinlocks do not exist at
-+ all. This is an excellent design decision: when no-one else can
-+ run at the same time, there is no reason to have a lock.
-+ </para>
-+
-+ <para>
-+ If the kernel is compiled without <symbol>CONFIG_SMP</symbol>,
-+ but <symbol>CONFIG_PREEMPT</symbol> is set, then spinlocks
-+ simply disable preemption, which is sufficient to prevent any
-+ races. For most purposes, we can think of preemption as
-+ equivalent to SMP, and not worry about it separately.
- </para>
-
- <para>
- You should always test your locking code with <symbol>CONFIG_SMP</symbol>
-- enabled, even if you don't have an SMP test box, because it
-- will still catch some (simple) kinds of deadlock.
-+ and <symbol>CONFIG_PREEMPT</symbol> enabled, even if you don't have an SMP test box, because it
-+ will still catch some kinds of locking bugs.
- </para>
-
- <para>
-@@ -239,25 +274,6 @@
- </para>
- </sect1>
-
-- <sect1 id="rwlocks">
-- <title>Read/Write Lock Variants</title>
--
-- <para>
-- Both spinlocks and semaphores have read/write variants:
-- <type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
-- These divide users into two classes: the readers and the writers. If
-- you are only reading the data, you can get a read lock, but to write to
-- the data you need the write lock. Many people can hold a read lock,
-- but a writer must be sole holder.
-- </para>
--
-- <para>
-- This means much smoother locking if your code divides up
-- neatly along reader/writer lines. All the discussions below
-- also apply to read/write variants.
-- </para>
-- </sect1>
--
- <sect1 id="usercontextlocking">
- <title>Locking Only In User Context</title>
-
-@@ -289,17 +305,26 @@
- </sect1>
-
- <sect1 id="lock-user-bh">
-- <title>Locking Between User Context and BHs</title>
-+ <title>Locking Between User Context and Softirqs</title>
-
- <para>
-- If a <firstterm linkend="gloss-bh">bottom half</firstterm> shares
-+ If a <firstterm linkend="gloss-softirq">softirq</firstterm> shares
- data with user context, you have two problems. Firstly, the current
-- user context can be interrupted by a bottom half, and secondly, the
-+ user context can be interrupted by a softirq, and secondly, the
- critical region could be entered from another CPU. This is where
- <function>spin_lock_bh()</function>
- (<filename class=headerfile>include/linux/spinlock.h</filename>) is
-- used. It disables bottom halves on that CPU, then grabs the lock.
-- <function>spin_unlock_bh()</function> does the reverse.
-+ used. It disables softirqs on that CPU, then grabs the lock.
-+ <function>spin_unlock_bh()</function> does the reverse. (The
-+ '_bh' suffix is a historical reference to "Bottom Halves", the
-+ old name for software interrupts. It should really be
-+ called spin_lock_softirq()' in a perfect world).
-+ </para>
-+
-+ <para>
-+ Note that you can also use <function>spin_lock_irq()</function>
-+ or <function>spin_lock_irqsave()</function> here, which stop
-+ hardware interrupts as well: see <xref linkend="hardirq-context">.
- </para>
-
- <para>
-@@ -307,70 +332,41 @@
- </acronym></firstterm> as well: the spin lock vanishes, and this macro
- simply becomes <function>local_bh_disable()</function>
- (<filename class=headerfile>include/linux/interrupt.h</filename>), which
-- protects you from the bottom half being run.
-+ protects you from the softirq being run.
- </para>
- </sect1>
-
- <sect1 id="lock-user-tasklet">
-- <title>Locking Between User Context and Tasklets/Soft IRQs</title>
-+ <title>Locking Between User Context and Tasklets</title>
-
- <para>
-- This is exactly the same as above, because
-- <function>local_bh_disable()</function> actually disables all
-- softirqs and <firstterm linkend="gloss-tasklet">tasklets</firstterm>
-- on that CPU as well. It should really be
-- called `local_softirq_disable()', but the name has been preserved
-- for historical reasons. Similarly,
-- <function>spin_lock_bh()</function> would now be called
-- spin_lock_softirq() in a perfect world.
-+ This is exactly the same as above, because <firstterm
-+ linkend="gloss-tasklet">tasklets</firstterm> are actually run
-+ from a softirq.
- </para>
- </sect1>
-
-- <sect1 id="lock-bh">
-- <title>Locking Between Bottom Halves</title>
-+ <sect1 id="lock-user-timers">
-+ <title>Locking Between User Context and Timers</title>
-
- <para>
-- Sometimes a bottom half might want to share data with
-- another bottom half (especially remember that timers are run
-- off a bottom half).
-+ This, too, is exactly the same as above, because <firstterm
-+ linkend="gloss-timers">timers</firstterm> are actually run from
-+ a softirq. From a locking point of view, tasklets and timers
-+ are identical.
- </para>
--
-- <sect2 id="lock-bh-same">
-- <title>The Same BH</title>
--
-- <para>
-- Since a bottom half is never run on two CPUs at once, you
-- don't need to worry about your bottom half being run twice
-- at once, even on SMP.
-- </para>
-- </sect2>
--
-- <sect2 id="lock-bh-different">
-- <title>Different BHs</title>
--
-- <para>
-- Since only one bottom half ever runs at a time once, you
-- don't need to worry about race conditions with other bottom
-- halves. Beware that things might change under you, however,
-- if someone changes your bottom half to a tasklet. If you
-- want to make your code future-proof, pretend you're already
-- running from a tasklet (see below), and doing the extra
-- locking. Of course, if it's five years before that happens,
-- you're gonna look like a damn fool.
-- </para>
-- </sect2>
- </sect1>
-
- <sect1 id="lock-tasklets">
-- <title>Locking Between Tasklets</title>
-+ <title>Locking Between Tasklets/Timers</title>
-
- <para>
-- Sometimes a tasklet might want to share data with another
-- tasklet, or a bottom half.
-+ Sometimes a tasklet or timer might want to share data with
-+ another tasklet or timer.
- </para>
-
- <sect2 id="lock-tasklets-same">
-- <title>The Same Tasklet</title>
-+ <title>The Same Tasklet/Timer</title>
- <para>
- Since a tasklet is never run on two CPUs at once, you don't
- need to worry about your tasklet being reentrant (running
-@@ -379,10 +375,10 @@
- </sect2>
-
- <sect2 id="lock-tasklets-different">
-- <title>Different Tasklets</title>
-+ <title>Different Tasklets/Timers</title>
- <para>
-- If another tasklet (or bottom half, such as a timer) wants
-- to share data with your tasklet, you will both need to use
-+ If another tasklet/timer wants
-+ to share data with your tasklet or timer , you will both need to use
- <function>spin_lock()</function> and
- <function>spin_unlock()</function> calls.
- <function>spin_lock_bh()</function> is
-@@ -396,8 +392,8 @@
- <title>Locking Between Softirqs</title>
-
- <para>
-- Often a <firstterm linkend="gloss-softirq">softirq</firstterm> might
-- want to share data with itself, a tasklet, or a bottom half.
-+ Often a softirq might
-+ want to share data with itself or a tasklet/timer.
- </para>
-
- <sect2 id="lock-softirqs-same">
-@@ -421,10 +417,10 @@
- <title>Different Softirqs</title>
-
- <para>
-- You'll need to use <function>spin_lock()</function> and
-- <function>spin_unlock()</function> for shared data, whether it
-- be a timer (which can be running on a different CPU), bottom half,
-- tasklet or the same or another softirq.
-+ You'll need to use <function>spin_lock()</function> and
-+ <function>spin_unlock()</function> for shared data, whether it
-+ be a timer, tasklet, different softirq or the same or another
-+ softirq: any of them could be running on a different CPU.
- </para>
- </sect2>
- </sect1>
-@@ -434,13 +430,13 @@
- <title>Hard IRQ Context</title>
-
- <para>
-- Hardware interrupts usually communicate with a bottom half,
-+ Hardware interrupts usually communicate with a
- tasklet or softirq. Frequently this involves putting work in a
-- queue, which the BH/softirq will take out.
-+ queue, which the softirq will take out.
- </para>
-
- <sect1 id="hardirq-softirq">
-- <title>Locking Between Hard IRQ and Softirqs/Tasklets/BHs</title>
-+ <title>Locking Between Hard IRQ and Softirqs/Tasklets</title>
-
- <para>
- If a hardware irq handler shares data with a softirq, you have
-@@ -453,6 +449,16 @@
- </para>
-
- <para>
-+ The irq handler does not to use
-+ <function>spin_lock_irq()</function>, because the softirq cannot
-+ run while the irq handler is running: it can use
-+ <function>spin_lock()</function>, which is slightly faster. The
-+ only exception would be if a different hardware irq handler uses
-+ the same lock: <function>spin_lock_irq()</function> will stop
-+ that from interrupting us.
-+ </para>
-+
-+ <para>
- This works perfectly for UP as well: the spin lock vanishes,
- and this macro simply becomes <function>local_irq_disable()</function>
- (<filename class=headerfile>include/asm/smp.h</filename>), which
-@@ -468,60 +474,766 @@
- interrupts are already off) and in softirqs (where the irq
- disabling is required).
- </para>
-+
-+ <para>
-+ Note that softirqs (and hence tasklets and timers) are run on
-+ return from hardware interrupts, so
-+ <function>spin_lock_irq()</function> also stops these. In that
-+ sense, <function>spin_lock_irqsave()</function> is the most
-+ general and powerful locking function.
-+ </para>
-+
-+ </sect1>
-+ <sect1 id="hardirq-hardirq">
-+ <title>Locking Between Two Hard IRQ Handlers</title>
-+ <para>
-+ It is rare to have to share data between two IRQ handlers, but
-+ if you do, <function>spin_lock_irqsave()</function> should be
-+ used: it is architecture-specific whether all interrupts are
-+ disabled inside irq handlers themselves.
-+ </para>
- </sect1>
-- </chapter>
-
-- <chapter id="common-techniques">
-- <title>Common Techniques</title>
-+ </chapter>
-
-+ <chapter id="cheatsheet">
-+ <title>Cheat Sheet For Locking</title>
- <para>
-- This section lists some common dilemmas and the standard
-- solutions used in the Linux kernel code. If you use these,
-- people will find your code simpler to understand.
-+ Pete Zaitcev gives the following summary:
- </para>
-+ <itemizedlist>
-+ <listitem>
-+ <para>
-+ If you are in a process context (any syscall) and want to
-+ lock other process out, use a semaphore. You can take a semaphore
-+ and sleep (<function>copy_from_user*(</function> or
-+ <function>kmalloc(x,GFP_KERNEL)</function>).
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+ Otherwise (== data can be touched in an interrupt), use
-+ <function>spin_lock_irqsave()</function> and
-+ <function>spin_unlock_irqrestore()</function>.
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+ Avoid holding spinlock for more than 5 lines of code and
-+ across any function call (except accessors like
-+ <function>readb</function>).
-+ </para>
-+ </listitem>
-+ </itemizedlist>
-
-- <para>
-- If I could give you one piece of advice: never sleep with anyone
-- crazier than yourself. But if I had to give you advice on
-- locking: <emphasis>keep it simple</emphasis>.
-- </para>
-+ <sect1 id="minimum-lock-reqirements">
-+ <title>Table of Minimum Requirements</title>
-
-- <para>
-- Lock data, not code.
-+ <para> The following table lists the <emphasis>minimum</emphasis>
-+ locking requirements between various contexts. In some cases,
-+ the same context can only be running on one CPU at a time, so
-+ no locking is required for that context (eg. a particular
-+ thread can only run on one CPU at a time, but if it needs
-+ shares data with another thread, locking is required).
- </para>
--
- <para>
-- Be reluctant to introduce new locks.
-+ Remember the advice above: you can always use
-+ <function>spin_lock_irqsave()</function>, which is a superset
-+ of all other spinlock primitives.
- </para>
-+ <table>
-+<title>Table of Locking Requirements</title>
-+<TGROUP COLS=11>
-+<TBODY>
-+<ROW>
-+<ENTRY></ENTRY>
-+<ENTRY>IRQ Handler A</ENTRY>
-+<ENTRY>IRQ Handler B</ENTRY>
-+<ENTRY>Softirq A</ENTRY>
-+<ENTRY>Softirq B</ENTRY>
-+<ENTRY>Tasklet A</ENTRY>
-+<ENTRY>Tasklet B</ENTRY>
-+<ENTRY>Timer A</ENTRY>
-+<ENTRY>Timer B</ENTRY>
-+<ENTRY>User Context A</ENTRY>
-+<ENTRY>User Context B</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>IRQ Handler A</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>IRQ Handler B</ENTRY>
-+<ENTRY>spin_lock_irqsave</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>Softirq A</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>Softirq B</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>Tasklet A</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>Tasklet B</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>Timer A</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>Timer B</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>spin_lock</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>User Context A</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+<ROW>
-+<ENTRY>User Context B</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_irq</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>spin_lock_bh</ENTRY>
-+<ENTRY>down_interruptible</ENTRY>
-+<ENTRY>None</ENTRY>
-+</ROW>
-+
-+</TBODY>
-+</TGROUP>
-+</TABLE>
-+</chapter>
-+
-+ <chapter id="Examples">
-+ <title>Common Examples</title>
-+ <para>
-+Let's step through a simple example: a cache of number to name
-+mappings. The cache keeps a count of how often each of the objects is
-+used, and when it gets full, throws out the least used one.
-+
-+ </para>
-+
-+ <sect1 id="examples-usercontext">
-+ <title>All In User Context</title>
-+ <para>
-+For our first example, we assume that all operations are in user
-+context (ie. from system calls), so we can sleep. This means we can
-+use a semaphore to protect the cache and all the objects within
-+it. Here's the code:
-+ </para>
-
-- <para>
-- Strangely enough, this is the exact reverse of my advice when
-- you <emphasis>have</emphasis> slept with someone crazier than yourself.
-- </para>
-+ <programlisting>
-+#include <linux/list.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <asm/semaphore.h>
-+#include <asm/errno.h>
-+
-+struct object
-+{
-+ struct list_head list;
-+ int id;
-+ char name[32];
-+ int popularity;
-+};
-+
-+/* Protects the cache, cache_num, and the objects within it */
-+static DECLARE_MUTEX(cache_lock);
-+static LIST_HEAD(cache);
-+static unsigned int cache_num = 0;
-+#define MAX_CACHE_SIZE 10
-+
-+/* Must be holding cache_lock */
-+static struct object *__cache_find(int id)
-+{
-+ struct object *i;
-+
-+ list_for_each_entry(i, &cache, list)
-+ if (i->id == id) {
-+ i->popularity++;
-+ return i;
-+ }
-+ return NULL;
-+}
-
-- <sect1 id="techniques-no-writers">
-- <title>No Writers in Interrupt Context</title>
-+/* Must be holding cache_lock */
-+static void __cache_delete(struct object *obj)
-+{
-+ BUG_ON(!obj);
-+ list_del(&obj->list);
-+ kfree(obj);
-+ cache_num--;
-+}
-+
-+/* Must be holding cache_lock */
-+static void __cache_add(struct object *obj)
-+{
-+ list_add(&obj->list, &cache);
-+ if (++cache_num > MAX_CACHE_SIZE) {
-+ struct object *i, *outcast = NULL;
-+ list_for_each_entry(i, &cache, list) {
-+ if (!outcast || i->popularity < outcast->popularity)
-+ outcast = i;
-+ }
-+ __cache_delete(outcast);
-+ }
-+}
-
-- <para>
-- There is a fairly common case where an interrupt handler needs
-- access to a critical region, but does not need write access.
-- In this case, you do not need to use
-- <function>read_lock_irq()</function>, but only
-- <function>read_lock()</function> everywhere (since if an interrupt
-- occurs, the irq handler will only try to grab a read lock, which
-- won't deadlock). You will still need to use
-- <function>write_lock_irq()</function>.
-+int cache_add(int id, const char *name)
-+{
-+ struct object *obj;
-+
-+ if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
-+ return -ENOMEM;
-+
-+ strlcpy(obj->name, name, sizeof(obj->name));
-+ obj->id = id;
-+ obj->popularity = 0;
-+
-+ down(&cache_lock);
-+ __cache_add(obj);
-+ up(&cache_lock);
-+ return 0;
-+}
-+
-+void cache_delete(int id)
-+{
-+ down(&cache_lock);
-+ __cache_delete(__cache_find(id));
-+ up(&cache_lock);
-+}
-+
-+int cache_find(int id, char *name)
-+{
-+ struct object *obj;
-+ int ret = -ENOENT;
-+
-+ down(&cache_lock);
-+ obj = __cache_find(id);
-+ if (obj) {
-+ ret = 0;
-+ strcpy(name, obj->name);
-+ }
-+ up(&cache_lock);
-+ return ret;
-+}
-+</programlisting>
-+
-+ <para>
-+Note that we always make sure we have the cache_lock when we add,
-+delete, or look up the cache: both the cache infrastructure itself and
-+the contents of the objects are protected by the lock. In this case
-+it's easy, since we copy the data for the user, and never let them
-+access the objects directly.
-+ </para>
-+ <para>
-+There is a slight (and common) optimization here: in
-+<function>cache_add</function> we set up the fields of the object
-+before grabbing the lock. This is safe, as no-one else can access it
-+until we put it in cache.
-+ </para>
-+ </sect1>
-+
-+ <sect1 id="examples-interrupt">
-+ <title>Accessing From Interrupt Context</title>
-+ <para>
-+Now consider the case where <function>cache_find</function> can be
-+called from interrupt context: either a hardware interrupt or a
-+softirq. An example would be a timer which deletes object from the
-+cache.
-+ </para>
-+ <para>
-+The change is shown below, in standard patch format: the
-+<symbol>-</symbol> are lines which are taken away, and the
-+<symbol>+</symbol> are lines which are added.
-+ </para>
-+<programlisting>
-+--- cache.c.usercontext 2003-12-09 13:58:54.000000000 +1100
-++++ cache.c.interrupt 2003-12-09 14:07:49.000000000 +1100
-+@@ -12,7 +12,7 @@
-+ int popularity;
-+ };
-+
-+-static DECLARE_MUTEX(cache_lock);
-++static spinlock_t cache_lock = SPIN_LOCK_UNLOCKED;
-+ static LIST_HEAD(cache);
-+ static unsigned int cache_num = 0;
-+ #define MAX_CACHE_SIZE 10
-+@@ -55,6 +55,7 @@
-+ int cache_add(int id, const char *name)
-+ {
-+ struct object *obj;
-++ unsigned long flags;
-+
-+ if ((obj = kmalloc(sizeof(*obj), GFP_KERNEL)) == NULL)
-+ return -ENOMEM;
-+@@ -63,30 +64,33 @@
-+ obj->id = id;
-+ obj->popularity = 0;
-+
-+- down(&cache_lock);
-++ spin_lock_irqsave(&cache_lock, flags);
-+ __cache_add(obj);
-+- up(&cache_lock);
-++ spin_unlock_irqrestore(&cache_lock, flags);
-+ return 0;
-+ }
-+
-+ void cache_delete(int id)
-+ {
-+- down(&cache_lock);
-++ unsigned long flags;
-++
-++ spin_lock_irqsave(&cache_lock, flags);
-+ __cache_delete(__cache_find(id));
-+- up(&cache_lock);
-++ spin_unlock_irqrestore(&cache_lock, flags);
-+ }
-+
-+ int cache_find(int id, char *name)
-+ {
-+ struct object *obj;
-+ int ret = -ENOENT;
-++ unsigned long flags;
-+
-+- down(&cache_lock);
-++ spin_lock_irqsave(&cache_lock, flags);
-+ obj = __cache_find(id);
-+ if (obj) {
-+ ret = 0;
-+ strcpy(name, obj->name);
-+ }
-+- up(&cache_lock);
-++ spin_unlock_irqrestore(&cache_lock, flags);
-+ return ret;
-+ }
-+</programlisting>
-+
-+ <para>
-+Note that the <function>spin_lock_irqsave</function> will turn off
-+interrupts if they are on, otherwise does nothing (if we are already
-+in an interrupt handler), hence these functions are safe to call from
-+any context.
-+ </para>
-+ <para>
-+Unfortunately, <function>cache_add</function> calls
-+<function>kmalloc</function> with the <symbol>GFP_KERNEL</symbol>
-+flag, which is only legal in user context. I have assumed that
-+<function>cache_add</function> is still only called in user context,
-+otherwise this should become a parameter to
-+<function>cache_add</function>.
-+ </para>
-+ </sect1>
-+ <sect1 id="examples-refcnt">
-+ <title>Exposing Objects Outside This File</title>
-+ <para>
-+If our objects contained more information, it might not be sufficient
-+to copy the information in and out: other parts of the code might want
-+to keep pointers to these objects, for example, rather than looking up
-+the id every time. This produces two problems.
-+ </para>
-+ <para>
-+The first problem is that we use the <symbol>cache_lock</symbol> to
-+protect objects: we'd need to make this non-static so the rest of the
-+code can use it. This makes locking trickier, as it is no longer all
-+in one place.
-+ </para>
-+ <para>
-+The second problem is the lifetime problem: if another structure keeps
-+a pointer to an object, it presumably expects that pointer to remain
-+valid. Unfortunately, this is only guaranteed while you hold the
-+lock, otherwise someone might call <function>cache_delete</function>
-+and even worse, add another object, re-using the same address.
-+ </para>
-+ <para>
-+As there is only one lock, you can't hold it forever: no-one else would
-+get any work done.
-+ </para>
-+ <para>
-+The solution to this problem is to use a reference count: everyone who
-+has a pointer to the object increases it when they first get the
-+object, and drops the reference count when they're finished with it.
-+Whoever drops it to zero knows it is unused, and can actually delete it.
-+ </para>
-+ <para>
-+Here is the code:
-+ </para>
-+
-+<programlisting>
-+--- cache.c.interrupt 2003-12-09 14:25:43.000000000 +1100
-++++ cache.c.refcnt 2003-12-09 14:33:05.000000000 +1100
-+@@ -7,6 +7,7 @@
-+ struct object
-+ {
-+ struct list_head list;
-++ unsigned int refcnt;
-+ int id;
-+ char name[32];
-+ int popularity;
-+@@ -17,6 +18,35 @@
-+ static unsigned int cache_num = 0;
-+ #define MAX_CACHE_SIZE 10
-+
-++static void __object_put(struct object *obj)
-++{
-++ if (--obj->refcnt == 0)
-++ kfree(obj);
-++}
-++
-++static void __object_get(struct object *obj)
-++{
-++ obj->refcnt++;
-++}
-++
-++void object_put(struct object *obj)
-++{
-++ unsigned long flags;
-++
-++ spin_lock_irqsave(&cache_lock, flags);
-++ __object_put(obj);
-++ spin_unlock_irqrestore(&cache_lock, flags);
-++}
-++
-++void object_get(struct object *obj)
-++{
-++ unsigned long flags;
-++
-++ spin_lock_irqsave(&cache_lock, flags);
-++ __object_get(obj);
-++ spin_unlock_irqrestore(&cache_lock, flags);
-++}
-++
-+ /* Must be holding cache_lock */
-+ static struct object *__cache_find(int id)
-+ {
-+@@ -35,6 +65,7 @@
-+ {
-+ BUG_ON(!obj);
-+ list_del(&obj->list);
-++ __object_put(obj);
-+ cache_num--;
-+ }
-+
-+@@ -63,6 +94,7 @@
-+ strlcpy(obj->name, name, sizeof(obj->name));
-+ obj->id = id;
-+ obj->popularity = 0;
-++ obj->refcnt = 1; /* The cache holds a reference */
-+
-+ spin_lock_irqsave(&cache_lock, flags);
-+ __cache_add(obj);
-+@@ -79,18 +111,15 @@
-+ spin_unlock_irqrestore(&cache_lock, flags);
-+ }
-+
-+-int cache_find(int id, char *name)
-++struct object *cache_find(int id)
-+ {
-+ struct object *obj;
-+- int ret = -ENOENT;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&cache_lock, flags);
-+ obj = __cache_find(id);
-+- if (obj) {
-+- ret = 0;
-+- strcpy(name, obj->name);
-+- }
-++ if (obj)
-++ __object_get(obj);
-+ spin_unlock_irqrestore(&cache_lock, flags);
-+- return ret;
-++ return obj;
-+ }
-+</programlisting>
-+
-+<para>
-+We encapsulate the reference counting in the standard 'get' and 'put'
-+functions. Now we can return the object itself from
-+<function>cache_find</function> which has the advantage that the user
-+can now sleep holding the object (eg. to
-+<function>copy_to_user</function> to name to userspace).
-+</para>
-+<para>
-+The other point to note is that I said a reference should be held for
-+every pointer to the object: thus the reference count is 1 when first
-+inserted into the cache. In some versions the framework does not hold
-+a reference count, but they are more complicated.
-+</para>
-+
-+ <sect2 id="examples-refcnt-atomic">
-+ <title>Using Atomic Operations For The Reference Count</title>
-+<para>
-+In practice, <type>atomic_t</type> would usually be used for
-+<structfield>refcnt</structfield>. There are a number of atomic
-+operations defined in
-+
-+<filename class=headerfile>include/asm/atomic.h</filename>: these are
-+guaranteed to be seen atomically from all CPUs in the system, so no
-+lock is required. In this case, it is simpler than using spinlocks,
-+although for anything non-trivial using spinlocks is clearer. The
-+<function>atomic_inc</function> and
-+<function>atomic_dec_and_test</function> are used instead of the
-+standard increment and decrement operators, and the lock is no longer
-+used to protect the reference count itself.
-+</para>
-+
-+<programlisting>
-+--- cache.c.refcnt 2003-12-09 15:00:35.000000000 +1100
-++++ cache.c.refcnt-atomic 2003-12-11 15:49:42.000000000 +1100
-+@@ -7,7 +7,7 @@
-+ struct object
-+ {
-+ struct list_head list;
-+- unsigned int refcnt;
-++ atomic_t refcnt;
-+ int id;
-+ char name[32];
-+ int popularity;
-+@@ -18,33 +18,15 @@
-+ static unsigned int cache_num = 0;
-+ #define MAX_CACHE_SIZE 10
-+
-+-static void __object_put(struct object *obj)
-+-{
-+- if (--obj->refcnt == 0)
-+- kfree(obj);
-+-}
-+-
-+-static void __object_get(struct object *obj)
-+-{
-+- obj->refcnt++;
-+-}
-+-
-+ void object_put(struct object *obj)
-+ {
-+- unsigned long flags;
-+-
-+- spin_lock_irqsave(&cache_lock, flags);
-+- __object_put(obj);
-+- spin_unlock_irqrestore(&cache_lock, flags);
-++ if (atomic_dec_and_test(&obj->refcnt))
-++ kfree(obj);
-+ }
-+
-+ void object_get(struct object *obj)
-+ {
-+- unsigned long flags;
-+-
-+- spin_lock_irqsave(&cache_lock, flags);
-+- __object_get(obj);
-+- spin_unlock_irqrestore(&cache_lock, flags);
-++ atomic_inc(&obj->refcnt);
-+ }
-+
-+ /* Must be holding cache_lock */
-+@@ -65,7 +47,7 @@
-+ {
-+ BUG_ON(!obj);
-+ list_del(&obj->list);
-+- __object_put(obj);
-++ object_put(obj);
-+ cache_num--;
-+ }
-+
-+@@ -94,7 +76,7 @@
-+ strlcpy(obj->name, name, sizeof(obj->name));
-+ obj->id = id;
-+ obj->popularity = 0;
-+- obj->refcnt = 1; /* The cache holds a reference */
-++ atomic_set(&obj->refcnt, 1); /* The cache holds a reference */
-+
-+ spin_lock_irqsave(&cache_lock, flags);
-+ __cache_add(obj);
-+@@ -119,7 +101,7 @@
-+ spin_lock_irqsave(&cache_lock, flags);
-+ obj = __cache_find(id);
-+ if (obj)
-+- __object_get(obj);
-++ object_get(obj);
-+ spin_unlock_irqrestore(&cache_lock, flags);
-+ return obj;
-+ }
-+</programlisting>
-+</sect1>
-+
-+ <sect1 id="examples-lock-per-obj">
-+ <title>Protecting The Objects Themselves</title>
-+ <para>
-+In these examples, we assumed that the objects (except the reference
-+counts) never changed once they are created. If we wanted to allow
-+the name to change, there are three possibilities:
- </para>
-+ <itemizedlist>
-+ <listitem>
-+ <para>
-+You can make <symbol>cache_lock</symbol> non-static, and tell people
-+to grab that lock before changing the name in any object.
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+You can provide a <function>cache_obj_rename</function> which grabs
-+this lock and changes the name for the caller, and tell everyone to
-+use that function.
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+You can make the <symbol>cache_lock</symbol> protect only the cache
-+itself, and use another lock to protect the name.
-+ </para>
-+ </listitem>
-+ </itemizedlist>
-
-- <para>
-- Similar logic applies to locking between softirqs/tasklets/BHs
-- which never need a write lock, and user context:
-- <function>read_lock()</function> and
-- <function>write_lock_bh()</function>.
-- </para>
-- </sect1>
-+ <para>
-+Theoretically, you can make the locks as fine-grained as one lock for
-+every field, for every object. In practice, the most common variants
-+are:
-+</para>
-+ <itemizedlist>
-+ <listitem>
-+ <para>
-+One lock which protects the infrastructure (the <symbol>cache</symbol>
-+list in this example) and all the objects. This is what we have done
-+so far.
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+One lock which protects the infrastructure (including the list
-+pointers inside the objects), and one lock inside the object which
-+protects the rest of that object.
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+Multiple locks to protect the infrastructure (eg. one lock per hash
-+chain), possibly with a separate per-object lock.
-+ </para>
-+ </listitem>
-+ </itemizedlist>
-
-- <sect1 id="techniques-deadlocks">
-+<para>
-+Here is the "lock-per-object" implementation:
-+</para>
-+<programlisting>
-+--- cache.c.refcnt-atomic 2003-12-11 15:50:54.000000000 +1100
-++++ cache.c.perobjectlock 2003-12-11 17:15:03.000000000 +1100
-+@@ -6,11 +6,17 @@
-+
-+ struct object
-+ {
-++ /* These two protected by cache_lock. */
-+ struct list_head list;
-++ int popularity;
-++
-+ atomic_t refcnt;
-++
-++ /* Doesn't change once created. */
-+ int id;
-++
-++ spinlock_t lock; /* Protects the name */
-+ char name[32];
-+- int popularity;
-+ };
-+
-+ static spinlock_t cache_lock = SPIN_LOCK_UNLOCKED;
-+@@ -77,6 +84,7 @@
-+ obj->id = id;
-+ obj->popularity = 0;
-+ atomic_set(&obj->refcnt, 1); /* The cache holds a reference */
-++ spin_lock_init(&obj->lock);
-+
-+ spin_lock_irqsave(&cache_lock, flags);
-+ __cache_add(obj);
-+</programlisting>
-+
-+<para>
-+Note that I decide that the <structfield>popularity</structfield>
-+count should be protected by the <symbol>cache_lock</symbol> rather
-+than the per-object lock: this is because it (like the
-+<structname>struct list_head</structname> inside the object) is
-+logically part of the infrastructure. This way, I don't need to grab
-+the lock of every object in <function>__cache_add</function> when
-+seeking the least popular.
-+</para>
-+
-+<para>
-+I also decided that the <structfield>id</structfield> member is
-+unchangeable, so I don't need to grab each object lock in
-+<function>__cache_find()</function> to examine the
-+<structfield>id</structfield>: the object lock is only used by a
-+caller who wants to read or write the <structfield>name</structfield>
-+field.
-+</para>
-+
-+<para>
-+Note also that I added a comment describing what data was protected by
-+which locks. This is extremely important, as it describes the runtime
-+behavior of the code, and can be hard to gain from just reading. And
-+as Alan Cox says, <quote>Lock data, not code</quote>.
-+</para>
-+</chapter>
-+
-+ <chapter id="common-problems">
-+ <title>Common Problems</title>
-+ <sect1 id="deadlock">
- <title>Deadlock: Simple and Advanced</title>
-
- <para>
-@@ -535,10 +1247,10 @@
-
- <para>
- For a slightly more complex case, imagine you have a region
-- shared by a bottom half and user context. If you use a
-+ shared by a softirq and user context. If you use a
- <function>spin_lock()</function> call to protect it, it is
-- possible that the user context will be interrupted by the bottom
-- half while it holds the lock, and the bottom half will then spin
-+ possible that the user context will be interrupted by the softirq
-+ while it holds the lock, and the softirq will then spin
- forever trying to get the same lock.
- </para>
-
-@@ -558,7 +1270,7 @@
- </para>
-
- <para>
-- A more complex problem is the so-called `deadly embrace',
-+ A more complex problem is the so-called 'deadly embrace',
- involving two or more locks. Say you have a hash table: each
- entry in the table is a spinlock, and a chain of hashed
- objects. Inside a softirq handler, you sometimes want to
-@@ -606,7 +1318,7 @@
- their lock. It will look, smell, and feel like a crash.
- </para>
-
-- <sect2 id="techs-deadlock-prevent">
-+ <sect1 id="techs-deadlock-prevent">
- <title>Preventing Deadlock</title>
-
- <para>
-@@ -634,7 +1346,6 @@
- will do?). Remember, the other programmers are out to get
- you, so don't do this.
- </para>
-- </sect2>
-
- <sect2 id="techs-deadlock-overprevent">
- <title>Overzealous Prevention Of Deadlocks</title>
-@@ -650,266 +1361,481 @@
- If you don't see why, please stay the fuck away from my code.
- </para>
- </sect2>
-- </sect1>
-+ </sect1>
-
-- <sect1 id="per-cpu">
-- <title>Per-CPU Data</title>
--
-- <para>
-- A great technique for avoiding locking which is used fairly
-- widely is to duplicate information for each CPU. For example,
-- if you wanted to keep a count of a common condition, you could
-- use a spin lock and a single counter. Nice and simple.
-- </para>
-+ <sect1 id="racing-timers">
-+ <title>Racing Timers: A Kernel Pastime</title>
-
- <para>
-- If that was too slow [it's probably not], you could instead
-- use a counter for each CPU [don't], then none of them need an
-- exclusive lock [you're wasting your time here]. To make sure
-- the CPUs don't have to synchronize caches all the time, align
-- the counters to cache boundaries by appending
-- `__cacheline_aligned' to the declaration
-- (<filename class=headerfile>include/linux/cache.h</filename>).
-- [Can't you think of anything better to do?]
-+ Timers can produce their own special problems with races.
-+ Consider a collection of objects (list, hash, etc) where each
-+ object has a timer which is due to destroy it.
- </para>
-
- <para>
-- They will need a read lock to access their own counters,
-- however. That way you can use a write lock to grant exclusive
-- access to all of them at once, to tally them up.
-+ If you want to destroy the entire collection (say on module
-+ removal), you might do the following:
- </para>
-- </sect1>
-
-- <sect1 id="brlock">
-- <title>Big Reader Locks</title>
-+ <programlisting>
-+ /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
-+ HUNGARIAN NOTATION */
-+ spin_lock_bh(&list_lock);
-
-- <para>
-- A classic example of per-CPU information is Ingo's `big
-- reader' locks
-- (<filename class=headerfile>linux/include/brlock.h</filename>). These
-- use the Per-CPU Data techniques described above to create a lock which
-- is very fast to get a read lock, but agonizingly slow for a write
-- lock.
-- </para>
-+ while (list) {
-+ struct foo *next = list->next;
-+ del_timer(&list->timer);
-+ kfree(list);
-+ list = next;
-+ }
-+
-+ spin_unlock_bh(&list_lock);
-+ </programlisting>
-
- <para>
-- Fortunately, there are a limited number of these locks
-- available: you have to go through a strict interview process
-- to get one.
-+ Sooner or later, this will crash on SMP, because a timer can
-+ have just gone off before the <function>spin_lock_bh()</function>,
-+ and it will only get the lock after we
-+ <function>spin_unlock_bh()</function>, and then try to free
-+ the element (which has already been freed!).
- </para>
-- </sect1>
--
-- <sect1 id="lock-avoidance-rw">
-- <title>Avoiding Locks: Read And Write Ordering</title>
-
- <para>
-- Sometimes it is possible to avoid locking. Consider the
-- following case from the 2.2 firewall code, which inserted an
-- element into a single linked list in user context:
-+ This can be avoided by checking the result of
-+ <function>del_timer()</function>: if it returns
-+ <returnvalue>1</returnvalue>, the timer has been deleted.
-+ If <returnvalue>0</returnvalue>, it means (in this
-+ case) that it is currently running, so we can do:
- </para>
-
- <programlisting>
-- new->next = i->next;
-- i->next = new;
-- </programlisting>
-+ retry:
-+ spin_lock_bh(&list_lock);
-
-- <para>
-- Here the author (Alan Cox, who knows what he's doing) assumes
-- that the pointer assignments are atomic. This is important,
-- because networking packets would traverse this list on bottom
-- halves without a lock. Depending on their exact timing, they
-- would either see the new element in the list with a valid
-- <structfield>next</structfield> pointer, or it would not be in the
-- list yet. A lock is still required against other CPUs inserting
-- or deleting from the list, of course.
-- </para>
-+ while (list) {
-+ struct foo *next = list->next;
-+ if (!del_timer(&list->timer)) {
-+ /* Give timer a chance to delete this */
-+ spin_unlock_bh(&list_lock);
-+ goto retry;
-+ }
-+ kfree(list);
-+ list = next;
-+ }
-
-- <para>
-- Of course, the writes <emphasis>must</emphasis> be in this
-- order, otherwise the new element appears in the list with an
-- invalid <structfield>next</structfield> pointer, and any other
-- CPU iterating at the wrong time will jump through it into garbage.
-- Because modern CPUs reorder, Alan's code actually read as follows:
-- </para>
--
-- <programlisting>
-- new->next = i->next;
-- wmb();
-- i->next = new;
-+ spin_unlock_bh(&list_lock);
- </programlisting>
-
- <para>
-- The <function>wmb()</function> is a write memory barrier
-- (<filename class=headerfile>include/asm/system.h</filename>): neither
-- the compiler nor the CPU will allow any writes to memory after the
-- <function>wmb()</function> to be visible to other hardware
-- before any of the writes before the <function>wmb()</function>.
-+ Another common problem is deleting timers which restart
-+ themselves (by calling <function>add_timer()</function> at the end
-+ of their timer function). Because this is a fairly common case
-+ which is prone to races, you should use <function>del_timer_sync()</function>
-+ (<filename class=headerfile>include/linux/timer.h</filename>)
-+ to handle this case. It returns the number of times the timer
-+ had to be deleted before we finally stopped it from adding itself back
-+ in.
- </para>
-+ </sect1>
-
-- <para>
-- As i386 does not do write reordering, this bug would never
-- show up on that platform. On other SMP platforms, however, it
-- will.
-- </para>
-+ <sect1 id="sparc">
-+ <title>The Fucked Up Sparc</title>
-
- <para>
-- There is also <function>rmb()</function> for read ordering: to ensure
-- any previous variable reads occur before following reads. The simple
-- <function>mb()</function> macro combines both
-- <function>rmb()</function> and <function>wmb()</function>.
-+ Alan Cox says <quote>the irq disable/enable is in the register
-+ window on a sparc</quote>. Andi Kleen says <quote>when you do
-+ restore_flags in a different function you mess up all the
-+ register windows</quote>.
- </para>
-
- <para>
-- Some atomic operations are defined to act as a memory barrier
-- (ie. as per the <function>mb()</function> macro, but if in
-- doubt, be explicit.
-- <!-- Rusty Russell 2 May 2001, 2.4.4 -->
-- Also,
-- spinlock operations act as partial barriers: operations after
-- gaining a spinlock will never be moved to precede the
-- <function>spin_lock()</function> call, and operations before
-- releasing a spinlock will never be moved after the
-- <function>spin_unlock()</function> call.
-- <!-- Manfred Spraul <manfreds@colorfullife.com>
-- 24 May 2000 2.3.99-pre9 -->
-+ So never pass the flags word set by
-+ <function>spin_lock_irqsave()</function> and brethren to another
-+ function (unless it's declared <type>inline</type>). Usually no-one
-+ does this, but now you've been warned. Dave Miller can never do
-+ anything in a straightforward manner (I can say that, because I have
-+ pictures of him and a certain PowerPC maintainer in a compromising
-+ position).
- </para>
- </sect1>
-
-- <sect1 id="lock-avoidance-atomic-ops">
-- <title>Avoiding Locks: Atomic Operations</title>
-+ </chapter>
-+
-+ <chapter id="Efficiency">
-+ <title>Locking Speed</title>
-
- <para>
-- There are a number of atomic operations defined in
-- <filename class=headerfile>include/asm/atomic.h</filename>: these
-- are guaranteed to be seen atomically from all CPUs in the system, thus
-- avoiding races. If your shared data consists of a single counter, say,
-- these operations might be simpler than using spinlocks (although for
-- anything non-trivial using spinlocks is clearer).
-+There are three main things to worry about when considering speed of
-+some code which does locking. First is concurrency: how many things
-+are going to be waiting while someone else is holding a lock. Second
-+is the time taken to actually acquire and release an uncontended lock.
-+Third is using fewer, or smarter locks. I'm assuming that the lock is
-+used fairly often: otherwise, you wouldn't be concerned about
-+efficiency.
-+</para>
-+ <para>
-+Concurrency depends on how long the lock is usually held: you should
-+hold the lock for as long as needed, but no longer. In the cache
-+example, we always create the object without the lock held, and then
-+grab the lock only when we are ready to insert it in the list.
-+</para>
-+ <para>
-+Acquisition times depend on how much damage the lock operations do to
-+the pipeline (pipeline stalls) and how likely it is that this CPU was
-+the last one to grab the lock (ie. is the lock cache-hot for this
-+CPU): on a machine with more CPUs, this likelihood drops fast.
-+Consider a 700MHz Intel Pentium III: an instruction takes about 0.7ns,
-+an atomic increment takes about 58ns, a lock which is cache-hot on
-+this CPU takes 160ns, and a cacheline transfer from another CPU takes
-+an additional 170 to 360ns. (These figures from Paul McKenney's
-+<ulink url="http://www.linuxjournal.com/article.php?sid=6993"> Linux
-+Journal RCU article</ulink>).
-+</para>
-+ <para>
-+These two aims conflict: holding a lock for a short time might be done
-+by splitting locks into parts (such as in our final per-object-lock
-+example), but this increases the number of lock acquisitions, and the
-+results are often slower than having a single lock. This is another
-+reason to advocate locking simplicity.
-+</para>
-+ <para>
-+The third concern is addressed below: there are some methods to reduce
-+the amount of locking which needs to be done.
-+</para>
-+
-+ <sect1 id="efficiency-rwlocks">
-+ <title>Read/Write Lock Variants</title>
-+
-+ <para>
-+ Both spinlocks and semaphores have read/write variants:
-+ <type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
-+ These divide users into two classes: the readers and the writers. If
-+ you are only reading the data, you can get a read lock, but to write to
-+ the data you need the write lock. Many people can hold a read lock,
-+ but a writer must be sole holder.
- </para>
-
-- <para>
-- Note that the atomic operations do in general not act as memory
-- barriers. Instead you can insert a memory barrier before or
-- after <function>atomic_inc()</function> or
-- <function>atomic_dec()</function> by inserting
-- <function>smp_mb__before_atomic_inc()</function>,
-- <function>smp_mb__after_atomic_inc()</function>,
-- <function>smp_mb__before_atomic_dec()</function> or
-- <function>smp_mb__after_atomic_dec()</function>
-- respectively. The advantage of using those macros instead of
-- <function>smp_mb()</function> is, that they are cheaper on some
-- platforms.
-- <!-- Sebastian Wilhelmi <seppi@seppi.de> 2002-03-04 -->
-+ <para>
-+ If your code divides neatly along reader/writer lines (as our
-+ cache code does), and the lock is held by readers for
-+ significant lengths of time, using these locks can help. They
-+ are slightly slower than the normal locks though, so in practice
-+ <type>rwlock_t</type> is not usually worthwhile.
- </para>
- </sect1>
-
-- <sect1 id="ref-counts">
-- <title>Protecting A Collection of Objects: Reference Counts</title>
-+ <sect1 id="efficiency-read-copy-update">
-+ <title>Avoiding Locks: Read Copy Update</title>
-
- <para>
-- Locking a collection of objects is fairly easy: you get a
-- single spinlock, and you make sure you grab it before
-- searching, adding or deleting an object.
-+ There is a special method of read/write locking called Read Copy
-+ Update. Using RCU, the readers can avoid taking a lock
-+ altogether: as we expect our cache to be read more often than
-+ updated (otherwise the cache is a waste of time), it is a
-+ candidate for this optimization.
- </para>
-
- <para>
-- The purpose of this lock is not to protect the individual
-- objects: you might have a separate lock inside each one for
-- that. It is to protect the <emphasis>data structure
-- containing the objects</emphasis> from race conditions. Often
-- the same lock is used to protect the contents of all the
-- objects as well, for simplicity, but they are inherently
-- orthogonal (and many other big words designed to confuse).
-+ How do we get rid of read locks? Getting rid of read locks
-+ means that writers may be changing the list underneath the
-+ readers. That is actually quite simple: we can read a linked
-+ list while an element is being added if the writer adds the
-+ element very carefully. For example, adding
-+ <symbol>new</symbol> to a single linked list called
-+ <symbol>list</symbol>:
- </para>
-
-+ <programlisting>
-+ new->next = list->next;
-+ wmb();
-+ list->next = new;
-+ </programlisting>
-+
- <para>
-- Changing this to a read-write lock will often help markedly if
-- reads are far more common that writes. If not, there is
-- another approach you can use to reduce the time the lock is
-- held: reference counts.
-+ The <function>wmb()</function> is a write memory barrier. It
-+ ensures that the first operation (setting the new element's
-+ <symbol>next</symbol> pointer) is complete and will be seen by
-+ all CPUs, before the second operation is (putting the new
-+ element into the list). This is important, since modern
-+ compilers and modern CPUs can both reorder instructions unless
-+ told otherwise: we want a reader to either not see the new
-+ element at all, or see the new element with the
-+ <symbol>next</symbol> pointer correctly pointing at the rest of
-+ the list.
-+ </para>
-+ <para>
-+ Fortunately, there is a function to do this for standard
-+ <structname>struct list_head</structname> lists:
-+ <function>list_add_rcu()</function>
-+ (<filename>include/linux/list.h</filename>).
-+ </para>
-+ <para>
-+ Removing an element from the list is even simpler: we replace
-+ the pointer to the old element with a pointer to its successor,
-+ and readers will either see it, or skip over it.
- </para>
-+ <programlisting>
-+ list->next = old->next;
-+ </programlisting>
-+ <para>
-+ There is <function>list_del_rcu()</function>
-+ (<filename>include/linux/list.h</filename>) which does this (the
-+ normal version poisons the old object, which we don't want).
-+ </para>
-+ <para>
-+ The reader must also be careful: some CPUs can look through the
-+ <symbol>next</symbol> pointer to start reading the contents of
-+ the next element early, but don't realize that the pre-fetched
-+ contents is wrong when the <symbol>next</symbol> pointer changes
-+ underneath them. Once again, there is a
-+ <function>list_for_each_entry_rcu()</function>
-+ (<filename>include/linux/list.h</filename>) to help you. Of
-+ course, writers can just use
-+ <function>list_for_each_entry()</function>, since there cannot
-+ be two simultaneous writers.
-+ </para>
-+ <para>
-+ Our final dilemma is this: when can we actually destroy the
-+ removed element? Remember, a reader might be stepping through
-+ this element in the list right now: it we free this element and
-+ the <symbol>next</symbol> pointer changes, the reader will jump
-+ off into garbage and crash. We need to wait until we know that
-+ all the readers who were traversing the list when we deleted the
-+ element are finished. We use <function>call_rcu()</function> to
-+ register a callback which will actually destroy the object once
-+ the readers are finished.
-+ </para>
-+ <para>
-+ But how does Read Copy Update know when the readers are
-+ finished? The method is this: firstly, the readers always
-+ traverse the list inside
-+ <function>rcu_read_lock()</function>/<function>rcu_read_unlock()</function>
-+ pairs: these simply disable preemption so the reader won't go to
-+ sleep while reading the list.
-+ </para>
-+ <para>
-+ RCU then waits until every other CPU has slept at least once:
-+ since readers cannot sleep, we know that any readers which were
-+ traversing the list during the deletion are finished, and the
-+ callback is triggered. The real Read Copy Update code is a
-+ little more optimized than this, but this is the fundamental
-+ idea.
-+ </para>
-+
-+<programlisting>
-+--- cache.c.perobjectlock 2003-12-11 17:15:03.000000000 +1100
-++++ cache.c.rcupdate 2003-12-11 17:55:14.000000000 +1100
-+@@ -1,15 +1,18 @@
-+ #include <linux/list.h>
-+ #include <linux/slab.h>
-+ #include <linux/string.h>
-++#include <linux/rcupdate.h>
-+ #include <asm/semaphore.h>
-+ #include <asm/errno.h>
-+
-+ struct object
-+ {
-+- /* These two protected by cache_lock. */
-++ /* This is protected by RCU */
-+ struct list_head list;
-+ int popularity;
-+
-++ struct rcu_head rcu;
-++
-+ atomic_t refcnt;
-+
-+ /* Doesn't change once created. */
-+@@ -40,7 +43,7 @@
-+ {
-+ struct object *i;
-+
-+- list_for_each_entry(i, &cache, list) {
-++ list_for_each_entry_rcu(i, &cache, list) {
-+ if (i->id == id) {
-+ i->popularity++;
-+ return i;
-+@@ -49,19 +52,25 @@
-+ return NULL;
-+ }
-+
-++/* Final discard done once we know no readers are looking. */
-++static void cache_delete_rcu(void *arg)
-++{
-++ object_put(arg);
-++}
-++
-+ /* Must be holding cache_lock */
-+ static void __cache_delete(struct object *obj)
-+ {
-+ BUG_ON(!obj);
-+- list_del(&obj->list);
-+- object_put(obj);
-++ list_del_rcu(&obj->list);
-+ cache_num--;
-++ call_rcu(&obj->rcu, cache_delete_rcu, obj);
-+ }
-+
-+ /* Must be holding cache_lock */
-+ static void __cache_add(struct object *obj)
-+ {
-+- list_add(&obj->list, &cache);
-++ list_add_rcu(&obj->list, &cache);
-+ if (++cache_num > MAX_CACHE_SIZE) {
-+ struct object *i, *outcast = NULL;
-+ list_for_each_entry(i, &cache, list) {
-+@@ -85,6 +94,7 @@
-+ obj->popularity = 0;
-+ atomic_set(&obj->refcnt, 1); /* The cache holds a reference */
-+ spin_lock_init(&obj->lock);
-++ INIT_RCU_HEAD(&obj->rcu);
-+
-+ spin_lock_irqsave(&cache_lock, flags);
-+ __cache_add(obj);
-+@@ -104,12 +114,11 @@
-+ struct object *cache_find(int id)
-+ {
-+ struct object *obj;
-+- unsigned long flags;
-+
-+- spin_lock_irqsave(&cache_lock, flags);
-++ rcu_read_lock();
-+ obj = __cache_find(id);
-+ if (obj)
-+ object_get(obj);
-+- spin_unlock_irqrestore(&cache_lock, flags);
-++ rcu_read_unlock();
-+ return obj;
-+ }
-+</programlisting>
-+
-+<para>
-+Note that the reader will alter the
-+<structfield>popularity</structfield> member in
-+<function>__cache_find()</function>, and now it doesn't hold a lock.
-+One solution would be to make it an <type>atomic_t</type>, but for
-+this usage, we don't really care about races: an approximate result is
-+good enough, so I didn't change it.
-+</para>
-+
-+<para>
-+The result is that <function>cache_find()</function> requires no
-+synchronization with any other functions, so is almost as fast on SMP
-+as it would be on UP.
-+</para>
-+
-+<para>
-+There is a furthur optimization possible here: remember our original
-+cache code, where there were no reference counts and the caller simply
-+held the lock whenever using the object? This is still possible: if
-+you hold the lock, noone can delete the object, so you don't need to
-+get and put the reference count.
-+</para>
-+
-+<para>
-+Now, because the 'read lock' in RCU is simply disabling preemption, a
-+caller which always has preemption disabled between calling
-+<function>cache_find()</function> and
-+<function>object_put()</function> does not need to actually get and
-+put the reference count: we could expose
-+<function>__cache_find()</function> by making it non-static, and
-+such callers could simply call that.
-+</para>
-+<para>
-+The benefit here is that the reference count is not written to: the
-+object is not altered in any way, which is much faster on SMP
-+machines due to caching.
-+</para>
-+ </sect1>
-+
-+ <sect1 id="per-cpu">
-+ <title>Per-CPU Data</title>
-
- <para>
-- In this approach, an object has an owner, who sets the
-- reference count to one. Whenever you get a pointer to the
-- object, you increment the reference count (a `get' operation).
-- Whenever you relinquish a pointer, you decrement the reference
-- count (a `put' operation). When the owner wants to destroy
-- it, they mark it dead, and do a put.
-+ Another technique for avoiding locking which is used fairly
-+ widely is to duplicate information for each CPU. For example,
-+ if you wanted to keep a count of a common condition, you could
-+ use a spin lock and a single counter. Nice and simple.
- </para>
-
- <para>
-- Whoever drops the reference count to zero (usually implemented
-- with <function>atomic_dec_and_test()</function>) actually cleans
-- up and frees the object.
-+ If that was too slow (it's usually not, but if you've got a
-+ really big machine to test on and can show that it is), you
-+ could instead use a counter for each CPU, then none of them need
-+ an exclusive lock. See <function>DEFINE_PER_CPU()</function>,
-+ <function>get_cpu_var()</function> and
-+ <function>put_cpu_var()</function>
-+ (<filename class=headerfile>include/linux/percpu.h</filename>).
- </para>
-
- <para>
-- This means that you are guaranteed that the object won't
-- vanish underneath you, even though you no longer have a lock
-- for the collection.
-+ Of particular use for simple per-cpu counters is the
-+ <type>local_t</type> type, and the
-+ <function>cpu_local_inc()</function> and related functions,
-+ which are more efficient than simple code on some architectures
-+ (<filename class=headerfile>include/asm/local.h</filename>).
- </para>
-
- <para>
-- Here's some skeleton code:
-+ Note that there is no simple, reliable way of getting an exact
-+ value of such a counter, without introducing more locks. This
-+ is not a problem for some uses.
- </para>
-+ </sect1>
-
-- <programlisting>
-- void create_foo(struct foo *x)
-- {
-- atomic_set(&x->use, 1);
-- spin_lock_bh(&list_lock);
-- ... insert in list ...
-- spin_unlock_bh(&list_lock);
-- }
--
-- struct foo *get_foo(int desc)
-- {
-- struct foo *ret;
--
-- spin_lock_bh(&list_lock);
-- ... find in list ...
-- if (ret) atomic_inc(&ret->use);
-- spin_unlock_bh(&list_lock);
--
-- return ret;
-- }
-+ <sect1 id="mostly-hardirq">
-+ <title>Data Which Mostly Used By An IRQ Handler</title>
-
-- void put_foo(struct foo *x)
-- {
-- if (atomic_dec_and_test(&x->use))
-- kfree(foo);
-- }
-+ <para>
-+ If data is always accessed from within the same IRQ handler, you
-+ don't need a lock at all: the kernel already guarantees that the
-+ irq handler will not run simultaneously on multiple CPUs.
-+ </para>
-+ <para>
-+ Manfred Spraul points out that you can still do this, even if
-+ the data is very occasionally accessed in user context or
-+ softirqs/tasklets. The irq handler doesn't use a lock, and
-+ all other accesses are done as so:
-+ </para>
-+
-+<programlisting>
-+ spin_lock(&lock);
-+ disable_irq(irq);
-+ ...
-+ enable_irq(irq);
-+ spin_unlock(&lock);
-+</programlisting>
-+ <para>
-+ The <function>disable_irq()</function> prevents the irq handler
-+ from running (and waits for it to finish if it's currently
-+ running on other CPUs). The spinlock prevents any other
-+ accesses happening at the same time. Naturally, this is slower
-+ than just a <function>spin_lock_irq()</function> call, so it
-+ only makes sense if this type of access happens extremely
-+ rarely.
-+ </para>
-+ </sect1>
-+ </chapter>
-
-- void destroy_foo(struct foo *x)
-- {
-- spin_lock_bh(&list_lock);
-- ... remove from list ...
-- spin_unlock_bh(&list_lock);
-+ <chapter id="sleeping-things">
-+ <title>What Functions Are Safe To Call From Interrupts?</title>
-
-- put_foo(x);
-- }
-- </programlisting>
-+ <para>
-+ Many functions in the kernel sleep (ie. call schedule())
-+ directly or indirectly: you can never call them while holding a
-+ spinlock, or with preemption disabled. This also means you need
-+ to be in user context: calling them from an interrupt is illegal.
-+ </para>
-
-- <sect2 id="helpful-macros">
-- <title>Macros To Help You</title>
-- <para>
-- There are a set of debugging macros tucked inside
-- <filename class=headerfile>include/linux/netfilter_ipv4/lockhelp.h</filename>
-- and <filename class=headerfile>listhelp.h</filename>: these are very
-- useful for ensuring that locks are held in the right places to protect
-- infrastructure.
-- </para>
-- </sect2>
-- </sect1>
--
-- <sect1 id="sleeping-things">
-- <title>Things Which Sleep</title>
-+ <sect1 id="sleeping">
-+ <title>Some Functions Which Sleep</title>
-
- <para>
-- You can never call the following routines while holding a
-- spinlock, as they may sleep. This also means you need to be in
-- user context.
-+ The most common ones are listed below, but you usually have to
-+ read the code to find out if other calls are safe. If everyone
-+ else who calls it can sleep, you probably need to be able to
-+ sleep, too. In particular, registration and deregistration
-+ functions usually expect to be called from user context, and can
-+ sleep.
- </para>
-
- <itemizedlist>
-@@ -961,106 +1887,31 @@
- </listitem>
- </itemizedlist>
-
-- <para>
-- <function>printk()</function> can be called in
-- <emphasis>any</emphasis> context, interestingly enough.
-- </para>
-- </sect1>
--
-- <sect1 id="sparc">
-- <title>The Fucked Up Sparc</title>
-+ <sect1 id="dont-sleep">
-+ <title>Some Functions Which Don't Sleep</title>
-
- <para>
-- Alan Cox says <quote>the irq disable/enable is in the register
-- window on a sparc</quote>. Andi Kleen says <quote>when you do
-- restore_flags in a different function you mess up all the
-- register windows</quote>.
-- </para>
--
-- <para>
-- So never pass the flags word set by
-- <function>spin_lock_irqsave()</function> and brethren to another
-- function (unless it's declared <type>inline</type>. Usually no-one
-- does this, but now you've been warned. Dave Miller can never do
-- anything in a straightforward manner (I can say that, because I have
-- pictures of him and a certain PowerPC maintainer in a compromising
-- position).
-- </para>
-- </sect1>
--
-- <sect1 id="racing-timers">
-- <title>Racing Timers: A Kernel Pastime</title>
--
-- <para>
-- Timers can produce their own special problems with races.
-- Consider a collection of objects (list, hash, etc) where each
-- object has a timer which is due to destroy it.
-+ Some functions are safe to call from any context, or holding
-+ almost any lock.
- </para>
-
-- <para>
-- If you want to destroy the entire collection (say on module
-- removal), you might do the following:
-- </para>
--
-- <programlisting>
-- /* THIS CODE BAD BAD BAD BAD: IF IT WAS ANY WORSE IT WOULD USE
-- HUNGARIAN NOTATION */
-- spin_lock_bh(&list_lock);
--
-- while (list) {
-- struct foo *next = list->next;
-- del_timer(&list->timer);
-- kfree(list);
-- list = next;
-- }
--
-- spin_unlock_bh(&list_lock);
-- </programlisting>
--
-- <para>
-- Sooner or later, this will crash on SMP, because a timer can
-- have just gone off before the <function>spin_lock_bh()</function>,
-- and it will only get the lock after we
-- <function>spin_unlock_bh()</function>, and then try to free
-- the element (which has already been freed!).
-- </para>
--
-- <para>
-- This can be avoided by checking the result of
-- <function>del_timer()</function>: if it returns
-- <returnvalue>1</returnvalue>, the timer has been deleted.
-- If <returnvalue>0</returnvalue>, it means (in this
-- case) that it is currently running, so we can do:
-- </para>
--
-- <programlisting>
-- retry:
-- spin_lock_bh(&list_lock);
--
-- while (list) {
-- struct foo *next = list->next;
-- if (!del_timer(&list->timer)) {
-- /* Give timer a chance to delete this */
-- spin_unlock_bh(&list_lock);
-- goto retry;
-- }
-- kfree(list);
-- list = next;
-- }
--
-- spin_unlock_bh(&list_lock);
-- </programlisting>
--
-- <para>
-- Another common problem is deleting timers which restart
-- themselves (by calling <function>add_timer()</function> at the end
-- of their timer function). Because this is a fairly common case
-- which is prone to races, you should use <function>del_timer_sync()</function>
-- (<filename class=headerfile>include/linux/timer.h</filename>)
-- to handle this case. It returns the number of times the timer
-- had to be deleted before we finally stopped it from adding itself back
-- in.
-- </para>
-+ <itemizedlist>
-+ <listitem>
-+ <para>
-+ <function>printk()</function>
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+ <function>kfree()</function>
-+ </para>
-+ </listitem>
-+ <listitem>
-+ <para>
-+ <function>add_timer()</function> and <function>del_timer()</function>
-+ </para>
-+ </listitem>
-+ </itemizedlist>
- </sect1>
- </chapter>
-
-@@ -1101,8 +1952,9 @@
-
- <para>
- Thanks to Martin Pool, Philipp Rumpf, Stephen Rothwell, Paul
-- Mackerras, Ruedi Aschwanden, Alan Cox, Manfred Spraul and Tim
-- Waugh for proofreading, correcting, flaming, commenting.
-+ Mackerras, Ruedi Aschwanden, Alan Cox, Manfred Spraul, Tim
-+ Waugh, Pete Zaitcev, James Morris, Robert Love, Paul McKenney,
-+ John Ashby for proofreading, correcting, flaming, commenting.
- </para>
-
- <para>
-@@ -1113,12 +1965,27 @@
- <glossary id="glossary">
- <title>Glossary</title>
-
-+ <glossentry id="gloss-preemption">
-+ <glossterm>preemption</glossterm>
-+ <glossdef>
-+ <para>
-+ Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is
-+ unset, processes in user context inside the kernel would not
-+ preempt each other (ie. you had that CPU until you have it up,
-+ except for interrupts). With the addition of
-+ <symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when
-+ in user context, higher priority tasks can "cut in": spinlocks
-+ were changed to disable preemption, even on UP.
-+ </para>
-+ </glossdef>
-+ </glossentry>
-+
- <glossentry id="gloss-bh">
- <glossterm>bh</glossterm>
- <glossdef>
- <para>
- Bottom Half: for historical reasons, functions with
-- `_bh' in them often now refer to any software interrupt, e.g.
-+ '_bh' in them often now refer to any software interrupt, e.g.
- <function>spin_lock_bh()</function> blocks any software interrupt
- on the current CPU. Bottom halves are deprecated, and will
- eventually be replaced by tasklets. Only one bottom half will be
-@@ -1132,8 +1999,7 @@
- <glossdef>
- <para>
- Hardware interrupt request. <function>in_irq()</function> returns
-- <returnvalue>true</returnvalue> in a hardware interrupt handler (it
-- also returns true when interrupts are blocked).
-+ <returnvalue>true</returnvalue> in a hardware interrupt handler.
- </para>
- </glossdef>
- </glossentry>
-@@ -1144,8 +2010,7 @@
- <para>
- Not user context: processing a hardware irq or software irq.
- Indicated by the <function>in_interrupt()</function> macro
-- returning <returnvalue>true</returnvalue> (although it also
-- returns true when interrupts or BHs are blocked).
-+ returning <returnvalue>true</returnvalue>.
- </para>
- </glossdef>
- </glossentry>
-@@ -1161,35 +2026,40 @@
- </glossentry>
-
- <glossentry id="gloss-softirq">
-- <glossterm>softirq</glossterm>
-+ <glossterm>Software Interrupt / softirq</glossterm>
- <glossdef>
- <para>
-- Strictly speaking, one of up to 32 enumerated software
-+ Software interrupt handler. <function>in_irq()</function> returns
-+ <returnvalue>false</returnvalue>; <function>in_softirq()</function>
-+ returns <returnvalue>true</returnvalue>. Tasklets and softirqs
-+ both fall into the category of 'software interrupts'.
-+ </para>
-+ <para>
-+ Strictly speaking a softirq is one of up to 32 enumerated software
- interrupts which can run on multiple CPUs at once.
-- Sometimes used to refer to tasklets and bottom halves as
-+ Sometimes used to refer to tasklets as
- well (ie. all software interrupts).
- </para>
- </glossdef>
- </glossentry>
-
-- <glossentry id="gloss-swinterrupt">
-- <glossterm>Software Interrupt / Software IRQ</glossterm>
-+ <glossentry id="gloss-tasklet">
-+ <glossterm>tasklet</glossterm>
- <glossdef>
- <para>
-- Software interrupt handler. <function>in_irq()</function> returns
-- <returnvalue>false</returnvalue>; <function>in_softirq()</function>
-- returns <returnvalue>true</returnvalue>. Tasklets, softirqs and
-- bottom halves all fall into the category of `software interrupts'.
-+ A dynamically-registrable software interrupt,
-+ which is guaranteed to only run on one CPU at a time.
- </para>
- </glossdef>
- </glossentry>
-
-- <glossentry id="gloss-tasklet">
-- <glossterm>tasklet</glossterm>
-+ <glossentry id="gloss-timers">
-+ <glossterm>timer</glossterm>
- <glossdef>
- <para>
-- A dynamically-registrable software interrupt,
-- which is guaranteed to only run on one CPU at a time.
-+ A dynamically-registrable software interrupt, which is run at
-+ (or close to) a given time. When running, it is just like a
-+ tasklet (in fact, they are called from the TIMER_SOFTIRQ).
- </para>
- </glossdef>
- </glossentry>
-@@ -1207,10 +2077,11 @@
- <glossterm>User Context</glossterm>
- <glossdef>
- <para>
-- The kernel executing on behalf of a particular
-- process or kernel thread (given by the <function>current()</function>
-- macro.) Not to be confused with userspace. Can be interrupted by
-- software or hardware interrupts.
-+ The kernel executing on behalf of a particular process (ie. a
-+ system call or trap) or kernel thread. You can tell which
-+ process with the <symbol>current</symbol> macro.) Not to
-+ be confused with userspace. Can be interrupted by software or
-+ hardware interrupts.
- </para>
- </glossdef>
- </glossentry>
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/dvb/cards.txt 2003-12-28 23:22:41.000000000 -0800
-@@ -0,0 +1,63 @@
-+Hardware supported by the linuxtv.org DVB drivers
-+=================================================
-+
-+ Generally, the DVB hardware manufacturers frequently change the
-+ frontends (i.e. tuner / demodulator units) used, usually without
-+ changing the product name, revision number or specs. Some cards
-+ are also available in versions with different frontends for
-+ DVB-S/DVB-C/DVB-T. Thus the frontend drivers are listed seperately.
-+
-+ Note 1: There is no guarantee that every frontend driver works
-+ out-of-the box with every card, because of different wiring.
-+
-+ Note 2: The demodulator chips can be used with a variety of
-+ tuner/PLL chips, and not all combinations are supported. Often
-+ the demodulator and tuner/PLL chip are inside a metal box for
-+ shielding, and the whole metal box has its own part number.
-+
-+
-+o Frontends drivers:
-+ - dvb_dummy_fe: for testing...
-+ DVB-S:
-+ - alps_bsrv2 : Alps BSRV2 (ves1893 demodulator)
-+ - cx24110 : Conexant HM1221/HM1811 (cx24110 or cx24106 demod, cx24108 PLL)
-+ - grundig_29504-491 : Grundig 29504-491 (Philips TDA8083 demodulator), tsa5522 PLL
-+ - mt312 : Zarlink mt312 or Mitel vp310 demodulator, sl1935 or tsa5059 PLL
-+ - stv0299 : Alps BSRU6 (tsa5059 PLL), LG TDQB-S00x (tsa5059 PLL),
-+ LG TDQF-S001F (sl1935 PLL), Philips SU1278 (tua6100 PLL),
-+ Philips SU1278SH (tsa5059 PLL)
-+ DVB-C:
-+ - ves1820 : various (ves1820 demodulator, sp5659c or spXXXX PLL)
-+ - at76c651 : Atmel AT76c651(B) with DAT7021 PLL
-+ DVB-T:
-+ - alps_tdlb7 : Alps TDLB7 (sp8870 demodulator, sp5659 PLL)
-+ - alps_tdmb7 : Alps TDMB7 (cx22700 demodulator)
-+ - grundig_29504-401 : Grundig 29504-401 (LSI L64781 demodulator), tsa5060 PLL
-+ - tda1004x : Philips tda10045h (td1344 or tdm1316l PLL)
-+ - nxt6000 : Alps TDME7 (MITEL SP5659 PLL), Alps TDED4 (TI ALP510 PLL),
-+ Comtech DVBT-6k07 (SP5730 PLL)
-+ (NxtWave Communications NXT6000 demodulator)
-+
-+
-+o Cards based on the Phillips saa7146 multimedia PCI bridge chip:
-+ - TI AV7110 based cards (i.e. with hardware MPEG decoder):
-+ - Siemens/Technotrend/Hauppauge PCI DVB card revision 1.1, 1.3, 1.5, 1.6, 2.1
-+ (aka Hauppauge Nexus)
-+ - "budget" cards (i.e. without hardware MPEG decoder):
-+ - Technotrend Budget / Hauppauge WinTV-Nova PCI Cards
-+ - SATELCO Multimedia PCI
-+ - KNC1 DVB-S
-+
-+o Cards based on the B2C2 Inc. FlexCopII:
-+ - Technisat SkyStar2 PCI DVB
-+
-+o Cards based on the Conexant Bt8xx PCI bridge:
-+ - Pinnacle PCTV Sat DVB
-+ - Nebula Electronics DigiTV
-+
-+o Technotrend / Hauppauge DVB USB devices:
-+ - Nova USB
-+ - DEC 2000-T
-+
-+o Preliminary support for the analog module of the Siemens DVB-C PCI card
-+
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/dvb/contributors.txt 2003-12-28 23:22:41.000000000 -0800
-@@ -0,0 +1,54 @@
-+Thanks go to the following people for patches and contributions:
-+
-+Michael Hunold <m.hunold@gmx.de>
-+ for the initial saa7146 driver and it's recent overhaul
-+
-+Christian Theiss
-+ for his work on the initial Linux DVB driver
-+
-+Marcus Metzler <mocm@metzlerbros.de>
-+Ralph Metzler <rjkm@metzlerbros.de>
-+ for their contining work on the DVB driver
-+
-+Michael Holzt <kju@debian.org>
-+ for his contributions to the dvb-net driver
-+
-+Diego Picciani <d.picciani@novacomp.it>
-+ for CyberLogin for Linux which allows logging onto EON
-+ (in case you are wondering where CyberLogin is, EON changed its login
-+ procedure and CyberLogin is no longer used.)
-+
-+Martin Schaller <martin@smurf.franken.de>
-+ for patching the cable card decoder driver
-+
-+Klaus Schmidinger <Klaus.Schmidinger@cadsoft.de>
-+ for various fixes regarding tuning, OSD and CI stuff and his work on VDR
-+
-+Steve Brown <sbrown@cortland.com>
-+ for his AFC kernel thread
-+
-+Christoph Martin <martin@uni-mainz.de>
-+ for his LIRC infrared handler
-+
-+Andreas Oberritter <andreas@oberritter.de>
-+Florian Schirmer <jolt@tuxbox.org>
-+...and all the other dBox2 people
-+ for many bugfixes in the generic DVB Core and their work on the
-+ dBox2 port of the DVB driver
-+
-+Oliver Endriss <o.endriss@gmx.de>
-+ for many bugfixes
-+
-+Andrew de Quincey <adq_dvb@lidskialf.net>
-+ for the tda1004x frontend driver, and various bugfixes
-+
-+Peter Schildmann <peter.schildmann@web.de>
-+ for the driver for the Technisat SkyStar2 PCI DVB card
-+
-+Vadim Catana <skystar@moldova.cc>
-+Roberto Ragusa <r.ragusa@libero.it>
-+Augusto Cardoso <augusto@carhil.net>
-+ for all the work for the FlexCopII chipset by B2C2,Inc.
-+
-+(If you think you should be in this list, but you are not, drop a
-+ line to the DVB mailing list)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/dvb/faq.txt 2003-12-28 23:22:41.000000000 -0800
-@@ -0,0 +1,109 @@
-+Some very frequently asked questions about linuxtv-dvb
-+
-+1. The signal seems to die a few seconds after tuning.
-+
-+ It's not a bug, it's a feature. Because the frontends have
-+ significant power requirements (and hence get very hot), they
-+ are powered down if they are unused (i.e. if the frontend device
-+ is closed). The dvb-core.o module paramter "dvb_shutdown_timeout"
-+ allow you to change the timeout (default 5 seconds). Setting the
-+ timeout to 0 disables the timeout feature.
-+
-+2. How can I watch TV?
-+
-+ The driver distribution includes some simple utilities which
-+ are mainly intended for testing and to demonstrate how the
-+ DVB API works.
-+
-+ Depending on whether you have a DVB-S, DVB-C or DVB-T card, use
-+ apps/szap/szap, czap or tzap. You must supply a channel list
-+ in ~/.[sct]zap/channels.conf. If you are lucky you can just copy
-+ one of the supplied channel lists, or you can create a new one
-+ by running apps/scan/scan. If you run scan on an unknown network
-+ you might have to supply some start data in apps/scan/initial.h.
-+
-+ If you have a card with a built-in hardware MPEG-decoder the
-+ drivers create a video4linux device (/dev/v4l/video0) which
-+ you can use to watch TV with any v4l application. xawtv is known
-+ to work. Note that you cannot change channels with xawtv, you
-+ have to zap using [sct]zap. If you want a nice application for
-+ TV watching and record/playback, have a look at VDR.
-+
-+ If your card does not have a hardware MPEG decoder you need
-+ a software MPEG decoder. Mplayer or xine are known to work.
-+ Newsflash: MythTV also has DVB support now.
-+ Note: Only very recent versions of Mplayer and xine can decode.
-+ MPEG2 transport streams (TS) directly. Then, run
-+ '[sct]zap channelname -r' in one xterm, and keep it running,
-+ and start 'mplayer - < /dev/dvb/adapter0/dvr0' or
-+ 'xine stdin://mpeg2 < /dev/dvb/adapter0/dvr0' in a second xterm.
-+ That's all far from perfect, but it seems no one has written
-+ a nice DVB application which includes a builtin software MPEG
-+ decoder yet.
-+
-+ Newsflash: Newest xine directly supports DVB. Just copy your
-+ channels.conf to ~/.xine and start 'xine dvb://', or select
-+ the DVB button in the xine GUI. Channel switching works using the
-+ numpad pgup/pgdown (NP9 / NP3) keys to scroll through the channel osd
-+ menu and pressing numpad-enter to switch to the selected channel.
-+
-+ Note: Older versions of xine and mplayer understand MPEG program
-+ streams (PS) only, and can be used in conjunction with the
-+ ts2ps tool from the Metzler Brother's dvb-mpegtools package.
-+
-+3. Which other DVB applications exist?
-+
-+ http://www.cadsoft.de/people/kls/vdr/
-+ Klaus Schmidinger's Video Disk Recorder
-+
-+ http://www.metzlerbros.org/dvb/
-+ Metzler Bros. DVB development; alternate drivers and
-+ DVB utilities, include dvb-mpegtools and tuxzap.
-+
-+ http://www.linuxstb.org/
-+ http://sourceforge.net/projects/dvbtools/
-+ Dave Chapman's dvbtools package, including
-+ dvbstream and dvbtune
-+
-+ http://www.linuxdvb.tv/
-+ Henning Holtschneider's site with many interesting
-+ links and docs
-+
-+ http://www.dbox2.info/
-+ LinuxDVB on the dBox2
-+
-+ http://www.tuxbox.org/
-+ http://cvs.tuxbox.org/
-+ the TuxBox CVS many interesting DVB applications and the dBox2
-+ DVB source
-+
-+ http://sourceforge.net/projects/dvbsak/
-+ DVB Swiss Army Knife library and utilities
-+
-+ http://www.nenie.org/misc/mpsys/
-+ MPSYS: a MPEG2 system library and tools
-+
-+ http://mplayerhq.hu/
-+ mplayer
-+
-+ http://xine.sourceforge.net/
-+ http://xinehq.de/
-+ xine
-+
-+ http://www.mythtv.org/
-+ MythTV - analog TV PVR, but now with DVB support, too
-+ (with software MPEG decode)
-+
-+4. Can't get a signal tuned correctly
-+
-+ If you are using a Technotrend/Hauppauge DVB-C card *without* analog
-+ module, you might have to use module parameter adac=-1 (dvb-ttpci.o).
-+
-+5. The dvb_net device doesn't give me any multicast packets
-+
-+ Check your routes if they include the multicast address range.
-+ Additionally make sure that "source validation by reversed path
-+ lookup" is disabled:
-+ $ "echo 0 > /proc/sys/net/ipv4/conf/dvb0/rp_filter"
-+
-+eof
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/dvb/firmware.txt 2003-12-28 23:22:41.000000000 -0800
-@@ -0,0 +1,116 @@
-+Some DVB cards and many newer frontends require proprietary,
-+binary-only firmware.
-+
-+The DVB drivers will be converted to use the request_firmware()
-+hotplug interface (see linux/Documentation/firmware_class/).
-+(CONFIG_FW_LOADER)
-+
-+The firmware can be loaded automatically via the hotplug manager
-+or manually with the steps described below.
-+
-+Currently the drivers still use various different methods
-+to load their firmwares, so here's just a short list of the
-+current state:
-+
-+- dvb-ttpci: driver uses firmware hotplug interface
-+- ttusb-budget: firmware is compiled in (dvb-ttusb-dspbootcode.h)
-+- sp887x: firmware is compiled in (sp887x_firm.h)
-+- alps_tdlb7: firmware is loaded from path specified by
-+ "mcfile" module parameter; the binary must be
-+ extracted from the Windows driver (Sc_main.mc).
-+- tda1004x: firmware is loaded from path specified in
-+ DVB_TDA1004X_FIRMWARE_FILE kernel config
-+ variable (default /etc/dvb/tda1004x.bin); the
-+ firmware binary must be extracted from the windows
-+ driver
-+- ttusb-dec: see "ttusb-dec.txt" for details
-+
-+1) Automatic firmware loading
-+
-+You need to install recent hotplug scripts if your distribution did not do it
-+for you already, especially the /etc/hotplug/firmware.agent.
-+http://linux-hotplug.sourceforge.net/ (Call /sbin/hotplug without arguments
-+to find out if the firmware agent is installed.)
-+
-+The firmware.agent script expects firmware binaries in
-+/usr/lib/hotplug/firmware/. To avoid naming and versioning
-+conflicts we propose the following naming scheme:
-+
-+ /usr/lib/hotplug/firmware/dvb-{driver}-{ver}.fw for MPEG decoders etc.
-+ /usr/lib/hotplug/firmware/dvb-fe-{driver}-{ver}.fw for frontends
-+
-+ {driver} name is the basename of the driver kernel module (e.g. dvb-ttpci)
-+ {ver} is a version number/name that should change only when the
-+ driver/firmware internal API changes (so users are free to install the
-+ latest firmware compatible with the driver).
-+
-+2) Manually loading the firmware into a driver
-+ (currently only the dvb-ttpci / av7110 driver supports this)
-+
-+Step a) Mount sysfs-filesystem.
-+
-+Sysfs provides a means to export kernel data structures, their attributes,
-+and the linkages between them to userspace.
-+
-+For detailed informations have a look at Documentation/filesystems/sysfs.txt
-+All you need to know at the moment is that firmware loading only works through
-+sysfs.
-+
-+> mkdir /sys
-+> mount -t sysfs sysfs /sys
-+
-+Step b) Exploring the firmware loading facilities
-+
-+Firmware_class support is located in
-+/sys/class/firmware
-+
-+> dir /sys/class/firmware
-+
-+The "timeout" values specifies the amount of time that is waited before the
-+firmware upload process is cancelled. The default values is 10 seconds. If
-+you use a hotplug script for the firmware upload, this is sufficient. If
-+you want to upload the firmware by hand, however, this might be too fast.
-+
-+> echo "180" > /sys/class/firmware/timeout
-+
-+Step c) Getting a usable firmware file for the dvb-ttpci driver/av7110 card.
-+
-+You can download the firmware files from
-+http://www.linuxtv.org/download/dvb/
-+
-+Please note that in case of the dvb-ttpci driver this is *not* the "Root"
-+file you probably know from the 2.4 DVB releases driver.
-+
-+> wget http://www.linuxtv.org/download/dvb/dvb-ttpci-01.fw
-+gets you the version 01 of the firmware fot the ttpci driver.
-+
-+Step d) Loading the dvb-ttpci driver and loading the firmware
-+
-+"modprobe" will take care that every needed module will be loaded
-+automatically (except the frontend driver)
-+
-+> modprobe dvb-ttpci
-+
-+The "modprobe" process will hang until
-+a) you upload the firmware or
-+b) the timeout occurs.
-+
-+Change to another terminal and have a look at
-+
-+> dir /sys/class/firmware/
-+
-+total 0
-+drwxr-xr-x 2 root root 0 Jul 29 11:00 0000:03:05.0
-+-rw-r--r-- 1 root root 0 Jul 29 10:41 timeout
-+
-+"0000:03:05.0" is the id for my dvb-c card. It depends on the pci slot,
-+so it changes if you plug the card to different slots.
-+
-+You can upload the firmware like that:
-+
-+> export DEVDIR=/sys/class/firmware/0000\:03\:05.0
-+> echo 1 > $DEVDIR/loading
-+> cat dvb-ttpci-01.fw > $DEVDIR/data
-+> echo 0 > $DEVDIR/loading
-+
-+That's it. The driver should be up and running now.
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/dvb/readme.txt 2003-12-28 23:22:41.000000000 -0800
-@@ -0,0 +1,39 @@
-+Linux Digital Video Broadcast (DVB) subsystem
-+=============================================
-+
-+The main development site and CVS repository for these
-+drivers is http://linuxtv.org/.
-+
-+The developer mailing list linux-dvb is also hosted there,
-+see http://linuxtv.org/mailinglists.xml. Please check
-+the archive http://linuxtv.org/mailinglists/linux-dvb/
-+before asking newbie questions on the list.
-+
-+API documentation, utilities and test/example programs
-+are available as part of the old driver package for Linux 2.4
-+(linuxtv-dvb-1.0.x.tar.gz), or from CVS (module DVB).
-+We plan to split this into separate packages, but it's not
-+been done yet.
-+
-+http://linuxtv.org/download/dvb/
-+
-+What's inside this directory:
-+
-+"cards.txt"
-+contains a list of supported hardware.
-+
-+"contributors.txt"
-+is the who-is-who of DVB development
-+
-+"faq.txt"
-+contains frequently asked questions and their answers.
-+
-+"firmware.txt"
-+contains informations for required external firmware
-+files and where to get them.
-+
-+"ttusb-dec.txt"
-+contains detailed informations about the
-+TT DEC2000/DEC3000 USB DVB hardware.
-+
-+Good luck and have fun!
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/dvb/ttusb-dec.txt 2003-12-28 23:22:41.000000000 -0800
-@@ -0,0 +1,52 @@
-+TechnoTrend/Hauppauge DEC USB Driver
-+====================================
-+
-+Driver Status
-+-------------
-+
-+Supported:
-+ DEC2000-t
-+ Linux Kernels 2.4 and 2.6
-+ Video Streaming
-+ Audio Streaming
-+ Channel Zapping
-+ Hotplug firmware loader under 2.6 kernels
-+
-+In Progress:
-+ DEC3000-s
-+
-+To Do:
-+ Section data
-+ Teletext streams
-+ Tuner status information
-+ DVB network interface
-+ Streaming video PC->DEC
-+
-+Note: Since section data can not be retreived yet, scan apps will not work.
-+
-+Getting the Firmware
-+--------------------
-+Currently, the driver only works with v2.15a of the firmware. The firmwares
-+can be obtained in this way:
-+
-+wget http://hauppauge.lightpath.net/de/dec215a.exe
-+unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
-+unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_S.bin
-+
-+
-+Compilation Notes for 2.4 kernels
-+---------------------------------
-+For 2.4 kernels the firmware for the DECs is compiled into the driver itself.
-+The firmwares are expected to be in /etc/dvb at compilation time.
-+
-+mv STB_PC_T.bin /etc/dvb/dec2000t.bin
-+mv STB_PC_S.bin /etc/dvb/dec3000s.bin
-+
-+
-+Hotplug Firmware Loading for 2.6 kernels
-+----------------------------------------
-+For 2.6 kernels the firmware is loaded at the point that the driver module is
-+loaded. See linux/Documentation/dvb/FIRMWARE for more information.
-+
-+mv STB_PC_T.bin /usr/lib/hotplug/firmware/dec2000t.bin
-+mv STB_PC_S.bin /usr/lib/hotplug/firmware/dec3000s.bin
---- linux-2.6.0/Documentation/fb/aty128fb.txt 2003-06-14 12:17:56.000000000 -0700
-+++ 25/Documentation/fb/aty128fb.txt 2003-12-28 23:23:06.000000000 -0800
-@@ -32,7 +32,7 @@ resolutions.
- You should compile in both vgacon (to boot if you remove your Rage128 from
- box) and aty128fb (for graphics mode). You should not compile-in vesafb
- unless you have primary display on non-Rage128 VBE2.0 device (see
--Documentation/vesafb.txt for details).
-+Documentation/fb/vesafb.txt for details).
-
-
- X11
---- linux-2.6.0/Documentation/fb/matroxfb.txt 2003-06-14 12:18:30.000000000 -0700
-+++ 25/Documentation/fb/matroxfb.txt 2003-12-28 23:23:06.000000000 -0800
-@@ -31,7 +31,7 @@ pass to the kernel this command line: "v
- You should compile in both vgacon (to boot if you remove you Matrox from
- box) and matroxfb (for graphics mode). You should not compile-in vesafb
- unless you have primary display on non-Matrox VBE2.0 device (see
--Documentation/vesafb.txt for details).
-+Documentation/fb/vesafb.txt for details).
-
- Currently supported video modes are (through vesa:... interface, PowerMac
- has [as addon] compatibility code):
---- linux-2.6.0/Documentation/filesystems/Locking 2003-08-22 19:23:39.000000000 -0700
-+++ 25/Documentation/filesystems/Locking 2003-12-28 23:22:12.000000000 -0800
-@@ -420,7 +420,7 @@ transfer: no
- prototypes:
- void (*open)(struct vm_area_struct*);
- void (*close)(struct vm_area_struct*);
-- struct page *(*nopage)(struct vm_area_struct*, unsigned long, int);
-+ struct page *(*nopage)(struct vm_area_struct*, unsigned long, int *);
-
- locking rules:
- BKL mmap_sem
---- linux-2.6.0/Documentation/filesystems/proc.txt 2003-11-09 16:45:05.000000000 -0800
-+++ 25/Documentation/filesystems/proc.txt 2003-12-28 23:26:39.000000000 -0800
-@@ -900,6 +900,15 @@ super-nr shows the number of currently a
- Every mounted file system needs a super block, so if you plan to mount lots of
- file systems, you may want to increase these numbers.
-
-+aio-nr and aio-max-nr
-+---------------------
-+
-+aio-nr is the running total of the number of events specified on the
-+io_setup system call for all currently active aio contexts. If aio-nr
-+reaches aio-max-nr then io_setup will fail with EAGAIN. Note that
-+raising aio-max-nr does not result in the pre-allocation or re-sizing
-+of any kernel data structures.
-+
- 2.2 /proc/sys/fs/binfmt_misc - Miscellaneous binary formats
- -----------------------------------------------------------
-
---- linux-2.6.0/Documentation/filesystems/xfs.txt 2003-10-17 15:58:03.000000000 -0700
-+++ 25/Documentation/filesystems/xfs.txt 2003-12-28 23:22:28.000000000 -0800
-@@ -29,10 +29,11 @@ When mounting an XFS filesystem, the fol
- The preferred buffered I/O size can also be altered on an
- individual file basis using the ioctl(2) system call.
-
-- ikeep
-+ ikeep/noikeep
- When inode clusters are emptied of inodes, keep them around
-- on the disk, this is the old XFS behavior. Default is now to
-- return the inode cluster to the free space pool.
-+ on the disk (ikeep) - this is the traditional XFS behaviour
-+ and is still the default for now. Using the noikeep option,
-+ inode clusters are returned to the free space pool.
-
- logbufs=value
- Set the number of in-memory log buffers. Valid numbers range
-@@ -75,6 +76,10 @@ When mounting an XFS filesystem, the fol
- Filesystems mounted "norecovery" must be mounted read-only or
- the mount will fail.
-
-+ nouuid
-+ Don't check for double mounted file systems using the file system uuid.
-+ This is useful to mount LVM snapshot volumes.
-+
- osyncisosync
- Make O_SYNC writes implement true O_SYNC. WITHOUT this option,
- Linux XFS behaves as if an "osyncisdsync" option is used,
-@@ -108,10 +113,6 @@ When mounting an XFS filesystem, the fol
- The "swidth" option is required if the "sunit" option has been
- specified, and must be a multiple of the "sunit" value.
-
-- nouuid
-- Don't check for double mounted file systems using the file system uuid.
-- This is useful to mount LVM snapshot volumes.
--
- sysctls
- =======
-
-@@ -139,14 +140,14 @@ The following sysctls are available for
- Causes certain error conditions to call BUG(). Value is a bitmask;
- AND together the tags which represent errors which should cause panics:
-
-- XFS_NO_PTAG 0LL
-- XFS_PTAG_IFLUSH 0x0000000000000001LL
-- XFS_PTAG_LOGRES 0x0000000000000002LL
-- XFS_PTAG_AILDELETE 0x0000000000000004LL
-- XFS_PTAG_ERROR_REPORT 0x0000000000000008LL
-- XFS_PTAG_SHUTDOWN_CORRUPT 0x0000000000000010LL
-- XFS_PTAG_SHUTDOWN_IOERROR 0x0000000000000020LL
-- XFS_PTAG_SHUTDOWN_LOGERROR 0x0000000000000040LL
-+ XFS_NO_PTAG 0
-+ XFS_PTAG_IFLUSH 0x00000001
-+ XFS_PTAG_LOGRES 0x00000002
-+ XFS_PTAG_AILDELETE 0x00000004
-+ XFS_PTAG_ERROR_REPORT 0x00000008
-+ XFS_PTAG_SHUTDOWN_CORRUPT 0x00000010
-+ XFS_PTAG_SHUTDOWN_IOERROR 0x00000020
-+ XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040
-
- This option is intended for debugging only.
-
-@@ -165,6 +166,21 @@ The following sysctls are available for
- Controls whether unprivileged users can use chown to "give away"
- a file to another user.
-
-+ fs.xfs.inherit_sync (Min: 0 Default: 1 Max 1)
-+ Setting this to "1" will cause the "sync" flag set
-+ by the chattr(1) command on a directory to be
-+ inherited by files in that directory.
-+
-+ fs.xfs.inherit_nodump (Min: 0 Default: 1 Max 1)
-+ Setting this to "1" will cause the "nodump" flag set
-+ by the chattr(1) command on a directory to be
-+ inherited by files in that directory.
-+
-+ fs.xfs.inherit_noatime (Min: 0 Default: 1 Max 1)
-+ Setting this to "1" will cause the "noatime" flag set
-+ by the chattr(1) command on a directory to be
-+ inherited by files in that directory.
-+
- vm.pagebuf.stats_clear (Min: 0 Default: 0 Max: 1)
- Setting this to "1" clears accumulated pagebuf statistics
- in /proc/fs/pagebuf/stat. It then immediately reset to "0".
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/andthen 2003-12-28 23:21:06.000000000 -0800
-@@ -0,0 +1,100 @@
-+
-+define set_andthen
-+ set var $thp=0
-+ set var $thp=(struct kgdb_and_then_struct *)&kgdb_data[0]
-+ set var $at_size = (sizeof kgdb_data)/(sizeof *$thp)
-+ set var $at_oc=kgdb_and_then_count
-+ set var $at_cc=$at_oc
-+end
-+
-+define andthen_next
-+ set var $at_cc=$arg0
-+end
-+
-+define andthen
-+ andthen_set_edge
-+ if ($at_cc >= $at_oc)
-+ printf "Outside window. Window size is %d\n",($at_oc-$at_low)
-+ else
-+ printf "%d: ",$at_cc
-+ output *($thp+($at_cc++ % $at_size ))
-+ printf "\n"
-+ end
-+end
-+define andthen_set_edge
-+ set var $at_oc=kgdb_and_then_count
-+ set var $at_low = $at_oc - $at_size
-+ if ($at_low < 0 )
-+ set var $at_low = 0
-+ end
-+ if (( $at_cc > $at_oc) || ($at_cc < $at_low))
-+ printf "Count outside of window, setting count to "
-+ if ($at_cc >= $at_oc)
-+ set var $at_cc = $at_oc
-+ else
-+ set var $at_cc = $at_low
-+ end
-+ printf "%d\n",$at_cc
-+ end
-+end
-+
-+define beforethat
-+ andthen_set_edge
-+ if ($at_cc <= $at_low)
-+ printf "Outside window. Window size is %d\n",($at_oc-$at_low)
-+ else
-+ printf "%d: ",$at_cc-1
-+ output *($thp+(--$at_cc % $at_size ))
-+ printf "\n"
-+ end
-+end
-+
-+document andthen_next
-+ andthen_next <count>
-+ . sets the number of the event to display next. If this event
-+ . is not in the event pool, either andthen or beforethat will
-+ . correct it to the nearest event pool edge. The event pool
-+ . ends at the last event recorded and begins <number of events>
-+ . prior to that. If beforethat is used next, it will display
-+ . event <count> -1.
-+.
-+ andthen commands are: set_andthen, andthen_next, andthen and beforethat
-+end
-+
-+
-+document andthen
-+ andthen
-+. displays the next event in the list. <set_andthen> sets up to display
-+. the oldest saved event first.
-+. <count> (optional) count of the event to display.
-+. note the number of events saved is specified at configure time.
-+. if events are saved between calls to andthen the index will change
-+. but the displayed event will be the next one (unless the event buffer
-+. is overrun).
-+.
-+. andthen commands are: set_andthen, andthen_next, andthen and beforethat
-+end
-+
-+document set_andthen
-+ set_andthen
-+. sets up to use the <andthen> and <beforethat> commands.
-+. if you have defined your own struct, use the above and
-+. then enter the following:
-+. p $thp=(struct kgdb_and_then_structX *)&kgdb_data[0]
-+. where <kgdb_and_then_structX> is the name of your structure.
-+.
-+. andthen commands are: set_andthen, andthen_next, andthen and beforethat
-+end
-+
-+document beforethat
-+ beforethat
-+. displays the next prior event in the list. <set_andthen> sets up to
-+. display the last occuring event first.
-+.
-+. note the number of events saved is specified at configure time.
-+. if events are saved between calls to beforethat the index will change
-+. but the displayed event will be the next one (unless the event buffer
-+. is overrun).
-+.
-+. andthen commands are: set_andthen, andthen_next, andthen and beforethat
-+end
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/debug-nmi.txt 2003-12-28 23:21:06.000000000 -0800
-@@ -0,0 +1,37 @@
-+Subject: Debugging with NMI
-+Date: Mon, 12 Jul 1999 11:28:31 -0500
-+From: David Grothe <dave@gcom.com>
-+Organization: Gcom, Inc
-+To: David Grothe <dave@gcom.com>
-+
-+Kernel hackers:
-+
-+Maybe this is old hat, but it is new to me --
-+
-+On an ISA bus machine, if you short out the A1 and B1 pins of an ISA
-+slot you will generate an NMI to the CPU. This interrupts even a
-+machine that is hung in a loop with interrupts disabled. Used in
-+conjunction with kgdb <
-+ftp://ftp.gcom.com/pub/linux/src/kgdb-2.3.35/kgdb-2.3.35.tgz > you can
-+gain debugger control of a machine that is hung in the kernel! Even
-+without kgdb the kernel will print a stack trace so you can find out
-+where it was hung.
-+
-+The A1/B1 pins are directly opposite one another and the farthest pins
-+towards the bracket end of the ISA bus socket. You can stick a paper
-+clip or multi-meter probe between them to short them out.
-+
-+I had a spare ISA bus to PC104 bus adapter around. The PC104 end of the
-+board consists of two rows of wire wrap pins. So I wired a push button
-+between the A1/B1 pins and now have an ISA board that I can stick into
-+any ISA bus slot for debugger entry.
-+
-+Microsoft has a circuit diagram of a PCI card at
-+http://www.microsoft.com/hwdev/DEBUGGING/DMPSW.HTM. If you want to
-+build one you will have to mail them and ask for the PAL equations.
-+Nobody makes one comercially.
-+
-+[THIS TIP COMES WITH NO WARRANTY WHATSOEVER. It works for me, but if
-+your machine catches fire, it is your problem, not mine.]
-+
-+-- Dave (the kgdb guy)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/gdb-globals.txt 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,71 @@
-+Sender: akale@veritas.com
-+Date: Fri, 23 Jun 2000 19:26:35 +0530
-+From: "Amit S. Kale" <akale@veritas.com>
-+Organization: Veritas Software (India)
-+To: Dave Grothe <dave@gcom.com>, linux-kernel@vger.rutgers.edu
-+CC: David Milburn <dmilburn@wirespeed.com>,
-+ "Edouard G. Parmelan" <Edouard.Parmelan@quadratec.fr>,
-+ ezannoni@cygnus.com, Keith Owens <kaos@ocs.com.au>
-+Subject: Re: Module debugging using kgdb
-+
-+Dave Grothe wrote:
-+>
-+> Amit:
-+>
-+> There is a 2.4.0 version of kgdb on our ftp site:
-+> ftp://ftp.gcom.com/pub/linux/src/kgdb. I mirrored your version of gdb
-+> and loadmodule.sh there.
-+>
-+> Have a look at the README file and see if I go it right. If not, send
-+> me some corrections and I will update it.
-+>
-+> Does your version of gdb solve the global variable problem?
-+
-+Yes.
-+Thanks to Elena Zanoni, gdb (developement version) can now calculate
-+correctly addresses of dynamically loaded object files. I have not been
-+following gdb developement for sometime and am not sure when symbol
-+address calculation fix is going to appear in a gdb stable version.
-+
-+Elena, any idea when the fix will make it to a prebuilt gdb from a
-+redhat release?
-+
-+For the time being I have built a gdb developement version. It can be
-+used for module debugging with loadmodule.sh script.
-+
-+The problem with calculating of module addresses with previous versions
-+of gdb was as follows:
-+gdb did not use base address of a section while calculating address of
-+a symbol in the section in an object file loaded via 'add-symbol-file'.
-+It used address of .text segment instead. Due to this addresses of
-+symbols in .data, .bss etc. (e.g. global variables) were calculated incorrectly.
-+
-+Above mentioned fix allow gdb to use base address of a segment while
-+calculating address of a symbol in it. It adds a parameter '-s' to
-+'add-symbol-file' command for specifying base address of a segment.
-+
-+loadmodule.sh script works as follows.
-+
-+1. Copy a module file to target machine.
-+2. Load the module on the target machine using insmod with -m parameter.
-+insmod produces a module load map which contains base addresses of all
-+sections in the module and addresses of symbols in the module file.
-+3. Find all sections and their base addresses in the module from
-+the module map.
-+4. Generate a script that loads the module file. The script uses
-+'add-symbol-file' and specifies address of text segment followed by
-+addresses of all segments in the module.
-+
-+Here is an example gdb script produced by loadmodule.sh script.
-+
-+add-symbol-file foo 0xd082c060 -s .text.lock 0xd08cbfb5
-+-s .fixup 0xd08cfbdf -s .rodata 0xd08cfde0 -s __ex_table 0xd08e3b38
-+-s .data 0xd08e3d00 -s .bss 0xd08ec8c0 -s __ksymtab 0xd08ee838
-+
-+With this command gdb can calculate addresses of symbols in ANY segment
-+in a module file.
-+
-+Regards.
-+--
-+Amit Kale
-+Veritas Software ( http://www.veritas.com )
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/gdbinit 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,14 @@
-+shell echo -e "\003" >/dev/ttyS0
-+set remotebaud 38400
-+target remote /dev/ttyS0
-+define si
-+stepi
-+printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
-+printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
-+x/i $eip
-+end
-+define ni
-+nexti
-+printf "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n", $eax, $ebx, $ecx, $edx
-+printf "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n", $esi, $edi, $ebp, $esp
-+x/i $eip
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/gdbinit.hw 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,117 @@
-+
-+#Using ia-32 hardware breakpoints.
-+#
-+#4 hardware breakpoints are available in ia-32 processors. These breakpoints
-+#do not need code modification. They are set using debug registers.
-+#
-+#Each hardware breakpoint can be of one of the
-+#three types: execution, write, access.
-+#1. An Execution breakpoint is triggered when code at the breakpoint address is
-+#executed.
-+#2. A write breakpoint ( aka watchpoints ) is triggered when memory location
-+#at the breakpoint address is written.
-+#3. An access breakpoint is triggered when memory location at the breakpoint
-+#address is either read or written.
-+#
-+#As hardware breakpoints are available in limited number, use software
-+#breakpoints ( br command in gdb ) instead of execution hardware breakpoints.
-+#
-+#Length of an access or a write breakpoint defines length of the datatype to
-+#be watched. Length is 1 for char, 2 short , 3 int.
-+#
-+#For placing execution, write and access breakpoints, use commands
-+#hwebrk, hwwbrk, hwabrk
-+#To remove a breakpoint use hwrmbrk command.
-+#
-+#These commands take following types of arguments. For arguments associated
-+#with each command, use help command.
-+#1. breakpointno: 0 to 3
-+#2. length: 1 to 3
-+#3. address: Memory location in hex ( without 0x ) e.g c015e9bc
-+#
-+#Use the command exinfo to find which hardware breakpoint occured.
-+
-+#hwebrk breakpointno address
-+define hwebrk
-+ maintenance packet Y$arg0,0,0,$arg1
-+end
-+document hwebrk
-+ hwebrk <breakpointno> <address>
-+ Places a hardware execution breakpoint
-+ <breakpointno> = 0 - 3
-+ <address> = Hex digits without leading "0x".
-+end
-+
-+#hwwbrk breakpointno length address
-+define hwwbrk
-+ maintenance packet Y$arg0,1,$arg1,$arg2
-+end
-+document hwwbrk
-+ hwwbrk <breakpointno> <length> <address>
-+ Places a hardware write breakpoint
-+ <breakpointno> = 0 - 3
-+ <length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
-+ <address> = Hex digits without leading "0x".
-+end
-+
-+#hwabrk breakpointno length address
-+define hwabrk
-+ maintenance packet Y$arg0,1,$arg1,$arg2
-+end
-+document hwabrk
-+ hwabrk <breakpointno> <length> <address>
-+ Places a hardware access breakpoint
-+ <breakpointno> = 0 - 3
-+ <length> = 1 (1 byte), 2 (2 byte), 3 (4 byte)
-+ <address> = Hex digits without leading "0x".
-+end
-+
-+#hwrmbrk breakpointno
-+define hwrmbrk
-+ maintenance packet y$arg0
-+end
-+document hwrmbrk
-+ hwrmbrk <breakpointno>
-+ <breakpointno> = 0 - 3
-+ Removes a hardware breakpoint
-+end
-+
-+define reboot
-+ maintenance packet r
-+end
-+#exinfo
-+define exinfo
-+ maintenance packet qE
-+end
-+document exinfo
-+ exinfo
-+ Gives information about a breakpoint.
-+end
-+define get_th
-+ p $th=(struct thread_info *)((int)$esp & ~8191)
-+end
-+document get_th
-+ get_tu
-+ Gets and prints the current thread_info pointer, Defines th to be it.
-+end
-+define get_cu
-+ p $cu=((struct thread_info *)((int)$esp & ~8191))->task
-+end
-+document get_cu
-+ get_cu
-+ Gets and print the "current" value. Defines $cu to be it.
-+end
-+define int_off
-+ set var $flags=$eflags
-+ set $eflags=$eflags&~0x200
-+ end
-+define int_on
-+ set var $eflags|=$flags&0x200
-+ end
-+document int_off
-+ saves the current interrupt state and clears the processor interrupt
-+ flag. Use int_on to restore the saved flag.
-+end
-+document int_on
-+ Restores the interrupt flag saved by int_off.
-+end
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/gdbinit-modules 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,146 @@
-+#
-+# Usefull GDB user-command to debug Linux Kernel Modules with gdbstub.
-+#
-+# This don't work for Linux-2.0 or older.
-+#
-+# Author Edouard G. Parmelan <Edouard.Parmelan@quadratec.fr>
-+#
-+#
-+# Fri Apr 30 20:33:29 CEST 1999
-+# First public release.
-+#
-+# Major cleanup after experiment Linux-2.0 kernel without success.
-+# Symbols of a module are not in the correct order, I can't explain
-+# why :(
-+#
-+# Fri Mar 19 15:41:40 CET 1999
-+# Initial version.
-+#
-+# Thu Jan 6 16:29:03 CST 2000
-+# A little fixing by Dave Grothe <dave@gcom.com>
-+#
-+# Mon Jun 19 09:33:13 CDT 2000
-+# Alignment changes from Edouard Parmelan
-+#
-+# The basic idea is to find where insmod load the module and inform
-+# GDB to load the symbol table of the module with the GDB command
-+# ``add-symbol-file <object> <address>''.
-+#
-+# The Linux kernel holds the list of all loaded modules in module_list,
-+# this list end with &kernel_module (exactly with module->next == NULL,
-+# but the last module is not a real module).
-+#
-+# Insmod allocates the struct module before the object file. Since
-+# Linux-2.1, this structure contain his size. The real address of
-+# the object file is then (char*)module + module->size_of_struct.
-+#
-+# You can use three user functions ``mod-list'', ``mod-print-symbols''
-+# and ``add-module-symbols''.
-+#
-+# mod-list list all loaded modules with the format:
-+# <module-address> <module-name>
-+#
-+# As soon as you have found the address of your module, you can
-+# print its exported symbols (mod-print-symbols) or inform GDB to add
-+# symbols from your module file (mod-add-symbols).
-+#
-+# The argument that you give to mod-print-symbols or mod-add-symbols
-+# is the <module-address> from the mod-list command.
-+#
-+# When using the mod-add-symbols command you must also give the full
-+# pathname of the modules object code file.
-+#
-+# The command mod-add-lis is an example of how to make this easier.
-+# You can edit this macro to contain the path name of your own
-+# favorite module and then use it as a shorthand to load it. You
-+# still need the module-address, however.
-+#
-+# The internal function ``mod-validate'' set the GDB variable $mod
-+# as a ``struct module*'' if the kernel known the module otherwise
-+# $mod is set to NULL. This ensure to not add symbols for a wrong
-+# address.
-+#
-+# Have a nice hacking day !
-+#
-+#
-+define mod-list
-+ set $mod = (struct module*)module_list
-+ # the last module is the kernel, ignore it
-+ while $mod != &kernel_module
-+ printf "%p\t%s\n", (long)$mod, ($mod)->name
-+ set $mod = $mod->next
-+ end
-+end
-+document mod-list
-+List all modules in the form: <module-address> <module-name>
-+Use the <module-address> as the argument for the other
-+mod-commands: mod-print-symbols, mod-add-symbols.
-+end
-+
-+define mod-validate
-+ set $mod = (struct module*)module_list
-+ while ($mod != $arg0) && ($mod != &kernel_module)
-+ set $mod = $mod->next
-+ end
-+ if $mod == &kernel_module
-+ set $mod = 0
-+ printf "%p is not a module\n", $arg0
-+ end
-+end
-+document mod-validate
-+mod-validate <module-address>
-+Internal user-command used to validate the module parameter.
-+If <module> is a real loaded module, set $mod to it otherwise set $mod to 0.
-+end
-+
-+
-+define mod-print-symbols
-+ mod-validate $arg0
-+ if $mod != 0
-+ set $i = 0
-+ while $i < $mod->nsyms
-+ set $sym = $mod->syms[$i]
-+ printf "%p\t%s\n", $sym->value, $sym->name
-+ set $i = $i + 1
-+ end
-+ end
-+end
-+document mod-print-symbols
-+mod-print-symbols <module-address>
-+Print all exported symbols of the module. see mod-list
-+end
-+
-+
-+define mod-add-symbols-align
-+ mod-validate $arg0
-+ if $mod != 0
-+ set $mod_base = ($mod->size_of_struct + (long)$mod)
-+ if ($arg2 != 0) && (($mod_base & ($arg2 - 1)) != 0)
-+ set $mod_base = ($mod_base | ($arg2 - 1)) + 1
-+ end
-+ add-symbol-file $arg1 $mod_base
-+ end
-+end
-+document mod-add-symbols-align
-+mod-add-symbols-align <module-address> <object file path name> <align>
-+Load the symbols table of the module from the object file where
-+first section aligment is <align>.
-+To retreive alignment, use `objdump -h <object file path name>'.
-+end
-+
-+define mod-add-symbols
-+ mod-add-symbols-align $arg0 $arg1 sizeof(long)
-+end
-+document mod-add-symbols
-+mod-add-symbols <module-address> <object file path name>
-+Load the symbols table of the module from the object file.
-+Default alignment is 4. See mod-add-symbols-align.
-+end
-+
-+define mod-add-lis
-+ mod-add-symbols-align $arg0 /usr/src/LiS/streams.o 16
-+end
-+document mod-add-lis
-+mod-add-lis <module-address>
-+Does mod-add-symbols <module-address> /usr/src/LiS/streams.o
-+end
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/kgdbeth.txt 2003-12-28 23:21:09.000000000 -0800
-@@ -0,0 +1,92 @@
-+KGDB over ethernet
-+==================
-+
-+Authors
-+-------
-+
-+Robert Walsh <rjwalsh@durables.org> (2.6 port)
-+wangdi <wangdi@clusterfs.com> (2.6 port)
-+Matt Mackall <mpm@selenic.com> (netpoll api)
-+San Mehat (original 2.4 code)
-+
-+
-+Introduction
-+------------
-+
-+KGDB supports debugging over ethernet (kgdboe) via polling of a given
-+network interface. Most cards should be supported automatically.
-+Debugging facilities are available as soon as the network driver and
-+kgdboe have initialized. Unfortunately, this is too late in the boot
-+process for debugging some issues, but works quite well for many
-+others. This should not interfere with normal network usage and
-+doesn't require a dedicated NIC.
-+
-+Terminology
-+-----------
-+
-+This document uses the following terms:
-+
-+ TARGET: the machine being debugged.
-+ HOST: the machine running gdb.
-+
-+
-+Usage
-+-----
-+
-+You need to use the following command-line option on the TARGET kernel:
-+
-+ kgdboe=[tgt-port]@<tgt-ip>/[dev],[host-port]@<host-ip>/[host-macaddr]
-+
-+ where
-+ tgt-port source for UDP packets (defaults to 6443)
-+ tgt-ip source IP to use (interface address)
-+ dev network interface (eth0)
-+ host-port HOST UDP port (6442) (not really used)
-+ host-ip IP address for HOST machine
-+ host-macaddr ethernet MAC address for HOST (ff:ff:ff:ff:ff:ff)
-+
-+ examples:
-+
-+ kgdboe=7000@192.168.0.1/eth1,7001@192.168.0.2/00:05:3C:04:47:5D
-+ this machine is 192.168.0.1 on eth1
-+ remote machine is 192.168.0.2 with MAC address 00:05:3C:04:47:5D
-+ listen for gdb packets on port 7000
-+ send unsolicited gdb packets to port 7001
-+
-+ kgdboe=@192.168.0.1/,@192.168.0.2/
-+ this machine is 192.168.0.1 on default interface eth0
-+ remote machine is 192.168.0.2, use default broadcast MAC address
-+ listen for gdb packets on default port 6443
-+ send unsolicited gdb packets to port 6442
-+
-+Only packets originating from the configured HOST IP address will be
-+accepted by the debugger.
-+
-+On the HOST side, run gdb as normal and use a remote UDP host as the
-+target:
-+
-+ % gdb ./vmlinux
-+ GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
-+ Copyright 2003 Free Software Foundation, Inc.
-+ GDB is free software, covered by the GNU General Public License, and you are
-+ welcome to change it and/or distribute copies of it under certain conditions.
-+ Type "show copying" to see the conditions.
-+ There is absolutely no warranty for GDB. Type "show warranty" for details.
-+ This GDB was configured as "i386-redhat-linux-gnu"...
-+ (gdb) target remote udp:HOSTNAME:6443
-+
-+You can now continue as if you were debugging over a serial line.
-+
-+Limitations
-+-----------
-+
-+The current release of this code is exclusive of using kgdb on a
-+serial interface, so you must boot without the kgdboe option to use
-+serial debugging. Trying to debug the network driver while using it
-+will prove interesting.
-+
-+Bug reports
-+-----------
-+
-+Send bug reports to Robert Walsh <rjwalsh@durables.org> and Matt
-+Mackall <mpm@selenic.com>.
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/kgdb.txt 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,775 @@
-+Last edit: <20030806.1637.12>
-+This file has information specific to the i386 kgdb option. Other
-+platforms with the kgdb option may behave in a similar fashion.
-+
-+New features:
-+============
-+20030806.1557.37
-+This version was made against the 2.6.0-test2 kernel. We have made the
-+following changes:
-+
-+- The getthread() code in the stub calls find_task_by_pid(). It fails
-+ if we are early in the bring up such that the pid arrays have yet to
-+ be allocated. We have added a line to kernel/pid.c to make
-+ "kgdb_pid_init_done" true once the arrays are allocated. This way the
-+ getthread() code knows not to call. This is only used by the thread
-+ debugging stuff and threads will not yet exist at this point in the
-+ boot.
-+
-+- For some reason, gdb was not asking for a new thread list when the
-+ "info thread" command was given. We changed to the newer version of
-+ the thread info command and gdb now seems to ask when needed. Result,
-+ we now get all threads in the thread list.
-+
-+- We now respond to the ThreadExtraInfo request from gdb with the thread
-+ name from task_struct .comm. This then appears in the thread list.
-+ Thoughts on additional options for this are welcome. Things such as
-+ "has BKL" and "Preempted" come to mind. I think we could have a flag
-+ word that could enable different bits of info here.
-+
-+- We now honor, sort of, the C and S commands. These are continue and
-+ single set after delivering a signal. We ignore the signal and do the
-+ requested action. This only happens when we told gdb that a signal
-+ was the reason for entry, which is only done on memory faults. The
-+ result is that you can now continue into the Oops.
-+
-+- We changed the -g to -gdwarf-2. This seems to be the same as -ggdb,
-+ but it is more exact on what language to use.
-+
-+- We added two dwarf2 include files and a bit of code at the end of
-+ entry.S. This does not yet work, so it is disabled. Still we want to
-+ keep track of the code and "maybe" someone out there can fix it.
-+
-+- Randy Dunlap sent some fix ups for this file which are now merged.
-+
-+- Hugh Dickins sent a fix to a bit of code in traps.c that prevents a
-+ compiler warning if CONFIG_KGDB is off (now who would do that :).
-+
-+- Andrew Morton sent a fix for the serial driver which is now merged.
-+
-+- Andrew also sent a change to the stub around the cpu managment code
-+ which is also merged.
-+
-+- Andrew also sent a patch to make "f" as well as "g" work as SysRq
-+ commands to enter kgdb, merged.
-+
-+- If CONFIG_KGDB and CONFIG_DEBUG_SPINLOCKS are both set we added a
-+ "who" field to the spinlock data struct. This is filled with
-+ "current" when ever the spinlock suceeds. Useful if you want to know
-+ who has the lock.
-+
-+_ And last, but not least, we fixed the "get_cu" macro to properly get
-+ the current value of "current".
-+
-+New features:
-+============
-+20030505.1827.27
-+We are starting to align with the sourceforge version, at least in
-+commands. To this end, the boot command string to start kgdb at
-+boot time has been changed from "kgdb" to "gdb".
-+
-+Andrew Morton sent a couple of patches which are now included as follows:
-+1.) We now return a flag to the interrupt handler.
-+2.) We no longer use smp_num_cpus (a conflict with the lock meter).
-+3.) And from William Lee Irwin III <wli@holomorphy.com> code to make
-+ sure high-mem is set up before we attempt to register our interrupt
-+ handler.
-+We now include asm/kgdb.h from config.h so you will most likely never
-+have to include it. It also 'NULLS' the kgdb macros you might have in
-+your code when CONFIG_KGDB is not defined. This allows you to just
-+turn off CONFIG_KGDB to turn off all the kgdb_ts() calls and such.
-+This include is conditioned on the machine being an x86 so as to not
-+mess with other archs.
-+
-+20020801.1129.03
-+This is currently the version for the 2.4.18 (and beyond?) kernel.
-+
-+We have several new "features" beginning with this version:
-+
-+1.) Kgdb now syncs the "other" CPUs with a cross-CPU NMI. No more
-+ waiting and it will pull that guy out of an IRQ off spin lock :)
-+
-+2.) We doctored up the code that tells where a task is waiting and
-+ included it so that the "info thread" command will show a bit more
-+ than "schedule()". Try it...
-+
-+3.) Added the ability to call a function from gdb. All the standard gdb
-+ issues apply, i.e. if you hit a breakpoint in the function, you are
-+ not allowed to call another (gdb limitation, not kgdb). To help
-+ this capability we added a memory allocation function. Gdb does not
-+ return this memory (it is used for strings that you pass to that function
-+ you are calling from gdb) so we fixed up a way to allow you to
-+ manually return the memory (see below).
-+
-+4.) Kgdb time stamps (kgdb_ts()) are enhanced to expand what was the
-+ interrupt flag to now also include the preemption count and the
-+ "in_interrupt" info. The flag is now called "with_pif" to indicate
-+ the order, preempt_count, in_interrupt, flag. The preempt_count is
-+ shifted left by 4 bits so you can read the count in hex by dropping
-+ the low order digit. In_interrupt is in bit 1, and the flag is in
-+ bit 0.
-+
-+5.) The command: "p kgdb_info" is now expanded and prints something
-+ like:
-+(gdb) p kgdb_info
-+$2 = {used_malloc = 0, called_from = 0xc0107506, entry_tsc = 67468627259,
-+ errcode = 0, vector = 3, print_debug_info = 0, hold_on_sstep = 1,
-+ cpus_waiting = {{task = 0xc027a000, pid = 32768, hold = 0,
-+ regs = 0xc027bf84}, {task = 0x0, pid = 0, hold = 0, regs = 0x0}}}
-+
-+ Things to note here: a.) used_malloc is the amount of memory that
-+ has been malloc'ed to do calls from gdb. You can reclaim this
-+ memory like this: "p kgdb_info.used_malloc=0" Cool, huh? b.)
-+ cpus_waiting is now "sized" by the number of CPUs you enter at
-+ configure time in the kgdb configure section. This is NOT used
-+ anywhere else in the system, but it is "nice" here. c.) The task's
-+ "pid" is now in the structure. This is the pid you will need to use
-+ to decode to the thread id to get gdb to look at that thread.
-+ Remember that the "info thread" command prints a list of threads
-+ wherein it numbers each thread with its reference number followed
-+ by the thread's pid. Note that the per-CPU idle threads actually
-+ have pids of 0 (yes, there is more than one pid 0 in an SMP system).
-+ To avoid confusion, kgdb numbers these threads with numbers beyond
-+ the MAX_PID. That is why you see 32768 and above.
-+
-+6.) A subtle change, we now provide the complete register set for tasks
-+ that are active on the other CPUs. This allows better trace back on
-+ those tasks.
-+
-+ And, let's mention what we could not fix. Back-trace from all but the
-+ thread that we trapped will, most likely, have a bogus entry in it.
-+ The problem is that gdb does not recognize the entry code for
-+ functions that use "current" near (at all?) the entry. The compiler
-+ is putting the "current" decode as the first two instructions of the
-+ function where gdb expects to find %ebp changing code. Back trace
-+ also has trouble with interrupt frames. I am talking with Daniel
-+ Jacobowitz about some way to fix this, but don't hold your breath.
-+
-+20011220.0050.35
-+Major enhancement with this version is the ability to hold one or more
-+CPUs in an SMP system while allowing the others to continue. Also, by
-+default only the current CPU is enabled on single-step commands (please
-+note that gdb issues single-step commands at times other than when you
-+use the si command).
-+
-+Another change is to collect some useful information in
-+a global structure called "kgdb_info". You should be able to just:
-+
-+p kgdb_info
-+
-+although I have seen cases where the first time this is done gdb just
-+prints the first member but prints the whole structure if you then enter
-+CR (carriage return or enter). This also works:
-+
-+p *&kgdb_info
-+
-+Here is a sample:
-+(gdb) p kgdb_info
-+$4 = {called_from = 0xc010732c, entry_tsc = 32804123790856, errcode = 0,
-+ vector = 3, print_debug_info = 0}
-+
-+"Called_from" is the return address from the current entry into kgdb.
-+Sometimes it is useful to know why you are in kgdb, for example, was
-+it an NMI or a real breakpoint? The simple way to interrogate this
-+return address is:
-+
-+l *0xc010732c
-+
-+which will print the surrounding few lines of source code.
-+
-+"Entry_tsc" is the CPU TSC on entry to kgdb (useful to compare to the
-+kgdb_ts entries).
-+
-+"errcode" and "vector" are other entry parameters which may be helpful on
-+some traps.
-+
-+"print_debug_info" is the internal debugging kgdb print enable flag. Yes,
-+you can modify it.
-+
-+In SMP systems kgdb_info also includes the "cpus_waiting" structure and
-+"hold_on_step":
-+
-+(gdb) p kgdb_info
-+$7 = {called_from = 0xc0112739, entry_tsc = 1034936624074, errcode = 0,
-+ vector = 2, print_debug_info = 0, hold_on_sstep = 1, cpus_waiting = {{
-+ task = 0x0, hold = 0, regs = 0x0}, {task = 0xc71b8000, hold = 0,
-+ regs = 0xc71b9f70}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0,
-+ hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0,
-+ hold = 0, regs = 0x0}, {task = 0x0, hold = 0, regs = 0x0}, {task = 0x0,
-+ hold = 0, regs = 0x0}}}
-+
-+"Cpus_waiting" has an entry for each CPU other than the current one that
-+has been stopped. Each entry contains the task_struct address for that
-+CPU, the address of the regs for that task and a hold flag. All these
-+have the proper typing so that, for example:
-+
-+p *kgdb_info.cpus_waiting[1].regs
-+
-+will print the registers for CPU 1.
-+
-+"Hold_on_sstep" is a new feature with this version and comes up set or
-+true. What this means is that whenever kgdb is asked to single-step all
-+other CPUs are held (i.e. not allowed to execute). The flag applies to
-+all but the current CPU and, again, can be changed:
-+
-+p kgdb_info.hold_on_sstep=0
-+
-+restores the old behavior of letting all CPUs run during single-stepping.
-+
-+Likewise, each CPU has a "hold" flag, which if set, locks that CPU out
-+of execution. Note that this has some risk in cases where the CPUs need
-+to communicate with each other. If kgdb finds no CPU available on exit,
-+it will push a message thru gdb and stay in kgdb. Note that it is legal
-+to hold the current CPU as long as at least one CPU can execute.
-+
-+20010621.1117.09
-+This version implements an event queue. Events are signaled by calling
-+a function in the kgdb stub and may be examined from gdb. See EVENTS
-+below for details. This version also tightens up the interrupt and SMP
-+handling to not allow interrupts on the way to kgdb from a breakpoint
-+trap. It is fine to allow these interrupts for user code, but not
-+system debugging.
-+
-+Version
-+=======
-+
-+This version of the kgdb package was developed and tested on
-+kernel version 2.4.16. It will not install on any earlier kernels.
-+It is possible that it will continue to work on later versions
-+of 2.4 and then versions of 2.5 (I hope).
-+
-+
-+Debugging Setup
-+===============
-+
-+Designate one machine as the "development" machine. This is the
-+machine on which you run your compiles and which has your source
-+code for the kernel. Designate a second machine as the "target"
-+machine. This is the machine that will run your experimental
-+kernel.
-+
-+The two machines will be connected together via a serial line out
-+one or the other of the COM ports of the PC. You will need the
-+appropriate modem eliminator (null modem) cable(s) for this.
-+
-+Decide on which tty port you want the machines to communicate, then
-+connect them up back-to-back using the null modem cable. COM1 is
-+/dev/ttyS0 and COM2 is /dev/ttyS1. You should test this connection
-+with the two machines prior to trying to debug a kernel. Once you
-+have it working, on the TARGET machine, enter:
-+
-+setserial /dev/ttyS0 (or what ever tty you are using)
-+
-+and record the port address and the IRQ number.
-+
-+On the DEVELOPMENT machine you need to apply the patch for the kgdb
-+hooks. You have probably already done that if you are reading this
-+file.
-+
-+On your DEVELOPMENT machine, go to your kernel source directory and do
-+"make Xconfig" where X is one of "x", "menu", or "". If you are
-+configuring in the standard serial driver, it must not be a module.
-+Either yes or no is ok, but making the serial driver a module means it
-+will initialize after kgdb has set up the UART interrupt code and may
-+cause a failure of the control-C option discussed below. The configure
-+question for the serial driver is under the "Character devices" heading
-+and is:
-+
-+"Standard/generic (8250/16550 and compatible UARTs) serial support"
-+
-+Go down to the kernel debugging menu item and open it up. Enable the
-+kernel kgdb stub code by selecting that item. You can also choose to
-+turn on the "-ggdb -O1" compile options. The -ggdb causes the compiler
-+to put more debug info (like local symbols) in the object file. On the
-+i386 -g and -ggdb are the same so this option just reduces to "O1". The
-+-O1 reduces the optimization level. This may be helpful in some cases,
-+be aware, however, that this may also mask the problem you are looking
-+for.
-+
-+The baud rate. Default is 115200. What ever you choose be sure that
-+the host machine is set to the same speed. I recommend the default.
-+
-+The port. This is the I/O address of the serial UART that you should
-+have gotten using setserial as described above. The standard COM1 port
-+(3f8) using IRQ 4 is default. COM2 is 2f8 which by convention uses IRQ
-+3.
-+
-+The port IRQ (see above).
-+
-+Stack overflow test. This option makes a minor change in the trap,
-+system call and interrupt code to detect stack overflow and transfer
-+control to kgdb if it happens. (Some platforms have this in the
-+baseline code, but the i386 does not.)
-+
-+You can also configure the system to recognize the boot option
-+"console=kgdb" which if given will cause all console output during
-+booting to be put thru gdb as well as other consoles. This option
-+requires that gdb and kgdb be connected prior to sending console output
-+so, if they are not, a breakpoint is executed to force the connection.
-+This will happen before any kernel output (it is going thru gdb, right),
-+and will stall the boot until the connection is made.
-+
-+You can also configure in a patch to SysRq to enable the kGdb SysRq.
-+This request generates a breakpoint. Since the serial port IRQ line is
-+set up after any serial drivers, it is possible that this command will
-+work when the control-C will not.
-+
-+Save and exit the Xconfig program. Then do "make clean" , "make dep"
-+and "make bzImage" (or whatever target you want to make). This gets the
-+kernel compiled with the "-g" option set -- necessary for debugging.
-+
-+You have just built the kernel on your DEVELOPMENT machine that you
-+intend to run on your TARGET machine.
-+
-+To install this new kernel, use the following installation procedure.
-+Remember, you are on the DEVELOPMENT machine patching the kernel source
-+for the kernel that you intend to run on the TARGET machine.
-+
-+Copy this kernel to your target machine using your usual procedures. I
-+usually arrange to copy development:
-+/usr/src/linux/arch/i386/boot/bzImage to /vmlinuz on the TARGET machine
-+via a LAN based NFS access. That is, I run the cp command on the target
-+and copy from the development machine via the LAN. Run Lilo (see "man
-+lilo" for details on how to set this up) on the new kernel on the target
-+machine so that it will boot! Then boot the kernel on the target
-+machine.
-+
-+On the DEVELOPMENT machine, create a file called .gdbinit in the
-+directory /usr/src/linux. An example .gdbinit file looks like this:
-+
-+shell echo -e "\003" >/dev/ttyS0
-+set remotebaud 38400 (or what ever speed you have chosen)
-+target remote /dev/ttyS0
-+
-+
-+Change the "echo" and "target" definition so that it specifies the tty
-+port that you intend to use. Change the "remotebaud" definition to
-+match the data rate that you are going to use for the com line.
-+
-+You are now ready to try it out.
-+
-+Boot your target machine with "kgdb" in the boot command i.e. something
-+like:
-+
-+lilo> test kgdb
-+
-+or if you also want console output thru gdb:
-+
-+lilo> test kgdb console=kgdb
-+
-+You should see the lilo message saying it has loaded the kernel and then
-+all output stops. The kgdb stub is trying to connect with gdb. Start
-+gdb something like this:
-+
-+
-+On your DEVELOPMENT machine, cd /usr/src/linux and enter "gdb vmlinux".
-+When gdb gets the symbols loaded it will read your .gdbinit file and, if
-+everything is working correctly, you should see gdb print out a few
-+lines indicating that a breakpoint has been taken. It will actually
-+show a line of code in the target kernel inside the kgdb activation
-+code.
-+
-+The gdb interaction should look something like this:
-+
-+ linux-dev:/usr/src/linux# gdb vmlinux
-+ GDB is free software and you are welcome to distribute copies of it
-+ under certain conditions; type "show copying" to see the conditions.
-+ There is absolutely no warranty for GDB; type "show warranty" for details.
-+ GDB 4.15.1 (i486-slackware-linux),
-+ Copyright 1995 Free Software Foundation, Inc...
-+ breakpoint () at i386-stub.c:750
-+ 750 }
-+ (gdb)
-+
-+You can now use whatever gdb commands you like to set breakpoints.
-+Enter "continue" to start your target machine executing again. At this
-+point the target system will run at full speed until it encounters
-+your breakpoint or gets a segment violation in the kernel, or whatever.
-+
-+If you have the kgdb console enabled when you continue, gdb will print
-+out all the console messages.
-+
-+The above example caused a breakpoint relatively early in the boot
-+process. For the i386 kgdb it is possible to code a break instruction
-+as the first C-language point in init/main.c, i.e. as the first instruction
-+in start_kernel(). This could be done as follows:
-+
-+#include <asm/kgdb.h>
-+ breakpoint();
-+
-+This breakpoint() is really a function that sets up the breakpoint and
-+single-step hardware trap cells and then executes a breakpoint. Any
-+early hard coded breakpoint will need to use this function. Once the
-+trap cells are set up they need not be set again, but doing it again
-+does not hurt anything, so you don't need to be concerned about which
-+breakpoint is hit first. Once the trap cells are set up (and the kernel
-+sets them up in due course even if breakpoint() is never called) the
-+macro:
-+
-+BREAKPOINT;
-+
-+will generate an inline breakpoint. This may be more useful as it stops
-+the processor at the instruction instead of in a function a step removed
-+from the location of interest. In either case <asm/kgdb.h> must be
-+included to define both breakpoint() and BREAKPOINT.
-+
-+Triggering kgdbstub at other times
-+==================================
-+
-+Often you don't need to enter the debugger until much later in the boot
-+or even after the machine has been running for some time. Once the
-+kernel is booted and interrupts are on, you can force the system to
-+enter the debugger by sending a control-C to the debug port. This is
-+what the first line of the recommended .gdbinit file does. This allows
-+you to start gdb any time after the system is up as well as when the
-+system is already at a breakpoint. (In the case where the system is
-+already at a breakpoint the control-C is not needed, however, it will
-+be ignored by the target so no harm is done. Also note the the echo
-+command assumes that the port speed is already set. This will be true
-+once gdb has connected, but it is best to set the port speed before you
-+run gdb.)
-+
-+Another simple way to do this is to put the following file in you ~/bin
-+directory:
-+
-+#!/bin/bash
-+echo -e "\003" > /dev/ttyS0
-+
-+Here, the ttyS0 should be replaced with what ever port you are using.
-+The "\003" is control-C. Once you are connected with gdb, you can enter
-+control-C at the command prompt.
-+
-+An alternative way to get control to the debugger is to enable the kGdb
-+SysRq command. Then you would enter Alt-SysRq-g (all three keys at the
-+same time, but push them down in the order given). To refresh your
-+memory of the available SysRq commands try Alt-SysRq-=. Actually any
-+undefined command could replace the "=", but I like to KNOW that what I
-+am pushing will never be defined.
-+
-+Debugging hints
-+===============
-+
-+You can break into the target machine at any time from the development
-+machine by typing ^C (see above paragraph). If the target machine has
-+interrupts enabled this will stop it in the kernel and enter the
-+debugger.
-+
-+There is unfortunately no way of breaking into the kernel if it is
-+in a loop with interrupts disabled, so if this happens to you then
-+you need to place exploratory breakpoints or printk's into the kernel
-+to find out where it is looping. The exploratory breakpoints can be
-+entered either thru gdb or hard coded into the source. This is very
-+handy if you do something like:
-+
-+if (<it hurts>) BREAKPOINT;
-+
-+
-+There is a copy of an e-mail in the Documentation/i386/kgdb/ directory
-+(debug-nmi.txt) which describes how to create an NMI on an ISA bus
-+machine using a paper clip. I have a sophisticated version of this made
-+by wiring a push button switch into a PC104/ISA bus adapter card. The
-+adapter card nicely furnishes wire wrap pins for all the ISA bus
-+signals.
-+
-+When you are done debugging the kernel on the target machine it is a
-+good idea to leave it in a running state. This makes reboots faster,
-+bypassing the fsck. So do a gdb "continue" as the last gdb command if
-+this is possible. To terminate gdb itself on the development machine
-+and leave the target machine running, first clear all breakpoints and
-+continue, then type ^Z to suspend gdb and then kill it with "kill %1" or
-+something similar.
-+
-+If gdbstub Does Not Work
-+========================
-+
-+If it doesn't work, you will have to troubleshoot it. Do the easy
-+things first like double checking your cabling and data rates. You
-+might try some non-kernel based programs to see if the back-to-back
-+connection works properly. Just something simple like cat /etc/hosts
-+>/dev/ttyS0 on one machine and cat /dev/ttyS0 on the other will tell you
-+if you can send data from one machine to the other. Make sure it works
-+in both directions. There is no point in tearing out your hair in the
-+kernel if the line doesn't work.
-+
-+All of the real action takes place in the file
-+/usr/src/linux/arch/i386/kernel/kgdb_stub.c. That is the code on the target
-+machine that interacts with gdb on the development machine. In gdb you can
-+turn on a debug switch with the following command:
-+
-+ set remotedebug
-+
-+This will print out the protocol messages that gdb is exchanging with
-+the target machine.
-+
-+Another place to look is /usr/src/arch/i386/lib/kgdb_serial.c. This is
-+the code that talks to the serial port on the target side. There might
-+be a problem there. In particular there is a section of this code that
-+tests the UART which will tell you what UART you have if you define
-+"PRNT" (just remove "_off" from the #define PRNT_off). To view this
-+report you will need to boot the system without any beakpoints. This
-+allows the kernel to run to the point where it calls kgdb to set up
-+interrupts. At this time kgdb will test the UART and print out the type
-+it finds. (You need to wait so that the printks are actually being
-+printed. Early in the boot they are cached, waiting for the console to
-+be enabled. Also, if kgdb is entered thru a breakpoint it is possible
-+to cause a dead lock by calling printk when the console is locked. The
-+stub thus avoids doing printks from breakpoints, especially in the
-+serial code.) At this time, if the UART fails to do the expected thing,
-+kgdb will print out (using printk) information on what failed. (These
-+messages will be buried in all the other boot up messages. Look for
-+lines that start with "gdb_hook_interrupt:". You may want to use dmesg
-+once the system is up to view the log. If this fails or if you still
-+don't connect, review your answers for the port address. Use:
-+
-+setserial /dev/ttyS0
-+
-+to get the current port and IRQ information. This command will also
-+tell you what the system found for the UART type. The stub recognizes
-+the following UART types:
-+
-+16450, 16550, and 16550A
-+
-+If you are really desperate you can use printk debugging in the
-+kgdbstub code in the target kernel until you get it working. In particular,
-+there is a global variable in /usr/src/linux/arch/i386/kernel/kgdb_stub.c
-+named "remote_debug". Compile your kernel with this set to 1, rather
-+than 0 and the debug stub will print out lots of stuff as it does
-+what it does. Likewise there are debug printks in the kgdb_serial.c
-+code that can be turned on with simple changes in the macro defines.
-+
-+
-+Debugging Loadable Modules
-+==========================
-+
-+This technique comes courtesy of Edouard Parmelan
-+<Edouard.Parmelan@quadratec.fr>
-+
-+When you run gdb, enter the command
-+
-+source gdbinit-modules
-+
-+This will read in a file of gdb macros that was installed in your
-+kernel source directory when kgdb was installed. This file implements
-+the following commands:
-+
-+mod-list
-+ Lists the loaded modules in the form <module-address> <module-name>
-+
-+mod-print-symbols <module-address>
-+ Prints all the symbols in the indicated module.
-+
-+mod-add-symbols <module-address> <object-file-path-name>
-+ Loads the symbols from the object file and associates them
-+ with the indicated module.
-+
-+After you have loaded the module that you want to debug, use the command
-+mod-list to find the <module-address> of your module. Then use that
-+address in the mod-add-symbols command to load your module's symbols.
-+From that point onward you can debug your module as if it were a part
-+of the kernel.
-+
-+The file gdbinit-modules also contains a command named mod-add-lis as
-+an example of how to construct a command of your own to load your
-+favorite module. The idea is to "can" the pathname of the module
-+in the command so you don't have to type so much.
-+
-+Threads
-+=======
-+
-+Each process in a target machine is seen as a gdb thread. gdb thread
-+related commands (info threads, thread n) can be used.
-+
-+ia-32 hardware breakpoints
-+==========================
-+
-+kgdb stub contains support for hardware breakpoints using debugging features
-+of ia-32(x86) processors. These breakpoints do not need code modification.
-+They use debugging registers. 4 hardware breakpoints are available in ia-32
-+processors.
-+
-+Each hardware breakpoint can be of one of the following three types.
-+
-+1. Execution breakpoint - An Execution breakpoint is triggered when code
-+ at the breakpoint address is executed.
-+
-+ As limited number of hardware breakpoints are available, it is
-+ advisable to use software breakpoints ( break command ) instead
-+ of execution hardware breakpoints, unless modification of code
-+ is to be avoided.
-+
-+2. Write breakpoint - A write breakpoint is triggered when memory
-+ location at the breakpoint address is written.
-+
-+ A write or can be placed for data of variable length. Length of
-+ a write breakpoint indicates length of the datatype to be
-+ watched. Length is 1 for 1 byte data , 2 for 2 byte data, 3 for
-+ 4 byte data.
-+
-+3. Access breakpoint - An access breakpoint is triggered when memory
-+ location at the breakpoint address is either read or written.
-+
-+ Access breakpoints also have lengths similar to write breakpoints.
-+
-+IO breakpoints in ia-32 are not supported.
-+
-+Since gdb stub at present does not use the protocol used by gdb for hardware
-+breakpoints, hardware breakpoints are accessed through gdb macros. gdb macros
-+for hardware breakpoints are described below.
-+
-+hwebrk - Places an execution breakpoint
-+ hwebrk breakpointno address
-+hwwbrk - Places a write breakpoint
-+ hwwbrk breakpointno length address
-+hwabrk - Places an access breakpoint
-+ hwabrk breakpointno length address
-+hwrmbrk - Removes a breakpoint
-+ hwrmbrk breakpointno
-+exinfo - Tells whether a software or hardware breakpoint has occurred.
-+ Prints number of the hardware breakpoint if a hardware breakpoint has
-+ occurred.
-+
-+Arguments required by these commands are as follows
-+breakpointno - 0 to 3
-+length - 1 to 3
-+address - Memory location in hex digits ( without 0x ) e.g c015e9bc
-+
-+SMP support
-+==========
-+
-+When a breakpoint occurs or user issues a break ( Ctrl + C ) to gdb
-+client, all the processors are forced to enter the debugger. Current
-+thread corresponds to the thread running on the processor where
-+breakpoint occurred. Threads running on other processor(s) appear
-+similar to other non-running threads in the 'info threads' output.
-+Within the kgdb stub there is a structure "waiting_cpus" in which kgdb
-+records the values of "current" and "regs" for each CPU other than the
-+one that hit the breakpoint. "current" is a pointer to the task
-+structure for the task that CPU is running, while "regs" points to the
-+saved registers for the task. This structure can be examined with the
-+gdb "p" command.
-+
-+ia-32 hardware debugging registers on all processors are set to same
-+values. Hence any hardware breakpoints may occur on any processor.
-+
-+gdb troubleshooting
-+===================
-+
-+1. gdb hangs
-+Kill it. restart gdb. Connect to target machine.
-+
-+2. gdb cannot connect to target machine (after killing a gdb and
-+restarting another) If the target machine was not inside debugger when
-+you killed gdb, gdb cannot connect because the target machine won't
-+respond. In this case echo "Ctrl+C"(ASCII 3) to the serial line.
-+e.g. echo -e "\003" > /dev/ttyS1
-+This forces that target machine into the debugger, after which you
-+can connect.
-+
-+3. gdb cannot connect even after echoing Ctrl+C into serial line
-+Try changing serial line settings min to 1 and time to 0
-+e.g. stty min 1 time 0 < /dev/ttyS1
-+Try echoing again
-+
-+Check serial line speed and set it to correct value if required
-+e.g. stty ispeed 115200 ospeed 115200 < /dev/ttyS1
-+
-+EVENTS
-+======
-+
-+Ever want to know the order of things happening? Which CPU did what and
-+when? How did the spinlock get the way it is? Then events are for
-+you. Events are defined by calls to an event collection interface and
-+saved for later examination. In this case, kgdb events are saved by a
-+very fast bit of code in kgdb which is fully SMP and interrupt protected
-+and they are examined by using gdb to display them. Kgdb keeps only
-+the last N events, where N must be a power of two and is defined at
-+configure time.
-+
-+
-+Events are signaled to kgdb by calling:
-+
-+kgdb_ts(data0,data1)
-+
-+For each call kgdb records each call in an array along with other info.
-+Here is the array definition:
-+
-+struct kgdb_and_then_struct {
-+#ifdef CONFIG_SMP
-+ int on_cpu;
-+#endif
-+ long long at_time;
-+ int from_ln;
-+ char * in_src;
-+ void *from;
-+ int with_if;
-+ int data0;
-+ int data1;
-+};
-+
-+For SMP machines the CPU is recorded, for all machines the TSC is
-+recorded (gets a time stamp) as well as the line number and source file
-+the call was made from. The address of the (from), the "if" (interrupt
-+flag) and the two data items are also recorded. The macro kgdb_ts casts
-+the types to int, so you can put any 32-bit values here. There is a
-+configure option to select the number of events you want to keep. A
-+nice number might be 128, but you can keep up to 1024 if you want. The
-+number must be a power of two. An "andthen" macro library is provided
-+for gdb to help you look at these events. It is also possible to define
-+a different structure for the event storage and cast the data to this
-+structure. For example the following structure is defined in kgdb:
-+
-+struct kgdb_and_then_struct2 {
-+#ifdef CONFIG_SMP
-+ int on_cpu;
-+#endif
-+ long long at_time;
-+ int from_ln;
-+ char * in_src;
-+ void *from;
-+ int with_if;
-+ struct task_struct *t1;
-+ struct task_struct *t2;
-+};
-+
-+If you use this for display, the data elements will be displayed as
-+pointers to task_struct entries. You may want to define your own
-+structure to use in casting. You should only change the last two items
-+and you must keep the structure size the same. Kgdb will handle these
-+as 32-bit ints, but within that constraint you can define a structure to
-+cast to any 32-bit quantity. This need only be available to gdb and is
-+only used for casting in the display code.
-+
-+Final Items
-+===========
-+
-+I picked up this code from Amit S. Kale and enhanced it.
-+
-+If you make some really cool modification to this stuff, or if you
-+fix a bug, please let me know.
-+
-+George Anzinger
-+<george@mvista.com>
-+
-+Amit S. Kale
-+<akale@veritas.com>
-+
-+(First kgdb by David Grothe <dave@gcom.com>)
-+
-+(modified by Tigran Aivazian <tigran@sco.com>)
-+ Putting gdbstub into the kernel config menu.
-+
-+(modified by Scott Foehner <sfoehner@engr.sgi.com>)
-+ Hooks for entering gdbstub at boot time.
-+
-+(modified by Amit S. Kale <akale@veritas.com>)
-+ Threads, ia-32 hw debugging, mp support, console support,
-+ nmi watchdog handling.
-+
-+(modified by George Anzinger <george@mvista.com>)
-+ Extended threads to include the idle threads.
-+ Enhancements to allow breakpoint() at first C code.
-+ Use of module_init() and __setup() to automate the configure.
-+ Enhanced the cpu "collection" code to work in early bring-up.
-+ Added ability to call functions from gdb
-+ Print info thread stuff without going back to schedule()
-+ Now collect the "other" cpus with an IPI/ NMI.
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/i386/kgdb/loadmodule.sh 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,78 @@
-+#/bin/sh
-+# This script loads a module on a target machine and generates a gdb script.
-+# source generated gdb script to load the module file at appropriate addresses
-+# in gdb.
-+#
-+# Usage:
-+# Loading the module on target machine and generating gdb script)
-+# [foo]$ loadmodule.sh <modulename>
-+#
-+# Loading the module file into gdb
-+# (gdb) source <gdbscriptpath>
-+#
-+# Modify following variables according to your setup.
-+# TESTMACHINE - Name of the target machine
-+# GDBSCRIPTS - The directory where a gdb script will be generated
-+#
-+# Author: Amit S. Kale (akale@veritas.com).
-+#
-+# If you run into problems, please check files pointed to by following
-+# variables.
-+# ERRFILE - /tmp/<modulename>.errs contains stderr output of insmod
-+# MAPFILE - /tmp/<modulename>.map contains stdout output of insmod
-+# GDBSCRIPT - $GDBSCRIPTS/load<modulename> gdb script.
-+
-+TESTMACHINE=foo
-+GDBSCRIPTS=/home/bar
-+
-+if [ $# -lt 1 ] ; then {
-+ echo Usage: $0 modulefile
-+ exit
-+} ; fi
-+
-+MODULEFILE=$1
-+MODULEFILEBASENAME=`basename $1`
-+
-+if [ $MODULEFILE = $MODULEFILEBASENAME ] ; then {
-+ MODULEFILE=`pwd`/$MODULEFILE
-+} fi
-+
-+ERRFILE=/tmp/$MODULEFILEBASENAME.errs
-+MAPFILE=/tmp/$MODULEFILEBASENAME.map
-+GDBSCRIPT=$GDBSCRIPTS/load$MODULEFILEBASENAME
-+
-+function findaddr() {
-+ local ADDR=0x$(echo "$SEGMENTS" | \
-+ grep "$1" | sed 's/^[^ ]*[ ]*[^ ]*[ ]*//' | \
-+ sed 's/[ ]*[^ ]*$//')
-+ echo $ADDR
-+}
-+
-+function checkerrs() {
-+ if [ "`cat $ERRFILE`" != "" ] ; then {
-+ cat $ERRFILE
-+ exit
-+ } fi
-+}
-+
-+#load the module
-+echo Copying $MODULEFILE to $TESTMACHINE
-+rcp $MODULEFILE root@${TESTMACHINE}:
-+
-+echo Loading module $MODULEFILE
-+rsh -l root $TESTMACHINE /sbin/insmod -m ./`basename $MODULEFILE` \
-+ > $MAPFILE 2> $ERRFILE
-+checkerrs
-+
-+SEGMENTS=`head -n 11 $MAPFILE | tail -n 10`
-+TEXTADDR=$(findaddr "\\.text[^.]")
-+LOADSTRING="add-symbol-file $MODULEFILE $TEXTADDR"
-+SEGADDRS=`echo "$SEGMENTS" | awk '//{
-+ if ($1 != ".text" && $1 != ".this" &&
-+ $1 != ".kstrtab" && $1 != ".kmodtab") {
-+ print " -s " $1 " 0x" $3 " "
-+ }
-+}'`
-+LOADSTRING="$LOADSTRING $SEGADDRS"
-+echo Generating script $GDBSCRIPT
-+echo $LOADSTRING > $GDBSCRIPT
---- linux-2.6.0/Documentation/i386/zero-page.txt 2003-06-14 12:18:07.000000000 -0700
-+++ 25/Documentation/i386/zero-page.txt 2003-12-28 23:22:56.000000000 -0800
-@@ -22,6 +22,7 @@ Offset Type Description
- 0x90000 + contents of CL_OFFSET
- (only taken, when CL_MAGIC = 0xA33F)
- 0x40 20 bytes struct apm_bios_info, APM_BIOS_INFO
-+ 0x60 16 bytes Intel SpeedStep (IST) BIOS support information
- 0x80 16 bytes hd0-disk-parameter from intvector 0x41
- 0x90 16 bytes hd1-disk-parameter from intvector 0x46
-
---- linux-2.6.0/Documentation/input/input.txt 2003-06-14 12:18:02.000000000 -0700
-+++ 25/Documentation/input/input.txt 2003-12-28 23:23:06.000000000 -0800
-@@ -255,7 +255,7 @@ driver.
- is also emulated, characters should appear if you move it.
-
- You can test the joystick emulation with the 'jstest' utility,
--available in the joystick package (see Documentation/joystick.txt).
-+available in the joystick package (see Documentation/input/joystick.txt).
-
- You can test the event devices with the 'evtest' utility available
- in the LinuxConsole project CVS archive (see the URL below).
---- linux-2.6.0/Documentation/kbuild/kconfig-language.txt 2003-10-08 15:07:08.000000000 -0700
-+++ 25/Documentation/kbuild/kconfig-language.txt 2003-12-28 23:23:04.000000000 -0800
-@@ -141,8 +141,8 @@ Expressions are listed in decreasing ord
- otherwise 'y'.
- (4) Returns the value of the expression. Used to override precedence.
- (5) Returns the result of (2-/expr/).
--(6) Returns the result of max(/expr/, /expr/).
--(7) Returns the result of min(/expr/, /expr/).
-+(6) Returns the result of min(/expr/, /expr/).
-+(7) Returns the result of max(/expr/, /expr/).
-
- An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
- respectively for calculations). A menu entry becomes visible when it's
---- linux-2.6.0/Documentation/kbuild/modules.txt 2003-09-27 18:57:43.000000000 -0700
-+++ 25/Documentation/kbuild/modules.txt 2003-12-28 23:23:06.000000000 -0800
-@@ -1,4 +1,4 @@
--For now this is a raw copy from the old Documentation/modules.txt,
-+For now this is a raw copy from the old Documentation/kbuild/modules.txt,
- which was removed in 2.6.0-test5.
- The information herein is correct but not complete.
-
---- linux-2.6.0/Documentation/kernel-parameters.txt 2003-10-08 15:07:08.000000000 -0700
-+++ 25/Documentation/kernel-parameters.txt 2003-12-28 23:23:06.000000000 -0800
-@@ -24,6 +24,7 @@ restrictions referred to are that the re
- HW Appropriate hardware is enabled.
- IA-32 IA-32 aka i386 architecture is enabled.
- IA-64 IA-64 architecture is enabled.
-+ IOSCHED More than one I/O scheduler is enabled.
- IP_PNP IP DCHP, BOOTP, or RARP is enabled.
- ISAPNP ISA PnP code is enabled.
- ISDN Appropriate ISDN support is enabled.
-@@ -91,6 +92,23 @@ running once the system is up.
- ht -- run only enough ACPI to enable Hyper Threading
- See also Documentation/pm.txt.
-
-+ acpi_pic_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode
-+ Format: { level | edge }
-+ level Force PIC-mode SCI to Level Trigger (default)
-+ edge Force PIC-mode SCI to Edge Trigge
-+
-+ acpi_irq_balance [HW,ACPI] ACPI will balance active IRQs
-+ default in APIC mode
-+
-+ acpi_irq_nobalance [HW,ACPI] ACPI will not move active IRQs (default)
-+ default in PIC mode
-+
-+ acpi_irq_pci= [HW,ACPI] If irq_balance, Clear listed IRQs for use by PCI
-+ Format: <irq>,<irq>...
-+
-+ acpi_irq_isa= [HW,ACPI] If irq_balance, Mark listed IRQs used by ISA
-+ Format: <irq>,<irq>...
-+
- ad1816= [HW,OSS]
- Format: <io>,<irq>,<dma>,<dma2>
- See also Documentation/sound/oss/AD1816.
-@@ -214,7 +232,7 @@ running once the system is up.
- Forces specified timesource (if avaliable) to be used
- when calculating gettimeofday(). If specicified timesource
- is not avalible, it defaults to PIT.
-- Format: { pit | tsc | cyclone | ... }
-+ Format: { pit | tsc | cyclone | pmtmr }
-
- hpet= [IA-32,HPET] option to disable HPET and use PIT.
- Format: disable
-@@ -303,6 +321,10 @@ running once the system is up.
- See comment before function elanfreq_setup() in
- arch/i386/kernel/cpu/cpufreq/elanfreq.c.
-
-+ elevator= [IOSCHED]
-+ Format: {"as"|"cfq"|"deadline"|"noop"}
-+ See Documentation/as-iosched.txt for details
-+
- es1370= [HW,OSS]
- Format: <lineout>[,<micbias>]
- See also header of sound/oss/es1370.c.
-@@ -790,7 +812,8 @@ running once the system is up.
- before loading.
- See Documentation/ramdisk.txt.
-
-- psmouse_noext [HW,MOUSE] Disable probing for PS2 mouse protocol extensions
-+ psmouse_proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
-+ probe for (bare|imps|exps).
-
- psmouse_resetafter=
- [HW,MOUSE] Try to reset Synaptics Touchpad after so many
-@@ -1144,7 +1167,7 @@ running once the system is up.
- See header of drivers/scsi/wd7000.c.
-
- wdt= [WDT] Watchdog
-- See Documentation/watchdog.txt.
-+ See Documentation/watchdog/watchdog.txt.
-
- xd= [HW,XT] Original XT pre-IDE (RLL encoded) disks.
- xd_geo= See header of drivers/block/xd.c.
---- linux-2.6.0/Documentation/kobject.txt 2003-09-08 13:58:55.000000000 -0700
-+++ 25/Documentation/kobject.txt 2003-12-28 23:22:05.000000000 -0800
-@@ -2,7 +2,7 @@ The kobject Infrastructure
-
- Patrick Mochel <mochel@osdl.org>
-
--Updated: 3 June 2003
-+Updated: 12 November 2003
-
-
- Copyright (c) 2003 Patrick Mochel
-@@ -128,7 +128,33 @@ reference count or do other wacky things
- (like the networking layer).
-
-
--1.4 sysfs
-+1.4 Order dependencies
-+
-+Fields in a kobject must be initialized before they are used, as
-+indicated in this table:
-+
-+ k_name Before kobject_add() (1)
-+ name Before kobject_add() (1)
-+ refcount Before kobject_init() (2)
-+ entry Set by kobject_init()
-+ parent Before kobject_add() (3)
-+ kset Before kobject_init() (4)
-+ ktype Before kobject_add() (4)
-+ dentry Set by kobject_add()
-+
-+(1) If k_name isn't already set when kobject_add() is called,
-+it will be set to name.
-+
-+(2) Although kobject_init() sets refcount to 1, a warning will be logged
-+if refcount is not equal to 0 beforehand.
-+
-+(3) If parent isn't already set when kobject_add() is called,
-+it will be set to kset's embedded kobject.
-+
-+(4) kset and ktype are optional. If they are used, they should be set
-+at the times indicated.
-+
-+1.5 sysfs
-
- Each kobject receives a directory in sysfs. This directory is created
- under the kobject's parent directory.
-@@ -210,7 +236,25 @@ kset_find_obj() may be used to locate a
- name. The kobject, if found, is returned.
-
-
--2.3 sysfs
-+2.3 Order dependencies
-+
-+Fields in a kset must be initialized before they are used, as indicated
-+in this table:
-+
-+ subsys Before kset_add()
-+ ktype Before kset_add() (1)
-+ list Set by kset_init()
-+ kobj Before kset_init() (2)
-+ hotplug_ops Before kset_add() (1)
-+
-+(1) ktype and hotplug_ops are optional. If they are used, they should
-+be set at the times indicated.
-+
-+(2) kobj is passed to kobject_init() during kset_init() and to
-+kobject_add() during kset_add(); it must initialized accordingly.
-+
-+
-+2.4 sysfs
-
- ksets are represented in sysfs when their embedded kobjects are
- registered. They follow the same rules of parenting, with one
-@@ -352,7 +396,21 @@ subsys_set_kset(obj,subsys)
- - Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset.
-
-
--4.4 sysfs
-+4.4 Order dependencies
-+
-+Fields in a subsystem must be initialized before they are used,
-+as indicated in this table:
-+
-+ kset Before subsystem_register() (1)
-+ rwsem Set by subsystem_register()
-+
-+(1) kset is minimally initialized by the decl_subsys macro. It is
-+passed to kset_init() and kset_add() by subsystem_register(). If its
-+subsys member isn't already set, subsystem_register() sets it to the
-+containing subsystem.
-+
-+
-+4.5 sysfs
-
- subsystems are represented in sysfs via their embedded kobjects. They
- follow the same rules as previously mentioned with no exceptions. They
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/MSI-HOWTO.txt 2003-12-28 23:21:44.000000000 -0800
-@@ -0,0 +1,321 @@
-+ The MSI Driver Guide HOWTO
-+ Tom L Nguyen tom.l.nguyen@intel.com
-+ 10/03/2003
-+
-+1. About this guide
-+
-+This guide describes the basics of Message Signaled Interrupts(MSI), the
-+advantages of using MSI over traditional interrupt mechanisms, and how
-+to enable your driver to use MSI or MSI-X. Also included is a Frequently
-+Asked Questions.
-+
-+2. Copyright 2003 Intel Corporation
-+
-+3. What is MSI/MSI-X?
-+
-+Message Signaled Interrupt (MSI), as described in the PCI Local Bus
-+Specification Revision 2.3 or latest, is an optional feature, and a
-+required feature for PCI Express devices. MSI enables a device function
-+to request service by sending an Inbound Memory Write on its PCI bus to
-+the FSB as a Message Signal Interrupt transaction. Because MSI is
-+generated in the form of a Memory Write, all transaction conditions,
-+such as a Retry, Master-Abort, Target-Abort or normal completion, are
-+supported.
-+
-+A PCI device that supports MSI must also support pin IRQ assertion
-+interrupt mechanism to provide backward compatibility for systems that
-+do not support MSI. In Systems, which support MSI, the bus driver is
-+responsible for initializing the message address and message data of
-+the device function's MSI/MSI-X capability structure during device
-+initial configuration.
-+
-+An MSI capable device function indicates MSI support by implementing
-+the MSI/MSI-X capability structure in its PCI capability list. The
-+device function may implement both the MSI capability structure and
-+the MSI-X capability structure; however, the bus driver should not
-+enable both, but instead enable only the MSI-X capability structure.
-+
-+The MSI capability structure contains Message Control register,
-+Message Address register and Message Data register. These registers
-+provide the bus driver control over MSI. The Message Control register
-+indicates the MSI capability supported by the device. The Message
-+Address register specifies the target address and the Message Data
-+register specifies the characteristics of the message. To request
-+service, the device function writes the content of the Message Data
-+register to the target address. The device and its software driver
-+are prohibited from writing to these registers.
-+
-+The MSI-X capability structure is an optional extension to MSI. It
-+uses an independent and separate capability structure. There are
-+some key advantages to implementing the MSI-X capability structure
-+over the MSI capability structure as described below.
-+
-+ - Support a larger maximum number of vectors per function.
-+
-+ - Provide the ability for system software to configure
-+ each vector with an independent message address and message
-+ data, specified by a table that resides in Memory Space.
-+
-+ - MSI and MSI-X both support per-vector masking. Per-vector
-+ masking is an optional extension of MSI but a required
-+ feature for MSI-X. Per-vector masking provides the kernel
-+ the ability to mask/unmask MSI when servicing its software
-+ interrupt service routing handler. If per-vector masking is
-+ not supported, then the device driver should provide the
-+ hardware/software synchronization to ensure that the device
-+ generates MSI when the driver wants it to do so.
-+
-+4. Why use MSI?
-+
-+As a benefit the simplification of board design, MSI allows board
-+designers to remove out of band interrupt routing. MSI is another
-+step towards a legacy-free environment.
-+
-+Due to increasing pressure on chipset and processor packages to
-+reduce pin count, the need for interrupt pins is expected to
-+diminish over time. Devices, due to pin constraints, may implement
-+messages to increase performance.
-+
-+PCI Express endpoints uses INTx emulation (in-band messages) instead
-+of IRQ pin assertion. Using INTx emulation requires interrupt
-+sharing among devices connected to the same node (PCI bridge) while
-+MSI is unique (non-shared) and does not require BIOS configuration
-+support. As a result, the PCI Express technology requires MSI
-+support for better interrupt performance.
-+
-+Using MSI enables the device functions to support two or more
-+vectors, which can be configure to target different CPU's to
-+increase scalability.
-+
-+5. Configuring a driver to use MSI/MSI-X
-+
-+By default, the kernel will not enable MSI/MSI-X on all devices that
-+support this capability once the patch is installed. A kernel
-+configuration option must be selected to enable MSI/MSI-X support.
-+
-+5.1 Including MSI support into the kernel
-+
-+To include MSI support into the kernel requires users to patch the
-+VECTOR-base patch first and then the MSI patch because the MSI
-+support needs VECTOR based scheme. Once these patches are installed,
-+setting CONFIG_PCI_USE_VECTOR enables the VECTOR based scheme and
-+the option for MSI-capable device drivers to selectively enable MSI
-+(using pci_enable_msi as desribed below).
-+
-+Since the target of the inbound message is the local APIC, providing
-+CONFIG_PCI_USE_VECTOR is dependent on whether CONFIG_X86_LOCAL_APIC
-+is enabled or not.
-+
-+int pci_enable_msi(struct pci_dev *)
-+
-+With this new API, any existing device driver, which like to have
-+MSI enabled on its device function, must call this explicitly. A
-+successful call will initialize the MSI/MSI-X capability structure
-+with ONE vector, regardless of whether the device function is
-+capable of supporting multiple messages. This vector replaces the
-+pre-assigned dev->irq with a new MSI vector. To avoid the conflict
-+of new assigned vector with existing pre-assigned vector requires
-+the device driver to call this API before calling request_irq(...).
-+
-+The below diagram shows the events, which switches the interrupt
-+mode on the MSI-capable device function between MSI mode and
-+PIN-IRQ assertion mode.
-+
-+ ------------ pci_enable_msi ------------------------
-+ | | <=============== | |
-+ | MSI MODE | | PIN-IRQ ASSERTION MODE |
-+ | | ===============> | |
-+ ------------ free_irq ------------------------
-+
-+5.2 Configuring for MSI support
-+
-+Due to the non-contiguous fashion in vector assignment of the
-+existing Linux kernel, this patch does not support multiple
-+messages regardless of the device function is capable of supporting
-+more than one vector. The bus driver initializes only entry 0 of
-+this capability if pci_enable_msi(...) is called successfully by
-+the device driver.
-+
-+5.3 Configuring for MSI-X support
-+
-+Both the MSI capability structure and the MSI-X capability structure
-+share the same above semantics; however, due to the ability of the
-+system software to configure each vector of the MSI-X capability
-+structure with an independent message address and message data, the
-+non-contiguous fashion in vector assignment of the existing Linux
-+kernel has no impact on supporting multiple messages on an MSI-X
-+capable device functions. By default, as mentioned above, ONE vector
-+should be always allocated to the MSI-X capability structure at
-+entry 0. The bus driver does not initialize other entries of the
-+MSI-X table.
-+
-+Note that the PCI subsystem should have full control of a MSI-X
-+table that resides in Memory Space. The software device driver
-+should not access this table.
-+
-+To request for additional vectors, the device software driver should
-+call function msi_alloc_vectors(). It is recommended that the
-+software driver should call this function once during the
-+initialization phase of the device driver.
-+
-+The function msi_alloc_vectors(), once invoked, enables either
-+all or nothing, depending on the current availability of vector
-+resources. If no vector resources are available, the device function
-+still works with ONE vector. If the vector resources are available
-+for the number of vectors requested by the driver, this function
-+will reconfigure the MSI-X capability structure of the device with
-+additional messages, starting from entry 1. To emphasize this
-+reason, for example, the device may be capable for supporting the
-+maximum of 32 vectors while its software driver usually may request
-+4 vectors.
-+
-+For each vector, after this successful call, the device driver is
-+responsible to call other functions like request_irq(), enable_irq(),
-+etc. to enable this vector with its corresponding interrupt service
-+handler. It is the device driver's choice to have all vectors shared
-+the same interrupt service handler or each vector with a unique
-+interrupt service handler.
-+
-+In addition to the function msi_alloc_vectors(), another function
-+msi_free_vectors() is provided to allow the software driver to
-+release a number of vectors back to the vector resources. Once
-+invoked, the PCI subsystem disables (masks) each vector released.
-+These vectors are no longer valid for the hardware device and its
-+software driver to use. Like free_irq, it recommends that the
-+device driver should also call msi_free_vectors to release all
-+additional vectors previously requested.
-+
-+int msi_alloc_vectors(struct pci_dev *dev, int *vector, int nvec)
-+
-+This API enables the software driver to request the PCI subsystem
-+for additional messages. Depending on the number of vectors
-+available, the PCI subsystem enables either all or nothing.
-+
-+Argument dev points to the device (pci_dev) structure.
-+Argument vector is a pointer of integer type. The number of
-+elements is indicated in argument nvec.
-+Argument nvec is an integer indicating the number of messages
-+requested.
-+A return of zero indicates that the number of allocated vector is
-+successfully allocated. Otherwise, indicate resources not
-+available.
-+
-+int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec)
-+
-+This API enables the software driver to inform the PCI subsystem
-+that it is willing to release a number of vectors back to the
-+MSI resource pool. Once invoked, the PCI subsystem disables each
-+MSI-X entry associated with each vector stored in the argument 2.
-+These vectors are no longer valid for the hardware device and
-+its software driver to use.
-+
-+Argument dev points to the device (pci_dev) structure.
-+Argument vector is a pointer of integer type. The number of
-+elements is indicated in argument nvec.
-+Argument nvec is an integer indicating the number of messages
-+released.
-+A return of zero indicates that the number of allocated vectors
-+is successfully released. Otherwise, indicates a failure.
-+
-+5.4 Hardware requirements for MSI support
-+MSI support requires support from both system hardware and
-+individual hardware device functions.
-+
-+5.4.1 System hardware support
-+Since the target of MSI address is the local APIC CPU, enabling
-+MSI support in Linux kernel is dependent on whether existing
-+system hardware supports local APIC. Users should verify their
-+system whether it runs when CONFIG_X86_LOCAL_APIC=y.
-+
-+In SMP environment, CONFIG_X86_LOCAL_APIC is automatically set;
-+however, in UP environment, users must manually set
-+CONFIG_X86_LOCAL_APIC. Once CONFIG_X86_LOCAL_APIC=y, setting
-+CONFIG_PCI_USE_VECTOR enables the VECTOR based scheme and
-+the option for MSI-capable device drivers to selectively enable
-+MSI (using pci_enable_msi as desribed below).
-+
-+Note that CONFIG_X86_IO_APIC setting is irrelevant because MSI
-+vector is allocated new during runtime and MSI support does not
-+depend on BIOS support. This key independency enables MSI support
-+on future IOxAPIC free platform.
-+
-+5.4.2 Device hardware support
-+The hardware device function supports MSI by indicating the
-+MSI/MSI-X capability structure on its PCI capability list. By
-+default, this capability structure will not be initialized by
-+the kernel to enable MSI during the system boot. In other words,
-+the device function is running on its default pin assertion mode.
-+Note that in many cases the hardware supporting MSI have bugs,
-+which may result in system hang. The software driver of specific
-+MSI-capable hardware is responsible for whether calling
-+pci_enable_msi or not. A return of zero indicates the kernel
-+successfully initializes the MSI/MSI-X capability structure of the
-+device funtion. The device function is now running on MSI mode.
-+
-+5.5 How to tell whether MSI is enabled on device function
-+
-+At the driver level, a return of zero from pci_enable_msi(...)
-+indicates to the device driver that its device function is
-+initialized successfully and ready to run in MSI mode.
-+
-+At the user level, users can use command 'cat /proc/interrupts'
-+to display the vector allocated for the device and its interrupt
-+mode, as shown below.
-+
-+ CPU0 CPU1
-+ 0: 324639 0 IO-APIC-edge timer
-+ 1: 1186 0 IO-APIC-edge i8042
-+ 2: 0 0 XT-PIC cascade
-+ 12: 2797 0 IO-APIC-edge i8042
-+ 14: 6543 0 IO-APIC-edge ide0
-+ 15: 1 0 IO-APIC-edge ide1
-+169: 0 0 IO-APIC-level uhci-hcd
-+185: 0 0 IO-APIC-level uhci-hcd
-+193: 138 10 PCI MSI aic79xx
-+201: 30 0 PCI MSI aic79xx
-+225: 30 0 IO-APIC-level aic7xxx
-+233: 30 0 IO-APIC-level aic7xxx
-+NMI: 0 0
-+LOC: 324553 325068
-+ERR: 0
-+MIS: 0
-+
-+6. FAQ
-+
-+Q1. Are there any limitations on using the MSI?
-+
-+A1. If the PCI device supports MSI and conforms to the
-+specification and the platform supports the APIC local bus,
-+then using MSI should work.
-+
-+Q2. Will it work on all the Pentium processors (P3, P4, Xeon,
-+AMD processors)? In P3 IPI's are transmitted on the APIC local
-+bus and in P4 and Xeon they are transmitted on the system
-+bus. Are there any implications with this?
-+
-+A2. MSI support enables a PCI device sending an inbound
-+memory write (0xfeexxxxx as target address) on its PCI bus
-+directly to the FSB. Since the message address has a
-+redirection hint bit cleared, it should work.
-+
-+Q3. The target address 0xfeexxxxx will be translated by the
-+Host Bridge into an interrupt message. Are there any
-+limitations on the chipsets such as Intel 8xx, Intel e7xxx,
-+or VIA?
-+
-+A3. If these chipsets support an inbound memory write with
-+target address set as 0xfeexxxxx, as conformed to PCI
-+specification 2.3 or latest, then it should work.
-+
-+Q4. From the driver point of view, if the MSI is lost because
-+of the errors occur during inbound memory write, then it may
-+wait for ever. Is there a mechanism for it to recover?
-+
-+A4. Since the target of the transaction is an inbound memory
-+write, all transaction termination conditions (Retry,
-+Master-Abort, Target-Abort, or normal completion) are
-+supported. A device sending an MSI must abide by all the PCI
-+rules and conditions regarding that inbound memory write. So,
-+if a retry is signaled it must retry, etc... We believe that
-+the recommendation for Abort is also a retry (refer to PCI
-+specification 2.3 or latest).
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/must-fix.txt 2003-12-28 23:21:10.000000000 -0800
-@@ -0,0 +1,288 @@
-+
-+Must-fix bugs
-+=============
-+
-+drivers/char/
-+~~~~~~~~~~~~~
-+
-+o TTY locking is broken.
-+
-+ o see FIXME in do_tty_hangup(). This causes ppp BUGs in local_bh_enable()
-+
-+ o Other problems: aviro, dipankar, Alan have details.
-+
-+ o somebody will have to document the tty driver and ldisc API
-+
-+drivers/tty
-+~~~~~~~~~~~
-+
-+o viro: tty_driver refcounting, tty/misc/upper levels of sound still not
-+ completely fixed.
-+
-+drivers/block/
-+~~~~~~~~~~~~~~
-+
-+o loop.c: Concurrent write access on block devices might cause a deadlock
-+ of the complete system. See:
-+ http://marc.theaimsgroup.com/?l=linux-kernel&m=106275365925769&w==
-+ http://bugzilla.kernel.org/show_bug.cgi?id=1198
-+ Thread of possible fix:
-+ http://www.kerneli.org/pipermail/cryptoapi-devel/2003-October/000676.html
-+
-+ (Fruhwirth Clemens)
-+
-+o ideraid hasn't been ported to 2.5 at all yet.
-+
-+ We need to understand whether the proposed BIO split code will suffice
-+ for this.
-+
-+drivers/input/
-+~~~~~~~~~~~~~~
-+
-+o rmk: unconverted keyboard/mouse drivers (there's a deadline of 2.6.0
-+ currently on these remaining in my/Linus' tree.)
-+
-+o viro: large absence of locking.
-+
-+o viro: parport is nearly as bad as that and there the code is more hairy.
-+ IMO parport is more of "figure out what API changes are needed for its
-+ users, get them done ASAP, then fix generic layer at leisure"
-+
-+o (Albert Cahalan) Lots of people (check Google) get this message from the
-+ kernel:
-+
-+ psmouse.c: Lost synchronization, throwing 2 bytes away.
-+
-+ (the number of bytes will be 1, 2, or 3)
-+
-+ At work, I get it when there is heavy NFS traffic. The mouse goes crazy,
-+ jumping around and doing random cut-and-paste all over everything. This
-+ is with a decently fast and modern PC.
-+
-+o There seem to be too many reports of keyboards and mice failing or acting
-+ strangely.
-+
-+
-+drivers/misc/
-+~~~~~~~~~~~~~
-+
-+o rmk: UCB1[23]00 drivers, currently sitting in drivers/misc in the ARM
-+ tree. (touchscreen, audio, gpio, type device.)
-+
-+ These need to be moved out of drivers/misc/ and into real places
-+
-+o viro: actually, misc.c has a good chance to die. With cdev-cidr that's
-+ trivial.
-+
-+drivers/net/
-+~~~~~~~~~~~~
-+
-+drivers/net/irda/
-+~~~~~~~~~~~~~~~~~
-+
-+ (Jean Tourrilhes)
-+
-+o irport need to be converted to sir-kthread
-+
-+o dongle drivers need to be converted to sir-dev (in progress)
-+
-+o new drivers (irtty-sir/smsc-ircc2/donauboe) need more testing (in progress)
-+
-+
-+drivers/pci/
-+~~~~~~~~~~~~
-+
-+o alan: Some cardbus crashes the system
-+
-+ (bugzilla, please?)
-+
-+drivers/pcmcia/
-+~~~~~~~~~~~~~~~
-+
-+o alan: This is a locking disaster.
-+
-+ (rmk, brodo: in progress)
-+
-+drivers/pld/
-+~~~~~~~~~~~~
-+
-+o rmk: EPXA (ARM platform) PLD hotswap drivers (drivers/pld)
-+
-+ (rmk: will work out what to do here. maybe drivers/arm/)
-+
-+drivers/video/
-+~~~~~~~~~~~~~~
-+
-+o Lots of drivers don't compile, others do but don't work.
-+
-+drivers/scsi/
-+~~~~~~~~~~~~~
-+
-+o Convert am53c974, dpt_i2o, initio and pci2220i to DMA-mapping
-+
-+o Make inia100, cpqfc, pci2000 and dc390t compile
-+
-+o Convert
-+
-+ wd33c99 based: a2091 a3000 gpv11 mvme174 sgiwd93
-+
-+ 53c7xx based: amiga7xxx bvme6000 mvme16x initio am53c974 pci2000
-+ pci2220i dc390t
-+
-+ To new error handling
-+
-+ It also might be possible to shift the 53c7xx based drivers over to
-+ 53c700 which does the new EH stuff, but I don't have the hardware to check
-+ such a shift.
-+
-+ For the non-compiling stuff, I've probably missed a few that just aren't
-+ compilable on my platforms, so any updates would be welcome. Also, are
-+ some of our non-compiling or unconverted drivers obsolete?
-+
-+fs/
-+~~~
-+
-+o AIO/direct-IO writes can race with truncate and wreck filesystems.
-+ (Badari has a patch)
-+
-+o viro: fs/char_dev.c needs removal of aeb stuff and merge of cdev-cidr.
-+ In progress.
-+
-+o forward-port sct's O_DIRECT fixes (Badari has a patch)
-+
-+o viro: there is some generic stuff for namei/namespace/super, but that's a
-+ slow-merge and can go in 2.6 just fine
-+
-+o trond: NFS has a mmap-versus-truncate problem (fixed? needs testing)
-+
-+o trond: NFSv4 client, bugs in lockd, RPSEC_GSS for NFSv[23], some atomic open
-+ bits. more info: http://www.fys.uio.no/~trondmy/src/Linux-2.6.x/2.6.0-test11/
-+
-+kernel/sched.c
-+~~~~~~~~~~~~~~
-+
-+o Starvation, general interactivity need close monitoring.
-+
-+o SMT aware scheduler (Ingo, Rusty, Nick have implementations)
-+
-+kernel/
-+~~~~~~~
-+
-+o Alan: 32bit uid support is *still* broken for process accounting.
-+
-+ Create a 32bit uid, turn accounting on. Shock horror it doesn't work
-+ because the field is 16bit. We need an acct structure flag day for 2.6
-+ IMHO
-+
-+ (alan has patch)
-+
-+o viro: core sysctl code is racy. And its interaction wiuth sysfs
-+
-+o (ingo) rwsems (on x86) are limited to 32766 waiting processes. This
-+ means that setting pid_max to above 32K is unsafe :-(
-+
-+ An option is to use CONFIG_RWSEM_GENERIC_SPINLOCK variant all the time,
-+ for all archs, and not inline any part of the ops.
-+
-+lib/kobject.c
-+~~~~~~~~~~~~~
-+
-+o kobject refcounting (comments from Al Viro):
-+
-+ _anything_ can grab a temporary reference to kobject. IOW, if kobject is
-+ embedded into something that could be freed - it _MUST_ have a destructor
-+ and that destructor _MUST_ be the destructor for containing object.
-+
-+ Any violation of the above (and we already have a bunch of those) is a
-+ user-triggerable memory corruption.
-+
-+ We can tolerate it for a while in 2.5 (e.g. during work on susbsystem we
-+ can decide to switch to that way of handling objects and have subsystem
-+ vulnerable for a while), but all such windows must be closed before 2.6
-+ and during 2.6 we can't open them at all.
-+
-+o All block drivers which control multiple gendisks with a single
-+ request_queue are broken, due to one-to-one assumptions in the request
-+ queue sysfs hookup.
-+
-+mm/
-+~~~
-+
-+o GFP_DMA32 (or something like that). Lots of ideas. jejb, zaitcev,
-+ willy, arjan, wli.
-+
-+ Specifically, 64-bit systems need to be able to enforce 32-bit addressing
-+ limits for device metadata like network cards' ring buffers and SCSI
-+ command descriptors.
-+
-+o access_process_vm() doesn't flush right. We probably need new flushing
-+ primitives to do this (davem?)
-+
-+
-+modules
-+~~~~~~~
-+
-+ (Rusty)
-+
-+net/
-+~~~~
-+
-+ (davem)
-+
-+o UDP apps can in theory deadlock, because the ip_append_data path can end
-+ up sleeping while the socket lock is held.
-+
-+ It is OK to sleep with the socket held held, normally. But in this case
-+ the sleep happens while waiting for socket memory/space to become
-+ available, if another context needs to take the socket lock to free up the
-+ space we could hang.
-+
-+ I sent a rough patch on how to fix this to Alexey, and he is analyzing
-+ the situation. I expect a final fix from him next week or so.
-+
-+o Semantics for IPSEC during operations such as TCP connect suck currently.
-+
-+ When we first try to connect to a destination, we may need to ask the
-+ IPSEC key management daemon to resolve the IPSEC routes for us. For the
-+ purposes of what the kernel needs to do, you can think of it like ARP. We
-+ can't send the packet out properly until we resolve the path.
-+
-+ What happens now for IPSEC is basically this:
-+
-+ O_NONBLOCK: returns -EAGAIN over and over until route is resolved
-+
-+ !O_NONBLOCK: Sleeps until route is resolved
-+
-+ These semantics are total crap. The solution, which Alexey is working
-+ on, is to allow incomplete routes to exist. These "incomplete" routes
-+ merely put the packet onto a "resolution queue", and once the key manager
-+ does it's thing we finish the output of the packet. This is precisely how
-+ ARP works.
-+
-+ I don't know when Alexey will be done with this.
-+
-+net/*/netfilter/
-+~~~~~~~~~~~~~~~~
-+
-+ (Rusty)
-+
-+sound/
-+~~~~~~
-+
-+global
-+~~~~~~
-+
-+o viro: 64-bit dev_t (not a mustfix for 2.6.0). 32-bit dev_t is done, 64-bit
-+ means extra work on nfsd/raid/etc.
-+
-+o alan: Forward port 2.4 fixes
-+ - Chris Wright: Security fixes including execve holes, execve vs proc races
-+
-+o There are about 60 or 70 security related checks that need doing
-+ (copy_user etc) from Stanford tools. (badari is looking into this, and
-+ hollisb)
-+
-+o A couple of hundred real looking bugzilla bugs
-+
-+o viro: cdev rework. Mostly done.
-+
---- linux-2.6.0/Documentation/networking/8139too.txt 2003-08-22 19:23:39.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,449 +0,0 @@
--
-- "8139too" Fast Ethernet driver for Linux
-- RTL-8139, -8129, and -8130 10/100 Fast Ethernet adapters
--
-- Copyright 2000,2001 Jeff Garzik <jgarzik@pobox.com>
--
-- http://sourceforge.net/projects/gkernel/
--
--
-- Architectures supported (all PCI platforms):
-- x86, Alpha AXP, PowerPC, Sparc64
--
-- Kernel versions supported: 2.4.x
--
--
--
--Disclaimer
------------
--
--DO NOT CONTACT DONALD BECKER FOR SUPPORT OF THIS DRIVER, his driver is
--completely different and maintained independently of the 8139too code base.
--
--
--
--Requirements
--------------
--Kernel 2.4.3 or later.
--A Fast Ethernet adapter containing an RTL8139-based chip.
--
--
--
--Introduction
--------------
--
--The "8139too" Fast Ethernet driver for Linux 2.4.0 is a substantial
--modification of the experimental rtl8139 driver from Donald Becker,
--some versions of which appeared in 2.2.x and 2.3.x kernels. The
--RTL-8139 is a very low-cost Fast Ethernet chip, which makes it very
--popular.
--
--The step from 2.2.x to 2.4.x kernels brings many new features to Linux
--device drivers. Features for MMIO resources, a standard hot-plug API,
--and other interfaces are now becoming requirements, as drivers move
--off the x86 platform. With that in mind, I have begun updating the
--RTL-8139 driver to current 2.3.x (2.4) kernel standards and APIs, and
--fixing the problems that users have been encountering.
--
--
--
--Features of 8139too
---------------------
--[note - this list intended for people familiar with kernel drivers]
--
--** 100% MMIO, for full speed operation. All users (so far) have
--reported performance increases over their existing RTL drivers.
--
--** Multi-platform support: x86, Alpha, PPC, ...
--
--** Use proper SMP spinlocking, fixing SMP interrupt bugs, making the
--driver portable to non-x86 SMP platforms in the process.
--
--** Use new PCI driver API for seamless, low-maintenance hot-plug support
--
--** Several bugs fixes from original rtl8139 1.08r (October 5, 1999),
--including the very common "transmit timeout" problem.
--
--* Use new resource allocation API, required for hot-plug support
--* Use new register read/write macros
--* initcall support (module_init/exit)
--* vastly improved debug tracing support
--* code formatting in many places for readability
--* use new init_etherdev() facilities
--
--...and probably some other less important changes which I forgot.
--
--
--
--Installation
--------------
--
--OPTION 1: Build inside kernel tree (into kernel image, or as module)
--
-- (overwrite 8139too driver in kernel tree with different version)
-- 1) cp 8139too.c $my_source_tree/drivers/net/8139too.c
--
--OPTION 2: Build outside kernel tree
--
-- Use the included Makefile.
--
--
--
--Tested Adapters
-----------------
--AOpen ALN-325C
--AT-2500TX 10/100 PCI Fast Ethernet Network Adapter Card
--D-Link DFE-530TX
--Cnet CNF401 'SinglePoint' 10/100 Base-TX
--Genius GF 100TXR4 Fast Ethernet 10/100M PCI Network Card
--KTI KF-230TX
--KTI KF-230TX/2
--Lantech FastNet TX
--Ovislink Fast Ethernet
--Planet ENW-9504 (V.4) 10/100
--SDT Jeoun Fast PCI-TX
--SMC EZNET 10/100
--UNEX NexNIC ND012C
--
--(please add your adapter model to this list)
--
--
--
--Status of Platform Support
----------------------------
--
--(see errata below for details)
--
--x86: tested, stable
--Alpha AXP: tested, stable
--PowerPC: tested, unstable
--Sparc64: not tested
--
--
--
--Special Thanks
----------------
--The following people contributed invaluable testing time, feedback
--and/or patches during the development of this driver. Thanks to all
--of them.
--
--Donald Becker, Alan Cox, Richard Stallman, Linus Torvalds - inspiration
--
--Alan Cox, Gerard Roudier - insight on posted MMIO writes
--
--Martin Mares - code review
--
--Tigran Aivazian - testing, code review, and a bug fix
--
--Chmouel Boudjnah, Alexander Dietrich, Oleg Drokin,
--James Fidell, Taso Hatzi, Peter K - intrepid test team
--
--And thanks to every supporter free software.
--
--(see top of 8139too.c for further credits and kudos)
--
--
--
--Submitting Bug Reports
------------------------
--Obtain and compile the modified rtl8139-diag source code from the
--8139too driver Web site, http://sourceforge.net/projects/gkernel/
--This diagnostics programs, originally from Donald Becker, has been
--modified to display all registers on your RTL8139 chip, not just the
--first 0x80.
--
--If possible, send the output of a working and broken driver with
-- rtl8139-diag -mmaaavvveefN > my-output-file.txt
--
--Send "lspci -vvv" or "cat /proc/pci" output for PCI information.
--
--
--
--Known Bugs / Errata / To-Do
-----------------------------
--The following issues are known, and are actively being pursued. Patches
--to resolve these issues is welcome. If a problem occurs which is not in
--the list, please report it. That's why we do beta releases, after all...
--
--
--
--1) Work with Donald to merge fixes and updates into his driver.
--
--2) ETHTOOL_SSET support
--
--3) PPC platform has stability problems. (XXX: verify this is still true)
--
--4) Sparc64 platform not tested at all.
--
--8) Much improved command line / module parameter setup. (patches and
--suggestions welcome) (WIP)
--
--9) Better documentation. (patches welcome)
--
--12) 10base-T support flaky or slow (todo: verify this is still true)
--
--
--
--
--Change History
----------------
--
--Version 0.9.26 - August 9, 2002
--
--* Fix MII ioctl phy id corruption.
--* Fix big-endian multicast bug.
--* Support register dumps via ethtool.
--* Fix several uses of 'len' after potential skb free, in dev->hard_start_xmit
--* Replace several "magic numbers" with their proper representation
-- constants in linux/mii.h.
--* Support ethtool media interface via generic kernel MII API
--* Export NIC-specific statistics via ethtool.
--* Proper support for RTL8139 rev K. (can be disabled via
-- compile-time conditional)
--* Add PCI ids for new 8139 boards.
--* Use ethernet crc via generic linux/crc32.h kernel API.
--* Better RX reset. Old rx-reset method still available via
-- a compile-time conditional.
--* Only account specific RX errors if rx_status is !OK
--
--
--Version 0.9.22 - November 8, 2001
--
--* Additional retries before aborting Tx
--* Do not write other TxConfig bits when writing clear-abort bit.
--* Ack TxErr intr status after each Tx abort, too.
--* Fix oops in interface restart
--
--
--Version 0.9.21 - November 1, 2001
--
--* Disable early Rx, it hurts performance and creates races.
--* Remove DPRINTK macro function tracing.
--* Better interrupt sharing behavior.
--* Acknowledge PCI errors.
--* Remove early-Rx acknowledgement, unnecessary
--* Remove code for uncommon case where Tx packets are
-- properly aligned, and do not need to be copied.
-- Tx packets are now always copied into a static DMA buffer,
-- which is allocated at interface open.
--* Fix problems with kernel thread exit.
--
--
--Version 0.9.20 - October 18, 2001
--
--* Print out notice when 8139C+ chip is detected
--* Add id for D-Link DFE690TXD pcmcia cardbus card (Gert Dewit)
--
--
--Version 0.9.19 - October 9, 2001
--
--* Eliminate buffer copy for unaligned Tx's (manfred)
--* Better RX error recovery (manfred)
--* Wake-On-LAN and ETHTOOL_GSET support (Kalle Niemitalo)
--* Fix assertion in PIO mode (various)
--
--
--Version 0.9.18 - July 6, 2001
--
--* Fix race leading to crashes on some machines.
--* Minimize race leading to low performance.
--* Correct interrupt acknowledgement to cover all three
-- relevant Rx events.
--* Add ethtool driver info support.
--* Collect additional driver-internal statistics.
--* Add descriptions for module parameters.
--* Support new SIOCxMIIxxx ioctls added in kernel 2.4.6.
--* Multicast filter big endian fix.
--* Support new PCI PM API added in kernel 2.4.6.
--
--
--Version 0.9.17 - May 7, 2001
--
--* Fix chipset wakeup bug which prevent media connection for 8139B
--* Print out "media is unconnected..." instead of
-- "partner ability 0000"
--
--
--Version 0.9.16 - April 14, 2001
--
--* Complete MMIO audit, disable read-after-every-write
--* Update Rx interrupt handling
--* Enable Early Rx thresholds, highly recommended to reduce
-- Rx FIFO overflow
--* Make 8129 support conditional
--* Support for new 2.4.3 kernel APIs
--* More correct PIO/MMIO PCI BAR region size checking
--* Add check for totally dead/missing hardware
--* Disable media timer code to "set full duplex"
--* s/spin_lock_irq/spin_lock_irqsave/
--* Only set AcceptMulticast if more than one mc address
--* Only set rx_mode if changed, in set_rx_mode
--* Only suspend/resume if interface is up
--* Always print out version upon module load, even if no devices found
--
--
--Version 0.9.15 - February 20, 2001
--
--* Call pci_enable_device to wake up/assign resource to device,
-- before actually using it.
--* Support wacky clone PCI ids (report from Norival Toniato Junior)
--* Text spelling corrections
--* Make sure tp->phys[] is signed
--* Always wake queue after hw restart, in tx_timeout
--* Record time of last received packet
--
--
--Version 0.9.14 - January 11, 2001
--
--* Merge some changes from Becker version 1.13:
-- * Add DFE 538TX PCI id
-- * MII read/write functions updated
-- * Cfg93[45]6 lock/unlock fix
-- * RTL-8129 (MII) support
--* Clean up spinlocking
--
--
--Version 0.9.13 - December, 2000
--
--* Clear blocked signals, avoid buffer overrun setting current->comm
--* Remove bogus PCI BAR length assertions
--* Remove unused 'debug' module parameter
--
--
--Version 0.9.12 - November 23, 2000
--
--* Kill major Tx stop/wake queue race
--* Use SET_MODULE_OWNER and fix module unload race
--* Fix cable length ("Twister") tuning
--* Proper media[] array length checking
--* Replace timer with kernel thread for twister tuning state machine
-- and media checking. Fixes mdio_xxx locking, now mdio_xxx is always
-- protected by rtnl_lock semaphore.
--* Correct some sledgehammer a.k.a. overzealous spin-locks
--* Performance: Eliminate atomic_t for Tx counters, we don't need it
--* Performance: Don't copy Tx buffer if the rare case occurs where it
-- is aligned perfectly for us.
--* Eliminate needless casting of dev->priv
--* PIO mode selection and Twister tuning are now CONFIG_xxx options
-- (though purposefully not in net/Config.in... yet)
--
--
--Version 0.9.11 - October 28, 2000
--
--* Do not fail when PIO and MMIO region lengths do not match.
-- (They don't on some CardBus models, at least)
--* Sanity check Rx packet status and size (Tobias)
--* When handling a Tx timeout, disable Tx ASAP if not already.
--* Do not inline Tx interrupt handler (better register usage)
--* Handle dirty_tx signed integer wrap
--* Do not abort Rx processing on lack of memory, keep going
-- until the current Rx ring is completely handling. (Tobias)
--* Clean up rtl8139_close
--* Whitespace correction for dev_kfree_skb_irq call
--
--
--Version 0.9.10 - September 12, 2000
--
--* Never wrap an Rx packet (faster Rx interrupt handling)
--* Clear all TxAborted conditions (bug fix)
--* Correct copyright
--* More credits
--* Update NWay doc URL
--* Clean up commonly used ifdef switches
--* Reorg info displayed at bootup/modprobe time
--* Remove some unneeded spinlocks
--* Misc cosmetic code cleanup
--* Always print interrupt status for abnormal interrupts
--* Use RealTek-recommended FIFO and DMA burst settings (1024 bytes)
--
--
--Version 0.9.9 - September 9, 2000
--
--* Fix oops-able bug in Rx ring wrap calculation (David Ford)
--* Use PIO instead of MMIO when USE_IO_OPS is defined
--* Move Rx error handling out of Rx interrupt handler, resulting in
-- tighter Rx interrupt processing
--
--
--Version 0.9.8 - September 7, 2000
--
--* Propagate request_irq error value (andrew morton)
--* Correct potential oops bug in PCI DMA unmap code
--* Fix bugs related to counting/discounting of 32-bit CRC in each Rx packet
--* Fix 16/32-bit bug in interrupt status check
--* Timer cleanups (andrew morton)
--
--
--Version 0.9.7 - June 11, 2000
--
--* Fix support for older chips (RTL8139 early chips should now work again)
--
--
--Version 0.9.6 - May 30, 2000
--
--* Fix 4-extra-bytes bug
-- (thanks to Markus Westergren, via Santiago Garcia Mantinan)
--* Yet more improved chip recognition
--
--
--Version 0.9.5 - May 17, 2000
--
--* Improved chip version recognition
--* Continue banging away at receiver hang problem
--* Use spin_lock_irq in another spot
--* Don't print anything on pci_enable_device, it does so for us
--* Disable buggy NWay code
--* Define TxConfig bitmasks
--
--
--Version 0.9.4.1 - April 27, 2000 - third public beta release
--
--* Replace several "magic numbers" with symbolic constants
--* Differentiate between board-specific info and chip-specific info
-- (allows for easier support of specific boards or chips)
--* Move some of the transmit side outside of the spinlock
-- by using atomic variables. Use spin_lock_irq instead of
-- spin_lock_irq{save,restore} in select places, for better performance.
--* New module option "media" for forcing media selection. Functions the
-- same as "options" in other drivers, and will soon be renamed
-- 'options' to be homogeneous.
--* New power management wake-up code
--* Slightly more verbose chip id messages in kernel log
--* Add/correct chip register constant list
--* New chipset wake up (open) logic
--* No longer locks CONFIGx updates
--* Do not set Interfame Gap (IFG) bits in TxConfig
--* Better Rx reset logic in case of Rx FIFO Overflow
--* For chips which support it, enable bit to automatically clear Rx
-- FIFO overflow
--* No longer enable and disable interrupts in interrupt handler
-- (technique borrowed from BSD driver, appears to have problems
-- with some chips)
--* H/W spinlock now protects ioctl
--* Chipset-dependent RxConfig settings
--
--
--Version 0.9.3.3.2 - Feb 22, 2000 - second public beta release
--
--* Begin integration of Daniel Kobras' MMIO flush patch (disabled for now)
--* Softnet logic updates to fix bugs and improve performance
--* Dynamic sizing of I/O resources (0x80 for older chips, 0xFF for newer ones)
--* Remove bogus SiS entries from PCI probe table
--* Add support for cards
-- "Delta Electronics 8139 10/100BaseTX"
-- "Addtron Technolgy 8139 10/100BaseTX"
--* Fix major bug with rx ring buffer size (also present in rtl8139.c 1.08r)
--* PCI DMA mapping by Dave Miller
--* Complete rewrite of SMP locking logic
--* Hotplug support
--* Call rtl8139_hw_start from rtl8139_open, and remove duplicated code
-- from rtl8139_open
--* Reset NWay registers to sane defaults on rtl8139_open/hw_start
--* Miscellaneous code cleanup
--
--
--Version 0.7.0 - Feb 7, 2000 - first public beta release
--* Initial public version, derived from Donald Becker's rtl8139.c v1.08r
--
--[EOF]
--
---- linux-2.6.0/Documentation/networking/bonding.txt 2003-09-27 18:57:43.000000000 -0700
-+++ 25/Documentation/networking/bonding.txt 2003-12-28 23:21:00.000000000 -0800
-@@ -21,7 +21,7 @@ userspace tools, please follow the links
-
- Table of Contents
- =================
--
-+
- Installation
- Bond Configuration
- Module Parameters
-@@ -66,7 +66,7 @@ of the -I option on the ifenslave compil
- /usr/include/linux.
-
- To install ifenslave.c, do:
-- # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave
-+ # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave
- # cp ifenslave /sbin/ifenslave
-
-
-@@ -74,10 +74,10 @@ Bond Configuration
- ==================
-
- You will need to add at least the following line to /etc/modules.conf
--so the bonding driver will automatically load when the bond0 interface is
--configured. Refer to the modules.conf manual page for specific modules.conf
--syntax details. The Module Parameters section of this document describes each
--bonding driver parameter.
-+so the bonding driver will automatically load when the bond0 interface is
-+configured. Refer to the modules.conf manual page for specific modules.conf
-+syntax details. The Module Parameters section of this document describes each
-+bonding driver parameter.
-
- alias bond0 bonding
-
-@@ -113,7 +113,7 @@ bonding interface (bond1), use MASTER=bo
- network interface be a slave of bond1.
-
- Restart the networking subsystem or just bring up the bonding device if your
--administration tools allow it. Otherwise, reboot. On Red Hat distros you can
-+administration tools allow it. Otherwise, reboot. On Red Hat distros you can
- issue `ifup bond0' or `/etc/rc.d/init.d/network restart'.
-
- If the administration tools of your distribution do not support
-@@ -128,30 +128,30 @@ manually configure the bonding device wi
-
- (use appropriate values for your network above)
-
--You can then create a script containing these commands and place it in the
-+You can then create a script containing these commands and place it in the
- appropriate rc directory.
-
- If you specifically need all network drivers loaded before the bonding driver,
--adding the following line to modules.conf will cause the network driver for
-+adding the following line to modules.conf will cause the network driver for
- eth0 and eth1 to be loaded before the bonding driver.
-
- probeall bond0 eth0 eth1 bonding
-
--Be careful not to reference bond0 itself at the end of the line, or modprobe
-+Be careful not to reference bond0 itself at the end of the line, or modprobe
- will die in an endless recursive loop.
-
--To have device characteristics (such as MTU size) propagate to slave devices,
--set the bond characteristics before enslaving the device. The characteristics
-+To have device characteristics (such as MTU size) propagate to slave devices,
-+set the bond characteristics before enslaving the device. The characteristics
- are propagated during the enslave process.
-
--If running SNMP agents, the bonding driver should be loaded before any network
--drivers participating in a bond. This requirement is due to the the interface
--index (ipAdEntIfIndex) being associated to the first interface found with a
--given IP address. That is, there is only one ipAdEntIfIndex for each IP
--address. For example, if eth0 and eth1 are slaves of bond0 and the driver for
--eth0 is loaded before the bonding driver, the interface for the IP address
--will be associated with the eth0 interface. This configuration is shown below,
--the IP address 192.168.1.1 has an interface index of 2 which indexes to eth0
-+If running SNMP agents, the bonding driver should be loaded before any network
-+drivers participating in a bond. This requirement is due to the the interface
-+index (ipAdEntIfIndex) being associated to the first interface found with a
-+given IP address. That is, there is only one ipAdEntIfIndex for each IP
-+address. For example, if eth0 and eth1 are slaves of bond0 and the driver for
-+eth0 is loaded before the bonding driver, the interface for the IP address
-+will be associated with the eth0 interface. This configuration is shown below,
-+the IP address 192.168.1.1 has an interface index of 2 which indexes to eth0
- in the ifDescr table (ifDescr.2).
-
- interfaces.ifTable.ifEntry.ifDescr.1 = lo
-@@ -189,10 +189,10 @@ functions such as Interface_Scan_Next wi
- Module Parameters
- =================
-
--Optional parameters for the bonding driver can be supplied as command line
--arguments to the insmod command. Typically, these parameters are specified in
--the file /etc/modules.conf (see the manual page for modules.conf). The
--available bonding driver parameters are listed below. If a parameter is not
-+Optional parameters for the bonding driver can be supplied as command line
-+arguments to the insmod command. Typically, these parameters are specified in
-+the file /etc/modules.conf (see the manual page for modules.conf). The
-+available bonding driver parameters are listed below. If a parameter is not
- specified the default value is used. When initially configuring a bond, it
- is recommended "tail -f /var/log/messages" be run in a separate window to
- watch for bonding driver error messages.
-@@ -202,19 +202,19 @@ parameters be specified, otherwise serio
- during link failures.
-
- arp_interval
--
-- Specifies the ARP monitoring frequency in milli-seconds.
-- If ARP monitoring is used in a load-balancing mode (mode 0 or 2), the
-- switch should be configured in a mode that evenly distributes packets
-- across all links - such as round-robin. If the switch is configured to
-- distribute the packets in an XOR fashion, all replies from the ARP
-- targets will be received on the same link which could cause the other
-+
-+ Specifies the ARP monitoring frequency in milli-seconds.
-+ If ARP monitoring is used in a load-balancing mode (mode 0 or 2), the
-+ switch should be configured in a mode that evenly distributes packets
-+ across all links - such as round-robin. If the switch is configured to
-+ distribute the packets in an XOR fashion, all replies from the ARP
-+ targets will be received on the same link which could cause the other
- team members to fail. ARP monitoring should not be used in conjunction
-- with miimon. A value of 0 disables ARP monitoring. The default value
-+ with miimon. A value of 0 disables ARP monitoring. The default value
- is 0.
--
-+
- arp_ip_target
--
-+
- Specifies the ip addresses to use when arp_interval is > 0. These
- are the targets of the ARP request sent to determine the health of
- the link to the targets. Specify these values in ddd.ddd.ddd.ddd
-@@ -223,8 +223,8 @@ arp_ip_target
- maximum number of targets that can be specified is set at 16.
-
- downdelay
--
-- Specifies the delay time in milli-seconds to disable a link after a
-+
-+ Specifies the delay time in milli-seconds to disable a link after a
- link failure has been detected. This should be a multiple of miimon
- value, otherwise the value will be rounded. The default value is 0.
-
-@@ -247,7 +247,7 @@ max_bonds
- and bond2 will be created. The default value is 1.
-
- miimon
--
-+
- Specifies the frequency in milli-seconds that MII link monitoring
- will occur. A value of zero disables MII link monitoring. A value
- of 100 is a good starting point. See High Availability section for
-@@ -258,7 +258,7 @@ mode
- Specifies one of the bonding policies. The default is
- round-robin (balance-rr). Possible values are (you can use
- either the text or numeric option):
--
-+
- balance-rr or 0
-
- Round-robin policy: Transmit in a sequential order
-@@ -273,7 +273,7 @@ mode
- externally visible on only one port (network adapter)
- to avoid confusing the switch. This mode provides
- fault tolerance.
--
-+
- balance-xor or 2
-
- XOR policy: Transmit based on [(source MAC address
-@@ -293,7 +293,7 @@ mode
- groups that share the same speed and duplex settings.
- Transmits and receives on all slaves in the active
- aggregator.
--
-+
- Pre-requisites:
-
- 1. Ethtool support in the base drivers for retrieving the
-@@ -317,7 +317,7 @@ mode
- Ethtool support in the base drivers for retrieving the
- speed of each slave.
-
-- balance-alb or 6
-+ balance-alb or 6
-
- Adaptive load balancing: includes balance-tlb + receive
- load balancing (rlb) for IPV4 traffic and does not require
-@@ -327,7 +327,7 @@ mode
- overwrites the src hw address with the unique hw address of
- one of the slaves in the bond such that different clients
- use different hw addresses for the server.
--
-+
- Receive traffic from connections created by the server is
- also balanced. When the server sends an ARP Request the
- bonding driver copies and saves the client's IP information
-@@ -363,25 +363,11 @@ mode
- 2. Base driver support for setting the hw address of a
- device also when it is open. This is required so that there
- will always be one slave in the team using the bond hw
-- address (the current_slave) while having a unique hw
-- address for each slave in the bond. If the current_slave
-- fails it's hw address is swapped with the new current_slave
-+ address (the curr_active_slave) while having a unique hw
-+ address for each slave in the bond. If the curr_active_slave
-+ fails it's hw address is swapped with the new curr_active_slave
- that was chosen.
-
--multicast
--
-- Option specifying the mode of operation for multicast support.
-- Possible values are:
--
-- disabled or 0
-- Disabled (no multicast support)
--
-- active or 1
-- Enabled on active slave only, useful in active-backup mode
--
-- all or 2
-- Enabled on all slaves, this is the default
--
- primary
-
- A string (eth0, eth2, etc) to equate to a primary device. If this
-@@ -397,11 +383,11 @@ primary
- primary is only valid in active-backup mode.
-
- updelay
--
-- Specifies the delay time in milli-seconds to enable a link after a
-+
-+ Specifies the delay time in milli-seconds to enable a link after a
- link up status has been detected. This should be a multiple of miimon
- value, otherwise the value will be rounded. The default value is 0.
--
-+
- use_carrier
-
- Specifies whether or not miimon should use MII or ETHTOOL
-@@ -529,20 +515,20 @@ Verifying Bond Configuration
- ----------------------------
- The bonding driver information files reside in the /proc/net/bonding directory.
-
--Sample contents of /proc/net/bonding/bond0 after the driver is loaded with
-+Sample contents of /proc/net/bonding/bond0 after the driver is loaded with
- parameters of mode=0 and miimon=1000 is shown below.
--
-+
- Bonding Mode: load balancing (round-robin)
- Currently Active Slave: eth0
- MII Status: up
- MII Polling Interval (ms): 1000
- Up Delay (ms): 0
- Down Delay (ms): 0
--
-+
- Slave Interface: eth1
- MII Status: up
- Link Failure Count: 1
--
-+
- Slave Interface: eth0
- MII Status: up
- Link Failure Count: 1
-@@ -550,34 +536,34 @@ parameters of mode=0 and miimon=1000 is
- 2) Network verification
- -----------------------
- The network configuration can be verified using the ifconfig command. In
--the example below, the bond0 interface is the master (MASTER) while eth0 and
--eth1 are slaves (SLAVE). Notice all slaves of bond0 have the same MAC address
-+the example below, the bond0 interface is the master (MASTER) while eth0 and
-+eth1 are slaves (SLAVE). Notice all slaves of bond0 have the same MAC address
- (HWaddr) as bond0 for all modes except TLB and ALB that require a unique MAC
- address for each slave.
-
- [root]# /sbin/ifconfig
--bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
-+bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
- inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
- UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
- RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0
- TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0
-- collisions:0 txqueuelen:0
-+ collisions:0 txqueuelen:0
-
--eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
-+eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
- inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
- UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
- RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
- TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
-- collisions:0 txqueuelen:100
-- Interrupt:10 Base address:0x1080
-+ collisions:0 txqueuelen:100
-+ Interrupt:10 Base address:0x1080
-
--eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
-+eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
- inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
- UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
- RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
- TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
-- collisions:0 txqueuelen:100
-- Interrupt:9 Base address:0x1400
-+ collisions:0 txqueuelen:100
-+ Interrupt:9 Base address:0x1400
-
-
- Frequently Asked Questions
-@@ -605,9 +591,9 @@ Frequently Asked Questions
-
- 5. What happens when a slave link dies?
-
-- If your ethernet cards support MII or ETHTOOL link status monitoring
-- and the MII monitoring has been enabled in the driver (see description
-- of module parameters), there will be no adverse consequences. This
-+ If your ethernet cards support MII or ETHTOOL link status monitoring
-+ and the MII monitoring has been enabled in the driver (see description
-+ of module parameters), there will be no adverse consequences. This
- release of the bonding driver knows how to get the MII information and
- enables or disables its slaves according to their link status.
- See section on High Availability for additional information.
-@@ -622,8 +608,8 @@ Frequently Asked Questions
- slave.
-
- If neither mii_monitor and arp_interval is configured, the bonding
-- driver will not handle this situation very well. The driver will
-- continue to send packets but some packets will be lost. Retransmits
-+ driver will not handle this situation very well. The driver will
-+ continue to send packets but some packets will be lost. Retransmits
- will cause serious degradation of performance (in the case when one
- of two slave links fails, 50% packets will be lost, which is a serious
- problem for both TCP and UDP).
-@@ -636,9 +622,9 @@ Frequently Asked Questions
-
- 7. Which switches/systems does it work with?
-
-- In round-robin and XOR mode, it works with systems that support
-+ In round-robin and XOR mode, it works with systems that support
- trunking:
--
-+
- * Many Cisco switches and routers (look for EtherChannel support).
- * SunTrunking software.
- * Alteon AceDirector switches / WebOS (use Trunks).
-@@ -646,7 +632,7 @@ Frequently Asked Questions
- models (450) can define trunks between ports on different physical
- units.
- * Linux bonding, of course !
--
-+
- In 802.3ad mode, it works with with systems that support IEEE 802.3ad
- Dynamic Link Aggregation:
-
-@@ -667,21 +653,21 @@ Frequently Asked Questions
- is then passed to all following slaves and remains persistent (even if
- the the first slave is removed) until the bonding device is brought
- down or reconfigured.
--
-+
- If you wish to change the MAC address, you can set it with ifconfig:
-
- # ifconfig bond0 hw ether 00:11:22:33:44:55
-
- The MAC address can be also changed by bringing down/up the device
- and then changing its slaves (or their order):
--
-+
- # ifconfig bond0 down ; modprobe -r bonding
- # ifconfig bond0 .... up
- # ifenslave bond0 eth...
-
- This method will automatically take the address from the next slave
- that will be added.
--
-+
- To restore your slaves' MAC addresses, you need to detach them
- from the bond (`ifenslave -d bond0 eth0'), set them down
- (`ifconfig eth0 down'), unload the drivers (`rmmod 3c59x', for
-@@ -729,27 +715,27 @@ High Availability
- =================
-
- To implement high availability using the bonding driver, the driver needs to be
--compiled as a module, because currently it is the only way to pass parameters
-+compiled as a module, because currently it is the only way to pass parameters
- to the driver. This may change in the future.
-
--High availability is achieved by using MII or ETHTOOL status reporting. You
--need to verify that all your interfaces support MII or ETHTOOL link status
--reporting. On Linux kernel 2.2.17, all the 100 Mbps capable drivers and
--yellowfin gigabit driver support MII. To determine if ETHTOOL link reporting
--is available for interface eth0, type "ethtool eth0" and the "Link detected:"
--line should contain the correct link status. If your system has an interface
--that does not support MII or ETHTOOL status reporting, a failure of its link
--will not be detected! A message indicating MII and ETHTOOL is not supported by
--a network driver is logged when the bonding driver is loaded with a non-zero
-+High availability is achieved by using MII or ETHTOOL status reporting. You
-+need to verify that all your interfaces support MII or ETHTOOL link status
-+reporting. On Linux kernel 2.2.17, all the 100 Mbps capable drivers and
-+yellowfin gigabit driver support MII. To determine if ETHTOOL link reporting
-+is available for interface eth0, type "ethtool eth0" and the "Link detected:"
-+line should contain the correct link status. If your system has an interface
-+that does not support MII or ETHTOOL status reporting, a failure of its link
-+will not be detected! A message indicating MII and ETHTOOL is not supported by
-+a network driver is logged when the bonding driver is loaded with a non-zero
- miimon value.
-
- The bonding driver can regularly check all its slaves links using the ETHTOOL
--IOCTL (ETHTOOL_GLINK command) or by checking the MII status registers. The
--check interval is specified by the module argument "miimon" (MII monitoring).
--It takes an integer that represents the checking time in milliseconds. It
--should not come to close to (1000/HZ) (10 milli-seconds on i386) because it
--may then reduce the system interactivity. A value of 100 seems to be a good
--starting point. It means that a dead link will be detected at most 100
-+IOCTL (ETHTOOL_GLINK command) or by checking the MII status registers. The
-+check interval is specified by the module argument "miimon" (MII monitoring).
-+It takes an integer that represents the checking time in milliseconds. It
-+should not come to close to (1000/HZ) (10 milli-seconds on i386) because it
-+may then reduce the system interactivity. A value of 100 seems to be a good
-+starting point. It means that a dead link will be detected at most 100
- milli-seconds after it goes down.
-
- Example:
-@@ -761,7 +747,7 @@ Or, put the following lines in /etc/modu
- alias bond0 bonding
- options bond0 miimon=100
-
--There are currently two policies for high availability. They are dependent on
-+There are currently two policies for high availability. They are dependent on
- whether:
-
- a) hosts are connected to a single host or switch that support trunking
-@@ -811,7 +797,7 @@ Example 2 : host to switch at twice the
- # ifenslave bond0 eth0 eth1
-
-
--2) High Availability on two or more switches (or a single switch without
-+2) High Availability on two or more switches (or a single switch without
- trunking support)
- ---------------------------------------------------------------------------
- This mode is more problematic because it relies on the fact that there
-@@ -870,10 +856,10 @@ by another external mechanism, it is goo
- connected to one switch and host2's to the other. Such system will survive
- a failure of a single host, cable, or switch. The worst thing that may happen
- in the case of a switch failure is that half of the hosts will be temporarily
--unreachable until the other switch expires its tables.
-+unreachable until the other switch expires its tables.
-
- Example 2: Using multiple ethernet cards connected to a switch to configure
-- NIC failover (switch is not required to support trunking).
-+ NIC failover (switch is not required to support trunking).
-
-
- +----------+ +----------+
-@@ -957,7 +943,7 @@ The main limitations are :
- servers, but may be useful when the front switches send multicast
- information on their links (e.g. VRRP), or even health-check the servers.
- Use the arp_interval/arp_ip_target parameters to count incoming/outgoing
-- frames.
-+ frames.
-
-
-
-@@ -973,13 +959,12 @@ Donald Becker's Ethernet Drivers and dia
- You will also find a lot of information regarding Ethernet, NWay, MII, etc. at
- www.scyld.com.
-
--For new versions of the driver, patches for older kernels and the updated
--userspace tools, take a look at Willy Tarreau's site :
-+Patches for 2.2 kernels are at Willy Tarreau's site :
- - http://wtarreau.free.fr/pub/bonding/
-- - http://www-miaif.lip6.fr/willy/pub/bonding/
-+ - http://www-miaif.lip6.fr/~tarreau/pub/bonding/
-
- To get latest informations about Linux Kernel development, please consult
- the Linux Kernel Mailing List Archives at :
-- http://boudicca.tux.org/hypermail/linux-kernel/latest/
-+ http://www.ussg.iu.edu/hypermail/linux/kernel/
-
- -- END --
---- linux-2.6.0/Documentation/networking/ifenslave.c 2003-09-27 18:57:43.000000000 -0700
-+++ 25/Documentation/networking/ifenslave.c 2003-12-28 23:21:00.000000000 -0800
-@@ -4,8 +4,6 @@
- * This program controls the Linux implementation of running multiple
- * network interfaces in parallel.
- *
-- * Usage: ifenslave [-v] master-interface < slave-interface [metric <N>] > ...
-- *
- * Author: Donald Becker <becker@cesdis.gsfc.nasa.gov>
- * Copyright 1994-1996 Donald Becker
- *
-@@ -90,24 +88,30 @@
- * - For opt_c: slave should not be set to the master's setting
- * while it is running. It was already set during enslave. To
- * simplify things, it is now handeled separately.
-+ *
-+ * - 2003/09/24 - Shmulik Hen <shmulik.hen at intel dot com>
-+ * - Code cleanup and style changes
-+ * set version to 1.1.0
- */
-
--#define APP_VERSION "1.0.12"
--#define APP_RELDATE "June 30, 2003"
-+#define APP_VERSION "1.1.0"
-+#define APP_RELDATE "Septemer 24, 2003"
- #define APP_NAME "ifenslave"
-
- static char *version =
--APP_NAME ".c:v" APP_VERSION " (" APP_RELDATE ") " "\nDonald Becker (becker@cesdis.gsfc.nasa.gov).\n"
--"detach support added on 2000/10/02 by Willy Tarreau (willy at meta-x.org).\n"
--"2.4 kernel support added on 2001/02/16 by Chad N. Tindel (ctindel at ieee dot org.\n";
-+APP_NAME ".c:v" APP_VERSION " (" APP_RELDATE ")\n"
-+"o Donald Becker (becker@cesdis.gsfc.nasa.gov).\n"
-+"o Detach support added on 2000/10/02 by Willy Tarreau (willy at meta-x.org).\n"
-+"o 2.4 kernel support added on 2001/02/16 by Chad N. Tindel\n"
-+" (ctindel at ieee dot org).\n";
-
- static const char *usage_msg =
--"Usage: ifenslave [-adfrvVh] <master-interface> < <slave-if> [metric <N>] > ...\n"
--" ifenslave -c master-interface slave-if\n";
-+"Usage: ifenslave [-f] <master-if> <slave-if> [<slave-if>...]\n"
-+" ifenslave -d <master-if> <slave-if> [<slave-if>...]\n"
-+" ifenslave -c <master-if> <slave-if>\n"
-+" ifenslave --help\n";
-
--static const char *howto_msg =
--"Usage: ifenslave [-adfrvVh] <master-interface> < <slave-if> [metric <N>] > ...\n"
--" ifenslave -c master-interface slave-if\n"
-+static const char *help_msg =
- "\n"
- " To create a bond device, simply follow these three steps :\n"
- " - ensure that the required drivers are properly loaded :\n"
-@@ -115,18 +119,32 @@ static const char *howto_msg =
- " - assign an IP address to the bond device :\n"
- " # ifconfig bond0 <addr> netmask <mask> broadcast <bcast>\n"
- " - attach all the interfaces you need to the bond device :\n"
--" # ifenslave bond0 eth0 eth1 eth2\n"
-+" # ifenslave [{-f|--force}] bond0 eth0 [eth1 [eth2]...]\n"
- " If bond0 didn't have a MAC address, it will take eth0's. Then, all\n"
- " interfaces attached AFTER this assignment will get the same MAC addr.\n"
--"\n"
--" To detach a dead interface without setting the bond device down :\n"
--" # ifenslave -d bond0 eth1\n"
-+" (except for ALB/TLB modes)\n"
- "\n"
- " To set the bond device down and automatically release all the slaves :\n"
- " # ifconfig bond0 down\n"
- "\n"
-+" To detach a dead interface without setting the bond device down :\n"
-+" # ifenslave {-d|--detach} bond0 eth0 [eth1 [eth2]...]\n"
-+"\n"
- " To change active slave :\n"
--" # ifenslave -c bond0 eth0\n"
-+" # ifenslave {-c|--change-active} bond0 eth0\n"
-+"\n"
-+" To show master interface info\n"
-+" # ifenslave bond0\n"
-+"\n"
-+" To show all interfaces info\n"
-+" # ifenslave {-a|--all-interfaces}\n"
-+"\n"
-+" To be more verbose\n"
-+" # ifenslave {-v|--verbose} ...\n"
-+"\n"
-+" # ifenslave {-u|--usage} Show usage\n"
-+" # ifenslave {-V|--version} Show version\n"
-+" # ifenslave {-h|--help} This message\n"
- "\n";
-
- #include <unistd.h>
-@@ -153,476 +171,332 @@ typedef __uint8_t u8; /* ditto */
- #include <linux/ethtool.h>
-
- struct option longopts[] = {
-- /* { name has_arg *flag val } */
-- {"all-interfaces", 0, 0, 'a'}, /* Show all interfaces. */
-- {"force", 0, 0, 'f'}, /* Force the operation. */
-- {"help", 0, 0, '?'}, /* Give help */
-- {"howto", 0, 0, 'h'}, /* Give some more help */
-- {"receive-slave", 0, 0, 'r'}, /* Make a receive-only slave. */
-- {"verbose", 0, 0, 'v'}, /* Report each action taken. */
-- {"version", 0, 0, 'V'}, /* Emit version information. */
-- {"detach", 0, 0, 'd'}, /* Detach a slave interface. */
-- {"change-active", 0, 0, 'c'}, /* Change the active slave. */
-- { 0, 0, 0, 0 }
-+ /* { name has_arg *flag val } */
-+ {"all-interfaces", 0, 0, 'a'}, /* Show all interfaces. */
-+ {"change-active", 0, 0, 'c'}, /* Change the active slave. */
-+ {"detach", 0, 0, 'd'}, /* Detach a slave interface. */
-+ {"force", 0, 0, 'f'}, /* Force the operation. */
-+ {"help", 0, 0, 'h'}, /* Give help */
-+ {"usage", 0, 0, 'u'}, /* Give usage */
-+ {"verbose", 0, 0, 'v'}, /* Report each action taken. */
-+ {"version", 0, 0, 'V'}, /* Emit version information. */
-+ { 0, 0, 0, 0}
- };
-
- /* Command-line flags. */
- unsigned int
--opt_a = 0, /* Show-all-interfaces flag. */
--opt_f = 0, /* Force the operation. */
--opt_r = 0, /* Set up a Rx-only slave. */
--opt_d = 0, /* detach a slave interface. */
--opt_c = 0, /* change-active-slave flag. */
--verbose = 0, /* Verbose flag. */
--opt_version = 0,
--opt_howto = 0;
--int skfd = -1; /* AF_INET socket for ioctl() calls. */
-+opt_a = 0, /* Show-all-interfaces flag. */
-+opt_c = 0, /* Change-active-slave flag. */
-+opt_d = 0, /* Detach a slave interface. */
-+opt_f = 0, /* Force the operation. */
-+opt_h = 0, /* Help */
-+opt_u = 0, /* Usage */
-+opt_v = 0, /* Verbose flag. */
-+opt_V = 0; /* Version */
-+
-+int skfd = -1; /* AF_INET socket for ioctl() calls.*/
-+int abi_ver = 0; /* userland - kernel ABI version */
-+int hwaddr_set = 0; /* Master's hwaddr is set */
-+int saved_errno;
-+
-+struct ifreq master_mtu, master_flags, master_hwaddr;
-+struct ifreq slave_mtu, slave_flags, slave_hwaddr;
-+
-+struct dev_ifr {
-+ struct ifreq *req_ifr;
-+ char *req_name;
-+ int req_type;
-+};
-+
-+struct dev_ifr master_ifra[] = {
-+ {&master_mtu, "SIOCGIFMTU", SIOCGIFMTU},
-+ {&master_flags, "SIOCGIFFLAGS", SIOCGIFFLAGS},
-+ {&master_hwaddr, "SIOCGIFHWADDR", SIOCGIFHWADDR},
-+ {NULL, "", 0}
-+};
-+
-+struct dev_ifr slave_ifra[] = {
-+ {&slave_mtu, "SIOCGIFMTU", SIOCGIFMTU},
-+ {&slave_flags, "SIOCGIFFLAGS", SIOCGIFFLAGS},
-+ {&slave_hwaddr, "SIOCGIFHWADDR", SIOCGIFHWADDR},
-+ {NULL, "", 0}
-+};
-
- static void if_print(char *ifname);
--static int get_abi_ver(char *master_ifname);
-+static int get_drv_info(char *master_ifname);
-+static int get_if_settings(char *ifname, struct dev_ifr ifra[]);
-+static int get_slave_flags(char *slave_ifname);
-+static int set_master_hwaddr(char *master_ifname, struct sockaddr *hwaddr);
-+static int set_slave_hwaddr(char *slave_ifname, struct sockaddr *hwaddr);
-+static int set_slave_mtu(char *slave_ifname, int mtu);
-+static int set_if_flags(char *ifname, short flags);
-+static int set_if_up(char *ifname, short flags);
-+static int set_if_down(char *ifname, short flags);
-+static int clear_if_addr(char *ifname);
-+static int set_if_addr(char *master_ifname, char *slave_ifname);
-+static int change_active(char *master_ifname, char *slave_ifname);
-+static int enslave(char *master_ifname, char *slave_ifname);
-+static int release(char *master_ifname, char *slave_ifname);
-+#define v_print(fmt, args...) \
-+ if (opt_v) \
-+ fprintf(stderr, fmt, ## args )
-
--int
--main(int argc, char **argv)
-+int main(int argc, char *argv[])
- {
-- struct ifreq ifr2, if_hwaddr, if_ipaddr, if_metric, if_mtu, if_dstaddr;
-- struct ifreq if_netmask, if_brdaddr, if_flags;
-- int rv, goterr = 0;
-- int c, errflag = 0;
-- sa_family_t master_family;
- char **spp, *master_ifname, *slave_ifname;
-- int hwaddr_notset;
-- int abi_ver = 0;
-+ int c, i, rv;
-+ int res = 0;
-+ int exclusive = 0;
-
-- while ((c = getopt_long(argc, argv, "acdfrvV?h", longopts, 0)) != EOF)
-+ while ((c = getopt_long(argc, argv, "acdfhuvV", longopts, 0)) != EOF) {
- switch (c) {
-- case 'a': opt_a++; break;
-- case 'f': opt_f++; break;
-- case 'r': opt_r++; break;
-- case 'd': opt_d++; break;
-- case 'c': opt_c++; break;
-- case 'v': verbose++; break;
-- case 'V': opt_version++; break;
-- case 'h': opt_howto++; break;
-- case '?': errflag++;
-- }
-+ case 'a': opt_a++; exclusive++; break;
-+ case 'c': opt_c++; exclusive++; break;
-+ case 'd': opt_d++; exclusive++; break;
-+ case 'f': opt_f++; exclusive++; break;
-+ case 'h': opt_h++; exclusive++; break;
-+ case 'u': opt_u++; exclusive++; break;
-+ case 'v': opt_v++; break;
-+ case 'V': opt_V++; exclusive++; break;
-
-- /* option check */
-- if (opt_c)
-- if(opt_a || opt_f || opt_r || opt_d || verbose || opt_version ||
-- opt_howto || errflag ) {
-+ case '?':
- fprintf(stderr, usage_msg);
-- return 2;
-+ res = 2;
-+ goto out;
- }
-+ }
-
-- if (errflag) {
-+ /* options check */
-+ if (exclusive > 1) {
- fprintf(stderr, usage_msg);
-- return 2;
-+ res = 2;
-+ goto out;
- }
-
-- if (opt_howto) {
-- fprintf(stderr, howto_msg);
-- return 0;
-+ if (opt_v || opt_V) {
-+ printf(version);
-+ if (opt_V) {
-+ res = 0;
-+ goto out;
-+ }
- }
-
-- if (verbose || opt_version) {
-- printf(version);
-- if (opt_version)
-- exit(0);
-+ if (opt_u) {
-+ printf(usage_msg);
-+ res = 0;
-+ goto out;
- }
-
-- /* Open a basic socket. */
-- if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) {
-- perror("socket");
-- exit(-1);
-+ if (opt_h) {
-+ printf(usage_msg);
-+ printf(help_msg);
-+ res = 0;
-+ goto out;
- }
-
-- if (verbose)
-- fprintf(stderr, "DEBUG: argc=%d, optind=%d and argv[optind] is %s.\n",
-- argc, optind, argv[optind]);
-+ /* Open a basic socket */
-+ if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
-+ perror("socket");
-+ res = 1;
-+ goto out;
-+ }
-
-- /* No remaining args means show all interfaces. */
-- if (optind == argc) {
-- if_print((char *)NULL);
-- (void) close(skfd);
-- exit(0);
-+ if (opt_a) {
-+ if (optind == argc) {
-+ /* No remaining args */
-+ /* show all interfaces */
-+ if_print((char *)NULL);
-+ goto out;
-+ } else {
-+ /* Just show usage */
-+ fprintf(stderr, usage_msg);
-+ res = 2;
-+ goto out;
-+ }
- }
-
-- /* Copy the interface name. */
-+ /* Copy the interface name */
- spp = argv + optind;
- master_ifname = *spp++;
-- slave_ifname = *spp++;
-
-- /* Check command line. */
-- if (opt_c) {
-- char **tempp = spp;
-- if ((master_ifname == NULL)||(slave_ifname == NULL)||(*tempp++ != NULL)) {
-- fprintf(stderr, usage_msg);
-- (void) close(skfd);
-- return 2;
-- }
-+ if (master_ifname == NULL) {
-+ fprintf(stderr, usage_msg);
-+ res = 2;
-+ goto out;
- }
-
-- /* A single args means show the configuration for this interface. */
-- if (slave_ifname == NULL) {
-- if_print(master_ifname);
-- (void) close(skfd);
-- exit(0);
-+ /* exchange abi version with bonding module */
-+ res = get_drv_info(master_ifname);
-+ if (res) {
-+ fprintf(stderr,
-+ "Master '%s': Error: handshake with driver failed. "
-+ "Aborting\n",
-+ master_ifname);
-+ goto out;
- }
-
-- /* exchange abi version with bonding driver */
-- abi_ver = get_abi_ver(master_ifname);
-- if (abi_ver < 0) {
-- (void) close(skfd);
-- exit(1);
-- }
--
-- /* Get the vitals from the master interface. */
-- {
-- struct ifreq *ifra[7] = { &if_ipaddr, &if_mtu, &if_dstaddr,
-- &if_brdaddr, &if_netmask, &if_flags,
-- &if_hwaddr };
-- const char *req_name[7] = {
-- "IP address", "MTU", "destination address",
-- "broadcast address", "netmask", "status flags",
-- "hardware address" };
-- const int ioctl_req_type[7] = {
-- SIOCGIFADDR, SIOCGIFMTU, SIOCGIFDSTADDR,
-- SIOCGIFBRDADDR, SIOCGIFNETMASK, SIOCGIFFLAGS,
-- SIOCGIFHWADDR };
-- int i;
--
-- for (i = 0; i < 7; i++) {
-- strncpy(ifra[i]->ifr_name, master_ifname, IFNAMSIZ);
-- if (ioctl(skfd, ioctl_req_type[i], ifra[i]) < 0) {
-- fprintf(stderr,
-- "Something broke getting the master's %s: %s.\n",
-- req_name[i], strerror(errno));
-- }
-- }
--
-- /* check if master is up; if not then fail any operation */
-- if (!(if_flags.ifr_flags & IFF_UP)) {
-- fprintf(stderr, "Illegal operation; the specified master interface '%s' is not up.\n", master_ifname);
-- (void) close(skfd);
-- exit (1);
-- }
-+ slave_ifname = *spp++;
-
-- hwaddr_notset = 1; /* assume master's address not set yet */
-- for (i = 0; hwaddr_notset && (i < 6); i++) {
-- hwaddr_notset &= ((unsigned char *)if_hwaddr.ifr_hwaddr.sa_data)[i] == 0;
-+ if (slave_ifname == NULL) {
-+ if (opt_d || opt_c) {
-+ fprintf(stderr, usage_msg);
-+ res = 2;
-+ goto out;
- }
-
-- /* The family '1' is ARPHRD_ETHER for ethernet. */
-- if (if_hwaddr.ifr_hwaddr.sa_family != 1 && !opt_f) {
-- fprintf(stderr, "The specified master interface '%s' is not"
-- " ethernet-like.\n This program is designed to work"
-- " with ethernet-like network interfaces.\n"
-- " Use the '-f' option to force the operation.\n",
-- master_ifname);
-- (void) close(skfd);
-- exit (1);
-- }
-- master_family = if_hwaddr.ifr_hwaddr.sa_family;
-- if (verbose) {
-- unsigned char *hwaddr = (unsigned char *)if_hwaddr.ifr_hwaddr.sa_data;
-- printf("The current hardware address (SIOCGIFHWADDR) of %s is type %d "
-- "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", master_ifname,
-- if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
-- hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
-- }
-+ /* A single arg means show the
-+ * configuration for this interface
-+ */
-+ if_print(master_ifname);
-+ goto out;
- }
-
-+ res = get_if_settings(master_ifname, master_ifra);
-+ if (res) {
-+ /* Probably a good reason not to go on */
-+ fprintf(stderr,
-+ "Master '%s': Error: get settings failed: %s. "
-+ "Aborting\n",
-+ master_ifname, strerror(res));
-+ goto out;
-+ }
-
-- /* do this when enslaving interfaces */
-- do {
-- if (opt_d) { /* detach a slave interface from the master */
-- strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);
-- strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);
-- if ((ioctl(skfd, SIOCBONDRELEASE, &if_flags) < 0) &&
-- (ioctl(skfd, BOND_RELEASE_OLD, &if_flags) < 0)) {
-- fprintf(stderr, "SIOCBONDRELEASE: cannot detach %s from %s. errno=%s.\n",
-- slave_ifname, master_ifname, strerror(errno));
-- }
-- else if (abi_ver < 1) {
-- /* The driver is using an old ABI, so we'll set the interface
-- * down to avoid any conflicts due to same IP/MAC
-- */
-- strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ);
-- if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) {
-- int saved_errno = errno;
-- fprintf(stderr, "SIOCGIFFLAGS on %s failed: %s\n", slave_ifname,
-- strerror(saved_errno));
-- }
-- else {
-- ifr2.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
-- if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
-- int saved_errno = errno;
-- fprintf(stderr, "Shutting down interface %s failed: %s\n",
-- slave_ifname, strerror(saved_errno));
-- }
-- }
-- }
-- } else if (opt_c) { /* change primary slave */
-- strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);
-- strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);
-- if ((ioctl(skfd, SIOCBONDCHANGEACTIVE, &if_flags) < 0) &&
-- (ioctl(skfd, BOND_CHANGE_ACTIVE_OLD, &if_flags) < 0)) {
-- fprintf(stderr, "SIOCBONDCHANGEACTIVE: %s.\n", strerror(errno));
-- }
-- } else { /* attach a slave interface to the master */
--
-- strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ);
-- if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) {
-- int saved_errno = errno;
-- fprintf(stderr, "SIOCGIFFLAGS on %s failed: %s\n", slave_ifname,
-- strerror(saved_errno));
-- (void) close(skfd);
-- return 1;
-- }
--
-- if ((ifr2.ifr_flags & IFF_SLAVE) && !opt_r) {
-- fprintf(stderr, "%s is already a slave\n", slave_ifname);
-- (void) close(skfd);
-- return 1;
-- }
--
-- /* if hwaddr_notset, assign the slave hw address to the master */
-- if (hwaddr_notset) {
-- /* assign the slave hw address to the
-- * master since it currently does not
-- * have one; otherwise, slaves may
-- * have different hw addresses in
-- * active-backup mode as seen when enslaving
-- * using "ifenslave bond0 eth0 eth1" because
-- * hwaddr_notset is set outside this loop.
-- * TODO: put this and the "else" portion in
-- * a function.
-- */
-- /* get the slaves MAC address */
-- strncpy(if_hwaddr.ifr_name, slave_ifname,
-- IFNAMSIZ);
-- rv = ioctl(skfd, SIOCGIFHWADDR, &if_hwaddr);
-- if (-1 == rv) {
-- fprintf(stderr, "Could not get MAC "
-- "address of %s: %s\n",
-- slave_ifname,
-- strerror(errno));
-- strncpy(if_hwaddr.ifr_name,
-- master_ifname, IFNAMSIZ);
-- goterr = 1;
-- }
--
-- if (!goterr) {
-- if (abi_ver < 1) {
-- /* In ABI versions older than 1, the
-- * master's set_mac routine couldn't
-- * work if it was up, because it
-- * used the default ethernet set_mac
-- * function.
-- */
-- /* bring master down */
-- if_flags.ifr_flags &= ~IFF_UP;
-- if (ioctl(skfd, SIOCSIFFLAGS,
-- &if_flags) < 0) {
-- goterr = 1;
-- fprintf(stderr,
-- "Shutting down "
-- "interface %s failed: "
-- "%s\n",
-- master_ifname,
-- strerror(errno));
-- }
-- }
--
-- strncpy(if_hwaddr.ifr_name,
-- master_ifname, IFNAMSIZ);
-- if (ioctl(skfd, SIOCSIFHWADDR,
-- &if_hwaddr) < 0) {
-- fprintf(stderr,
-- "Could not set MAC "
-- "address of %s: %s\n",
-- master_ifname,
-- strerror(errno));
-- goterr=1;
-- } else {
-- hwaddr_notset = 0;
-- }
--
-- if (abi_ver < 1) {
-- /* bring master back up */
-- if_flags.ifr_flags |= IFF_UP;
-- if (ioctl(skfd, SIOCSIFFLAGS,
-- &if_flags) < 0) {
-- fprintf(stderr,
-- "Bringing up interface "
-- "%s failed: %s\n",
-- master_ifname,
-- strerror(errno));
-- }
-- }
-- }
-- } else if (abi_ver < 1) { /* if (hwaddr_notset) */
--
-- /* The driver is using an old ABI, so we'll set the interface
-- * down and assign the master's hwaddr to it
-- */
-- if (ifr2.ifr_flags & IFF_UP) {
-- ifr2.ifr_flags &= ~IFF_UP;
-- if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
-- int saved_errno = errno;
-- fprintf(stderr, "Shutting down interface %s failed: %s\n",
-- slave_ifname, strerror(saved_errno));
-- }
-- }
--
-- strncpy(if_hwaddr.ifr_name, slave_ifname, IFNAMSIZ);
-- if (ioctl(skfd, SIOCSIFHWADDR, &if_hwaddr) < 0) {
-- int saved_errno = errno;
-- fprintf(stderr, "SIOCSIFHWADDR on %s failed: %s\n", if_hwaddr.ifr_name,
-- strerror(saved_errno));
-- if (saved_errno == EBUSY)
-- fprintf(stderr, " The slave device %s is busy: it must be"
-- " idle before running this command.\n", slave_ifname);
-- else if (saved_errno == EOPNOTSUPP)
-- fprintf(stderr, " The slave device you specified does not support"
-- " setting the MAC address.\n Your kernel likely does not"
-- " support slave devices.\n");
-- else if (saved_errno == EINVAL)
-- fprintf(stderr, " The slave device's address type does not match"
-- " the master's address type.\n");
-- } else {
-- if (verbose) {
-- unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;
-- printf("Slave's (%s) hardware address set to "
-- "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", slave_ifname,
-- hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
-- }
-- }
-- }
-+ /* check if master is indeed a master;
-+ * if not then fail any operation
-+ */
-+ if (!(master_flags.ifr_flags & IFF_MASTER)) {
-+ fprintf(stderr,
-+ "Illegal operation; the specified interface '%s' "
-+ "is not a master. Aborting\n",
-+ master_ifname);
-+ res = 1;
-+ goto out;
-+ }
-
-- if (*spp && !strcmp(*spp, "metric")) {
-- if (*++spp == NULL) {
-- fprintf(stderr, usage_msg);
-- (void) close(skfd);
-- exit(2);
-- }
-- if_metric.ifr_metric = atoi(*spp);
-- strncpy(if_metric.ifr_name, slave_ifname, IFNAMSIZ);
-- if (ioctl(skfd, SIOCSIFMETRIC, &if_metric) < 0) {
-- fprintf(stderr, "SIOCSIFMETRIC on %s: %s\n", slave_ifname,
-- strerror(errno));
-- goterr = 1;
-- }
-- spp++;
-- }
-+ /* check if master is up; if not then fail any operation */
-+ if (!(master_flags.ifr_flags & IFF_UP)) {
-+ fprintf(stderr,
-+ "Illegal operation; the specified master interface "
-+ "'%s' is not up.\n",
-+ master_ifname);
-+ res = 1;
-+ goto out;
-+ }
-
-- if (strncpy(if_ipaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
-- || ioctl(skfd, SIOCSIFADDR, &if_ipaddr) < 0) {
-- fprintf(stderr,
-- "Something broke setting the slave's address: %s.\n",
-- strerror(errno));
-- } else {
-- if (verbose) {
-- unsigned char *ipaddr = if_ipaddr.ifr_addr.sa_data;
-- printf("Set the slave's (%s) IP address to %d.%d.%d.%d.\n",
-- slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
-- }
-- }
-+ /* Only for enslaving */
-+ if (!opt_c && !opt_d) {
-+ sa_family_t master_family = master_hwaddr.ifr_hwaddr.sa_family;
-+ unsigned char *hwaddr =
-+ (unsigned char *)master_hwaddr.ifr_hwaddr.sa_data;
-
-- if (strncpy(if_mtu.ifr_name, slave_ifname, IFNAMSIZ) <= 0
-- || ioctl(skfd, SIOCSIFMTU, &if_mtu) < 0) {
-- fprintf(stderr, "Something broke setting the slave MTU: %s.\n",
-- strerror(errno));
-- } else {
-- if (verbose)
-- printf("Set the slave's (%s) MTU to %d.\n", slave_ifname, if_mtu.ifr_mtu);
-- }
-+ /* The family '1' is ARPHRD_ETHER for ethernet. */
-+ if (master_family != 1 && !opt_f) {
-+ fprintf(stderr,
-+ "Illegal operation: The specified master "
-+ "interface '%s' is not ethernet-like.\n "
-+ "This program is designed to work with "
-+ "ethernet-like network interfaces.\n "
-+ "Use the '-f' option to force the "
-+ "operation.\n",
-+ master_ifname);
-+ res = 1;
-+ goto out;
-+ }
-
-- if (strncpy(if_dstaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
-- || ioctl(skfd, SIOCSIFDSTADDR, &if_dstaddr) < 0) {
-- fprintf(stderr, "Error setting the slave (%s) with SIOCSIFDSTADDR: %s.\n",
-- slave_ifname, strerror(errno));
-- } else {
-- if (verbose) {
-- unsigned char *ipaddr = if_dstaddr.ifr_dstaddr.sa_data;
-- printf("Set the slave's (%s) destination address to %d.%d.%d.%d.\n",
-- slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
-- }
-+ /* Check master's hw addr */
-+ for (i = 0; i < 6; i++) {
-+ if (hwaddr[i] != 0) {
-+ hwaddr_set = 1;
-+ break;
- }
-+ }
-
-- if (strncpy(if_brdaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
-- || ioctl(skfd, SIOCSIFBRDADDR, &if_brdaddr) < 0) {
-- fprintf(stderr,
-- "Something broke setting the slave (%s) broadcast address: %s.\n",
-- slave_ifname, strerror(errno));
-- } else {
-- if (verbose) {
-- unsigned char *ipaddr = if_brdaddr.ifr_broadaddr.sa_data;
-- printf("Set the slave's (%s) broadcast address to %d.%d.%d.%d.\n",
-- slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
-- }
-- }
-+ if (hwaddr_set) {
-+ v_print("current hardware address of master '%s' "
-+ "is %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
-+ "type %d\n",
-+ master_ifname,
-+ hwaddr[0], hwaddr[1],
-+ hwaddr[2], hwaddr[3],
-+ hwaddr[4], hwaddr[5],
-+ master_family);
-+ }
-+ }
-
-- if (strncpy(if_netmask.ifr_name, slave_ifname, IFNAMSIZ) <= 0
-- || ioctl(skfd, SIOCSIFNETMASK, &if_netmask) < 0) {
-- fprintf(stderr,
-- "Something broke setting the slave (%s) netmask: %s.\n",
-- slave_ifname, strerror(errno));
-- } else {
-- if (verbose) {
-- unsigned char *ipaddr = if_netmask.ifr_netmask.sa_data;
-- printf("Set the slave's (%s) netmask to %d.%d.%d.%d.\n",
-- slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
-+ /* Accepts only one slave */
-+ if (opt_c) {
-+ /* change active slave */
-+ res = get_slave_flags(slave_ifname);
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: get flags failed. "
-+ "Aborting\n",
-+ slave_ifname);
-+ goto out;
-+ }
-+ res = change_active(master_ifname, slave_ifname);
-+ if (res) {
-+ fprintf(stderr,
-+ "Master '%s', Slave '%s': Error: "
-+ "Change active failed\n",
-+ master_ifname, slave_ifname);
-+ }
-+ } else {
-+ /* Accept multiple slaves */
-+ do {
-+ if (opt_d) {
-+ /* detach a slave interface from the master */
-+ rv = get_slave_flags(slave_ifname);
-+ if (rv) {
-+ /* Can't work with this slave. */
-+ /* remember the error and skip it*/
-+ fprintf(stderr,
-+ "Slave '%s': Error: get flags "
-+ "failed. Skipping\n",
-+ slave_ifname);
-+ res = rv;
-+ continue;
- }
-- }
--
-- if (abi_ver < 1) {
--
-- /* The driver is using an old ABI, so we'll set the interface
-- * up before enslaving it
-- */
-- ifr2.ifr_flags |= IFF_UP;
-- if ((ifr2.ifr_flags &= ~(IFF_SLAVE | IFF_MASTER)) == 0
-- || strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ) <= 0
-- || ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
-- fprintf(stderr,
-- "Something broke setting the slave (%s) flags: %s.\n",
-- slave_ifname, strerror(errno));
-- } else {
-- if (verbose)
-- printf("Set the slave's (%s) flags %4.4x.\n",
-- slave_ifname, if_flags.ifr_flags);
-+ rv = release(master_ifname, slave_ifname);
-+ if (rv) {
-+ fprintf(stderr,
-+ "Master '%s', Slave '%s': Error: "
-+ "Release failed\n",
-+ master_ifname, slave_ifname);
-+ res = rv;
- }
- } else {
-- /* the bonding module takes care of setting the slave's mac address
-- * and opening its interface
-- */
-- if (ifr2.ifr_flags & IFF_UP) { /* the interface will need to be down */
-- ifr2.ifr_flags &= ~IFF_UP;
-- if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
-- int saved_errno = errno;
-- fprintf(stderr, "Shutting down interface %s failed: %s\n",
-- slave_ifname, strerror(saved_errno));
-- }
-+ /* attach a slave interface to the master */
-+ rv = get_if_settings(slave_ifname, slave_ifra);
-+ if (rv) {
-+ /* Can't work with this slave. */
-+ /* remember the error and skip it*/
-+ fprintf(stderr,
-+ "Slave '%s': Error: get "
-+ "settings failed: %s. "
-+ "Skipping\n",
-+ slave_ifname, strerror(rv));
-+ res = rv;
-+ continue;
- }
-- }
--
-- /* Do the real thing */
-- if (!opt_r) {
-- strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);
-- strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);
-- if ((ioctl(skfd, SIOCBONDENSLAVE, &if_flags) < 0) &&
-- (ioctl(skfd, BOND_ENSLAVE_OLD, &if_flags) < 0)) {
-- fprintf(stderr, "SIOCBONDENSLAVE: %s.\n", strerror(errno));
-+ rv = enslave(master_ifname, slave_ifname);
-+ if (rv) {
-+ fprintf(stderr,
-+ "Master '%s', Slave '%s': Error: "
-+ "Enslave failed\n",
-+ master_ifname, slave_ifname);
-+ res = rv;
- }
- }
-- }
-- } while ( (slave_ifname = *spp++) != NULL);
-+ } while ((slave_ifname = *spp++) != NULL);
-+ }
-
-- /* Close the socket. */
-- (void) close(skfd);
-+out:
-+ if (skfd >= 0) {
-+ close(skfd);
-+ }
-
-- return(goterr);
-+ return res;
- }
-
- static short mif_flags;
-@@ -631,35 +505,34 @@ static short mif_flags;
- static int if_getconfig(char *ifname)
- {
- struct ifreq ifr;
-- int metric, mtu; /* Parameters of the master interface. */
-+ int metric, mtu; /* Parameters of the master interface. */
- struct sockaddr dstaddr, broadaddr, netmask;
-+ unsigned char *hwaddr;
-
- strcpy(ifr.ifr_name, ifname);
- if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
- return -1;
- mif_flags = ifr.ifr_flags;
- printf("The result of SIOCGIFFLAGS on %s is %x.\n",
-- ifname, ifr.ifr_flags);
-+ ifname, ifr.ifr_flags);
-
- strcpy(ifr.ifr_name, ifname);
- if (ioctl(skfd, SIOCGIFADDR, &ifr) < 0)
- return -1;
- printf("The result of SIOCGIFADDR is %2.2x.%2.2x.%2.2x.%2.2x.\n",
-- ifr.ifr_addr.sa_data[0], ifr.ifr_addr.sa_data[1],
-- ifr.ifr_addr.sa_data[2], ifr.ifr_addr.sa_data[3]);
-+ ifr.ifr_addr.sa_data[0], ifr.ifr_addr.sa_data[1],
-+ ifr.ifr_addr.sa_data[2], ifr.ifr_addr.sa_data[3]);
-
- strcpy(ifr.ifr_name, ifname);
- if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
- return -1;
-
-- {
-- /* Gotta convert from 'char' to unsigned for printf(). */
-- unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data;
-- printf("The result of SIOCGIFHWADDR is type %d "
-- "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n",
-- ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
-- hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
-- }
-+ /* Gotta convert from 'char' to unsigned for printf(). */
-+ hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data;
-+ printf("The result of SIOCGIFHWADDR is type %d "
-+ "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n",
-+ ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
-+ hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
-
- strcpy(ifr.ifr_name, ifname);
- if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) {
-@@ -691,7 +564,7 @@ static int if_getconfig(char *ifname)
- } else
- netmask = ifr.ifr_netmask;
-
-- return(0);
-+ return 0;
- }
-
- static void if_print(char *ifname)
-@@ -705,15 +578,16 @@ static void if_print(char *ifname)
- ifc.ifc_len = sizeof(buff);
- ifc.ifc_buf = buff;
- if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
-- fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));
-+ perror("SIOCGIFCONF failed");
- return;
- }
-
- ifr = ifc.ifc_req;
- for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
- if (if_getconfig(ifr->ifr_name) < 0) {
-- fprintf(stderr, "%s: unknown interface.\n",
-- ifr->ifr_name);
-+ fprintf(stderr,
-+ "%s: unknown interface.\n",
-+ ifr->ifr_name);
- continue;
- }
-
-@@ -721,16 +595,18 @@ static void if_print(char *ifname)
- /*ife_print(&ife);*/
- }
- } else {
-- if (if_getconfig(ifname) < 0)
-- fprintf(stderr, "%s: unknown interface.\n", ifname);
-+ if (if_getconfig(ifname) < 0) {
-+ fprintf(stderr,
-+ "%s: unknown interface.\n", ifname);
-+ }
- }
- }
-
--static int get_abi_ver(char *master_ifname)
-+static int get_drv_info(char *master_ifname)
- {
- struct ifreq ifr;
- struct ethtool_drvinfo info;
-- int abi_ver = 0;
-+ char *endptr;
-
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ);
-@@ -739,24 +615,487 @@ static int get_abi_ver(char *master_ifna
- info.cmd = ETHTOOL_GDRVINFO;
- strncpy(info.driver, "ifenslave", 32);
- snprintf(info.fw_version, 32, "%d", BOND_ABI_VERSION);
-- if (ioctl(skfd, SIOCETHTOOL, &ifr) >= 0) {
-- char *endptr;
-
-- abi_ver = strtoul(info.fw_version, &endptr, 0);
-- if (*endptr) {
-- fprintf(stderr, "Error: got invalid string as an ABI "
-- "version from the bonding module\n");
-- return -1;
-+ if (ioctl(skfd, SIOCETHTOOL, &ifr) < 0) {
-+ if (errno == EOPNOTSUPP) {
-+ goto out;
- }
-+
-+ saved_errno = errno;
-+ v_print("Master '%s': Error: get bonding info failed %s\n",
-+ master_ifname, strerror(saved_errno));
-+ return 1;
- }
-
-- if (verbose) {
-- printf("ABI ver is %d\n", abi_ver);
-+ abi_ver = strtoul(info.fw_version, &endptr, 0);
-+ if (*endptr) {
-+ v_print("Master '%s': Error: got invalid string as an ABI "
-+ "version from the bonding module\n",
-+ master_ifname);
-+ return 1;
- }
-- return abi_ver;
-+
-+out:
-+ v_print("ABI ver is %d\n", abi_ver);
-+
-+ return 0;
- }
-
-+static int change_active(char *master_ifname, char *slave_ifname)
-+{
-+ struct ifreq ifr;
-+ int res = 0;
-
-+ if (!(slave_flags.ifr_flags & IFF_SLAVE)) {
-+ fprintf(stderr,
-+ "Illegal operation: The specified slave interface "
-+ "'%s' is not a slave\n",
-+ slave_ifname);
-+ return 1;
-+ }
-+
-+ strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ);
-+ strncpy(ifr.ifr_slave, slave_ifname, IFNAMSIZ);
-+ if ((ioctl(skfd, SIOCBONDCHANGEACTIVE, &ifr) < 0) &&
-+ (ioctl(skfd, BOND_CHANGE_ACTIVE_OLD, &ifr) < 0)) {
-+ saved_errno = errno;
-+ v_print("Master '%s': Error: SIOCBONDCHANGEACTIVE failed: "
-+ "%s\n",
-+ master_ifname, strerror(saved_errno));
-+ res = 1;
-+ }
-+
-+ return res;
-+}
-+
-+static int enslave(char *master_ifname, char *slave_ifname)
-+{
-+ struct ifreq ifr;
-+ int res = 0;
-+
-+ if (slave_flags.ifr_flags & IFF_SLAVE) {
-+ fprintf(stderr,
-+ "Illegal operation: The specified slave interface "
-+ "'%s' is already a slave\n",
-+ slave_ifname);
-+ return 1;
-+ }
-+
-+ res = set_if_down(slave_ifname, slave_flags.ifr_flags);
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: bring interface down failed\n",
-+ slave_ifname);
-+ return res;
-+ }
-+
-+ if (abi_ver < 2) {
-+ /* Older bonding versions would panic if the slave has no IP
-+ * address, so get the IP setting from the master.
-+ */
-+ res = set_if_addr(master_ifname, slave_ifname);
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: set address failed\n",
-+ slave_ifname);
-+ return res;
-+ }
-+ } else {
-+ res = clear_if_addr(slave_ifname);
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: clear address failed\n",
-+ slave_ifname);
-+ return res;
-+ }
-+ }
-+
-+ if (master_mtu.ifr_mtu != slave_mtu.ifr_mtu) {
-+ res = set_slave_mtu(slave_ifname, master_mtu.ifr_mtu);
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: set MTU failed\n",
-+ slave_ifname);
-+ return res;
-+ }
-+ }
-+
-+ if (hwaddr_set) {
-+ /* Master already has an hwaddr
-+ * so set it's hwaddr to the slave
-+ */
-+ if (abi_ver < 1) {
-+ /* The driver is using an old ABI, so
-+ * the application sets the slave's
-+ * hwaddr
-+ */
-+ res = set_slave_hwaddr(slave_ifname,
-+ &(master_hwaddr.ifr_hwaddr));
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: set hw address "
-+ "failed\n",
-+ slave_ifname);
-+ goto undo_mtu;
-+ }
-+
-+ /* For old ABI the application needs to bring the
-+ * slave back up
-+ */
-+ res = set_if_up(slave_ifname, slave_flags.ifr_flags);
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: bring interface "
-+ "down failed\n",
-+ slave_ifname);
-+ goto undo_slave_mac;
-+ }
-+ }
-+ /* The driver is using a new ABI,
-+ * so the driver takes care of setting
-+ * the slave's hwaddr and bringing
-+ * it up again
-+ */
-+ } else {
-+ /* No hwaddr for master yet, so
-+ * set the slave's hwaddr to it
-+ */
-+ if (abi_ver < 1) {
-+ /* For old ABI, the master needs to be
-+ * down before setting it's hwaddr
-+ */
-+ res = set_if_down(master_ifname, master_flags.ifr_flags);
-+ if (res) {
-+ fprintf(stderr,
-+ "Master '%s': Error: bring interface "
-+ "down failed\n",
-+ master_ifname);
-+ goto undo_mtu;
-+ }
-+ }
-+
-+ res = set_master_hwaddr(master_ifname,
-+ &(slave_hwaddr.ifr_hwaddr));
-+ if (res) {
-+ fprintf(stderr,
-+ "Master '%s': Error: set hw address "
-+ "failed\n",
-+ master_ifname);
-+ goto undo_mtu;
-+ }
-+
-+ if (abi_ver < 1) {
-+ /* For old ABI, bring the master
-+ * back up
-+ */
-+ res = set_if_up(master_ifname, master_flags.ifr_flags);
-+ if (res) {
-+ fprintf(stderr,
-+ "Master '%s': Error: bring interface "
-+ "up failed\n",
-+ master_ifname);
-+ goto undo_master_mac;
-+ }
-+ }
-+
-+ hwaddr_set = 1;
-+ }
-+
-+ /* Do the real thing */
-+ strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ);
-+ strncpy(ifr.ifr_slave, slave_ifname, IFNAMSIZ);
-+ if ((ioctl(skfd, SIOCBONDENSLAVE, &ifr) < 0) &&
-+ (ioctl(skfd, BOND_ENSLAVE_OLD, &ifr) < 0)) {
-+ saved_errno = errno;
-+ v_print("Master '%s': Error: SIOCBONDENSLAVE failed: %s\n",
-+ master_ifname, strerror(saved_errno));
-+ res = 1;
-+ }
-+
-+ if (res) {
-+ goto undo_master_mac;
-+ }
-+
-+ return 0;
-+
-+/* rollback (best effort) */
-+undo_master_mac:
-+ set_master_hwaddr(master_ifname, &(master_hwaddr.ifr_hwaddr));
-+ hwaddr_set = 0;
-+ goto undo_mtu;
-+undo_slave_mac:
-+ set_slave_hwaddr(slave_ifname, &(slave_hwaddr.ifr_hwaddr));
-+undo_mtu:
-+ set_slave_mtu(slave_ifname, slave_mtu.ifr_mtu);
-+ return res;
-+}
-+
-+static int release(char *master_ifname, char *slave_ifname)
-+{
-+ struct ifreq ifr;
-+ int res = 0;
-+
-+ if (!(slave_flags.ifr_flags & IFF_SLAVE)) {
-+ fprintf(stderr,
-+ "Illegal operation: The specified slave interface "
-+ "'%s' is not a slave\n",
-+ slave_ifname);
-+ return 1;
-+ }
-+
-+ strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ);
-+ strncpy(ifr.ifr_slave, slave_ifname, IFNAMSIZ);
-+ if ((ioctl(skfd, SIOCBONDRELEASE, &ifr) < 0) &&
-+ (ioctl(skfd, BOND_RELEASE_OLD, &ifr) < 0)) {
-+ saved_errno = errno;
-+ v_print("Master '%s': Error: SIOCBONDRELEASE failed: %s\n",
-+ master_ifname, strerror(saved_errno));
-+ return 1;
-+ } else if (abi_ver < 1) {
-+ /* The driver is using an old ABI, so we'll set the interface
-+ * down to avoid any conflicts due to same MAC/IP
-+ */
-+ res = set_if_down(slave_ifname, slave_flags.ifr_flags);
-+ if (res) {
-+ fprintf(stderr,
-+ "Slave '%s': Error: bring interface "
-+ "down failed\n",
-+ slave_ifname);
-+ }
-+ }
-+
-+ /* set to default mtu */
-+ set_slave_mtu(slave_ifname, 1500);
-+
-+ return res;
-+}
-+
-+static int get_if_settings(char *ifname, struct dev_ifr ifra[])
-+{
-+ int i;
-+ int res = 0;
-+
-+ for (i = 0; ifra[i].req_ifr; i++) {
-+ strncpy(ifra[i].req_ifr->ifr_name, ifname, IFNAMSIZ);
-+ res = ioctl(skfd, ifra[i].req_type, ifra[i].req_ifr);
-+ if (res < 0) {
-+ saved_errno = errno;
-+ v_print("Interface '%s': Error: %s failed: %s\n",
-+ ifname, ifra[i].req_name,
-+ strerror(saved_errno));
-+
-+ return saved_errno;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+static int get_slave_flags(char *slave_ifname)
-+{
-+ int res = 0;
-+
-+ strncpy(slave_flags.ifr_name, slave_ifname, IFNAMSIZ);
-+ res = ioctl(skfd, SIOCGIFFLAGS, &slave_flags);
-+ if (res < 0) {
-+ saved_errno = errno;
-+ v_print("Slave '%s': Error: SIOCGIFFLAGS failed: %s\n",
-+ slave_ifname, strerror(saved_errno));
-+ } else {
-+ v_print("Slave %s: flags %04X.\n",
-+ slave_ifname, slave_flags.ifr_flags);
-+ }
-+
-+ return res;
-+}
-+
-+static int set_master_hwaddr(char *master_ifname, struct sockaddr *hwaddr)
-+{
-+ unsigned char *addr = (unsigned char *)hwaddr->sa_data;
-+ struct ifreq ifr;
-+ int res = 0;
-+
-+ strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ);
-+ memcpy(&(ifr.ifr_hwaddr), hwaddr, sizeof(struct sockaddr));
-+ res = ioctl(skfd, SIOCSIFHWADDR, &ifr);
-+ if (res < 0) {
-+ saved_errno = errno;
-+ v_print("Master '%s': Error: SIOCSIFHWADDR failed: %s\n",
-+ master_ifname, strerror(saved_errno));
-+ return res;
-+ } else {
-+ v_print("Master '%s': hardware address set to "
-+ "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n",
-+ master_ifname, addr[0], addr[1], addr[2],
-+ addr[3], addr[4], addr[5]);
-+ }
-+
-+ return res;
-+}
-+
-+static int set_slave_hwaddr(char *slave_ifname, struct sockaddr *hwaddr)
-+{
-+ unsigned char *addr = (unsigned char *)hwaddr->sa_data;
-+ struct ifreq ifr;
-+ int res = 0;
-+
-+ strncpy(ifr.ifr_name, slave_ifname, IFNAMSIZ);
-+ memcpy(&(ifr.ifr_hwaddr), hwaddr, sizeof(struct sockaddr));
-+ res = ioctl(skfd, SIOCSIFHWADDR, &ifr);
-+ if (res < 0) {
-+ saved_errno = errno;
-+
-+ v_print("Slave '%s': Error: SIOCSIFHWADDR failed: %s\n",
-+ slave_ifname, strerror(saved_errno));
-+
-+ if (saved_errno == EBUSY) {
-+ v_print(" The device is busy: it must be idle "
-+ "before running this command.\n");
-+ } else if (saved_errno == EOPNOTSUPP) {
-+ v_print(" The device does not support setting "
-+ "the MAC address.\n"
-+ " Your kernel likely does not support slave "
-+ "devices.\n");
-+ } else if (saved_errno == EINVAL) {
-+ v_print(" The device's address type does not match "
-+ "the master's address type.\n");
-+ }
-+ return res;
-+ } else {
-+ v_print("Slave '%s': hardware address set to "
-+ "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n",
-+ slave_ifname, addr[0], addr[1], addr[2],
-+ addr[3], addr[4], addr[5]);
-+ }
-+
-+ return res;
-+}
-+
-+static int set_slave_mtu(char *slave_ifname, int mtu)
-+{
-+ struct ifreq ifr;
-+ int res = 0;
-+
-+ ifr.ifr_mtu = mtu;
-+ strncpy(ifr.ifr_name, slave_ifname, IFNAMSIZ);
-+
-+ res = ioctl(skfd, SIOCSIFMTU, &ifr);
-+ if (res < 0) {
-+ saved_errno = errno;
-+ v_print("Slave '%s': Error: SIOCSIFMTU failed: %s\n",
-+ slave_ifname, strerror(saved_errno));
-+ } else {
-+ v_print("Slave '%s': MTU set to %d.\n", slave_ifname, mtu);
-+ }
-+
-+ return res;
-+}
-+
-+static int set_if_flags(char *ifname, short flags)
-+{
-+ struct ifreq ifr;
-+ int res = 0;
-+
-+ ifr.ifr_flags = flags;
-+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-+
-+ res = ioctl(skfd, SIOCSIFFLAGS, &ifr);
-+ if (res < 0) {
-+ saved_errno = errno;
-+ v_print("Interface '%s': Error: SIOCSIFFLAGS failed: %s\n",
-+ ifname, strerror(saved_errno));
-+ } else {
-+ v_print("Interface '%s': flags set to %04X.\n", ifname, flags);
-+ }
-+
-+ return res;
-+}
-+
-+static int set_if_up(char *ifname, short flags)
-+{
-+ return set_if_flags(ifname, flags | IFF_UP);
-+}
-+
-+static int set_if_down(char *ifname, short flags)
-+{
-+ return set_if_flags(ifname, flags & ~IFF_UP);
-+}
-+
-+static int clear_if_addr(char *ifname)
-+{
-+ struct ifreq ifr;
-+ int res = 0;
-+
-+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-+ ifr.ifr_addr.sa_family = AF_INET;
-+ memset(ifr.ifr_addr.sa_data, 0, sizeof(ifr.ifr_addr.sa_data));
-+
-+ res = ioctl(skfd, SIOCSIFADDR, &ifr);
-+ if (res < 0) {
-+ saved_errno = errno;
-+ v_print("Interface '%s': Error: SIOCSIFADDR failed: %s\n",
-+ ifname, strerror(saved_errno));
-+ } else {
-+ v_print("Interface '%s': address cleared\n", ifname);
-+ }
-+
-+ return res;
-+}
-+
-+static int set_if_addr(char *master_ifname, char *slave_ifname)
-+{
-+ struct ifreq ifr;
-+ int res;
-+ unsigned char *ipaddr;
-+ int i;
-+ struct {
-+ char *req_name;
-+ char *desc;
-+ int g_ioctl;
-+ int s_ioctl;
-+ } ifra[] = {
-+ {"IFADDR", "addr", SIOCGIFADDR, SIOCSIFADDR},
-+ {"DSTADDR", "destination addr", SIOCGIFDSTADDR, SIOCSIFDSTADDR},
-+ {"BRDADDR", "broadcast addr", SIOCGIFBRDADDR, SIOCSIFBRDADDR},
-+ {"NETMASK", "netmask", SIOCGIFNETMASK, SIOCSIFNETMASK},
-+ {NULL, NULL, 0, 0},
-+ };
-+
-+ for (i = 0; ifra[i].req_name; i++) {
-+ strncpy(ifr.ifr_name, master_ifname, IFNAMSIZ);
-+ res = ioctl(skfd, ifra[i].g_ioctl, &ifr);
-+ if (res < 0) {
-+ int saved_errno = errno;
-+
-+ v_print("Interface '%s': Error: SIOCG%s failed: %s\n",
-+ master_ifname, ifra[i].req_name,
-+ strerror(saved_errno));
-+
-+ ifr.ifr_addr.sa_family = AF_INET;
-+ memset(ifr.ifr_addr.sa_data, 0,
-+ sizeof(ifr.ifr_addr.sa_data));
-+ }
-+
-+ strncpy(ifr.ifr_name, slave_ifname, IFNAMSIZ);
-+ res = ioctl(skfd, ifra[i].s_ioctl, &ifr);
-+ if (res < 0) {
-+ int saved_errno = errno;
-+
-+ v_print("Interface '%s': Error: SIOCS%s failed: %s\n",
-+ slave_ifname, ifra[i].req_name,
-+ strerror(saved_errno));
-+
-+ return res;
-+ }
-+
-+ ipaddr = ifr.ifr_addr.sa_data;
-+ v_print("Interface '%s': set IP %s to %d.%d.%d.%d\n",
-+ slave_ifname, ifra[i].desc,
-+ ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
-+ }
-+
-+ return 0;
-+}
-
- /*
- * Local variables:
-@@ -768,3 +1107,4 @@ static int get_abi_ver(char *master_ifna
- * compile-command: "gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave"
- * End:
- */
-+
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/networking/netconsole.txt 2003-12-28 23:21:00.000000000 -0800
-@@ -0,0 +1,57 @@
-+
-+started by Ingo Molnar <mingo@redhat.com>, 2001.09.17
-+2.6 port and netpoll api by Matt Mackall <mpm@selenic.com>, Sep 9 2003
-+
-+Please send bug reports to Matt Mackall <mpm@selenic.com>
-+
-+This module logs kernel printk messages over UDP allowing debugging of
-+problem where disk logging fails and serial consoles are impractical.
-+
-+It can be used either built-in or as a module. As a built-in,
-+netconsole initializes immediately after NIC cards and will bring up
-+the specified interface as soon as possible. While this doesn't allow
-+capture of early kernel panics, it does capture most of the boot
-+process.
-+
-+It takes a string configuration parameter "netconsole" in the
-+following format:
-+
-+ netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]
-+
-+ where
-+ src-port source for UDP packets (defaults to 6665)
-+ src-ip source IP to use (interface address)
-+ dev network interface (eth0)
-+ tgt-port port for logging agent (6666)
-+ tgt-ip IP address for logging agent
-+ tgt-macaddr ethernet MAC address for logging agent (broadcast)
-+
-+Examples:
-+
-+ linux netconsole=4444@10.0.0.1/eth1,9353@10.0.0.2/12:34:56:78:9a:bc
-+
-+ or
-+
-+ insmod netconsole netconsole=@/,@10.0.0.2/
-+
-+Built-in netconsole starts immediately after the TCP stack is
-+initialized and attempts to bring up the supplied dev at the supplied
-+address.
-+
-+The remote host can run either 'netcat -u -l -p <port>' or syslogd.
-+
-+WARNING: the default target ethernet setting uses the broadcast
-+ethernet address to send packets, which can cause increased load on
-+other systems on the same ethernet segment.
-+
-+NOTE: the network device (eth1 in the above case) can run any kind
-+of other network traffic, netconsole is not intrusive. Netconsole
-+might cause slight delays in other traffic if the volume of kernel
-+messages is high, but should have no other impact.
-+
-+Netconsole was designed to be as instantaneous as possible, to
-+enable the logging of even the most critical kernel bugs. It works
-+from IRQ contexts as well, and does not enable interrupts while
-+sending packets. Due to these unique needs, configuration can not
-+be more automatic, and some fundamental limitations will remain:
-+only IP networks, UDP packets and ethernet devices are supported.
---- linux-2.6.0/Documentation/networking/sk98lin.txt 2003-09-27 18:57:43.000000000 -0700
-+++ 25/Documentation/networking/sk98lin.txt 2003-12-28 23:21:00.000000000 -0800
-@@ -2,9 +2,9 @@
- All rights reserved
- ===========================================================================
-
--sk98lin.txt created 23-Sep-2003
-+sk98lin.txt created 15-Dec-2003
-
--Readme File for sk98lin v6.18
-+Readme File for sk98lin v6.21
- Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX
-
- This file contains
-@@ -466,7 +466,7 @@ The Marvell Yukon/SysKonnect Linux drive
- Link Aggregation according to IEEE standards 802.1, 802.1q, and 802.3ad.
- These features are only available after installation of open source
- modules available on the Internet:
--For VLAN go to: http://scry.wanfear.com/~greear/vlan.html
-+For VLAN go to: http://www.candelatech.com/~greear/vlan.html
- For Link Aggregation go to: http://www.st.rim.or.jp/~yumo
-
- NOTE: SysKonnect GmbH does not offer any support for these open source
---- linux-2.6.0/Documentation/scsi/aic79xx.txt 2003-06-14 12:18:29.000000000 -0700
-+++ 25/Documentation/scsi/aic79xx.txt 2003-12-28 23:21:39.000000000 -0800
-@@ -1,5 +1,5 @@
- ====================================================================
--= Adaptec Ultra320 Family Manager Set v1.3.0 =
-+= Adaptec Ultra320 Family Manager Set v2.0.5 =
- = =
- = README for =
- = The Linux Operating System =
-@@ -19,57 +19,274 @@ The following information is available i
- The following Adaptec SCSI Host Adapters are supported by this
- driver set.
-
-- Ultra320 Adapters Description
-+ Ultra320 ASIC Description
- ----------------------------------------------------------------
-- Adaptec SCSI Card 39320 Dual Channel 64-bit PCI-X 133MHz to
-- Ultra320 SCSI Card (one external
-- 68-pin, two internal 68-pin)
-- Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to
-- Ultra320 SCSI Card (two external VHDC
-- and one internal 68-pin)
-- Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to
-- Ultra320 SCSI Card (two external VHDC
-- and one internal 68-pin) based on the
-- AIC-7902B ASIC
-- Adaptec SCSI Card 29320 Single Channel 64-bit PCI-X 133MHz to
-- Ultra320 SCSI Card (one external
-- 68-pin, two internal 68-pin, one
-- internal 50-pin)
-- Adaptec SCSI Card 29320LP Single Channel 64-bit Low Profile
-- PCI-X 133MHz to Ultra320 SCSI Card
-- (One external VHDC, one internal
-- 68-pin)
-- AIC-7901A Single Channel 64-bit PCI-X 133MHz to
-- Ultra320 SCSI ASIC
-- AIC-7902A4 Dual Channel 64-bit PCI-X 133MHz to
-- Ultra320 SCSI ASIC
-- AIC-7902B Dual Channel 64-bit PCI-X 133MHz to
-- Ultra320 SCSI ASIC
--
-+ AIC-7901A Single Channel 64-bit PCI-X 133MHz to
-+ Ultra320 SCSI ASIC
-+ AIC-7901B Single Channel 64-bit PCI-X 133MHz to
-+ Ultra320 SCSI ASIC with Retained Training
-+ AIC-7902A4 Dual Channel 64-bit PCI-X 133MHz to
-+ Ultra320 SCSI ASIC
-+ AIC-7902B Dual Channel 64-bit PCI-X 133MHz to
-+ Ultra320 SCSI ASIC with Retained Training
-+
-+ Ultra320 Adapters Description ASIC
-+ --------------------------------------------------------------------------
-+ Adaptec SCSI Card 39320 Dual Channel 64-bit PCI-X 133MHz to 7902A4/7902B
-+ Ultra320 SCSI Card (one external
-+ 68-pin, two internal 68-pin)
-+ Adaptec SCSI Card 39320A Dual Channel 64-bit PCI-X 133MHz to 7902B
-+ Ultra320 SCSI Card (one external
-+ 68-pin, two internal 68-pin)
-+ Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to 7902A4
-+ Ultra320 SCSI Card (two external VHDC
-+ and one internal 68-pin)
-+ Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to 7902A4
-+ Ultra320 SCSI Card (two external VHDC
-+ and one internal 68-pin) based on the
-+ AIC-7902B ASIC
-+ Adaptec SCSI Card 29320 Single Channel 64-bit PCI-X 133MHz to 7901A
-+ Ultra320 SCSI Card (one external
-+ 68-pin, two internal 68-pin, one
-+ internal 50-pin)
-+ Adaptec SCSI Card 29320A Single Channel 64-bit PCI-X 133MHz to 7901B
-+ Ultra320 SCSI Card (one external
-+ 68-pin, two internal 68-pin, one
-+ internal 50-pin)
-+ Adaptec SCSI Card 29320LP Single Channel 64-bit Low Profile 7901A
-+ PCI-X 133MHz to Ultra320 SCSI Card
-+ (One external VHDC, one internal
-+ 68-pin)
-+ Adaptec SCSI Card 29320ALP Single Channel 64-bit Low Profile 7901B
-+ PCI-X 133MHz to Ultra320 SCSI Card
-+ (One external VHDC, one internal
-+ 68-pin)
- 2. Version History
-
-- (V1.3.0, January 2003) Full regression testing for all U320 products
-- completed.
--
-- (V1.3.0 ALPHA, November 2002) Initial Alpha release.
-- Added abort and target/lun reset error recovery handler and
-- interrupt coalessing.
--
-- (V1.2.0, November 2002) Added support for Domain Validation and
-- Hewlett-Packard version of the 39320D and AIC-7902 adapters.
-- Support for previous adapters has not been fully tested and should
-- only be used at the customer's own risk.
--
-- (V1.1.1, September 2002) Added support for the Linux 2.5.X kernel series
--
-- (V1.1.0, August 2002) Added support for four additional SCSI
-- products: ASC-39320, ASC-29320, ASC-29320LP, AIC-7901.
--
-- (V1.1, August 2002) Added support for four additional SCSI
-- products: ASC-39320, ASC-29320, ASC-29320LP, AIC-7901.
-+ 2.0.5 (December 22nd, 2003)
-+ - Correct a bug preventing the driver from renegotiating
-+ during auto-request operations when a check condition
-+ occurred for a zero length command.
-+ - Sniff sense information returned by targets for unit
-+ attention errors that may indicate that the device has
-+ been changed. If we see such status for non Domain
-+ Validation related commands, start a DV scan for the
-+ target. In the past, DV would only occur for hot-plugged
-+ devices if no target had been previously probed for a
-+ particular ID. This change guarantees that the DV process
-+ will occur even if the user swaps devices without any
-+ interveining I/O to tell us that a device has gone missing.
-+ The old behavior, among other things, would fail to spin up
-+ drives that were hot-plugged since the Linux mid-layer
-+ will only spin-up drives on initial attach.
-+ - Correct several issues in the rundown of the good status
-+ FIFO during error recovery. The typical failure scenario
-+ evidenced by this defect was the loss of several commands
-+ under high load when several queue full conditions occured
-+ back to back.
-+
-+ 2.0.4 (November 6th, 2003)
-+ - Support the 2.6.0-test9 kernel
-+ - Fix rare deadlock caused by using del_timer_sync from within
-+ a timer handler.
-+
-+ 2.0.3 (October 21st, 2003)
-+ - On 7902A4 hardware, use the slow slew rate for transfer
-+ rates slower than U320. This behavior matches the Windows
-+ driver.
-+ - Fix some issues with the ahd_flush_qoutfifo() routine.
-+ - Add a delay in the loop waiting for selection activity
-+ to cease. Otherwise we may exhaust the loop counter too
-+ quickly on fast machines.
-+ - Return to processing bad status completions through the
-+ qoutfifo. This reduces the amount of time the controller
-+ is paused for these kinds of errors.
-+ - Move additional common routines to the aiclib OSM library
-+ to reduce code duplication.
-+ - Leave removal of softcs from the global list of softcs to
-+ the OSM. This allows us to avoid holding the list_lock during
-+ device destruction.
-+ - Enforce a bus settle delay for bus resets that the
-+ driver initiates.
-+ - Fall back to basic DV for U160 devices that lack an
-+ echo buffer.
-+
-+ 2.0.2 (September 4th, 2003)
-+ - Move additional common routines to the aiclib OSM library
-+ to reduce code duplication.
-+ - Avoid an inadvertant reset of the controller during the
-+ memory mapped I/O test should the controller be left in
-+ the reset state prior to driver initialization. On some
-+ systems, this extra reset resulted in a system hang due
-+ to a chip access that occurred too soon after reset.
-+ - Correct an endian bug in ahd_swap_with_next_hscb. This
-+ corrects strong-arm support.
-+ - Reset the bus for transactions that timeout waiting for
-+ the bus to go free after a disconnect or command complete
-+ message.
-+
-+ 2.0.1 (August 26th, 2003)
-+ - Add magic sysrq handler that causes a card dump to be output
-+ to the console for each controller.
-+ - Avoid waking the mid-layer's error recovery handler during
-+ timeout recovery by returning DID_ERROR instead of DID_TIMEOUT
-+ for timed-out commands that have been aborted.
-+ - Move additional common routines to the aiclib OSM library
-+ to reduce code duplication.
-+
-+ 2.0.0 (August 20th, 2003)
-+ - Remove MMAPIO definition and allow memory mapped
-+ I/O for any platform that supports PCI.
-+ - Avoid clearing ENBUSFREE during single stepping to avoid
-+ spurious "unexpected busfree while idle" messages.
-+ - Correct deadlock in ahd_run_qoutfifo() processing.
-+ - Optimize support for the 7901B.
-+ - Correct a few cases where an explicit flush of pending
-+ register writes was required to ensure acuracy in delays.
-+ - Correct problems in manually flushing completed commands
-+ on the controller. The FIFOs are now flushed to ensure
-+ that completed commands that are still draining to the
-+ host are completed correctly.
-+ - Correct incomplete CDB delivery detection on the 790XB.
-+ - Ignore the cmd->underflow field since userland applications
-+ using the legacy command pass-thru interface do not set
-+ it correctly. Honoring this field led to spurious errors
-+ when users used the "scsi_unique_id" program.
-+ - Perform timeout recovery within the driver instead of relying
-+ on the Linux SCSI mid-layer to perform this function. The
-+ mid-layer does not know the full state of the SCSI bus and
-+ is therefore prone to looping for several minutes to effect
-+ recovery. The new scheme recovers within 15 seconds of the
-+ failure.
-+ - Correct support for manual termination settings.
-+ - Increase maximum wait time for serial eeprom writes allowing
-+ writes to function correctly.
-+
-+ 1.3.12 (August 11, 2003)
-+ - Implement new error recovery thread that supercedes the existing
-+ Linux SCSI error recovery code.
-+ - Fix termination logic for 29320ALP.
-+ - Fix SEEPROM delay to compensate for write ops taking longer.
-+
-+ 1.3.11 (July 11, 2003)
-+ - Fix several deadlock issues.
-+ - Add 29320ALP and 39320B Id's.
-+
-+ 1.3.10 (June 3rd, 2003)
-+ - Align the SCB_TAG field on a 16byte boundary. This avoids
-+ SCB corruption on some PCI-33 busses.
-+ - Correct non-zero luns on Rev B. hardware.
-+ - Update for change in 2.5.X SCSI proc FS interface.
-+ - When negotiation async via an 8bit WDTR message, send
-+ an SDTR with an offset of 0 to be sure the target
-+ knows we are async. This works around a firmware defect
-+ in the Quantum Atlas 10K.
-+ - Implement controller susupend and resume.
-+ - Clear PCI error state during driver attach so that we
-+ don't disable memory mapped I/O due to a stray write
-+ by some other driver probe that occurred before we
-+ claimed the controller.
-+
-+ 1.3.9 (May 22nd, 2003)
-+ - Fix compiler errors.
-+ - Remove S/G splitting for segments that cross a 4GB boundary.
-+ This is guaranteed not to happen in Linux.
-+ - Add support for scsi_report_device_reset() found in
-+ 2.5.X kernels.
-+ - Add 7901B support.
-+ - Simplify handling of the packtized lun Rev A workaround.
-+ - Correct and simplify handling of the ignore wide residue
-+ message. The previous code would fail to report a residual
-+ if the transaction data length was even and we received
-+ an IWR message.
-+
-+ 1.3.8 (April 29th, 2003)
-+ - Fix types accessed via the command line interface code.
-+ - Perform a few firmware optimizations.
-+ - Fix "Unexpected PKT busfree" errors.
-+ - Use a sequencer interrupt to notify the host of
-+ commands with bad status. We defer the notification
-+ until there are no outstanding selections to ensure
-+ that the host is interrupted for as short a time as
-+ possible.
-+ - Remove pre-2.2.X support.
-+ - Add support for new 2.5.X interrupt API.
-+ - Correct big-endian architecture support.
-+
-+ 1.3.7 (April 16th, 2003)
-+ - Use del_timer_sync() to ensure that no timeouts
-+ are pending during controller shutdown.
-+ - For pre-2.5.X kernels, carefully adjust our segment
-+ list size to avoid SCSI malloc pool fragmentation.
-+ - Cleanup channel display in our /proc output.
-+ - Workaround duplicate device entries in the mid-layer
-+ devlice list during add-single-device.
-+
-+ 1.3.6 (March 28th, 2003)
-+ - Correct a double free in the Domain Validation code.
-+ - Correct a reference to free'ed memory during controller
-+ shutdown.
-+ - Reset the bus on an SE->LVD change. This is required
-+ to reset our transcievers.
-+
-+ 1.3.5 (March 24th, 2003)
-+ - Fix a few register window mode bugs.
-+ - Include read streaming in the PPR flags we display in
-+ diagnostics as well as /proc.
-+ - Add PCI hot plug support for 2.5.X kernels.
-+ - Correct default precompensation value for RevA hardware.
-+ - Fix Domain Validation thread shutdown.
-+ - Add a firmware workaround to make the LED blink
-+ brighter during packetized operations on the H2A4.
-+ - Correct /proc display of user read streaming settings.
-+ - Simplify driver locking by releasing the io_request_lock
-+ upon driver entry from the mid-layer.
-+ - Cleanup command line parsing and move much of this code
-+ to aiclib.
-+
-+ 1.3.4 (February 28th, 2003)
-+ - Correct a race condition in our error recovery handler.
-+ - Allow Test Unit Ready commands to take a full 5 seconds
-+ during Domain Validation.
-+
-+ 1.3.2 (February 19th, 2003)
-+ - Correct a Rev B. regression due to the GEM318
-+ compatibility fix included in 1.3.1.
-+
-+ 1.3.1 (February 11th, 2003)
-+ - Add support for the 39320A.
-+ - Improve recovery for certain PCI-X errors.
-+ - Fix handling of LQ/DATA/LQ/DATA for the
-+ same write transaction that can occur without
-+ interveining training.
-+ - Correct compatibility issues with the GEM318
-+ enclosure services device.
-+ - Correct data corruption issue that occurred under
-+ high tag depth write loads.
-+ - Adapt to a change in the 2.5.X daemonize() API.
-+ - Correct a "Missing case in ahd_handle_scsiint" panic.
-+
-+ 1.3.0 (January 21st, 2003)
-+ - Full regression testing for all U320 products completed.
-+ - Added abort and target/lun reset error recovery handler and
-+ interrupt coalessing.
-+
-+ 1.2.0 (November 14th, 2002)
-+ - Added support for Domain Validation
-+ - Add support for the Hewlett-Packard version of the 39320D
-+ and AIC-7902 adapters.
-+ Support for previous adapters has not been fully tested and should
-+ only be used at the customer's own risk.
-+
-+ 1.1.1 (September 24th, 2002)
-+ - Added support for the Linux 2.5.X kernel series
-+
-+ 1.1.0 (September 17th, 2002)
-+ - Added support for four additional SCSI products:
-+ ASC-39320, ASC-29320, ASC-29320LP, AIC-7901.
-
-- (V1.0, May 2002) This is the initial release of the
-- Ultra320 FMS. The following is a list of supported features:
-+ 1.0.0 (May 30th, 2002)
-+ - Initial driver release.
-
- 2.1. Software/Hardware Features
- - Support for the SPI-4 "Ultra320" standard:
-@@ -82,6 +299,7 @@ The following information is available i
- supported)
- - Support for the PCI-X standard up to 133MHz
- - Support for the PCI v2.2 standard
-+ - Domain Validation
-
- 2.2. Operating System Support:
- - Redhat Linux 7.2, 7.3, 8.0, Advanced Server 2.1
---- linux-2.6.0/Documentation/scsi/aic7xxx.txt 2003-06-14 12:18:05.000000000 -0700
-+++ 25/Documentation/scsi/aic7xxx.txt 2003-12-28 23:21:39.000000000 -0800
-@@ -1,5 +1,5 @@
- ====================================================================
--= Adaptec Aic7xxx Fast -> Ultra160 Family Manager Set v6.2.28 =
-+= Adaptec Aic7xxx Fast -> Ultra160 Family Manager Set v6.3.4 =
- = README for =
- = The Linux Operating System =
- ====================================================================
-@@ -132,26 +132,127 @@ The following information is available i
-
- 2. Version History
-
-- 6.2.34 - Fix locking regression instroduced in 6.2.29 that
-- could cuase a lock order reversal between the io_request_lock
-- and our per-softc lock. This was only possible on RH9,
-- SuSE, and kernel.org 2.4.X kernels.
--
-- 6.2.33 - Dynamically disable PCI parity error reporting after
-- 10 errors are reported to the user. These errors are
-- the result of some other device issuing PCI transactions
-- with bad parity. Once the user has been informed of the
-- problem, continuing to report the errors just degrades
-- our performance.
--
-- 6.2.32 - Dynamically sized S/G lists to avoid SCSI malloc
-- pool fragmentation and SCSI mid-layer deadlock.
--
-- 6.2.28 - Domain Validation Fixes
-- PCI parity error disable
-- Enhanced Memory Mapped I/O probe
-+ 6.3.4 (December 22nd, 2003)
-+ - Provide a better description string for the 2915/30LP.
-+ - Sniff sense information returned by targets for unit
-+ attention errors that may indicate that the device has
-+ been changed. If we see such status for non Domain
-+ Validation related commands, start a DV scan for the
-+ target. In the past, DV would only occur for hot-plugged
-+ devices if no target had been previously probed for a
-+ particular ID. This change guarantees that the DV process
-+ will occur even if the user swaps devices without any
-+ interveining I/O to tell us that a device has gone missing.
-+ The old behavior, among other things, would fail to spin up
-+ drives that were hot-plugged since the Linux mid-layer
-+ will only spin-up drives on initial attach.
-+
-+ 6.3.3 (November 6th, 2003)
-+ - Support the 2.6.0-test9 kernel
-+ - Fix rare deadlock caused by using del_timer_sync from within
-+ a timer handler.
-+
-+ 6.3.2 (October 28th, 2003)
-+ - Enforce a bus settle delay for bus resets that the
-+ driver initiates.
-+ - Fall back to basic DV for U160 devices that lack an
-+ echo buffer.
-+ - Correctly detect that left over BIOS data has not
-+ been initialized when the CHPRST status bit is set
-+ during driver initialization.
-+
-+ 6.3.1 (October 21st, 2003)
-+ - Fix a compiler error when building with only EISA or PCI
-+ support compiled into the kernel.
-+ - Add chained dependencies to both the driver and aicasm Makefiles
-+ to avoid problems with parallel builds.
-+ - Move additional common routines to the aiclib OSM library
-+ to reduce code duplication.
-+ - Fix a bug in the testing of the AHC_TMODE_WIDEODD_BUG that
-+ could cause target mode operations to hang.
-+ - Leave removal of softcs from the global list of softcs to
-+ the OSM. This allows us to avoid holding the list_lock during
-+ device destruction.
-+
-+ 6.3.0 (September 8th, 2003)
-+ - Move additional common routines to the aiclib OSM library
-+ to reduce code duplication.
-+ - Bump minor number to reflect change in error recovery strategy.
-+
-+ 6.2.38 (August 31st, 2003)
-+ - Avoid an inadvertant reset of the controller during the
-+ memory mapped I/O test should the controller be left in
-+ the reset state prior to driver initialization. On some
-+ systems, this extra reset resulted in a system hang due
-+ to a chip access that occurred too soon after reset.
-+ - Move additional common routines to the aiclib OSM library
-+ to reduce code duplication.
-+ - Add magic sysrq handler that causes a card dump to be output
-+ to the console for each controller.
-+
-+ 6.2.37 (August 12th, 2003)
-+ - Perform timeout recovery within the driver instead of relying
-+ on the Linux SCSI mid-layer to perform this function. The
-+ mid-layer does not know the full state of the SCSI bus and
-+ is therefore prone to looping for several minutes to effect
-+ recovery. The new scheme recovers within 15 seconds of the
-+ failure.
-+ - Support writing 93c56/66 SEEPROM on newer cards.
-+ - Avoid clearing ENBUSFREE during single stepping to avoid
-+ spurious "unexpected busfree while idle" messages.
-+ - Enable the use of the "Auto-Access-Pause" feature on the
-+ aic7880 and aic7870 chips. It was disabled due to an
-+ oversight. Using this feature drastically reduces command
-+ delivery latency.
-+
-+ 6.2.36 (June 3rd, 2003)
-+ - Correct code that disables PCI parity error checking.
-+ - Correct and simplify handling of the ignore wide residue
-+ message. The previous code would fail to report a residual
-+ if the transaction data length was even and we received
-+ an IWR message.
-+ - Add support for the 2.5.X EISA framework.
-+ - Update for change in 2.5.X SCSI proc FS interface.
-+ - Correct Domain Validation command-line option parsing.
-+ - When negotiation async via an 8bit WDTR message, send
-+ an SDTR with an offset of 0 to be sure the target
-+ knows we are async. This works around a firmware defect
-+ in the Quantum Atlas 10K.
-+ - Clear PCI error state during driver attach so that we
-+ don't disable memory mapped I/O due to a stray write
-+ by some other driver probe that occurred before we
-+ claimed the controller.
-+
-+ 6.2.35 (May 14th, 2003)
-+ - Fix a few GCC 3.3 compiler warnings.
-+ - Correct operation on EISA Twin Channel controller.
-+ - Add support for 2.5.X's scsi_report_device_reset().
-+
-+ 6.2.34 (May 5th, 2003)
-+ - Fix locking regression instroduced in 6.2.29 that
-+ could cuase a lock order reversal between the io_request_lock
-+ and our per-softc lock. This was only possible on RH9,
-+ SuSE, and kernel.org 2.4.X kernels.
-+
-+ 6.2.33 (April 30th, 2003)
-+ - Dynamically disable PCI parity error reporting after
-+ 10 errors are reported to the user. These errors are
-+ the result of some other device issuing PCI transactions
-+ with bad parity. Once the user has been informed of the
-+ problem, continuing to report the errors just degrades
-+ our performance.
-+
-+ 6.2.32 (March 28th, 2003)
-+ - Dynamically sized S/G lists to avoid SCSI malloc
-+ pool fragmentation and SCSI mid-layer deadlock.
-+
-+ 6.2.28 (January 20th, 2003)
-+ - Domain Validation Fixes
-+ - Add ability to disable PCI parity error checking.
-+ - Enhanced Memory Mapped I/O probe
-
-- 6.2.20 - Added Domain Validation
-+ 6.2.20 (November 7th, 2002)
-+ - Added Domain Validation.
-
- 3. Command Line Options
-
---- linux-2.6.0/Documentation/scsi/BusLogic.txt 2003-08-08 22:55:10.000000000 -0700
-+++ 25/Documentation/scsi/BusLogic.txt 2003-12-28 23:22:18.000000000 -0800
-@@ -577,7 +577,7 @@ LILO Linux Boot Loader (in /etc/lilo.con
- INSMOD Loadable Kernel Module Installation Facility:
-
- insmod BusLogic.o \
-- 'BusLogic_Options="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
-+ 'BusLogic="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
-
- NOTE: Module Utilities 2.1.71 or later is required for correct parsing
- of driver options containing commas.
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/Documentation/should-fix.txt 2003-12-28 23:21:10.000000000 -0800
-@@ -0,0 +1,545 @@
-+Not-ready features and speedups
-+===============================
-+
-+Legend:
-+
-+PRI1: We're totally lame if this doesn't get in
-+PRI2: Would be nice
-+PRI3: Not very important
-+
-+drivers/block/
-+~~~~~~~~~~~~~~
-+
-+o viro: paride drivers need a big cleanup. Partially done, but ATAPI drivers
-+ need serious work and bug fixing.
-+
-+ PRI2
-+
-+drivers/char/rtc/
-+~~~~~~~~~~~~~~~~~
-+
-+o rmk, trini: add support for alarms to the existing generic rtc driver.
-+
-+ PRI2
-+
-+console drivers
-+~~~~~~~~~~~~~~~
-+ (Pavel Machek <pavel@ucw.cz>)
-+
-+o There are few must-fix bugs in cursor handling.
-+
-+o Play with gpm selection for a while and your cursor gets corrupted with
-+ random dots. Ouch.
-+
-+device mapper
-+~~~~~~~~~~~~~
-+
-+o ioctl interface cleanup patch is ready (redo the structure layouts)
-+
-+ PRI1
-+
-+o A port of the 2.4 snapshot and mirror targets is in progress
-+
-+ PRI1
-+
-+o the fs interface to dm needs to be redone. gregkh was going to work on
-+ this. viro is interested in seeing work thus-far.
-+
-+ PRI2
-+
-+drivers/net/wireless/
-+~~~~~~~~~~~~~~~~~~~~~
-+
-+ (Jean Tourrilhes <jt@bougret.hpl.hp.com>)
-+
-+o get HostAP driver in the kernel. No consolidation of the 802.11
-+ management across driver can happen until this one is in (which is probably
-+ 2.7.X material). I think Jouni is mostly ready but didn't find time for
-+ it.
-+
-+ PRI2
-+
-+o get more wireless drivers into the kernel. The most "integrable" drivers
-+ at this point seem the NWN driver, Pavel's Spectrum driver.
-+
-+ PRI1
-+
-+drivers/usb/gadget/
-+~~~~~~~~~~~~~~~~~~~
-+
-+o rmk: SA11xx USB client/gadget code (David B has been doing some work on
-+ this, and keeps trying to prod me, but unfortunately I haven't had the time
-+ to look at his work, sorry David.)
-+
-+ PRI3
-+
-+fs/
-+~~~
-+
-+o ext3 and ext2 block allocators have serious failure modes - interleaved
-+ allocations.
-+
-+ PRI3
-+
-+o Integrate Chris Mason's 2.4 reiserfs ordered data and data journaling
-+ patches. They make reiserfs a lot safer.
-+
-+ Ordered: PRI2
-+ data journalled: PRI3
-+
-+o viro: convert more filesystems to use lib/parser.c for options.
-+
-+ PRI2
-+
-+o aio: fs IO isn't async at present. suparna has restart patches, they're
-+ in -mm. Need to get Ben to review/comment.
-+
-+ PRI1.
-+
-+o drepper: various filesystems use ->pid wrongly
-+
-+ PRI1
-+
-+o hch: devfs: there's a fundamental lookup vs devfsd race that's only
-+ fixable by introducing a lookup vs devfs deadlock. I can't see how this is
-+ fixable without getting rid of the current devfsd design. Mandrake seems
-+ to have a workaround for this so this is at least not triggered so easily,
-+ but that's not what I'd consider a fix..
-+
-+ PRI2
-+
-+kernel/
-+~~~~~~~
-+
-+o rusty: Zippel's Reference count simplification. Tricky code, but cuts
-+ about 120 lines from module.c. Patch exists, needs stressing.
-+
-+ PRI3
-+
-+o rusty: Fix module-failed-init races by starting module "disabled". Patch
-+ exists, requires some subsystems (ie. add_partition) to explicitly say
-+ "make module live now". Without patch we are no worse off than 2.4 etc.
-+
-+ PRI1
-+
-+o Integrate userspace irq balancing daemon.
-+
-+ PRI2
-+
-+o kexec. Seems to work, was in -mm.
-+
-+ PRI3
-+
-+o rmk: lib/inflate.c must not use static variables (causes these to be
-+ referenced via GOTOFF relocations in PIC decompressor. We have a PIC
-+ decompressor to avoid having to hard code a per platform zImage link
-+ address into the makefiles.)
-+
-+ PRI2
-+
-+o klibc merge?
-+
-+ PRI2
-+
-+mm/
-+~~~
-+
-+o dropbehind for large files
-+
-+ PRI2
-+
-+net/
-+~~~~
-+
-+ (davem)
-+
-+o Real serious use of IPSEC is hampered by lack of MPLS support. MPLS is a
-+ switching technology that works by switching based upon fixed length labels
-+ prepended to packets. Many people use this and IPSEC to implement VPNs
-+ over public networks, it is also used for things like traffic engineering.
-+
-+ A good reference site is:
-+
-+ http://www.mplsrc.com/
-+
-+ Anyways, an existing (crappy) implementation exists. I've almost
-+ completed a rewrite, I should have something in the tree next week.
-+
-+ PRI1
-+
-+o Sometimes we generate IP fragments when it truly isn't necessary.
-+
-+ The way IP fragmentation is specified, each fragment must be modulo 8
-+ bytes in length. So suppose the device has an MTU that is not 0 modulo 8,
-+ ethernet even classifies in this way. 1500 == (8 * 187) + 4
-+
-+ Our IP fragmenting engine can fragment on packets that are sized within
-+ the last modulo 8 bytes of the MTU. This happens in obscure cases, but it
-+ does happen.
-+
-+ I've proposed a fix to Alexey, whereby very late in the output path we
-+ check the packet, if we fragmented but the data length would fit into the
-+ MTU we unfragment the packet.
-+
-+ This is low priority, because technically it creates suboptimal behavior
-+ rather than mis-operation.
-+
-+ PRI1
-+
-+net/*/netfilter/
-+~~~~~~~~~~~~~~~~
-+
-+o Lots of misc. cleanups, which are happening slowly.
-+
-+ PRI2
-+
-+power management
-+~~~~~~~~~~~~~~~~
-+
-+o Pat and Pavel disagree over swsusp. Need to sort that out.
-+
-+ PRI2
-+
-+o Frame buffer restore codepaths (that requires some deep PCI magic)
-+
-+ PRI2
-+
-+o XFree86 hooks
-+
-+ PRI2
-+
-+o AGP restoration
-+
-+ PRI2
-+
-+o DRI restoration
-+
-+ (davej/Alan: not super-critical, can crash laptop on restore. davej
-+ looking into it.)
-+
-+ PRI2
-+
-+o IDE suspend/resume without races (Ben is looking at this a little)
-+
-+ PRI2
-+
-+o Pat: There are already CPU device structures; MTRRs should be a
-+ dynamically registered interface of CPUs, which implies there needs
-+ to be some other glue to know that there are MTRRs that need to be
-+ saved/restored.
-+
-+ PRI1
-+
-+global
-+~~~~~~
-+
-+o We need a kernel side API for reporting error events to userspace (could
-+ be async to 2.6 itself)
-+
-+ (Prototype core based on netlink exists)
-+
-+ PRI2
-+
-+o Kai: Introduce a sane, easy and standard way to build external modules
-+ - make clean and make modules_install are both broken
-+
-+ PRI2
-+
-+drivers
-+~~~~~~~
-+
-+o Alan: Cardbus/PCMCIA requires all Russell's stuff is merged to do
-+ multiheader right and so on
-+
-+ PRI1
-+
-+drivers/acpi/
-+~~~~~~~~~~~~~
-+
-+o Fix acpi for all newer IBM Thinkpads see
-+ http://bugme.osdl.org/show_bug.cgi?id=1038 for more information
-+
-+o alan: VIA APIC stuff is one bit of this, there are also some other
-+ reports that were caused by ACPI not setting level v edge trigger some
-+ times
-+
-+ PRI1
-+
-+o mochel: it seems the acpi irq routing code could use a serious rewrite.
-+
-+ grover: The problem is the ACPI irq routing code is trying to piggyback
-+ on the existing MPS-specific data structures, and it's generally a hack.
-+ So yes mochel is right, but it is also purging MPS-ities from common code
-+ as well. I've done some preliminary work in this area and it doesn't seem
-+ to break anything (yet) but a rewrite in this area imho should not be
-+ rushed out the door. And, I think the above bugs can be fixed w/o the
-+ rewrite.
-+
-+ PRI2
-+
-+o mochel: ACPI suspend doesn't work. Important, not cricital. Pat is
-+ working it.
-+
-+ PRI2
-+
-+drivers/block/
-+~~~~~~~~~~~~~~
-+
-+o More testing of floppy
-+
-+ PRI3
-+
-+drivers/char/
-+~~~~~~~~~~~~~
-+
-+
-+drivers/ide/
-+~~~~~~~~~~~~
-+
-+ (Alan)
-+
-+o IDE PIO has occasional unexplained PIO disk eating reports
-+
-+ PRI1
-+
-+o IDE has multiple zillions of races/hangs in 2.5 still
-+
-+ PRI1
-+
-+o IDE scsi needs rewriting
-+
-+ PRI2
-+
-+o IDE needs significant reworking to handle Simplex right
-+
-+ PRI2
-+
-+o IDE hotplug handling for 2.5 is completely broken still
-+
-+ PRI2
-+
-+o There are lots of other IDE bugs that wont go away until the taskfile
-+ stuff is included, the locking bugs that allow any user to hang the IDE
-+ layer in 2.5, and some other updates are forward ported. (esp. HPT372N).
-+
-+ PRI1
-+
-+drivers/isdn/
-+~~~~~~~~~~~~~
-+
-+ (Kai, rmk)
-+
-+o isdn_tty locking is completely broken (cli() and friends)
-+
-+ PRI2
-+
-+o fix other drivers
-+
-+ PRI2
-+
-+o lots more cleanups, adaption to recent APIs etc
-+
-+ PRI3
-+
-+o fixup tty-based ISDN drivers which provide TIOCM* ioctls (see my recent
-+ 3-set patch for serial stuff)
-+
-+ Alternatively, we could re-introduce the fallback to driver ioctl parsing
-+ for these if not enough drivers get updated.
-+
-+ PRI3
-+
-+drivers/net/
-+~~~~~~~~~~~~
-+
-+o davej: Either Wireless network drivers or PCMCIA broke somewhen. A
-+ configuration that worked fine under 2.4 doesn't receive any packets. Need
-+ to look into this more to make sure I don't have any misconfiguration that
-+ just 'happened to work' under 2.4
-+
-+ PRI1
-+
-+drivers/scsi/
-+~~~~~~~~~~~~~
-+
-+o jejb: qlogic -
-+
-+ o Merge the feral driver. It covers all qlogic chips: 1020 all the way
-+ up to 23xxx. http://linux-scsi.bkbits.net/scsi-isp-2.5
-+
-+ o qla2xxx: only for FC chips. Has significant build issues. hch
-+ promises to send me a "must fix" list for this.
-+ http://linux-scsi.bkbits.net/scsi-qla2xxx-2.5
-+
-+ PRI2
-+
-+o hch, Mike Anderson, Badari Pulavarty: scsi locking issues
-+
-+ o there are lots of members of struct Scsi_Host/scsi_device/scsi_cmnd
-+ with very unclear locking, many of them probably want to become
-+ atomic_t's or bitmaps (for the 1bit bitfields).
-+
-+ o there's lots of volatile abuse in the scsi code that needs to be
-+ thought about.
-+
-+ o there's some global variables incremented without any locks
-+
-+ PRI2
-+
-+sound/
-+~~~~~~
-+
-+o rmk: several OSS drivers for SA11xx-based hardware in need of
-+ ALSA-ification and L3 bus support code for these.
-+
-+o rmk: need to complete ALSA-ification of the WaveArtist driver for both
-+ NetWinder and other stuff (there's some fairly fundamental differences in
-+ the way the mixer needs to be handled for the NetWinder.)
-+
-+ (Issues with forward-porting 2.4 bugfixes.)
-+ (Killing off OSS is 2.7 material)
-+
-+PRI2
-+
-+arch/i386/
-+~~~~~~~~~~
-+
-+o Also PC9800 merge needs finishing to the point we want for 2.6 (not all).
-+
-+ PRI3
-+
-+o davej: PAT support (for mtrr exhaustion w/ AGP)
-+
-+ PRI2
-+
-+o 2.5.x won't boot on some 440GX
-+
-+ alan: Problem understood now, feasible fix in 2.4/2.4-ac. (440GX has two
-+ IRQ routers, we use the $PIR table with the PIIX, but the 440GX doesnt use
-+ the PIIX for its IRQ routing). Fall back to BIOS for 440GX works and Intel
-+ concurs.
-+
-+ PRI1
-+
-+o 2.5.x doesn't handle VIA APIC right yet.
-+
-+ 1. We must write the PCI_INTERRUPT_LINE
-+
-+ 2. We have quirk handlers that seem to trash it.
-+
-+ PRI1
-+
-+o ECC driver questions are not yet sorted (DaveJ is working on this) (Dan
-+ Hollis)
-+
-+ alan: ECC - I have some test bits from Dan's stuff - they need no kernel
-+ core changes for most platforms. That means we can treat it as a random
-+ driver merge.
-+
-+ PRI3
-+
-+o alan: 2.4 has some fixes for tsc handling bugs. One where some bioses in
-+ SMM mode mess up our toggle on the time high/low or mangle the counter and
-+ one where a few chips need religious use of _p for timer access and we
-+ don't do that. This is forward porting little bits of fixup.
-+
-+ ACPI HZ stuff we can't trap - a lot of ACPI is implemented as outb's
-+ triggering SMM traps
-+
-+ PRI1
-+
-+arch/x86_64/
-+~~~~~~~~~~~~
-+
-+ (Andi)
-+
-+o time handling is broken. Need to move up 2.4 time.c code.
-+
-+ PRI1
-+
-+o NMI watchdog seems to tick too fast
-+
-+ PRI2
-+
-+o need to coredump 64bit vsyscall code with dwarf2
-+
-+ PRI2
-+
-+o move 64bit signal trampolines into vsyscall code and add dwarf2 for it.
-+ (in progress)
-+
-+ PRI1
-+
-+o describe kernel assembly with dwarf2 annotations for kgdb
-+
-+ PRI3
-+
-+arch/alpha/
-+~~~~~~~~~~~
-+
-+o rth: Ptrace writes are broken. This means we can't (reliably) set
-+ breakpoints or modify variables from gdb.
-+
-+ PRI1
-+
-+arch/arm/
-+~~~~~~~~~
-+
-+o rmk: missing raw keyboard translation tables for all ARM machines.
-+ Haven't even looked into this at all. This could be messy since there
-+ isn't an ARM architecture standard. I'm presently hoping that it won't be
-+ an issue. If it does, I guess we'll see drivers/char/keyboard.c explode.
-+
-+ PRI2
-+
-+arch/others/
-+~~~~~~~~~~~~
-+
-+o SH needs resyncing, as do some other ports. SH64 needs merging.
-+ No impact on mainstream platforms hopefully.
-+
-+ PRI2
-+
-+arch/s390/
-+~~~~~~~~~
-+
-+o A nastly memory management problem causes random crashes. These appear
-+ to be fixed/hidden by the objrmap patch, more investigation is needed.
-+
-+ PRI1
-+
-+drivers/s390/
-+~~~~~~~~~~~~~
-+
-+o Early userspace and 64 bit dev_t will allow the removal of most of
-+ dasd_devmap.c and dasd_genhd.c.
-+
-+ PRI2
-+
-+o The 3270 console driver needs to be replaced with a working one
-+ (prototype is there, needs to be finished).
-+
-+ PRI2
-+
-+o Minor interface changes are pending in cio/ when the z990 machines are
-+ out.
-+
-+ PRI2
-+
-+o Jan Glauber is working on a fix for the timer issues related to running
-+ on virtualized CPUs (wall-clock vs. cpu time).
-+
-+ PRI1
-+
-+o a block device driver for ramdisks shared among virtual machines
-+
-+ PRI3
-+
-+o driver for crypto hardware
-+
-+ PRI3
-+
-+o 'claw' network device driver
-+
-+ PRI3
-+
---- linux-2.6.0/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl 2003-08-22 19:23:39.000000000 -0700
-+++ 25/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl 2003-12-28 23:23:06.000000000 -0800
-@@ -3623,7 +3623,7 @@ struct _snd_pcm_runtime {
-
- <para>
- More precise information can be found in
-- <filename>alsa-kernel/Documentation/ControlNames.txt</filename>.
-+ <filename>alsa-kernel/Documentation/sound/alsa/ControlNames.txt</filename>.
- </para>
- </section>
- </section>
---- linux-2.6.0/Documentation/sound/oss/CMI8330 2003-06-14 12:17:57.000000000 -0700
-+++ 25/Documentation/sound/oss/CMI8330 2003-12-28 23:23:06.000000000 -0800
-@@ -2,7 +2,7 @@ Documentation for CMI 8330 (SoundPRO)
- -------------------------------------
- Alessandro Zummo <azummo@ita.flashnet.it>
-
--( Be sure to read Documentation/sound/SoundPro too )
-+( Be sure to read Documentation/sound/oss/SoundPro too )
-
-
- This adapter is now directly supported by the sb driver.
---- linux-2.6.0/Documentation/sound/oss/INSTALL.awe 2003-06-14 12:18:29.000000000 -0700
-+++ 25/Documentation/sound/oss/INSTALL.awe 2003-12-28 23:23:06.000000000 -0800
-@@ -114,7 +114,7 @@ See INSTALL.RH for more details.
- # insmod awe_wave
- (Be sure to load awe_wave after sb!)
-
-- See /usr/src/linux/Documentation/sound/AWE32 for
-+ See /usr/src/linux/Documentation/sound/oss/AWE32 for
- more details.
-
- 9. (only for obsolete systems) If you don't have /dev/sequencer
---- linux-2.6.0/Documentation/sound/oss/Introduction 2003-10-08 15:07:08.000000000 -0700
-+++ 25/Documentation/sound/oss/Introduction 2003-12-28 23:23:06.000000000 -0800
-@@ -24,7 +24,7 @@ History:
- ========
- 0.1.0 11/20/1998 First version, draft
- 1.0.0 11/1998 Alan Cox changes, incorporation in 2.2.0
-- as /usr/src/linux/Documentation/sound/Introduction
-+ as /usr/src/linux/Documentation/sound/oss/Introduction
- 1.1.0 6/30/1999 Second version, added notes on making the drivers,
- added info on multiple sound cards of similar types,]
- added more diagnostics info, added info about esd.
---- linux-2.6.0/Documentation/sound/oss/PAS16 2003-06-14 12:18:34.000000000 -0700
-+++ 25/Documentation/sound/oss/PAS16 2003-12-28 23:23:06.000000000 -0800
-@@ -9,7 +9,7 @@ and others whose names I could not find.
- This documentation is relevant for the PAS16 driver (pas2_card.c and
- friends) under kernel version 2.3.99 and later. If you are
- unfamiliar with configuring sound under Linux, please read the
--Sound-HOWTO, linux/Documentation/sound/Introduction and other
-+Sound-HOWTO, linux/Documentation/sound/oss/Introduction and other
- relevant docs first.
-
- The following information is relevant information from README.OSS
-@@ -73,8 +73,8 @@ CONFIG_SOUND
- You want to read the Sound-HOWTO, available from
- http://www.tldp.org/docs.html#howto . General information
- about the modular sound system is contained in the files
-- Documentation/sound/Introduction. The file
-- Documentation/sound/README.OSS contains some slightly outdated but
-+ Documentation/sound/oss/Introduction. The file
-+ Documentation/sound/oss/README.OSS contains some slightly outdated but
- still useful information as well.
-
- OSS sound modules
-@@ -119,7 +119,7 @@ CONFIG_SOUND_YM3812
- cards may have software (TSR) FM emulation. Enabling FM support with
- these cards may cause trouble (I don't currently know of any such
- cards, however).
-- Please read the file Documentation/sound/OPL3 if your card has an
-+ Please read the file Documentation/sound/oss/OPL3 if your card has an
- OPL3 chip.
- If you compile the driver into the kernel, you have to add
- "opl3=<io>" to the kernel command line.
---- linux-2.6.0/Documentation/sound/oss/SoundPro 2003-06-14 12:18:51.000000000 -0700
-+++ 25/Documentation/sound/oss/SoundPro 2003-12-28 23:23:06.000000000 -0800
-@@ -1,7 +1,7 @@
- Documentation for the SoundPro CMI8330 extensions in the WSS driver (ad1848.o)
- ------------------------------------------------------------------------------
-
--( Be sure to read Documentation/sound/CMI8330 too )
-+( Be sure to read Documentation/sound/oss/CMI8330 too )
-
- Ion Badulescu, ionut@cs.columbia.edu
- February 24, 1999
---- linux-2.6.0/Documentation/sound/oss/Wavefront 2003-08-08 22:55:10.000000000 -0700
-+++ 25/Documentation/sound/oss/Wavefront 2003-12-28 23:23:06.000000000 -0800
-@@ -105,7 +105,7 @@ design and implementation of the driver.
- drivers/sound/wf_midi.c -- the "uart401" driver
- to support virtual MIDI mode.
- include/wavefront.h -- the header file
-- Documentation/sound/Tropez+ -- short docs on configuration
-+ Documentation/sound/oss/Tropez+ -- short docs on configuration
-
- **********************************************************************
- 4) How do I compile/install/use it ?
---- linux-2.6.0/Documentation/SubmittingDrivers 2003-07-10 18:50:30.000000000 -0700
-+++ 25/Documentation/SubmittingDrivers 2003-12-28 23:22:58.000000000 -0800
-@@ -34,14 +34,13 @@ Linux 2.2:
- maintainer then please contact Alan Cox <alan@lxorguk.ukuu.org.uk>
-
- Linux 2.4:
-- The same rules apply as 2.2 but this kernel tree is under active
-- development. The final contact point for Linux 2.4 submissions is
-- Marcelo Tosatti <marcelo@conectiva.com.br>.
-+ The same rules apply as 2.2. The final contact point for Linux 2.4
-+ submissions is Marcelo Tosatti <marcelo.tosatti@cyclades.com>.
-
--Linux 2.5:
-+Linux 2.6:
- The same rules apply as 2.4 except that you should follow linux-kernel
-- to track changes in API's. The final contact point for Linux 2.5
-- submissions is Linus Torvalds <torvalds@osdl.org>.
-+ to track changes in API's. The final contact point for Linux 2.6
-+ submissions is Andrew Morton <akpm@osdl.org>.
-
- What Criteria Determine Acceptance
- ----------------------------------
---- linux-2.6.0/Documentation/SubmittingPatches 2003-07-10 18:50:30.000000000 -0700
-+++ 25/Documentation/SubmittingPatches 2003-12-28 23:21:00.000000000 -0800
-@@ -239,7 +239,7 @@ Let the compiler optimize away the "no-o
-
- Simple example, of poor code:
-
-- dev = init_etherdev (NULL, 0);
-+ dev = alloc_etherdev (sizeof(struct funky_private));
- if (!dev)
- return -ENODEV;
- #ifdef CONFIG_NET_FUNKINESS
-@@ -254,7 +254,7 @@ Cleaned-up example:
- #endif
-
- (in the code itself)
-- dev = init_etherdev (NULL, 0);
-+ dev = alloc_etherdev (sizeof(struct funky_private));
- if (!dev)
- return -ENODEV;
- init_funky_net(dev);
---- linux-2.6.0/Documentation/sysctl/fs.txt 2003-11-09 16:45:05.000000000 -0800
-+++ 25/Documentation/sysctl/fs.txt 2003-12-28 23:26:39.000000000 -0800
-@@ -138,3 +138,13 @@ thus the maximum number of mounted files
- can have. You only need to increase super-max if you need to
- mount more filesystems than the current value in super-max
- allows you to.
-+
-+==============================================================
-+
-+aio-nr & aio-max-nr:
-+
-+aio-nr shows the current system-wide number of asynchronous io
-+requests. aio-max-nr allows you to change the maximum value
-+aio-nr can grow to.
-+
-+==============================================================
---- linux-2.6.0/Documentation/watchdog/watchdog-api.txt 2003-09-08 13:58:55.000000000 -0700
-+++ 25/Documentation/watchdog/watchdog-api.txt 2003-12-28 23:22:31.000000000 -0800
-@@ -358,6 +358,15 @@ w83877f_wdt.c -- W83877F Computer
-
- No bits set in GETSUPPORT
-
-+w83627hf_wdt.c -- w83627hf watchdog
-+
-+ Timeout that defaults to 60 seconds, supports SETTIMEOUT.
-+
-+ Supports CONFIG_WATCHDOG_NOWAYOUT
-+
-+ GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT.
-+ The GETSTATUS call returns if the device is open or not.
-+
- wdt.c -- ICS WDT500/501 ISA and
- wdt_pci.c -- ICS WDT500/501 PCI
-
---- linux-2.6.0/drivers/acorn/block/fd1772.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/acorn/block/fd1772.c 2003-12-28 23:21:17.000000000 -0800
-@@ -365,13 +365,12 @@ static void finish_fdc_done(int dummy);
- static void floppy_off(unsigned int nr);
- static void setup_req_params(int drive);
- static void redo_fd_request(void);
--static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int
-+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int
- cmd, unsigned long param);
- static void fd_probe(int drive);
- static int fd_test_drive_present(int drive);
- static void config_types(void);
--static int floppy_open(struct inode *inode, struct file *filp);
--static int floppy_release(struct inode *inode, struct file *filp);
-+static int floppy_open(struct block_device *bdev, struct file *filp);
- static void do_fd_request(request_queue_t *);
-
- /************************* End of Prototypes **************************/
-@@ -1309,11 +1308,9 @@ static int invalidate_drive(struct block
- return 0;
- }
-
--static int fd_ioctl(struct inode *inode, struct file *filp,
-+static int fd_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long param)
- {
-- struct block_device *bdev = inode->i_bdev;
--
- switch (cmd) {
- case FDFMTEND:
- case FDFLUSH:
-@@ -1453,10 +1450,11 @@ static void config_types(void)
- * drive with different device numbers.
- */
-
--static int floppy_open(struct inode *inode, struct file *filp)
-+static int floppy_open(struct block_device *bdev, struct file *filp)
- {
-- int drive = iminor(inode) & 3;
-- int type = iminor(inode) >> 2;
-+ struct archy_floppy_struct *p = bdev->bd_disk->private_data;
-+ int drive = p - unit;
-+ int type = MINOR(bdev->bd_dev) >> 2;
- int old_dev = fd_device[drive];
-
- if (fd_ref[drive] && old_dev != type)
-@@ -1476,10 +1474,13 @@ static int floppy_open(struct inode *ino
- return 0;
-
- if (filp->f_mode & 3) {
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- if (filp->f_mode & 2) {
-- if (unit[drive].wpstat) {
-- floppy_release(inode, filp);
-+ if (p->wpstat) {
-+ if (fd_ref[drive] < 0)
-+ fd_ref[drive] = 0;
-+ else
-+ fd_ref[drive]--;
- return -EROFS;
- }
- }
-@@ -1487,10 +1488,10 @@ static int floppy_open(struct inode *ino
- return 0;
- }
-
--
--static int floppy_release(struct inode *inode, struct file *filp)
-+static int floppy_release(struct gendisk *disk)
- {
-- int drive = iminor(inode) & 3;
-+ struct archy_floppy_struct *p = disk->private_data;
-+ int drive = p - unit;
-
- if (fd_ref[drive] < 0)
- fd_ref[drive] = 0;
---- linux-2.6.0/drivers/acorn/block/mfmhd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/acorn/block/mfmhd.c 2003-12-28 23:21:12.000000000 -0800
-@@ -1153,9 +1153,9 @@ static int mfm_initdrives(void)
- * The 'front' end of the mfm driver follows...
- */
-
--static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg)
-+static int mfm_ioctl(struct block_device *bdev, struct file *file, u_int cmd, u_long arg)
- {
-- struct mfm_info *p = inode->i_bdev->bd_disk->private_data;
-+ struct mfm_info *p = bdev->bd_disk->private_data;
- struct hd_geometry *geo = (struct hd_geometry *) arg;
- if (cmd != HDIO_GETGEO)
- return -EINVAL;
-@@ -1167,7 +1167,7 @@ static int mfm_ioctl(struct inode *inode
- return -EFAULT;
- if (put_user (p->cylinders, &geo->cylinders))
- return -EFAULT;
-- if (put_user (get_start_sect(inode->i_bdev), &geo->start))
-+ if (put_user (get_start_sect(bdev), &geo->start))
- return -EFAULT;
- return 0;
- }
---- linux-2.6.0/drivers/acpi/bus.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/acpi/bus.c 2003-12-28 23:21:33.000000000 -0800
-@@ -39,7 +39,7 @@
- #define _COMPONENT ACPI_BUS_COMPONENT
- ACPI_MODULE_NAME ("acpi_bus")
-
--extern void acpi_pic_set_level_irq(unsigned int irq);
-+extern void __init acpi_pic_sci_set_trigger(unsigned int irq);
-
- FADT_DESCRIPTOR acpi_fadt;
- struct acpi_device *acpi_root;
-@@ -615,7 +615,7 @@ acpi_bus_init (void)
- if (acpi_ioapic)
- mp_config_ioapic_for_sci(acpi_fadt.sci_int);
- else
-- acpi_pic_set_level_irq(acpi_fadt.sci_int);
-+ acpi_pic_sci_set_trigger(acpi_fadt.sci_int);
- #endif
-
- status = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION);
---- linux-2.6.0/drivers/acpi/dispatcher/dsinit.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/dispatcher/dsinit.c 2003-12-28 23:21:33.000000000 -0800
-@@ -106,7 +106,7 @@ acpi_ds_init_one_object (
- status = acpi_ds_initialize_region (obj_handle);
- if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Region %p [%4.4s] - Init failure, %s\n",
-- obj_handle, ((struct acpi_namespace_node *) obj_handle)->name.ascii,
-+ obj_handle, acpi_ut_get_node_name (obj_handle),
- acpi_format_exception (status)));
- }
-
-@@ -141,7 +141,7 @@ acpi_ds_init_one_object (
- status = acpi_ds_parse_method (obj_handle);
- if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] - parse failure, %s\n",
-- obj_handle, ((struct acpi_namespace_node *) obj_handle)->name.ascii,
-+ obj_handle, acpi_ut_get_node_name (obj_handle),
- acpi_format_exception (status)));
-
- /* This parse failed, but we will continue parsing more methods */
---- linux-2.6.0/drivers/acpi/dispatcher/dsmethod.c 2003-06-14 12:18:21.000000000 -0700
-+++ 25/drivers/acpi/dispatcher/dsmethod.c 2003-12-28 23:21:33.000000000 -0800
-@@ -94,7 +94,7 @@ acpi_ds_parse_method (
- }
-
- ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Parsing [%4.4s] **** named_obj=%p\n",
-- ((struct acpi_namespace_node *) obj_handle)->name.ascii, obj_handle));
-+ acpi_ut_get_node_name (obj_handle), obj_handle));
-
- /* Extract the method object from the method Node */
-
-@@ -169,7 +169,7 @@ acpi_ds_parse_method (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
- "**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
-- ((struct acpi_namespace_node *) obj_handle)->name.ascii, obj_handle, op));
-+ acpi_ut_get_node_name (obj_handle), obj_handle, op));
-
- acpi_ps_delete_parse_tree (op);
- return_ACPI_STATUS (status);
---- linux-2.6.0/drivers/acpi/dispatcher/dsmthdat.c 2003-06-22 12:04:44.000000000 -0700
-+++ 25/drivers/acpi/dispatcher/dsmthdat.c 2003-12-28 23:21:35.000000000 -0800
-@@ -567,13 +567,13 @@ acpi_ds_store_object_to_local (
- acpi_status status;
- struct acpi_namespace_node *node;
- union acpi_operand_object *current_obj_desc;
-+ union acpi_operand_object *new_obj_desc;
-
-
- ACPI_FUNCTION_TRACE ("ds_store_object_to_local");
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%d Idx=%d Obj=%p\n",
- opcode, index, obj_desc));
-
--
- /* Parameter validation */
-
- if (!obj_desc) {
-@@ -595,6 +595,18 @@ acpi_ds_store_object_to_local (
- }
-
- /*
-+ * If the reference count on the object is more than one, we must
-+ * take a copy of the object before we store.
-+ */
-+ new_obj_desc = obj_desc;
-+ if (obj_desc->common.reference_count > 1) {
-+ status = acpi_ut_copy_iobject_to_iobject (obj_desc, &new_obj_desc, walk_state);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-+ }
-+
-+ /*
- * If there is an object already in this slot, we either
- * have to delete it, or if this is an argument and there
- * is an object reference stored there, we have to do
-@@ -624,8 +636,8 @@ acpi_ds_store_object_to_local (
- * operand objects of type Reference.
- */
- if (ACPI_GET_DESCRIPTOR_TYPE (current_obj_desc) != ACPI_DESC_TYPE_OPERAND) {
-- ACPI_REPORT_ERROR (("Invalid descriptor type while storing to method arg: %X\n",
-- current_obj_desc->common.type));
-+ ACPI_REPORT_ERROR (("Invalid descriptor type while storing to method arg: [%s]\n",
-+ acpi_ut_get_descriptor_name (current_obj_desc)));
- return_ACPI_STATUS (AE_AML_INTERNAL);
- }
-
-@@ -636,15 +648,21 @@ acpi_ds_store_object_to_local (
- if ((current_obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
- (current_obj_desc->reference.opcode == AML_REF_OF_OP)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
-- "Arg (%p) is an obj_ref(Node), storing in node %p\n",
-- obj_desc, current_obj_desc));
-+ "Arg (%p) is an obj_ref(Node), storing in node %p\n",
-+ new_obj_desc, current_obj_desc));
-
- /*
- * Store this object to the Node
- * (perform the indirect store)
- */
-- status = acpi_ex_store_object_to_node (obj_desc,
-+ status = acpi_ex_store_object_to_node (new_obj_desc,
- current_obj_desc->reference.object, walk_state);
-+
-+ /* Remove local reference if we copied the object above */
-+
-+ if (new_obj_desc != obj_desc) {
-+ acpi_ut_remove_reference (new_obj_desc);
-+ }
- return_ACPI_STATUS (status);
- }
- }
-@@ -657,12 +675,18 @@ acpi_ds_store_object_to_local (
- }
-
- /*
-- * Install the obj_stack descriptor (*obj_desc) into
-+ * Install the Obj descriptor (*new_obj_desc) into
- * the descriptor for the Arg or Local.
-- * Install the new object in the stack entry
- * (increments the object reference count by one)
- */
-- status = acpi_ds_method_data_set_value (opcode, index, obj_desc, walk_state);
-+ status = acpi_ds_method_data_set_value (opcode, index, new_obj_desc, walk_state);
-+
-+ /* Remove local reference if we copied the object above */
-+
-+ if (new_obj_desc != obj_desc) {
-+ acpi_ut_remove_reference (new_obj_desc);
-+ }
-+
- return_ACPI_STATUS (status);
- }
-
---- linux-2.6.0/drivers/acpi/dispatcher/dsopcode.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/acpi/dispatcher/dsopcode.c 2003-12-28 23:21:33.000000000 -0800
-@@ -201,7 +201,7 @@ acpi_ds_get_buffer_field_arguments (
-
- ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL));
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n",
-- node->name.ascii));
-+ acpi_ut_get_node_name (node)));
-
- /* Execute the AML code for the term_arg arguments */
-
-@@ -346,7 +346,7 @@ acpi_ds_get_region_arguments (
- ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL));
-
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Arg Init at AML %p\n",
-- node->name.ascii, extra_desc->extra.aml_start));
-+ acpi_ut_get_node_name (node), extra_desc->extra.aml_start));
-
- /* Execute the argument AML */
-
-@@ -438,8 +438,8 @@ acpi_ds_init_buffer_field (
- * after resolution in acpi_ex_resolve_operands().
- */
- if (ACPI_GET_DESCRIPTOR_TYPE (result_desc) != ACPI_DESC_TYPE_NAMED) {
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) destination must be a NS Node\n",
-- acpi_ps_get_opcode_name (aml_opcode)));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) destination not a NS Node [%s]\n",
-+ acpi_ps_get_opcode_name (aml_opcode), acpi_ut_get_descriptor_name (result_desc)));
-
- status = AE_AML_OPERAND_TYPE;
- goto cleanup;
-@@ -514,14 +514,16 @@ acpi_ds_init_buffer_field (
- goto cleanup;
- }
-
--
- /* Entire field must fit within the current length of the buffer */
-
- if ((bit_offset + bit_count) >
- (8 * (u32) buffer_desc->buffer.length)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-- "Field size %d exceeds Buffer size %d (bits)\n",
-- bit_offset + bit_count, 8 * (u32) buffer_desc->buffer.length));
-+ "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n",
-+ acpi_ut_get_node_name (result_desc),
-+ bit_offset + bit_count,
-+ acpi_ut_get_node_name (buffer_desc->buffer.node),
-+ 8 * (u32) buffer_desc->buffer.length));
- status = AE_AML_BUFFER_LIMIT;
- goto cleanup;
- }
-@@ -742,7 +744,7 @@ acpi_ds_eval_region_operands (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "rgn_obj %p Addr %8.8X%8.8X Len %X\n",
- obj_desc,
-- ACPI_HIDWORD (obj_desc->region.address), ACPI_LODWORD (obj_desc->region.address),
-+ ACPI_FORMAT_UINT64 (obj_desc->region.address),
- obj_desc->region.length));
-
- /* Now the address and length are valid for this opregion */
---- linux-2.6.0/drivers/acpi/dispatcher/dswexec.c 2003-06-14 12:18:35.000000000 -0700
-+++ 25/drivers/acpi/dispatcher/dswexec.c 2003-12-28 23:21:33.000000000 -0800
-@@ -416,10 +416,24 @@ acpi_ds_exec_end_op (
- status = acpi_gbl_op_type_dispatch [op_type] (walk_state);
- }
- else {
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-- "[%s]: Could not resolve operands, %s\n",
-- acpi_ps_get_opcode_name (walk_state->opcode),
-- acpi_format_exception (status)));
-+ /*
-+ * Treat constructs of the form "Store(local_x,local_x)" as noops when the
-+ * Local is uninitialized.
-+ */
-+ if ((status == AE_AML_UNINITIALIZED_LOCAL) &&
-+ (walk_state->opcode == AML_STORE_OP) &&
-+ (walk_state->operands[0]->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
-+ (walk_state->operands[1]->common.type == ACPI_TYPE_LOCAL_REFERENCE) &&
-+ (walk_state->operands[0]->reference.opcode ==
-+ walk_state->operands[1]->reference.opcode)) {
-+ status = AE_OK;
-+ }
-+ else {
-+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-+ "[%s]: Could not resolve operands, %s\n",
-+ acpi_ps_get_opcode_name (walk_state->opcode),
-+ acpi_format_exception (status)));
-+ }
- }
-
- /* Always delete the argument objects and clear the operand stack */
---- linux-2.6.0/drivers/acpi/dispatcher/dswload.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/dispatcher/dswload.c 2003-12-28 23:21:33.000000000 -0800
-@@ -167,7 +167,7 @@ acpi_ds_load1_begin_op (
- object_type = walk_state->op_info->object_type;
-
- ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
-- "State=%p Op=%p [%s] ", walk_state, op, acpi_ut_get_type_name (object_type)));
-+ "State=%p Op=%p [%s]\n", walk_state, op, acpi_ut_get_type_name (object_type)));
-
- switch (walk_state->opcode) {
- case AML_SCOPE_OP:
-@@ -260,10 +260,12 @@ acpi_ds_load1_begin_op (
- if ((walk_state->opcode != AML_SCOPE_OP) &&
- (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
- flags |= ACPI_NS_ERROR_IF_FOUND;
-- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Cannot already exist\n"));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Cannot already exist\n",
-+ acpi_ut_get_type_name (object_type)));
- }
- else {
-- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DISPATCH, "Both Find or Create allowed\n"));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Both Find or Create allowed\n",
-+ acpi_ut_get_type_name (object_type)));
- }
-
- /*
---- linux-2.6.0/drivers/acpi/dispatcher/dswscope.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/dispatcher/dswscope.c 2003-12-28 23:21:33.000000000 -0800
-@@ -146,7 +146,7 @@ acpi_ds_scope_stack_push (
- if (old_scope_info) {
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
- "[%4.4s] (%s)",
-- old_scope_info->scope.node->name.ascii,
-+ acpi_ut_get_node_name (old_scope_info->scope.node),
- acpi_ut_get_type_name (old_scope_info->common.value)));
- }
- else {
-@@ -156,7 +156,7 @@ acpi_ds_scope_stack_push (
-
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
- ", New scope -> [%4.4s] (%s)\n",
-- scope_info->scope.node->name.ascii,
-+ acpi_ut_get_node_name (scope_info->scope.node),
- acpi_ut_get_type_name (scope_info->common.value)));
-
- /* Push new scope object onto stack */
-@@ -207,14 +207,14 @@ acpi_ds_scope_stack_pop (
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
- "[%.2d] Popped scope [%4.4s] (%s), New scope -> ",
- (u32) walk_state->scope_depth,
-- scope_info->scope.node->name.ascii,
-+ acpi_ut_get_node_name (scope_info->scope.node),
- acpi_ut_get_type_name (scope_info->common.value)));
-
- new_scope_info = walk_state->scope_info;
- if (new_scope_info) {
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
- "[%4.4s] (%s)\n",
-- new_scope_info->scope.node->name.ascii,
-+ acpi_ut_get_node_name (new_scope_info->scope.node),
- acpi_ut_get_type_name (new_scope_info->common.value)));
- }
- else {
---- linux-2.6.0/drivers/acpi/events/evgpeblk.c 2003-06-22 12:04:44.000000000 -0700
-+++ 25/drivers/acpi/events/evgpeblk.c 2003-12-28 23:21:33.000000000 -0800
-@@ -477,7 +477,7 @@ unlock_and_exit:
- *
- * RETURN: Status
- *
-- * DESCRIPTION: Install new GPE block with mutex support
-+ * DESCRIPTION: Remove a GPE block
- *
- ******************************************************************************/
-
-@@ -743,8 +743,7 @@ acpi_ev_create_gpe_block (
- ((gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) -1)),
- gpe_device->name.ascii,
- gpe_block->register_count,
-- ACPI_HIDWORD (gpe_block->block_address.address),
-- ACPI_LODWORD (gpe_block->block_address.address),
-+ ACPI_FORMAT_UINT64 (gpe_block->block_address.address),
- interrupt_level));
-
- /* Find all GPE methods (_Lxx, _Exx) for this block */
---- linux-2.6.0/drivers/acpi/events/evgpe.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/acpi/events/evgpe.c 2003-12-28 23:21:33.000000000 -0800
-@@ -139,12 +139,10 @@ acpi_ev_gpe_detect (
- {
- u32 int_status = ACPI_INTERRUPT_NOT_HANDLED;
- u8 enabled_status_byte;
-- u8 bit_mask;
- struct acpi_gpe_register_info *gpe_register_info;
- u32 in_value;
- acpi_status status;
- struct acpi_gpe_block_info *gpe_block;
-- u32 gpe_number;
- u32 i;
- u32 j;
-
-@@ -187,11 +185,9 @@ acpi_ev_gpe_detect (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
- "GPE pair: Status %8.8X%8.8X = %02X, Enable %8.8X%8.8X = %02X\n",
-- ACPI_HIDWORD (gpe_register_info->status_address.address),
-- ACPI_LODWORD (gpe_register_info->status_address.address),
-+ ACPI_FORMAT_UINT64 (gpe_register_info->status_address.address),
- gpe_register_info->status,
-- ACPI_HIDWORD (gpe_register_info->enable_address.address),
-- ACPI_LODWORD (gpe_register_info->enable_address.address),
-+ ACPI_FORMAT_UINT64 (gpe_register_info->enable_address.address),
- gpe_register_info->enable));
-
- /* First check if there is anything active at all in this register */
-@@ -206,19 +202,17 @@ acpi_ev_gpe_detect (
-
- /* Now look at the individual GPEs in this byte register */
-
-- for (j = 0, bit_mask = 1; j < ACPI_GPE_REGISTER_WIDTH; j++, bit_mask <<= 1) {
-+ for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
- /* Examine one GPE bit */
-
-- if (enabled_status_byte & bit_mask) {
-+ if (enabled_status_byte & acpi_gbl_decode_to8bit[j]) {
- /*
- * Found an active GPE. Dispatch the event to a handler
- * or method.
- */
-- gpe_number = (i * ACPI_GPE_REGISTER_WIDTH) + j;
--
- int_status |= acpi_ev_gpe_dispatch (
-- &gpe_block->event_info[gpe_number],
-- j + gpe_register_info->base_gpe_number);
-+ &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j],
-+ j + gpe_register_info->base_gpe_number);
- }
- }
- }
-@@ -294,7 +288,7 @@ acpi_ev_asynch_execute_gpe_method (
- if (ACPI_FAILURE (status)) {
- ACPI_REPORT_ERROR (("%s while evaluating method [%4.4s] for GPE[%2X]\n",
- acpi_format_exception (status),
-- local_gpe_event_info.method_node->name.ascii, gpe_number));
-+ acpi_ut_get_node_name (local_gpe_event_info.method_node), gpe_number));
- }
- }
-
-@@ -367,6 +361,18 @@ acpi_ev_gpe_dispatch (
- /* Invoke the installed handler (at interrupt level) */
-
- gpe_event_info->handler (gpe_event_info->context);
-+
-+ /* It is now safe to clear level-triggered events. */
-+
-+ if (gpe_event_info->flags & ACPI_EVENT_LEVEL_TRIGGERED) {
-+ status = acpi_hw_clear_gpe (gpe_event_info);
-+ if (ACPI_FAILURE (status)) {
-+ ACPI_REPORT_ERROR ((
-+ "acpi_ev_gpe_dispatch: Unable to clear GPE[%2X]\n",
-+ gpe_number));
-+ return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
-+ }
-+ }
- }
- else if (gpe_event_info->method_node) {
- /*
-@@ -375,13 +381,16 @@ acpi_ev_gpe_dispatch (
- */
- status = acpi_hw_disable_gpe (gpe_event_info);
- if (ACPI_FAILURE (status)) {
-- ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
-+ ACPI_REPORT_ERROR ((
-+ "acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
- gpe_number));
- return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
- }
-
-- /* Execute the method associated with the GPE. */
--
-+ /*
-+ * Execute the method associated with the GPE
-+ * NOTE: Level-triggered GPEs are cleared after the method completes.
-+ */
- if (ACPI_FAILURE (acpi_os_queue_for_execution (OSD_PRIORITY_GPE,
- acpi_ev_asynch_execute_gpe_method,
- gpe_event_info))) {
-@@ -399,22 +408,12 @@ acpi_ev_gpe_dispatch (
-
- /*
- * Disable the GPE. The GPE will remain disabled until the ACPI
-- * Core Subsystem is restarted, or the handler is reinstalled.
-+ * Core Subsystem is restarted, or a handler is installed.
- */
- status = acpi_hw_disable_gpe (gpe_event_info);
- if (ACPI_FAILURE (status)) {
-- ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
-- gpe_number));
-- return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
-- }
-- }
--
-- /* It is now safe to clear level-triggered events. */
--
-- if (gpe_event_info->flags & ACPI_EVENT_LEVEL_TRIGGERED) {
-- status = acpi_hw_clear_gpe (gpe_event_info);
-- if (ACPI_FAILURE (status)) {
-- ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to clear GPE[%2X]\n",
-+ ACPI_REPORT_ERROR ((
-+ "acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n",
- gpe_number));
- return_VALUE (ACPI_INTERRUPT_NOT_HANDLED);
- }
---- linux-2.6.0/drivers/acpi/events/evmisc.c 2003-06-14 12:18:23.000000000 -0700
-+++ 25/drivers/acpi/events/evmisc.c 2003-12-28 23:21:33.000000000 -0800
-@@ -195,7 +195,8 @@ acpi_ev_queue_notify_request (
- /* There is no per-device notify handler for this device */
-
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-- "No notify handler for [%4.4s] node %p\n", node->name.ascii, node));
-+ "No notify handler for [%4.4s] node %p\n",
-+ acpi_ut_get_node_name (node), node));
- }
-
- return (status);
---- linux-2.6.0/drivers/acpi/events/evregion.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/events/evregion.c 2003-12-28 23:21:33.000000000 -0800
-@@ -136,7 +136,7 @@ acpi_ev_init_address_spaces (
- *
- ******************************************************************************/
-
--static acpi_status
-+acpi_status
- acpi_ev_execute_reg_method (
- union acpi_operand_object *region_obj,
- u32 function)
-@@ -202,7 +202,7 @@ cleanup:
- *
- * FUNCTION: acpi_ev_address_space_dispatch
- *
-- * PARAMETERS: region_obj - internal region object
-+ * PARAMETERS: region_obj - Internal region object
- * space_id - ID of the address space (0-255)
- * Function - Read or Write operation
- * Address - Where in the space to read or write
-@@ -243,9 +243,11 @@ acpi_ev_address_space_dispatch (
-
- /* Ensure that there is a handler associated with this region */
-
-- handler_desc = region_obj->region.address_space;
-+ handler_desc = region_obj->region.handler;
- if (!handler_desc) {
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "no handler for region(%p) [%s]\n",
-+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-+ "No handler for Region [%4.4s] (%p) [%s]\n",
-+ acpi_ut_get_node_name (region_obj->region.node),
- region_obj, acpi_ut_get_region_name (region_obj->region.space_id)));
-
- return_ACPI_STATUS (AE_NOT_EXIST);
-@@ -320,8 +322,8 @@ acpi_ev_address_space_dispatch (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
- "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
-- ®ion_obj->region.address_space->address_space, handler,
-- ACPI_HIDWORD (address), ACPI_LODWORD (address),
-+ ®ion_obj->region.handler->address_space, handler,
-+ ACPI_FORMAT_UINT64 (address),
- acpi_ut_get_region_name (region_obj->region.space_id)));
-
- if (!(handler_desc->address_space.flags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
-@@ -359,6 +361,7 @@ acpi_ev_address_space_dispatch (
- return_ACPI_STATUS (status);
- }
-
-+
- /*******************************************************************************
- *
- * FUNCTION: acpi_ev_detach_region
-@@ -398,7 +401,7 @@ acpi_ev_detach_region(
-
- /* Get the address handler from the region object */
-
-- handler_obj = region_obj->region.address_space;
-+ handler_obj = region_obj->region.handler;
- if (!handler_obj) {
- /* This region has no handler, all done */
-
-@@ -472,7 +475,7 @@ acpi_ev_detach_region(
- * If the region is on the handler's list
- * this better be the region's handler
- */
-- region_obj->region.address_space = NULL;
-+ region_obj->region.handler = NULL;
- acpi_ut_remove_reference (handler_obj);
-
- return_VOID;
-@@ -515,17 +518,15 @@ acpi_ev_attach_region (
- union acpi_operand_object *region_obj,
- u8 acpi_ns_is_locked)
- {
-- acpi_status status;
-- acpi_status status2;
--
-
- ACPI_FUNCTION_TRACE ("ev_attach_region");
-
-
- ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
-- "Adding Region %p to address handler %p [%s]\n",
-- region_obj, handler_obj, acpi_ut_get_region_name (region_obj->region.space_id)));
--
-+ "Adding Region [%4.4s] %p to address handler %p [%s]\n",
-+ acpi_ut_get_node_name (region_obj->region.node),
-+ region_obj, handler_obj,
-+ acpi_ut_get_region_name (region_obj->region.space_id)));
-
- /* Link this region to the front of the handler's list */
-
-@@ -534,34 +535,14 @@ acpi_ev_attach_region (
-
- /* Install the region's handler */
-
-- if (region_obj->region.address_space) {
-+ if (region_obj->region.handler) {
- return_ACPI_STATUS (AE_ALREADY_EXISTS);
- }
-
-- region_obj->region.address_space = handler_obj;
-+ region_obj->region.handler = handler_obj;
- acpi_ut_add_reference (handler_obj);
-
-- /*
-- * Tell all users that this region is usable by running the _REG
-- * method
-- */
-- if (acpi_ns_is_locked) {
-- status2 = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
-- if (ACPI_FAILURE (status2)) {
-- return_ACPI_STATUS (status2);
-- }
-- }
--
-- status = acpi_ev_execute_reg_method (region_obj, 1);
--
-- if (acpi_ns_is_locked) {
-- status2 = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
-- if (ACPI_FAILURE (status2)) {
-- return_ACPI_STATUS (status2);
-- }
-- }
--
-- return_ACPI_STATUS (status);
-+ return_ACPI_STATUS (AE_OK);
- }
-
-
-@@ -569,9 +550,7 @@ acpi_ev_attach_region (
- *
- * FUNCTION: acpi_ev_install_handler
- *
-- * PARAMETERS: Handle - Node to be dumped
-- * Level - Nesting level of the handle
-- * Context - Passed into acpi_ns_walk_namespace
-+ * PARAMETERS: walk_namespace callback
- *
- * DESCRIPTION: This routine installs an address handler into objects that are
- * of type Region or Device.
-@@ -640,7 +619,7 @@ acpi_ev_install_handler (
- if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_DEVICE) {
- /* Check if this Device already has a handler for this address space */
-
-- next_handler_obj = obj_desc->device.address_space;
-+ next_handler_obj = obj_desc->device.handler;
- while (next_handler_obj) {
- /* Found a handler, is it for the same address space? */
-
-@@ -697,4 +676,77 @@ acpi_ev_install_handler (
- return (status);
- }
-
-+/*******************************************************************************
-+ *
-+ * FUNCTION: acpi_ev_reg_run
-+ *
-+ * PARAMETERS: walk_namespace callback
-+ *
-+ * DESCRIPTION: Run _REg method for region objects of the requested space_iD
-+ *
-+ ******************************************************************************/
-+
-+acpi_status
-+acpi_ev_reg_run (
-+ acpi_handle obj_handle,
-+ u32 level,
-+ void *context,
-+ void **return_value)
-+{
-+ union acpi_operand_object *handler_obj;
-+ union acpi_operand_object *obj_desc;
-+ struct acpi_namespace_node *node;
-+ acpi_status status;
-+
-+
-+ ACPI_FUNCTION_NAME ("ev_reg_run");
-+
-+
-+ handler_obj = (union acpi_operand_object *) context;
-+
-+ /* Parameter validation */
-+
-+ if (!handler_obj) {
-+ return (AE_OK);
-+ }
-+
-+ /* Convert and validate the device handle */
-+
-+ node = acpi_ns_map_handle_to_node (obj_handle);
-+ if (!node) {
-+ return (AE_BAD_PARAMETER);
-+ }
-+
-+ /*
-+ * We only care about regions.and objects
-+ * that are allowed to have address space handlers
-+ */
-+ if ((node->type != ACPI_TYPE_REGION) &&
-+ (node != acpi_gbl_root_node)) {
-+ return (AE_OK);
-+ }
-+
-+ /* Check for an existing internal object */
-+
-+ obj_desc = acpi_ns_get_attached_object (node);
-+ if (!obj_desc) {
-+ /* No object, just exit */
-+
-+ return (AE_OK);
-+ }
-+
-+
-+ /* Object is a Region */
-+
-+ if (obj_desc->region.space_id != handler_obj->address_space.space_id) {
-+ /*
-+ * This region is for a different address space
-+ * -- just ignore it
-+ */
-+ return (AE_OK);
-+ }
-+
-+ status = acpi_ev_execute_reg_method (obj_desc, 1);
-+ return (status);
-+}
-
---- linux-2.6.0/drivers/acpi/events/evrgnini.c 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/acpi/events/evrgnini.c 2003-12-28 23:21:33.000000000 -0800
-@@ -177,7 +177,7 @@ acpi_ev_pci_config_region_setup (
- ACPI_FUNCTION_TRACE ("ev_pci_config_region_setup");
-
-
-- handler_obj = region_obj->region.address_space;
-+ handler_obj = region_obj->region.handler;
- if (!handler_obj) {
- /*
- * No installed handler. This shouldn't happen because the dispatch
-@@ -239,7 +239,7 @@ acpi_ev_pci_config_region_setup (
- else {
- ACPI_REPORT_ERROR ((
- "Could not install pci_config handler for Root Bridge %4.4s, %s\n",
-- pci_root_node->name.ascii, acpi_format_exception (status)));
-+ acpi_ut_get_node_name (pci_root_node), acpi_format_exception (status)));
- }
- }
- break;
-@@ -469,7 +469,7 @@ acpi_ev_initialize_region (
-
- /* Setup defaults */
-
-- region_obj->region.address_space = NULL;
-+ region_obj->region.handler = NULL;
- region_obj2->extra.method_REG = NULL;
- region_obj->common.flags &= ~(AOPOBJ_SETUP_COMPLETE);
- region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
-@@ -502,17 +502,17 @@ acpi_ev_initialize_region (
- switch (node->type) {
- case ACPI_TYPE_DEVICE:
-
-- handler_obj = obj_desc->device.address_space;
-+ handler_obj = obj_desc->device.handler;
- break;
-
- case ACPI_TYPE_PROCESSOR:
-
-- handler_obj = obj_desc->processor.address_space;
-+ handler_obj = obj_desc->processor.handler;
- break;
-
- case ACPI_TYPE_THERMAL:
-
-- handler_obj = obj_desc->thermal_zone.address_space;
-+ handler_obj = obj_desc->thermal_zone.handler;
- break;
-
- default:
-@@ -533,6 +533,26 @@ acpi_ev_initialize_region (
- status = acpi_ev_attach_region (handler_obj, region_obj,
- acpi_ns_locked);
-
-+ /*
-+ * Tell all users that this region is usable by running the _REG
-+ * method
-+ */
-+ if (acpi_ns_locked) {
-+ status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-+ }
-+
-+ status = acpi_ev_execute_reg_method (region_obj, 1);
-+
-+ if (acpi_ns_locked) {
-+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-+ }
-+
- return_ACPI_STATUS (AE_OK);
- }
-
---- linux-2.6.0/drivers/acpi/events/evxfregn.c 2003-06-14 12:17:59.000000000 -0700
-+++ 25/drivers/acpi/events/evxfregn.c 2003-12-28 23:21:33.000000000 -0800
-@@ -173,7 +173,7 @@ acpi_install_address_space_handler (
- * The attached device object already exists.
- * Make sure the handler is not already installed.
- */
-- handler_obj = obj_desc->device.address_space;
-+ handler_obj = obj_desc->device.handler;
-
- /* Walk the handler list for this device */
-
-@@ -240,7 +240,8 @@ acpi_install_address_space_handler (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
- "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
-- acpi_ut_get_region_name (space_id), space_id, node->name.ascii, node, obj_desc));
-+ acpi_ut_get_region_name (space_id), space_id,
-+ acpi_ut_get_node_name (node), node, obj_desc));
-
- /*
- * Install the handler
-@@ -267,13 +268,13 @@ acpi_install_address_space_handler (
-
- /* Install at head of Device.address_space list */
-
-- handler_obj->address_space.next = obj_desc->device.address_space;
-+ handler_obj->address_space.next = obj_desc->device.handler;
-
- /*
- * The Device object is the first reference on the handler_obj.
- * Each region that uses the handler adds a reference.
- */
-- obj_desc->device.address_space = handler_obj;
-+ obj_desc->device.handler = handler_obj;
-
- /*
- * Walk the namespace finding all of the regions this
-@@ -291,6 +292,17 @@ acpi_install_address_space_handler (
- ACPI_NS_WALK_UNLOCK, acpi_ev_install_handler,
- handler_obj, NULL);
-
-+ /*
-+ * Now we can run the _REG methods for all Regions for this
-+ * space ID. This is a separate walk in order to handle any
-+ * interdependencies between regions and _REG methods. (i.e. handlers
-+ * must be installed for all regions of this Space ID before we
-+ * can run any _REG methods.
-+ */
-+ status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, ACPI_UINT32_MAX,
-+ ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run,
-+ handler_obj, NULL);
-+
- unlock_and_exit:
- (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
- return_ACPI_STATUS (status);
-@@ -357,8 +369,8 @@ acpi_remove_address_space_handler (
-
- /* Find the address handler the user requested */
-
-- handler_obj = obj_desc->device.address_space;
-- last_obj_ptr = &obj_desc->device.address_space;
-+ handler_obj = obj_desc->device.handler;
-+ last_obj_ptr = &obj_desc->device.handler;
- while (handler_obj) {
- /* We have a handler, see if user requested this one */
-
---- linux-2.6.0/drivers/acpi/executer/exdump.c 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/acpi/executer/exdump.c 2003-12-28 23:21:33.000000000 -0800
-@@ -89,27 +89,27 @@ acpi_ex_dump_operand (
-
- if (!obj_desc) {
- /*
-- * This usually indicates that something serious is wrong --
-- * since most (if not all)
-- * code that dumps the stack expects something to be there!
-+ * This usually indicates that something serious is wrong
- */
-- acpi_os_printf ("Null stack entry ptr\n");
-+ acpi_os_printf ("Null Object Descriptor\n");
- return;
- }
-
- if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) == ACPI_DESC_TYPE_NAMED) {
-- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p NS Node: ", obj_desc));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p is a NS Node: ", obj_desc));
- ACPI_DUMP_ENTRY (obj_desc, ACPI_LV_EXEC);
- return;
- }
-
- if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) != ACPI_DESC_TYPE_OPERAND) {
-- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p is not a local object\n", obj_desc));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
-+ "%p is not a node or operand object: [%s]\n",
-+ obj_desc, acpi_ut_get_descriptor_name (obj_desc)));
- ACPI_DUMP_BUFFER (obj_desc, sizeof (union acpi_operand_object));
- return;
- }
-
-- /* obj_desc is a valid object */
-+ /* obj_desc is a valid object */
-
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", obj_desc));
-
-@@ -151,11 +151,10 @@ acpi_ex_dump_operand (
- obj_desc->reference.offset);
-
- if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) {
-- /* Value is a Number */
-+ /* Value is an Integer */
-
- acpi_os_printf (" value is [%8.8X%8.8x]",
-- ACPI_HIDWORD(obj_desc->integer.value),
-- ACPI_LODWORD(obj_desc->integer.value));
-+ ACPI_FORMAT_UINT64 (obj_desc->integer.value));
- }
-
- acpi_os_printf ("\n");
-@@ -169,11 +168,10 @@ acpi_ex_dump_operand (
-
- if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) {
-
-- /* Value is a Number */
-+ /* Value is an Integer */
-
- acpi_os_printf (" value is [%8.8X%8.8x]",
-- ACPI_HIDWORD(obj_desc->integer.value),
-- ACPI_LODWORD(obj_desc->integer.value));
-+ ACPI_FORMAT_UINT64 (obj_desc->integer.value));
- }
-
- acpi_os_printf ("\n");
-@@ -189,7 +187,7 @@ acpi_ex_dump_operand (
-
- default:
-
-- /* unknown opcode */
-+ /* Unknown opcode */
-
- acpi_os_printf ("Unknown Reference opcode=%X\n",
- obj_desc->reference.opcode);
-@@ -229,8 +227,7 @@ acpi_ex_dump_operand (
- case ACPI_TYPE_INTEGER:
-
- acpi_os_printf ("Integer %8.8X%8.8X\n",
-- ACPI_HIDWORD (obj_desc->integer.value),
-- ACPI_LODWORD (obj_desc->integer.value));
-+ ACPI_FORMAT_UINT64 (obj_desc->integer.value));
- break;
-
-
-@@ -271,8 +268,7 @@ acpi_ex_dump_operand (
- }
- else {
- acpi_os_printf (" base %8.8X%8.8X Length %X\n",
-- ACPI_HIDWORD (obj_desc->region.address),
-- ACPI_LODWORD (obj_desc->region.address),
-+ ACPI_FORMAT_UINT64 (obj_desc->region.address),
- obj_desc->region.length);
- }
- break;
-@@ -494,7 +490,7 @@ acpi_ex_out_address (
- acpi_os_printf ("%20s : %p\n", title, value);
- #else
- acpi_os_printf ("%20s : %8.8X%8.8X\n", title,
-- ACPI_HIDWORD (value), ACPI_LODWORD (value));
-+ ACPI_FORMAT_UINT64 (value));
- #endif
- }
-
-@@ -525,7 +521,7 @@ acpi_ex_dump_node (
- }
- }
-
-- acpi_os_printf ("%20s : %4.4s\n", "Name", node->name.ascii);
-+ acpi_os_printf ("%20s : %4.4s\n", "Name", acpi_ut_get_node_name (node));
- acpi_ex_out_string ("Type", acpi_ut_get_type_name (node->type));
- acpi_ex_out_integer ("Flags", node->flags);
- acpi_ex_out_integer ("Owner Id", node->owner_id);
-@@ -573,7 +569,8 @@ acpi_ex_dump_object_descriptor (
- }
-
- if (ACPI_GET_DESCRIPTOR_TYPE (obj_desc) != ACPI_DESC_TYPE_OPERAND) {
-- acpi_os_printf ("ex_dump_object_descriptor: %p is not a valid ACPI object\n", obj_desc);
-+ acpi_os_printf ("ex_dump_object_descriptor: %p is not an ACPI operand object: [%s]\n",
-+ obj_desc, acpi_ut_get_descriptor_name (obj_desc));
- return_VOID;
- }
-
-@@ -589,8 +586,7 @@ acpi_ex_dump_object_descriptor (
- case ACPI_TYPE_INTEGER:
-
- acpi_os_printf ("%20s : %8.8X%8.8X\n", "Value",
-- ACPI_HIDWORD (obj_desc->integer.value),
-- ACPI_LODWORD (obj_desc->integer.value));
-+ ACPI_FORMAT_UINT64 (obj_desc->integer.value));
- break;
-
-
-@@ -635,7 +631,7 @@ acpi_ex_dump_object_descriptor (
-
- case ACPI_TYPE_DEVICE:
-
-- acpi_ex_out_pointer ("address_space", obj_desc->device.address_space);
-+ acpi_ex_out_pointer ("Handler", obj_desc->device.handler);
- acpi_ex_out_pointer ("system_notify", obj_desc->device.system_notify);
- acpi_ex_out_pointer ("device_notify", obj_desc->device.device_notify);
- break;
-@@ -673,7 +669,7 @@ acpi_ex_dump_object_descriptor (
- acpi_ex_out_integer ("Flags", obj_desc->region.flags);
- acpi_ex_out_address ("Address", obj_desc->region.address);
- acpi_ex_out_integer ("Length", obj_desc->region.length);
-- acpi_ex_out_pointer ("address_space", obj_desc->region.address_space);
-+ acpi_ex_out_pointer ("Handler", obj_desc->region.handler);
- acpi_ex_out_pointer ("Next", obj_desc->region.next);
- break;
-
-@@ -694,7 +690,7 @@ acpi_ex_dump_object_descriptor (
- acpi_ex_out_address ("Address", (acpi_physical_address) obj_desc->processor.address);
- acpi_ex_out_pointer ("system_notify", obj_desc->processor.system_notify);
- acpi_ex_out_pointer ("device_notify", obj_desc->processor.device_notify);
-- acpi_ex_out_pointer ("address_space", obj_desc->processor.address_space);
-+ acpi_ex_out_pointer ("Handler", obj_desc->processor.handler);
- break;
-
-
-@@ -702,7 +698,7 @@ acpi_ex_dump_object_descriptor (
-
- acpi_ex_out_pointer ("system_notify", obj_desc->thermal_zone.system_notify);
- acpi_ex_out_pointer ("device_notify", obj_desc->thermal_zone.device_notify);
-- acpi_ex_out_pointer ("address_space", obj_desc->thermal_zone.address_space);
-+ acpi_ex_out_pointer ("Handler", obj_desc->thermal_zone.handler);
- break;
-
-
---- linux-2.6.0/drivers/acpi/executer/exfldio.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/executer/exfldio.c 2003-12-28 23:21:33.000000000 -0800
-@@ -138,8 +138,9 @@ acpi_ex_setup_region (
- */
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)\n",
-- obj_desc->common_field.node->name.ascii, obj_desc->common_field.access_byte_width,
-- rgn_desc->region.node->name.ascii, rgn_desc->region.length));
-+ acpi_ut_get_node_name (obj_desc->common_field.node),
-+ obj_desc->common_field.access_byte_width,
-+ acpi_ut_get_node_name (rgn_desc->region.node), rgn_desc->region.length));
- }
-
- /*
-@@ -148,9 +149,10 @@ acpi_ex_setup_region (
- */
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)\n",
-- obj_desc->common_field.node->name.ascii, obj_desc->common_field.base_byte_offset,
-+ acpi_ut_get_node_name (obj_desc->common_field.node),
-+ obj_desc->common_field.base_byte_offset,
- field_datum_byte_offset, obj_desc->common_field.access_byte_width,
-- rgn_desc->region.node->name.ascii, rgn_desc->region.length));
-+ acpi_ut_get_node_name (rgn_desc->region.node), rgn_desc->region.length));
-
- #ifdef CONFIG_ACPI_RELAXED_AML
- {
-@@ -261,7 +263,7 @@ acpi_ex_access_region (
- obj_desc->common_field.access_byte_width,
- obj_desc->common_field.base_byte_offset,
- field_datum_byte_offset,
-- ACPI_HIDWORD (address), ACPI_LODWORD (address)));
-+ ACPI_FORMAT_UINT64 (address)));
-
- /* Invoke the appropriate address_space/op_region handler */
-
-@@ -514,12 +516,12 @@ acpi_ex_field_datum_io (
- if (ACPI_SUCCESS (status)) {
- if (read_write == ACPI_READ) {
- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Read %8.8X%8.8X, Width %d\n",
-- ACPI_HIDWORD (*value), ACPI_LODWORD (*value),
-+ ACPI_FORMAT_UINT64 (*value),
- obj_desc->common_field.access_byte_width));
- }
- else {
- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Written %8.8X%8.8X, Width %d\n",
-- ACPI_HIDWORD (*value), ACPI_LODWORD (*value),
-+ ACPI_FORMAT_UINT64 (*value),
- obj_desc->common_field.access_byte_width));
- }
- }
-@@ -612,11 +614,11 @@ acpi_ex_write_with_update_rule (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
- "Mask %8.8X%8.8X, datum_offset %X, Width %X, Value %8.8X%8.8X, merged_value %8.8X%8.8X\n",
-- ACPI_HIDWORD (mask), ACPI_LODWORD (mask),
-+ ACPI_FORMAT_UINT64 (mask),
- field_datum_byte_offset,
- obj_desc->common_field.access_byte_width,
-- ACPI_HIDWORD (field_value), ACPI_LODWORD (field_value),
-- ACPI_HIDWORD (merged_value),ACPI_LODWORD (merged_value)));
-+ ACPI_FORMAT_UINT64 (field_value),
-+ ACPI_FORMAT_UINT64 (merged_value)));
-
- /* Write the merged value */
-
-@@ -784,12 +786,13 @@ acpi_ex_extract_from_field (
- {
- acpi_status status;
- u32 field_datum_byte_offset;
-- u32 datum_offset;
-- acpi_integer previous_raw_datum;
-+ u32 buffer_datum_offset;
-+ acpi_integer previous_raw_datum = 0;
- acpi_integer this_raw_datum = 0;
- acpi_integer merged_datum = 0;
- u32 byte_field_length;
- u32 datum_count;
-+ u32 i;
-
-
- ACPI_FUNCTION_TRACE ("ex_extract_from_field");
-@@ -812,77 +815,74 @@ acpi_ex_extract_from_field (
- datum_count = ACPI_ROUND_UP_TO (byte_field_length,
- obj_desc->common_field.access_byte_width);
-
-+ /*
-+ * If the field is not aligned on a datum boundary and does not
-+ * fit within a single datum, we must read an extra datum.
-+ *
-+ * We could just split the aligned and non-aligned cases since the
-+ * aligned case is so very simple, but this would require more code.
-+ */
-+ if ((obj_desc->common_field.end_field_valid_bits != 0) &&
-+ (!(obj_desc->common_field.flags & AOPOBJ_SINGLE_DATUM))) {
-+ datum_count++;
-+ }
-+
- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
- "byte_len %X, datum_len %X, byte_gran %X\n",
- byte_field_length, datum_count,obj_desc->common_field.access_byte_width));
-
- /*
- * Clear the caller's buffer (the whole buffer length as given)
-- * This is very important, especially in the cases where a byte is read,
-- * but the buffer is really a u32 (4 bytes).
-+ * This is very important, especially in the cases where the buffer
-+ * is longer than the size of the field.
- */
- ACPI_MEMSET (buffer, 0, buffer_length);
-
-- /* Read the first raw datum to prime the loop */
--
- field_datum_byte_offset = 0;
-- datum_offset= 0;
--
-- status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset,
-- &previous_raw_datum, ACPI_READ);
-- if (ACPI_FAILURE (status)) {
-- return_ACPI_STATUS (status);
-- }
--
-+ buffer_datum_offset= 0;
-
-- /* We might actually be done if the request fits in one datum */
-+ /* Read the entire field */
-
-- if ((datum_count == 1) &&
-- (obj_desc->common_field.flags & AOPOBJ_SINGLE_DATUM)) {
-- /* 1) Shift the valid data bits down to start at bit 0 */
-+ for (i = 0; i < datum_count; i++) {
-+ status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset,
-+ &this_raw_datum, ACPI_READ);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-
-- merged_datum = (previous_raw_datum >> obj_desc->common_field.start_field_bit_offset);
-+ /* We might actually be done if the request fits in one datum */
-
-- /* 2) Mask off any upper unused bits (bits not part of the field) */
-+ if ((datum_count == 1) &&
-+ (obj_desc->common_field.flags & AOPOBJ_SINGLE_DATUM)) {
-+ /* 1) Shift the valid data bits down to start at bit 0 */
-
-- if (obj_desc->common_field.end_buffer_valid_bits) {
-- merged_datum &= ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_buffer_valid_bits);
-- }
-+ merged_datum = (this_raw_datum >> obj_desc->common_field.start_field_bit_offset);
-
-- /* Store the datum to the caller buffer */
-+ /* 2) Mask off any upper unused bits (bits not part of the field) */
-
-- acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
-- obj_desc->common_field.access_byte_width, datum_offset);
-+ if (obj_desc->common_field.end_buffer_valid_bits) {
-+ merged_datum &= ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_buffer_valid_bits);
-+ }
-
-- return_ACPI_STATUS (AE_OK);
-- }
-+ /* Store the datum to the caller buffer */
-
-+ acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
-+ obj_desc->common_field.access_byte_width, buffer_datum_offset);
-
-- /* We need to get more raw data to complete one or more field data */
-+ return_ACPI_STATUS (AE_OK);
-+ }
-
-- while (datum_offset < datum_count) {
-- field_datum_byte_offset += obj_desc->common_field.access_byte_width;
-+ /* Special handling for the last datum to ignore extra bits */
-
-- /*
-- * If the field is aligned on a byte boundary, we don't want
-- * to perform a final read, since this would potentially read
-- * past the end of the region.
-- *
-- * We could just split the aligned and non-aligned cases since the
-- * aligned case is so very simple, but this would require more code.
-- */
-- if ((obj_desc->common_field.start_field_bit_offset != 0) ||
-- ((obj_desc->common_field.start_field_bit_offset == 0) &&
-- (datum_offset < (datum_count -1)))) {
-+ if ((i >= (datum_count -1)) &&
-+ (obj_desc->common_field.end_field_valid_bits)) {
- /*
-- * Get the next raw datum, it contains some or all bits
-- * of the current field datum
-+ * This is the last iteration of the loop. We need to clear
-+ * any unused bits (bits that are not part of this field) before
-+ * we store the final merged datum into the caller buffer.
- */
-- status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset,
-- &this_raw_datum, ACPI_READ);
-- if (ACPI_FAILURE (status)) {
-- return_ACPI_STATUS (status);
-- }
-+ this_raw_datum &=
-+ ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits);
- }
-
- /*
-@@ -891,48 +891,48 @@ acpi_ex_extract_from_field (
- if (obj_desc->common_field.start_field_bit_offset == 0) {
- /* Field is not skewed and we can just copy the datum */
-
-- merged_datum = previous_raw_datum;
-+ acpi_ex_set_buffer_datum (this_raw_datum, buffer, buffer_length,
-+ obj_desc->common_field.access_byte_width, buffer_datum_offset);
-+ buffer_datum_offset++;
- }
- else {
-- /*
-- * Put together the appropriate bits of the two raw data to make a
-- * single complete field datum
-- *
-- * 1) Normalize the first datum down to bit 0
-- */
-- merged_datum = (previous_raw_datum >> obj_desc->common_field.start_field_bit_offset);
--
-- /* 2) Insert the second datum "above" the first datum */
-+ /* Not aligned -- on the first iteration, just save the datum */
-
-- merged_datum |= (this_raw_datum << obj_desc->common_field.datum_valid_bits);
--
-- if ((datum_offset >= (datum_count -1))) {
-+ if (i != 0) {
- /*
-- * This is the last iteration of the loop. We need to clear
-- * any unused bits (bits that are not part of this field) that
-- * came from the last raw datum before we store the final
-- * merged datum into the caller buffer.
-+ * Put together the appropriate bits of the two raw data to make a
-+ * single complete field datum
-+ *
-+ * 1) Normalize the first datum down to bit 0
- */
-- if (obj_desc->common_field.end_buffer_valid_bits) {
-- merged_datum &=
-- ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_buffer_valid_bits);
-- }
-+ merged_datum = (previous_raw_datum >> obj_desc->common_field.start_field_bit_offset);
-+
-+ /* 2) Insert the second datum "above" the first datum */
-+
-+ merged_datum |= (this_raw_datum << obj_desc->common_field.datum_valid_bits);
-+
-+ acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
-+ obj_desc->common_field.access_byte_width, buffer_datum_offset);
-+ buffer_datum_offset++;
- }
-+
-+ /*
-+ * Save the raw datum that was just acquired since it may contain bits
-+ * of the *next* field datum
-+ */
-+ previous_raw_datum = this_raw_datum;
- }
-
-- /*
-- * Store the merged field datum in the caller's buffer, according to
-- * the granularity of the field (size of each datum).
-- */
-- acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
-- obj_desc->common_field.access_byte_width, datum_offset);
-+ field_datum_byte_offset += obj_desc->common_field.access_byte_width;
-+ }
-
-- /*
-- * Save the raw datum that was just acquired since it may contain bits
-- * of the *next* field datum. Update offsets
-- */
-- previous_raw_datum = this_raw_datum;
-- datum_offset++;
-+ /* For non-aligned case, there is one last datum to insert */
-+
-+ if (obj_desc->common_field.start_field_bit_offset != 0) {
-+ merged_datum = (this_raw_datum >> obj_desc->common_field.start_field_bit_offset);
-+
-+ acpi_ex_set_buffer_datum (merged_datum, buffer, buffer_length,
-+ obj_desc->common_field.access_byte_width, buffer_datum_offset);
- }
-
- return_ACPI_STATUS (AE_OK);
---- linux-2.6.0/drivers/acpi/executer/exmisc.c 2003-06-14 12:18:30.000000000 -0700
-+++ 25/drivers/acpi/executer/exmisc.c 2003-12-28 23:21:33.000000000 -0800
-@@ -121,8 +121,8 @@ acpi_ex_get_object_reference (
-
- default:
-
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid descriptor type %X in %p\n",
-- ACPI_GET_DESCRIPTOR_TYPE (obj_desc), obj_desc));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p has invalid descriptor [%s]\n",
-+ obj_desc, acpi_ut_get_descriptor_name (obj_desc)));
- return_ACPI_STATUS (AE_TYPE);
- }
-
-@@ -139,7 +139,7 @@ acpi_ex_get_object_reference (
- *return_desc = reference_obj;
-
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Object %p Type [%s], returning Reference %p\n",
-- obj_desc, acpi_ut_get_object_type_name (obj_desc), *return_desc));
-+ obj_desc, acpi_ut_get_object_type_name (obj_desc), *return_desc));
-
- return_ACPI_STATUS (AE_OK);
- }
---- linux-2.6.0/drivers/acpi/executer/exmutex.c 2003-06-14 12:18:30.000000000 -0700
-+++ 25/drivers/acpi/executer/exmutex.c 2003-12-28 23:21:33.000000000 -0800
-@@ -159,7 +159,7 @@ acpi_ex_acquire_mutex (
-
- if (!walk_state->thread) {
- ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], null thread info\n",
-- obj_desc->mutex.node->name.ascii));
-+ acpi_ut_get_node_name (obj_desc->mutex.node)));
- return_ACPI_STATUS (AE_AML_INTERNAL);
- }
-
-@@ -169,7 +169,7 @@ acpi_ex_acquire_mutex (
- */
- if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) {
- ACPI_REPORT_ERROR (("Cannot acquire Mutex [%4.4s], incorrect sync_level\n",
-- obj_desc->mutex.node->name.ascii));
-+ acpi_ut_get_node_name (obj_desc->mutex.node)));
- return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
- }
-
-@@ -242,7 +242,7 @@ acpi_ex_release_mutex (
-
- if (!obj_desc->mutex.owner_thread) {
- ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], not acquired\n",
-- obj_desc->mutex.node->name.ascii));
-+ acpi_ut_get_node_name (obj_desc->mutex.node)));
- return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED);
- }
-
-@@ -250,7 +250,7 @@ acpi_ex_release_mutex (
-
- if (!walk_state->thread) {
- ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], null thread info\n",
-- obj_desc->mutex.node->name.ascii));
-+ acpi_ut_get_node_name (obj_desc->mutex.node)));
- return_ACPI_STATUS (AE_AML_INTERNAL);
- }
-
-@@ -260,7 +260,7 @@ acpi_ex_release_mutex (
- ACPI_REPORT_ERROR ((
- "Thread %X cannot release Mutex [%4.4s] acquired by thread %X\n",
- walk_state->thread->thread_id,
-- obj_desc->mutex.node->name.ascii,
-+ acpi_ut_get_node_name (obj_desc->mutex.node),
- obj_desc->mutex.owner_thread->thread_id));
- return_ACPI_STATUS (AE_AML_NOT_OWNER);
- }
-@@ -271,7 +271,7 @@ acpi_ex_release_mutex (
- */
- if (obj_desc->mutex.sync_level > walk_state->thread->current_sync_level) {
- ACPI_REPORT_ERROR (("Cannot release Mutex [%4.4s], incorrect sync_level\n",
-- obj_desc->mutex.node->name.ascii));
-+ acpi_ut_get_node_name (obj_desc->mutex.node)));
- return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
- }
-
---- linux-2.6.0/drivers/acpi/executer/exoparg1.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/executer/exoparg1.c 2003-12-28 23:21:33.000000000 -0800
-@@ -351,8 +351,7 @@ acpi_ex_opcode_1A_1T_1R (
-
- if (digit > 0) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Integer too large to convert to BCD: %8.8X%8.8X\n",
-- ACPI_HIDWORD(operand[0]->integer.value),
-- ACPI_LODWORD(operand[0]->integer.value)));
-+ ACPI_FORMAT_UINT64 (operand[0]->integer.value)));
- status = AE_AML_NUMERIC_OVERFLOW;
- goto cleanup;
- }
---- linux-2.6.0/drivers/acpi/executer/exoparg3.c 2003-06-14 12:17:56.000000000 -0700
-+++ 25/drivers/acpi/executer/exoparg3.c 2003-12-28 23:21:33.000000000 -0800
-@@ -101,15 +101,14 @@ acpi_ex_opcode_3A_0T_0R (
-
-
- switch (walk_state->opcode) {
--
- case AML_FATAL_OP: /* Fatal (fatal_type fatal_code fatal_arg) */
-
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
- "fatal_op: Type %X Code %X Arg %X <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
-- (u32) operand[0]->integer.value, (u32) operand[1]->integer.value,
-+ (u32) operand[0]->integer.value,
-+ (u32) operand[1]->integer.value,
- (u32) operand[2]->integer.value));
-
--
- fatal = ACPI_MEM_ALLOCATE (sizeof (struct acpi_signal_fatal_info));
- if (fatal) {
- fatal->type = (u32) operand[0]->integer.value;
---- linux-2.6.0/drivers/acpi/executer/exprep.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/executer/exprep.c 2003-12-28 23:21:33.000000000 -0800
-@@ -351,7 +351,7 @@ acpi_ex_prep_common_field_object (
- */
- nearest_byte_address =
- ACPI_ROUND_BITS_DOWN_TO_BYTES (field_bit_position);
-- obj_desc->common_field.base_byte_offset =
-+ obj_desc->common_field.base_byte_offset = (u32)
- ACPI_ROUND_DOWN (nearest_byte_address, byte_alignment);
-
- /*
-@@ -539,7 +539,7 @@ acpi_ex_prep_field_value (
- acpi_ns_get_type (info->field_node));
-
- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Set named_obj %p [%4.4s], obj_desc %p\n",
-- info->field_node, info->field_node->name.ascii, obj_desc));
-+ info->field_node, acpi_ut_get_node_name (info->field_node), obj_desc));
-
- /* Remove local reference to the object */
-
---- linux-2.6.0/drivers/acpi/executer/exregion.c 2003-06-14 12:17:58.000000000 -0700
-+++ 25/drivers/acpi/executer/exregion.c 2003-12-28 23:21:33.000000000 -0800
-@@ -161,7 +161,7 @@ acpi_ex_system_memory_space_handler (
- (void **) &mem_info->mapped_logical_address);
- if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X%8.8X, size %X\n",
-- ACPI_HIDWORD (address), ACPI_LODWORD (address), (u32) window_size));
-+ ACPI_FORMAT_UINT64 (address), (u32) window_size));
- mem_info->mapped_length = 0;
- return_ACPI_STATUS (status);
- }
-@@ -180,8 +180,8 @@ acpi_ex_system_memory_space_handler (
- ((acpi_integer) address - (acpi_integer) mem_info->mapped_physical_address);
-
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-- "system_memory %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
-- ACPI_HIDWORD (address), ACPI_LODWORD (address)));
-+ "system_memory %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
-+ ACPI_FORMAT_UINT64 (address)));
-
- /*
- * Perform the memory read or write
-@@ -290,8 +290,8 @@ acpi_ex_system_io_space_handler (
-
-
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-- "system_iO %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
-- ACPI_HIDWORD (address), ACPI_LODWORD (address)));
-+ "system_iO %d (%d width) Address=%8.8X%8.8X\n", function, bit_width,
-+ ACPI_FORMAT_UINT64 (address)));
-
- /* Decode the function parameter */
-
---- linux-2.6.0/drivers/acpi/executer/exresolv.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/executer/exresolv.c 2003-12-28 23:21:33.000000000 -0800
-@@ -349,6 +349,8 @@ acpi_ex_resolve_multiple (
- /* All "References" point to a NS node */
-
- if (ACPI_GET_DESCRIPTOR_TYPE (node) != ACPI_DESC_TYPE_NAMED) {
-+ ACPI_REPORT_ERROR (("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n",
-+ node, acpi_ut_get_descriptor_name (node)));
- return_ACPI_STATUS (AE_AML_INTERNAL);
- }
-
-@@ -399,7 +401,9 @@ acpi_ex_resolve_multiple (
- /* All "References" point to a NS node */
-
- if (ACPI_GET_DESCRIPTOR_TYPE (node) != ACPI_DESC_TYPE_NAMED) {
-- return_ACPI_STATUS (AE_AML_INTERNAL);
-+ ACPI_REPORT_ERROR (("acpi_ex_resolve_multiple: Not a NS node %p [%s]\n",
-+ node, acpi_ut_get_descriptor_name (node)));
-+ return_ACPI_STATUS (AE_AML_INTERNAL);
- }
-
- /* Get the attached object */
---- linux-2.6.0/drivers/acpi/executer/exresop.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/executer/exresop.c 2003-12-28 23:21:33.000000000 -0800
-@@ -247,8 +247,8 @@ acpi_ex_resolve_operands (
- /* Invalid descriptor */
-
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-- "Bad descriptor type %X in Obj %p\n",
-- ACPI_GET_DESCRIPTOR_TYPE (obj_desc), obj_desc));
-+ "Invalid descriptor %p [%s]\n",
-+ obj_desc, acpi_ut_get_descriptor_name (obj_desc)));
-
- return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
- }
---- linux-2.6.0/drivers/acpi/executer/exstore.c 2003-06-22 12:04:44.000000000 -0700
-+++ 25/drivers/acpi/executer/exstore.c 2003-12-28 23:21:33.000000000 -0800
-@@ -190,8 +190,7 @@ acpi_ex_store (
- case ACPI_TYPE_INTEGER:
-
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%8.8X%8.8X\n",
-- ACPI_HIDWORD (source_desc->integer.value),
-- ACPI_LODWORD (source_desc->integer.value)));
-+ ACPI_FORMAT_UINT64 (source_desc->integer.value)));
- break;
-
-
---- linux-2.6.0/drivers/acpi/executer/exsystem.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/executer/exsystem.c 2003-12-28 23:21:33.000000000 -0800
-@@ -111,11 +111,16 @@ acpi_ex_system_wait_semaphore (
- *
- * FUNCTION: acpi_ex_system_do_stall
- *
-- * PARAMETERS: how_long - The amount of time to stall
-+ * PARAMETERS: how_long - The amount of time to stall,
-+ * in microseconds
- *
- * RETURN: Status
- *
- * DESCRIPTION: Suspend running thread for specified amount of time.
-+ * Note: ACPI specification requires that Stall() does not
-+ * relinquish the processor, and delays longer than 100 usec
-+ * should use Sleep() instead. We allow stalls up to 255 usec
-+ * for compatibility with other interpreters and existing BIOSs.
- *
- ******************************************************************************/
-
-@@ -129,12 +134,15 @@ acpi_ex_system_do_stall (
- ACPI_FUNCTION_ENTRY ();
-
-
-- if (how_long > 100) /* 100 microseconds */ {
-+ if (how_long > 255) /* 255 microseconds */ {
- /*
-- * Longer than 100 usec, use sleep instead
-- * (according to ACPI specification)
-+ * Longer than 255 usec, this is an error
-+ *
-+ * (ACPI specifies 100 usec as max, but this gives some slack in
-+ * order to support existing BIOSs)
- */
-- status = acpi_ex_system_do_suspend ((how_long / 1000) + 1);
-+ ACPI_REPORT_ERROR (("Stall: Time parameter is too large (%d)\n", how_long));
-+ status = AE_AML_OPERAND_VALUE;
- }
- else {
- acpi_os_stall (how_long);
-@@ -148,7 +156,8 @@ acpi_ex_system_do_stall (
- *
- * FUNCTION: acpi_ex_system_do_suspend
- *
-- * PARAMETERS: how_long - The amount of time to suspend
-+ * PARAMETERS: how_long - The amount of time to suspend,
-+ * in milliseconds
- *
- * RETURN: None
- *
---- linux-2.6.0/drivers/acpi/hardware/hwacpi.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/hardware/hwacpi.c 2003-12-28 23:21:33.000000000 -0800
-@@ -119,7 +119,7 @@ acpi_hw_set_mode (
- * system does not support mode transition.
- */
- if (!acpi_gbl_FADT->smi_cmd) {
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No SMI_CMD in FADT, mode transition failed.\n"));
-+ ACPI_REPORT_ERROR (("No SMI_CMD in FADT, mode transition failed.\n"));
- return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
- }
-
-@@ -131,7 +131,7 @@ acpi_hw_set_mode (
- * transitions are not supported.
- */
- if (!acpi_gbl_FADT->acpi_enable && !acpi_gbl_FADT->acpi_disable) {
-- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "No mode transition supported in this system.\n"));
-+ ACPI_REPORT_ERROR (("No ACPI mode transition supported in this system (enable/disable both zero)\n"));
- return_ACPI_STATUS (AE_OK);
- }
-
-@@ -162,6 +162,7 @@ acpi_hw_set_mode (
- }
-
- if (ACPI_FAILURE (status)) {
-+ ACPI_REPORT_ERROR (("Could not write mode change, %s\n", acpi_format_exception (status)));
- return_ACPI_STATUS (status);
- }
-
-@@ -171,18 +172,16 @@ acpi_hw_set_mode (
- */
- retry = 3000;
- while (retry) {
-- status = AE_NO_HARDWARE_RESPONSE;
--
- if (acpi_hw_get_mode() == mode) {
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", mode));
-- status = AE_OK;
-- break;
-+ return_ACPI_STATUS (AE_OK);
- }
- acpi_os_stall(1000);
- retry--;
- }
-
-- return_ACPI_STATUS (status);
-+ ACPI_REPORT_ERROR (("Hardware never changed modes\n"));
-+ return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
- }
-
-
---- linux-2.6.0/drivers/acpi/hardware/hwregs.c 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/acpi/hardware/hwregs.c 2003-12-28 23:21:33.000000000 -0800
-@@ -418,16 +418,14 @@ acpi_set_register (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %8.8X%8.8X\n",
- register_value,
-- ACPI_HIDWORD (acpi_gbl_FADT->xpm2_cnt_blk.address),
-- ACPI_LODWORD (acpi_gbl_FADT->xpm2_cnt_blk.address)));
-+ ACPI_FORMAT_UINT64 (acpi_gbl_FADT->xpm2_cnt_blk.address)));
-
- ACPI_REGISTER_INSERT_VALUE (register_value, bit_reg_info->bit_position,
- bit_reg_info->access_bit_mask, value);
-
- ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %4.4X to %8.8X%8.8X\n",
- register_value,
-- ACPI_HIDWORD (acpi_gbl_FADT->xpm2_cnt_blk.address),
-- ACPI_LODWORD (acpi_gbl_FADT->xpm2_cnt_blk.address)));
-+ ACPI_FORMAT_UINT64 (acpi_gbl_FADT->xpm2_cnt_blk.address)));
-
- status = acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
- ACPI_REGISTER_PM2_CONTROL, (u8) (register_value));
-@@ -763,8 +761,7 @@ acpi_hw_low_level_read (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n",
- *value, width,
-- ACPI_HIDWORD (reg->address),
-- ACPI_LODWORD (reg->address),
-+ ACPI_FORMAT_UINT64 (reg->address),
- acpi_ut_get_region_name (reg->address_space_id)));
-
- return (status);
-@@ -850,8 +847,7 @@ acpi_hw_low_level_write (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n",
- value, width,
-- ACPI_HIDWORD (reg->address),
-- ACPI_LODWORD (reg->address),
-+ ACPI_FORMAT_UINT64 (reg->address),
- acpi_ut_get_region_name (reg->address_space_id)));
-
- return (status);
---- linux-2.6.0/drivers/acpi/hardware/hwsleep.c 2003-06-22 12:04:44.000000000 -0700
-+++ 25/drivers/acpi/hardware/hwsleep.c 2003-12-28 23:21:33.000000000 -0800
-@@ -181,6 +181,13 @@ acpi_enter_sleep_state_prep (
- return_ACPI_STATUS (status);
- }
-
-+ /* Set the system indicators to show the desired sleep state. */
-+
-+ status = acpi_evaluate_object (NULL, "\\_SI._SST", &arg_list, NULL);
-+ if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {
-+ ACPI_REPORT_ERROR (("Method _SST failed, %s\n", acpi_format_exception (status)));
-+ }
-+
- return_ACPI_STATUS (AE_OK);
- }
-
-@@ -220,27 +227,28 @@ acpi_enter_sleep_state (
- return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
- }
-
--
- sleep_type_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_TYPE_A);
- sleep_enable_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_ENABLE);
-
-- /* Clear wake status */
-+ if (sleep_state != ACPI_STATE_S5) {
-+ /* Clear wake status */
-
-- status = acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
-- if (ACPI_FAILURE (status)) {
-- return_ACPI_STATUS (status);
-- }
-+ status = acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-
-- status = acpi_hw_clear_acpi_status(ACPI_MTX_DO_NOT_LOCK);
-- if (ACPI_FAILURE (status)) {
-- return_ACPI_STATUS (status);
-- }
-+ status = acpi_hw_clear_acpi_status (ACPI_MTX_DO_NOT_LOCK);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-
-- /* Disable BM arbitration */
-+ /* Disable BM arbitration */
-
-- status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_DO_NOT_LOCK);
-- if (ACPI_FAILURE (status)) {
-- return_ACPI_STATUS (status);
-+ status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_DO_NOT_LOCK);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
- }
-
- status = acpi_hw_disable_non_wakeup_gpes();
-@@ -297,11 +305,13 @@ acpi_enter_sleep_state (
- return_ACPI_STATUS (status);
- }
-
-- /*
-- * Wait a second, then try again. This is to get S4/5 to work on all machines.
-- */
- if (sleep_state > ACPI_STATE_S3) {
- /*
-+ * We wanted to sleep > S3, but it didn't happen (by virtue of the fact that
-+ * we are still executing!)
-+ *
-+ * Wait ten seconds, then try again. This is to get S4/S5 to work on all machines.
-+ *
- * We wait so long to allow chipsets that poll this reg very slowly to
- * still read the right value. Ideally, this entire block would go
- * away entirely.
-@@ -354,6 +364,7 @@ acpi_enter_sleep_state_s4bios (
-
- ACPI_FUNCTION_TRACE ("acpi_enter_sleep_state_s4bios");
-
-+
- acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK);
- acpi_hw_clear_acpi_status(ACPI_MTX_DO_NOT_LOCK);
-
-@@ -389,15 +400,38 @@ acpi_enter_sleep_state_s4bios (
-
- acpi_status
- acpi_leave_sleep_state (
-- u8 sleep_state)
-+ u8 sleep_state)
- {
-- struct acpi_object_list arg_list;
-- union acpi_object arg;
-- acpi_status status;
-+ struct acpi_object_list arg_list;
-+ union acpi_object arg;
-+ acpi_status status;
-+ struct acpi_bit_register_info *sleep_type_reg_info;
-+ struct acpi_bit_register_info *sleep_enable_reg_info;
-+ u32 pm1x_control;
-
-
- ACPI_FUNCTION_TRACE ("acpi_leave_sleep_state");
-
-+ /* Some machines require SLP_TYPE and SLP_EN to be cleared */
-+
-+ sleep_type_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_TYPE_A);
-+ sleep_enable_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_ENABLE);
-+
-+ /* Get current value of PM1A control */
-+
-+ status = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK,
-+ ACPI_REGISTER_PM1_CONTROL, &pm1x_control);
-+ if (ACPI_SUCCESS (status)) {
-+ /* Clear SLP_TYP and SLP_EN */
-+
-+ pm1x_control &= ~(sleep_type_reg_info->access_bit_mask |
-+ sleep_enable_reg_info->access_bit_mask);
-+
-+ acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
-+ ACPI_REGISTER_PM1A_CONTROL, pm1x_control);
-+ acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK,
-+ ACPI_REGISTER_PM1B_CONTROL, pm1x_control);
-+ }
-
- /* Ensure enter_sleep_state_prep -> enter_sleep_state ordering */
-
-@@ -407,12 +441,17 @@ acpi_leave_sleep_state (
-
- arg_list.count = 1;
- arg_list.pointer = &arg;
--
- arg.type = ACPI_TYPE_INTEGER;
-- arg.integer.value = sleep_state;
-
- /* Ignore any errors from these methods */
-
-+ arg.integer.value = 0;
-+ status = acpi_evaluate_object (NULL, "\\_SI._SST", &arg_list, NULL);
-+ if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {
-+ ACPI_REPORT_ERROR (("Method _SST failed, %s\n", acpi_format_exception (status)));
-+ }
-+
-+ arg.integer.value = sleep_state;
- status = acpi_evaluate_object (NULL, "\\_BFS", &arg_list, NULL);
- if (ACPI_FAILURE (status) && status != AE_NOT_FOUND) {
- ACPI_REPORT_ERROR (("Method _BFS failed, %s\n", acpi_format_exception (status)));
-@@ -430,8 +469,8 @@ acpi_leave_sleep_state (
- return_ACPI_STATUS (status);
- }
-
-- /* Disable BM arbitration */
-- status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK);
-+ /* Enable BM arbitration */
-
-+ status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 0, ACPI_MTX_LOCK);
- return_ACPI_STATUS (status);
- }
---- linux-2.6.0/drivers/acpi/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/acpi/Kconfig 2003-12-28 23:21:57.000000000 -0800
-@@ -251,12 +251,6 @@ config ACPI_SYSTEM
- This driver will enable your system to shut down using ACPI, and
- dump your ACPI DSDT table using /proc/acpi/dsdt.
-
--config ACPI_EFI
-- bool
-- depends on ACPI_INTERPRETER
-- depends on IA64
-- default y
--
- config ACPI_RELAXED_AML
- bool "Relaxed AML"
- depends on ACPI_INTERPRETER
-@@ -269,5 +263,23 @@ config ACPI_RELAXED_AML
- particular, many Toshiba laptops require this for correct operation
- of the AC module.
-
-+config X86_PM_TIMER
-+ bool "Power Management Timer Support"
-+ depends on X86 && ACPI
-+ depends on ACPI_BOOT && EXPERIMENTAL
-+ default n
-+ help
-+ The Power Management Timer is available on all ACPI-capable,
-+ in most cases even if ACPI is unusable or blacklisted.
-+
-+ This timing source is not affected by powermanagement features
-+ like aggressive processor idling, throttling, frequency and/or
-+ voltage scaling, unlike the commonly used Time Stamp Counter
-+ (TSC) timing source.
-+
-+ So, if you see messages like 'Losing too many ticks!' in the
-+ kernel logs, and/or you are using a this on a notebook which
-+ does not yet have an HPET, you should say "Y" here.
-+
- endmenu
-
---- linux-2.6.0/drivers/acpi/namespace/nsaccess.c 2003-06-14 12:18:34.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsaccess.c 2003-12-28 23:21:33.000000000 -0800
-@@ -314,8 +314,8 @@ acpi_ns_lookup (
- else {
- prefix_node = scope_info->scope.node;
- if (ACPI_GET_DESCRIPTOR_TYPE (prefix_node) != ACPI_DESC_TYPE_NAMED) {
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "[%p] Not a namespace node\n",
-- prefix_node));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p Not a namespace node [%s]\n",
-+ prefix_node, acpi_ut_get_descriptor_name (prefix_node)));
- return_ACPI_STATUS (AE_AML_INTERNAL);
- }
-
-@@ -379,7 +379,7 @@ acpi_ns_lookup (
-
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
- "Searching relative to prefix scope [%4.4s] (%p)\n",
-- prefix_node->name.ascii, prefix_node));
-+ acpi_ut_get_node_name (prefix_node), prefix_node));
-
- /*
- * Handle multiple Parent Prefixes (carat) by just getting
-@@ -413,7 +413,7 @@ acpi_ns_lookup (
- if (search_parent_flag == ACPI_NS_NO_UPSEARCH) {
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
- "Search scope is [%4.4s], path has %d carat(s)\n",
-- this_node->name.ascii, num_carats));
-+ acpi_ut_get_node_name (this_node), num_carats));
- }
- }
-
---- linux-2.6.0/drivers/acpi/namespace/nsalloc.c 2003-06-14 12:18:21.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsalloc.c 2003-12-28 23:21:33.000000000 -0800
-@@ -271,7 +271,7 @@ acpi_ns_install_node (
- * alphabetic placement.
- */
- previous_child_node = NULL;
-- while (acpi_ns_compare_names (child_node->name.ascii, node->name.ascii) < 0) {
-+ while (acpi_ns_compare_names (acpi_ut_get_node_name (child_node), acpi_ut_get_node_name (node)) < 0) {
- if (child_node->flags & ANOBJ_END_OF_PEER_LIST) {
- /* Last peer; Clear end-of-list flag */
-
-@@ -335,8 +335,9 @@ acpi_ns_install_node (
- node->type = (u8) type;
-
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s (%s) added to %4.4s (%s) %p at %p\n",
-- node->name.ascii, acpi_ut_get_type_name (node->type),
-- parent_node->name.ascii, acpi_ut_get_type_name (parent_node->type), parent_node, node));
-+ acpi_ut_get_node_name (node), acpi_ut_get_type_name (node->type),
-+ acpi_ut_get_node_name (parent_node), acpi_ut_get_type_name (parent_node->type),
-+ parent_node, node));
-
- /*
- * Increment the reference count(s) of all parents up to
---- linux-2.6.0/drivers/acpi/namespace/nsdump.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsdump.c 2003-12-28 23:21:33.000000000 -0800
-@@ -50,8 +50,8 @@
- #define _COMPONENT ACPI_NAMESPACE
- ACPI_MODULE_NAME ("nsdump")
-
--#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
-
-+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
-
- /*******************************************************************************
- *
-@@ -76,7 +76,7 @@ acpi_ns_print_pathname (
- return;
- }
-
-- /* Print the entire name */
-+ /* Print the entire name */
-
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "["));
-
-@@ -205,7 +205,7 @@ acpi_ns_dump_one_object (
- * Now we can print out the pertinent information
- */
- acpi_os_printf ("%4.4s %-12s %p ",
-- this_node->name.ascii, acpi_ut_get_type_name (type), this_node);
-+ acpi_ut_get_node_name (this_node), acpi_ut_get_type_name (type), this_node);
-
- dbg_level = acpi_dbg_level;
- acpi_dbg_level = 0;
-@@ -250,8 +250,7 @@ acpi_ns_dump_one_object (
- case ACPI_TYPE_INTEGER:
-
- acpi_os_printf ("= %8.8X%8.8X\n",
-- ACPI_HIDWORD (obj_desc->integer.value),
-- ACPI_LODWORD (obj_desc->integer.value));
-+ ACPI_FORMAT_UINT64 (obj_desc->integer.value));
- break;
-
-
-@@ -302,8 +301,7 @@ acpi_ns_dump_one_object (
- acpi_os_printf ("[%s]", acpi_ut_get_region_name (obj_desc->region.space_id));
- if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
- acpi_os_printf (" Addr %8.8X%8.8X Len %.4X\n",
-- ACPI_HIDWORD (obj_desc->region.address),
-- ACPI_LODWORD (obj_desc->region.address),
-+ ACPI_FORMAT_UINT64 (obj_desc->region.address),
- obj_desc->region.length);
- }
- else {
-@@ -324,7 +322,7 @@ acpi_ns_dump_one_object (
- if (obj_desc->buffer_field.buffer_obj &&
- obj_desc->buffer_field.buffer_obj->buffer.node) {
- acpi_os_printf ("Buf [%4.4s]",
-- obj_desc->buffer_field.buffer_obj->buffer.node->name.ascii);
-+ acpi_ut_get_node_name (obj_desc->buffer_field.buffer_obj->buffer.node));
- }
- break;
-
-@@ -332,29 +330,29 @@ acpi_ns_dump_one_object (
- case ACPI_TYPE_LOCAL_REGION_FIELD:
-
- acpi_os_printf ("Rgn [%4.4s]",
-- obj_desc->common_field.region_obj->region.node->name.ascii);
-+ acpi_ut_get_node_name (obj_desc->common_field.region_obj->region.node));
- break;
-
-
- case ACPI_TYPE_LOCAL_BANK_FIELD:
-
- acpi_os_printf ("Rgn [%4.4s] Bnk [%4.4s]",
-- obj_desc->common_field.region_obj->region.node->name.ascii,
-- obj_desc->bank_field.bank_obj->common_field.node->name.ascii);
-+ acpi_ut_get_node_name (obj_desc->common_field.region_obj->region.node),
-+ acpi_ut_get_node_name (obj_desc->bank_field.bank_obj->common_field.node));
- break;
-
-
- case ACPI_TYPE_LOCAL_INDEX_FIELD:
-
- acpi_os_printf ("Idx [%4.4s] Dat [%4.4s]",
-- obj_desc->index_field.index_obj->common_field.node->name.ascii,
-- obj_desc->index_field.data_obj->common_field.node->name.ascii);
-+ acpi_ut_get_node_name (obj_desc->index_field.index_obj->common_field.node),
-+ acpi_ut_get_node_name (obj_desc->index_field.data_obj->common_field.node));
- break;
-
-
- case ACPI_TYPE_LOCAL_ALIAS:
-
-- acpi_os_printf ("Target %4.4s (%p)\n", ((struct acpi_namespace_node *) obj_desc)->name.ascii, obj_desc);
-+ acpi_os_printf ("Target %4.4s (%p)\n", acpi_ut_get_node_name (obj_desc), obj_desc);
- break;
-
- default:
-@@ -371,7 +369,7 @@ acpi_ns_dump_one_object (
- case ACPI_TYPE_LOCAL_BANK_FIELD:
- case ACPI_TYPE_LOCAL_INDEX_FIELD:
-
-- acpi_os_printf ("Off %.2X Len %.2X Acc %.2hd\n",
-+ acpi_os_printf (" Off %.3X Len %.2X Acc %.2hd\n",
- (obj_desc->common_field.base_byte_offset * 8)
- + obj_desc->common_field.start_field_bit_offset,
- obj_desc->common_field.bit_length,
-@@ -408,8 +406,8 @@ acpi_ns_dump_one_object (
-
- case ACPI_TYPE_INTEGER:
-
-- acpi_os_printf (" N:%X%X\n", ACPI_HIDWORD(obj_desc->integer.value),
-- ACPI_LODWORD(obj_desc->integer.value));
-+ acpi_os_printf (" I:%8.8X8.8%X\n",
-+ ACPI_FORMAT_UINT64 (obj_desc->integer.value));
- break;
-
- case ACPI_TYPE_STRING:
-@@ -485,7 +483,8 @@ acpi_ns_dump_one_object (
-
- default:
-
-- acpi_os_printf ("(String or Buffer ptr - not an object descriptor)\n");
-+ acpi_os_printf ("(String or Buffer ptr - not an object descriptor) [%s]\n",
-+ acpi_ut_get_descriptor_name (obj_desc));
- bytes_to_dump = 16;
- break;
- }
-@@ -581,7 +580,6 @@ acpi_ns_dump_objects (
- info.owner_id = owner_id;
- info.display_type = display_type;
-
--
- (void) acpi_ns_walk_namespace (type, start_handle, max_depth,
- ACPI_NS_WALK_NO_UNLOCK, acpi_ns_dump_one_object,
- (void *) &info, NULL);
-@@ -628,7 +626,6 @@ acpi_ns_dump_tables (
- ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "\\\n"));
- }
-
--
- acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth,
- ACPI_UINT32_MAX, search_handle);
- return_VOID;
---- linux-2.6.0/drivers/acpi/namespace/nsdumpdv.c 2003-06-14 12:17:56.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsdumpdv.c 2003-12-28 23:21:33.000000000 -0800
-@@ -93,7 +93,7 @@ acpi_ns_dump_one_device (
-
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
- info->hardware_id.value,
-- ACPI_HIDWORD (info->address), ACPI_LODWORD (info->address),
-+ ACPI_FORMAT_UINT64 (info->address),
- info->current_status));
- ACPI_MEM_FREE (info);
- }
---- linux-2.6.0/drivers/acpi/namespace/nsinit.c 2003-06-14 12:18:07.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsinit.c 2003-12-28 23:21:33.000000000 -0800
-@@ -144,10 +144,17 @@ acpi_ns_initialize_devices (
-
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Executing all Device _STA and_INI methods:"));
-
-- /* Walk namespace for all objects of type Device */
-+ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-+
-+ /* Walk namespace for all objects of type Device or Processor */
-
-- status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
-- ACPI_UINT32_MAX, FALSE, acpi_ns_init_one_device, &info, NULL);
-+ status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
-+ ACPI_UINT32_MAX, TRUE, acpi_ns_init_one_device, &info, NULL);
-+
-+ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
-
- if (ACPI_FAILURE (status)) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "walk_namespace failed! %s\n",
-@@ -290,7 +297,8 @@ acpi_ns_init_one_object (
- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n"));
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
- "Could not execute arguments for [%4.4s] (%s), %s\n",
-- node->name.ascii, acpi_ut_get_type_name (type), acpi_format_exception (status)));
-+ acpi_ut_get_node_name (node), acpi_ut_get_type_name (type),
-+ acpi_format_exception (status)));
- }
-
- /* Print a dot for each object unless we are going to print the entire pathname */
-@@ -338,45 +346,48 @@ acpi_ns_init_one_device (
- ACPI_FUNCTION_TRACE ("ns_init_one_device");
-
-
-- if ((acpi_dbg_level <= ACPI_LV_ALL_EXCEPTIONS) && (!(acpi_dbg_level & ACPI_LV_INFO))) {
-- ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
-- }
--
-- info->device_count++;
--
-- status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
-- if (ACPI_FAILURE (status)) {
-- return_ACPI_STATUS (status);
-- }
--
- node = acpi_ns_map_handle_to_node (obj_handle);
- if (!node) {
-- (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
-- status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
-- if (ACPI_FAILURE (status)) {
-- return_ACPI_STATUS (status);
-+ /*
-+ * We will run _STA/_INI on Devices and Processors only
-+ */
-+ if ((node->type != ACPI_TYPE_DEVICE) &&
-+ (node->type != ACPI_TYPE_PROCESSOR)) {
-+ return_ACPI_STATUS (AE_OK);
- }
-
-+ if ((acpi_dbg_level <= ACPI_LV_ALL_EXCEPTIONS) && (!(acpi_dbg_level & ACPI_LV_INFO))) {
-+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
-+ }
-+
-+ info->device_count++;
-+
- /*
- * Run _STA to determine if we can run _INI on the device.
- */
- ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, node, "_STA"));
- status = acpi_ut_execute_STA (node, &flags);
-+
- if (ACPI_FAILURE (status)) {
-- /* Ignore error and move on to next device */
-+ if (node->type == ACPI_TYPE_DEVICE) {
-+ /* Ignore error and move on to next device */
-
-- return_ACPI_STATUS (AE_OK);
-- }
-+ return_ACPI_STATUS (AE_OK);
-+ }
-
-- info->num_STA++;
-+ /* _STA is not required for Processor objects */
-+ }
-+ else {
-+ info->num_STA++;
-
-- if (!(flags & 0x01)) {
-- /* don't look at children of a not present device */
-+ if (!(flags & 0x01)) {
-+ /* Don't look at children of a not present device */
-
-- return_ACPI_STATUS(AE_CTRL_DEPTH);
-+ return_ACPI_STATUS(AE_CTRL_DEPTH);
-+ }
- }
-
- /*
---- linux-2.6.0/drivers/acpi/namespace/nsobject.c 2003-06-14 12:18:07.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsobject.c 2003-12-28 23:21:33.000000000 -0800
-@@ -104,7 +104,8 @@ acpi_ns_attach_object (
- if (ACPI_GET_DESCRIPTOR_TYPE (node) != ACPI_DESC_TYPE_NAMED) {
- /* Not a name handle */
-
-- ACPI_REPORT_ERROR (("ns_attach_object: Invalid handle\n"));
-+ ACPI_REPORT_ERROR (("ns_attach_object: Invalid handle %p [%s]\n",
-+ node, acpi_ut_get_descriptor_name (node)));
- return_ACPI_STATUS (AE_BAD_PARAMETER);
- }
-
-@@ -151,7 +152,7 @@ acpi_ns_attach_object (
- }
-
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n",
-- obj_desc, node, node->name.ascii));
-+ obj_desc, node, acpi_ut_get_node_name (node)));
-
- /* Detach an existing attached object if present */
-
-@@ -234,7 +235,7 @@ acpi_ns_detach_object (
- node->type = ACPI_TYPE_ANY;
-
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n",
-- node, node->name.ascii, obj_desc));
-+ node, acpi_ut_get_node_name (node), obj_desc));
-
- /* Remove one reference on the object (and all subobjects) */
-
---- linux-2.6.0/drivers/acpi/namespace/nssearch.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/namespace/nssearch.c 2003-12-28 23:21:33.000000000 -0800
-@@ -119,7 +119,7 @@ acpi_ns_search_node (
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
- "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
- (char *) &target_name, acpi_ut_get_type_name (next_node->type),
-- next_node, node->name.ascii, node));
-+ next_node, acpi_ut_get_node_name (node), node));
-
- *return_node = next_node;
- return_ACPI_STATUS (AE_OK);
-@@ -145,7 +145,7 @@ acpi_ns_search_node (
- ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
- "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
- (char *) &target_name, acpi_ut_get_type_name (type),
-- node->name.ascii, node, node->child));
-+ acpi_ut_get_node_name (node), node, node->child));
-
- return_ACPI_STATUS (AE_NOT_FOUND);
- }
---- linux-2.6.0/drivers/acpi/namespace/nsutils.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsutils.c 2003-12-28 23:21:33.000000000 -0800
-@@ -977,8 +977,8 @@ acpi_ns_find_parent_name (
- parent_node = acpi_ns_get_parent_node (child_node);
- if (parent_node) {
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Parent of %p [%4.4s] is %p [%4.4s]\n",
-- child_node, child_node->name.ascii,
-- parent_node, parent_node->name.ascii));
-+ child_node, acpi_ut_get_node_name (child_node),
-+ parent_node, acpi_ut_get_node_name (parent_node)));
-
- if (parent_node->name.integer) {
- return_VALUE ((acpi_name) parent_node->name.integer);
-@@ -986,7 +986,7 @@ acpi_ns_find_parent_name (
- }
-
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "unable to find parent of %p (%4.4s)\n",
-- child_node, child_node->name.ascii));
-+ child_node, acpi_ut_get_node_name (child_node)));
- }
-
- return_VALUE (ACPI_UNKNOWN_NAME);
---- linux-2.6.0/drivers/acpi/namespace/nsxfname.c 2003-06-14 12:18:03.000000000 -0700
-+++ 25/drivers/acpi/namespace/nsxfname.c 2003-12-28 23:21:33.000000000 -0800
-@@ -199,7 +199,7 @@ acpi_get_name (
-
- /* Just copy the ACPI name from the Node and zero terminate it */
-
-- ACPI_STRNCPY (buffer->pointer, node->name.ascii,
-+ ACPI_STRNCPY (buffer->pointer, acpi_ut_get_node_name (node),
- ACPI_NAME_SIZE);
- ((char *) buffer->pointer) [ACPI_NAME_SIZE] = 0;
- status = AE_OK;
---- linux-2.6.0/drivers/acpi/osl.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/acpi/osl.c 2003-12-28 23:21:45.000000000 -0800
-@@ -41,10 +41,7 @@
- #include <acpi/acpi_bus.h>
- #include <asm/uaccess.h>
-
--#ifdef CONFIG_ACPI_EFI
- #include <linux/efi.h>
--u64 efi_mem_attributes (u64 phys_addr);
--#endif
-
-
- #define _COMPONENT ACPI_OS_SERVICES
-@@ -140,22 +137,24 @@ acpi_os_free(void *ptr)
- acpi_status
- acpi_os_get_root_pointer(u32 flags, struct acpi_pointer *addr)
- {
--#ifdef CONFIG_ACPI_EFI
-- addr->pointer_type = ACPI_PHYSICAL_POINTER;
-- if (efi.acpi20)
-- addr->pointer.physical = (acpi_physical_address) virt_to_phys(efi.acpi20);
-- else if (efi.acpi)
-- addr->pointer.physical = (acpi_physical_address) virt_to_phys(efi.acpi);
-- else {
-- printk(KERN_ERR PREFIX "System description tables not found\n");
-- return AE_NOT_FOUND;
-- }
--#else
-- if (ACPI_FAILURE(acpi_find_root_pointer(flags, addr))) {
-- printk(KERN_ERR PREFIX "System description tables not found\n");
-- return AE_NOT_FOUND;
-+ if (efi_enabled) {
-+ addr->pointer_type = ACPI_PHYSICAL_POINTER;
-+ if (efi.acpi20)
-+ addr->pointer.physical =
-+ (acpi_physical_address) virt_to_phys(efi.acpi20);
-+ else if (efi.acpi)
-+ addr->pointer.physical =
-+ (acpi_physical_address) virt_to_phys(efi.acpi);
-+ else {
-+ printk(KERN_ERR PREFIX "System description tables not found\n");
-+ return AE_NOT_FOUND;
-+ }
-+ } else {
-+ if (ACPI_FAILURE(acpi_find_root_pointer(flags, addr))) {
-+ printk(KERN_ERR PREFIX "System description tables not found\n");
-+ return AE_NOT_FOUND;
-+ }
- }
--#endif /*CONFIG_ACPI_EFI*/
-
- return AE_OK;
- }
-@@ -163,22 +162,22 @@ acpi_os_get_root_pointer(u32 flags, stru
- acpi_status
- acpi_os_map_memory(acpi_physical_address phys, acpi_size size, void **virt)
- {
--#ifdef CONFIG_ACPI_EFI
-- if (EFI_MEMORY_WB & efi_mem_attributes(phys)) {
-- *virt = phys_to_virt(phys);
-+ if (efi_enabled) {
-+ if (EFI_MEMORY_WB & efi_mem_attributes(phys)) {
-+ *virt = phys_to_virt(phys);
-+ } else {
-+ *virt = ioremap(phys, size);
-+ }
- } else {
-- *virt = ioremap(phys, size);
-- }
--#else
-- if (phys > ULONG_MAX) {
-- printk(KERN_ERR PREFIX "Cannot map memory that high\n");
-- return AE_BAD_PARAMETER;
-+ if (phys > ULONG_MAX) {
-+ printk(KERN_ERR PREFIX "Cannot map memory that high\n");
-+ return AE_BAD_PARAMETER;
-+ }
-+ /*
-+ * ioremap checks to ensure this is in reserved space
-+ */
-+ *virt = ioremap((unsigned long) phys, size);
- }
-- /*
-- * ioremap checks to ensure this is in reserved space
-- */
-- *virt = ioremap((unsigned long) phys, size);
--#endif
-
- if (!*virt)
- return AE_NO_MEMORY;
-@@ -369,19 +368,17 @@ acpi_os_read_memory(
- {
- u32 dummy;
- void *virt_addr;
--
--#ifdef CONFIG_ACPI_EFI
- int iomem = 0;
-
-- if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
-+ if (efi_enabled) {
-+ if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
-+ virt_addr = phys_to_virt(phys_addr);
-+ } else {
-+ iomem = 1;
-+ virt_addr = ioremap(phys_addr, width);
-+ }
-+ } else
- virt_addr = phys_to_virt(phys_addr);
-- } else {
-- iomem = 1;
-- virt_addr = ioremap(phys_addr, width);
-- }
--#else
-- virt_addr = phys_to_virt(phys_addr);
--#endif
- if (!value)
- value = &dummy;
-
-@@ -399,10 +396,10 @@ acpi_os_read_memory(
- BUG();
- }
-
--#ifdef CONFIG_ACPI_EFI
-- if (iomem)
-- iounmap(virt_addr);
--#endif
-+ if (efi_enabled) {
-+ if (iomem)
-+ iounmap(virt_addr);
-+ }
-
- return AE_OK;
- }
-@@ -414,19 +411,17 @@ acpi_os_write_memory(
- u32 width)
- {
- void *virt_addr;
--
--#ifdef CONFIG_ACPI_EFI
- int iomem = 0;
-
-- if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
-+ if (efi_enabled) {
-+ if (EFI_MEMORY_WB & efi_mem_attributes(phys_addr)) {
-+ virt_addr = phys_to_virt(phys_addr);
-+ } else {
-+ iomem = 1;
-+ virt_addr = ioremap(phys_addr, width);
-+ }
-+ } else
- virt_addr = phys_to_virt(phys_addr);
-- } else {
-- iomem = 1;
-- virt_addr = ioremap(phys_addr, width);
-- }
--#else
-- virt_addr = phys_to_virt(phys_addr);
--#endif
-
- switch (width) {
- case 8:
-@@ -442,10 +437,8 @@ acpi_os_write_memory(
- BUG();
- }
-
--#ifdef CONFIG_ACPI_EFI
- if (iomem)
- iounmap(virt_addr);
--#endif
-
- return AE_OK;
- }
---- linux-2.6.0/drivers/acpi/parser/psargs.c 2003-06-14 12:18:06.000000000 -0700
-+++ 25/drivers/acpi/parser/psargs.c 2003-12-28 23:21:33.000000000 -0800
-@@ -490,7 +490,7 @@ union acpi_parse_object *
- acpi_ps_get_next_field (
- struct acpi_parse_state *parser_state)
- {
-- u32 aml_offset = ACPI_PTR_DIFF (parser_state->aml,
-+ u32 aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml,
- parser_state->aml_start);
- union acpi_parse_object *field;
- u16 opcode;
-@@ -677,7 +677,7 @@ acpi_ps_get_next_arg (
-
- /* Fill in bytelist data */
-
-- arg->common.value.size = ACPI_PTR_DIFF (parser_state->pkg_end,
-+ arg->common.value.size = (u32) ACPI_PTR_DIFF (parser_state->pkg_end,
- parser_state->aml);
- arg->named.data = parser_state->aml;
-
---- linux-2.6.0/drivers/acpi/parser/psparse.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/parser/psparse.c 2003-12-28 23:21:33.000000000 -0800
-@@ -498,7 +498,7 @@ acpi_ps_parse_loop (
- if (!op) {
- /* Get the next opcode from the AML stream */
-
-- walk_state->aml_offset = ACPI_PTR_DIFF (parser_state->aml,
-+ walk_state->aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml,
- parser_state->aml_start);
- walk_state->opcode = acpi_ps_peek_opcode (parser_state);
-
-@@ -710,7 +710,7 @@ acpi_ps_parse_loop (
-
- while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) &&
- !walk_state->arg_count) {
-- walk_state->aml_offset = ACPI_PTR_DIFF (parser_state->aml,
-+ walk_state->aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml,
- parser_state->aml_start);
- status = acpi_ps_get_next_arg (walk_state, parser_state,
- GET_CURRENT_ARG_TYPE (walk_state->arg_types), &arg);
---- linux-2.6.0/drivers/acpi/parser/psxface.c 2003-06-14 12:18:30.000000000 -0700
-+++ 25/drivers/acpi/parser/psxface.c 2003-12-28 23:21:33.000000000 -0800
-@@ -127,7 +127,8 @@ acpi_psx_execute (
-
- op = acpi_ps_create_scope_op ();
- if (!op) {
-- return_ACPI_STATUS (AE_NO_MEMORY);
-+ status = AE_NO_MEMORY;
-+ goto cleanup1;
- }
-
- /*
-@@ -142,20 +143,24 @@ acpi_psx_execute (
- walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
- NULL, NULL, NULL);
- if (!walk_state) {
-- return_ACPI_STATUS (AE_NO_MEMORY);
-+ status = AE_NO_MEMORY;
-+ goto cleanup2;
- }
-
- status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start,
- obj_desc->method.aml_length, NULL, NULL, 1);
- if (ACPI_FAILURE (status)) {
-- acpi_ds_delete_walk_state (walk_state);
-- return_ACPI_STATUS (status);
-+ goto cleanup3;
- }
-
- /* Parse the AML */
-
- status = acpi_ps_parse_aml (walk_state);
- acpi_ps_delete_parse_tree (op);
-+ if (ACPI_FAILURE (status)) {
-+ goto cleanup1; /* Walk state is already deleted */
-+
-+ }
-
- /*
- * 2) Execute the method. Performs second pass parse simultaneously
-@@ -168,7 +173,8 @@ acpi_psx_execute (
-
- op = acpi_ps_create_scope_op ();
- if (!op) {
-- return_ACPI_STATUS (AE_NO_MEMORY);
-+ status = AE_NO_MEMORY;
-+ goto cleanup1;
- }
-
- /* Init new op with the method name and pointer back to the NS node */
-@@ -180,22 +186,30 @@ acpi_psx_execute (
-
- walk_state = acpi_ds_create_walk_state (0, NULL, NULL, NULL);
- if (!walk_state) {
-- return_ACPI_STATUS (AE_NO_MEMORY);
-+ status = AE_NO_MEMORY;
-+ goto cleanup2;
- }
-
- status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start,
- obj_desc->method.aml_length, params, return_obj_desc, 3);
- if (ACPI_FAILURE (status)) {
-- acpi_ds_delete_walk_state (walk_state);
-- return_ACPI_STATUS (status);
-+ goto cleanup3;
- }
-
- /*
- * The walk of the parse tree is where we actually execute the method
- */
- status = acpi_ps_parse_aml (walk_state);
-+ goto cleanup2; /* Walk state already deleted */
-+
-+
-+cleanup3:
-+ acpi_ds_delete_walk_state (walk_state);
-+
-+cleanup2:
- acpi_ps_delete_parse_tree (op);
-
-+cleanup1:
- if (params) {
- /* Take away the extra reference that we gave the parameters above */
-
-@@ -206,6 +220,10 @@ acpi_psx_execute (
- }
- }
-
-+ if (ACPI_FAILURE (status)) {
-+ return_ACPI_STATUS (status);
-+ }
-+
- /*
- * If the method has returned an object, signal this to the caller with
- * a control exception code
---- linux-2.6.0/drivers/acpi/pci_irq.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/acpi/pci_irq.c 2003-12-28 23:21:44.000000000 -0800
-@@ -237,7 +237,7 @@ acpi_pci_irq_add_prt (
- PCI Interrupt Routing Support
- -------------------------------------------------------------------------- */
-
--static int
-+int
- acpi_pci_irq_lookup (struct pci_bus *bus, int device, int pin)
- {
- struct acpi_prt_entry *entry = NULL;
---- linux-2.6.0/drivers/acpi/pci_link.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/pci_link.c 2003-12-28 23:21:33.000000000 -0800
-@@ -99,7 +99,7 @@ acpi_pci_link_check_possible (
- void *context)
- {
- struct acpi_pci_link *link = (struct acpi_pci_link *) context;
-- int i = 0;
-+ u32 i = 0;
-
- ACPI_FUNCTION_TRACE("acpi_pci_link_check_possible");
-
-@@ -294,7 +294,10 @@ acpi_pci_link_try_get_current (
-
- if (!link->irq.active) {
- ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No active IRQ resource found\n"));
-- printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for device (%s [%s]).\n", irq, acpi_device_name(link->device), acpi_device_bid(link->device));
-+ printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for"
-+ "device (%s [%s]).\n", irq,
-+ acpi_device_name(link->device),
-+ acpi_device_bid(link->device));
- link->irq.active = irq;
- }
-
-@@ -429,30 +432,67 @@ retry_programming:
- PCI Link IRQ Management
- -------------------------------------------------------------------------- */
-
--#define ACPI_MAX_IRQS 256
--#define ACPI_MAX_ISA_IRQ 16
--
- /*
-- * IRQ penalties are used to promote PCI IRQ balancing. We set each ISA-
-- * possible IRQ (0-15) with a default penalty relative to its feasibility
-- * for PCI's use:
-+ * "acpi_irq_balance" (default in APIC mode) enables ACPI to use PIC Interrupt
-+ * Link Devices to move the PIRQs around to minimize sharing.
-+ *
-+ * "acpi_irq_nobalance" (default in PIC mode) tells ACPI not to move any PIC IRQs
-+ * that the BIOS has already set to active. This is necessary because
-+ * ACPI has no automatic means of knowing what ISA IRQs are used. Note that
-+ * if the BIOS doesn't set a Link Device active, ACPI needs to program it
-+ * even if acpi_irq_nobalance is set.
-+ *
-+ * A tables of penalties avoids directing PCI interrupts to well known
-+ * ISA IRQs. Boot params are available to over-ride the default table:
- *
-- * Never use: 0, 1, 2 (timer, keyboard, and cascade)
-- * Avoid using: 13, 14, and 15 (FP error and IDE)
-- * Penalize: 3, 4, 6, 7, 12 (known ISA uses)
-+ * List interrupts that are free for PCI use.
-+ * acpi_irq_pci=n[,m]
- *
-- * Thus we're left with IRQs 5, 9, 10, 11, and everything above 15 (IO[S]APIC)
-- * as 'best bets' for PCI use.
-+ * List interrupts that should not be used for PCI:
-+ * acpi_irq_isa=n[,m]
-+ *
-+ * Note that PCI IRQ routers have a list of possible IRQs,
-+ * which may not include the IRQs this table says are available.
-+ *
-+ * Since this heuristic can't tell the difference between a link
-+ * that no device will attach to, vs. a link which may be shared
-+ * by multiple active devices -- it is not optimal.
-+ *
-+ * If interrupt performance is that important, get an IO-APIC system
-+ * with a pin dedicated to each device. Or for that matter, an MSI
-+ * enabled system.
- */
-
-+#define ACPI_MAX_IRQS 256
-+#define ACPI_MAX_ISA_IRQ 16
-+
-+#define PIRQ_PENALTY_PCI_AVAILABLE (0)
-+#define PIRQ_PENALTY_PCI_POSSIBLE (16*16)
-+#define PIRQ_PENALTY_PCI_USING (16*16*16)
-+#define PIRQ_PENALTY_ISA_TYPICAL (16*16*16*16)
-+#define PIRQ_PENALTY_ISA_USED (16*16*16*16*16)
-+#define PIRQ_PENALTY_ISA_ALWAYS (16*16*16*16*16*16)
-+
- static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
-- 1000000, 1000000, 1000000, 10000,
-- 10000, 0, 10000, 10000,
-- 10000, 0, 0, 0,
-- 10000, 100000, 100000, 100000,
-+ PIRQ_PENALTY_ISA_ALWAYS, /* IRQ0 timer */
-+ PIRQ_PENALTY_ISA_ALWAYS, /* IRQ1 keyboard */
-+ PIRQ_PENALTY_ISA_ALWAYS, /* IRQ2 cascade */
-+ PIRQ_PENALTY_ISA_TYPICAL, /* IRQ3 serial */
-+ PIRQ_PENALTY_ISA_TYPICAL, /* IRQ4 serial */
-+ PIRQ_PENALTY_ISA_TYPICAL, /* IRQ5 sometimes SoundBlaster */
-+ PIRQ_PENALTY_ISA_TYPICAL, /* IRQ6 */
-+ PIRQ_PENALTY_ISA_TYPICAL, /* IRQ7 parallel, spurious */
-+ PIRQ_PENALTY_ISA_TYPICAL, /* IRQ8 rtc, sometimes */
-+ PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
-+ PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
-+ PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
-+ PIRQ_PENALTY_ISA_TYPICAL, /* IRQ12 mouse */
-+ PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
-+ PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
-+ PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */
-+ /* >IRQ15 */
- };
-
--
- int
- acpi_pci_link_check (void)
- {
-@@ -473,20 +513,30 @@ acpi_pci_link_check (void)
- continue;
- }
-
-- if (link->irq.active)
-- acpi_irq_penalty[link->irq.active] += 100;
-- else if (link->irq.possible_count) {
-- int penalty = 100 / link->irq.possible_count;
-- for (i=0; i<link->irq.possible_count; i++) {
-+ /*
-+ * reflect the possible and active irqs in the penalty table --
-+ * useful for breaking ties.
-+ */
-+ if (link->irq.possible_count) {
-+ int penalty = PIRQ_PENALTY_PCI_POSSIBLE / link->irq.possible_count;
-+
-+ for (i = 0; i < link->irq.possible_count; i++) {
- if (link->irq.possible[i] < ACPI_MAX_ISA_IRQ)
- acpi_irq_penalty[link->irq.possible[i]] += penalty;
- }
-+
-+ } else if (link->irq.active) {
-+ acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_POSSIBLE;
- }
- }
-+ /* Add a penalty for the SCI */
-+ acpi_irq_penalty[acpi_fadt.sci_int] += PIRQ_PENALTY_PCI_USING;
-
- return_VALUE(0);
- }
-
-+static int acpi_irq_balance; /* 0: static, 1: balance */
-+
- static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
- int irq;
- int i;
-@@ -500,12 +550,14 @@ static int acpi_pci_link_allocate(struct
- irq = link->irq.active;
- } else {
- irq = link->irq.possible[0];
-+ }
-
-+ if (acpi_irq_balance || !link->irq.active) {
- /*
- * Select the best IRQ. This is done in reverse to promote
- * the use of IRQs 9, 10, 11, and >15.
- */
-- for (i=(link->irq.possible_count-1); i>0; i--) {
-+ for (i = (link->irq.possible_count - 1); i >= 0; i--) {
- if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]])
- irq = link->irq.possible[i];
- }
-@@ -518,13 +570,14 @@ static int acpi_pci_link_allocate(struct
- acpi_device_bid(link->device));
- return_VALUE(-ENODEV);
- } else {
-- acpi_irq_penalty[link->irq.active] += 100;
-+ acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
- printk(PREFIX "%s [%s] enabled at IRQ %d\n",
- acpi_device_name(link->device),
- acpi_device_bid(link->device), link->irq.active);
- }
-
- link->irq.setonboot = 1;
-+
- return_VALUE(0);
- }
-
-@@ -607,9 +660,12 @@ acpi_pci_link_add (
- if (result)
- goto end;
-
-+ /* query and set link->irq.active */
- acpi_pci_link_get_current(link);
-
-- printk(PREFIX "%s [%s] (IRQs", acpi_device_name(device), acpi_device_bid(device));
-+//#ifdef CONFIG_ACPI_DEBUG
-+ printk(PREFIX "%s [%s] (IRQs", acpi_device_name(device),
-+ acpi_device_bid(device));
- for (i = 0; i < link->irq.possible_count; i++) {
- if (link->irq.active == link->irq.possible[i]) {
- printk(" *%d", link->irq.possible[i]);
-@@ -619,6 +675,7 @@ acpi_pci_link_add (
- printk(" %d", link->irq.possible[i]);
- }
- printk(")\n");
-+//#endif /* CONFIG_ACPI_DEBUG */
-
- /* TBD: Acquire/release lock */
- list_add_tail(&link->node, &acpi_link.entries);
-@@ -654,6 +711,77 @@ acpi_pci_link_remove (
- return_VALUE(0);
- }
-
-+/*
-+ * modify acpi_irq_penalty[] from cmdline
-+ */
-+static int __init acpi_irq_penalty_update(char *str, int used)
-+{
-+ int i;
-+
-+ for (i = 0; i < 16; i++) {
-+ int retval;
-+ int irq;
-+
-+ retval = get_option(&str,&irq);
-+
-+ if (!retval)
-+ break; /* no number found */
-+
-+ if (irq < 0)
-+ continue;
-+
-+ if (irq >= ACPI_MAX_IRQS)
-+ continue;
-+
-+ if (used)
-+ acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
-+ else
-+ acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
-+
-+ if (retval != 2) /* no next number */
-+ break;
-+ }
-+ return 1;
-+}
-+
-+/*
-+ * Over-ride default table to reserve additional IRQs for use by ISA
-+ * e.g. acpi_irq_isa=5
-+ * Useful for telling ACPI how not to interfere with your ISA sound card.
-+ */
-+static int __init acpi_irq_isa(char *str)
-+{
-+ return(acpi_irq_penalty_update(str, 1));
-+}
-+__setup("acpi_irq_isa=", acpi_irq_isa);
-+
-+/*
-+ * Over-ride default table to free additional IRQs for use by PCI
-+ * e.g. acpi_irq_pci=7,15
-+ * Used for acpi_irq_balance to free up IRQs to reduce PCI IRQ sharing.
-+ */
-+static int __init acpi_irq_pci(char *str)
-+{
-+ return(acpi_irq_penalty_update(str, 0));
-+}
-+__setup("acpi_irq_pci=", acpi_irq_pci);
-+
-+static int __init acpi_irq_nobalance_set(char *str)
-+{
-+printk("ACPI STATIC SET\n");
-+ acpi_irq_balance = 0;
-+ return(1);
-+}
-+__setup("acpi_irq_nobalance", acpi_irq_nobalance_set);
-+
-+int __init acpi_irq_balance_set(char *str)
-+{
-+printk("ACPI BALANCE SET\n");
-+ acpi_irq_balance = 1;
-+ return(1);
-+}
-+__setup("acpi_irq_balance", acpi_irq_balance_set);
-+
-
- static int __init acpi_pci_link_init (void)
- {
---- linux-2.6.0/drivers/acpi/pci_root.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/acpi/pci_root.c 2003-12-28 23:21:33.000000000 -0800
-@@ -62,8 +62,6 @@ struct acpi_pci_root {
- acpi_handle handle;
- struct acpi_pci_id id;
- struct pci_bus *bus;
-- u64 mem_tra;
-- u64 io_tra;
- };
-
- static LIST_HEAD(acpi_pci_roots);
-@@ -115,97 +113,6 @@ void acpi_pci_unregister_driver(struct a
- }
- }
-
--void
--acpi_pci_get_translations (
-- struct acpi_pci_id *id,
-- u64 *mem_tra,
-- u64 *io_tra)
--{
-- struct list_head *node = NULL;
-- struct acpi_pci_root *entry;
--
-- /* TBD: Locking */
-- list_for_each(node, &acpi_pci_roots) {
-- entry = list_entry(node, struct acpi_pci_root, node);
-- if ((id->segment == entry->id.segment)
-- && (id->bus == entry->id.bus)) {
-- *mem_tra = entry->mem_tra;
-- *io_tra = entry->io_tra;
-- return;
-- }
-- }
--
-- *mem_tra = 0;
-- *io_tra = 0;
--}
--
--
--static u64
--acpi_pci_root_bus_tra (
-- struct acpi_resource *resource,
-- int type)
--{
-- struct acpi_resource_address16 *address16;
-- struct acpi_resource_address32 *address32;
-- struct acpi_resource_address64 *address64;
--
-- while (1) {
-- switch (resource->id) {
-- case ACPI_RSTYPE_END_TAG:
-- return 0;
--
-- case ACPI_RSTYPE_ADDRESS16:
-- address16 = (struct acpi_resource_address16 *) &resource->data;
-- if (type == address16->resource_type) {
-- return address16->address_translation_offset;
-- }
-- break;
--
-- case ACPI_RSTYPE_ADDRESS32:
-- address32 = (struct acpi_resource_address32 *) &resource->data;
-- if (type == address32->resource_type) {
-- return address32->address_translation_offset;
-- }
-- break;
--
-- case ACPI_RSTYPE_ADDRESS64:
-- address64 = (struct acpi_resource_address64 *) &resource->data;
-- if (type == address64->resource_type) {
-- return address64->address_translation_offset;
-- }
-- break;
-- }
-- resource = ACPI_PTR_ADD (struct acpi_resource,
-- resource, resource->length);
-- }
--
-- return 0;
--}
--
--
--static int
--acpi_pci_evaluate_crs (
-- struct acpi_pci_root *root)
--{
-- acpi_status status;
-- struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
--
-- ACPI_FUNCTION_TRACE("acpi_pci_evaluate_crs");
--
-- status = acpi_get_current_resources (root->handle, &buffer);
-- if (ACPI_FAILURE(status))
-- return_VALUE(-ENODEV);
--
-- root->io_tra = acpi_pci_root_bus_tra ((struct acpi_resource *)
-- buffer.pointer, ACPI_IO_RANGE);
-- root->mem_tra = acpi_pci_root_bus_tra ((struct acpi_resource *)
-- buffer.pointer, ACPI_MEMORY_RANGE);
--
-- acpi_os_free(buffer.pointer);
-- return_VALUE(0);
--}
--
--
- static int
- acpi_pci_root_add (
- struct acpi_device *device)
-@@ -288,10 +195,8 @@ acpi_pci_root_add (
- root->id.function = device->pnp.bus_address & 0xFFFF;
-
- /*
-- * Evaluate _CRS to get root bridge resources
- * TBD: Need PCI interface for enumeration/configuration of roots.
- */
-- acpi_pci_evaluate_crs(root);
-
- /* TBD: Locking */
- list_add_tail(&root->node, &acpi_pci_roots);
---- linux-2.6.0/drivers/acpi/resources/rscalc.c 2003-06-14 12:18:22.000000000 -0700
-+++ 25/drivers/acpi/resources/rscalc.c 2003-12-28 23:21:33.000000000 -0800
-@@ -696,7 +696,7 @@ acpi_rs_get_list_length (
- default:
- /*
- * If we get here, everything is out of sync,
-- * so exit with an error
-+ * exit with an error
- */
- return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
- }
-@@ -704,7 +704,7 @@ acpi_rs_get_list_length (
- /*
- * Update the return value and counter
- */
-- buffer_size += ACPI_ALIGN_RESOURCE_SIZE(structure_size);
-+ buffer_size += (u32) ACPI_ALIGN_RESOURCE_SIZE (structure_size);
- bytes_parsed += bytes_consumed;
-
- /*
---- linux-2.6.0/drivers/acpi/resources/rscreate.c 2003-06-14 12:18:07.000000000 -0700
-+++ 25/drivers/acpi/resources/rscreate.c 2003-12-28 23:21:33.000000000 -0800
-@@ -331,7 +331,7 @@ acpi_rs_create_pci_routing_table (
-
- /* Now align the current length */
-
-- user_prt->length = ACPI_ROUND_UP_to_64_bITS (user_prt->length);
-+ user_prt->length = (u32) ACPI_ROUND_UP_to_64_bITS (user_prt->length);
-
- /*
- * 4) Fourth subobject: Dereference the PRT.source_index
---- linux-2.6.0/drivers/acpi/resources/rsdump.c 2003-06-14 12:18:22.000000000 -0700
-+++ 25/drivers/acpi/resources/rsdump.c 2003-12-28 23:21:33.000000000 -0800
-@@ -899,24 +899,19 @@ acpi_rs_dump_address64 (
- "" : "not ");
-
- acpi_os_printf (" Granularity: %8.8X%8.8X\n",
-- ACPI_HIDWORD (address64_data->granularity),
-- ACPI_LODWORD (address64_data->granularity));
-+ ACPI_FORMAT_UINT64 (address64_data->granularity));
-
- acpi_os_printf (" Address range min: %8.8X%8.8X\n",
-- ACPI_HIDWORD (address64_data->min_address_range),
-- ACPI_HIDWORD (address64_data->min_address_range));
-+ ACPI_FORMAT_UINT64 (address64_data->min_address_range));
-
- acpi_os_printf (" Address range max: %8.8X%8.8X\n",
-- ACPI_HIDWORD (address64_data->max_address_range),
-- ACPI_HIDWORD (address64_data->max_address_range));
-+ ACPI_FORMAT_UINT64 (address64_data->max_address_range));
-
- acpi_os_printf (" Address translation offset: %8.8X%8.8X\n",
-- ACPI_HIDWORD (address64_data->address_translation_offset),
-- ACPI_HIDWORD (address64_data->address_translation_offset));
-+ ACPI_FORMAT_UINT64 (address64_data->address_translation_offset));
-
- acpi_os_printf (" Address Length: %8.8X%8.8X\n",
-- ACPI_HIDWORD (address64_data->address_length),
-- ACPI_HIDWORD (address64_data->address_length));
-+ ACPI_FORMAT_UINT64 (address64_data->address_length));
-
- if(0xFF != address64_data->resource_source.index) {
- acpi_os_printf (" Resource Source Index: %X\n",
-@@ -1126,8 +1121,7 @@ acpi_rs_dump_irq_list (
- acpi_os_printf ("PCI IRQ Routing Table structure %X.\n", count++);
-
- acpi_os_printf (" Address: %8.8X%8.8X\n",
-- ACPI_HIDWORD (prt_element->address),
-- ACPI_LODWORD (prt_element->address));
-+ ACPI_FORMAT_UINT64 (prt_element->address));
-
- acpi_os_printf (" Pin: %X\n", prt_element->pin);
-
---- linux-2.6.0/drivers/acpi/resources/rsirq.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/resources/rsirq.c 2003-12-28 23:21:33.000000000 -0800
-@@ -132,26 +132,28 @@ acpi_rs_irq_resource (
- temp8 = *buffer;
-
- /*
-- * Check for HE, LL or HL
-+ * Check for HE, LL interrupts
- */
-- if (temp8 & 0x01) {
-+ switch (temp8 & 0x09) {
-+ case 0x01: /* HE */
- output_struct->data.irq.edge_level = ACPI_EDGE_SENSITIVE;
- output_struct->data.irq.active_high_low = ACPI_ACTIVE_HIGH;
-- }
-- else {
-- if (temp8 & 0x8) {
-- output_struct->data.irq.edge_level = ACPI_LEVEL_SENSITIVE;
-- output_struct->data.irq.active_high_low = ACPI_ACTIVE_LOW;
-- }
-- else {
-- /*
-- * Only _LL and _HE polarity/trigger interrupts
-- * are allowed (ACPI spec v1.0b ection 6.4.2.1),
-- * so an error will occur if we reach this point
-- */
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid interrupt polarity/trigger in resource list\n"));
-- return_ACPI_STATUS (AE_BAD_DATA);
-- }
-+ break;
-+
-+ case 0x08: /* LL */
-+ output_struct->data.irq.edge_level = ACPI_LEVEL_SENSITIVE;
-+ output_struct->data.irq.active_high_low = ACPI_ACTIVE_LOW;
-+ break;
-+
-+ default:
-+ /*
-+ * Only _LL and _HE polarity/trigger interrupts
-+ * are allowed (ACPI spec, section "IRQ Format")
-+ * so 0x00 and 0x09 are illegal.
-+ */
-+ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-+ "Invalid interrupt polarity/trigger in resource list, %X\n", temp8));
-+ return_ACPI_STATUS (AE_BAD_DATA);
- }
-
- /*
-@@ -419,7 +421,7 @@ acpi_rs_extended_irq_resource (
- * Point the String pointer to the end of this structure.
- */
- output_struct->data.extended_irq.resource_source.string_ptr =
-- (char *)(output_struct + struct_size);
-+ (char *)((char *) output_struct + struct_size);
-
- temp_ptr = (u8 *) output_struct->data.extended_irq.resource_source.string_ptr;
-
---- linux-2.6.0/drivers/acpi/resources/rslist.c 2003-06-14 12:18:51.000000000 -0700
-+++ 25/drivers/acpi/resources/rslist.c 2003-12-28 23:21:33.000000000 -0800
-@@ -312,8 +312,8 @@ acpi_rs_byte_stream_to_list (
- * Set the Buffer to the next structure
- */
- resource = ACPI_CAST_PTR (struct acpi_resource, buffer);
-- resource->length = ACPI_ALIGN_RESOURCE_SIZE(resource->length);
-- buffer += ACPI_ALIGN_RESOURCE_SIZE(structure_size);
-+ resource->length = (u32) ACPI_ALIGN_RESOURCE_SIZE (resource->length);
-+ buffer += ACPI_ALIGN_RESOURCE_SIZE (structure_size);
-
- } /* end while */
-
---- linux-2.6.0/drivers/acpi/scan.c 2003-06-14 12:18:08.000000000 -0700
-+++ 25/drivers/acpi/scan.c 2003-12-28 23:21:33.000000000 -0800
-@@ -336,6 +336,9 @@ acpi_bus_register_driver (
-
- ACPI_FUNCTION_TRACE("acpi_bus_register_driver");
-
-+ if (acpi_disabled)
-+ return_VALUE(-ENODEV);
-+
- if (driver) {
- spin_lock(&acpi_device_lock);
- list_add_tail(&driver->node, &acpi_bus_drivers);
---- linux-2.6.0/drivers/acpi/sleep/proc.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/acpi/sleep/proc.c 2003-12-28 23:21:33.000000000 -0800
-@@ -374,6 +374,9 @@ static int acpi_sleep_proc_init(void)
- {
- struct proc_dir_entry *entry = NULL;
-
-+ if (acpi_disabled)
-+ return 0;
-+
- /* 'sleep' [R/W]*/
- entry = create_proc_entry(ACPI_SYSTEM_FILE_SLEEP,
- S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir);
---- linux-2.6.0/drivers/acpi/tables.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/acpi/tables.c 2003-12-28 23:21:33.000000000 -0800
-@@ -60,6 +60,9 @@ static char *acpi_table_signatures[ACPI_
- [ACPI_HPET] = "HPET",
- };
-
-+static char *mps_inti_flags_polarity[] = { "dfl", "high", "res", "low" };
-+static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" };
-+
- /* System Description Table (RSDT/XSDT) */
- struct acpi_table_sdt {
- unsigned long pa;
-@@ -136,8 +139,14 @@ acpi_table_print_madt_entry (
- {
- struct acpi_table_int_src_ovr *p =
- (struct acpi_table_int_src_ovr*) header;
-- printk(KERN_INFO PREFIX "INT_SRC_OVR (bus[%d] irq[0x%x] global_irq[0x%x] polarity[0x%x] trigger[0x%x])\n",
-- p->bus, p->bus_irq, p->global_irq, p->flags.polarity, p->flags.trigger);
-+ printk(KERN_INFO PREFIX "INT_SRC_OVR (bus %d bus_irq %d global_irq %d %s %s)\n",
-+ p->bus, p->bus_irq, p->global_irq,
-+ mps_inti_flags_polarity[p->flags.polarity],
-+ mps_inti_flags_trigger[p->flags.trigger]);
-+ if(p->flags.reserved)
-+ printk(KERN_INFO PREFIX "INT_SRC_OVR unexpected reserved flags: 0x%x\n",
-+ p->flags.reserved);
-+
- }
- break;
-
-@@ -145,8 +154,9 @@ acpi_table_print_madt_entry (
- {
- struct acpi_table_nmi_src *p =
- (struct acpi_table_nmi_src*) header;
-- printk(KERN_INFO PREFIX "NMI_SRC (polarity[0x%x] trigger[0x%x] global_irq[0x%x])\n",
-- p->flags.polarity, p->flags.trigger, p->global_irq);
-+ printk(KERN_INFO PREFIX "NMI_SRC (%s %s global_irq %d)\n",
-+ mps_inti_flags_polarity[p->flags.polarity],
-+ mps_inti_flags_trigger[p->flags.trigger], p->global_irq);
- }
- break;
-
-@@ -154,8 +164,10 @@ acpi_table_print_madt_entry (
- {
- struct acpi_table_lapic_nmi *p =
- (struct acpi_table_lapic_nmi*) header;
-- printk(KERN_INFO PREFIX "LAPIC_NMI (acpi_id[0x%02x] polarity[0x%x] trigger[0x%x] lint[0x%x])\n",
-- p->acpi_id, p->flags.polarity, p->flags.trigger, p->lint);
-+ printk(KERN_INFO PREFIX "LAPIC_NMI (acpi_id[0x%02x] %s %s lint[0x%x])\n",
-+ p->acpi_id,
-+ mps_inti_flags_polarity[p->flags.polarity],
-+ mps_inti_flags_trigger[p->flags.trigger], p->lint);
- }
- break;
-
-@@ -190,8 +202,10 @@ acpi_table_print_madt_entry (
- {
- struct acpi_table_plat_int_src *p =
- (struct acpi_table_plat_int_src*) header;
-- printk(KERN_INFO PREFIX "PLAT_INT_SRC (polarity[0x%x] trigger[0x%x] type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n",
-- p->flags.polarity, p->flags.trigger, p->type, p->id, p->eid, p->iosapic_vector, p->global_irq);
-+ printk(KERN_INFO PREFIX "PLAT_INT_SRC (%s %s type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n",
-+ mps_inti_flags_polarity[p->flags.polarity],
-+ mps_inti_flags_trigger[p->flags.trigger],
-+ p->type, p->id, p->eid, p->iosapic_vector, p->global_irq);
- }
- break;
-
---- linux-2.6.0/drivers/acpi/tables/tbgetall.c 2003-06-14 12:18:29.000000000 -0700
-+++ 25/drivers/acpi/tables/tbgetall.c 2003-12-28 23:21:33.000000000 -0800
-@@ -240,8 +240,7 @@ acpi_tb_get_required_tables (
- if ((status != AE_OK) && (status != AE_TABLE_NOT_SUPPORTED)) {
- ACPI_REPORT_WARNING (("%s, while getting table at %8.8X%8.8X\n",
- acpi_format_exception (status),
-- ACPI_HIDWORD (address.pointer.value),
-- ACPI_LODWORD (address.pointer.value)));
-+ ACPI_FORMAT_UINT64 (address.pointer.value)));
- }
- }
-
---- linux-2.6.0/drivers/acpi/tables/tbget.c 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/acpi/tables/tbget.c 2003-12-28 23:21:33.000000000 -0800
-@@ -148,8 +148,7 @@ acpi_tb_get_table_header (
- (void *) &header);
- if (ACPI_FAILURE (status)) {
- ACPI_REPORT_ERROR (("Could not map memory at %8.8X%8.8X for length %X\n",
-- ACPI_HIDWORD (address->pointer.physical),
-- ACPI_LODWORD (address->pointer.physical),
-+ ACPI_FORMAT_UINT64 (address->pointer.physical),
- sizeof (struct acpi_table_header)));
- return_ACPI_STATUS (status);
- }
-@@ -365,8 +364,7 @@ acpi_tb_get_this_table (
- if (ACPI_FAILURE (status)) {
- ACPI_REPORT_ERROR (("Could not map memory for table [%4.4s] at %8.8X%8.8X for length %X\n",
- header->signature,
-- ACPI_HIDWORD (address->pointer.physical),
-- ACPI_LODWORD (address->pointer.physical), header->length));
-+ ACPI_FORMAT_UINT64 (address->pointer.physical), header->length));
- return (status);
- }
-
-@@ -408,8 +406,7 @@ acpi_tb_get_this_table (
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
- "Found table [%4.4s] at %8.8X%8.8X, mapped/copied to %p\n",
- full_table->signature,
-- ACPI_HIDWORD (address->pointer.physical),
-- ACPI_LODWORD (address->pointer.physical), full_table));
-+ ACPI_FORMAT_UINT64 (address->pointer.physical), full_table));
-
- return_ACPI_STATUS (status);
- }
-@@ -458,6 +455,7 @@ acpi_tb_get_table_ptr (
- if (instance == 1) {
- /* Get the first */
-
-+ *table_ptr_loc = NULL;
- if (acpi_gbl_table_lists[table_type].next) {
- *table_ptr_loc = acpi_gbl_table_lists[table_type].next->pointer;
- }
---- linux-2.6.0/drivers/acpi/tables/tbrsdt.c 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/acpi/tables/tbrsdt.c 2003-12-28 23:21:33.000000000 -0800
-@@ -278,8 +278,7 @@ acpi_tb_get_table_rsdt (
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
- "RSDP located at %p, points to RSDT physical=%8.8X%8.8X \n",
- acpi_gbl_RSDP,
-- ACPI_HIDWORD (address.pointer.value),
-- ACPI_LODWORD (address.pointer.value)));
-+ ACPI_FORMAT_UINT64 (address.pointer.value)));
-
- /* Check the RSDT or XSDT signature */
-
---- linux-2.6.0/drivers/acpi/tables/tbxface.c 2003-06-14 12:18:33.000000000 -0700
-+++ 25/drivers/acpi/tables/tbxface.c 2003-12-28 23:21:33.000000000 -0800
-@@ -251,7 +251,7 @@ acpi_unload_table (
- /* Find all tables of the requested type */
-
- table_desc = acpi_gbl_table_lists[table_type].next;
-- while (table_desc); {
-+ while (table_desc) {
- /*
- * Delete all namespace entries owned by this table. Note that these
- * entries can appear anywhere in the namespace by virtue of the AML
---- linux-2.6.0/drivers/acpi/tables/tbxfroot.c 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/acpi/tables/tbxfroot.c 2003-12-28 23:21:33.000000000 -0800
-@@ -211,8 +211,7 @@ acpi_get_firmware_table (
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
- "RSDP located at %p, RSDT physical=%8.8X%8.8X \n",
- acpi_gbl_RSDP,
-- ACPI_HIDWORD (address.pointer.value),
-- ACPI_LODWORD (address.pointer.value)));
-+ ACPI_FORMAT_UINT64 (address.pointer.value)));
-
- /* Insert processor_mode flags */
-
---- linux-2.6.0/drivers/acpi/thermal.c 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/acpi/thermal.c 2003-12-28 23:21:33.000000000 -0800
-@@ -467,6 +467,7 @@ acpi_thermal_critical (
- if (result)
- return_VALUE(result);
-
-+ printk(KERN_EMERG "Critical temperature reached (%ld C), shutting down.\n", KELVIN_TO_CELSIUS(tz->temperature));
- acpi_bus_generate_event(device, ACPI_THERMAL_NOTIFY_CRITICAL, tz->trips.critical.flags.enabled);
-
- acpi_thermal_call_usermode(ACPI_THERMAL_PATH_POWEROFF);
---- linux-2.6.0/drivers/acpi/utilities/utalloc.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/utilities/utalloc.c 2003-12-28 23:21:33.000000000 -0800
-@@ -902,71 +902,30 @@ acpi_ut_dump_allocations (
-
- descriptor = ACPI_CAST_PTR (union acpi_descriptor, &element->user_space);
- if (descriptor->descriptor_id != ACPI_DESC_TYPE_CACHED) {
-- acpi_os_printf ("%p Len %04X %9.9s-%d ",
-+ acpi_os_printf ("%p Len %04X %9.9s-%d [%s] ",
- descriptor, element->size, element->module,
-- element->line);
-+ element->line, acpi_ut_get_descriptor_name (descriptor));
-
-- /* Most of the elements will be internal objects. */
-+ /* Most of the elements will be Operand objects. */
-
- switch (ACPI_GET_DESCRIPTOR_TYPE (descriptor)) {
- case ACPI_DESC_TYPE_OPERAND:
-- acpi_os_printf ("obj_type %12.12s R%hd",
-+ acpi_os_printf ("%12.12s R%hd",
- acpi_ut_get_type_name (descriptor->object.common.type),
- descriptor->object.common.reference_count);
- break;
-
- case ACPI_DESC_TYPE_PARSER:
-- acpi_os_printf ("parse_obj aml_opcode %04hX",
-+ acpi_os_printf ("aml_opcode %04hX",
- descriptor->op.asl.aml_opcode);
- break;
-
- case ACPI_DESC_TYPE_NAMED:
-- acpi_os_printf ("Node %4.4s",
-- descriptor->node.name.ascii);
-- break;
--
-- case ACPI_DESC_TYPE_STATE:
-- acpi_os_printf ("Untyped state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_UPDATE:
-- acpi_os_printf ("UPDATE state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_PACKAGE:
-- acpi_os_printf ("PACKAGE state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_CONTROL:
-- acpi_os_printf ("CONTROL state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_RPSCOPE:
-- acpi_os_printf ("ROOT-PARSE-SCOPE state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_PSCOPE:
-- acpi_os_printf ("PARSE-SCOPE state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_WSCOPE:
-- acpi_os_printf ("WALK-SCOPE state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_RESULT:
-- acpi_os_printf ("RESULT state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_NOTIFY:
-- acpi_os_printf ("NOTIFY state_obj");
-- break;
--
-- case ACPI_DESC_TYPE_STATE_THREAD:
-- acpi_os_printf ("THREAD state_obj");
-+ acpi_os_printf ("%4.4s",
-+ acpi_ut_get_node_name (&descriptor->node));
- break;
-
- default:
-- /* All types should appear above */
- break;
- }
-
---- linux-2.6.0/drivers/acpi/utilities/utdebug.c 2003-06-14 12:18:24.000000000 -0700
-+++ 25/drivers/acpi/utilities/utdebug.c 2003-12-28 23:21:33.000000000 -0800
-@@ -447,7 +447,7 @@ acpi_ut_value_exit (
-
- acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
- "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
-- ACPI_HIDWORD (value), ACPI_LODWORD (value));
-+ ACPI_FORMAT_UINT64 (value));
-
- acpi_gbl_nesting_level--;
- }
---- linux-2.6.0/drivers/acpi/utilities/utdelete.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/acpi/utilities/utdelete.c 2003-12-28 23:21:33.000000000 -0800
-@@ -140,7 +140,7 @@ acpi_ut_delete_internal_obj (
-
- /* Walk the handler list for this device */
-
-- handler_desc = object->device.address_space;
-+ handler_desc = object->device.handler;
- while (handler_desc) {
- next_desc = handler_desc->address_space.next;
- acpi_ut_remove_reference (handler_desc);
-@@ -193,7 +193,7 @@ acpi_ut_delete_internal_obj (
- * default handlers -- and therefore, we created the context object
- * locally, it was not created by an external caller.
- */
-- handler_desc = object->region.address_space;
-+ handler_desc = object->region.handler;
- if (handler_desc) {
- if (handler_desc->address_space.hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
- obj_pointer = second_desc->extra.region_context;
---- linux-2.6.0/drivers/acpi/utilities/uteval.c 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/acpi/utilities/uteval.c 2003-12-28 23:21:33.000000000 -0800
-@@ -91,7 +91,7 @@ acpi_ut_evaluate_object (
- if (ACPI_FAILURE (status)) {
- if (status == AE_NOT_FOUND) {
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s.%s] was not found\n",
-- prefix_node->name.ascii, path));
-+ acpi_ut_get_node_name (prefix_node), path));
- }
- else {
- ACPI_REPORT_METHOD_ERROR ("Method execution failed",
-@@ -544,7 +544,7 @@ acpi_ut_execute_STA (
- if (AE_NOT_FOUND == status) {
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
- "_STA on %4.4s was not found, assuming device is present\n",
-- device_node->name.ascii));
-+ acpi_ut_get_node_name (device_node)));
-
- *flags = 0x0F;
- status = AE_OK;
---- linux-2.6.0/drivers/acpi/utilities/utglobal.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/acpi/utilities/utglobal.c 2003-12-28 23:21:33.000000000 -0800
-@@ -358,7 +358,7 @@ struct acpi_fixed_event_info acpi
- /* ACPI_EVENT_GLOBAL */ {ACPI_BITREG_GLOBAL_LOCK_STATUS, ACPI_BITREG_GLOBAL_LOCK_ENABLE, ACPI_BITMASK_GLOBAL_LOCK_STATUS, ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
- /* ACPI_EVENT_POWER_BUTTON */ {ACPI_BITREG_POWER_BUTTON_STATUS, ACPI_BITREG_POWER_BUTTON_ENABLE, ACPI_BITMASK_POWER_BUTTON_STATUS, ACPI_BITMASK_POWER_BUTTON_ENABLE},
- /* ACPI_EVENT_SLEEP_BUTTON */ {ACPI_BITREG_SLEEP_BUTTON_STATUS, ACPI_BITREG_SLEEP_BUTTON_ENABLE, ACPI_BITMASK_SLEEP_BUTTON_STATUS, ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
-- /* ACPI_EVENT_RTC */ {ACPI_BITREG_RT_CLOCK_STATUS, ACPI_BITREG_RT_CLOCK_ENABLE, 0, 0},
-+ /* ACPI_EVENT_RTC */ {ACPI_BITREG_RT_CLOCK_STATUS, ACPI_BITREG_RT_CLOCK_ENABLE, ACPI_BITMASK_RT_CLOCK_STATUS, ACPI_BITMASK_RT_CLOCK_ENABLE},
- };
-
- /*****************************************************************************
-@@ -534,6 +534,99 @@ acpi_ut_get_object_type_name (
- }
-
-
-+/*****************************************************************************
-+ *
-+ * FUNCTION: acpi_ut_get_node_name
-+ *
-+ * PARAMETERS: Object - A namespace node
-+ *
-+ * RETURN: Pointer to a string
-+ *
-+ * DESCRIPTION: Validate the node and return the node's ACPI name.
-+ *
-+ ****************************************************************************/
-+
-+char *
-+acpi_ut_get_node_name (
-+ void *object)
-+{
-+ struct acpi_namespace_node *node;
-+
-+
-+ if (!object)
-+ {
-+ return ("NULL NODE");
-+ }
-+
-+ node = (struct acpi_namespace_node *) object;
-+
-+ if (node->descriptor != ACPI_DESC_TYPE_NAMED)
-+ {
-+ return ("****");
-+ }
-+
-+ if (!acpi_ut_valid_acpi_name (* (u32 *) node->name.ascii))
-+ {
-+ return ("----");
-+ }
-+
-+ return (node->name.ascii);
-+}
-+
-+
-+/*****************************************************************************
-+ *
-+ * FUNCTION: acpi_ut_get_descriptor_name
-+ *
-+ * PARAMETERS: Object - An ACPI object
-+ *
-+ * RETURN: Pointer to a string
-+ *
-+ * DESCRIPTION: Validate object and return the descriptor type
-+ *
-+ ****************************************************************************/
-+
-+static const char *acpi_gbl_desc_type_names[] = /* printable names of descriptor types */
-+{
-+ /* 00 */ "Invalid",
-+ /* 01 */ "Cached",
-+ /* 02 */ "State-Generic",
-+ /* 03 */ "State-Update",
-+ /* 04 */ "State-Package",
-+ /* 05 */ "State-Control",
-+ /* 06 */ "State-root_parse_scope",
-+ /* 07 */ "State-parse_scope",
-+ /* 08 */ "State-walk_scope",
-+ /* 09 */ "State-Result",
-+ /* 10 */ "State-Notify",
-+ /* 11 */ "State-Thread",
-+ /* 12 */ "Walk",
-+ /* 13 */ "Parser",
-+ /* 14 */ "Operand",
-+ /* 15 */ "Node"
-+};
-+
-+
-+char *
-+acpi_ut_get_descriptor_name (
-+ void *object)
-+{
-+
-+ if (!object)
-+ {
-+ return ("NULL OBJECT");
-+ }
-+
-+ if (ACPI_GET_DESCRIPTOR_TYPE (object) > ACPI_DESC_TYPE_MAX)
-+ {
-+ return ((char *) acpi_gbl_bad_type);
-+ }
-+
-+ return ((char *) acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE (object)]);
-+
-+}
-+
-+
- #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
- /*
- * Strings and procedures used for debug only
---- linux-2.6.0/drivers/acpi/utilities/utobject.c 2003-06-14 12:18:24.000000000 -0700
-+++ 25/drivers/acpi/utilities/utobject.c 2003-12-28 23:21:33.000000000 -0800
-@@ -223,29 +223,10 @@ acpi_ut_valid_internal_object (
-
- return (TRUE);
-
-- case ACPI_DESC_TYPE_NAMED:
--
-- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-- "**** Obj %p is a named obj, not ACPI obj\n", object));
-- break;
--
-- case ACPI_DESC_TYPE_PARSER:
--
-- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-- "**** Obj %p is a parser obj, not ACPI obj\n", object));
-- break;
--
-- case ACPI_DESC_TYPE_CACHED:
--
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-- "**** Obj %p has already been released to internal cache\n", object));
-- break;
--
- default:
--
-- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-- "**** Obj %p has unknown descriptor type %X\n", object,
-- ACPI_GET_DESCRIPTOR_TYPE (object)));
-+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-+ "%p is not not an ACPI operand obj [%s]\n",
-+ object, acpi_ut_get_descriptor_name (object)));
- break;
- }
-
-@@ -322,7 +303,8 @@ acpi_ut_delete_object_desc (
-
- if (ACPI_GET_DESCRIPTOR_TYPE (object) != ACPI_DESC_TYPE_OPERAND) {
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-- "Obj %p is not an ACPI object\n", object));
-+ "%p is not an ACPI Operand object [%s]\n", object,
-+ acpi_ut_get_descriptor_name (object)));
- return_VOID;
- }
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/base/class_simple.c 2003-12-28 23:22:59.000000000 -0800
-@@ -0,0 +1,123 @@
-+/*
-+ * class_simple.c - basic char device support
-+ *
-+ * Copyright (c) 2003 Greg Kroah-Hartman <greg@kroah.com>
-+ * Copyright (c) 2003 IBM Corp.
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#undef DEBUG
-+
-+#include <linux/device.h>
-+#include <linux/kdev_t.h>
-+#include <linux/err.h>
-+
-+struct simple_dev {
-+ struct list_head node;
-+ dev_t dev;
-+ struct class_device class_dev;
-+};
-+#define to_simple_dev(d) container_of(d, struct simple_dev, class_dev)
-+
-+static LIST_HEAD(simple_dev_list);
-+static spinlock_t simple_dev_list_lock = SPIN_LOCK_UNLOCKED;
-+
-+static void release_simple_dev(struct class_device *class_dev)
-+{
-+ struct simple_dev *s_dev = to_simple_dev(class_dev);
-+ kfree(s_dev);
-+}
-+
-+static ssize_t show_dev(struct class_device *class_dev, char *buf)
-+{
-+ struct simple_dev *s_dev = to_simple_dev(class_dev);
-+ return print_dev_t(buf, s_dev->dev);
-+}
-+static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
-+
-+/**
-+ * simple_add_class_device - adds a class device to sysfs for a character driver
-+ * @class: pointer to the struct class that this device should be registered to.
-+ * @dev: the dev_t for the device to be added.
-+ * @device: a pointer to a struct device that is assiociated with this class device.
-+ * @fmt: string for the class device's name
-+ *
-+ * This function can be used by simple char device classes that do not
-+ * implement their own class device registration. A struct class_device will
-+ * be created in sysfs, registered to the specified class. A "dev" file will
-+ * be created, showing the dev_t for the device. The pointer to the struct
-+ * class_device will be returned from the call. Any further sysfs files that
-+ * might be required can be created using this pointer.
-+ * Note: the struct class passed to this function must have previously been
-+ * registered with a call to register_class().
-+ */
-+struct class_device *simple_add_class_device(struct class *class, dev_t dev, struct device *device, const char *fmt, ...)
-+{
-+ va_list args;
-+ struct simple_dev *s_dev;
-+ int retval;
-+
-+ s_dev = kmalloc(sizeof(*s_dev), GFP_KERNEL);
-+ if (!s_dev) {
-+ retval = -ENOMEM;
-+ goto error;
-+ }
-+ memset(s_dev, 0x00, sizeof(*s_dev));
-+
-+ class->release = &release_simple_dev;
-+ s_dev->dev = dev;
-+ s_dev->class_dev.dev = device;
-+ s_dev->class_dev.class = class;
-+
-+ va_start(args,fmt);
-+ vsnprintf(s_dev->class_dev.class_id, BUS_ID_SIZE, fmt, args);
-+ va_end(args);
-+ retval = class_device_register(&s_dev->class_dev);
-+ if (retval)
-+ goto error;
-+ class_device_create_file(&s_dev->class_dev, &class_device_attr_dev);
-+ spin_lock(&simple_dev_list_lock);
-+ list_add(&s_dev->node, &simple_dev_list);
-+ spin_unlock(&simple_dev_list_lock);
-+
-+ return &s_dev->class_dev;
-+
-+error:
-+ kfree(s_dev);
-+ return ERR_PTR(retval);
-+}
-+EXPORT_SYMBOL(simple_add_class_device);
-+
-+/**
-+ * simple_remove_class_device - removes a class device that was created with simple_add_class_device()
-+ * @dev: the dev_t of the device that was previously registered.
-+ *
-+ * This call unregisters and cleans up a class device that was created with a
-+ * call to simple_add_class_device()
-+ */
-+void simple_remove_class_device(dev_t dev)
-+{
-+ struct simple_dev *s_dev = NULL;
-+ struct list_head *tmp;
-+ int found = 0;
-+
-+ spin_lock(&simple_dev_list_lock);
-+ list_for_each(tmp, &simple_dev_list) {
-+ s_dev = list_entry(tmp, struct simple_dev, node);
-+ if (s_dev->dev == dev) {
-+ found = 1;
-+ break;
-+ }
-+ }
-+ if (found) {
-+ list_del(&s_dev->node);
-+ spin_unlock(&simple_dev_list_lock);
-+ class_device_unregister(&s_dev->class_dev);
-+ } else {
-+ spin_unlock(&simple_dev_list_lock);
-+ }
-+}
-+EXPORT_SYMBOL(simple_remove_class_device);
-+
---- linux-2.6.0/drivers/base/firmware_class.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/base/firmware_class.c 2003-12-28 23:22:41.000000000 -0800
-@@ -415,18 +415,22 @@ struct firmware_work {
- void (*cont)(const struct firmware *fw, void *context);
- };
-
--static void
-+static int
- request_firmware_work_func(void *arg)
- {
- struct firmware_work *fw_work = arg;
- const struct firmware *fw;
-- if (!arg)
-- return;
-+ if (!arg) {
-+ WARN_ON(1);
-+ return 0;
-+ }
-+ daemonize("%s/%s", "firmware", fw_work->name);
- request_firmware(&fw, fw_work->name, fw_work->device);
- fw_work->cont(fw, fw_work->context);
- release_firmware(fw);
- module_put(fw_work->module);
- kfree(fw_work);
-+ return 0;
- }
-
- /**
-@@ -451,6 +455,8 @@ request_firmware_nowait(
- {
- struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work),
- GFP_ATOMIC);
-+ int ret;
-+
- if (!fw_work)
- return -ENOMEM;
- if (!try_module_get(module)) {
-@@ -465,9 +471,14 @@ request_firmware_nowait(
- .context = context,
- .cont = cont,
- };
-- INIT_WORK(&fw_work->work, request_firmware_work_func, fw_work);
-
-- schedule_work(&fw_work->work);
-+ ret = kernel_thread(request_firmware_work_func, fw_work,
-+ CLONE_FS | CLONE_FILES);
-+
-+ if (ret < 0) {
-+ fw_work->cont(NULL, fw_work->context);
-+ return ret;
-+ }
- return 0;
- }
-
---- linux-2.6.0/drivers/base/Makefile 2003-08-22 19:23:40.000000000 -0700
-+++ 25/drivers/base/Makefile 2003-12-28 23:22:59.000000000 -0800
-@@ -1,7 +1,7 @@
- # Makefile for the Linux device tree
-
- obj-y := core.o sys.o interface.o bus.o \
-- driver.o class.o platform.o \
-+ driver.o class.o class_simple.o platform.o \
- cpu.o firmware.o init.o map.o
- obj-y += power/
- obj-$(CONFIG_FW_LOADER) += firmware_class.o
---- linux-2.6.0/drivers/base/node.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/drivers/base/node.c 2003-12-28 23:22:10.000000000 -0800
-@@ -18,18 +18,16 @@ static struct sysdev_class node_class =
- static ssize_t node_read_cpumap(struct sys_device * dev, char * buf)
- {
- struct node *node_dev = to_node(dev);
-- cpumask_t tmp = node_dev->cpumap;
-- int k, len = 0;
-+ cpumask_t mask = node_dev->cpumap;
-+ int len;
-
-- for (k = 0; k < sizeof(cpumask_t)/sizeof(u16); ++k) {
-- int j = sprintf(buf, "%04hx", (u16)cpus_coerce(tmp));
-- len += j;
-- buf += j;
-- cpus_shift_right(tmp, tmp, 16);
-- }
-- len += sprintf(buf, "\n");
-+ /* FIXME - someone should pass us a buffer size (count) or
-+ * use seq_file or something to avoid buffer overrun risk. */
-+ len = cpumask_snprintf(buf, 99 /* XXX FIXME */, mask);
-+ len += sprintf(buf + len, "\n");
- return len;
- }
-+
- static SYSDEV_ATTR(cpumap,S_IRUGO,node_read_cpumap,NULL);
-
- #define K(x) ((x) << (PAGE_SHIFT - 10))
---- linux-2.6.0/drivers/base/platform.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/base/platform.c 2003-12-28 23:22:30.000000000 -0800
-@@ -14,8 +14,8 @@
- #include <linux/module.h>
- #include <linux/init.h>
-
--struct device legacy_bus = {
-- .bus_id = "legacy",
-+struct device platform_bus = {
-+ .bus_id = "platform",
- };
-
- /**
-@@ -29,7 +29,7 @@ int platform_device_register(struct plat
- return -EINVAL;
-
- if (!pdev->dev.parent)
-- pdev->dev.parent = &legacy_bus;
-+ pdev->dev.parent = &platform_bus;
-
- pdev->dev.bus = &platform_bus_type;
-
-@@ -105,11 +105,11 @@ struct bus_type platform_bus_type = {
-
- int __init platform_bus_init(void)
- {
-- device_register(&legacy_bus);
-+ device_register(&platform_bus);
- return bus_register(&platform_bus_type);
- }
-
--EXPORT_SYMBOL(legacy_bus);
-+EXPORT_SYMBOL(platform_bus);
- EXPORT_SYMBOL(platform_bus_type);
- EXPORT_SYMBOL(platform_device_register);
- EXPORT_SYMBOL(platform_device_unregister);
---- linux-2.6.0/drivers/block/acsi.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/acsi.c 2003-12-28 23:21:17.000000000 -0800
-@@ -359,10 +359,9 @@ static void copy_from_acsibuffer( void )
- static void do_end_requests( void );
- static void do_acsi_request( request_queue_t * );
- static void redo_acsi_request( void );
--static int acsi_ioctl( struct inode *inode, struct file *file, unsigned int
-+static int acsi_ioctl(struct block_device *bdev, struct file *file, unsigned int
- cmd, unsigned long arg );
--static int acsi_open( struct inode * inode, struct file * filp );
--static int acsi_release( struct inode * inode, struct file * file );
-+static int acsi_open(struct block_device *bdev, struct file *filp);
- static void acsi_prevent_removal(struct acsi_info_struct *aip, int flag );
- static int acsi_change_blk_size( int target, int lun);
- static int acsi_mode_sense( int target, int lun, SENSE_DATA *sd );
-@@ -1081,10 +1080,10 @@ static void redo_acsi_request( void )
- ***********************************************************************/
-
-
--static int acsi_ioctl( struct inode *inode, struct file *file,
-- unsigned int cmd, unsigned long arg )
-+static int acsi_ioctl(struct block_device *bdev, struct file *file,
-+ unsigned int cmd, unsigned long arg )
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct acsi_info_struct *aip = disk->private_data;
- switch (cmd) {
- case HDIO_GETGEO:
-@@ -1096,7 +1095,7 @@ static int acsi_ioctl( struct inode *ino
- put_user( 64, &geo->heads );
- put_user( 32, &geo->sectors );
- put_user( aip->size >> 11, &geo->cylinders );
-- put_user(get_start_sect(inode->i_bdev), &geo->start);
-+ put_user(get_start_sect(bdev), &geo->start);
- return 0;
- }
- case SCSI_IOCTL_GET_IDLUN:
-@@ -1126,16 +1125,16 @@ static int acsi_ioctl( struct inode *ino
- *
- */
-
--static int acsi_open( struct inode * inode, struct file * filp )
-+static int acsi_open(struct block_device *bdev, struct file *filp)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct acsi_info_struct *aip = disk->private_data;
-
- if (aip->access_count == 0 && aip->removable) {
- #if 0
- aip->changed = 1; /* safety first */
- #endif
-- check_disk_change( inode->i_bdev );
-+ check_disk_change(bdev);
- if (aip->changed) /* revalidate was not successful (no medium) */
- return -ENXIO;
- acsi_prevent_removal(aip, 1);
-@@ -1143,10 +1142,11 @@ static int acsi_open( struct inode * ino
- aip->access_count++;
-
- if (filp && filp->f_mode) {
-- check_disk_change( inode->i_bdev );
-+ check_disk_change(bdev);
- if (filp->f_mode & 2) {
- if (aip->read_only) {
-- acsi_release( inode, filp );
-+ if (--aip->access_count == 0 && aip->removable)
-+ acsi_prevent_removal(aip, 0);
- return -EROFS;
- }
- }
-@@ -1160,9 +1160,8 @@ static int acsi_open( struct inode * ino
- * be forgotten about...
- */
-
--static int acsi_release( struct inode * inode, struct file * file )
-+static int acsi_release(struct gendisk *disk)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
- struct acsi_info_struct *aip = disk->private_data;
- if (--aip->access_count == 0 && aip->removable)
- acsi_prevent_removal(aip, 0);
-@@ -1328,8 +1327,6 @@ static int acsi_mode_sense( int target,
- ********************************************************************/
-
-
--extern struct block_device_operations acsi_fops;
--
- static struct gendisk *acsi_gendisk[MAX_DEV];
-
- #define MAX_SCSI_DEVICE_CODE 10
---- linux-2.6.0/drivers/block/amiflop.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/amiflop.c 2003-12-28 23:21:17.000000000 -0800
-@@ -1434,10 +1434,11 @@ static void do_fd_request(request_queue_
- redo_fd_request();
- }
-
--static int fd_ioctl(struct inode *inode, struct file *filp,
-+static int fd_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long param)
- {
-- int drive = iminor(inode) & 3;
-+ struct amiga_floppy_struct *floppy = bdev->bd_disk->private_data;
-+ int drive = floppy - unit;
- static struct floppy_struct getprm;
-
- switch(cmd){
-@@ -1459,7 +1460,7 @@ static int fd_ioctl(struct inode *inode,
- rel_fdc();
- return -EBUSY;
- }
-- fsync_bdev(inode->i_bdev);
-+ fsync_bdev(bdev);
- if (fd_motor_on(drive) == 0) {
- rel_fdc();
- return -ENODEV;
-@@ -1488,7 +1489,7 @@ static int fd_ioctl(struct inode *inode,
- break;
- case FDFMTEND:
- floppy_off(drive);
-- invalidate_bdev(inode->i_bdev, 0);
-+ invalidate_bdev(bdev, 0);
- break;
- case FDGETPRM:
- memset((void *)&getprm, 0, sizeof (getprm));
-@@ -1559,10 +1560,11 @@ static void fd_probe(int dev)
- * /dev/PS0 etc), and disallows simultaneous access to the same
- * drive with different device numbers.
- */
--static int floppy_open(struct inode *inode, struct file *filp)
-+static int floppy_open(struct block_device *bdev, struct file *filp)
- {
-- int drive = iminor(inode) & 3;
-- int system = (iminor(inode) & 4) >> 2;
-+ struct amiga_floppy_struct *p = bdev->bd_disk->private_data;
-+ int drive = p - unit;
-+ int system = (MINOR(bdev->bd_dev) & 4) >> 2;
- int old_dev;
- unsigned long flags;
-
-@@ -1572,7 +1574,7 @@ static int floppy_open(struct inode *ino
- return -EBUSY;
-
- if (filp && filp->f_mode & 3) {
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- if (filp->f_mode & 2 ) {
- int wrprot;
-
-@@ -1607,9 +1609,10 @@ static int floppy_open(struct inode *ino
- return 0;
- }
-
--static int floppy_release(struct inode * inode, struct file * filp)
-+static int floppy_release(struct gendisk *disk)
- {
-- int drive = iminor(inode) & 3;
-+ struct amiga_floppy_struct *p = disk->private_data;
-+ int drive = p - unit;
-
- if (unit[drive].dirty == 1) {
- del_timer (flush_track_timer + drive);
---- linux-2.6.0/drivers/block/as-iosched.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/block/as-iosched.c 2003-12-28 23:21:59.000000000 -0800
-@@ -70,6 +70,7 @@
- /* Bits in as_io_context.state */
- enum as_io_states {
- AS_TASK_RUNNING=0, /* Process has not exitted */
-+ AS_TASK_IOSTARTED, /* Process has started some IO */
- AS_TASK_IORUNNING, /* Process has completed some IO */
- };
-
-@@ -99,7 +100,14 @@ struct as_data {
- sector_t last_sector[2]; /* last REQ_SYNC & REQ_ASYNC sectors */
- struct list_head *dispatch; /* driver dispatch queue */
- struct list_head *hash; /* request hash */
-- unsigned long new_success; /* anticipation success on new proc */
-+
-+ unsigned long exit_prob; /* probability a task will exit while
-+ being waited on */
-+ unsigned long new_ttime_total; /* mean thinktime on new proc */
-+ unsigned long new_ttime_mean;
-+ u64 new_seek_total; /* mean seek on new proc */
-+ sector_t new_seek_mean;
-+
- unsigned long current_batch_expires;
- unsigned long last_check_fifo[2];
- int changed_batch; /* 1: waiting for old batch to end */
-@@ -137,6 +145,10 @@ enum arq_state {
- scheduler */
- AS_RQ_DISPATCHED, /* On the dispatch list. It belongs to the
- driver now */
-+ AS_RQ_PRESCHED, /* Debug poisoning for requests being used */
-+ AS_RQ_REMOVED,
-+ AS_RQ_MERGED,
-+ AS_RQ_POSTSCHED, /* when they shouldn't be */
- };
-
- struct as_rq {
-@@ -183,6 +195,7 @@ static void free_as_io_context(struct as
- /* Called when the task exits */
- static void exit_as_io_context(struct as_io_context *aic)
- {
-+ WARN_ON(!test_bit(AS_TASK_RUNNING, &aic->state));
- clear_bit(AS_TASK_RUNNING, &aic->state);
- }
-
-@@ -585,18 +598,11 @@ static void as_antic_stop(struct as_data
- int status = ad->antic_status;
-
- if (status == ANTIC_WAIT_REQ || status == ANTIC_WAIT_NEXT) {
-- struct as_io_context *aic;
--
- if (status == ANTIC_WAIT_NEXT)
- del_timer(&ad->antic_timer);
- ad->antic_status = ANTIC_FINISHED;
- /* see as_work_handler */
- kblockd_schedule_work(&ad->antic_work);
--
-- aic = ad->io_context->aic;
-- if (aic->seek_samples == 0)
-- /* new process */
-- ad->new_success = (ad->new_success * 3) / 4 + 256;
- }
- }
-
-@@ -612,14 +618,15 @@ static void as_antic_timeout(unsigned lo
- spin_lock_irqsave(q->queue_lock, flags);
- if (ad->antic_status == ANTIC_WAIT_REQ
- || ad->antic_status == ANTIC_WAIT_NEXT) {
-- struct as_io_context *aic;
-+ struct as_io_context *aic = ad->io_context->aic;
-+
- ad->antic_status = ANTIC_FINISHED;
- kblockd_schedule_work(&ad->antic_work);
-
-- aic = ad->io_context->aic;
-- if (aic->seek_samples == 0)
-- /* new process */
-- ad->new_success = (ad->new_success * 3) / 4;
-+ if (aic->ttime_samples == 0) {
-+ /* process anticipated on has exitted or timed out*/
-+ ad->exit_prob = (7*ad->exit_prob + 256)/8;
-+ }
- }
- spin_unlock_irqrestore(q->queue_lock, flags);
- }
-@@ -633,7 +640,7 @@ static int as_close_req(struct as_data *
- unsigned long delay; /* milliseconds */
- sector_t last = ad->last_sector[ad->batch_data_dir];
- sector_t next = arq->request->sector;
-- sector_t delta; /* acceptable close offset (in sectors) */
-+ sector_t delta; /* acceptable close offset (in sectors) */
-
- if (ad->antic_status == ANTIC_OFF || !ad->ioc_finished)
- delay = 0;
-@@ -650,6 +657,7 @@ static int as_close_req(struct as_data *
- return (last - (delta>>1) <= next) && (next <= last + delta);
- }
-
-+static void as_update_thinktime(struct as_data *ad, struct as_io_context *aic, unsigned long ttime);
- /*
- * as_can_break_anticipation returns true if we have been anticipating this
- * request.
-@@ -667,9 +675,27 @@ static int as_can_break_anticipation(str
- {
- struct io_context *ioc;
- struct as_io_context *aic;
-+ sector_t s;
-+
-+ ioc = ad->io_context;
-+ BUG_ON(!ioc);
-+
-+ if (arq && ioc == arq->io_context) {
-+ /* request from same process */
-+ return 1;
-+ }
-
- if (arq && arq->is_sync == REQ_SYNC && as_close_req(ad, arq)) {
- /* close request */
-+ struct as_io_context *aic = ioc->aic;
-+ if (aic) {
-+ unsigned long thinktime;
-+ spin_lock(&aic->lock);
-+ thinktime = jiffies - aic->last_end_request;
-+ aic->last_end_request = jiffies;
-+ as_update_thinktime(ad, aic, thinktime);
-+ spin_unlock(&aic->lock);
-+ }
- return 1;
- }
-
-@@ -681,20 +707,14 @@ static int as_can_break_anticipation(str
- return 1;
- }
-
-- ioc = ad->io_context;
-- BUG_ON(!ioc);
--
-- if (arq && ioc == arq->io_context) {
-- /* request from same process */
-- return 1;
-- }
--
- aic = ioc->aic;
- if (!aic)
- return 0;
-
- if (!test_bit(AS_TASK_RUNNING, &aic->state)) {
- /* process anticipated on has exitted */
-+ if (aic->ttime_samples == 0)
-+ ad->exit_prob = (7*ad->exit_prob + 256)/8;
- return 1;
- }
-
-@@ -708,28 +728,36 @@ static int as_can_break_anticipation(str
- return 1;
- }
-
-- if (ad->new_success < 256 &&
-- (aic->seek_samples == 0 || aic->ttime_samples == 0)) {
-- /*
-- * Process has just started IO and we have a bad history of
-- * success anticipating on new processes!
-- */
-- return 1;
-- }
--
-- if (aic->ttime_mean > ad->antic_expire) {
-+ if (aic->ttime_samples == 0) {
-+ if (ad->new_ttime_mean > ad->antic_expire)
-+ return 1;
-+ if (ad->exit_prob > 128)
-+ return 1;
-+ } else if (aic->ttime_mean > ad->antic_expire) {
- /* the process thinks too much between requests */
- return 1;
- }
-
-- if (arq && aic->seek_samples) {
-- sector_t s;
-- if (ad->last_sector[REQ_SYNC] < arq->request->sector)
-- s = arq->request->sector - ad->last_sector[REQ_SYNC];
-- else
-- s = ad->last_sector[REQ_SYNC] - arq->request->sector;
-+ if (!arq)
-+ return 0;
-+
-+ if (ad->last_sector[REQ_SYNC] < arq->request->sector)
-+ s = arq->request->sector - ad->last_sector[REQ_SYNC];
-+ else
-+ s = ad->last_sector[REQ_SYNC] - arq->request->sector;
-+
-+ if (aic->seek_samples == 0) {
-+ /*
-+ * Process has just started IO. Use past statistics to
-+ * guage success possibility
-+ */
-+ if (ad->new_seek_mean/2 > s) {
-+ /* this request is better than what we're expecting */
-+ return 1;
-+ }
-
-- if (aic->seek_mean > (s>>1)) {
-+ } else {
-+ if (aic->seek_mean/2 > s) {
- /* this request is better than what we're expecting */
- return 1;
- }
-@@ -774,12 +802,51 @@ static int as_can_anticipate(struct as_d
- return 1;
- }
-
-+static void as_update_thinktime(struct as_data *ad, struct as_io_context *aic, unsigned long ttime)
-+{
-+ /* fixed point: 1.0 == 1<<8 */
-+ if (aic->ttime_samples == 0) {
-+ ad->new_ttime_total = (7*ad->new_ttime_total + 256*ttime) / 8;
-+ ad->new_ttime_mean = ad->new_ttime_total / 256;
-+
-+ ad->exit_prob = (7*ad->exit_prob)/8;
-+ }
-+ aic->ttime_samples = (7*aic->ttime_samples + 256) / 8;
-+ aic->ttime_total = (7*aic->ttime_total + 256*ttime) / 8;
-+ aic->ttime_mean = (aic->ttime_total + 128) / aic->ttime_samples;
-+}
-+
-+static void as_update_seekdist(struct as_data *ad, struct as_io_context *aic, sector_t sdist)
-+{
-+ u64 total;
-+
-+ if (aic->seek_samples == 0) {
-+ ad->new_seek_total = (7*ad->new_seek_total + 256*(u64)sdist)/8;
-+ ad->new_seek_mean = ad->new_seek_total / 256;
-+ }
-+
-+ /*
-+ * Don't allow the seek distance to get too large from the
-+ * odd fragment, pagein, etc
-+ */
-+ if (aic->seek_samples <= 60) /* second&third seek */
-+ sdist = min(sdist, (aic->seek_mean * 4) + 2*1024*1024);
-+ else
-+ sdist = min(sdist, (aic->seek_mean * 4) + 2*1024*64);
-+
-+ aic->seek_samples = (7*aic->seek_samples + 256) / 8;
-+ aic->seek_total = (7*aic->seek_total + (u64)256*sdist) / 8;
-+ total = aic->seek_total + (aic->seek_samples/2);
-+ do_div(total, aic->seek_samples);
-+ aic->seek_mean = (sector_t)total;
-+}
-+
- /*
- * as_update_iohist keeps a decaying histogram of IO thinktimes, and
- * updates @aic->ttime_mean based on that. It is called when a new
- * request is queued.
- */
--static void as_update_iohist(struct as_io_context *aic, struct request *rq)
-+static void as_update_iohist(struct as_data *ad, struct as_io_context *aic, struct request *rq)
- {
- struct as_rq *arq = RQ_DATA(rq);
- int data_dir = arq->is_sync;
-@@ -790,60 +857,29 @@ static void as_update_iohist(struct as_i
- return;
-
- if (data_dir == REQ_SYNC) {
-+ unsigned long in_flight = atomic_read(&aic->nr_queued)
-+ + atomic_read(&aic->nr_dispatched);
- spin_lock(&aic->lock);
--
-- if (test_bit(AS_TASK_IORUNNING, &aic->state)
-- && !atomic_read(&aic->nr_queued)
-- && !atomic_read(&aic->nr_dispatched)) {
-+ if (test_bit(AS_TASK_IORUNNING, &aic->state) ||
-+ test_bit(AS_TASK_IOSTARTED, &aic->state)) {
- /* Calculate read -> read thinktime */
-- thinktime = jiffies - aic->last_end_request;
-- thinktime = min(thinktime, MAX_THINKTIME-1);
-- /* fixed point: 1.0 == 1<<8 */
-- aic->ttime_samples += 256;
-- aic->ttime_total += 256*thinktime;
-- if (aic->ttime_samples)
-- /* fixed point factor is cancelled here */
-- aic->ttime_mean = (aic->ttime_total + 128)
-- / aic->ttime_samples;
-- aic->ttime_samples = (aic->ttime_samples>>1)
-- + (aic->ttime_samples>>2);
-- aic->ttime_total = (aic->ttime_total>>1)
-- + (aic->ttime_total>>2);
-- }
--
-- /* Calculate read -> read seek distance */
-- if (!aic->seek_samples)
-- seek_dist = 0;
-- else if (aic->last_request_pos < rq->sector)
-- seek_dist = rq->sector - aic->last_request_pos;
-- else
-- seek_dist = aic->last_request_pos - rq->sector;
--
-+ if (test_bit(AS_TASK_IORUNNING, &aic->state)
-+ && in_flight == 0) {
-+ thinktime = jiffies - aic->last_end_request;
-+ thinktime = min(thinktime, MAX_THINKTIME-1);
-+ } else
-+ thinktime = 0;
-+ as_update_thinktime(ad, aic, thinktime);
-+
-+ /* Calculate read -> read seek distance */
-+ if (aic->last_request_pos < rq->sector)
-+ seek_dist = rq->sector - aic->last_request_pos;
-+ else
-+ seek_dist = aic->last_request_pos - rq->sector;
-+ as_update_seekdist(ad, aic, seek_dist);
-+ }
- aic->last_request_pos = rq->sector + rq->nr_sectors;
--
-- /*
-- * Don't allow the seek distance to get too large from the
-- * odd fragment, pagein, etc
-- */
-- if (aic->seek_samples < 400) /* second&third seek */
-- seek_dist = min(seek_dist, (aic->seek_mean * 4)
-- + 2*1024*1024);
-- else
-- seek_dist = min(seek_dist, (aic->seek_mean * 4)
-- + 2*1024*64);
--
-- aic->seek_samples += 256;
-- aic->seek_total += (u64)256*seek_dist;
-- if (aic->seek_samples) {
-- u64 total = aic->seek_total + (aic->seek_samples>>1);
-- do_div(total, aic->seek_samples);
-- aic->seek_mean = (sector_t)total;
-- }
-- aic->seek_samples = (aic->seek_samples>>1)
-- + (aic->seek_samples>>2);
-- aic->seek_total = (aic->seek_total>>1)
-- + (aic->seek_total>>2);
--
-+ set_bit(AS_TASK_IOSTARTED, &aic->state);
- spin_unlock(&aic->lock);
- }
- }
-@@ -908,15 +944,25 @@ static void as_completed_request(request
- {
- struct as_data *ad = q->elevator.elevator_data;
- struct as_rq *arq = RQ_DATA(rq);
-- struct as_io_context *aic;
-
- WARN_ON(!list_empty(&rq->queuelist));
-
-- if (unlikely(arq->state != AS_RQ_DISPATCHED))
-- return;
-+ if (arq->state == AS_RQ_PRESCHED) {
-+ WARN_ON(arq->io_context);
-+ goto out;
-+ }
-+
-+ if (arq->state == AS_RQ_MERGED)
-+ goto out_ioc;
-+
-+ if (arq->state != AS_RQ_REMOVED) {
-+ printk("arq->state %d\n", arq->state);
-+ WARN_ON(1);
-+ goto out;
-+ }
-
- if (!blk_fs_request(rq))
-- return;
-+ goto out;
-
- if (ad->changed_batch && ad->nr_dispatched == 1) {
- kblockd_schedule_work(&ad->antic_work);
-@@ -940,10 +986,7 @@ static void as_completed_request(request
- ad->new_batch = 0;
- }
-
-- if (!arq->io_context)
-- return;
--
-- if (ad->io_context == arq->io_context) {
-+ if (ad->io_context == arq->io_context && ad->io_context) {
- ad->antic_start = jiffies;
- ad->ioc_finished = 1;
- if (ad->antic_status == ANTIC_WAIT_REQ) {
-@@ -955,18 +998,23 @@ static void as_completed_request(request
- }
- }
-
-- aic = arq->io_context->aic;
-- if (!aic)
-- return;
-+out_ioc:
-+ if (!arq->io_context)
-+ goto out;
-
-- spin_lock(&aic->lock);
- if (arq->is_sync == REQ_SYNC) {
-- set_bit(AS_TASK_IORUNNING, &aic->state);
-- aic->last_end_request = jiffies;
-+ struct as_io_context *aic = arq->io_context->aic;
-+ if (aic) {
-+ spin_lock(&aic->lock);
-+ set_bit(AS_TASK_IORUNNING, &aic->state);
-+ aic->last_end_request = jiffies;
-+ spin_unlock(&aic->lock);
-+ }
- }
-- spin_unlock(&aic->lock);
-
- put_io_context(arq->io_context);
-+out:
-+ arq->state = AS_RQ_POSTSCHED;
- }
-
- /*
-@@ -1035,14 +1083,14 @@ static void as_remove_request(request_qu
- struct as_rq *arq = RQ_DATA(rq);
-
- if (unlikely(arq->state == AS_RQ_NEW))
-- return;
--
-- if (!arq) {
-- WARN_ON(1);
-- return;
-- }
-+ goto out;
-
- if (ON_RB(&arq->rb_node)) {
-+ if (arq->state != AS_RQ_QUEUED) {
-+ printk("arq->state %d\n", arq->state);
-+ WARN_ON(1);
-+ goto out;
-+ }
- /*
- * We'll lose the aliased request(s) here. I don't think this
- * will ever happen, but if it does, hopefully someone will
-@@ -1050,8 +1098,16 @@ static void as_remove_request(request_qu
- */
- WARN_ON(!list_empty(&rq->queuelist));
- as_remove_queued_request(q, rq);
-- } else
-+ } else {
-+ if (arq->state != AS_RQ_DISPATCHED) {
-+ printk("arq->state %d\n", arq->state);
-+ WARN_ON(1);
-+ goto out;
-+ }
- as_remove_dispatched_request(q, rq);
-+ }
-+out:
-+ arq->state = AS_RQ_REMOVED;
- }
-
- /*
-@@ -1229,9 +1285,9 @@ static int as_dispatch_request(struct as
- */
- goto dispatch_writes;
-
-- if (ad->batch_data_dir == REQ_ASYNC) {
-+ if (ad->batch_data_dir == REQ_ASYNC) {
- WARN_ON(ad->new_batch);
-- ad->changed_batch = 1;
-+ ad->changed_batch = 1;
- }
- ad->batch_data_dir = REQ_SYNC;
- arq = list_entry_fifo(ad->fifo_list[ad->batch_data_dir].next);
-@@ -1247,8 +1303,8 @@ static int as_dispatch_request(struct as
- dispatch_writes:
- BUG_ON(RB_EMPTY(&ad->sort_list[REQ_ASYNC]));
-
-- if (ad->batch_data_dir == REQ_SYNC) {
-- ad->changed_batch = 1;
-+ if (ad->batch_data_dir == REQ_SYNC) {
-+ ad->changed_batch = 1;
-
- /*
- * new_batch might be 1 when the queue runs out of
-@@ -1291,8 +1347,6 @@ fifo_expired:
- ad->new_batch = 1;
-
- ad->changed_batch = 0;
--
-- arq->request->flags |= REQ_SOFTBARRIER;
- }
-
- /*
-@@ -1369,8 +1423,8 @@ static void as_add_request(struct as_dat
- arq->io_context = as_get_io_context();
-
- if (arq->io_context) {
-+ as_update_iohist(ad, arq->io_context->aic, arq->request);
- atomic_inc(&arq->io_context->aic->nr_queued);
-- as_update_iohist(arq->io_context->aic, arq->request);
- }
-
- alias = as_add_arq_rb(ad, arq);
-@@ -1391,6 +1445,7 @@ static void as_add_request(struct as_dat
-
- } else {
- as_add_aliased_request(ad, arq, alias);
-+
- /*
- * have we been anticipating this request?
- * or does it come from the same process as the one we are
-@@ -1416,6 +1471,11 @@ static void as_requeue_request(request_q
- struct as_rq *arq = RQ_DATA(rq);
-
- if (arq) {
-+ if (arq->state != AS_RQ_REMOVED) {
-+ printk("arq->state %d\n", arq->state);
-+ WARN_ON(1);
-+ }
-+
- arq->state = AS_RQ_DISPATCHED;
- if (arq->io_context && arq->io_context->aic)
- atomic_inc(&arq->io_context->aic->nr_dispatched);
-@@ -1427,8 +1487,6 @@ static void as_requeue_request(request_q
-
- /* Stop anticipating - let this request get through */
- as_antic_stop(ad);
--
-- return;
- }
-
- static void
-@@ -1437,10 +1495,20 @@ as_insert_request(request_queue_t *q, st
- struct as_data *ad = q->elevator.elevator_data;
- struct as_rq *arq = RQ_DATA(rq);
-
-+ if (arq) {
-+ if (arq->state != AS_RQ_PRESCHED) {
-+ printk("arq->state: %d\n", arq->state);
-+ WARN_ON(1);
-+ }
-+ arq->state = AS_RQ_NEW;
-+ }
-+
- /* barriers must flush the reorder queue */
- if (unlikely(rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)
-- && where == ELEVATOR_INSERT_SORT))
-+ && where == ELEVATOR_INSERT_SORT)) {
-+ WARN_ON(1);
- where = ELEVATOR_INSERT_BACK;
-+ }
-
- switch (where) {
- case ELEVATOR_INSERT_BACK:
-@@ -1675,7 +1743,8 @@ as_merged_requests(request_queue_t *q, s
- * kill knowledge of next, this one is a goner
- */
- as_remove_queued_request(q, next);
-- put_io_context(anext->io_context);
-+
-+ anext->state = AS_RQ_MERGED;
- }
-
- /*
-@@ -1708,6 +1777,11 @@ static void as_put_request(request_queue
- return;
- }
-
-+ if (arq->state != AS_RQ_POSTSCHED && arq->state != AS_RQ_PRESCHED) {
-+ printk("arq->state %d\n", arq->state);
-+ WARN_ON(1);
-+ }
-+
- mempool_free(arq, ad->arq_pool);
- rq->elevator_private = NULL;
- }
-@@ -1721,7 +1795,7 @@ static int as_set_request(request_queue_
- memset(arq, 0, sizeof(*arq));
- RB_CLEAR(&arq->rb_node);
- arq->request = rq;
-- arq->state = AS_RQ_NEW;
-+ arq->state = AS_RQ_PRESCHED;
- arq->io_context = NULL;
- INIT_LIST_HEAD(&arq->hash);
- arq->on_hash = 0;
-@@ -1823,8 +1897,6 @@ static int as_init(request_queue_t *q, e
- if (ad->write_batch_count < 2)
- ad->write_batch_count = 2;
-
-- ad->new_success = 512;
--
- return 0;
- }
-
-@@ -1860,6 +1932,17 @@ as_var_store(unsigned long *var, const c
- return count;
- }
-
-+static ssize_t as_est_show(struct as_data *ad, char *page)
-+{
-+ int pos = 0;
-+
-+ pos += sprintf(page+pos, "%lu %% exit probability\n", 100*ad->exit_prob/256);
-+ pos += sprintf(page+pos, "%lu ms new thinktime\n", ad->new_ttime_mean);
-+ pos += sprintf(page+pos, "%llu sectors new seek distance\n", (unsigned long long)ad->new_seek_mean);
-+
-+ return pos;
-+}
-+
- #define SHOW_FUNCTION(__FUNC, __VAR) \
- static ssize_t __FUNC(struct as_data *ad, char *page) \
- { \
-@@ -1891,6 +1974,10 @@ STORE_FUNCTION(as_write_batchexpire_stor
- &ad->batch_expire[REQ_ASYNC], 0, INT_MAX);
- #undef STORE_FUNCTION
-
-+static struct as_fs_entry as_est_entry = {
-+ .attr = {.name = "est_time", .mode = S_IRUGO },
-+ .show = as_est_show,
-+};
- static struct as_fs_entry as_readexpire_entry = {
- .attr = {.name = "read_expire", .mode = S_IRUGO | S_IWUSR },
- .show = as_readexpire_show,
-@@ -1918,6 +2005,7 @@ static struct as_fs_entry as_write_batch
- };
-
- static struct attribute *default_attrs[] = {
-+ &as_est_entry.attr,
- &as_readexpire_entry.attr,
- &as_writeexpire_entry.attr,
- &as_anticexpire_entry.attr,
---- linux-2.6.0/drivers/block/ataflop.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/ataflop.c 2003-12-28 23:21:17.000000000 -0800
-@@ -364,13 +364,12 @@ static void finish_fdc_done( int dummy )
- static __inline__ void copy_buffer( void *from, void *to);
- static void setup_req_params( int drive );
- static void redo_fd_request( void);
--static int fd_ioctl( struct inode *inode, struct file *filp, unsigned int
-+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int
- cmd, unsigned long param);
- static void fd_probe( int drive );
- static int fd_test_drive_present( int drive );
- static void config_types( void );
--static int floppy_open( struct inode *inode, struct file *filp );
--static int floppy_release( struct inode * inode, struct file * filp );
-+static int floppy_open(struct block_device *bdev, struct file *filp );
-
- /************************* End of Prototypes **************************/
-
-@@ -1496,10 +1495,10 @@ void do_fd_request(request_queue_t * q)
- atari_enable_irq( IRQ_MFP_FDC );
- }
-
--static int fd_ioctl(struct inode *inode, struct file *filp,
-+static int fd_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long param)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct atari_floppy_struct *floppy = disk->private_data;
- int drive = floppy - unit;
- int type = floppy->type;
-@@ -1673,7 +1672,7 @@ static int fd_ioctl(struct inode *inode,
- /* invalidate the buffer track to force a reread */
- BufferDrive = -1;
- set_bit(drive, &fake_change);
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- return 0;
- default:
- return -EINVAL;
-@@ -1816,10 +1815,10 @@ static void __init config_types( void )
- * drive with different device numbers.
- */
-
--static int floppy_open( struct inode *inode, struct file *filp )
-+static int floppy_open(struct block_device *bdev, struct file *filp )
- {
-- struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data;
-- int type = iminor(inode) >> 2;
-+ struct atari_floppy_struct *p = bdev->bd_disk->private_data;
-+ int type = MINOR(bdev->bd_dev) >> 2;
-
- DPRINT(("fd_open: type=%d\n",type));
- if (p->ref && p->type != type)
-@@ -1839,14 +1838,13 @@ static int floppy_open( struct inode *in
- return 0;
-
- if (filp->f_mode & 3) {
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- if (filp->f_mode & 2) {
- if (p->wpstat) {
- if (p->ref < 0)
- p->ref = 0;
- else
- p->ref--;
-- floppy_release(inode, filp);
- return -EROFS;
- }
- }
-@@ -1855,9 +1853,9 @@ static int floppy_open( struct inode *in
- }
-
-
--static int floppy_release( struct inode * inode, struct file * filp )
-+static int floppy_release(struct gendisk *disk)
- {
-- struct atari_floppy_struct *p = inode->i_bdev->bd_disk->private_data;
-+ struct atari_floppy_struct *p = disk->private_data;
- if (p->ref < 0)
- p->ref = 0;
- else if (!p->ref--) {
---- linux-2.6.0/drivers/block/cciss.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/cciss.c 2003-12-28 23:21:17.000000000 -0800
-@@ -112,9 +112,9 @@ static struct board_type products[] = {
- static ctlr_info_t *hba[MAX_CTLR];
-
- static void do_cciss_request(request_queue_t *q);
--static int cciss_open(struct inode *inode, struct file *filep);
--static int cciss_release(struct inode *inode, struct file *filep);
--static int cciss_ioctl(struct inode *inode, struct file *filep,
-+static int cciss_open(struct block_device *bdev, struct file *filep);
-+static int cciss_release(struct gendisk *disk);
-+static int cciss_ioctl(struct block_device *bdev, struct file *filep,
- unsigned int cmd, unsigned long arg);
-
- static int revalidate_allvol(ctlr_info_t *host);
-@@ -362,13 +362,13 @@ static inline drive_info_struct *get_drv
- /*
- * Open. Make sure the device is really there.
- */
--static int cciss_open(struct inode *inode, struct file *filep)
-+static int cciss_open(struct block_device *bdev, struct file *filep)
- {
-- ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-- drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
-+ ctlr_info_t *host = get_host(bdev->bd_disk);
-+ drive_info_struct *drv = get_drv(bdev->bd_disk);
-
- #ifdef CCISS_DEBUG
-- printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name);
-+ printk(KERN_DEBUG "cciss_open %s\n", bdev->bd_disk->disk_name);
- #endif /* CCISS_DEBUG */
-
- /*
-@@ -378,7 +378,7 @@ static int cciss_open(struct inode *inod
- * for "raw controller".
- */
- if (drv->nr_blocks == 0) {
-- if (iminor(inode) != 0)
-+ if (bdev != bdev->bd_contains || drv != host->drv)
- return -ENXIO;
- if (!capable(CAP_SYS_ADMIN))
- return -EPERM;
-@@ -390,13 +390,13 @@ static int cciss_open(struct inode *inod
- /*
- * Close. Sync first.
- */
--static int cciss_release(struct inode *inode, struct file *filep)
-+static int cciss_release(struct gendisk *disk)
- {
-- ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-- drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
-+ ctlr_info_t *host = get_host(disk);
-+ drive_info_struct *drv = get_drv(disk);
-
- #ifdef CCISS_DEBUG
-- printk(KERN_DEBUG "cciss_release %s\n", inode->i_bdev->bd_disk->disk_name);
-+ printk(KERN_DEBUG "cciss_release %s\n", disk->disk_name);
- #endif /* CCISS_DEBUG */
-
- drv->usage_count--;
-@@ -407,10 +407,9 @@ static int cciss_release(struct inode *i
- /*
- * ioctl
- */
--static int cciss_ioctl(struct inode *inode, struct file *filep,
-+static int cciss_ioctl(struct block_device *bdev, struct file *filep,
- unsigned int cmd, unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- struct gendisk *disk = bdev->bd_disk;
- ctlr_info_t *host = get_host(disk);
- drive_info_struct *drv = get_drv(disk);
-@@ -433,7 +432,7 @@ static int cciss_ioctl(struct inode *ino
- driver_geo.sectors = 0x3f;
- driver_geo.cylinders = (int)drv->nr_blocks / (0xff*0x3f);
- }
-- driver_geo.start= get_start_sect(inode->i_bdev);
-+ driver_geo.start= get_start_sect(bdev);
- if (copy_to_user((void *) arg, &driver_geo,
- sizeof( struct hd_geometry)))
- return -EFAULT;
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/block/cfq-iosched.c 2003-12-28 23:21:35.000000000 -0800
-@@ -0,0 +1,707 @@
-+/*
-+ * linux/drivers/block/cfq-iosched.c
-+ *
-+ * CFQ, or complete fairness queueing, disk scheduler.
-+ *
-+ * Based on ideas from a previously unfinished io
-+ * scheduler (round robin per-process disk scheduling) and Andrea Arcangeli.
-+ *
-+ * Copyright (C) 2003 Jens Axboe <axboe@suse.de>
-+ */
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/blkdev.h>
-+#include <linux/elevator.h>
-+#include <linux/bio.h>
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/init.h>
-+#include <linux/compiler.h>
-+#include <linux/hash.h>
-+#include <linux/rbtree.h>
-+#include <linux/mempool.h>
-+
-+/*
-+ * tunables
-+ */
-+static int cfq_quantum = 4;
-+static int cfq_queued = 8;
-+
-+#define CFQ_QHASH_SHIFT 6
-+#define CFQ_QHASH_ENTRIES (1 << CFQ_QHASH_SHIFT)
-+#define list_entry_qhash(entry) list_entry((entry), struct cfq_queue, cfq_hash)
-+
-+#define CFQ_MHASH_SHIFT 8
-+#define CFQ_MHASH_BLOCK(sec) ((sec) >> 3)
-+#define CFQ_MHASH_ENTRIES (1 << CFQ_MHASH_SHIFT)
-+#define CFQ_MHASH_FN(sec) (hash_long(CFQ_MHASH_BLOCK((sec)),CFQ_MHASH_SHIFT))
-+#define ON_MHASH(crq) !list_empty(&(crq)->hash)
-+#define rq_hash_key(rq) ((rq)->sector + (rq)->nr_sectors)
-+#define list_entry_hash(ptr) list_entry((ptr), struct cfq_rq, hash)
-+
-+#define list_entry_cfqq(ptr) list_entry((ptr), struct cfq_queue, cfq_list)
-+
-+#define RQ_DATA(rq) ((struct cfq_rq *) (rq)->elevator_private)
-+
-+static kmem_cache_t *crq_pool;
-+static kmem_cache_t *cfq_pool;
-+static mempool_t *cfq_mpool;
-+
-+struct cfq_data {
-+ struct list_head rr_list;
-+ struct list_head *dispatch;
-+ struct list_head *cfq_hash;
-+
-+ struct list_head *crq_hash;
-+
-+ unsigned int busy_queues;
-+ unsigned int max_queued;
-+
-+ mempool_t *crq_pool;
-+};
-+
-+struct cfq_queue {
-+ struct list_head cfq_hash;
-+ struct list_head cfq_list;
-+ struct rb_root sort_list;
-+ int pid;
-+ int queued[2];
-+#if 0
-+ /*
-+ * with a simple addition like this, we can do io priorities. almost.
-+ * does need a split request free list, too.
-+ */
-+ int io_prio
-+#endif
-+};
-+
-+struct cfq_rq {
-+ struct rb_node rb_node;
-+ sector_t rb_key;
-+
-+ struct request *request;
-+
-+ struct cfq_queue *cfq_queue;
-+
-+ struct list_head hash;
-+};
-+
-+static void cfq_put_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq);
-+static struct cfq_queue *cfq_find_cfq_hash(struct cfq_data *cfqd, int pid);
-+static void cfq_dispatch_sort(struct list_head *head, struct cfq_rq *crq);
-+
-+/*
-+ * lots of deadline iosched dupes, can be abstracted later...
-+ */
-+static inline void __cfq_del_crq_hash(struct cfq_rq *crq)
-+{
-+ list_del_init(&crq->hash);
-+}
-+
-+static inline void cfq_del_crq_hash(struct cfq_rq *crq)
-+{
-+ if (ON_MHASH(crq))
-+ __cfq_del_crq_hash(crq);
-+}
-+
-+static void cfq_remove_merge_hints(request_queue_t *q, struct cfq_rq *crq)
-+{
-+ cfq_del_crq_hash(crq);
-+
-+ if (q->last_merge == crq->request)
-+ q->last_merge = NULL;
-+}
-+
-+static inline void cfq_add_crq_hash(struct cfq_data *cfqd, struct cfq_rq *crq)
-+{
-+ struct request *rq = crq->request;
-+
-+ BUG_ON(ON_MHASH(crq));
-+
-+ list_add(&crq->hash, &cfqd->crq_hash[CFQ_MHASH_FN(rq_hash_key(rq))]);
-+}
-+
-+static struct request *cfq_find_rq_hash(struct cfq_data *cfqd, sector_t offset)
-+{
-+ struct list_head *hash_list = &cfqd->crq_hash[CFQ_MHASH_FN(offset)];
-+ struct list_head *entry, *next = hash_list->next;
-+
-+ while ((entry = next) != hash_list) {
-+ struct cfq_rq *crq = list_entry_hash(entry);
-+ struct request *__rq = crq->request;
-+
-+ next = entry->next;
-+
-+ BUG_ON(!ON_MHASH(crq));
-+
-+ if (!rq_mergeable(__rq)) {
-+ __cfq_del_crq_hash(crq);
-+ continue;
-+ }
-+
-+ if (rq_hash_key(__rq) == offset)
-+ return __rq;
-+ }
-+
-+ return NULL;
-+}
-+
-+/*
-+ * rb tree support functions
-+ */
-+#define RB_NONE (2)
-+#define RB_EMPTY(node) ((node)->rb_node == NULL)
-+#define RB_CLEAR(node) ((node)->rb_color = RB_NONE)
-+#define RB_CLEAR_ROOT(root) ((root)->rb_node = NULL)
-+#define ON_RB(node) ((node)->rb_color != RB_NONE)
-+#define rb_entry_crq(node) rb_entry((node), struct cfq_rq, rb_node)
-+#define rq_rb_key(rq) (rq)->sector
-+
-+static inline void cfq_del_crq_rb(struct cfq_queue *cfqq, struct cfq_rq *crq)
-+{
-+ if (ON_RB(&crq->rb_node)) {
-+ cfqq->queued[rq_data_dir(crq->request)]--;
-+ rb_erase(&crq->rb_node, &cfqq->sort_list);
-+ crq->cfq_queue = NULL;
-+ }
-+}
-+
-+static struct cfq_rq *
-+__cfq_add_crq_rb(struct cfq_queue *cfqq, struct cfq_rq *crq)
-+{
-+ struct rb_node **p = &cfqq->sort_list.rb_node;
-+ struct rb_node *parent = NULL;
-+ struct cfq_rq *__crq;
-+
-+ while (*p) {
-+ parent = *p;
-+ __crq = rb_entry_crq(parent);
-+
-+ if (crq->rb_key < __crq->rb_key)
-+ p = &(*p)->rb_left;
-+ else if (crq->rb_key > __crq->rb_key)
-+ p = &(*p)->rb_right;
-+ else
-+ return __crq;
-+ }
-+
-+ rb_link_node(&crq->rb_node, parent, p);
-+ return 0;
-+}
-+
-+static void
-+cfq_add_crq_rb(struct cfq_data *cfqd, struct cfq_queue *cfqq,struct cfq_rq *crq)
-+{
-+ struct request *rq = crq->request;
-+ struct cfq_rq *__alias;
-+
-+ crq->rb_key = rq_rb_key(rq);
-+ cfqq->queued[rq_data_dir(rq)]++;
-+retry:
-+ __alias = __cfq_add_crq_rb(cfqq, crq);
-+ if (!__alias) {
-+ rb_insert_color(&crq->rb_node, &cfqq->sort_list);
-+ crq->cfq_queue = cfqq;
-+ return;
-+ }
-+
-+ cfq_del_crq_rb(cfqq, __alias);
-+ cfq_dispatch_sort(cfqd->dispatch, __alias);
-+ goto retry;
-+}
-+
-+static struct request *
-+cfq_find_rq_rb(struct cfq_data *cfqd, sector_t sector)
-+{
-+ struct cfq_queue *cfqq = cfq_find_cfq_hash(cfqd, current->tgid);
-+ struct rb_node *n;
-+
-+ if (!cfqq)
-+ goto out;
-+
-+ n = cfqq->sort_list.rb_node;
-+ while (n) {
-+ struct cfq_rq *crq = rb_entry_crq(n);
-+
-+ if (sector < crq->rb_key)
-+ n = n->rb_left;
-+ else if (sector > crq->rb_key)
-+ n = n->rb_right;
-+ else
-+ return crq->request;
-+ }
-+
-+out:
-+ return NULL;
-+}
-+
-+static void cfq_remove_request(request_queue_t *q, struct request *rq)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct cfq_rq *crq = RQ_DATA(rq);
-+
-+ if (crq) {
-+ struct cfq_queue *cfqq = crq->cfq_queue;
-+
-+ cfq_remove_merge_hints(q, crq);
-+ list_del_init(&rq->queuelist);
-+
-+ if (cfqq) {
-+ cfq_del_crq_rb(cfqq, crq);
-+
-+ if (RB_EMPTY(&cfqq->sort_list))
-+ cfq_put_queue(cfqd, cfqq);
-+ }
-+ }
-+}
-+
-+static int
-+cfq_merge(request_queue_t *q, struct request **req, struct bio *bio)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct request *__rq;
-+ int ret;
-+
-+ ret = elv_try_last_merge(q, bio);
-+ if (ret != ELEVATOR_NO_MERGE) {
-+ __rq = q->last_merge;
-+ goto out_insert;
-+ }
-+
-+ __rq = cfq_find_rq_hash(cfqd, bio->bi_sector);
-+ if (__rq) {
-+ BUG_ON(__rq->sector + __rq->nr_sectors != bio->bi_sector);
-+
-+ if (elv_rq_merge_ok(__rq, bio)) {
-+ ret = ELEVATOR_BACK_MERGE;
-+ goto out;
-+ }
-+ }
-+
-+ __rq = cfq_find_rq_rb(cfqd, bio->bi_sector + bio_sectors(bio));
-+ if (__rq) {
-+ if (elv_rq_merge_ok(__rq, bio)) {
-+ ret = ELEVATOR_FRONT_MERGE;
-+ goto out;
-+ }
-+ }
-+
-+ return ELEVATOR_NO_MERGE;
-+out:
-+ q->last_merge = __rq;
-+out_insert:
-+ *req = __rq;
-+ return ret;
-+}
-+
-+static void cfq_merged_request(request_queue_t *q, struct request *req)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct cfq_rq *crq = RQ_DATA(req);
-+
-+ cfq_del_crq_hash(crq);
-+ cfq_add_crq_hash(cfqd, crq);
-+
-+ if (ON_RB(&crq->rb_node) && (rq_rb_key(req) != crq->rb_key)) {
-+ struct cfq_queue *cfqq = crq->cfq_queue;
-+
-+ cfq_del_crq_rb(cfqq, crq);
-+ cfq_add_crq_rb(cfqd, cfqq, crq);
-+ }
-+
-+ q->last_merge = req;
-+}
-+
-+static void
-+cfq_merged_requests(request_queue_t *q, struct request *req,
-+ struct request *next)
-+{
-+ cfq_merged_request(q, req);
-+ cfq_remove_request(q, next);
-+}
-+
-+static void cfq_dispatch_sort(struct list_head *head, struct cfq_rq *crq)
-+{
-+ struct list_head *entry = head;
-+ struct request *__rq;
-+
-+ if (!list_empty(head)) {
-+ __rq = list_entry_rq(head->next);
-+
-+ if (crq->request->sector < __rq->sector) {
-+ entry = head->prev;
-+ goto link;
-+ }
-+ }
-+
-+ while ((entry = entry->prev) != head) {
-+ __rq = list_entry_rq(entry);
-+
-+ if (crq->request->sector <= __rq->sector)
-+ break;
-+ }
-+
-+link:
-+ list_add_tail(&crq->request->queuelist, entry);
-+}
-+
-+static inline void
-+__cfq_dispatch_requests(request_queue_t *q, struct cfq_data *cfqd,
-+ struct cfq_queue *cfqq)
-+{
-+ struct cfq_rq *crq = rb_entry_crq(rb_first(&cfqq->sort_list));
-+
-+ cfq_del_crq_rb(cfqq, crq);
-+ cfq_remove_merge_hints(q, crq);
-+ cfq_dispatch_sort(cfqd->dispatch, crq);
-+}
-+
-+static int cfq_dispatch_requests(request_queue_t *q, struct cfq_data *cfqd)
-+{
-+ struct cfq_queue *cfqq;
-+ struct list_head *entry, *tmp;
-+ int ret, queued, good_queues;
-+
-+ if (list_empty(&cfqd->rr_list))
-+ return 0;
-+
-+ queued = ret = 0;
-+restart:
-+ good_queues = 0;
-+ list_for_each_safe(entry, tmp, &cfqd->rr_list) {
-+ cfqq = list_entry_cfqq(cfqd->rr_list.next);
-+
-+ BUG_ON(RB_EMPTY(&cfqq->sort_list));
-+
-+ __cfq_dispatch_requests(q, cfqd, cfqq);
-+
-+ if (RB_EMPTY(&cfqq->sort_list))
-+ cfq_put_queue(cfqd, cfqq);
-+ else
-+ good_queues++;
-+
-+ queued++;
-+ ret = 1;
-+ }
-+
-+ if ((queued < cfq_quantum) && good_queues)
-+ goto restart;
-+
-+ return ret;
-+}
-+
-+static struct request *cfq_next_request(request_queue_t *q)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct request *rq;
-+
-+ if (!list_empty(cfqd->dispatch)) {
-+ struct cfq_rq *crq;
-+dispatch:
-+ rq = list_entry_rq(cfqd->dispatch->next);
-+
-+ BUG_ON(q->last_merge == rq);
-+ crq = RQ_DATA(rq);
-+ if (crq)
-+ BUG_ON(ON_MHASH(crq));
-+
-+ return rq;
-+ }
-+
-+ if (cfq_dispatch_requests(q, cfqd))
-+ goto dispatch;
-+
-+ return NULL;
-+}
-+
-+static inline struct cfq_queue *
-+__cfq_find_cfq_hash(struct cfq_data *cfqd, int pid, const int hashval)
-+{
-+ struct list_head *hash_list = &cfqd->cfq_hash[hashval];
-+ struct list_head *entry;
-+
-+ list_for_each(entry, hash_list) {
-+ struct cfq_queue *__cfqq = list_entry_qhash(entry);
-+
-+ if (__cfqq->pid == pid)
-+ return __cfqq;
-+ }
-+
-+ return NULL;
-+}
-+
-+static struct cfq_queue *cfq_find_cfq_hash(struct cfq_data *cfqd, int pid)
-+{
-+ const int hashval = hash_long(current->tgid, CFQ_QHASH_SHIFT);
-+
-+ return __cfq_find_cfq_hash(cfqd, pid, hashval);
-+}
-+
-+static void cfq_put_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
-+{
-+ cfqd->busy_queues--;
-+ list_del(&cfqq->cfq_list);
-+ list_del(&cfqq->cfq_hash);
-+ mempool_free(cfqq, cfq_mpool);
-+}
-+
-+static struct cfq_queue *cfq_get_queue(struct cfq_data *cfqd, int pid)
-+{
-+ const int hashval = hash_long(current->tgid, CFQ_QHASH_SHIFT);
-+ struct cfq_queue *cfqq = __cfq_find_cfq_hash(cfqd, pid, hashval);
-+
-+ if (!cfqq) {
-+ cfqq = mempool_alloc(cfq_mpool, GFP_NOIO);
-+
-+ INIT_LIST_HEAD(&cfqq->cfq_hash);
-+ INIT_LIST_HEAD(&cfqq->cfq_list);
-+ RB_CLEAR_ROOT(&cfqq->sort_list);
-+
-+ cfqq->pid = pid;
-+ cfqq->queued[0] = cfqq->queued[1] = 0;
-+ list_add(&cfqq->cfq_hash, &cfqd->cfq_hash[hashval]);
-+ }
-+
-+ return cfqq;
-+}
-+
-+static void cfq_enqueue(struct cfq_data *cfqd, struct cfq_rq *crq)
-+{
-+ struct cfq_queue *cfqq;
-+
-+ cfqq = cfq_get_queue(cfqd, current->tgid);
-+
-+ cfq_add_crq_rb(cfqd, cfqq, crq);
-+
-+ if (list_empty(&cfqq->cfq_list)) {
-+ list_add(&cfqq->cfq_list, &cfqd->rr_list);
-+ cfqd->busy_queues++;
-+ }
-+}
-+
-+static void
-+cfq_insert_request(request_queue_t *q, struct request *rq, int where)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct cfq_rq *crq = RQ_DATA(rq);
-+
-+ switch (where) {
-+ case ELEVATOR_INSERT_BACK:
-+ while (cfq_dispatch_requests(q, cfqd))
-+ ;
-+ list_add_tail(&rq->queuelist, cfqd->dispatch);
-+ break;
-+ case ELEVATOR_INSERT_FRONT:
-+ list_add(&rq->queuelist, cfqd->dispatch);
-+ break;
-+ case ELEVATOR_INSERT_SORT:
-+ BUG_ON(!blk_fs_request(rq));
-+ cfq_enqueue(cfqd, crq);
-+ break;
-+ default:
-+ printk("%s: bad insert point %d\n", __FUNCTION__,where);
-+ return;
-+ }
-+
-+ if (rq_mergeable(rq)) {
-+ cfq_add_crq_hash(cfqd, crq);
-+
-+ if (!q->last_merge)
-+ q->last_merge = rq;
-+ }
-+}
-+
-+static int cfq_queue_empty(request_queue_t *q)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+
-+ if (list_empty(cfqd->dispatch) && list_empty(&cfqd->rr_list))
-+ return 1;
-+
-+ return 0;
-+}
-+
-+static struct request *
-+cfq_former_request(request_queue_t *q, struct request *rq)
-+{
-+ struct cfq_rq *crq = RQ_DATA(rq);
-+ struct rb_node *rbprev = rb_prev(&crq->rb_node);
-+
-+ if (rbprev)
-+ return rb_entry_crq(rbprev)->request;
-+
-+ return NULL;
-+}
-+
-+static struct request *
-+cfq_latter_request(request_queue_t *q, struct request *rq)
-+{
-+ struct cfq_rq *crq = RQ_DATA(rq);
-+ struct rb_node *rbnext = rb_next(&crq->rb_node);
-+
-+ if (rbnext)
-+ return rb_entry_crq(rbnext)->request;
-+
-+ return NULL;
-+}
-+
-+static int cfq_may_queue(request_queue_t *q, int rw)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct cfq_queue *cfqq;
-+ int ret = 1;
-+
-+ if (!cfqd->busy_queues)
-+ goto out;
-+
-+ cfqq = cfq_find_cfq_hash(cfqd, current->tgid);
-+ if (cfqq) {
-+ int limit = (q->nr_requests - cfq_queued) / cfqd->busy_queues;
-+
-+ if (limit < 3)
-+ limit = 3;
-+ else if (limit > cfqd->max_queued)
-+ limit = cfqd->max_queued;
-+
-+ if (cfqq->queued[rw] > limit)
-+ ret = 0;
-+ }
-+out:
-+ return ret;
-+}
-+
-+static void cfq_put_request(request_queue_t *q, struct request *rq)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct cfq_rq *crq = RQ_DATA(rq);
-+
-+ if (crq) {
-+ BUG_ON(q->last_merge == rq);
-+ BUG_ON(ON_MHASH(crq));
-+
-+ mempool_free(crq, cfqd->crq_pool);
-+ rq->elevator_private = NULL;
-+ }
-+}
-+
-+static int cfq_set_request(request_queue_t *q, struct request *rq, int gfp_mask)
-+{
-+ struct cfq_data *cfqd = q->elevator.elevator_data;
-+ struct cfq_rq *crq = mempool_alloc(cfqd->crq_pool, gfp_mask);
-+
-+ if (crq) {
-+ RB_CLEAR(&crq->rb_node);
-+ crq->request = rq;
-+ crq->cfq_queue = NULL;
-+ INIT_LIST_HEAD(&crq->hash);
-+ rq->elevator_private = crq;
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+static void cfq_exit(request_queue_t *q, elevator_t *e)
-+{
-+ struct cfq_data *cfqd = e->elevator_data;
-+
-+ e->elevator_data = NULL;
-+ mempool_destroy(cfqd->crq_pool);
-+ kfree(cfqd->crq_hash);
-+ kfree(cfqd->cfq_hash);
-+ kfree(cfqd);
-+}
-+
-+static int cfq_init(request_queue_t *q, elevator_t *e)
-+{
-+ struct cfq_data *cfqd;
-+ int i;
-+
-+ cfqd = kmalloc(sizeof(*cfqd), GFP_KERNEL);
-+ if (!cfqd)
-+ return -ENOMEM;
-+
-+ memset(cfqd, 0, sizeof(*cfqd));
-+ INIT_LIST_HEAD(&cfqd->rr_list);
-+
-+ cfqd->crq_hash = kmalloc(sizeof(struct list_head) * CFQ_MHASH_ENTRIES, GFP_KERNEL);
-+ if (!cfqd->crq_hash)
-+ goto out_crqhash;
-+
-+ cfqd->cfq_hash = kmalloc(sizeof(struct list_head) * CFQ_QHASH_ENTRIES, GFP_KERNEL);
-+ if (!cfqd->cfq_hash)
-+ goto out_cfqhash;
-+
-+ cfqd->crq_pool = mempool_create(BLKDEV_MIN_RQ, mempool_alloc_slab, mempool_free_slab, crq_pool);
-+ if (!cfqd->crq_pool)
-+ goto out_crqpool;
-+
-+ for (i = 0; i < CFQ_MHASH_ENTRIES; i++)
-+ INIT_LIST_HEAD(&cfqd->crq_hash[i]);
-+ for (i = 0; i < CFQ_QHASH_ENTRIES; i++)
-+ INIT_LIST_HEAD(&cfqd->cfq_hash[i]);
-+
-+ cfqd->dispatch = &q->queue_head;
-+ e->elevator_data = cfqd;
-+
-+ /*
-+ * just set it to some high value, we want anyone to be able to queue
-+ * some requests. fairness is handled differently
-+ */
-+ cfqd->max_queued = q->nr_requests;
-+ q->nr_requests = 8192;
-+
-+ return 0;
-+out_crqpool:
-+ kfree(cfqd->cfq_hash);
-+out_cfqhash:
-+ kfree(cfqd->crq_hash);
-+out_crqhash:
-+ kfree(cfqd);
-+ return -ENOMEM;
-+}
-+
-+static int __init cfq_slab_setup(void)
-+{
-+ crq_pool = kmem_cache_create("crq_pool", sizeof(struct cfq_rq), 0, 0,
-+ NULL, NULL);
-+
-+ if (!crq_pool)
-+ panic("cfq_iosched: can't init crq pool\n");
-+
-+ cfq_pool = kmem_cache_create("cfq_pool", sizeof(struct cfq_queue), 0, 0,
-+ NULL, NULL);
-+
-+ if (!cfq_pool)
-+ panic("cfq_iosched: can't init cfq pool\n");
-+
-+ cfq_mpool = mempool_create(64, mempool_alloc_slab, mempool_free_slab, cfq_pool);
-+
-+ if (!cfq_mpool)
-+ panic("cfq_iosched: can't init cfq mpool\n");
-+
-+ return 0;
-+}
-+
-+subsys_initcall(cfq_slab_setup);
-+
-+elevator_t iosched_cfq = {
-+ .elevator_name = "cfq",
-+ .elevator_merge_fn = cfq_merge,
-+ .elevator_merged_fn = cfq_merged_request,
-+ .elevator_merge_req_fn = cfq_merged_requests,
-+ .elevator_next_req_fn = cfq_next_request,
-+ .elevator_add_req_fn = cfq_insert_request,
-+ .elevator_remove_req_fn = cfq_remove_request,
-+ .elevator_queue_empty_fn = cfq_queue_empty,
-+ .elevator_former_req_fn = cfq_former_request,
-+ .elevator_latter_req_fn = cfq_latter_request,
-+ .elevator_set_req_fn = cfq_set_request,
-+ .elevator_put_req_fn = cfq_put_request,
-+ .elevator_may_queue_fn = cfq_may_queue,
-+ .elevator_init_fn = cfq_init,
-+ .elevator_exit_fn = cfq_exit,
-+};
-+
-+EXPORT_SYMBOL(iosched_cfq);
---- linux-2.6.0/drivers/block/cpqarray.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/cpqarray.c 2003-12-28 23:21:17.000000000 -0800
-@@ -128,9 +128,9 @@ static int sendcmd(
- unsigned int blkcnt,
- unsigned int log_unit );
-
--static int ida_open(struct inode *inode, struct file *filep);
--static int ida_release(struct inode *inode, struct file *filep);
--static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg);
-+static int ida_open(struct block_device *bdev, struct file *filep);
-+static int ida_release(struct gendisk *disk);
-+static int ida_ioctl(struct block_device *bdev, struct file *filep, unsigned int cmd, unsigned long arg);
- static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io);
-
- static void do_ida_request(request_queue_t *q);
-@@ -715,12 +715,12 @@ DBGINFO(
- /*
- * Open. Make sure the device is really there.
- */
--static int ida_open(struct inode *inode, struct file *filep)
-+static int ida_open(struct block_device *bdev, struct file *filep)
- {
-- drv_info_t *drv = get_drv(inode->i_bdev->bd_disk);
-- ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-+ drv_info_t *drv = get_drv(bdev->bd_disk);
-+ ctlr_info_t *host = get_host(bdev->bd_disk);
-
-- DBGINFO(printk("ida_open %s\n", inode->i_bdev->bd_disk->disk_name));
-+ DBGINFO(printk("ida_open %s\n", bdev->bd_disk->disk_name));
- /*
- * Root is allowed to open raw volume zero even if it's not configured
- * so array config can still work. I don't think I really like this,
-@@ -740,9 +740,9 @@ static int ida_open(struct inode *inode,
- /*
- * Close. Sync first.
- */
--static int ida_release(struct inode *inode, struct file *filep)
-+static int ida_release(struct gendisk *disk)
- {
-- ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-+ ctlr_info_t *host = get_host(disk);
- host->usage_count--;
- return 0;
- }
-@@ -1022,10 +1022,10 @@ static void ida_timer(unsigned long tdat
- * ida_ioctl does some miscellaneous stuff like reporting drive geometry,
- * setting readahead and submitting commands from userspace to the controller.
- */
--static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
-+static int ida_ioctl(struct block_device *bdev, struct file *filep, unsigned int cmd, unsigned long arg)
- {
-- drv_info_t *drv = get_drv(inode->i_bdev->bd_disk);
-- ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
-+ drv_info_t *drv = get_drv(bdev->bd_disk);
-+ ctlr_info_t *host = get_host(bdev->bd_disk);
- int error;
- int diskinfo[4];
- struct hd_geometry *geo = (struct hd_geometry *)arg;
-@@ -1046,7 +1046,7 @@ static int ida_ioctl(struct inode *inode
- put_user(diskinfo[0], &geo->heads);
- put_user(diskinfo[1], &geo->sectors);
- put_user(diskinfo[2], &geo->cylinders);
-- put_user(get_start_sect(inode->i_bdev), &geo->start);
-+ put_user(get_start_sect(bdev), &geo->start);
- return 0;
- case IDAGETDRVINFO:
- if (copy_to_user(&io->c.drv, drv, sizeof(drv_info_t)))
-@@ -1076,7 +1076,7 @@ out_passthru:
- put_user(host->ctlr_sig, (int*)arg);
- return 0;
- case IDAREVALIDATEVOLS:
-- if (iminor(inode) != 0)
-+ if (bdev != bdev->bd_contains || drv != host->drv)
- return -ENXIO;
- return revalidate_allvol(host);
- case IDADRIVERVERSION:
---- linux-2.6.0/drivers/block/cryptoloop.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/cryptoloop.c 2003-12-28 23:21:53.000000000 -0800
-@@ -87,43 +87,49 @@ typedef int (*encdec_ecb_t)(struct crypt
-
-
- static int
--cryptoloop_transfer_ecb(struct loop_device *lo, int cmd, char *raw_buf,
-- char *loop_buf, int size, sector_t IV)
-+cryptoloop_transfer_ecb(struct loop_device *lo, int cmd,
-+ struct page *raw_page, unsigned raw_off,
-+ struct page *loop_page, unsigned loop_off,
-+ int size, sector_t IV)
- {
- struct crypto_tfm *tfm = (struct crypto_tfm *) lo->key_data;
- struct scatterlist sg_out = { 0, };
- struct scatterlist sg_in = { 0, };
-
- encdec_ecb_t encdecfunc;
-- char const *in;
-- char *out;
-+ struct page *in_page, *out_page;
-+ unsigned in_offs, out_offs;
-
- if (cmd == READ) {
-- in = raw_buf;
-- out = loop_buf;
-+ in_page = raw_page;
-+ in_offs = raw_off;
-+ out_page = loop_page;
-+ out_offs = loop_off;
- encdecfunc = tfm->crt_u.cipher.cit_decrypt;
- } else {
-- in = loop_buf;
-- out = raw_buf;
-+ in_page = loop_page;
-+ in_offs = loop_off;
-+ out_page = raw_page;
-+ out_offs = raw_off;
- encdecfunc = tfm->crt_u.cipher.cit_encrypt;
- }
-
- while (size > 0) {
- const int sz = min(size, LOOP_IV_SECTOR_SIZE);
-
-- sg_in.page = virt_to_page(in);
-- sg_in.offset = (unsigned long)in & ~PAGE_MASK;
-+ sg_in.page = in_page;
-+ sg_in.offset = in_offs;
- sg_in.length = sz;
-
-- sg_out.page = virt_to_page(out);
-- sg_out.offset = (unsigned long)out & ~PAGE_MASK;
-+ sg_out.page = out_page;
-+ sg_out.offset = out_offs;
- sg_out.length = sz;
-
- encdecfunc(tfm, &sg_out, &sg_in, sz);
-
- size -= sz;
-- in += sz;
-- out += sz;
-+ in_offs += sz;
-+ out_offs += sz;
- }
-
- return 0;
-@@ -135,24 +141,30 @@ typedef int (*encdec_cbc_t)(struct crypt
- unsigned int nsg, u8 *iv);
-
- static int
--cryptoloop_transfer_cbc(struct loop_device *lo, int cmd, char *raw_buf,
-- char *loop_buf, int size, sector_t IV)
-+cryptoloop_transfer_cbc(struct loop_device *lo, int cmd,
-+ struct page *raw_page, unsigned raw_off,
-+ struct page *loop_page, unsigned loop_off,
-+ int size, sector_t IV)
- {
- struct crypto_tfm *tfm = (struct crypto_tfm *) lo->key_data;
- struct scatterlist sg_out = { 0, };
- struct scatterlist sg_in = { 0, };
-
- encdec_cbc_t encdecfunc;
-- char const *in;
-- char *out;
-+ struct page *in_page, *out_page;
-+ unsigned in_offs, out_offs;
-
- if (cmd == READ) {
-- in = raw_buf;
-- out = loop_buf;
-+ in_page = raw_page;
-+ in_offs = raw_off;
-+ out_page = loop_page;
-+ out_offs = loop_off;
- encdecfunc = tfm->crt_u.cipher.cit_decrypt_iv;
- } else {
-- in = loop_buf;
-- out = raw_buf;
-+ in_page = loop_page;
-+ in_offs = loop_off;
-+ out_page = raw_page;
-+ out_offs = raw_off;
- encdecfunc = tfm->crt_u.cipher.cit_encrypt_iv;
- }
-
-@@ -161,39 +173,43 @@ cryptoloop_transfer_cbc(struct loop_devi
- u32 iv[4] = { 0, };
- iv[0] = cpu_to_le32(IV & 0xffffffff);
-
-- sg_in.page = virt_to_page(in);
-- sg_in.offset = offset_in_page(in);
-+ sg_in.page = in_page;
-+ sg_in.offset = in_offs;
- sg_in.length = sz;
-
-- sg_out.page = virt_to_page(out);
-- sg_out.offset = offset_in_page(out);
-+ sg_out.page = out_page;
-+ sg_out.offset = out_offs;
- sg_out.length = sz;
-
- encdecfunc(tfm, &sg_out, &sg_in, sz, (u8 *)iv);
-
- IV++;
- size -= sz;
-- in += sz;
-- out += sz;
-+ in_offs += sz;
-+ out_offs += sz;
- }
-
- return 0;
- }
-
- static int
--cryptoloop_transfer(struct loop_device *lo, int cmd, char *raw_buf,
-- char *loop_buf, int size, sector_t IV)
-+cryptoloop_transfer(struct loop_device *lo, int cmd,
-+ struct page *raw_page, unsigned raw_off,
-+ struct page *loop_page, unsigned loop_off,
-+ int size, sector_t IV)
- {
- struct crypto_tfm *tfm = (struct crypto_tfm *) lo->key_data;
- if(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB)
- {
- lo->transfer = cryptoloop_transfer_ecb;
-- return cryptoloop_transfer_ecb(lo, cmd, raw_buf, loop_buf, size, IV);
-+ return cryptoloop_transfer_ecb(lo, cmd, raw_page, raw_off,
-+ loop_page, loop_off, size, IV);
- }
- if(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_CBC)
- {
- lo->transfer = cryptoloop_transfer_cbc;
-- return cryptoloop_transfer_cbc(lo, cmd, raw_buf, loop_buf, size, IV);
-+ return cryptoloop_transfer_cbc(lo, cmd, raw_page, raw_off,
-+ loop_page, loop_off, size, IV);
- }
-
- /* This is not supposed to happen */
---- linux-2.6.0/drivers/block/DAC960.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/DAC960.c 2003-12-28 23:22:28.000000000 -0800
-@@ -67,9 +67,9 @@ static long disk_size(DAC960_Controller_
- }
- }
-
--static int DAC960_open(struct inode *inode, struct file *file)
-+static int DAC960_open(struct block_device *bdev, struct file *file)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- DAC960_Controller_T *p = disk->queue->queuedata;
- int drive_nr = (long)disk->private_data;
-
-@@ -84,17 +84,17 @@ static int DAC960_open(struct inode *ino
- return -ENXIO;
- }
-
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
-
- if (!get_capacity(p->disks[drive_nr]))
- return -ENXIO;
- return 0;
- }
-
--static int DAC960_ioctl(struct inode *inode, struct file *file,
-+static int DAC960_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- DAC960_Controller_T *p = disk->queue->queuedata;
- int drive_nr = (long)disk->private_data;
- struct hd_geometry g, *loc = (struct hd_geometry *)arg;
-@@ -128,7 +128,7 @@ static int DAC960_ioctl(struct inode *in
- g.cylinders = i->ConfigurableDeviceSize / (g.heads * g.sectors);
- }
-
-- g.start = get_start_sect(inode->i_bdev);
-+ g.start = get_start_sect(bdev);
-
- return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0;
- }
-@@ -2474,7 +2474,6 @@ static boolean DAC960_V2_ReportDeviceCon
- static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
- {
- int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
-- struct request_queue *RequestQueue;
- int n;
-
- /*
-@@ -2483,26 +2482,22 @@ static boolean DAC960_RegisterBlockDevic
- if (register_blkdev(MajorNumber, "dac960") < 0)
- return false;
-
-- /*
-- Initialize the I/O Request Queue.
-- */
-- RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
-- if (!RequestQueue) {
-- unregister_blkdev(MajorNumber, "dac960");
-- return false;
-- }
-- Controller->RequestQueue = RequestQueue;
-- blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
-- RequestQueue->queuedata = Controller;
-- blk_queue_max_hw_segments(RequestQueue,
-- Controller->DriverScatterGatherLimit);
-- blk_queue_max_phys_segments(RequestQueue,
-- Controller->DriverScatterGatherLimit);
-- blk_queue_max_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
--
- for (n = 0; n < DAC960_MaxLogicalDrives; n++) {
- struct gendisk *disk = Controller->disks[n];
-+ struct request_queue *RequestQueue;
-
-+ /* for now, let all request queues share controller's lock */
-+ RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
-+ if (!RequestQueue) {
-+ printk("DAC960: failure to allocate request queue\n");
-+ continue;
-+ }
-+ Controller->RequestQueue[n] = RequestQueue;
-+ blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
-+ RequestQueue->queuedata = Controller;
-+ blk_queue_max_hw_segments(RequestQueue, Controller->DriverScatterGatherLimit);
-+ blk_queue_max_phys_segments(RequestQueue, Controller->DriverScatterGatherLimit);
-+ blk_queue_max_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
- disk->queue = RequestQueue;
- sprintf(disk->disk_name, "rd/c%dd%d", Controller->ControllerNumber, n);
- sprintf(disk->devfs_name, "rd/host%d/target%d", Controller->ControllerNumber, n);
-@@ -2527,17 +2522,17 @@ static void DAC960_UnregisterBlockDevice
- int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
- int disk;
-
-- for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++)
-- del_gendisk(Controller->disks[disk]);
-+ /* does order matter when deleting gendisk and cleanup in request queue? */
-+ for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
-+ del_gendisk(Controller->disks[disk]);
-+ blk_cleanup_queue(Controller->RequestQueue[disk]);
-+ Controller->RequestQueue[disk] = NULL;
-+ }
-
- /*
- Unregister the Block Device Major Number for this DAC960 Controller.
- */
- unregister_blkdev(MajorNumber, "dac960");
-- /*
-- Remove the I/O Request Queue.
-- */
-- blk_cleanup_queue(Controller->RequestQueue);
- }
-
- /*
-@@ -3253,58 +3248,83 @@ static void DAC960_V2_QueueReadWriteComm
- }
-
-
-+static int DAC960_process_queue(DAC960_Controller_T *Controller, struct request_queue *req_q)
-+{
-+ struct request *Request;
-+ DAC960_Command_T *Command;
-+
-+ while(1) {
-+ Request = elv_next_request(req_q);
-+ if (!Request)
-+ return 1;
-+
-+ Command = DAC960_AllocateCommand(Controller);
-+ if (Command == NULL)
-+ return 0;
-+
-+ if (rq_data_dir(Request) == READ) {
-+ Command->DmaDirection = PCI_DMA_FROMDEVICE;
-+ Command->CommandType = DAC960_ReadCommand;
-+ } else {
-+ Command->DmaDirection = PCI_DMA_TODEVICE;
-+ Command->CommandType = DAC960_WriteCommand;
-+ }
-+ Command->Completion = Request->waiting;
-+ Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
-+ Command->BlockNumber = Request->sector;
-+ Command->BlockCount = Request->nr_sectors;
-+ Command->Request = Request;
-+ blkdev_dequeue_request(Request);
-+ Command->SegmentCount = blk_rq_map_sg(req_q,
-+ Command->Request, Command->cmd_sglist);
-+ /* pci_map_sg MAY change the value of SegCount */
-+ Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
-+ Command->SegmentCount, Command->DmaDirection);
-+
-+ DAC960_QueueReadWriteCommand(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)
-+static void DAC960_ProcessRequest(DAC960_Controller_T *controller)
- {
-- struct request_queue *RequestQueue = Controller->RequestQueue;
-- struct request *Request;
-- DAC960_Command_T *Command;
-+ int i;
-
-- if (!Controller->ControllerInitialized)
-- return false;
-+ if (!controller->ControllerInitialized)
-+ return;
-
-- while (true) {
-- Request = elv_next_request(RequestQueue);
-- if (!Request)
-- return false;
-+ /* Do this better later! */
-+ for (i = controller->req_q_index; i < DAC960_MaxLogicalDrives; i++) {
-+ struct request_queue *req_q = controller->RequestQueue[i];
-
-- Command = DAC960_AllocateCommand(Controller);
-- if (Command != NULL)
-- break;
-+ if (req_q == NULL)
-+ continue;
-
-- if (!WaitForCommand)
-- return false;
-+ if (!DAC960_process_queue(controller, req_q)) {
-+ controller->req_q_index = i;
-+ return;
-+ }
-+ }
-
-- DAC960_WaitForCommand(Controller);
-- }
-- if (rq_data_dir(Request) == READ) {
-- Command->DmaDirection = PCI_DMA_FROMDEVICE;
-- Command->CommandType = DAC960_ReadCommand;
-- } else {
-- Command->DmaDirection = PCI_DMA_TODEVICE;
-- Command->CommandType = DAC960_WriteCommand;
-- }
-- Command->Completion = Request->waiting;
-- Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
-- Command->BlockNumber = Request->sector;
-- Command->BlockCount = Request->nr_sectors;
-- Command->Request = Request;
-- blkdev_dequeue_request(Request);
-- Command->SegmentCount = blk_rq_map_sg(Controller->RequestQueue,
-- Command->Request, Command->cmd_sglist);
-- /* pci_map_sg MAY change the value of SegCount */
-- Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
-- Command->SegmentCount, Command->DmaDirection);
-+ if (controller->req_q_index == 0)
-+ return;
-
-- DAC960_QueueReadWriteCommand(Command);
-- return true;
-+ for (i = 0; i < controller->req_q_index; i++) {
-+ struct request_queue *req_q = controller->RequestQueue[i];
-+
-+ if (req_q == NULL)
-+ continue;
-+
-+ if (!DAC960_process_queue(controller, req_q)) {
-+ controller->req_q_index = i;
-+ return;
-+ }
-+ }
- }
-
-
-@@ -3321,6 +3341,7 @@ static void DAC960_queue_partial_rw(DAC9
- {
- DAC960_Controller_T *Controller = Command->Controller;
- struct request *Request = Command->Request;
-+ struct request_queue *req_q = Controller->RequestQueue[Command->LogicalDriveNumber];
-
- if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
- Command->CommandType = DAC960_ReadRetryCommand;
-@@ -3333,11 +3354,9 @@ static void DAC960_queue_partial_rw(DAC9
- * code should almost never be called, just go with a
- * simple coding.
- */
-- (void)blk_rq_map_sg(Controller->RequestQueue, Command->Request,
-- Command->cmd_sglist);
-+ (void)blk_rq_map_sg(req_q, Command->Request, Command->cmd_sglist);
-
-- (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1,
-- Command->DmaDirection);
-+ (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1, Command->DmaDirection);
- /*
- * Resubmitting the request sector at a time is really tedious.
- * But, this should almost never happen. So, we're willing to pay
-@@ -3357,9 +3376,7 @@ static void DAC960_queue_partial_rw(DAC9
-
- static void DAC960_RequestFunction(struct request_queue *RequestQueue)
- {
-- int i = 0;
-- while (DAC960_ProcessRequest(RequestQueue->queuedata, (i++ == 0)))
-- ;
-+ DAC960_ProcessRequest(RequestQueue->queuedata);
- }
-
- /*
-@@ -5205,8 +5222,7 @@ static irqreturn_t DAC960_BA_InterruptHa
- 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))
-- ;
-+ DAC960_ProcessRequest(Controller);
- spin_unlock_irqrestore(&Controller->queue_lock, flags);
- return IRQ_HANDLED;
- }
-@@ -5249,8 +5265,7 @@ static irqreturn_t DAC960_LP_InterruptHa
- 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))
-- ;
-+ DAC960_ProcessRequest(Controller);
- spin_unlock_irqrestore(&Controller->queue_lock, flags);
- return IRQ_HANDLED;
- }
-@@ -5289,8 +5304,7 @@ static irqreturn_t DAC960_LA_InterruptHa
- 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))
-- ;
-+ DAC960_ProcessRequest(Controller);
- spin_unlock_irqrestore(&Controller->queue_lock, flags);
- return IRQ_HANDLED;
- }
-@@ -5329,8 +5343,7 @@ static irqreturn_t DAC960_PG_InterruptHa
- 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))
-- ;
-+ DAC960_ProcessRequest(Controller);
- spin_unlock_irqrestore(&Controller->queue_lock, flags);
- return IRQ_HANDLED;
- }
-@@ -5365,8 +5378,7 @@ static irqreturn_t DAC960_PD_InterruptHa
- 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))
-- ;
-+ DAC960_ProcessRequest(Controller);
- spin_unlock_irqrestore(&Controller->queue_lock, flags);
- return IRQ_HANDLED;
- }
-@@ -5440,8 +5452,7 @@ static irqreturn_t DAC960_P_InterruptHan
- 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))
-- ;
-+ DAC960_ProcessRequest(Controller);
- spin_unlock_irqrestore(&Controller->queue_lock, flags);
- return IRQ_HANDLED;
- }
---- linux-2.6.0/drivers/block/DAC960.h 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/block/DAC960.h 2003-12-28 23:22:28.000000000 -0800
-@@ -2333,7 +2333,8 @@ typedef struct DAC960_Controller
- DAC960_Command_T *FreeCommands;
- unsigned char *CombinedStatusBuffer;
- unsigned char *CurrentStatusBuffer;
-- struct request_queue *RequestQueue;
-+ struct request_queue *RequestQueue[DAC960_MaxLogicalDrives];
-+ int req_q_index;
- spinlock_t queue_lock;
- wait_queue_head_t CommandWaitQueue;
- wait_queue_head_t HealthStatusWaitQueue;
---- linux-2.6.0/drivers/block/floppy98.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/floppy98.c 2003-12-28 23:22:57.000000000 -0800
-@@ -2594,7 +2594,7 @@ static void copy_buffer(int ssize, int m
- current_count_sectors);
- if (CT(COMMAND) == FD_READ)
- printk("read\n");
-- if (CT(COMMAND) == FD_READ)
-+ if (CT(COMMAND) == FD_WRITE)
- printk("write\n");
- break;
- }
-@@ -2925,7 +2925,7 @@ static int make_raw_rw_request(void)
- current_count_sectors);
- if (CT(COMMAND) == FD_READ)
- printk("read\n");
-- if (CT(COMMAND) == FD_READ)
-+ if (CT(COMMAND) == FD_WRITE)
- printk("write\n");
- return 0;
- }
-@@ -3484,14 +3484,14 @@ static int get_floppy_geometry(int drive
- return 0;
- }
-
--static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
-+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int cmd,
- unsigned long param)
- {
- #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
- #define OUT(c,x) case c: outparam = (const char *) (x); break
- #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
-
-- int drive = (long)inode->i_bdev->bd_disk->private_data;
-+ int drive = (long)bdev->bd_disk->private_data;
- int i, type = ITYPE(UDRS->fd_device);
- int ret;
- int size;
-@@ -3566,11 +3566,11 @@ static int fd_ioctl(struct inode *inode,
- current_type[drive] = NULL;
- floppy_sizes[drive] = MAX_DISK_SIZE << 1;
- UDRS->keep_data = 0;
-- return invalidate_drive(inode->i_bdev);
-+ return invalidate_drive(bdev);
- case FDSETPRM:
- case FDDEFPRM:
- return set_geometry(cmd, & inparam.g,
-- drive, type, inode->i_bdev);
-+ drive, type, bdev);
- case FDGETPRM:
- ECALL(get_floppy_geometry(drive, type,
- (struct floppy_struct**)
-@@ -3625,7 +3625,7 @@ static int fd_ioctl(struct inode *inode,
- case FDFMTEND:
- case FDFLUSH:
- LOCK_FDC(drive,1);
-- return invalidate_drive(inode->i_bdev);
-+ return invalidate_drive(bdev);
-
- case FDSETEMSGTRESH:
- UDP->max_errors.reporting =
-@@ -3735,9 +3735,9 @@ static void __init config_types(void)
- printk("\n");
- }
-
--static int floppy_release(struct inode * inode, struct file * filp)
-+static int floppy_release(struct gendisk *disk)
- {
-- int drive = (long)inode->i_bdev->bd_disk->private_data;
-+ int drive = (long)disk->private_data;
-
- down(&open_lock);
- if (UDRS->fd_ref < 0)
-@@ -3758,11 +3758,10 @@ static int floppy_release(struct inode *
- * /dev/PS0 etc), and disallows simultaneous access to the same
- * drive with different device numbers.
- */
--#define RETERR(x) do{floppy_release(inode,filp); return -(x);}while(0)
-
--static int floppy_open(struct inode * inode, struct file * filp)
-+static int floppy_open(struct block_device *bdev, struct file *filp)
- {
-- int drive = (long)inode->i_bdev->bd_disk->private_data;
-+ int drive = (long)bdev->bd_disk->private_data;
- int old_dev;
- int try;
- int res = -EBUSY;
-@@ -3789,7 +3788,7 @@ static int floppy_open(struct inode * in
-
- down(&open_lock);
- old_dev = UDRS->fd_device;
-- if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
-+ if (opened_bdev[drive] && opened_bdev[drive] != bdev)
- goto out2;
-
- if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)){
-@@ -3809,7 +3808,7 @@ static int floppy_open(struct inode * in
- else
- UDRS->fd_ref++;
-
-- opened_bdev[drive] = inode->i_bdev;
-+ opened_bdev[drive] = bdev;
-
- res = -ENXIO;
-
-@@ -3844,9 +3843,9 @@ static int floppy_open(struct inode * in
- }
- }
-
-- UDRS->fd_device = iminor(inode);
-- set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
-- if (old_dev != -1 && old_dev != iminor(inode)) {
-+ UDRS->fd_device = MINOR(bdev->bd_dev);
-+ set_capacity(disks[drive], floppy_sizes[MINOR(bdev->bd_dev)]);
-+ if (old_dev != -1 && old_dev != MINOR(bdev->bd_dev)) {
- if (buffer_drive == drive)
- buffer_track = -1;
- }
-@@ -3859,8 +3858,7 @@ static int floppy_open(struct inode * in
- /* Allow ioctls if we have write-permissions even if read-only open.
- * Needed so that programs such as fdrawcmd still can work on write
- * protected disks */
-- if ((filp->f_mode & 2) ||
-- (inode->i_sb && (permission(inode,2) == 0)))
-+ if ((filp->f_mode & 2) || permission(filp->f_dentry->d_inode,2) == 0)
- filp->private_data = (void*) 8;
-
- if (UFDCS->rawcmd == 1)
-@@ -3873,7 +3871,7 @@ static int floppy_open(struct inode * in
- if (!(filp->f_flags & O_NDELAY)) {
- if (filp->f_mode & 3) {
- UDRS->last_checked = 0;
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- if (UTESTF(FD_DISK_CHANGED))
- goto out;
- }
---- linux-2.6.0/drivers/block/floppy.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/floppy.c 2003-12-28 23:22:57.000000000 -0800
-@@ -2563,7 +2563,7 @@ static void copy_buffer(int ssize, int m
- current_count_sectors);
- if (CT(COMMAND) == FD_READ)
- printk("read\n");
-- if (CT(COMMAND) == FD_READ)
-+ if (CT(COMMAND) == FD_WRITE)
- printk("write\n");
- break;
- }
-@@ -2894,7 +2894,7 @@ static int make_raw_rw_request(void)
- current_count_sectors);
- if (CT(COMMAND) == FD_READ)
- printk("read\n");
-- if (CT(COMMAND) == FD_READ)
-+ if (CT(COMMAND) == FD_WRITE)
- printk("write\n");
- return 0;
- }
-@@ -3456,14 +3456,14 @@ static int get_floppy_geometry(int drive
- return 0;
- }
-
--static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
-+static int fd_ioctl(struct block_device *bdev, struct file *filp, unsigned int cmd,
- unsigned long param)
- {
- #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
- #define OUT(c,x) case c: outparam = (const char *) (x); break
- #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
-
-- int drive = (long)inode->i_bdev->bd_disk->private_data;
-+ int drive = (long)bdev->bd_disk->private_data;
- int i, type = ITYPE(UDRS->fd_device);
- int ret;
- int size;
-@@ -3539,11 +3539,11 @@ static int fd_ioctl(struct inode *inode,
- current_type[drive] = NULL;
- floppy_sizes[drive] = MAX_DISK_SIZE << 1;
- UDRS->keep_data = 0;
-- return invalidate_drive(inode->i_bdev);
-+ return invalidate_drive(bdev);
- case FDSETPRM:
- case FDDEFPRM:
- return set_geometry(cmd, & inparam.g,
-- drive, type, inode->i_bdev);
-+ drive, type, bdev);
- case FDGETPRM:
- ECALL(get_floppy_geometry(drive, type,
- (struct floppy_struct**)
-@@ -3574,7 +3574,7 @@ static int fd_ioctl(struct inode *inode,
- case FDFMTEND:
- case FDFLUSH:
- LOCK_FDC(drive,1);
-- return invalidate_drive(inode->i_bdev);
-+ return invalidate_drive(bdev);
-
- case FDSETEMSGTRESH:
- UDP->max_errors.reporting =
-@@ -3685,9 +3685,9 @@ static void __init config_types(void)
- printk("\n");
- }
-
--static int floppy_release(struct inode * inode, struct file * filp)
-+static int floppy_release(struct gendisk *disk)
- {
-- int drive = (long)inode->i_bdev->bd_disk->private_data;
-+ int drive = (long)disk->private_data;
-
- down(&open_lock);
- if (UDRS->fd_ref < 0)
-@@ -3708,9 +3708,9 @@ static int floppy_release(struct inode *
- * /dev/PS0 etc), and disallows simultaneous access to the same
- * drive with different device numbers.
- */
--static int floppy_open(struct inode * inode, struct file * filp)
-+static int floppy_open(struct block_device *bdev, struct file * filp)
- {
-- int drive = (long)inode->i_bdev->bd_disk->private_data;
-+ int drive = (long)bdev->bd_disk->private_data;
- int old_dev;
- int try;
- int res = -EBUSY;
-@@ -3719,7 +3719,7 @@ static int floppy_open(struct inode * in
- filp->private_data = (void*) 0;
- down(&open_lock);
- old_dev = UDRS->fd_device;
-- if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
-+ if (opened_bdev[drive] && opened_bdev[drive] != bdev)
- goto out2;
-
- if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)){
-@@ -3739,7 +3739,7 @@ static int floppy_open(struct inode * in
- else
- UDRS->fd_ref++;
-
-- opened_bdev[drive] = inode->i_bdev;
-+ opened_bdev[drive] = bdev;
-
- res = -ENXIO;
-
-@@ -3774,9 +3774,9 @@ static int floppy_open(struct inode * in
- }
- }
-
-- UDRS->fd_device = iminor(inode);
-- set_capacity(disks[drive], floppy_sizes[iminor(inode)]);
-- if (old_dev != -1 && old_dev != iminor(inode)) {
-+ UDRS->fd_device = MINOR(bdev->bd_dev);
-+ set_capacity(disks[drive], floppy_sizes[MINOR(bdev->bd_dev)]);
-+ if (old_dev != -1 && old_dev != MINOR(bdev->bd_dev)) {
- if (buffer_drive == drive)
- buffer_track = -1;
- }
-@@ -3784,8 +3784,7 @@ static int floppy_open(struct inode * in
- /* Allow ioctls if we have write-permissions even if read-only open.
- * Needed so that programs such as fdrawcmd still can work on write
- * protected disks */
-- if ((filp->f_mode & 2) ||
-- (inode->i_sb && (permission(inode,2, NULL) == 0)))
-+ if ((filp->f_mode & 2) || permission(filp->f_dentry->d_inode,2,NULL) == 0)
- filp->private_data = (void*) 8;
-
- if (UFDCS->rawcmd == 1)
-@@ -3794,7 +3793,7 @@ static int floppy_open(struct inode * in
- if (!(filp->f_flags & O_NDELAY)) {
- if (filp->f_mode & 3) {
- UDRS->last_checked = 0;
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- if (UTESTF(FD_DISK_CHANGED))
- goto out;
- }
---- linux-2.6.0/drivers/block/genhd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/genhd.c 2003-12-28 23:21:42.000000000 -0800
-@@ -296,7 +296,9 @@ extern int blk_dev_init(void);
-
- static struct kobject *base_probe(dev_t dev, int *part, void *data)
- {
-- request_module("block-major-%d", MAJOR(dev));
-+ if (request_module("block-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
-+ /* Make old-style 2.4 aliases work */
-+ request_module("block-major-%d", MAJOR(dev));
- return NULL;
- }
-
---- linux-2.6.0/drivers/block/ioctl.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/ioctl.c 2003-12-28 23:21:22.000000000 -0800
-@@ -132,10 +132,9 @@ static int put_u64(unsigned long arg, u6
- return put_user(val, (u64 *)arg);
- }
-
--int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
-+int blkdev_ioctl(struct block_device *bdev, struct file *file, unsigned cmd,
- unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- struct gendisk *disk = bdev->bd_disk;
- struct backing_dev_info *bdi;
- int holder;
-@@ -194,7 +193,7 @@ int blkdev_ioctl(struct inode *inode, st
- if (!capable(CAP_SYS_ADMIN))
- return -EACCES;
- if (disk->fops->ioctl) {
-- ret = disk->fops->ioctl(inode, file, cmd, arg);
-+ ret = disk->fops->ioctl(bdev, file, cmd, arg);
- if (ret != -EINVAL)
- return ret;
- }
-@@ -203,7 +202,7 @@ int blkdev_ioctl(struct inode *inode, st
- return 0;
- case BLKROSET:
- if (disk->fops->ioctl) {
-- ret = disk->fops->ioctl(inode, file, cmd, arg);
-+ ret = disk->fops->ioctl(bdev, file, cmd, arg);
- if (ret != -EINVAL)
- return ret;
- }
-@@ -215,7 +214,7 @@ int blkdev_ioctl(struct inode *inode, st
- return 0;
- default:
- if (disk->fops->ioctl)
-- return disk->fops->ioctl(inode, file, cmd, arg);
-+ return disk->fops->ioctl(bdev, file, cmd, arg);
- }
- return -ENOTTY;
- }
---- linux-2.6.0/drivers/block/Kconfig.iosched 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/Kconfig.iosched 2003-12-28 23:21:35.000000000 -0800
-@@ -27,3 +27,10 @@ config IOSCHED_DEADLINE
- a disk at any one time, its behaviour is almost identical to the
- anticipatory I/O scheduler and so is a good choice.
-
-+config IOSCHED_CFQ
-+ bool "CFQ I/O scheduler" if EMBEDDED
-+ default y
-+ ---help---
-+ The CFQ I/O scheduler tries to distribute bandwidth equally
-+ among all processes in the system. It should provide a fair
-+ working environment, suitable for desktop systems.
---- linux-2.6.0/drivers/block/ll_rw_blk.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/block/ll_rw_blk.c 2003-12-28 23:26:41.000000000 -0800
-@@ -517,10 +517,10 @@ init_tag_map(request_queue_t *q, struct
- {
- int bits, i;
-
-- if (depth > q->nr_requests * 2) {
-- depth = q->nr_requests * 2;
-- printk(KERN_ERR "%s: adjusted depth to %d\n",
-- __FUNCTION__, depth);
-+ if (depth > q->nr_requests / 2) {
-+ q->nr_requests = depth * 2;
-+ printk(KERN_INFO "%s: large TCQ depth: adjusted nr_requests "
-+ "to %lu\n", __FUNCTION__, q->nr_requests);
- }
-
- tags->tag_index = kmalloc(depth * sizeof(struct request *), GFP_ATOMIC);
-@@ -780,11 +780,6 @@ static char *rq_flags[] = {
- "REQ_PM_SUSPEND",
- "REQ_PM_RESUME",
- "REQ_PM_SHUTDOWN",
-- "REQ_IDETAPE_PC1",
-- "REQ_IDETAPE_PC2",
-- "REQ_IDETAPE_READ",
-- "REQ_IDETAPE_WRITE",
-- "REQ_IDETAPE_READ_BUFFER",
- };
-
- void blk_dump_rq_flags(struct request *rq, char *msg)
-@@ -1335,6 +1330,8 @@ static elevator_t *chosen_elevator =
- &iosched_as;
- #elif defined(CONFIG_IOSCHED_DEADLINE)
- &iosched_deadline;
-+#elif defined(CONFIG_IOSCHED_CFQ)
-+ &iosched_cfq;
- #elif defined(CONFIG_IOSCHED_NOOP)
- &elevator_noop;
- #else
-@@ -1353,6 +1350,10 @@ static int __init elevator_setup(char *s
- if (!strcmp(str, "as"))
- chosen_elevator = &iosched_as;
- #endif
-+#ifdef CONFIG_IOSCHED_CFQ
-+ if (!strcmp(str, "cfq"))
-+ chosen_elevator = &iosched_cfq;
-+#endif
- #ifdef CONFIG_IOSCHED_NOOP
- if (!strcmp(str, "noop"))
- chosen_elevator = &elevator_noop;
-@@ -1875,29 +1876,52 @@ void blk_put_request(struct request *req
- spin_unlock_irqrestore(q->queue_lock, flags);
- }
- }
--
- EXPORT_SYMBOL(blk_put_request);
-
- /**
-- * blk_congestion_wait - wait for a queue to become uncongested
-+ * blk_congestion_wait_wq - wait for a queue to become uncongested,
- * @rw: READ or WRITE
- * @timeout: timeout in jiffies
-+ * @wait : wait queue entry to use for waiting or async notification
-+ * (NULL defaults to synchronous behaviour)
- *
- * Waits for up to @timeout jiffies for a queue (any queue) to exit congestion.
- * If no queues are congested then just wait for the next request to be
- * returned.
-+ *
-+ * If the wait queue parameter specifies an async i/o callback,
-+ * then instead of blocking, just register the callback on the wait
-+ * queue for async notification when the queue gets uncongested.
- */
--void blk_congestion_wait(int rw, long timeout)
-+int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait)
- {
-- DEFINE_WAIT(wait);
- wait_queue_head_t *wqh = &congestion_wqh[rw];
-+ DEFINE_WAIT(local_wait);
-+
-+ if (!wait)
-+ wait = &local_wait;
-
- blk_run_queues();
-- prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
-+ prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
-+ if (!is_sync_wait(wait)) {
-+ /*
-+ * if we've queued an async wait queue
-+ * callback do not block; just tell the
-+ * caller to return and retry later when
-+ * the callback is notified
-+ */
-+ return -EIOCBRETRY;
-+ }
- io_schedule_timeout(timeout);
-- finish_wait(wqh, &wait);
-+ finish_wait(wqh, wait);
-+ return 0;
- }
-+EXPORT_SYMBOL(blk_congestion_wait_wq);
-
-+void blk_congestion_wait(int rw, long timeout)
-+{
-+ blk_congestion_wait_wq(rw, timeout, NULL);
-+}
- EXPORT_SYMBOL(blk_congestion_wait);
-
- /*
---- linux-2.6.0/drivers/block/loop.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/loop.c 2003-12-28 23:21:54.000000000 -0800
-@@ -55,6 +55,7 @@
- #include <linux/errno.h>
- #include <linux/major.h>
- #include <linux/wait.h>
-+#include <linux/blkdev.h>
- #include <linux/blkpg.h>
- #include <linux/init.h>
- #include <linux/devfs_fs_kernel.h>
-@@ -75,24 +76,34 @@ static struct gendisk **disks;
- /*
- * Transfer functions
- */
--static int transfer_none(struct loop_device *lo, int cmd, char *raw_buf,
-- char *loop_buf, int size, sector_t real_block)
-+static int transfer_none(struct loop_device *lo, int cmd,
-+ struct page *raw_page, unsigned raw_off,
-+ struct page *loop_page, unsigned loop_off,
-+ int size, sector_t real_block)
- {
-- if (raw_buf != loop_buf) {
-- if (cmd == READ)
-- memcpy(loop_buf, raw_buf, size);
-- else
-- memcpy(raw_buf, loop_buf, size);
-- }
-+ char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off;
-+ char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off;
-+
-+ if (cmd == READ)
-+ memcpy(loop_buf, raw_buf, size);
-+ else
-+ memcpy(raw_buf, loop_buf, size);
-
-+ kunmap_atomic(raw_buf, KM_USER0);
-+ kunmap_atomic(loop_buf, KM_USER1);
-+ cond_resched();
- return 0;
- }
-
--static int transfer_xor(struct loop_device *lo, int cmd, char *raw_buf,
-- char *loop_buf, int size, sector_t real_block)
--{
-- char *in, *out, *key;
-- int i, keysize;
-+static int transfer_xor(struct loop_device *lo, int cmd,
-+ struct page *raw_page, unsigned raw_off,
-+ struct page *loop_page, unsigned loop_off,
-+ int size, sector_t real_block)
-+{
-+ char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off;
-+ char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off;
-+ char *in, *out, *key;
-+ int i, keysize;
-
- if (cmd == READ) {
- in = raw_buf;
-@@ -106,6 +117,10 @@ static int transfer_xor(struct loop_devi
- keysize = lo->lo_encrypt_key_size;
- for (i = 0; i < size; i++)
- *out++ = *in++ ^ key[(i & 511) % keysize];
-+
-+ kunmap_atomic(raw_buf, KM_USER0);
-+ kunmap_atomic(loop_buf, KM_USER1);
-+ cond_resched();
- return 0;
- }
-
-@@ -140,8 +155,7 @@ figure_loop_size(struct loop_device *lo)
- sector_t x;
-
- /* Compute loopsize in bytes */
-- size = i_size_read(lo->lo_backing_file->f_dentry->
-- d_inode->i_mapping->host);
-+ size = i_size_read(lo->lo_backing_file->f_mapping->host);
- offset = lo->lo_offset;
- loopsize = size - offset;
- if (lo->lo_sizelimit > 0 && lo->lo_sizelimit < loopsize)
-@@ -162,32 +176,33 @@ figure_loop_size(struct loop_device *lo)
- }
-
- static inline int
--lo_do_transfer(struct loop_device *lo, int cmd, char *rbuf,
-- char *lbuf, int size, sector_t rblock)
-+lo_do_transfer(struct loop_device *lo, int cmd,
-+ struct page *rpage, unsigned roffs,
-+ struct page *lpage, unsigned loffs,
-+ int size, sector_t rblock)
- {
- if (!lo->transfer)
- return 0;
-
-- return lo->transfer(lo, cmd, rbuf, lbuf, size, rblock);
-+ return lo->transfer(lo, cmd, rpage, roffs, lpage, loffs, size, rblock);
- }
-
- static int
- do_lo_send(struct loop_device *lo, struct bio_vec *bvec, int bsize, loff_t pos)
- {
- struct file *file = lo->lo_backing_file; /* kudos to NFsckingS */
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- struct address_space_operations *aops = mapping->a_ops;
- struct page *page;
-- char *kaddr, *data;
- pgoff_t index;
-- unsigned size, offset;
-+ unsigned size, offset, bv_offs;
- int len;
- int ret = 0;
-
- down(&mapping->host->i_sem);
- index = pos >> PAGE_CACHE_SHIFT;
- offset = pos & ((pgoff_t)PAGE_CACHE_SIZE - 1);
-- data = kmap(bvec->bv_page) + bvec->bv_offset;
-+ bv_offs = bvec->bv_offset;
- len = bvec->bv_len;
- while (len > 0) {
- sector_t IV;
-@@ -204,25 +219,28 @@ do_lo_send(struct loop_device *lo, struc
- goto fail;
- if (aops->prepare_write(file, page, offset, offset+size))
- goto unlock;
-- kaddr = kmap(page);
-- transfer_result = lo_do_transfer(lo, WRITE, kaddr + offset,
-- data, size, IV);
-+ transfer_result = lo_do_transfer(lo, WRITE, page, offset,
-+ bvec->bv_page, bv_offs,
-+ size, IV);
- if (transfer_result) {
-+ char *kaddr;
-+
- /*
- * The transfer failed, but we still write the data to
- * keep prepare/commit calls balanced.
- */
- printk(KERN_ERR "loop: transfer error block %llu\n",
- (unsigned long long)index);
-+ kaddr = kmap_atomic(page, KM_USER0);
- memset(kaddr + offset, 0, size);
-+ kunmap_atomic(kaddr, KM_USER0);
- }
- flush_dcache_page(page);
-- kunmap(page);
- if (aops->commit_write(file, page, offset, offset+size))
- goto unlock;
- if (transfer_result)
- goto unlock;
-- data += size;
-+ bv_offs += size;
- len -= size;
- offset = 0;
- index++;
-@@ -232,7 +250,6 @@ do_lo_send(struct loop_device *lo, struc
- }
- up(&mapping->host->i_sem);
- out:
-- kunmap(bvec->bv_page);
- return ret;
-
- unlock:
-@@ -247,12 +264,10 @@ fail:
- static int
- lo_send(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos)
- {
-- unsigned vecnr;
-- int ret = 0;
--
-- for (vecnr = 0; vecnr < bio->bi_vcnt; vecnr++) {
-- struct bio_vec *bvec = &bio->bi_io_vec[vecnr];
-+ struct bio_vec *bvec;
-+ int i, ret = 0;
-
-+ bio_for_each_segment(bvec, bio, i) {
- ret = do_lo_send(lo, bvec, bsize, pos);
- if (ret < 0)
- break;
-@@ -263,7 +278,8 @@ lo_send(struct loop_device *lo, struct b
-
- struct lo_read_data {
- struct loop_device *lo;
-- char *data;
-+ struct page *page;
-+ unsigned offset;
- int bsize;
- };
-
-@@ -271,7 +287,6 @@ static int
- lo_read_actor(read_descriptor_t *desc, struct page *page,
- unsigned long offset, unsigned long size)
- {
-- char *kaddr;
- unsigned long count = desc->count;
- struct lo_read_data *p = (struct lo_read_data*)desc->buf;
- struct loop_device *lo = p->lo;
-@@ -282,18 +297,16 @@ lo_read_actor(read_descriptor_t *desc, s
- if (size > count)
- size = count;
-
-- kaddr = kmap(page);
-- if (lo_do_transfer(lo, READ, kaddr + offset, p->data, size, IV)) {
-+ if (lo_do_transfer(lo, READ, page, offset, p->page, p->offset, size, IV)) {
- size = 0;
- printk(KERN_ERR "loop: transfer error block %ld\n",
- page->index);
- desc->error = -EINVAL;
- }
-- kunmap(page);
-
- desc->count = count - size;
- desc->written += size;
-- p->data += size;
-+ p->offset += size;
- return size;
- }
-
-@@ -306,24 +319,22 @@ do_lo_receive(struct loop_device *lo,
- int retval;
-
- cookie.lo = lo;
-- cookie.data = kmap(bvec->bv_page) + bvec->bv_offset;
-+ cookie.page = bvec->bv_page;
-+ cookie.offset = bvec->bv_offset;
- cookie.bsize = bsize;
- file = lo->lo_backing_file;
- retval = file->f_op->sendfile(file, &pos, bvec->bv_len,
- lo_read_actor, &cookie);
-- kunmap(bvec->bv_page);
- return (retval < 0)? retval: 0;
- }
-
- static int
- lo_receive(struct loop_device *lo, struct bio *bio, int bsize, loff_t pos)
- {
-- unsigned vecnr;
-- int ret = 0;
--
-- for (vecnr = 0; vecnr < bio->bi_vcnt; vecnr++) {
-- struct bio_vec *bvec = &bio->bi_io_vec[vecnr];
-+ struct bio_vec *bvec;
-+ int i, ret = 0;
-
-+ bio_for_each_segment(bvec, bio, i) {
- ret = do_lo_receive(lo, bvec, bsize, pos);
- if (ret < 0)
- break;
-@@ -345,23 +356,6 @@ static int do_bio_filebacked(struct loop
- return ret;
- }
-
--static int loop_end_io_transfer(struct bio *, unsigned int, int);
--
--static void loop_put_buffer(struct bio *bio)
--{
-- /*
-- * check bi_end_io, may just be a remapped bio
-- */
-- if (bio && bio->bi_end_io == loop_end_io_transfer) {
-- int i;
--
-- for (i = 0; i < bio->bi_vcnt; i++)
-- __free_page(bio->bi_io_vec[i].bv_page);
--
-- bio_put(bio);
-- }
--}
--
- /*
- * Add bio to back of pending list
- */
-@@ -399,129 +393,8 @@ static struct bio *loop_get_bio(struct l
- return bio;
- }
-
--/*
-- * if this was a WRITE lo->transfer stuff has already been done. for READs,
-- * queue it for the loop thread and let it do the transfer out of
-- * bi_end_io context (we don't want to do decrypt of a page with irqs
-- * disabled)
-- */
--static int loop_end_io_transfer(struct bio *bio, unsigned int bytes_done, int err)
--{
-- struct bio *rbh = bio->bi_private;
-- struct loop_device *lo = rbh->bi_bdev->bd_disk->private_data;
--
-- if (bio->bi_size)
-- return 1;
--
-- if (err || bio_rw(bio) == WRITE) {
-- bio_endio(rbh, rbh->bi_size, err);
-- if (atomic_dec_and_test(&lo->lo_pending))
-- up(&lo->lo_bh_mutex);
-- loop_put_buffer(bio);
-- } else
-- loop_add_bio(lo, bio);
--
-- return 0;
--}
--
--static struct bio *loop_copy_bio(struct bio *rbh)
--{
-- struct bio *bio;
-- struct bio_vec *bv;
-- int i;
--
-- bio = bio_alloc(__GFP_NOWARN, rbh->bi_vcnt);
-- if (!bio)
-- return NULL;
--
-- /*
-- * iterate iovec list and alloc pages
-- */
-- __bio_for_each_segment(bv, rbh, i, 0) {
-- struct bio_vec *bbv = &bio->bi_io_vec[i];
--
-- bbv->bv_page = alloc_page(__GFP_NOWARN|__GFP_HIGHMEM);
-- if (bbv->bv_page == NULL)
-- goto oom;
--
-- bbv->bv_len = bv->bv_len;
-- bbv->bv_offset = bv->bv_offset;
-- }
--
-- bio->bi_vcnt = rbh->bi_vcnt;
-- bio->bi_size = rbh->bi_size;
--
-- return bio;
--
--oom:
-- while (--i >= 0)
-- __free_page(bio->bi_io_vec[i].bv_page);
--
-- bio_put(bio);
-- return NULL;
--}
--
--static struct bio *loop_get_buffer(struct loop_device *lo, struct bio *rbh)
--{
-- struct bio *bio;
--
-- /*
-- * When called on the page reclaim -> writepage path, this code can
-- * trivially consume all memory. So we drop PF_MEMALLOC to avoid
-- * stealing all the page reserves and throttle to the writeout rate.
-- * pdflush will have been woken by page reclaim. Let it do its work.
-- */
-- do {
-- int flags = current->flags;
--
-- current->flags &= ~PF_MEMALLOC;
-- bio = loop_copy_bio(rbh);
-- if (flags & PF_MEMALLOC)
-- current->flags |= PF_MEMALLOC;
--
-- if (bio == NULL)
-- blk_congestion_wait(WRITE, HZ/10);
-- } while (bio == NULL);
--
-- bio->bi_end_io = loop_end_io_transfer;
-- bio->bi_private = rbh;
-- bio->bi_sector = rbh->bi_sector + (lo->lo_offset >> 9);
-- bio->bi_rw = rbh->bi_rw;
-- bio->bi_bdev = lo->lo_device;
--
-- return bio;
--}
--
--static int loop_transfer_bio(struct loop_device *lo,
-- struct bio *to_bio, struct bio *from_bio)
--{
-- sector_t IV;
-- struct bio_vec *from_bvec, *to_bvec;
-- char *vto, *vfrom;
-- int ret = 0, i;
--
-- IV = from_bio->bi_sector + (lo->lo_offset >> 9);
--
-- __bio_for_each_segment(from_bvec, from_bio, i, 0) {
-- to_bvec = &to_bio->bi_io_vec[i];
--
-- kmap(from_bvec->bv_page);
-- kmap(to_bvec->bv_page);
-- vfrom = page_address(from_bvec->bv_page) + from_bvec->bv_offset;
-- vto = page_address(to_bvec->bv_page) + to_bvec->bv_offset;
-- ret |= lo_do_transfer(lo, bio_data_dir(to_bio), vto, vfrom,
-- from_bvec->bv_len, IV);
-- kunmap(from_bvec->bv_page);
-- kunmap(to_bvec->bv_page);
-- IV += from_bvec->bv_len >> 9;
-- }
--
-- return ret;
--}
--
- static int loop_make_request(request_queue_t *q, struct bio *old_bio)
- {
-- struct bio *new_bio = NULL;
- struct loop_device *lo = q->queuedata;
- int rw = bio_rw(old_bio);
-
-@@ -543,31 +416,11 @@ static int loop_make_request(request_que
- printk(KERN_ERR "loop: unknown command (%x)\n", rw);
- goto err;
- }
--
-- /*
-- * file backed, queue for loop_thread to handle
-- */
-- if (lo->lo_flags & LO_FLAGS_DO_BMAP) {
-- loop_add_bio(lo, old_bio);
-- return 0;
-- }
--
-- /*
-- * piggy old buffer on original, and submit for I/O
-- */
-- new_bio = loop_get_buffer(lo, old_bio);
-- if (rw == WRITE) {
-- if (loop_transfer_bio(lo, new_bio, old_bio))
-- goto err;
-- }
--
-- generic_make_request(new_bio);
-+ loop_add_bio(lo, old_bio);
- return 0;
--
- err:
- if (atomic_dec_and_test(&lo->lo_pending))
- up(&lo->lo_bh_mutex);
-- loop_put_buffer(new_bio);
- out:
- bio_io_error(old_bio, old_bio->bi_size);
- return 0;
-@@ -580,20 +433,8 @@ static inline void loop_handle_bio(struc
- {
- int ret;
-
-- /*
-- * For block backed loop, we know this is a READ
-- */
-- if (lo->lo_flags & LO_FLAGS_DO_BMAP) {
-- ret = do_bio_filebacked(lo, bio);
-- bio_endio(bio, bio->bi_size, ret);
-- } else {
-- struct bio *rbh = bio->bi_private;
--
-- ret = loop_transfer_bio(lo, bio, rbh);
--
-- bio_endio(rbh, rbh->bi_size, ret);
-- loop_put_buffer(bio);
-- }
-+ ret = do_bio_filebacked(lo, bio);
-+ bio_endio(bio, bio->bi_size, ret);
- }
-
- /*
-@@ -660,6 +501,7 @@ static int loop_set_fd(struct loop_devic
- struct file *file;
- struct inode *inode;
- struct block_device *lo_device = NULL;
-+ struct address_space *mapping;
- unsigned lo_blocksize;
- int lo_flags = 0;
- int error;
-@@ -676,35 +518,27 @@ static int loop_set_fd(struct loop_devic
- if (!file)
- goto out;
-
-- error = -EINVAL;
-- inode = file->f_dentry->d_inode;
-+ mapping = file->f_mapping;
-+ inode = mapping->host;
-
- if (!(file->f_mode & FMODE_WRITE))
- lo_flags |= LO_FLAGS_READ_ONLY;
-
-- if (S_ISBLK(inode->i_mode)) {
-- lo_device = inode->i_bdev;
-- if (lo_device == bdev) {
-- error = -EBUSY;
-- goto out;
-- }
-- lo_blocksize = block_size(lo_device);
-- if (bdev_read_only(lo_device))
-- lo_flags |= LO_FLAGS_READ_ONLY;
-- } else if (S_ISREG(inode->i_mode)) {
-- struct address_space_operations *aops = inode->i_mapping->a_ops;
-+ error = -EINVAL;
-+
-+ if (S_ISREG(inode->i_mode) || S_ISBLK(inode->i_mode)) {
-+ struct address_space_operations *aops = mapping->a_ops;
- /*
- * If we can't read - sorry. If we only can't write - well,
- * it's going to be read-only.
- */
-- if (!inode->i_fop->sendfile)
-+ if (!lo_file->f_op->sendfile)
- goto out_putf;
-
- if (!aops->prepare_write || !aops->commit_write)
- lo_flags |= LO_FLAGS_READ_ONLY;
-
- lo_blocksize = inode->i_blksize;
-- lo_flags |= LO_FLAGS_DO_BMAP;
- error = 0;
- } else
- goto out_putf;
-@@ -728,9 +562,8 @@ static int loop_set_fd(struct loop_devic
- fput(file);
- goto out_putf;
- }
-- lo->old_gfp_mask = mapping_gfp_mask(inode->i_mapping);
-- mapping_set_gfp_mask(inode->i_mapping,
-- lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
-+ lo->old_gfp_mask = mapping_gfp_mask(mapping);
-+ mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
-
- set_blocksize(bdev, lo_blocksize);
-
-@@ -743,20 +576,6 @@ static int loop_set_fd(struct loop_devic
- blk_queue_make_request(lo->lo_queue, loop_make_request);
- lo->lo_queue->queuedata = lo;
-
-- /*
-- * we remap to a block device, make sure we correctly stack limits
-- */
-- if (S_ISBLK(inode->i_mode)) {
-- request_queue_t *q = bdev_get_queue(lo_device);
--
-- blk_queue_max_sectors(lo->lo_queue, q->max_sectors);
-- blk_queue_max_phys_segments(lo->lo_queue,q->max_phys_segments);
-- blk_queue_max_hw_segments(lo->lo_queue, q->max_hw_segments);
-- blk_queue_max_segment_size(lo->lo_queue, q->max_segment_size);
-- blk_queue_segment_boundary(lo->lo_queue, q->seg_boundary_mask);
-- blk_queue_merge_bvec(lo->lo_queue, q->merge_bvec_fn);
-- }
--
- kernel_thread(loop_thread, lo, CLONE_KERNEL);
- down(&lo->lo_sem);
-
-@@ -846,7 +665,7 @@ static int loop_clr_fd(struct loop_devic
- memset(lo->lo_file_name, 0, LO_NAME_SIZE);
- invalidate_bdev(bdev, 0);
- set_capacity(disks[lo->lo_number], 0);
-- mapping_set_gfp_mask(filp->f_dentry->d_inode->i_mapping, gfp);
-+ mapping_set_gfp_mask(filp->f_mapping, gfp);
- lo->lo_state = Lo_unbound;
- fput(filp);
- /* This is safe: open() is still holding a reference. */
-@@ -1056,19 +875,19 @@ loop_get_status64(struct loop_device *lo
- return err;
- }
-
--static int lo_ioctl(struct inode * inode, struct file * file,
-+static int lo_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
-+ struct loop_device *lo = bdev->bd_disk->private_data;
- int err;
-
- down(&lo->lo_ctl_mutex);
- switch (cmd) {
- case LOOP_SET_FD:
-- err = loop_set_fd(lo, file, inode->i_bdev, arg);
-+ err = loop_set_fd(lo, file, bdev, arg);
- break;
- case LOOP_CLR_FD:
-- err = loop_clr_fd(lo, inode->i_bdev);
-+ err = loop_clr_fd(lo, bdev);
- break;
- case LOOP_SET_STATUS:
- err = loop_set_status_old(lo, (struct loop_info *) arg);
-@@ -1089,9 +908,9 @@ static int lo_ioctl(struct inode * inode
- return err;
- }
-
--static int lo_open(struct inode *inode, struct file *file)
-+static int lo_open(struct block_device *bdev, struct file *file)
- {
-- struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
-+ struct loop_device *lo = bdev->bd_disk->private_data;
-
- down(&lo->lo_ctl_mutex);
- lo->lo_refcnt++;
-@@ -1100,9 +919,9 @@ static int lo_open(struct inode *inode,
- return 0;
- }
-
--static int lo_release(struct inode *inode, struct file *file)
-+static int lo_release(struct gendisk *disk)
- {
-- struct loop_device *lo = inode->i_bdev->bd_disk->private_data;
-+ struct loop_device *lo = disk->private_data;
-
- down(&lo->lo_ctl_mutex);
- --lo->lo_refcnt;
-@@ -1124,6 +943,7 @@ static struct block_device_operations lo
- MODULE_PARM(max_loop, "i");
- MODULE_PARM_DESC(max_loop, "Maximum number of loop devices (1-256)");
- MODULE_LICENSE("GPL");
-+MODULE_ALIAS_BLOCKDEV_MAJOR(LOOP_MAJOR);
-
- int loop_register_transfer(struct loop_func_table *funcs)
- {
-@@ -1212,14 +1032,18 @@ int __init loop_init(void)
- sprintf(disk->devfs_name, "loop/%d", i);
- disk->private_data = lo;
- disk->queue = lo->lo_queue;
-- add_disk(disk);
- }
-+
-+ /* We cannot fail after we call this, so another loop!*/
-+ for (i = 0; i < max_loop; i++)
-+ add_disk(disks[i]);
- printk(KERN_INFO "loop: loaded (max %d devices)\n", max_loop);
- return 0;
-
- out_mem4:
- while (i--)
- blk_put_queue(loop_dev[i].lo_queue);
-+ devfs_remove("loop");
- i = max_loop;
- out_mem3:
- while (i--)
---- linux-2.6.0/drivers/block/Makefile 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/Makefile 2003-12-28 23:21:35.000000000 -0800
-@@ -18,6 +18,7 @@ obj-y := elevator.o ll_rw_blk.o ioctl.o
- obj-$(CONFIG_IOSCHED_NOOP) += noop-iosched.o
- obj-$(CONFIG_IOSCHED_AS) += as-iosched.o
- obj-$(CONFIG_IOSCHED_DEADLINE) += deadline-iosched.o
-+obj-$(CONFIG_IOSCHED_CFQ) += cfq-iosched.o
- obj-$(CONFIG_MAC_FLOPPY) += swim3.o
- obj-$(CONFIG_BLK_DEV_FD) += floppy.o
- obj-$(CONFIG_BLK_DEV_FD98) += floppy98.o
---- linux-2.6.0/drivers/block/nbd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/nbd.c 2003-12-28 23:21:12.000000000 -0800
-@@ -535,10 +535,10 @@ static void do_nbd_request(request_queue
- return;
- }
-
--static int nbd_ioctl(struct inode *inode, struct file *file,
-+static int nbd_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct nbd_device *lo = inode->i_bdev->bd_disk->private_data;
-+ struct nbd_device *lo = bdev->bd_disk->private_data;
- int error;
- struct request sreq ;
-
-@@ -593,7 +593,7 @@ static int nbd_ioctl(struct inode *inode
- error = -EINVAL;
- file = fget(arg);
- if (file) {
-- inode = file->f_dentry->d_inode;
-+ struct inode *inode = file->f_dentry->d_inode;
- if (inode->i_sock) {
- lo->file = file;
- lo->sock = SOCKET_I(inode);
-@@ -606,20 +606,20 @@ static int nbd_ioctl(struct inode *inode
- case NBD_SET_BLKSIZE:
- lo->blksize = arg;
- lo->bytesize &= ~(lo->blksize-1);
-- inode->i_bdev->bd_inode->i_size = lo->bytesize;
-- set_blocksize(inode->i_bdev, lo->blksize);
-+ bdev->bd_inode->i_size = lo->bytesize;
-+ set_blocksize(bdev, lo->blksize);
- set_capacity(lo->disk, lo->bytesize >> 9);
- return 0;
- case NBD_SET_SIZE:
- lo->bytesize = arg & ~(lo->blksize-1);
-- inode->i_bdev->bd_inode->i_size = lo->bytesize;
-- set_blocksize(inode->i_bdev, lo->blksize);
-+ bdev->bd_inode->i_size = lo->bytesize;
-+ set_blocksize(bdev, lo->blksize);
- set_capacity(lo->disk, lo->bytesize >> 9);
- return 0;
- case NBD_SET_SIZE_BLOCKS:
- lo->bytesize = ((u64) arg) * lo->blksize;
-- inode->i_bdev->bd_inode->i_size = lo->bytesize;
-- set_blocksize(inode->i_bdev, lo->blksize);
-+ bdev->bd_inode->i_size = lo->bytesize;
-+ set_blocksize(bdev, lo->blksize);
- set_capacity(lo->disk, lo->bytesize >> 9);
- return 0;
- case NBD_DO_IT:
-@@ -664,11 +664,11 @@ static int nbd_ioctl(struct inode *inode
- case NBD_PRINT_DEBUG:
- #ifdef PARANOIA
- printk(KERN_INFO "%s: next = %p, prev = %p. Global: in %d, out %d\n",
-- inode->i_bdev->bd_disk->disk_name, lo->queue_head.next,
-+ bdev->bd_disk->disk_name, lo->queue_head.next,
- lo->queue_head.prev, requests_in, requests_out);
- #else
- printk(KERN_INFO "%s: next = %p, prev = %p\n",
-- inode->i_bdev->bd_disk->disk_name,
-+ bdev->bd_disk->disk_name,
- lo->queue_head.next, lo->queue_head.prev);
- #endif
- return 0;
---- linux-2.6.0/drivers/block/paride/pcd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/paride/pcd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -243,23 +243,23 @@ static int pcd_warned; /* Have we logge
-
- /* kernel glue structures */
-
--static int pcd_block_open(struct inode *inode, struct file *file)
-+static int pcd_block_open(struct block_device *bdev, struct file *file)
- {
-- struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-- return cdrom_open(&cd->info, inode, file);
-+ struct pcd_unit *cd = bdev->bd_disk->private_data;
-+ return cdrom_open(&cd->info, bdev, file);
- }
-
--static int pcd_block_release(struct inode *inode, struct file *file)
-+static int pcd_block_release(struct gendisk *disk)
- {
-- struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-- return cdrom_release(&cd->info, file);
-+ struct pcd_unit *cd = disk->private_data;
-+ return cdrom_release(&cd->info);
- }
-
--static int pcd_block_ioctl(struct inode *inode, struct file *file,
-+static int pcd_block_ioctl(struct block_device *bdev, struct file *file,
- unsigned cmd, unsigned long arg)
- {
-- struct pcd_unit *cd = inode->i_bdev->bd_disk->private_data;
-- return cdrom_ioctl(&cd->info, inode, cmd, arg);
-+ struct pcd_unit *cd = bdev->bd_disk->private_data;
-+ return cdrom_ioctl(&cd->info, bdev, cmd, arg);
- }
-
- static int pcd_block_media_changed(struct gendisk *disk)
---- linux-2.6.0/drivers/block/paride/pd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/paride/pd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -236,11 +236,11 @@ MODULE_PARM(drive3, "1-8i");
- #define IDE_EJECT 0xed
-
- void pd_setup(char *str, int *ints);
--static int pd_open(struct inode *inode, struct file *file);
-+static int pd_open(struct block_device *bdev, struct file *file);
- static void do_pd_request(request_queue_t * q);
--static int pd_ioctl(struct inode *inode, struct file *file,
-+static int pd_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg);
--static int pd_release(struct inode *inode, struct file *file);
-+static int pd_release(struct gendisk *disk);
- static int pd_revalidate(struct gendisk *p);
- static int pd_detect(void);
- static void do_pd_read(void);
-@@ -304,8 +304,6 @@ static char *pd_errs[17] = { "ERR", "IND
-
- /* kernel glue structures */
-
--extern struct block_device_operations pd_fops;
--
- static struct block_device_operations pd_fops = {
- .owner = THIS_MODULE,
- .open = pd_open,
-@@ -337,9 +335,9 @@ static void pd_init_units(void)
- }
- }
-
--static int pd_open(struct inode *inode, struct file *file)
-+static int pd_open(struct block_device *bdev, struct file *file)
- {
-- struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
-+ struct pd_unit *disk = bdev->bd_disk->private_data;
-
- disk->access++;
-
-@@ -350,10 +348,10 @@ static int pd_open(struct inode *inode,
- return 0;
- }
-
--static int pd_ioctl(struct inode *inode, struct file *file,
-+static int pd_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
-+ struct pd_unit *disk = bdev->bd_disk->private_data;
- struct hd_geometry *geo = (struct hd_geometry *) arg;
- struct hd_geometry g;
-
-@@ -372,7 +370,7 @@ static int pd_ioctl(struct inode *inode,
- g.sectors = disk->sectors;
- g.cylinders = disk->cylinders;
- }
-- g.start = get_start_sect(inode->i_bdev);
-+ g.start = get_start_sect(bdev);
- if (copy_to_user(geo, &g, sizeof(struct hd_geometry)))
- return -EFAULT;
- return 0;
-@@ -381,9 +379,9 @@ static int pd_ioctl(struct inode *inode,
- }
- }
-
--static int pd_release(struct inode *inode, struct file *file)
-+static int pd_release(struct gendisk *p)
- {
-- struct pd_unit *disk = inode->i_bdev->bd_disk->private_data;
-+ struct pd_unit *disk = p->private_data;
-
- if (!--disk->access && disk->removable)
- pd_doorlock(disk, IDE_DOORUNLOCK);
---- linux-2.6.0/drivers/block/paride/pf.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/paride/pf.c 2003-12-28 23:21:17.000000000 -0800
-@@ -222,12 +222,12 @@ MODULE_PARM(drive3, "1-7i");
- #define ATAPI_READ_10 0x28
- #define ATAPI_WRITE_10 0x2a
-
--static int pf_open(struct inode *inode, struct file *file);
-+static int pf_open(struct block_device *bdev, struct file *file);
- static void do_pf_request(request_queue_t * q);
--static int pf_ioctl(struct inode *inode, struct file *file,
-+static int pf_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg);
-
--static int pf_release(struct inode *inode, struct file *file);
-+static int pf_release(struct gendisk *disk);
-
- static int pf_detect(void);
- static void do_pf_read(void);
-@@ -315,9 +315,9 @@ void pf_init_units(void)
- }
- }
-
--static int pf_open(struct inode *inode, struct file *file)
-+static int pf_open(struct block_device *bdev, struct file *file)
- {
-- struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
-+ struct pf_unit *pf = bdev->bd_disk->private_data;
-
- pf_identify(pf);
-
-@@ -334,9 +334,9 @@ static int pf_open(struct inode *inode,
- return 0;
- }
-
--static int pf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+static int pf_ioctl(struct block_device *bdev, struct file *file, unsigned int cmd, unsigned long arg)
- {
-- struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
-+ struct pf_unit *pf = bdev->bd_disk->private_data;
- struct hd_geometry *geo = (struct hd_geometry *) arg;
- struct hd_geometry g;
- sector_t capacity;
-@@ -365,9 +365,9 @@ static int pf_ioctl(struct inode *inode,
- return 0;
- }
-
--static int pf_release(struct inode *inode, struct file *file)
-+static int pf_release(struct gendisk *disk)
- {
-- struct pf_unit *pf = inode->i_bdev->bd_disk->private_data;
-+ struct pf_unit *pf = disk->private_data;
-
- if (pf->access <= 0)
- return -EINVAL;
---- linux-2.6.0/drivers/block/ps2esdi.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/ps2esdi.c 2003-12-28 23:21:12.000000000 -0800
-@@ -81,7 +81,7 @@ static void (*current_int_handler) (u_in
- static void ps2esdi_normal_interrupt_handler(u_int);
- static void ps2esdi_initial_reset_int_handler(u_int);
- static void ps2esdi_geometry_int_handler(u_int);
--static int ps2esdi_ioctl(struct inode *inode, struct file *file,
-+static int ps2esdi_ioctl(struct block_device *bdev, struct file *file,
- u_int cmd, u_long arg);
-
- static int ps2esdi_read_status_words(int num_words, int max_words, u_short * buffer);
-@@ -1059,10 +1059,10 @@ static void dump_cmd_complete_status(u_i
-
- }
-
--static int ps2esdi_ioctl(struct inode *inode,
-+static int ps2esdi_ioctl(struct block_device *bdev,
- struct file *file, u_int cmd, u_long arg)
- {
-- struct ps2esdi_i_struct *p = inode->i_bdev->bd_disk->private_data;
-+ struct ps2esdi_i_struct *p = bdev->bd_disk->private_data;
- struct ps2esdi_geometry *geometry = (struct ps2esdi_geometry *) arg;
- int err;
-
-@@ -1073,7 +1073,7 @@ static int ps2esdi_ioctl(struct inode *i
- put_user(p->head, (char *) &geometry->heads);
- put_user(p->sect, (char *) &geometry->sectors);
- put_user(p->cyl, (short *) &geometry->cylinders);
-- put_user(get_start_sect(inode->i_bdev), (long *) &geometry->start);
-+ put_user(get_start_sect(bdev), (long *) &geometry->start);
- return 0;
- }
-
---- linux-2.6.0/drivers/block/rd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/rd.c 2003-12-28 23:21:41.000000000 -0800
-@@ -1,15 +1,15 @@
- /*
- * ramdisk.c - Multiple RAM disk driver - gzip-loading version - v. 0.8 beta.
-- *
-- * (C) Chad Page, Theodore Ts'o, et. al, 1995.
-+ *
-+ * (C) Chad Page, Theodore Ts'o, et. al, 1995.
- *
- * This RAM disk is designed to have filesystems created on it and mounted
-- * just like a regular floppy disk.
-- *
-+ * just like a regular floppy disk.
-+ *
- * It also does something suggested by Linus: use the buffer cache as the
- * RAM disk data. This makes it possible to dynamically allocate the RAM disk
-- * buffer - with some consequences I have to deal with as I write this.
-- *
-+ * buffer - with some consequences I have to deal with as I write this.
-+ *
- * This code is based on the original ramdisk.c, written mostly by
- * Theodore Ts'o (TYT) in 1991. The code was largely rewritten by
- * Chad Page to use the buffer cache to store the RAM disk data in
-@@ -33,7 +33,7 @@
- *
- * Added initrd: Werner Almesberger & Hans Lermen, Feb '96
- *
-- * 4/25/96 : Made RAM disk size a parameter (default is now 4 MB)
-+ * 4/25/96 : Made RAM disk size a parameter (default is now 4 MB)
- * - Chad Page
- *
- * Add support for fs images split across >1 disk, Paul Gortmaker, Mar '98
-@@ -60,7 +60,7 @@
- #include <asm/uaccess.h>
-
- /* The RAM disk size is now a parameter */
--#define NUM_RAMDISKS 16 /* This cannot be overridden (yet) */
-+#define NUM_RAMDISKS 16 /* This cannot be overridden (yet) */
-
- /* Various static variables go here. Most are used only in the RAM disk code.
- */
-@@ -73,7 +73,7 @@ static struct request_queue *rd_queue[NU
- * Parameters for the boot-loading of the RAM disk. These are set by
- * init/main.c (from arguments to the kernel command line) or from the
- * architecture-specific setup routine (from the stored boot sector
-- * information).
-+ * information).
- */
- int rd_size = CONFIG_BLK_DEV_RAM_SIZE; /* Size of the RAM disks */
- /*
-@@ -94,7 +94,7 @@ int rd_blocksize = BLOCK_SIZE; /* bloc
- * 2000 Transmeta Corp.
- * aops copied from ramfs.
- */
--static int ramdisk_readpage(struct file *file, struct page * page)
-+static int ramdisk_readpage(struct file *file, struct page *page)
- {
- if (!PageUptodate(page)) {
- void *kaddr = kmap_atomic(page, KM_USER0);
-@@ -108,7 +108,8 @@ static int ramdisk_readpage(struct file
- return 0;
- }
-
--static int ramdisk_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
-+static int ramdisk_prepare_write(struct file *file, struct page *page,
-+ unsigned offset, unsigned to)
- {
- if (!PageUptodate(page)) {
- void *kaddr = kmap_atomic(page, KM_USER0);
-@@ -122,7 +123,8 @@ static int ramdisk_prepare_write(struct
- return 0;
- }
-
--static int ramdisk_commit_write(struct file *file, struct page *page, unsigned offset, unsigned to)
-+static int ramdisk_commit_write(struct file *file, struct page *page,
-+ unsigned offset, unsigned to)
- {
- return 0;
- }
-@@ -212,7 +214,7 @@ static int rd_blkdev_pagecache_IO(int rw
- * 19-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Added devfs support
- *
- */
--static int rd_make_request(request_queue_t * q, struct bio *bio)
-+static int rd_make_request(request_queue_t *q, struct bio *bio)
- {
- struct block_device *bdev = bio->bi_bdev;
- struct address_space * mapping = bdev->bd_inode->i_mapping;
-@@ -242,17 +244,19 @@ fail:
- return 0;
- }
-
--static int rd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+static int rd_ioctl(struct block_device *bdev, struct file *file,
-+ unsigned int cmd, unsigned long arg)
- {
- int error;
-- struct block_device *bdev = inode->i_bdev;
-
- if (cmd != BLKFLSBUF)
- return -EINVAL;
-
-- /* special: we want to release the ramdisk memory,
-- it's not like with the other blockdevices where
-- this ioctl only flushes away the buffer cache. */
-+ /*
-+ * special: we want to release the ramdisk memory, it's not like with
-+ * the other blockdevices where this ioctl only flushes away the buffer
-+ * cache
-+ */
- error = -EBUSY;
- down(&bdev->bd_sem);
- if (bdev->bd_openers <= 2) {
-@@ -268,16 +272,15 @@ static struct backing_dev_info rd_backin
- .memory_backed = 1, /* Does not contribute to dirty memory */
- };
-
--static int rd_open(struct inode * inode, struct file * filp)
-+static int rd_open(struct block_device *bdev, struct file *filp)
- {
-- unsigned unit = iminor(inode);
-+ unsigned unit = MINOR(bdev->bd_dev);
-
- /*
- * Immunize device against invalidate_buffers() and prune_icache().
- */
- if (rd_bdev[unit] == NULL) {
-- struct block_device *bdev = inode->i_bdev;
-- inode = igrab(bdev->bd_inode);
-+ struct inode *inode = igrab(bdev->bd_inode);
- rd_bdev[unit] = bdev;
- bdev->bd_openers++;
- bdev->bd_block_size = rd_blocksize;
-@@ -295,12 +298,14 @@ static struct block_device_operations rd
- .ioctl = rd_ioctl,
- };
-
--/* Before freeing the module, invalidate all of the protected buffers! */
--static void __exit rd_cleanup (void)
-+/*
-+ * Before freeing the module, invalidate all of the protected buffers!
-+ */
-+static void __exit rd_cleanup(void)
- {
- int i;
-
-- for (i = 0 ; i < NUM_RAMDISKS; i++) {
-+ for (i = 0; i < NUM_RAMDISKS; i++) {
- struct block_device *bdev = rd_bdev[i];
- rd_bdev[i] = NULL;
- if (bdev) {
-@@ -311,17 +316,19 @@ static void __exit rd_cleanup (void)
- put_disk(rd_disks[i]);
- }
- devfs_remove("rd");
-- unregister_blkdev(RAMDISK_MAJOR, "ramdisk" );
-+ unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
- }
-
--/* This is the registration and initialization section of the RAM disk driver */
--static int __init rd_init (void)
-+/*
-+ * This is the registration and initialization section of the RAM disk driver
-+ */
-+static int __init rd_init(void)
- {
- int i;
- int err = -ENOMEM;
-
- if (rd_blocksize > PAGE_SIZE || rd_blocksize < 512 ||
-- (rd_blocksize & (rd_blocksize-1))) {
-+ (rd_blocksize & (rd_blocksize-1))) {
- printk("RAMDISK: wrong blocksize %d, reverting to defaults\n",
- rd_blocksize);
- rd_blocksize = BLOCK_SIZE;
-@@ -362,8 +369,8 @@ static int __init rd_init (void)
-
- /* rd_size is given in kB */
- printk("RAMDISK driver initialized: "
-- "%d RAM disks of %dK size %d blocksize\n",
-- NUM_RAMDISKS, rd_size, rd_blocksize);
-+ "%d RAM disks of %dK size %d blocksize\n",
-+ NUM_RAMDISKS, rd_size, rd_blocksize);
-
- return 0;
- out_queue:
---- linux-2.6.0/drivers/block/scsi_ioctl.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/block/scsi_ioctl.c 2003-12-28 23:26:36.000000000 -0800
-@@ -312,7 +312,7 @@ static int sg_scsi_ioctl(request_queue_t
- return -EFAULT;
- if (in_len > PAGE_SIZE || out_len > PAGE_SIZE)
- return -EINVAL;
-- if (get_user(opcode, sic->data))
-+ if (get_user(opcode, (int *)sic->data))
- return -EFAULT;
-
- bytes = max(in_len, out_len);
---- linux-2.6.0/drivers/block/swim3.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/swim3.c 2003-12-28 23:21:17.000000000 -0800
-@@ -239,10 +239,9 @@ static int grab_drive(struct floppy_stat
- int interruptible);
- static void release_drive(struct floppy_state *fs);
- static int fd_eject(struct floppy_state *fs);
--static int floppy_ioctl(struct inode *inode, struct file *filp,
-+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long param);
--static int floppy_open(struct inode *inode, struct file *filp);
--static int floppy_release(struct inode *inode, struct file *filp);
-+static int floppy_open(struct block_device *bdev, struct file *filp);
- static int floppy_check_change(struct gendisk *disk);
- static int floppy_revalidate(struct gendisk *disk);
- static int swim3_add_device(struct device_node *swims);
-@@ -811,10 +810,10 @@ static int fd_eject(struct floppy_state
- static struct floppy_struct floppy_type =
- { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /* 7 1.44MB 3.5" */
-
--static int floppy_ioctl(struct inode *inode, struct file *filp,
-+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long param)
- {
-- struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
-+ struct floppy_state *fs = bdev->bd_disk->private_data;
- int err;
-
- if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
-@@ -838,9 +837,9 @@ static int floppy_ioctl(struct inode *in
- return -ENOTTY;
- }
-
--static int floppy_open(struct inode *inode, struct file *filp)
-+static int floppy_open(struct block_device *bdev, struct file *filp)
- {
-- struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
-+ struct floppy_state *fs = bdev->bd_disk->private_data;
- volatile struct swim3 *sw = fs->swim3;
- int n, err = 0;
-
-@@ -876,7 +875,7 @@ static int floppy_open(struct inode *ino
-
- if (err == 0 && (filp->f_flags & O_NDELAY) == 0
- && (filp->f_mode & 3)) {
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- if (fs->ejected)
- err = -ENXIO;
- }
-@@ -904,9 +903,9 @@ static int floppy_open(struct inode *ino
- return 0;
- }
-
--static int floppy_release(struct inode *inode, struct file *filp)
-+static int floppy_release(struct gendisk *disk)
- {
-- struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
-+ struct floppy_state *fs = disk->private_data;
- volatile struct swim3 *sw = fs->swim3;
- if (fs->ref_count > 0 && --fs->ref_count == 0) {
- swim3_action(fs, MOTOR_OFF);
---- linux-2.6.0/drivers/block/swim_iop.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/swim_iop.c 2003-12-28 23:21:17.000000000 -0800
-@@ -98,10 +98,10 @@ static void swimiop_receive(struct iop_m
- static void swimiop_status_update(int, struct swim_drvstatus *);
- static int swimiop_eject(struct floppy_state *fs);
-
--static int floppy_ioctl(struct inode *inode, struct file *filp,
-+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long param);
--static int floppy_open(struct inode *inode, struct file *filp);
--static int floppy_release(struct inode *inode, struct file *filp);
-+static int floppy_open(struct block_device *bdev, struct file *filp);
-+static int floppy_release(struct gendisk *disk);
- static int floppy_check_change(struct gendisk *disk);
- static int floppy_revalidate(struct gendisk *disk);
- static int grab_drive(struct floppy_state *fs, enum swim_state state,
-@@ -348,10 +348,10 @@ static int swimiop_eject(struct floppy_s
- static struct floppy_struct floppy_type =
- { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /* 7 1.44MB 3.5" */
-
--static int floppy_ioctl(struct inode *inode, struct file *filp,
-+static int floppy_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long param)
- {
-- struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
-+ struct floppy_state *fs = bdev->bd_disk->private_data;
- int err;
-
- if ((cmd & 0x80) && !capable(CAP_SYS_ADMIN))
-@@ -372,15 +372,15 @@ static int floppy_ioctl(struct inode *in
- return -ENOTTY;
- }
-
--static int floppy_open(struct inode *inode, struct file *filp)
-+static int floppy_open(struct block_device *bdev, struct file *filp)
- {
-- struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
-+ struct floppy_state *fs = bdev->bd_disk->private_data;
-
- if (fs->ref_count == -1 || filp->f_flags & O_EXCL)
- return -EBUSY;
-
- if ((filp->f_flags & O_NDELAY) == 0 && (filp->f_mode & 3)) {
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- if (fs->ejected)
- return -ENXIO;
- }
-@@ -396,9 +396,9 @@ static int floppy_open(struct inode *ino
- return 0;
- }
-
--static int floppy_release(struct inode *inode, struct file *filp)
-+static int floppy_release(struct gendisk *disk)
- {
-- struct floppy_state *fs = inode->i_bdev->bd_disk->private_data;
-+ struct floppy_state *fs = disk->private_data;
- if (fs->ref_count > 0)
- fs->ref_count--;
- return 0;
---- linux-2.6.0/drivers/block/umem.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/umem.c 2003-12-28 23:21:14.000000000 -0800
-@@ -153,7 +153,6 @@ struct cardinfo {
- };
-
- static struct cardinfo cards[MM_MAXCARDS];
--static struct block_device_operations mm_fops;
- static struct timer_list battery_timer;
-
- static int num_cards = 0;
-@@ -818,10 +817,10 @@ static int mm_revalidate(struct gendisk
- -- mm_ioctl
- -----------------------------------------------------------------------------------
- */
--static int mm_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
-+static int mm_ioctl(struct block_device *bdev, struct file *f, unsigned int cmd, unsigned long arg)
- {
- if (cmd == HDIO_GETGEO) {
-- struct cardinfo *card = i->i_bdev->bd_disk->private_data;
-+ struct cardinfo *card = bdev->bd_disk->private_data;
- int size = card->mm_size * (1024 / MM_HARDSECT);
- struct hd_geometry geo;
- /*
-@@ -831,7 +830,7 @@ static int mm_ioctl(struct inode *i, str
- */
- geo.heads = 64;
- geo.sectors = 32;
-- geo.start = get_start_sect(i->i_bdev);
-+ geo.start = get_start_sect(bdev);
- geo.cylinders = size / (geo.heads * geo.sectors);
-
- if (copy_to_user((void *) arg, &geo, sizeof(geo)))
---- linux-2.6.0/drivers/block/xd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/xd.c 2003-12-28 23:21:12.000000000 -0800
-@@ -322,9 +322,9 @@ static void do_xd_request (request_queue
- }
-
- /* xd_ioctl: handle device ioctl's */
--static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg)
-+static int xd_ioctl (struct block_device *bdev,struct file *file,u_int cmd,u_long arg)
- {
-- XD_INFO *p = inode->i_bdev->bd_disk->private_data;
-+ XD_INFO *p = bdev->bd_disk->private_data;
-
- switch (cmd) {
- case HDIO_GETGEO:
-@@ -334,7 +334,7 @@ static int xd_ioctl (struct inode *inode
- g.heads = p->heads;
- g.sectors = p->sectors;
- g.cylinders = p->cylinders;
-- g.start = get_start_sect(inode->i_bdev);
-+ g.start = get_start_sect(bdev);
- return copy_to_user(geometry, &g, sizeof g) ? -EFAULT : 0;
- }
- case HDIO_SET_DMA:
---- linux-2.6.0/drivers/block/xd.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/xd.h 2003-12-28 23:21:12.000000000 -0800
-@@ -105,7 +105,7 @@ static u_char xd_detect (u_char *control
- static u_char xd_initdrives (void (*init_drive)(u_char drive));
-
- static void do_xd_request (request_queue_t * q);
--static int xd_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
-+static int xd_ioctl (struct block_device *bdev,struct file *file,unsigned int cmd,unsigned long arg);
- static int xd_readwrite (u_char operation,XD_INFO *disk,char *buffer,u_int block,u_int count);
- static void xd_recalibrate (u_char drive);
-
---- linux-2.6.0/drivers/block/z2ram.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/block/z2ram.c 2003-12-28 23:21:17.000000000 -0800
-@@ -67,7 +67,6 @@ static int current_device = -1;
-
- static spinlock_t z2ram_lock = SPIN_LOCK_UNLOCKED;
-
--static struct block_device_operations z2_fops;
- static struct gendisk *z2ram_gendisk;
-
- static void do_z2_request(request_queue_t *q)
-@@ -141,7 +140,7 @@ get_chipram( void )
- }
-
- static int
--z2_open( struct inode *inode, struct file *filp )
-+z2_open( struct block_device *bdev, struct file *filp )
- {
- int device;
- int max_z2_map = ( Z2RAM_SIZE / Z2RAM_CHUNKSIZE ) *
-@@ -150,7 +149,7 @@ z2_open( struct inode *inode, struct fil
- sizeof( z2ram_map[0] );
- int rc = -ENOMEM;
-
-- device = iminor(inode);
-+ device = MINOR(bdev->bd_dev);
-
- if ( current_device != -1 && current_device != device )
- {
-@@ -301,8 +300,7 @@ err_out:
- return rc;
- }
-
--static int
--z2_release( struct inode *inode, struct file *filp )
-+static int z2_release(struct gendisk *disk)
- {
- if ( current_device == -1 )
- return 0;
---- linux-2.6.0/drivers/bluetooth/bluecard_cs.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/drivers/bluetooth/bluecard_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -869,7 +869,7 @@ dev_link_t *bluecard_attach(void)
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- bluecard_detach(link);
-@@ -898,7 +898,7 @@ void bluecard_detach(dev_link_t *link)
- bluecard_release(link);
-
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -910,25 +910,21 @@ void bluecard_detach(dev_link_t *link)
- }
-
-
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
- {
- int i;
-
-- i = CardServices(fn, handle, tuple);
-+ i = pcmcia_get_first_tuple(handle, tuple);
- if (i != CS_SUCCESS)
- return CS_NO_MORE_ITEMS;
-
-- i = CardServices(GetTupleData, handle, tuple);
-+ i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS)
- return i;
-
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
- }
-
--
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
--
- void bluecard_config(dev_link_t *link)
- {
- client_handle_t handle = link->handle;
-@@ -956,7 +952,7 @@ void bluecard_config(dev_link_t *link)
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-- i = CardServices(GetConfigurationInfo, handle, &config);
-+ i = pcmcia_get_configuration_info(handle, &config);
- link->conf.Vcc = config.Vcc;
-
- link->conf.ConfigIndex = 0x20;
-@@ -965,7 +961,7 @@ void bluecard_config(dev_link_t *link)
-
- for (n = 0; n < 0x400; n += 0x40) {
- link->io.BasePort1 = n ^ 0x300;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- break;
- }
-@@ -975,13 +971,13 @@ void bluecard_config(dev_link_t *link)
- goto failed;
- }
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIRQ, i);
- link->irq.AssignedIRQ = 0;
- }
-
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
- goto failed;
-@@ -1013,9 +1009,9 @@ void bluecard_release(dev_link_t *link)
-
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
- }
-@@ -1043,14 +1039,14 @@ int bluecard_event(event_t event, int pr
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link))
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
-
---- linux-2.6.0/drivers/bluetooth/bt3c_cs.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/drivers/bluetooth/bt3c_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -615,7 +615,7 @@ dev_link_t *bt3c_attach(void)
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- bt3c_detach(link);
-@@ -644,7 +644,7 @@ void bt3c_detach(dev_link_t *link)
- bt3c_release(link);
-
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -655,25 +655,30 @@ void bt3c_detach(dev_link_t *link)
- kfree(info);
- }
-
--
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
- {
- int i;
-
-- i = CardServices(fn, handle, tuple);
-- if (i != CS_SUCCESS)
-- return CS_NO_MORE_ITEMS;
--
-- i = CardServices(GetTupleData, handle, tuple);
-+ i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS)
- return i;
-
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
- }
-
-+static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+{
-+ if (pcmcia_get_first_tuple(handle, tuple) != CS_SUCCESS)
-+ return CS_NO_MORE_ITEMS;
-+ return get_tuple(handle, tuple, parse);
-+}
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+{
-+ if (pcmcia_get_next_tuple(handle, tuple) != CS_SUCCESS)
-+ return CS_NO_MORE_ITEMS;
-+ return get_tuple(handle, tuple, parse);
-+}
-
- void bt3c_config(dev_link_t *link)
- {
-@@ -704,7 +709,7 @@ void bt3c_config(dev_link_t *link)
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-- i = CardServices(GetConfigurationInfo, handle, &config);
-+ i = pcmcia_get_configuration_info(handle, &config);
- link->conf.Vcc = config.Vcc;
-
- /* First pass: look for a config entry that looks normal. */
-@@ -725,7 +730,7 @@ void bt3c_config(dev_link_t *link)
- link->conf.ConfigIndex = cf->index;
- link->io.BasePort1 = cf->io.win[0].base;
- link->io.IOAddrLines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- goto found_port;
- }
-@@ -744,7 +749,7 @@ next_entry:
- for (j = 0; j < 5; j++) {
- link->io.BasePort1 = base[j];
- link->io.IOAddrLines = base[j] ? 16 : 3;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- goto found_port;
- }
-@@ -759,13 +764,13 @@ found_port:
- goto failed;
- }
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIRQ, i);
- link->irq.AssignedIRQ = 0;
- }
-
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
- goto failed;
-@@ -797,9 +802,9 @@ void bt3c_release(dev_link_t *link)
-
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
- }
-@@ -827,14 +832,14 @@ int bt3c_event(event_t event, int priori
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link))
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
-
---- linux-2.6.0/drivers/bluetooth/btuart_cs.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/drivers/bluetooth/btuart_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -622,7 +622,7 @@ dev_link_t *btuart_attach(void)
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- btuart_detach(link);
-@@ -651,7 +651,7 @@ void btuart_detach(dev_link_t *link)
- btuart_release(link);
-
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -662,25 +662,30 @@ void btuart_detach(dev_link_t *link)
- kfree(info);
- }
-
--
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
- {
- int i;
-
-- i = CardServices(fn, handle, tuple);
-- if (i != CS_SUCCESS)
-- return CS_NO_MORE_ITEMS;
--
-- i = CardServices(GetTupleData, handle, tuple);
-+ i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS)
- return i;
-
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
- }
-
-+static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+{
-+ if (pcmcia_get_first_tuple(handle, tuple) != CS_SUCCESS)
-+ return CS_NO_MORE_ITEMS;
-+ return get_tuple(handle, tuple, parse);
-+}
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+{
-+ if (pcmcia_get_next_tuple(handle, tuple) != CS_SUCCESS)
-+ return CS_NO_MORE_ITEMS;
-+ return get_tuple(handle, tuple, parse);
-+}
-
- void btuart_config(dev_link_t *link)
- {
-@@ -711,7 +716,7 @@ void btuart_config(dev_link_t *link)
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-- i = CardServices(GetConfigurationInfo, handle, &config);
-+ i = pcmcia_get_configuration_info(handle, &config);
- link->conf.Vcc = config.Vcc;
-
- /* First pass: look for a config entry that looks normal. */
-@@ -732,7 +737,7 @@ void btuart_config(dev_link_t *link)
- link->conf.ConfigIndex = cf->index;
- link->io.BasePort1 = cf->io.win[0].base;
- link->io.IOAddrLines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- goto found_port;
- }
-@@ -752,7 +757,7 @@ next_entry:
- for (j = 0; j < 5; j++) {
- link->io.BasePort1 = base[j];
- link->io.IOAddrLines = base[j] ? 16 : 3;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- goto found_port;
- }
-@@ -767,13 +772,13 @@ found_port:
- goto failed;
- }
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIRQ, i);
- link->irq.AssignedIRQ = 0;
- }
-
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
- goto failed;
-@@ -805,9 +810,9 @@ void btuart_release(dev_link_t *link)
-
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
- }
-@@ -835,14 +840,14 @@ int btuart_event(event_t event, int prio
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link))
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
-
---- linux-2.6.0/drivers/bluetooth/dtl1_cs.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/drivers/bluetooth/dtl1_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -601,7 +601,7 @@ dev_link_t *dtl1_attach(void)
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- dtl1_detach(link);
-@@ -630,7 +630,7 @@ void dtl1_detach(dev_link_t *link)
- dtl1_release(link);
-
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -641,25 +641,30 @@ void dtl1_detach(dev_link_t *link)
- kfree(info);
- }
-
--
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
- {
- int i;
-
-- i = CardServices(fn, handle, tuple);
-- if (i != CS_SUCCESS)
-- return CS_NO_MORE_ITEMS;
--
-- i = CardServices(GetTupleData, handle, tuple);
-+ i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS)
- return i;
-
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
- }
-
-+static int first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+{
-+ if (pcmcia_get_first_tuple(handle, tuple) != CS_SUCCESS)
-+ return CS_NO_MORE_ITEMS;
-+ return get_tuple(handle, tuple, parse);
-+}
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+{
-+ if (pcmcia_get_next_tuple(handle, tuple) != CS_SUCCESS)
-+ return CS_NO_MORE_ITEMS;
-+ return get_tuple(handle, tuple, parse);
-+}
-
- void dtl1_config(dev_link_t *link)
- {
-@@ -689,7 +694,7 @@ void dtl1_config(dev_link_t *link)
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-- i = CardServices(GetConfigurationInfo, handle, &config);
-+ i = pcmcia_get_configuration_info(handle, &config);
- link->conf.Vcc = config.Vcc;
-
- tuple.TupleData = (cisdata_t *)buf;
-@@ -707,7 +712,7 @@ void dtl1_config(dev_link_t *link)
- link->io.BasePort1 = cf->io.win[0].base;
- link->io.NumPorts1 = cf->io.win[0].len; /*yo */
- link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- break;
- }
-@@ -719,13 +724,13 @@ void dtl1_config(dev_link_t *link)
- goto failed;
- }
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIRQ, i);
- link->irq.AssignedIRQ = 0;
- }
-
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
- goto failed;
-@@ -757,9 +762,9 @@ void dtl1_release(dev_link_t *link)
-
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
- }
-@@ -787,14 +792,14 @@ int dtl1_event(event_t event, int priori
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link))
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
-
---- linux-2.6.0/drivers/cdrom/aztcd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/aztcd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -330,10 +330,10 @@ static int aztGetToc(int multi);
-
- /* Kernel Interface Functions */
- static int check_aztcd_media_change(struct gendisk *disk);
--static int aztcd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
-+static int aztcd_ioctl(struct block_device *bdev, struct file *fp, unsigned int cmd,
- unsigned long arg);
--static int aztcd_open(struct inode *ip, struct file *fp);
--static int aztcd_release(struct inode *inode, struct file *file);
-+static int aztcd_open(struct block_device *bdev, struct file *fp);
-+static int aztcd_release(struct gendisk *disk);
-
- static struct block_device_operations azt_fops = {
- .owner = THIS_MODULE,
-@@ -1153,7 +1153,7 @@ static int check_aztcd_media_change(stru
- /*
- * Kernel IO-controls
- */
--static int aztcd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
-+static int aztcd_ioctl(struct block_device *bdev, struct file *fp, unsigned int cmd,
- unsigned long arg)
- {
- int i;
-@@ -1171,8 +1171,6 @@ static int aztcd_ioctl(struct inode *ip,
- cmd, jiffies);
- printk("aztcd Status %x\n", getAztStatus());
- #endif
-- if (!ip)
-- RETURNM("aztcd_ioctl 1", -EINVAL);
- if (getAztStatus() < 0)
- RETURNM("aztcd_ioctl 2", -EIO);
- if ((!aztTocUpToDate) || (aztDiskChanged)) {
-@@ -1624,7 +1622,7 @@ static void azt_invalidate_buffers(void)
- /*
- * Open the device special file. Check that a disk is in.
- */
--static int aztcd_open(struct inode *ip, struct file *fp)
-+static int aztcd_open(struct block_device *bdev, struct file *fp)
- {
- int st;
-
-@@ -1673,12 +1671,11 @@ static int aztcd_open(struct inode *ip,
- /*
- * On close, we flush all azt blocks from the buffer cache.
- */
--static int aztcd_release(struct inode *inode, struct file *file)
-+static int aztcd_release(struct gendisk *disk)
- {
- #ifdef AZT_DEBUG
- printk("aztcd: executing aztcd_release\n");
-- printk("inode: %p, device: %s file: %p\n", inode,
-- inode->i_bdev->bd_disk->disk_name, file);
-+ printk("disk: %p, device: %s\n", disk, disk->disk_name);
- #endif
- if (!--azt_open_count) {
- azt_invalidate_buffers();
---- linux-2.6.0/drivers/cdrom/cdrom.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/cdrom.c 2003-12-28 23:22:35.000000000 -0800
-@@ -228,10 +228,16 @@
- 3.12 Oct 18, 2000 - Jens Axboe <axboe@suse.de>
- -- Use quiet bit on packet commands not known to work
-
-+ 3.20 Dec 17, 2003 - Jens Axboe <axboe@suse.de>
-+ -- Various fixes and lots of cleanups not listed :-)
-+ -- Locking fixes
-+ -- Mt Rainier support
-+ -- DVD-RAM write open fixes
-+
- -------------------------------------------------------------------------*/
-
--#define REVISION "Revision: 3.12"
--#define VERSION "Id: cdrom.c 3.12 2000/10/18"
-+#define REVISION "Revision: 3.20"
-+#define VERSION "Id: cdrom.c 3.20 2003/12/17"
-
- /* I use an error-log mask to give fine grain control over the type of
- messages dumped to the system logs. The available masks include: */
-@@ -282,11 +288,25 @@ static int autoeject;
- static int lockdoor = 1;
- /* will we ever get to use this... sigh. */
- static int check_media_type;
-+/* automatically restart mrw format */
-+static int mrw_format_restart = 1;
- MODULE_PARM(debug, "i");
- MODULE_PARM(autoclose, "i");
- MODULE_PARM(autoeject, "i");
- MODULE_PARM(lockdoor, "i");
- MODULE_PARM(check_media_type, "i");
-+MODULE_PARM(mrw_format_restart, "i");
-+
-+static spinlock_t cdrom_lock = SPIN_LOCK_UNLOCKED;
-+
-+static const char *mrw_format_status[] = {
-+ "not mrw",
-+ "bgformat inactive",
-+ "bgformat active",
-+ "mrw complete",
-+};
-+
-+static const char *mrw_address_space[] = { "DMA", "GAA" };
-
- #if (ERRLOGMASK!=CD_NOTHING)
- #define cdinfo(type, fmt, args...) \
-@@ -325,6 +345,10 @@ int cdrom_get_last_written(struct cdrom_
- static int cdrom_get_next_writable(struct cdrom_device_info *, long *);
- static void cdrom_count_tracks(struct cdrom_device_info *, tracktype*);
-
-+static int cdrom_mrw_exit(struct cdrom_device_info *cdi);
-+
-+static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di);
-+
- #ifdef CONFIG_SYSCTL
- static void cdrom_sysctl_register(void);
- #endif /* CONFIG_SYSCTL */
-@@ -347,13 +371,14 @@ int register_cdrom(struct cdrom_device_i
-
- if (cdo->open == NULL || cdo->release == NULL)
- return -2;
-- if ( !banner_printed ) {
-+ if (!banner_printed) {
- printk(KERN_INFO "Uniform CD-ROM driver " REVISION "\n");
- banner_printed = 1;
- #ifdef CONFIG_SYSCTL
- cdrom_sysctl_register();
- #endif /* CONFIG_SYSCTL */
- }
-+
- ENSURE(drive_status, CDC_DRIVE_STATUS );
- ENSURE(media_changed, CDC_MEDIA_CHANGED);
- ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY);
-@@ -367,6 +392,7 @@ int register_cdrom(struct cdrom_device_i
- ENSURE(generic_packet, CDC_GENERIC_PACKET);
- cdi->mc_flags = 0;
- cdo->n_minors = 0;
-+ cdi->for_data = 0;
- cdi->options = CDO_USE_FFLAGS;
-
- if (autoclose==1 && CDROM_CAN(CDC_CLOSE_TRAY))
-@@ -378,9 +404,14 @@ int register_cdrom(struct cdrom_device_i
- if (check_media_type==1)
- cdi->options |= (int) CDO_CHECK_TYPE;
-
-+ if (CDROM_CAN(CDC_MRW_W))
-+ cdi->exit = cdrom_mrw_exit;
-+
- cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
-+ spin_lock(&cdrom_lock);
- cdi->next = topCdromPtr;
- topCdromPtr = cdi;
-+ spin_unlock(&cdrom_lock);
- return 0;
- }
- #undef ENSURE
-@@ -391,23 +422,310 @@ int unregister_cdrom(struct cdrom_device
- cdinfo(CD_OPEN, "entering unregister_cdrom\n");
-
- prev = NULL;
-+ spin_lock(&cdrom_lock);
- cdi = topCdromPtr;
- while (cdi && cdi != unreg) {
- prev = cdi;
- cdi = cdi->next;
- }
-
-- if (cdi == NULL)
-+ if (cdi == NULL) {
-+ spin_unlock(&cdrom_lock);
- return -2;
-+ }
- if (prev)
- prev->next = cdi->next;
- else
- topCdromPtr = cdi->next;
-+
-+ spin_unlock(&cdrom_lock);
-+
-+ if (cdi->exit)
-+ cdi->exit(cdi);
-+
- cdi->ops->n_minors--;
- cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
- return 0;
- }
-
-+int cdrom_get_media_event(struct cdrom_device_info *cdi,
-+ struct media_event_desc *med)
-+{
-+ struct cdrom_generic_command cgc;
-+ unsigned char buffer[8];
-+ struct event_header *eh = (struct event_header *) buffer;
-+
-+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
-+ cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION;
-+ cgc.cmd[1] = 1; /* IMMED */
-+ cgc.cmd[4] = 1 << 4; /* media event */
-+ cgc.cmd[8] = sizeof(buffer);
-+ cgc.quiet = 1;
-+
-+ if (cdi->ops->generic_packet(cdi, &cgc))
-+ return 1;
-+
-+ if (be16_to_cpu(eh->data_len) < sizeof(*med))
-+ return 1;
-+
-+ memcpy(med, &buffer[sizeof(*eh)], sizeof(*med));
-+ return 0;
-+}
-+
-+/*
-+ * the first prototypes used 0x2c as the page code for the mrw mode page,
-+ * subsequently this was changed to 0x03. probe the one used by this drive
-+ */
-+int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi)
-+{
-+ struct cdrom_generic_command cgc;
-+ char buffer[16];
-+
-+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
-+
-+ cgc.timeout = HZ;
-+ cgc.quiet = 1;
-+
-+ if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) {
-+ cdi->mrw_mode_page = MRW_MODE_PC;
-+ return 0;
-+ } else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) {
-+ cdi->mrw_mode_page = MRW_MODE_PC_PRE1;
-+ return 0;
-+ }
-+
-+ printk(KERN_ERR "cdrom: %s: unknown mrw mode page\n", cdi->name);
-+ return 1;
-+}
-+
-+int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write)
-+{
-+ struct cdrom_generic_command cgc;
-+ struct mrw_feature_desc *mfd;
-+ unsigned char buffer[16];
-+ int ret;
-+
-+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
-+
-+ cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
-+ cgc.cmd[3] = CDF_MRW;
-+ cgc.cmd[8] = sizeof(buffer);
-+ cgc.quiet = 1;
-+
-+ if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
-+ return ret;
-+
-+ mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];
-+ *write = mfd->write;
-+
-+ if ((ret = cdrom_mrw_probe_pc(cdi)))
-+ return ret;
-+
-+ return 0;
-+}
-+
-+static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
-+{
-+ struct cdrom_generic_command cgc;
-+ unsigned char buffer[12];
-+ int ret;
-+
-+ printk(KERN_INFO "cdrom: %sstarting format\n", cont ? "Re" : "");
-+
-+ /*
-+ * FmtData bit set (bit 4), format type is 1
-+ */
-+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_WRITE);
-+ cgc.cmd[0] = GPCMD_FORMAT_UNIT;
-+ cgc.cmd[1] = (1 << 4) | 1;
-+
-+ cgc.timeout = 5 * 60 * HZ;
-+
-+ /*
-+ * 4 byte format list header, 8 byte format list descriptor
-+ */
-+ buffer[1] = 1 << 1;
-+ buffer[3] = 8;
-+
-+ /*
-+ * nr_blocks field
-+ */
-+ buffer[4] = 0xff;
-+ buffer[5] = 0xff;
-+ buffer[6] = 0xff;
-+ buffer[7] = 0xff;
-+
-+ buffer[8] = 0x24 << 2;
-+ buffer[11] = cont;
-+
-+ ret = cdi->ops->generic_packet(cdi, &cgc);
-+ if (ret)
-+ printk(KERN_INFO "cdrom: bgformat failed\n");
-+
-+ return ret;
-+}
-+
-+static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed)
-+{
-+ struct cdrom_generic_command cgc;
-+
-+ init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
-+ cgc.cmd[0] = GPCMD_CLOSE_TRACK;
-+
-+ /*
-+ * Session = 1, Track = 0
-+ */
-+ cgc.cmd[1] = !!immed;
-+ cgc.cmd[2] = 1 << 1;
-+
-+ cgc.timeout = 5 * 60 * HZ;
-+
-+ return cdi->ops->generic_packet(cdi, &cgc);
-+}
-+
-+static int cdrom_flush_cache(struct cdrom_device_info *cdi)
-+{
-+ struct cdrom_generic_command cgc;
-+
-+ init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
-+ cgc.cmd[0] = GPCMD_FLUSH_CACHE;
-+
-+ cgc.timeout = 5 * 60 * HZ;
-+
-+ return cdi->ops->generic_packet(cdi, &cgc);
-+}
-+
-+static int cdrom_mrw_exit(struct cdrom_device_info *cdi)
-+{
-+ disc_information di;
-+ int ret = 0;
-+
-+ if (cdrom_get_disc_info(cdi, &di))
-+ return 1;
-+
-+ if (di.mrw_status == CDM_MRW_BGFORMAT_ACTIVE) {
-+ printk(KERN_INFO "cdrom: issuing MRW back ground format suspend\n");
-+ ret = cdrom_mrw_bgformat_susp(cdi, 0);
-+ }
-+
-+ if (!ret)
-+ ret = cdrom_flush_cache(cdi);
-+
-+ return ret;
-+}
-+
-+static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
-+{
-+ struct cdrom_generic_command cgc;
-+ struct mode_page_header *mph;
-+ char buffer[16];
-+ int ret, offset, size;
-+
-+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
-+
-+ cgc.buffer = buffer;
-+ cgc.buflen = sizeof(buffer);
-+
-+ if ((ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0)))
-+ return ret;
-+
-+ mph = (struct mode_page_header *) buffer;
-+ offset = be16_to_cpu(mph->desc_length);
-+ size = be16_to_cpu(mph->mode_data_length) + 2;
-+
-+ buffer[offset + 3] = space;
-+ cgc.buflen = size;
-+
-+ if ((ret = cdrom_mode_select(cdi, &cgc)))
-+ return ret;
-+
-+ printk(KERN_INFO "cdrom: %s: mrw address space %s selected\n", cdi->name, mrw_address_space[space]);
-+ return 0;
-+}
-+
-+static int cdrom_media_erasable(struct cdrom_device_info *cdi)
-+{
-+ disc_information di;
-+
-+ if (cdrom_get_disc_info(cdi, &di))
-+ return 0;
-+
-+ return di.erasable;
-+}
-+
-+/*
-+ * FIXME: check RO bit
-+ */
-+static int cdrom_dvdram_open_write(struct cdrom_device_info *cdi)
-+{
-+ return !cdrom_media_erasable(cdi);
-+}
-+
-+static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
-+{
-+ disc_information di;
-+ int ret;
-+
-+ /*
-+ * always reset to DMA lba space on open
-+ */
-+ if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) {
-+ printk(KERN_ERR "cdrom: failed setting lba address space\n");
-+ return 1;
-+ }
-+
-+ if (cdrom_get_disc_info(cdi, &di))
-+ return 1;
-+
-+ if (!di.erasable)
-+ return 1;
-+
-+ /*
-+ * mrw_status
-+ * 0 - not MRW formatted
-+ * 1 - MRW bgformat started, but not running or complete
-+ * 2 - MRW bgformat in progress
-+ * 3 - MRW formatting complete
-+ */
-+ ret = 0;
-+ printk(KERN_INFO "cdrom open: mrw_status '%s'\n", mrw_format_status[di.mrw_status]);
-+ if (!di.mrw_status)
-+ ret = 1;
-+ else if (di.mrw_status == CDM_MRW_BGFORMAT_INACTIVE && mrw_format_restart)
-+ ret = cdrom_mrw_bgformat(cdi, 1);
-+
-+ return ret;
-+}
-+
-+/*
-+ * returns 0 for ok to open write, non-0 to disallow
-+ */
-+static int cdrom_open_write(struct cdrom_device_info *cdi)
-+{
-+ int ret = 1;
-+
-+ if (CDROM_CAN(CDC_MRW_W))
-+ ret = cdrom_mrw_open_write(cdi);
-+ else if (CDROM_CAN(CDC_DVD_RAM))
-+ ret = cdrom_dvdram_open_write(cdi);
-+ /*
-+ * needs to really check whether media is writeable
-+ */
-+ else if (CDROM_CAN(CDC_MO_DRIVE))
-+ ret = 0;
-+
-+ return ret;
-+}
-+
-+static int cdrom_close_write(struct cdrom_device_info *cdi)
-+{
-+#if 0
-+ return cdrom_flush_cache(cdi);
-+#else
-+ return 0;
-+#endif
-+}
-+
- /* We use the open-option O_NONBLOCK to indicate that the
- * purpose of opening is only for subsequent ioctl() calls; no device
- * integrity checks are performed.
-@@ -416,28 +734,34 @@ int unregister_cdrom(struct cdrom_device
- * is in their own interest: device control becomes a lot easier
- * this way.
- */
--int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
-+int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, struct file *fp)
- {
- int ret;
-
- cdinfo(CD_OPEN, "entering cdrom_open\n");
-+ cdi->use_count++;
-+ ret = -EROFS;
-+ if (fp->f_mode & FMODE_WRITE) {
-+ if (!CDROM_CAN(CDC_RAM))
-+ goto out;
-+ if (cdrom_open_write(cdi))
-+ goto out;
-+ }
-+
- /* if this was a O_NONBLOCK open and we should honor the flags,
- * do a quick open without drive/disc integrity checks. */
- if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS))
- ret = cdi->ops->open(cdi, 1);
-- else {
-- if ((fp->f_mode & FMODE_WRITE) && !CDROM_CAN(CDC_DVD_RAM))
-- return -EROFS;
--
-+ else
- ret = open_for_data(cdi);
-- }
--
-- if (!ret) cdi->use_count++;
-
- cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n", cdi->name, cdi->use_count);
- /* Do this on open. Don't wait for mount, because they might
- not be mounting, but opening with O_NONBLOCK */
-- check_disk_change(ip->i_bdev);
-+ check_disk_change(bdev);
-+out:
-+ if (ret)
-+ cdi->use_count--;
- return ret;
- }
-
-@@ -525,11 +849,12 @@ int open_for_data(struct cdrom_device_in
- cdinfo(CD_OPEN, "open device failed.\n");
- goto clean_up_and_return;
- }
-- if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
-+ if (CDROM_CAN(CDC_LOCK) && (cdi->options & CDO_LOCK)) {
- cdo->lock_door(cdi, 1);
- cdinfo(CD_OPEN, "door locked.\n");
- }
- cdinfo(CD_OPEN, "device opened successfully.\n");
-+ cdi->for_data = 1;
- return ret;
-
- /* Something failed. Try to unlock the drive, because some drivers
-@@ -603,32 +928,39 @@ int check_for_audio_disc(struct cdrom_de
- return 0;
- }
-
--
- /* Admittedly, the logic below could be performed in a nicer way. */
--int cdrom_release(struct cdrom_device_info *cdi, struct file *fp)
-+int cdrom_release(struct cdrom_device_info *cdi)
- {
- struct cdrom_device_ops *cdo = cdi->ops;
-- int opened_for_data;
-
- cdinfo(CD_CLOSE, "entering cdrom_release\n");
-
- if (cdi->use_count > 0)
- cdi->use_count--;
-- if (cdi->use_count == 0)
-- cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
-- if (cdi->use_count == 0 &&
-- cdo->capability & CDC_LOCK && !keeplocked) {
-+
-+ if (cdi->use_count) {
-+ cdo->release(cdi);
-+ return 0;
-+ }
-+
-+ cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
-+ if ((cdo->capability & CDC_LOCK) && !keeplocked) {
- cdinfo(CD_CLOSE, "Unlocking door!\n");
- cdo->lock_door(cdi, 0);
- }
-- opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
-- !(fp && fp->f_flags & O_NONBLOCK);
-+
-+ /*
-+ * flush cache on last write release
-+ */
-+ if (CDROM_CAN(CDC_RAM) && !cdi->use_count && cdi->for_data)
-+ cdrom_close_write(cdi);
-+
- cdo->release(cdi);
-- if (cdi->use_count == 0) { /* last process that closes dev*/
-- if (opened_for_data &&
-- cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
-- cdo->tray_move(cdi, 1);
-- }
-+ if (cdi->for_data &&
-+ cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
-+ cdo->tray_move(cdi, 1);
-+
-+ cdi->for_data = 0;
- return 0;
- }
-
-@@ -1433,14 +1765,14 @@ static int cdrom_read_block(struct cdrom
- * these days. ATAPI / SCSI specific code now mainly resides in
- * mmc_ioct().
- */
--int cdrom_ioctl(struct cdrom_device_info *cdi, struct inode *ip,
-+int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
- unsigned int cmd, unsigned long arg)
- {
- struct cdrom_device_ops *cdo = cdi->ops;
- int ret;
-
- /* Try the generic SCSI command ioctl's first.. */
-- ret = scsi_cmd_ioctl(ip->i_bdev, cmd, arg);
-+ ret = scsi_cmd_ioctl(bdev, cmd, arg);
- if (ret != -ENOTTY)
- return ret;
-
-@@ -1593,7 +1925,7 @@ int cdrom_ioctl(struct cdrom_device_info
- cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
- if (!CDROM_CAN(CDC_RESET))
- return -ENOSYS;
-- invalidate_bdev(ip->i_bdev, 0);
-+ invalidate_bdev(bdev, 0);
- return cdo->reset(cdi);
- }
-
-@@ -2203,7 +2535,6 @@ static int cdrom_get_disc_info(struct cd
- return cdo->generic_packet(cdi, &cgc);
- }
-
--
- /* return the last written block on the CD-R media. this is for the udf
- file system. */
- int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
-@@ -2310,6 +2641,8 @@ EXPORT_SYMBOL(cdrom_number_of_slots);
- EXPORT_SYMBOL(cdrom_mode_select);
- EXPORT_SYMBOL(cdrom_mode_sense);
- EXPORT_SYMBOL(init_cdrom_command);
-+EXPORT_SYMBOL(cdrom_get_media_event);
-+EXPORT_SYMBOL(cdrom_is_mrw);
-
- #ifdef CONFIG_SYSCTL
-
-@@ -2406,6 +2739,14 @@ int cdrom_sysctl_info(ctl_table *ctl, in
- for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
- pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0);
-
-+ pos += sprintf(info+pos, "\nCan read MRW:");
-+ for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
-+ pos += sprintf(info+pos, "\t\t%d", CDROM_CAN(CDC_MRW) != 0);
-+
-+ pos += sprintf(info+pos, "\nCan write MRW:");
-+ for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
-+ pos += sprintf(info+pos, "\t\t%d", CDROM_CAN(CDC_MRW_W) != 0);
-+
- strcpy(info+pos,"\n\n");
-
- return proc_dostring(ctl, write, filp, buffer, lenp);
---- linux-2.6.0/drivers/cdrom/cdu31a.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/cdu31a.c 2003-12-28 23:21:17.000000000 -0800
-@@ -3167,20 +3167,20 @@ static struct cdrom_device_info scd_info
- .name = "cdu31a"
- };
-
--static int scd_block_open(struct inode *inode, struct file *file)
-+static int scd_block_open(struct block_device *bdev, struct file *file)
- {
-- return cdrom_open(&scd_info, inode, file);
-+ return cdrom_open(&scd_info, bdev, file);
- }
-
--static int scd_block_release(struct inode *inode, struct file *file)
-+static int scd_block_release(struct gendisk *disk)
- {
-- return cdrom_release(&scd_info, file);
-+ return cdrom_release(&scd_info);
- }
-
--static int scd_block_ioctl(struct inode *inode, struct file *file,
-+static int scd_block_ioctl(struct block_device *bdev, struct file *file,
- unsigned cmd, unsigned long arg)
- {
-- return cdrom_ioctl(&scd_info, inode, cmd, arg);
-+ return cdrom_ioctl(&scd_info, bdev, cmd, arg);
- }
-
- static int scd_block_media_changed(struct gendisk *disk)
---- linux-2.6.0/drivers/cdrom/cm206.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/cm206.c 2003-12-28 23:21:17.000000000 -0800
-@@ -1350,20 +1350,20 @@ static struct cdrom_device_info cm206_in
- .name = "cm206",
- };
-
--static int cm206_block_open(struct inode *inode, struct file *file)
-+static int cm206_block_open(struct block_device *bdev, struct file *file)
- {
-- return cdrom_open(&cm206_info, inode, file);
-+ return cdrom_open(&cm206_info, bdev, file);
- }
-
--static int cm206_block_release(struct inode *inode, struct file *file)
-+static int cm206_block_release(struct gendisk *disk)
- {
-- return cdrom_release(&cm206_info, file);
-+ return cdrom_release(&cm206_info);
- }
-
--static int cm206_block_ioctl(struct inode *inode, struct file *file,
-+static int cm206_block_ioctl(struct block_device *bdev, struct file *file,
- unsigned cmd, unsigned long arg)
- {
-- return cdrom_ioctl(&cm206_info, inode, cmd, arg);
-+ return cdrom_ioctl(&cm206_info, bdev, cmd, arg);
- }
-
- static int cm206_block_media_changed(struct gendisk *disk)
---- linux-2.6.0/drivers/cdrom/gscd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/gscd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -91,10 +91,10 @@ static void gscd_bin2bcd(unsigned char *
- /* Schnittstellen zum Kern/FS */
-
- static void __do_gscd_request(unsigned long dummy);
--static int gscd_ioctl(struct inode *, struct file *, unsigned int,
-+static int gscd_ioctl(struct block_device *, struct file *, unsigned int,
- unsigned long);
--static int gscd_open(struct inode *, struct file *);
--static int gscd_release(struct inode *, struct file *);
-+static int gscd_open(struct block_device *, struct file *);
-+static int gscd_release(struct gendisk *disk);
- static int check_gscd_med_chg(struct gendisk *disk);
-
- /* GoldStar Funktionen */
-@@ -190,8 +190,8 @@ __setup("gscd=", gscd_setup);
-
- #endif
-
--static int gscd_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
-- unsigned long arg)
-+static int gscd_ioctl(struct block_device *bdev, struct file *fp,
-+ unsigned int cmd, unsigned long arg)
- {
- unsigned char to_do[10];
- unsigned char dummy;
-@@ -338,7 +338,7 @@ static void gscd_read_cmd(struct request
- * Open the device special file. Check that a disk is in.
- */
-
--static int gscd_open(struct inode *ip, struct file *fp)
-+static int gscd_open(struct block_device *bdev, struct file *fp)
- {
- int st;
-
-@@ -368,7 +368,7 @@ static int gscd_open(struct inode *ip, s
- * On close, we flush all gscd blocks from the buffer cache.
- */
-
--static int gscd_release(struct inode *inode, struct file *file)
-+static int gscd_release(struct gendisk *disk)
- {
-
- #ifdef GSCD_DEBUG
---- linux-2.6.0/drivers/cdrom/mcd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/mcd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -214,20 +214,20 @@ static struct cdrom_device_info mcd_info
- .name = "mcd",
- };
-
--static int mcd_block_open(struct inode *inode, struct file *file)
-+static int mcd_block_open(struct block_device *bdev, struct file *file)
- {
-- return cdrom_open(&mcd_info, inode, file);
-+ return cdrom_open(&mcd_info, bdev, file);
- }
-
--static int mcd_block_release(struct inode *inode, struct file *file)
-+static int mcd_block_release(struct gendisk *disk)
- {
-- return cdrom_release(&mcd_info, file);
-+ return cdrom_release(&mcd_info);
- }
-
--static int mcd_block_ioctl(struct inode *inode, struct file *file,
-+static int mcd_block_ioctl(struct block_device *bdev, struct file *file,
- unsigned cmd, unsigned long arg)
- {
-- return cdrom_ioctl(&mcd_info, inode, cmd, arg);
-+ return cdrom_ioctl(&mcd_info, bdev, cmd, arg);
- }
-
- static int mcd_block_media_changed(struct gendisk *disk)
---- linux-2.6.0/drivers/cdrom/mcdx.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/mcdx.c 2003-12-28 23:21:17.000000000 -0800
-@@ -221,23 +221,23 @@ struct s_drive_stuff {
- int mcdx_init(void);
- void do_mcdx_request(request_queue_t * q);
-
--static int mcdx_block_open(struct inode *inode, struct file *file)
-+static int mcdx_block_open(struct block_device *bdev, struct file *file)
- {
-- struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-- return cdrom_open(&p->info, inode, file);
-+ struct s_drive_stuff *p = bdev->bd_disk->private_data;
-+ return cdrom_open(&p->info, bdev, file);
- }
-
--static int mcdx_block_release(struct inode *inode, struct file *file)
-+static int mcdx_block_release(struct gendisk *disk)
- {
-- struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-- return cdrom_release(&p->info, file);
-+ struct s_drive_stuff *p = disk->private_data;
-+ return cdrom_release(&p->info);
- }
-
--static int mcdx_block_ioctl(struct inode *inode, struct file *file,
-+static int mcdx_block_ioctl(struct block_device *bdev, struct file *file,
- unsigned cmd, unsigned long arg)
- {
-- struct s_drive_stuff *p = inode->i_bdev->bd_disk->private_data;
-- return cdrom_ioctl(&p->info, inode, cmd, arg);
-+ struct s_drive_stuff *p = bdev->bd_disk->private_data;
-+ return cdrom_ioctl(&p->info, bdev, cmd, arg);
- }
-
- static int mcdx_block_media_changed(struct gendisk *disk)
---- linux-2.6.0/drivers/cdrom/optcd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/optcd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -1713,16 +1713,13 @@ static int cdromreset(void)
- /* VFS calls */
-
-
--static int opt_ioctl(struct inode *ip, struct file *fp,
-+static int opt_ioctl(struct block_device *bdev, struct file *fp,
- unsigned int cmd, unsigned long arg)
- {
- int status, err, retval = 0;
-
- DEBUG((DEBUG_VFS, "starting opt_ioctl"));
-
-- if (!ip)
-- return -EINVAL;
--
- if (cmd == CDROMRESET)
- return cdromreset();
-
-@@ -1844,7 +1841,7 @@ static int opt_ioctl(struct inode *ip, s
- static int open_count = 0;
-
- /* Open device special file; check that a disk is in. */
--static int opt_open(struct inode *ip, struct file *fp)
-+static int opt_open(struct block_device *bdev, struct file *fp)
- {
- DEBUG((DEBUG_VFS, "starting opt_open"));
-
-@@ -1904,13 +1901,12 @@ err_out:
-
-
- /* Release device special file; flush all blocks from the buffer cache */
--static int opt_release(struct inode *ip, struct file *fp)
-+static int opt_release(struct gendisk *disk)
- {
- int status;
-
- DEBUG((DEBUG_VFS, "executing opt_release"));
-- DEBUG((DEBUG_VFS, "inode: %p, device: %s, file: %p\n",
-- ip, ip->i_bdev->bd_disk->disk_name, fp));
-+ DEBUG((DEBUG_VFS, "disk: %p, device: %s\n", disk, disk->disk_name));
-
- if (!--open_count) {
- toc_uptodate = 0;
---- linux-2.6.0/drivers/cdrom/sbpcd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/sbpcd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -5356,23 +5356,23 @@ static int sbp_data(struct request *req)
- }
- /*==========================================================================*/
-
--static int sbpcd_block_open(struct inode *inode, struct file *file)
-+static int sbpcd_block_open(struct block_device *bdev, struct file *file)
- {
-- struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-- return cdrom_open(p->sbpcd_infop, inode, file);
-+ struct sbpcd_drive *p = bdev->bd_disk->private_data;
-+ return cdrom_open(p->sbpcd_infop, bdev, file);
- }
-
--static int sbpcd_block_release(struct inode *inode, struct file *file)
-+static int sbpcd_block_release(struct gendisk *disk)
- {
-- struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-- return cdrom_release(p->sbpcd_infop, file);
-+ struct sbpcd_drive *p = disk->private_data;
-+ return cdrom_release(p->sbpcd_infop);
- }
-
--static int sbpcd_block_ioctl(struct inode *inode, struct file *file,
-+static int sbpcd_block_ioctl(struct block_device *bdev, struct file *file,
- unsigned cmd, unsigned long arg)
- {
-- struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
-- return cdrom_ioctl(p->sbpcd_infop, inode, cmd, arg);
-+ struct sbpcd_drive *p = bdev->bd_disk->private_data;
-+ return cdrom_ioctl(p->sbpcd_infop, bdev, cmd, arg);
- }
-
- static int sbpcd_block_media_changed(struct gendisk *disk)
---- linux-2.6.0/drivers/cdrom/sjcd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/sjcd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -713,16 +713,13 @@ static int sjcd_tray_open(void)
- /*
- * Do some user commands.
- */
--static int sjcd_ioctl(struct inode *ip, struct file *fp,
-+static int sjcd_ioctl(struct block_device *bdev, struct file *fp,
- unsigned int cmd, unsigned long arg)
- {
- #if defined( SJCD_TRACE )
- printk("SJCD:ioctl\n");
- #endif
-
-- if (ip == NULL)
-- return (-EINVAL);
--
- sjcd_get_status();
- if (!sjcd_status_valid)
- return (-EIO);
-@@ -1526,7 +1523,7 @@ static void do_sjcd_request(request_queu
- /*
- * Open the device special file. Check disk is in.
- */
--static int sjcd_open(struct inode *ip, struct file *fp)
-+static int sjcd_open(struct block_device *bdev, struct file *fp)
- {
- /*
- * Check the presence of device.
-@@ -1611,7 +1608,7 @@ static int sjcd_open(struct inode *ip, s
- /*
- * On close, we flush all sjcd blocks from the buffer cache.
- */
--static int sjcd_release(struct inode *inode, struct file *file)
-+static int sjcd_release(struct gendisk *disk)
- {
- int s;
-
---- linux-2.6.0/drivers/cdrom/sonycd535.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/cdrom/sonycd535.c 2003-12-28 23:21:17.000000000 -0800
-@@ -201,7 +201,7 @@
-
- static int read_subcode(void);
- static void sony_get_toc(void);
--static int cdu_open(struct inode *inode, struct file *filp);
-+static int cdu_open(struct block_device *bdev, struct file *filp);
- static inline unsigned int int_to_bcd(unsigned int val);
- static unsigned int bcd_to_int(unsigned int bcd);
- static int do_sony_cmd(Byte * cmd, int nCmd, Byte status[2],
-@@ -1061,7 +1061,7 @@ sony_get_subchnl_info(long arg)
- * The big ugly ioctl handler.
- */
- static int
--cdu_ioctl(struct inode *inode,
-+cdu_ioctl(struct block_device *bdev,
- struct file *file,
- unsigned int cmd,
- unsigned long arg)
-@@ -1360,9 +1360,7 @@ cdu_ioctl(struct inode *inode,
- * Open the drive for operations. Spin the drive up and read the table of
- * contents if these have not already been done.
- */
--static int
--cdu_open(struct inode *inode,
-- struct file *filp)
-+static int cdu_open(struct block_device *bdev, struct file *filp)
- {
- Byte status[2], cmd_buff[2];
-
-@@ -1385,7 +1383,7 @@ cdu_open(struct inode *inode,
- sony_inuse = 0;
- return -EIO;
- }
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- sony_usage++;
-
- #ifdef LOCK_DOORS
-@@ -1402,9 +1400,7 @@ cdu_open(struct inode *inode,
- * Close the drive. Spin it down if no task is using it. The spin
- * down will fail if playing audio, so audio play is OK.
- */
--static int
--cdu_release(struct inode *inode,
-- struct file *filp)
-+static int cdu_release(struct gendisk *disk)
- {
- Byte status[2], cmd_no;
-
---- linux-2.6.0/drivers/char/agp/alpha-agp.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/char/agp/alpha-agp.c 2003-12-28 23:22:12.000000000 -0800
-@@ -13,7 +13,7 @@
-
- static struct page *alpha_core_agp_vm_nopage(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access)
-+ int *type)
- {
- alpha_agp_info *agp = agp_bridge->dev_private_data;
- dma_addr_t dma_addr;
-@@ -30,6 +30,8 @@ static struct page *alpha_core_agp_vm_no
- */
- page = virt_to_page(__va(pa));
- get_page(page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return page;
- }
-
---- linux-2.6.0/drivers/char/drm/drmP.h 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/char/drm/drmP.h 2003-12-28 23:22:12.000000000 -0800
-@@ -760,16 +760,16 @@ extern int DRM(fasync)(int fd, stru
- /* Mapping support (drm_vm.h) */
- extern struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access);
-+ int *type);
- extern struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access);
-+ int *type);
- extern struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access);
-+ int *type);
- extern struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access);
-+ int *type);
- extern void DRM(vm_open)(struct vm_area_struct *vma);
- extern void DRM(vm_close)(struct vm_area_struct *vma);
- extern void DRM(vm_shm_close)(struct vm_area_struct *vma);
---- linux-2.6.0/drivers/char/drm/drm_vm.h 2003-07-13 21:44:34.000000000 -0700
-+++ 25/drivers/char/drm/drm_vm.h 2003-12-28 23:22:12.000000000 -0800
-@@ -76,7 +76,7 @@ struct vm_operations_struct DRM(vm_sg_
- */
- struct page *DRM(vm_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access)
-+ int *type)
- {
- #if __REALLY_HAVE_AGP
- drm_file_t *priv = vma->vm_file->private_data;
-@@ -133,6 +133,8 @@ struct page *DRM(vm_nopage)(struct vm_ar
- baddr, __va(agpmem->memory->memory[offset]), offset,
- atomic_read(&page->count));
-
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return page;
- }
- vm_nopage_error:
-@@ -154,7 +156,7 @@ vm_nopage_error:
- */
- struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access)
-+ int *type)
- {
- drm_map_t *map = (drm_map_t *)vma->vm_private_data;
- unsigned long offset;
-@@ -170,6 +172,8 @@ struct page *DRM(vm_shm_nopage)(struct v
- if (!page)
- return NOPAGE_OOM;
- get_page(page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
-
- DRM_DEBUG("shm_nopage 0x%lx\n", address);
- return page;
-@@ -268,7 +272,7 @@ void DRM(vm_shm_close)(struct vm_area_st
- */
- struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access)
-+ int *type)
- {
- drm_file_t *priv = vma->vm_file->private_data;
- drm_device_t *dev = priv->dev;
-@@ -287,6 +291,8 @@ struct page *DRM(vm_dma_nopage)(struct v
- (offset & (~PAGE_MASK))));
-
- get_page(page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
-
- DRM_DEBUG("dma_nopage 0x%lx (page %lu)\n", address, page_nr);
- return page;
-@@ -304,7 +310,7 @@ struct page *DRM(vm_dma_nopage)(struct v
- */
- struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma,
- unsigned long address,
-- int write_access)
-+ int *type)
- {
- drm_map_t *map = (drm_map_t *)vma->vm_private_data;
- drm_file_t *priv = vma->vm_file->private_data;
-@@ -325,6 +331,8 @@ struct page *DRM(vm_sg_nopage)(struct vm
- page_offset = (offset >> PAGE_SHIFT) + (map_offset >> PAGE_SHIFT);
- page = entry->pagelist[page_offset];
- get_page(page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
-
- return page;
- }
---- linux-2.6.0/drivers/char/keyboard.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/char/keyboard.c 2003-12-28 23:21:28.000000000 -0800
-@@ -941,16 +941,16 @@ static unsigned short x86_keycodes[256]
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
- 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
-- 80, 81, 82, 83, 43, 85, 86, 87, 88,115,119,120,121,375,123, 90,
-- 284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339,
-- 367,288,302,304,350, 92,334,512,116,377,109,111,373,347,348,349,
-- 360, 93, 94, 95, 98,376,100,101,321,316,354,286,289,102,351,355,
-+ 80, 81, 82, 83, 84, 93, 86, 87, 88, 94, 95, 85,259,375,260, 90,
-+ 284,285,309,311,312, 91,327,328,329,331,333,335,336,337,338,339,
-+ 367,288,302,304,350, 89,334,326,116,377,109,111,126,347,348,349,
-+ 360,261,262,263,298,376,100,101,321,316,373,286,289,102,351,355,
- 103,104,105,275,287,279,306,106,274,107,294,364,358,363,362,361,
-- 291,108,381,281,290,272,292,305,280, 99,112,257,258,359,270,114,
-- 118,117,125,374,379,115,112,125,121,123,264,265,266,267,268,269,
-- 271,273,276,277,278,282,283,295,296,297,299,300,301,293,303,307,
-- 308,310,313,314,315,317,318,319,320,357,322,323,324,325,326,330,
-- 332,340,365,342,343,344,345,346,356,113,341,368,369,370,371,372 };
-+ 291,108,381,281,290,272,292,305,280, 99,112,257,258,359,113,114,
-+ 264,117,271,374,379,115,125,273,121,123, 92,265,266,267,268,269,
-+ 120,119,118,277,278,282,283,295,296,297,299,300,301,293,303,307,
-+ 308,310,313,314,315,317,318,319,320,357,322,323,324,325,276,330,
-+ 332,340,365,342,343,344,345,346,356,270,341,368,369,370,371,372 };
-
- #ifdef CONFIG_MAC_EMUMOUSEBTN
- extern int mac_hid_mouse_emulate_buttons(int, int, int);
-@@ -972,11 +972,18 @@ static int emulate_raw(struct vc_data *v
- if (keycode > 255 || !x86_keycodes[keycode])
- return -1;
-
-- if (keycode == KEY_PAUSE) {
-- put_queue(vc, 0xe1);
-- put_queue(vc, 0x1d | up_flag);
-- put_queue(vc, 0x45 | up_flag);
-- return 0;
-+ switch (keycode) {
-+ case KEY_PAUSE:
-+ put_queue(vc, 0xe1);
-+ put_queue(vc, 0x1d | up_flag);
-+ put_queue(vc, 0x45 | up_flag);
-+ return 0;
-+ case KEY_LANG1:
-+ if (!up_flag) put_queue(vc, 0xf1);
-+ return 0;
-+ case KEY_LANG2:
-+ if (!up_flag) put_queue(vc, 0xf2);
-+ return 0;
- }
-
- if (keycode == KEY_SYSRQ && sysrq_alt) {
-@@ -1052,6 +1059,9 @@ void kbd_keycode(unsigned int keycode, i
- }
- if (sysrq_down && down && !rep) {
- handle_sysrq(kbd_sysrq_xlate[keycode], regs, tty);
-+#ifdef CONFIG_KGDB_SYSRQ
-+ sysrq_down = 0; /* in case we miss the "up" event */
-+#endif
- return;
- }
- #endif
---- linux-2.6.0/drivers/char/mem.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/char/mem.c 2003-12-28 23:22:59.000000000 -0800
-@@ -24,6 +24,7 @@
- #include <linux/smp_lock.h>
- #include <linux/devfs_fs_kernel.h>
- #include <linux/ptrace.h>
-+#include <linux/device.h>
-
- #include <asm/uaccess.h>
- #include <asm/io.h>
-@@ -40,6 +41,7 @@ extern void fbmem_init(void);
- extern void tapechar_init(void);
- #endif
-
-+#ifdef pgprot_noncached
- /*
- * Architectures vary in how they handle caching for addresses
- * outside of main memory.
-@@ -65,19 +67,21 @@ static inline int uncached_access(struct
- && addr >= __pa(high_memory);
- #elif defined(CONFIG_IA64)
- /*
-- * On ia64, we ignore O_SYNC because we cannot tolerate memory attribute aliases.
-+ * On ia64, we ignore O_SYNC because we cannot tolerate memory
-+ * attribute aliases.
- */
- return !(efi_mem_attributes(addr) & EFI_MEMORY_WB);
- #else
- /*
-- * Accessing memory above the top the kernel knows about or through a file pointer
-- * that was marked O_SYNC will be done non-cached.
-+ * Accessing memory above the top the kernel knows about or through a
-+ * file pointer that was marked O_SYNC will be done non-cached.
- */
- if (file->f_flags & O_SYNC)
- return 1;
- return addr >= __pa(high_memory);
- #endif
- }
-+#endif /* pgprot_noncached */
-
- #ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE
- static inline int valid_phys_addr_range(unsigned long addr, size_t *count)
-@@ -167,28 +171,24 @@ static ssize_t write_mem(struct file * f
- return do_write_mem(file, __va(p), p, buf, count, ppos);
- }
-
--static int mmap_mem(struct file * file, struct vm_area_struct * vma)
-+static int mmap_mem(struct file *file, struct vm_area_struct *vma)
- {
- unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
-- int uncached;
-
-- uncached = uncached_access(file, offset);
- #ifdef pgprot_noncached
-- if (uncached)
-+ if (uncached_access(file, offset))
- vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
- #endif
-
-- /* Don't try to swap out physical pages.. */
-- vma->vm_flags |= VM_RESERVED;
--
- /*
-- * Don't dump addresses that are not real memory to a core file.
-+ * Don't try to swap out physical pages..
-+ * And treat /dev/mem mappings as "IO" regions: they may not
-+ * describe valid pageframes.
- */
-- if (uncached)
-- vma->vm_flags |= VM_IO;
-+ vma->vm_flags |= VM_RESERVED|VM_IO;
-
-- if (remap_page_range(vma, vma->vm_start, offset, vma->vm_end-vma->vm_start,
-- vma->vm_page_prot))
-+ if (remap_page_range(vma, vma->vm_start, offset,
-+ vma->vm_end-vma->vm_start, vma->vm_page_prot))
- return -EAGAIN;
- return 0;
- }
-@@ -676,6 +676,10 @@ static const struct {
- {11,"kmsg", S_IRUGO | S_IWUSR, &kmsg_fops},
- };
-
-+static struct class mem_class = {
-+ .name = "mem",
-+};
-+
- static int __init chr_dev_init(void)
- {
- int i;
-@@ -683,7 +687,11 @@ static int __init chr_dev_init(void)
- if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))
- printk("unable to get major %d for memory devs\n", MEM_MAJOR);
-
-+ class_register(&mem_class);
- for (i = 0; i < ARRAY_SIZE(devlist); i++) {
-+ simple_add_class_device(&mem_class,
-+ MKDEV(MEM_MAJOR, devlist[i].minor),
-+ NULL, devlist[i].name);
- devfs_mk_cdev(MKDEV(MEM_MAJOR, devlist[i].minor),
- S_IFCHR | devlist[i].mode, devlist[i].name);
- }
---- linux-2.6.0/drivers/char/misc.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/char/misc.c 2003-12-28 23:23:00.000000000 -0800
-@@ -47,7 +47,7 @@
- #include <linux/devfs_fs_kernel.h>
- #include <linux/stat.h>
- #include <linux/init.h>
--
-+#include <linux/device.h>
- #include <linux/tty.h>
- #include <linux/kmod.h>
-
-@@ -180,6 +180,15 @@ fail:
- return err;
- }
-
-+/*
-+ * TODO for 2.7:
-+ * - add a struct class_device to struct miscdevice and make all usages of
-+ * them dynamic.
-+ */
-+static struct class misc_class = {
-+ .name = "misc",
-+};
-+
- static struct file_operations misc_fops = {
- .owner = THIS_MODULE,
- .open = misc_open,
-@@ -234,6 +243,8 @@ int misc_register(struct miscdevice * mi
- "misc/%s", misc->name);
- }
-
-+ simple_add_class_device(&misc_class, MKDEV(MISC_MAJOR, misc->minor),
-+ misc->dev, misc->name);
- devfs_mk_cdev(MKDEV(MISC_MAJOR, misc->minor),
- S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP, misc->devfs_name);
-
-@@ -265,6 +276,7 @@ int misc_deregister(struct miscdevice *
-
- down(&misc_sem);
- list_del(&misc->list);
-+ simple_remove_class_device(MKDEV(MISC_MAJOR, misc->minor));
- devfs_remove(misc->devfs_name);
- if (i < DYNAMIC_MINORS && i>0) {
- misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
-@@ -285,6 +297,7 @@ static int __init misc_init(void)
- if (ent)
- ent->proc_fops = &misc_proc_fops;
- #endif
-+ class_register(&misc_class);
- #ifdef CONFIG_MVME16x
- rtc_MK48T08_init();
- #endif
-@@ -319,4 +332,4 @@ static int __init misc_init(void)
- }
- return 0;
- }
--module_init(misc_init);
-+subsys_initcall(misc_init);
---- linux-2.6.0/drivers/char/pcmcia/synclink_cs.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/char/pcmcia/synclink_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -244,7 +244,6 @@ typedef struct _mgslpc_info {
- char netname[10];
- struct net_device *netdev;
- struct net_device_stats netstats;
-- struct net_device netdevice;
- #endif
- } MGSLPC_INFO;
-
-@@ -592,7 +591,7 @@ static dev_link_t *mgslpc_attach(void)
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- mgslpc_detach(link);
-@@ -607,8 +606,8 @@ static dev_link_t *mgslpc_attach(void)
- /* Card has been inserted.
- */
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn),args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void mgslpc_config(dev_link_t *link)
- {
-@@ -631,9 +630,9 @@ static void mgslpc_config(dev_link_t *li
- tuple.TupleData = buf;
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -641,17 +640,17 @@ static void mgslpc_config(dev_link_t *li
- link->state |= DEV_CONFIG;
-
- /* Look up the current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- /* get CIS configuration entry */
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-
- cfg = &(parse.cftable_entry);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
-
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
- if (cfg->index == 0)
-@@ -672,7 +671,7 @@ static void mgslpc_config(dev_link_t *li
- link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
- link->io.BasePort1 = io->win[0].base;
- link->io.NumPorts1 = io->win[0].len;
-- CS_CHECK(RequestIO, link->handle, &link->io);
-+ CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
- }
-
- link->conf.Attributes = CONF_ENABLE_IRQ;
-@@ -684,9 +683,9 @@ static void mgslpc_config(dev_link_t *li
- link->irq.Attributes |= IRQ_HANDLE_PRESENT;
- link->irq.Handler = mgslpc_isr;
- link->irq.Instance = info;
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- info->io_base = link->io.BasePort1;
- info->irq_level = link->irq.AssignedIRQ;
-@@ -728,11 +727,11 @@ static void mgslpc_release(u_long arg)
- link->dev = NULL;
- link->state &= ~DEV_CONFIG;
-
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- if (link->io.NumPorts1)
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- if (link->irq.AssignedIRQ)
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_irq(link->handle, &link->irq);
- if (link->state & DEV_STALE_LINK)
- mgslpc_detach(link);
- }
-@@ -763,7 +762,7 @@ static void mgslpc_detach(dev_link_t *li
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, and free it */
- *linkp = link->next;
-@@ -798,14 +797,14 @@ static int mgslpc_event(event_t event, i
- /* Mark the device as stopped, to block IO until later */
- info->stop = 1;
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG)
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- info->stop = 0;
- break;
- }
-@@ -4206,35 +4205,46 @@ void tx_timeout(unsigned long context)
- #ifdef CONFIG_SYNCLINK_SYNCPPP
- /* syncppp net device routines
- */
-+
-+static void mgslpc_setup(struct net_device *dev)
-+{
-+ dev->open = mgslpc_sppp_open;
-+ dev->stop = mgslpc_sppp_close;
-+ dev->hard_start_xmit = mgslpc_sppp_tx;
-+ dev->do_ioctl = mgslpc_sppp_ioctl;
-+ dev->get_stats = mgslpc_net_stats;
-+ dev->tx_timeout = mgslpc_sppp_tx_timeout;
-+ dev->watchdog_timeo = 10*HZ;
-+}
-
- void mgslpc_sppp_init(MGSLPC_INFO *info)
- {
- struct net_device *d;
-
- sprintf(info->netname,"mgslp%d",info->line);
-+
-+ d = alloc_netdev(0, info->netname, mgslpc_setup);
-+ if (!d) {
-+ printk(KERN_WARNING "%s: alloc_netdev failed.\n",
-+ info->netname);
-+ return;
-+ }
-
- info->if_ptr = &info->pppdev;
-- info->netdev = info->pppdev.dev = &info->netdevice;
-+ info->netdev = info->pppdev.dev = d;
-
- sppp_attach(&info->pppdev);
-
-- d = info->netdev;
-- strcpy(d->name,info->netname);
- d->base_addr = info->io_base;
- d->irq = info->irq_level;
- d->priv = info;
-- d->init = NULL;
-- d->open = mgslpc_sppp_open;
-- d->stop = mgslpc_sppp_close;
-- d->hard_start_xmit = mgslpc_sppp_tx;
-- d->do_ioctl = mgslpc_sppp_ioctl;
-- d->get_stats = mgslpc_net_stats;
-- d->tx_timeout = mgslpc_sppp_tx_timeout;
-- d->watchdog_timeo = 10*HZ;
-
- if (register_netdev(d)) {
- printk(KERN_WARNING "%s: register_netdev failed.\n", d->name);
- sppp_detach(info->netdev);
-+ info->netdev = NULL;
-+ info->pppdev.dev = NULL;
-+ free_netdev(d);
- return;
- }
-
-@@ -4246,8 +4256,11 @@ void mgslpc_sppp_delete(MGSLPC_INFO *inf
- {
- if (debug_level >= DEBUG_LEVEL_INFO)
- printk("mgslpc_sppp_delete(%s)\n",info->netname);
-- sppp_detach(info->netdev);
- unregister_netdev(info->netdev);
-+ sppp_detach(info->netdev);
-+ free_netdev(info->netdev);
-+ info->netdev = NULL;
-+ info->pppdev.dev = NULL;
- }
-
- int mgslpc_sppp_open(struct net_device *d)
---- linux-2.6.0/drivers/char/ppdev.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/char/ppdev.c 2003-12-28 23:22:57.000000000 -0800
-@@ -67,6 +67,7 @@
- #include <asm/uaccess.h>
- #include <linux/ppdev.h>
- #include <linux/smp_lock.h>
-+#include <linux/device.h>
-
- #define PP_VERSION "ppdev: user-space parallel port driver"
- #define CHRDEV "ppdev"
-@@ -782,4 +783,4 @@ module_init(ppdev_init);
- module_exit(ppdev_cleanup);
-
- MODULE_LICENSE("GPL");
--
-+MODULE_ALIAS_CHARDEV_MAJOR(PP_MAJOR);
---- linux-2.6.0/drivers/char/raw.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/char/raw.c 2003-12-28 23:21:18.000000000 -0800
-@@ -74,6 +74,7 @@ static int raw_open(struct inode *inode,
- goto out;
- }
- filp->f_flags |= O_DIRECT;
-+ filp->f_mapping = bdev->bd_inode->i_mapping;
- if (++raw_devices[minor].inuse == 1)
- filp->f_dentry->d_inode->i_mapping =
- bdev->bd_inode->i_mapping;
---- linux-2.6.0/drivers/char/sn_serial.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/char/sn_serial.c 2003-12-28 23:21:38.000000000 -0800
-@@ -21,8 +21,9 @@
- #include <linux/sysrq.h>
- #include <linux/circ_buf.h>
- #include <linux/serial_reg.h>
-+#include <asm/uaccess.h>
- #include <asm/sn/sn_sal.h>
--#include <asm/sn/pci/pciio.h> /* this is needed for get_console_nasid */
-+#include <asm/sn/pci/pciio.h>
- #include <asm/sn/simulator.h>
- #include <asm/sn/sn2/sn_private.h>
-
-@@ -771,7 +772,7 @@ sn_sal_read_proc(char *page, char **star
- off_t begin = 0;
-
- len += sprintf(page, "sn_serial: nasid:%d irq:%d tx:%d rx:%d\n",
-- get_console_nasid(), sn_sal_irq,
-+ ia64_sn_get_console_nasid(), sn_sal_irq,
- sn_total_tx_count, sn_total_rx_count);
- *eof = 1;
-
-@@ -813,6 +814,9 @@ sn_sal_switch_to_asynch(void)
- {
- unsigned long flags;
-
-+ if (sn_sal_is_asynch)
-+ return;
-+
- sn_debug_printf("sn_serial: about to switch to asynchronous console\n");
-
- /* without early_printk, we may be invoked late enough to race
---- linux-2.6.0/drivers/char/sx.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/char/sx.c 2003-12-28 23:22:46.000000000 -0800
-@@ -509,13 +509,13 @@ static int sx_busy_wait_eq (struct sx_bo
-
- func_enter ();
-
-- for (i=0; i < TIMEOUT_1 > 0;i++)
-+ for (i=0; i < TIMEOUT_1 ;i++)
- if ((read_sx_byte (board, offset) & mask) == correctval) {
- func_exit ();
- return 1;
- }
-
-- for (i=0; i < TIMEOUT_2 > 0;i++) {
-+ for (i=0; i < TIMEOUT_2 ;i++) {
- if ((read_sx_byte (board, offset) & mask) == correctval) {
- func_exit ();
- return 1;
-@@ -535,13 +535,13 @@ static int sx_busy_wait_neq (struct sx_b
-
- func_enter ();
-
-- for (i=0; i < TIMEOUT_1 > 0;i++)
-+ for (i=0; i < TIMEOUT_1 ;i++)
- if ((read_sx_byte (board, offset) & mask) != badval) {
- func_exit ();
- return 1;
- }
-
-- for (i=0; i < TIMEOUT_2 > 0;i++) {
-+ for (i=0; i < TIMEOUT_2 ;i++) {
- if ((read_sx_byte (board, offset) & mask) != badval) {
- func_exit ();
- return 1;
---- linux-2.6.0/drivers/char/synclink.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/char/synclink.c 2003-12-28 23:21:00.000000000 -0800
-@@ -327,7 +327,6 @@ struct mgsl_struct {
- char netname[10];
- struct net_device *netdev;
- struct net_device_stats netstats;
-- struct net_device netdevice;
- #endif
- };
-
-@@ -737,8 +736,8 @@ int mgsl_ioctl_common(struct mgsl_struct
-
- #ifdef CONFIG_SYNCLINK_SYNCPPP
- /* SPPP/HDLC stuff */
--void mgsl_sppp_init(struct mgsl_struct *info);
--void mgsl_sppp_delete(struct mgsl_struct *info);
-+static void mgsl_sppp_init(struct mgsl_struct *info);
-+static void mgsl_sppp_delete(struct mgsl_struct *info);
- int mgsl_sppp_open(struct net_device *d);
- int mgsl_sppp_close(struct net_device *d);
- void mgsl_sppp_tx_timeout(struct net_device *d);
-@@ -7820,36 +7819,45 @@ int usc_loopmode_send_active( struct mgs
- #ifdef CONFIG_SYNCLINK_SYNCPPP
- /* syncppp net device routines
- */
-+static void mgsl_setup(struct net_device *dev)
-+{
-+ dev->open = mgsl_sppp_open;
-+ dev->stop = mgsl_sppp_close;
-+ dev->hard_start_xmit = mgsl_sppp_tx;
-+ dev->do_ioctl = mgsl_sppp_ioctl;
-+ dev->get_stats = mgsl_net_stats;
-+ dev->tx_timeout = mgsl_sppp_tx_timeout;
-+ dev->watchdog_timeo = 10*HZ;
-+}
-
--void mgsl_sppp_init(struct mgsl_struct *info)
-+static void mgsl_sppp_init(struct mgsl_struct *info)
- {
- struct net_device *d;
-
- sprintf(info->netname,"mgsl%d",info->line);
-
-+ d = alloc_netdev(0, info->netname, mgsl_setup);
-+ if (!d) {
-+ printk(KERN_WARNING "%s: alloc_netdev failed.\n",
-+ info->netname);
-+ return;
-+ }
-+
- info->if_ptr = &info->pppdev;
-- info->netdev = info->pppdev.dev = &info->netdevice;
-+ info->netdev = info->pppdev.dev = d;
-
- sppp_attach(&info->pppdev);
-
-- d = info->netdev;
-- strcpy(d->name,info->netname);
- d->base_addr = info->io_base;
- d->irq = info->irq_level;
- d->dma = info->dma_level;
- d->priv = info;
-- d->init = NULL;
-- d->open = mgsl_sppp_open;
-- d->stop = mgsl_sppp_close;
-- d->hard_start_xmit = mgsl_sppp_tx;
-- d->do_ioctl = mgsl_sppp_ioctl;
-- d->get_stats = mgsl_net_stats;
-- d->tx_timeout = mgsl_sppp_tx_timeout;
-- d->watchdog_timeo = 10*HZ;
-
- if (register_netdev(d)) {
- printk(KERN_WARNING "%s: register_netdev failed.\n", d->name);
- sppp_detach(info->netdev);
-+ info->netdev = NULL;
-+ free_netdev(d);
- return;
- }
-
-@@ -7861,8 +7869,11 @@ void mgsl_sppp_delete(struct mgsl_struct
- {
- if (debug_level >= DEBUG_LEVEL_INFO)
- printk("mgsl_sppp_delete(%s)\n",info->netname);
-- sppp_detach(info->netdev);
- unregister_netdev(info->netdev);
-+ sppp_detach(info->netdev);
-+ free_netdev(info->netdev);
-+ info->netdev = NULL;
-+ info->pppdev.dev = NULL;
- }
-
- int mgsl_sppp_open(struct net_device *d)
---- linux-2.6.0/drivers/char/synclinkmp.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/char/synclinkmp.c 2003-12-28 23:21:00.000000000 -0800
-@@ -289,7 +289,6 @@ typedef struct _synclinkmp_info {
- char netname[10];
- struct net_device *netdev;
- struct net_device_stats netstats;
-- struct net_device netdevice;
- #endif
- } SLMP_INFO;
-
-@@ -1627,35 +1626,44 @@ static void set_break(struct tty_struct
-
- /* syncppp support and callbacks */
-
-+static void cb_setup(struct net_device *dev)
-+{
-+ dev->open = sppp_cb_open;
-+ dev->stop = sppp_cb_close;
-+ dev->hard_start_xmit = sppp_cb_tx;
-+ dev->do_ioctl = sppp_cb_ioctl;
-+ dev->get_stats = sppp_cb_net_stats;
-+ dev->tx_timeout = sppp_cb_tx_timeout;
-+ dev->watchdog_timeo = 10*HZ;
-+}
-+
- static void sppp_init(SLMP_INFO *info)
- {
- struct net_device *d;
-
- sprintf(info->netname,"mgslm%dp%d",info->adapter_num,info->port_num);
-
-+ d = alloc_netdev(0, info->netname, cb_setup);
-+ if (!d) {
-+ printk(KERN_WARNING "%s: alloc_netdev failed.\n",
-+ info->netname);
-+ return;
-+ }
-+
- info->if_ptr = &info->pppdev;
-- info->netdev = info->pppdev.dev = &info->netdevice;
-+ info->netdev = info->pppdev.dev = d;
-
- sppp_attach(&info->pppdev);
-
-- d = info->netdev;
-- strcpy(d->name,info->netname);
-- d->base_addr = 0;
- d->irq = info->irq_level;
-- d->dma = 0;
- d->priv = info;
-- d->init = NULL;
-- d->open = sppp_cb_open;
-- d->stop = sppp_cb_close;
-- d->hard_start_xmit = sppp_cb_tx;
-- d->do_ioctl = sppp_cb_ioctl;
-- d->get_stats = sppp_cb_net_stats;
-- d->tx_timeout = sppp_cb_tx_timeout;
-- d->watchdog_timeo = 10*HZ;
-
- if (register_netdev(d)) {
- printk(KERN_WARNING "%s: register_netdev failed.\n", d->name);
- sppp_detach(info->netdev);
-+ info->netdev = NULL;
-+ info->pppdev.dev = NULL;
-+ free_netdev(d);
- return;
- }
-
-@@ -1667,8 +1675,11 @@ static void sppp_delete(SLMP_INFO *info)
- {
- if (debug_level >= DEBUG_LEVEL_INFO)
- printk("sppp_delete(%s)\n",info->netname);
-- sppp_detach(info->netdev);
- unregister_netdev(info->netdev);
-+ sppp_detach(info->netdev);
-+ free_netdev(info->netdev);
-+ info->netdev = NULL;
-+ info->pppdev.dev = NULL;
- }
-
- static int sppp_cb_open(struct net_device *d)
---- linux-2.6.0/drivers/char/sysrq.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/char/sysrq.c 2003-12-28 23:21:07.000000000 -0800
-@@ -35,6 +35,25 @@
- #include <linux/spinlock.h>
-
- #include <asm/ptrace.h>
-+#ifdef CONFIG_KGDB_SYSRQ
-+
-+#define GDB_OP &kgdb_op
-+static void kgdb_sysrq(int key, struct pt_regs *pt_regs, struct tty_struct *tty)
-+{
-+ printk("kgdb sysrq\n");
-+ breakpoint();
-+}
-+
-+static struct sysrq_key_op kgdb_op = {
-+ .handler = kgdb_sysrq,
-+ .help_msg = "kGdb|Fgdb",
-+ .action_msg = "Debug breakpoint\n",
-+};
-+
-+#else
-+#define GDB_OP NULL
-+#endif
-+
-
- extern void reset_vc(unsigned int);
-
-@@ -238,8 +257,8 @@ static struct sysrq_key_op *sysrq_key_ta
- /* c */ NULL,
- /* d */ NULL,
- /* e */ &sysrq_term_op,
--/* f */ NULL,
--/* g */ NULL,
-+/* f */ GDB_OP,
-+/* g */ GDB_OP,
- /* h */ NULL,
- /* i */ &sysrq_kill_op,
- /* j */ NULL,
---- linux-2.6.0/drivers/char/tty_io.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/char/tty_io.c 2003-12-28 23:22:59.000000000 -0800
-@@ -2069,80 +2069,10 @@ static void tty_default_put_char(struct
- tty->driver->write(tty, 0, &ch, 1);
- }
-
--struct tty_dev {
-- struct list_head node;
-- dev_t dev;
-- struct class_device class_dev;
--};
--#define to_tty_dev(d) container_of(d, struct tty_dev, class_dev)
--
--static void release_tty_dev(struct class_device *class_dev)
--{
-- struct tty_dev *tty_dev = to_tty_dev(class_dev);
-- kfree(tty_dev);
--}
--
- static struct class tty_class = {
-- .name = "tty",
-- .release = &release_tty_dev,
-+ .name = "tty",
- };
-
--static LIST_HEAD(tty_dev_list);
--static spinlock_t tty_dev_list_lock = SPIN_LOCK_UNLOCKED;
--
--static ssize_t show_dev(struct class_device *class_dev, char *buf)
--{
-- struct tty_dev *tty_dev = to_tty_dev(class_dev);
-- return print_dev_t(buf, tty_dev->dev);
--}
--static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
--
--static void tty_add_class_device(char *name, dev_t dev, struct device *device)
--{
-- struct tty_dev *tty_dev = NULL;
-- int retval;
--
-- tty_dev = kmalloc(sizeof(*tty_dev), GFP_KERNEL);
-- if (!tty_dev)
-- return;
-- memset(tty_dev, 0x00, sizeof(*tty_dev));
--
-- tty_dev->class_dev.dev = device;
-- tty_dev->class_dev.class = &tty_class;
-- snprintf(tty_dev->class_dev.class_id, BUS_ID_SIZE, "%s", name);
-- retval = class_device_register(&tty_dev->class_dev);
-- if (retval)
-- goto error;
-- class_device_create_file (&tty_dev->class_dev, &class_device_attr_dev);
-- tty_dev->dev = dev;
-- spin_lock(&tty_dev_list_lock);
-- list_add(&tty_dev->node, &tty_dev_list);
-- spin_unlock(&tty_dev_list_lock);
-- return;
--error:
-- kfree(tty_dev);
--}
--
--static void tty_remove_class_device(dev_t dev)
--{
-- struct tty_dev *tty_dev = NULL;
-- struct list_head *tmp;
-- int found = 0;
--
-- spin_lock(&tty_dev_list_lock);
-- list_for_each (tmp, &tty_dev_list) {
-- tty_dev = list_entry(tmp, struct tty_dev, node);
-- if (tty_dev->dev == dev) {
-- list_del(&tty_dev->node);
-- found = 1;
-- break;
-- }
-- }
-- spin_unlock(&tty_dev_list_lock);
-- if (found)
-- class_device_unregister(&tty_dev->class_dev);
--}
--
- /**
- * tty_register_device - register a tty device
- * @driver: the tty driver that describes the tty device
-@@ -2174,7 +2104,7 @@ void tty_register_device(struct tty_driv
- if (driver->type != TTY_DRIVER_TYPE_PTY) {
- char name[64];
- tty_line_name(driver, index, name);
-- tty_add_class_device(name, dev, device);
-+ simple_add_class_device(&tty_class, dev, device, name);
- }
- }
-
-@@ -2189,7 +2119,7 @@ void tty_register_device(struct tty_driv
- void tty_unregister_device(struct tty_driver *driver, unsigned index)
- {
- devfs_remove("%s%d", driver->devfs_name, index + driver->name_base);
-- tty_remove_class_device(MKDEV(driver->major, driver->minor_start) + index);
-+ simple_remove_class_device(MKDEV(driver->major, driver->minor_start) + index);
- }
-
- EXPORT_SYMBOL(tty_register_device);
-@@ -2431,7 +2361,7 @@ static int __init tty_init(void)
- register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
- panic("Couldn't register /dev/tty driver\n");
- devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 0), S_IFCHR|S_IRUGO|S_IWUGO, "tty");
-- tty_add_class_device ("tty", MKDEV(TTYAUX_MAJOR, 0), NULL);
-+ simple_add_class_device(&tty_class, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
-
- strcpy(console_cdev.kobj.name, "dev.console");
- cdev_init(&console_cdev, &console_fops);
-@@ -2439,7 +2369,7 @@ static int __init tty_init(void)
- register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
- panic("Couldn't register /dev/console driver\n");
- devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 1), S_IFCHR|S_IRUSR|S_IWUSR, "console");
-- tty_add_class_device ("console", MKDEV(TTYAUX_MAJOR, 1), NULL);
-+ simple_add_class_device(&tty_class, MKDEV(TTYAUX_MAJOR, 1), NULL, "console");
-
- tty_kobj.kset = tty_cdev.kobj.kset;
- kobject_register(&tty_kobj);
-@@ -2451,7 +2381,7 @@ static int __init tty_init(void)
- register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
- panic("Couldn't register /dev/ptmx driver\n");
- devfs_mk_cdev(MKDEV(TTYAUX_MAJOR, 2), S_IFCHR|S_IRUGO|S_IWUGO, "ptmx");
-- tty_add_class_device ("ptmx", MKDEV(TTYAUX_MAJOR, 2), NULL);
-+ simple_add_class_device(&tty_class, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
- #endif
-
- #ifdef CONFIG_VT
-@@ -2461,7 +2391,7 @@ static int __init tty_init(void)
- register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
- panic("Couldn't register /dev/tty0 driver\n");
- devfs_mk_cdev(MKDEV(TTY_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vc/0");
-- tty_add_class_device ("tty0", MKDEV(TTY_MAJOR, 0), NULL);
-+ simple_add_class_device(&tty_class, MKDEV(TTY_MAJOR, 0), NULL, "tty0");
-
- vty_init();
- #endif
---- linux-2.6.0/drivers/char/vt_ioctl.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/char/vt_ioctl.c 2003-12-28 23:22:23.000000000 -0800
-@@ -332,7 +332,7 @@ do_fontx_ioctl(int cmd, struct consolefo
- }
-
- static inline int
--do_unimap_ioctl(int cmd, struct unimapdesc *user_ud,int perm)
-+do_unimap_ioctl(int cmd, struct unimapdesc *user_ud, int perm, unsigned int console)
- {
- struct unimapdesc tmp;
- int i = 0;
-@@ -348,9 +348,11 @@ do_unimap_ioctl(int cmd, struct unimapde
- case PIO_UNIMAP:
- if (!perm)
- return -EPERM;
-- return con_set_unimap(fg_console, tmp.entry_ct, tmp.entries);
-+ return con_set_unimap(console, tmp.entry_ct, tmp.entries);
- case GIO_UNIMAP:
-- return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
-+ if (!perm && fg_console != console)
-+ return -EPERM;
-+ return con_get_unimap(console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
- }
- return 0;
- }
-@@ -966,13 +968,13 @@ int vt_ioctl(struct tty_struct *tty, str
- return -EPERM;
- i = copy_from_user(&ui, (void *)arg, sizeof(struct unimapinit));
- if (i) return -EFAULT;
-- con_clear_unimap(fg_console, &ui);
-+ con_clear_unimap(console, &ui);
- return 0;
- }
-
- case PIO_UNIMAP:
- case GIO_UNIMAP:
-- return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm);
-+ return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm, console);
-
- case VT_LOCKSWITCH:
- if (!capable(CAP_SYS_TTY_CONFIG))
---- linux-2.6.0/drivers/char/watchdog/i810-tco.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/char/watchdog/i810-tco.c 2003-12-28 23:22:09.000000000 -0800
-@@ -232,9 +232,8 @@ static ssize_t i810tco_write (struct fil
-
- /* someone wrote to us, we should reload the timer */
- tco_timer_reload ();
-- return 1;
- }
-- return 0;
-+ return len;
- }
-
- static int i810tco_ioctl (struct inode *inode, struct file *file,
---- linux-2.6.0/drivers/char/watchdog/ib700wdt.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/char/watchdog/ib700wdt.c 2003-12-28 23:22:09.000000000 -0800
-@@ -161,9 +161,8 @@ ibwdt_write(struct file *file, const cha
- }
- }
- ibwdt_ping();
-- return 1;
- }
-- return 0;
-+ return count;
- }
-
- static int
---- linux-2.6.0/drivers/char/watchdog/indydog.c 2003-08-08 22:55:11.000000000 -0700
-+++ 25/drivers/char/watchdog/indydog.c 2003-12-28 23:22:09.000000000 -0800
-@@ -113,9 +113,8 @@ static ssize_t indydog_write(struct file
- }
- }
- indydog_ping();
-- return 1;
- }
-- return 0;
-+ return len;
- }
-
- static int indydog_ioctl(struct inode *inode, struct file *file,
---- linux-2.6.0/drivers/char/watchdog/Kconfig 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/char/watchdog/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -17,7 +17,7 @@ config WATCHDOG
- implementation entirely in software (which can sometimes fail to
- reboot the machine) and a driver for hardware watchdog boards, which
- are more robust and can also keep track of the temperature inside
-- your computer. For details, read <file:Documentation/watchdog.txt>
-+ your computer. For details, read <file:Documentation/watchdog/watchdog.txt>
- in the kernel source.
-
- The watchdog is usually used together with the watchdog daemon
-@@ -114,7 +114,7 @@ config PCWATCHDOG
- This card simply watches your kernel to make sure it doesn't freeze,
- and if it does, it reboots your computer after a certain amount of
- time. This driver is like the WDT501 driver but for different
-- hardware. Please read <file:Documentation/pcwd-watchdog.txt>. The PC
-+ hardware. Please read <file:Documentation/watchdog/pcwd-watchdog.txt>. The PC
- watchdog cards can be ordered from <http://www.berkprod.com/>.
-
- To compile this driver as a module, choose M here: the
-@@ -276,6 +276,21 @@ config W83877F_WDT
-
- Most people will say N.
-
-+config W83627HF_WDT
-+ tristate "W83627HF Watchdog Timer"
-+ depends on WATCHDOG
-+ ---help---
-+ This is the driver for the hardware watchdog on the W83627HF chipset
-+ as used in Advantech PC-9578 and Tyan S2721-533 motherboards
-+ (and likely others). This watchdog simply watches your kernel to
-+ make sure it doesn't freeze, and if it does, it reboots your computer
-+ after a certain amount of time.
-+
-+ To compile this driver as a module, choose M here: the
-+ module will be called w83627hf_wdt.
-+
-+ Most people will say N.
-+
- config MACHZ_WDT
- tristate "ZF MachZ Watchdog"
- depends on WATCHDOG
---- linux-2.6.0/drivers/char/watchdog/machzwd.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/char/watchdog/machzwd.c 2003-12-28 23:22:09.000000000 -0800
-@@ -343,10 +343,9 @@ static ssize_t zf_write(struct file *fil
- next_heartbeat = jiffies + ZF_USER_TIMEO;
- dprintk("user ping at %ld\n", jiffies);
-
-- return 1;
- }
-
-- return 0;
-+ return count;
- }
-
- static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
---- linux-2.6.0/drivers/char/watchdog/Makefile 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/char/watchdog/Makefile 2003-12-28 23:22:31.000000000 -0800
-@@ -25,6 +25,7 @@ obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_
- obj-$(CONFIG_EUROTECH_WDT) += eurotechwdt.o
- obj-$(CONFIG_SOFT_WATCHDOG) += softdog.o
- obj-$(CONFIG_W83877F_WDT) += w83877f_wdt.o
-+obj-$(CONFIG_W83627HF_WDT) += w83627hf_wdt.o
- obj-$(CONFIG_SC520_WDT) += sc520_wdt.o
- obj-$(CONFIG_ALIM7101_WDT) += alim7101_wdt.o
- obj-$(CONFIG_ALIM1535_WDT) += alim1535_wdt.o
---- linux-2.6.0/drivers/char/watchdog/mixcomwd.c 2003-08-08 22:55:11.000000000 -0700
-+++ 25/drivers/char/watchdog/mixcomwd.c 2003-12-28 23:22:09.000000000 -0800
-@@ -156,9 +156,8 @@ static ssize_t mixcomwd_write(struct fil
- }
- }
- mixcomwd_ping();
-- return 1;
- }
-- return 0;
-+ return len;
- }
-
- static int mixcomwd_ioctl(struct inode *inode, struct file *file,
---- linux-2.6.0/drivers/char/watchdog/pcwd.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/char/watchdog/pcwd.c 2003-12-28 23:22:09.000000000 -0800
-@@ -419,9 +419,8 @@ static ssize_t pcwd_write(struct file *f
- }
- }
- pcwd_send_heartbeat();
-- return 1;
- }
-- return 0;
-+ return len;
- }
-
- static int pcwd_open(struct inode *ino, struct file *filep)
---- linux-2.6.0/drivers/char/watchdog/sa1100_wdt.c 2003-08-08 22:55:11.000000000 -0700
-+++ 25/drivers/char/watchdog/sa1100_wdt.c 2003-12-28 23:22:09.000000000 -0800
-@@ -106,7 +106,7 @@ static ssize_t sa1100dog_write(struct fi
- OSMR3 = OSCR + pre_margin;
- }
-
-- return len ? 1 : 0;
-+ return len;
- }
-
- static struct watchdog_info ident = {
---- linux-2.6.0/drivers/char/watchdog/softdog.c 2003-08-08 22:55:11.000000000 -0700
-+++ 25/drivers/char/watchdog/softdog.c 2003-12-28 23:22:09.000000000 -0800
-@@ -155,9 +155,8 @@ static ssize_t softdog_write(struct file
- }
- }
- mod_timer(&watchdog_ticktock, jiffies+(soft_margin*HZ));
-- return 1;
- }
-- return 0;
-+ return len;
- }
-
- static int softdog_ioctl(struct inode *inode, struct file *file,
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/char/watchdog/w83627hf_wdt.c 2003-12-28 23:22:31.000000000 -0800
-@@ -0,0 +1,324 @@
-+/*
-+ * w83627hf WDT driver
-+ *
-+ * (c) Copyright 2003 Pádraig Brady <P@draigBrady.com>
-+ *
-+ * Based on advantechwdt.c which is based on wdt.c.
-+ * Original copyright messages:
-+ *
-+ * (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl>
-+ *
-+ * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved.
-+ * http://www.redhat.com
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version
-+ * 2 of the License, or (at your option) any later version.
-+ *
-+ * Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
-+ * warranty for any of this software. This material is provided
-+ * "AS-IS" and at no charge.
-+ *
-+ * (c) Copyright 1995 Alan Cox <alan@redhat.com>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/types.h>
-+#include <linux/miscdevice.h>
-+#include <linux/watchdog.h>
-+#include <linux/fs.h>
-+#include <linux/ioport.h>
-+#include <linux/notifier.h>
-+#include <linux/reboot.h>
-+#include <linux/init.h>
-+
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+
-+#define WATCHDOG_NAME "w83627hf WDT"
-+#define PFX WATCHDOG_NAME ": "
-+#define WATCHDOG_TIMEOUT 60 /* 60 sec default timeout */
-+
-+static unsigned long wdt_is_open;
-+static char expect_close;
-+
-+/* You must set this - there is no sane way to probe for this board. */
-+static int wdt_io = 0x2E;
-+module_param(wdt_io, int, 0);
-+MODULE_PARM_DESC(wdt_io, "w83627hf WDT io port (default 0x2E)");
-+
-+static int timeout = WATCHDOG_TIMEOUT; /* in seconds */
-+module_param(timeout, int, 0);
-+MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ".");
-+
-+#ifdef CONFIG_WATCHDOG_NOWAYOUT
-+static int nowayout = 1;
-+#else
-+static int nowayout = 0;
-+#endif
-+
-+module_param(nowayout, int, 0);
-+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
-+
-+/*
-+ * Kernel methods.
-+ */
-+
-+#define WDT_EFER (wdt_io+0) /* Extended Function Enable Registers */
-+#define WDT_EFIR (wdt_io+0) /* Extended Function Index Register (same as EFER) */
-+#define WDT_EFDR (WDT_EFIR+1) /* Extended Function Data Register */
-+
-+static void
-+wdt_ctrl(int timeout)
-+{
-+ outb_p(0x87, WDT_EFER); /* Enter extended function mode */
-+ outb_p(0x87, WDT_EFER); /* Again according to manual */
-+
-+ outb_p(0x07, WDT_EFER); /* point to logical device number reg */
-+ outb_p(0x08, WDT_EFDR); /* select logical device 8 (GPIO2) */
-+ outb_p(0x30, WDT_EFER); /* select CR30 */
-+ outb_p(0x01, WDT_EFDR); /* set bit 0 to activate GPIO2 */
-+
-+ outb_p(0xF6, WDT_EFER); /* Select CRF6 */
-+ outb_p(timeout, WDT_EFDR); /* Write Timeout counter to CRF6 */
-+
-+ outb_p(0xAA, WDT_EFER); /* Leave extended function mode */
-+}
-+
-+static void
-+wdt_ping(void)
-+{
-+ wdt_ctrl(timeout);
-+}
-+
-+static void
-+wdt_disable(void)
-+{
-+ wdt_ctrl(0);
-+}
-+
-+static ssize_t
-+wdt_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
-+{
-+ /* Can't seek (pwrite) on this device */
-+ if (ppos != &file->f_pos)
-+ return -ESPIPE;
-+
-+ if (count) {
-+ if (!nowayout) {
-+ size_t i;
-+
-+ expect_close = 0;
-+
-+ for (i = 0; i != count; i++) {
-+ char c;
-+ if (get_user(c, buf+i))
-+ return -EFAULT;
-+ if (c == 'V')
-+ expect_close = 42;
-+ }
-+ }
-+ wdt_ping();
-+ }
-+ return count;
-+}
-+
-+static int
-+wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-+ unsigned long arg)
-+{
-+ int new_timeout;
-+ static struct watchdog_info ident = {
-+ .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
-+ .firmware_version = 1,
-+ .identity = "Advantech WDT",
-+ };
-+
-+ switch (cmd) {
-+ case WDIOC_GETSUPPORT:
-+ if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident)))
-+ return -EFAULT;
-+ break;
-+
-+ case WDIOC_GETSTATUS:
-+ case WDIOC_GETBOOTSTATUS:
-+ return put_user(0, (int *)arg);
-+
-+ case WDIOC_KEEPALIVE:
-+ wdt_ping();
-+ break;
-+
-+ case WDIOC_SETTIMEOUT:
-+ if (get_user(new_timeout, (int *)arg))
-+ return -EFAULT;
-+ if ((new_timeout < 1) || (new_timeout > 63))
-+ return -EINVAL;
-+ timeout = new_timeout;
-+ wdt_ping();
-+ /* Fall */
-+
-+ case WDIOC_GETTIMEOUT:
-+ return put_user(timeout, (int *)arg);
-+
-+ case WDIOC_SETOPTIONS:
-+ {
-+ int options, retval = -EINVAL;
-+
-+ if (get_user(options, (int *)arg))
-+ return -EFAULT;
-+
-+ if (options & WDIOS_DISABLECARD) {
-+ wdt_disable();
-+ retval = 0;
-+ }
-+
-+ if (options & WDIOS_ENABLECARD) {
-+ wdt_ping();
-+ retval = 0;
-+ }
-+
-+ return retval;
-+ }
-+
-+ default:
-+ return -ENOTTY;
-+ }
-+ return 0;
-+}
-+
-+static int
-+wdt_open(struct inode *inode, struct file *file)
-+{
-+ if (test_and_set_bit(0, &wdt_is_open))
-+ return -EBUSY;
-+ /*
-+ * Activate
-+ */
-+
-+ wdt_ping();
-+ return 0;
-+}
-+
-+static int
-+wdt_close(struct inode *inode, struct file *file)
-+{
-+ if (expect_close == 42) {
-+ wdt_disable();
-+ } else {
-+ printk(KERN_CRIT PFX "Unexpected close, not stopping watchdog!\n");
-+ wdt_ping();
-+ }
-+ clear_bit(0, &wdt_is_open);
-+ expect_close = 0;
-+ return 0;
-+}
-+
-+/*
-+ * Notifier for system down
-+ */
-+
-+static int
-+wdt_notify_sys(struct notifier_block *this, unsigned long code,
-+ void *unused)
-+{
-+ if (code == SYS_DOWN || code == SYS_HALT) {
-+ /* Turn the WDT off */
-+ wdt_disable();
-+ }
-+ return NOTIFY_DONE;
-+}
-+
-+/*
-+ * Kernel Interfaces
-+ */
-+
-+static struct file_operations wdt_fops = {
-+ .owner = THIS_MODULE,
-+ .llseek = no_llseek,
-+ .write = wdt_write,
-+ .ioctl = wdt_ioctl,
-+ .open = wdt_open,
-+ .release = wdt_close,
-+};
-+
-+static struct miscdevice wdt_miscdev = {
-+ .minor = WATCHDOG_MINOR,
-+ .name = "watchdog",
-+ .fops = &wdt_fops,
-+};
-+
-+/*
-+ * The WDT needs to learn about soft shutdowns in order to
-+ * turn the timebomb registers off.
-+ */
-+
-+static struct notifier_block wdt_notifier = {
-+ .notifier_call = wdt_notify_sys,
-+ .next = NULL,
-+ .priority = 0,
-+};
-+
-+static int __init
-+wdt_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_INFO "WDT driver for Advantech single board computer initialising.\n");
-+
-+ if (timeout < 1 || timeout > 63) {
-+ timeout = WATCHDOG_TIMEOUT;
-+ printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n",
-+ timeout);
-+ }
-+
-+ if (!request_region(wdt_io, 1, WATCHDOG_NAME)) {
-+ printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
-+ wdt_io);
-+ ret = -EIO;
-+ goto out;
-+ }
-+
-+ ret = register_reboot_notifier(&wdt_notifier);
-+ if (ret != 0) {
-+ printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
-+ ret);
-+ goto unreg_regions;
-+ }
-+
-+ ret = misc_register(&wdt_miscdev);
-+ if (ret != 0) {
-+ printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
-+ WATCHDOG_MINOR, ret);
-+ goto unreg_reboot;
-+ }
-+
-+ printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
-+ timeout, nowayout);
-+
-+out:
-+ return ret;
-+unreg_reboot:
-+ unregister_reboot_notifier(&wdt_notifier);
-+unreg_regions:
-+ release_region(wdt_io, 1);
-+ goto out;
-+}
-+
-+static void __exit
-+wdt_exit(void)
-+{
-+ misc_deregister(&wdt_miscdev);
-+ unregister_reboot_notifier(&wdt_notifier);
-+ release_region(wdt_io,1);
-+}
-+
-+module_init(wdt_init);
-+module_exit(wdt_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Pádraig Brady <P@draigBrady.com>");
-+MODULE_DESCRIPTION("w38627hf WDT driver");
-+
---- linux-2.6.0/drivers/char/watchdog/wdt.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/char/watchdog/wdt.c 2003-12-28 23:22:09.000000000 -0800
-@@ -265,9 +265,8 @@ static ssize_t wdt_write(struct file *fi
- }
- }
- wdt_ping();
-- return 1;
- }
-- return 0;
-+ return count;
- }
-
- /**
---- linux-2.6.0/drivers/i2c/i2c-core.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/i2c/i2c-core.c 2003-12-28 23:22:30.000000000 -0800
-@@ -136,10 +136,10 @@ int i2c_add_adapter(struct i2c_adapter *
-
- /* Add the adapter to the driver core.
- * If the parent pointer is not set up,
-- * we add this adapter to the legacy bus.
-+ * we add this adapter to the host bus.
- */
- if (adap->dev.parent == NULL)
-- adap->dev.parent = &legacy_bus;
-+ adap->dev.parent = &platform_bus;
- sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
- adap->dev.driver = &i2c_adapter_driver;
- adap->dev.release = &i2c_adapter_dev_release;
---- linux-2.6.0/drivers/i2c/i2c-dev.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/i2c/i2c-dev.c 2003-12-28 23:22:30.000000000 -0800
-@@ -223,7 +223,7 @@ int i2cdev_ioctl (struct inode *inode, s
-
- /* Put an arbritrary limit on the number of messages that can
- * be sent at once */
-- if (rdwr_arg.nmsgs > 42)
-+ if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
- return -EINVAL;
-
- rdwr_pa = (struct i2c_msg *)
-@@ -447,7 +447,7 @@ static int i2cdev_attach_adapter(struct
-
- /* register this i2c device with the driver core */
- i2c_dev->adap = adap;
-- if (adap->dev.parent == &legacy_bus)
-+ if (adap->dev.parent == &platform_bus)
- i2c_dev->class_dev.dev = &adap->dev;
- else
- i2c_dev->class_dev.dev = adap->dev.parent;
---- linux-2.6.0/drivers/ide/arm/icside.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/arm/icside.c 2003-12-28 23:21:46.000000000 -0800
-@@ -214,7 +214,7 @@ static void icside_maskproc(ide_drive_t
- #define NR_ENTRIES 256
- #define TABLE_SIZE (NR_ENTRIES * 8)
-
--static void ide_build_sglist(ide_drive_t *drive, struct request *rq)
-+static void icside_build_sglist(ide_drive_t *drive, struct request *rq)
- {
- ide_hwif_t *hwif = drive->hwif;
- struct icside_state *state = hwif->hwif_data;
-@@ -543,7 +543,7 @@ icside_dma_common(ide_drive_t *drive, st
- BUG_ON(hwif->sg_dma_active);
- BUG_ON(dma_channel_active(hwif->hw.dma));
-
-- ide_build_sglist(drive, rq);
-+ icside_build_sglist(drive, rq);
-
- /*
- * Ensure that we have the right interrupt routed.
---- linux-2.6.0/drivers/ide/ide.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/ide.c 2003-12-28 23:22:32.000000000 -0800
-@@ -458,7 +458,7 @@ void ide_probe_module (void)
-
- EXPORT_SYMBOL(ide_probe_module);
-
--static int ide_open (struct inode * inode, struct file * filp)
-+static int ide_open (struct block_device *bdev, struct file * filp)
- {
- return -ENXIO;
- }
-@@ -1632,12 +1632,12 @@ int generic_ide_ioctl(struct block_devic
- #endif /* CONFIG_IDE_TASK_IOCTL */
-
- case HDIO_DRIVE_CMD:
-- if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
-+ if (!capable(CAP_SYS_RAWIO))
- return -EACCES;
- return ide_cmd_ioctl(drive, cmd, arg);
-
- case HDIO_DRIVE_TASK:
-- if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
-+ if (!capable(CAP_SYS_RAWIO))
- return -EACCES;
- return ide_task_ioctl(drive, cmd, arg);
-
---- linux-2.6.0/drivers/ide/ide-cd.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/ide/ide-cd.c 2003-12-28 23:22:35.000000000 -0800
-@@ -291,10 +291,13 @@
- * - Use extended sense on drives that support it for
- * correctly reporting tray status -- from
- * Michael D Johnson <johnsom@orst.edu>
-+ * 4.60 Dec 17, 2003 - Add mt rainier support
-+ * - Bump timeout for packet commands, matches sr
-+ * - Odd stuff
- *
- *************************************************************************/
-
--#define IDECD_VERSION "4.59-ac1"
-+#define IDECD_VERSION "4.60"
-
- #include <linux/config.h>
- #include <linux/module.h>
-@@ -774,11 +777,36 @@ static int cdrom_decode_status(ide_drive
-
- if (sense_key == NOT_READY) {
- /* Tray open. */
-- cdrom_saw_media_change (drive);
-+ if (rq_data_dir(rq) == READ) {
-+ cdrom_saw_media_change (drive);
-
-- /* Fail the request. */
-- printk ("%s: tray open\n", drive->name);
-- do_end_request = 1;
-+ /* Fail the request. */
-+ printk ("%s: tray open\n", drive->name);
-+ do_end_request = 1;
-+ } else {
-+ struct cdrom_info *info = drive->driver_data;
-+
-+ /* allow the drive 5 seconds to recover, some
-+ * devices will return this error while flushing
-+ * data from cache */
-+ if (!rq->errors)
-+ info->write_timeout = jiffies + ATAPI_WAIT_WRITE_BUSY;
-+ rq->errors = 1;
-+ if (time_after(jiffies, info->write_timeout))
-+ do_end_request = 1;
-+ else {
-+ unsigned long flags;
-+
-+ /*
-+ * take a breather relying on the
-+ * unplug timer to kick us again
-+ */
-+ spin_lock_irqsave(&ide_lock, flags);
-+ blk_plug_device(drive->queue);
-+ spin_unlock_irqrestore(&ide_lock,flags);
-+ return 1;
-+ }
-+ }
- } else if (sense_key == UNIT_ATTENTION) {
- /* Media change. */
- cdrom_saw_media_change (drive);
-@@ -844,9 +872,13 @@ static int cdrom_timer_expiry(ide_drive_
- case GPCMD_BLANK:
- case GPCMD_FORMAT_UNIT:
- case GPCMD_RESERVE_RZONE_TRACK:
-- wait = WAIT_CMD;
-+ case GPCMD_CLOSE_TRACK:
-+ case GPCMD_FLUSH_CACHE:
-+ wait = ATAPI_WAIT_PC;
- break;
- default:
-+ if (!(rq->flags & REQ_QUIET))
-+ printk(KERN_INFO "ide-cd: cmd 0x%x timed out\n", rq->cmd[0]);
- wait = 0;
- break;
- }
-@@ -894,7 +926,7 @@ static ide_startstop_t cdrom_start_packe
-
- if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
- /* packet command */
-- ide_execute_command(drive, WIN_PACKETCMD, handler, WAIT_CMD, cdrom_timer_expiry);
-+ ide_execute_command(drive, WIN_PACKETCMD, handler, ATAPI_WAIT_PC, cdrom_timer_expiry);
- return ide_started;
- } else {
- /* packet command */
-@@ -1167,7 +1199,7 @@ static ide_startstop_t cdrom_read_intr (
- }
-
- /* Done moving data! Wait for another interrupt. */
-- ide_set_handler(drive, &cdrom_read_intr, WAIT_CMD, NULL);
-+ ide_set_handler(drive, &cdrom_read_intr, ATAPI_WAIT_PC, NULL);
- return ide_started;
- }
-
-@@ -1277,7 +1309,7 @@ static ide_startstop_t cdrom_start_read_
- (65534 / CD_FRAMESIZE) : 65535);
-
- /* Set up the command */
-- rq->timeout = WAIT_CMD;
-+ rq->timeout = ATAPI_WAIT_PC;
-
- /* Send the command to the drive and return. */
- return cdrom_transfer_packet_command(drive, rq, &cdrom_read_intr);
-@@ -1286,7 +1318,7 @@ static ide_startstop_t cdrom_start_read_
-
- #define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */
- #define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */
--#define IDECD_SEEK_TIMEOUT WAIT_CMD /* 10 sec */
-+#define IDECD_SEEK_TIMEOUT (2 * ATAPI_WAIT_PC) /* 20 sec */
-
- static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive)
- {
-@@ -1326,7 +1358,7 @@ static ide_startstop_t cdrom_start_seek_
- rq->cmd[0] = GPCMD_SEEK;
- put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]);
-
-- rq->timeout = WAIT_CMD;
-+ rq->timeout = ATAPI_WAIT_PC;
- return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr);
- }
-
-@@ -1502,7 +1534,7 @@ confused:
- }
-
- /* Now we wait for another interrupt. */
-- ide_set_handler(drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
-+ ide_set_handler(drive, &cdrom_pc_intr, ATAPI_WAIT_PC, cdrom_timer_expiry);
- return ide_started;
- }
-
-@@ -1511,7 +1543,7 @@ static ide_startstop_t cdrom_do_pc_conti
- struct request *rq = HWGROUP(drive)->rq;
-
- if (!rq->timeout)
-- rq->timeout = WAIT_CMD;
-+ rq->timeout = ATAPI_WAIT_PC;
-
- /* Send the command to the drive and return. */
- return cdrom_transfer_packet_command(drive, rq, &cdrom_pc_intr);
-@@ -1716,11 +1748,8 @@ static ide_startstop_t cdrom_newpc_intr(
- /*
- * If DRQ is clear, the command has completed.
- */
-- if ((stat & DRQ_STAT) == 0) {
-- if (rq->data_len)
-- printk("%s: %u residual after xfer\n", __FUNCTION__, rq->data_len);
-+ if ((stat & DRQ_STAT) == 0)
- goto end_request;
-- }
-
- /*
- * check which way to transfer data
-@@ -1826,10 +1855,8 @@ static ide_startstop_t cdrom_write_intr(
- }
- }
-
-- if (cdrom_decode_status(drive, 0, &stat)) {
-- printk("ide-cd: write_intr decode_status bad\n");
-+ if (cdrom_decode_status(drive, 0, &stat))
- return ide_stopped;
-- }
-
- /*
- * using dma, transfer is complete now
-@@ -1904,7 +1931,7 @@ static ide_startstop_t cdrom_write_intr(
- }
-
- /* re-arm handler */
-- ide_set_handler(drive, &cdrom_write_intr, 5 * WAIT_CMD, NULL);
-+ ide_set_handler(drive, &cdrom_write_intr, ATAPI_WAIT_PC, NULL);
- return ide_started;
- }
-
-@@ -1915,7 +1942,7 @@ static ide_startstop_t cdrom_start_write
- #if 0 /* the immediate bit */
- rq->cmd[1] = 1 << 3;
- #endif
-- rq->timeout = 2 * WAIT_CMD;
-+ rq->timeout = ATAPI_WAIT_PC;
-
- return cdrom_transfer_packet_command(drive, rq, cdrom_write_intr);
- }
-@@ -1956,7 +1983,7 @@ static ide_startstop_t cdrom_do_newpc_co
- struct request *rq = HWGROUP(drive)->rq;
-
- if (!rq->timeout)
-- rq->timeout = WAIT_CMD;
-+ rq->timeout = ATAPI_WAIT_PC;
-
- return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr);
- }
-@@ -2242,6 +2269,7 @@ static int cdrom_read_toc(ide_drive_t *d
- struct atapi_toc_header hdr;
- struct atapi_toc_entry ent;
- } ms_tmp;
-+ long last_written;
-
- if (toc == NULL) {
- /* Try to allocate space. */
-@@ -2261,6 +2289,13 @@ static int cdrom_read_toc(ide_drive_t *d
- if (CDROM_STATE_FLAGS(drive)->toc_valid)
- return 0;
-
-+ /* Try to get the total cdrom capacity. */
-+ stat = cdrom_read_capacity(drive, &toc->capacity, sense);
-+ if (stat)
-+ toc->capacity = 0x1fffff;
-+
-+ set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
-+
- /* First read just the header, so we know how long the TOC is. */
- stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
- sizeof(struct atapi_toc_header), sense);
-@@ -2368,13 +2403,11 @@ static int cdrom_read_toc(ide_drive_t *d
- toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
-
- /* Now try to get the total cdrom capacity. */
-- stat = cdrom_get_last_written(cdi, (long *) &toc->capacity);
-- if (stat || !toc->capacity)
-- stat = cdrom_read_capacity(drive, &toc->capacity, sense);
-- if (stat)
-- toc->capacity = 0x1fffff;
--
-- set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
-+ stat = cdrom_get_last_written(cdi, &last_written);
-+ if (!stat && last_written) {
-+ toc->capacity = last_written;
-+ set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
-+ }
-
- /* Remember that we've read this stuff. */
- CDROM_STATE_FLAGS(drive)->toc_valid = 1;
-@@ -2483,7 +2516,7 @@ static int ide_cdrom_packet(struct cdrom
- ide_drive_t *drive = (ide_drive_t*) cdi->handle;
-
- if (cgc->timeout <= 0)
-- cgc->timeout = WAIT_CMD;
-+ cgc->timeout = ATAPI_WAIT_PC;
-
- /* here we queue the commands from the uniform CD-ROM
- layer. the packet must be complete, as we do not
-@@ -2688,37 +2721,49 @@ int ide_cdrom_select_speed (struct cdrom
- return 0;
- }
-
-+/*
-+ * add logic to try GET_EVENT command first to check for media and tray
-+ * status. this should be supported by newer cd-r/w and all DVD etc
-+ * drives
-+ */
- static
- int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
- {
- ide_drive_t *drive = (ide_drive_t*) cdi->handle;
-+ struct media_event_desc med;
-+ struct request_sense sense;
-+ int stat;
-
-- if (slot_nr == CDSL_CURRENT) {
-- struct request_sense sense;
-- int stat = cdrom_check_status(drive, &sense);
-- if (stat == 0 || sense.sense_key == UNIT_ATTENTION)
-- return CDS_DISC_OK;
-+ if (slot_nr != CDSL_CURRENT)
-+ return -EINVAL;
-
-- if (sense.sense_key == NOT_READY && sense.asc == 0x04 &&
-- sense.ascq == 0x04)
-- return CDS_DISC_OK;
-+ stat = cdrom_check_status(drive, &sense);
-+ if (!stat || sense.sense_key == UNIT_ATTENTION)
-+ return CDS_DISC_OK;
-
-+ if (!cdrom_get_media_event(cdi, &med)) {
-+ if (med.media_present)
-+ return CDS_DISC_OK;
-+ if (med.door_open)
-+ return CDS_TRAY_OPEN;
-+ }
-
-- /*
-- * If not using Mt Fuji extended media tray reports,
-- * just return TRAY_OPEN since ATAPI doesn't provide
-- * any other way to detect this...
-- */
-- if (sense.sense_key == NOT_READY) {
-- if (sense.asc == 0x3a && sense.ascq == 1)
-- return CDS_NO_DISC;
-- else
-- return CDS_TRAY_OPEN;
-- }
-+ if (sense.sense_key == NOT_READY && sense.asc == 0x04 && sense.ascq == 0x04)
-+ return CDS_DISC_OK;
-
-- return CDS_DRIVE_NOT_READY;
-+ /*
-+ * If not using Mt Fuji extended media tray reports,
-+ * just return TRAY_OPEN since ATAPI doesn't provide
-+ * any other way to detect this...
-+ */
-+ if (sense.sense_key == NOT_READY) {
-+ if (sense.asc == 0x3a && sense.ascq == 1)
-+ return CDS_NO_DISC;
-+ else
-+ return CDS_TRAY_OPEN;
- }
-- return -EINVAL;
-+
-+ return CDS_DRIVE_NOT_READY;
- }
-
- static
-@@ -2826,7 +2871,8 @@ static struct cdrom_device_ops ide_cdrom
- CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET |
- CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_CD_R |
- CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM |
-- CDC_GENERIC_PACKET | CDC_MO_DRIVE,
-+ CDC_GENERIC_PACKET | CDC_MO_DRIVE | CDC_MRW |
-+ CDC_MRW_W | CDC_RAM,
- .generic_packet = ide_cdrom_packet,
- };
-
-@@ -2861,6 +2907,10 @@ static int ide_cdrom_register (ide_drive
- devinfo->mask |= CDC_CLOSE_TRAY;
- if (!CDROM_CONFIG_FLAGS(drive)->mo_drive)
- devinfo->mask |= CDC_MO_DRIVE;
-+ if (!CDROM_CONFIG_FLAGS(drive)->mrw)
-+ devinfo->mask |= CDC_MRW;
-+ if (!CDROM_CONFIG_FLAGS(drive)->mrw_w)
-+ devinfo->mask |= CDC_MRW_W;
-
- return register_cdrom(devinfo);
- }
-@@ -2881,14 +2931,6 @@ int ide_cdrom_get_capabilities(ide_drive
- !strcmp(drive->id->model, "WPI CDS-32X")))
- size -= sizeof(cap->pad);
-
-- /* we have to cheat a little here. the packet will eventually
-- * be queued with ide_cdrom_packet(), which extracts the
-- * drive from cdi->handle. Since this device hasn't been
-- * registered with the Uniform layer yet, it can't do this.
-- * Same goes for cdi->ops.
-- */
-- cdi->handle = (ide_drive_t *) drive;
-- cdi->ops = &ide_cdrom_dops;
- init_cdrom_command(&cgc, cap, size, CGC_DATA_UNKNOWN);
- do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
- stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
-@@ -2904,23 +2946,43 @@ int ide_cdrom_probe_capabilities (ide_dr
- struct cdrom_info *info = drive->driver_data;
- struct cdrom_device_info *cdi = &info->devinfo;
- struct atapi_capabilities_page cap;
-- int nslots = 1;
-+ int nslots = 1, mrw_write = 0;
-
- if (drive->media == ide_optical) {
- CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
-+ CDROM_CONFIG_FLAGS(drive)->ram = 1;
- printk("%s: ATAPI magneto-optical drive\n", drive->name);
- return nslots;
- }
-
-- if (CDROM_CONFIG_FLAGS(drive)->nec260) {
-- CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
-- CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
-+ if (CDROM_CONFIG_FLAGS(drive)->nec260 ||
-+ !strcmp(drive->id->model,"STINGRAY 8422 IDE 8X CD-ROM 7-27-95")) {
-+ CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
-+ CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
- return nslots;
- }
-
-+ /*
-+ * we have to cheat a little here. the packet will eventually
-+ * be queued with ide_cdrom_packet(), which extracts the
-+ * drive from cdi->handle. Since this device hasn't been
-+ * registered with the Uniform layer yet, it can't do this.
-+ * Same goes for cdi->ops.
-+ */
-+ cdi->handle = (ide_drive_t *) drive;
-+ cdi->ops = &ide_cdrom_dops;
-+
- if (ide_cdrom_get_capabilities(drive, &cap))
- return 0;
-
-+ if (!cdrom_is_mrw(cdi, &mrw_write)) {
-+ CDROM_CONFIG_FLAGS(drive)->mrw = 1;
-+ if (mrw_write) {
-+ CDROM_CONFIG_FLAGS(drive)->mrw_w = 1;
-+ CDROM_CONFIG_FLAGS(drive)->ram = 1;
-+ }
-+ }
-+
- if (cap.lock == 0)
- CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
- if (cap.eject)
-@@ -2933,8 +2995,10 @@ int ide_cdrom_probe_capabilities (ide_dr
- CDROM_CONFIG_FLAGS(drive)->test_write = 1;
- if (cap.dvd_ram_read || cap.dvd_r_read || cap.dvd_rom)
- CDROM_CONFIG_FLAGS(drive)->dvd = 1;
-- if (cap.dvd_ram_write)
-+ if (cap.dvd_ram_write) {
- CDROM_CONFIG_FLAGS(drive)->dvd_ram = 1;
-+ CDROM_CONFIG_FLAGS(drive)->ram = 1;
-+ }
- if (cap.dvd_r_write)
- CDROM_CONFIG_FLAGS(drive)->dvd_r = 1;
- if (cap.audio_play)
-@@ -2998,6 +3062,9 @@ int ide_cdrom_probe_capabilities (ide_dr
- (CDROM_CONFIG_FLAGS(drive)->cd_r)? "-R" : "",
- (CDROM_CONFIG_FLAGS(drive)->cd_rw)? "/RW" : "");
-
-+ if (CDROM_CONFIG_FLAGS(drive)->mrw || CDROM_CONFIG_FLAGS(drive)->mrw_w)
-+ printk(" CD-MR%s", CDROM_CONFIG_FLAGS(drive)->mrw_w ? "W" : "");
-+
- if (CDROM_CONFIG_FLAGS(drive)->is_changer)
- printk(" changer w/%d slots", nslots);
- else
-@@ -3105,14 +3172,11 @@ int ide_cdrom_setup (ide_drive_t *drive)
- struct cdrom_device_info *cdi = &info->devinfo;
- int nslots;
-
-- /*
-- * default to read-only always and fix latter at the bottom
-- */
-- set_disk_ro(drive->disk, 1);
-- blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
--
- blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn);
- blk_queue_dma_alignment(drive->queue, 3);
-+ drive->queue->unplug_delay = (1 * HZ) / 1000;
-+ if (!drive->queue->unplug_delay)
-+ drive->queue->unplug_delay = 1;
-
- drive->special.all = 0;
- drive->ready_stat = 0;
-@@ -3215,8 +3279,11 @@ int ide_cdrom_setup (ide_drive_t *drive)
-
- nslots = ide_cdrom_probe_capabilities (drive);
-
-- if (CDROM_CONFIG_FLAGS(drive)->dvd_ram)
-- set_disk_ro(drive->disk, 0);
-+ /*
-+ * set correct block size and read-only for non-ram media
-+ */
-+ set_disk_ro(drive->disk, !CDROM_CONFIG_FLAGS(drive)->ram);
-+ blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
-
- #if 0
- drive->dsc_overlap = (HWIF(drive)->no_dsc) ? 0 : 1;
-@@ -3335,39 +3402,39 @@ static ide_driver_t ide_cdrom_driver = {
- .complete_power_step = ide_cdrom_complete_power_step,
- };
-
--static int idecd_open(struct inode * inode, struct file * file)
-+static int idecd_open(struct block_device *bdev, struct file * file)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = bdev->bd_disk->private_data;
- struct cdrom_info *info = drive->driver_data;
- int rc = -ENOMEM;
- drive->usage++;
-
- if (!info->buffer)
-- info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL);
-- if (!info->buffer || (rc = cdrom_open(&info->devinfo, inode, file)))
-+ info->buffer = kmalloc(SECTOR_BUFFER_SIZE,
-+ GFP_KERNEL|__GFP_REPEAT);
-+ if (!info->buffer || (rc = cdrom_open(&info->devinfo, bdev, file)))
- drive->usage--;
- return rc;
- }
-
--static int idecd_release(struct inode * inode, struct file * file)
-+static int idecd_release(struct gendisk *disk)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = disk->private_data;
- struct cdrom_info *info = drive->driver_data;
-
-- cdrom_release (&info->devinfo, file);
-+ cdrom_release(&info->devinfo);
- drive->usage--;
- return 0;
- }
-
--static int idecd_ioctl (struct inode *inode, struct file *file,
-+static int idecd_ioctl (struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- ide_drive_t *drive = bdev->bd_disk->private_data;
- int err = generic_ide_ioctl(bdev, cmd, arg);
- if (err == -EINVAL) {
- struct cdrom_info *info = drive->driver_data;
-- err = cdrom_ioctl(&info->devinfo, inode, cmd, arg);
-+ err = cdrom_ioctl(&info->devinfo, bdev, cmd, arg);
- }
- return err;
- }
---- linux-2.6.0/drivers/ide/ide-cd.h 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/ide/ide-cd.h 2003-12-28 23:22:35.000000000 -0800
-@@ -35,6 +35,12 @@
- #define NO_DOOR_LOCKING 0
- #endif
-
-+/*
-+ * typical timeout for packet command
-+ */
-+#define ATAPI_WAIT_PC (60 * HZ)
-+#define ATAPI_WAIT_WRITE_BUSY (10 * HZ)
-+
- /************************************************************************/
-
- #define SECTOR_BITS 9
-@@ -75,6 +81,9 @@ struct ide_cd_config_flags {
- __u8 dvd : 1; /* Drive is a DVD-ROM */
- __u8 dvd_r : 1; /* Drive can write DVD-R */
- __u8 dvd_ram : 1; /* Drive can write DVD-RAM */
-+ __u8 mrw : 1; /* drive can read mrw */
-+ __u8 mrw_w : 1; /* drive can write mrw */
-+ __u8 ram : 1; /* generic WRITE (dvd-ram/mrw) */
- __u8 test_write : 1; /* Drive can fake writes */
- __u8 supp_disc_present : 1; /* Changer can report exact contents
- of slots. */
-@@ -482,6 +491,8 @@ struct cdrom_info {
-
- /* Per-device info needed by cdrom.c generic driver. */
- struct cdrom_device_info devinfo;
-+
-+ unsigned long write_timeout;
- };
-
- /****************************************************************************
---- linux-2.6.0/drivers/ide/ide-disk.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/ide-disk.c 2003-12-28 23:21:17.000000000 -0800
-@@ -1734,9 +1734,9 @@ static ide_driver_t idedisk_driver = {
- .complete_power_step = idedisk_complete_power_step,
- };
-
--static int idedisk_open(struct inode *inode, struct file *filp)
-+static int idedisk_open(struct block_device *bdev, struct file *filp)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = bdev->bd_disk->private_data;
- drive->usage++;
- if (drive->removable && drive->usage == 1) {
- ide_task_t args;
-@@ -1744,7 +1744,7 @@ static int idedisk_open(struct inode *in
- memset(&args, 0, sizeof(ide_task_t));
- args.tfRegister[IDE_COMMAND_OFFSET] = WIN_DOORLOCK;
- args.command_type = ide_cmd_type_parser(&args);
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- /*
- * Ignore the return code from door_lock,
- * since the open() has already succeeded,
-@@ -1782,9 +1782,9 @@ static int ide_cacheflush_p(ide_drive_t
- return 0;
- }
-
--static int idedisk_release(struct inode *inode, struct file *filp)
-+static int idedisk_release(struct gendisk *disk)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = disk->private_data;
- if (drive->removable && drive->usage == 1) {
- ide_task_t args;
- memset(&args, 0, sizeof(ide_task_t));
-@@ -1798,10 +1798,9 @@ static int idedisk_release(struct inode
- return 0;
- }
-
--static int idedisk_ioctl(struct inode *inode, struct file *file,
-+static int idedisk_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- return generic_ide_ioctl(bdev, cmd, arg);
- }
-
---- linux-2.6.0/drivers/ide/ide-dma.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/ide-dma.c 2003-12-28 23:22:33.000000000 -0800
-@@ -200,8 +200,8 @@ EXPORT_SYMBOL_GPL(ide_dma_intr);
- * kernel provide the necessary cache management so that we can
- * operate in a portable fashion
- */
--
--static int ide_build_sglist (ide_drive_t *drive, struct request *rq)
-+
-+int ide_build_sglist(ide_drive_t *drive, struct request *rq)
- {
- ide_hwif_t *hwif = HWIF(drive);
- struct scatterlist *sg = hwif->sg_table;
-@@ -220,6 +220,8 @@ static int ide_build_sglist (ide_drive_t
- return pci_map_sg(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
- }
-
-+EXPORT_SYMBOL_GPL(ide_build_sglist);
-+
- /**
- * ide_raw_build_sglist - map IDE scatter gather for DMA
- * @drive: the drive to build the DMA table for
-@@ -230,8 +232,8 @@ static int ide_build_sglist (ide_drive_t
- * of the kernel provide the necessary cache management so that we can
- * operate in a portable fashion
- */
--
--static int ide_raw_build_sglist (ide_drive_t *drive, struct request *rq)
-+
-+int ide_raw_build_sglist(ide_drive_t *drive, struct request *rq)
- {
- ide_hwif_t *hwif = HWIF(drive);
- struct scatterlist *sg = hwif->sg_table;
-@@ -270,6 +272,8 @@ static int ide_raw_build_sglist (ide_dri
- return pci_map_sg(hwif->pci_dev, sg, nents, hwif->sg_dma_direction);
- }
-
-+EXPORT_SYMBOL_GPL(ide_raw_build_sglist);
-+
- /**
- * ide_build_dmatable - build IDE DMA table
- *
-@@ -925,11 +929,13 @@ int ide_release_iomio_dma (ide_hwif_t *h
- */
- int ide_release_dma (ide_hwif_t *hwif)
- {
-+ if (hwif->mmio == 2)
-+ return 1;
- if (hwif->chipset == ide_etrax100)
- return 1;
-
- ide_release_dma_engine(hwif);
-- if (hwif->mmio)
-+ if (hwif->mmio == 1)
- return ide_release_mmio_dma(hwif);
- return ide_release_iomio_dma(hwif);
- }
-@@ -986,6 +992,21 @@ fail:
- return 1;
- }
-
-+int ide_mapped_mmio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
-+{
-+ printk(KERN_INFO " %s: MMIO-DMA ", hwif->name);
-+
-+ hwif->dma_base = base;
-+ if (hwif->cds->extra && hwif->channel == 0)
-+ hwif->dma_extra = hwif->cds->extra;
-+
-+ if(hwif->mate)
-+ hwif->dma_master = (hwif->channel) ? hwif->mate->dma_base : base;
-+ else
-+ hwif->dma_master = base;
-+ return 0;
-+}
-+
- int ide_iomio_dma (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
- {
- printk(KERN_INFO " %s: BM-DMA at 0x%04lx-0x%04lx",
-@@ -1020,7 +1041,9 @@ int ide_iomio_dma (ide_hwif_t *hwif, uns
- */
- int ide_dma_iobase (ide_hwif_t *hwif, unsigned long base, unsigned int ports)
- {
-- if (hwif->mmio)
-+ if (hwif->mmio == 2)
-+ return ide_mapped_mmio_dma(hwif, base,ports);
-+ if (hwif->mmio == 1)
- return ide_mmio_dma(hwif, base, ports);
- return ide_iomio_dma(hwif, base, ports);
- }
---- linux-2.6.0/drivers/ide/ide-floppy.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/ide-floppy.c 2003-12-28 23:21:17.000000000 -0800
-@@ -1866,9 +1866,9 @@ static ide_driver_t idefloppy_driver = {
- .drives = LIST_HEAD_INIT(idefloppy_driver.drives),
- };
-
--static int idefloppy_open(struct inode *inode, struct file *filp)
-+static int idefloppy_open(struct block_device *bdev, struct file *filp)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = bdev->bd_disk->private_data;
- idefloppy_floppy_t *floppy = drive->driver_data;
- idefloppy_pc_t pc;
-
-@@ -1908,7 +1908,7 @@ static int idefloppy_open(struct inode *
- idefloppy_create_prevent_cmd(&pc, 1);
- (void) idefloppy_queue_pc_tail(drive, &pc);
- }
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
- } else if (test_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags)) {
- drive->usage--;
- return -EBUSY;
-@@ -1916,9 +1916,9 @@ static int idefloppy_open(struct inode *
- return 0;
- }
-
--static int idefloppy_release(struct inode *inode, struct file *filp)
-+static int idefloppy_release(struct gendisk *disk)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = disk->private_data;
- idefloppy_pc_t pc;
-
- debug_log(KERN_INFO "Reached idefloppy_release\n");
-@@ -1938,10 +1938,9 @@ static int idefloppy_release(struct inod
- return 0;
- }
-
--static int idefloppy_ioctl(struct inode *inode, struct file *file,
-+static int idefloppy_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- ide_drive_t *drive = bdev->bd_disk->private_data;
- idefloppy_floppy_t *floppy = drive->driver_data;
- int err = generic_ide_ioctl(bdev, cmd, arg);
---- linux-2.6.0/drivers/ide/ide-io.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/ide/ide-io.c 2003-12-28 23:26:29.000000000 -0800
-@@ -54,37 +54,6 @@
- #include <asm/io.h>
- #include <asm/bitops.h>
-
--#if (DISK_RECOVERY_TIME > 0)
--
--#error So the User Has To Fix the Compilation And Stop Hacking Port 0x43. Does anyone ever use this anyway ??
--
--/*
-- * For really screwy hardware (hey, at least it *can* be used with Linux)
-- * we can enforce a minimum delay time between successive operations.
-- */
--static unsigned long read_timer (ide_hwif_t *hwif)
--{
-- unsigned long t, flags;
-- int i;
--
-- /* FIXME this is completely unsafe! */
-- local_irq_save(flags);
-- t = jiffies * 11932;
-- outb_p(0, 0x43);
-- i = inb_p(0x40);
-- i |= inb_p(0x40) << 8;
-- local_irq_restore(flags);
-- return (t - i);
--}
--#endif /* DISK_RECOVERY_TIME */
--
--static inline void set_recovery_timer (ide_hwif_t *hwif)
--{
--#if (DISK_RECOVERY_TIME > 0)
-- hwif->last_time = read_timer(hwif);
--#endif /* DISK_RECOVERY_TIME */
--}
--
- /**
- * ide_end_request - complete an IDE I/O
- * @drive: IDE device for the I/O
-@@ -653,10 +622,6 @@ ide_startstop_t start_request (ide_drive
- if (block == 0 && drive->remap_0_to_1 == 1)
- block = 1; /* redirect MBR access to EZ-Drive partn table */
-
--#if (DISK_RECOVERY_TIME > 0)
-- while ((read_timer() - HWIF(drive)->last_time) < DISK_RECOVERY_TIME);
--#endif
--
- if (blk_pm_suspend_request(rq) &&
- rq->pm->pm_step == ide_pm_state_start_suspend)
- /* Mark drive blocked when starting the suspend sequence. */
-@@ -1116,7 +1081,6 @@ void ide_timer_expiry (unsigned long dat
- startstop =
- DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG));
- }
-- set_recovery_timer(hwif);
- drive->service_time = jiffies - drive->service_start;
- spin_lock_irq(&ide_lock);
- enable_irq(hwif->irq);
-@@ -1313,7 +1277,6 @@ irqreturn_t ide_intr (int irq, void *dev
- * same irq as is currently being serviced here, and Linux
- * won't allow another of the same (on any CPU) until we return.
- */
-- set_recovery_timer(HWIF(drive));
- drive->service_time = jiffies - drive->service_start;
- if (startstop == ide_stopped) {
- if (hwgroup->handler == NULL) { /* paranoia */
---- linux-2.6.0/drivers/ide/ide-tape.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/ide/ide-tape.c 2003-12-28 23:26:27.000000000 -0800
-@@ -1,5 +1,5 @@
- /*
-- * linux/drivers/ide/ide-tape.c Version 1.17b Oct, 2002
-+ * linux/drivers/ide/ide-tape.c Version 1.19 Nov, 2003
- *
- * Copyright (C) 1995 - 1999 Gadi Oxman <gadio@netvision.net.il>
- *
-@@ -422,7 +422,7 @@
- * sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
- */
-
--#define IDETAPE_VERSION "1.17b-ac1"
-+#define IDETAPE_VERSION "1.19"
-
- #include <linux/config.h>
- #include <linux/module.h>
-@@ -450,9 +450,6 @@
- #include <asm/unaligned.h>
- #include <asm/bitops.h>
-
--
--#define NO_LONGER_REQUIRED (1)
--
- /*
- * OnStream support
- */
-@@ -652,9 +649,11 @@ typedef struct {
- #define IDETAPE_PC_STACK (10 + IDETAPE_MAX_PC_RETRIES)
-
- /*
-- * Some tape drives require a long irq timeout
-+ * Some drives (for example, Seagate STT3401A Travan) require a very long
-+ * timeout, because they don't return an interrupt or clear their busy bit
-+ * until after the command completes (even retension commands).
- */
--#define IDETAPE_WAIT_CMD (60*HZ)
-+#define IDETAPE_WAIT_CMD (900*HZ)
-
- /*
- * The following parameter is used to select the point in the internal
-@@ -1032,6 +1031,10 @@ typedef struct {
-
- /* the door is currently locked */
- int door_locked;
-+ /* the tape hardware is write protected */
-+ char drv_write_prot;
-+ /* the tape is write protected (hardware or opened as read-only) */
-+ char write_prot;
-
- /*
- * OnStream flags
-@@ -1164,6 +1167,8 @@ typedef struct {
- #define IDETAPE_DRQ_INTERRUPT 6 /* DRQ interrupt device */
- #define IDETAPE_READ_ERROR 7
- #define IDETAPE_PIPELINE_ACTIVE 8 /* pipeline active */
-+/* 0 = no tape is loaded, so we don't rewind after ejecting */
-+#define IDETAPE_MEDIUM_PRESENT 9
-
- /*
- * Supported ATAPI tape drives packet commands
-@@ -1211,10 +1216,14 @@ typedef struct {
- * requests to the tail of our block device request queue and wait
- * for their completion.
- */
--#define idetape_request(rq) \
-- ((rq)->flags & (REQ_IDETAPE_PC1 | REQ_IDETAPE_PC2 | \
-- REQ_IDETAPE_READ | REQ_IDETAPE_WRITE | \
-- REQ_IDETAPE_READ_BUFFER))
-+
-+enum {
-+ REQ_IDETAPE_PC1 = (1 << 0), /* packet command (first stage) */
-+ REQ_IDETAPE_PC2 = (1 << 1), /* packet command (second stage) */
-+ REQ_IDETAPE_READ = (1 << 2),
-+ REQ_IDETAPE_WRITE = (1 << 3),
-+ REQ_IDETAPE_READ_BUFFER = (1 << 4),
-+};
-
- /*
- * Error codes which are returned in rq->errors to the higher part
-@@ -1665,6 +1674,20 @@ static void idetape_analyze_error (ide_d
- idetape_update_buffers(pc);
- }
-
-+ /*
-+ * If error was the result of a zero-length read or write command,
-+ * with sense key=5, asc=0x22, ascq=0, let it slide. Some drives
-+ * (i.e. Seagate STT3401A Travan) don't support 0-length read/writes.
-+ */
-+ if ((pc->c[0] == IDETAPE_READ_CMD || pc->c[0] == IDETAPE_WRITE_CMD)
-+ && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) { /* length==0 */
-+ if (result->sense_key == 5) {
-+ /* don't report an error, everything's ok */
-+ pc->error = 0;
-+ /* don't retry read/write */
-+ set_bit(PC_ABORT, &pc->flags);
-+ }
-+ }
- if (pc->c[0] == IDETAPE_READ_CMD && result->filemark) {
- pc->error = IDETAPE_ERROR_FILEMARK;
- set_bit(PC_ABORT, &pc->flags);
-@@ -1805,10 +1828,15 @@ static void idetape_remove_stage_head (i
- }
- }
-
--static void idetape_abort_pipeline (ide_drive_t *drive, idetape_stage_t *last_stage)
-+/*
-+ * This will free all the pipeline stages starting from new_last_stage->next
-+ * to the end of the list, and point tape->last_stage to new_last_stage.
-+ */
-+static void idetape_abort_pipeline(ide_drive_t *drive,
-+ idetape_stage_t *new_last_stage)
- {
- idetape_tape_t *tape = drive->driver_data;
-- idetape_stage_t *stage = tape->next_stage;
-+ idetape_stage_t *stage = new_last_stage->next;
- idetape_stage_t *nstage;
-
- #if IDETAPE_DEBUG_LOG
-@@ -1822,9 +1850,9 @@ static void idetape_abort_pipeline (ide_
- --tape->nr_pending_stages;
- stage = nstage;
- }
-- tape->last_stage = last_stage;
-- if (last_stage)
-- last_stage->next = NULL;
-+ if (new_last_stage)
-+ new_last_stage->next = NULL;
-+ tape->last_stage = new_last_stage;
- tape->next_stage = NULL;
- }
-
-@@ -1868,7 +1896,7 @@ static int idetape_end_request(ide_drive
- tape->active_stage = NULL;
- tape->active_data_request = NULL;
- tape->nr_pending_stages--;
-- if (rq->flags & REQ_IDETAPE_WRITE) {
-+ if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
- #if ONSTREAM_DEBUG
- if (tape->debug_level >= 2) {
- if (tape->onstream) {
-@@ -1914,7 +1942,7 @@ static int idetape_end_request(ide_drive
- }
- }
- }
-- } else if (rq->flags & REQ_IDETAPE_READ) {
-+ } else if (rq->cmd[0] & REQ_IDETAPE_READ) {
- if (error == IDETAPE_ERROR_EOD) {
- set_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
- idetape_abort_pipeline(drive, active_stage);
-@@ -1972,6 +2000,13 @@ static void idetape_create_request_sense
- pc->callback = &idetape_request_sense_callback;
- }
-
-+static void idetape_init_rq(struct request *rq, u8 cmd)
-+{
-+ memset(rq, 0, sizeof(*rq));
-+ rq->flags = REQ_SPECIAL;
-+ rq->cmd[0] = cmd;
-+}
-+
- /*
- * idetape_queue_pc_head generates a new packet command request in front
- * of the request queue, before the current request, so that it will be
-@@ -1993,8 +2028,7 @@ static void idetape_create_request_sense
- */
- static void idetape_queue_pc_head (ide_drive_t *drive, idetape_pc_t *pc,struct request *rq)
- {
-- memset(rq, 0, sizeof(*rq));
-- rq->flags = REQ_IDETAPE_PC1;
-+ idetape_init_rq(rq, REQ_IDETAPE_PC1);
- rq->buffer = (char *) pc;
- (void) ide_do_drive_cmd(drive, rq, ide_preempt);
- }
-@@ -2430,7 +2464,14 @@ static void idetape_create_mode_sense_cm
- if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
- pc->c[1] = 8; /* DBD = 1 - Don't return block descriptors */
- pc->c[2] = page_code;
-- pc->c[3] = 255; /* Don't limit the returned information */
-+ /*
-+ * Changed pc->c[3] to 0 (255 will at best return unused info).
-+ *
-+ * For SCSI this byte is defined as subpage instead of high byte
-+ * of length and some IDE drives seem to interpret it this way
-+ * and return an error when 255 is used.
-+ */
-+ pc->c[3] = 0;
- pc->c[4] = 255; /* (We will just discard data in that case) */
- if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
- pc->request_transfer = 12;
-@@ -2544,8 +2585,9 @@ static ide_startstop_t idetape_media_acc
- if (status.b.dsc) {
- if (status.b.check) {
- /* Error detected */
-- printk(KERN_ERR "ide-tape: %s: I/O error, ",tape->name);
--
-+ if (pc->c[0] != IDETAPE_TEST_UNIT_READY_CMD)
-+ printk(KERN_ERR "ide-tape: %s: I/O error, ",
-+ tape->name);
- /* Retry operation */
- return idetape_retry_pc(drive);
- }
-@@ -2697,7 +2739,7 @@ static ide_startstop_t idetape_do_reques
- if (tape->debug_level >= 5)
- printk(KERN_INFO "ide-tape: rq_status: %d, "
- "dev: %s, cmd: %ld, errors: %d\n", rq->rq_status,
-- rq->rq_disk->disk_name, rq->flags, rq->errors);
-+ rq->rq_disk->disk_name, rq->cmd[0], rq->errors);
- #endif
- if (tape->debug_level >= 2)
- printk(KERN_INFO "ide-tape: sector: %ld, "
-@@ -2705,11 +2747,11 @@ static ide_startstop_t idetape_do_reques
- rq->sector, rq->nr_sectors, rq->current_nr_sectors);
- #endif /* IDETAPE_DEBUG_LOG */
-
-- if (!idetape_request(rq)) {
-+ if ((rq->flags & REQ_SPECIAL) == 0) {
- /*
- * We do not support buffer cache originated requests.
- */
-- printk(KERN_NOTICE "ide-tape: %s: Unsupported command in "
-+ printk(KERN_NOTICE "ide-tape: %s: Unsupported request in "
- "request queue (%ld)\n", drive->name, rq->flags);
- ide_end_request(drive, 0, 0);
- return ide_stopped;
-@@ -2746,7 +2788,7 @@ static ide_startstop_t idetape_do_reques
- */
- if (tape->onstream)
- status.b.dsc = 1;
-- if (!drive->dsc_overlap && !(rq->flags & REQ_IDETAPE_PC2))
-+ if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2))
- set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
-
- /*
-@@ -2760,7 +2802,7 @@ static ide_startstop_t idetape_do_reques
- if (tape->tape_still_time > 100 && tape->tape_still_time < 200)
- tape->measure_insert_time = 1;
- if (tape->req_buffer_fill &&
-- (rq->flags & (REQ_IDETAPE_WRITE | REQ_IDETAPE_READ))) {
-+ (rq->cmd[0] & (REQ_IDETAPE_WRITE | REQ_IDETAPE_READ))) {
- tape->req_buffer_fill = 0;
- tape->writes_since_buffer_fill = 0;
- tape->reads_since_buffer_fill = 0;
-@@ -2774,12 +2816,12 @@ static ide_startstop_t idetape_do_reques
- tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time);
- calculate_speeds(drive);
- if (tape->onstream && tape->max_frames &&
-- (((rq->flags & REQ_IDETAPE_WRITE) &&
-+ (((rq->cmd[0] & REQ_IDETAPE_WRITE) &&
- ( tape->cur_frames == tape->max_frames ||
- ( tape->speed_control && tape->cur_frames > 5 &&
- (tape->insert_speed > tape->max_insert_speed ||
- (0 /* tape->cur_frames > 30 && tape->tape_still_time > 200 */) ) ) ) ) ||
-- ((rq->flags & REQ_IDETAPE_READ) &&
-+ ((rq->cmd[0] & REQ_IDETAPE_READ) &&
- ( tape->cur_frames == 0 ||
- ( tape->speed_control && (tape->cur_frames < tape->max_frames - 5) &&
- tape->insert_speed > tape->max_insert_speed ) ) && rq->nr_sectors) ) ) {
-@@ -2787,7 +2829,7 @@ static ide_startstop_t idetape_do_reques
- if (tape->debug_level >= 4)
- printk(KERN_INFO "ide-tape: postponing request, "
- "cmd %ld, cur %d, max %d\n",
-- rq->flags, tape->cur_frames, tape->max_frames);
-+ rq->cmd[0], tape->cur_frames, tape->max_frames);
- #endif
- if (tape->postpone_cnt++ < 500) {
- status.b.dsc = 0;
-@@ -2808,7 +2850,7 @@ static ide_startstop_t idetape_do_reques
- } else if ((signed long) (jiffies - tape->dsc_timeout) > 0) {
- printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
- tape->name);
-- if (rq->flags & REQ_IDETAPE_PC2) {
-+ if (rq->cmd[0] & REQ_IDETAPE_PC2) {
- idetape_media_access_finished(drive);
- return ide_stopped;
- } else {
-@@ -2819,7 +2861,7 @@ static ide_startstop_t idetape_do_reques
- idetape_postpone_request(drive);
- return ide_stopped;
- }
-- if (rq->flags & REQ_IDETAPE_READ) {
-+ if (rq->cmd[0] & REQ_IDETAPE_READ) {
- tape->buffer_head++;
- #if USE_IOTRACE
- IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
-@@ -2836,7 +2878,7 @@ static ide_startstop_t idetape_do_reques
- idetape_create_read_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
- goto out;
- }
-- if (rq->flags & REQ_IDETAPE_WRITE) {
-+ if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
- tape->buffer_head++;
- #if USE_IOTRACE
- IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
-@@ -2854,19 +2896,19 @@ static ide_startstop_t idetape_do_reques
- idetape_create_write_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
- goto out;
- }
-- if (rq->flags & REQ_IDETAPE_READ_BUFFER) {
-+ if (rq->cmd[0] & REQ_IDETAPE_READ_BUFFER) {
- tape->postpone_cnt = 0;
- pc = idetape_next_pc_storage(drive);
- idetape_create_read_buffer_cmd(tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special);
- goto out;
- }
-- if (rq->flags & REQ_IDETAPE_PC1) {
-+ if (rq->cmd[0] & REQ_IDETAPE_PC1) {
- pc = (idetape_pc_t *) rq->buffer;
-- rq->flags &= ~(REQ_IDETAPE_PC1);
-- rq->flags |= REQ_IDETAPE_PC2;
-+ rq->cmd[0] &= ~(REQ_IDETAPE_PC1);
-+ rq->cmd[0] |= REQ_IDETAPE_PC2;
- goto out;
- }
-- if (rq->flags & REQ_IDETAPE_PC2) {
-+ if (rq->cmd[0] & REQ_IDETAPE_PC2) {
- idetape_media_access_finished(drive);
- return ide_stopped;
- }
-@@ -3163,7 +3205,7 @@ static void idetape_wait_for_request (id
- idetape_tape_t *tape = drive->driver_data;
-
- #if IDETAPE_DEBUG_BUGS
-- if (rq == NULL || !idetape_request(rq)) {
-+ if (rq == NULL || (rq->flags & REQ_SPECIAL) == 0) {
- printk (KERN_ERR "ide-tape: bug: Trying to sleep on non-valid request\n");
- return;
- }
-@@ -3269,8 +3311,7 @@ static int __idetape_queue_pc_tail (ide_
- {
- struct request rq;
-
-- memset(&rq, 0, sizeof(rq));
-- rq.flags = REQ_IDETAPE_PC1;
-+ idetape_init_rq(&rq, REQ_IDETAPE_PC1);
- rq.buffer = (char *) pc;
- return ide_do_drive_cmd(drive, &rq, ide_wait);
- }
-@@ -3295,25 +3336,28 @@ static int idetape_wait_ready(ide_drive_
- {
- idetape_tape_t *tape = drive->driver_data;
- idetape_pc_t pc;
-+ int load_attempted = 0;
-
- /*
- * Wait for the tape to become ready
- */
-+ set_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags);
- timeout += jiffies;
- while (time_before(jiffies, timeout)) {
- idetape_create_test_unit_ready_cmd(&pc);
- if (!__idetape_queue_pc_tail(drive, &pc))
- return 0;
-- if (tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2) {
-+ if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
-+ || (tape->asc == 0x3A)) { /* no media */
-+ if (load_attempted)
-+ return -ENOMEDIUM;
- idetape_create_load_unload_cmd(drive, &pc, IDETAPE_LU_LOAD_MASK);
- __idetape_queue_pc_tail(drive, &pc);
-- idetape_create_test_unit_ready_cmd(&pc);
-- if (!__idetape_queue_pc_tail(drive, &pc))
-- return 0;
-- }
-- if (!(tape->sense_key == 2 && tape->asc == 4 &&
-- (tape->ascq == 1 || tape->ascq == 8)))
-- break;
-+ load_attempted = 1;
-+ /* not about to be ready */
-+ } else if (!(tape->sense_key == 2 && tape->asc == 4 &&
-+ (tape->ascq == 1 || tape->ascq == 8)))
-+ return -EIO;
- current->state = TASK_INTERRUPTIBLE;
- schedule_timeout(HZ / 10);
- }
-@@ -3369,25 +3413,10 @@ static int idetape_read_position (ide_dr
- printk(KERN_INFO "ide-tape: Reached idetape_read_position\n");
- #endif /* IDETAPE_DEBUG_LOG */
-
--#ifdef NO_LONGER_REQUIRED
-- idetape_flush_tape_buffers(drive);
--#endif
- idetape_create_read_position_cmd(&pc);
- if (idetape_queue_pc_tail(drive, &pc))
- return -1;
- position = tape->first_frame_position;
--#ifdef NO_LONGER_REQUIRED
-- if (tape->onstream) {
-- if ((position != tape->last_frame_position - tape->blocks_in_buffer) &&
-- (position != tape->last_frame_position + tape->blocks_in_buffer)) {
-- if (tape->blocks_in_buffer == 0) {
-- printk("ide-tape: %s: correcting read position %d, %d, %d\n", tape->name, position, tape->last_frame_position, tape->blocks_in_buffer);
-- position = tape->last_frame_position;
-- tape->first_frame_position = position;
-- }
-- }
-- }
--#endif
- return position;
- }
-
-@@ -3436,6 +3465,8 @@ static int __idetape_discard_read_pipeli
-
- if (tape->chrdev_direction != idetape_direction_read)
- return 0;
-+
-+ /* Remove merge stage. */
- cnt = tape->merge_stage_size / tape->tape_block_size;
- if (test_and_clear_bit(IDETAPE_FILEMARK, &tape->flags))
- ++cnt; /* Filemarks count as 1 sector */
-@@ -3444,9 +3475,12 @@ static int __idetape_discard_read_pipeli
- __idetape_kfree_stage(tape->merge_stage);
- tape->merge_stage = NULL;
- }
-+
-+ /* Clear pipeline flags. */
- clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
- tape->chrdev_direction = idetape_direction_none;
--
-+
-+ /* Remove pipeline stages. */
- if (tape->first_stage == NULL)
- return 0;
-
-@@ -3546,8 +3580,7 @@ static int idetape_queue_rw_tail(ide_dri
- }
- #endif /* IDETAPE_DEBUG_BUGS */
-
-- memset(&rq, 0, sizeof(rq));
-- rq.flags = cmd;
-+ idetape_init_rq(&rq, cmd);
- rq.special = (void *)bh;
- rq.sector = tape->first_frame_position;
- rq.nr_sectors = rq.current_nr_sectors = blocks;
-@@ -3596,8 +3629,7 @@ static void idetape_onstream_read_back_b
- printk(KERN_INFO "ide-tape: %s: read back logical block %d, data %x %x %x %x\n", tape->name, logical_blk_num, *p++, *p++, *p++, *p++);
- #endif
- rq = &stage->rq;
-- memset(rq, 0, sizeof(*rq));
-- rq->flags = REQ_IDETAPE_WRITE;
-+ idetape_init_rq(rq, REQ_IDETAPE_WRITE);
- rq->sector = tape->first_frame_position;
- rq->nr_sectors = rq->current_nr_sectors = tape->capabilities.ctl;
- idetape_init_stage(drive, stage, OS_FRAME_TYPE_DATA, logical_blk_num++);
-@@ -3871,8 +3903,7 @@ static int idetape_add_chrdev_write_requ
- }
- }
- rq = &new_stage->rq;
-- memset(rq, 0, sizeof(*rq));
-- rq->flags = REQ_IDETAPE_WRITE;
-+ idetape_init_rq(rq, REQ_IDETAPE_WRITE);
- /* Doesn't actually matter - We always assume sequential access */
- rq->sector = tape->first_frame_position;
- rq->nr_sectors = rq->current_nr_sectors = blocks;
-@@ -4059,19 +4090,22 @@ static int idetape_initiate_read (ide_dr
- * Issue a read 0 command to ensure that DSC handshake
- * is switched from completion mode to buffer available
- * mode.
-+ * No point in issuing this if DSC overlap isn't supported,
-+ * some drives (Seagate STT3401A) will return an error.
- */
-- bytes_read = idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, 0, tape->merge_stage->bh);
-- if (bytes_read < 0) {
-- __idetape_kfree_stage(tape->merge_stage);
-- tape->merge_stage = NULL;
-- tape->chrdev_direction = idetape_direction_none;
-- return bytes_read;
-+ if (drive->dsc_overlap) {
-+ bytes_read = idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, 0, tape->merge_stage->bh);
-+ if (bytes_read < 0) {
-+ __idetape_kfree_stage(tape->merge_stage);
-+ tape->merge_stage = NULL;
-+ tape->chrdev_direction = idetape_direction_none;
-+ return bytes_read;
-+ }
- }
- }
- if (tape->restart_speed_control_req)
- idetape_restart_speed_control(drive);
-- memset(&rq, 0, sizeof(rq));
-- rq.flags = REQ_IDETAPE_READ;
-+ idetape_init_rq(&rq, REQ_IDETAPE_READ);
- rq.sector = tape->first_frame_position;
- rq.nr_sectors = rq.current_nr_sectors = blocks;
- if (!test_bit(IDETAPE_PIPELINE_ERROR, &tape->flags) &&
-@@ -4898,6 +4932,10 @@ static ssize_t idetape_chrdev_write (str
- return -ENXIO;
- }
-
-+ /* The drive is write protected. */
-+ if (tape->write_prot)
-+ return -EACCES;
-+
- #if IDETAPE_DEBUG_LOG
- if (tape->debug_level >= 3)
- printk(KERN_INFO "ide-tape: Reached idetape_chrdev_write, "
-@@ -4979,13 +5017,17 @@ static ssize_t idetape_chrdev_write (str
- * Issue a write 0 command to ensure that DSC handshake
- * is switched from completion mode to buffer available
- * mode.
-+ * No point in issuing this if DSC overlap isn't supported,
-+ * some drives (Seagate STT3401A) will return an error.
- */
-- retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
-- if (retval < 0) {
-- __idetape_kfree_stage(tape->merge_stage);
-- tape->merge_stage = NULL;
-- tape->chrdev_direction = idetape_direction_none;
-- return retval;
-+ if (drive->dsc_overlap) {
-+ retval = idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, 0, tape->merge_stage->bh);
-+ if (retval < 0) {
-+ __idetape_kfree_stage(tape->merge_stage);
-+ tape->merge_stage = NULL;
-+ tape->chrdev_direction = idetape_direction_none;
-+ return retval;
-+ }
- }
- #if ONSTREAM_DEBUG
- if (tape->debug_level >= 2)
-@@ -5141,7 +5183,7 @@ ok:
- * Note:
- *
- * MTBSF and MTBSFM are not supported when the tape doesn't
-- * supports spacing over filemarks in the reverse direction.
-+ * support spacing over filemarks in the reverse direction.
- * In this case, MTFSFM is also usually not supported (it is
- * supported in the rare case in which we crossed the filemark
- * during our read-ahead pipelined operation mode).
-@@ -5211,6 +5253,8 @@ static int idetape_mtioctop (ide_drive_t
- }
- switch (mt_op) {
- case MTWEOF:
-+ if (tape->write_prot)
-+ return -EACCES;
- idetape_discard_read_pipeline(drive, 1);
- for (i = 0; i < mt_count; i++) {
- retval = idetape_write_filemark(drive);
-@@ -5231,9 +5275,21 @@ static int idetape_mtioctop (ide_drive_t
- return (idetape_queue_pc_tail(drive, &pc));
- case MTUNLOAD:
- case MTOFFL:
-+ /*
-+ * If door is locked, attempt to unlock before
-+ * attempting to eject.
-+ */
-+ if (tape->door_locked) {
-+ if (idetape_create_prevent_cmd(drive, &pc, 0))
-+ if (!idetape_queue_pc_tail(drive, &pc))
-+ tape->door_locked = DOOR_UNLOCKED;
-+ }
- idetape_discard_read_pipeline(drive, 0);
- idetape_create_load_unload_cmd(drive, &pc,!IDETAPE_LU_LOAD_MASK);
-- return (idetape_queue_pc_tail(drive, &pc));
-+ retval = idetape_queue_pc_tail(drive, &pc);
-+ if (!retval)
-+ clear_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags);
-+ return retval;
- case MTNOP:
- idetape_discard_read_pipeline(drive, 0);
- return (idetape_flush_tape_buffers(drive));
-@@ -5409,6 +5465,8 @@ static int idetape_chrdev_ioctl (struct
- mtget.mt_gstat |= GMT_EOD(0xffffffff);
- if (position <= OS_DATA_STARTFRAME1)
- mtget.mt_gstat |= GMT_BOT(0xffffffff);
-+ } else if (tape->drv_write_prot) {
-+ mtget.mt_gstat |= GMT_WR_PROT(0xffffffff);
- }
- if (copy_to_user((char *) arg,(char *) &mtget, sizeof(struct mtget)))
- return -EFAULT;
-@@ -5530,6 +5588,8 @@ ok:
- return 1;
- }
-
-+static void idetape_get_blocksize_from_block_descriptor(ide_drive_t *drive);
-+
- /*
- * Our character device open function.
- */
-@@ -5539,7 +5599,8 @@ static int idetape_chrdev_open (struct i
- ide_drive_t *drive;
- idetape_tape_t *tape;
- idetape_pc_t pc;
--
-+ int retval;
-+
- #if IDETAPE_DEBUG_LOG
- printk(KERN_INFO "ide-tape: Reached idetape_chrdev_open\n");
- #endif /* IDETAPE_DEBUG_LOG */
-@@ -5552,11 +5613,7 @@ static int idetape_chrdev_open (struct i
-
- if (test_and_set_bit(IDETAPE_BUSY, &tape->flags))
- return -EBUSY;
-- if (!tape->onstream) {
-- idetape_read_position(drive);
-- if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags))
-- (void) idetape_rewind_tape(drive);
-- } else {
-+ if (tape->onstream) {
- if (minor & 64) {
- tape->tape_block_size = tape->stage_size = 32768 + 512;
- tape->raw = 1;
-@@ -5566,16 +5623,42 @@ static int idetape_chrdev_open (struct i
- }
- idetape_onstream_mode_sense_tape_parameter_page(drive, tape->debug_level);
- }
-- if (idetape_wait_ready(drive, 60 * HZ)) {
-+ retval = idetape_wait_ready(drive, 60 * HZ);
-+ if (retval) {
- clear_bit(IDETAPE_BUSY, &tape->flags);
- printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
-- return -EBUSY;
-+ return retval;
- }
-- if (tape->onstream)
-- idetape_read_position(drive);
-+
-+ idetape_read_position(drive);
-+ if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags))
-+ (void)idetape_rewind_tape(drive);
-+
- if (tape->chrdev_direction != idetape_direction_read)
- clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
-
-+ /* Read block size and write protect status from drive. */
-+ idetape_get_blocksize_from_block_descriptor(drive);
-+
-+ /* Set write protect flag if device is opened as read-only. */
-+ if ((filp->f_flags & O_ACCMODE) == O_RDONLY)
-+ tape->write_prot = 1;
-+ else
-+ tape->write_prot = tape->drv_write_prot;
-+
-+ /* Make sure drive isn't write protected if user wants to write. */
-+ if (tape->write_prot) {
-+ if ((filp->f_flags & O_ACCMODE) == O_WRONLY ||
-+ (filp->f_flags & O_ACCMODE) == O_RDWR) {
-+ clear_bit(IDETAPE_BUSY, &tape->flags);
-+ return -EROFS;
-+ }
-+ }
-+
-+ /*
-+ * Lock the tape drive door so user can't eject.
-+ * Analyze headers for OnStream drives.
-+ */
- if (tape->chrdev_direction == idetape_direction_none) {
- if (idetape_create_prevent_cmd(drive, &pc, 1)) {
- if (!idetape_queue_pc_tail(drive, &pc)) {
-@@ -5638,7 +5721,7 @@ static int idetape_chrdev_release (struc
- __idetape_kfree_stage(tape->cache_stage);
- tape->cache_stage = NULL;
- }
-- if (minor < 128)
-+ if (minor < 128 && test_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags))
- (void) idetape_rewind_tape(drive);
- if (tape->chrdev_direction == idetape_direction_none) {
- if (tape->door_locked == DOOR_LOCKED) {
-@@ -6059,6 +6142,8 @@ static void idetape_get_blocksize_from_b
- header = (idetape_mode_parameter_header_t *) pc.buffer;
- block_descrp = (idetape_parameter_block_descriptor_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t));
- tape->tape_block_size =( block_descrp->length[0]<<16) + (block_descrp->length[1]<<8) + block_descrp->length[2];
-+ tape->drv_write_prot = (header->dsp & 0x80) >> 7;
-+
- #if IDETAPE_DEBUG_INFO
- printk(KERN_INFO "ide-tape: Adjusted block size - %d\n", tape->tape_block_size);
- #endif /* IDETAPE_DEBUG_INFO */
-@@ -6139,6 +6224,9 @@ static void idetape_setup (ide_drive_t *
- }
- }
- #endif /* CONFIG_BLK_DEV_IDEPCI */
-+ /* Seagate Travan drives do not support DSC overlap. */
-+ if (strstr(drive->id->model, "Seagate STT3401"))
-+ drive->dsc_overlap = 0;
- tape->drive = drive;
- tape->minor = minor;
- tape->name[0] = 'h';
-@@ -6306,24 +6394,23 @@ static struct file_operations idetape_fo
- .release = idetape_chrdev_release,
- };
-
--static int idetape_open(struct inode *inode, struct file *filp)
-+static int idetape_open(struct block_device *bdev, struct file *filp)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = bdev->bd_disk->private_data;
- drive->usage++;
- return 0;
- }
-
--static int idetape_release(struct inode *inode, struct file *filp)
-+static int idetape_release(struct gendisk *disk)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = disk->private_data;
- drive->usage--;
- return 0;
- }
-
--static int idetape_ioctl(struct inode *inode, struct file *file,
-+static int idetape_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- ide_drive_t *drive = bdev->bd_disk->private_data;
- int err = generic_ide_ioctl(bdev, cmd, arg);
- if (err == -EINVAL)
---- linux-2.6.0/drivers/ide/Kconfig 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/ide/Kconfig 2003-12-28 23:21:46.000000000 -0800
-@@ -745,6 +745,14 @@ config BLK_DEV_SVWKS
- This driver adds PIO/(U)DMA support for the ServerWorks OSB4/CSB5
- chipsets.
-
-+config BLK_DEV_SGIIOC4
-+ tristate "Silicon Graphics IOC4 chipset support"
-+ depends on IA64_SGI_SN2
-+ help
-+ This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4
-+ chipset, which has one channel and can support two devices.
-+ Please say Y here if you have an Altix System from SGI.
-+
- config BLK_DEV_SIIMAGE
- tristate "Silicon Image chipset support"
- help
---- linux-2.6.0/drivers/ide/legacy/hd98.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/legacy/hd98.c 2003-12-28 23:21:12.000000000 -0800
-@@ -652,10 +652,10 @@ static void do_hd_request (request_queue
- enable_irq(HD_IRQ);
- }
-
--static int hd_ioctl(struct inode * inode, struct file * file,
-+static int hd_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data;
-+ struct hd_i_struct *disk = bdev->bd_disk->private_data;
- struct hd_geometry *loc = (struct hd_geometry *) arg;
- struct hd_geometry g;
-
-@@ -666,7 +666,7 @@ static int hd_ioctl(struct inode * inode
- g.heads = disk->head;
- g.sectors = disk->sect;
- g.cylinders = disk->cyl;
-- g.start = get_start_sect(inode->i_bdev);
-+ g.start = get_start_sect(bdev);
- return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0;
- }
-
---- linux-2.6.0/drivers/ide/legacy/hd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/legacy/hd.c 2003-12-28 23:21:12.000000000 -0800
-@@ -656,10 +656,10 @@ static void do_hd_request (request_queue
- enable_irq(HD_IRQ);
- }
-
--static int hd_ioctl(struct inode * inode, struct file * file,
-+static int hd_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data;
-+ struct hd_i_struct *disk = bdev->bd_disk->private_data;
- struct hd_geometry *loc = (struct hd_geometry *) arg;
- struct hd_geometry g;
-
-@@ -670,7 +670,7 @@ static int hd_ioctl(struct inode * inode
- g.heads = disk->head;
- g.sectors = disk->sect;
- g.cylinders = disk->cyl;
-- g.start = get_start_sect(inode->i_bdev);
-+ g.start = get_start_sect(bdev);
- return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0;
- }
-
---- linux-2.6.0/drivers/ide/legacy/ide-cs.c 2003-08-22 19:23:40.000000000 -0700
-+++ 25/drivers/ide/legacy/ide-cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -152,7 +152,7 @@ static dev_link_t *ide_attach(void)
- client_reg.event_handler = &ide_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- ide_detach(link);
-@@ -188,7 +188,7 @@ static void ide_detach(dev_link_t *link)
- ide_release(link);
-
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -207,11 +207,8 @@ static void ide_detach(dev_link_t *link)
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq)
- {
-@@ -241,16 +238,16 @@ void ide_config(dev_link_t *link)
- tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
- tuple.Attributes = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
- tuple.DesiredTuple = CISTPL_MANFID;
-- if (!CardServices(GetFirstTuple, handle, &tuple) &&
-- !CardServices(GetTupleData, handle, &tuple) &&
-- !CardServices(ParseTuple, handle, &tuple, &parse))
-+ if (!pcmcia_get_first_tuple(handle, &tuple) &&
-+ !pcmcia_get_tuple_data(handle, &tuple) &&
-+ !pcmcia_parse_tuple(handle, &tuple, &parse))
- is_kme = ((parse.manfid.manf == MANFID_KME) &&
- ((parse.manfid.card == PRODID_KME_KXLC005_A) ||
- (parse.manfid.card == PRODID_KME_KXLC005_B)));
-@@ -259,16 +256,16 @@ void ide_config(dev_link_t *link)
- link->state |= DEV_CONFIG;
-
- /* Not sure if this is right... look up the current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- pass = io_base = ctl_base = 0;
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
- tuple.Attributes = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0) goto next_entry;
-+ if (pcmcia_parse_tuple(handle, &tuple, &parse) != 0) goto next_entry;
-
- /* Check for matching Vcc, unless we're desperate */
- if (!pass) {
-@@ -299,13 +296,15 @@ void ide_config(dev_link_t *link)
- link->io.NumPorts1 = 8;
- link->io.BasePort2 = io->win[1].base;
- link->io.NumPorts2 = (is_kme) ? 2 : 1;
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
- io_base = link->io.BasePort1;
- ctl_base = link->io.BasePort2;
- } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
- link->io.NumPorts1 = io->win[0].len;
- link->io.NumPorts2 = 0;
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
- io_base = link->io.BasePort1;
- ctl_base = link->io.BasePort1+0x0e;
- } else goto next_entry;
-@@ -316,16 +315,16 @@ void ide_config(dev_link_t *link)
- next_entry:
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
- if (pass) {
-- CS_CHECK(GetNextTuple, handle, &tuple);
-- } else if (CardServices(GetNextTuple, handle, &tuple) != 0) {
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
-+ } else if (pcmcia_get_next_tuple(handle, &tuple) != 0) {
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- memset(&dflt, 0, sizeof(dflt));
- pass++;
- }
- }
-
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- /* deal with brain dead IDE resource management */
- release_region(link->io.BasePort1, link->io.NumPorts1);
-@@ -413,9 +412,9 @@ void ide_release(dev_link_t *link)
- info->ndev = 0;
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
-
-@@ -452,14 +451,14 @@ int ide_event(event_t event, int priorit
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link))
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
- return 0;
---- linux-2.6.0/drivers/ide/pci/cmd640.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ide/pci/cmd640.c 2003-12-28 23:26:28.000000000 -0800
-@@ -213,13 +213,13 @@ static unsigned int cmd640_chip_version;
-
- static void put_cmd640_reg_pci1 (u16 reg, u8 val)
- {
-- outb_p((reg & 0xfc) | cmd640_key, 0xcf8);
-+ outl_p((reg & 0xfc) | cmd640_key, 0xcf8);
- outb_p(val, (reg & 3) | 0xcfc);
- }
-
- static u8 get_cmd640_reg_pci1 (u16 reg)
- {
-- outb_p((reg & 0xfc) | cmd640_key, 0xcf8);
-+ outl_p((reg & 0xfc) | cmd640_key, 0xcf8);
- return inb_p((reg & 3) | 0xcfc);
- }
-
---- linux-2.6.0/drivers/ide/pci/Makefile 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/ide/pci/Makefile 2003-12-28 23:21:46.000000000 -0800
-@@ -21,6 +21,7 @@ obj-$(CONFIG_BLK_DEV_PDC202XX_NEW) += pd
- obj-$(CONFIG_BLK_DEV_PIIX) += piix.o
- obj-$(CONFIG_BLK_DEV_RZ1000) += rz1000.o
- obj-$(CONFIG_BLK_DEV_SVWKS) += serverworks.o
-+obj-$(CONFIG_BLK_DEV_SGIIOC4) += sgiioc4.o
- obj-$(CONFIG_BLK_DEV_SIIMAGE) += siimage.o
- obj-$(CONFIG_BLK_DEV_SIS5513) += sis5513.o
- obj-$(CONFIG_BLK_DEV_SL82C105) += sl82c105.o
---- linux-2.6.0/drivers/ide/pci/pdc202xx_new.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/ide/pci/pdc202xx_new.c 2003-12-28 23:26:29.000000000 -0800
-@@ -36,60 +36,20 @@
-
- #define PDC202_DEBUG_CABLE 0
-
--#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
--#include <linux/stat.h>
--#include <linux/proc_fs.h>
--
--static u8 pdcnew_proc = 0;
--#define PDC202_MAX_DEVS 5
--static struct pci_dev *pdc202_devs[PDC202_MAX_DEVS];
--static int n_pdc202_devs;
--
--static char * pdcnew_info(char *buf, struct pci_dev *dev)
--{
-- char *p = buf;
--
-- p += sprintf(p, "\n ");
-- switch(dev->device) {
-- case PCI_DEVICE_ID_PROMISE_20277:
-- p += sprintf(p, "SBFastTrak 133 Lite"); break;
-- case PCI_DEVICE_ID_PROMISE_20276:
-- p += sprintf(p, "MBFastTrak 133 Lite"); break;
-- case PCI_DEVICE_ID_PROMISE_20275:
-- p += sprintf(p, "MBUltra133"); break;
-- case PCI_DEVICE_ID_PROMISE_20271:
-- p += sprintf(p, "FastTrak TX2000"); break;
-- case PCI_DEVICE_ID_PROMISE_20270:
-- p += sprintf(p, "FastTrak LP/TX2/TX4"); break;
-- case PCI_DEVICE_ID_PROMISE_20269:
-- p += sprintf(p, "Ultra133 TX2"); break;
-- case PCI_DEVICE_ID_PROMISE_20268:
-- p += sprintf(p, "Ultra100 TX2"); break;
-- default:
-- p += sprintf(p, "Ultra series"); break;
-- break;
-- }
-- p += sprintf(p, " Chipset.\n");
-- return (char *)p;
--}
--
--static int pdcnew_get_info (char *buffer, char **addr, off_t offset, int count)
--{
-- char *p = buffer;
-- int i, len;
--
-- for (i = 0; i < n_pdc202_devs; i++) {
-- struct pci_dev *dev = pdc202_devs[i];
-- p = pdcnew_info(buffer, dev);
-- }
-- /* p - buffer must be less than 4k! */
-- len = (p - buffer) - offset;
-- *addr = buffer + offset;
--
-- return len > count ? count : len;
--}
--#endif /* defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS) */
-+struct pdcnew_name {
-+ u16 dev_id;
-+ const char *name;
-+};
-
-+static struct pdcnew_name __initdata pdcnew_names[] = {
-+ { PCI_DEVICE_ID_PROMISE_20277, "SBFastTrak 133 Lite" },
-+ { PCI_DEVICE_ID_PROMISE_20276, "MBFastTrak 133 Lite" },
-+ { PCI_DEVICE_ID_PROMISE_20275, "MBUltra133", },
-+ { PCI_DEVICE_ID_PROMISE_20271, "FastTrak TX2000", },
-+ { PCI_DEVICE_ID_PROMISE_20270, "FastTrak LP/TX2/TX4", },
-+ { PCI_DEVICE_ID_PROMISE_20269, "Ultra133 TX2" },
-+ { PCI_DEVICE_ID_PROMISE_20268, "Ultra100 TX2" },
-+};
-
- static u8 pdcnew_ratemask (ide_drive_t *drive)
- {
-@@ -515,6 +475,15 @@ void pdcnew_reset (ide_drive_t *drive)
-
- static unsigned int __init init_chipset_pdcnew (struct pci_dev *dev, const char *name)
- {
-+ unsigned int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(pdcnew_names); i++)
-+ if (pdcnew_names[i].dev_id == dev->device) {
-+ printk(KERN_INFO "%s: %s on pci%s\n", name,
-+ pdcnew_names[i].name, pci_name(dev));
-+ break;
-+ }
-+
- if (dev->resource[PCI_ROM_RESOURCE].start) {
- pci_write_config_dword(dev, PCI_ROM_ADDRESS,
- dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
-@@ -522,15 +491,6 @@ static unsigned int __init init_chipset_
- name, dev->resource[PCI_ROM_RESOURCE].start);
- }
-
--#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
-- pdc202_devs[n_pdc202_devs++] = dev;
--
-- if (!pdcnew_proc) {
-- pdcnew_proc = 1;
-- ide_pci_register_host_proc(&pdcnew_procs[0]);
-- }
--#endif /* DISPLAY_PDC202XX_TIMINGS && CONFIG_PROC_FS */
--
- return dev->irq;
- }
-
---- linux-2.6.0/drivers/ide/pci/pdc202xx_new.h 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/ide/pci/pdc202xx_new.h 2003-12-28 23:26:29.000000000 -0800
-@@ -5,8 +5,6 @@
- #include <linux/pci.h>
- #include <linux/ide.h>
-
--#define DISPLAY_PDC202XX_TIMINGS
--
- #ifndef SPLIT_BYTE
- #define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4)))
- #endif
-@@ -162,27 +160,6 @@ static void decode_registers (u8 registe
- set_2regs(0x13,(c)); \
- } while(0)
-
--#define DISPLAY_PDC202XX_TIMINGS
--
--#if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
--#include <linux/stat.h>
--#include <linux/proc_fs.h>
--
--static u8 pdcnew_proc;
--
--static int pdcnew_get_info(char *, char **, off_t, int);
--
--static ide_pci_host_proc_t pdcnew_procs[] __initdata = {
-- {
-- .name = "pdcnew",
-- .set = 1,
-- .get_info = pdcnew_get_info,
-- .parent = NULL,
-- },
--};
--#endif /* DISPLAY_PDC202XX_TIMINGS && CONFIG_PROC_FS */
--
--
- static void init_setup_pdcnew(struct pci_dev *, ide_pci_device_t *);
- static void init_setup_pdc20270(struct pci_dev *, ide_pci_device_t *);
- static void init_setup_pdc20276(struct pci_dev *dev, ide_pci_device_t *d);
---- linux-2.6.0/drivers/ide/pci/pdc202xx_old.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/ide/pci/pdc202xx_old.c 2003-12-28 23:26:28.000000000 -0800
-@@ -361,16 +361,38 @@ static u8 pdc202xx_old_cable_detect (ide
- return ((u8)(CIS & mask));
- }
-
-+/*
-+ * Set the control register to use the 66MHz system
-+ * clock for UDMA 3/4/5 mode operation when necessary.
-+ *
-+ * It may also be possible to leave the 66MHz clock on
-+ * and readjust the timing parameters.
-+ */
-+static void pdc_old_enable_66MHz_clock(ide_hwif_t *hwif)
-+{
-+ unsigned long clock_reg = hwif->dma_master + 0x11;
-+ u8 clock = hwif->INB(clock_reg);
-+
-+ hwif->OUTB(clock | (hwif->channel ? 0x08 : 0x02), clock_reg);
-+}
-+
-+static void pdc_old_disable_66MHz_clock(ide_hwif_t *hwif)
-+{
-+ unsigned long clock_reg = hwif->dma_master + 0x11;
-+ u8 clock = hwif->INB(clock_reg);
-+
-+ hwif->OUTB(clock & ~(hwif->channel ? 0x08 : 0x02), clock_reg);
-+}
-+
- static int config_chipset_for_dma (ide_drive_t *drive)
- {
- struct hd_driveid *id = drive->id;
- ide_hwif_t *hwif = HWIF(drive);
- struct pci_dev *dev = hwif->pci_dev;
- u32 drive_conf = 0;
-- u8 mask = hwif->channel ? 0x08 : 0x02;
- u8 drive_pci = 0x60 + (drive->dn << 2);
- u8 test1 = 0, test2 = 0, speed = -1;
-- u8 AP = 0, CLKSPD = 0, cable = 0;
-+ u8 AP = 0, cable = 0;
-
- u8 ultra_66 = ((id->dma_ultra & 0x0010) ||
- (id->dma_ultra & 0x0008)) ? 1 : 0;
-@@ -394,21 +416,6 @@ static int config_chipset_for_dma (ide_d
- BUG();
- }
-
-- CLKSPD = hwif->INB(hwif->dma_master + 0x11);
--
-- /*
-- * Set the control register to use the 66Mhz system
-- * clock for UDMA 3/4 mode operation. If one drive on
-- * a channel is U66 capable but the other isn't we
-- * fall back to U33 mode. The BIOS INT 13 hooks turn
-- * the clock on then off for each read/write issued. I don't
-- * do that here because it would require modifying the
-- * kernel, separating the fop routines from the kernel or
-- * somehow hooking the fops calls. It may also be possible to
-- * leave the 66Mhz clock on and readjust the timing
-- * parameters.
-- */
--
- if ((ultra_66) && (cable)) {
- #ifdef DEBUG
- printk(KERN_DEBUG "ULTRA 66/100/133: %s channel of Ultra 66/100/133 "
-@@ -416,29 +423,12 @@ static int config_chipset_for_dma (ide_d
- hwif->channel ? "Secondary" : "Primary");
- printk(KERN_DEBUG " Switching to Ultra33 mode.\n");
- #endif /* DEBUG */
-- /* Primary : zero out second bit */
-- /* Secondary : zero out fourth bit */
-- hwif->OUTB(CLKSPD & ~mask, (hwif->dma_master + 0x11));
- printk(KERN_WARNING "Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary");
- printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name);
-- } else {
-- if (ultra_66) {
-- /*
-- * check to make sure drive on same channel
-- * is u66 capable
-- */
-- if (hwif->drives[!(drive->dn%2)].id) {
-- if (hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0078) {
-- hwif->OUTB(CLKSPD | mask, (hwif->dma_master + 0x11));
-- } else {
-- hwif->OUTB(CLKSPD & ~mask, (hwif->dma_master + 0x11));
-- }
-- } else { /* udma4 drive by itself */
-- hwif->OUTB(CLKSPD | mask, (hwif->dma_master + 0x11));
-- }
-- }
- }
-
-+ pdc_old_disable_66MHz_clock(drive->hwif);
-+
- drive_pci = 0x60 + (drive->dn << 2);
- pci_read_config_dword(dev, drive_pci, &drive_conf);
- if ((drive_conf != 0x004ff304) && (drive_conf != 0x004ff3c4))
-@@ -536,6 +526,8 @@ static int pdc202xx_quirkproc (ide_drive
-
- static int pdc202xx_old_ide_dma_begin(ide_drive_t *drive)
- {
-+ if (drive->current_speed > XFER_UDMA_2)
-+ pdc_old_enable_66MHz_clock(drive->hwif);
- if (drive->addressing == 1) {
- struct request *rq = HWGROUP(drive)->rq;
- ide_hwif_t *hwif = HWIF(drive);
-@@ -569,6 +561,8 @@ static int pdc202xx_old_ide_dma_end(ide_
- clock = hwif->INB(high_16 + 0x11);
- hwif->OUTB(clock & ~(hwif->channel ? 0x08:0x02), high_16+0x11);
- }
-+ if (drive->current_speed > XFER_UDMA_2)
-+ pdc_old_disable_66MHz_clock(drive->hwif);
- return __ide_dma_end(drive);
- }
-
-@@ -757,10 +751,7 @@ static void __init init_hwif_pdc202xx (i
-
- hwif->speedproc = &pdc202xx_tune_chipset;
-
-- if (!hwif->dma_base) {
-- hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
-- return;
-- }
-+ hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
-
- hwif->ultra_mask = 0x3f;
- hwif->mwdma_mask = 0x07;
---- linux-2.6.0/drivers/ide/pci/piix.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/ide/pci/piix.c 2003-12-28 23:22:14.000000000 -0800
-@@ -768,8 +768,8 @@ static void __init piix_check_450nx(void
- /* Only on the original revision: IDE DMA can hang */
- if(rev == 0x00)
- no_piix_dma = 1;
-- /* On all revisions PXB bus lock must be disabled for IDE */
-- else if(cfg & (1<<14))
-+ /* On all revisions below 5 PXB bus lock must be disabled for IDE */
-+ else if(cfg & (1<<14) && rev < 5)
- no_piix_dma = 2;
- }
- if(no_piix_dma)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/ide/pci/sgiioc4.c 2003-12-28 23:21:46.000000000 -0800
-@@ -0,0 +1,833 @@
-+/*
-+ * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of version 2 of the GNU General Public License
-+ * as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it would be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this program; if not, write the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
-+ *
-+ * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
-+ * Mountain View, CA 94043, or:
-+ *
-+ * http://www.sgi.com
-+ *
-+ * For further information regarding this notice, see:
-+ *
-+ * http://oss.sgi.com/projects/GenInfo/NoticeExplan
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/pci.h>
-+#include <linux/delay.h>
-+#include <linux/hdreg.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/timer.h>
-+#include <linux/mm.h>
-+#include <linux/ioport.h>
-+#include <linux/blkdev.h>
-+#include <asm/io.h>
-+
-+#include <linux/ide.h>
-+
-+/* IOC4 Specific Definitions */
-+#define IOC4_CMD_OFFSET 0x100
-+#define IOC4_CTRL_OFFSET 0x120
-+#define IOC4_DMA_OFFSET 0x140
-+#define IOC4_INTR_OFFSET 0x0
-+
-+#define IOC4_TIMING 0x00
-+#define IOC4_DMA_PTR_L 0x01
-+#define IOC4_DMA_PTR_H 0x02
-+#define IOC4_DMA_ADDR_L 0x03
-+#define IOC4_DMA_ADDR_H 0x04
-+#define IOC4_BC_DEV 0x05
-+#define IOC4_BC_MEM 0x06
-+#define IOC4_DMA_CTRL 0x07
-+#define IOC4_DMA_END_ADDR 0x08
-+
-+/* Bits in the IOC4 Control/Status Register */
-+#define IOC4_S_DMA_START 0x01
-+#define IOC4_S_DMA_STOP 0x02
-+#define IOC4_S_DMA_DIR 0x04
-+#define IOC4_S_DMA_ACTIVE 0x08
-+#define IOC4_S_DMA_ERROR 0x10
-+#define IOC4_ATA_MEMERR 0x02
-+
-+/* Read/Write Directions */
-+#define IOC4_DMA_WRITE 0x04
-+#define IOC4_DMA_READ 0x00
-+
-+/* Interrupt Register Offsets */
-+#define IOC4_INTR_REG 0x03
-+#define IOC4_INTR_SET 0x05
-+#define IOC4_INTR_CLEAR 0x07
-+
-+#define IOC4_IDE_CACHELINE_SIZE 128
-+#define IOC4_CMD_CTL_BLK_SIZE 0x20
-+#define IOC4_SUPPORTED_FIRMWARE_REV 46
-+
-+typedef struct {
-+ u32 timing_reg0;
-+ u32 timing_reg1;
-+ u32 low_mem_ptr;
-+ u32 high_mem_ptr;
-+ u32 low_mem_addr;
-+ u32 high_mem_addr;
-+ u32 dev_byte_count;
-+ u32 mem_byte_count;
-+ u32 status;
-+} ioc4_dma_regs_t;
-+
-+/* Each Physical Region Descriptor Entry size is 16 bytes (2 * 64 bits) */
-+/* IOC4 has only 1 IDE channel */
-+#define IOC4_PRD_BYTES 16
-+#define IOC4_PRD_ENTRIES (PAGE_SIZE /(4*IOC4_PRD_BYTES))
-+
-+
-+static void
-+sgiioc4_init_hwif_ports(hw_regs_t * hw, unsigned long data_port,
-+ unsigned long ctrl_port, unsigned long irq_port)
-+{
-+ unsigned long reg = data_port;
-+ int i;
-+
-+ /* Registers are word (32 bit) aligned */
-+ for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
-+ hw->io_ports[i] = reg + i * 4;
-+
-+ if (ctrl_port)
-+ hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-+
-+ if (irq_port)
-+ hw->io_ports[IDE_IRQ_OFFSET] = irq_port;
-+}
-+
-+static void
-+sgiioc4_maskproc(ide_drive_t * drive, int mask)
-+{
-+ ide_hwif_t *hwif = HWIF(drive);
-+ hwif->OUTB(mask ? (drive->ctl | 2) : (drive->ctl & ~2),
-+ IDE_CONTROL_REG);
-+}
-+
-+
-+static int
-+sgiioc4_checkirq(ide_hwif_t * hwif)
-+{
-+ u8 intr_reg =
-+ hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + IOC4_INTR_REG * 4);
-+
-+ if (intr_reg & 0x03)
-+ return 1;
-+
-+ return 0;
-+}
-+
-+
-+static int
-+sgiioc4_clearirq(ide_drive_t * drive)
-+{
-+ u32 intr_reg;
-+ ide_hwif_t *hwif = HWIF(drive);
-+ unsigned long other_ir =
-+ hwif->io_ports[IDE_IRQ_OFFSET] + (IOC4_INTR_REG << 2);
-+
-+ /* Code to check for PCI error conditions */
-+ intr_reg = hwif->INL(other_ir);
-+ if (intr_reg & 0x03) { /* Valid IOC4-IDE interrupt */
-+ /*
-+ * Using hwif->INB to read the IDE_STATUS_REG has a side effect
-+ * of clearing the interrupt. The first read should clear it
-+ * if it is set. The second read should return a "clear" status
-+ * if it got cleared. If not, then spin for a bit trying to
-+ * clear it.
-+ */
-+ u8 stat = hwif->INB(IDE_STATUS_REG);
-+ int count = 0;
-+ stat = hwif->INB(IDE_STATUS_REG);
-+ while ((stat & 0x80) && (count++ < 100)) {
-+ udelay(1);
-+ stat = hwif->INB(IDE_STATUS_REG);
-+ }
-+
-+ if (intr_reg & 0x02) {
-+ /* Error when transferring DMA data on PCI bus */
-+ u32 pci_err_addr_low, pci_err_addr_high,
-+ pci_stat_cmd_reg;
-+
-+ pci_err_addr_low =
-+ hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET]);
-+ pci_err_addr_high =
-+ hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + 4);
-+ pci_read_config_dword(hwif->pci_dev, PCI_COMMAND,
-+ &pci_stat_cmd_reg);
-+ printk(KERN_ERR
-+ "%s(%s) : PCI Bus Error when doing DMA:"
-+ " status-cmd reg is 0x%x\n",
-+ __FUNCTION__, drive->name, pci_stat_cmd_reg);
-+ printk(KERN_ERR
-+ "%s(%s) : PCI Error Address is 0x%x%x\n",
-+ __FUNCTION__, drive->name,
-+ pci_err_addr_high, pci_err_addr_low);
-+ /* Clear the PCI Error indicator */
-+ pci_write_config_dword(hwif->pci_dev, PCI_COMMAND,
-+ 0x00000146);
-+ }
-+
-+ /* Clear the Interrupt, Error bits on the IOC4 */
-+ hwif->OUTL(0x03, other_ir);
-+
-+ intr_reg = hwif->INL(other_ir);
-+ }
-+
-+ return intr_reg & 3;
-+}
-+
-+static int
-+sgiioc4_ide_dma_begin(ide_drive_t * drive)
-+{
-+ ide_hwif_t *hwif = HWIF(drive);
-+ unsigned int reg = hwif->INL(hwif->dma_base + IOC4_DMA_CTRL * 4);
-+ unsigned int temp_reg = reg | IOC4_S_DMA_START;
-+
-+ hwif->OUTL(temp_reg, hwif->dma_base + IOC4_DMA_CTRL * 4);
-+
-+ return 0;
-+}
-+
-+static u32
-+sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base)
-+{
-+ u32 ioc4_dma;
-+ int count;
-+
-+ count = 0;
-+ ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
-+ while ((ioc4_dma & IOC4_S_DMA_STOP) && (count++ < 200)) {
-+ udelay(1);
-+ ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
-+ }
-+ return ioc4_dma;
-+}
-+
-+/* Stops the IOC4 DMA Engine */
-+static int
-+sgiioc4_ide_dma_end(ide_drive_t * drive)
-+{
-+ u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0;
-+ ide_hwif_t *hwif = HWIF(drive);
-+ u64 dma_base = hwif->dma_base;
-+ int dma_stat = 0;
-+ unsigned long *ending_dma = (unsigned long *) hwif->dma_base2;
-+
-+ hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
-+
-+ ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
-+
-+ if (ioc4_dma & IOC4_S_DMA_STOP) {
-+ printk(KERN_ERR
-+ "%s(%s): IOC4 DMA STOP bit is still 1 :"
-+ "ioc4_dma_reg 0x%x\n",
-+ __FUNCTION__, drive->name, ioc4_dma);
-+ dma_stat = 1;
-+ }
-+
-+ /*
-+ * The IOC4 will DMA 1's to the ending dma area to indicate that
-+ * previous data DMA is complete. This is necessary because of relaxed
-+ * ordering between register reads and DMA writes on the Altix.
-+ */
-+ while ((cnt++ < 200) && (!valid)) {
-+ for (num = 0; num < 16; num++) {
-+ if (ending_dma[num]) {
-+ valid = 1;
-+ break;
-+ }
-+ }
-+ udelay(1);
-+ }
-+ if (!valid) {
-+ printk(KERN_ERR "%s(%s) : DMA incomplete\n", __FUNCTION__,
-+ drive->name);
-+ dma_stat = 1;
-+ }
-+
-+ bc_dev = hwif->INL(dma_base + IOC4_BC_DEV * 4);
-+ bc_mem = hwif->INL(dma_base + IOC4_BC_MEM * 4);
-+
-+ if ((bc_dev & 0x01FF) || (bc_mem & 0x1FF)) {
-+ if (bc_dev > bc_mem + 8) {
-+ printk(KERN_ERR
-+ "%s(%s): WARNING!! byte_count_dev %d "
-+ "!= byte_count_mem %d\n",
-+ __FUNCTION__, drive->name, bc_dev, bc_mem);
-+ }
-+ }
-+
-+ drive->waiting_for_dma = 0;
-+ ide_destroy_dmatable(drive);
-+
-+ return dma_stat;
-+}
-+
-+static int
-+sgiioc4_ide_dma_check(ide_drive_t * drive)
-+{
-+ if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0) {
-+ printk(KERN_INFO
-+ "Couldnot set %s in Multimode-2 DMA mode | "
-+ "Drive %s using PIO instead\n",
-+ drive->name, drive->name);
-+ drive->using_dma = 0;
-+ } else
-+ drive->using_dma = 1;
-+
-+ return 0;
-+}
-+
-+static int
-+sgiioc4_ide_dma_on(ide_drive_t * drive)
-+{
-+ drive->using_dma = 1;
-+
-+ return HWIF(drive)->ide_dma_host_on(drive);
-+}
-+
-+static int
-+sgiioc4_ide_dma_off(ide_drive_t * drive)
-+{
-+ printk(KERN_INFO "%s: DMA disabled\n", drive->name);
-+
-+ return HWIF(drive)->ide_dma_off_quietly(drive);
-+}
-+
-+static int
-+sgiioc4_ide_dma_off_quietly(ide_drive_t * drive)
-+{
-+ drive->using_dma = 0;
-+
-+ return HWIF(drive)->ide_dma_host_off(drive);
-+}
-+
-+/* returns 1 if dma irq issued, 0 otherwise */
-+static int
-+sgiioc4_ide_dma_test_irq(ide_drive_t * drive)
-+{
-+ return sgiioc4_checkirq(HWIF(drive));
-+}
-+
-+static int
-+sgiioc4_ide_dma_host_on(ide_drive_t * drive)
-+{
-+ if (drive->using_dma)
-+ return 0;
-+
-+ return 1;
-+}
-+
-+static int
-+sgiioc4_ide_dma_host_off(ide_drive_t * drive)
-+{
-+ sgiioc4_clearirq(drive);
-+
-+ return 0;
-+}
-+
-+static int
-+sgiioc4_ide_dma_verbose(ide_drive_t * drive)
-+{
-+ if (drive->using_dma == 1)
-+ printk(", UDMA(16)");
-+ else
-+ printk(", PIO");
-+
-+ return 1;
-+}
-+
-+static int
-+sgiioc4_ide_dma_lostirq(ide_drive_t * drive)
-+{
-+ HWIF(drive)->resetproc(drive);
-+
-+ return __ide_dma_lostirq(drive);
-+}
-+
-+static void
-+sgiioc4_resetproc(ide_drive_t * drive)
-+{
-+ sgiioc4_ide_dma_end(drive);
-+ sgiioc4_clearirq(drive);
-+}
-+
-+static u8
-+sgiioc4_INB(unsigned long port)
-+{
-+ u8 reg = (u8) inb(port);
-+
-+ if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */
-+ if (reg & 0x51) { /* Not busy...check for interrupt */
-+ unsigned long other_ir = port - 0x110;
-+ unsigned int intr_reg = (u32) inl(other_ir);
-+
-+ /* Clear the Interrupt, Error bits on the IOC4 */
-+ if (intr_reg & 0x03) {
-+ outl(0x03, other_ir);
-+ intr_reg = (u32) inl(other_ir);
-+ }
-+ }
-+ }
-+
-+ return reg;
-+}
-+
-+/* Creates a dma map for the scatter-gather list entries */
-+static void __init
-+ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base)
-+{
-+ int num_ports = sizeof (ioc4_dma_regs_t);
-+
-+ printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name,
-+ dma_base, dma_base + num_ports - 1);
-+
-+ if (!request_region(dma_base, num_ports, hwif->name)) {
-+ printk(KERN_ERR
-+ "%s(%s) -- ERROR, Addresses 0x%p to 0x%p "
-+ "ALREADY in use\n",
-+ __FUNCTION__, hwif->name, (void *) dma_base,
-+ (void *) dma_base + num_ports - 1);
-+ goto dma_alloc_failure;
-+ }
-+
-+ hwif->dma_base = dma_base;
-+ hwif->dmatable_cpu = pci_alloc_consistent(hwif->pci_dev,
-+ IOC4_PRD_ENTRIES * IOC4_PRD_BYTES,
-+ &hwif->dmatable_dma);
-+
-+ if (!hwif->dmatable_cpu)
-+ goto dma_alloc_failure;
-+
-+ hwif->sg_table =
-+ kmalloc(sizeof (struct scatterlist) * IOC4_PRD_ENTRIES, GFP_KERNEL);
-+
-+ if (!hwif->sg_table)
-+ goto dma_sgalloc_failure;
-+
-+ hwif->dma_base2 = (unsigned long)
-+ pci_alloc_consistent(hwif->pci_dev,
-+ IOC4_IDE_CACHELINE_SIZE,
-+ (dma_addr_t *) &(hwif->dma_status));
-+
-+ if (!hwif->dma_base2)
-+ goto dma_base2alloc_failure;
-+
-+ return;
-+
-+dma_base2alloc_failure:
-+ kfree(hwif->sg_table);
-+
-+dma_sgalloc_failure:
-+ pci_free_consistent(hwif->pci_dev,
-+ IOC4_PRD_ENTRIES * IOC4_PRD_BYTES,
-+ hwif->dmatable_cpu, hwif->dmatable_dma);
-+ printk(KERN_INFO
-+ "%s() -- Error! Unable to allocate DMA Maps for drive %s\n",
-+ __FUNCTION__, hwif->name);
-+ printk(KERN_INFO
-+ "Changing from DMA to PIO mode for Drive %s\n", hwif->name);
-+
-+dma_alloc_failure:
-+ /* Disable DMA because we couldnot allocate any DMA maps */
-+ hwif->autodma = 0;
-+ hwif->atapi_dma = 0;
-+}
-+
-+/* Initializes the IOC4 DMA Engine */
-+static void
-+sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive)
-+{
-+ u32 ioc4_dma;
-+ ide_hwif_t *hwif = HWIF(drive);
-+ u64 dma_base = hwif->dma_base;
-+ u32 dma_addr, ending_dma_addr;
-+
-+ ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
-+
-+ if (ioc4_dma & IOC4_S_DMA_ACTIVE) {
-+ printk(KERN_WARNING
-+ "%s(%s):Warning!! DMA from previous transfer was still active\n",
-+ __FUNCTION__, drive->name);
-+ hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
-+ ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
-+
-+ if (ioc4_dma & IOC4_S_DMA_STOP)
-+ printk(KERN_ERR
-+ "%s(%s) : IOC4 Dma STOP bit is still 1\n",
-+ __FUNCTION__, drive->name);
-+ }
-+
-+ ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4);
-+ if (ioc4_dma & IOC4_S_DMA_ERROR) {
-+ printk(KERN_WARNING
-+ "%s(%s) : Warning!! - DMA Error during Previous"
-+ " transfer | status 0x%x\n",
-+ __FUNCTION__, drive->name, ioc4_dma);
-+ hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4);
-+ ioc4_dma = sgiioc4_ide_dma_stop(hwif, dma_base);
-+
-+ if (ioc4_dma & IOC4_S_DMA_STOP)
-+ printk(KERN_ERR
-+ "%s(%s) : IOC4 DMA STOP bit is still 1\n",
-+ __FUNCTION__, drive->name);
-+ }
-+
-+ /* Address of the Scatter Gather List */
-+ dma_addr = cpu_to_le32(hwif->dmatable_dma);
-+ hwif->OUTL(dma_addr, dma_base + IOC4_DMA_PTR_L * 4);
-+
-+ /* Address of the Ending DMA */
-+ memset((unsigned int *) hwif->dma_base2, 0, IOC4_IDE_CACHELINE_SIZE);
-+ ending_dma_addr = cpu_to_le32(hwif->dma_status);
-+ hwif->OUTL(ending_dma_addr, dma_base + IOC4_DMA_END_ADDR * 4);
-+
-+ hwif->OUTL(dma_direction, dma_base + IOC4_DMA_CTRL * 4);
-+ drive->waiting_for_dma = 1;
-+}
-+
-+/* IOC4 Scatter Gather list Format */
-+/* 128 Bit entries to support 64 bit addresses in the future */
-+/* The Scatter Gather list Entry should be in the BIG-ENDIAN Format */
-+/* --------------------------------------------------------------------- */
-+/* | Upper 32 bits - Zero | Lower 32 bits- address | */
-+/* --------------------------------------------------------------------- */
-+/* | Upper 32 bits - Zero |EOL| 15 unused | 16 Bit Length| */
-+/* --------------------------------------------------------------------- */
-+/* Creates the scatter gather list, DMA Table */
-+static unsigned int
-+sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir)
-+{
-+ ide_hwif_t *hwif = HWIF(drive);
-+ unsigned int *table = hwif->dmatable_cpu;
-+ unsigned int count = 0, i = 1;
-+ struct scatterlist *sg;
-+
-+ if (HWGROUP(drive)->rq->flags & REQ_DRIVE_TASKFILE)
-+ hwif->sg_nents = i = ide_raw_build_sglist(drive, rq);
-+ else
-+ hwif->sg_nents = i = ide_build_sglist(drive, rq);
-+
-+ if (!i)
-+ return 0; /* sglist of length Zero */
-+
-+ sg = hwif->sg_table;
-+ while (i && sg_dma_len(sg)) {
-+ dma_addr_t cur_addr;
-+ int cur_len;
-+ cur_addr = sg_dma_address(sg);
-+ cur_len = sg_dma_len(sg);
-+
-+ while (cur_len) {
-+ if (count++ >= IOC4_PRD_ENTRIES) {
-+ printk(KERN_WARNING
-+ "%s: DMA table too small\n",
-+ drive->name);
-+ goto use_pio_instead;
-+ } else {
-+ u32 xcount, bcount =
-+ 0x10000 - (cur_addr & 0xffff);
-+
-+ if (bcount > cur_len)
-+ bcount = cur_len;
-+
-+ /* put the addr, length in
-+ * the IOC4 dma-table format */
-+ *table = 0x0;
-+ table++;
-+ *table = cpu_to_be32(cur_addr);
-+ table++;
-+ *table = 0x0;
-+ table++;
-+
-+ xcount = bcount & 0xffff;
-+ *table = cpu_to_be32(xcount);
-+ table++;
-+
-+ cur_addr += bcount;
-+ cur_len -= bcount;
-+ }
-+ }
-+
-+ sg++;
-+ i--;
-+ }
-+
-+ if (count) {
-+ table--;
-+ *table |= cpu_to_be32(0x80000000);
-+ return count;
-+ }
-+
-+use_pio_instead:
-+ pci_unmap_sg(hwif->pci_dev, hwif->sg_table, hwif->sg_nents,
-+ hwif->sg_dma_direction);
-+ hwif->sg_dma_active = 0;
-+
-+ return 0; /* revert to PIO for this request */
-+}
-+
-+static int
-+sgiioc4_ide_dma_read(ide_drive_t * drive)
-+{
-+ struct request *rq = HWGROUP(drive)->rq;
-+ unsigned int count = 0;
-+
-+ if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_FROMDEVICE))) {
-+ /* try PIO instead of DMA */
-+ return 1;
-+ }
-+ /* Writes FROM the IOC4 TO Main Memory */
-+ sgiioc4_configure_for_dma(IOC4_DMA_WRITE, drive);
-+
-+ return 0;
-+}
-+
-+static int
-+sgiioc4_ide_dma_write(ide_drive_t * drive)
-+{
-+ struct request *rq = HWGROUP(drive)->rq;
-+ unsigned int count = 0;
-+
-+ if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_TODEVICE))) {
-+ /* try PIO instead of DMA */
-+ return 1;
-+ }
-+
-+ sgiioc4_configure_for_dma(IOC4_DMA_READ, drive);
-+ /* Writes TO the IOC4 FROM Main Memory */
-+
-+ return 0;
-+}
-+
-+static void __init
-+ide_init_sgiioc4(ide_hwif_t * hwif)
-+{
-+ hwif->mmio = 2;
-+ hwif->autodma = 1;
-+ hwif->atapi_dma = 1;
-+ hwif->ultra_mask = 0x0; /* Disable Ultra DMA */
-+ hwif->mwdma_mask = 0x2; /* Multimode-2 DMA */
-+ hwif->swdma_mask = 0x2;
-+ hwif->identify = NULL;
-+ hwif->tuneproc = NULL; /* Sets timing for PIO mode */
-+ hwif->speedproc = NULL; /* Sets timing for DMA &/or PIO modes */
-+ hwif->selectproc = NULL;/* Use the default routine to select drive */
-+ hwif->reset_poll = NULL;/* No HBA specific reset_poll needed */
-+ hwif->pre_reset = NULL; /* No HBA specific pre_set needed */
-+ hwif->resetproc = &sgiioc4_resetproc;/* Reset DMA engine,
-+ clear interrupts */
-+ hwif->intrproc = NULL; /* Enable or Disable interrupt from drive */
-+ hwif->maskproc = &sgiioc4_maskproc; /* Mask on/off NIEN register */
-+ hwif->quirkproc = NULL;
-+ hwif->busproc = NULL;
-+
-+ hwif->ide_dma_read = &sgiioc4_ide_dma_read;
-+ hwif->ide_dma_write = &sgiioc4_ide_dma_write;
-+ hwif->ide_dma_begin = &sgiioc4_ide_dma_begin;
-+ hwif->ide_dma_end = &sgiioc4_ide_dma_end;
-+ hwif->ide_dma_check = &sgiioc4_ide_dma_check;
-+ hwif->ide_dma_on = &sgiioc4_ide_dma_on;
-+ hwif->ide_dma_off = &sgiioc4_ide_dma_off;
-+ hwif->ide_dma_off_quietly = &sgiioc4_ide_dma_off_quietly;
-+ hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq;
-+ hwif->ide_dma_host_on = &sgiioc4_ide_dma_host_on;
-+ hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off;
-+ hwif->ide_dma_bad_drive = &__ide_dma_bad_drive;
-+ hwif->ide_dma_good_drive = &__ide_dma_good_drive;
-+ hwif->ide_dma_count = &__ide_dma_count;
-+ hwif->ide_dma_verbose = &sgiioc4_ide_dma_verbose;
-+ hwif->ide_dma_retune = &__ide_dma_retune;
-+ hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq;
-+ hwif->ide_dma_timeout = &__ide_dma_timeout;
-+ hwif->INB = &sgiioc4_INB;
-+}
-+
-+static int __init
-+sgiioc4_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t * d)
-+{
-+ unsigned long base, ctl, dma_base, irqport;
-+ ide_hwif_t *hwif;
-+ int h;
-+
-+ for (h = 0; h < MAX_HWIFS; ++h) {
-+ hwif = &ide_hwifs[h];
-+ /* Find an empty HWIF */
-+ if (hwif->chipset == ide_unknown)
-+ break;
-+ }
-+
-+ /* Get the CmdBlk and CtrlBlk Base Registers */
-+ base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET;
-+ ctl = pci_resource_start(dev, 0) + IOC4_CTRL_OFFSET;
-+ irqport = pci_resource_start(dev, 0) + IOC4_INTR_OFFSET;
-+ dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET;
-+
-+ if (!request_region(base, IOC4_CMD_CTL_BLK_SIZE, hwif->name)) {
-+ printk(KERN_ERR
-+ "%s : %s -- ERROR, Port Addresses "
-+ "0x%p to 0x%p ALREADY in use\n",
-+ __FUNCTION__, hwif->name, (void *) base,
-+ (void *) base + IOC4_CMD_CTL_BLK_SIZE);
-+ return 1;
-+ }
-+
-+ if (hwif->io_ports[IDE_DATA_OFFSET] != base) {
-+ /* Initialize the IO registers */
-+ sgiioc4_init_hwif_ports(&hwif->hw, base, ctl, irqport);
-+ memcpy(hwif->io_ports, hwif->hw.io_ports,
-+ sizeof (hwif->io_ports));
-+ hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
-+ }
-+
-+ hwif->irq = dev->irq;
-+ hwif->chipset = ide_pci;
-+ hwif->pci_dev = dev;
-+ hwif->channel = 0; /* Single Channel chip */
-+ hwif->cds = (struct ide_pci_device_s *) d;
-+ hwif->gendev.parent = &dev->dev;/* setup proper ancestral information */
-+
-+ /* Initializing chipset IRQ Registers */
-+ hwif->OUTL(0x03, irqport + IOC4_INTR_SET * 4);
-+
-+ ide_init_sgiioc4(hwif);
-+
-+ if (dma_base)
-+ ide_dma_sgiioc4(hwif, dma_base);
-+ else
-+ printk(KERN_INFO "%s: %s Bus-Master DMA disabled\n",
-+ hwif->name, d->name);
-+
-+ probe_hwif_init(hwif);
-+ return 0;
-+}
-+
-+/* This ensures that we can build this for generic kernels without
-+ * having all the SN2 code sync'd and merged.
-+ */
-+typedef enum pciio_endian_e {
-+ PCIDMA_ENDIAN_BIG,
-+ PCIDMA_ENDIAN_LITTLE
-+} pciio_endian_t;
-+pciio_endian_t __attribute__ ((weak)) snia_pciio_endian_set(struct pci_dev
-+ *pci_dev, pciio_endian_t device_end,
-+ pciio_endian_t desired_end);
-+
-+static unsigned int __init
-+pci_init_sgiioc4(struct pci_dev *dev, ide_pci_device_t * d)
-+{
-+ unsigned int class_rev;
-+
-+ if (pci_enable_device(dev)) {
-+ printk(KERN_ERR
-+ "Failed to enable device %s at slot %s\n",
-+ d->name, dev->slot_name);
-+ return 1;
-+ }
-+ pci_set_master(dev);
-+
-+ pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
-+ class_rev &= 0xff;
-+ printk(KERN_INFO "%s: IDE controller at PCI slot %s, revision %d\n",
-+ d->name, dev->slot_name, class_rev);
-+ if (class_rev < IOC4_SUPPORTED_FIRMWARE_REV) {
-+ printk(KERN_ERR "Skipping %s IDE controller in slot %s: "
-+ "firmware is obsolete - please upgrade to revision"
-+ "46 or higher\n", d->name, dev->slot_name);
-+ return 1;
-+ }
-+
-+ /* Enable Byte Swapping in the PIC... */
-+ if (snia_pciio_endian_set) {
-+ snia_pciio_endian_set(dev, PCIDMA_ENDIAN_LITTLE,
-+ PCIDMA_ENDIAN_BIG);
-+ } else {
-+ printk(KERN_ERR
-+ "Failed to set endianness for device %s at slot %s\n",
-+ d->name, dev->slot_name);
-+ return 1;
-+ }
-+
-+ return sgiioc4_ide_setup_pci_device(dev, d);
-+}
-+
-+static ide_pci_device_t sgiioc4_chipsets[] __devinitdata = {
-+ {
-+ /* Channel 0 */
-+ .vendor = PCI_VENDOR_ID_SGI,
-+ .device = PCI_DEVICE_ID_SGI_IOC4,
-+ .name = "SGIIOC4",
-+ .init_hwif = ide_init_sgiioc4,
-+ .init_dma = ide_dma_sgiioc4,
-+ .channels = 1,
-+ .autodma = AUTODMA,
-+ /* SGI IOC4 doesn't have enablebits. */
-+ .bootable = ON_BOARD,
-+ }
-+};
-+
-+static int __devinit
-+sgiioc4_init_one(struct pci_dev *dev, const struct pci_device_id *id)
-+{
-+ ide_pci_device_t *d = &sgiioc4_chipsets[id->driver_data];
-+ if (dev->device != d->device) {
-+ printk(KERN_ERR "Error in %s(dev 0x%p | id 0x%p )\n",
-+ __FUNCTION__, (void *) dev, (void *) id);
-+ BUG();
-+ }
-+
-+ if (pci_init_sgiioc4(dev, d))
-+ return 0;
-+
-+ MOD_INC_USE_COUNT;
-+
-+ return 0;
-+}
-+
-+static struct pci_device_id sgiioc4_pci_tbl[] = {
-+ {PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC4, PCI_ANY_ID,
-+ PCI_ANY_ID, 0x0b4000, 0xFFFFFF, 0},
-+ {0}
-+};
-+
-+static struct pci_driver driver = {
-+ .name = "SGI-IOC4 IDE",
-+ .id_table = sgiioc4_pci_tbl,
-+ .probe = sgiioc4_init_one,
-+};
-+
-+static int
-+sgiioc4_ide_init(void)
-+{
-+ return ide_pci_register_driver(&driver);
-+}
-+
-+static void
-+sgiioc4_ide_exit(void)
-+{
-+ ide_pci_unregister_driver(&driver);
-+}
-+
-+module_init(sgiioc4_ide_init);
-+module_exit(sgiioc4_ide_exit);
-+
-+MODULE_AUTHOR("Aniket Malatpure - Silicon Graphics Inc. (SGI)");
-+MODULE_DESCRIPTION("PCI driver module for SGI IOC4 Base-IO Card");
-+MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/ide/pci/siimage.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/ide/pci/siimage.c 2003-12-28 23:26:27.000000000 -0800
-@@ -1,5 +1,5 @@
- /*
-- * linux/drivers/ide/pci/siimage.c Version 1.06 June 11, 2003
-+ * linux/drivers/ide/pci/siimage.c Version 1.09 Dec 7, 2003
- *
- * Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org>
- * Copyright (C) 2003 Red Hat <alan@redhat.com>
-@@ -56,6 +56,7 @@ static int pdev_is_sata(struct pci_dev *
- {
- case PCI_DEVICE_ID_SII_3112:
- case PCI_DEVICE_ID_SII_1210SA:
-+ case PCI_DEVICE_ID_SII_3114:
- return 1;
- case PCI_DEVICE_ID_SII_680:
- return 0;
-@@ -266,7 +267,7 @@ static byte siimage_taskfile_timing (ide
- static void siimage_tuneproc (ide_drive_t *drive, byte mode_wanted)
- {
- ide_hwif_t *hwif = HWIF(drive);
-- u32 speedt = 0;
-+ u16 speedt = 0;
- u16 speedp = 0;
- unsigned long addr = siimage_seldev(drive, 0x04);
- unsigned long tfaddr = siimage_selreg(hwif, 0x02);
-@@ -1047,6 +1048,27 @@ static void __init init_mmio_iops_siimag
- hwif->mmio = 2;
- }
-
-+static int is_dev_seagate_sata(ide_drive_t *drive)
-+{
-+ const char *s = &drive->id->model[0];
-+ unsigned len;
-+
-+ if (!drive->present)
-+ return 0;
-+
-+ len = strnlen(s, sizeof(drive->id->model));
-+
-+ if ((len > 4) && (!memcmp(s, "ST", 2))) {
-+ if ((!memcmp(s + len - 2, "AS", 2)) ||
-+ (!memcmp(s + len - 3, "ASL", 3))) {
-+ printk(KERN_INFO "%s: applying pessimistic Seagate "
-+ "errata fix\n", drive->name);
-+ return 1;
-+ }
-+ }
-+ return 0;
-+}
-+
- /**
- * init_iops_siimage - set up iops
- * @hwif: interface to set up
-@@ -1068,7 +1090,7 @@ static void __init init_iops_siimage (id
- hwif->hwif_data = 0;
-
- hwif->rqsize = 128;
-- if (is_sata(hwif))
-+ if (is_sata(hwif) && is_dev_seagate_sata(&hwif->drives[0]))
- hwif->rqsize = 15;
-
- if (pci_get_drvdata(dev) == NULL)
-@@ -1179,6 +1201,7 @@ static struct pci_device_id siimage_pci_
- { PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
- { PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
- { PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
-+ { PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
- { 0, },
- };
-
---- linux-2.6.0/drivers/ide/pci/siimage.h 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/ide/pci/siimage.h 2003-12-28 23:26:27.000000000 -0800
-@@ -82,6 +82,16 @@ static ide_pci_device_t siimage_chipsets
- .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
- .bootable = ON_BOARD,
- .extra = 0,
-+ },{ /* 3 */
-+ .vendor = PCI_VENDOR_ID_CMD,
-+ .device = PCI_DEVICE_ID_SII_3114,
-+ .name = "SiI3114 Serial ATA",
-+ .init_chipset = init_chipset_siimage,
-+ .init_iops = init_iops_siimage,
-+ .init_hwif = init_hwif_siimage,
-+ .channels = 2,
-+ .autodma = AUTODMA,
-+ .bootable = ON_BOARD,
- },{
- .vendor = 0,
- .device = 0,
---- linux-2.6.0/drivers/ide/setup-pci.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/ide/setup-pci.c 2003-12-28 23:22:14.000000000 -0800
-@@ -474,6 +474,11 @@ fixup_address:
- * state
- */
-
-+#ifndef CONFIG_BLK_DEV_IDEDMA_PCI
-+static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif)
-+{
-+}
-+#else
- static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif)
- {
- u16 pcicmd;
-@@ -516,6 +521,7 @@ static void ide_hwif_setup_dma(struct pc
- }
- }
- }
-+#endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/
-
- /**
- * ide_setup_pci_controller - set up IDE PCI
---- linux-2.6.0/drivers/ieee1394/dma.c 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/ieee1394/dma.c 2003-12-28 23:22:12.000000000 -0800
-@@ -187,7 +187,7 @@ void dma_region_sync(struct dma_region *
- /* nopage() handler for mmap access */
-
- static struct page*
--dma_region_pagefault(struct vm_area_struct *area, unsigned long address, int write_access)
-+dma_region_pagefault(struct vm_area_struct *area, unsigned long address, int *type)
- {
- unsigned long offset;
- unsigned long kernel_virt_addr;
-@@ -202,6 +202,8 @@ dma_region_pagefault(struct vm_area_stru
- (address > (unsigned long) area->vm_start + (PAGE_SIZE * dma->n_pages)) )
- goto out;
-
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- offset = address - area->vm_start;
- kernel_virt_addr = (unsigned long) dma->kvirt + offset;
- ret = vmalloc_to_page((void*) kernel_virt_addr);
---- linux-2.6.0/drivers/ieee1394/eth1394.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ieee1394/eth1394.c 2003-12-28 23:23:03.000000000 -0800
-@@ -89,7 +89,7 @@
- #define TRACE() printk(KERN_ERR "%s:%s[%d] ---- TRACE\n", driver_name, __FUNCTION__, __LINE__)
-
- static char version[] __devinitdata =
-- "$Rev: 1043 $ Ben Collins <bcollins@debian.org>";
-+ "$Rev: 1079 $ Ben Collins <bcollins@debian.org>";
-
- struct fragment_info {
- struct list_head list;
-@@ -220,7 +220,7 @@ static int ether1394_init_bc(struct net_
-
- priv->iso = hpsb_iso_recv_init(priv->host, 16 * 4096,
- 16, priv->broadcast_channel,
-- 1, ether1394_iso);
-+ HPSB_ISO_DMA_PACKET_PER_BUFFER, 1, ether1394_iso);
- if (priv->iso == NULL) {
- ETH1394_PRINT(KERN_ERR, dev->name,
- "failed to change broadcast "
-@@ -375,8 +375,8 @@ static void ether1394_reset_priv (struct
- }
- }
-
--/* This function is called by register_netdev */
--static int ether1394_init_dev (struct net_device *dev)
-+/* This function is called right before register_netdev */
-+static void ether1394_init_dev (struct net_device *dev)
- {
- /* Our functions */
- dev->open = ether1394_open;
-@@ -403,8 +403,6 @@ static int ether1394_init_dev (struct ne
- dev->type = ARPHRD_IEEE1394;
-
- ether1394_reset_priv (dev, 1);
--
-- return 0;
- }
-
- /*
-@@ -437,8 +435,6 @@ static void ether1394_add_host (struct h
-
- SET_MODULE_OWNER(dev);
-
-- dev->init = ether1394_init_dev;
--
- priv = (struct eth1394_priv *)dev->priv;
-
- spin_lock_init(&priv->lock);
-@@ -459,6 +455,8 @@ static void ether1394_add_host (struct h
- goto out;
- }
-
-+ ether1394_init_dev(dev);
-+
- if (register_netdev (dev)) {
- ETH1394_PRINT (KERN_ERR, dev->name, "Error registering network driver\n");
- goto out;
-@@ -475,7 +473,7 @@ static void ether1394_add_host (struct h
- priv->broadcast_channel = host->csr.broadcast_channel & 0x3f;
-
- priv->iso = hpsb_iso_recv_init(host, 16 * 4096, 16, priv->broadcast_channel,
-- 1, ether1394_iso);
-+ HPSB_ISO_DMA_PACKET_PER_BUFFER, 1, ether1394_iso);
- if (priv->iso == NULL) {
- priv->bc_state = ETHER1394_BC_CLOSED;
- }
-@@ -483,7 +481,7 @@ static void ether1394_add_host (struct h
-
- out:
- if (dev != NULL)
-- kfree(dev);
-+ free_netdev(dev);
- if (hi)
- hpsb_destroy_hostinfo(ð1394_highlevel, host);
-
-@@ -1258,7 +1256,7 @@ static inline struct hpsb_packet *ether1
- {
- struct hpsb_packet *p;
-
-- p = alloc_hpsb_packet(0);
-+ p = hpsb_alloc_packet(0);
- if (p) {
- p->host = host;
- p->data = NULL;
-@@ -1327,7 +1325,7 @@ static inline void ether1394_free_packet
- if (packet->tcode != TCODE_STREAM_DATA)
- hpsb_free_tlabel(packet);
- packet->data = NULL;
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- }
-
- static void ether1394_complete_cb(void *__ptask);
-@@ -1349,7 +1347,7 @@ static int ether1394_send_packet(struct
- ptask->dest_node,
- ptask->addr, ptask->skb->data,
- tx_len)) {
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- return -1;
- }
-
-@@ -1357,7 +1355,7 @@ static int ether1394_send_packet(struct
- hpsb_set_packet_complete_task(ptask->packet, ether1394_complete_cb,
- ptask);
-
-- if (!hpsb_send_packet(packet)) {
-+ if (hpsb_send_packet(packet) < 0) {
- ether1394_free_packet(packet);
- return -1;
- }
-@@ -1599,7 +1597,7 @@ static int ether1394_ethtool_ioctl(struc
- case ETHTOOL_GDRVINFO: {
- struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };
- strcpy (info.driver, driver_name);
-- strcpy (info.version, "$Rev: 1043 $");
-+ strcpy (info.version, "$Rev: 1079 $");
- /* FIXME XXX provide sane businfo */
- strcpy (info.bus_info, "ieee1394");
- if (copy_to_user (useraddr, &info, sizeof (info)))
---- linux-2.6.0/drivers/ieee1394/highlevel.c 2003-11-26 13:53:35.000000000 -0800
-+++ 25/drivers/ieee1394/highlevel.c 2003-12-28 23:23:03.000000000 -0800
-@@ -26,6 +26,7 @@
- #include "hosts.h"
- #include "ieee1394_core.h"
- #include "highlevel.h"
-+#include "nodemgr.h"
-
-
- struct hl_host_info {
-@@ -227,10 +228,17 @@ struct hpsb_host *hpsb_get_host_bykey(st
- return host;
- }
-
-+static int highlevel_for_each_host_reg(struct hpsb_host *host, void *__data)
-+{
-+ struct hpsb_highlevel *hl = __data;
-+
-+ hl->add_host(host);
-+
-+ return 0;
-+}
-
- void hpsb_register_highlevel(struct hpsb_highlevel *hl)
- {
-- struct list_head *lh;
- unsigned long flags;
-
- INIT_LIST_HEAD(&hl->addr_list);
-@@ -242,21 +250,25 @@ void hpsb_register_highlevel(struct hpsb
- list_add_tail(&hl->hl_list, &hl_drivers);
- write_unlock_irqrestore(&hl_drivers_lock, flags);
-
-- if (hl->add_host) {
-- down(&hpsb_hosts_lock);
-- list_for_each (lh, &hpsb_hosts) {
-- struct hpsb_host *host = list_entry(lh, struct hpsb_host, host_list);
-- hl->add_host(host);
-- }
-- up(&hpsb_hosts_lock);
-- }
-+ if (hl->add_host)
-+ nodemgr_for_each_host(hl, highlevel_for_each_host_reg);
-
- return;
- }
-
-+static int highlevel_for_each_host_unreg(struct hpsb_host *host, void *__data)
-+{
-+ struct hpsb_highlevel *hl = __data;
-+
-+ hl->remove_host(host);
-+ hpsb_destroy_hostinfo(hl, host);
-+
-+ return 0;
-+}
-+
- void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
- {
-- struct list_head *lh, *next;
-+ struct list_head *lh, *next;
- struct hpsb_address_serve *as;
- unsigned long flags;
-
-@@ -272,16 +284,8 @@ void hpsb_unregister_highlevel(struct hp
- list_del(&hl->hl_list);
- write_unlock_irqrestore(&hl_drivers_lock, flags);
-
-- if (hl->remove_host) {
-- down(&hpsb_hosts_lock);
-- list_for_each(lh, &hpsb_hosts) {
-- struct hpsb_host *host = list_entry(lh, struct hpsb_host, host_list);
--
-- hl->remove_host(host);
-- hpsb_destroy_hostinfo(hl, host);
-- }
-- up(&hpsb_hosts_lock);
-- }
-+ if (hl->remove_host)
-+ nodemgr_for_each_host(hl, highlevel_for_each_host_unreg);
- }
-
- int hpsb_register_addrspace(struct hpsb_highlevel *hl,
---- linux-2.6.0/drivers/ieee1394/highlevel.h 2003-08-08 22:55:11.000000000 -0700
-+++ 25/drivers/ieee1394/highlevel.h 2003-12-28 23:23:03.000000000 -0800
-@@ -92,8 +92,6 @@ struct hpsb_address_ops {
- };
-
-
--void init_hpsb_highlevel(void);
--
- void highlevel_add_host(struct hpsb_host *host);
- void highlevel_remove_host(struct hpsb_host *host);
- void highlevel_host_reset(struct hpsb_host *host);
-@@ -180,4 +178,7 @@ int hpsb_set_hostinfo(struct hpsb_highle
- /* Retrieve hpsb_host using a highlevel handle and a key */
- struct hpsb_host *hpsb_get_host_bykey(struct hpsb_highlevel *hl, unsigned long key);
-
-+/* Initialize the highlevel system */
-+void init_hpsb_highlevel(void);
-+
- #endif /* IEEE1394_HIGHLEVEL_H */
---- linux-2.6.0/drivers/ieee1394/hosts.c 2003-11-26 13:53:35.000000000 -0800
-+++ 25/drivers/ieee1394/hosts.c 2003-12-28 23:23:03.000000000 -0800
-@@ -16,14 +16,14 @@
- #include <linux/list.h>
- #include <linux/init.h>
- #include <linux/slab.h>
-+#include <linux/pci.h>
-
- #include "ieee1394_types.h"
- #include "hosts.h"
- #include "ieee1394_core.h"
- #include "highlevel.h"
-+#include "nodemgr.h"
-
--LIST_HEAD(hpsb_hosts);
--DECLARE_MUTEX(hpsb_hosts_lock);
-
- static int dummy_transmit_packet(struct hpsb_host *h, struct hpsb_packet *p)
- {
-@@ -46,54 +46,14 @@ static struct hpsb_host_driver dummy_dri
- .isoctl = dummy_isoctl
- };
-
--/**
-- * hpsb_ref_host - increase reference count for host controller.
-- * @host: the host controller
-- *
-- * Increase the reference count for the specified host controller.
-- * When holding a reference to a host, the memory allocated for the
-- * host struct will not be freed and the host is guaranteed to be in a
-- * consistent state. The driver may be unloaded or the controller may
-- * be removed (PCMCIA), but the host struct will remain valid.
-- */
--
--int hpsb_ref_host(struct hpsb_host *host)
-+static int alloc_hostnum_cb(struct hpsb_host *host, void *__data)
- {
-- struct list_head *lh;
-- int retval = 0;
--
-- down(&hpsb_hosts_lock);
-- list_for_each(lh, &hpsb_hosts) {
-- if (host == list_entry(lh, struct hpsb_host, host_list)) {
-- if (try_module_get(host->driver->owner)) {
-- atomic_inc(&host->refcount);
-- retval = 1;
-- }
-- break;
-- }
-- }
-- up(&hpsb_hosts_lock);
--
-- return retval;
--}
-+ int *hostnum = __data;
-
--/**
-- * hpsb_unref_host - decrease reference count for host controller.
-- * @host: the host controller
-- *
-- * Decrease the reference count for the specified host controller.
-- * When the reference count reaches zero, the memory allocated for the
-- * &hpsb_host will be freed.
-- */
--
--void hpsb_unref_host(struct hpsb_host *host)
--{
-- module_put(host->driver->owner);
-+ if (host->id == *hostnum)
-+ return 1;
-
-- down(&hpsb_hosts_lock);
-- if (atomic_dec_and_test(&host->refcount) && host->is_shutdown)
-- device_unregister(&host->device);
-- up(&hpsb_hosts_lock);
-+ return 0;
- }
-
- /**
-@@ -108,19 +68,16 @@ void hpsb_unref_host(struct hpsb_host *h
- * driver specific parts, enable the controller and make it available
- * to the general subsystem using hpsb_add_host().
- *
-- * The &hpsb_host is allocated with an single initial reference
-- * belonging to the driver. Once the driver is done with the struct,
-- * for example, when the driver is unloaded, it should release this
-- * reference using hpsb_unref_host().
-- *
- * Return Value: a pointer to the &hpsb_host if succesful, %NULL if
- * no memory was available.
- */
-
--struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra)
-+struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
-+ struct device *dev)
- {
- struct hpsb_host *h;
- int i;
-+ int hostnum = 0;
-
- h = kmalloc(sizeof(struct hpsb_host) + extra, SLAB_KERNEL);
- if (!h) return NULL;
-@@ -128,7 +85,6 @@ struct hpsb_host *hpsb_alloc_host(struct
-
- h->hostdata = h + 1;
- h->driver = drv;
-- atomic_set(&h->refcount, 1);
-
- INIT_LIST_HEAD(&h->pending_packets);
- spin_lock_init(&h->pending_pkt_lock);
-@@ -146,53 +102,35 @@ struct hpsb_host *hpsb_alloc_host(struct
- h->topology_map = h->csr.topology_map + 3;
- h->speed_map = (u8 *)(h->csr.speed_map + 2);
-
-- return h;
--}
--
--static int alloc_hostnum(void)
--{
-- int hostnum = 0;
--
- while (1) {
-- struct list_head *lh;
-- int found = 0;
--
-- list_for_each(lh, &hpsb_hosts) {
-- struct hpsb_host *host = list_entry(lh, struct hpsb_host, host_list);
--
-- if (host->id == hostnum) {
-- found = 1;
-- break;
-- }
-+ if (!nodemgr_for_each_host(&hostnum, alloc_hostnum_cb)) {
-+ h->id = hostnum;
-+ break;
- }
-
-- if (!found)
-- return hostnum;
--
- hostnum++;
- }
-
-- return 0;
-+ memcpy(&h->device, &nodemgr_dev_template_host, sizeof(h->device));
-+ h->device.parent = dev;
-+ snprintf(h->device.bus_id, BUS_ID_SIZE, "fw-host%d", h->id);
-+ device_register(&h->device);
-+
-+ return h;
- }
-
- void hpsb_add_host(struct hpsb_host *host)
- {
-- down(&hpsb_hosts_lock);
-- host->id = alloc_hostnum();
-- list_add_tail(&host->host_list, &hpsb_hosts);
-- up(&hpsb_hosts_lock);
--
- highlevel_add_host(host);
- host->driver->devctl(host, RESET_BUS, LONG_RESET);
- }
-
- void hpsb_remove_host(struct hpsb_host *host)
- {
-- down(&hpsb_hosts_lock);
- host->is_shutdown = 1;
- host->driver = &dummy_driver;
-- list_del(&host->host_list);
-- up(&hpsb_hosts_lock);
-
- highlevel_remove_host(host);
-+
-+ device_unregister(&host->device);
- }
---- linux-2.6.0/drivers/ieee1394/hosts.h 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/ieee1394/hosts.h 2003-12-28 23:23:03.000000000 -0800
-@@ -29,8 +29,6 @@ struct hpsb_host {
-
- atomic_t generation;
-
-- atomic_t refcount;
--
- struct list_head pending_packets;
- spinlock_t pending_pkt_lock;
- struct timer_list timeout;
-@@ -165,7 +163,7 @@ struct hpsb_host_driver {
- * packet->type == raw) and do byte-swapping as necessary or instruct
- * the hardware to do so. It can return immediately after the packet
- * was queued for sending. After sending, hpsb_sent_packet() has to be
-- * called. Return 0 for failure.
-+ * called. Return 0 on success, negative errno on failure.
- * NOTE: The function must be callable in interrupt context.
- */
- int (*transmit_packet) (struct hpsb_host *host,
-@@ -195,22 +193,8 @@ struct hpsb_host_driver {
- };
-
-
--extern struct list_head hpsb_hosts;
--extern struct semaphore hpsb_hosts_lock;
--
--
--/*
-- * In order to prevent hosts from unloading, use hpsb_ref_host(). This prevents
-- * the host from going away (e.g. makes module unloading of the driver
-- * impossible), but still can not guarantee it (e.g. PC-Card being pulled by the
-- * user). hpsb_ref_host() returns false if host could not be locked. If it is
-- * successful, host is valid as a pointer until hpsb_unref_host() (not just
-- * until after remove_host).
-- */
--int hpsb_ref_host(struct hpsb_host *host);
--void hpsb_unref_host(struct hpsb_host *host);
--
--struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra);
-+struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
-+ struct device *dev);
- void hpsb_add_host(struct hpsb_host *host);
- void hpsb_remove_host(struct hpsb_host *h);
-
---- linux-2.6.0/drivers/ieee1394/ieee1394_core.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ieee1394/ieee1394_core.c 2003-12-28 23:23:03.000000000 -0800
-@@ -109,7 +109,7 @@ void hpsb_set_packet_complete_task(struc
- }
-
- /**
-- * alloc_hpsb_packet - allocate new packet structure
-+ * hpsb_alloc_packet - allocate new packet structure
- * @data_size: size of the data block to be allocated
- *
- * This function allocates, initializes and returns a new &struct hpsb_packet.
-@@ -128,7 +128,7 @@ void hpsb_set_packet_complete_task(struc
- * Return value: A pointer to a &struct hpsb_packet or NULL on allocation
- * failure.
- */
--struct hpsb_packet *alloc_hpsb_packet(size_t data_size)
-+struct hpsb_packet *hpsb_alloc_packet(size_t data_size)
- {
- struct hpsb_packet *packet = NULL;
- void *data = NULL;
-@@ -152,25 +152,23 @@ struct hpsb_packet *alloc_hpsb_packet(si
- }
-
- INIT_LIST_HEAD(&packet->list);
-- sema_init(&packet->state_change, 0);
- packet->complete_routine = NULL;
- packet->complete_data = NULL;
- packet->state = hpsb_unused;
- packet->generation = -1;
-- packet->data_be = 1;
-
- return packet;
- }
-
-
- /**
-- * free_hpsb_packet - free packet and data associated with it
-+ * hpsb_free_packet - free packet and data associated with it
- * @packet: packet to free (is NULL safe)
- *
- * This function will free packet->data, packet->header and finally the packet
- * itself.
- */
--void free_hpsb_packet(struct hpsb_packet *packet)
-+void hpsb_free_packet(struct hpsb_packet *packet)
- {
- if (!packet) return;
-
-@@ -420,14 +418,12 @@ void hpsb_packet_sent(struct hpsb_host *
-
- if (packet->no_waiter) {
- /* must not have a tlabel allocated */
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- return;
- }
-
- if (ackcode != ACK_PENDING || !packet->expect_response) {
- packet->state = hpsb_complete;
-- up(&packet->state_change);
-- up(&packet->state_change);
- run_packet_complete(packet);
- return;
- }
-@@ -439,7 +435,6 @@ void hpsb_packet_sent(struct hpsb_host *
- list_add_tail(&packet->list, &host->pending_packets);
- spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
-
-- up(&packet->state_change);
- mod_timer(&host->timeout, jiffies + host->timeout_interval);
- }
-
-@@ -465,7 +460,7 @@ int hpsb_send_phy_config(struct hpsb_hos
- return -EINVAL;
- }
-
-- packet = alloc_hpsb_packet(0);
-+ packet = hpsb_alloc_packet(0);
- if (!packet)
- return -ENOMEM;
-
-@@ -485,16 +480,8 @@ int hpsb_send_phy_config(struct hpsb_hos
-
- packet->generation = get_hpsb_generation(host);
-
-- if (!hpsb_send_packet(packet)) {
-- retval = -EINVAL;
-- goto fail;
-- }
--
-- down(&packet->state_change);
-- down(&packet->state_change);
--
--fail:
-- free_hpsb_packet(packet);
-+ retval = hpsb_send_packet_and_wait(packet);
-+ hpsb_free_packet(packet);
-
- return retval;
- }
-@@ -504,23 +491,24 @@ fail:
- * @packet: packet to send
- *
- * The packet is sent through the host specified in the packet->host field.
-- * Before sending, the packet's transmit speed is automatically determined using
-- * the local speed map when it is an async, non-broadcast packet.
-+ * Before sending, the packet's transmit speed is automatically determined
-+ * using the local speed map when it is an async, non-broadcast packet.
- *
- * Possibilities for failure are that host is either not initialized, in bus
- * reset, the packet's generation number doesn't match the current generation
- * number or the host reports a transmit error.
- *
-- * Return value: False (0) on failure, true (1) otherwise.
-+ * Return value: 0 on success, negative errno on failure.
- */
- int hpsb_send_packet(struct hpsb_packet *packet)
- {
- struct hpsb_host *host = packet->host;
-
-- if (host->is_shutdown || host->in_bus_reset
-- || (packet->generation != get_hpsb_generation(host))) {
-- return 0;
-- }
-+ if (host->is_shutdown)
-+ return -EINVAL;
-+ if (host->in_bus_reset ||
-+ (packet->generation != get_hpsb_generation(host)))
-+ return -EAGAIN;
-
- packet->state = hpsb_queued;
-
-@@ -532,23 +520,13 @@ int hpsb_send_packet(struct hpsb_packet
- data = kmalloc(packet->header_size + packet->data_size, GFP_ATOMIC);
- if (!data) {
- HPSB_ERR("unable to allocate memory for concatenating header and data");
-- return 0;
-+ return -ENOMEM;
- }
-
- memcpy(data, packet->header, packet->header_size);
-
- if (packet->data_size)
-- {
-- if (packet->data_be) {
-- memcpy(((u8*)data)+packet->header_size, packet->data, packet->data_size);
-- } else {
-- int i;
-- quadlet_t *my_data=(quadlet_t*) ((u8*) data + packet->data_size);
-- for (i=0; i < packet->data_size/4; i++) {
-- my_data[i] = cpu_to_be32(packet->data[i]);
-- }
-- }
-- }
-+ memcpy(((u8*)data)+packet->header_size, packet->data, packet->data_size);
-
- dump_packet("send packet local:", packet->header,
- packet->header_size);
-@@ -558,7 +536,7 @@ int hpsb_send_packet(struct hpsb_packet
-
- kfree(data);
-
-- return 1;
-+ return 0;
- }
-
- if (packet->type == hpsb_async && packet->node_id != ALL_NODES) {
-@@ -584,10 +562,33 @@ int hpsb_send_packet(struct hpsb_packet
- return host->driver->transmit_packet(host, packet);
- }
-
-+/* We could just use complete() directly as the packet complete
-+ * callback, but this is more typesafe, in the sense that we get a
-+ * compiler error if the prototype for complete() changes. */
-+
-+static void complete_packet(void *data)
-+{
-+ complete((struct completion *) data);
-+}
-+
-+int hpsb_send_packet_and_wait(struct hpsb_packet *packet)
-+{
-+ struct completion done;
-+ int retval;
-+
-+ init_completion(&done);
-+ hpsb_set_packet_complete_task(packet, complete_packet, &done);
-+ retval = hpsb_send_packet(packet);
-+ if (retval == 0)
-+ wait_for_completion(&done);
-+
-+ return retval;
-+}
-+
- static void send_packet_nocare(struct hpsb_packet *packet)
- {
-- if (!hpsb_send_packet(packet)) {
-- free_hpsb_packet(packet);
-+ if (hpsb_send_packet(packet) < 0) {
-+ hpsb_free_packet(packet);
- }
- }
-
-@@ -668,7 +669,6 @@ void handle_packet_response(struct hpsb_
- }
-
- packet->state = hpsb_complete;
-- up(&packet->state_change);
- run_packet_complete(packet);
- }
-
-@@ -680,7 +680,7 @@ static struct hpsb_packet *create_reply_
-
- dsize += (dsize % 4 ? 4 - (dsize % 4) : 0);
-
-- p = alloc_hpsb_packet(dsize);
-+ p = hpsb_alloc_packet(dsize);
- if (p == NULL) {
- /* FIXME - send data_error response */
- return NULL;
-@@ -820,6 +820,8 @@ static void handle_incoming_packet(struc
- if (rcode >= 0) {
- fill_async_readblock_resp(packet, rcode, length);
- send_packet_nocare(packet);
-+ } else {
-+ hpsb_free_packet(packet);
- }
- break;
-
-@@ -874,7 +876,7 @@ static void handle_incoming_packet(struc
- if (rcode >= 0) {
- send_packet_nocare(packet);
- } else {
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- }
- break;
- }
-@@ -949,7 +951,6 @@ void abort_requests(struct hpsb_host *ho
- list_del(&packet->list);
- packet->state = hpsb_complete;
- packet->ack_code = ACKX_ABORTED;
-- up(&packet->state_change);
- run_packet_complete(packet);
- }
- }
-@@ -987,7 +988,6 @@ void abort_timedouts(unsigned long __opa
- list_del(&packet->list);
- packet->state = hpsb_complete;
- packet->ack_code = ACKX_TIMEOUT;
-- up(&packet->state_change);
- run_packet_complete(packet);
- }
- }
-@@ -1171,19 +1171,22 @@ static int ieee1394_dispatch_open(struct
-
- static int __init ieee1394_init(void)
- {
-- hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet),
-- 0, 0, NULL, NULL);
--
- devfs_mk_dir("ieee1394");
--
- if (register_chrdev(IEEE1394_MAJOR, "ieee1394", &ieee1394_chardev_ops)) {
- HPSB_ERR("unable to register character device major %d!\n", IEEE1394_MAJOR);
-- devfs_remove("ieee1394");
- return -ENODEV;
- }
-
-+ devfs_mk_dir("ieee1394");
-+
-+ hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet),
-+ 0, 0, NULL, NULL);
-+
-+ bus_register(&ieee1394_bus_type);
-+
- init_hpsb_highlevel();
- init_csr();
-+
- if (!disable_nodemgr)
- init_ieee1394_nodemgr();
- else
-@@ -1198,6 +1201,9 @@ static void __exit ieee1394_cleanup(void
- cleanup_ieee1394_nodemgr();
-
- cleanup_csr();
-+
-+ bus_unregister(&ieee1394_bus_type);
-+
- kmem_cache_destroy(hpsb_packet_cache);
-
- unregister_chrdev(IEEE1394_MAJOR, "ieee1394");
-@@ -1213,16 +1219,15 @@ module_exit(ieee1394_cleanup);
- EXPORT_SYMBOL(hpsb_alloc_host);
- EXPORT_SYMBOL(hpsb_add_host);
- EXPORT_SYMBOL(hpsb_remove_host);
--EXPORT_SYMBOL(hpsb_ref_host);
--EXPORT_SYMBOL(hpsb_unref_host);
-
- /** ieee1394_core.c **/
- EXPORT_SYMBOL(hpsb_speedto_str);
- EXPORT_SYMBOL(hpsb_set_packet_complete_task);
--EXPORT_SYMBOL(alloc_hpsb_packet);
--EXPORT_SYMBOL(free_hpsb_packet);
-+EXPORT_SYMBOL(hpsb_alloc_packet);
-+EXPORT_SYMBOL(hpsb_free_packet);
- EXPORT_SYMBOL(hpsb_send_phy_config);
- EXPORT_SYMBOL(hpsb_send_packet);
-+EXPORT_SYMBOL(hpsb_send_packet_and_wait);
- EXPORT_SYMBOL(hpsb_reset_bus);
- EXPORT_SYMBOL(hpsb_bus_reset);
- EXPORT_SYMBOL(hpsb_selfid_received);
-@@ -1282,6 +1287,7 @@ EXPORT_SYMBOL(hpsb_node_lock);
- EXPORT_SYMBOL(hpsb_register_protocol);
- EXPORT_SYMBOL(hpsb_unregister_protocol);
- EXPORT_SYMBOL(ieee1394_bus_type);
-+EXPORT_SYMBOL(nodemgr_for_each_host);
-
- /** csr.c **/
- EXPORT_SYMBOL(hpsb_update_config_rom);
---- linux-2.6.0/drivers/ieee1394/ieee1394_core.h 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ieee1394/ieee1394_core.h 2003-12-28 23:23:03.000000000 -0800
-@@ -40,11 +40,6 @@ struct hpsb_packet {
- unsigned expect_response:1;
- unsigned no_waiter:1;
-
-- /* Data big endianness flag - may vary from request to request. The
-- * header is always in machine byte order.
-- * Not really used currently. */
-- unsigned data_be:1;
--
- /* Speed to transmit with: 0 = 100Mbps, 1 = 200Mbps, 2 = 400Mbps */
- unsigned speed_code:2;
-
-@@ -64,9 +59,6 @@ struct hpsb_packet {
- struct hpsb_host *host;
- unsigned int generation;
-
-- /* Very core internal, don't care. */
-- struct semaphore state_change;
--
- /* Function (and possible data to pass to it) to call when this
- * packet is completed. */
- void (*complete_routine)(void *);
-@@ -90,8 +82,8 @@ static inline struct hpsb_packet *driver
- void abort_timedouts(unsigned long __opaque);
- void abort_requests(struct hpsb_host *host);
-
--struct hpsb_packet *alloc_hpsb_packet(size_t data_size);
--void free_hpsb_packet(struct hpsb_packet *packet);
-+struct hpsb_packet *hpsb_alloc_packet(size_t data_size);
-+void hpsb_free_packet(struct hpsb_packet *packet);
-
-
- /*
-@@ -108,15 +100,23 @@ static inline unsigned int get_hpsb_gene
- }
-
- /*
-- * Send a PHY configuration packet.
-+ * Send a PHY configuration packet, return 0 on success, negative
-+ * errno on failure.
- */
- int hpsb_send_phy_config(struct hpsb_host *host, int rootid, int gapcnt);
-
- /*
-- * Queue packet for transmitting, return 0 for failure.
-+ * Queue packet for transmitting, return 0 on success, negative errno
-+ * on failure.
- */
- int hpsb_send_packet(struct hpsb_packet *packet);
-
-+/*
-+ * Queue packet for transmitting, and block until the transaction
-+ * completes. Return 0 on success, negative errno on failure.
-+ */
-+int hpsb_send_packet_and_wait(struct hpsb_packet *packet);
-+
- /* Initiate bus reset on the given host. Returns 1 if bus reset already in
- * progress, 0 otherwise. */
- int hpsb_reset_bus(struct hpsb_host *host, int type);
---- linux-2.6.0/drivers/ieee1394/ieee1394_transactions.c 2003-11-26 13:53:35.000000000 -0800
-+++ 25/drivers/ieee1394/ieee1394_transactions.c 2003-12-28 23:23:03.000000000 -0800
-@@ -263,7 +263,7 @@ struct hpsb_packet *hpsb_make_readpacket
- if (length == 0)
- return NULL;
-
-- packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
-+ packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0));
- if (!packet)
- return NULL;
-
-@@ -271,7 +271,7 @@ struct hpsb_packet *hpsb_make_readpacket
- packet->node_id = node;
-
- if (hpsb_get_tlabel(packet)) {
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- return NULL;
- }
-
-@@ -291,7 +291,7 @@ struct hpsb_packet *hpsb_make_writepacke
- if (length == 0)
- return NULL;
-
-- packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
-+ packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0));
- if (!packet)
- return NULL;
-
-@@ -302,7 +302,7 @@ struct hpsb_packet *hpsb_make_writepacke
- packet->node_id = node;
-
- if (hpsb_get_tlabel(packet)) {
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- return NULL;
- }
-
-@@ -325,7 +325,7 @@ struct hpsb_packet *hpsb_make_streampack
- if (length == 0)
- return NULL;
-
-- packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
-+ packet = hpsb_alloc_packet(length + (length % 4 ? 4 - (length % 4) : 0));
- if (!packet)
- return NULL;
-
-@@ -335,7 +335,7 @@ struct hpsb_packet *hpsb_make_streampack
- packet->host = host;
-
- if (hpsb_get_tlabel(packet)) {
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- return NULL;
- }
-
-@@ -353,13 +353,13 @@ struct hpsb_packet *hpsb_make_lockpacket
- struct hpsb_packet *p;
- u32 length;
-
-- p = alloc_hpsb_packet(8);
-+ p = hpsb_alloc_packet(8);
- if (!p) return NULL;
-
- p->host = host;
- p->node_id = node;
- if (hpsb_get_tlabel(p)) {
-- free_hpsb_packet(p);
-+ hpsb_free_packet(p);
- return NULL;
- }
-
-@@ -390,13 +390,13 @@ struct hpsb_packet *hpsb_make_lock64pack
- struct hpsb_packet *p;
- u32 length;
-
-- p = alloc_hpsb_packet(16);
-+ p = hpsb_alloc_packet(16);
- if (!p) return NULL;
-
- p->host = host;
- p->node_id = node;
- if (hpsb_get_tlabel(p)) {
-- free_hpsb_packet(p);
-+ hpsb_free_packet(p);
- return NULL;
- }
-
-@@ -429,7 +429,7 @@ struct hpsb_packet *hpsb_make_phypacket(
- {
- struct hpsb_packet *p;
-
-- p = alloc_hpsb_packet(0);
-+ p = hpsb_alloc_packet(0);
- if (!p) return NULL;
-
- p->host = host;
-@@ -444,7 +444,7 @@ struct hpsb_packet *hpsb_make_isopacket(
- {
- struct hpsb_packet *p;
-
-- p = alloc_hpsb_packet(length);
-+ p = hpsb_alloc_packet(length);
- if (!p) return NULL;
-
- p->host = host;
-@@ -478,13 +478,10 @@ int hpsb_read(struct hpsb_host *host, no
- }
-
- packet->generation = generation;
-- if (!hpsb_send_packet(packet)) {
-- retval = -EINVAL;
-+ retval = hpsb_send_packet_and_wait(packet);
-+ if (retval < 0)
- goto hpsb_read_fail;
-- }
-
-- down(&packet->state_change);
-- down(&packet->state_change);
- retval = hpsb_packet_success(packet);
-
- if (retval == 0) {
-@@ -497,7 +494,7 @@ int hpsb_read(struct hpsb_host *host, no
-
- hpsb_read_fail:
- hpsb_free_tlabel(packet);
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
-
- return retval;
- }
-@@ -520,18 +517,15 @@ int hpsb_write(struct hpsb_host *host, n
- return -ENOMEM;
-
- packet->generation = generation;
-- if (!hpsb_send_packet(packet)) {
-- retval = -EINVAL;
-+ retval = hpsb_send_packet_and_wait(packet);
-+ if (retval < 0)
- goto hpsb_write_fail;
-- }
-
-- down(&packet->state_change);
-- down(&packet->state_change);
- retval = hpsb_packet_success(packet);
-
- hpsb_write_fail:
- hpsb_free_tlabel(packet);
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
-
- return retval;
- }
-@@ -550,12 +544,10 @@ int hpsb_lock(struct hpsb_host *host, no
- return -ENOMEM;
-
- packet->generation = generation;
-- if (!hpsb_send_packet(packet)) {
-- retval = -EINVAL;
-+ retval = hpsb_send_packet_and_wait(packet);
-+ if (retval < 0)
- goto hpsb_lock_fail;
-- }
-- down(&packet->state_change);
-- down(&packet->state_change);
-+
- retval = hpsb_packet_success(packet);
-
- if (retval == 0) {
-@@ -564,7 +556,7 @@ int hpsb_lock(struct hpsb_host *host, no
-
- hpsb_lock_fail:
- hpsb_free_tlabel(packet);
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
-
- return retval;
- }
-@@ -582,12 +574,10 @@ int hpsb_lock64(struct hpsb_host *host,
- return -ENOMEM;
-
- packet->generation = generation;
-- if (!hpsb_send_packet(packet)) {
-- retval = -EINVAL;
-+ retval = hpsb_send_packet_and_wait(packet);
-+ if (retval < 0)
- goto hpsb_lock64_fail;
-- }
-- down(&packet->state_change);
-- down(&packet->state_change);
-+
- retval = hpsb_packet_success(packet);
-
- if (retval == 0)
-@@ -595,7 +585,7 @@ int hpsb_lock64(struct hpsb_host *host,
-
- hpsb_lock64_fail:
- hpsb_free_tlabel(packet);
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
-
- return retval;
- }
-@@ -626,10 +616,9 @@ int hpsb_send_gasp(struct hpsb_host *hos
-
- packet->no_waiter = 1;
-
-- if (!hpsb_send_packet(packet)) {
-- free_hpsb_packet(packet);
-- retval = -EINVAL;
-- }
-+ retval = hpsb_send_packet(packet);
-+ if (retval < 0)
-+ hpsb_free_packet(packet);
-
- return retval;
- }
---- linux-2.6.0/drivers/ieee1394/iso.c 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/ieee1394/iso.c 2003-12-28 23:23:03.000000000 -0800
-@@ -40,6 +40,7 @@ static struct hpsb_iso* hpsb_iso_common_
- unsigned int data_buf_size,
- unsigned int buf_packets,
- int channel,
-+ int dma_mode,
- int irq_interval,
- void (*callback)(struct hpsb_iso*))
- {
-@@ -58,8 +59,13 @@ static struct hpsb_iso* hpsb_iso_common_
- if (buf_packets < 2)
- buf_packets = 2;
-
-- if (irq_interval < 1 || irq_interval > buf_packets / 2)
-- irq_interval = buf_packets / 2;
-+ if ((dma_mode < HPSB_ISO_DMA_DEFAULT) || (dma_mode > HPSB_ISO_DMA_PACKET_PER_BUFFER))
-+ dma_mode=HPSB_ISO_DMA_DEFAULT;
-+
-+ if (irq_interval == 0) /* really interrupt for each packet*/
-+ irq_interval = 1;
-+ else if ((irq_interval < 0) || (irq_interval > buf_packets / 4))
-+ irq_interval = buf_packets / 4;
-
- if (channel < -1 || channel >= 64)
- return NULL;
-@@ -83,6 +89,7 @@ static struct hpsb_iso* hpsb_iso_common_
- init_waitqueue_head(&iso->waitq);
- iso->channel = channel;
- iso->irq_interval = irq_interval;
-+ iso->dma_mode = dma_mode;
- dma_region_init(&iso->data_buf);
- iso->buf_size = round_up_to_page(data_buf_size);
- iso->buf_packets = buf_packets;
-@@ -136,7 +143,7 @@ struct hpsb_iso* hpsb_iso_xmit_init(stru
- {
- struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_XMIT,
- data_buf_size, buf_packets,
-- channel, irq_interval, callback);
-+ channel, HPSB_ISO_DMA_DEFAULT, irq_interval, callback);
- if (!iso)
- return NULL;
-
-@@ -158,12 +165,13 @@ struct hpsb_iso* hpsb_iso_recv_init(stru
- unsigned int data_buf_size,
- unsigned int buf_packets,
- int channel,
-+ int dma_mode,
- int irq_interval,
- void (*callback)(struct hpsb_iso*))
- {
- struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_RECV,
- data_buf_size, buf_packets,
-- channel, irq_interval, callback);
-+ channel, dma_mode, irq_interval, callback);
- if (!iso)
- return NULL;
-
---- linux-2.6.0/drivers/ieee1394/iso.h 2003-07-27 12:14:38.000000000 -0700
-+++ 25/drivers/ieee1394/iso.h 2003-12-28 23:23:03.000000000 -0800
-@@ -51,6 +51,14 @@ struct hpsb_iso_packet_info {
-
- enum hpsb_iso_type { HPSB_ISO_RECV = 0, HPSB_ISO_XMIT = 1 };
-
-+/* The mode of the dma when receiving iso data. Must be supported by chip */
-+enum raw1394_iso_dma_recv_mode {
-+ HPSB_ISO_DMA_DEFAULT = -1,
-+ HPSB_ISO_DMA_OLD_ABI = 0,
-+ HPSB_ISO_DMA_BUFFERFILL = 1,
-+ HPSB_ISO_DMA_PACKET_PER_BUFFER = 2
-+};
-+
- struct hpsb_iso {
- enum hpsb_iso_type type;
-
-@@ -68,6 +76,8 @@ struct hpsb_iso {
-
- int speed; /* IEEE1394_SPEED_100, 200, or 400 */
- int channel; /* -1 if multichannel */
-+ int dma_mode; /* dma receive mode */
-+
-
- /* greatest # of packets between interrupts - controls
- the maximum latency of the buffer */
-@@ -139,6 +149,7 @@ struct hpsb_iso* hpsb_iso_recv_init(stru
- unsigned int data_buf_size,
- unsigned int buf_packets,
- int channel,
-+ int dma_mode,
- int irq_interval,
- void (*callback)(struct hpsb_iso*));
-
---- linux-2.6.0/drivers/ieee1394/Kconfig 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/ieee1394/Kconfig 2003-12-28 23:23:03.000000000 -0800
-@@ -1,7 +1,7 @@
- # -*- shell-script -*-
-
- menu "IEEE 1394 (FireWire) support (EXPERIMENTAL)"
-- depends on PCI && EXPERIMENTAL
-+ depends on EXPERIMENTAL
-
- config IEEE1394
- tristate "IEEE 1394 (FireWire) support (EXPERIMENTAL)"
-@@ -15,7 +15,7 @@ config IEEE1394
- is the core support only, you will also need to select a driver for
- your IEEE 1394 adapter.
-
-- To compile this driver as a module, choose M here: the
-+ To compile this driver as a module, say M here: the
- module will be called ieee1394.
-
- comment "Subsystem Options"
-@@ -56,13 +56,13 @@ comment "Texas Instruments PCILynx requi
-
- config IEEE1394_PCILYNX
- tristate "Texas Instruments PCILynx support"
-- depends on IEEE1394 && I2C_ALGOBIT
-+ depends on PCI && IEEE1394 && I2C_ALGOBIT
- help
- Say Y here if you have an IEEE-1394 controller with the Texas
- Instruments PCILynx chip. Note: this driver is written for revision
- 2 of this chip and may not work with revision 0.
-
-- To compile this driver as a module, choose M here: the
-+ To compile this driver as a module, say M here: the
- module will be called pcilynx.
-
- # Non-maintained pcilynx options
-@@ -72,7 +72,7 @@ config IEEE1394_PCILYNX
- # fi
- config IEEE1394_OHCI1394
- tristate "OHCI-1394 support"
-- depends on IEEE1394
-+ depends on PCI && IEEE1394
- help
- Enable this driver if you have an IEEE 1394 controller based on the
- OHCI-1394 specification. The current driver is only tested with OHCI
-@@ -80,7 +80,7 @@ config IEEE1394_OHCI1394
- use one of these chipsets. It should work with any OHCI-1394
- compliant card, however.
-
-- To compile this driver as a module, choose M here: the
-+ To compile this driver as a module, say M here: the
- module will be called ohci1394.
-
- comment "Protocol Drivers"
-@@ -122,7 +122,7 @@ config IEEE1394_DV1394
-
- The user-space API for dv1394 is documented in dv1394.h.
-
-- To compile this driver as a module, choose M here: the
-+ To compile this driver as a module, say M here: the
- module will be called dv1394.
-
- config IEEE1394_RAWIO
-@@ -134,7 +134,7 @@ config IEEE1394_RAWIO
- direct communication of user programs with the IEEE 1394 bus and
- thus with the attached peripherals.
-
-- To compile this driver as a module, choose M here: the
-+ To compile this driver as a module, say M here: the
- module will be called raw1394.
-
- config IEEE1394_CMP
-@@ -144,7 +144,7 @@ config IEEE1394_CMP
- This option enables the Connection Management Procedures
- (IEC61883-1) driver, which implements input and output plugs.
-
-- To compile this driver as a module, choose M here: the
-+ To compile this driver as a module, say M here: the
- module will be called cmp.
-
- config IEEE1394_AMDTP
-@@ -157,7 +157,7 @@ config IEEE1394_AMDTP
-
- The userspace interface is documented in amdtp.h.
-
-- To compile this driver as a module, choose M here: the
-+ To compile this driver as a module, say M here: the
- module will be called amdtp.
-
- endmenu
---- linux-2.6.0/drivers/ieee1394/nodemgr.c 2003-11-26 13:53:35.000000000 -0800
-+++ 25/drivers/ieee1394/nodemgr.c 2003-12-28 23:23:03.000000000 -0800
-@@ -516,8 +516,7 @@ static struct device nodemgr_dev_templat
- .driver_data = &nodemgr_driverdata_ne,
- };
-
--
--static struct device nodemgr_dev_template_host = {
-+struct device nodemgr_dev_template_host = {
- .bus = &ieee1394_bus_type,
- .release = nodemgr_release_host,
- .driver = &nodemgr_driver_host,
-@@ -1255,36 +1254,6 @@ void hpsb_unregister_protocol(struct hps
- }
-
-
--/* Searches the list of ud's that match a ne as the parent. If the ud has
-- * a driver associated with it, we call that driver's update function
-- * with the ud as the argument. */
--static int nodemgr_driver_search_cb(struct device *dev, void *__data)
--{
-- struct node_entry *ne = __data;
-- struct unit_directory *ud;
--
-- if (dev->driver_data == &nodemgr_driverdata_ne ||
-- dev->driver_data == &nodemgr_driverdata_host)
-- return 0;
--
-- ud = container_of(dev, struct unit_directory, device);
--
-- if (&ne->device != ud->device.parent)
-- return 0;
--
-- if (ud->device.driver) {
-- struct hpsb_protocol_driver *pdrv;
--
-- pdrv = container_of(ud->device.driver,
-- struct hpsb_protocol_driver, driver);
--
-- if (pdrv->update)
-- pdrv->update(ud);
-- }
--
-- return 0;
--}
--
- /*
- * This function updates nodes that were present on the bus before the
- * reset and still are after the reset. The nodeid and the config rom
-@@ -1480,9 +1449,24 @@ static int nodemgr_probe_ne_cb(struct de
- ne->needs_probe = 0;
- return 1;
- } else {
-+ struct list_head *lh;
-+
- /* Update unit_dirs with attached drivers */
-- bus_for_each_dev(&ieee1394_bus_type, NULL, ne,
-- nodemgr_driver_search_cb);
-+ list_for_each(lh, &dev->children) {
-+ struct unit_directory *ud;
-+
-+ ud = container_of(list_to_dev(lh), struct unit_directory, device);
-+
-+ if (ud->device.driver) {
-+ struct hpsb_protocol_driver *pdrv;
-+
-+ pdrv = container_of(ud->device.driver,
-+ struct hpsb_protocol_driver, driver);
-+
-+ if (pdrv->update)
-+ pdrv->update(ud);
-+ }
-+ }
- }
- return 0;
- }
-@@ -1664,7 +1648,6 @@ static int nodemgr_host_thread(void *__h
- allow_signal(SIGTERM);
-
- /* Setup our device-model entries */
-- device_register(&host->device);
- nodemgr_create_host_dev_files(host);
-
- /* Sit and wait for a signal to probe the nodes on the bus. This
-@@ -1753,6 +1736,34 @@ struct node_entry *hpsb_nodeid_get_entry
- return ne;
- }
-
-+struct for_each_host_struct {
-+ int (*cb)(struct hpsb_host *, void *);
-+ void *data;
-+};
-+
-+static int nodemgr_for_each_host_cb(struct device *dev, void *__data)
-+{
-+ struct for_each_host_struct *host_data = __data;
-+ struct hpsb_host *host;
-+
-+ if (dev->driver_data != &nodemgr_driverdata_host)
-+ return 0;
-+
-+ host = container_of(dev, struct hpsb_host, device);
-+
-+ return host_data->cb(host, host_data->data);
-+}
-+
-+int nodemgr_for_each_host(void *__data, int (*cb)(struct hpsb_host *, void *))
-+{
-+ struct for_each_host_struct host_data;
-+
-+ host_data.cb = cb;
-+ host_data.data = __data;
-+
-+ return bus_for_each_dev(&ieee1394_bus_type, NULL, &host_data, nodemgr_for_each_host_cb);
-+}
-+
- /* The following four convenience functions use a struct node_entry
- * for addressing a node on the bus. They are intended for use by any
- * process context, not just the nodemgr thread, so we need to be a
-@@ -1821,11 +1832,6 @@ static void nodemgr_add_host(struct hpsb
- init_completion(&hi->exited);
- sema_init(&hi->reset_sem, 0);
-
-- memcpy(&host->device, &nodemgr_dev_template_host,
-- sizeof(host->device));
-- host->device.parent = &host->pdev->dev;
-- snprintf(host->device.bus_id, BUS_ID_SIZE, "fw-host%d", host->id);
--
- sprintf(hi->daemon_name, "knodemgrd_%d", host->id);
-
- hi->pid = kernel_thread(nodemgr_host_thread, hi, CLONE_KERNEL);
-@@ -1879,7 +1885,6 @@ static struct hpsb_highlevel nodemgr_hig
-
- void init_ieee1394_nodemgr(void)
- {
-- bus_register(&ieee1394_bus_type);
- driver_register(&nodemgr_driver_host);
- driver_register(&nodemgr_driver_ne);
-
-@@ -1892,5 +1897,4 @@ void cleanup_ieee1394_nodemgr(void)
-
- driver_unregister(&nodemgr_driver_ne);
- driver_unregister(&nodemgr_driver_host);
-- bus_unregister(&ieee1394_bus_type);
- }
---- linux-2.6.0/drivers/ieee1394/nodemgr.h 2003-11-26 13:53:35.000000000 -0800
-+++ 25/drivers/ieee1394/nodemgr.h 2003-12-28 23:23:03.000000000 -0800
-@@ -219,7 +219,16 @@ int hpsb_node_lock(struct node_entry *ne
- int extcode, quadlet_t *data, quadlet_t arg);
-
-
-+/* Iterate the hosts, calling a given function with supplied data for each
-+ * host. */
-+int nodemgr_for_each_host(void *__data, int (*cb)(struct hpsb_host *, void *));
-+
-+
- void init_ieee1394_nodemgr(void);
- void cleanup_ieee1394_nodemgr(void);
-
-+
-+/* The template for a host device */
-+extern struct device nodemgr_dev_template_host;
-+
- #endif /* _IEEE1394_NODEMGR_H */
---- linux-2.6.0/drivers/ieee1394/ohci1394.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ieee1394/ohci1394.c 2003-12-28 23:23:03.000000000 -0800
-@@ -134,7 +134,7 @@
-
- #ifdef OHCI1394_DEBUG
- #define DBGMSG(card, fmt, args...) \
--printk(KERN_INFO "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
-+printk(KERN_INFO "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
- #else
- #define DBGMSG(card, fmt, args...)
- #endif
-@@ -158,10 +158,10 @@ printk(level "%s: " fmt "\n" , OHCI1394_
-
- /* print card specific information */
- #define PRINT(level, card, fmt, args...) \
--printk(level "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
-+printk(level "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
-
- static char version[] __devinitdata =
-- "$Rev: 1045 $ Ben Collins <bcollins@debian.org>";
-+ "$Rev: 1087 $ Ben Collins <bcollins@debian.org>";
-
- /* Module Parameters */
- static int phys_dma = 1;
-@@ -845,7 +845,7 @@ static int ohci_transmit(struct hpsb_hos
- PRINT(KERN_ERR, ohci->id,
- "Transmit packet size %Zd is too big",
- packet->data_size);
-- return 0;
-+ return -EOVERFLOW;
- }
-
- /* Decide whether we have an iso, a request, or a response packet */
-@@ -862,7 +862,7 @@ static int ohci_transmit(struct hpsb_hos
- if (in_interrupt()) {
- PRINT(KERN_ERR, ohci->id,
- "legacy IT context cannot be initialized during interrupt");
-- return 0;
-+ return -EINVAL;
- }
-
- if (alloc_dma_trm_ctx(ohci, &ohci->it_legacy_context,
-@@ -870,7 +870,7 @@ static int ohci_transmit(struct hpsb_hos
- OHCI1394_IsoXmitContextBase) < 0) {
- PRINT(KERN_ERR, ohci->id,
- "error initializing legacy IT context");
-- return 0;
-+ return -ENOMEM;
- }
-
- initialize_dma_trm_ctx(&ohci->it_legacy_context);
-@@ -890,7 +890,7 @@ static int ohci_transmit(struct hpsb_hos
-
- spin_unlock_irqrestore(&d->lock,flags);
-
-- return 1;
-+ return 0;
- }
-
- static int ohci_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg)
-@@ -1113,8 +1113,8 @@ struct ohci_iso_recv {
- struct ohci1394_iso_tasklet task;
- int task_active;
-
-- enum { BUFFER_FILL_MODE,
-- PACKET_PER_BUFFER_MODE } dma_mode;
-+ enum { BUFFER_FILL_MODE = 0,
-+ PACKET_PER_BUFFER_MODE = 1 } dma_mode;
-
- /* memory and PCI mapping for the DMA descriptors */
- struct dma_prog_region prog;
-@@ -1175,7 +1175,8 @@ static int ohci_iso_recv_init(struct hps
- /* use buffer-fill mode, unless irq_interval is 1
- (note: multichannel requires buffer-fill) */
-
-- if (iso->irq_interval == 1 && iso->channel != -1) {
-+ if (((iso->irq_interval == 1 && iso->dma_mode == HPSB_ISO_DMA_OLD_ABI) ||
-+ iso->dma_mode == HPSB_ISO_DMA_PACKET_PER_BUFFER) && iso->channel != -1) {
- recv->dma_mode = PACKET_PER_BUFFER_MODE;
- } else {
- recv->dma_mode = BUFFER_FILL_MODE;
-@@ -1194,8 +1195,11 @@ static int ohci_iso_recv_init(struct hps
- }
-
- /* iso->irq_interval is in packets - translate that to blocks */
-- /* (err, sort of... 1 is always the safest value) */
-- recv->block_irq_interval = iso->irq_interval / recv->nblocks;
-+ if (iso->irq_interval == 1)
-+ recv->block_irq_interval = 1;
-+ else
-+ recv->block_irq_interval = iso->irq_interval *
-+ ((recv->nblocks+1)/iso->buf_packets);
- if (recv->block_irq_interval*4 > recv->nblocks)
- recv->block_irq_interval = recv->nblocks/4;
- if (recv->block_irq_interval < 1)
-@@ -1205,6 +1209,10 @@ static int ohci_iso_recv_init(struct hps
- int max_packet_size;
-
- recv->nblocks = iso->buf_packets;
-+ recv->block_irq_interval = iso->irq_interval;
-+ if (recv->block_irq_interval * 4 > iso->buf_packets)
-+ recv->block_irq_interval = iso->buf_packets / 4;
-+ if (recv->block_irq_interval < 1)
- recv->block_irq_interval = 1;
-
- /* choose a buffer stride */
-@@ -3271,7 +3279,6 @@ do { \
- static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
- const struct pci_device_id *ent)
- {
-- static unsigned int card_id_counter = 0;
- static int version_printed = 0;
-
- struct hpsb_host *host;
-@@ -3282,15 +3289,14 @@ static int __devinit ohci1394_pci_probe(
- PRINT_G(KERN_INFO, "%s", version);
-
- if (pci_enable_device(dev))
-- FAIL(-ENXIO, "Failed to enable OHCI hardware %d",
-- card_id_counter++);
-+ FAIL(-ENXIO, "Failed to enable OHCI hardware");
- pci_set_master(dev);
-
-- host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci));
-+ host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci), &dev->dev);
- if (!host) FAIL(-ENOMEM, "Failed to allocate host structure");
-
- ohci = host->hostdata;
-- ohci->id = card_id_counter++;
-+ ohci->id = host->id;
- ohci->dev = dev;
- ohci->host = host;
- ohci->init_state = OHCI_INIT_ALLOC_HOST;
-@@ -3462,11 +3468,14 @@ static int __devinit ohci1394_pci_probe(
- static void ohci1394_pci_remove(struct pci_dev *pdev)
- {
- struct ti_ohci *ohci;
-+ struct device *dev;
-
- ohci = pci_get_drvdata(pdev);
- if (!ohci)
- return;
-
-+ dev = get_device(&ohci->host->device);
-+
- switch (ohci->init_state) {
- case OHCI_INIT_DONE:
- hpsb_remove_host(ohci->host);
-@@ -3489,7 +3498,7 @@ static void ohci1394_pci_remove(struct p
-
- /* Disable IRM Contender */
- set_phy_reg(ohci, 4, ~0xc0 & get_phy_reg(ohci, 4));
--
-+
- /* Clear link control register */
- reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff);
-
-@@ -3521,7 +3530,7 @@ static void ohci1394_pci_remove(struct p
- ohci->selfid_buf_cpu,
- ohci->selfid_buf_bus);
- OHCI_DMA_FREE("consistent selfid_buf");
--
-+
- case OHCI_INIT_HAVE_CONFIG_ROM_BUFFER:
- pci_free_consistent(ohci->dev, OHCI_CONFIG_ROM_LEN,
- ohci->csr_config_rom_cpu,
-@@ -3555,8 +3564,10 @@ static void ohci1394_pci_remove(struct p
-
- case OHCI_INIT_ALLOC_HOST:
- pci_set_drvdata(ohci->dev, NULL);
-- hpsb_unref_host(ohci->host);
- }
-+
-+ if (dev)
-+ put_device(dev);
- }
-
-
---- linux-2.6.0/drivers/ieee1394/oui.db 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/ieee1394/oui.db 2003-12-28 23:23:03.000000000 -0800
-@@ -1612,7 +1612,7 @@
- 000658 Helmut Fischer GmbH & Co. KG
- 000659 EAL (Apeldoorn) B.V.
- 00065A Strix Systems
--00065B Dell Inc.
-+00065B Dell Computer Corp.
- 00065C Malachite Technologies, Inc.
- 00065D Heidelberg Web Systems
- 00065E Photuris, Inc.
-@@ -3965,7 +3965,7 @@
- 00B0C2 Cisco Systems, Inc.
- 00B0C7 Tellabs Operations, Inc.
- 00B0CE TECHNOLOGY RESCUE
--00B0D0 Dell Inc.
-+00B0D0 Dell Computer Corp.
- 00B0DB Nextcell, Inc.
- 00B0DF Reliable Data Technology, Inc.
- 00B0E7 British Federal Ltd.
-@@ -4054,7 +4054,7 @@
- 00C04C DEPARTMENT OF FOREIGN AFFAIRS
- 00C04D MITEC, INC.
- 00C04E COMTROL CORPORATION
--00C04F Dell Inc.
-+00C04F DELL COMPUTER CORPORATION
- 00C050 TOYO DENKI SEIZO K.K.
- 00C051 ADVANCED INTEGRATION RESEARCH
- 00C052 BURR-BROWN
---- linux-2.6.0/drivers/ieee1394/pcilynx.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ieee1394/pcilynx.c 2003-12-28 23:23:03.000000000 -0800
-@@ -521,10 +521,6 @@ static void send_next(struct ti_lynx *ly
- break;
- }
-
-- if (!packet->data_be) {
-- pcl.buffer[1].control |= PCL_BIGENDIAN;
-- }
--
- put_pcl(lynx, d->pcl, &pcl);
- run_pcl(lynx, d->pcl_start, d->channel);
- }
-@@ -540,7 +536,7 @@ static int lynx_transmit(struct hpsb_hos
- if (packet->data_size >= 4096) {
- PRINT(KERN_ERR, lynx->id, "transmit packet data too big (%Zd)",
- packet->data_size);
-- return 0;
-+ return -EOVERFLOW;
- }
-
- switch (packet->type) {
-@@ -554,7 +550,7 @@ static int lynx_transmit(struct hpsb_hos
- default:
- PRINT(KERN_ERR, lynx->id, "invalid packet type %d",
- packet->type);
-- return 0;
-+ return -EINVAL;
- }
-
- if (packet->tcode == TCODE_WRITEQ
-@@ -570,7 +566,7 @@ static int lynx_transmit(struct hpsb_hos
-
- spin_unlock_irqrestore(&d->queue_lock, flags);
-
-- return 1;
-+ return 0;
- }
-
-
-@@ -1120,7 +1116,7 @@ static ssize_t mem_read(struct file *fil
- retval = copy_to_user(buffer, md->lynx->mem_dma_buffer, count);
- up(&md->lynx->mem_dma_mutex);
-
-- if (retval < 0) return retval;
-+ if (retval) return -EFAULT;
- *offset += count;
- return count;
- }
-@@ -1141,14 +1137,17 @@ static ssize_t mem_write(struct file *fi
- /* FIXME: dereferencing pointers to PCI mem doesn't work everywhere */
- switch (md->type) {
- case aux:
-- copy_from_user(md->lynx->aux_port+(*offset), buffer, count);
-+ if (copy_from_user(md->lynx->aux_port+(*offset), buffer, count))
-+ return -EFAULT;
- break;
- case ram:
-- copy_from_user(md->lynx->local_ram+(*offset), buffer, count);
-+ if (copy_from_user(md->lynx->local_ram+(*offset), buffer, count))
-+ return -EFAULT;
- break;
- case rom:
- /* the ROM may be writeable */
-- copy_from_user(md->lynx->local_rom+(*offset), buffer, count);
-+ if (copy_from_user(md->lynx->local_rom+(*offset), buffer, count))
-+ return -EFAULT;
- break;
- }
-
-@@ -1443,12 +1442,15 @@ static void iso_rcv_bh(struct ti_lynx *l
- static void remove_card(struct pci_dev *dev)
- {
- struct ti_lynx *lynx;
-+ struct device *lynx_dev;
- int i;
-
- lynx = pci_get_drvdata(dev);
- if (!lynx) return;
- pci_set_drvdata(dev, NULL);
-
-+ lynx_dev = get_device(&lynx->host->device);
-+
- switch (lynx->state) {
- case is_host:
- reg_write(lynx, PCI_INT_ENABLE, 0);
-@@ -1498,7 +1500,9 @@ static void remove_card(struct pci_dev *
- }
-
- tasklet_kill(&lynx->iso_rcv.tq);
-- hpsb_unref_host(lynx->host);
-+
-+ if (lynx_dev)
-+ put_device(lynx_dev);
- }
-
-
-@@ -1535,7 +1539,7 @@ static int __devinit add_card(struct pci
-
- error = -ENOMEM;
-
-- host = hpsb_alloc_host(&lynx_driver, sizeof(struct ti_lynx));
-+ host = hpsb_alloc_host(&lynx_driver, sizeof(struct ti_lynx), &dev->dev);
- if (!host) FAIL("failed to allocate control structure memory");
-
- lynx = host->hostdata;
---- linux-2.6.0/drivers/ieee1394/raw1394.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ieee1394/raw1394.c 2003-12-28 23:23:03.000000000 -0800
-@@ -128,7 +128,7 @@ static void free_pending_request(struct
- } else if (req->free_data) {
- kfree(req->data);
- }
-- free_hpsb_packet(req->packet);
-+ hpsb_free_packet(req->packet);
- kfree(req);
- }
-
-@@ -558,7 +558,7 @@ static int state_initialized(struct file
- lh = lh->next;
- }
- hi = list_entry(lh, struct host_info, list);
-- hpsb_ref_host(hi->host); // XXX Need to handle failure case
-+ get_device(&hi->host->device); // XXX Need to handle failure case
- list_add_tail(&fi->list, &hi->file_info_list);
- fi->host = hi->host;
- fi->state = connected;
-@@ -782,7 +782,7 @@ static int handle_async_request(struct f
-
- packet->generation = req->req.generation;
-
-- if (!hpsb_send_packet(packet)) {
-+ if (hpsb_send_packet(packet) < 0) {
- req->req.error = RAW1394_ERROR_SEND_ERROR;
- req->req.length = 0;
- hpsb_free_tlabel(packet);
-@@ -823,7 +823,7 @@ static int handle_iso_send(struct file_i
- /* Update the generation of the packet just before sending. */
- packet->generation = req->req.generation;
-
-- if (!hpsb_send_packet(packet)) {
-+ if (hpsb_send_packet(packet) < 0) {
- req->req.error = RAW1394_ERROR_SEND_ERROR;
- queue_complete_req(req);
- }
-@@ -846,7 +846,7 @@ static int handle_async_send(struct file
- return sizeof(struct raw1394_request);
- }
-
-- packet = alloc_hpsb_packet(req->req.length-header_length);
-+ packet = hpsb_alloc_packet(req->req.length-header_length);
- req->packet = packet;
- if (!packet) return -ENOMEM;
-
-@@ -885,7 +885,7 @@ static int handle_async_send(struct file
- /* Update the generation of the packet just before sending. */
- packet->generation = req->req.generation;
-
-- if (!hpsb_send_packet(packet)) {
-+ if (hpsb_send_packet(packet) < 0) {
- req->req.error = RAW1394_ERROR_SEND_ERROR;
- queue_complete_req(req);
- }
-@@ -1797,6 +1797,106 @@ static int arm_unregister(struct file_in
- return sizeof(struct raw1394_request);
- }
-
-+/* Copy data from ARM buffer(s) to user buffer. */
-+static int arm_get_buf(struct file_info *fi, struct pending_request *req)
-+{
-+ struct arm_addr *arm_addr = NULL;
-+ unsigned long flags;
-+ unsigned long offset;
-+
-+ struct list_head *entry;
-+
-+ DBGMSG("arm_get_buf "
-+ "addr(Offset): %04X %08X length: %u",
-+ (u32) ((req->req.address >> 32) & 0xFFFF),
-+ (u32) (req->req.address & 0xFFFFFFFF),
-+ (u32) req->req.length);
-+
-+ spin_lock_irqsave(&host_info_lock, flags);
-+ entry = fi->addr_list.next;
-+ while (entry != &(fi->addr_list)) {
-+ arm_addr = list_entry(entry, struct arm_addr, addr_list);
-+ if ((arm_addr->start <= req->req.address) &&
-+ (arm_addr->end > req->req.address)) {
-+ if (req->req.address + req->req.length <= arm_addr->end) {
-+ offset = req->req.address - arm_addr->start;
-+
-+ DBGMSG("arm_get_buf copy_to_user( %08X, %08X, %u )",
-+ (u32) req->req.recvb,
-+ (u32) (arm_addr->addr_space_buffer+offset),
-+ (u32) req->req.length);
-+
-+ if (copy_to_user(int2ptr(req->req.recvb), arm_addr->addr_space_buffer+offset, req->req.length)) {
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ return (-EFAULT);
-+ }
-+
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ free_pending_request(req); /* we have to free the request, because we queue no response, and therefore nobody will free it */
-+ return sizeof(struct raw1394_request);
-+ } else {
-+ DBGMSG("arm_get_buf request exceeded mapping");
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ return (-EINVAL);
-+ }
-+ }
-+ entry = entry->next;
-+ }
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ return (-EINVAL);
-+}
-+
-+
-+/* Copy data from user buffer to ARM buffer(s). */
-+static int arm_set_buf(struct file_info *fi, struct pending_request *req)
-+{
-+ struct arm_addr *arm_addr = NULL;
-+ unsigned long flags;
-+ unsigned long offset;
-+
-+ struct list_head *entry;
-+
-+ DBGMSG("arm_set_buf "
-+ "addr(Offset): %04X %08X length: %u",
-+ (u32) ((req->req.address >> 32) & 0xFFFF),
-+ (u32) (req->req.address & 0xFFFFFFFF),
-+ (u32) req->req.length);
-+
-+
-+ spin_lock_irqsave(&host_info_lock, flags);
-+ entry = fi->addr_list.next;
-+ while (entry != &(fi->addr_list)) {
-+ arm_addr = list_entry(entry, struct arm_addr, addr_list);
-+ if ((arm_addr->start <= req->req.address) &&
-+ (arm_addr->end > req->req.address)) {
-+ if (req->req.address + req->req.length <= arm_addr->end) {
-+ offset = req->req.address - arm_addr->start;
-+
-+ DBGMSG("arm_set_buf copy_from_user( %08X, %08X, %u )",
-+ (u32) (arm_addr->addr_space_buffer+offset),
-+ (u32) req->req.sendb,
-+ (u32) req->req.length);
-+
-+ if (copy_from_user(arm_addr->addr_space_buffer+offset, int2ptr(req->req.sendb), req->req.length)) {
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ return (-EFAULT);
-+ }
-+
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ free_pending_request(req); /* we have to free the request, because we queue no response, and therefore nobody will free it */
-+ return sizeof(struct raw1394_request);
-+ } else {
-+ DBGMSG("arm_set_buf request exceeded mapping");
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ return (-EINVAL);
-+ }
-+ }
-+ entry = entry->next;
-+ }
-+ spin_unlock_irqrestore(&host_info_lock, flags);
-+ return (-EINVAL);
-+}
-+
- static int reset_notification(struct file_info *fi, struct pending_request *req)
- {
- DBGMSG("reset_notification called - switch %s ",
-@@ -1829,9 +1929,8 @@ static int write_phypacket(struct file_i
- spin_unlock_irq(&fi->reqlists_lock);
- packet->generation = req->req.generation;
- retval = hpsb_send_packet(packet);
-- DBGMSG("write_phypacket send_packet called => retval: %d ",
-- retval);
-- if (! retval) {
-+ DBGMSG("write_phypacket send_packet called => retval: %d ", retval);
-+ if (retval < 0) {
- req->req.error = RAW1394_ERROR_SEND_ERROR;
- req->req.length = 0;
- queue_complete_req(req);
-@@ -1912,6 +2011,12 @@ static int state_connected(struct file_i
- case RAW1394_REQ_ARM_UNREGISTER:
- return arm_unregister(fi, req);
-
-+ case RAW1394_REQ_ARM_SET_BUF:
-+ return arm_set_buf(fi, req);
-+
-+ case RAW1394_REQ_ARM_GET_BUF:
-+ return arm_get_buf(fi, req);
-+
- case RAW1394_REQ_RESET_NOTIFY:
- return reset_notification(fi, req);
-
-@@ -2137,6 +2242,7 @@ static int raw1394_iso_recv_init(struct
- stat.config.data_buf_size,
- stat.config.buf_packets,
- stat.config.channel,
-+ stat.config.dma_mode,
- stat.config.irq_interval,
- rawiso_activity_cb);
- if (!fi->iso_handle)
-@@ -2489,7 +2595,7 @@ static int raw1394_release(struct inode
- list_del(&fi->list);
- spin_unlock_irq(&host_info_lock);
-
-- hpsb_unref_host(fi->host);
-+ put_device(&fi->host->device);
- }
-
- kfree(fi);
---- linux-2.6.0/drivers/ieee1394/raw1394.h 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/ieee1394/raw1394.h 2003-12-28 23:23:03.000000000 -0800
-@@ -30,6 +30,8 @@
-
- #define RAW1394_REQ_ARM_REGISTER 300
- #define RAW1394_REQ_ARM_UNREGISTER 301
-+#define RAW1394_REQ_ARM_SET_BUF 302
-+#define RAW1394_REQ_ARM_GET_BUF 303
-
- #define RAW1394_REQ_RESET_NOTIFY 400
-
-@@ -149,6 +151,9 @@ struct raw1394_iso_config {
- /* xmit only - iso transmission speed */
- __u8 speed;
-
-+ /* The mode of the dma when receiving iso data. Must be supported by chip */
-+ __u8 dma_mode;
-+
- /* max. latency of buffer, in packets (-1 if you don't care) */
- __s32 irq_interval;
- };
---- linux-2.6.0/drivers/ieee1394/sbp2.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/ieee1394/sbp2.c 2003-12-28 23:23:03.000000000 -0800
-@@ -77,7 +77,7 @@
- #include "sbp2.h"
-
- static char version[] __devinitdata =
-- "$Rev: 1034 $ Ben Collins <bcollins@debian.org>";
-+ "$Rev: 1082 $ Ben Collins <bcollins@debian.org>";
-
- /*
- * Module load parameter definitions
-@@ -361,38 +361,34 @@ static int sbp2util_down_timeout(atomic_
- static void sbp2_free_packet(struct hpsb_packet *packet)
- {
- hpsb_free_tlabel(packet);
-- free_hpsb_packet(packet);
-+ hpsb_free_packet(packet);
- }
-
--/*
-- * This function is called to retrieve a block write packet from our
-- * packet pool. This function is used in place of calling
-- * alloc_hpsb_packet (which costs us three kmallocs). Instead we just pull
-- * out a free request packet and re-initialize values in it. I'm sure this
-- * can still stand some more optimization.
-+/* This is much like hpsb_node_write(), except it ignores the response
-+ * subaction and returns immediately. Can be used from interrupts.
- */
--static struct hpsb_packet *
--sbp2util_allocate_write_packet(struct sbp2scsi_host_info *hi,
-- struct node_entry *ne, u64 addr,
-- size_t data_size,
-- quadlet_t *data)
-+int sbp2util_node_write_no_wait(struct node_entry *ne, u64 addr,
-+ quadlet_t *buffer, size_t length)
- {
- struct hpsb_packet *packet;
-
-- packet = hpsb_make_writepacket(hi->host, ne->nodeid,
-- addr, data, data_size);
--
-+ packet = hpsb_make_writepacket(ne->host, ne->nodeid,
-+ addr, buffer, length);
- if (!packet)
-- return NULL;
-+ return -ENOMEM;
-
- hpsb_set_packet_complete_task(packet, (void (*)(void*))sbp2_free_packet,
- packet);
-
- hpsb_node_fill_packet(ne, packet);
-
-- return packet;
--}
-+ if (hpsb_send_packet(packet) < 0) {
-+ sbp2_free_packet(packet);
-+ return -EIO;
-+ }
-
-+ return 0;
-+}
-
- /*
- * This function is called to create a pool of command orbs used for
-@@ -1734,35 +1730,26 @@ static int sbp2_max_speed_and_size(struc
- */
- static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait)
- {
-- struct sbp2scsi_host_info *hi = scsi_id->hi;
-- struct hpsb_packet *packet;
- quadlet_t data;
--
-+ u64 addr;
-+ int retval;
-+
- SBP2_DEBUG("sbp2_agent_reset");
-
- /*
- * Ok, let's write to the target's management agent register
- */
- data = ntohl(SBP2_AGENT_RESET_DATA);
-- packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
-- scsi_id->sbp2_command_block_agent_addr +
-- SBP2_AGENT_RESET_OFFSET,
-- 4, &data);
--
-- if (!packet) {
-- SBP2_ERR("sbp2util_allocate_write_packet failed");
-- return(-ENOMEM);
-- }
-+ addr = scsi_id->sbp2_command_block_agent_addr + SBP2_AGENT_RESET_OFFSET;
-
-- if (!hpsb_send_packet(packet)) {
-- SBP2_ERR("hpsb_send_packet failed");
-- sbp2_free_packet(packet);
-- return(-EIO);
-- }
-+ if (wait)
-+ retval = hpsb_node_write(scsi_id->ne, addr, &data, 4);
-+ else
-+ retval = sbp2util_node_write_no_wait(scsi_id->ne, addr, &data, 4);
-
-- if (wait) {
-- down(&packet->state_change);
-- down(&packet->state_change);
-+ if (retval < 0) {
-+ SBP2_ERR("hpsb_node_write failed.\n");
-+ return -EIO;
- }
-
- /*
-@@ -2032,8 +2019,9 @@ static int sbp2_link_orb_command(struct
- struct sbp2_command_info *command)
- {
- struct sbp2scsi_host_info *hi = scsi_id->hi;
-- struct hpsb_packet *packet;
- struct sbp2_command_orb *command_orb = &command->command_orb;
-+ struct node_entry *ne = scsi_id->ne;
-+ u64 addr;
-
- outstanding_orb_incr;
- SBP2_ORB_DEBUG("sending command orb %p, total orbs = %x",
-@@ -2049,40 +2037,30 @@ static int sbp2_link_orb_command(struct
- * Check to see if there are any previous orbs to use
- */
- if (scsi_id->last_orb == NULL) {
--
-+ quadlet_t data[2];
-+
- /*
- * Ok, let's write to the target's management agent register
- */
-- if (hpsb_node_entry_valid(scsi_id->ne)) {
--
-- packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
-- scsi_id->sbp2_command_block_agent_addr +
-- SBP2_ORB_POINTER_OFFSET, 8, NULL);
--
-- if (!packet) {
-- SBP2_ERR("sbp2util_allocate_write_packet failed");
-- return(-ENOMEM);
-- }
--
-- packet->data[0] = ORB_SET_NODE_ID(hi->host->node_id);
-- packet->data[1] = command->command_orb_dma;
-- sbp2util_cpu_to_be32_buffer(packet->data, 8);
--
-- SBP2_ORB_DEBUG("write command agent, command orb %p", command_orb);
-+ addr = scsi_id->sbp2_command_block_agent_addr + SBP2_ORB_POINTER_OFFSET;
-+ data[0] = ORB_SET_NODE_ID(hi->host->node_id);
-+ data[1] = command->command_orb_dma;
-+ sbp2util_cpu_to_be32_buffer(data, 8);
-
-- if (!hpsb_send_packet(packet)) {
-- SBP2_ERR("hpsb_send_packet failed");
-- sbp2_free_packet(packet);
-- return(-EIO);
-- }
-+ SBP2_ORB_DEBUG("write command agent, command orb %p", command_orb);
-
-- SBP2_ORB_DEBUG("write command agent complete");
-+ if (sbp2util_node_write_no_wait(ne, addr, data, 8) < 0) {
-+ SBP2_ERR("sbp2util_node_write_no_wait failed.\n");
-+ return -EIO;
- }
-
-+ SBP2_ORB_DEBUG("write command agent complete");
-+
- scsi_id->last_orb = command_orb;
- scsi_id->last_orb_dma = command->command_orb_dma;
-
- } else {
-+ quadlet_t data;
-
- /*
- * We have an orb already sent (maybe or maybe not
-@@ -2102,25 +2080,14 @@ static int sbp2_link_orb_command(struct
- /*
- * Ring the doorbell
- */
-- if (hpsb_node_entry_valid(scsi_id->ne)) {
-- quadlet_t data = cpu_to_be32(command->command_orb_dma);
-+ data = cpu_to_be32(command->command_orb_dma);
-+ addr = scsi_id->sbp2_command_block_agent_addr + SBP2_DOORBELL_OFFSET;
-
-- packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
-- scsi_id->sbp2_command_block_agent_addr +
-- SBP2_DOORBELL_OFFSET, 4, &data);
--
-- if (!packet) {
-- SBP2_ERR("sbp2util_allocate_write_packet failed");
-- return(-ENOMEM);
-- }
-+ SBP2_ORB_DEBUG("ring doorbell, command orb %p", command_orb);
-
-- SBP2_ORB_DEBUG("ring doorbell, command orb %p", command_orb);
--
-- if (!hpsb_send_packet(packet)) {
-- SBP2_ERR("hpsb_send_packet failed");
-- sbp2_free_packet(packet);
-- return(-EIO);
-- }
-+ if (sbp2util_node_write_no_wait(ne, addr, &data, 4) < 0) {
-+ SBP2_ERR("sbp2util_node_write_no_wait failed");
-+ return(-EIO);
- }
-
- scsi_id->last_orb = command_orb;
---- linux-2.6.0/drivers/input/gameport/Kconfig 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/input/gameport/Kconfig 2003-12-28 23:23:04.000000000 -0800
-@@ -19,6 +19,22 @@ config GAMEPORT
- To compile this driver as a module, choose M here: the
- module will be called gameport.
-
-+
-+# Yes, SOUND_GAMEPORT looks a bit odd. Yes, it ends up being turned on
-+# in every .config. Please don't touch it. It is here to handle an
-+# unusual dependency between GAMEPORT and sound drivers.
-+#
-+# Some sound drivers call gameport functions. If GAMEPORT is
-+# not selected, empty stubs are provided for the functions and all is
-+# well.
-+# If GAMEPORT is built in, everything is fine.
-+# If GAMEPORT is a module, however, it would need to be loaded for the
-+# sound driver to be able to link properly. Therefore, the sound
-+# driver must be a module as well in that case. Since there's no way
-+# to express that directly in Kconfig, we use SOUND_GAMEPORT to
-+# express it. SOUND_GAMEPORT boils down to "if GAMEPORT is 'm',
-+# anything that depends on SOUND_GAMEPORT must be 'm' as well. if
-+# GAMEPORT is 'y' or 'n', it can be anything".
- config SOUND_GAMEPORT
- tristate
- default y if GAMEPORT!=m
---- linux-2.6.0/drivers/input/input.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/input/input.c 2003-12-28 23:21:26.000000000 -0800
-@@ -447,9 +447,10 @@ void input_register_device(struct input_
- list_add_tail(&dev->node, &input_dev_list);
-
- list_for_each_entry(handler, &input_handler_list, node)
-- if ((id = input_match_device(handler->id_table, dev)))
-- if ((handle = handler->connect(handler, dev, id)))
-- input_link_handle(handle);
-+ if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
-+ if ((id = input_match_device(handler->id_table, dev)))
-+ if ((handle = handler->connect(handler, dev, id)))
-+ input_link_handle(handle);
-
- #ifdef CONFIG_HOTPLUG
- input_call_hotplug("add", dev);
-@@ -507,9 +508,10 @@ void input_register_handler(struct input
- list_add_tail(&handler->node, &input_handler_list);
-
- list_for_each_entry(dev, &input_dev_list, node)
-- if ((id = input_match_device(handler->id_table, dev)))
-- if ((handle = handler->connect(handler, dev, id)))
-- input_link_handle(handle);
-+ if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
-+ if ((id = input_match_device(handler->id_table, dev)))
-+ if ((handle = handler->connect(handler, dev, id)))
-+ input_link_handle(handle);
-
- #ifdef CONFIG_PROC_FS
- input_devices_state++;
---- linux-2.6.0/drivers/input/joydev.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/input/joydev.c 2003-12-28 23:21:26.000000000 -0800
-@@ -380,10 +380,6 @@ static struct input_handle *joydev_conne
- struct joydev *joydev;
- int i, j, t, minor;
-
-- /* Avoid tablets */
-- if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit))
-- return NULL;
--
- for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++);
- if (minor == JOYDEV_MINORS) {
- printk(KERN_ERR "joydev: no more free joydev devices\n");
-@@ -464,6 +460,15 @@ static void joydev_disconnect(struct inp
- joydev_free(joydev);
- }
-
-+static struct input_device_id joydev_blacklist[] = {
-+ {
-+ .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT,
-+ .evbit = { BIT(EV_KEY) },
-+ .keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) },
-+ }, /* Avoid itouchpads, touchscreens and tablets */
-+ { }, /* Terminating entry */
-+};
-+
- static struct input_device_id joydev_ids[] = {
- {
- .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
-@@ -493,6 +498,7 @@ static struct input_handler joydev_handl
- .minor = JOYDEV_MINOR_BASE,
- .name = "joydev",
- .id_table = joydev_ids,
-+ .blacklist = joydev_blacklist,
- };
-
- static int __init joydev_init(void)
---- linux-2.6.0/drivers/input/keyboard/atkbd.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/input/keyboard/atkbd.c 2003-12-28 23:21:31.000000000 -0800
-@@ -48,33 +48,30 @@ static int atkbd_softrepeat;
- */
-
- static unsigned char atkbd_set2_keycode[512] = {
-- 0, 67, 65, 63, 61, 59, 60, 88, 0, 68, 66, 64, 62, 15, 41, 85,
-- 0, 56, 42,182, 29, 16, 2, 89, 0, 0, 44, 31, 30, 17, 3, 90,
-- 0, 46, 45, 32, 18, 5, 4, 91, 90, 57, 47, 33, 20, 19, 6, 0,
-- 91, 49, 48, 35, 34, 21, 7, 0, 0, 0, 50, 36, 22, 8, 9, 0,
-+
-+ 0, 67, 65, 63, 61, 59, 60, 88, 0, 68, 66, 64, 62, 15, 41,117,
-+ 0, 56, 42,182, 29, 16, 2, 0, 0, 0, 44, 31, 30, 17, 3, 0,
-+ 0, 46, 45, 32, 18, 5, 4,186, 0, 57, 47, 33, 20, 19, 6, 85,
-+ 0, 49, 48, 35, 34, 21, 7, 89, 0, 0, 50, 36, 22, 8, 9, 90,
- 0, 51, 37, 23, 24, 11, 10, 0, 0, 52, 53, 38, 39, 25, 12, 0,
-- 122, 89, 40,120, 26, 13, 0, 0, 58, 54, 28, 27, 0, 43, 0, 0,
-- 85, 86, 90, 91, 92, 93, 14, 94, 95, 79,183, 75, 71,121, 0,123,
-+ 0,181, 40, 0, 26, 13, 0, 0, 58, 54, 28, 27, 0, 43, 0,194,
-+ 0, 86,193,192,184, 0, 14,185, 0, 79,182, 75, 71,124, 0, 0,
- 82, 83, 80, 76, 77, 72, 1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
-- 0, 0, 0, 65, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-+
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,
-- 0, 0, 92, 90, 85, 0,137, 0, 0, 0, 0, 91, 89,144,115, 0,
-- 217,100,255, 0, 97,165,164, 0,156, 0, 0,140,115, 0, 0,125,
-- 173,114, 0,113,152,163,151,126,128,166, 0,140, 0,147, 0,127,
-- 159,167,115,160,164, 0, 0,116,158, 0,150,166, 0, 0, 0,142,
-- 157, 0,114,166,168, 0, 0,213,155, 0, 98,113, 0,163, 0,138,
-- 226, 0, 0, 0, 0, 0,153,140, 0,255, 96, 0, 0, 0,143, 0,
-- 133, 0,116, 0,143, 0,174,133, 0,107, 0,105,102, 0, 0,112,
-- 110,111,108,112,106,103, 0,119, 0,118,109, 0, 99,104,119
-+ 217,100,255, 0, 97,165, 0, 0,156, 0, 0, 0, 0, 0, 0,125,
-+ 173,114, 0,113, 0, 0, 0,126,128, 0, 0,140, 0, 0, 0,127,
-+ 159, 0,115, 0,164, 0, 0,116,158, 0,150,166, 0, 0, 0,142,
-+ 157, 0, 0, 0, 0, 0, 0, 0,155, 0, 98, 0, 0,163, 0, 0,
-+ 226, 0, 0, 0, 0, 0, 0, 0, 0,255, 96, 0, 0, 0,143, 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0,105,102, 0, 0,112,
-+ 110,111,108,112,106,103, 0,119, 0,118,109, 0, 99,104,119, 0,
-+
-+ 0, 0, 0, 65, 99,
- };
-
- static unsigned char atkbd_set3_keycode[512] = {
-+
- 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60,
- 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62,
- 134, 46, 45, 32, 18, 5, 4, 63,135, 57, 47, 33, 20, 19, 6, 64,
-@@ -83,25 +80,21 @@ static unsigned char atkbd_set3_keycode[
- 113,114, 40, 84, 26, 13, 87, 99, 97, 54, 28, 27, 43, 84, 88, 70,
- 108,105,119,103,111,107, 14,110, 0, 79,106, 75, 71,109,102,104,
- 82, 83, 80, 76, 77, 72, 69, 98, 0, 96, 81, 0, 78, 73, 55, 85,
-+
- 89, 90, 91, 92, 74,185,184,182, 0, 0, 0,125,126,127,112, 0,
- 0,139,150,163,165,115,152,150,166,140,160,154,113,114,167,168,
-- 148,149,147,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255
-+ 148,149,147,140
- };
-
- static unsigned char atkbd_unxlate_table[128] = {
-- 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
-- 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
-- 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
-- 50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88, 5, 6, 4, 12, 3,
-- 11, 2, 10, 1, 9,119,126,108,117,125,123,107,115,116,121,105,
-- 114,122,112,113,127, 96, 97,120, 7, 15, 23, 31, 39, 47, 55, 63,
-- 71, 79, 86, 94, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
-- 19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
-+ 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13,
-+ 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27,
-+ 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42,
-+ 50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88, 5, 6, 4, 12, 3,
-+ 11, 2, 10, 1, 9,119,126,108,117,125,123,107,115,116,121,105,
-+ 114,122,112,113,127, 96, 97,120, 7, 15, 23, 31, 39, 47, 55, 63,
-+ 71, 79, 86, 94, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111,
-+ 19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110
- };
-
- #define ATKBD_CMD_SETLEDS 0x10ed
-@@ -125,6 +118,9 @@ static unsigned char atkbd_unxlate_table
- #define ATKBD_RET_EMULX 0x80
- #define ATKBD_RET_EMUL1 0xe1
- #define ATKBD_RET_RELEASE 0xf0
-+#define ATKBD_RET_HANGUEL 0xf1
-+#define ATKBD_RET_HANJA 0xf2
-+#define ATKBD_RET_ERR 0xff
-
- #define ATKBD_KEY_UNKNOWN 0
- #define ATKBD_KEY_NULL 255
-@@ -156,6 +152,17 @@ struct atkbd {
- unsigned long time;
- };
-
-+static void atkbd_report_key(struct input_dev *dev, struct pt_regs *regs, int code, int value)
-+{
-+ input_regs(dev, regs);
-+ if (value == 3) {
-+ input_report_key(dev, code, 1);
-+ input_report_key(dev, code, 0);
-+ } else
-+ input_event(dev, EV_KEY, code, value);
-+ input_sync(dev);
-+}
-+
- /*
- * atkbd_interrupt(). Here takes place processing of data received from
- * the keyboard into events.
-@@ -184,47 +191,37 @@ static irqreturn_t atkbd_interrupt(struc
- atkbd->resend = 0;
- #endif
-
-- switch (code) {
-- case ATKBD_RET_ACK:
-- atkbd->ack = 1;
-- goto out;
-- case ATKBD_RET_NAK:
-- atkbd->ack = -1;
-- goto out;
-- }
--
-- if (atkbd->translated) do {
--
-- if (atkbd->emul != 1) {
-- if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1)
-- break;
-- if (code == ATKBD_RET_BAT) {
-- if (!atkbd->bat_xl)
-- break;
-- atkbd->bat_xl = 0;
-- }
-- if (code == (ATKBD_RET_BAT & 0x7f))
-- atkbd->bat_xl = 1;
-+ if (!atkbd->ack)
-+ switch (code) {
-+ case ATKBD_RET_ACK:
-+ atkbd->ack = 1;
-+ goto out;
-+ case ATKBD_RET_NAK:
-+ atkbd->ack = -1;
-+ goto out;
- }
-
-- if (code < 0x80) {
-- code = atkbd_unxlate_table[code];
-- break;
-- }
--
-- if (atkbd->cmdcnt)
-- break;
--
-- code = atkbd_unxlate_table[code & 0x7f];
-- atkbd->release = 1;
--
-- } while (0);
--
- if (atkbd->cmdcnt) {
- atkbd->cmdbuf[--atkbd->cmdcnt] = code;
- goto out;
- }
-
-+ if (atkbd->translated) {
-+
-+ if (atkbd->emul ||
-+ !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 ||
-+ code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA ||
-+ code == ATKBD_RET_ERR ||
-+ (code == ATKBD_RET_BAT && !atkbd->bat_xl))) {
-+ atkbd->release = code >> 7;
-+ code &= 0x7f;
-+ }
-+
-+ if (!atkbd->emul &&
-+ (code & 0x7f) == (ATKBD_RET_BAT & 0x7f))
-+ atkbd->bat_xl = !atkbd->release;
-+ }
-+
- switch (code) {
- case ATKBD_RET_BAT:
- serio_rescan(atkbd->serio);
-@@ -238,22 +235,33 @@ static irqreturn_t atkbd_interrupt(struc
- case ATKBD_RET_RELEASE:
- atkbd->release = 1;
- goto out;
-+ case ATKBD_RET_HANGUEL:
-+ atkbd_report_key(&atkbd->dev, regs, KEY_LANG1, 3);
-+ goto out;
-+ case ATKBD_RET_HANJA:
-+ atkbd_report_key(&atkbd->dev, regs, KEY_LANG2, 3);
-+ goto out;
-+ case ATKBD_RET_ERR:
-+ printk(KERN_WARNING "atkbd.c: Keyboard on %s reports too many keys pressed.\n", serio->phys);
-+ goto out;
- }
-
-+ if (atkbd->set != 3)
-+ code = (code & 0x7f) | ((code & 0x80) << 1);
- if (atkbd->emul) {
- if (--atkbd->emul)
- goto out;
-- code |= 0x100;
-+ code |= (atkbd->set != 3) ? 0x80 : 0x100;
- }
-
- switch (atkbd->keycode[code]) {
- case ATKBD_KEY_NULL:
- break;
- case ATKBD_KEY_UNKNOWN:
-- printk(KERN_WARNING "atkbd.c: Unknown key %s (%s set %d, code %#x, data %#x, on %s).\n",
-+ printk(KERN_WARNING "atkbd.c: Unknown key %s (%s set %d, code %#x on %s).\n",
- atkbd->release ? "released" : "pressed",
- atkbd->translated ? "translated" : "raw",
-- atkbd->set, code, data, serio->phys);
-+ atkbd->set, code, serio->phys);
- break;
- default:
- value = atkbd->release ? 0 :
-@@ -273,9 +281,7 @@ static irqreturn_t atkbd_interrupt(struc
- break;
- }
-
-- input_regs(&atkbd->dev, regs);
-- input_event(&atkbd->dev, EV_KEY, atkbd->keycode[code], value);
-- input_sync(&atkbd->dev);
-+ atkbd_report_key(&atkbd->dev, regs, atkbd->keycode[code], value);
- }
-
- atkbd->release = 0;
-@@ -369,10 +375,11 @@ static int atkbd_command(struct atkbd *a
- static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
- {
- struct atkbd *atkbd = dev->private;
-- struct { int p; u8 v; } period[] =
-- { {30, 0x00}, {25, 0x02}, {20, 0x04}, {15, 0x08}, {10, 0x0c}, {7, 0x10}, {5, 0x14}, {0, 0x14} };
-- struct { int d; u8 v; } delay[] =
-- { {1000, 0x60}, {750, 0x40}, {500, 0x20}, {250, 0x00}, {0, 0x00} };
-+ const short period[32] =
-+ { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125,
-+ 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
-+ const short delay[4] =
-+ { 250, 500, 750, 1000 };
- char param[2];
- int i, j;
-
-@@ -406,11 +413,11 @@ static int atkbd_event(struct input_dev
- if (atkbd_softrepeat) return 0;
-
- i = j = 0;
-- while (period[i].p > dev->rep[REP_PERIOD]) i++;
-- while (delay[j].d > dev->rep[REP_DELAY]) j++;
-- dev->rep[REP_PERIOD] = period[i].p;
-- dev->rep[REP_DELAY] = delay[j].d;
-- param[0] = period[i].v | delay[j].v;
-+ while (i < 32 && period[i] < dev->rep[REP_PERIOD]) i++;
-+ while (j < 4 && delay[j] < dev->rep[REP_DELAY]) j++;
-+ dev->rep[REP_PERIOD] = period[i];
-+ dev->rep[REP_DELAY] = delay[j];
-+ param[0] = i | (j << 5);
- atkbd_command(atkbd, param, ATKBD_CMD_SETREP);
-
- return 0;
-@@ -578,6 +585,7 @@ static void atkbd_disconnect(struct seri
- struct atkbd *atkbd = serio->private;
- input_unregister_device(&atkbd->dev);
- serio_close(serio);
-+ serio->private = NULL;
- kfree(atkbd);
- }
-
-@@ -623,6 +631,7 @@ static void atkbd_connect(struct serio *
- atkbd->dev.rep[REP_PERIOD] = 33;
- }
-
-+ atkbd->ack = 1;
- atkbd->serio = serio;
-
- init_input_dev(&atkbd->dev);
-@@ -636,6 +645,7 @@ static void atkbd_connect(struct serio *
- serio->private = atkbd;
-
- if (serio_open(serio, dev)) {
-+ serio->private = NULL;
- kfree(atkbd);
- return;
- }
-@@ -644,6 +654,7 @@ static void atkbd_connect(struct serio *
-
- if (atkbd_probe(atkbd)) {
- serio_close(serio);
-+ serio->private = NULL;
- kfree(atkbd);
- return;
- }
-@@ -665,16 +676,22 @@ static void atkbd_connect(struct serio *
-
- sprintf(atkbd->phys, "%s/input0", serio->phys);
-
-- if (atkbd->set == 3)
-- memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
-- else
-+ if (atkbd->translated) {
-+ for (i = 0; i < 128; i++) {
-+ atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
-+ atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
-+ }
-+ } else if (atkbd->set == 2) {
- memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
-+ } else {
-+ memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
-+ }
-
- atkbd->dev.name = atkbd->name;
- atkbd->dev.phys = atkbd->phys;
- atkbd->dev.id.bustype = BUS_I8042;
- atkbd->dev.id.vendor = 0x0001;
-- atkbd->dev.id.product = atkbd->set;
-+ atkbd->dev.id.product = atkbd->translated ? 1 : atkbd->set;
- atkbd->dev.id.version = atkbd->id;
-
- for (i = 0; i < 512; i++)
-@@ -686,10 +703,62 @@ static void atkbd_connect(struct serio *
- printk(KERN_INFO "input: %s on %s\n", atkbd->name, serio->phys);
- }
-
-+/*
-+ * atkbd_reconnect() tries to restore keyboard into a sane state and is
-+ * most likely called on resume.
-+ */
-+
-+static int atkbd_reconnect(struct serio *serio)
-+{
-+ struct atkbd *atkbd = serio->private;
-+ struct serio_dev *dev = serio->dev;
-+ int i;
-+
-+ if (!dev) {
-+ printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n");
-+ return -1;
-+ }
-+
-+ if (atkbd->write) {
-+ if (atkbd_probe(atkbd))
-+ return -1;
-+
-+ atkbd->set = atkbd_set_3(atkbd);
-+ atkbd_enable(atkbd);
-+ } else {
-+ atkbd->set = 2;
-+ atkbd->id = 0xab00;
-+ }
-+
-+ /*
-+ * Here we probably should check if the keyboard has the same set that
-+ * it had before and bail out if it's different. But this will most likely
-+ * cause new keyboard device be created... and for the user it will look
-+ * like keyboard is lost
-+ */
-+
-+ if (atkbd->translated) {
-+ for (i = 0; i < 128; i++) {
-+ atkbd->keycode[i] = atkbd_set2_keycode[atkbd_unxlate_table[i]];
-+ atkbd->keycode[i | 0x80] = atkbd_set2_keycode[atkbd_unxlate_table[i] | 0x80];
-+ }
-+ } else if (atkbd->set == 2) {
-+ memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode));
-+ } else {
-+ memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode));
-+ }
-+
-+ for (i = 0; i < 512; i++)
-+ if (atkbd->keycode[i] && atkbd->keycode[i] < 255)
-+ set_bit(atkbd->keycode[i], atkbd->dev.keybit);
-+
-+ return 0;
-+}
-
- static struct serio_dev atkbd_dev = {
- .interrupt = atkbd_interrupt,
- .connect = atkbd_connect,
-+ .reconnect = atkbd_reconnect,
- .disconnect = atkbd_disconnect,
- .cleanup = atkbd_cleanup,
- };
-@@ -709,9 +778,17 @@ static int __init atkbd_setup_reset(char
- if (ints[0] > 0) atkbd_reset = ints[1];
- return 1;
- }
-+static int __init atkbd_setup_softrepeat(char *str)
-+{
-+ int ints[4];
-+ str = get_options(str, ARRAY_SIZE(ints), ints);
-+ if (ints[0] > 0) atkbd_softrepeat = ints[1];
-+ return 1;
-+}
-
- __setup("atkbd_set=", atkbd_setup_set);
- __setup("atkbd_reset", atkbd_setup_reset);
-+__setup("atkbd_softrepeat=", atkbd_setup_softrepeat);
- #endif
-
- int __init atkbd_init(void)
---- linux-2.6.0/drivers/input/mousedev.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/input/mousedev.c 2003-12-28 23:21:31.000000000 -0800
-@@ -53,12 +53,14 @@ struct mousedev_list {
- struct fasync_struct *fasync;
- struct mousedev *mousedev;
- struct list_head node;
-- int dx, dy, dz, oldx, oldy;
-- signed char ps2[6];
-+ int dx, dy, dz;
-+ int old_x[4], old_y[4];
- unsigned long buttons;
-+ signed char ps2[6];
- unsigned char ready, buffer, bufsiz;
- unsigned char mode, imexseq, impsseq;
-- int finger;
-+ unsigned int pkt_count;
-+ unsigned char touch;
- };
-
- #define MOUSEDEV_SEQ_LEN 6
-@@ -74,49 +76,49 @@ static struct mousedev mousedev_mix;
- static int xres = CONFIG_INPUT_MOUSEDEV_SCREEN_X;
- static int yres = CONFIG_INPUT_MOUSEDEV_SCREEN_Y;
-
-+#define fx(i) (list->old_x[(list->pkt_count - (i)) & 03])
-+#define fy(i) (list->old_y[(list->pkt_count - (i)) & 03])
-+
- static void mousedev_abs_event(struct input_handle *handle, struct mousedev_list *list, unsigned int code, int value)
- {
- int size;
-+ int touchpad;
-
- /* Ignore joysticks */
- if (test_bit(BTN_TRIGGER, handle->dev->keybit))
- return;
-
-- /* Handle touchpad data */
-- if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit)) {
-+ touchpad = test_bit(BTN_TOOL_FINGER, handle->dev->keybit);
-
-- if (list->finger && list->finger < 3)
-- list->finger++;
--
-- switch (code) {
-- case ABS_X:
-- if (list->finger == 3)
-- list->dx += (value - list->oldx) / 8;
-- list->oldx = value;
-- return;
-- case ABS_Y:
-- if (list->finger == 3)
-- list->dy -= (value - list->oldy) / 8;
-- list->oldy = value;
-- return;
-- }
-- return;
-- }
--
-- /* Handle tablet data */
- switch (code) {
- case ABS_X:
-- size = handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X];
-- if (size == 0) size = xres;
-- list->dx += (value * xres - list->oldx) / size;
-- list->oldx += list->dx * size;
-- return;
-+ if (touchpad) {
-+ if (list->touch) {
-+ fx(0) = value;
-+ if (list->pkt_count >= 2)
-+ list->dx = ((fx(0) - fx(1)) / 2 + (fx(1) - fx(2)) / 2) / 8;
-+ }
-+ } else {
-+ size = handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X];
-+ if (size == 0) size = xres;
-+ list->dx += (value * xres - list->old_x[0]) / size;
-+ list->old_x[0] += list->dx * size;
-+ }
-+ break;
- case ABS_Y:
-- size = handle->dev->absmax[ABS_Y] - handle->dev->absmin[ABS_Y];
-- if (size == 0) size = yres;
-- list->dy -= (value * yres - list->oldy) / size;
-- list->oldy -= list->dy * size;
-- return;
-+ if (touchpad) {
-+ if (list->touch) {
-+ fy(0) = value;
-+ if (list->pkt_count >= 2)
-+ list->dy = -((fy(0) - fy(1)) / 2 + (fy(1) - fy(2)) / 2) / 8;
-+ }
-+ } else {
-+ size = handle->dev->absmax[ABS_Y] - handle->dev->absmin[ABS_Y];
-+ if (size == 0) size = yres;
-+ list->dy -= (value * yres - list->old_y[0]) / size;
-+ list->old_y[0] -= list->dy * size;
-+ }
-+ break;
- }
- }
-
-@@ -146,12 +148,16 @@ static void mousedev_event(struct input_
- break;
-
- case EV_KEY:
-+ if (code == BTN_TOUCH && test_bit(BTN_TOOL_FINGER, handle->dev->keybit)) {
-+ /* Handle touchpad data */
-+ list->touch = value;
-+ if (!list->touch)
-+ list->pkt_count = 0;
-+ break;
-+ }
-+
- switch (code) {
-- case BTN_TOUCH: /* Handle touchpad data */
-- if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit)) {
-- list->finger = value;
-- return;
-- }
-+ case BTN_TOUCH:
- case BTN_0:
- case BTN_FORWARD:
- case BTN_LEFT: index = 0; break;
-@@ -178,6 +184,16 @@ static void mousedev_event(struct input_
- case EV_SYN:
- switch (code) {
- case SYN_REPORT:
-+ if (list->touch) {
-+ list->pkt_count++;
-+ /* Input system eats duplicate events,
-+ * but we need all of them to do correct
-+ * averaging so apply present one forward
-+ */
-+ fx(0) = fx(1);
-+ fy(0) = fy(1);
-+ }
-+
- list->ready = 1;
- kill_fasync(&list->fasync, SIGIO, POLL_IN);
- wake = 1;
---- linux-2.6.0/drivers/input/mouse/Kconfig 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/input/mouse/Kconfig 2003-12-28 23:21:30.000000000 -0800
-@@ -23,27 +23,18 @@ config MOUSE_PS2
- mice with wheels and extra buttons, Microsoft, Logitech or Genius
- compatible.
-
-+ Synaptics TouchPad users might be interested in a specialized
-+ XFree86 driver at:
-+ http://w1.894.telia.com/~u89404340/touchpad/index.html
-+ and a new verion of GPM at:
-+ http://www.geocities.com/dt_or/gpm/gpm.html
-+ to take advantage of the advanced features of the touchpad.
-+
- If unsure, say Y.
-
- To compile this driver as a module, choose M here: the
- module will be called psmouse.
-
--config MOUSE_PS2_SYNAPTICS
-- bool "Synaptics TouchPad"
-- default n
-- depends on INPUT && INPUT_MOUSE && MOUSE_PS2
-- ---help---
-- Say Y here if you have a Synaptics TouchPad connected to your system.
-- This touchpad is found on many modern laptop computers.
--
-- Note that you also need a user space driver to interpret the data
-- generated by the kernel. A compatible driver for XFree86 is available
-- from http://w1.894.telia.com/~u89404340/touchpad/index.html
--
-- The gpm program is not yet able to interpret the data from this
-- driver, so if you need to use the touchpad in the console, you have to
-- say N for now.
--
- config MOUSE_SERIAL
- tristate "Serial mouse"
- depends on INPUT && INPUT_MOUSE
---- linux-2.6.0/drivers/input/mouse/logips2pp.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/input/mouse/logips2pp.c 2003-12-28 23:21:28.000000000 -0800
-@@ -10,6 +10,7 @@
- */
-
- #include <linux/input.h>
-+#include <linux/serio.h>
- #include "psmouse.h"
- #include "logips2pp.h"
-
-@@ -142,7 +143,7 @@ void ps2pp_set_800dpi(struct psmouse *ps
- * touchpad.
- */
-
--int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
-+static int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param)
- {
- int i;
- static int logitech_4btn[] = { 12, 40, 41, 42, 43, 52, 73, 80, -1 };
-@@ -226,3 +227,22 @@ int ps2pp_detect_model(struct psmouse *p
-
- return 0;
- }
-+
-+/*
-+ * Logitech magic init.
-+ */
-+int ps2pp_detect(struct psmouse *psmouse)
-+{
-+ unsigned char param[4];
-+
-+ param[0] = 0;
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-+ psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-+ psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-+ psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-+ param[1] = 0;
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
-+
-+ return param[1] != 0 ? ps2pp_detect_model(psmouse, param) : 0;
-+}
-+
---- linux-2.6.0/drivers/input/mouse/logips2pp.h 2003-06-22 12:04:44.000000000 -0700
-+++ 25/drivers/input/mouse/logips2pp.h 2003-12-28 23:21:28.000000000 -0800
-@@ -13,5 +13,5 @@
- struct psmouse;
- void ps2pp_process_packet(struct psmouse *psmouse);
- void ps2pp_set_800dpi(struct psmouse *psmouse);
--int ps2pp_detect_model(struct psmouse *psmouse, unsigned char *param);
-+int ps2pp_detect(struct psmouse *psmouse);
- #endif
---- linux-2.6.0/drivers/input/mouse/psmouse-base.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/input/mouse/psmouse-base.c 2003-12-28 23:21:30.000000000 -0800
-@@ -12,35 +12,44 @@
-
- #include <linux/delay.h>
- #include <linux/module.h>
-+#include <linux/moduleparam.h>
- #include <linux/slab.h>
- #include <linux/interrupt.h>
- #include <linux/input.h>
- #include <linux/serio.h>
- #include <linux/init.h>
--#include <linux/pm.h>
- #include "psmouse.h"
- #include "synaptics.h"
- #include "logips2pp.h"
-
- MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
- MODULE_DESCRIPTION("PS/2 mouse driver");
--MODULE_PARM(psmouse_noext, "1i");
--MODULE_PARM_DESC(psmouse_noext, "Disable any protocol extensions. Useful for KVM switches.");
--MODULE_PARM(psmouse_resolution, "i");
--MODULE_PARM_DESC(psmouse_resolution, "Resolution, in dpi.");
--MODULE_PARM(psmouse_rate, "i");
--MODULE_PARM_DESC(psmouse_rate, "Report rate, in reports per second.");
--MODULE_PARM(psmouse_smartscroll, "i");
--MODULE_PARM_DESC(psmouse_smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
--MODULE_PARM(psmouse_resetafter, "i");
--MODULE_PARM_DESC(psmouse_resetafter, "Reset Synaptics Touchpad after so many bad packets (0 = never).");
- MODULE_LICENSE("GPL");
-
- static int psmouse_noext;
-+module_param(psmouse_noext, int, 0);
-+MODULE_PARM_DESC(psmouse_noext, "[DEPRECATED] Disable any protocol extensions. Useful for KVM switches.");
-+
-+static char *psmouse_proto;
-+static unsigned int psmouse_max_proto = -1UL;
-+module_param(psmouse_proto, charp, 0);
-+MODULE_PARM_DESC(psmouse_proto, "Highest protocol extension to probe (bare, imps, exps). Useful for KVM switches.");
-+
- int psmouse_resolution = 200;
-+module_param(psmouse_resolution, uint, 0);
-+MODULE_PARM_DESC(psmouse_resolution, "Resolution, in dpi.");
-+
- unsigned int psmouse_rate = 100;
-+module_param(psmouse_rate, uint, 0);
-+MODULE_PARM_DESC(psmouse_rate, "Report rate, in reports per second.");
-+
- int psmouse_smartscroll = 1;
-+module_param(psmouse_smartscroll, bool, 0);
-+MODULE_PARM_DESC(psmouse_smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");
-+
- unsigned int psmouse_resetafter;
-+module_param(psmouse_resetafter, uint, 0);
-+MODULE_PARM_DESC(psmouse_resetafter, "Reset Synaptics Touchpad after so many bad packets (0 = never).");
-
- static char *psmouse_protocols[] = { "None", "PS/2", "PS2++", "PS2T++", "GenPS/2", "ImPS/2", "ImExPS/2", "SynPS/2"};
-
-@@ -139,7 +148,8 @@ static irqreturn_t psmouse_interrupt(str
- goto out;
- }
-
-- if (psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
-+ if (psmouse->state == PSMOUSE_ACTIVATED &&
-+ psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {
- printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",
- psmouse->name, psmouse->phys, psmouse->pktcnt);
- psmouse->pktcnt = 0;
-@@ -257,46 +267,12 @@ int psmouse_command(struct psmouse *psmo
- }
-
- /*
-- * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
-- * the mouse may have.
-+ * Genius NetMouse magic init.
- */
--
--static int psmouse_extensions(struct psmouse *psmouse)
-+static int genius_detect(struct psmouse *psmouse)
- {
- unsigned char param[4];
-
-- param[0] = 0;
-- psmouse->vendor = "Generic";
-- psmouse->name = "Mouse";
-- psmouse->model = 0;
--
-- if (psmouse_noext)
-- return PSMOUSE_PS2;
--
--/*
-- * Try Synaptics TouchPad magic ID
-- */
--
-- param[0] = 0;
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-- psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
--
-- if (param[1] == 0x47) {
-- psmouse->vendor = "Synaptics";
-- psmouse->name = "TouchPad";
-- if (!synaptics_init(psmouse))
-- return PSMOUSE_SYNAPTICS;
-- else
-- return PSMOUSE_PS2;
-- }
--
--/*
-- * Try Genius NetMouse magic init.
-- */
--
- param[0] = 3;
- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
- psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-@@ -304,65 +280,99 @@ static int psmouse_extensions(struct psm
- psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
- psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
-
-- if (param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55) {
--
-- set_bit(BTN_EXTRA, psmouse->dev.keybit);
-- set_bit(BTN_SIDE, psmouse->dev.keybit);
-- set_bit(REL_WHEEL, psmouse->dev.relbit);
--
-- psmouse->vendor = "Genius";
-- psmouse->name = "Wheel Mouse";
-- return PSMOUSE_GENPS;
-- }
-+ return param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55;
-+}
-
- /*
-- * Try Logitech magic ID.
-+ * IntelliMouse magic init.
- */
-+static int intellimouse_detect(struct psmouse *psmouse)
-+{
-+ unsigned char param[2];
-
-- param[0] = 0;
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-- psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-- psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-- psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-- param[1] = 0;
-- psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
-+ param[0] = 200;
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-+ param[0] = 100;
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-+ param[0] = 80;
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
-
-- if (param[1]) {
-- int type = ps2pp_detect_model(psmouse, param);
-- if (type)
-- return type;
-- }
-+ return param[0] == 3;
-+}
-
- /*
-- * Try IntelliMouse magic init.
-+ * Try IntelliMouse/Explorer magic init.
- */
-+static int im_explorer_detect(struct psmouse *psmouse)
-+{
-+ unsigned char param[2];
-
- param[0] = 200;
- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-- param[0] = 100;
-+ param[0] = 200;
- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
- param[0] = 80;
- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
- psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
--
-- if (param[0] == 3) {
-
-- set_bit(REL_WHEEL, psmouse->dev.relbit);
-+ return param[0] == 4;
-+}
-
- /*
-- * Try IntelliMouse/Explorer magic init.
-+ * psmouse_extensions() probes for any extensions to the basic PS/2 protocol
-+ * the mouse may have.
-+ */
-+
-+static int psmouse_extensions(struct psmouse *psmouse)
-+{
-+ int synaptics_hardware = 0;
-+
-+ psmouse->vendor = "Generic";
-+ psmouse->name = "Mouse";
-+ psmouse->model = 0;
-+
-+/*
-+ * Try Synaptics TouchPad
- */
-+ if (psmouse_max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse)) {
-+ synaptics_hardware = 1;
-+ psmouse->vendor = "Synaptics";
-+ psmouse->name = "TouchPad";
-
-- param[0] = 200;
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-- param[0] = 200;
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-- param[0] = 80;
-- psmouse_command(psmouse, param, PSMOUSE_CMD_SETRATE);
-- psmouse_command(psmouse, param, PSMOUSE_CMD_GETID);
-+ if (psmouse_max_proto > PSMOUSE_IMEX) {
-+ if (synaptics_init(psmouse) == 0)
-+ return PSMOUSE_SYNAPTICS;
-+/*
-+ * Some Synaptics touchpads can emulate extended protocols (like IMPS/2).
-+ * Unfortunately Logitech/Genius probes confuse some firmware versions so
-+ * we'll have to skip them.
-+ */
-+ psmouse_max_proto = PSMOUSE_IMEX;
-+ }
-+ }
-
-- if (param[0] == 4) {
-+ if (psmouse_max_proto > PSMOUSE_IMEX && genius_detect(psmouse)) {
-+ set_bit(BTN_EXTRA, psmouse->dev.keybit);
-+ set_bit(BTN_SIDE, psmouse->dev.keybit);
-+ set_bit(REL_WHEEL, psmouse->dev.relbit);
-
-+ psmouse->vendor = "Genius";
-+ psmouse->name = "Wheel Mouse";
-+ return PSMOUSE_GENPS;
-+ }
-+
-+ if (psmouse_max_proto > PSMOUSE_IMEX) {
-+ int type = ps2pp_detect(psmouse);
-+ if (type)
-+ return type;
-+ }
-+
-+ if (psmouse_max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse)) {
-+ set_bit(REL_WHEEL, psmouse->dev.relbit);
-+
-+ if (psmouse_max_proto >= PSMOUSE_IMEX &&
-+ im_explorer_detect(psmouse)) {
- set_bit(BTN_SIDE, psmouse->dev.keybit);
- set_bit(BTN_EXTRA, psmouse->dev.keybit);
-
-@@ -378,6 +388,15 @@ static int psmouse_extensions(struct psm
- * Okay, all failed, we have a standard mouse here. The number of the buttons
- * is still a question, though. We assume 3.
- */
-+ if (synaptics_hardware) {
-+/*
-+ * We detected Synaptics hardware but it did not respond to IMPS/2 probes.
-+ * We need to reset the touchpad because if there is a track point on the
-+ * pass through port it could get disabled while probing for protocol
-+ * extensions.
-+ */
-+ psmouse_command(psmouse, NULL, PSMOUSE_CMD_RESET_DIS);
-+ }
-
- return PSMOUSE_PS2;
- }
-@@ -468,7 +487,7 @@ static void psmouse_initialize(struct ps
- * We set the mouse report rate, resolution and scaling.
- */
-
-- if (!psmouse_noext) {
-+ if (psmouse_max_proto != PSMOUSE_PS2) {
- psmouse_set_rate(psmouse);
- psmouse_set_resolution(psmouse);
- psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11);
-@@ -513,45 +532,30 @@ static void psmouse_disconnect(struct se
- struct psmouse *psmouse = serio->private;
-
- psmouse->state = PSMOUSE_IGNORE;
-- synaptics_disconnect(psmouse);
-- input_unregister_device(&psmouse->dev);
-- serio_close(serio);
-- kfree(psmouse);
--}
--
--/*
-- * Reinitialize mouse hardware after software suspend.
-- */
--
--static int psmouse_pm_callback(struct pm_dev *dev, pm_request_t request, void *data)
--{
-- struct psmouse *psmouse = dev->data;
-- struct serio_dev *ser_dev = psmouse->serio->dev;
--
-- synaptics_disconnect(psmouse);
-
-- /* We need to reopen the serio port to reinitialize the i8042 controller */
-- serio_close(psmouse->serio);
-- serio_open(psmouse->serio, ser_dev);
-+ if (psmouse->ptport) {
-+ if (psmouse->ptport->deactivate)
-+ psmouse->ptport->deactivate(psmouse);
-+ __serio_unregister_port(&psmouse->ptport->serio); /* we have serio_sem */
-+ kfree(psmouse->ptport);
-+ psmouse->ptport = NULL;
-+ }
-
-- /* Probe and re-initialize the mouse */
-- psmouse_probe(psmouse);
-- psmouse_initialize(psmouse);
-- synaptics_pt_init(psmouse);
-- psmouse_activate(psmouse);
-+ if (psmouse->disconnect)
-+ psmouse->disconnect(psmouse);
-
-- return 0;
-+ input_unregister_device(&psmouse->dev);
-+ serio_close(serio);
-+ kfree(psmouse);
- }
-
- /*
- * psmouse_connect() is a callback from the serio module when
- * an unhandled serio port is found.
- */
--
- static void psmouse_connect(struct serio *serio, struct serio_dev *dev)
- {
- struct psmouse *psmouse;
-- struct pm_dev *pmdev;
-
- if ((serio->type & SERIO_TYPE) != SERIO_8042 &&
- (serio->type & SERIO_TYPE) != SERIO_PS_PSTHRU)
-@@ -572,7 +576,6 @@ static void psmouse_connect(struct serio
- psmouse->dev.private = psmouse;
-
- serio->private = psmouse;
--
- if (serio_open(serio, dev)) {
- kfree(psmouse);
- return;
-@@ -584,12 +587,6 @@ static void psmouse_connect(struct serio
- return;
- }
-
-- pmdev = pm_register(PM_SYS_DEV, PM_SYS_UNKNOWN, psmouse_pm_callback);
-- if (pmdev) {
-- psmouse->dev.pm_dev = pmdev;
-- pmdev->data = psmouse;
-- }
--
- sprintf(psmouse->devname, "%s %s %s",
- psmouse_protocols[psmouse->type], psmouse->vendor, psmouse->name);
- sprintf(psmouse->phys, "%s/input0",
-@@ -608,59 +605,87 @@ static void psmouse_connect(struct serio
-
- psmouse_initialize(psmouse);
-
-- synaptics_pt_init(psmouse);
-+ if (psmouse->ptport) {
-+ printk(KERN_INFO "serio: %s port at %s\n", psmouse->ptport->serio.name, psmouse->phys);
-+ __serio_register_port(&psmouse->ptport->serio); /* we have serio_sem */
-+ if (psmouse->ptport->activate)
-+ psmouse->ptport->activate(psmouse);
-+ }
-+
-+ psmouse_activate(psmouse);
-+}
-+
-+
-+static int psmouse_reconnect(struct serio *serio)
-+{
-+ struct psmouse *psmouse = serio->private;
-+ struct serio_dev *dev = serio->dev;
-+ int old_type = psmouse->type;
-+
-+ if (!dev) {
-+ printk(KERN_DEBUG "psmouse: reconnect request, but serio is disconnected, ignoring...\n");
-+ return -1;
-+ }
-+
-+ psmouse->state = PSMOUSE_NEW_DEVICE;
-+ psmouse->type = psmouse->acking = psmouse->cmdcnt = psmouse->pktcnt = 0;
-+ if (psmouse->reconnect) {
-+ if (psmouse->reconnect(psmouse))
-+ return -1;
-+ } else if (psmouse_probe(psmouse) != old_type)
-+ return -1;
-+
-+ /* ok, the device type (and capabilities) match the old one,
-+ * we can continue using it, complete intialization
-+ */
-+ psmouse->type = old_type;
-+ psmouse_initialize(psmouse);
-+
-+ if (psmouse->ptport) {
-+ if (psmouse_reconnect(&psmouse->ptport->serio)) {
-+ __serio_unregister_port(&psmouse->ptport->serio);
-+ __serio_register_port(&psmouse->ptport->serio);
-+ if (psmouse->ptport->activate)
-+ psmouse->ptport->activate(psmouse);
-+ }
-+ }
-
- psmouse_activate(psmouse);
-+ return 0;
- }
-
-+
- static struct serio_dev psmouse_dev = {
- .interrupt = psmouse_interrupt,
- .connect = psmouse_connect,
-+ .reconnect = psmouse_reconnect,
- .disconnect = psmouse_disconnect,
- .cleanup = psmouse_cleanup,
- };
-
--#ifndef MODULE
--static int __init psmouse_noext_setup(char *str)
--{
-- psmouse_noext = 1;
-- return 1;
--}
--
--static int __init psmouse_resolution_setup(char *str)
--{
-- get_option(&str, &psmouse_resolution);
-- return 1;
--}
--
--static int __init psmouse_smartscroll_setup(char *str)
-+static inline void psmouse_parse_proto(void)
- {
-- get_option(&str, &psmouse_smartscroll);
-- return 1;
--}
--
--static int __init psmouse_resetafter_setup(char *str)
--{
-- get_option(&str, &psmouse_resetafter);
-- return 1;
--}
-+ if (psmouse_noext) {
-+ printk(KERN_WARNING "psmouse: 'psmouse_noext' option is deprecated, please use 'psmouse_proto'\n");
-+ psmouse_max_proto = PSMOUSE_PS2;
-+ }
-
--static int __init psmouse_rate_setup(char *str)
--{
-- get_option(&str, &psmouse_rate);
-- return 1;
-+ /* even is psmouse_noext is present psmouse_proto overrides it */
-+ if (psmouse_proto) {
-+ if (!strcmp(psmouse_proto, "bare"))
-+ psmouse_max_proto = PSMOUSE_PS2;
-+ else if (!strcmp(psmouse_proto, "imps"))
-+ psmouse_max_proto = PSMOUSE_IMPS;
-+ else if (!strcmp(psmouse_proto, "exps"))
-+ psmouse_max_proto = PSMOUSE_IMEX;
-+ else
-+ printk(KERN_ERR "psmouse: unknown protocol type '%s'\n", psmouse_proto);
-+ }
- }
-
--__setup("psmouse_noext", psmouse_noext_setup);
--__setup("psmouse_resolution=", psmouse_resolution_setup);
--__setup("psmouse_smartscroll=", psmouse_smartscroll_setup);
--__setup("psmouse_resetafter=", psmouse_resetafter_setup);
--__setup("psmouse_rate=", psmouse_rate_setup);
--
--#endif
--
- int __init psmouse_init(void)
- {
-+ psmouse_parse_proto();
- serio_register_device(&psmouse_dev);
- return 0;
- }
---- linux-2.6.0/drivers/input/mouse/psmouse.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/input/mouse/psmouse.h 2003-12-28 23:21:27.000000000 -0800
-@@ -22,10 +22,20 @@
- #define PSMOUSE_ACTIVATED 1
- #define PSMOUSE_IGNORE 2
-
-+struct psmouse;
-+
-+struct psmouse_ptport {
-+ struct serio serio;
-+
-+ void (*activate)(struct psmouse *parent);
-+ void (*deactivate)(struct psmouse *parent);
-+};
-+
- struct psmouse {
- void *private;
- struct input_dev dev;
- struct serio *serio;
-+ struct psmouse_ptport *ptport;
- char *vendor;
- char *name;
- unsigned char cmdbuf[8];
-@@ -41,6 +51,9 @@ struct psmouse {
- char error;
- char devname[64];
- char phys[32];
-+
-+ int (*reconnect)(struct psmouse *psmouse);
-+ void (*disconnect)(struct psmouse *psmouse);
- };
-
- #define PSMOUSE_PS2 1
---- linux-2.6.0/drivers/input/mouse/synaptics.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/input/mouse/synaptics.c 2003-12-28 23:21:31.000000000 -0800
-@@ -2,7 +2,8 @@
- * Synaptics TouchPad PS/2 mouse driver
- *
- * 2003 Dmitry Torokhov <dtor@mail.ru>
-- * Added support for pass-through port
-+ * Added support for pass-through port. Special thanks to Peter Berg Larsen
-+ * for explaining various Synaptics quirks.
- *
- * 2003 Peter Osterlund <petero2@telia.com>
- * Ported to 2.5 input device infrastructure.
-@@ -194,9 +195,7 @@ static void print_ident(struct synaptics
-
- static int synaptics_query_hardware(struct psmouse *psmouse)
- {
-- struct synaptics_data *priv = psmouse->private;
- int retries = 0;
-- int mode;
-
- while ((retries++ < 3) && synaptics_reset(psmouse))
- printk(KERN_ERR "synaptics reset failed\n");
-@@ -208,7 +207,14 @@ static int synaptics_query_hardware(stru
- if (synaptics_capability(psmouse))
- return -1;
-
-- mode = SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE;
-+ return 0;
-+}
-+
-+static int synaptics_set_mode(struct psmouse *psmouse, int mode)
-+{
-+ struct synaptics_data *priv = psmouse->private;
-+
-+ mode |= SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE;
- if (SYN_ID_MAJOR(priv->identity) >= 4)
- mode |= SYN_BIT_DISABLE_GESTURE;
- if (SYN_CAP_EXTENDED(priv->capabilities))
-@@ -265,49 +271,38 @@ static void synaptics_pass_pt_packet(str
- }
- }
-
--int synaptics_pt_init(struct psmouse *psmouse)
-+static void synaptics_pt_activate(struct psmouse *psmouse)
- {
-- struct synaptics_data *priv = psmouse->private;
-- struct serio *port;
-- struct psmouse *child;
-+ struct psmouse *child = psmouse->ptport->serio.private;
-
-- if (psmouse->type != PSMOUSE_SYNAPTICS)
-- return -1;
-- if (!SYN_CAP_EXTENDED(priv->capabilities))
-- return -1;
-- if (!SYN_CAP_PASS_THROUGH(priv->capabilities))
-- return -1;
-+ /* adjust the touchpad to child's choice of protocol */
-+ if (child && child->type >= PSMOUSE_GENPS) {
-+ if (synaptics_set_mode(psmouse, SYN_BIT_FOUR_BYTE_CLIENT))
-+ printk(KERN_INFO "synaptics: failed to enable 4-byte guest protocol\n");
-+ }
-+}
-
-- priv->ptport = port = kmalloc(sizeof(struct serio), GFP_KERNEL);
-+static void synaptics_pt_create(struct psmouse *psmouse)
-+{
-+ struct psmouse_ptport *port;
-+
-+ psmouse->ptport = port = kmalloc(sizeof(struct psmouse_ptport), GFP_KERNEL);
- if (!port) {
-- printk(KERN_ERR "synaptics: not enough memory to allocate serio port\n");
-- return -1;
-+ printk(KERN_ERR "synaptics: not enough memory to allocate pass-through port\n");
-+ return;
- }
-
-- memset(port, 0, sizeof(struct serio));
-- port->type = SERIO_PS_PSTHRU;
-- port->name = "Synaptics pass-through";
-- port->phys = "synaptics-pt/serio0";
-- port->write = synaptics_pt_write;
-- port->open = synaptics_pt_open;
-- port->close = synaptics_pt_close;
-- port->driver = psmouse;
-+ memset(port, 0, sizeof(struct psmouse_ptport));
-
-- printk(KERN_INFO "serio: %s port at %s\n", port->name, psmouse->phys);
-- serio_register_slave_port(port);
-+ port->serio.type = SERIO_PS_PSTHRU;
-+ port->serio.name = "Synaptics pass-through";
-+ port->serio.phys = "synaptics-pt/serio0";
-+ port->serio.write = synaptics_pt_write;
-+ port->serio.open = synaptics_pt_open;
-+ port->serio.close = synaptics_pt_close;
-+ port->serio.driver = psmouse;
-
-- /* adjust the touchpad to child's choice of protocol */
-- child = port->private;
-- if (child && child->type >= PSMOUSE_GENPS) {
-- if (synaptics_mode_cmd(psmouse, (SYN_BIT_ABSOLUTE_MODE |
-- SYN_BIT_HIGH_RATE |
-- SYN_BIT_DISABLE_GESTURE |
-- SYN_BIT_FOUR_BYTE_CLIENT |
-- SYN_BIT_W_MODE)))
-- printk(KERN_INFO "synaptics: failed to enable 4-byte guest protocol\n");
-- }
--
-- return 0;
-+ port->activate = synaptics_pt_activate;
- }
-
- /*****************************************************************************
-@@ -371,27 +366,82 @@ static void set_input_params(struct inpu
- clear_bit(REL_Y, dev->relbit);
- }
-
-+static void synaptics_disconnect(struct psmouse *psmouse)
-+{
-+ synaptics_mode_cmd(psmouse, 0);
-+ kfree(psmouse->private);
-+}
-+
-+static int synaptics_reconnect(struct psmouse *psmouse)
-+{
-+ struct synaptics_data *priv = psmouse->private;
-+ struct synaptics_data old_priv = *priv;
-+
-+ if (!synaptics_detect(psmouse))
-+ return -1;
-+
-+ if (synaptics_query_hardware(psmouse)) {
-+ printk(KERN_ERR "Unable to query Synaptics hardware.\n");
-+ return -1;
-+ }
-+
-+ if (old_priv.identity != priv->identity ||
-+ old_priv.model_id != priv->model_id ||
-+ old_priv.capabilities != priv->capabilities ||
-+ old_priv.ext_cap != priv->ext_cap)
-+ return -1;
-+
-+ if (synaptics_set_mode(psmouse, 0)) {
-+ printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+int synaptics_detect(struct psmouse *psmouse)
-+{
-+ unsigned char param[4];
-+
-+ param[0] = 0;
-+
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES);
-+ psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO);
-+
-+ return param[1] == 0x47;
-+}
-+
- int synaptics_init(struct psmouse *psmouse)
- {
- struct synaptics_data *priv;
-
--#ifndef CONFIG_MOUSE_PS2_SYNAPTICS
-- return -1;
--#endif
--
- psmouse->private = priv = kmalloc(sizeof(struct synaptics_data), GFP_KERNEL);
- if (!priv)
- return -1;
- memset(priv, 0, sizeof(struct synaptics_data));
-
- if (synaptics_query_hardware(psmouse)) {
-- printk(KERN_ERR "Unable to query/initialize Synaptics hardware.\n");
-+ printk(KERN_ERR "Unable to query Synaptics hardware.\n");
- goto init_fail;
- }
-
-+ if (synaptics_set_mode(psmouse, 0)) {
-+ printk(KERN_ERR "Unable to initialize Synaptics hardware.\n");
-+ goto init_fail;
-+ }
-+
-+ if (SYN_CAP_EXTENDED(priv->capabilities) && SYN_CAP_PASS_THROUGH(priv->capabilities))
-+ synaptics_pt_create(psmouse);
-+
- print_ident(priv);
- set_input_params(&psmouse->dev, priv);
-
-+ psmouse->disconnect = synaptics_disconnect;
-+ psmouse->reconnect = synaptics_reconnect;
-+
- return 0;
-
- init_fail:
-@@ -399,36 +449,13 @@ int synaptics_init(struct psmouse *psmou
- return -1;
- }
-
--void synaptics_disconnect(struct psmouse *psmouse)
--{
-- struct synaptics_data *priv = psmouse->private;
--
-- if (psmouse->type == PSMOUSE_SYNAPTICS && priv) {
-- synaptics_mode_cmd(psmouse, 0);
-- if (priv->ptport) {
-- serio_unregister_slave_port(priv->ptport);
-- kfree(priv->ptport);
-- }
-- kfree(priv);
-- }
--}
--
- /*****************************************************************************
- * Functions to interpret the absolute mode packets
- ****************************************************************************/
-
- static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data *priv, struct synaptics_hw_state *hw)
- {
-- hw->up = 0;
-- hw->down = 0;
-- hw->b0 = 0;
-- hw->b1 = 0;
-- hw->b2 = 0;
-- hw->b3 = 0;
-- hw->b4 = 0;
-- hw->b5 = 0;
-- hw->b6 = 0;
-- hw->b7 = 0;
-+ memset(hw, 0, sizeof(struct synaptics_hw_state));
-
- if (SYN_MODEL_NEWABS(priv->model_id)) {
- hw->x = (((buf[3] & 0x10) << 8) |
-@@ -526,16 +553,19 @@ static void synaptics_process_packet(str
- finger_width = 0;
- }
-
-- /* Post events */
-+ /* Post events
-+ * BTN_TOUCH has to be first as mousedev relies on it when doing
-+ * absolute -> relative conversion
-+ */
-+ if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1);
-+ if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0);
-+
- if (hw.z > 0) {
- input_report_abs(dev, ABS_X, hw.x);
- input_report_abs(dev, ABS_Y, YMAX_NOMINAL + YMIN_NOMINAL - hw.y);
- }
- input_report_abs(dev, ABS_PRESSURE, hw.z);
-
-- if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1);
-- if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0);
--
- input_report_abs(dev, ABS_TOOL_WIDTH, finger_width);
- input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1);
- input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2);
-@@ -570,64 +600,47 @@ static void synaptics_process_packet(str
- input_sync(dev);
- }
-
-+static int synaptics_validate_byte(struct psmouse *psmouse)
-+{
-+ static unsigned char newabs_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 };
-+ static unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 };
-+ static unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 };
-+ static unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 };
-+ struct synaptics_data *priv = psmouse->private;
-+ int idx = psmouse->pktcnt - 1;
-+
-+ if (SYN_MODEL_NEWABS(priv->model_id))
-+ return (psmouse->packet[idx] & newabs_mask[idx]) == newabs_rslt[idx];
-+ else
-+ return (psmouse->packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx];
-+}
-+
- void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
- {
- struct input_dev *dev = &psmouse->dev;
- struct synaptics_data *priv = psmouse->private;
-- unsigned char data = psmouse->packet[psmouse->pktcnt - 1];
-- int newabs = SYN_MODEL_NEWABS(priv->model_id);
-
- input_regs(dev, regs);
-
-- switch (psmouse->pktcnt) {
-- case 1:
-- if (newabs ? ((data & 0xC8) != 0x80) : ((data & 0xC0) != 0xC0)) {
-- printk(KERN_WARNING "Synaptics driver lost sync at 1st byte\n");
-- goto bad_sync;
-- }
-- break;
-- case 2:
-- if (!newabs && ((data & 0x60) != 0x00)) {
-- printk(KERN_WARNING "Synaptics driver lost sync at 2nd byte\n");
-- goto bad_sync;
-- }
-- break;
-- case 4:
-- if (newabs ? ((data & 0xC8) != 0xC0) : ((data & 0xC0) != 0x80)) {
-- printk(KERN_WARNING "Synaptics driver lost sync at 4th byte\n");
-- goto bad_sync;
-- }
-- break;
-- case 5:
-- if (!newabs && ((data & 0x60) != 0x00)) {
-- printk(KERN_WARNING "Synaptics driver lost sync at 5th byte\n");
-- goto bad_sync;
-- }
-- break;
-- default:
-- if (psmouse->pktcnt < 6)
-- break; /* Wait for full packet */
--
-+ if (psmouse->pktcnt >= 6) { /* Full packet received */
- if (priv->out_of_sync) {
- priv->out_of_sync = 0;
- printk(KERN_NOTICE "Synaptics driver resynced.\n");
- }
-
-- if (priv->ptport && synaptics_is_pt_packet(psmouse->packet))
-- synaptics_pass_pt_packet(priv->ptport, psmouse->packet);
-+ if (psmouse->ptport && psmouse->ptport->serio.dev && synaptics_is_pt_packet(psmouse->packet))
-+ synaptics_pass_pt_packet(&psmouse->ptport->serio, psmouse->packet);
- else
- synaptics_process_packet(psmouse);
--
- psmouse->pktcnt = 0;
-- break;
-- }
-- return;
-
-- bad_sync:
-- priv->out_of_sync++;
-- psmouse->pktcnt = 0;
-- if (psmouse_resetafter > 0 && priv->out_of_sync == psmouse_resetafter) {
-- psmouse->state = PSMOUSE_IGNORE;
-- serio_rescan(psmouse->serio);
-+ } else if (psmouse->pktcnt && !synaptics_validate_byte(psmouse)) {
-+ printk(KERN_WARNING "Synaptics driver lost sync at byte %d\n", psmouse->pktcnt);
-+ psmouse->pktcnt = 0;
-+ if (++priv->out_of_sync == psmouse_resetafter) {
-+ psmouse->state = PSMOUSE_IGNORE;
-+ printk(KERN_NOTICE "synaptics: issuing reconnect request\n");
-+ serio_reconnect(psmouse->serio);
-+ }
- }
- }
---- linux-2.6.0/drivers/input/mouse/synaptics.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/input/mouse/synaptics.h 2003-12-28 23:21:27.000000000 -0800
-@@ -9,11 +9,9 @@
- #ifndef _SYNAPTICS_H
- #define _SYNAPTICS_H
-
--
- extern void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs);
-+extern int synaptics_detect(struct psmouse *psmouse);
- extern int synaptics_init(struct psmouse *psmouse);
--extern int synaptics_pt_init(struct psmouse *psmouse);
--extern void synaptics_disconnect(struct psmouse *psmouse);
-
- /* synaptics queries */
- #define SYN_QUE_IDENTIFY 0x00
-@@ -105,8 +103,6 @@ struct synaptics_data {
- /* Data for normal processing */
- unsigned int out_of_sync; /* # of packets out of sync */
- int old_w; /* Previous w value */
--
-- struct serio *ptport; /* pass-through port */
- };
-
- #endif /* _SYNAPTICS_H */
---- linux-2.6.0/drivers/input/serio/i8042.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/input/serio/i8042.c 2003-12-28 23:21:30.000000000 -0800
-@@ -12,11 +12,14 @@
-
- #include <linux/delay.h>
- #include <linux/module.h>
-+#include <linux/moduleparam.h>
- #include <linux/interrupt.h>
- #include <linux/ioport.h>
- #include <linux/config.h>
- #include <linux/reboot.h>
- #include <linux/init.h>
-+#include <linux/sysdev.h>
-+#include <linux/pm.h>
- #include <linux/serio.h>
-
- #include <asm/io.h>
-@@ -25,19 +28,23 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@s
- MODULE_DESCRIPTION("i8042 keyboard and mouse controller driver");
- MODULE_LICENSE("GPL");
-
--MODULE_PARM(i8042_noaux, "1i");
--MODULE_PARM(i8042_nomux, "1i");
--MODULE_PARM(i8042_unlock, "1i");
--MODULE_PARM(i8042_reset, "1i");
--MODULE_PARM(i8042_direct, "1i");
--MODULE_PARM(i8042_dumbkbd, "1i");
--
--static int i8042_reset;
--static int i8042_noaux;
--static int i8042_nomux;
--static int i8042_unlock;
--static int i8042_direct;
--static int i8042_dumbkbd;
-+static unsigned int i8042_noaux;
-+module_param(i8042_noaux, bool, 0);
-+
-+static unsigned int i8042_nomux;
-+module_param(i8042_nomux, bool, 0);
-+
-+static unsigned int i8042_unlock;
-+module_param(i8042_unlock, bool, 0);
-+
-+static unsigned int i8042_reset;
-+module_param(i8042_reset, bool, 0);
-+
-+static unsigned int i8042_direct;
-+module_param(i8042_direct, bool, 0);
-+
-+static unsigned int i8042_dumbkbd;
-+module_param(i8042_dumbkbd, bool, 0);
-
- #undef DEBUG
- #include "i8042.h"
-@@ -59,6 +66,9 @@ static struct serio i8042_aux_port;
- static unsigned char i8042_initial_ctr;
- static unsigned char i8042_ctr;
- static unsigned char i8042_mux_open;
-+static unsigned char i8042_mux_present;
-+static unsigned char i8042_sysdev_initialized;
-+static struct pm_dev *i8042_pm_dev;
- struct timer_list i8042_timer;
-
- /*
-@@ -214,16 +224,41 @@ static int i8042_aux_write(struct serio
- }
-
- /*
-- * i8042_open() is called when a port is open by the higher layer.
-- * It allocates the interrupt and enables it in the chip.
-+ * i8042_activate_port() enables port on a chip.
- */
-
--static int i8042_open(struct serio *port)
-+static int i8042_activate_port(struct serio *port)
- {
- struct i8042_values *values = port->driver;
-
- i8042_flush();
-
-+ /*
-+ * Enable port again here because it is disabled if we are
-+ * resuming (normally it is enabled already).
-+ */
-+ i8042_ctr &= ~values->disable;
-+
-+ i8042_ctr |= values->irqen;
-+
-+ if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-+ i8042_ctr &= ~values->irqen;
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/*
-+ * i8042_open() is called when a port is open by the higher layer.
-+ * It allocates the interrupt and calls i8042_enable_port.
-+ */
-+
-+static int i8042_open(struct serio *port)
-+{
-+ struct i8042_values *values = port->driver;
-+
- if (values->mux != -1)
- if (i8042_mux_open++)
- return 0;
-@@ -231,21 +266,26 @@ static int i8042_open(struct serio *port
- if (request_irq(values->irq, i8042_interrupt,
- SA_SHIRQ, "i8042", i8042_request_irq_cookie)) {
- printk(KERN_ERR "i8042.c: Can't get irq %d for %s, unregistering the port.\n", values->irq, values->name);
-- values->exists = 0;
-- serio_unregister_port(port);
-- return -1;
-+ goto irq_fail;
- }
-
-- i8042_ctr |= values->irqen;
--
-- if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-- printk(KERN_ERR "i8042.c: Can't write CTR while opening %s.\n", values->name);
-- return -1;
-+ if (i8042_activate_port(port)) {
-+ printk(KERN_ERR "i8042.c: Can't activate %s, unregistering the port\n", values->name);
-+ goto activate_fail;
- }
-
- i8042_interrupt(0, NULL, NULL);
-
- return 0;
-+
-+activate_fail:
-+ free_irq(values->irq, i8042_request_irq_cookie);
-+
-+irq_fail:
-+ values->exists = 0;
-+ serio_unregister_port_delayed(port);
-+
-+ return -1;
- }
-
- /*
-@@ -393,145 +433,78 @@ static irqreturn_t i8042_interrupt(int i
- }
-
- /*
-- * i8042_controller init initializes the i8042 controller, and,
-- * most importantly, sets it into non-xlated mode if that's
-- * desired.
-+ * i8042_enable_mux_mode checks whether the controller has an active
-+ * multiplexor and puts the chip into Multiplexed (as opposed to
-+ * Legacy) mode.
- */
--
--static int __init i8042_controller_init(void)
-+
-+static int i8042_enable_mux_mode(struct i8042_values *values, unsigned char *mux_version)
- {
-
-+ unsigned char param;
- /*
-- * Test the i8042. We need to know if it thinks it's working correctly
-- * before doing anything else.
-+ * Get rid of bytes in the queue.
- */
-
- i8042_flush();
-
-- if (i8042_reset) {
--
-- unsigned char param;
--
-- if (i8042_command(¶m, I8042_CMD_CTL_TEST)) {
-- printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
-- return -1;
-- }
--
-- if (param != I8042_RET_CTL_TEST) {
-- printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
-- param, I8042_RET_CTL_TEST);
-- return -1;
-- }
-- }
--
- /*
-- * Save the CTR for restoral on unload / reboot.
-+ * Internal loopback test - send three bytes, they should come back from the
-+ * mouse interface, the last should be version. Note that we negate mouseport
-+ * command responses for the i8042_check_aux() routine.
- */
-
-- if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) {
-- printk(KERN_ERR "i8042.c: Can't read CTR while initializing i8042.\n");
-+ param = 0xf0;
-+ if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0x0f)
- return -1;
-- }
--
-- i8042_initial_ctr = i8042_ctr;
--
--/*
-- * Disable the keyboard interface and interrupt.
-- */
--
-- i8042_ctr |= I8042_CTR_KBDDIS;
-- i8042_ctr &= ~I8042_CTR_KBDINT;
--
--/*
-- * Handle keylock.
-- */
--
-- if (~i8042_read_status() & I8042_STR_KEYLOCK) {
-- if (i8042_unlock)
-- i8042_ctr |= I8042_CTR_IGNKEYLOCK;
-- else
-- printk(KERN_WARNING "i8042.c: Warning: Keylock active.\n");
-- }
--
--/*
-- * If the chip is configured into nontranslated mode by the BIOS, don't
-- * bother enabling translating and be happy.
-- */
--
-- if (~i8042_ctr & I8042_CTR_XLATE)
-- i8042_direct = 1;
--
--/*
-- * Set nontranslated mode for the kbd interface if requested by an option.
-- * After this the kbd interface becomes a simple serial in/out, like the aux
-- * interface is. We don't do this by default, since it can confuse notebook
-- * BIOSes.
-- */
--
-- if (i8042_direct) {
-- i8042_ctr &= ~I8042_CTR_XLATE;
-- i8042_kbd_port.type = SERIO_8042;
-- }
--
--/*
-- * Write CTR back.
-- */
--
-- if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-- printk(KERN_ERR "i8042.c: Can't write CTR while initializing i8042.\n");
-+ param = 0x56;
-+ if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0xa9)
- return -1;
-- }
-+ param = 0xa4;
-+ if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param == 0x5b)
-+ return -1;
-+
-+ if (mux_version)
-+ *mux_version = ~param;
-
- return 0;
- }
-
-+
- /*
-- * Here we try to reset everything back to a state in which the BIOS will be
-- * able to talk to the hardware when rebooting.
-+ * i8042_enable_mux_ports enables 4 individual AUX ports after
-+ * the controller has been switched into Multiplexed mode
- */
-
--void i8042_controller_cleanup(void)
-+static int i8042_enable_mux_ports(struct i8042_values *values)
- {
-+ unsigned char param;
- int i;
--
-- i8042_flush();
--
- /*
-- * Reset anything that is connected to the ports.
-- */
--
-- if (i8042_kbd_values.exists)
-- serio_cleanup(&i8042_kbd_port);
--
-- if (i8042_aux_values.exists)
-- serio_cleanup(&i8042_aux_port);
--
-- for (i = 0; i < 4; i++)
-- if (i8042_mux_values[i].exists)
-- serio_cleanup(i8042_mux_port + i);
--
--/*
-- * Reset the controller.
-+ * Disable all muxed ports by disabling AUX.
- */
-
-- if (i8042_reset) {
-- unsigned char param;
-+ i8042_ctr |= I8042_CTR_AUXDIS;
-+ i8042_ctr &= ~I8042_CTR_AUXINT;
-
-- if (i8042_command(¶m, I8042_CMD_CTL_TEST))
-- printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
-+ if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-+ printk(KERN_ERR "i8042.c: Failed to disable AUX port, can't use MUX.\n");
-+ return -1;
- }
-
- /*
-- * Restore the original control register setting.
-+ * Enable all muxed ports.
- */
-
-- i8042_ctr = i8042_initial_ctr;
--
-- if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
-- printk(KERN_WARNING "i8042.c: Can't restore CTR.\n");
-+ for (i = 0; i < 4; i++) {
-+ i8042_command(¶m, I8042_CMD_MUX_PFX + i);
-+ i8042_command(¶m, I8042_CMD_AUX_ENABLE);
-+ }
-
-+ return 0;
- }
-
-+
- /*
- * i8042_check_mux() checks whether the controller supports the PS/2 Active
- * Multiplexing specification by Synaptics, Phoenix, Insyde and
-@@ -540,66 +513,31 @@ void i8042_controller_cleanup(void)
-
- static int __init i8042_check_mux(struct i8042_values *values)
- {
-- unsigned char param;
- static int i8042_check_mux_cookie;
-- int i;
-+ unsigned char mux_version;
-
- /*
- * Check if AUX irq is available.
- */
--
- if (request_irq(values->irq, i8042_interrupt, SA_SHIRQ,
- "i8042", &i8042_check_mux_cookie))
- return -1;
- free_irq(values->irq, &i8042_check_mux_cookie);
-
--/*
-- * Get rid of bytes in the queue.
-- */
--
-- i8042_flush();
--
--/*
-- * Internal loopback test - send three bytes, they should come back from the
-- * mouse interface, the last should be version. Note that we negate mouseport
-- * command responses for the i8042_check_aux() routine.
-- */
--
-- param = 0xf0;
-- if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0x0f)
-- return -1;
-- param = 0x56;
-- if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0xa9)
-- return -1;
-- param = 0xa4;
-- if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param == 0x5b)
-+ if (i8042_enable_mux_mode(values, &mux_version))
- return -1;
-
- printk(KERN_INFO "i8042.c: Detected active multiplexing controller, rev %d.%d.\n",
-- (~param >> 4) & 0xf, ~param & 0xf);
--
--/*
-- * Disable all muxed ports by disabling AUX.
-- */
--
-- i8042_ctr |= I8042_CTR_AUXDIS;
-- i8042_ctr &= ~I8042_CTR_AUXINT;
-+ (mux_version >> 4) & 0xf, mux_version & 0xf);
-
-- if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
-+ if (i8042_enable_mux_ports(values))
- return -1;
-
--/*
-- * Enable all muxed ports.
-- */
--
-- for (i = 0; i < 4; i++) {
-- i8042_command(¶m, I8042_CMD_MUX_PFX + i);
-- i8042_command(¶m, I8042_CMD_AUX_ENABLE);
-- }
--
-+ i8042_mux_present = 1;
- return 0;
- }
-
-+
- /*
- * i8042_check_aux() applies as much paranoia as it can at detecting
- * the presence of an AUX interface.
-@@ -675,6 +613,7 @@ static int __init i8042_check_aux(struct
- return 0;
- }
-
-+
- /*
- * i8042_port_register() marks the device as existing,
- * registers it, and reports to the user.
-@@ -691,63 +630,205 @@ static int __init i8042_port_register(st
- return -1;
- }
-
-- serio_register_port(port);
--
- printk(KERN_INFO "serio: i8042 %s port at %#lx,%#lx irq %d\n",
- values->name,
- (unsigned long) I8042_DATA_REG,
- (unsigned long) I8042_COMMAND_REG,
- values->irq);
-
-+ serio_register_port(port);
-+
- return 0;
- }
-
-+
- static void i8042_timer_func(unsigned long data)
- {
- i8042_interrupt(0, NULL, NULL);
- mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
- }
-
--#ifndef MODULE
--static int __init i8042_setup_reset(char *str)
--{
-- i8042_reset = 1;
-- return 1;
--}
--static int __init i8042_setup_noaux(char *str)
--{
-- i8042_noaux = 1;
-- i8042_nomux = 1;
-- return 1;
--}
--static int __init i8042_setup_nomux(char *str)
--{
-- i8042_nomux = 1;
-- return 1;
--}
--static int __init i8042_setup_unlock(char *str)
-+
-+/*
-+ * i8042_controller init initializes the i8042 controller, and,
-+ * most importantly, sets it into non-xlated mode if that's
-+ * desired.
-+ */
-+
-+static int i8042_controller_init(void)
- {
-- i8042_unlock = 1;
-- return 1;
-+
-+ if (i8042_noaux)
-+ i8042_nomux = 1;
-+/*
-+ * Test the i8042. We need to know if it thinks it's working correctly
-+ * before doing anything else.
-+ */
-+
-+ i8042_flush();
-+
-+ if (i8042_reset) {
-+
-+ unsigned char param;
-+
-+ if (i8042_command(¶m, I8042_CMD_CTL_TEST)) {
-+ printk(KERN_ERR "i8042.c: i8042 controller self test timeout.\n");
-+ return -1;
-+ }
-+
-+ if (param != I8042_RET_CTL_TEST) {
-+ printk(KERN_ERR "i8042.c: i8042 controller selftest failed. (%#x != %#x)\n",
-+ param, I8042_RET_CTL_TEST);
-+ return -1;
-+ }
-+ }
-+
-+/*
-+ * Save the CTR for restoral on unload / reboot.
-+ */
-+
-+ if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) {
-+ printk(KERN_ERR "i8042.c: Can't read CTR while initializing i8042.\n");
-+ return -1;
-+ }
-+
-+ i8042_initial_ctr = i8042_ctr;
-+
-+/*
-+ * Disable the keyboard interface and interrupt.
-+ */
-+
-+ i8042_ctr |= I8042_CTR_KBDDIS;
-+ i8042_ctr &= ~I8042_CTR_KBDINT;
-+
-+/*
-+ * Handle keylock.
-+ */
-+
-+ if (~i8042_read_status() & I8042_STR_KEYLOCK) {
-+ if (i8042_unlock)
-+ i8042_ctr |= I8042_CTR_IGNKEYLOCK;
-+ else
-+ printk(KERN_WARNING "i8042.c: Warning: Keylock active.\n");
-+ }
-+
-+/*
-+ * If the chip is configured into nontranslated mode by the BIOS, don't
-+ * bother enabling translating and be happy.
-+ */
-+
-+ if (~i8042_ctr & I8042_CTR_XLATE)
-+ i8042_direct = 1;
-+
-+/*
-+ * Set nontranslated mode for the kbd interface if requested by an option.
-+ * After this the kbd interface becomes a simple serial in/out, like the aux
-+ * interface is. We don't do this by default, since it can confuse notebook
-+ * BIOSes.
-+ */
-+
-+ if (i8042_direct) {
-+ i8042_ctr &= ~I8042_CTR_XLATE;
-+ i8042_kbd_port.type = SERIO_8042;
-+ }
-+
-+/*
-+ * Write CTR back.
-+ */
-+
-+ if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
-+ printk(KERN_ERR "i8042.c: Can't write CTR while initializing i8042.\n");
-+ return -1;
-+ }
-+
-+ return 0;
- }
--static int __init i8042_setup_direct(char *str)
-+
-+
-+/*
-+ * Here we try to reset everything back to a state in which the BIOS will be
-+ * able to talk to the hardware when rebooting.
-+ */
-+
-+void i8042_controller_cleanup(void)
- {
-- i8042_direct = 1;
-- return 1;
-+ int i;
-+
-+ i8042_flush();
-+
-+/*
-+ * Reset anything that is connected to the ports.
-+ */
-+
-+ if (i8042_kbd_values.exists)
-+ serio_cleanup(&i8042_kbd_port);
-+
-+ if (i8042_aux_values.exists)
-+ serio_cleanup(&i8042_aux_port);
-+
-+ for (i = 0; i < 4; i++)
-+ if (i8042_mux_values[i].exists)
-+ serio_cleanup(i8042_mux_port + i);
-+
-+/*
-+ * Reset the controller.
-+ */
-+
-+ if (i8042_reset) {
-+ unsigned char param;
-+
-+ if (i8042_command(¶m, I8042_CMD_CTL_TEST))
-+ printk(KERN_ERR "i8042.c: i8042 controller reset timeout.\n");
-+ }
-+
-+/*
-+ * Restore the original control register setting.
-+ */
-+
-+ i8042_ctr = i8042_initial_ctr;
-+
-+ if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR))
-+ printk(KERN_WARNING "i8042.c: Can't restore CTR.\n");
-+
- }
--static int __init i8042_setup_dumbkbd(char *str)
-+
-+
-+/*
-+ * Here we try to reset everything back to a state in which suspended
-+ */
-+
-+static int i8042_controller_resume(void)
- {
-- i8042_dumbkbd = 1;
-- return 1;
-+ int i;
-+
-+ if (i8042_controller_init()) {
-+ printk(KERN_ERR "i8042: resume failed\n");
-+ return -1;
-+ }
-+
-+ if (i8042_mux_present)
-+ if (i8042_enable_mux_mode(&i8042_aux_values, NULL) ||
-+ i8042_enable_mux_ports(&i8042_aux_values)) {
-+ printk(KERN_WARNING "i8042: failed to resume active multiplexor, mouse won't wotk.\n");
-+ }
-+
-+/*
-+ * Reconnect anything that was connected to the ports.
-+ */
-+
-+ if (i8042_kbd_values.exists && i8042_activate_port(&i8042_kbd_port) == 0)
-+ serio_reconnect(&i8042_kbd_port);
-+
-+ if (i8042_aux_values.exists && i8042_activate_port(&i8042_aux_port) == 0)
-+ serio_reconnect(&i8042_aux_port);
-+
-+ for (i = 0; i < 4; i++)
-+ if (i8042_mux_values[i].exists && i8042_activate_port(i8042_mux_port + i) == 0)
-+ serio_reconnect(i8042_mux_port + i);
-+
-+ return 0;
- }
-
--__setup("i8042_reset", i8042_setup_reset);
--__setup("i8042_noaux", i8042_setup_noaux);
--__setup("i8042_nomux", i8042_setup_nomux);
--__setup("i8042_unlock", i8042_setup_unlock);
--__setup("i8042_direct", i8042_setup_direct);
--__setup("i8042_dumbkbd", i8042_setup_dumbkbd);
--#endif
-
- /*
- * We need to reset the 8042 back to original mode on system shutdown,
-@@ -769,6 +850,35 @@ static struct notifier_block i8042_notif
- 0
- };
-
-+/*
-+ * Resume handler for the new PM scheme (driver model)
-+ */
-+static int i8042_resume(struct sys_device *dev)
-+{
-+ return i8042_controller_resume();
-+}
-+
-+static struct sysdev_class kbc_sysclass = {
-+ set_kset_name("i8042"),
-+ .resume = i8042_resume,
-+};
-+
-+static struct sys_device device_i8042 = {
-+ .id = 0,
-+ .cls = &kbc_sysclass,
-+};
-+
-+/*
-+ * Resume handler for the old PM scheme (APM)
-+ */
-+static int i8042_pm_callback(struct pm_dev *dev, pm_request_t request, void *dummy)
-+{
-+ if (request == PM_RESUME)
-+ return i8042_controller_resume();
-+
-+ return 0;
-+}
-+
- static void __init i8042_init_mux_values(struct i8042_values *values, struct serio *port, int index)
- {
- memcpy(port, &i8042_aux_port, sizeof(struct serio));
-@@ -817,6 +927,15 @@ int __init i8042_init(void)
- i8042_timer.function = i8042_timer_func;
- mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
-
-+ if (sysdev_class_register(&kbc_sysclass) == 0) {
-+ if (sys_device_register(&device_i8042) == 0)
-+ i8042_sysdev_initialized = 1;
-+ else
-+ sysdev_class_unregister(&kbc_sysclass);
-+ }
-+
-+ i8042_pm_dev = pm_register(PM_SYS_DEV, PM_SYS_UNKNOWN, i8042_pm_callback);
-+
- register_reboot_notifier(&i8042_notifier);
-
- return 0;
-@@ -828,6 +947,14 @@ void __exit i8042_exit(void)
-
- unregister_reboot_notifier(&i8042_notifier);
-
-+ if (i8042_pm_dev)
-+ pm_unregister(i8042_pm_dev);
-+
-+ if (i8042_sysdev_initialized) {
-+ sys_device_unregister(&device_i8042);
-+ sysdev_class_unregister(&kbc_sysclass);
-+ }
-+
- del_timer(&i8042_timer);
-
- i8042_controller_cleanup();
---- linux-2.6.0/drivers/input/serio/serio.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/input/serio/serio.c 2003-12-28 23:21:30.000000000 -0800
-@@ -49,14 +49,17 @@ MODULE_LICENSE("GPL");
-
- EXPORT_SYMBOL(serio_interrupt);
- EXPORT_SYMBOL(serio_register_port);
--EXPORT_SYMBOL(serio_register_slave_port);
-+EXPORT_SYMBOL(serio_register_port_delayed);
-+EXPORT_SYMBOL(__serio_register_port);
- EXPORT_SYMBOL(serio_unregister_port);
--EXPORT_SYMBOL(serio_unregister_slave_port);
-+EXPORT_SYMBOL(serio_unregister_port_delayed);
-+EXPORT_SYMBOL(__serio_unregister_port);
- EXPORT_SYMBOL(serio_register_device);
- EXPORT_SYMBOL(serio_unregister_device);
- EXPORT_SYMBOL(serio_open);
- EXPORT_SYMBOL(serio_close);
- EXPORT_SYMBOL(serio_rescan);
-+EXPORT_SYMBOL(serio_reconnect);
-
- struct serio_event {
- int type;
-@@ -82,11 +85,23 @@ static void serio_find_dev(struct serio
- }
- }
-
--#define SERIO_RESCAN 1
-+#define SERIO_RESCAN 1
-+#define SERIO_RECONNECT 2
-+#define SERIO_REGISTER_PORT 3
-+#define SERIO_UNREGISTER_PORT 4
-
- static DECLARE_WAIT_QUEUE_HEAD(serio_wait);
- static DECLARE_COMPLETION(serio_exited);
-
-+static void serio_invalidate_pending_events(struct serio *serio)
-+{
-+ struct serio_event *event;
-+
-+ list_for_each_entry(event, &serio_event_list, node)
-+ if (event->serio == serio)
-+ event->serio = NULL;
-+}
-+
- void serio_handle_events(void)
- {
- struct list_head *node, *next;
-@@ -95,17 +110,35 @@ void serio_handle_events(void)
- list_for_each_safe(node, next, &serio_event_list) {
- event = container_of(node, struct serio_event, node);
-
-+ down(&serio_sem);
-+ if (event->serio == NULL)
-+ goto event_done;
-+
- switch (event->type) {
-+ case SERIO_REGISTER_PORT :
-+ __serio_register_port(event->serio);
-+ break;
-+
-+ case SERIO_UNREGISTER_PORT :
-+ __serio_unregister_port(event->serio);
-+ break;
-+
-+ case SERIO_RECONNECT :
-+ if (event->serio->dev && event->serio->dev->reconnect)
-+ if (event->serio->dev->reconnect(event->serio) == 0)
-+ break;
-+ /* reconnect failed - fall through to rescan */
-+
- case SERIO_RESCAN :
-- down(&serio_sem);
- if (event->serio->dev && event->serio->dev->disconnect)
- event->serio->dev->disconnect(event->serio);
- serio_find_dev(event->serio);
-- up(&serio_sem);
- break;
- default:
- break;
- }
-+event_done:
-+ up(&serio_sem);
- list_del_init(node);
- kfree(event);
- }
-@@ -130,18 +163,27 @@ static int serio_thread(void *nothing)
- complete_and_exit(&serio_exited, 0);
- }
-
--void serio_rescan(struct serio *serio)
-+static void serio_queue_event(struct serio *serio, int event_type)
- {
- struct serio_event *event;
-
-- if (!(event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC)))
-- return;
-+ if ((event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC))) {
-+ event->type = event_type;
-+ event->serio = serio;
-+
-+ list_add_tail(&event->node, &serio_event_list);
-+ wake_up(&serio_wait);
-+ }
-+}
-
-- event->type = SERIO_RESCAN;
-- event->serio = serio;
-+void serio_rescan(struct serio *serio)
-+{
-+ serio_queue_event(serio, SERIO_RESCAN);
-+}
-
-- list_add_tail(&event->node, &serio_event_list);
-- wake_up(&serio_wait);
-+void serio_reconnect(struct serio *serio)
-+{
-+ serio_queue_event(serio, SERIO_RECONNECT);
- }
-
- irqreturn_t serio_interrupt(struct serio *serio,
-@@ -163,17 +205,26 @@ irqreturn_t serio_interrupt(struct serio
- void serio_register_port(struct serio *serio)
- {
- down(&serio_sem);
-- list_add_tail(&serio->node, &serio_list);
-- serio_find_dev(serio);
-+ __serio_register_port(serio);
- up(&serio_sem);
- }
-
- /*
-- * Same as serio_register_port but does not try to acquire serio_sem.
-- * Should be used when registering a serio from other input device's
-+ * Submits register request to kseriod for subsequent execution.
-+ * Can be used when it is not obvious whether the serio_sem is
-+ * taken or not and when delayed execution is feasible.
-+ */
-+void serio_register_port_delayed(struct serio *serio)
-+{
-+ serio_queue_event(serio, SERIO_REGISTER_PORT);
-+}
-+
-+/*
-+ * Should only be called directly if serio_sem has already been taken,
-+ * for example when unregistering a serio from other input device's
- * connect() function.
- */
--void serio_register_slave_port(struct serio *serio)
-+void __serio_register_port(struct serio *serio)
- {
- list_add_tail(&serio->node, &serio_list);
- serio_find_dev(serio);
-@@ -182,19 +233,28 @@ void serio_register_slave_port(struct se
- void serio_unregister_port(struct serio *serio)
- {
- down(&serio_sem);
-- list_del_init(&serio->node);
-- if (serio->dev && serio->dev->disconnect)
-- serio->dev->disconnect(serio);
-+ __serio_unregister_port(serio);
- up(&serio_sem);
- }
-
- /*
-- * Same as serio_unregister_port but does not try to acquire serio_sem.
-- * Should be used when unregistering a serio from other input device's
-+ * Submits unregister request to kseriod for subsequent execution.
-+ * Can be used when it is not obvious whether the serio_sem is
-+ * taken or not and when delayed execution is feasible.
-+ */
-+void serio_unregister_port_delayed(struct serio *serio)
-+{
-+ serio_queue_event(serio, SERIO_UNREGISTER_PORT);
-+}
-+
-+/*
-+ * Should only be called directly if serio_sem has already been taken,
-+ * for example when unregistering a serio from other input device's
- * disconnect() function.
- */
--void serio_unregister_slave_port(struct serio *serio)
-+void __serio_unregister_port(struct serio *serio)
- {
-+ serio_invalidate_pending_events(serio);
- list_del_init(&serio->node);
- if (serio->dev && serio->dev->disconnect)
- serio->dev->disconnect(serio);
---- linux-2.6.0/drivers/isdn/eicon/eicon_mod.c 2003-06-14 12:17:58.000000000 -0700
-+++ 25/drivers/isdn/eicon/eicon_mod.c 2003-12-28 23:22:43.000000000 -0800
-@@ -29,6 +29,7 @@
- #include <linux/init.h>
- #ifdef CONFIG_MCA
- #include <linux/mca.h>
-+#include <linux/mca-legacy.h>
- #endif /* CONFIG_MCA */
-
- #include "eicon.h"
---- linux-2.6.0/drivers/isdn/eicon/Kconfig 2003-06-14 12:18:20.000000000 -0700
-+++ 25/drivers/isdn/eicon/Kconfig 2003-12-28 23:22:04.000000000 -0800
-@@ -13,7 +13,7 @@ config ISDN_DRV_EICON
- choice
- prompt "Eicon active card support"
- optional
-- depends on ISDN_DRV_EICON && ISDN
-+ depends on ISDN_DRV_EICON && ISDN && m
-
- config ISDN_DRV_EICON_DIVAS
- tristate "Eicon driver"
---- linux-2.6.0/drivers/isdn/hardware/avm/avm_cs.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/isdn/hardware/avm/avm_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -186,7 +186,7 @@ static dev_link_t *avmcs_attach(void)
- client_reg.event_handler = &avmcs_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- avmcs_detach(link);
-@@ -232,7 +232,7 @@ static void avmcs_detach(dev_link_t *lin
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free pieces */
- *linkp = link->next;
-@@ -251,19 +251,29 @@ static void avmcs_detach(dev_link_t *lin
-
- ======================================================================*/
-
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple,
-+static int get_tuple(client_handle_t handle, tuple_t *tuple,
- cisparse_t *parse)
- {
-- int i;
-- i = CardServices(fn, handle, tuple);
-+ int i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS) return i;
-- i = CardServices(GetTupleData, handle, tuple);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
-+}
-+
-+static int first_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
-+{
-+ int i = pcmcia_get_first_tuple(handle, tuple);
- if (i != CS_SUCCESS) return i;
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return get_tuple(handle, tuple, parse);
- }
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int next_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
-+{
-+ int i = pcmcia_get_next_tuple(handle, tuple);
-+ if (i != CS_SUCCESS) return i;
-+ return get_tuple(handle, tuple, parse);
-+}
-
- static void avmcs_config(dev_link_t *link)
- {
-@@ -287,14 +297,14 @@ static void avmcs_config(dev_link_t *lin
- */
- do {
- tuple.DesiredTuple = CISTPL_CONFIG;
-- i = CardServices(GetFirstTuple, handle, &tuple);
-+ i = pcmcia_get_first_tuple(handle, &tuple);
- if (i != CS_SUCCESS) break;
- tuple.TupleData = buf;
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
-- i = CardServices(GetTupleData, handle, &tuple);
-+ i = pcmcia_get_tuple_data(handle, &tuple);
- if (i != CS_SUCCESS) break;
-- i = CardServices(ParseTuple, handle, &tuple, &parse);
-+ i = pcmcia_parse_tuple(handle, &tuple, &parse);
- if (i != CS_SUCCESS) break;
- link->conf.ConfigBase = parse.config.base;
- } while (0);
-@@ -337,7 +347,7 @@ static void avmcs_config(dev_link_t *lin
- printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n",
- link->io.BasePort1,
- link->io.BasePort1+link->io.NumPorts1-1);
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) goto found_port;
- }
- i = next_tuple(handle, &tuple, &parse);
-@@ -352,21 +362,21 @@ found_port:
- /*
- * allocate an interrupt line
- */
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIRQ, i);
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- break;
- }
-
- /*
- * configure the PCMCIA socket
- */
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- break;
- }
-
-@@ -437,9 +447,9 @@ static void avmcs_release(dev_link_t *li
- link->dev = NULL;
-
- /* Don't bother checking to see if these succeed or not */
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
-
- if (link->state & DEV_STALE_LINK)
-@@ -481,14 +491,14 @@ static int avmcs_event(event_t event, in
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG)
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
- return 0;
---- linux-2.6.0/drivers/isdn/hisax/avma1_cs.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/isdn/hisax/avma1_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -204,7 +204,7 @@ static dev_link_t *avma1cs_attach(void)
- client_reg.event_handler = &avma1cs_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- avma1cs_detach(link);
-@@ -252,7 +252,7 @@ static void avma1cs_detach(dev_link_t *l
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free pieces */
- *linkp = link->next;
-@@ -271,19 +271,29 @@ static void avma1cs_detach(dev_link_t *l
-
- ======================================================================*/
-
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple,
-+static int get_tuple(client_handle_t handle, tuple_t *tuple,
- cisparse_t *parse)
- {
-- int i;
-- i = CardServices(fn, handle, tuple);
-+ int i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS) return i;
-- i = CardServices(GetTupleData, handle, tuple);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
-+}
-+
-+static int first_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
-+{
-+ int i = pcmcia_get_first_tuple(handle, tuple);
- if (i != CS_SUCCESS) return i;
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return get_tuple(handle, tuple, parse);
- }
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int next_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
-+{
-+ int i = pcmcia_get_next_tuple(handle, tuple);
-+ if (i != CS_SUCCESS) return i;
-+ return get_tuple(handle, tuple, parse);
-+}
-
- static void avma1cs_config(dev_link_t *link)
- {
-@@ -308,14 +318,14 @@ static void avma1cs_config(dev_link_t *l
- */
- do {
- tuple.DesiredTuple = CISTPL_CONFIG;
-- i = CardServices(GetFirstTuple, handle, &tuple);
-+ i = pcmcia_get_first_tuple(handle, &tuple);
- if (i != CS_SUCCESS) break;
- tuple.TupleData = buf;
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
-- i = CardServices(GetTupleData, handle, &tuple);
-+ i = pcmcia_get_tuple_data(handle, &tuple);
- if (i != CS_SUCCESS) break;
-- i = CardServices(ParseTuple, handle, &tuple, &parse);
-+ i = pcmcia_parse_tuple(handle, &tuple, &parse);
- if (i != CS_SUCCESS) break;
- link->conf.ConfigBase = parse.config.base;
- } while (0);
-@@ -358,7 +368,7 @@ static void avma1cs_config(dev_link_t *l
- printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n",
- link->io.BasePort1,
- link->io.BasePort1+link->io.NumPorts1 - 1);
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) goto found_port;
- }
- i = next_tuple(handle, &tuple, &parse);
-@@ -373,21 +383,21 @@ found_port:
- /*
- * allocate an interrupt line
- */
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIRQ, i);
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- break;
- }
-
- /*
- * configure the PCMCIA socket
- */
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- break;
- }
-
-@@ -445,9 +455,9 @@ static void avma1cs_release(dev_link_t *
- link->dev = NULL;
-
- /* Don't bother checking to see if these succeed or not */
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
-
- if (link->state & DEV_STALE_LINK)
-@@ -490,14 +500,14 @@ static int avma1cs_event(event_t event,
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG)
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
- return 0;
---- linux-2.6.0/drivers/isdn/hisax/elsa_cs.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/isdn/hisax/elsa_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -235,7 +235,7 @@ static dev_link_t *elsa_cs_attach(void)
- client_reg.event_handler = &elsa_cs_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- elsa_cs_detach(link);
-@@ -286,7 +286,7 @@ static void elsa_cs_detach(dev_link_t *l
-
- /* Break the link with Card Services */
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -304,19 +304,29 @@ static void elsa_cs_detach(dev_link_t *l
- device available to the system.
-
- ======================================================================*/
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple,
-+static int get_tuple(client_handle_t handle, tuple_t *tuple,
- cisparse_t *parse)
- {
-- int i;
-- i = CardServices(fn, handle, tuple);
-+ int i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS) return i;
-- i = CardServices(GetTupleData, handle, tuple);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
-+}
-+
-+static int first_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
-+{
-+ int i = pcmcia_get_first_tuple(handle, tuple);
- if (i != CS_SUCCESS) return i;
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return get_tuple(handle, tuple, parse);
- }
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int next_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
-+{
-+ int i = pcmcia_get_next_tuple(handle, tuple);
-+ if (i != CS_SUCCESS) return i;
-+ return get_tuple(handle, tuple, parse);
-+}
-
- static void elsa_cs_config(dev_link_t *link)
- {
-@@ -362,14 +372,14 @@ static void elsa_cs_config(dev_link_t *l
- printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n");
- link->conf.ConfigIndex = cf->index;
- link->io.BasePort1 = cf->io.win[0].base;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- } else {
- printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n");
- link->conf.ConfigIndex = cf->index;
- for (i = 0, j = 0x2f0; j > 0x100; j -= 0x10) {
- link->io.BasePort1 = j;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- break;
-@@ -382,14 +392,14 @@ static void elsa_cs_config(dev_link_t *l
- goto cs_failed;
- }
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- link->irq.AssignedIRQ = 0;
- last_fn = RequestIRQ;
- goto cs_failed;
- }
-
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- last_fn = RequestConfiguration;
- goto cs_failed;
-@@ -447,10 +457,10 @@ static void elsa_cs_release(dev_link_t *
-
- /* Don't bother checking to see if these succeed or not */
- if (link->win)
-- CardServices(ReleaseWindow, link->win);
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_window(link->win);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
-
- if (link->state & DEV_STALE_LINK)
-@@ -499,14 +509,14 @@ static int elsa_cs_event(event_t event,
- /* Mark the device as stopped, to block IO until later */
- dev->busy = 1;
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG)
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- dev->busy = 0;
- break;
- }
---- linux-2.6.0/drivers/isdn/hisax/sedlbauer_cs.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/isdn/hisax/sedlbauer_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -247,7 +247,7 @@ static dev_link_t *sedlbauer_attach(void
- client_reg.event_handler = &sedlbauer_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- sedlbauer_detach(link);
-@@ -295,7 +295,7 @@ static void sedlbauer_detach(dev_link_t
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, and free it */
- *linkp = link->next;
-@@ -310,12 +310,8 @@ static void sedlbauer_detach(dev_link_t
- device available to the system.
-
- ======================================================================*/
--
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn),args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void sedlbauer_config(dev_link_t *link)
- {
-@@ -341,9 +337,9 @@ static void sedlbauer_config(dev_link_t
- tuple.TupleData = buf;
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -351,7 +347,7 @@ static void sedlbauer_config(dev_link_t
- link->state |= DEV_CONFIG;
-
- /* Look up the current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- /*
-@@ -367,12 +363,13 @@ static void sedlbauer_config(dev_link_t
- will only use the CIS to fill in implementation-defined details.
- */
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
- cistpl_cftable_entry_t dflt = { 0 };
- cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
-
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
- if (cfg->index == 0) goto next_entry;
-@@ -425,7 +422,8 @@ static void sedlbauer_config(dev_link_t
- link->io.NumPorts2 = io->win[1].len;
- }
- /* This reserves IO space but doesn't actually enable it */
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
- }
-
- /*
-@@ -451,10 +449,11 @@ static void sedlbauer_config(dev_link_t
- req.Size = 0x1000;
- */
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- CFG_CHECK(RequestWindow, &link->win, &req);
-+ if (pcmcia_request_window(&link->handle, &req, &link->win) != 0)
-+ goto next_entry;
- map.Page = 0; map.CardOffset = mem->win[0].card_addr;
-- CFG_CHECK(MapMemPage, link->win, &map);
-+ if (pcmcia_map_mem_page(link->win, &map) != 0)
-+ goto next_entry;
- }
- /* If we got this far, we're cool! */
- break;
-@@ -462,9 +461,9 @@ static void sedlbauer_config(dev_link_t
- next_entry:
- /* new in dummy.cs 2001/01/28 MN
- if (link->io.NumPorts1)
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- */
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
- /*
-@@ -473,14 +472,14 @@ static void sedlbauer_config(dev_link_t
- irq structure is initialized.
- */
- if (link->conf.Attributes & CONF_ENABLE_IRQ)
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-
- /*
- This actually configures the PCMCIA socket -- setting up
- the I/O windows and the interrupt mapping, and putting the
- card and host interface into "Memory and IO" mode.
- */
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- /*
- At this point, the dev_node_t structure(s) need to be
-@@ -545,12 +544,12 @@ static void sedlbauer_release(dev_link_t
-
- /* Don't bother checking to see if these succeed or not */
- if (link->win)
-- CardServices(ReleaseWindow, link->win);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_window(link->win);
-+ pcmcia_release_configuration(link->handle);
- if (link->io.NumPorts1)
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- if (link->irq.AssignedIRQ)
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
-
- if (link->state & DEV_STALE_LINK)
-@@ -597,14 +596,14 @@ static int sedlbauer_event(event_t event
- /* Mark the device as stopped, to block IO until later */
- dev->stop = 1;
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG)
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- dev->stop = 0;
- /*
- In a normal driver, additional code may go here to restore
---- linux-2.6.0/drivers/isdn/i4l/isdn_ppp_ccp.c 2003-06-22 12:04:44.000000000 -0700
-+++ 25/drivers/isdn/i4l/isdn_ppp_ccp.c 2003-12-28 23:22:27.000000000 -0800
-@@ -557,7 +557,7 @@ ippp_ccp_send_ccp(struct ippp_ccp *ccp,
- }
-
- static LIST_HEAD(ipc_head);
--static spinlock_t ipc_head_lock;
-+static spinlock_t ipc_head_lock = SPIN_LOCK_UNLOCKED;
-
- int
- ippp_ccp_set_compressor(struct ippp_ccp *ccp, int unit,
---- linux-2.6.0/drivers/md/dm.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/md/dm.c 2003-12-28 23:22:20.000000000 -0800
-@@ -160,20 +160,16 @@ static void __exit dm_exit(void)
- /*
- * Block device functions
- */
--static int dm_blk_open(struct inode *inode, struct file *file)
-+static int dm_blk_open(struct block_device *bdev, struct file *file)
- {
-- struct mapped_device *md;
--
-- md = inode->i_bdev->bd_disk->private_data;
-+ struct mapped_device *md = bdev->bd_disk->private_data;
- dm_get(md);
- return 0;
- }
-
--static int dm_blk_close(struct inode *inode, struct file *file)
-+static int dm_blk_close(struct gendisk *disk)
- {
-- struct mapped_device *md;
--
-- md = inode->i_bdev->bd_disk->private_data;
-+ struct mapped_device *md = disk->private_data;
- dm_put(md);
- return 0;
- }
-@@ -666,6 +662,20 @@ static void event_callback(void *context
- up_write(&md->lock);
- }
-
-+static void __set_size(struct gendisk *disk, sector_t size)
-+{
-+ struct block_device *bdev;
-+
-+ set_capacity(disk, size);
-+ bdev = bdget_disk(disk, 0);
-+ if (bdev) {
-+ down(&bdev->bd_inode->i_sem);
-+ i_size_write(bdev->bd_inode, size << SECTOR_SHIFT);
-+ up(&bdev->bd_inode->i_sem);
-+ bdput(bdev);
-+ }
-+}
-+
- static int __bind(struct mapped_device *md, struct dm_table *t)
- {
- request_queue_t *q = md->queue;
-@@ -673,7 +683,7 @@ static int __bind(struct mapped_device *
- md->map = t;
-
- size = dm_table_get_size(t);
-- set_capacity(md->disk, size);
-+ __set_size(md->disk, size);
- if (size == 0)
- return 0;
-
-@@ -692,7 +702,6 @@ static void __unbind(struct mapped_devic
- dm_table_event_callback(md->map, NULL, NULL);
- dm_table_put(md->map);
- md->map = NULL;
-- set_capacity(md->disk, 0);
- }
-
- /*
---- linux-2.6.0/drivers/md/dm.h 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/md/dm.h 2003-12-28 23:22:20.000000000 -0800
-@@ -95,7 +95,7 @@ int dm_suspended(struct mapped_device *m
- * Functions for manipulating a table. Tables are also reference
- * counted.
- *---------------------------------------------------------------*/
--int dm_table_create(struct dm_table **result, int mode);
-+int dm_table_create(struct dm_table **result, int mode, unsigned num_targets);
-
- void dm_table_get(struct dm_table *t);
- void dm_table_put(struct dm_table *t);
---- linux-2.6.0/drivers/md/dm-ioctl-v1.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/md/dm-ioctl-v1.c 2003-12-28 23:22:20.000000000 -0800
-@@ -566,7 +566,7 @@ static int create(struct dm_ioctl *param
- if (r)
- return r;
-
-- r = dm_table_create(&t, get_mode(param));
-+ r = dm_table_create(&t, get_mode(param), param->target_count);
- if (r)
- return r;
-
-@@ -894,7 +894,7 @@ static int reload(struct dm_ioctl *param
- struct mapped_device *md;
- struct dm_table *t;
-
-- r = dm_table_create(&t, get_mode(param));
-+ r = dm_table_create(&t, get_mode(param), param->target_count);
- if (r)
- return r;
-
---- linux-2.6.0/drivers/md/dm-ioctl-v4.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/md/dm-ioctl-v4.c 2003-12-28 23:22:20.000000000 -0800
-@@ -872,7 +872,7 @@ static int table_load(struct dm_ioctl *p
- struct hash_cell *hc;
- struct dm_table *t;
-
-- r = dm_table_create(&t, get_mode(param));
-+ r = dm_table_create(&t, get_mode(param), param->target_count);
- if (r)
- return r;
-
---- linux-2.6.0/drivers/md/dm-table.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/md/dm-table.c 2003-12-28 23:22:21.000000000 -0800
-@@ -12,6 +12,7 @@
- #include <linux/namei.h>
- #include <linux/ctype.h>
- #include <linux/slab.h>
-+#include <linux/interrupt.h>
- #include <asm/atomic.h>
-
- #define MAX_DEPTH 16
-@@ -202,7 +203,7 @@ static int alloc_targets(struct dm_table
- return 0;
- }
-
--int dm_table_create(struct dm_table **result, int mode)
-+int dm_table_create(struct dm_table **result, int mode, unsigned num_targets)
- {
- struct dm_table *t = kmalloc(sizeof(*t), GFP_NOIO);
-
-@@ -213,8 +214,12 @@ int dm_table_create(struct dm_table **re
- INIT_LIST_HEAD(&t->devices);
- atomic_set(&t->holders, 1);
-
-- /* allocate a single nodes worth of targets to begin with */
-- if (alloc_targets(t, KEYS_PER_NODE)) {
-+ if (!num_targets)
-+ num_targets = KEYS_PER_NODE;
-+
-+ num_targets = dm_round_up(num_targets, KEYS_PER_NODE);
-+
-+ if (alloc_targets(t, num_targets)) {
- kfree(t);
- t = NULL;
- return -ENOMEM;
-@@ -626,6 +631,16 @@ static int split_args(int *argc, char **
- return 0;
- }
-
-+static void set_default_limits(struct io_restrictions *rs)
-+{
-+ rs->max_sectors = MAX_SECTORS;
-+ rs->max_phys_segments = MAX_PHYS_SEGMENTS;
-+ rs->max_hw_segments = MAX_HW_SEGMENTS;
-+ rs->hardsect_size = 1 << SECTOR_SHIFT;
-+ rs->max_segment_size = MAX_SEGMENT_SIZE;
-+ rs->seg_boundary_mask = -1;
-+}
-+
- int dm_table_add_target(struct dm_table *t, const char *type,
- sector_t start, sector_t len, char *params)
- {
-@@ -638,6 +653,7 @@ int dm_table_add_target(struct dm_table
-
- tgt = t->targets + t->num_targets;
- memset(tgt, 0, sizeof(*tgt));
-+ set_default_limits(&tgt->limits);
-
- tgt->type = dm_get_target_type(type);
- if (!tgt->type) {
-@@ -731,22 +747,28 @@ int dm_table_complete(struct dm_table *t
- return r;
- }
-
--static spinlock_t _event_lock = SPIN_LOCK_UNLOCKED;
-+static DECLARE_MUTEX(_event_lock);
- void dm_table_event_callback(struct dm_table *t,
- void (*fn)(void *), void *context)
- {
-- spin_lock_irq(&_event_lock);
-+ down(&_event_lock);
- t->event_fn = fn;
- t->event_context = context;
-- spin_unlock_irq(&_event_lock);
-+ up(&_event_lock);
- }
-
- void dm_table_event(struct dm_table *t)
- {
-- spin_lock(&_event_lock);
-+ /*
-+ * You can no longer call dm_table_event() from interrupt
-+ * context, use a bottom half instead.
-+ */
-+ BUG_ON(in_interrupt());
-+
-+ down(&_event_lock);
- if (t->event_fn)
- t->event_fn(t->event_context);
-- spin_unlock(&_event_lock);
-+ up(&_event_lock);
- }
-
- sector_t dm_table_get_size(struct dm_table *t)
---- linux-2.6.0/drivers/md/Kconfig 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/md/Kconfig 2003-12-28 23:22:20.000000000 -0800
-@@ -138,6 +138,7 @@ config BLK_DEV_DM
- config DM_IOCTL_V4
- bool "ioctl interface version 4"
- depends on BLK_DEV_DM
-+ default y
- ---help---
- Recent tools use a new version of the ioctl interface, only
- select this option if you intend using such tools.
---- linux-2.6.0/drivers/md/linear.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/md/linear.c 2003-12-28 23:22:19.000000000 -0800
-@@ -113,8 +113,17 @@ static int linear_run (mddev_t *mddev)
- }
-
- disk->rdev = rdev;
-+
- blk_queue_stack_limits(mddev->queue,
- rdev->bdev->bd_disk->queue);
-+ /* as we don't honour merge_bvec_fn, we must never risk
-+ * violating it, so limit ->max_sector to one PAGE, as
-+ * a one page request is never in violation.
-+ */
-+ if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
-+ mddev->queue->max_sectors > (PAGE_SIZE>>9))
-+ mddev->queue->max_sectors = (PAGE_SIZE>>9);
-+
- disk->size = rdev->size;
- mddev->array_size += rdev->size;
-
---- linux-2.6.0/drivers/md/md.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/md/md.c 2003-12-28 23:21:17.000000000 -0800
-@@ -2360,11 +2360,10 @@ static int set_disk_faulty(mddev_t *mdde
- return 1;
- }
-
--static int md_ioctl(struct inode *inode, struct file *file,
-+static int md_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
- char b[BDEVNAME_SIZE];
-- unsigned int minor = iminor(inode);
- int err = 0;
- struct hd_geometry *loc = (struct hd_geometry *) arg;
- mddev_t *mddev = NULL;
-@@ -2372,11 +2371,6 @@ static int md_ioctl(struct inode *inode,
- if (!capable(CAP_SYS_ADMIN))
- return -EACCES;
-
-- if (minor >= MAX_MD_DEVS) {
-- MD_BUG();
-- return -EINVAL;
-- }
--
- /*
- * Commands dealing with the RAID driver but not any
- * particular array:
-@@ -2405,7 +2399,7 @@ static int md_ioctl(struct inode *inode,
- * Commands creating/starting a new array:
- */
-
-- mddev = inode->i_bdev->bd_inode->u.generic_ip;
-+ mddev = bdev->bd_inode->u.generic_ip;
-
- if (!mddev) {
- BUG();
-@@ -2527,7 +2521,7 @@ static int md_ioctl(struct inode *inode,
- (short *) &loc->cylinders);
- if (err)
- goto abort_unlock;
-- err = put_user (get_start_sect(inode->i_bdev),
-+ err = put_user (get_start_sect(bdev),
- (long *) &loc->start);
- goto done_unlock;
- }
-@@ -2605,12 +2599,12 @@ abort:
- return err;
- }
-
--static int md_open(struct inode *inode, struct file *file)
-+static int md_open(struct block_device *bdev, struct file *file)
- {
- /*
- * Succeed if we can find or allocate a mddev structure.
- */
-- mddev_t *mddev = mddev_find(iminor(inode));
-+ mddev_t *mddev = mddev_find(MINOR(bdev->bd_dev));
- int err = -ENOMEM;
-
- if (!mddev)
-@@ -2621,16 +2615,16 @@ static int md_open(struct inode *inode,
-
- err = 0;
- mddev_unlock(mddev);
-- inode->i_bdev->bd_inode->u.generic_ip = mddev_get(mddev);
-+ bdev->bd_inode->u.generic_ip = mddev_get(mddev);
- put:
- mddev_put(mddev);
- out:
- return err;
- }
-
--static int md_release(struct inode *inode, struct file * file)
-+static int md_release(struct gendisk *disk)
- {
-- mddev_t *mddev = inode->i_bdev->bd_inode->u.generic_ip;
-+ mddev_t *mddev = disk->private_data;
-
- if (!mddev)
- BUG();
---- linux-2.6.0/drivers/md/multipath.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/md/multipath.c 2003-12-28 23:22:19.000000000 -0800
-@@ -273,6 +273,17 @@ static int multipath_add_disk(mddev_t *m
- p->rdev = rdev;
- blk_queue_stack_limits(mddev->queue,
- rdev->bdev->bd_disk->queue);
-+
-+ /* as we don't honour merge_bvec_fn, we must never risk
-+ * violating it, so limit ->max_sector to one PAGE, as
-+ * a one page request is never in violation.
-+ * (Note: it is very unlikely that a device with
-+ * merge_bvec_fn will be involved in multipath.)
-+ */
-+ if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
-+ mddev->queue->max_sectors > (PAGE_SIZE>>9))
-+ mddev->queue->max_sectors = (PAGE_SIZE>>9);
-+
- conf->working_disks++;
- rdev->raid_disk = path;
- rdev->in_sync = 1;
-@@ -410,8 +421,16 @@ static int multipath_run (mddev_t *mddev
-
- disk = conf->multipaths + disk_idx;
- disk->rdev = rdev;
-+
- blk_queue_stack_limits(mddev->queue,
- rdev->bdev->bd_disk->queue);
-+ /* as we don't honour merge_bvec_fn, we must never risk
-+ * violating it, not that we ever expect a device with
-+ * a merge_bvec_fn to be involved in multipath */
-+ if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
-+ mddev->queue->max_sectors > (PAGE_SIZE>>9))
-+ mddev->queue->max_sectors = (PAGE_SIZE>>9);
-+
- if (!rdev->faulty)
- conf->working_disks++;
- }
---- linux-2.6.0/drivers/md/raid0.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/md/raid0.c 2003-12-28 23:22:19.000000000 -0800
-@@ -112,8 +112,18 @@ static int create_strip_zones (mddev_t *
- goto abort;
- }
- zone->dev[j] = rdev1;
-+
- blk_queue_stack_limits(mddev->queue,
- rdev1->bdev->bd_disk->queue);
-+ /* as we don't honour merge_bvec_fn, we must never risk
-+ * violating it, so limit ->max_sector to one PAGE, as
-+ * a one page request is never in violation.
-+ */
-+
-+ if (rdev1->bdev->bd_disk->queue->merge_bvec_fn &&
-+ mddev->queue->max_sectors > (PAGE_SIZE>>9))
-+ mddev->queue->max_sectors = (PAGE_SIZE>>9);
-+
- if (!smallest || (rdev1->size <smallest->size))
- smallest = rdev1;
- cnt++;
-@@ -301,6 +311,22 @@ static int raid0_run (mddev_t *mddev)
- conf->hash_spacing++;
- }
-
-+ /* calculate the max read-ahead size.
-+ * For read-ahead of large files to be effective, we need to
-+ * readahead at least a whole stripe. i.e. number of devices
-+ * multiplied by chunk size.
-+ * If an individual device has an ra_pages greater than the
-+ * chunk size, then we will not drive that device as hard as it
-+ * wants. We consider this a configuration error: a larger
-+ * chunksize should be used in that case.
-+ */
-+ {
-+ int stripe = mddev->raid_disks * mddev->chunk_size / PAGE_CACHE_SIZE;
-+ if (mddev->queue->backing_dev_info.ra_pages < stripe)
-+ mddev->queue->backing_dev_info.ra_pages = stripe;
-+ }
-+
-+
- blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec);
- return 0;
-
---- linux-2.6.0/drivers/md/raid1.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/md/raid1.c 2003-12-28 23:23:02.000000000 -0800
-@@ -56,7 +56,8 @@ static void r1bio_pool_free(void *r1_bio
- kfree(r1_bio);
- }
-
--#define RESYNC_BLOCK_SIZE (64*1024)
-+//#define RESYNC_BLOCK_SIZE (64*1024)
-+#define RESYNC_BLOCK_SIZE PAGE_SIZE
- #define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9)
- #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
- #define RESYNC_WINDOW (2048*1024)
-@@ -677,8 +678,17 @@ static int raid1_add_disk(mddev_t *mddev
- for (mirror=0; mirror < mddev->raid_disks; mirror++)
- if ( !(p=conf->mirrors+mirror)->rdev) {
- p->rdev = rdev;
-+
- blk_queue_stack_limits(mddev->queue,
- rdev->bdev->bd_disk->queue);
-+ /* as we don't honour merge_bvec_fn, we must never risk
-+ * violating it, so limit ->max_sector to one PAGE, as
-+ * a one page request is never in violation.
-+ */
-+ if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
-+ mddev->queue->max_sectors > (PAGE_SIZE>>9))
-+ mddev->queue->max_sectors = (PAGE_SIZE>>9);
-+
- p->head_position = 0;
- rdev->raid_disk = mirror;
- found = 1;
-@@ -1077,8 +1087,17 @@ static int run(mddev_t *mddev)
- disk = conf->mirrors + disk_idx;
-
- disk->rdev = rdev;
-+
- blk_queue_stack_limits(mddev->queue,
- rdev->bdev->bd_disk->queue);
-+ /* as we don't honour merge_bvec_fn, we must never risk
-+ * violating it, so limit ->max_sector to one PAGE, as
-+ * a one page request is never in violation.
-+ */
-+ if (rdev->bdev->bd_disk->queue->merge_bvec_fn &&
-+ mddev->queue->max_sectors > (PAGE_SIZE>>9))
-+ mddev->queue->max_sectors = (PAGE_SIZE>>9);
-+
- disk->head_position = 0;
- if (!rdev->faulty && rdev->in_sync)
- conf->working_disks++;
---- linux-2.6.0/drivers/md/raid5.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/md/raid5.c 2003-12-28 23:22:19.000000000 -0800
-@@ -1587,6 +1587,16 @@ memory = conf->max_nr_stripes * (sizeof(
-
- print_raid5_conf(conf);
-
-+ /* read-ahead size must cover a whole stripe, which is
-+ * (n-1) * chunksize where 'n' is the number of raid devices
-+ */
-+ {
-+ int stripe = (mddev->raid_disks-1) * mddev->chunk_size
-+ / PAGE_CACHE_SIZE;
-+ if (mddev->queue->backing_dev_info.ra_pages < stripe)
-+ mddev->queue->backing_dev_info.ra_pages = stripe;
-+ }
-+
- /* Ok, everything is just fine now */
- mddev->array_size = mddev->size * (mddev->raid_disks - 1);
- return 0;
---- linux-2.6.0/drivers/media/common/saa7146_core.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/media/common/saa7146_core.c 2003-12-28 23:22:37.000000000 -0800
-@@ -45,10 +45,65 @@ static void dump_registers(struct saa714
- #endif
-
- /****************************************************************************
-+ * gpio and debi helper functions
-+ ****************************************************************************/
-+
-+/* write "data" to the gpio-pin "pin" */
-+void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
-+{
-+ u32 value = 0;
-+
-+ /* sanity check */
-+ if(pin > 3)
-+ return;
-+
-+ /* read old register contents */
-+ value = saa7146_read(dev, GPIO_CTRL );
-+
-+ value &= ~(0xff << (8*pin));
-+ value |= (data << (8*pin));
-+
-+ saa7146_write(dev, GPIO_CTRL, value);
-+}
-+
-+/* This DEBI code is based on the saa7146 Stradis driver by Nathan Laredo */
-+int saa7146_wait_for_debi_done(struct saa7146_dev *dev)
-+{
-+ int start;
-+
-+ /* wait for registers to be programmed */
-+ start = jiffies;
-+ while (1) {
-+ if (saa7146_read(dev, MC2) & 2)
-+ break;
-+ if (jiffies-start > HZ/20) {
-+ DEB_S(("timed out while waiting for registers getting programmed\n"));
-+ return -ETIMEDOUT;
-+ }
-+ }
-+
-+ /* wait for transfer to complete */
-+ start = jiffies;
-+ while (1) {
-+ if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
-+ break;
-+ saa7146_read(dev, MC2);
-+ if (jiffies-start > HZ/4) {
-+ DEB_S(("timed out while waiting for transfer completion\n"));
-+ return -ETIMEDOUT;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+/****************************************************************************
- * general helper functions
- ****************************************************************************/
-
--/* this is videobuf_vmalloc_to_sg() from video-buf.c */
-+/* this is videobuf_vmalloc_to_sg() from video-buf.c
-+ make sure virt has been allocated with vmalloc_32(), otherwise the BUG()
-+ may be triggered on highmem machines */
- static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
- {
- struct scatterlist *sglist;
-@@ -84,7 +139,7 @@ char *saa7146_vmalloc_build_pgtable(stru
- {
- struct scatterlist *slist = NULL;
- int pages = (length+PAGE_SIZE-1)/PAGE_SIZE;
-- char *mem = vmalloc(length);
-+ char *mem = vmalloc_32(length);
- int slen = 0;
-
- if (NULL == mem) {
-@@ -103,7 +158,9 @@ char *saa7146_vmalloc_build_pgtable(stru
- }
-
- slen = pci_map_sg(pci,slist,pages,PCI_DMA_FROMDEVICE);
-- saa7146_pgtable_build_single(pci, pt, slist, slen);
-+ if (0 != saa7146_pgtable_build_single(pci, pt, slist, slen)) {
-+ return NULL;
-+ }
-
- /* fixme: here's a memory leak: slist never gets freed by any other
- function ...*/
-@@ -139,7 +196,7 @@ int saa7146_pgtable_alloc(struct pci_dev
- return 0;
- }
-
--void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
-+int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt,
- struct scatterlist *list, int sglen )
- {
- u32 *ptr, fill;
-@@ -148,6 +205,11 @@ void saa7146_pgtable_build_single(struct
-
- BUG_ON( 0 == sglen);
-
-+ if (list->offset > PAGE_SIZE) {
-+ DEB_D(("offset > PAGE_SIZE. this should not happen."));
-+ return -EINVAL;
-+ }
-+
- /* if we have a user buffer, the first page may not be
- aligned to a page boundary. */
- pt->offset = list->offset;
-@@ -177,6 +239,7 @@ void saa7146_pgtable_build_single(struct
- printk("ptr1 %d: 0x%08x\n",i,ptr[i]);
- }
- */
-+ return 0;
- }
-
- /********************************************************************************/
-@@ -322,7 +385,7 @@ static int saa7146_init_one(struct pci_d
- saa7146_write(dev, MC1, MASK_31);
- */
-
-- /* disable alle irqs */
-+ /* disable all irqs */
- saa7146_write(dev, IER, 0);
-
- /* shut down all dma transfers */
-@@ -381,8 +444,8 @@ static int saa7146_init_one(struct pci_d
- dev->module = THIS_MODULE;
- init_waitqueue_head(&dev->i2c_wq);
-
-- /* set some default values */
-- saa7146_write(dev, BCS_CTRL, 0x80400040);
-+ /* set some sane pci arbitrition values */
-+ saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
-
- if( 0 != ext->probe) {
- if( 0 != ext->probe(dev) ) {
-@@ -508,6 +571,7 @@ EXPORT_SYMBOL_GPL(saa7146_pgtable_alloc)
- EXPORT_SYMBOL_GPL(saa7146_pgtable_free);
- EXPORT_SYMBOL_GPL(saa7146_pgtable_build_single);
- EXPORT_SYMBOL_GPL(saa7146_vmalloc_build_pgtable);
-+EXPORT_SYMBOL_GPL(saa7146_wait_for_debi_done);
-
- EXPORT_SYMBOL_GPL(saa7146_setgpio);
-
---- linux-2.6.0/drivers/media/common/saa7146_fops.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/common/saa7146_fops.c 2003-12-28 23:22:37.000000000 -0800
-@@ -86,7 +86,7 @@ void saa7146_buffer_next(struct saa7146_
- return;
- }
-
-- DEB_EE(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
-+ DEB_INT(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
-
- #if DEBUG_SPINLOCKS
- BUG_ON(!spin_is_locked(&dev->slock));
-@@ -98,10 +98,10 @@ void saa7146_buffer_next(struct saa7146_
- if (!list_empty(&q->queue))
- next = list_entry(q->queue.next,struct saa7146_buf, vb.queue);
- q->curr = buf;
-- DEB_D(("next buffer: buf:%p, prev:%p, next:%p\n", buf, q->queue.prev,q->queue.next));
-+ DEB_INT(("next buffer: buf:%p, prev:%p, next:%p\n", buf, q->queue.prev,q->queue.next));
- buf->activate(dev,buf,next);
- } else {
-- DEB_D(("no next buffer. stopping.\n"));
-+ DEB_INT(("no next buffer. stopping.\n"));
- if( 0 != vbi ) {
- /* turn off video-dma3 */
- saa7146_write(dev,MC1, MASK_20);
-@@ -229,10 +229,10 @@ static int fops_open(struct inode *inode
-
- if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
- DEB_S(("initializing vbi...\n"));
-- saa7146_vbi_uops.open(dev,fh);
-+ saa7146_vbi_uops.open(dev,file);
- } else {
- DEB_S(("initializing video...\n"));
-- saa7146_video_uops.open(dev,fh);
-+ saa7146_video_uops.open(dev,file);
- }
-
- result = 0;
-@@ -255,9 +255,9 @@ static int fops_release(struct inode *in
- return -ERESTARTSYS;
-
- if( fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
-- saa7146_vbi_uops.release(dev,fh,file);
-+ saa7146_vbi_uops.release(dev,file);
- } else {
-- saa7146_video_uops.release(dev,fh,file);
-+ saa7146_video_uops.release(dev,file);
- }
-
- module_put(dev->ext->module);
-@@ -372,7 +372,7 @@ void vv_callback(struct saa7146_dev *dev
- {
- u32 isr = status;
-
-- DEB_EE(("dev:%p, isr:0x%08x\n",dev,(u32)status));
-+ DEB_INT(("dev:%p, isr:0x%08x\n",dev,(u32)status));
-
- if (0 != (isr & (MASK_27))) {
- DEB_INT(("irq: RPS0 (0x%08x).\n",isr));
-@@ -410,6 +410,12 @@ int saa7146_vv_init(struct saa7146_dev*
-
- DEB_EE(("dev:%p\n",dev));
-
-+ /* set default values for video parts of the saa7146 */
-+ saa7146_write(dev, BCS_CTRL, 0x80400040);
-+
-+ /* enable video-port pins */
-+ saa7146_write(dev, MC1, (MASK_10 | MASK_26));
-+
- /* save per-device extension data (one extension can
- handle different devices that might need different
- configuration data) */
---- linux-2.6.0/drivers/media/common/saa7146_hlp.c 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/media/common/saa7146_hlp.c 2003-12-28 23:22:37.000000000 -0800
-@@ -660,24 +660,6 @@ void saa7146_set_hps_source_and_sync(str
- vv->current_hps_sync = sync;
- }
-
--/* write "data" to the gpio-pin "pin" */
--void saa7146_set_gpio(struct saa7146_dev *dev, u8 pin, u8 data)
--{
-- u32 value = 0;
--
-- /* sanity check */
-- if(pin > 3)
-- return;
--
-- /* read old register contents */
-- value = saa7146_read(dev, GPIO_CTRL );
--
-- value &= ~(0xff << (8*pin));
-- value |= (data << (8*pin));
--
-- saa7146_write(dev, GPIO_CTRL, value);
--}
--
- /* reprogram hps, enable(1) / disable(0) video */
- void saa7146_set_overlay(struct saa7146_dev *dev, struct saa7146_fh *fh, int v)
- {
-@@ -710,13 +692,15 @@ void saa7146_write_out_dma(struct saa714
- /* calculate starting address */
- where = (which-1)*0x18;
-
-+/*
- if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
- saa7146_write(dev, where, vdma->base_even);
- saa7146_write(dev, where+0x04, vdma->base_odd);
- } else {
-+*/
- saa7146_write(dev, where, vdma->base_odd);
- saa7146_write(dev, where+0x04, vdma->base_even);
-- }
-+// }
- saa7146_write(dev, where+0x08, vdma->prot_addr);
- saa7146_write(dev, where+0x0c, vdma->pitch);
- saa7146_write(dev, where+0x10, vdma->base_page);
-@@ -971,12 +955,13 @@ static void program_capture_engine(struc
- unsigned long e_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_E_FID_A : CMD_E_FID_B;
- unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
-
-+/*
- if( 0 != (dev->ext_vv_data->flags & SAA7146_EXT_SWAP_ODD_EVEN)) {
- unsigned long tmp = e_wait;
- e_wait = o_wait;
- o_wait = tmp;
- }
--
-+*/
- /* wait for o_fid_a/b / e_fid_a/b toggle only if rps register 0 is not set*/
- WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | o_wait);
- WRITE_RPS0(CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait);
---- linux-2.6.0/drivers/media/common/saa7146_i2c.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/media/common/saa7146_i2c.c 2003-12-28 23:22:37.000000000 -0800
-@@ -186,7 +186,7 @@ static int saa7146_i2c_writeout(struct s
- {
- u32 status = 0, mc2 = 0;
- int trial = 0;
-- int timeout;
-+ unsigned long timeout;
-
- /* write out i2c-command */
- DEB_I2C(("before: 0x%08x (status: 0x%08x), %d\n",*dword,saa7146_read(dev, I2C_STATUS), dev->i2c_op));
-@@ -218,7 +218,7 @@ static int saa7146_i2c_writeout(struct s
- if( 0 != mc2 ) {
- break;
- }
-- if (jiffies > timeout) {
-+ if (time_after(jiffies,timeout)) {
- printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for MC2\n");
- return -EIO;
- }
-@@ -233,7 +233,7 @@ static int saa7146_i2c_writeout(struct s
- status = saa7146_i2c_status(dev);
- if ((status & 0x3) != 1)
- break;
-- if (jiffies > timeout) {
-+ if (time_after(jiffies,timeout)) {
- /* this is normal when probing the bus
- * (no answer from nonexisistant device...)
- */
-@@ -301,7 +301,8 @@ int saa7146_i2c_transfer(struct saa7146_
- goto out;
- }
-
-- if (count > 3) short_delay = 1;
-+ if ( count > 3 || 0 != (SAA7146_I2C_SHORT_DELAY & dev->ext->flags) )
-+ short_delay = 1;
-
- do {
- /* reset the i2c-device if necessary */
-@@ -403,19 +404,29 @@ int saa7146_i2c_adapter_prepare(struct s
- {
- DEB_EE(("bitrate: 0x%08x\n",bitrate));
-
-+ /* enable i2c-port pins */
-+ saa7146_write(dev, MC1, (MASK_08 | MASK_24));
-+
- dev->i2c_bitrate = bitrate;
- saa7146_i2c_reset(dev);
-
- if( NULL != i2c_adapter ) {
- memset(i2c_adapter,0,sizeof(struct i2c_adapter));
- strcpy(i2c_adapter->name, dev->name);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+ i2c_adapter->data = dev;
-+#else
- i2c_set_adapdata(i2c_adapter,dev);
-- i2c_adapter->class = I2C_ADAP_CLASS_TV_ANALOG;
-+#endif
- i2c_adapter->algo = &saa7146_algo;
- i2c_adapter->algo_data = NULL;
- i2c_adapter->id = I2C_ALGO_SAA7146;
- i2c_adapter->timeout = SAA7146_I2C_TIMEOUT;
- i2c_adapter->retries = SAA7146_I2C_RETRIES;
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#else
-+ i2c_adapter->class = I2C_ADAP_CLASS_TV_ANALOG;
-+#endif
- }
-
- return 0;
---- linux-2.6.0/drivers/media/common/saa7146_vbi.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/common/saa7146_vbi.c 2003-12-28 23:22:37.000000000 -0800
-@@ -41,7 +41,11 @@ static int vbi_workaround(struct saa7146
- /* wait for vbi_a or vbi_b*/
- if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
- DEB_D(("...using port b\n"));
-+ WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_E_FID_B);
-+ WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_O_FID_B);
-+/*
- WRITE_RPS1(CMD_PAUSE | MASK_09);
-+*/
- } else {
- DEB_D(("...using port a\n"));
- WRITE_RPS1(CMD_PAUSE | MASK_10);
-@@ -137,10 +141,10 @@ void saa7146_set_vbi_capture(struct saa7
- unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
-
- /*
-- vdma3.base_even = (u32)dev->ov_fb.base+2048*70;
-- vdma3.base_odd = (u32)dev->ov_fb.base;
-- vdma3.prot_addr = (u32)dev->ov_fb.base+2048*164;
-- vdma3.pitch = 2048;
-+ vdma3.base_even = 0xc8000000+2560*70;
-+ vdma3.base_odd = 0xc8000000;
-+ vdma3.prot_addr = 0xc8000000+2560*164;
-+ vdma3.pitch = 2560;
- vdma3.base_page = 0;
- vdma3.num_line_byte = (64<<16)|((vbi_pixel_to_capture)<<0); // set above!
- */
-@@ -244,7 +248,9 @@ static int buffer_prepare(struct file *f
- err = videobuf_iolock(dev->pci,&buf->vb,NULL);
- if (err)
- goto oops;
-- saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
-+ err = saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
-+ if (0 != err)
-+ return err;
- }
- buf->vb.state = STATE_PREPARED;
- buf->activate = buffer_activate;
-@@ -303,7 +309,7 @@ static struct videobuf_queue_ops vbi_qop
-
- /* ------------------------------------------------------------------ */
-
--static void vbi_stop(struct saa7146_fh *fh)
-+static void vbi_stop(struct saa7146_fh *fh, struct file *file)
- {
- struct saa7146_dev *dev = fh->dev;
- struct saa7146_vv *vv = dev->vv_data;
-@@ -321,23 +327,29 @@ static void vbi_stop(struct saa7146_fh *
- /* shut down dma 3 transfers */
- saa7146_write(dev, MC1, MASK_20);
-
-+ if (vv->vbi_q.curr) {
-+ saa7146_buffer_finish(dev,&vv->vbi_q,STATE_DONE);
-+ }
-+
-+ videobuf_queue_cancel(file,&fh->vbi_q);
-+
- vv->vbi_streaming = NULL;
-
- del_timer(&vv->vbi_q.timeout);
- del_timer(&fh->vbi_read_timeout);
-
-- DEB_VBI(("out\n"));
- spin_unlock_irqrestore(&dev->slock, flags);
- }
-
- static void vbi_read_timeout(unsigned long data)
- {
-- struct saa7146_fh *fh = (struct saa7146_fh *)data;
-+ struct file *file = (struct file*)data;
-+ struct saa7146_fh *fh = file->private_data;
- struct saa7146_dev *dev = fh->dev;
-
- DEB_VBI(("dev:%p, fh:%p\n",dev, fh));
-
-- vbi_stop(fh);
-+ vbi_stop(fh, file);
- }
-
- static void vbi_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
-@@ -354,10 +366,21 @@ static void vbi_init(struct saa7146_dev
- init_waitqueue_head(&vv->vbi_wq);
- }
-
--static void vbi_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
-+static void vbi_open(struct saa7146_dev *dev, struct file *file)
- {
-+ struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
-+
-+ u32 arbtr_ctrl = saa7146_read(dev, PCI_BT_V1);
-+ int ret = 0;
-+
- DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
-
-+ /* adjust arbitrition control for video dma 3 */
-+ arbtr_ctrl &= ~0x1f0000;
-+ arbtr_ctrl |= 0x1d0000;
-+ saa7146_write(dev, PCI_BT_V1, arbtr_ctrl);
-+ saa7146_write(dev, MC2, (MASK_04|MASK_20));
-+
- memset(&fh->vbi_fmt,0,sizeof(fh->vbi_fmt));
-
- fh->vbi_fmt.sampling_rate = 27000000;
-@@ -380,21 +403,32 @@ static void vbi_open(struct saa7146_dev
-
- init_timer(&fh->vbi_read_timeout);
- fh->vbi_read_timeout.function = vbi_read_timeout;
-- fh->vbi_read_timeout.data = (unsigned long)fh;
-+ fh->vbi_read_timeout.data = (unsigned long)file;
-
-- /* fixme: enable this again, if the dvb-c w/ analog module work properly */
--/*
-- vbi_workaround(dev);
--*/
-+ /* initialize the brs */
-+ if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
-+ saa7146_write(dev, BRS_CTRL, MASK_30|MASK_29 | (7 << 19));
-+ } else {
-+ saa7146_write(dev, BRS_CTRL, 0x00000001);
-+
-+ if (0 != (ret = vbi_workaround(dev))) {
-+ DEB_VBI(("vbi workaround failed!\n"));
-+ /* return ret;*/
-+ }
-+ }
-+
-+ /* upload brs register */
-+ saa7146_write(dev, MC2, (MASK_08|MASK_24));
- }
-
--static void vbi_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
-+static void vbi_close(struct saa7146_dev *dev, struct file *file)
- {
-+ struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
- struct saa7146_vv *vv = dev->vv_data;
- DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
-
- if( fh == vv->vbi_streaming ) {
-- vbi_stop(fh);
-+ vbi_stop(fh, file);
- }
- }
-
---- linux-2.6.0/drivers/media/common/saa7146_video.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/common/saa7146_video.c 2003-12-28 23:22:37.000000000 -0800
-@@ -116,7 +116,7 @@ static int try_win(struct saa7146_dev *d
- DEB_D(("no fb fmt set.\n"));
- return -EINVAL;
- }
-- if (win->w.width < 64 || win->w.height < 64) {
-+ if (win->w.width < 48 || win->w.height < 32) {
- DEB_D(("min width/height. (%d,%d)\n",win->w.width,win->w.height));
- return -EINVAL;
- }
-@@ -661,7 +661,7 @@ static int saa7146_pgtable_build(struct
- */
- } else {
- struct saa7146_pgtable *pt = &buf->pt[0];
-- saa7146_pgtable_build_single(pci, pt, list, length);
-+ return saa7146_pgtable_build_single(pci, pt, list, length);
- }
-
- return 0;
-@@ -704,7 +704,7 @@ static int video_begin(struct saa7146_fh
- return 0;
- }
-
--static int video_end(struct saa7146_fh *fh)
-+static int video_end(struct saa7146_fh *fh, struct file *file)
- {
- struct saa7146_dev *dev = fh->dev;
- struct saa7146_vv *vv = dev->vv_data;
-@@ -735,82 +735,9 @@ static int video_end(struct saa7146_fh *
- saa7146_write(dev, MC1, 0x00700000);
-
- vv->streaming = NULL;
-- spin_unlock_irqrestore(&dev->slock, flags);
--
-- return 0;
--}
--
--/* capturing to framebuffer */
--
--int overlay_reqbufs(struct saa7146_dev *dev, struct v4l2_requestbuffers *req)
--{
--/* struct saa7146_fh *fh = file->private_data;
--
-- if (req->count > VIDEO_MAX_FRAME)
-- req->count = VIDEO_MAX_FRAME;
--
-- *size = fh->video_fmt.sizeimage;
--
--*/
-- return 0;
--}
--int overlay_querybuf(struct saa7146_dev *dev, struct v4l2_buffer *buf)
--{
-- return 0;
--}
--int overlay_qbuf(struct saa7146_dev *dev, struct v4l2_buffer *b)
--{
--/* if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) {
-- DEB_D(("index %d out of bounds.\n",b->index));
-- goto -EINVAL;
-- }
--
-- buf = q->bufs[b->index];
-- if (NULL == buf) {
-- printk("videobuf_qbuf: NULL == buf\n");
-- goto done;
-- }
-- if (0 == buf->baddr) {
-- printk("videobuf_qbuf: 0 == buf->baddr\n");
-- goto done;
-- }
-- if (buf->state == STATE_QUEUED ||
-- buf->state == STATE_ACTIVE) {
-- printk("videobuf_qbuf: already queued or activated.\n");
-- goto done;
-- }
-
-- field = videobuf_next_field(q);
-- retval = q->ops->buf_prepare(file,buf,field);
-- if (0 != retval) {
-- printk("videobuf_qbuf: buf_prepare() failed.\n");
-- goto done;
-- }
--
-- list_add_tail(&buf->stream,&q->stream);
-- if (q->streaming) {
-- spin_lock_irqsave(q->irqlock,flags);
-- q->ops->buf_queue(file,buf);
-- spin_unlock_irqrestore(q->irqlock,flags);
-- }
-- retval = 0;
-+ spin_unlock_irqrestore(&dev->slock, flags);
-
-- done:
-- up(&q->lock);
-- return retval;
--*/
-- return 0;
--}
--int overlay_dqbuf(struct saa7146_dev *dev, struct v4l2_buffer *buf)
--{
-- return 0;
--}
--int overlay_streamon(struct saa7146_dev *dev)
--{
-- return 0;
--}
--int overlay_streamoff(struct saa7146_dev *dev)
--{
- return 0;
- }
-
-@@ -818,7 +745,7 @@ int overlay_streamoff(struct saa7146_dev
- /*
- * This function is _not_ called directly, but from
- * video_generic_ioctl (and maybe others). userspace
-- * copying is done already, arg is a kernel fhinter.
-+ * copying is done already, arg is a kernel pointer.
- */
-
- int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
-@@ -1141,38 +1068,24 @@ int saa7146_video_do_ioctl(struct inode
- case VIDIOC_REQBUFS: {
- struct v4l2_requestbuffers *req = arg;
- DEB_D(("VIDIOC_REQBUFS, type:%d\n",req->type));
--/*
-- if( req->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-- return overlay_reqbufs(dev,req);
-- }
--*/
- return videobuf_reqbufs(file,q,req);
- }
- case VIDIOC_QUERYBUF: {
- struct v4l2_buffer *buf = arg;
- DEB_D(("VIDIOC_QUERYBUF, type:%d, offset:%d\n",buf->type,buf->m.offset));
--/* if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-- return overlay_querybuf(dev,buf);
-- }
-- */ return videobuf_querybuf(q,buf);
-+ return videobuf_querybuf(q,buf);
- }
- case VIDIOC_QBUF: {
- struct v4l2_buffer *buf = arg;
- int ret = 0;
--/* if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-- return overlay_qbuf(dev,buf);
-- }
-- */ ret = videobuf_qbuf(file,q,buf);
-+ ret = videobuf_qbuf(file,q,buf);
- DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,buf->index));
- return ret;
- }
- case VIDIOC_DQBUF: {
- struct v4l2_buffer *buf = arg;
- int ret = 0;
--/* if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-- return overlay_dqbuf(dev,buf);
-- }
-- */ ret = videobuf_dqbuf(file,q,buf);
-+ ret = videobuf_dqbuf(file,q,buf);
- DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,buf->index));
- return ret;
- }
-@@ -1180,29 +1093,18 @@ int saa7146_video_do_ioctl(struct inode
- int *type = arg;
- DEB_D(("VIDIOC_STREAMON, type:%d\n",*type));
-
-- if( 0 != ops->capture_begin ) {
-- if( 0 != (err = ops->capture_begin(fh))) {
-+ if( 0 != (err = video_begin(fh))) {
- return err;
- }
-- }
--/* if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-- err = overlay_streamon(dev);
-- } else { */
- err = videobuf_streamon(file,q);
--/* } */
- return err;
- }
- case VIDIOC_STREAMOFF: {
- int *type = arg;
-
- DEB_D(("VIDIOC_STREAMOFF, type:%d\n",*type));
-- if( 0 != ops->capture_end ) {
-- ops->capture_end(fh);
-- }
--/* if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) {
-- return overlay_streamoff(dev);
-- }
-- */ err = videobuf_streamoff(file,q);
-+ err = videobuf_streamoff(file,q);
-+ video_end(fh, file);
- return err;
- }
- case VIDIOCGMBUF:
-@@ -1267,8 +1169,8 @@ static int buffer_prepare(struct file *f
- DEB_CAP(("vbuf:%p\n",vb));
-
- /* sanity checks */
-- if (fh->video_fmt.width < 64 ||
-- fh->video_fmt.height < 64 ||
-+ if (fh->video_fmt.width < 48 ||
-+ fh->video_fmt.height < 32 ||
- fh->video_fmt.width > vv->standard->h_max_out ||
- fh->video_fmt.height > vv->standard->v_max_out) {
- DEB_D(("w (%d) / h (%d) out of bounds.\n",fh->video_fmt.width,fh->video_fmt.height));
-@@ -1407,8 +1309,9 @@ static void video_init(struct saa7146_de
- }
-
-
--static void video_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
-+static void video_open(struct saa7146_dev *dev, struct file *file)
- {
-+ struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
- struct saa7146_format *sfmt;
-
- fh->video_fmt.width = 384;
-@@ -1429,8 +1332,9 @@ static void video_open(struct saa7146_de
- }
-
-
--static void video_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
-+static void video_close(struct saa7146_dev *dev, struct file *file)
- {
-+ struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
- struct saa7146_vv *vv = dev->vv_data;
- unsigned long flags;
-
-@@ -1443,10 +1347,8 @@ static void video_close(struct saa7146_d
- }
-
- if( fh == vv->streaming ) {
-- video_end(fh);
-+ video_end(fh, file);
- }
--
-- videobuf_queue_cancel(file,&fh->video_q);
- }
-
-
-@@ -1489,7 +1391,7 @@ static ssize_t video_read(struct file *f
- return -EAGAIN;
- }
- ret = videobuf_read_one(file,&fh->video_q , data, count, ppos);
-- video_end(fh);
-+ video_end(fh, file);
-
- /* restart overlay if it was active before */
- if( 0 != restart_overlay ) {
-@@ -1505,6 +1407,4 @@ struct saa7146_use_ops saa7146_video_uop
- .release = video_close,
- .irq_done = video_irq_done,
- .read = video_read,
-- .capture_begin = video_begin,
-- .capture_end = video_end,
- };
---- linux-2.6.0/drivers/media/dvb/b2c2/skystar2.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/media/dvb/b2c2/skystar2.c 2003-12-28 23:22:38.000000000 -0800
-@@ -2,7 +2,19 @@
- * skystar2.c - driver for the Technisat SkyStar2 PCI DVB card
- * based on the FlexCopII by B2C2,Inc.
- *
-- * Copyright (C) 2003 V.C. , skystar@moldova.cc
-+ * Copyright (C) 2003 Vadim Catana, skystar@moldova.cc
-+ *
-+ * FIX: DISEQC Tone Burst in flexcop_diseqc_ioctl()
-+ * FIX: FULL soft DiSEqC for skystar2 (FlexCopII rev 130) VP310 equipped
-+ * Vincenzo Di Massa, hawk.it at tiscalinet.it
-+ *
-+ * Converted to Linux coding style
-+ * Misc reorganization, polishing, restyling
-+ * Roberto Ragusa, r.ragusa at libero.it
-+ *
-+ * Added hardware filtering support,
-+ * Niklas Peinecke, peinecke at gdv.uni-hannover.de
-+ *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
-@@ -27,7 +39,6 @@
-
- #include "dvb_i2c.h"
- #include "dvb_frontend.h"
--#include "dvb_functions.h"
-
- #include <linux/dvb/frontend.h>
- #include <linux/dvb/dmx.h>
-@@ -38,14 +49,20 @@
- #include "demux.h"
- #include "dvb_net.h"
-
-+#include "dvb_functions.h"
-+
- static int debug = 0;
--#define dprintk(x...) do { if (debug) printk(x); } while (0)
-+#define dprintk(x...) do { if (debug>=1) printk(x); } while (0)
-+#define ddprintk(x...) do { if (debug>=2) printk(x); } while (0)
-+static int enable_hw_filters = 2;
-
--#define SizeOfBufDMA1 0x3AC00
--#define SizeOfBufDMA2 0x758
-+#define SIZE_OF_BUF_DMA1 0x3ac00
-+#define SIZE_OF_BUF_DMA2 0x758
-
--struct dmaq {
-+#define MAX_N_HW_FILTERS (6+32)
-+#define N_PID_SLOTS 256
-
-+struct dmaq {
- u32 bus_addr;
- u32 head;
- u32 tail;
-@@ -53,31 +70,19 @@ struct dmaq {
- u8 *buffer;
- };
-
--struct packet_header {
--
-- u32 sync_byte;
-- u32 transport_error_indicator;
-- u32 payload_unit_start_indicator;
-- u32 transport_priority;
-- u32 pid;
-- u32 transport_scrambling_control;
-- u32 adaptation_field_control;
-- u32 continuity_counter;
--};
-
- struct adapter {
--
- struct pci_dev *pdev;
-
- u8 card_revision;
- u32 b2c2_revision;
-- u32 PidFilterMax;
-- u32 MacFilterMax;
-+ u32 pid_filter_max;
-+ u32 mac_filter_max;
- u32 irq;
- unsigned long io_mem;
- unsigned long io_port;
- u8 mac_addr[8];
-- u32 dwSramType;
-+ u32 dw_sram_type;
-
- struct dvb_adapter *dvb_adapter;
- struct dvb_demux demux;
-@@ -95,44 +100,42 @@ struct adapter {
- u32 dma_ctrl;
- u32 dma_status;
-
-- u32 capturing;
-+ int capturing;
-
- spinlock_t lock;
-
-- u16 pids[0x27];
-+ int useable_hw_filters;
-+ u16 hw_pids[MAX_N_HW_FILTERS];
-+ u16 pid_list[N_PID_SLOTS];
-+ int pid_rc[N_PID_SLOTS]; // ref counters for the pids
-+ int pid_count;
-+ int whole_bandwidth_count;
- u32 mac_filter;
- };
-
--#define WriteRegDW(adapter,reg,value) writel(value, adapter->io_mem + reg)
--#define ReadRegDW(adapter,reg) readl(adapter->io_mem + reg)
-+#define write_reg_dw(adapter,reg,value) writel(value, adapter->io_mem + reg)
-+#define read_reg_dw(adapter,reg) readl(adapter->io_mem + reg)
-
--static void WriteRegOp(struct adapter *adapter, u32 reg, u32 operation, u32 andvalue, u32 orvalue)
-+static void write_reg_bitfield(struct adapter *adapter, u32 reg, u32 zeromask, u32 orvalue)
- {
- u32 tmp;
-
-- tmp = ReadRegDW(adapter, reg);
--
-- if (operation == 1)
-- tmp = tmp | orvalue;
-- if (operation == 2)
-- tmp = tmp & andvalue;
-- if (operation == 3)
-- tmp = (tmp & andvalue) | orvalue;
--
-- WriteRegDW(adapter, reg, tmp);
-+ tmp = read_reg_dw(adapter, reg);
-+ tmp = (tmp & ~zeromask) | orvalue;
-+ write_reg_dw(adapter, reg, tmp);
- }
-
- /* i2c functions */
--static int i2cMainWriteForFlex2(struct adapter * adapter, u32 command, u8 * buf, u32 retries)
-+static int i2c_main_write_for_flex2(struct adapter *adapter, u32 command, u8 *buf, int retries)
- {
-- u32 i;
-+ int i;
- u32 value;
-
-- WriteRegDW(adapter, 0x100, 0);
-- WriteRegDW(adapter, 0x100, command);
-+ write_reg_dw(adapter, 0x100, 0);
-+ write_reg_dw(adapter, 0x100, command);
-
- for (i = 0; i < retries; i++) {
-- value = ReadRegDW(adapter, 0x100);
-+ value = read_reg_dw(adapter, 0x100);
-
- if ((value & 0x40000000) == 0) {
- if ((value & 0x81000000) == 0x80000000) {
-@@ -141,11 +144,9 @@ static int i2cMainWriteForFlex2(struct a
-
- return 1;
- }
--
- } else {
--
-- WriteRegDW(adapter, 0x100, 0);
-- WriteRegDW(adapter, 0x100, command);
-+ write_reg_dw(adapter, 0x100, 0);
-+ write_reg_dw(adapter, 0x100, command);
- }
- }
-
-@@ -153,7 +154,7 @@ static int i2cMainWriteForFlex2(struct a
- }
-
- /* device = 0x10000000 for tuner, 0x20000000 for eeprom */
--static void i2cMainSetup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
-+static void i2c_main_setup(u32 device, u32 chip_addr, u8 op, u8 addr, u32 value, u32 len, u32 *command)
- {
- *command = device | ((len - 1) << 26) | (value << 16) | (addr << 8) | chip_addr;
-
-@@ -163,20 +164,20 @@ static void i2cMainSetup(u32 device, u32
- *command = *command | 0x01000000;
- }
-
--static int FlexI2cRead4(struct adapter * adapter, u32 device, u32 chip_addr, u16 addr, u8 * buf, u8 len)
-+static int flex_i2c_read4(struct adapter *adapter, u32 device, u32 chip_addr, u16 addr, u8 *buf, u8 len)
- {
- u32 command;
- u32 value;
-
- int result, i;
-
-- i2cMainSetup(device, chip_addr, 1, addr, 0, len, &command);
-+ i2c_main_setup(device, chip_addr, 1, addr, 0, len, &command);
-
-- result = i2cMainWriteForFlex2(adapter, command, buf, 100000);
-+ result = i2c_main_write_for_flex2(adapter, command, buf, 100000);
-
- if ((result & 0xff) != 0) {
- if (len > 1) {
-- value = ReadRegDW(adapter, 0x104);
-+ value = read_reg_dw(adapter, 0x104);
-
- for (i = 1; i < len; i++) {
- buf[i] = value & 0xff;
-@@ -188,7 +189,7 @@ static int FlexI2cRead4(struct adapter *
- return result;
- }
-
--static int FlexI2cWrite4(struct adapter * adapter, u32 device, u32 chip_addr, u32 addr, u8 * buf, u8 len)
-+static int flex_i2c_write4(struct adapter *adapter, u32 device, u32 chip_addr, u32 addr, u8 *buf, u8 len)
- {
- u32 command;
- u32 value;
-@@ -202,12 +203,12 @@ static int FlexI2cWrite4(struct adapter
- value = value | buf[i - 1];
- }
-
-- WriteRegDW(adapter, 0x104, value);
-+ write_reg_dw(adapter, 0x104, value);
- }
-
-- i2cMainSetup(device, chip_addr, 0, addr, buf[0], len, &command);
-+ i2c_main_setup(device, chip_addr, 0, addr, buf[0], len, &command);
-
-- return i2cMainWriteForFlex2(adapter, command, 0, 100000);
-+ return i2c_main_write_for_flex2(adapter, command, 0, 100000);
- }
-
- static void fixchipaddr(u32 device, u32 bus, u32 addr, u32 *ret)
-@@ -218,13 +219,13 @@ static void fixchipaddr(u32 device, u32
- *ret = bus;
- }
-
--static u32 FLEXI2C_read(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
-+static u32 flex_i2c_read(struct adapter *adapter, u32 device, u32 bus, u32 addr, u8 *buf, u32 len)
- {
- u32 chipaddr;
- u32 bytes_to_transfer;
- u8 *start;
-
--// dprintk("%s:\n", __FUNCTION__);
-+ ddprintk("%s:\n", __FUNCTION__);
-
- start = buf;
-
-@@ -236,7 +237,7 @@ static u32 FLEXI2C_read(struct adapter *
-
- fixchipaddr(device, bus, addr, &chipaddr);
-
-- if (FlexI2cRead4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
-+ if (flex_i2c_read4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
- return buf - start;
-
- buf = buf + bytes_to_transfer;
-@@ -247,13 +248,13 @@ static u32 FLEXI2C_read(struct adapter *
- return buf - start;
- }
-
--static u32 FLEXI2C_write(struct adapter * adapter, u32 device, u32 bus, u32 addr, u8 * buf, u32 len)
-+static u32 flex_i2c_write(struct adapter *adapter, u32 device, u32 bus, u32 addr, u8 *buf, u32 len)
- {
- u32 chipaddr;
- u32 bytes_to_transfer;
- u8 *start;
-
--// dprintk("%s:\n", __FUNCTION__);
-+ ddprintk("%s:\n", __FUNCTION__);
-
- start = buf;
-
-@@ -265,7 +266,7 @@ static u32 FLEXI2C_write(struct adapter
-
- fixchipaddr(device, bus, addr, &chipaddr);
-
-- if (FlexI2cWrite4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
-+ if (flex_i2c_write4(adapter, device, chipaddr, addr, buf, bytes_to_transfer) == 0)
- return buf - start;
-
- buf = buf + bytes_to_transfer;
-@@ -284,75 +285,81 @@ static int master_xfer(struct dvb_i2c_bu
- if (down_interruptible(&tmp->i2c_sem))
- return -ERESTARTSYS;
-
-- if (0) {
-- dprintk("%s:\n", __FUNCTION__);
-+ ddprintk("%s: %d messages to transfer\n", __FUNCTION__, num);
-
- for (i = 0; i < num; i++) {
-- printk("message %d: flags=%x, addr=0x%04x, buf=%p, len=%d \n", i, msgs[i].flags, msgs[i].addr, msgs[i].buf, msgs[i].len);
-- }
-- }
-+ ddprintk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
-+ msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
-
-- /* allow only the vp310 frontend to access the bus */
-- if ((msgs[0].addr != 0x0E) && (msgs[0].addr != 0x61)) {
-+ /* allow only the mt312 and stv0299 frontends to access the bus */
-+ if ((msgs[i].addr != 0x0e) && (msgs[i].addr != 0x68) && (msgs[i].addr != 0x61)) {
- up(&tmp->i2c_sem);
-
- return -EREMOTEIO;
- }
-+ }
-
-- if ((num == 1) && (msgs[0].buf != NULL)) {
-- if (msgs[0].flags == I2C_M_RD) {
-- ret = -EINVAL;
-+ // read command
-+ if ((num == 2) && (msgs[0].flags == 0) && (msgs[1].flags == I2C_M_RD) && (msgs[0].buf != NULL) && (msgs[1].buf != NULL)) {
-
-- } else {
-+ ret = flex_i2c_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
-
-- // single writes do have the reg addr in buf[0] and data in buf[1] to buf[n]
-- ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], &msgs[0].buf[1], msgs[0].len - 1);
-+ up(&tmp->i2c_sem);
-+
-+ if (ret != msgs[1].len) {
-+ printk("%s: read error !\n", __FUNCTION__);
-+
-+ for (i = 0; i < 2; i++) {
-+ printk("message %d: flags=0x%x, addr=0x%x, buf=0x%x, len=%d \n", i,
-+ msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
-+ }
-
-- if (ret != msgs[0].len - 1)
-- ret = -EREMOTEIO;
-- else
-- ret = num;
-+ return -EREMOTEIO;
- }
-
-- } else if ((num == 2) && (msgs[1].buf != NULL)) {
-+ return num;
-+ }
-+ // write command
-+ for (i = 0; i < num; i++) {
-
-- // i2c reads consist of a reg addr _write_ followed by a data read, so msg[1].flags has to be examined
-- if (msgs[1].flags == I2C_M_RD) {
-- ret = FLEXI2C_read(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
-+ if ((msgs[i].flags != 0) || (msgs[i].buf == NULL) || (msgs[i].len < 2))
-+ return -EINVAL;
-
-- } else {
-+ ret = flex_i2c_write(tmp, 0x10000000, msgs[i].addr, msgs[i].buf[0], &msgs[i].buf[1], msgs[i].len - 1);
-
-- ret = FLEXI2C_write(tmp, 0x10000000, msgs[0].addr, msgs[0].buf[0], msgs[1].buf, msgs[1].len);
-+ up(&tmp->i2c_sem);
-+
-+ if (ret != msgs[0].len - 1) {
-+ printk("%s: write error %i !\n", __FUNCTION__, ret);
-+
-+ printk("message %d: flags=0x%x, addr=0x%x, buf[0]=0x%x, len=%d \n", i,
-+ msgs[i].flags, msgs[i].addr, msgs[i].buf[0], msgs[i].len);
-+
-+ return -EREMOTEIO;
- }
-
-- if (ret != msgs[1].len)
-- ret = -EREMOTEIO;
-- else
-- ret = num;
-+ return num;
- }
-
-- up(&tmp->i2c_sem);
-+ printk("%s: unknown command format !\n", __FUNCTION__);
-
-- /* master xfer functions always return the number of successfully
-- transmitted messages, not the number of transmitted bytes.
-- return -EREMOTEIO in case of failure. */
-- return ret;
-+ return -EINVAL;
- }
-
- /* SRAM (Skystar2 rev2.3 has one "ISSI IS61LV256" chip on board,
- but it seems that FlexCopII can work with more than one chip) */
--static void SRAMSetNetDest(struct adapter * adapter, u8 dest)
-+static void sram_set_net_dest(struct adapter *adapter, u8 dest)
- {
- u32 tmp;
-
- udelay(1000);
-
-- tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFFC) | (dest & 3);
-+ tmp = (read_reg_dw(adapter, 0x714) & 0xfffffffc) | (dest & 3);
-
- udelay(1000);
-
-- WriteRegDW(adapter, 0x714, tmp);
-- WriteRegDW(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-
- udelay(1000);
-
-@@ -360,19 +367,19 @@ static void SRAMSetNetDest(struct adapte
- /* return tmp; */
- }
-
--static void SRAMSetCaiDest(struct adapter * adapter, u8 dest)
-+static void sram_set_cai_dest(struct adapter *adapter, u8 dest)
- {
- u32 tmp;
-
- udelay(1000);
-
-- tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFF3) | ((dest & 3) << 2);
-+ tmp = (read_reg_dw(adapter, 0x714) & 0xfffffff3) | ((dest & 3) << 2);
-
- udelay(1000);
- udelay(1000);
-
-- WriteRegDW(adapter, 0x714, tmp);
-- WriteRegDW(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-
- udelay(1000);
-
-@@ -380,19 +387,19 @@ static void SRAMSetCaiDest(struct adapte
- /* return tmp; */
- }
-
--static void SRAMSetCaoDest(struct adapter * adapter, u8 dest)
-+static void sram_set_cao_dest(struct adapter *adapter, u8 dest)
- {
- u32 tmp;
-
- udelay(1000);
-
-- tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFFCF) | ((dest & 3) << 4);
-+ tmp = (read_reg_dw(adapter, 0x714) & 0xffffffcf) | ((dest & 3) << 4);
-
- udelay(1000);
- udelay(1000);
-
-- WriteRegDW(adapter, 0x714, tmp);
-- WriteRegDW(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-
- udelay(1000);
-
-@@ -400,19 +407,19 @@ static void SRAMSetCaoDest(struct adapte
- /* return tmp; */
- }
-
--static void SRAMSetMediaDest(struct adapter * adapter, u8 dest)
-+static void sram_set_media_dest(struct adapter *adapter, u8 dest)
- {
- u32 tmp;
-
- udelay(1000);
-
-- tmp = (ReadRegDW(adapter, 0x714) & 0xFFFFFF3F) | ((dest & 3) << 6);
-+ tmp = (read_reg_dw(adapter, 0x714) & 0xffffff3f) | ((dest & 3) << 6);
-
- udelay(1000);
- udelay(1000);
-
-- WriteRegDW(adapter, 0x714, tmp);
-- WriteRegDW(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-+ write_reg_dw(adapter, 0x714, tmp);
-
- udelay(1000);
-
-@@ -429,16 +436,17 @@ static void SRAMSetMediaDest(struct adap
- bits 28-29 : memory bank selector
- bit 31 : busy flag
- */
--static void FlexSramWrite(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
-+static void flex_sram_write(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
- {
-- u32 i, command, retries;
-+ int i, retries;
-+ u32 command;
-
- for (i = 0; i < len; i++) {
- command = bank | addr | 0x04000000 | (*buf << 0x10);
-
- retries = 2;
-
-- while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
-+ while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
- mdelay(1);
- retries--;
- };
-@@ -446,23 +454,24 @@ static void FlexSramWrite(struct adapter
- if (retries == 0)
- printk("%s: SRAM timeout\n", __FUNCTION__);
-
-- WriteRegDW(adapter, 0x700, command);
-+ write_reg_dw(adapter, 0x700, command);
-
- buf++;
- addr++;
- }
- }
-
--static void FlexSramRead(struct adapter *adapter, u32 bank, u32 addr, u8 * buf, u32 len)
-+static void flex_sram_read(struct adapter *adapter, u32 bank, u32 addr, u8 *buf, u32 len)
- {
-- u32 i, command, value, retries;
-+ int i, retries;
-+ u32 command, value;
-
- for (i = 0; i < len; i++) {
- command = bank | addr | 0x04008000;
-
- retries = 10000;
-
-- while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
-+ while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
- mdelay(1);
- retries--;
- };
-@@ -470,11 +479,11 @@ static void FlexSramRead(struct adapter
- if (retries == 0)
- printk("%s: SRAM timeout\n", __FUNCTION__);
-
-- WriteRegDW(adapter, 0x700, command);
-+ write_reg_dw(adapter, 0x700, command);
-
- retries = 10000;
-
-- while (((ReadRegDW(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
-+ while (((read_reg_dw(adapter, 0x700) & 0x80000000) != 0) && (retries > 0)) {
- mdelay(1);
- retries--;
- };
-@@ -482,7 +491,7 @@ static void FlexSramRead(struct adapter
- if (retries == 0)
- printk("%s: SRAM timeout\n", __FUNCTION__);
-
-- value = ReadRegDW(adapter, 0x700) >> 0x10;
-+ value = read_reg_dw(adapter, 0x700) >> 0x10;
-
- *buf = (value & 0xff);
-
-@@ -491,47 +500,47 @@ static void FlexSramRead(struct adapter
- }
- }
-
--static void SRAM_writeChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
-+static void sram_writeChunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
- {
- u32 bank;
-
- bank = 0;
-
-- if (adapter->dwSramType == 0x20000) {
-- bank = (addr & 0x18000) << 0x0D;
-+ if (adapter->dw_sram_type == 0x20000) {
-+ bank = (addr & 0x18000) << 0x0d;
- }
-
-- if (adapter->dwSramType == 0x00000) {
-- if ((addr >> 0x0F) == 0)
-+ if (adapter->dw_sram_type == 0x00000) {
-+ if ((addr >> 0x0f) == 0)
- bank = 0x20000000;
- else
- bank = 0x10000000;
- }
-
-- FlexSramWrite(adapter, bank, addr & 0x7FFF, buf, len);
-+ flex_sram_write(adapter, bank, addr & 0x7fff, buf, len);
- }
-
--static void SRAM_readChunk(struct adapter *adapter, u32 addr, u8 * buf, u16 len)
-+static void sram_readChunk(struct adapter *adapter, u32 addr, u8 *buf, u16 len)
- {
- u32 bank;
-
- bank = 0;
-
-- if (adapter->dwSramType == 0x20000) {
-- bank = (addr & 0x18000) << 0x0D;
-+ if (adapter->dw_sram_type == 0x20000) {
-+ bank = (addr & 0x18000) << 0x0d;
- }
-
-- if (adapter->dwSramType == 0x00000) {
-- if ((addr >> 0x0F) == 0)
-+ if (adapter->dw_sram_type == 0x00000) {
-+ if ((addr >> 0x0f) == 0)
- bank = 0x20000000;
- else
- bank = 0x10000000;
- }
-
-- FlexSramRead(adapter, bank, addr & 0x7FFF, buf, len);
-+ flex_sram_read(adapter, bank, addr & 0x7fff, buf, len);
- }
-
--static void SRAM_read(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
-+static void sram_read(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
- {
- u32 length;
-
-@@ -541,11 +550,11 @@ static void SRAM_read(struct adapter *ad
- // check if the address range belongs to the same
- // 32K memory chip. If not, the data is read from
- // one chip at a time.
-- if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
-- length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
-+ if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
-+ length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
- }
-
-- SRAM_readChunk(adapter, addr, buf, length);
-+ sram_readChunk(adapter, addr, buf, length);
-
- addr = addr + length;
- buf = buf + length;
-@@ -553,7 +562,7 @@ static void SRAM_read(struct adapter *ad
- }
- }
-
--static void SRAM_write(struct adapter *adapter, u32 addr, u8 * buf, u32 len)
-+static void sram_write(struct adapter *adapter, u32 addr, u8 *buf, u32 len)
- {
- u32 length;
-
-@@ -563,11 +572,11 @@ static void SRAM_write(struct adapter *a
- // check if the address range belongs to the same
- // 32K memory chip. If not, the data is written to
- // one chip at a time.
-- if ((addr >> 0x0F) != ((addr + len - 1) >> 0x0F)) {
-- length = (((addr >> 0x0F) + 1) << 0x0F) - addr;
-+ if ((addr >> 0x0f) != ((addr + len - 1) >> 0x0f)) {
-+ length = (((addr >> 0x0f) + 1) << 0x0f) - addr;
- }
-
-- SRAM_writeChunk(adapter, addr, buf, length);
-+ sram_writeChunk(adapter, addr, buf, length);
-
- addr = addr + length;
- buf = buf + length;
-@@ -575,92 +584,92 @@ static void SRAM_write(struct adapter *a
- }
- }
-
--static void SRAM_setSize(struct adapter *adapter, u32 mask)
-+static void sram_set_size(struct adapter *adapter, u32 mask)
- {
-- WriteRegDW(adapter, 0x71C, (mask | (~0x30000 & ReadRegDW(adapter, 0x71C))));
-+ write_reg_dw(adapter, 0x71c, (mask | (~0x30000 & read_reg_dw(adapter, 0x71c))));
- }
-
--static void SRAM_init(struct adapter *adapter)
-+static void sram_init(struct adapter *adapter)
- {
- u32 tmp;
-
-- tmp = ReadRegDW(adapter, 0x71C);
-+ tmp = read_reg_dw(adapter, 0x71c);
-
-- WriteRegDW(adapter, 0x71C, 1);
-+ write_reg_dw(adapter, 0x71c, 1);
-
-- if (ReadRegDW(adapter, 0x71C) != 0) {
-- WriteRegDW(adapter, 0x71C, tmp);
-+ if (read_reg_dw(adapter, 0x71c) != 0) {
-+ write_reg_dw(adapter, 0x71c, tmp);
-
-- adapter->dwSramType = tmp & 0x30000;
-+ adapter->dw_sram_type = tmp & 0x30000;
-
-- dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
-+ ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
-
- } else {
-
-- adapter->dwSramType = 0x10000;
-+ adapter->dw_sram_type = 0x10000;
-
-- dprintk("%s: dwSramType = %x\n", __FUNCTION__, adapter->dwSramType);
-+ ddprintk("%s: dw_sram_type = %x\n", __FUNCTION__, adapter->dw_sram_type);
- }
-
- /* return value is never used? */
--/* return adapter->dwSramType; */
-+/* return adapter->dw_sram_type; */
- }
-
--static int SRAM_testLocation(struct adapter *adapter, u32 mask, u32 addr)
-+static int sram_test_location(struct adapter *adapter, u32 mask, u32 addr)
- {
- u8 tmp1, tmp2;
-
- dprintk("%s: mask = %x, addr = %x\n", __FUNCTION__, mask, addr);
-
-- SRAM_setSize(adapter, mask);
-- SRAM_init(adapter);
-+ sram_set_size(adapter, mask);
-+ sram_init(adapter);
-
-- tmp2 = 0xA5;
-- tmp1 = 0x4F;
-+ tmp2 = 0xa5;
-+ tmp1 = 0x4f;
-
-- SRAM_write(adapter, addr, &tmp2, 1);
-- SRAM_write(adapter, addr + 4, &tmp1, 1);
-+ sram_write(adapter, addr, &tmp2, 1);
-+ sram_write(adapter, addr + 4, &tmp1, 1);
-
- tmp2 = 0;
-
- mdelay(20);
-
-- SRAM_read(adapter, addr, &tmp2, 1);
-- SRAM_read(adapter, addr, &tmp2, 1);
-+ sram_read(adapter, addr, &tmp2, 1);
-+ sram_read(adapter, addr, &tmp2, 1);
-
-- dprintk("%s: wrote 0xA5, read 0x%2x\n", __FUNCTION__, tmp2);
-+ dprintk("%s: wrote 0xa5, read 0x%2x\n", __FUNCTION__, tmp2);
-
-- if (tmp2 != 0xA5)
-+ if (tmp2 != 0xa5)
- return 0;
-
-- tmp2 = 0x5A;
-- tmp1 = 0xF4;
-+ tmp2 = 0x5a;
-+ tmp1 = 0xf4;
-
-- SRAM_write(adapter, addr, &tmp2, 1);
-- SRAM_write(adapter, addr + 4, &tmp1, 1);
-+ sram_write(adapter, addr, &tmp2, 1);
-+ sram_write(adapter, addr + 4, &tmp1, 1);
-
- tmp2 = 0;
-
- mdelay(20);
-
-- SRAM_read(adapter, addr, &tmp2, 1);
-- SRAM_read(adapter, addr, &tmp2, 1);
-+ sram_read(adapter, addr, &tmp2, 1);
-+ sram_read(adapter, addr, &tmp2, 1);
-
-- dprintk("%s: wrote 0x5A, read 0x%2x\n", __FUNCTION__, tmp2);
-+ dprintk("%s: wrote 0x5a, read 0x%2x\n", __FUNCTION__, tmp2);
-
-- if (tmp2 != 0x5A)
-+ if (tmp2 != 0x5a)
- return 0;
-
- return 1;
- }
-
--static u32 SRAM_length(struct adapter * adapter)
-+static u32 sram_length(struct adapter *adapter)
- {
-- if (adapter->dwSramType == 0x10000)
-+ if (adapter->dw_sram_type == 0x10000)
- return 32768; // 32K
-- if (adapter->dwSramType == 0x00000)
-+ if (adapter->dw_sram_type == 0x00000)
- return 65536; // 64K
-- if (adapter->dwSramType == 0x20000)
-+ if (adapter->dw_sram_type == 0x20000)
- return 131072; // 128K
-
- return 32768; // 32K
-@@ -674,103 +683,104 @@ static u32 SRAM_length(struct adapter *
- FlexCop works only with one bank at a time. The bank is selected
- by bits 28-29 of the 0x700 register.
-
-- bank 0 covers addresses 0x00000-0x07FFF
-- bank 1 covers addresses 0x08000-0x0FFFF
-- bank 2 covers addresses 0x10000-0x17FFF
-- bank 3 covers addresses 0x18000-0x1FFFF
-+ bank 0 covers addresses 0x00000-0x07fff
-+ bank 1 covers addresses 0x08000-0x0ffff
-+ bank 2 covers addresses 0x10000-0x17fff
-+ bank 3 covers addresses 0x18000-0x1ffff
- */
--static int SramDetectForFlex2(struct adapter *adapter)
-+static int sram_detect_for_flex2(struct adapter *adapter)
- {
- u32 tmp, tmp2, tmp3;
-
- dprintk("%s:\n", __FUNCTION__);
-
-- tmp = ReadRegDW(adapter, 0x208);
-- WriteRegDW(adapter, 0x208, 0);
-+ tmp = read_reg_dw(adapter, 0x208);
-+ write_reg_dw(adapter, 0x208, 0);
-
-- tmp2 = ReadRegDW(adapter, 0x71C);
-+ tmp2 = read_reg_dw(adapter, 0x71c);
-
- dprintk("%s: tmp2 = %x\n", __FUNCTION__, tmp2);
-
-- WriteRegDW(adapter, 0x71C, 1);
-+ write_reg_dw(adapter, 0x71c, 1);
-
-- tmp3 = ReadRegDW(adapter, 0x71C);
-+ tmp3 = read_reg_dw(adapter, 0x71c);
-
- dprintk("%s: tmp3 = %x\n", __FUNCTION__, tmp3);
-
-- WriteRegDW(adapter, 0x71C, tmp2);
-+ write_reg_dw(adapter, 0x71c, tmp2);
-
- // check for internal SRAM ???
- tmp3--;
- if (tmp3 != 0) {
-- SRAM_setSize(adapter, 0x10000);
-- SRAM_init(adapter);
-- WriteRegDW(adapter, 0x208, tmp);
-+ sram_set_size(adapter, 0x10000);
-+ sram_init(adapter);
-+ write_reg_dw(adapter, 0x208, tmp);
-
- dprintk("%s: sram size = 32K\n", __FUNCTION__);
-
- return 32;
- }
-
-- if (SRAM_testLocation(adapter, 0x20000, 0x18000) != 0) {
-- SRAM_setSize(adapter, 0x20000);
-- SRAM_init(adapter);
-- WriteRegDW(adapter, 0x208, tmp);
-+ if (sram_test_location(adapter, 0x20000, 0x18000) != 0) {
-+ sram_set_size(adapter, 0x20000);
-+ sram_init(adapter);
-+ write_reg_dw(adapter, 0x208, tmp);
-
- dprintk("%s: sram size = 128K\n", __FUNCTION__);
-
- return 128;
- }
-
-- if (SRAM_testLocation(adapter, 0x00000, 0x10000) != 0) {
-- SRAM_setSize(adapter, 0x00000);
-- SRAM_init(adapter);
-- WriteRegDW(adapter, 0x208, tmp);
-+ if (sram_test_location(adapter, 0x00000, 0x10000) != 0) {
-+ sram_set_size(adapter, 0x00000);
-+ sram_init(adapter);
-+ write_reg_dw(adapter, 0x208, tmp);
-
- dprintk("%s: sram size = 64K\n", __FUNCTION__);
-
- return 64;
- }
-
-- if (SRAM_testLocation(adapter, 0x10000, 0x00000) != 0) {
-- SRAM_setSize(adapter, 0x10000);
-- SRAM_init(adapter);
-- WriteRegDW(adapter, 0x208, tmp);
-+ if (sram_test_location(adapter, 0x10000, 0x00000) != 0) {
-+ sram_set_size(adapter, 0x10000);
-+ sram_init(adapter);
-+ write_reg_dw(adapter, 0x208, tmp);
-
- dprintk("%s: sram size = 32K\n", __FUNCTION__);
-
- return 32;
- }
-
-- SRAM_setSize(adapter, 0x10000);
-- SRAM_init(adapter);
-- WriteRegDW(adapter, 0x208, tmp);
-+ sram_set_size(adapter, 0x10000);
-+ sram_init(adapter);
-+ write_reg_dw(adapter, 0x208, tmp);
-
- dprintk("%s: SRAM detection failed. Set to 32K \n", __FUNCTION__);
-
- return 0;
- }
-
--static void SLL_detectSramSize(struct adapter *adapter)
-+static void sll_detect_sram_size(struct adapter *adapter)
- {
-- SramDetectForFlex2(adapter);
-+ sram_detect_for_flex2(adapter);
- }
-+
- /* EEPROM (Skystar2 has one "24LC08B" chip on board) */
- /*
--static int EEPROM_write(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
-+static int eeprom_write(struct adapter *adapter, u16 addr, u8 *buf, u16 len)
- {
-- return FLEXI2C_write(adapter, 0x20000000, 0x50, addr, buf, len);
-+ return flex_i2c_write(adapter, 0x20000000, 0x50, addr, buf, len);
- }
- */
-
--static int EEPROM_read(struct adapter *adapter, u16 addr, u8 * buf, u16 len)
-+static int eeprom_read(struct adapter *adapter, u16 addr, u8 *buf, u16 len)
- {
-- return FLEXI2C_read(adapter, 0x20000000, 0x50, addr, buf, len);
-+ return flex_i2c_read(adapter, 0x20000000, 0x50, addr, buf, len);
- }
-
--u8 calc_LRC(u8 * buf, u32 len)
-+u8 calc_lrc(u8 *buf, int len)
- {
-- u32 i;
-+ int i;
- u8 sum;
-
- sum = 0;
-@@ -781,13 +791,13 @@ u8 calc_LRC(u8 * buf, u32 len)
- return sum;
- }
-
--static int EEPROM_LRC_read(struct adapter *adapter, u32 addr, u32 len, u8 * buf, u32 retries)
-+static int eeprom_lrc_read(struct adapter *adapter, u32 addr, u32 len, u8 *buf, int retries)
- {
- int i;
-
- for (i = 0; i < retries; i++) {
-- if (EEPROM_read(adapter, addr, buf, len) == len) {
-- if (calc_LRC(buf, len - 1) == buf[len - 1])
-+ if (eeprom_read(adapter, addr, buf, len) == len) {
-+ if (calc_lrc(buf, len - 1) == buf[len - 1])
- return 1;
- }
- }
-@@ -796,13 +806,13 @@ static int EEPROM_LRC_read(struct adapte
- }
-
- /*
--static int EEPROM_LRC_write(struct adapter *adapter, u32 addr, u32 len, u8 * wbuf, u8 * rbuf, u32 retries)
-+static int eeprom_lrc_write(struct adapter *adapter, u32 addr, u32 len, u8 *wbuf, u8 *rbuf, int retries)
- {
- int i;
-
- for (i = 0; i < retries; i++) {
-- if (EEPROM_write(adapter, addr, wbuf, len) == len) {
-- if (EEPROM_LRC_read(adapter, addr, len, rbuf, retries) == 1)
-+ if (eeprom_write(adapter, addr, wbuf, len) == len) {
-+ if (eeprom_lrc_read(adapter, addr, len, rbuf, retries) == 1)
- return 1;
- }
- }
-@@ -811,33 +821,11 @@ static int EEPROM_LRC_write(struct adapt
- }
- */
-
--/* These functions could be called from the initialization routine
-- to unlock SkyStar2 cards, locked by "Europe On Line".
--
-- in cards from "Europe On Line" the key is:
--
-- u8 key[20] = {
-- 0xB2, 0x01, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00,
-- };
--
-- LRC = 0xB3;
--
-- in unlocked cards the key is:
--
-- u8 key[20] = {
-- 0xB2, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00,
-- };
-
-- LRC = 0xB2;
--*/
-+/* These functions could be used to unlock SkyStar2 cards. */
-+
- /*
--static int EEPROM_writeKey(struct adapter *adapter, u8 * key, u32 len)
-+static int eeprom_writeKey(struct adapter *adapter, u8 *key, u32 len)
- {
- u8 rbuf[20];
- u8 wbuf[20];
-@@ -850,37 +838,38 @@ static int EEPROM_writeKey(struct adapte
- wbuf[16] = 0;
- wbuf[17] = 0;
- wbuf[18] = 0;
-- wbuf[19] = calc_LRC(wbuf, 19);
-+ wbuf[19] = calc_lrc(wbuf, 19);
-
-- return EEPROM_LRC_write(adapter, 0x3E4, 20, wbuf, rbuf, 4);
-+ return eeprom_lrc_write(adapter, 0x3e4, 20, wbuf, rbuf, 4);
- }
--*/
--static int EEPROM_readKey(struct adapter *adapter, u8 * key, u32 len)
-+
-+static int eeprom_readKey(struct adapter *adapter, u8 *key, u32 len)
- {
- u8 buf[20];
-
- if (len != 16)
- return 0;
-
-- if (EEPROM_LRC_read(adapter, 0x3E4, 20, buf, 4) == 0)
-+ if (eeprom_lrc_read(adapter, 0x3e4, 20, buf, 4) == 0)
- return 0;
-
- memcpy(key, buf, len);
-
- return 1;
- }
-+*/
-
--static int EEPROM_getMacAddr(struct adapter *adapter, char type, u8 * mac)
-+static int eeprom_get_mac_addr(struct adapter *adapter, char type, u8 *mac)
- {
- u8 tmp[8];
-
-- if (EEPROM_LRC_read(adapter, 0x3F8, 8, tmp, 4) != 0) {
-+ if (eeprom_lrc_read(adapter, 0x3f8, 8, tmp, 4) != 0) {
- if (type != 0) {
- mac[0] = tmp[0];
- mac[1] = tmp[1];
- mac[2] = tmp[2];
-- mac[3] = 0xFE;
-- mac[4] = 0xFF;
-+ mac[3] = 0xfe;
-+ mac[4] = 0xff;
- mac[5] = tmp[3];
- mac[6] = tmp[4];
- mac[7] = tmp[5];
-@@ -912,7 +901,7 @@ static int EEPROM_getMacAddr(struct adap
- }
-
- /*
--static char EEPROM_setMacAddr(struct adapter *adapter, char type, u8 * mac)
-+static char eeprom_set_mac_addr(struct adapter *adapter, char type, u8 *mac)
- {
- u8 tmp[8];
-
-@@ -935,9 +924,9 @@ static char EEPROM_setMacAddr(struct ada
- }
-
- tmp[6] = 0;
-- tmp[7] = calc_LRC(tmp, 7);
-+ tmp[7] = calc_lrc(tmp, 7);
-
-- if (EEPROM_write(adapter, 0x3F8, tmp, 8) == 8)
-+ if (eeprom_write(adapter, 0x3f8, tmp, 8) == 8)
- return 1;
-
- return 0;
-@@ -945,529 +934,319 @@ static char EEPROM_setMacAddr(struct ada
- */
-
- /* PID filter */
--static void FilterEnableStream1Filter(struct adapter *adapter, u32 op)
--{
-- dprintk("%s: op=%x\n", __FUNCTION__, op);
--
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000001, 0);
--
-- } else {
-
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000001);
-+/* every flexcop has 6 "lower" hw PID filters */
-+/* these are enabled by setting bits 0-5 of 0x208 */
-+/* for the 32 additional filters we have to select one */
-+/* of them through 0x310 and modify through 0x314 */
-+/* op: 0=disable, 1=enable */
-+static void filter_enable_hw_filter(struct adapter *adapter, int id, u8 op)
-+{
-+ dprintk("%s: id=%d op=%d\n", __FUNCTION__, id, op);
-+ if (id <= 5) {
-+ u32 mask = (0x00000001 << id);
-+ write_reg_bitfield(adapter, 0x208, mask, op ? mask : 0);
-+ } else {
-+ /* select */
-+ write_reg_bitfield(adapter, 0x310, 0x1f, (id - 6) & 0x1f);
-+ /* modify */
-+ write_reg_bitfield(adapter, 0x314, 0x00006000, op ? 0x00004000 : 0);
- }
- }
-
--static void FilterEnableStream2Filter(struct adapter *adapter, u32 op)
--{
-- dprintk("%s: op=%x\n", __FUNCTION__, op);
--
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000002, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000002);
-+/* this sets the PID that should pass the specified filter */
-+static void pid_set_hw_pid(struct adapter *adapter, int id, u16 pid)
-+{
-+ dprintk("%s: id=%d pid=%d\n", __FUNCTION__, id, pid);
-+ if (id <= 5) {
-+ u32 adr = 0x300 + ((id & 6) << 1);
-+ int shift = (id & 1) ? 16 : 0;
-+ dprintk("%s: id=%d addr=%x %c pid=%d\n", __FUNCTION__, id, adr, (id & 1) ? 'h' : 'l', pid);
-+ write_reg_bitfield(adapter, adr, (0x7fff) << shift, (pid & 0x1fff) << shift);
-+ } else {
-+ /* select */
-+ write_reg_bitfield(adapter, 0x310, 0x1f, (id - 6) & 0x1f);
-+ /* modify */
-+ write_reg_bitfield(adapter, 0x314, 0x1fff, pid & 0x1fff);
- }
- }
-
--static void FilterEnablePcrFilter(struct adapter *adapter, u32 op)
--{
-- dprintk("%s: op=%x\n", __FUNCTION__, op);
--
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000004, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000004);
-- }
--}
--
--static void FilterEnablePmtFilter(struct adapter *adapter, u32 op)
--{
-- dprintk("%s: op=%x\n", __FUNCTION__, op);
--
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000008, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000008);
-- }
--}
--
--static void FilterEnableEmmFilter(struct adapter *adapter, u32 op)
--{
-- dprintk("%s: op=%x\n", __FUNCTION__, op);
--
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000010, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000010);
-- }
--}
--
--static void FilterEnableEcmFilter(struct adapter *adapter, u32 op)
--{
-- dprintk("%s: op=%x\n", __FUNCTION__, op);
--
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000020, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000020);
-- }
--}
-
- /*
--static void FilterEnableNullFilter(struct adapter *adapter, u32 op)
-+static void filter_enable_null_filter(struct adapter *adapter, u32 op)
- {
- dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000040, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000040);
-- }
-+ write_reg_bitfield(adapter, 0x208, 0x00000040, op?0x00000040:0);
- }
- */
-
--static void FilterEnableMaskFilter(struct adapter *adapter, u32 op)
-+static void filter_enable_mask_filter(struct adapter *adapter, u32 op)
- {
- dprintk("%s: op=%x\n", __FUNCTION__, op);
-
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000080, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000080);
-- }
-+ write_reg_bitfield(adapter, 0x208, 0x00000080, op ? 0x00000080 : 0);
- }
-
-
--static void CtrlEnableMAC(struct adapter *adapter, u32 op)
-+static void ctrl_enable_mac(struct adapter *adapter, u32 op)
- {
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
-- }
-+ write_reg_bitfield(adapter, 0x208, 0x00004000, op ? 0x00004000 : 0);
- }
-
--static int CASetMacDstAddrFilter(struct adapter *adapter, u8 * mac)
-+static int ca_set_mac_dst_addr_filter(struct adapter *adapter, u8 *mac)
- {
- u32 tmp1, tmp2;
-
- tmp1 = (mac[3] << 0x18) | (mac[2] << 0x10) | (mac[1] << 0x08) | mac[0];
- tmp2 = (mac[5] << 0x08) | mac[4];
-
-- WriteRegDW(adapter, 0x418, tmp1);
-- WriteRegDW(adapter, 0x41C, tmp2);
-+ write_reg_dw(adapter, 0x418, tmp1);
-+ write_reg_dw(adapter, 0x41c, tmp2);
-
- return 0;
- }
-
- /*
--static void SetIgnoreMACFilter(struct adapter *adapter, u8 op)
-+static void set_ignore_mac_filter(struct adapter *adapter, u8 op)
- {
- if (op != 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00004000, 0);
--
-+ write_reg_bitfield(adapter, 0x208, 0x00004000, 0);
- adapter->mac_filter = 1;
--
- } else {
--
- if (adapter->mac_filter != 0) {
- adapter->mac_filter = 0;
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00004000);
-+ write_reg_bitfield(adapter, 0x208, 0x00004000, 0x00004000);
- }
- }
- }
- */
-
- /*
--static void CheckNullFilterEnable(struct adapter *adapter)
-+static void check_null_filter_enable(struct adapter *adapter)
- {
-- FilterEnableNullFilter(adapter, 1);
-- FilterEnableMaskFilter(adapter, 1);
-+ filter_enable_null_filter(adapter, 1);
-+ filter_enable_mask_filter(adapter, 1);
- }
- */
-
--static void InitPIDsInfo(struct adapter *adapter)
--{
-- int i;
--
-- for (i = 0; i < 0x27; i++)
-- adapter->pids[i] = 0x1FFF;
--}
--
--static int CheckPID(struct adapter *adapter, u16 pid)
--{
-- u32 i;
--
-- if (pid == 0x1FFF)
-- return 0;
--
-- for (i = 0; i < 0x27; i++) {
-- if (adapter->pids[i] == pid)
-- return 1;
-- }
--
-- return 0;
--}
--
--static void PidSetGroupPID(struct adapter * adapter, u32 pid)
-+static void pid_set_group_pid(struct adapter *adapter, u16 pid)
- {
- u32 value;
-
- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x30C) & 0xFFFF0000);
--
-- WriteRegDW(adapter, 0x30C, value);
--
-- /* return value is never used? */
--/* return value; */
-+ value = (pid & 0x3fff) | (read_reg_dw(adapter, 0x30c) & 0xffff0000);
-+ write_reg_dw(adapter, 0x30c, value);
- }
-
--static void PidSetGroupMASK(struct adapter * adapter, u32 pid)
-+static void pid_set_group_mask(struct adapter *adapter, u16 pid)
- {
- u32 value;
-
- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x30C) & 0xFFFF);
--
-- WriteRegDW(adapter, 0x30C, value);
--
-- /* return value is never used? */
--/* return value; */
-+ value = ((pid & 0x3fff) << 0x10) | (read_reg_dw(adapter, 0x30c) & 0xffff);
-+ write_reg_dw(adapter, 0x30c, value);
- }
-
--static void PidSetStream1PID(struct adapter * adapter, u32 pid)
--{
-- u32 value;
--
-- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x300) & 0xFFFFC000);
--
-- WriteRegDW(adapter, 0x300, value);
--
-- /* return value is never used? */
--/* return value; */
--}
--
--static void PidSetStream2PID(struct adapter * adapter, u32 pid)
--{
-- u32 value;
--
-- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x300) & 0xFFFF);
--
-- WriteRegDW(adapter, 0x300, value);
--
-- /* return value is never used? */
--/* return value; */
--}
--
--static void PidSetPcrPID(struct adapter * adapter, u32 pid)
-+/*
-+static int pid_get_group_pid(struct adapter *adapter)
- {
-- u32 value;
--
-- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = (pid & 0x3FFF) | (ReadRegDW(adapter, 0x304) & 0xFFFFC000);
--
-- WriteRegDW(adapter, 0x304, value);
--
-- /* return value is never used? */
--/* return value; */
-+ return read_reg_dw(adapter, 0x30c) & 0x00001fff;
- }
-
--static void PidSetPmtPID(struct adapter * adapter, u32 pid)
-+static int pid_get_group_mask(struct adapter *adapter)
- {
-- u32 value;
--
-- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = ((pid & 0x3FFF) << 0x10) | (ReadRegDW(adapter, 0x304) & 0x3FFF);
--
-- WriteRegDW(adapter, 0x304, value);
--
-- /* return value is never used? */
--/* return value; */
--}
--
--static void PidSetEmmPID(struct adapter * adapter, u32 pid)
--{
-- u32 value;
--
-- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = (pid & 0xFFFF) | (ReadRegDW(adapter, 0x308) & 0xFFFF0000);
--
-- WriteRegDW(adapter, 0x308, value);
--
-- /* return value is never used? */
--/* return value; */
-+ return (read_reg_dw(adapter, 0x30c) >> 0x10)& 0x00001fff;
- }
-+*/
-
--static void PidSetEcmPID(struct adapter * adapter, u32 pid)
-+/*
-+static void reset_hardware_pid_filter(struct adapter *adapter)
- {
-- u32 value;
-+ pid_set_stream1_pid(adapter, 0x1fff);
-
-- dprintk("%s: pid=%x\n", __FUNCTION__, pid);
--
-- value = (pid << 0x10) | (ReadRegDW(adapter, 0x308) & 0xFFFF);
-+ pid_set_stream2_pid(adapter, 0x1fff);
-+ filter_enable_stream2_filter(adapter, 0);
-
-- WriteRegDW(adapter, 0x308, value);
-+ pid_set_pcr_pid(adapter, 0x1fff);
-+ filter_enable_pcr_filter(adapter, 0);
-
-- /* return value is never used? */
--/* return value; */
--}
-+ pid_set_pmt_pid(adapter, 0x1fff);
-+ filter_enable_pmt_filter(adapter, 0);
-
--static int PidGetStream1PID(struct adapter * adapter)
--{
-- return ReadRegDW(adapter, 0x300) & 0x00001FFF;
--}
-+ pid_set_ecm_pid(adapter, 0x1fff);
-+ filter_enable_ecm_filter(adapter, 0);
-
--static int PidGetStream2PID(struct adapter * adapter)
--{
-- return (ReadRegDW(adapter, 0x300) >> 0x10)& 0x00001FFF;
-+ pid_set_emm_pid(adapter, 0x1fff);
-+ filter_enable_emm_filter(adapter, 0);
- }
-+*/
-
--static int PidGetPcrPID(struct adapter * adapter)
-+static void init_pids(struct adapter *adapter)
- {
-- return ReadRegDW(adapter, 0x304) & 0x00001FFF;
--}
-+ int i;
-
--static int PidGetPmtPID(struct adapter * adapter)
--{
-- return (ReadRegDW(adapter, 0x304) >> 0x10)& 0x00001FFF;
-+ adapter->pid_count = 0;
-+ adapter->whole_bandwidth_count = 0;
-+ for (i = 0; i < adapter->useable_hw_filters; i++) {
-+ dprintk("%s: setting filter %d to 0x1fff\n", __FUNCTION__, i);
-+ adapter->hw_pids[i] = 0x1fff;
-+ pid_set_hw_pid(adapter, i, 0x1fff);
- }
-
--static int PidGetEmmPID(struct adapter * adapter)
--{
-- return ReadRegDW(adapter, 0x308) & 0x00001FFF;
-+ pid_set_group_pid(adapter, 0);
-+ pid_set_group_mask(adapter, 0x1fe0);
- }
-
--static int PidGetEcmPID(struct adapter * adapter)
-+static void open_whole_bandwidth(struct adapter *adapter)
- {
-- return (ReadRegDW(adapter, 0x308) >> 0x10)& 0x00001FFF;
-+ dprintk("%s:\n", __FUNCTION__);
-+ pid_set_group_pid(adapter, 0);
-+ pid_set_group_mask(adapter, 0);
-+/*
-+ filter_enable_mask_filter(adapter, 1);
-+*/
- }
-
--static int PidGetGroupPID(struct adapter * adapter)
-+static void close_whole_bandwidth(struct adapter *adapter)
- {
-- return ReadRegDW(adapter, 0x30C) & 0x00001FFF;
-+ dprintk("%s:\n", __FUNCTION__);
-+ pid_set_group_pid(adapter, 0);
-+ pid_set_group_mask(adapter, 0x1fe0);
-+/*
-+ filter_enable_mask_filter(adapter, 1);
-+*/
- }
-
--static int PidGetGroupMASK(struct adapter * adapter)
-+static void whole_bandwidth_inc(struct adapter *adapter)
- {
-- return (ReadRegDW(adapter, 0x30C) >> 0x10)& 0x00001FFF;
-+ if (adapter->whole_bandwidth_count++ == 0)
-+ open_whole_bandwidth(adapter);
- }
-
--/*
--static void ResetHardwarePIDFilter(struct adapter *adapter)
-+static void whole_bandwidth_dec(struct adapter *adapter)
- {
-- PidSetStream1PID(adapter, 0x1FFF);
--
-- PidSetStream2PID(adapter, 0x1FFF);
-- FilterEnableStream2Filter(adapter, 0);
--
-- PidSetPcrPID(adapter, 0x1FFF);
-- FilterEnablePcrFilter(adapter, 0);
--
-- PidSetPmtPID(adapter, 0x1FFF);
-- FilterEnablePmtFilter(adapter, 0);
--
-- PidSetEcmPID(adapter, 0x1FFF);
-- FilterEnableEcmFilter(adapter, 0);
--
-- PidSetEmmPID(adapter, 0x1FFF);
-- FilterEnableEmmFilter(adapter, 0);
-+ if (--adapter->whole_bandwidth_count <= 0)
-+ close_whole_bandwidth(adapter);
- }
--*/
-
--static void OpenWholeBandwidth(struct adapter *adapter)
-+/* The specified PID has to be let through the
-+ hw filters.
-+ We try to allocate an hardware filter and open whole
-+ bandwidth when allocation is impossible.
-+ All pids<=0x1f pass through the group filter.
-+ Returns 1 on success, -1 on error */
-+static int add_hw_pid(struct adapter *adapter, u16 pid)
- {
-- PidSetGroupPID(adapter, 0);
--
-- PidSetGroupMASK(adapter, 0);
--
-- FilterEnableMaskFilter(adapter, 1);
--}
-+ int i;
-
--static int AddHwPID(struct adapter *adapter, u32 pid)
--{
- dprintk("%s: pid=%d\n", __FUNCTION__, pid);
-
-- if (pid <= 0x1F)
-+ if (pid <= 0x1f)
- return 1;
-
-- if ((PidGetGroupMASK(adapter) == 0) && (PidGetGroupPID(adapter) == 0))
-- return 0;
--
-- if (PidGetStream1PID(adapter) == 0x1FFF) {
-- PidSetStream1PID(adapter, pid & 0xFFFF);
--
-- FilterEnableStream1Filter(adapter, 1);
--
-- return 1;
-- }
--
-- if (PidGetStream2PID(adapter) == 0x1FFF) {
-- PidSetStream2PID(adapter, (pid & 0xFFFF));
--
-- FilterEnableStream2Filter(adapter, 1);
--
-- return 1;
-- }
--
-- if (PidGetPcrPID(adapter) == 0x1FFF) {
-- PidSetPcrPID(adapter, (pid & 0xFFFF));
--
-- FilterEnablePcrFilter(adapter, 1);
--
-+ /* we can't use a filter for 0x2000, so no search */
-+ if (pid != 0x2000) {
-+ /* find an unused hardware filter */
-+ for (i = 0; i < adapter->useable_hw_filters; i++) {
-+ dprintk("%s: pid=%d searching slot=%d\n", __FUNCTION__, pid, i);
-+ if (adapter->hw_pids[i] == 0x1fff) {
-+ dprintk("%s: pid=%d slot=%d\n", __FUNCTION__, pid, i);
-+ adapter->hw_pids[i] = pid;
-+ pid_set_hw_pid(adapter, i, pid);
-+ filter_enable_hw_filter(adapter, i, 1);
- return 1;
- }
--
-- if ((PidGetPmtPID(adapter) & 0x1FFF) == 0x1FFF) {
-- PidSetPmtPID(adapter, (pid & 0xFFFF));
--
-- FilterEnablePmtFilter(adapter, 1);
--
-- return 1;
- }
--
-- if ((PidGetEmmPID(adapter) & 0x1FFF) == 0x1FFF) {
-- PidSetEmmPID(adapter, (pid & 0xFFFF));
--
-- FilterEnableEmmFilter(adapter, 1);
--
-- return 1;
- }
--
-- if ((PidGetEcmPID(adapter) & 0x1FFF) == 0x1FFF) {
-- PidSetEcmPID(adapter, (pid & 0xFFFF));
--
-- FilterEnableEcmFilter(adapter, 1);
--
-+ /* if we have not used a filter, this pid depends on whole bandwidth */
-+ dprintk("%s: pid=%d whole_bandwidth\n", __FUNCTION__, pid);
-+ whole_bandwidth_inc(adapter);
- return 1;
- }
-
-- return -1;
--}
--
--static int RemoveHwPID(struct adapter *adapter, u32 pid)
-+/* returns -1 if the pid was not present in the filters */
-+static int remove_hw_pid(struct adapter *adapter, u16 pid)
- {
-+ int i;
-+
- dprintk("%s: pid=%d\n", __FUNCTION__, pid);
-
-- if (pid <= 0x1F)
-+ if (pid <= 0x1f)
- return 1;
-
-- if (PidGetStream1PID(adapter) == pid) {
-- PidSetStream1PID(adapter, 0x1FFF);
--
-+ /* we can't use a filter for 0x2000, so no search */
-+ if (pid != 0x2000) {
-+ for (i = 0; i < adapter->useable_hw_filters; i++) {
-+ dprintk("%s: pid=%d searching slot=%d\n", __FUNCTION__, pid, i);
-+ if (adapter->hw_pids[i] == pid) { // find the pid slot
-+ dprintk("%s: pid=%d slot=%d\n", __FUNCTION__, pid, i);
-+ adapter->hw_pids[i] = 0x1fff;
-+ pid_set_hw_pid(adapter, i, 0x1fff);
-+ filter_enable_hw_filter(adapter, i, 0);
- return 1;
- }
--
-- if (PidGetStream2PID(adapter) == pid) {
-- PidSetStream2PID(adapter, 0x1FFF);
--
-- FilterEnableStream2Filter(adapter, 0);
--
-- return 1;
- }
--
-- if (PidGetPcrPID(adapter) == pid) {
-- PidSetPcrPID(adapter, 0x1FFF);
--
-- FilterEnablePcrFilter(adapter, 0);
--
-- return 1;
- }
--
-- if (PidGetPmtPID(adapter) == pid) {
-- PidSetPmtPID(adapter, 0x1FFF);
--
-- FilterEnablePmtFilter(adapter, 0);
--
-+ /* if we have not used a filter, this pid depended on whole bandwith */
-+ dprintk("%s: pid=%d whole_bandwidth\n", __FUNCTION__, pid);
-+ whole_bandwidth_dec(adapter);
- return 1;
- }
-
-- if (PidGetEmmPID(adapter) == pid) {
-- PidSetEmmPID(adapter, 0x1FFF);
--
-- FilterEnableEmmFilter(adapter, 0);
--
-- return 1;
-- }
--
-- if (PidGetEcmPID(adapter) == pid) {
-- PidSetEcmPID(adapter, 0x1FFF);
--
-- FilterEnableEcmFilter(adapter, 0);
--
-- return 1;
-- }
--
-- return -1;
--}
--
--static int AddPID(struct adapter *adapter, u32 pid)
-+/* Adds a PID to the filters.
-+ Adding a pid more than once is possible, we keep reference counts.
-+ Whole stream available through pid==0x2000.
-+ Returns 1 on success, -1 on error */
-+static int add_pid(struct adapter *adapter, u16 pid)
- {
- int i;
-
- dprintk("%s: pid=%d\n", __FUNCTION__, pid);
-
-- if (pid > 0x1FFE)
-+ if (pid > 0x1ffe && pid != 0x2000)
- return -1;
-
-- if (CheckPID(adapter, pid) == 1)
-+ // check if the pid is already present
-+ for (i = 0; i < adapter->pid_count; i++)
-+ if (adapter->pid_list[i] == pid) {
-+ adapter->pid_rc[i]++; // increment ref counter
- return 1;
-+ }
-
-- for (i = 0; i < 0x27; i++) {
-- if (adapter->pids[i] == 0x1FFF) // find free pid filter
-- {
-- adapter->pids[i] = pid;
--
-- if (AddHwPID(adapter, pid) < 0)
-- OpenWholeBandwidth(adapter);
-+ if (adapter->pid_count == N_PID_SLOTS)
-+ return -1; // no more pids can be added
-+ adapter->pid_list[adapter->pid_count] = pid; // register pid
-+ adapter->pid_rc[adapter->pid_count] = 1;
-+ adapter->pid_count++;
-+ // hardware setting
-+ add_hw_pid(adapter, pid);
-
- return 1;
- }
-- }
--
-- return -1;
--}
-
--static int RemovePID(struct adapter *adapter, u32 pid)
-+/* Removes a PID from the filters. */
-+static int remove_pid(struct adapter *adapter, u16 pid)
- {
-- u32 i;
-+ int i;
-
- dprintk("%s: pid=%d\n", __FUNCTION__, pid);
-
-- if (pid > 0x1FFE)
-+ if (pid > 0x1ffe && pid != 0x2000)
- return -1;
-
-- for (i = 0; i < 0x27; i++) {
-- if (adapter->pids[i] == pid) {
-- adapter->pids[i] = 0x1FFF;
--
-- RemoveHwPID(adapter, pid);
--
-+ // check if the pid is present (it must be!)
-+ for (i = 0; i < adapter->pid_count; i++) {
-+ if (adapter->pid_list[i] == pid) {
-+ adapter->pid_rc[i]--;
-+ if (adapter->pid_rc[i] <= 0) {
-+ // remove from the list
-+ adapter->pid_count--;
-+ adapter->pid_list[i]=adapter->pid_list[adapter->pid_count];
-+ adapter->pid_rc[i] = adapter->pid_rc[adapter->pid_count];
-+ // hardware setting
-+ remove_hw_pid(adapter, pid);
-+ }
- return 1;
- }
- }
-@@ -1475,21 +1254,16 @@ static int RemovePID(struct adapter *ada
- return -1;
- }
-
-+
- /* dma & irq */
--static void CtrlEnableSmc(struct adapter *adapter, u32 op)
-+static void ctrl_enable_smc(struct adapter *adapter, u32 op)
- {
-- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00000800, 0);
--
-- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00000800);
-- }
-+ write_reg_bitfield(adapter, 0x208, 0x00000800, op ? 0x00000800 : 0);
- }
-
--static void DmaEnableDisableIrq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
-+static void dma_enable_disable_irq(struct adapter *adapter, u32 flag1, u32 flag2, u32 flag3)
- {
-- adapter->dma_ctrl = adapter->dma_ctrl & 0x000F0000;
-+ adapter->dma_ctrl = adapter->dma_ctrl & 0x000f0000;
-
- if (flag1 == 0) {
- if (flag2 == 0)
-@@ -1516,16 +1290,16 @@ static void DmaEnableDisableIrq(struct a
- }
- }
-
--static void IrqDmaEnableDisableIrq(struct adapter * adapter, u32 op)
-+static void irq_dma_enable_disable_irq(struct adapter *adapter, u32 op)
- {
- u32 value;
-
-- value = ReadRegDW(adapter, 0x208) & 0xFFF0FFFF;
-+ value = read_reg_dw(adapter, 0x208) & 0xfff0ffff;
-
- if (op != 0)
-- value = value | (adapter->dma_ctrl & 0x000F0000);
-+ value = value | (adapter->dma_ctrl & 0x000f0000);
-
-- WriteRegDW(adapter, 0x208, value);
-+ write_reg_dw(adapter, 0x208, value);
- }
-
- /* FlexCopII has 2 dma channels. DMA1 is used to transfer TS data to
-@@ -1544,7 +1318,7 @@ static void IrqDmaEnableDisableIrq(struc
- subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
- when dma1 is enabled.
-
-- the first 30 bits of register 0x00C contain the address of the second
-+ the first 30 bits of register 0x00c contain the address of the second
- subbuffer. the last 2 bits contain 1.
-
- register 0x008 will contain the address of the subbuffer that was filled
-@@ -1559,13 +1333,13 @@ static void IrqDmaEnableDisableIrq(struc
- subbuffer. The last 2 bits contain 0, when dma1 is disabled and 1,
- when dma1 is enabled.
-
-- the first 30 bits of register 0x01C contain the address of the second
-+ the first 30 bits of register 0x01c contain the address of the second
- subbuffer. the last 2 bits contain 1.
-
- register 0x018 contains the address of the subbuffer that was filled
- with TS data, when FlexCopII generates an interrupt.
- */
--static int DmaInitDMA(struct adapter *adapter, u32 dma_channel)
-+static int dma_init_dma(struct adapter *adapter, u32 dma_channel)
- {
- u32 subbuffers, subbufsize, subbuf0, subbuf1;
-
-@@ -1576,37 +1350,37 @@ static int DmaInitDMA(struct adapter *ad
-
- subbufsize = (((adapter->dmaq1.buffer_size / 2) / 4) << 8) | subbuffers;
-
-- subbuf0 = adapter->dmaq1.bus_addr & 0xFFFFFFFC;
-+ subbuf0 = adapter->dmaq1.bus_addr & 0xfffffffc;
-
-- subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xFFFFFFFC) | 1;
-+ subbuf1 = ((adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) & 0xfffffffc) | 1;
-
- dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
- udelay(1000);
-- WriteRegDW(adapter, 0x000, subbuf0);
-+ write_reg_dw(adapter, 0x000, subbuf0);
-
- dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
- udelay(1000);
-- WriteRegDW(adapter, 0x004, subbufsize);
-+ write_reg_dw(adapter, 0x004, subbufsize);
-
- dprintk("%s: second subbuffer address = 0x%x\n", __FUNCTION__, subbuf1);
- udelay(1000);
-- WriteRegDW(adapter, 0x00C, subbuf1);
-+ write_reg_dw(adapter, 0x00c, subbuf1);
-
-- dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
-- WriteRegDW(adapter, 0x008, adapter->dmaq1.bus_addr & 0xFFFFFFFC);
-+ dprintk("%s: counter = 0x%x\n", __FUNCTION__, adapter->dmaq1.bus_addr & 0xfffffffc);
-+ write_reg_dw(adapter, 0x008, adapter->dmaq1.bus_addr & 0xfffffffc);
- udelay(1000);
-
- if (subbuffers == 0)
-- DmaEnableDisableIrq(adapter, 0, 1, 0);
-+ dma_enable_disable_irq(adapter, 0, 1, 0);
- else
-- DmaEnableDisableIrq(adapter, 0, 1, 1);
-+ dma_enable_disable_irq(adapter, 0, 1, 1);
-
-- IrqDmaEnableDisableIrq(adapter, 1);
-+ irq_dma_enable_disable_irq(adapter, 1);
-
-- SRAMSetMediaDest(adapter, 1);
-- SRAMSetNetDest(adapter, 1);
-- SRAMSetCaiDest(adapter, 2);
-- SRAMSetCaoDest(adapter, 2);
-+ sram_set_media_dest(adapter, 1);
-+ sram_set_net_dest(adapter, 1);
-+ sram_set_cai_dest(adapter, 2);
-+ sram_set_cao_dest(adapter, 2);
- }
-
- if (dma_channel == 1) {
-@@ -1616,39 +1390,35 @@ static int DmaInitDMA(struct adapter *ad
-
- subbufsize = (((adapter->dmaq2.buffer_size / 2) / 4) << 8) | subbuffers;
-
-- subbuf0 = adapter->dmaq2.bus_addr & 0xFFFFFFFC;
-+ subbuf0 = adapter->dmaq2.bus_addr & 0xfffffffc;
-
-- subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xFFFFFFFC) | 1;
-+ subbuf1 = ((adapter->dmaq2.bus_addr + adapter->dmaq2.buffer_size / 2) & 0xfffffffc) | 1;
-
- dprintk("%s: first subbuffer address = 0x%x\n", __FUNCTION__, subbuf0);
- udelay(1000);
-- WriteRegDW(adapter, 0x010, subbuf0);
-+ write_reg_dw(adapter, 0x010, subbuf0);
-
- dprintk("%s: subbuffer size = 0x%x\n", __FUNCTION__, (subbufsize >> 8) * 4);
- udelay(1000);
-- WriteRegDW(adapter, 0x014, subbufsize);
-+ write_reg_dw(adapter, 0x014, subbufsize);
-
- dprintk("%s: second buffer address = 0x%x\n", __FUNCTION__, subbuf1);
- udelay(1000);
-- WriteRegDW(adapter, 0x01C, subbuf1);
-+ write_reg_dw(adapter, 0x01c, subbuf1);
-
-- SRAMSetCaiDest(adapter, 2);
-+ sram_set_cai_dest(adapter, 2);
- }
-
- return 0;
- }
-
--static void CtrlEnableReceiveData(struct adapter *adapter, u32 op)
-+static void ctrl_enable_receive_data(struct adapter *adapter, u32 op)
- {
- if (op == 0) {
-- WriteRegOp(adapter, 0x208, 2, ~0x00008000, 0);
--
-+ write_reg_bitfield(adapter, 0x208, 0x00008000, 0);
- adapter->dma_status = adapter->dma_status & ~0x00000004;
--
- } else {
--
-- WriteRegOp(adapter, 0x208, 1, 0, 0x00008000);
--
-+ write_reg_bitfield(adapter, 0x208, 0x00008000, 0x00008000);
- adapter->dma_status = adapter->dma_status | 0x00000004;
- }
- }
-@@ -1656,7 +1426,7 @@ static void CtrlEnableReceiveData(struct
- /* bit 0 of dma_mask is set to 1 if dma1 channel has to be enabled/disabled
- bit 1 of dma_mask is set to 1 if dma2 channel has to be enabled/disabled
- */
--static void DmaStartStop0x2102(struct adapter *adapter, u32 dma_mask, u32 start_stop)
-+static void dma_start_stop(struct adapter *adapter, u32 dma_mask, int start_stop)
- {
- u32 dma_enable, dma1_enable, dma2_enable;
-
-@@ -1679,83 +1449,82 @@ static void DmaStartStop0x2102(struct ad
- }
- // enable dma1 and dma2
- if ((dma1_enable == 1) && (dma2_enable == 1)) {
-- WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-- WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-- WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
-+ write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-+ write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-+ write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
-
-- CtrlEnableReceiveData(adapter, 1);
-+ ctrl_enable_receive_data(adapter, 1);
-
- return;
- }
- // enable dma1
- if ((dma1_enable == 1) && (dma2_enable == 0)) {
-- WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-- WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-+ write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr | 1);
-+ write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-
-- CtrlEnableReceiveData(adapter, 1);
-+ ctrl_enable_receive_data(adapter, 1);
-
- return;
- }
- // enable dma2
- if ((dma1_enable == 0) && (dma2_enable == 1)) {
-- WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
-+ write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr | 1);
-
-- CtrlEnableReceiveData(adapter, 1);
-+ ctrl_enable_receive_data(adapter, 1);
-
- return;
- }
- // start dma
- if ((dma1_enable == 0) && (dma2_enable == 0)) {
-- CtrlEnableReceiveData(adapter, 1);
-+ ctrl_enable_receive_data(adapter, 1);
-
- return;
- }
-
- } else {
-
-- dprintk("%s: stoping dma\n", __FUNCTION__);
-+ dprintk("%s: stopping dma\n", __FUNCTION__);
-
- dma_enable = adapter->dma_status & 0x00000003;
-
- if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0)) {
-- dma_enable = dma_enable & 0xFFFFFFFE;
-+ dma_enable = dma_enable & 0xfffffffe;
- }
-
- if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0)) {
-- dma_enable = dma_enable & 0xFFFFFFFD;
-+ dma_enable = dma_enable & 0xfffffffd;
- }
- //stop dma
- if ((dma_enable == 0) && ((adapter->dma_status & 4) != 0)) {
-- CtrlEnableReceiveData(adapter, 0);
-+ ctrl_enable_receive_data(adapter, 0);
-
- udelay(3000);
- }
- //disable dma1
- if (((dma_mask & 1) != 0) && ((adapter->dma_status & 1) != 0) && (adapter->dmaq1.bus_addr != 0)) {
-- WriteRegDW(adapter, 0x000, adapter->dmaq1.bus_addr);
-- WriteRegDW(adapter, 0x00C, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-+ write_reg_dw(adapter, 0x000, adapter->dmaq1.bus_addr);
-+ write_reg_dw(adapter, 0x00c, (adapter->dmaq1.bus_addr + adapter->dmaq1.buffer_size / 2) | 1);
-
- adapter->dma_status = adapter->dma_status & ~0x00000001;
- }
- //disable dma2
- if (((dma_mask & 2) != 0) && ((adapter->dma_status & 2) != 0) && (adapter->dmaq2.bus_addr != 0)) {
-- WriteRegDW(adapter, 0x010, adapter->dmaq2.bus_addr);
-+ write_reg_dw(adapter, 0x010, adapter->dmaq2.bus_addr);
-
- adapter->dma_status = adapter->dma_status & ~0x00000002;
- }
- }
- }
-
--static void OpenStream(struct adapter *adapter, u32 pid)
-+static void open_stream(struct adapter *adapter, u16 pid)
- {
- u32 dma_mask;
-
-- if (adapter->capturing == 0)
-- adapter->capturing = 1;
-+ ++adapter->capturing;
-
-- FilterEnableMaskFilter(adapter, 1);
-+ filter_enable_mask_filter(adapter, 1);
-
-- AddPID(adapter, pid);
-+ add_pid(adapter, pid);
-
- dprintk("%s: adapter->dma_status=%x\n", __FUNCTION__, adapter->dma_status);
-
-@@ -1779,23 +1548,22 @@ static void OpenStream(struct adapter *a
- }
-
- if (dma_mask != 0) {
-- IrqDmaEnableDisableIrq(adapter, 1);
-+ irq_dma_enable_disable_irq(adapter, 1);
-
-- DmaStartStop0x2102(adapter, dma_mask, 1);
-+ dma_start_stop(adapter, dma_mask, 1);
- }
- }
- }
-
--static void CloseStream(struct adapter *adapter, u32 pid)
-+static void close_stream(struct adapter *adapter, u16 pid)
- {
-- u32 dma_mask;
--
-- if (adapter->capturing != 0)
-- adapter->capturing = 0;
-+ if (adapter->capturing > 0)
-+ --adapter->capturing;
-
- dprintk("%s: dma_status=%x\n", __FUNCTION__, adapter->dma_status);
-
-- dma_mask = 0;
-+ if (adapter->capturing == 0) {
-+ u32 dma_mask = 0;
-
- if ((adapter->dma_status & 1) != 0)
- dma_mask = dma_mask | 0x00000001;
-@@ -1803,94 +1571,76 @@ static void CloseStream(struct adapter *
- dma_mask = dma_mask | 0x00000002;
-
- if (dma_mask != 0) {
-- DmaStartStop0x2102(adapter, dma_mask, 0);
-+ dma_start_stop(adapter, dma_mask, 0);
- }
--
-- RemovePID(adapter, pid);
-+ }
-+ remove_pid(adapter, pid);
- }
-
--static void InterruptServiceDMA1(struct adapter *adapter)
-+static void interrupt_service_dma1(struct adapter *adapter)
- {
- struct dvb_demux *dvbdmx = &adapter->demux;
-- struct packet_header packet_header;
-
-- int nCurDmaCounter;
-- u32 nNumBytesParsed;
-- u32 nNumNewBytesTransferred;
-- u32 dwDefaultPacketSize = 188;
-- u8 gbTmpBuffer[188];
-- u8 *pbDMABufCurPos;
-+ int n_cur_dma_counter;
-+ u32 n_num_bytes_parsed;
-+ u32 n_num_new_bytes_transferred;
-+ u32 dw_default_packet_size = 188;
-+ u8 gb_tmp_buffer[188];
-+ u8 *pb_dma_buf_cur_pos;
-
-- nCurDmaCounter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
-- nCurDmaCounter = (nCurDmaCounter / dwDefaultPacketSize) * dwDefaultPacketSize;
-+ n_cur_dma_counter = readl(adapter->io_mem + 0x008) - adapter->dmaq1.bus_addr;
-+ n_cur_dma_counter = (n_cur_dma_counter / dw_default_packet_size) * dw_default_packet_size;
-
-- if ((nCurDmaCounter < 0) || (nCurDmaCounter > adapter->dmaq1.buffer_size)) {
-+ if ((n_cur_dma_counter < 0) || (n_cur_dma_counter > adapter->dmaq1.buffer_size)) {
- dprintk("%s: dma counter outside dma buffer\n", __FUNCTION__);
- return;
- }
-
-- adapter->dmaq1.head = nCurDmaCounter;
-+ adapter->dmaq1.head = n_cur_dma_counter;
-
-- if (adapter->dmaq1.tail <= nCurDmaCounter) {
-- nNumNewBytesTransferred = nCurDmaCounter - adapter->dmaq1.tail;
-+ if (adapter->dmaq1.tail <= n_cur_dma_counter) {
-+ n_num_new_bytes_transferred = n_cur_dma_counter - adapter->dmaq1.tail;
-
- } else {
-
-- nNumNewBytesTransferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + nCurDmaCounter;
-+ n_num_new_bytes_transferred = (adapter->dmaq1.buffer_size - adapter->dmaq1.tail) + n_cur_dma_counter;
- }
-
--// dprintk("%s: nCurDmaCounter = %d\n" , __FUNCTION__, nCurDmaCounter);
--// dprintk("%s: dmaq1.tail = %d\n" , __FUNCTION__, adapter->dmaq1.tail):
--// dprintk("%s: BytesTransferred = %d\n" , __FUNCTION__, nNumNewBytesTransferred);
-+ ddprintk("%s: n_cur_dma_counter = %d\n", __FUNCTION__, n_cur_dma_counter);
-+ ddprintk("%s: dmaq1.tail = %d\n", __FUNCTION__, adapter->dmaq1.tail);
-+ ddprintk("%s: bytes_transferred = %d\n", __FUNCTION__, n_num_new_bytes_transferred);
-
-- if (nNumNewBytesTransferred < dwDefaultPacketSize)
-+ if (n_num_new_bytes_transferred < dw_default_packet_size)
- return;
-
-- nNumBytesParsed = 0;
-+ n_num_bytes_parsed = 0;
-
-- while (nNumBytesParsed < nNumNewBytesTransferred) {
-- pbDMABufCurPos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
-+ while (n_num_bytes_parsed < n_num_new_bytes_transferred) {
-+ pb_dma_buf_cur_pos = adapter->dmaq1.buffer + adapter->dmaq1.tail;
-
- if (adapter->dmaq1.buffer + adapter->dmaq1.buffer_size < adapter->dmaq1.buffer + adapter->dmaq1.tail + 188) {
-- memcpy(gbTmpBuffer, adapter->dmaq1.buffer + adapter->dmaq1.tail, adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
-- memcpy(gbTmpBuffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer, (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
-+ memcpy(gb_tmp_buffer, adapter->dmaq1.buffer + adapter->dmaq1.tail,
-+ adapter->dmaq1.buffer_size - adapter->dmaq1.tail);
-+ memcpy(gb_tmp_buffer + (adapter->dmaq1.buffer_size - adapter->dmaq1.tail), adapter->dmaq1.buffer,
-+ (188 - (adapter->dmaq1.buffer_size - adapter->dmaq1.tail)));
-
-- pbDMABufCurPos = gbTmpBuffer;
-+ pb_dma_buf_cur_pos = gb_tmp_buffer;
- }
-
- if (adapter->capturing != 0) {
-- u32 *dq = (u32 *) pbDMABufCurPos;
--
-- packet_header.sync_byte = *dq & 0x000000FF;
-- packet_header.transport_error_indicator = *dq & 0x00008000;
-- packet_header.payload_unit_start_indicator = *dq & 0x00004000;
-- packet_header.transport_priority = *dq & 0x00002000;
-- packet_header.pid = ((*dq & 0x00FF0000) >> 0x10) | (*dq & 0x00001F00);
-- packet_header.transport_scrambling_control = *dq >> 0x1E;
-- packet_header.adaptation_field_control = (*dq & 0x30000000) >> 0x1C;
-- packet_header.continuity_counter = (*dq & 0x0F000000) >> 0x18;
--
-- if ((packet_header.sync_byte == 0x47) && (packet_header.transport_error_indicator == 0) && (packet_header.pid != 0x1FFF)) {
-- if (CheckPID(adapter, packet_header.pid & 0x0000FFFF) != 0) {
-- dvb_dmx_swfilter_packets(dvbdmx, pbDMABufCurPos, dwDefaultPacketSize / 188);
--
-- } else {
--
--// dprintk("%s: pid=%x\n", __FUNCTION__, packet_header.pid);
-- }
-- }
-+ dvb_dmx_swfilter_packets(dvbdmx, pb_dma_buf_cur_pos, dw_default_packet_size / 188);
- }
-
-- nNumBytesParsed = nNumBytesParsed + dwDefaultPacketSize;
-+ n_num_bytes_parsed = n_num_bytes_parsed + dw_default_packet_size;
-
-- adapter->dmaq1.tail = adapter->dmaq1.tail + dwDefaultPacketSize;
-+ adapter->dmaq1.tail = adapter->dmaq1.tail + dw_default_packet_size;
-
- if (adapter->dmaq1.tail >= adapter->dmaq1.buffer_size)
- adapter->dmaq1.tail = adapter->dmaq1.tail - adapter->dmaq1.buffer_size;
- };
- }
-
--static void InterruptServiceDMA2(struct adapter *adapter)
-+static void interrupt_service_dma2(struct adapter *adapter)
- {
- printk("%s:\n", __FUNCTION__);
- }
-@@ -1901,28 +1651,28 @@ static irqreturn_t isr(int irq, void *de
-
- u32 value;
-
--// dprintk("%s:\n", __FUNCTION__);
-+ ddprintk("%s:\n", __FUNCTION__);
-
- spin_lock_irq(&tmp->lock);
-
-- if (0 == ((value = ReadRegDW(tmp, 0x20C)) & 0x0F)) {
-+ if (0 == ((value = read_reg_dw(tmp, 0x20c)) & 0x0f)) {
- spin_unlock_irq(&tmp->lock);
- return IRQ_NONE;
- }
-
- while (value != 0) {
- if ((value & 0x03) != 0)
-- InterruptServiceDMA1(tmp);
-- if ((value & 0x0C) != 0)
-- InterruptServiceDMA2(tmp);
-- value = ReadRegDW(tmp, 0x20C) & 0x0F;
-+ interrupt_service_dma1(tmp);
-+ if ((value & 0x0c) != 0)
-+ interrupt_service_dma2(tmp);
-+ value = read_reg_dw(tmp, 0x20c) & 0x0f;
- }
-
- spin_unlock_irq(&tmp->lock);
- return IRQ_HANDLED;
- }
-
--static void Initdmaqueue(struct adapter *adapter)
-+static void init_dma_queue(struct adapter *adapter)
- {
- dma_addr_t dma_addr;
-
-@@ -1933,19 +1683,19 @@ static void Initdmaqueue(struct adapter
- adapter->dmaq1.tail = 0;
- adapter->dmaq1.buffer = 0;
-
-- adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, &dma_addr);
-+ adapter->dmaq1.buffer = pci_alloc_consistent(adapter->pdev, SIZE_OF_BUF_DMA1 + 0x80, &dma_addr);
-
- if (adapter->dmaq1.buffer != 0) {
-- memset(adapter->dmaq1.buffer, 0, SizeOfBufDMA1);
-+ memset(adapter->dmaq1.buffer, 0, SIZE_OF_BUF_DMA1);
-
- adapter->dmaq1.bus_addr = dma_addr;
-- adapter->dmaq1.buffer_size = SizeOfBufDMA1;
-+ adapter->dmaq1.buffer_size = SIZE_OF_BUF_DMA1;
-
-- DmaInitDMA(adapter, 0);
-+ dma_init_dma(adapter, 0);
-
- adapter->dma_status = adapter->dma_status | 0x10000000;
-
-- dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SizeOfBufDMA1);
-+ ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq1.buffer, SIZE_OF_BUF_DMA1);
-
- } else {
-
-@@ -1959,19 +1709,19 @@ static void Initdmaqueue(struct adapter
- adapter->dmaq2.tail = 0;
- adapter->dmaq2.buffer = 0;
-
-- adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, &dma_addr);
-+ adapter->dmaq2.buffer = pci_alloc_consistent(adapter->pdev, SIZE_OF_BUF_DMA2 + 0x80, &dma_addr);
-
- if (adapter->dmaq2.buffer != 0) {
-- memset(adapter->dmaq2.buffer, 0, SizeOfBufDMA2);
-+ memset(adapter->dmaq2.buffer, 0, SIZE_OF_BUF_DMA2);
-
- adapter->dmaq2.bus_addr = dma_addr;
-- adapter->dmaq2.buffer_size = SizeOfBufDMA2;
-+ adapter->dmaq2.buffer_size = SIZE_OF_BUF_DMA2;
-
-- DmaInitDMA(adapter, 1);
-+ dma_init_dma(adapter, 1);
-
- adapter->dma_status = adapter->dma_status | 0x20000000;
-
-- dprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SizeOfBufDMA2);
-+ ddprintk("%s: allocated dma buffer at 0x%p, length=%d\n", __FUNCTION__, adapter->dmaq2.buffer, (int) SIZE_OF_BUF_DMA2);
-
- } else {
-
-@@ -1979,10 +1729,10 @@ static void Initdmaqueue(struct adapter
- }
- }
-
--static void Freedmaqueue(struct adapter *adapter)
-+static void free_dma_queue(struct adapter *adapter)
- {
- if (adapter->dmaq1.buffer != 0) {
-- pci_free_consistent(adapter->pdev, SizeOfBufDMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
-+ pci_free_consistent(adapter->pdev, SIZE_OF_BUF_DMA1 + 0x80, adapter->dmaq1.buffer, adapter->dmaq1.bus_addr);
-
- adapter->dmaq1.bus_addr = 0;
- adapter->dmaq1.head = 0;
-@@ -1992,7 +1742,7 @@ static void Freedmaqueue(struct adapter
- }
-
- if (adapter->dmaq2.buffer != 0) {
-- pci_free_consistent(adapter->pdev, SizeOfBufDMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
-+ pci_free_consistent(adapter->pdev, SIZE_OF_BUF_DMA2 + 0x80, adapter->dmaq2.buffer, adapter->dmaq2.bus_addr);
-
- adapter->dmaq2.bus_addr = 0;
- adapter->dmaq2.head = 0;
-@@ -2002,16 +1752,16 @@ static void Freedmaqueue(struct adapter
- }
- }
-
--static void FreeAdapterObject(struct adapter *adapter)
-+static void free_adapter_object(struct adapter *adapter)
- {
- dprintk("%s:\n", __FUNCTION__);
-
-- CloseStream(adapter, 0);
-+ close_stream(adapter, 0);
-
- if (adapter->irq != 0)
- free_irq(adapter->irq, adapter);
-
-- Freedmaqueue(adapter);
-+ free_dma_queue(adapter);
-
- if (adapter->io_mem != 0)
- iounmap((void *) adapter->io_mem);
-@@ -2022,7 +1772,7 @@ static void FreeAdapterObject(struct ada
-
- static struct pci_driver skystar2_pci_driver;
-
--static int ClaimAdapter(struct adapter *adapter)
-+static int claim_adapter(struct adapter *adapter)
- {
- struct pci_dev *pdev = adapter->pdev;
-
-@@ -2062,20 +1812,58 @@ static int ClaimAdapter(struct adapter *
- }
-
- /*
--static int SLL_reset_FlexCOP(struct adapter *adapter)
-+static int sll_reset_flexcop(struct adapter *adapter)
- {
-- WriteRegDW(adapter, 0x208, 0);
-- WriteRegDW(adapter, 0x210, 0xB2FF);
-+ write_reg_dw(adapter, 0x208, 0);
-+ write_reg_dw(adapter, 0x210, 0xb2ff);
-
- return 0;
- }
- */
-
--static int DriverInitialize(struct pci_dev * pdev)
-+static void decide_how_many_hw_filters(struct adapter *adapter)
-+{
-+ int hw_filters;
-+ int mod_option_hw_filters;
-+
-+ // FlexCop IIb & III have 6+32 hw filters
-+ // FlexCop II has 6 hw filters, every other should have at least 6
-+ switch (adapter->b2c2_revision) {
-+ case 0x82: /* II */
-+ hw_filters = 6;
-+ break;
-+ case 0xc3: /* IIB */
-+ hw_filters = 6 + 32;
-+ break;
-+ case 0xc0: /* III */
-+ hw_filters = 6 + 32;
-+ break;
-+ default:
-+ hw_filters = 6;
-+ break;
-+ }
-+ printk("%s: the chip has %i hardware filters", __FILE__, hw_filters);
-+
-+ mod_option_hw_filters = 0;
-+ if (enable_hw_filters >= 1)
-+ mod_option_hw_filters += 6;
-+ if (enable_hw_filters >= 2)
-+ mod_option_hw_filters += 32;
-+
-+ if (mod_option_hw_filters >= hw_filters) {
-+ adapter->useable_hw_filters = hw_filters;
-+ } else {
-+ adapter->useable_hw_filters = mod_option_hw_filters;
-+ printk(", but only %d will be used because of module option", mod_option_hw_filters);
-+ }
-+ printk("\n");
-+ dprintk("%s: useable_hardware_filters set to %i\n", __FILE__, adapter->useable_hw_filters);
-+}
-+
-+static int driver_initialize(struct pci_dev *pdev)
- {
- struct adapter *adapter;
- u32 tmp;
-- u8 key[16];
-
- if (!(adapter = kmalloc(sizeof(struct adapter), GFP_KERNEL))) {
- dprintk("%s: out of memory!\n", __FUNCTION__);
-@@ -2090,113 +1878,114 @@ static int DriverInitialize(struct pci_d
- adapter->pdev = pdev;
- adapter->irq = pdev->irq;
-
-- if ((ClaimAdapter(adapter)) != 1) {
-- FreeAdapterObject(adapter);
-+ if ((claim_adapter(adapter)) != 1) {
-+ free_adapter_object(adapter);
-
- return -ENODEV;
- }
-
-- IrqDmaEnableDisableIrq(adapter, 0);
-+ irq_dma_enable_disable_irq(adapter, 0);
-
- if (request_irq(pdev->irq, isr, 0x4000000, "Skystar2", adapter) != 0) {
- dprintk("%s: unable to allocate irq=%d !\n", __FUNCTION__, pdev->irq);
-
-- FreeAdapterObject(adapter);
-+ free_adapter_object(adapter);
-
- return -ENODEV;
- }
-
-- ReadRegDW(adapter, 0x208);
-- WriteRegDW(adapter, 0x208, 0);
-- WriteRegDW(adapter, 0x210, 0xB2FF);
-- WriteRegDW(adapter, 0x208, 0x40);
--
-- InitPIDsInfo(adapter);
--
-- PidSetGroupPID(adapter, 0);
-- PidSetGroupMASK(adapter, 0x1FE0);
-- PidSetStream1PID(adapter, 0x1FFF);
-- PidSetStream2PID(adapter, 0x1FFF);
-- PidSetPmtPID(adapter, 0x1FFF);
-- PidSetPcrPID(adapter, 0x1FFF);
-- PidSetEcmPID(adapter, 0x1FFF);
-- PidSetEmmPID(adapter, 0x1FFF);
-+ read_reg_dw(adapter, 0x208);
-+ write_reg_dw(adapter, 0x208, 0);
-+ write_reg_dw(adapter, 0x210, 0xb2ff);
-+ write_reg_dw(adapter, 0x208, 0x40);
-
-- Initdmaqueue(adapter);
-+ init_dma_queue(adapter);
-
- if ((adapter->dma_status & 0x30000000) == 0) {
-- FreeAdapterObject(adapter);
-+ free_adapter_object(adapter);
-
- return -ENODEV;
- }
-
-- adapter->b2c2_revision = (ReadRegDW(adapter, 0x204) >> 0x18);
--
-- if ((adapter->b2c2_revision != 0x82) && (adapter->b2c2_revision != 0xC3))
-- if (adapter->b2c2_revision != 0x82) {
-- dprintk("%s: The revision of the FlexCopII chip on your card is - %d\n", __FUNCTION__, adapter->b2c2_revision);
-- dprintk("%s: This driver works now only with FlexCopII(rev.130) and FlexCopIIB(rev.195).\n", __FUNCTION__);
--
-- FreeAdapterObject(adapter);
-+ adapter->b2c2_revision = (read_reg_dw(adapter, 0x204) >> 0x18);
-
-+ switch (adapter->b2c2_revision) {
-+ case 0x82:
-+ printk("%s: FlexCopII(rev.130) chip found\n", __FILE__);
-+ break;
-+ case 0xc3:
-+ printk("%s: FlexCopIIB(rev.195) chip found\n", __FILE__);
-+ break;
-+ case 0xc0:
-+ printk("%s: FlexCopIII(rev.192) chip found\n", __FILE__);
-+ break;
-+ default:
-+ printk("%s: The revision of the FlexCop chip on your card is %d\n", __FILE__, adapter->b2c2_revision);
-+ printk("%s: This driver works only with FlexCopII(rev.130), FlexCopIIB(rev.195) and FlexCopIII(rev.192).\n", __FILE__);
-+ free_adapter_object(adapter);
-+ pci_set_drvdata(pdev, NULL);
-+ release_region(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
-+ release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
- return -ENODEV;
- }
-
-- tmp = ReadRegDW(adapter, 0x204);
-+ decide_how_many_hw_filters(adapter);
-+
-+ init_pids(adapter);
-+
-+ tmp = read_reg_dw(adapter, 0x204);
-
-- WriteRegDW(adapter, 0x204, 0);
-+ write_reg_dw(adapter, 0x204, 0);
- mdelay(20);
-
-- WriteRegDW(adapter, 0x204, tmp);
-+ write_reg_dw(adapter, 0x204, tmp);
- mdelay(10);
-
-- tmp = ReadRegDW(adapter, 0x308);
-- WriteRegDW(adapter, 0x308, 0x4000 | tmp);
-+ tmp = read_reg_dw(adapter, 0x308);
-+ write_reg_dw(adapter, 0x308, 0x4000 | tmp);
-
-- adapter->dwSramType = 0x10000;
-+ adapter->dw_sram_type = 0x10000;
-
-- SLL_detectSramSize(adapter);
-+ sll_detect_sram_size(adapter);
-
-- dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, SRAM_length(adapter), adapter->dwSramType);
-+ dprintk("%s sram length = %d, sram type= %x\n", __FUNCTION__, sram_length(adapter), adapter->dw_sram_type);
-
-- SRAMSetMediaDest(adapter, 1);
-- SRAMSetNetDest(adapter, 1);
-+ sram_set_media_dest(adapter, 1);
-+ sram_set_net_dest(adapter, 1);
-
-- CtrlEnableSmc(adapter, 0);
-+ ctrl_enable_smc(adapter, 0);
-
-- SRAMSetCaiDest(adapter, 2);
-- SRAMSetCaoDest(adapter, 2);
-+ sram_set_cai_dest(adapter, 2);
-+ sram_set_cao_dest(adapter, 2);
-
-- DmaEnableDisableIrq(adapter, 1, 0, 0);
-+ dma_enable_disable_irq(adapter, 1, 0, 0);
-
-- if (EEPROM_getMacAddr(adapter, 0, adapter->mac_addr) != 0) {
-- printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0], adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5], adapter->mac_addr[6], adapter->mac_addr[7]
-+ if (eeprom_get_mac_addr(adapter, 0, adapter->mac_addr) != 0) {
-+ printk("%s MAC address = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x \n", __FUNCTION__, adapter->mac_addr[0],
-+ adapter->mac_addr[1], adapter->mac_addr[2], adapter->mac_addr[3], adapter->mac_addr[4], adapter->mac_addr[5],
-+ adapter->mac_addr[6], adapter->mac_addr[7]
- );
-
-- CASetMacDstAddrFilter(adapter, adapter->mac_addr);
-- CtrlEnableMAC(adapter, 1);
-+ ca_set_mac_dst_addr_filter(adapter, adapter->mac_addr);
-+ ctrl_enable_mac(adapter, 1);
- }
-
-- EEPROM_readKey(adapter, key, 16);
--
-- printk("%s key = \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n %02x %02x %02x %02x \n", __FUNCTION__, key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7], key[8], key[9], key[10], key[11], key[12], key[13], key[14], key[15]);
--
- adapter->lock = SPIN_LOCK_UNLOCKED;
-
- return 0;
- }
-
--static void DriverHalt(struct pci_dev *pdev)
-+static void driver_halt(struct pci_dev *pdev)
- {
- struct adapter *adapter;
-
- adapter = pci_get_drvdata(pdev);
-
-- IrqDmaEnableDisableIrq(adapter, 0);
-+ irq_dma_enable_disable_irq(adapter, 0);
-
-- CtrlEnableReceiveData(adapter, 0);
-+ ctrl_enable_receive_data(adapter, 0);
-
-- FreeAdapterObject(adapter);
-+ free_adapter_object(adapter);
-
- pci_set_drvdata(pdev, NULL);
-
-@@ -2212,7 +2001,7 @@ static int dvb_start_feed(struct dvb_dem
-
- dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
-
-- OpenStream(adapter, dvbdmxfeed->pid);
-+ open_stream(adapter, dvbdmxfeed->pid);
-
- return 0;
- }
-@@ -2224,7 +2013,7 @@ static int dvb_stop_feed(struct dvb_demu
-
- dprintk("%s: PID=%d, type=%d\n", __FUNCTION__, dvbdmxfeed->pid, dvbdmxfeed->type);
-
-- CloseStream(adapter, dvbdmxfeed->pid);
-+ close_stream(adapter, dvbdmxfeed->pid);
-
- return 0;
- }
-@@ -2232,23 +2021,23 @@ static int dvb_stop_feed(struct dvb_demu
- /* lnb control */
- static void set_tuner_tone(struct adapter *adapter, u8 tone)
- {
-- u16 wzHalfPeriodFor45MHz[] = { 0x01FF, 0x0154, 0x00FF, 0x00CC };
-+ u16 wz_half_period_for_45_mhz[] = { 0x01ff, 0x0154, 0x00ff, 0x00cc };
- u16 ax;
-
- dprintk("%s: %u\n", __FUNCTION__, tone);
-
- switch (tone) {
- case 1:
-- ax = wzHalfPeriodFor45MHz[0];
-+ ax = wz_half_period_for_45_mhz[0];
- break;
- case 2:
-- ax = wzHalfPeriodFor45MHz[1];
-+ ax = wz_half_period_for_45_mhz[1];
- break;
- case 3:
-- ax = wzHalfPeriodFor45MHz[2];
-+ ax = wz_half_period_for_45_mhz[2];
- break;
- case 4:
-- ax = wzHalfPeriodFor45MHz[3];
-+ ax = wz_half_period_for_45_mhz[3];
- break;
-
- default:
-@@ -2256,11 +2045,11 @@ static void set_tuner_tone(struct adapte
- }
-
- if (ax != 0) {
-- WriteRegDW(adapter, 0x200, ((ax << 0x0F) + (ax & 0x7FFF)) | 0x40000000);
-+ write_reg_dw(adapter, 0x200, ((ax << 0x0f) + (ax & 0x7fff)) | 0x40000000);
-
- } else {
-
-- WriteRegDW(adapter, 0x200, 0x40FF8000);
-+ write_reg_dw(adapter, 0x200, 0x40ff8000);
- }
- }
-
-@@ -2270,7 +2059,7 @@ static void set_tuner_polarity(struct ad
-
- dprintk("%s : polarity = %u \n", __FUNCTION__, polarity);
-
-- var = ReadRegDW(adapter, 0x204);
-+ var = read_reg_dw(adapter, 0x204);
-
- if (polarity == 0) {
- dprintk("%s: LNB power off\n", __FUNCTION__);
-@@ -2287,82 +2076,150 @@ static void set_tuner_polarity(struct ad
- var = var | 4;
- }
-
-- WriteRegDW(adapter, 0x204, var);
-+ write_reg_dw(adapter, 0x204, var);
- }
-
--static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
-+static void diseqc_send_bit(struct adapter *adapter, int data)
- {
-- struct adapter *adapter = fe->before_after_data;
-+ set_tuner_tone(adapter, 1);
-+ udelay(data ? 500 : 1000);
-+ set_tuner_tone(adapter, 0);
-+ udelay(data ? 1000 : 500);
-+}
-
-- switch (cmd) {
-- case FE_SLEEP:
-+
-+static void diseqc_send_byte(struct adapter *adapter, int data)
- {
-- printk("%s: FE_SLEEP\n", __FUNCTION__);
-+ int i, par = 1, d;
-
-- set_tuner_polarity(adapter, 0);
-+ for (i = 7; i >= 0; i--) {
-+ d = (data >> i) & 1;
-+ par ^= d;
-+ diseqc_send_bit(adapter, d);
-+ }
-
-- // return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
-- return -EOPNOTSUPP;
-+ diseqc_send_bit(adapter, par);
- }
-
-- case FE_SET_VOLTAGE:
-- {
-- dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
-
-- switch ((fe_sec_voltage_t) arg) {
-- case SEC_VOLTAGE_13:
-+static int send_diseqc_msg(struct adapter *adapter, int len, u8 *msg, unsigned long burst)
-+{
-+ int i;
-
-- printk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
-+ set_tuner_tone(adapter, 0);
-+ mdelay(16);
-
-- set_tuner_polarity(adapter, 1);
-+ for (i = 0; i < len; i++)
-+ diseqc_send_byte(adapter, msg[i]);
-
-- break;
-+ mdelay(16);
-
-- case SEC_VOLTAGE_18:
-+ if (burst != -1) {
-+ if (burst)
-+ diseqc_send_byte(adapter, 0xff);
-+ else {
-+ set_tuner_tone(adapter, 1);
-+ udelay(12500);
-+ set_tuner_tone(adapter, 0);
-+ }
-+ dvb_delay(20);
-+ }
-
-- printk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
-+ return 0;
-+}
-
-- set_tuner_polarity(adapter, 2);
-
-+int soft_diseqc(struct adapter *adapter, unsigned int cmd, void *arg)
-+{
-+ switch (cmd) {
-+ case FE_SET_TONE:
-+ switch ((fe_sec_tone_mode_t) arg) {
-+ case SEC_TONE_ON:
-+ set_tuner_tone(adapter, 1);
-+ break;
-+ case SEC_TONE_OFF:
-+ set_tuner_tone(adapter, 0);
- break;
--
- default:
--
- return -EINVAL;
- };
-+ break;
-
-+ case FE_DISEQC_SEND_MASTER_CMD:
-+ {
-+ struct dvb_diseqc_master_cmd *cmd = arg;
-+
-+ send_diseqc_msg(adapter, cmd->msg_len, cmd->msg, 0);
- break;
- }
-
-- case FE_SET_TONE:
-+ case FE_DISEQC_SEND_BURST:
-+ send_diseqc_msg(adapter, 0, NULL, (unsigned long) arg);
-+ break;
-+
-+ default:
-+ return -EOPNOTSUPP;
-+ };
-+
-+ return 0;
-+}
-+
-+static int flexcop_diseqc_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
- {
-- dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
-+ struct adapter *adapter = fe->before_after_data;
-
-- switch ((fe_sec_tone_mode_t) arg) {
-- case SEC_TONE_ON:
-+ struct dvb_frontend_info info;
-
-- printk("%s: SEC_TONE_ON, %x\n", __FUNCTION__, SEC_TONE_ON);
-+ fe->ioctl(fe, FE_GET_INFO, &info);
-
-- set_tuner_tone(adapter, 1);
-+ // we must use different DiSEqC hw
-
-- break;
-+ if (strcmp(info.name, "Zarlink MT312") == 0) {
-+ //VP310 using mt312 driver for tuning only: diseqc not wired
-+ //use FCII instead
-+ if (!soft_diseqc(adapter, cmd, arg))
-+ return 0;
-+ }
-
-- case SEC_TONE_OFF:
-+ switch (cmd) {
-+ case FE_SLEEP:
-+ {
-+ dprintk("%s: FE_SLEEP\n", __FUNCTION__);
-
-- printk("%s: SEC_TONE_OFF, %x\n", __FUNCTION__, SEC_TONE_OFF);
-+ set_tuner_polarity(adapter, 0);
-
-- set_tuner_tone(adapter, 0);
-+ // return -EOPNOTSUPP, to make DVB core also send "FE_SLEEP" command to frontend.
-+ return -EOPNOTSUPP;
-+ }
-
-- break;
-+ case FE_SET_VOLTAGE:
-+ {
-+ dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
-+
-+ switch ((fe_sec_voltage_t) arg) {
-+ case SEC_VOLTAGE_13:
-+
-+ dprintk("%s: SEC_VOLTAGE_13, %x\n", __FUNCTION__, SEC_VOLTAGE_13);
-+
-+ set_tuner_polarity(adapter, 1);
-+
-+ return 0;
-+
-+ case SEC_VOLTAGE_18:
-+
-+ dprintk("%s: SEC_VOLTAGE_18, %x\n", __FUNCTION__, SEC_VOLTAGE_18);
-+
-+ set_tuner_polarity(adapter, 2);
-+
-+ return 0;
-
- default:
-
- return -EINVAL;
- };
--
-- break;
- }
-
-+
- default:
-
- return -EOPNOTSUPP;
-@@ -2382,7 +2239,7 @@ static int skystar2_probe(struct pci_dev
- if (pdev == NULL)
- return -ENODEV;
-
-- if (DriverInitialize(pdev) != 0)
-+ if (driver_initialize(pdev) != 0)
- return -ENODEV;
-
- dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name);
-@@ -2390,7 +2247,7 @@ static int skystar2_probe(struct pci_dev
- if (dvb_adapter == NULL) {
- printk("%s: Error registering DVB adapter\n", __FUNCTION__);
-
-- DriverHalt(pdev);
-+ driver_halt(pdev);
-
- return -ENODEV;
- }
-@@ -2411,8 +2268,8 @@ static int skystar2_probe(struct pci_dev
- dvbdemux = &adapter->demux;
-
- dvbdemux->priv = (void *) adapter;
-- dvbdemux->filternum = 32;
-- dvbdemux->feednum = 32;
-+ dvbdemux->filternum = N_PID_SLOTS;
-+ dvbdemux->feednum = N_PID_SLOTS;
- dvbdemux->start_feed = dvb_start_feed;
- dvbdemux->stop_feed = dvb_stop_feed;
- dvbdemux->write_to_decoder = 0;
-@@ -2422,7 +2279,7 @@ static int skystar2_probe(struct pci_dev
-
- adapter->hw_frontend.source = DMX_FRONTEND_0;
-
-- adapter->dmxdev.filternum = 32;
-+ adapter->dmxdev.filternum = N_PID_SLOTS;
- adapter->dmxdev.demux = &dvbdemux->dmx;
- adapter->dmxdev.capabilities = 0;
-
-@@ -2475,13 +2332,13 @@ static void skystar2_remove(struct pci_d
-
- dvb_unregister_adapter(adapter->dvb_adapter);
- }
--
-- DriverHalt(pdev);
-+ driver_halt(pdev);
- }
- }
-
- static struct pci_device_id skystar2_pci_tbl[] = {
-- {0x000013D0, 0x00002103, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000},
-+ {0x000013d0, 0x00002103, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000},
-+ {0x000013d0, 0x00002200, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000}, //FCIII
- {0,},
- };
-
-@@ -2505,5 +2362,10 @@ static void skystar2_cleanup(void)
- module_init(skystar2_init);
- module_exit(skystar2_cleanup);
-
-+MODULE_PARM(debug, "i");
-+MODULE_PARM_DESC(debug, "enable verbose debug messages: supported values: 1 and 2");
-+MODULE_PARM(enable_hw_filters, "i");
-+MODULE_PARM_DESC(enable_hw_filters, "enable hardware filters: supported values: 0 (none), 1, 2");
-+
- MODULE_DESCRIPTION("Technisat SkyStar2 DVB PCI Driver");
- MODULE_LICENSE("GPL");
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/bt8xx/bt878.c 2003-12-28 23:22:40.000000000 -0800
-@@ -0,0 +1,614 @@
-+/*
-+ * bt878.c: part of the driver for the Pinnacle PCTV Sat DVB PCI card
-+ *
-+ * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
-+ *
-+ * large parts based on the bttv driver
-+ * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)
-+ * & Marcus Metzler (mocm@thp.uni-koeln.de)
-+ * (c) 1999,2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
-+ *
-+ */
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <asm/io.h>
-+#include <linux/ioport.h>
-+#include <asm/pgtable.h>
-+#include <asm/page.h>
-+#include <linux/types.h>
-+#include <linux/interrupt.h>
-+#include <linux/kmod.h>
-+#include <linux/vmalloc.h>
-+#include <linux/init.h>
-+
-+#include "dmxdev.h"
-+#include "dvbdev.h"
-+#include "bt878.h"
-+#include "dst-bt878.h"
-+
-+#include "dvb_functions.h"
-+
-+/**************************************/
-+/* Miscellaneous utility definitions */
-+/**************************************/
-+
-+unsigned int bt878_verbose = 1;
-+unsigned int bt878_debug = 0;
-+MODULE_PARM(bt878_verbose, "i");
-+MODULE_PARM_DESC(bt878_verbose,
-+ "verbose startup messages, default is 1 (yes)");
-+MODULE_PARM(bt878_debug, "i");
-+MODULE_PARM_DESC(bt878_debug, "debug messages, default is 0 (no)");
-+MODULE_LICENSE("GPL");
-+
-+int bt878_num;
-+struct bt878 bt878[BT878_MAX];
-+
-+EXPORT_SYMBOL(bt878_debug);
-+EXPORT_SYMBOL(bt878_verbose);
-+EXPORT_SYMBOL(bt878_num);
-+EXPORT_SYMBOL(bt878);
-+
-+#define btwrite(dat,adr) bmtwrite((dat), (bt->bt878_mem+(adr)))
-+#define btread(adr) bmtread(bt->bt878_mem+(adr))
-+
-+#define btand(dat,adr) btwrite((dat) & btread(adr), adr)
-+#define btor(dat,adr) btwrite((dat) | btread(adr), adr)
-+#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr)
-+
-+#if defined(dprintk)
-+#undef dprintk
-+#endif
-+#define dprintk if(bt878_debug) printk
-+
-+static void bt878_mem_free(struct bt878 *bt)
-+{
-+ if (bt->buf_cpu) {
-+ pci_free_consistent(bt->dev, bt->buf_size, bt->buf_cpu,
-+ bt->buf_dma);
-+ bt->buf_cpu = NULL;
-+ }
-+
-+ if (bt->risc_cpu) {
-+ pci_free_consistent(bt->dev, bt->risc_size, bt->risc_cpu,
-+ bt->risc_dma);
-+ bt->risc_cpu = NULL;
-+ }
-+}
-+
-+static int bt878_mem_alloc(struct bt878 *bt)
-+{
-+ if (!bt->buf_cpu) {
-+ bt->buf_size = 128 * 1024;
-+
-+ bt->buf_cpu =
-+ pci_alloc_consistent(bt->dev, bt->buf_size,
-+ &bt->buf_dma);
-+
-+ if (!bt->buf_cpu)
-+ return -ENOMEM;
-+
-+ memset(bt->buf_cpu, 0, bt->buf_size);
-+ }
-+
-+ if (!bt->risc_cpu) {
-+ bt->risc_size = PAGE_SIZE;
-+ bt->risc_cpu =
-+ pci_alloc_consistent(bt->dev, bt->risc_size,
-+ &bt->risc_dma);
-+
-+ if (!bt->risc_cpu) {
-+ bt878_mem_free(bt);
-+ return -ENOMEM;
-+ }
-+
-+ memset(bt->risc_cpu, 0, bt->risc_size);
-+ }
-+
-+ return 0;
-+}
-+
-+/* RISC instructions */
-+#define RISC_WRITE (0x01 << 28)
-+#define RISC_JUMP (0x07 << 28)
-+#define RISC_SYNC (0x08 << 28)
-+
-+/* RISC bits */
-+#define RISC_WR_SOL (1 << 27)
-+#define RISC_WR_EOL (1 << 26)
-+#define RISC_IRQ (1 << 24)
-+#define RISC_STATUS(status) ((((~status) & 0x0F) << 20) | ((status & 0x0F) << 16))
-+#define RISC_SYNC_RESYNC (1 << 15)
-+#define RISC_SYNC_FM1 0x06
-+#define RISC_SYNC_VRO 0x0C
-+
-+#define RISC_FLUSH() bt->risc_pos = 0
-+#define RISC_INSTR(instr) bt->risc_cpu[bt->risc_pos++] = cpu_to_le32(instr)
-+
-+static int bt878_make_risc(struct bt878 *bt)
-+{
-+ bt->block_bytes = bt->buf_size >> 4;
-+ bt->block_count = 1 << 4;
-+ bt->line_bytes = bt->block_bytes;
-+ bt->line_count = bt->block_count;
-+
-+ while (bt->line_bytes > 4095) {
-+ bt->line_bytes >>= 1;
-+ bt->line_count <<= 1;
-+ }
-+
-+ if (bt->line_count > 255) {
-+ printk("bt878: buffer size error!\n");
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+
-+static void bt878_risc_program(struct bt878 *bt, u32 op_sync_orin)
-+{
-+ u32 buf_pos = 0;
-+ u32 line;
-+
-+ RISC_FLUSH();
-+ RISC_INSTR(RISC_SYNC | RISC_SYNC_FM1 | op_sync_orin);
-+ RISC_INSTR(0);
-+
-+ dprintk("bt878: risc len lines %u, bytes per line %u\n",
-+ bt->line_count, bt->line_bytes);
-+ for (line = 0; line < bt->line_count; line++) {
-+ // At the beginning of every block we issue an IRQ with previous (finished) block number set
-+ if (!(buf_pos % bt->block_bytes))
-+ RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
-+ RISC_IRQ |
-+ RISC_STATUS(((buf_pos /
-+ bt->block_bytes) +
-+ (bt->block_count -
-+ 1)) %
-+ bt->block_count) | bt->
-+ line_bytes);
-+ else
-+ RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
-+ bt->line_bytes);
-+ RISC_INSTR(bt->buf_dma + buf_pos);
-+ buf_pos += bt->line_bytes;
-+ }
-+
-+ RISC_INSTR(RISC_SYNC | op_sync_orin | RISC_SYNC_VRO);
-+ RISC_INSTR(0);
-+
-+ RISC_INSTR(RISC_JUMP);
-+ RISC_INSTR(bt->risc_dma);
-+
-+ btwrite((bt->line_count << 16) | bt->line_bytes, BT878_APACK_LEN);
-+}
-+
-+/*****************************/
-+/* Start/Stop grabbing funcs */
-+/*****************************/
-+
-+void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
-+ u32 irq_err_ignore)
-+{
-+ u32 int_mask;
-+
-+ dprintk("bt878 debug: bt878_start (ctl=%8.8x)\n", controlreg);
-+ /* complete the writing of the risc dma program now we have
-+ * the card specifics
-+ */
-+ bt878_risc_program(bt, op_sync_orin);
-+ controlreg &= ~0x1f;
-+ controlreg |= 0x1b;
-+
-+ btwrite(cpu_to_le32(bt->risc_dma), BT878_ARISC_START);
-+
-+ /* original int mask had :
-+ * 6 2 8 4 0
-+ * 1111 1111 1000 0000 0000
-+ * SCERR|OCERR|PABORT|RIPERR|FDSR|FTRGT|FBUS|RISCI
-+ * Hacked for DST to:
-+ * SCERR | OCERR | FDSR | FTRGT | FBUS | RISCI
-+ */
-+ int_mask = BT878_ASCERR | BT878_AOCERR | BT878_APABORT |
-+ BT878_ARIPERR | BT878_APPERR | BT878_AFDSR | BT878_AFTRGT |
-+ BT878_AFBUS | BT878_ARISCI;
-+
-+
-+ /* ignore pesky bits */
-+ int_mask &= ~irq_err_ignore;
-+
-+ btwrite(int_mask, BT878_AINT_MASK);
-+ btwrite(controlreg, BT878_AGPIO_DMA_CTL);
-+}
-+
-+void bt878_stop(struct bt878 *bt)
-+{
-+ u32 stat;
-+ int i = 0;
-+
-+ dprintk("bt878 debug: bt878_stop\n");
-+
-+ btwrite(0, BT878_AINT_MASK);
-+ btand(~0x13, BT878_AGPIO_DMA_CTL);
-+
-+ do {
-+ stat = btread(BT878_AINT_STAT);
-+ if (!(stat & BT878_ARISC_EN))
-+ break;
-+ i++;
-+ } while (i < 500);
-+
-+ dprintk("bt878(%d) debug: bt878_stop, i=%d, stat=0x%8.8x\n",
-+ bt->nr, i, stat);
-+}
-+
-+EXPORT_SYMBOL(bt878_start);
-+EXPORT_SYMBOL(bt878_stop);
-+
-+/*****************************/
-+/* Interrupt service routine */
-+/*****************************/
-+
-+static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ u32 stat, astat, mask;
-+ int count;
-+ struct bt878 *bt;
-+
-+ bt = (struct bt878 *) dev_id;
-+
-+ count = 0;
-+ while (1) {
-+ stat = btread(BT878_AINT_STAT);
-+ mask = btread(BT878_AINT_MASK);
-+ if (!(astat = (stat & mask)))
-+ return IRQ_NONE; /* this interrupt is not for me */
-+/* dprintk("bt878(%d) debug: irq count %d, stat 0x%8.8x, mask 0x%8.8x\n",bt->nr,count,stat,mask); */
-+ btwrite(astat, BT878_AINT_STAT); /* try to clear interupt condition */
-+
-+
-+ if (astat & (BT878_ASCERR | BT878_AOCERR)) {
-+ if (bt878_verbose) {
-+ printk("bt878(%d): irq%s%s risc_pc=%08x\n",
-+ bt->nr,
-+ (astat & BT878_ASCERR) ? " SCERR" :
-+ "",
-+ (astat & BT878_AOCERR) ? " OCERR" :
-+ "", btread(BT878_ARISC_PC));
-+ }
-+ }
-+ if (astat & (BT878_APABORT | BT878_ARIPERR | BT878_APPERR)) {
-+ if (bt878_verbose) {
-+ printk
-+ ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
-+ bt->nr,
-+ (astat & BT878_APABORT) ? " PABORT" :
-+ "",
-+ (astat & BT878_ARIPERR) ? " RIPERR" :
-+ "",
-+ (astat & BT878_APPERR) ? " PPERR" :
-+ "", btread(BT878_ARISC_PC));
-+ }
-+ }
-+ if (astat & (BT878_AFDSR | BT878_AFTRGT | BT878_AFBUS)) {
-+ if (bt878_verbose) {
-+ printk
-+ ("bt878(%d): irq%s%s%s risc_pc=%08x\n",
-+ bt->nr,
-+ (astat & BT878_AFDSR) ? " FDSR" : "",
-+ (astat & BT878_AFTRGT) ? " FTRGT" :
-+ "",
-+ (astat & BT878_AFBUS) ? " FBUS" : "",
-+ btread(BT878_ARISC_PC));
-+ }
-+ }
-+ if (astat & BT878_ARISCI) {
-+ bt->finished_block = (stat & BT878_ARISCS) >> 28;
-+ tasklet_schedule(&bt->tasklet);
-+ break;
-+ }
-+ count++;
-+ if (count > 20) {
-+ btwrite(0, BT878_AINT_MASK);
-+ printk(KERN_ERR
-+ "bt878(%d): IRQ lockup, cleared int mask\n",
-+ bt->nr);
-+ break;
-+ }
-+ }
-+ return IRQ_HANDLED;
-+}
-+
-+extern int bttv_gpio_enable(unsigned int card, unsigned long mask, unsigned long data);
-+extern int bttv_read_gpio(unsigned int card, unsigned long *data);
-+extern int bttv_write_gpio(unsigned int card, unsigned long mask, unsigned long data);
-+
-+int
-+bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp)
-+{
-+ int retval;
-+
-+ retval = 0;
-+ if (down_interruptible (&bt->gpio_lock))
-+ return -ERESTARTSYS;
-+ /* special gpio signal */
-+ switch (cmd) {
-+ case DST_IG_ENABLE:
-+ // dprintk("dvb_bt8xx: dst enable mask 0x%02x enb 0x%02x \n", mp->dstg.enb.mask, mp->dstg.enb.enable);
-+ retval = bttv_gpio_enable(bt->bttv_nr,
-+ mp->enb.mask,
-+ mp->enb.enable);
-+ break;
-+ case DST_IG_WRITE:
-+ // dprintk("dvb_bt8xx: dst write gpio mask 0x%02x out 0x%02x\n", mp->dstg.outp.mask, mp->dstg.outp.highvals);
-+ retval = bttv_write_gpio(bt->bttv_nr,
-+ mp->outp.mask,
-+ mp->outp.highvals);
-+
-+ break;
-+ case DST_IG_READ:
-+ /* read */
-+ retval = bttv_read_gpio(bt->bttv_nr, &mp->rd.value);
-+ // dprintk("dvb_bt8xx: dst read gpio 0x%02x\n", (unsigned)mp->dstg.rd.value);
-+ break;
-+ case DST_IG_TS:
-+ /* Set packet size */
-+ bt->TS_Size = mp->psize;
-+ break;
-+
-+ default:
-+ retval = -EINVAL;
-+ break;
-+ }
-+ up(&bt->gpio_lock);
-+ return retval;
-+}
-+
-+EXPORT_SYMBOL(bt878_device_control);
-+
-+struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap)
-+{
-+ unsigned int card_nr;
-+
-+ printk("bt878 find by dvb adap: checking \"%s\"\n",adap->name);
-+ for (card_nr = 0; card_nr < bt878_num; card_nr++) {
-+ if (bt878[card_nr].adap_ptr == adap)
-+ return &bt878[card_nr];
-+ }
-+ printk("bt878 find by dvb adap: NOT found \"%s\"\n",adap->name);
-+ return NULL;
-+}
-+
-+EXPORT_SYMBOL(bt878_find_by_dvb_adap);
-+
-+/***********************/
-+/* PCI device handling */
-+/***********************/
-+
-+static int __devinit bt878_probe(struct pci_dev *dev,
-+ const struct pci_device_id *pci_id)
-+{
-+ int result;
-+ unsigned char lat;
-+ struct bt878 *bt;
-+#if defined(__powerpc__)
-+ unsigned int cmd;
-+#endif
-+
-+ printk(KERN_INFO "bt878: Bt878 AUDIO function found (%d).\n",
-+ bt878_num);
-+
-+ bt = &bt878[bt878_num];
-+ bt->dev = dev;
-+ bt->nr = bt878_num;
-+ bt->shutdown = 0;
-+
-+ bt->id = dev->device;
-+ bt->irq = dev->irq;
-+ bt->bt878_adr = pci_resource_start(dev, 0);
-+ if (pci_enable_device(dev))
-+ return -EIO;
-+ if (!request_mem_region(pci_resource_start(dev, 0),
-+ pci_resource_len(dev, 0), "bt878")) {
-+ return -EBUSY;
-+ }
-+
-+ pci_read_config_byte(dev, PCI_CLASS_REVISION, &bt->revision);
-+ pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
-+ printk(KERN_INFO "bt878(%d): Bt%x (rev %d) at %02x:%02x.%x, ",
-+ bt878_num, bt->id, bt->revision, dev->bus->number,
-+ PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
-+ printk("irq: %d, latency: %d, memory: 0x%lx\n",
-+ bt->irq, lat, bt->bt878_adr);
-+
-+
-+#if defined(__powerpc__)
-+ /* on OpenFirmware machines (PowerMac at least), PCI memory cycle */
-+ /* response on cards with no firmware is not enabled by OF */
-+ pci_read_config_dword(dev, PCI_COMMAND, &cmd);
-+ cmd = (cmd | PCI_COMMAND_MEMORY);
-+ pci_write_config_dword(dev, PCI_COMMAND, cmd);
-+#endif
-+
-+#ifdef __sparc__
-+ bt->bt878_mem = (unsigned char *) bt->bt878_adr;
-+#else
-+ bt->bt878_mem = ioremap(bt->bt878_adr, 0x1000);
-+#endif
-+
-+ /* clear interrupt mask */
-+ btwrite(0, BT848_INT_MASK);
-+
-+ result = request_irq(bt->irq, bt878_irq,
-+ SA_SHIRQ | SA_INTERRUPT, "bt878",
-+ (void *) bt);
-+ if (result == -EINVAL) {
-+ printk(KERN_ERR "bt878(%d): Bad irq number or handler\n",
-+ bt878_num);
-+ goto fail1;
-+ }
-+ if (result == -EBUSY) {
-+ printk(KERN_ERR
-+ "bt878(%d): IRQ %d busy, change your PnP config in BIOS\n",
-+ bt878_num, bt->irq);
-+ goto fail1;
-+ }
-+ if (result < 0)
-+ goto fail1;
-+
-+ pci_set_master(dev);
-+ pci_set_drvdata(dev, bt);
-+
-+/* if(init_bt878(btv) < 0) {
-+ bt878_remove(dev);
-+ return -EIO;
-+ }
-+*/
-+
-+ if ((result = bt878_mem_alloc(bt))) {
-+ printk("bt878: failed to allocate memory!\n");
-+ goto fail2;
-+ }
-+
-+ bt878_make_risc(bt);
-+ btwrite(0, BT878_AINT_MASK);
-+ bt878_num++;
-+
-+ return 0;
-+
-+ fail2:
-+ free_irq(bt->irq, bt);
-+ fail1:
-+ release_mem_region(pci_resource_start(bt->dev, 0),
-+ pci_resource_len(bt->dev, 0));
-+ return result;
-+}
-+
-+static void __devexit bt878_remove(struct pci_dev *pci_dev)
-+{
-+ u8 command;
-+ struct bt878 *bt = pci_get_drvdata(pci_dev);
-+
-+ if (bt878_verbose)
-+ printk("bt878(%d): unloading\n", bt->nr);
-+
-+ /* turn off all capturing, DMA and IRQs */
-+ btand(~13, BT878_AGPIO_DMA_CTL);
-+
-+ /* first disable interrupts before unmapping the memory! */
-+ btwrite(0, BT878_AINT_MASK);
-+ btwrite(~0x0UL, BT878_AINT_STAT);
-+
-+ /* disable PCI bus-mastering */
-+ pci_read_config_byte(bt->dev, PCI_COMMAND, &command);
-+ /* Should this be &=~ ?? */
-+ command &= ~PCI_COMMAND_MASTER;
-+ pci_write_config_byte(bt->dev, PCI_COMMAND, command);
-+
-+ free_irq(bt->irq, bt);
-+ printk(KERN_DEBUG "bt878_mem: 0x%p.\n", bt->bt878_mem);
-+ if (bt->bt878_mem)
-+ iounmap(bt->bt878_mem);
-+
-+ release_mem_region(pci_resource_start(bt->dev, 0),
-+ pci_resource_len(bt->dev, 0));
-+ /* wake up any waiting processes
-+ because shutdown flag is set, no new processes (in this queue)
-+ are expected
-+ */
-+ bt->shutdown = 1;
-+ bt878_mem_free(bt);
-+
-+ pci_set_drvdata(pci_dev, NULL);
-+ return;
-+}
-+
-+static struct pci_device_id bt878_pci_tbl[] __devinitdata = {
-+ {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BROOKTREE_878,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-+ {0,}
-+};
-+
-+MODULE_DEVICE_TABLE(pci, bt878_pci_tbl);
-+
-+static struct pci_driver bt878_pci_driver = {
-+ .name = "bt878",
-+ .id_table = bt878_pci_tbl,
-+ .probe = bt878_probe,
-+ .remove = bt878_remove,
-+};
-+
-+static int bt878_pci_driver_registered = 0;
-+
-+/* This will be used later by dvb-bt8xx to only use the audio
-+ * dma of certain cards */
-+int bt878_find_audio_dma(void)
-+{
-+ // pci_register_driver(&bt878_pci_driver);
-+ bt878_pci_driver_registered = 1;
-+ return 0;
-+}
-+
-+EXPORT_SYMBOL(bt878_find_audio_dma);
-+
-+/*******************************/
-+/* Module management functions */
-+/*******************************/
-+
-+int bt878_init_module(void)
-+{
-+ bt878_num = 0;
-+ bt878_pci_driver_registered = 0;
-+
-+ printk(KERN_INFO "bt878: AUDIO driver version %d.%d.%d loaded\n",
-+ (BT878_VERSION_CODE >> 16) & 0xff,
-+ (BT878_VERSION_CODE >> 8) & 0xff,
-+ BT878_VERSION_CODE & 0xff);
-+/*
-+ bt878_check_chipset();
-+*/
-+ /* later we register inside of bt878_find_audio_dma
-+ * because we may want to ignore certain cards */
-+ bt878_pci_driver_registered = 1;
-+ return pci_module_init(&bt878_pci_driver);
-+}
-+
-+void bt878_cleanup_module(void)
-+{
-+ if (bt878_pci_driver_registered) {
-+ bt878_pci_driver_registered = 0;
-+ pci_unregister_driver(&bt878_pci_driver);
-+ }
-+ return;
-+}
-+
-+EXPORT_SYMBOL(bt878_init_module);
-+EXPORT_SYMBOL(bt878_cleanup_module);
-+module_init(bt878_init_module);
-+module_exit(bt878_cleanup_module);
-+
-+/*
-+ * Local variables:
-+ * c-basic-offset: 8
-+ * End:
-+ */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/bt8xx/bt878.h 2003-12-28 23:22:37.000000000 -0800
-@@ -0,0 +1,145 @@
-+/*
-+ bt878.h - Bt878 audio module (register offsets)
-+
-+ Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+*/
-+
-+#ifndef _BT878_H_
-+#define _BT878_H_
-+
-+#include <linux/interrupt.h>
-+#include <linux/pci.h>
-+#include <linux/sched.h>
-+#include <linux/spinlock.h>
-+#include "bt848.h"
-+
-+#define BT878_VERSION_CODE 0x000000
-+
-+#define BT878_AINT_STAT 0x100
-+#define BT878_ARISCS (0xf<<28)
-+#define BT878_ARISC_EN (1<<27)
-+#define BT878_ASCERR (1<<19)
-+#define BT878_AOCERR (1<<18)
-+#define BT878_APABORT (1<<17)
-+#define BT878_ARIPERR (1<<16)
-+#define BT878_APPERR (1<<15)
-+#define BT878_AFDSR (1<<14)
-+#define BT878_AFTRGT (1<<13)
-+#define BT878_AFBUS (1<<12)
-+#define BT878_ARISCI (1<<11)
-+#define BT878_AOFLOW (1<<3)
-+
-+#define BT878_AINT_MASK 0x104
-+
-+#define BT878_AGPIO_DMA_CTL 0x10c
-+#define BT878_A_GAIN (0xf<<28)
-+#define BT878_A_G2X (1<<27)
-+#define BT878_A_PWRDN (1<<26)
-+#define BT878_A_SEL (3<<24)
-+#define BT878_DA_SCE (1<<23)
-+#define BT878_DA_LRI (1<<22)
-+#define BT878_DA_MLB (1<<21)
-+#define BT878_DA_LRD (0x1f<<16)
-+#define BT878_DA_DPM (1<<15)
-+#define BT878_DA_SBR (1<<14)
-+#define BT878_DA_ES2 (1<<13)
-+#define BT878_DA_LMT (1<<12)
-+#define BT878_DA_SDR (0xf<<8)
-+#define BT878_DA_IOM (3<<6)
-+#define BT878_DA_APP (1<<5)
-+#define BT878_ACAP_EN (1<<4)
-+#define BT878_PKTP (3<<2)
-+#define BT878_RISC_EN (1<<1)
-+#define BT878_FIFO_EN 1
-+
-+#define BT878_APACK_LEN 0x110
-+#define BT878_AFP_LEN (0xff<<16)
-+#define BT878_ALP_LEN 0xfff
-+
-+#define BT878_ARISC_START 0x114
-+
-+#define BT878_ARISC_PC 0x120
-+
-+/* BT878 FUNCTION 0 REGISTERS */
-+#define BT878_GPIO_DMA_CTL 0x10c
-+
-+/* Interrupt register */
-+#define BT878_INT_STAT 0x100
-+#define BT878_INT_MASK 0x104
-+#define BT878_I2CRACK (1<<25)
-+#define BT878_I2CDONE (1<<8)
-+
-+#define BT878_MAX 4
-+
-+#define BT878_RISC_SYNC_MASK (1 << 15)
-+
-+extern int bt878_num;
-+extern struct bt878 bt878[BT878_MAX];
-+
-+struct bt878 {
-+ struct semaphore gpio_lock;
-+ unsigned int nr;
-+ unsigned int bttv_nr;
-+ struct dvb_adapter *adap_ptr;
-+ struct pci_dev *dev;
-+ unsigned int id;
-+ unsigned int TS_Size;
-+ unsigned char revision;
-+ unsigned int irq;
-+ unsigned long bt878_adr;
-+ unsigned char *bt878_mem; /* function 1 */
-+
-+ volatile u32 finished_block;
-+ volatile u32 last_block;
-+ u32 block_count;
-+ u32 block_bytes;
-+ u32 line_bytes;
-+ u32 line_count;
-+
-+ u32 buf_size;
-+ u8 *buf_cpu;
-+ dma_addr_t buf_dma;
-+
-+ u32 risc_size;
-+ u32 *risc_cpu;
-+ dma_addr_t risc_dma;
-+ u32 risc_pos;
-+
-+ struct tasklet_struct tasklet;
-+ int shutdown;
-+};
-+
-+void bt878_start(struct bt878 *bt, u32 controlreg, u32 op_sync_orin,
-+ u32 irq_err_ignore);
-+void bt878_stop(struct bt878 *bt);
-+
-+#if defined(__powerpc__) /* big-endian */
-+extern __inline__ void io_st_le32(volatile unsigned *addr, unsigned val)
-+{
-+ __asm__ __volatile__("stwbrx %1,0,%2":"=m"(*addr):"r"(val),
-+ "r"(addr));
-+ __asm__ __volatile__("eieio":::"memory");
-+}
-+
-+#define bmtwrite(dat,adr) io_st_le32((unsigned *)(adr),(dat))
-+#define bmtread(adr) ld_le32((unsigned *)(adr))
-+#else
-+#define bmtwrite(dat,adr) writel((dat), (char *) (adr))
-+#define bmtread(adr) readl(adr)
-+#endif
-+
-+#endif
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/bt8xx/dvb-bt8xx.c 2003-12-28 23:22:40.000000000 -0800
-@@ -0,0 +1,530 @@
-+/*
-+ * Bt8xx based DVB adapter driver
-+ *
-+ * Copyright (C) 2002,2003 Florian Schirmer <schirmer@taytron.net>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <asm/bitops.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/slab.h>
-+#include <linux/i2c.h>
-+
-+#include "dmxdev.h"
-+#include "dvbdev.h"
-+#include "dvb_demux.h"
-+#include "dvb_frontend.h"
-+
-+#include "dvb-bt8xx.h"
-+
-+#include "dvb_functions.h"
-+
-+#include "bt878.h"
-+
-+/* ID THAT MUST GO INTO i2c ids */
-+#ifndef I2C_DRIVERID_DVB_BT878A
-+# define I2C_DRIVERID_DVB_BT878A I2C_DRIVERID_EXP0+10
-+#endif
-+
-+
-+#define dprintk if (debug) printk
-+
-+extern int bttv_get_cardinfo(unsigned int card, int *type, int *cardid);
-+extern struct pci_dev* bttv_get_pcidev(unsigned int card);
-+
-+static LIST_HEAD(card_list);
-+static int debug = 0;
-+
-+static void dvb_bt8xx_task(unsigned long data)
-+{
-+ struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *)data;
-+
-+ //printk("%d ", finished_block);
-+
-+ while (card->bt->last_block != card->bt->finished_block) {
-+ (card->bt->TS_Size ? dvb_dmx_swfilter_204 : dvb_dmx_swfilter)(&card->demux, &card->bt->buf_cpu[card->bt->last_block * card->bt->block_bytes], card->bt->block_bytes);
-+ card->bt->last_block = (card->bt->last_block + 1) % card->bt->block_count;
-+ }
-+}
-+
-+static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
-+{
-+ struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
-+ struct dvb_bt8xx_card *card = dvbdmx->priv;
-+
-+ dprintk("dvb_bt8xx: start_feed\n");
-+
-+ if (!dvbdmx->dmx.frontend)
-+ return -EINVAL;
-+
-+ if (card->active)
-+ return 0;
-+
-+ card->active = 1;
-+
-+// bt878_start(card->bt, card->gpio_mode);
-+
-+ return 0;
-+}
-+
-+static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
-+{
-+ struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
-+ struct dvb_bt8xx_card *card = dvbdmx->priv;
-+
-+ dprintk("dvb_bt8xx: stop_feed\n");
-+
-+ if (!dvbdmx->dmx.frontend)
-+ return -EINVAL;
-+
-+ if (!card->active)
-+ return 0;
-+
-+// bt878_stop(card->bt);
-+
-+ card->active = 0;
-+
-+ return 0;
-+}
-+
-+static int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], int num)
-+{
-+ struct dvb_bt8xx_card *card = i2c->data;
-+ int retval;
-+
-+ if (down_interruptible (&card->bt->gpio_lock))
-+ return -ERESTARTSYS;
-+
-+ retval = i2c_transfer(card->i2c_adapter,
-+ (struct i2c_msg*) msgs,
-+ num);
-+
-+ up(&card->bt->gpio_lock);
-+
-+ return retval;
-+}
-+
-+static int is_pci_slot_eq(struct pci_dev* adev, struct pci_dev* bdev)
-+{
-+ if ((adev->subsystem_vendor == bdev->subsystem_vendor) &&
-+ (adev->subsystem_device == bdev->subsystem_device) &&
-+ (adev->bus->number == bdev->bus->number) &&
-+ (PCI_SLOT(adev->devfn) == PCI_SLOT(bdev->devfn)))
-+ return 1;
-+ return 0;
-+}
-+
-+static struct bt878 __init *dvb_bt8xx_878_match(unsigned int bttv_nr, struct pci_dev* bttv_pci_dev)
-+{
-+ unsigned int card_nr;
-+
-+ /* Hmm, n squared. Hope n is small */
-+ for (card_nr = 0; card_nr < bt878_num; card_nr++) {
-+ if (is_pci_slot_eq(bt878[card_nr].dev, bttv_pci_dev))
-+ return &bt878[card_nr];
-+ }
-+ return NULL;
-+}
-+
-+static int __init dvb_bt8xx_card_match(unsigned int bttv_nr, char *card_name, u32 gpio_mode, u32 op_sync_orin, u32 irq_err_ignore)
-+{
-+ struct dvb_bt8xx_card *card;
-+ struct pci_dev* bttv_pci_dev;
-+
-+ dprintk("dvb_bt8xx: identified card%d as %s\n", bttv_nr, card_name);
-+
-+ if (!(card = kmalloc(sizeof(struct dvb_bt8xx_card), GFP_KERNEL)))
-+ return -ENOMEM;
-+
-+ memset(card, 0, sizeof(*card));
-+ card->bttv_nr = bttv_nr;
-+ strncpy(card->card_name, card_name, sizeof(card_name) - 1);
-+
-+ if (!(bttv_pci_dev = bttv_get_pcidev(bttv_nr))) {
-+ printk("dvb_bt8xx: no pci device for card %d\n", card->bttv_nr);
-+ kfree(card);
-+ return -EFAULT;
-+ }
-+
-+ if (!(card->bt = dvb_bt8xx_878_match(card->bttv_nr, bttv_pci_dev))) {
-+ printk("dvb_bt8xx: unable to determine DMA core of card %d\n", card->bttv_nr);
-+
-+ kfree(card);
-+ return -EFAULT;
-+
-+ }
-+ init_MUTEX(&card->bt->gpio_lock);
-+ card->bt->bttv_nr = bttv_nr;
-+ card->gpio_mode = gpio_mode;
-+ card->op_sync_orin = op_sync_orin;
-+ card->irq_err_ignore = irq_err_ignore;
-+ list_add_tail(&card->list, &card_list);
-+
-+ return 0;
-+}
-+
-+static struct dvb_bt8xx_card *dvb_bt8xx_find_by_i2c_adap(struct i2c_adapter *adap)
-+{
-+ struct dvb_bt8xx_card *card;
-+ struct list_head *item;
-+
-+ printk("find by i2c adap: checking \"%s\"\n",adap->name);
-+ list_for_each(item, &card_list) {
-+ card = list_entry(item, struct dvb_bt8xx_card, list);
-+ if (card->i2c_adapter == adap)
-+ return card;
-+ }
-+ return NULL;
-+}
-+
-+static struct dvb_bt8xx_card *dvb_bt8xx_find_by_pci(struct i2c_adapter *adap)
-+{
-+ struct dvb_bt8xx_card *card;
-+ struct list_head *item;
-+ struct device *dev;
-+ struct pci_dev *pci;
-+
-+ printk("find by pci: checking \"%s\"\n",adap->name);
-+ dev = adap->dev.parent;
-+ if (NULL == dev) {
-+ /* shoudn't happen with 2.6.0-test7 + newer */
-+ printk("attach: Huh? i2c adapter not in sysfs tree?\n");
-+ return 0;
-+ }
-+ pci = to_pci_dev(dev);
-+ list_for_each(item, &card_list) {
-+ card = list_entry(item, struct dvb_bt8xx_card, list);
-+ if (is_pci_slot_eq(pci, card->bt->dev)) {
-+ return card;
-+ }
-+ }
-+ return NULL;
-+}
-+
-+static int dvb_bt8xx_attach(struct i2c_adapter *adap)
-+{
-+ struct dvb_bt8xx_card *card;
-+
-+ printk("attach: checking \"%s\"\n",adap->name);
-+
-+ /* looking for bt878 cards ... */
-+ if (adap->id != (I2C_ALGO_BIT | I2C_HW_B_BT848))
-+ return 0;
-+ card = dvb_bt8xx_find_by_pci(adap);
-+ if (!card)
-+ return 0;
-+ card->i2c_adapter = adap;
-+ printk("attach: \"%s\", to card %d\n",
-+ adap->name, card->bttv_nr);
-+ try_module_get(adap->owner);
-+
-+ return 0;
-+}
-+
-+static void dvb_bt8xx_i2c_adap_free(struct i2c_adapter *adap)
-+{
-+ module_put(adap->owner);
-+}
-+
-+static int dvb_bt8xx_detach(struct i2c_adapter *adap)
-+{
-+ struct dvb_bt8xx_card *card;
-+
-+ card = dvb_bt8xx_find_by_i2c_adap(adap);
-+ if (!card)
-+ return 0;
-+
-+ /* This should not happen. We have locked the module! */
-+ printk("detach: \"%s\", for card %d removed\n",
-+ adap->name, card->bttv_nr);
-+ return 0;
-+}
-+
-+static struct i2c_driver dvb_bt8xx_driver = {
-+ .owner = THIS_MODULE,
-+ .name = "dvb_bt8xx",
-+ .id = I2C_DRIVERID_DVB_BT878A,
-+ .flags = I2C_DF_NOTIFY,
-+ .attach_adapter = dvb_bt8xx_attach,
-+ .detach_adapter = dvb_bt8xx_detach,
-+};
-+
-+static void __init dvb_bt8xx_get_adaps(void)
-+{
-+ i2c_add_driver(&dvb_bt8xx_driver);
-+}
-+
-+static void __exit dvb_bt8xx_exit_adaps(void)
-+{
-+ i2c_del_driver(&dvb_bt8xx_driver);
-+}
-+
-+static int __init dvb_bt8xx_load_card( struct dvb_bt8xx_card *card)
-+{
-+ int result;
-+
-+ if (!card->i2c_adapter) {
-+ printk("dvb_bt8xx: unable to determine i2c adaptor of card %d, deleting\n", card->bttv_nr);
-+
-+ return -EFAULT;
-+
-+ }
-+
-+ if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name)) < 0) {
-+
-+ printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result);
-+
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+ return result;
-+
-+ }
-+ card->bt->adap_ptr = card->dvb_adapter;
-+
-+ if (!(dvb_register_i2c_bus(master_xfer, card, card->dvb_adapter, 0))) {
-+ printk("dvb_bt8xx: dvb_register_i2c_bus of card%d failed\n", card->bttv_nr);
-+
-+ dvb_unregister_adapter(card->dvb_adapter);
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+
-+ return -EFAULT;
-+ }
-+
-+ memset(&card->demux, 0, sizeof(struct dvb_demux));
-+
-+ card->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING;
-+
-+ card->demux.priv = card;
-+ card->demux.filternum = 256;
-+ card->demux.feednum = 256;
-+ card->demux.start_feed = dvb_bt8xx_start_feed;
-+ card->demux.stop_feed = dvb_bt8xx_stop_feed;
-+ card->demux.write_to_decoder = NULL;
-+
-+ if ((result = dvb_dmx_init(&card->demux)) < 0) {
-+ printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-+
-+ dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
-+ dvb_unregister_adapter(card->dvb_adapter);
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+
-+ return result;
-+ }
-+
-+ card->dmxdev.filternum = 256;
-+ card->dmxdev.demux = &card->demux.dmx;
-+ card->dmxdev.capabilities = 0;
-+
-+ if ((result = dvb_dmxdev_init(&card->dmxdev, card->dvb_adapter)) < 0) {
-+ printk("dvb_bt8xx: dvb_dmxdev_init failed (errno = %d)\n", result);
-+
-+ dvb_dmx_release(&card->demux);
-+ dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
-+ dvb_unregister_adapter(card->dvb_adapter);
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+
-+ return result;
-+ }
-+
-+ card->fe_hw.source = DMX_FRONTEND_0;
-+
-+ if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
-+ printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-+
-+ dvb_dmxdev_release(&card->dmxdev);
-+ dvb_dmx_release(&card->demux);
-+ dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
-+ dvb_unregister_adapter(card->dvb_adapter);
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+
-+ return result;
-+ }
-+
-+ card->fe_mem.source = DMX_MEMORY_FE;
-+
-+ if ((result = card->demux.dmx.add_frontend(&card->demux.dmx, &card->fe_mem)) < 0) {
-+ printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-+
-+ card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
-+ dvb_dmxdev_release(&card->dmxdev);
-+ dvb_dmx_release(&card->demux);
-+ dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
-+ dvb_unregister_adapter(card->dvb_adapter);
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+
-+ return result;
-+ }
-+
-+ if ((result = card->demux.dmx.connect_frontend(&card->demux.dmx, &card->fe_hw)) < 0) {
-+ printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);
-+
-+ card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
-+ card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
-+ dvb_dmxdev_release(&card->dmxdev);
-+ dvb_dmx_release(&card->demux);
-+ dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
-+ dvb_unregister_adapter(card->dvb_adapter);
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+
-+ return result;
-+ }
-+
-+ dvb_net_init(card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
-+
-+ tasklet_init(&card->bt->tasklet, dvb_bt8xx_task, (unsigned long) card);
-+
-+ bt878_start(card->bt, card->gpio_mode, card->op_sync_orin, card->irq_err_ignore);
-+
-+ return 0;
-+}
-+
-+static int __init dvb_bt8xx_load_all(void)
-+{
-+ struct dvb_bt8xx_card *card;
-+ struct list_head *entry, *entry_safe;
-+
-+ list_for_each_safe(entry, entry_safe, &card_list) {
-+ card = list_entry(entry, struct dvb_bt8xx_card, list);
-+ if (dvb_bt8xx_load_card(card) < 0) {
-+ list_del(&card->list);
-+ kfree(card);
-+ continue;
-+ }
-+ }
-+ return 0;
-+
-+}
-+
-+#define BT878_NEBULA 0x68
-+#define BT878_TWINHAN_DST 0x71
-+
-+static int __init dvb_bt8xx_init(void)
-+{
-+ unsigned int card_nr = 0;
-+ int card_id;
-+ int card_type;
-+
-+ dprintk("dvb_bt8xx: enumerating available bttv cards...\n");
-+
-+ while (bttv_get_cardinfo(card_nr, &card_type, &card_id) == 0) {
-+ switch(card_id) {
-+ case 0x001C11BD:
-+ dvb_bt8xx_card_match(card_nr, "Pinnacle PCTV DVB-S",
-+ 0x0400C060, 0, 0);
-+ /* 26, 15, 14, 6, 5
-+ * A_G2X DA_DPM DA_SBR DA_IOM_DA
-+ * DA_APP(parallel) */
-+ break;
-+ case 0x01010071:
-+nebula:
-+ dvb_bt8xx_card_match(card_nr, "Nebula DigiTV DVB-T",
-+ (1 << 26) | (1 << 14) | (1 << 5),
-+ 0, 0);
-+ /* A_PWRDN DA_SBR DA_APP (high speed serial) */
-+ break;
-+ case 0x07611461:
-+ dvb_bt8xx_card_match(card_nr, "Avermedia DVB-T",
-+ (1 << 26) | (1 << 14) | (1 << 5),
-+ 0, 0);
-+ /* A_PWRDN DA_SBR DA_APP (high speed serial) */
-+ break;
-+ case 0x0:
-+ if (card_type == BT878_NEBULA ||
-+ card_type == BT878_TWINHAN_DST)
-+ goto dst;
-+ goto unknown_card;
-+ case 0x2611BD:
-+ case 0x11822:
-+dst:
-+ dvb_bt8xx_card_match(card_nr, "DST DVB-S", 0x2204f2c,
-+ BT878_RISC_SYNC_MASK,
-+ BT878_APABORT | BT878_ARIPERR | BT878_APPERR | BT878_AFBUS);
-+ /* 25,21,14,11,10,9,8,3,2 then
-+ * 0x33 = 5,4,1,0
-+ * A_SEL=SML, DA_MLB, DA_SBR,
-+ * DA_SDR=f, fifo trigger = 32 DWORDS
-+ * IOM = 0 == audio A/D
-+ * DPM = 0 == digital audio mode
-+ * == async data parallel port
-+ * then 0x33 (13 is set by start_capture)
-+ * DA_APP = async data parallel port,
-+ * ACAP_EN = 1,
-+ * RISC+FIFO ENABLE */
-+ break;
-+ default:
-+unknown_card:
-+ printk("%s: unknown card_id found %0X\n",
-+ __FUNCTION__, card_id);
-+ if (card_type == BT878_NEBULA) {
-+ printk("%s: bttv type set to nebula\n",
-+ __FUNCTION__);
-+ goto nebula;
-+ }
-+ if (card_type == BT878_TWINHAN_DST) {
-+ printk("%s: bttv type set to Twinhan DST\n",
-+ __FUNCTION__);
-+ goto dst;
-+ }
-+ printk("%s: unknown card_type found %0X, NOT LOADED\n",
-+ __FUNCTION__, card_type);
-+ printk("%s: unknown card_nr found %0X\n",
-+ __FUNCTION__, card_nr);
-+ }
-+ card_nr++;
-+ }
-+ dvb_bt8xx_get_adaps();
-+ dvb_bt8xx_load_all();
-+
-+ return 0;
-+
-+}
-+
-+static void __exit dvb_bt8xx_exit(void)
-+{
-+ struct dvb_bt8xx_card *card;
-+ struct list_head *entry, *entry_safe;
-+
-+ dvb_bt8xx_exit_adaps();
-+ list_for_each_safe(entry, entry_safe, &card_list) {
-+ card = list_entry(entry, struct dvb_bt8xx_card, list);
-+
-+ dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr);
-+
-+ bt878_stop(card->bt);
-+ tasklet_kill(&card->bt->tasklet);
-+ dvb_net_release(&card->dvbnet);
-+ card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
-+ card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
-+ dvb_dmxdev_release(&card->dmxdev);
-+ dvb_dmx_release(&card->demux);
-+ dvb_unregister_i2c_bus(master_xfer, card->dvb_adapter, 0);
-+ dvb_bt8xx_i2c_adap_free(card->i2c_adapter);
-+ dvb_unregister_adapter(card->dvb_adapter);
-+
-+ list_del(&card->list);
-+ kfree(card);
-+ }
-+
-+}
-+
-+module_init(dvb_bt8xx_init);
-+module_exit(dvb_bt8xx_exit);
-+MODULE_DESCRIPTION("Bt8xx based DVB adapter driver");
-+MODULE_AUTHOR("Florian Schirmer <schirmer@taytron.net>");
-+MODULE_LICENSE("GPL");
-+MODULE_PARM(debug, "i");
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/bt8xx/dvb-bt8xx.h 2003-12-28 23:22:37.000000000 -0800
-@@ -0,0 +1,47 @@
-+/*
-+ * Bt8xx based DVB adapter driver
-+ *
-+ * Copyright (C) 2002,2003 Florian Schirmer <schirmer@taytron.net>
-+ * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
-+ * Copyright (C) 1999-2001 Ralph Metzler & Marcus Metzler for convergence integrated media GmbH
-+ * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/i2c.h>
-+#include "dvbdev.h"
-+#include "dvb_net.h"
-+
-+struct dvb_bt8xx_card {
-+
-+ struct list_head list;
-+ u8 active;
-+ char card_name[32];
-+ struct dvb_adapter *dvb_adapter;
-+ struct bt878 *bt;
-+ unsigned int bttv_nr;
-+ struct dvb_demux demux;
-+ struct dmxdev dmxdev;
-+ struct dmx_frontend fe_hw;
-+ struct dmx_frontend fe_mem;
-+ u32 gpio_mode;
-+ u32 op_sync_orin;
-+ u32 irq_err_ignore;
-+ struct i2c_adapter *i2c_adapter;
-+ struct dvb_net dvbnet;
-+
-+};
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/bt8xx/Kconfig 2003-12-28 23:22:37.000000000 -0800
-@@ -0,0 +1,13 @@
-+config DVB_BT8XX
-+ tristate "Nebula/Pinnacle PCTV PCI cards"
-+ depends on DVB_CORE && PCI && VIDEO_BT848
-+ help
-+ Support for PCI cards based on the Bt8xx PCI bridge. Examples are
-+ the Nebula cards, the Pinnacle PCTV cards, and Twinhan DST cards.
-+
-+ Since these cards have no MPEG decoder onboard, they transmit
-+ only compressed MPEG data over the PCI bus, so you need
-+ an external software decoder to watch TV on your computer.
-+
-+ Say Y if you own such a device and want to use it.
-+
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/bt8xx/Makefile 2003-12-28 23:22:40.000000000 -0800
-@@ -0,0 +1,5 @@
-+
-+obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o
-+
-+EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video -Idrivers/media/dvb/frontends
-+
---- linux-2.6.0/drivers/media/dvb/dvb-core/demux.h 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/demux.h 2003-12-28 23:22:38.000000000 -0800
-@@ -44,6 +44,15 @@
- #endif
-
- /*
-+ * DMX_MAX_SECFEED_SIZE: Maximum length (in bytes) of a private section feed filter.
-+ */
-+
-+#ifndef DMX_MAX_SECFEED_SIZE
-+#define DMX_MAX_SECFEED_SIZE 4096
-+#endif
-+
-+
-+/*
- * enum dmx_success: Success codes for the Demux Callback API.
- */
-
-@@ -143,9 +152,9 @@ struct dmx_section_feed {
- int check_crc;
- u32 crc_val;
-
-- u8 secbuf[4096];
-- int secbufp;
-- int seclen;
-+ u8 *secbuf;
-+ u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
-+ u16 secbufp, seclen, tsfeedp;
-
- int (*set) (struct dmx_section_feed* feed,
- u16 pid,
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_demux.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_demux.c 2003-12-28 23:22:38.000000000 -0800
-@@ -34,6 +34,11 @@
- #include "dvb_functions.h"
-
- #define NOBUFS
-+/*
-+** #define DVB_DEMUX_SECTION_LOSS_LOG to monitor payload loss in the syslog
-+*/
-+// #define DVB_DEMUX_SECTION_LOSS_LOG
-+
-
- LIST_HEAD(dmx_muxs);
-
-@@ -87,7 +92,7 @@ static inline u16 ts_pid(const u8 *buf)
- }
-
-
--static inline int payload(const u8 *tsp)
-+static inline u8 payload(const u8 *tsp)
- {
- if (!(tsp[3]&0x10)) // no payload?
- return 0;
-@@ -188,9 +193,7 @@ static inline int dvb_dmx_swfilter_secti
- struct dvb_demux_filter *f = feed->filter;
- struct dmx_section_feed *sec = &feed->feed.sec;
- u8 *buf = sec->secbuf;
--
-- if (sec->secbufp != sec->seclen)
-- return -1;
-+ int section_syntax_indicator;
-
- if (!sec->is_filtering)
- return 0;
-@@ -198,15 +201,19 @@ static inline int dvb_dmx_swfilter_secti
- if (!f)
- return 0;
-
-- if (sec->check_crc && demux->check_crc32(feed, sec->secbuf, sec->seclen))
-+ if (sec->check_crc) {
-+ section_syntax_indicator = ((sec->secbuf[1] & 0x80) != 0);
-+ if (section_syntax_indicator &&
-+ demux->check_crc32(feed, sec->secbuf, sec->seclen))
- return -1;
-+ }
-
- do {
- if (dvb_dmx_swfilter_sectionfilter(feed, f) < 0)
- return -1;
- } while ((f = f->next) && sec->is_filtering);
-
-- sec->secbufp = sec->seclen = 0;
-+ sec->seclen = 0;
-
- memset(buf, 0, DVB_DEMUX_MASK_MAX);
-
-@@ -214,128 +221,147 @@ static inline int dvb_dmx_swfilter_secti
- }
-
-
--static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, const u8 *buf)
-+static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed)
- {
-- struct dvb_demux *demux = feed->demux;
- struct dmx_section_feed *sec = &feed->feed.sec;
-- int p, count;
-- int ccok, rest;
-- u8 cc;
--
-- if (!(count = payload(buf)))
-- return -1;
--
-- p = 188-count;
--
-- cc = buf[3] & 0x0f;
-- ccok = ((feed->cc+1) & 0x0f) == cc ? 1 : 0;
-- feed->cc = cc;
--
-- if (buf[1] & 0x40) { // PUSI set
-- // offset to start of first section is in buf[p]
-- if (p+buf[p]>187) // trash if it points beyond packet
-- return -1;
--
-- if (buf[p] && ccok) { // rest of previous section?
-- // did we have enough data in last packet to calc length?
-- int tmp = 3 - sec->secbufp;
-
-- if (tmp > 0 && tmp != 3) {
-- if (p + tmp >= 187)
-- return -1;
--
-- demux->memcopy (feed, sec->secbuf+sec->secbufp,
-- buf+p+1, tmp);
--
-- sec->seclen = section_length(sec->secbuf);
--
-- if (sec->seclen > 4096)
-- return -1;
-+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
-+ if(sec->secbufp < sec->tsfeedp)
-+ {
-+ int i, n = sec->tsfeedp - sec->secbufp;
-+
-+ /* section padding is done with 0xff bytes entirely.
-+ ** due to speed reasons, we won't check all of them
-+ ** but just first and last
-+ */
-+ if(sec->secbuf[0] != 0xff || sec->secbuf[n-1] != 0xff)
-+ {
-+ printk("dvb_demux.c section ts padding loss: %d/%d\n",
-+ n, sec->tsfeedp);
-+ printk("dvb_demux.c pad data:");
-+ for(i = 0; i < n; i++)
-+ printk(" %02x", sec->secbuf[i]);
-+ printk("\n");
- }
--
-- rest = sec->seclen - sec->secbufp;
--
-- if (rest == buf[p] && sec->seclen) {
-- demux->memcopy (feed, sec->secbuf + sec->secbufp,
-- buf+p+1, buf[p]);
-- sec->secbufp += buf[p];
-- dvb_dmx_swfilter_section_feed(feed);
- }
-- }
--
-- p += buf[p] + 1; // skip rest of last section
-- count = 188 - p;
-+#endif
-
-- while (count) {
-+ sec->tsfeedp = sec->secbufp = sec->seclen = 0;
-+ sec->secbuf = sec->secbuf_base;
-+ }
-
-- sec->crc_val = ~0;
-+/*
-+** Losless Section Demux 1.4 by Emard
-+*/
-+static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed, const u8 *buf, u8 len)
-+{
-+ struct dvb_demux *demux = feed->demux;
-+ struct dmx_section_feed *sec = &feed->feed.sec;
-+ u16 limit, seclen, n;
-
-- if ((count>2) && // enough data to determine sec length?
-- ((sec->seclen = section_length(buf+p)) <= count)) {
-- if (sec->seclen>4096)
-- return -1;
-+ if(sec->tsfeedp >= DMX_MAX_SECFEED_SIZE)
-+ return 0;
-
-- demux->memcopy (feed, sec->secbuf, buf+p,
-- sec->seclen);
-+ if(sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE)
-+ {
-+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
-+ printk("dvb_demux.c section buffer full loss: %d/%d\n",
-+ sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, DMX_MAX_SECFEED_SIZE);
-+#endif
-+ len = DMX_MAX_SECFEED_SIZE - sec->tsfeedp;
-+ }
-
-- sec->secbufp = sec->seclen;
-- p += sec->seclen;
-- count = 188 - p;
-+ if(len <= 0)
-+ return 0;
-
-- dvb_dmx_swfilter_section_feed(feed);
-+ demux->memcopy(feed, sec->secbuf_base + sec->tsfeedp, buf, len);
-+ sec->tsfeedp += len;
-
-- // filling bytes until packet end?
-- if (count && buf[p]==0xff)
-- count=0;
-+ /* -----------------------------------------------------
-+ ** Dump all the sections we can find in the data (Emard)
-+ */
-
-- } else { // section continues to following TS packet
-- demux->memcopy(feed, sec->secbuf, buf+p, count);
-- sec->secbufp+=count;
-- count=0;
-- }
-+ limit = sec->tsfeedp;
-+ if(limit > DMX_MAX_SECFEED_SIZE)
-+ return -1; /* internal error should never happen */
-+
-+ /* to be sure always set secbuf */
-+ sec->secbuf = sec->secbuf_base + sec->secbufp;
-+
-+ for(n = 0; sec->secbufp + 2 < limit; n++)
-+ {
-+ seclen = section_length(sec->secbuf);
-+ if(seclen <= 0 || seclen > DMX_MAX_SECFEED_SIZE
-+ || seclen + sec->secbufp > limit)
-+ return 0;
-+ sec->seclen = seclen;
-+ sec->crc_val = ~0;
-+ /* dump [secbuf .. secbuf+seclen) */
-+ dvb_dmx_swfilter_section_feed(feed);
-+ sec->secbufp += seclen; /* secbufp and secbuf moving together is */
-+ sec->secbuf += seclen; /* redundand but saves pointer arithmetic */
- }
-
- return 0;
- }
-
-- // section continued below
-- if (!ccok)
-- return -1;
-
-- if (!sec->secbufp) // any data in last ts packet?
-- return -1;
-+static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, const u8 *buf)
-+{
-+ u8 p, count;
-+ int ccok;
-+ u8 cc;
-
-- // did we have enough data in last packet to calc section length?
-- if (sec->secbufp < 3) {
-- int tmp = 3 - sec->secbufp;
-+ count = payload(buf);
-
-- if (tmp>count)
-+ if (count == 0) /* count == 0 if no payload or out of range */
- return -1;
-
-- sec->crc_val = ~0;
--
-- demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, tmp);
-+ p = 188-count; /* payload start */
-
-- sec->seclen = section_length(sec->secbuf);
--
-- if (sec->seclen > 4096)
-- return -1;
-+ cc = buf[3] & 0x0f;
-+ ccok = ((feed->cc+1) & 0x0f) == cc ? 1 : 0;
-+ feed->cc = cc;
-+ if(ccok == 0)
-+ {
-+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
-+ printk("dvb_demux.c discontinuity detected %d bytes lost\n", count);
-+ /* those bytes under sume circumstances will again be reported
-+ ** in the following dvb_dmx_swfilter_section_new
-+ */
-+#endif
-+ dvb_dmx_swfilter_section_new(feed);
-+ return 0;
- }
-
-- rest = sec->seclen - sec->secbufp;
--
-- if (rest < 0)
-- return -1;
--
-- if (rest <= count) { // section completed in this TS packet
-- demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, rest);
-- sec->secbufp += rest;
-- dvb_dmx_swfilter_section_feed(feed);
-- } else { // section continues in following ts packet
-- demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, count);
-- sec->secbufp += count;
-+ if(buf[1] & 0x40)
-+ {
-+ // PUSI=1 (is set), section boundary is here
-+ if(count > 1 && buf[p] < count)
-+ {
-+ const u8 *before = buf+p+1;
-+ u8 before_len = buf[p];
-+ const u8 *after = before+before_len;
-+ u8 after_len = count-1-before_len;
-+
-+ dvb_dmx_swfilter_section_copy_dump(feed, before, before_len);
-+ dvb_dmx_swfilter_section_new(feed);
-+ dvb_dmx_swfilter_section_copy_dump(feed, after, after_len);
-+ }
-+#ifdef DVB_DEMUX_SECTION_LOSS_LOG
-+ else
-+ if(count > 0)
-+ printk("dvb_demux.c PUSI=1 but %d bytes lost\n", count);
-+#endif
- }
-+ else
-+ {
-+ // PUSI=0 (is not set), no section boundary
-+ const u8 *entire = buf+p;
-+ u8 entire_len = count;
-
-+ dvb_dmx_swfilter_section_copy_dump(feed, entire, entire_len);
-+ }
- return 0;
- }
-
-@@ -439,6 +465,50 @@ bailout:
- spin_unlock(&demux->lock);
- }
-
-+void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
-+{
-+ int p = 0,i, j;
-+ u8 tmppack[188];
-+ spin_lock(&demux->lock);
-+
-+ if ((i = demux->tsbufp)) {
-+ if (count < (j=204-i)) {
-+ memcpy(&demux->tsbuf[i], buf, count);
-+ demux->tsbufp += count;
-+ goto bailout;
-+ }
-+ memcpy(&demux->tsbuf[i], buf, j);
-+ if ((demux->tsbuf[0] == 0x47)|(demux->tsbuf[0]==0xB8)) {
-+ memcpy(tmppack, demux->tsbuf, 188);
-+ if (tmppack[0] == 0xB8) tmppack[0] = 0x47;
-+ dvb_dmx_swfilter_packet(demux, tmppack);
-+ }
-+ demux->tsbufp = 0;
-+ p += j;
-+ }
-+
-+ while (p < count) {
-+ if ((buf[p] == 0x47)|(buf[p] == 0xB8)) {
-+ if (count-p >= 204) {
-+ memcpy(tmppack, buf+p, 188);
-+ if (tmppack[0] == 0xB8) tmppack[0] = 0x47;
-+ dvb_dmx_swfilter_packet(demux, tmppack);
-+ p += 204;
-+ } else {
-+ i = count-p;
-+ memcpy(demux->tsbuf, buf+p, i);
-+ demux->tsbufp=i;
-+ goto bailout;
-+ }
-+ } else {
-+ p++;
-+ }
-+ }
-+
-+bailout:
-+ spin_unlock(&demux->lock);
-+}
-+
-
- static struct dvb_demux_filter * dvb_dmx_filter_alloc(struct dvb_demux *demux)
- {
-@@ -848,6 +918,9 @@ static int dmx_section_feed_start_filter
- up(&dvbdmx->mutex);
- return -EINVAL;
- }
-+
-+ dvbdmxfeed->feed.sec.tsfeedp = 0;
-+ dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base;
- dvbdmxfeed->feed.sec.secbufp=0;
- dvbdmxfeed->feed.sec.seclen=0;
-
-@@ -946,7 +1019,9 @@ static int dvbdmx_allocate_section_feed(
- dvbdmxfeed->cb.sec=callback;
- dvbdmxfeed->demux=dvbdmx;
- dvbdmxfeed->pid=0xffff;
-- dvbdmxfeed->feed.sec.secbufp=0;
-+ dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base;
-+ dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0;
-+ dvbdmxfeed->feed.sec.tsfeedp = 0;
- dvbdmxfeed->filter=0;
- dvbdmxfeed->buffer=0;
-
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_demux.h 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_demux.h 2003-12-28 23:22:38.000000000 -0800
-@@ -127,7 +127,7 @@ struct dvb_demux {
-
- #define DMX_MAX_PID 0x2000
- struct list_head feed_list;
-- u8 tsbuf[188];
-+ u8 tsbuf[204];
- int tsbufp;
-
- struct semaphore mutex;
-@@ -140,6 +140,7 @@ int dvb_dmx_release(struct dvb_demux *dv
- void dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf);
- void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, size_t count);
- void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count);
-+void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count);
-
- int dvbdmx_connect_frontend(struct dmx_demux *demux, struct dmx_frontend *frontend);
- int dvbdmx_disconnect_frontend(struct dmx_demux *demux);
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_filter.c 2003-07-02 14:53:14.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_filter.c 2003-12-28 23:22:38.000000000 -0800
-@@ -564,14 +564,18 @@ void dvb_filter_pes2ts_init(struct dvb_f
- p2ts->priv=priv;
- }
-
--int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes, int len)
-+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
-+ int len, int payload_start)
- {
- unsigned char *buf=p2ts->buf;
- int ret=0, rest;
-
- //len=6+((pes[4]<<8)|pes[5]);
-
-+ if (payload_start)
- buf[1]|=0x40;
-+ else
-+ buf[1]&=~0x40;
- while (len>=184) {
- buf[3]=0x10|((p2ts->cc++)&0x0f);
- memcpy(buf+4, pes, 184);
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_filter.h 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_filter.h 2003-12-28 23:22:38.000000000 -0800
-@@ -37,7 +37,8 @@ struct dvb_filter_pes2ts {
- void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
- dvb_filter_pes2ts_cb_t *cb, void *priv);
-
--int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes, int len);
-+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
-+ int len, int payload_start);
-
-
- #define PROG_STREAM_MAP 0xBC
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_i2c.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_i2c.c 2003-12-28 23:22:38.000000000 -0800
-@@ -51,6 +51,7 @@ static int register_i2c_client (struct d
-
- client->detach = dev->detach;
- client->owner = dev->owner;
-+ client->data = dev->data;
-
- INIT_LIST_HEAD(&client->list_head);
-
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_ksyms.c 2003-07-02 14:53:14.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_ksyms.c 2003-12-28 23:22:38.000000000 -0800
-@@ -18,6 +18,7 @@ EXPORT_SYMBOL(dvb_dmx_release);
- EXPORT_SYMBOL(dvb_dmx_swfilter_packet);
- EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
- EXPORT_SYMBOL(dvb_dmx_swfilter);
-+EXPORT_SYMBOL(dvb_dmx_swfilter_204);
- EXPORT_SYMBOL(dvbdmx_connect_frontend);
- EXPORT_SYMBOL(dvbdmx_disconnect_frontend);
-
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_ringbuffer.c 2003-07-02 14:53:14.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_ringbuffer.c 2003-12-28 23:22:38.000000000 -0800
-@@ -9,24 +9,18 @@
- * & Marcus Metzler for convergence integrated media GmbH
- *
- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * as published by the Free Software Foundation; either version 2
-+ * modify it under the terms of the GNU Lesser General Public License
-+ * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- *
-- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-+ * GNU Lesser General Public License for more details.
- *
-- * You should have received a copy of the GNU General Public License
-+ * You should have received a copy of the GNU Lesser 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.
-- * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
-- *
-- *
-- * the project's page is at http://www.linuxtv.org/dvb/
- */
-
-
-@@ -167,11 +161,11 @@ ssize_t dvb_ringbuffer_write(struct dvb_
- }
-
-
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_init);
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_empty);
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_free);
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_avail);
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_flush);
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_flush_spinlock_wakeup);
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_read);
--EXPORT_SYMBOL_GPL(dvb_ringbuffer_write);
-+EXPORT_SYMBOL(dvb_ringbuffer_init);
-+EXPORT_SYMBOL(dvb_ringbuffer_empty);
-+EXPORT_SYMBOL(dvb_ringbuffer_free);
-+EXPORT_SYMBOL(dvb_ringbuffer_avail);
-+EXPORT_SYMBOL(dvb_ringbuffer_flush);
-+EXPORT_SYMBOL(dvb_ringbuffer_flush_spinlock_wakeup);
-+EXPORT_SYMBOL(dvb_ringbuffer_read);
-+EXPORT_SYMBOL(dvb_ringbuffer_write);
---- linux-2.6.0/drivers/media/dvb/dvb-core/dvb_ringbuffer.h 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/media/dvb/dvb-core/dvb_ringbuffer.h 2003-12-28 23:22:38.000000000 -0800
-@@ -16,7 +16,7 @@
- * 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.
-+ * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
---- linux-2.6.0/drivers/media/dvb/frontends/alps_tdmb7.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/alps_tdmb7.c 2003-12-28 23:22:38.000000000 -0800
-@@ -159,7 +159,7 @@ static int cx22700_init (struct dvb_i2c_
- cx22700_writereg (i2c, 0x00, 0x02); /* soft reset */
- cx22700_writereg (i2c, 0x00, 0x00);
-
-- dvb_delay (HZ/100);
-+ dvb_delay(10);
-
- for (i=0; i<sizeof(init_tab); i+=2)
- cx22700_writereg (i2c, init_tab[i], init_tab[i+1]);
-@@ -281,15 +281,15 @@ static int cx22700_get_tps (struct dvb_i
-
- val = cx22700_readreg (i2c, 0x02);
-
-- if ((val >> 3) > 4)
-+ if (((val >> 3) & 0x07) > 4)
- p->code_rate_HP = FEC_AUTO;
- else
-- p->code_rate_HP = fec_tab[val >> 3];
-+ p->code_rate_HP = fec_tab[(val >> 3) & 0x07];
-
-- if ((val & 0x7) > 4)
-+ if ((val & 0x07) > 4)
- p->code_rate_LP = FEC_AUTO;
- else
-- p->code_rate_LP = fec_tab[val >> 3];
-+ p->code_rate_LP = fec_tab[val & 0x07];
-
-
- val = cx22700_readreg (i2c, 0x03);
-@@ -333,7 +333,7 @@ static int tdmb7_ioctl (struct dvb_front
- if (sync & 0x10)
- *status |= FE_HAS_SYNC;
-
-- if (sync & 0x10)
-+ if (*status == 0x0f)
- *status |= FE_HAS_LOCK;
-
- break;
---- linux-2.6.0/drivers/media/dvb/frontends/cx24110.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/cx24110.c 2003-12-28 23:22:38.000000000 -0800
-@@ -248,7 +248,7 @@ static int cx24108_set_tv_freq (struct d
- cx24108_write(i2c,pll);
- cx24110_writereg(i2c,0x56,0x7f);
-
-- dvb_delay(HZ/10); /* wait a moment for the tuner pll to lock */
-+ dvb_delay(10); /* wait a moment for the tuner pll to lock */
-
- /* tuner pll lock can be monitored on GPIO pin 4 of cx24110 */
- while (!(cx24110_readreg(i2c,0x66)&0x20)&&i<1000)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/dst-bt878.h 2003-12-28 23:22:40.000000000 -0800
-@@ -0,0 +1,37 @@
-+/*
-+ * dst-bt878.h: part of the DST driver for the TwinHan DST Frontend
-+ *
-+ * Copyright (C) 2003 Jamie Honan
-+ */
-+
-+struct dst_gpio_enable {
-+ u32 mask;
-+ u32 enable;
-+};
-+
-+struct dst_gpio_output {
-+ u32 mask;
-+ u32 highvals;
-+};
-+
-+struct dst_gpio_read {
-+ unsigned long value;
-+};
-+
-+union dst_gpio_packet {
-+ struct dst_gpio_enable enb;
-+ struct dst_gpio_output outp;
-+ struct dst_gpio_read rd;
-+ int psize;
-+};
-+
-+#define DST_IG_ENABLE 0
-+#define DST_IG_WRITE 1
-+#define DST_IG_READ 2
-+#define DST_IG_TS 3
-+
-+struct bt878 ;
-+
-+int bt878_device_control(struct bt878 *bt, unsigned int cmd, union dst_gpio_packet *mp);
-+
-+struct bt878 *bt878_find_by_dvb_adap(struct dvb_adapter *adap);
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/dst.c 2003-12-28 23:22:37.000000000 -0800
-@@ -0,0 +1,1189 @@
-+/*
-+ Frontend-driver for TwinHan DST Frontend
-+
-+ Copyright (C) 2003 Jamie Honan
-+
-+
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+
-+*/
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/string.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <asm/div64.h>
-+#include <asm/delay.h>
-+
-+#include "dvb_frontend.h"
-+#include "dvb_functions.h"
-+#include "dst-bt878.h"
-+
-+unsigned int dst_debug = 0;
-+unsigned int dst_verbose = 0;
-+
-+MODULE_PARM(dst_verbose, "i");
-+MODULE_PARM_DESC(dst_verbose,
-+ "verbose startup messages, default is 1 (yes)");
-+MODULE_PARM(dst_debug, "i");
-+MODULE_PARM_DESC(dst_debug, "debug messages, default is 0 (no)");
-+
-+unsigned int dst_type = (-1U);
-+unsigned int dst_type_flags = (-1U);
-+MODULE_PARM(dst_type, "i");
-+MODULE_PARM_DESC(dst_type,
-+ "Type of DST card, 0 Satellite, 1 terrestial TV, 2 Cable, default driver determined");
-+MODULE_PARM(dst_type_flags, "i");
-+MODULE_PARM_DESC(dst_type_flags,
-+ "Type flags of DST card, bitfield 1=10 byte tuner, 2=TS is 204, 4=symdiv");
-+
-+#define dprintk if (dst_debug) printk
-+
-+#define DST_TYPE_IS_SAT 0
-+#define DST_TYPE_IS_TERR 1
-+#define DST_TYPE_IS_CABLE 2
-+
-+#define DST_TYPE_HAS_NEWTUNE 1
-+#define DST_TYPE_HAS_TS204 2
-+#define DST_TYPE_HAS_SYMDIV 4
-+
-+#define HAS_LOCK 1
-+#define ATTEMPT_TUNE 2
-+#define HAS_POWER 4
-+
-+struct dst_data {
-+ u8 tx_tuna[10];
-+ u8 rx_tuna[10];
-+ u8 rxbuffer[10];
-+ u8 diseq_flags;
-+ u8 dst_type;
-+ u32 type_flags;
-+ u32 frequency; /* intermediate frequency in kHz for QPSK */
-+ fe_spectral_inversion_t inversion;
-+ u32 symbol_rate; /* symbol rate in Symbols per second */
-+ fe_code_rate_t fec;
-+ fe_sec_voltage_t voltage;
-+ fe_sec_tone_mode_t tone;
-+ u32 decode_freq;
-+ u8 decode_lock;
-+ u16 decode_strength;
-+ u16 decode_snr;
-+ unsigned long cur_jiff;
-+ u8 k22;
-+ fe_bandwidth_t bandwidth;
-+ struct bt878 *bt;
-+ struct dvb_i2c_bus *i2c;
-+} ;
-+
-+static struct dvb_frontend_info dst_info_sat = {
-+ .name = "DST SAT",
-+ .type = FE_QPSK,
-+ .frequency_min = 950000,
-+ .frequency_max = 2150000,
-+ .frequency_stepsize = 1000, /* kHz for QPSK frontends */
-+ .frequency_tolerance = 29500,
-+ .symbol_rate_min = 1000000,
-+ .symbol_rate_max = 45000000,
-+/* . symbol_rate_tolerance = ???,*/
-+ .notifier_delay = 50, /* 1/20 s */
-+ .caps = FE_CAN_INVERSION_AUTO |
-+ FE_CAN_FEC_AUTO |
-+ FE_CAN_QPSK
-+};
-+
-+static struct dvb_frontend_info dst_info_cable = {
-+ .name = "DST CABLE",
-+ .type = FE_QAM,
-+ .frequency_stepsize = 62500,
-+ .frequency_min = 51000000,
-+ .frequency_max = 858000000,
-+ .symbol_rate_min = 1000000,
-+ .symbol_rate_max = 45000000,
-+/* . symbol_rate_tolerance = ???,*/
-+ .notifier_delay = 50, /* 1/20 s */
-+ .caps = FE_CAN_INVERSION_AUTO |
-+ FE_CAN_FEC_AUTO |
-+ FE_CAN_QAM_AUTO
-+};
-+
-+static struct dvb_frontend_info dst_info_tv = {
-+ .name = "DST TERR",
-+ .type = FE_OFDM,
-+ .frequency_min = 137000000,
-+ .frequency_max = 858000000,
-+ .frequency_stepsize = 166667,
-+ .caps = FE_CAN_INVERSION_AUTO |
-+ FE_CAN_FEC_AUTO |
-+ FE_CAN_QAM_AUTO |
-+ FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO
-+};
-+
-+static void dst_packsize(struct dst_data *dst, int psize)
-+{
-+ union dst_gpio_packet bits;
-+
-+ bits.psize = psize;
-+ bt878_device_control(dst->bt, DST_IG_TS, &bits);
-+}
-+
-+static int dst_gpio_outb(struct dst_data *dst, u32 mask, u32 enbb, u32 outhigh)
-+{
-+ union dst_gpio_packet enb;
-+ union dst_gpio_packet bits;
-+ int err;
-+
-+ enb.enb.mask = mask;
-+ enb.enb.enable = enbb;
-+ if ((err = bt878_device_control(dst->bt, DST_IG_ENABLE, &enb)) < 0) {
-+ dprintk ("%s: dst_gpio_enb error (err == %i, mask == 0x%02x, enb == 0x%02x)\n", __FUNCTION__, err, mask, enbb);
-+ return -EREMOTEIO;
-+ }
-+
-+ /* because complete disabling means no output, no need to do
-+ * output packet */
-+ if (enbb == 0)
-+ return 0;
-+
-+ bits.outp.mask = enbb;
-+ bits.outp.highvals = outhigh;
-+
-+ if ((err = bt878_device_control(dst->bt, DST_IG_WRITE, &bits)) < 0) {
-+ dprintk ("%s: dst_gpio_outb error (err == %i, enbb == 0x%02x, outhigh == 0x%02x)\n", __FUNCTION__, err, enbb, outhigh);
-+ return -EREMOTEIO;
-+ }
-+ return 0;
-+}
-+
-+static int dst_gpio_inb(struct dst_data *dst, u8 *result)
-+{
-+ union dst_gpio_packet rd_packet;
-+ int err;
-+
-+ *result = 0;
-+
-+ if ((err = bt878_device_control(dst->bt, DST_IG_READ, &rd_packet)) < 0) {
-+ dprintk ("%s: dst_gpio_inb error (err == %i)\n", __FUNCTION__, err);
-+ return -EREMOTEIO;
-+ }
-+ *result = (u8)rd_packet.rd.value;
-+ return 0;
-+}
-+
-+#define DST_I2C_ENABLE 1
-+#define DST_8820 2
-+
-+static int
-+dst_reset8820(struct dst_data *dst)
-+{
-+int retval;
-+ /* pull 8820 gpio pin low, wait, high, wait, then low */
-+ // dprintk ("%s: reset 8820\n", __FUNCTION__);
-+ retval = dst_gpio_outb(dst, DST_8820, DST_8820, 0);
-+ if (retval < 0)
-+ return retval;
-+ dvb_delay(10);
-+ retval = dst_gpio_outb(dst, DST_8820, DST_8820, DST_8820);
-+ if (retval < 0)
-+ return retval;
-+ /* wait for more feedback on what works here *
-+ dvb_delay(10);
-+ retval = dst_gpio_outb(dst, DST_8820, DST_8820, 0);
-+ if (retval < 0)
-+ return retval;
-+ */
-+ return 0;
-+}
-+
-+static int
-+dst_i2c_enable(struct dst_data *dst)
-+{
-+int retval;
-+ /* pull I2C enable gpio pin low, wait */
-+ // dprintk ("%s: i2c enable\n", __FUNCTION__);
-+ retval = dst_gpio_outb(dst, ~0, DST_I2C_ENABLE, 0);
-+ if (retval < 0)
-+ return retval;
-+ // dprintk ("%s: i2c enable delay\n", __FUNCTION__);
-+ dvb_delay(33);
-+ return 0;
-+}
-+
-+static int
-+dst_i2c_disable(struct dst_data *dst)
-+{
-+int retval;
-+ /* release I2C enable gpio pin, wait */
-+ // dprintk ("%s: i2c disable\n", __FUNCTION__);
-+ retval = dst_gpio_outb(dst, ~0, 0, 0);
-+ if (retval < 0)
-+ return retval;
-+ // dprintk ("%s: i2c disable delay\n", __FUNCTION__);
-+ dvb_delay(33);
-+ return 0;
-+}
-+
-+static int
-+dst_wait_dst_ready(struct dst_data *dst)
-+{
-+u8 reply;
-+int retval;
-+int i;
-+ for (i = 0; i < 200; i++) {
-+ retval = dst_gpio_inb(dst, &reply);
-+ if (retval < 0)
-+ return retval;
-+ if ((reply & DST_I2C_ENABLE) == 0) {
-+ dprintk ("%s: dst wait ready after %d\n", __FUNCTION__, i);
-+ return 1;
-+ }
-+ dvb_delay(5);
-+ }
-+ dprintk ("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
-+ return 0;
-+}
-+
-+#define DST_I2C_ADDR 0x55
-+
-+static int write_dst (struct dst_data *dst, u8 *data, u8 len)
-+{
-+ struct i2c_msg msg = {
-+ .addr = DST_I2C_ADDR, .flags = 0, .buf = data, .len = len };
-+ int err;
-+ int cnt;
-+
-+ if (dst_debug && dst_verbose) {
-+ u8 i;
-+ dprintk("%s writing",__FUNCTION__);
-+ for (i = 0 ; i < len ; i++) {
-+ dprintk(" 0x%02x", data[i]);
-+ }
-+ dprintk("\n");
-+ }
-+ dvb_delay(30);
-+ for (cnt = 0; cnt < 4; cnt++) {
-+ if ((err = dst->i2c->xfer (dst->i2c, &msg, 1)) < 0) {
-+ dprintk ("%s: write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, data[0]);
-+ dst_i2c_disable(dst);
-+ dvb_delay(500);
-+ dst_i2c_enable(dst);
-+ dvb_delay(500);
-+ continue;
-+ } else
-+ break;
-+ }
-+ if (cnt >= 4)
-+ return -EREMOTEIO;
-+ return 0;
-+}
-+
-+static int read_dst (struct dst_data *dst, u8 *ret, u8 len)
-+{
-+ struct i2c_msg msg =
-+ { .addr = DST_I2C_ADDR, .flags = I2C_M_RD, .buf = ret, .len = len };
-+ int err;
-+ int cnt;
-+
-+ for (cnt = 0; cnt < 4; cnt++) {
-+ if ((err = dst->i2c->xfer (dst->i2c, &msg, 1)) < 0) {
-+ dprintk ("%s: read_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n", __FUNCTION__, err, len, ret[0]);
-+ dst_i2c_disable(dst);
-+ dst_i2c_enable(dst);
-+ continue;
-+ } else
-+ break;
-+ }
-+ if (cnt >= 4)
-+ return -EREMOTEIO;
-+ dprintk("%s reply is 0x%x\n", __FUNCTION__, ret[0]);
-+ if (dst_debug && dst_verbose) {
-+ for (err = 1; err < len; err++)
-+ dprintk(" 0x%x", ret[err]);
-+ if (err > 1)
-+ dprintk("\n");
-+ }
-+ return 0;
-+}
-+
-+static int dst_set_freq(struct dst_data *dst, u32 freq)
-+{
-+ u8 *val;
-+
-+ dst->frequency = freq;
-+
-+ // dprintk("%s: set frequency %u\n", __FUNCTION__, freq);
-+ if (dst->dst_type == DST_TYPE_IS_SAT) {
-+ freq = freq / 1000;
-+ if (freq < 950 || freq > 2150)
-+ return -EINVAL;
-+ val = &dst->tx_tuna[0];
-+ val[2] = (freq >> 8) & 0x7f;
-+ val[3] = (u8)freq;
-+ val[4] = 1;
-+ val[8] &= ~4;
-+ if (freq < 1531)
-+ val[8] |= 4;
-+ } else if (dst->dst_type == DST_TYPE_IS_TERR) {
-+ freq = freq / 1000;
-+ if (freq < 137000 || freq > 858000)
-+ return -EINVAL;
-+ val = &dst->tx_tuna[0];
-+ val[2] = (freq >> 16) & 0xff;
-+ val[3] = (freq >> 8) & 0xff;
-+ val[4] = (u8)freq;
-+ val[5] = 0;
-+ switch (dst->bandwidth) {
-+ case BANDWIDTH_6_MHZ:
-+ val[6] = 6;
-+ break;
-+
-+ case BANDWIDTH_7_MHZ:
-+ case BANDWIDTH_AUTO:
-+ val[6] = 7;
-+ break;
-+
-+ case BANDWIDTH_8_MHZ:
-+ val[6] = 8;
-+ break;
-+ }
-+
-+ val[7] = 0;
-+ val[8] = 0;
-+ } else if (dst->dst_type == DST_TYPE_IS_CABLE) {
-+ /* guess till will get one */
-+ freq = freq / 1000;
-+ val = &dst->tx_tuna[0];
-+ val[2] = (freq >> 16) & 0xff;
-+ val[3] = (freq >> 8) & 0xff;
-+ val[4] = (u8)freq;
-+ } else
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static int dst_set_bandwidth(struct dst_data *dst, fe_bandwidth_t bandwidth)
-+{
-+ u8 *val;
-+
-+ dst->bandwidth = bandwidth;
-+
-+ if (dst->dst_type != DST_TYPE_IS_TERR)
-+ return 0;
-+
-+ val = &dst->tx_tuna[0];
-+ switch (bandwidth) {
-+ case BANDWIDTH_6_MHZ:
-+ val[6] = 6;
-+ break;
-+
-+ case BANDWIDTH_7_MHZ:
-+ val[6] = 7;
-+ break;
-+
-+ case BANDWIDTH_8_MHZ:
-+ val[6] = 8;
-+ break;
-+
-+ default:
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+static int dst_set_inversion (struct dst_data *dst, fe_spectral_inversion_t inversion)
-+{
-+ u8 *val;
-+
-+ dst->inversion = inversion;
-+
-+ val = &dst->tx_tuna[0];
-+
-+ val[8] &= ~0x80;
-+
-+ switch (inversion) {
-+ case INVERSION_OFF:
-+ break;
-+ case INVERSION_ON:
-+ val[8] |= 0x80;
-+ break;
-+ case INVERSION_AUTO:
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+
-+static int dst_set_fec (struct dst_data *dst, fe_code_rate_t fec)
-+{
-+ dst->fec = fec;
-+ return 0;
-+}
-+
-+static fe_code_rate_t dst_get_fec (struct dst_data *dst)
-+{
-+ return dst->fec;
-+}
-+
-+static int dst_set_symbolrate (struct dst_data *dst, u32 srate)
-+{
-+ u8 *val;
-+ u32 symcalc;
-+ u64 sval;
-+
-+ dst->symbol_rate = srate;
-+
-+ if (dst->dst_type == DST_TYPE_IS_TERR) {
-+ return 0;
-+ }
-+
-+ // dprintk("%s: set srate %u\n", __FUNCTION__, srate);
-+ srate /= 1000;
-+ val = &dst->tx_tuna[0];
-+
-+ if (dst->type_flags & DST_TYPE_HAS_SYMDIV) {
-+ sval = srate;
-+ sval <<= 20;
-+ do_div(sval, 88000);
-+ symcalc = (u32)sval;
-+ // dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
-+ val[5] = (u8)(symcalc >> 12);
-+ val[6] = (u8)(symcalc >> 4);
-+ val[7] = (u8)(symcalc << 4);
-+ } else {
-+ val[5] = (u8)(srate >> 16) & 0x7f;
-+ val[6] = (u8)(srate >> 8);
-+ val[7] = (u8)srate;
-+ }
-+ val[8] &= ~0x20;
-+ if (srate > 8000)
-+ val[8] |= 0x20;
-+ return 0;
-+}
-+
-+
-+static u8 dst_check_sum(u8 *buf, u32 len)
-+{
-+ u32 i;
-+ u8 val = 0;
-+ if (!len)
-+ return 0;
-+ for (i = 0; i < len; i++) {
-+ val += buf[i];
-+ }
-+ return ((~val) + 1);
-+}
-+
-+typedef struct dst_types {
-+ char *mstr;
-+ int offs;
-+ u8 dst_type;
-+ u32 type_flags;
-+} DST_TYPES;
-+
-+struct dst_types dst_tlist[] = {
-+ { "DST-020", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_SYMDIV },
-+ { "DST-030", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_TS204|DST_TYPE_HAS_NEWTUNE },
-+ { "DST-03T", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_SYMDIV|DST_TYPE_HAS_TS204},
-+ { "DST-MOT", 0, DST_TYPE_IS_SAT, DST_TYPE_HAS_SYMDIV },
-+ { "DST-CI", 1, DST_TYPE_IS_SAT, DST_TYPE_HAS_TS204|DST_TYPE_HAS_NEWTUNE },
-+ { "DSTMCI", 1, DST_TYPE_IS_SAT, DST_TYPE_HAS_NEWTUNE },
-+ { "DSTFCI", 1, DST_TYPE_IS_SAT, DST_TYPE_HAS_NEWTUNE },
-+ { "DCTNEW", 1, DST_TYPE_IS_CABLE, DST_TYPE_HAS_NEWTUNE },
-+ { "DCT_CI", 1, DST_TYPE_IS_CABLE, DST_TYPE_HAS_NEWTUNE|DST_TYPE_HAS_TS204 },
-+ { "DTTDIG" , 1, DST_TYPE_IS_TERR, 0} };
-+/* DCTNEW and DCT-CI are guesses */
-+
-+static void dst_type_flags_print(u32 type_flags)
-+{
-+ printk("DST type flags :");
-+ if (type_flags & DST_TYPE_HAS_NEWTUNE)
-+ printk(" 0x%x newtuner", DST_TYPE_HAS_NEWTUNE);
-+ if (type_flags & DST_TYPE_HAS_TS204)
-+ printk(" 0x%x ts204", DST_TYPE_HAS_TS204);
-+ if (type_flags & DST_TYPE_HAS_SYMDIV)
-+ printk(" 0x%x symdiv", DST_TYPE_HAS_SYMDIV);
-+ printk("\n");
-+}
-+
-+static int dst_type_print(u8 type)
-+{
-+ char *otype;
-+ switch (type) {
-+ case DST_TYPE_IS_SAT:
-+ otype = "satellite";
-+ break;
-+ case DST_TYPE_IS_TERR:
-+ otype = "terrestial TV";
-+ break;
-+ case DST_TYPE_IS_CABLE:
-+ otype = "terrestial TV";
-+ break;
-+ default:
-+ printk("%s: invalid dst type %d\n",
-+ __FUNCTION__, type);
-+ return -EINVAL;
-+ }
-+ printk("DST type : %s\n", otype);
-+ return 0;
-+}
-+
-+static int dst_check_ci (struct dst_data *dst)
-+{
-+ u8 txbuf[8];
-+ u8 rxbuf[8];
-+ int retval;
-+ int i;
-+ struct dst_types *dsp;
-+ u8 use_dst_type;
-+ u32 use_type_flags;
-+
-+ memset(txbuf, 0, sizeof(txbuf));
-+ txbuf[1] = 6;
-+ txbuf[7] = dst_check_sum (txbuf, 7);
-+
-+ dst_i2c_enable(dst);
-+ dst_reset8820(dst);
-+ retval = write_dst (dst, txbuf, 8);
-+ if (retval < 0) {
-+ dst_i2c_disable(dst);
-+ dprintk("%s: write not successful, maybe no card?\n", __FUNCTION__);
-+ return retval;
-+ }
-+ dvb_delay(3);
-+ retval = read_dst (dst, rxbuf, 1);
-+ dst_i2c_disable(dst);
-+ if (retval < 0) {
-+ dprintk("%s: read not successful, maybe no card?\n", __FUNCTION__);
-+ return retval;
-+ }
-+ if (rxbuf[0] != 0xff) {
-+ dprintk("%s: write reply not 0xff, not ci (%02x)\n", __FUNCTION__, rxbuf[0]);
-+ return retval;
-+ }
-+ if (!dst_wait_dst_ready(dst))
-+ return 0;
-+ // dst_i2c_enable(i2c); Dimitri
-+ retval = read_dst (dst, rxbuf, 8);
-+ dst_i2c_disable(dst);
-+ if (retval < 0) {
-+ dprintk("%s: read not successful\n", __FUNCTION__);
-+ return retval;
-+ }
-+ if (rxbuf[7] != dst_check_sum (rxbuf, 7)) {
-+ dprintk("%s: checksum failure\n", __FUNCTION__);
-+ return retval;
-+ }
-+ rxbuf[7] = '\0';
-+ for (i = 0, dsp = &dst_tlist[0]; i < sizeof(dst_tlist) / sizeof(dst_tlist[0]); i++, dsp++) {
-+ if (!strncmp(&rxbuf[dsp->offs],
-+ dsp->mstr,
-+ strlen(dsp->mstr))) {
-+ use_type_flags = dsp->type_flags;
-+ use_dst_type = dsp->dst_type;
-+ printk("%s: recognize %s\n", __FUNCTION__, dsp->mstr);
-+ break;
-+ }
-+ }
-+ if (i >= sizeof(dst_tlist) / sizeof(dst_tlist[0])) {
-+ printk("%s: unable to recognize %s or %s\n", __FUNCTION__, &rxbuf[0], &rxbuf[1]);
-+ printk("%s please email linux-dvb@linuxtv.org with this type in\n", __FUNCTION__);
-+ use_dst_type = DST_TYPE_IS_SAT;
-+ use_type_flags = DST_TYPE_HAS_SYMDIV;
-+ }
-+ switch (dst_type) {
-+ case (-1U):
-+ /* not used */
-+ break;
-+ case DST_TYPE_IS_SAT:
-+ case DST_TYPE_IS_TERR:
-+ case DST_TYPE_IS_CABLE:
-+ use_dst_type = (u8)dst_type;
-+ break;
-+ default:
-+ printk("%s: invalid user override dst type %d, not used\n",
-+ __FUNCTION__, dst_type);
-+ break;
-+ }
-+ dst_type_print(use_dst_type);
-+ if (dst_type_flags != (-1U)) {
-+ printk("%s: user override dst type flags 0x%x\n",
-+ __FUNCTION__, dst_type_flags);
-+ use_type_flags = dst_type_flags;
-+ }
-+ dst->type_flags = use_type_flags;
-+ dst->dst_type= use_dst_type;
-+ dst_type_flags_print(dst->type_flags);
-+
-+ if (dst->type_flags & DST_TYPE_HAS_TS204) {
-+ dst_packsize(dst, 204);
-+ }
-+ return 0;
-+}
-+
-+static int dst_command (struct dst_data *dst, u8 *data, u8 len)
-+{
-+ int retval;
-+ u8 reply;
-+
-+ dst_i2c_enable(dst);
-+ dst_reset8820(dst);
-+ retval = write_dst (dst, data, len);
-+ if (retval < 0) {
-+ dst_i2c_disable(dst);
-+ dprintk("%s: write not successful\n", __FUNCTION__);
-+ return retval;
-+ }
-+ dvb_delay(33);
-+ retval = read_dst (dst, &reply, 1);
-+ dst_i2c_disable(dst);
-+ if (retval < 0) {
-+ dprintk("%s: read verify not successful\n", __FUNCTION__);
-+ return retval;
-+ }
-+ if (reply != 0xff) {
-+ dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
-+ return 0;
-+ }
-+ if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
-+ return 0;
-+ if (!dst_wait_dst_ready(dst))
-+ return 0;
-+ // dst_i2c_enable(i2c); Per dimitri
-+ retval = read_dst (dst, dst->rxbuffer, 8);
-+ dst_i2c_disable(dst);
-+ if (retval < 0) {
-+ dprintk("%s: read not successful\n", __FUNCTION__);
-+ return 0;
-+ }
-+ if (dst->rxbuffer[7] != dst_check_sum (dst->rxbuffer, 7)) {
-+ dprintk("%s: checksum failure\n", __FUNCTION__);
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+static int dst_get_signal(struct dst_data *dst)
-+{
-+ int retval;
-+ u8 get_signal[] = {0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb};
-+
-+ if ((dst->diseq_flags & ATTEMPT_TUNE) == 0) {
-+ dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
-+ return 0;
-+ }
-+ if (0 == (dst->diseq_flags & HAS_LOCK)) {
-+ dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
-+ return 0;
-+ }
-+ if (time_after_eq(jiffies, dst->cur_jiff + (HZ/5))) {
-+ retval = dst_command(dst, get_signal, 8);
-+ if (retval < 0)
-+ return retval;
-+ if (dst->dst_type == DST_TYPE_IS_SAT) {
-+ dst->decode_lock = ((dst->rxbuffer[6] & 0x10) == 0) ?
-+ 1 : 0;
-+ dst->decode_strength = dst->rxbuffer[5] << 8;
-+ dst->decode_snr = dst->rxbuffer[2] << 8 |
-+ dst->rxbuffer[3];
-+ } else if ((dst->dst_type == DST_TYPE_IS_TERR) ||
-+ (dst->dst_type == DST_TYPE_IS_CABLE)) {
-+ dst->decode_lock = (dst->rxbuffer[1]) ?
-+ 1 : 0;
-+ dst->decode_strength = dst->rxbuffer[4] << 8;
-+ dst->decode_snr = dst->rxbuffer[3] << 8;
-+ }
-+ dst->cur_jiff = jiffies;
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * line22k0 0x00, 0x09, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00
-+ * line22k1 0x00, 0x09, 0x01, 0xff, 0x01, 0x00, 0x00, 0x00
-+ * line22k2 0x00, 0x09, 0x02, 0xff, 0x01, 0x00, 0x00, 0x00
-+ * tone 0x00, 0x09, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00
-+ * data 0x00, 0x09, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00
-+ * power_off 0x00, 0x09, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
-+ * power_on 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00
-+ * Diseqc 1 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec
-+ * Diseqc 2 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf4, 0xe8
-+ * Diseqc 3 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf8, 0xe4
-+ * Diseqc 4 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xfc, 0xe0
-+ */
-+
-+static int dst_set_diseqc (struct dst_data *dst, u8 *cmd, u8 len)
-+{
-+ u8 paket[8] = {0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
-+
-+ if (dst->dst_type == DST_TYPE_IS_TERR)
-+ return 0;
-+
-+ if (len == 0 || len > 4)
-+ return -EINVAL;
-+ memcpy(&paket[3], cmd, len);
-+ paket[7] = dst_check_sum (&paket[0], 7);
-+ dst_command(dst, paket, 8);
-+ return 0;
-+}
-+
-+static int dst_tone_power_cmd (struct dst_data *dst)
-+{
-+ u8 paket[8] = {0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00};
-+
-+ if (dst->dst_type == DST_TYPE_IS_TERR)
-+ return 0;
-+
-+ if (dst->voltage == SEC_VOLTAGE_OFF)
-+ paket[4] = 0;
-+ else
-+ paket[4] = 1;
-+ if (dst->tone == SEC_TONE_ON)
-+ paket[2] = dst->k22;
-+ else
-+ paket[2] = 0;
-+ paket[7] = dst_check_sum (&paket[0], 7);
-+ dst_command(dst, paket, 8);
-+ return 0;
-+}
-+
-+static int dst_set_voltage (struct dst_data *dst, fe_sec_voltage_t voltage)
-+{
-+ u8 *val;
-+ int need_cmd;
-+
-+ dst->voltage = voltage;
-+
-+ if (dst->dst_type == DST_TYPE_IS_TERR)
-+ return 0;
-+
-+ need_cmd = 0;
-+ val = &dst->tx_tuna[0];
-+ val[8] &= ~0x40;
-+ switch (voltage) {
-+ case SEC_VOLTAGE_13:
-+ if ((dst->diseq_flags & HAS_POWER) == 0)
-+ need_cmd = 1;
-+ dst->diseq_flags |= HAS_POWER;
-+ break;
-+ case SEC_VOLTAGE_18:
-+ if ((dst->diseq_flags & HAS_POWER) == 0)
-+ need_cmd = 1;
-+ dst->diseq_flags |= HAS_POWER;
-+ val[8] |= 0x40;
-+ break;
-+ case SEC_VOLTAGE_OFF:
-+ need_cmd = 1;
-+ dst->diseq_flags &= ~(HAS_POWER|HAS_LOCK|ATTEMPT_TUNE);
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+ if (need_cmd) {
-+ dst_tone_power_cmd(dst);
-+ }
-+ return 0;
-+}
-+
-+
-+static int dst_set_tone (struct dst_data *dst, fe_sec_tone_mode_t tone)
-+{
-+ u8 *val;
-+
-+ dst->tone = tone;
-+
-+ if (dst->dst_type == DST_TYPE_IS_TERR)
-+ return 0;
-+
-+ val = &dst->tx_tuna[0];
-+
-+ val[8] &= ~0x1;
-+
-+ switch (tone) {
-+ case SEC_TONE_OFF:
-+ break;
-+ case SEC_TONE_ON:
-+ val[8] |= 1;
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+ dst_tone_power_cmd(dst);
-+ return 0;
-+}
-+
-+static int dst_get_tuna (struct dst_data *dst)
-+{
-+int retval;
-+ if ((dst->diseq_flags & ATTEMPT_TUNE) == 0)
-+ return 0;
-+ dst->diseq_flags &= ~(HAS_LOCK);
-+ if (!dst_wait_dst_ready(dst))
-+ return 0;
-+ if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
-+ /* how to get variable length reply ???? */
-+ retval = read_dst (dst, dst->rx_tuna, 10);
-+ } else {
-+ retval = read_dst (dst, &dst->rx_tuna[2], 8);
-+ }
-+ if (retval < 0) {
-+ dprintk("%s: read not successful\n", __FUNCTION__);
-+ return 0;
-+ }
-+ if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
-+ if (dst->rx_tuna[9] != dst_check_sum (&dst->rx_tuna[0], 9)) {
-+ dprintk("%s: checksum failure?\n", __FUNCTION__);
-+ return 0;
-+ }
-+ } else {
-+ if (dst->rx_tuna[9] != dst_check_sum (&dst->rx_tuna[2], 7)) {
-+ dprintk("%s: checksum failure?\n", __FUNCTION__);
-+ return 0;
-+ }
-+ }
-+ if (dst->rx_tuna[2] == 0 && dst->rx_tuna[3] == 0)
-+ return 0;
-+ dst->decode_freq = ((dst->rx_tuna[2] & 0x7f) << 8) + dst->rx_tuna[3];
-+
-+ dst->decode_lock = 1;
-+ /*
-+ dst->decode_n1 = (dst->rx_tuna[4] << 8) +
-+ (dst->rx_tuna[5]);
-+
-+ dst->decode_n2 = (dst->rx_tuna[8] << 8) +
-+ (dst->rx_tuna[7]);
-+ */
-+ dst->diseq_flags |= HAS_LOCK;
-+ /* dst->cur_jiff = jiffies; */
-+ return 1;
-+}
-+
-+static int dst_write_tuna (struct dst_data *dst)
-+{
-+ int retval;
-+ u8 reply;
-+
-+ dprintk("%s: type_flags 0x%x \n", __FUNCTION__, dst->type_flags);
-+ dst->decode_freq = 0;
-+ dst->decode_lock = dst->decode_strength = dst->decode_snr = 0;
-+ if (dst->dst_type == DST_TYPE_IS_SAT) {
-+ if (!(dst->diseq_flags & HAS_POWER))
-+ dst_set_voltage (dst, SEC_VOLTAGE_13);
-+ }
-+ dst->diseq_flags &= ~(HAS_LOCK|ATTEMPT_TUNE);
-+ dst_i2c_enable(dst);
-+ if (dst->type_flags & DST_TYPE_HAS_NEWTUNE) {
-+ dst_reset8820(dst);
-+ dst->tx_tuna[9] = dst_check_sum (&dst->tx_tuna[0], 9);
-+ retval = write_dst (dst, &dst->tx_tuna[0], 10);
-+ } else {
-+ dst->tx_tuna[9] = dst_check_sum (&dst->tx_tuna[2], 7);
-+ retval = write_dst (dst, &dst->tx_tuna[2], 8);
-+ }
-+ if (retval < 0) {
-+ dst_i2c_disable(dst);
-+ dprintk("%s: write not successful\n", __FUNCTION__);
-+ return retval;
-+ }
-+ dvb_delay(3);
-+ retval = read_dst (dst, &reply, 1);
-+ dst_i2c_disable(dst);
-+ if (retval < 0) {
-+ dprintk("%s: read verify not successful\n", __FUNCTION__);
-+ return retval;
-+ }
-+ if (reply != 0xff) {
-+ dprintk("%s: write reply not 0xff 0x%02x \n", __FUNCTION__, reply);
-+ return 0;
-+ }
-+ dst->diseq_flags |= ATTEMPT_TUNE;
-+ return dst_get_tuna(dst);
-+}
-+
-+static void dst_init (struct dst_data *dst)
-+{
-+static u8 ini_satci_tuna[] = { 9, 0, 3, 0xb6, 1, 0, 0x73, 0x21, 0, 0 };
-+static u8 ini_satfta_tuna[] = { 0, 0, 3, 0xb6, 1, 0x55, 0xbd, 0x50, 0, 0 };
-+static u8 ini_tvfta_tuna[] = { 0, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
-+static u8 ini_tvci_tuna[] = { 9, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
-+static u8 ini_cabfta_tuna[] = { 0, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
-+static u8 ini_cabci_tuna[] = { 9, 0, 3, 0xb6, 1, 7, 0x0, 0x0, 0, 0 };
-+ dst->inversion = INVERSION_ON;
-+ dst->voltage = SEC_VOLTAGE_13;
-+ dst->tone = SEC_TONE_OFF;
-+ dst->symbol_rate = 29473000;
-+ dst->fec = FEC_AUTO;
-+ dst->diseq_flags = 0;
-+ dst->k22 = 0x02;
-+ dst->bandwidth = BANDWIDTH_7_MHZ;
-+ dst->cur_jiff = jiffies;
-+ if (dst->dst_type == DST_TYPE_IS_SAT) {
-+ dst->frequency = 950000;
-+ memcpy(dst->tx_tuna, ((dst->type_flags & DST_TYPE_HAS_NEWTUNE )?
-+ ini_satci_tuna : ini_satfta_tuna),
-+ sizeof(ini_satfta_tuna));
-+ } else if (dst->dst_type == DST_TYPE_IS_TERR) {
-+ dst->frequency = 137000000;
-+ memcpy(dst->tx_tuna, ((dst->type_flags & DST_TYPE_HAS_NEWTUNE )?
-+ ini_tvci_tuna : ini_tvfta_tuna),
-+ sizeof(ini_tvfta_tuna));
-+ } else if (dst->dst_type == DST_TYPE_IS_CABLE) {
-+ dst->frequency = 51000000;
-+ memcpy(dst->tx_tuna, ((dst->type_flags & DST_TYPE_HAS_NEWTUNE )?
-+ ini_cabci_tuna : ini_cabfta_tuna),
-+ sizeof(ini_cabfta_tuna));
-+ }
-+}
-+
-+struct lkup {
-+ unsigned int cmd;
-+ char *desc;
-+} looker[] = {
-+ {FE_GET_INFO, "FE_GET_INFO:"},
-+ {FE_READ_STATUS, "FE_READ_STATUS:" },
-+ {FE_READ_BER, "FE_READ_BER:" },
-+ {FE_READ_SIGNAL_STRENGTH, "FE_READ_SIGNAL_STRENGTH:" },
-+ {FE_READ_SNR, "FE_READ_SNR:" },
-+ {FE_READ_UNCORRECTED_BLOCKS, "FE_READ_UNCORRECTED_BLOCKS:" },
-+ {FE_SET_FRONTEND, "FE_SET_FRONTEND:" },
-+ {FE_GET_FRONTEND, "FE_GET_FRONTEND:" },
-+ {FE_SLEEP, "FE_SLEEP:" },
-+ {FE_INIT, "FE_INIT:" },
-+ {FE_RESET, "FE_RESET:" },
-+ {FE_SET_TONE, "FE_SET_TONE:" },
-+ {FE_SET_VOLTAGE, "FE_SET_VOLTAGE:" },
-+ };
-+
-+static int dst_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
-+{
-+ struct dst_data *dst = fe->data;
-+ int retval;
-+ /*
-+ char *cc;
-+
-+ cc = "FE_UNSUPP:";
-+ for(retval = 0; retval < sizeof(looker) / sizeof(looker[0]); retval++) {
-+ if (looker[retval].cmd == cmd) {
-+ cc = looker[retval].desc;
-+ break;
-+ }
-+ }
-+ dprintk("%s cmd %s (0x%x)\n",__FUNCTION__, cc, cmd);
-+ */
-+ // printk("%s: dst %8.8x bt %8.8x i2c %8.8x\n", __FUNCTION__, dst, dst->bt, dst->i2c);
-+ /* should be set by attach, but just in case */
-+ dst->i2c = fe->i2c;
-+ switch (cmd) {
-+ case FE_GET_INFO:
-+ {
-+ struct dvb_frontend_info *info;
-+ info = &dst_info_sat;
-+ if (dst->dst_type == DST_TYPE_IS_TERR)
-+ info = &dst_info_tv;
-+ else if (dst->dst_type == DST_TYPE_IS_CABLE)
-+ info = &dst_info_cable;
-+ memcpy (arg, info, sizeof(struct dvb_frontend_info));
-+ break;
-+ }
-+ case FE_READ_STATUS:
-+ {
-+ fe_status_t *status = arg;
-+
-+ *status = 0;
-+ if (dst->diseq_flags & HAS_LOCK) {
-+ dst_get_signal(dst);
-+ if (dst->decode_lock)
-+ *status |= FE_HAS_LOCK
-+ | FE_HAS_SIGNAL
-+ | FE_HAS_CARRIER
-+ | FE_HAS_SYNC
-+ | FE_HAS_VITERBI;
-+ }
-+ break;
-+ }
-+
-+ case FE_READ_BER:
-+ {
-+ /* guess */
-+ // *(u32*) arg = dst->decode_n1;
-+ *(u32*) arg = 0;
-+ return -EOPNOTSUPP;
-+ }
-+
-+ case FE_READ_SIGNAL_STRENGTH:
-+ {
-+ dst_get_signal(dst);
-+ *((u16*) arg) = dst->decode_strength;
-+ break;
-+ }
-+
-+ case FE_READ_SNR:
-+ {
-+ dst_get_signal(dst);
-+ *((u16*) arg) = dst->decode_snr;
-+ break;
-+ }
-+
-+ case FE_READ_UNCORRECTED_BLOCKS:
-+ {
-+ *((u32*) arg) = 0; /* the stv0299 can't measure BER and */
-+ return -EOPNOTSUPP; /* errors at the same time.... */
-+ }
-+
-+ case FE_SET_FRONTEND:
-+ {
-+ struct dvb_frontend_parameters *p = arg;
-+
-+ dst_set_freq (dst, p->frequency);
-+ dst_set_inversion (dst, p->inversion);
-+ if (dst->dst_type == DST_TYPE_IS_SAT) {
-+ dst_set_fec (dst, p->u.qpsk.fec_inner);
-+ dst_set_symbolrate (dst, p->u.qpsk.symbol_rate);
-+ } else if (dst->dst_type == DST_TYPE_IS_TERR) {
-+ dst_set_bandwidth(dst, p->u.ofdm.bandwidth);
-+ } else if (dst->dst_type == DST_TYPE_IS_CABLE) {
-+ dst_set_fec (dst, p->u.qam.fec_inner);
-+ dst_set_symbolrate (dst, p->u.qam.symbol_rate);
-+ }
-+ dst_write_tuna (dst);
-+
-+ break;
-+ }
-+
-+ case FE_GET_FRONTEND:
-+ {
-+ struct dvb_frontend_parameters *p = arg;
-+
-+
-+ p->frequency = dst->decode_freq;
-+ p->inversion = dst->inversion;
-+ if (dst->dst_type == DST_TYPE_IS_SAT) {
-+ p->u.qpsk.symbol_rate = dst->symbol_rate;
-+ p->u.qpsk.fec_inner = dst_get_fec (dst);
-+ } else if (dst->dst_type == DST_TYPE_IS_TERR) {
-+ p->u.ofdm.bandwidth = dst->bandwidth;
-+ } else if (dst->dst_type == DST_TYPE_IS_CABLE) {
-+ p->u.qam.symbol_rate = dst->symbol_rate;
-+ p->u.qam.fec_inner = dst_get_fec (dst);
-+ p->u.qam.modulation = QAM_AUTO;
-+ }
-+ break;
-+ }
-+
-+ case FE_SLEEP:
-+ return 0;
-+
-+ case FE_INIT:
-+ dst_init(dst);
-+ break;
-+
-+ case FE_RESET:
-+ break;
-+
-+ case FE_DISEQC_SEND_MASTER_CMD:
-+ {
-+ struct dvb_diseqc_master_cmd *cmd = (struct dvb_diseqc_master_cmd *)arg;
-+ retval = dst_set_diseqc (dst, cmd->msg, cmd->msg_len);
-+ if (retval < 0)
-+ return retval;
-+ break;
-+ }
-+ case FE_SET_TONE:
-+ retval = dst_set_tone (dst, (fe_sec_tone_mode_t) arg);
-+ if (retval < 0)
-+ return retval;
-+ break;
-+ case FE_SET_VOLTAGE:
-+ retval = dst_set_voltage (dst, (fe_sec_voltage_t) arg);
-+ if (retval < 0)
-+ return retval;
-+ break;
-+ default:
-+ return -EOPNOTSUPP;
-+ };
-+
-+ return 0;
-+}
-+
-+
-+static int dst_attach (struct dvb_i2c_bus *i2c, void **data)
-+{
-+ struct dst_data *dst;
-+ struct bt878 *bt;
-+ struct dvb_frontend_info *info;
-+
-+ dprintk("%s: check ci\n", __FUNCTION__);
-+ bt = bt878_find_by_dvb_adap(i2c->adapter);
-+ if (!bt)
-+ return -ENODEV;
-+ dst = kmalloc(sizeof(struct dst_data), GFP_KERNEL);
-+ if (dst == NULL) {
-+ printk(KERN_INFO "%s: Out of memory.\n", __FUNCTION__);
-+ return -ENOMEM;
-+ }
-+ memset(dst, 0, sizeof(*dst));
-+ *data = dst;
-+ dst->bt = bt;
-+ dst->i2c = i2c;
-+ if (dst_check_ci(dst) < 0) {
-+ kfree(dst);
-+ return -ENODEV;
-+ }
-+
-+ dst_init (dst);
-+ dprintk("%s: register dst %8.8x bt %8.8x i2c %8.8x\n", __FUNCTION__,
-+ (u32)dst, (u32)(dst->bt), (u32)(dst->i2c));
-+
-+ info = &dst_info_sat;
-+ if (dst->dst_type == DST_TYPE_IS_TERR)
-+ info = &dst_info_tv;
-+ else if (dst->dst_type == DST_TYPE_IS_CABLE)
-+ info = &dst_info_cable;
-+
-+ dvb_register_frontend (dst_ioctl, i2c, dst, info);
-+
-+ return 0;
-+}
-+
-+static void dst_detach (struct dvb_i2c_bus *i2c, void *data)
-+{
-+ dvb_unregister_frontend (dst_ioctl, i2c);
-+ dprintk("%s: unregister dst %8.8x\n", __FUNCTION__, (u32)(data));
-+ if (data)
-+ kfree(data);
-+}
-+
-+static int __init init_dst (void)
-+{
-+ return dvb_register_i2c_device (THIS_MODULE, dst_attach, dst_detach);
-+}
-+
-+static void __exit exit_dst (void)
-+{
-+ dvb_unregister_i2c_device (dst_attach);
-+}
-+
-+
-+module_init(init_dst);
-+module_exit(exit_dst);
-+
-+MODULE_DESCRIPTION("DST DVB-S Frontend");
-+MODULE_AUTHOR("Jamie Honan");
-+MODULE_LICENSE("GPL");
-+
---- linux-2.6.0/drivers/media/dvb/frontends/Kconfig 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/Kconfig 2003-12-28 23:22:37.000000000 -0800
-@@ -1,6 +1,17 @@
- comment "Supported Frontend Modules"
- depends on DVB
-
-+config DVB_TWINHAN_DST
-+ tristate "TWINHAN DST based DVB-S frontend (QPSK)"
-+ depends on DVB_CORE
-+ help
-+ Used in such cards as the VP-1020/1030, Twinhan DST,
-+ VVmer TV@SAT. Say Y when you want to support frontends
-+ using this asic.
-+
-+ This module requires the dvb-bt8xx driver and dvb bt878
-+ module.
-+
- config DVB_STV0299
- tristate "STV0299 based DVB-S frontend (QPSK)"
- depends on DVB_CORE
-@@ -145,3 +156,19 @@ config DVB_TDA1004X_FIRMWARE_FILE
- wget http://www.technotrend.de/new/215/TTweb_215a_budget_20_05_2003.zip
- unzip -j TTweb_215a_budget_20_05_2003.zip Software/Oem/PCI/App/ttlcdacc.dll
- mv ttlcdacc.dll /etc/dvb/tda1004x.bin
-+
-+config DVB_SP887X_FIRMWARE_FILE
-+ string "Full pathname of sp887x firmware file"
-+ depends on DVB_SP887X
-+ default "/etc/dvb/sc_main.mc"
-+ help
-+ This driver needs a copy of the Avermedia firmware. The version tested
-+ is part of the Avermedia DVB-T 1.3.26.3 Application. This can be downloaded
-+ from the Avermedia web site.
-+ If the software is installed in Windows the file will be in the
-+ /Program Files/AVerTV DVB-T/ directory and is called sc_main.mc.
-+ Alternatively it can "extracted" from the install cab files but this will have
-+ to be done in windows as I don't know of a linux version of extract.exe.
-+ Copy this file to /etc/dvb/sc_main.mc. With this version of the file the first
-+ 10 bytes are discarded and the next 0x4000 loaded. This may change in future
-+ versions.
---- linux-2.6.0/drivers/media/dvb/frontends/Makefile 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/Makefile 2003-12-28 23:22:37.000000000 -0800
-@@ -4,6 +4,7 @@
-
- EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
-
-+obj-$(CONFIG_DVB_TWINHAN_DST) += dst.o
- obj-$(CONFIG_DVB_STV0299) += stv0299.o
- obj-$(CONFIG_DVB_ALPS_TDLB7) += alps_tdlb7.o
- obj-$(CONFIG_DVB_ALPS_TDMB7) += alps_tdmb7.o
---- linux-2.6.0/drivers/media/dvb/frontends/mt312.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/mt312.c 2003-12-28 23:22:38.000000000 -0800
-@@ -39,11 +39,19 @@
- #define MT312_DEBUG 0
-
- #define MT312_SYS_CLK 90000000UL /* 90 MHz */
-+#define MT312_LPOWER_SYS_CLK 60000000UL /* 60 MHz */
- #define MT312_PLL_CLK 10000000UL /* 10 MHz */
-
- /* number of active frontends */
- static int mt312_count = 0;
-
-+#if MT312_DEBUG == 0
-+#define dprintk(x...)
-+#else
-+static int debug = 0;
-+#define dprintk if(debug == 1) printk
-+#endif
-+
- static struct dvb_frontend_info mt312_info = {
- .name = "Zarlink MT312",
- .type = FE_QPSK,
-@@ -86,7 +94,7 @@ static int mt312_read(struct dvb_i2c_bus
- return -EREMOTEIO;
- }
- #if MT312_DEBUG
-- {
-+ if(debug) {
- int i;
- printk(KERN_INFO "R(%d):", reg & 0x7f);
- for (i = 0; i < count; i++)
-@@ -107,7 +115,7 @@ static int mt312_write(struct dvb_i2c_bu
- struct i2c_msg msg;
-
- #if MT312_DEBUG
-- {
-+ if(debug) {
- int i;
- printk(KERN_INFO "W(%d):", reg & 0x7f);
- for (i = 0; i < count; i++)
-@@ -205,7 +213,7 @@ static int sl1935_set_tv_freq(struct dvb
- if (freq < 1550000)
- buf[3] |= 0x10;
-
-- printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
-+ dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
- buf[1], buf[2], buf[3]);
-
- return mt312_pll_write(i2c, I2C_ADDR_SL1935, buf, sizeof(buf));
-@@ -225,7 +233,7 @@ static int tsa5059_set_tv_freq(struct dv
- if (freq < 1550000)
- buf[3] |= 0x02;
-
-- printk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
-+ dprintk(KERN_INFO "synth dword = %02x%02x%02x%02x\n", buf[0],
- buf[1], buf[2], buf[3]);
-
- return mt312_pll_write(i2c, I2C_ADDR_TSA5059, buf, sizeof(buf));
-@@ -236,13 +244,13 @@ static int mt312_reset(struct dvb_i2c_bu
- return mt312_writereg(i2c, RESET, full ? 0x80 : 0x40);
- }
-
--static int mt312_init(struct dvb_i2c_bus *i2c, const long id)
-+static int mt312_init(struct dvb_i2c_bus *i2c, const long id, u8 pll)
- {
- int ret;
- u8 buf[2];
-
- /* wake up */
-- if ((ret = mt312_writereg(i2c, CONFIG, 0x8c)) < 0)
-+ if ((ret = mt312_writereg(i2c, CONFIG, (pll == 60 ? 0x88 : 0x8c))) < 0)
- return ret;
-
- /* wait at least 150 usec */
-@@ -252,8 +260,17 @@ static int mt312_init(struct dvb_i2c_bus
- if ((ret = mt312_reset(i2c, 1)) < 0)
- return ret;
-
-+// Per datasheet, write correct values. 09/28/03 ACCJr.
-+// If we don't do this, we won't get FE_HAS_VITERBI in the VP310.
-+ {
-+ u8 buf_def[8]={0x14, 0x12, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00};
-+
-+ if ((ret = mt312_write(i2c, VIT_SETUP, buf_def, sizeof(buf_def))) < 0)
-+ return ret;
-+ }
-+
- /* SYS_CLK */
-- buf[0] = mt312_div(MT312_SYS_CLK * 2, 1000000);
-+ buf[0] = mt312_div((pll == 60 ? MT312_LPOWER_SYS_CLK : MT312_SYS_CLK) * 2, 1000000);
-
- /* DISEQC_RATIO */
- buf[1] = mt312_div(MT312_PLL_CLK, 15000 * 4);
-@@ -370,16 +387,18 @@ static int mt312_set_voltage(struct dvb_
- return mt312_writereg(i2c, DISEQC_MODE, volt_tab[v]);
- }
-
--static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t * s)
-+static int mt312_read_status(struct dvb_i2c_bus *i2c, fe_status_t *s, const long id)
- {
- int ret;
-- u8 status[3];
-+ u8 status[3], vit_mode;
-
- *s = 0;
-
- if ((ret = mt312_read(i2c, QPSK_STAT_H, status, sizeof(status))) < 0)
- return ret;
-
-+ dprintk(KERN_DEBUG "QPSK_STAT_H: 0x%02x, QPSK_STAT_L: 0x%02x, FEC_STATUS: 0x%02x\n", status[0], status[1], status[2]);
-+
- if (status[0] & 0xc0)
- *s |= FE_HAS_SIGNAL; /* signal noise ratio */
- if (status[0] & 0x04)
-@@ -390,6 +409,16 @@ static int mt312_read_status(struct dvb_
- *s |= FE_HAS_SYNC; /* byte align lock */
- if (status[0] & 0x01)
- *s |= FE_HAS_LOCK; /* qpsk lock */
-+ // VP310 doesn't have AUTO, so we "implement it here" ACCJr
-+ if ((id == ID_VP310) && !(status[0] & 0x01)) {
-+ if ((ret = mt312_readreg(i2c, VIT_MODE, &vit_mode)) < 0)
-+ return ret;
-+ vit_mode ^= 0x40;
-+ if ((ret = mt312_writereg(i2c, VIT_MODE, vit_mode)) < 0)
-+ return ret;
-+ if ((ret = mt312_writereg(i2c, GO, 0x01)) < 0)
-+ return ret;
-+ }
-
- return 0;
- }
-@@ -422,7 +451,7 @@ static int mt312_read_agc(struct dvb_i2c
-
- *signal_strength = agc;
-
-- printk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
-+ dprintk(KERN_DEBUG "agc=%08x err_db=%hd\n", agc, err_db);
-
- return 0;
- }
-@@ -458,7 +487,7 @@ static int mt312_set_frontend(struct dvb
- const long id)
- {
- int ret;
-- u8 buf[5];
-+ u8 buf[5], config_val;
- u16 sr;
-
- const u8 fec_tab[10] =
-@@ -467,6 +496,8 @@ static int mt312_set_frontend(struct dvb
-
- int (*set_tv_freq)(struct dvb_i2c_bus *i2c, u32 freq, u32 sr);
-
-+ dprintk("%s: Freq %d\n", __FUNCTION__, p->frequency);
-+
- if ((p->frequency < mt312_info.frequency_min)
- || (p->frequency > mt312_info.frequency_max))
- return -EINVAL;
-@@ -489,6 +520,22 @@ static int mt312_set_frontend(struct dvb
-
- switch (id) {
- case ID_VP310:
-+ // For now we will do this only for the VP310.
-+ // It should be better for the mt312 as well, but tunning will be slower. ACCJr 09/29/03
-+ if ((ret = mt312_readreg(i2c, CONFIG, &config_val) < 0))
-+ return ret;
-+ if (p->u.qpsk.symbol_rate >= 30000000) //Note that 30MS/s should use 90MHz
-+ {
-+ if ((config_val & 0x0c) == 0x08) //We are running 60MHz
-+ if ((ret = mt312_init(i2c, id, (u8) 90)) < 0)
-+ return ret;
-+ }
-+ else
-+ {
-+ if ((config_val & 0x0c) == 0x0C) //We are running 90MHz
-+ if ((ret = mt312_init(i2c, id, (u8) 60)) < 0)
-+ return ret;
-+ }
- set_tv_freq = tsa5059_set_tv_freq;
- break;
- case ID_MT312:
-@@ -562,7 +609,7 @@ static int mt312_get_symbol_rate(struct
-
- monitor = (buf[0] << 8) | buf[1];
-
-- printk(KERN_DEBUG "sr(auto) = %u\n",
-+ dprintk(KERN_DEBUG "sr(auto) = %u\n",
- mt312_div(monitor * 15625, 4));
- } else {
- if ((ret = mt312_writereg(i2c, MON_CTRL, 0x05)) < 0)
-@@ -578,9 +625,9 @@ static int mt312_get_symbol_rate(struct
-
- sym_rat_op = (buf[0] << 8) | buf[1];
-
-- printk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
-+ dprintk(KERN_DEBUG "sym_rat_op=%d dec_ratio=%d\n",
- sym_rat_op, dec_ratio);
-- printk(KERN_DEBUG "*sr(manual) = %lu\n",
-+ dprintk(KERN_DEBUG "*sr(manual) = %lu\n",
- (((MT312_PLL_CLK * 8192) / (sym_rat_op + 8192)) *
- 2) - dec_ratio);
- }
-@@ -675,7 +722,7 @@ static int mt312_ioctl(struct dvb_fronte
- return -EOPNOTSUPP;
-
- case FE_READ_STATUS:
-- return mt312_read_status(i2c, arg);
-+ return mt312_read_status(i2c, arg, (long) fe->data);
-
- case FE_READ_BER:
- return mt312_read_bercnt(i2c, arg);
-@@ -702,7 +749,12 @@ static int mt312_ioctl(struct dvb_fronte
- return mt312_sleep(i2c);
-
- case FE_INIT:
-- return mt312_init(i2c, (long) fe->data);
-+ //For the VP310 we should run at 60MHz when ever possible.
-+ //It should be better to run the mt312 ar lower speed when ever possible, but tunning will be slower. ACCJr 09/29/03
-+ if ((long)fe->data == ID_MT312)
-+ return mt312_init(i2c, (long) fe->data, (u8) 90);
-+ else
-+ return mt312_init(i2c, (long) fe->data, (u8) 60);
-
- case FE_RESET:
- return mt312_reset(i2c, 0);
-@@ -755,6 +807,11 @@ static void __exit mt312_module_exit(voi
- module_init(mt312_module_init);
- module_exit(mt312_module_exit);
-
-+#if MT312_DEBUG != 0
-+MODULE_PARM(debug,"i");
-+MODULE_PARM_DESC(debug, "enable verbose debug messages");
-+#endif
-+
- MODULE_DESCRIPTION("MT312 Satellite Channel Decoder Driver");
- MODULE_AUTHOR("Andreas Oberritter <obi@saftware.de>");
- MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/media/dvb/frontends/nxt6000.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/nxt6000.c 2003-12-28 23:22:38.000000000 -0800
-@@ -55,34 +55,21 @@ static struct dvb_frontend_info nxt6000_
- .symbol_rate_max = 9360000, /* FIXME */
- .symbol_rate_tolerance = 4000,
- .notifier_delay = 0,
-- .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-- FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
-- FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
-- FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-- FE_CAN_TRANSMISSION_MODE_AUTO |
-- FE_CAN_GUARD_INTERVAL_AUTO |
-- FE_CAN_HIERARCHY_AUTO,
--
-+ .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
- };
-
--#pragma pack(1)
--
- struct nxt6000_config {
--
- u8 demod_addr;
- u8 tuner_addr;
- u8 tuner_type;
- u8 clock_inversion;
--
- };
-
--#pragma pack()
--
- #define TUNER_TYPE_ALP510 0
- #define TUNER_TYPE_SP5659 1
- #define TUNER_TYPE_SP5730 2
-
--#define FE2NXT(fe) ((struct nxt6000_config *)&(fe->data))
-+#define FE2NXT(fe) ((struct nxt6000_config *)((fe)->data))
- #define FREQ2DIV(freq) ((freq + 36166667) / 166667)
-
- #define dprintk if (debug) printk
-@@ -116,8 +103,10 @@ static u8 nxt6000_read(struct dvb_i2c_bu
- int ret;
- u8 b0[] = {reg};
- u8 b1[] = {0};
-- struct i2c_msg msgs[] = {{.addr = addr >> 1, .flags = 0, .buf = b0, .len = 1},
-- {.addr = addr >> 1, .flags = I2C_M_RD, .buf = b1, .len = 1}};
-+ struct i2c_msg msgs[] = {
-+ {.addr = addr >> 1,.flags = 0,.buf = b0,.len = 1},
-+ {.addr = addr >> 1,.flags = I2C_M_RD,.buf = b1,.len = 1}
-+ };
-
- ret = i2c->xfer(i2c, msgs, 2);
-
-@@ -394,7 +383,7 @@ static void nxt6000_setup(struct dvb_fro
- nxt6000_writereg(fe, OFDM_ITB_FREQ_1, 0x06);
- nxt6000_writereg(fe, OFDM_ITB_FREQ_2, 0x31);
- nxt6000_writereg(fe, OFDM_CAS_CTL, (0x01 << 7) | (0x02 << 3) | 0x04);
-- nxt6000_writereg(fe, CAS_FREQ, 0xBB); // CHECKME
-+ nxt6000_writereg(fe, CAS_FREQ, 0xBB); /* CHECKME */
- nxt6000_writereg(fe, OFDM_SYR_CTL, 1 << 2);
- nxt6000_writereg(fe, OFDM_PPM_CTL_1, PPM256);
- nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_1, 0x49);
-@@ -414,20 +403,20 @@ static void nxt6000_setup(struct dvb_fro
-
- static void nxt6000_dump_status(struct dvb_frontend *fe)
- {
--
- u8 val;
-
--// printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, RS_COR_STAT));
--// printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(fe, VIT_SYNC_STATUS));
--// printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_COR_STAT));
--// printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_SYR_STAT));
--// printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_1));
--// printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_2));
--// printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_3));
--// printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_4));
--// printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_1));
--// printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_2));
--
-+/*
-+ printk("RS_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, RS_COR_STAT));
-+ printk("VIT_SYNC_STATUS: 0x%02X\n", nxt6000_readreg(fe, VIT_SYNC_STATUS));
-+ printk("OFDM_COR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_COR_STAT));
-+ printk("OFDM_SYR_STAT: 0x%02X\n", nxt6000_readreg(fe, OFDM_SYR_STAT));
-+ printk("OFDM_TPS_RCVD_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_1));
-+ printk("OFDM_TPS_RCVD_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_2));
-+ printk("OFDM_TPS_RCVD_3: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_3));
-+ printk("OFDM_TPS_RCVD_4: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RCVD_4));
-+ printk("OFDM_TPS_RESERVED_1: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_1));
-+ printk("OFDM_TPS_RESERVED_2: 0x%02X\n", nxt6000_readreg(fe, OFDM_TPS_RESERVED_2));
-+*/
- printk("NXT6000 status:");
-
- val = nxt6000_readreg(fe, RS_COR_STAT);
-@@ -460,13 +449,11 @@ static void nxt6000_dump_status(struct d
- break;
-
- case 0x03:
--
- printk(" VITERBI CODERATE: 5/6,");
-+ break;
-
- case 0x04:
--
- printk(" VITERBI CODERATE: 7/8,");
--
- break;
-
- default:
-@@ -503,13 +490,11 @@ static void nxt6000_dump_status(struct d
- break;
-
- case 0x04:
--
- printk(" CoreState: WAIT_PPM,");
-+ break;
-
- case 0x01:
--
- printk(" CoreState: WAIT_TRL,");
--
- break;
-
- case 0x05:
-@@ -586,13 +571,11 @@ static void nxt6000_dump_status(struct d
- break;
-
- case 0x03:
--
- printk(" TPSLP: 5/6,");
-+ break;
-
- case 0x04:
--
- printk(" TPSLP: 7/8,");
--
- break;
-
- default:
-@@ -622,13 +605,11 @@ static void nxt6000_dump_status(struct d
- break;
-
- case 0x03:
--
- printk(" TPSHP: 5/6,");
-+ break;
-
- case 0x04:
--
- printk(" TPSHP: 7/8,");
--
- break;
-
- default:
-@@ -669,7 +650,7 @@ static void nxt6000_dump_status(struct d
-
- }
-
-- // Strange magic required to gain access to RF_AGC_STATUS
-+ /* Strange magic required to gain access to RF_AGC_STATUS */
- nxt6000_readreg(fe, RF_AGC_VAL_1);
- val = nxt6000_readreg(fe, RF_AGC_STATUS);
- val = nxt6000_readreg(fe, RF_AGC_STATUS);
-@@ -735,21 +716,23 @@ static int nxt6000_ioctl(struct dvb_fron
-
- case FE_READ_SIGNAL_STRENGTH:
- {
--// s16 *signal = (s16 *)arg;
--
--// *signal=(((signed char)readreg(client, 0x16))+128)<<8;
--
-+ s16 *signal = (s16 *) arg;
-+/*
-+ *signal=(((signed char)readreg(client, 0x16))+128)<<8;
-+*/
-+ *signal = 0;
- return 0;
-
- }
-
- case FE_READ_SNR:
- {
--// s16 *snr = (s16 *)arg;
--
--// *snr=readreg(client, 0x24)<<8;
--// *snr|=readreg(client, 0x25);
--
-+ s16 *snr = (s16 *) arg;
-+/*
-+ *snr=readreg(client, 0x24)<<8;
-+ *snr|=readreg(client, 0x25);
-+*/
-+ *snr = 0;
- break;
- }
-
-@@ -831,70 +814,74 @@ static u8 demod_addr_tbl[] = {0x14, 0x18
-
- static int nxt6000_attach(struct dvb_i2c_bus *i2c, void **data)
- {
--
- u8 addr_nr;
- u8 fe_count = 0;
-- struct nxt6000_config nxt;
-+ struct nxt6000_config *pnxt;
-
- dprintk("nxt6000: attach\n");
-
-+ pnxt = kmalloc(sizeof(demod_addr_tbl)*sizeof(struct nxt6000_config), GFP_KERNEL);
-+ if (NULL == pnxt) {
-+ dprintk("nxt6000: no memory for private data.\n");
-+ return -ENOMEM;
-+ }
-+ *data = pnxt;
-+
- for (addr_nr = 0; addr_nr < sizeof(demod_addr_tbl); addr_nr++) {
-+ struct nxt6000_config *nxt = &pnxt[addr_nr];
-
- if (nxt6000_read(i2c, demod_addr_tbl[addr_nr], OFDM_MSC_REV) != NXT6000ASICDEVICE)
- continue;
-
- if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
-+ nxt->tuner_addr = 0xC0;
-+ nxt->tuner_type = TUNER_TYPE_ALP510;
-+ nxt->clock_inversion = 1;
-
-- nxt.tuner_addr = 0xC0;
-- nxt.tuner_type = TUNER_TYPE_ALP510;
-- nxt.clock_inversion = 1;
--
-- dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", nxt.tuner_addr);
-+ dprintk("nxt6000: detected TI ALP510 tuner at 0x%02X\n", nxt->tuner_addr);
-
- } else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC2, NULL, 0) == 0) {
-+ nxt->tuner_addr = 0xC2;
-+ nxt->tuner_type = TUNER_TYPE_SP5659;
-+ nxt->clock_inversion = 0;
-
-- nxt.tuner_addr = 0xC2;
-- nxt.tuner_type = TUNER_TYPE_SP5659;
-- nxt.clock_inversion = 0;
--
-- dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt.tuner_addr);
-+ dprintk("nxt6000: detected MITEL SP5659 tuner at 0x%02X\n", nxt->tuner_addr);
-
- } else if (pll_write(i2c, demod_addr_tbl[addr_nr], 0xC0, NULL, 0) == 0) {
-+ nxt->tuner_addr = 0xC0;
-+ nxt->tuner_type = TUNER_TYPE_SP5730;
-+ nxt->clock_inversion = 0;
-
-- nxt.tuner_addr = 0xC0;
-- nxt.tuner_type = TUNER_TYPE_SP5730;
-- nxt.clock_inversion = 0;
--
-- dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt.tuner_addr);
-+ dprintk("nxt6000: detected SP5730 tuner at 0x%02X\n", nxt->tuner_addr);
-
- } else {
--
- printk("nxt6000: unable to detect tuner\n");
--
- continue;
--
- }
-
-- nxt.demod_addr = demod_addr_tbl[addr_nr];
-+ nxt->demod_addr = demod_addr_tbl[addr_nr];
-
- dprintk("nxt6000: attached at %d:%d\n", i2c->adapter->num, i2c->id);
-
-- dvb_register_frontend(nxt6000_ioctl, i2c, (void *)(*((u32 *)&nxt)), &nxt6000_info);
-+ dvb_register_frontend(nxt6000_ioctl, i2c, (void *)nxt, &nxt6000_info);
-
- fe_count++;
- }
-
-- return (fe_count > 0) ? 0 : -ENODEV;
-+ if (fe_count == 0) {
-+ kfree(pnxt);
-+ return -ENODEV;
-+ }
-
-+ return 0;
- }
-
- static void nxt6000_detach(struct dvb_i2c_bus *i2c, void *data)
- {
--
-+ struct nxt6000_config *pnxt = (struct nxt6000_config *)data;
- dprintk("nxt6000: detach\n");
--
- dvb_unregister_frontend(nxt6000_ioctl, i2c);
--
-+ kfree(pnxt);
- }
-
- static __init int nxt6000_init(void)
---- linux-2.6.0/drivers/media/dvb/frontends/nxt6000.h 2003-06-14 12:17:56.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/nxt6000.h 2003-12-28 23:22:38.000000000 -0800
-@@ -1,45 +1,10 @@
--/**********************************************************************/
-- * DRV6000reg.H
-+/*
- * Public Include File for DRV6000 users
-+ * (ie. NxtWave Communications - NXT6000 demodulator driver)
- *
- * Copyright (C) 2001 NxtWave Communications, Inc.
- *
-- * $Log: nxt6000.h,v $
-- * Revision 1.2 2003/01/27 12:32:42 fschirmer
-- * Lots of bugfixes and new features
-- *
-- * Revision 1.1 2003/01/21 18:43:09 fschirmer
-- * Nxt6000 based frontend driver
-- *
-- * Revision 1.1 2003/01/03 02:25:45 obi
-- * alps tdme7 driver
-- *
-- *
-- * Rev 1.10 Jun 12 2002 11:28:02 dkoeger
-- * Updated for SA in GUi work
-- *
-- * Rev 1.9 Apr 01 2002 10:38:46 dkoeger
-- * Updated for 1.0.31 GUI
-- *
-- * Rev 1.8 Mar 11 2002 10:04:56 dkoeger
-- * Updated for 1.0.31 GUI version
-- *
-- * Rev 1.5 Dec 07 2001 14:40:40 dkoeger
-- * Updated for 1.0.28 GUI
-- *
-- * Rev 1.4 Nov 13 2001 11:09:00 dkoeger
-- * No change.
-- *
-- * Rev 1.3 Aug 23 2001 14:21:02 dkoeger
-- * Updated for driver version 2.1.9
-- *
-- * Rev 1.2 Jul 09 2001 09:20:04 dkoeger
-- * Updated for 1.0.18
-- *
-- * Rev 1.1 Jun 13 2001 16:14:24 dkoeger
-- * Updated to reflect NXT6000 GUI BETA 1.0.11 6/13/2001
-- **********************************************************************/
--
-+ */
-
- /* Nxt6000 Register Addresses and Bit Masks */
-
---- linux-2.6.0/drivers/media/dvb/frontends/sp887x.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/sp887x.c 2003-12-28 23:22:38.000000000 -0800
-@@ -1,11 +1,39 @@
-+/*
-+ Driver for the Microtune 7202D Frontend
-+*/
-+
-+/*
-+ This driver needs a copy of the Avermedia firmware. The version tested
-+ is part of the Avermedia DVB-T 1.3.26.3 Application. If the software is
-+ installed in Windows the file will be in the /Program Files/AVerTV DVB-T/
-+ directory and is called sc_main.mc. Alternatively it can "extracted" from
-+ the install cab files. Copy this file to /etc/dvb/sc_main.mc.
-+ With this version of the file the first 10 bytes are discarded and the
-+ next 0x4000 loaded. This may change in future versions.
-+ */
-
-+#define __KERNEL_SYSCALLS__
-+#include <linux/kernel.h>
-+#include <linux/vmalloc.h>
- #include <linux/module.h>
- #include <linux/init.h>
-+#include <linux/string.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/unistd.h>
-+#include <linux/fcntl.h>
-+#include <linux/errno.h>
- #include <linux/i2c.h>
-
-+
- #include "dvb_frontend.h"
- #include "dvb_functions.h"
-
-+#ifndef DVB_SP887X_FIRMWARE_FILE
-+#define DVB_SP887X_FIRMWARE_FILE "/etc/dvb/sc_main.mc"
-+#endif
-+
-+static char *sp887x_firmware = DVB_SP887X_FIRMWARE_FILE;
-
- #if 0
- #define dprintk(x...) printk(x)
-@@ -39,7 +67,7 @@ struct dvb_frontend_info sp887x_info = {
- FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_RECOVER
- };
-
--
-+static int errno;
-
- static
- int i2c_writebytes (struct dvb_frontend *fe, u8 addr, u8 *buf, u8 len)
-@@ -112,6 +140,7 @@ u16 sp887x_readreg (struct dvb_frontend
- static
- void sp887x_microcontroller_stop (struct dvb_frontend *fe)
- {
-+ dprintk("%s\n", __FUNCTION__);
- sp887x_writereg(fe, 0xf08, 0x000);
- sp887x_writereg(fe, 0xf09, 0x000);
-
-@@ -123,6 +152,7 @@ void sp887x_microcontroller_stop (struct
- static
- void sp887x_microcontroller_start (struct dvb_frontend *fe)
- {
-+ dprintk("%s\n", __FUNCTION__);
- sp887x_writereg(fe, 0xf08, 0x000);
- sp887x_writereg(fe, 0xf09, 0x000);
-
-@@ -135,6 +165,7 @@ static
- void sp887x_setup_agc (struct dvb_frontend *fe)
- {
- /* setup AGC parameters */
-+ dprintk("%s\n", __FUNCTION__);
- sp887x_writereg(fe, 0x33c, 0x054);
- sp887x_writereg(fe, 0x33b, 0x04c);
- sp887x_writereg(fe, 0x328, 0x000);
-@@ -152,8 +183,6 @@ void sp887x_setup_agc (struct dvb_fronte
- }
-
-
--#include "sp887x_firm.h"
--
- #define BLOCKSIZE 30
-
- /**
-@@ -162,14 +191,63 @@ void sp887x_setup_agc (struct dvb_fronte
- static
- int sp887x_initial_setup (struct dvb_frontend *fe)
- {
-- u8 buf [BLOCKSIZE];
-+ u8 buf [BLOCKSIZE+2];
-+ unsigned char *firmware = NULL;
- int i;
-+ int fd;
-+ int filesize;
-+ int fw_size;
-+ mm_segment_t fs;
-+
-+ dprintk("%s\n", __FUNCTION__);
-
- /* soft reset */
- sp887x_writereg(fe, 0xf1a, 0x000);
-
- sp887x_microcontroller_stop (fe);
-
-+ fs = get_fs();
-+
-+ // Load the firmware
-+ set_fs(get_ds());
-+ fd = open(sp887x_firmware, 0, 0);
-+ if (fd < 0) {
-+ printk(KERN_WARNING "%s: Unable to open firmware %s\n", __FUNCTION__,
-+ sp887x_firmware);
-+ return -EIO;
-+ }
-+ filesize = lseek(fd, 0L, 2);
-+ if (filesize <= 0) {
-+ printk(KERN_WARNING "%s: Firmware %s is empty\n", __FUNCTION__,
-+ sp887x_firmware);
-+ sys_close(fd);
-+ return -EIO;
-+ }
-+
-+ fw_size = 0x4000;
-+
-+ // allocate buffer for it
-+ firmware = vmalloc(fw_size);
-+ if (firmware == NULL) {
-+ printk(KERN_WARNING "%s: Out of memory loading firmware\n",
-+ __FUNCTION__);
-+ sys_close(fd);
-+ return -EIO;
-+ }
-+
-+ // read it!
-+ // read the first 16384 bytes from the file
-+ // ignore the first 10 bytes
-+ lseek(fd, 10, 0);
-+ if (read(fd, firmware, fw_size) != fw_size) {
-+ printk(KERN_WARNING "%s: Failed to read firmware\n", __FUNCTION__);
-+ vfree(firmware);
-+ sys_close(fd);
-+ return -EIO;
-+ }
-+ sys_close(fd);
-+ set_fs(fs);
-+
- printk ("%s: firmware upload... ", __FUNCTION__);
-
- /* setup write pointer to -1 (end of memory) */
-@@ -179,12 +257,12 @@ int sp887x_initial_setup (struct dvb_fro
- /* dummy write (wrap around to start of memory) */
- sp887x_writereg(fe, 0x8f0a, 0x0000);
-
-- for (i=0; i<sizeof(sp887x_firm); i+=BLOCKSIZE) {
-+ for (i=0; i<fw_size; i+=BLOCKSIZE) {
- int c = BLOCKSIZE;
- int err;
-
-- if (i+c > sizeof(sp887x_firm))
-- c = sizeof(sp887x_firm) - i;
-+ if (i+c > fw_size)
-+ c = fw_size - i;
-
- /* bit 0x8000 in address is set to enable 13bit mode */
- /* bit 0x4000 enables multibyte read/write transfers */
-@@ -192,15 +270,18 @@ int sp887x_initial_setup (struct dvb_fro
- buf[0] = 0xcf;
- buf[1] = 0x0a;
-
-- memcpy(&buf[2], &sp887x_firm[i], c);
-+ memcpy(&buf[2], firmware + i, c);
-
- if ((err = i2c_writebytes (fe, 0x70, buf, c+2)) < 0) {
- printk ("failed.\n");
- printk ("%s: i2c error (err == %i)\n", __FUNCTION__, err);
-+ vfree(firmware);
- return err;
- }
- }
-
-+ vfree(firmware);
-+
- /* don't write RS bytes between packets */
- sp887x_writereg(fe, 0xc13, 0x001);
-
---- linux-2.6.0/drivers/media/dvb/frontends/stv0299.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/stv0299.c 2003-12-28 23:22:38.000000000 -0800
-@@ -9,16 +9,23 @@
- <holger@convergence.de>,
- <js@convergence.de>
-
-+
- Philips SU1278/SH
-
-- Copyright (C) 2002 by Peter Schildmann
-- <peter.schildmann@web.de>
-+ Copyright (C) 2002 by Peter Schildmann <peter.schildmann@web.de>
-+
-
- LG TDQF-S001F
-
- Copyright (C) 2002 Felix Domke <tmbinc@elitedvb.net>
- & Andreas Oberritter <andreas@oberritter.de>
-
-+
-+ Support for Samsung TBMU24112IMB used on Technisat SkyStar2 rev. 2.6B
-+
-+ Copyright (C) 2003 Vadim Catana <skystar@moldova.cc>:
-+
-+
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
-@@ -39,6 +46,7 @@
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/string.h>
-+#include <asm/div64.h>
-
- #include "dvb_frontend.h"
- #include "dvb_functions.h"
-@@ -49,6 +57,11 @@
- #define dprintk(x...)
- #endif
-
-+static int stv0299_status = 0;
-+
-+#define STATUS_BER 0
-+#define STATUS_UCBLOCKS 1
-+
-
- /* frontend types */
- #define UNKNOWN_FRONTEND -1
-@@ -56,6 +69,7 @@
- #define ALPS_BSRU6 1
- #define LG_TDQF_S001F 2
- #define PHILIPS_SU1278 3
-+#define SAMSUNG_TBMU24112IMB 4
-
- /* Master Clock = 88 MHz */
- #define M_CLK (88000000UL)
-@@ -142,6 +156,51 @@ static u8 init_tab [] = {
- };
-
-
-+static u8 init_tab_samsung [] = {
-+ 0x01, 0x15,
-+ 0x02, 0x00,
-+ 0x03, 0x00,
-+ 0x04, 0x7D,
-+ 0x05, 0x35,
-+ 0x06, 0x02,
-+ 0x07, 0x00,
-+ 0x08, 0xC3,
-+ 0x0C, 0x00,
-+ 0x0D, 0x81,
-+ 0x0E, 0x23,
-+ 0x0F, 0x12,
-+ 0x10, 0x7E,
-+ 0x11, 0x84,
-+ 0x12, 0xB9,
-+ 0x13, 0x88,
-+ 0x14, 0x89,
-+ 0x15, 0xC9,
-+ 0x16, 0x00,
-+ 0x17, 0x5C,
-+ 0x18, 0x00,
-+ 0x19, 0x00,
-+ 0x1A, 0x00,
-+ 0x1C, 0x00,
-+ 0x1D, 0x00,
-+ 0x1E, 0x00,
-+ 0x1F, 0x3A,
-+ 0x20, 0x2E,
-+ 0x21, 0x80,
-+ 0x22, 0xFF,
-+ 0x23, 0xC1,
-+ 0x28, 0x00,
-+ 0x29, 0x1E,
-+ 0x2A, 0x14,
-+ 0x2B, 0x0F,
-+ 0x2C, 0x09,
-+ 0x2D, 0x05,
-+ 0x31, 0x1F,
-+ 0x32, 0x19,
-+ 0x33, 0xFE,
-+ 0x34, 0x93
-+};
-+
-+
- static int stv0299_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
- {
- int ret;
-@@ -169,7 +228,8 @@ static u8 stv0299_readreg (struct dvb_i2
- ret = i2c->xfer (i2c, msg, 2);
-
- if (ret != 2)
-- dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
-+ dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n",
-+ __FUNCTION__, reg, ret);
-
- return b1[0];
- }
-@@ -193,18 +253,19 @@ static int stv0299_readregs (struct dvb_
- static int pll_write (struct dvb_i2c_bus *i2c, u8 addr, u8 *data, int len)
- {
- int ret;
-- u8 rpt1 [] = { 0x05, 0xb5 }; /* enable i2c repeater on stv0299 */
-- u8 rpt2 [] = { 0x05, 0x35 }; /* disable i2c repeater on stv0299 */
-- struct i2c_msg msg [] = {{ .addr = 0x68, .flags = 0, .buf = rpt1, .len = 2 },
-- { addr: addr, .flags = 0, .buf = data, .len = len },
-- { .addr = 0x68, .flags = 0, .buf = rpt2, .len = 2 }};
-+ struct i2c_msg msg = { addr: addr, .flags = 0, .buf = data, .len = len };
-
-- ret = i2c->xfer (i2c, msg, 3);
-
-- if (ret != 3)
-- printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
-+ stv0299_writereg(i2c, 0x05, 0xb5); /* enable i2c repeater on stv0299 */
-
-- return (ret != 3) ? ret : 0;
-+ ret = i2c->xfer (i2c, &msg, 1);
-+
-+ stv0299_writereg(i2c, 0x05, 0x35); /* disable i2c repeater on stv0299 */
-+
-+ if (ret != 1)
-+ dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
-+
-+ return (ret != 1) ? -1 : 0;
- }
-
-
-@@ -213,23 +274,16 @@ static int sl1935_set_tv_freq (struct dv
- u8 buf[4];
- u32 div;
-
-- u32 ratios[] = { 2000, 1000, 500, 250, 125 };
-- u8 ratio;
--
-- for (ratio = 4; ratio > 0; ratio--)
-- if ((freq / ratios[ratio]) <= 0x3fff)
-- break;
-+ div = freq / 125;
-
-- div = freq / ratios[ratio];
-+ dprintk("%s : freq = %i, div = %i\n", __FUNCTION__, freq, div);
-
-- buf[0] = (freq >> 8) & 0x7f;
-- buf[1] = freq & 0xff;
-- buf[2] = 0x80 | ratio;
-+ buf[0] = (div >> 8) & 0x7f;
-+ buf[1] = div & 0xff;
-+ buf[2] = 0x84; // 0xC4
-+ buf[3] = 0x08;
-
-- if (freq < 1531000)
-- buf[3] = 0x10;
-- else
-- buf[3] = 0x00;
-+ if (freq < 1500000) buf[3] |= 0x10;
-
- return pll_write (i2c, 0x61, buf, sizeof(buf));
- }
-@@ -238,21 +292,47 @@ static int sl1935_set_tv_freq (struct dv
- * set up the downconverter frequency divisor for a
- * reference clock comparision frequency of 125 kHz.
- */
--static int tsa5059_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, int ftype)
-+static int tsa5059_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, int ftype, int srate)
- {
-- u8 addr = (ftype == PHILIPS_SU1278SH) ? 0x60 : 0x61;
-- u32 div = freq / 125;
-- u8 buf[4] = { (div >> 8) & 0x7f, div & 0xff, 0x84 };
-+ u8 addr;
-+ u32 div;
-+ u8 buf[4];
-
- dprintk ("%s: freq %i, ftype %i\n", __FUNCTION__, freq, ftype);
-
-- if (ftype == PHILIPS_SU1278SH)
-- /* activate f_xtal/f_comp signal output */
-- /* charge pump current C0/C1 = 00 */
-- buf[3] = 0x20;
-- else
-- buf[3] = freq > 1530000 ? 0xc0 : 0xc4;
-+ if ((freq < 950000) || (freq > 2150000)) return -EINVAL;
-+
-+ // setup frequency divisor
-+ div = freq / 1000;
-+ buf[0] = (div >> 8) & 0x7f;
-+ buf[1] = div & 0xff;
-+ buf[2] = 0x81 | ((div & 0x18000) >> 10);
-+ buf[3] = 0;
-+
-+ // tuner-specific settings
-+ switch(ftype) {
-+ case PHILIPS_SU1278SH:
-+ addr = 0x60;
-+ buf[3] |= 0x20;
-+
-+ if (srate < 4000000) buf[3] |= 1;
-+
-+ if (freq <= 1250000) buf[3] |= 0;
-+ else if (freq <= 1550000) buf[3] |= 0x40;
-+ else if (freq <= 2050000) buf[3] |= 0x80;
-+ else if (freq <= 2150000) buf[3] |= 0xC0;
-+ break;
-+
-+ case ALPS_BSRU6:
-+ addr = 0x61;
-+ buf[3] |= 0xC0;
-+ break;
-+
-+ default:
-+ return -EINVAL;
-+ }
-
-+ // charge pump
- return pll_write (i2c, addr, buf, sizeof(buf));
- }
-
-@@ -385,12 +465,14 @@ static int tua6100_set_tv_freq (struct d
-
- static int pll_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, int ftype, int srate)
- {
-- if (ftype == LG_TDQF_S001F)
-+ if (ftype == SAMSUNG_TBMU24112IMB)
-+ return sl1935_set_tv_freq(i2c, freq, ftype);
-+ else if (ftype == LG_TDQF_S001F)
- return sl1935_set_tv_freq(i2c, freq, ftype);
- else if (ftype == PHILIPS_SU1278)
- return tua6100_set_tv_freq(i2c, freq, ftype, srate);
- else
-- return tsa5059_set_tv_freq(i2c, freq, ftype);
-+ return tsa5059_set_tv_freq(i2c, freq, ftype, srate);
- }
-
- #if 0
-@@ -421,6 +503,19 @@ static int stv0299_init (struct dvb_i2c_
-
- dprintk("stv0299: init chip\n");
-
-+ switch(ftype) {
-+ case SAMSUNG_TBMU24112IMB:
-+ dprintk("%s: init stv0299 chip for Samsung TBMU24112IMB\n", __FUNCTION__);
-+
-+ for (i=0; i<sizeof(init_tab_samsung); i+=2)
-+ {
-+ dprintk("%s: reg == 0x%02x, val == 0x%02x\n", __FUNCTION__, init_tab_samsung[i], init_tab_samsung[i+1]);
-+
-+ stv0299_writereg (i2c, init_tab_samsung[i], init_tab_samsung[i+1]);
-+ }
-+ break;
-+
-+ default:
- stv0299_writereg (i2c, 0x01, 0x15);
- stv0299_writereg (i2c, 0x02, ftype == PHILIPS_SU1278 ? 0x00 : 0x30);
- stv0299_writereg (i2c, 0x03, 0x00);
-@@ -430,11 +525,23 @@ static int stv0299_init (struct dvb_i2c_
-
- /* AGC1 reference register setup */
- if (ftype == PHILIPS_SU1278SH)
-- stv0299_writereg (i2c, 0x0f, 0xd2); /* Iagc = Inverse, m1 = 18 */
-+ stv0299_writereg (i2c, 0x0f, 0x92); /* Iagc = Inverse, m1 = 18 */
- else if (ftype == PHILIPS_SU1278)
-- stv0299_writereg (i2c, 0x0f, 0x94); /* Iagc = Inverse, m1 = 18 */
-+ stv0299_writereg (i2c, 0x0f, 0x94); /* Iagc = Inverse, m1 = 20 */
- else
- stv0299_writereg (i2c, 0x0f, 0x52); /* Iagc = Normal, m1 = 18 */
-+ break;
-+ }
-+
-+ switch(stv0299_status) {
-+ case STATUS_BER:
-+ stv0299_writereg(i2c, 0x34, 0x93);
-+ break;
-+
-+ case STATUS_UCBLOCKS:
-+ stv0299_writereg(i2c, 0x34, 0xB3);
-+ break;
-+ }
-
- return 0;
- }
-@@ -448,6 +555,7 @@ static int stv0299_check_inversion (stru
- dvb_delay(30);
- if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
- u8 val = stv0299_readreg (i2c, 0x0c);
-+ dprintk ("%s : changing inversion\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x0c, val ^ 0x01);
- }
- }
-@@ -462,21 +570,42 @@ static int stv0299_set_FEC (struct dvb_i
-
- switch (fec) {
- case FEC_AUTO:
-+ {
-+ dprintk ("%s : FEC_AUTO\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x31, 0x1f);
-+ }
- case FEC_1_2:
-+ {
-+ dprintk ("%s : FEC_1_2\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x31, 0x01);
-+ }
- case FEC_2_3:
-+ {
-+ dprintk ("%s : FEC_2_3\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x31, 0x02);
-+ }
- case FEC_3_4:
-+ {
-+ dprintk ("%s : FEC_3_4\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x31, 0x04);
-+ }
- case FEC_5_6:
-+ {
-+ dprintk ("%s : FEC_5_6\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x31, 0x08);
-+ }
- case FEC_7_8:
-+ {
-+ dprintk ("%s : FEC_7_8\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x31, 0x10);
-+ }
- default:
-+ {
-+ dprintk ("%s : FEC invalid\n", __FUNCTION__);
- return -EINVAL;
- }
- }
-+}
-
-
- static fe_code_rate_t stv0299_get_fec (struct dvb_i2c_bus *i2c)
-@@ -606,11 +735,20 @@ static int stv0299_set_tone (struct dvb_
-
- switch (tone) {
- case SEC_TONE_ON:
-+ {
-+ dprintk("%s: TONE_ON\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x08, val | 0x3);
-+ }
- case SEC_TONE_OFF:
-+ {
-+ dprintk("%s: TONE_OFF\n", __FUNCTION__);
- return stv0299_writereg (i2c, 0x08, (val & ~0x3) | 0x02);
-+ }
- default:
-+ {
-+ dprintk("%s: TONE INVALID\n", __FUNCTION__);
- return -EINVAL;
-+ }
- };
- }
-
-@@ -651,39 +789,60 @@ static int stv0299_set_voltage (struct d
- }
-
-
--static int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
-+static int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate, int tuner_type)
- {
-+ u64 big = srate;
- u32 ratio;
-- u32 tmp;
-- u8 aclk = 0xb4, bclk = 0x51;
-+ u8 aclk = 0;
-+ u8 bclk = 0;
-+ u8 m1;
-+
-+ if ((srate < 1000000) || (srate > 45000000)) return -EINVAL;
-+ switch(tuner_type) {
-+ case PHILIPS_SU1278SH:
-+ aclk = 0xb5;
-+ if (srate < 2000000) bclk = 0x86;
-+ else if (srate < 5000000) bclk = 0x89;
-+ else if (srate < 15000000) bclk = 0x8f;
-+ else if (srate < 45000000) bclk = 0x95;
-
-- if (srate > M_CLK)
-- srate = M_CLK;
-- if (srate < 500000)
-- srate = 500000;
--
-- if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
-- if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
-- if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
-- if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
-- if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
-+ m1 = 0x14;
-+ if (srate < 4000000) m1 = 0x10;
-+ break;
-
--#define FIN (M_CLK >> 4)
-+ case ALPS_BSRU6:
-+ default:
-+ if (srate <= 1500000) { aclk = 0xb7; bclk = 0x87; }
-+ else if (srate <= 3000000) { aclk = 0xb7; bclk = 0x8b; }
-+ else if (srate <= 7000000) { aclk = 0xb7; bclk = 0x8f; }
-+ else if (srate <= 14000000) { aclk = 0xb7; bclk = 0x93; }
-+ else if (srate <= 30000000) { aclk = 0xb6; bclk = 0x93; }
-+ else if (srate <= 45000000) { aclk = 0xb4; bclk = 0x91; }
-
-- tmp = srate << 4;
-- ratio = tmp / FIN;
-+ m1 = 0x12;
-+ break;
-+ }
-
-- tmp = (tmp % FIN) << 8;
-- ratio = (ratio << 8) + tmp / FIN;
-+ dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff), (int) (big & 0xffffffff) );
-
-- tmp = (tmp % FIN) << 8;
-- ratio = (ratio << 8) + tmp / FIN;
-+ big = big << 20;
-+
-+ dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff), (int) (big & 0xffffffff) );
-+
-+ do_div(big, M_CLK);
-+
-+ dprintk("%s : big = 0x%08x%08x\n", __FUNCTION__, (int) ((big>>32) & 0xffffffff), (int) (big & 0xffffffff) );
-+
-+ ratio = big << 4;
-+
-+ dprintk("%s : ratio = %i\n", __FUNCTION__, ratio);
-
- stv0299_writereg (i2c, 0x13, aclk);
- stv0299_writereg (i2c, 0x14, bclk);
- stv0299_writereg (i2c, 0x1f, (ratio >> 16) & 0xff);
- stv0299_writereg (i2c, 0x20, (ratio >> 8) & 0xff);
- stv0299_writereg (i2c, 0x21, (ratio ) & 0xf0);
-+ stv0299_writereg (i2c, 0x0f, (stv0299_readreg(i2c, 0x0f) & 0xc0) | m1);
-
- return 0;
- }
-@@ -710,6 +869,9 @@ static int stv0299_get_symbolrate (struc
- offset = (s32) rtf * (srate / 4096L);
- offset /= 128;
-
-+ dprintk ("%s : srate = %i\n", __FUNCTION__, srate);
-+ dprintk ("%s : ofset = %i\n", __FUNCTION__, offset);
-+
- srate += offset;
-
- srate += 1000;
-@@ -725,6 +887,8 @@ static int uni0299_ioctl (struct dvb_fro
- int tuner_type = (long) fe->data;
- struct dvb_i2c_bus *i2c = fe->i2c;
-
-+ dprintk ("%s\n", __FUNCTION__);
-+
- switch (cmd) {
- case FE_GET_INFO:
- memcpy (arg, &uni0299_info, sizeof(struct dvb_frontend_info));
-@@ -736,7 +900,7 @@ static int uni0299_ioctl (struct dvb_fro
- u8 signal = 0xff - stv0299_readreg (i2c, 0x18);
- u8 sync = stv0299_readreg (i2c, 0x1b);
-
-- dprintk ("VSTATUS: 0x%02x\n", sync);
-+ dprintk ("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __FUNCTION__, sync);
-
- *status = 0;
-
-@@ -759,8 +923,12 @@ static int uni0299_ioctl (struct dvb_fro
- }
-
- case FE_READ_BER:
-+ if (stv0299_status == STATUS_BER) {
- *((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
- | stv0299_readreg (i2c, 0x1e);
-+ } else {
-+ *((u32*) arg) = 0;
-+ }
- break;
-
- case FE_READ_SIGNAL_STRENGTH:
-@@ -768,7 +936,7 @@ static int uni0299_ioctl (struct dvb_fro
- s32 signal = 0xffff - ((stv0299_readreg (i2c, 0x18) << 8)
- | stv0299_readreg (i2c, 0x19));
-
-- dprintk ("AGC2I: 0x%02x%02x, signal=0x%04x\n",
-+ dprintk ("%s : FE_READ_SIGNAL_STRENGTH : AGC2I: 0x%02x%02x, signal=0x%04x\n", __FUNCTION__,
- stv0299_readreg (i2c, 0x18),
- stv0299_readreg (i2c, 0x19), (int) signal);
-
-@@ -787,18 +955,25 @@ static int uni0299_ioctl (struct dvb_fro
- break;
- }
- case FE_READ_UNCORRECTED_BLOCKS:
-- *((u32*) arg) = 0; /* the stv0299 can't measure BER and */
-- return -EOPNOTSUPP; /* errors at the same time.... */
-+ if (stv0299_status == STATUS_UCBLOCKS) {
-+ *((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
-+ | stv0299_readreg (i2c, 0x1e);
-+ } else {
-+ *((u32*) arg) = 0;
-+ }
-+ break;
-
- case FE_SET_FRONTEND:
- {
- struct dvb_frontend_parameters *p = arg;
-
-+ dprintk ("%s : FE_SET_FRONTEND\n", __FUNCTION__);
-+
- pll_set_tv_freq (i2c, p->frequency, tuner_type,
- p->u.qpsk.symbol_rate);
-
- stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
-- stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
-+ stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, tuner_type);
- stv0299_writereg (i2c, 0x22, 0x00);
- stv0299_writereg (i2c, 0x23, 0x00);
- stv0299_readreg (i2c, 0x23);
-@@ -859,6 +1034,8 @@ static int uni0299_ioctl (struct dvb_fro
-
- static long probe_tuner (struct dvb_i2c_bus *i2c)
- {
-+ struct dvb_adapter * adapter = (struct dvb_adapter *) i2c->adapter;
-+
- /* read the status register of TSA5059 */
- u8 rpt[] = { 0x05, 0xb5 };
- u8 stat [] = { 0 };
-@@ -875,6 +1052,17 @@ static long probe_tuner (struct dvb_i2c_
- stv0299_writereg (i2c, 0x02, 0x30);
- stv0299_writereg (i2c, 0x03, 0x00);
-
-+
-+ printk ("%s: try to attach to %s\n", __FUNCTION__, adapter->name);
-+
-+ if ( strcmp(adapter->name, "Technisat SkyStar2 driver") == 0 )
-+ {
-+ printk ("%s: setup for tuner Samsung TBMU24112IMB\n", __FILE__);
-+
-+ return SAMSUNG_TBMU24112IMB;
-+ }
-+
-+
- if ((ret = i2c->xfer(i2c, msg1, 2)) == 2) {
- printk ("%s: setup for tuner SU1278/SH\n", __FILE__);
- return PHILIPS_SU1278SH;
-@@ -961,3 +1149,5 @@ MODULE_DESCRIPTION("Universal STV0299/TS
- MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, Andreas Oberritter");
- MODULE_LICENSE("GPL");
-
-+MODULE_PARM(stv0299_status, "i");
-+MODULE_PARM_DESC(stv0299_status, "Which status value to support (0: BER, 1: UCBLOCKS)");
---- linux-2.6.0/drivers/media/dvb/frontends/tda1004x.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/tda1004x.c 2003-12-28 23:22:38.000000000 -0800
-@@ -108,7 +108,7 @@ static struct dvb_frontend_info tda10045
- .frequency_min = 51000000,
- .frequency_max = 858000000,
- .frequency_stepsize = 166667,
-- .caps = FE_CAN_INVERSION_AUTO |
-+ .caps =
- FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
- FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
- FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
---- linux-2.6.0/drivers/media/dvb/frontends/ves1820.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/frontends/ves1820.c 2003-12-28 23:22:38.000000000 -0800
-@@ -19,6 +19,8 @@
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-+#include <linux/config.h>
-+#include <linux/delay.h>
- #include <linux/errno.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
-@@ -70,7 +72,18 @@ static int verbose;
- #define GET_TUNER(data) ((u8) (((long) data >> 16) & 0xff))
- #define GET_DEMOD_ADDR(data) ((u8) (((long) data >> 24) & 0xff))
-
-+#if defined(CONFIG_DBOX2)
-+#define XIN 69600000UL
-+#define DISABLE_INVERSION(reg0) do { reg0 &= ~0x20; } while (0)
-+#define ENABLE_INVERSION(reg0) do { reg0 |= 0x20; } while (0)
-+#define HAS_INVERSION(reg0) (reg0 & 0x20)
-+#else /* PCI cards */
- #define XIN 57840000UL
-+#define DISABLE_INVERSION(reg0) do { reg0 |= 0x20; } while (0)
-+#define ENABLE_INVERSION(reg0) do { reg0 &= ~0x20; } while (0)
-+#define HAS_INVERSION(reg0) (!(reg0 & 0x20))
-+#endif
-+
- #define FIN (XIN >> 4)
-
-
-@@ -209,9 +222,9 @@ static int ves1820_setup_reg0 (struct dv
- reg0 |= GET_REG0(fe->data) & 0x62;
-
- if (INVERSION_ON == inversion)
-- reg0 &= ~0x20;
-+ ENABLE_INVERSION(reg0);
- else if (INVERSION_OFF == inversion)
-- reg0 |= 0x20;
-+ DISABLE_INVERSION(reg0);
-
- ves1820_writereg (fe, 0x00, reg0 & 0xfe);
- ves1820_writereg (fe, 0x00, reg0 | 0x01);
-@@ -220,7 +233,7 @@ static int ves1820_setup_reg0 (struct dv
- * check lock and toggle inversion bit if required...
- */
- if (INVERSION_AUTO == inversion && !(ves1820_readreg (fe, 0x11) & 0x08)) {
-- dvb_delay(10);
-+ mdelay(30);
- if (!(ves1820_readreg (fe, 0x11) & 0x08)) {
- reg0 ^= 0x20;
- ves1820_writereg (fe, 0x00, reg0 & 0xfe);
-@@ -242,6 +255,10 @@ static int ves1820_init (struct dvb_fron
-
- ves1820_writereg (fe, 0, 0);
-
-+#if defined(CONFIG_DBOX2)
-+ ves1820_inittab[2] &= ~0x08;
-+#endif
-+
- for (i=0; i<53; i++)
- ves1820_writereg (fe, i, ves1820_inittab[i]);
-
-@@ -330,6 +347,10 @@ static int ves1820_set_parameters (struc
-
- ves1820_setup_reg0 (fe, reg0x00[real_qam], p->inversion);
-
-+ /* yes, this speeds things up: userspace reports lock in about 8 ms
-+ instead of 500 to 1200 ms after calling FE_SET_FRONTEND. */
-+ mdelay(30);
-+
- return 0;
- }
-
-@@ -419,14 +440,14 @@ static int ves1820_ioctl (struct dvb_fro
- fe->i2c->adapter->num, afc,
- -((s32)(p->u.qam.symbol_rate >> 3) * afc >> 7));
-
-- p->inversion = reg0 & 0x20 ? INVERSION_OFF : INVERSION_ON;
-+ p->inversion = HAS_INVERSION(reg0) ? INVERSION_ON : INVERSION_OFF;
- p->u.qam.modulation = ((reg0 >> 2) & 7) + QAM_16;
-
- p->u.qam.fec_inner = FEC_NONE;
-
- p->frequency = ((p->frequency + 31250) / 62500) * 62500;
-- // To prevent overflow, shift symbol rate first a
-- // couple of bits.
-+ /* To prevent overflow, shift symbol rate first a
-+ couple of bits. */
- p->frequency -= (s32)(p->u.qam.symbol_rate >> 3) * afc >> 7;
- break;
- }
-@@ -462,8 +483,6 @@ static long probe_tuner (struct dvb_i2c_
- printk ("DVB: VES1820(%d): setup for tuner sp5659c\n", i2c->adapter->num);
- } else {
- type = -1;
-- printk ("DVB: VES1820(%d): unknown PLL, "
-- "please report to <linuxdvb@linuxtv.org>!!\n", i2c->adapter->num);
- }
-
- return type;
-@@ -477,13 +496,11 @@ static u8 read_pwm (struct dvb_i2c_bus *
- struct i2c_msg msg [] = { { .addr = 0x50, .flags = 0, .buf = &b, .len = 1 },
- { .addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1 } };
-
-- i2c->xfer (i2c, msg, 2);
-+ if ((i2c->xfer(i2c, msg, 2) != 2) || (pwm == 0xff))
-+ pwm = 0x48;
-
- printk("DVB: VES1820(%d): pwm=0x%02x\n", i2c->adapter->num, pwm);
-
-- if (pwm == 0xff)
-- pwm = 0x48;
--
- return pwm;
- }
-
-@@ -516,8 +533,7 @@ static int ves1820_attach (struct dvb_i2
- if ((demod_addr = probe_demod_addr(i2c)) < 0)
- return -ENODEV;
-
-- if ((tuner_type = probe_tuner(i2c)) < 0)
-- return -ENODEV;
-+ tuner_type = probe_tuner(i2c);
-
- if ((i2c->adapter->num < MAX_UNITS) && pwm[i2c->adapter->num] != -1) {
- printk("DVB: VES1820(%d): pwm=0x%02x (user specified)\n",
---- linux-2.6.0/drivers/media/dvb/Kconfig 2003-10-08 15:07:08.000000000 -0700
-+++ 25/drivers/media/dvb/Kconfig 2003-12-28 23:22:37.000000000 -0800
-@@ -45,5 +45,9 @@ comment "Supported FlexCopII (B2C2) Adap
- depends on DVB_CORE && PCI
- source "drivers/media/dvb/b2c2/Kconfig"
-
-+comment "Supported BT878 Adapters"
-+ depends on DVB_CORE && PCI
-+source "drivers/media/dvb/bt8xx/Kconfig"
-+
- endmenu
-
---- linux-2.6.0/drivers/media/dvb/Makefile 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/media/dvb/Makefile 2003-12-28 23:22:37.000000000 -0800
-@@ -2,5 +2,5 @@
- # Makefile for the kernel multimedia device drivers.
- #
-
--obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/
-+obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/
-
---- linux-2.6.0/drivers/media/dvb/ttpci/av7110.c 2003-10-25 14:45:44.000000000 -0700
-+++ 25/drivers/media/dvb/ttpci/av7110.c 2003-12-28 23:22:39.000000000 -0800
-@@ -35,7 +35,6 @@
-
- #define __KERNEL_SYSCALLS__
- #include <linux/module.h>
--#include <linux/init.h>
- #include <linux/kmod.h>
- #include <linux/delay.h>
- #include <linux/fs.h>
-@@ -43,7 +42,6 @@
- #include <linux/poll.h>
- #include <linux/unistd.h>
- #include <linux/byteorder/swabb.h>
--#include <linux/slab.h>
- #include <linux/smp_lock.h>
- #include <stdarg.h>
-
-@@ -55,15 +53,15 @@
- #include <linux/ptrace.h>
- #include <linux/ioport.h>
- #include <linux/in.h>
--#include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/pci.h>
--#include <linux/init.h>
- #include <linux/vmalloc.h>
- #include <linux/netdevice.h>
- #include <linux/inetdevice.h>
- #include <linux/etherdevice.h>
- #include <linux/skbuff.h>
-+#include <linux/firmware.h>
-+#include <linux/crc32.h>
-
- #include <asm/system.h>
- #include <asm/bitops.h>
-@@ -108,6 +106,7 @@ static int vidmode=CVBS_RGB_OUT;
- static int pids_off;
- static int adac=DVB_ADAC_TI;
- static int hw_sections = 1;
-+static int rgb_on = 0;
-
- int av7110_num = 0;
-
-@@ -118,42 +117,12 @@ int av7110_num = 0;
- * DEBI functions
- ****************************************************************************/
-
-+#define wait_for_debi_done(x) \
-+ saa7146_wait_for_debi_done(x->dev) \
-+
- /* This DEBI code is based on the Stradis driver
- by Nathan Laredo <laredo@gnu.org> */
-
--static int wait_for_debi_done(struct av7110 *av7110)
--{
-- struct saa7146_dev *dev = av7110->dev;
-- int start;
--
-- /* wait for registers to be programmed */
-- start = jiffies;
-- while (1) {
-- if (saa7146_read(dev, MC2) & 2)
-- break;
-- if (jiffies-start > HZ/20) {
-- printk ("%s: timed out while waiting for registers "
-- "getting programmed\n", __FUNCTION__);
-- return -ETIMEDOUT;
-- }
-- }
--
-- /* wait for transfer to complete */
-- start = jiffies;
-- while (1) {
-- if (!(saa7146_read(dev, PSR) & SPCI_DEBI_S))
-- break;
-- saa7146_read(dev, MC2);
-- if (jiffies-start > HZ/4) {
-- printk ("%s: timed out while waiting for transfer "
-- "completion\n", __FUNCTION__);
-- return -ETIMEDOUT;
-- }
-- }
--
-- return 0;
--}
--
- static int debiwrite(struct av7110 *av7110, u32 config,
- int addr, u32 val, int count)
- {
-@@ -375,7 +344,7 @@ static int record_cb(struct dvb_filter_p
- {
- struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) p2t->priv;
-
-- DEB_EE(("struct dvb_filter_pes2ts:%p\n",p2t));
-+// DEB_EE(("struct dvb_filter_pes2ts:%p\n",p2t));
-
- if (!(dvbdmxfeed->ts_type & TS_PACKET))
- return 0;
-@@ -385,14 +354,14 @@ static int record_cb(struct dvb_filter_p
- return dvbdmxfeed->cb.ts(buf, len, 0, 0,
- &dvbdmxfeed->feed.ts, DMX_OK);
- else
-- return dvb_filter_pes2ts(p2t, buf, len);
-+ return dvb_filter_pes2ts(p2t, buf, len, 1);
- }
-
- static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data)
- {
- struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) priv;
-
-- DEB_EE(("dvb_demux_feed:%p\n",dvbdmxfeed));
-+// DEB_EE(("dvb_demux_feed:%p\n",dvbdmxfeed));
-
- dvbdmxfeed->cb.ts(data, 188, 0, 0,
- &dvbdmxfeed->feed.ts,
-@@ -886,10 +855,10 @@ static void gpioirq (unsigned long data)
- txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
- len=(av7110->debilen+3)&(~3);
-
-- DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
-+// DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
- print_time("gpio");
-
-- DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));
-+// DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));
- switch (av7110->debitype&0xff) {
-
- case DATA_TS_PLAY:
-@@ -2002,8 +1971,6 @@ static u8 bootcode[] = {
- 0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00,
- };
-
--#include "av7110_firm.h"
--
- static int bootarm(struct av7110 *av7110)
- {
- struct saa7146_dev *dev= av7110->dev;
-@@ -2056,7 +2023,7 @@ static int bootarm(struct av7110 *av7110
-
- DEB_D(("bootarm: load dram code\n"));
-
-- if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0)
-+ if (load_dram(av7110, (u32 *)av7110->bin_root, av7110->size_root)<0)
- return -1;
-
- saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
-@@ -2064,7 +2031,7 @@ static int bootarm(struct av7110 *av7110
-
- DEB_D(("bootarm: load dpram code\n"));
-
-- mwdebi(av7110, DEBISWAB, DPRAM_BASE, Dpram, sizeof(Dpram));
-+ mwdebi(av7110, DEBISWAB, DPRAM_BASE, av7110->bin_dpram, av7110->size_dpram);
-
- wait_for_debi_done(av7110);
-
-@@ -2706,9 +2673,9 @@ static int tuner_set_tv_freq (struct saa
- buf[1] = div & 0xff;
- buf[2] = 0x8e;
-
-- if (freq < (u32) (16*168.25) )
-+ if (freq < (u32) 16*168.25 )
- config = 0xa0;
-- else if (freq < (u32) (16*447.25))
-+ else if (freq < (u32) 16*447.25)
- config = 0x90;
- else
- config = 0x30;
-@@ -4294,8 +4261,10 @@ static void av7110_before_after_tune (fe
- av7110->pids[DMX_PES_TELETEXT], 0,
- av7110->pids[DMX_PES_PCR]);
- outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-- } else
-+ } else {
- SetPIDs(av7110, 0, 0, 0, 0, 0);
-+ outcom(av7110, COMTYPE_PIDFILTER, FlushTSQueue, 0);
-+ }
-
- up(&av7110->pid_mutex);
- }
-@@ -4531,29 +4500,98 @@ static struct saa7146_ext_vv av7110_vv_d
-
- static int av7110_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext)
- {
-+ const struct firmware *fw;
- struct av7110 *av7110 = NULL;
- int ret = 0;
--
-+ u32 crc = 0, len = 0;
-+ unsigned char *ptr;
-+
-+ DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
-+
-+ /* request the av7110 firmware, this will block until someone uploads it */
-+ ret = request_firmware(&fw, "dvb-ttpci-01.fw", &dev->pci->dev);
-+ if ( 0 != ret ) {
-+ printk("dvb-ttpci: cannot request firmware!\n");
-+ return -EINVAL;
-+ }
-+
-+ if (fw->size <= 200000) {
-+ printk("dvb-ttpci: this firmware is way too small.\n");
-+ return -EINVAL;
-+ }
-+
-+ /* prepare the av7110 device struct */
- if (!(av7110 = kmalloc (sizeof (struct av7110), GFP_KERNEL))) {
- printk ("%s: out of memory!\n", __FUNCTION__);
- return -ENOMEM;
- }
--
- memset(av7110, 0, sizeof(struct av7110));
-+
-+ /* check if the firmware is available */
-+ av7110->bin_fw = (unsigned char*)vmalloc(fw->size);
-+ if (NULL == av7110->bin_fw) {
-+ DEB_D(("out of memory\n"));
-+ kfree(av7110);
-+ return -ENOMEM;
-+ }
-+ memcpy(av7110->bin_fw, fw->data, fw->size);
-+ av7110->size_fw = fw->size;
-
-+ /* check for firmware magic */
-+ ptr = av7110->bin_fw;
-+ if (ptr[0] != 'A' || ptr[1] != 'V' ||
-+ ptr[2] != 'F' || ptr[3] != 'W') {
-+ printk("dvb-ttpci: this is not an av7110 firmware\n");
-+ goto fw_error;
-+ }
-+ ptr += 4;
-+
-+ /* check dpram file */
-+ crc = ntohl(*(u32*)ptr);
-+ ptr += 4;
-+ len = ntohl(*(u32*)ptr);
-+ ptr += 4;
-+ if (len >= 512) {
-+ printk("dvb-ttpci: dpram file is way to big.\n");
-+ goto fw_error;
-+ }
-+ if( crc != crc32_le(0,ptr,len)) {
-+ printk("dvb-ttpci: crc32 of dpram file does not match.\n");
-+ goto fw_error;
-+ }
-+ av7110->bin_dpram = ptr;
-+ av7110->size_dpram = len;
-+ ptr += len;
-+
-+ /* check root file */
-+ crc = ntohl(*(u32*)ptr);
-+ ptr += 4;
-+ len = ntohl(*(u32*)ptr);
-+ ptr += 4;
-+
-+ if (len <= 200000 || len >= 300000 || len > ((av7110->bin_fw+av7110->size_fw)-ptr) ) {
-+ printk("dvb-ttpci: root file has strange size (%d). aborting.\n",len);
-+ goto fw_error;
-+ }
-+ if( crc != crc32_le(0,ptr,len)) {
-+ printk("dvb-ttpci: crc32 of dpram file does not match.\n");
-+ goto fw_error;
-+ }
-+ av7110->bin_root = ptr;
-+ av7110->size_root = len;
-+
-+ /* go on with regular device initialization */
- av7110->card_name = (char*)pci_ext->ext_priv;
-+ av7110->dev=(struct saa7146_dev *)dev;
- (struct av7110*)dev->ext_priv = av7110;
-
-- DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
--
-- av7110->dev=(struct saa7146_dev *)dev;
- dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name);
-
- /* the Siemens DVB needs this if you want to have the i2c chips
- get recognized before the main driver is fully loaded */
- saa7146_write(dev, GPIO_CTRL, 0x500000);
-
-- saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_3200);
-+ saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */
-
- av7110->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
- av7110->dvb_adapter, 0);
-@@ -4571,7 +4609,7 @@ static int av7110_attach (struct saa7146
-
- /* set dd1 stream a & b */
- saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-- saa7146_write(dev, DD1_INIT, 0x02000000);
-+ saa7146_write(dev, DD1_INIT, 0x03000000);
- saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-
- /* upload all */
-@@ -4729,7 +4767,7 @@ static int av7110_attach (struct saa7146
- memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
- /* set dd1 stream a & b */
- saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-- saa7146_write(dev, DD1_INIT, 0x02000700);
-+ saa7146_write(dev, DD1_INIT, 0x03000700);
- saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
- }
- else if (dev->pci->subsystem_vendor == 0x110a) {
-@@ -4747,7 +4785,8 @@ static int av7110_attach (struct saa7146
- // switch DVB SCART on
- outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
- outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
-- //saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
-+ if (rgb_on)
-+ saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
- //saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
- }
-
-@@ -4786,6 +4825,7 @@ static int av7110_attach (struct saa7146
- }
-
- printk(KERN_INFO "av7110: found av7110-%d.\n",av7110_num);
-+ av7110->device_initialized = 1;
- av7110_num++;
- return 0;
-
-@@ -4809,12 +4849,20 @@ err:
- dvb_unregister_adapter (av7110->dvb_adapter);
-
- return ret;
-+fw_error:
-+ vfree(av7110->bin_fw);
-+ kfree(av7110);
-+ return -EINVAL;
- }
-
- static int av7110_detach (struct saa7146_dev* saa)
- {
- struct av7110 *av7110 = (struct av7110*)saa->ext_priv;
- DEB_EE(("av7110: %p\n",av7110));
-+
-+ if( 0 == av7110->device_initialized ) {
-+ return 0;
-+ }
-
- saa7146_unregister_device(&av7110->v4l_dev, saa);
- if (2 == av7110->has_analog_tuner) {
-@@ -4845,11 +4893,13 @@ static int av7110_detach (struct saa7146
- dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, av7110->i2c_bus->id);
- dvb_unregister_adapter (av7110->dvb_adapter);
-
-+ av7110_num--;
-+ if (NULL != av7110->bin_fw ) {
-+ vfree(av7110->bin_fw);
-+ }
- kfree (av7110);
--
- saa->ext_priv = NULL;
-- av7110_num--;
--
-+
- return 0;
- }
-
-@@ -4858,7 +4908,7 @@ static void av7110_irq(struct saa7146_de
- {
- struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
-
-- DEB_INT(("dev: %p, av7110: %p\n",dev,av7110));
-+// DEB_INT(("dev: %p, av7110: %p\n",dev,av7110));
-
- if (*isr & MASK_19)
- tasklet_schedule (&av7110->debi_tasklet);
-@@ -4887,7 +4937,7 @@ static struct saa7146_standard standard[
- static struct saa7146_standard analog_standard[] = {
- {
- .name = "PAL", .id = V4L2_STD_PAL_BG,
-- .v_offset = 0x18, .v_field = 288, .v_calc = 576,
-+ .v_offset = 0x18 /* 0 */ , .v_field = 288, .v_calc = 576,
- .h_offset = 0x08, .h_pixels = 708, .h_calc = 709,
- .v_max_out = 576, .h_max_out = 768,
- }, {
-@@ -4975,7 +5025,7 @@ static struct saa7146_ext_vv av7110_vv_d
- .inputs = 1,
- .audios = 1,
- .capabilities = 0,
-- .flags = SAA7146_EXT_SWAP_ODD_EVEN,
-+ .flags = 0,
-
- .stds = &standard[0],
- .num_stds = sizeof(standard)/sizeof(struct saa7146_standard),
-@@ -5002,6 +5052,7 @@ static struct saa7146_ext_vv av7110_vv_d
-
- static struct saa7146_extension av7110_extension = {
- .name = "dvb\0",
-+ .flags = SAA7146_I2C_SHORT_DELAY,
-
- .module = THIS_MODULE,
- .pci_tbl = &pci_tbl[0],
-@@ -5054,4 +5105,6 @@ MODULE_PARM(adac,"i");
- MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
- MODULE_PARM(hw_sections, "i");
- MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
--
-+MODULE_PARM(rgb_on, "i");
-+MODULE_PARM_DESC(rgb_on, "For Siemens DVB-C cards only: Enable RGB control"
-+ " signal on SCART pin 16 to switch SCART video mode from CVBS to RGB");
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/ttpci/av7110.c.orig 2003-12-28 23:22:39.000000000 -0800
-@@ -0,0 +1,5030 @@
-+/*
-+ * av7110.c: driver for the SAA7146 based AV110 cards (like the Fujitsu-Siemens DVB)
-+ *
-+ * Copyright (C) 1999-2002 Ralph Metzler
-+ * & Marcus Metzler for convergence integrated media GmbH
-+ *
-+ * originally based on code by:
-+ * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
-+ *
-+ *
-+ * the project's page is at http://www.linuxtv.org/dvb/
-+ */
-+
-+#define NEW_CI 1
-+
-+/* for debugging ARM communication: */
-+//#define COM_DEBUG
-+
-+#define __KERNEL_SYSCALLS__
-+#include <linux/module.h>
-+#include <linux/kmod.h>
-+#include <linux/delay.h>
-+#include <linux/fs.h>
-+#include <linux/timer.h>
-+#include <linux/poll.h>
-+#include <linux/unistd.h>
-+#include <linux/byteorder/swabb.h>
-+#include <linux/smp_lock.h>
-+#include <stdarg.h>
-+
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
-+#include <linux/fcntl.h>
-+#include <linux/interrupt.h>
-+#include <linux/ptrace.h>
-+#include <linux/ioport.h>
-+#include <linux/in.h>
-+#include <linux/string.h>
-+#include <linux/pci.h>
-+#include <linux/vmalloc.h>
-+#include <linux/netdevice.h>
-+#include <linux/inetdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+
-+#include <asm/system.h>
-+#include <asm/bitops.h>
-+#include <asm/io.h>
-+#include <asm/dma.h>
-+#include <asm/semaphore.h>
-+
-+#include <linux/dvb/frontend.h>
-+
-+#include "dvb_i2c.h"
-+#include "dvb_frontend.h"
-+#include "dvb_functions.h"
-+
-+
-+#if 1
-+ #define DEBUG_VARIABLE av7110_debug
-+#else
-+ #define DEB_S(x)
-+ #define DEB_D(x)
-+ #define DEB_EE(x)
-+#endif
-+
-+#include "ttpci-eeprom.h"
-+#include "av7110.h"
-+#include "av7110_ipack.h"
-+
-+static int AV_StartPlay(struct av7110 *av7110, int av);
-+static void restart_feeds(struct av7110 *av7110);
-+static int bootarm(struct av7110 *av7110);
-+static inline int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val);
-+static inline u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg);
-+static int outcom(struct av7110 *av7110, int type, int com, int num, ...);
-+static void SetMode(struct av7110 *av7110, int mode);
-+static void dvb_video_add_event (struct av7110 *av7110, struct video_event *event);
-+
-+void pes_to_ts(u8 const *buf, long int length, u16 pid, struct av7110_p2t *p);
-+void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, struct dvb_demux_feed *feed);
-+
-+static int av7110_debug = 0;
-+
-+static int vidmode=CVBS_RGB_OUT;
-+static int pids_off;
-+static int adac=DVB_ADAC_TI;
-+static int hw_sections = 1;
-+static int rgb_on = 0;
-+
-+int av7110_num = 0;
-+
-+#define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000)
-+#define FW_VERSION(arm_app) ((arm_app) & 0x0000FFFF)
-+
-+/****************************************************************************
-+ * DEBI functions
-+ ****************************************************************************/
-+
-+#define wait_for_debi_done(x) \
-+ saa7146_wait_for_debi_done(x->dev) \
-+
-+/* This DEBI code is based on the Stradis driver
-+ by Nathan Laredo <laredo@gnu.org> */
-+
-+static int debiwrite(struct av7110 *av7110, u32 config,
-+ int addr, u32 val, int count)
-+{
-+ struct saa7146_dev *dev = av7110->dev;
-+ u32 cmd;
-+
-+ if (count <= 0 || count > 32764)
-+ return -1;
-+ if (wait_for_debi_done(av7110) < 0)
-+ return -1;
-+ saa7146_write(dev, DEBI_CONFIG, config);
-+ if (count <= 4) /* immediate transfer */
-+ saa7146_write(dev, DEBI_AD, val );
-+ else /* block transfer */
-+ saa7146_write(dev, DEBI_AD, av7110->debi_bus);
-+ saa7146_write(dev, DEBI_COMMAND, (cmd = (count << 17) | (addr & 0xffff)));
-+ saa7146_write(dev, MC2, (2 << 16) | 2);
-+ return 0;
-+}
-+
-+static u32 debiread(struct av7110 *av7110, u32 config, int addr, int count)
-+{
-+ struct saa7146_dev *dev = av7110->dev;
-+ u32 result = 0;
-+
-+ if (count > 32764 || count <= 0)
-+ return 0;
-+ if (wait_for_debi_done(av7110) < 0)
-+ return 0;
-+ saa7146_write(dev, DEBI_AD, av7110->debi_bus);
-+ saa7146_write(dev, DEBI_COMMAND, (count << 17) | 0x10000 | (addr & 0xffff));
-+
-+ saa7146_write(dev, DEBI_CONFIG, config);
-+ saa7146_write(dev, MC2, (2 << 16) | 2);
-+ if (count > 4)
-+ return count;
-+ wait_for_debi_done(av7110);
-+ result = saa7146_read(dev, DEBI_AD);
-+ result &= (0xffffffffUL >> ((4-count)*8));
-+ return result;
-+}
-+
-+
-+/* DEBI during interrupt */
-+/* single word writes */
-+static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
-+{
-+ debiwrite(av7110, config, addr, val, count);
-+}
-+
-+/* buffer writes */
-+static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, char *val, int count)
-+{
-+ memcpy(av7110->debi_virt, val, count);
-+ debiwrite(av7110, config, addr, 0, count);
-+}
-+
-+
-+static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
-+{
-+ u32 res;
-+
-+ res=debiread(av7110, config, addr, count);
-+ if (count<=4)
-+ memcpy(av7110->debi_virt, (char *) &res, count);
-+ return res;
-+}
-+
-+/* DEBI outside interrupts, only for count<=4! */
-+
-+static inline void wdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&av7110->debilock, flags);
-+ debiwrite(av7110, config, addr, val, count);
-+ spin_unlock_irqrestore(&av7110->debilock, flags);
-+}
-+
-+static inline u32 rdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count)
-+{
-+ unsigned long flags;
-+ u32 res;
-+
-+ spin_lock_irqsave(&av7110->debilock, flags);
-+ res=debiread(av7110, config, addr, count);
-+ spin_unlock_irqrestore(&av7110->debilock, flags);
-+ return res;
-+}
-+
-+
-+static inline char chtrans(char c)
-+{
-+ if (c<32 || c>126)
-+ c=0x20;
-+ return c;
-+}
-+
-+
-+/* handle mailbox registers of the dual ported RAM */
-+
-+static inline void ARM_ResetMailBox(struct av7110 *av7110)
-+{
-+ unsigned long flags;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ spin_lock_irqsave(&av7110->debilock, flags);
-+ debiread(av7110, DEBINOSWAP, IRQ_RX, 2);
-+ //printk("dvb: IRQ_RX=%d\n", debiread(av7110, DEBINOSWAP, IRQ_RX, 2));
-+ debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
-+ spin_unlock_irqrestore(&av7110->debilock, flags);
-+}
-+
-+static inline void ARM_ClearMailBox(struct av7110 *av7110)
-+{
-+ iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
-+}
-+
-+static inline void ARM_ClearIrq(struct av7110 *av7110)
-+{
-+ irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
-+}
-+
-+static void reset_arm(struct av7110 *av7110)
-+{
-+ saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTLO);
-+
-+ /* Disable DEBI and GPIO irq */
-+ IER_DISABLE(av7110->dev, (MASK_19 | MASK_03));
-+// saa7146_write(av7110->dev, IER,
-+// saa7146_read(av7110->dev, IER) & ~(MASK_19 | MASK_03));
-+ saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
-+
-+ mdelay(800);
-+ saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTHI);
-+ mdelay(800);
-+
-+ ARM_ResetMailBox(av7110);
-+
-+ saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
-+
-+ IER_ENABLE(av7110->dev, MASK_03);
-+// saa7146_write(av7110->dev, IER,
-+// saa7146_read(av7110->dev, IER) | MASK_03 );
-+
-+ av7110->arm_ready=1;
-+ printk("av7110: ARM RESET\n");
-+}
-+
-+static void recover_arm(struct av7110 *av7110)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (current->files)
-+ bootarm(av7110);
-+ else {
-+ printk("OOPS, no current->files\n");
-+ reset_arm(av7110);
-+ }
-+
-+ dvb_delay(100);
-+ restart_feeds(av7110);
-+ outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, av7110->ir_config);
-+}
-+
-+static void arm_error(struct av7110 *av7110)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ av7110->arm_errors++;
-+ av7110->arm_ready=0;
-+ recover_arm(av7110);
-+}
-+
-+static int arm_thread(void *data)
-+{
-+ struct av7110 *av7110 = data;
-+ u16 newloops = 0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ dvb_kernel_thread_setup ("arm_mon");
-+ av7110->arm_thread = current;
-+
-+ while (!av7110->arm_rmmod && !signal_pending(current)) {
-+ interruptible_sleep_on_timeout(&av7110->arm_wait, 5*HZ);
-+
-+ if (!av7110->arm_ready)
-+ continue;
-+
-+ if (down_interruptible(&av7110->dcomlock))
-+ break;
-+
-+ newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2);
-+ up(&av7110->dcomlock);
-+
-+ if (newloops==av7110->arm_loops) {
-+ printk(KERN_ERR "av7110%d: ARM crashed!\n",
-+ av7110->dvb_adapter->num);
-+
-+ arm_error(av7110);
-+
-+ if (down_interruptible(&av7110->dcomlock))
-+ break;
-+
-+ newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1;
-+ up(&av7110->dcomlock);
-+ }
-+ av7110->arm_loops=newloops;
-+ }
-+
-+ av7110->arm_thread = NULL;
-+ return 0;
-+}
-+
-+
-+static int record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len)
-+{
-+ struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) p2t->priv;
-+
-+// DEB_EE(("struct dvb_filter_pes2ts:%p\n",p2t));
-+
-+ if (!(dvbdmxfeed->ts_type & TS_PACKET))
-+ return 0;
-+ if (buf[3]==0xe0) // video PES do not have a length in TS
-+ buf[4]=buf[5]=0;
-+ if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)
-+ return dvbdmxfeed->cb.ts(buf, len, 0, 0,
-+ &dvbdmxfeed->feed.ts, DMX_OK);
-+ else
-+ return dvb_filter_pes2ts(p2t, buf, len, 1);
-+}
-+
-+static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data)
-+{
-+ struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) priv;
-+
-+// DEB_EE(("dvb_demux_feed:%p\n",dvbdmxfeed));
-+
-+ dvbdmxfeed->cb.ts(data, 188, 0, 0,
-+ &dvbdmxfeed->feed.ts,
-+ DMX_OK);
-+ return 0;
-+}
-+
-+static int AV_StartRecord(struct av7110 *av7110, int av,
-+ struct dvb_demux_feed *dvbdmxfeed)
-+{
-+ struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-+
-+ DEB_EE(("av7110: %p, dvb_demux_feed:%p\n",av7110,dvbdmxfeed));
-+
-+ if (av7110->playing||(av7110->rec_mode&av))
-+ return -EBUSY;
-+ outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-+ dvbdmx->recording=1;
-+ av7110->rec_mode|=av;
-+
-+ switch (av7110->rec_mode) {
-+ case RP_AUDIO:
-+ dvb_filter_pes2ts_init (&av7110->p2t[0],
-+ dvbdmx->pesfilter[0]->pid,
-+ dvb_filter_pes2ts_cb,
-+ (void *)dvbdmx->pesfilter[0]);
-+ outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
-+ break;
-+
-+ case RP_VIDEO:
-+ dvb_filter_pes2ts_init (&av7110->p2t[1],
-+ dvbdmx->pesfilter[1]->pid,
-+ dvb_filter_pes2ts_cb,
-+ (void *)dvbdmx->pesfilter[1]);
-+ outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
-+ break;
-+
-+ case RP_AV:
-+ dvb_filter_pes2ts_init (&av7110->p2t[0],
-+ dvbdmx->pesfilter[0]->pid,
-+ dvb_filter_pes2ts_cb,
-+ (void *)dvbdmx->pesfilter[0]);
-+ dvb_filter_pes2ts_init (&av7110->p2t[1],
-+ dvbdmx->pesfilter[1]->pid,
-+ dvb_filter_pes2ts_cb,
-+ (void *)dvbdmx->pesfilter[1]);
-+ outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0);
-+ break;
-+ }
-+ return 0;
-+}
-+
-+static int AV_StartPlay(struct av7110 *av7110, int av)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (av7110->rec_mode)
-+ return -EBUSY;
-+ if (av7110->playing&av)
-+ return -EBUSY;
-+
-+ outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-+
-+ if (av7110->playing == RP_NONE) {
-+ av7110_ipack_reset(&av7110->ipack[0]);
-+ av7110_ipack_reset(&av7110->ipack[1]);
-+ }
-+
-+ av7110->playing|=av;
-+ switch (av7110->playing) {
-+ case RP_AUDIO:
-+ outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
-+ break;
-+ case RP_VIDEO:
-+ outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
-+ av7110->sinfo=0;
-+ break;
-+ case RP_AV:
-+ av7110->sinfo=0;
-+ outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0);
-+ break;
-+ }
-+ return av7110->playing;
-+}
-+
-+static void AV_Stop(struct av7110 *av7110, int av)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!(av7110->playing&av) && !(av7110->rec_mode&av))
-+ return;
-+
-+ outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-+ if (av7110->playing) {
-+ av7110->playing&=~av;
-+ switch (av7110->playing) {
-+ case RP_AUDIO:
-+ outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
-+ break;
-+ case RP_VIDEO:
-+ outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
-+ break;
-+ case RP_NONE:
-+ SetMode(av7110, av7110->vidmode);
-+ break;
-+ }
-+ } else {
-+ av7110->rec_mode&=~av;
-+ switch (av7110->rec_mode) {
-+ case RP_AUDIO:
-+ outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
-+ break;
-+ case RP_VIDEO:
-+ outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
-+ break;
-+ case RP_NONE:
-+ break;
-+ }
-+ }
-+}
-+
-+/**
-+ * Hack! we save the last av7110 ptr. This should be ok, since
-+ * you rarely will use more then one IR control.
-+ *
-+ * If we want to support multiple controls we would have to do much more...
-+ */
-+void av7110_setup_irc_config (struct av7110 *av7110, u32 ir_config)
-+{
-+ static struct av7110 *last;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!av7110)
-+ av7110 = last;
-+ else
-+ last = av7110;
-+
-+ if (av7110) {
-+ outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config);
-+ av7110->ir_config = ir_config;
-+ }
-+}
-+
-+static void (*irc_handler)(u32);
-+
-+void av7110_register_irc_handler(void (*func)(u32))
-+{
-+ //DEB_EE(("registering %08x\n",func));
-+ irc_handler = func;
-+}
-+
-+void av7110_unregister_irc_handler(void (*func)(u32))
-+{
-+ //DEB_EE(("unregistering %08x\n",func));
-+ irc_handler = NULL;
-+}
-+
-+void run_handlers(unsigned long ircom)
-+{
-+ if (irc_handler != NULL)
-+ (*irc_handler)((u32) ircom);
-+}
-+
-+DECLARE_TASKLET(irtask,run_handlers,0);
-+
-+void IR_handle(struct av7110 *av7110, u32 ircom)
-+{
-+ DEB_S(("av7110: ircommand = %08x\n", ircom));
-+ irtask.data = (unsigned long) ircom;
-+ tasklet_schedule(&irtask);
-+}
-+
-+/****************************************************************************
-+ * IRQ handling
-+ ****************************************************************************/
-+
-+void CI_handle(struct av7110 *av7110, u8 *data, u16 len)
-+{
-+ //CI_out(av7110, data, len);
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (len<3)
-+ return;
-+ switch (data[0]) {
-+ case CI_MSG_CI_INFO:
-+ if (data[2]!=1 && data[2]!=2)
-+ break;
-+ switch (data[1]) {
-+ case 0:
-+ av7110->ci_slot[data[2]-1].flags=0;
-+ break;
-+ case 1:
-+ av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_PRESENT;
-+ break;
-+ case 2:
-+ av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_READY;
-+ break;
-+ }
-+ break;
-+ case CI_SWITCH_PRG_REPLY:
-+ //av7110->ci_stat=data[1];
-+ break;
-+ default:
-+ break;
-+ }
-+
-+}
-+
-+static inline int DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len,
-+ u8 * buffer2, size_t buffer2_len,
-+ struct dvb_demux_filter *dvbdmxfilter,
-+ enum dmx_success success,
-+ struct av7110 *av7110)
-+{
-+ DEB_INT(("av7110: %p\n",av7110));
-+
-+ if (!dvbdmxfilter->feed->demux->dmx.frontend)
-+ return 0;
-+ if (dvbdmxfilter->feed->demux->dmx.frontend->source==DMX_MEMORY_FE)
-+ return 0;
-+
-+ switch(dvbdmxfilter->type) {
-+ case DMX_TYPE_SEC:
-+ if ((((buffer1[1]<<8)|buffer1[2])&0xfff)+3!=buffer1_len)
-+ return 0;
-+ if (dvbdmxfilter->doneq) {
-+ struct dmx_section_filter *filter=&dvbdmxfilter->filter;
-+ int i;
-+ u8 xor, neq=0;
-+
-+ for (i=0; i<DVB_DEMUX_MASK_MAX; i++) {
-+ xor=filter->filter_value[i]^buffer1[i];
-+ neq|=dvbdmxfilter->maskandnotmode[i]&xor;
-+ }
-+ if (!neq)
-+ return 0;
-+ }
-+ return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len,
-+ buffer2, buffer2_len,
-+ &dvbdmxfilter->filter,
-+ DMX_OK);
-+ case DMX_TYPE_TS:
-+ if (!(dvbdmxfilter->feed->ts_type & TS_PACKET))
-+ return 0;
-+ if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY)
-+ return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len,
-+ buffer2, buffer2_len,
-+ &dvbdmxfilter->feed->feed.ts,
-+ DMX_OK);
-+ else
-+ pes_to_ts(buffer1, buffer1_len,
-+ dvbdmxfilter->feed->pid,
-+ &av7110->p2t_filter[dvbdmxfilter->index]);
-+ default:
-+ return 0;
-+ }
-+}
-+
-+
-+u8 pshead[0x26] = {
-+ 0x00, 0x00, 0x01, 0xba, 0x5f, 0xff, 0xfe, 0xe6,
-+ 0xc4, 0x01, 0x01, 0x89, 0xc3, 0xf8, 0x00, 0x00,
-+ 0x01, 0xbb, 0x00, 0x12, 0x80, 0xc4, 0xe1, 0x00,
-+ 0xe1, 0xff, 0xb9, 0xe0, 0xe8, 0xb8, 0xc0, 0x20,
-+ 0xbd, 0xe0, 0x44, 0xbf, 0xe0, 0x02,
-+};
-+
-+
-+//#define DEBUG_TIMING
-+static inline void print_time(char *s)
-+{
-+#ifdef DEBUG_TIMING
-+ struct timeval tv;
-+ do_gettimeofday(&tv);
-+ printk("%s: %d.%d\n", s, (int)tv.tv_sec, (int)tv.tv_usec);
-+#endif
-+}
-+
-+static void ci_get_data(struct dvb_ringbuffer *cibuf, u8 *data, int len)
-+{
-+ if (dvb_ringbuffer_free(cibuf) < len+2)
-+ return;
-+
-+ DVB_RINGBUFFER_WRITE_BYTE(cibuf,len>>8);
-+ DVB_RINGBUFFER_WRITE_BYTE(cibuf,len&0xff);
-+
-+ dvb_ringbuffer_write(cibuf,data,len,0);
-+
-+ wake_up_interruptible(&cibuf->queue);
-+}
-+
-+static void debiirq (unsigned long data)
-+{
-+ struct av7110 *av7110 = (struct av7110*) data;
-+ int type=av7110->debitype;
-+ int handle=(type>>8)&0x1f;
-+
-+// DEB_EE(("av7110: %p\n",av7110));
-+
-+ print_time("debi");
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) & ~MASK_19 );
-+ saa7146_write(av7110->dev, ISR, MASK_19 );
-+
-+ if (type==-1) {
-+ printk("DEBI irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",jiffies,saa7146_read(av7110->dev,PSR),saa7146_read(av7110->dev,SSR));
-+ spin_lock(&av7110->debilock);
-+ ARM_ClearMailBox(av7110);
-+ ARM_ClearIrq(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+ }
-+ av7110->debitype=-1;
-+
-+ switch (type&0xff) {
-+
-+ case DATA_TS_RECORD:
-+ dvb_dmx_swfilter_packets(&av7110->demux,
-+ (const u8 *)av7110->debi_virt,
-+ av7110->debilen/188);
-+ spin_lock(&av7110->debilock);
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_PES_RECORD:
-+ if (av7110->demux.recording)
-+ record_cb(&av7110->p2t[handle],
-+ (u8 *)av7110->debi_virt,
-+ av7110->debilen);
-+ spin_lock(&av7110->debilock);
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_IPMPE:
-+ case DATA_FSECTION:
-+ case DATA_PIPING:
-+ if (av7110->handle2filter[handle])
-+ DvbDmxFilterCallback((u8 *)av7110->debi_virt,
-+ av7110->debilen, 0, 0,
-+ av7110->handle2filter[handle],
-+ DMX_OK, av7110);
-+ spin_lock(&av7110->debilock);
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_CI_GET:
-+ {
-+ u8 *data=av7110->debi_virt;
-+
-+ if ((data[0]<2) && data[2]==0xff) {
-+ int flags=0;
-+ if (data[5]>0)
-+ flags|=CA_CI_MODULE_PRESENT;
-+ if (data[5]>5)
-+ flags|=CA_CI_MODULE_READY;
-+ av7110->ci_slot[data[0]].flags=flags;
-+ } else
-+ ci_get_data(&av7110->ci_rbuffer,
-+ av7110->debi_virt,
-+ av7110->debilen);
-+ spin_lock(&av7110->debilock);
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+ }
-+
-+ case DATA_COMMON_INTERFACE:
-+ CI_handle(av7110, (u8 *)av7110->debi_virt, av7110->debilen);
-+#if 0
-+ {
-+ int i;
-+
-+ printk("av7110%d: ", av7110->num);
-+ printk("%02x ", *(u8 *)av7110->debi_virt);
-+ printk("%02x ", *(1+(u8 *)av7110->debi_virt));
-+ for (i=2; i<av7110->debilen; i++)
-+ printk("%02x ", (*(i+(unsigned char *)av7110->debi_virt)));
-+ for (i=2; i<av7110->debilen; i++)
-+ printk("%c", chtrans(*(i+(unsigned char *)av7110->debi_virt)));
-+
-+ printk("\n");
-+ }
-+#endif
-+ spin_lock(&av7110->debilock);
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_DEBUG_MESSAGE:
-+ ((s8*)av7110->debi_virt)[Reserved_SIZE-1]=0;
-+ printk("%s\n", (s8 *)av7110->debi_virt);
-+ spin_lock(&av7110->debilock);
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_CI_PUT:
-+ case DATA_MPEG_PLAY:
-+ case DATA_BMP_LOAD:
-+ spin_lock(&av7110->debilock);
-+ iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+ default:
-+ break;
-+ }
-+ spin_lock(&av7110->debilock);
-+ ARM_ClearMailBox(av7110);
-+ spin_unlock(&av7110->debilock);
-+}
-+
-+static int pes_play(void *dest, struct dvb_ringbuffer *buf, int dlen)
-+{
-+ int len;
-+ u32 sync;
-+ u16 blen;
-+
-+ DEB_EE(("dvb_ring_buffer_t: %p\n",buf));
-+
-+ if (!dlen) {
-+ wake_up(&buf->queue);
-+ return -1;
-+ }
-+ while (1) {
-+ if ((len=dvb_ringbuffer_avail(buf)) < 6)
-+ return -1;
-+ sync= DVB_RINGBUFFER_PEEK(buf,0)<<24;
-+ sync|=DVB_RINGBUFFER_PEEK(buf,1)<<16;
-+ sync|=DVB_RINGBUFFER_PEEK(buf,2)<<8;
-+ sync|=DVB_RINGBUFFER_PEEK(buf,3);
-+
-+ if (((sync&~0x0f)==0x000001e0) ||
-+ ((sync&~0x1f)==0x000001c0) ||
-+ (sync==0x000001bd))
-+ break;
-+ printk("resync\n");
-+ DVB_RINGBUFFER_SKIP(buf,1);
-+ }
-+ blen= DVB_RINGBUFFER_PEEK(buf,4)<<8;
-+ blen|=DVB_RINGBUFFER_PEEK(buf,5);
-+ blen+=6;
-+ if (len<blen || blen>dlen) {
-+ //printk("buffer empty - avail %d blen %u dlen %d\n",len,blen,dlen);
-+ wake_up(&buf->queue);
-+ return -1;
-+ }
-+
-+ (void)dvb_ringbuffer_read(buf,dest,(size_t)blen,0);
-+
-+ DEB_S(("pread=0x%08lx, pwrite=0x%08lx\n",(unsigned long)buf->pread, (unsigned long)buf->pwrite));
-+ wake_up(&buf->queue);
-+ return blen;
-+}
-+
-+
-+static void gpioirq (unsigned long data)
-+{
-+ struct av7110 *av7110 = (struct av7110*) data;
-+ u32 rxbuf, txbuf;
-+ int len;
-+
-+ //printk("GPIO0 irq\n");
-+
-+ if (av7110->debitype !=-1)
-+ printk("GPIO0 irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",jiffies,saa7146_read(av7110->dev,PSR),saa7146_read(av7110->dev,SSR));
-+
-+ spin_lock(&av7110->debilock);
-+
-+ ARM_ClearIrq(av7110);
-+
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) & ~MASK_19 );
-+ saa7146_write(av7110->dev, ISR, MASK_19 );
-+
-+ av7110->debitype = irdebi(av7110, DEBINOSWAP, IRQ_STATE, 0, 2);
-+ av7110->debilen = irdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-+ av7110->debibuf = 0;
-+ rxbuf=irdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-+ len=(av7110->debilen+3)&(~3);
-+
-+// DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
-+ print_time("gpio");
-+
-+// DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));
-+ switch (av7110->debitype&0xff) {
-+
-+ case DATA_TS_PLAY:
-+ case DATA_PES_PLAY:
-+ break;
-+
-+ case DATA_MPEG_VIDEO_EVENT:
-+ {
-+ u32 h_ar;
-+ struct video_event event;
-+
-+ av7110->video_size.w = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_WIDTH, 0, 2);
-+ h_ar = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_HEIGHT_AR, 0, 2);
-+
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+
-+ av7110->video_size.h = h_ar & 0xfff;
-+ DEB_D(("GPIO0 irq: DATA_MPEG_VIDEO_EVENT: w/h/ar = %u/%u/%u\n",
-+ av7110->video_size.w,
-+ av7110->video_size.h,
-+ av7110->video_size.aspect_ratio));
-+
-+ event.type = VIDEO_EVENT_SIZE_CHANGED;
-+ event.u.size.w = av7110->video_size.w;
-+ event.u.size.h = av7110->video_size.h;
-+ switch ((h_ar >> 12) & 0xf)
-+ {
-+ case 3:
-+ av7110->video_size.aspect_ratio = VIDEO_FORMAT_16_9;
-+ event.u.size.aspect_ratio = VIDEO_FORMAT_16_9;
-+ av7110->videostate.video_format = VIDEO_FORMAT_16_9;
-+ break;
-+ case 4:
-+ av7110->video_size.aspect_ratio = VIDEO_FORMAT_221_1;
-+ event.u.size.aspect_ratio = VIDEO_FORMAT_221_1;
-+ av7110->videostate.video_format = VIDEO_FORMAT_221_1;
-+ break;
-+ default:
-+ av7110->video_size.aspect_ratio = VIDEO_FORMAT_4_3;
-+ event.u.size.aspect_ratio = VIDEO_FORMAT_4_3;
-+ av7110->videostate.video_format = VIDEO_FORMAT_4_3;
-+ }
-+ dvb_video_add_event(av7110, &event);
-+ break;
-+ }
-+
-+ case DATA_CI_PUT:
-+ {
-+ int avail;
-+ struct dvb_ringbuffer *cibuf=&av7110->ci_wbuffer;
-+
-+ avail=dvb_ringbuffer_avail(cibuf);
-+ if (avail<=2) {
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-+ break;
-+ }
-+ len= DVB_RINGBUFFER_PEEK(cibuf,0)<<8;
-+ len|=DVB_RINGBUFFER_PEEK(cibuf,1);
-+ if (avail<len+2) {
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-+ break;
-+ }
-+ DVB_RINGBUFFER_SKIP(cibuf,2);
-+
-+ dvb_ringbuffer_read(cibuf,av7110->debi_virt,len,0);
-+
-+ wake_up(&cibuf->queue);
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
-+ wait_for_debi_done(av7110);
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) | MASK_19 );
-+ if (len<5) len=5; /* we want a real DEBI DMA */
-+ iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+ }
-+
-+ case DATA_MPEG_PLAY:
-+ if (!av7110->playing) {
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-+ break;
-+ }
-+ len=0;
-+ if (av7110->debitype&0x100) {
-+ spin_lock(&av7110->aout.lock);
-+ len=pes_play(av7110->debi_virt, &av7110->aout, 2048);
-+ spin_unlock(&av7110->aout.lock);
-+ }
-+ if (len<=0 && (av7110->debitype&0x200)
-+ &&av7110->videostate.play_state!=VIDEO_FREEZED) {
-+ spin_lock(&av7110->avout.lock);
-+ len=pes_play(av7110->debi_virt, &av7110->avout, 2048);
-+ spin_unlock(&av7110->avout.lock);
-+ }
-+ if (len<=0) {
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-+ break;
-+ }
-+ DEB_D(("GPIO0 PES_PLAY len=%04x\n", len));
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
-+ wait_for_debi_done(av7110);
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) | MASK_19 );
-+
-+ iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_BMP_LOAD:
-+ len=av7110->debilen;
-+ if (!len) {
-+ av7110->bmp_state=BMP_LOADED;
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-+ wake_up(&av7110->bmpq);
-+ break;
-+ }
-+ if (len>av7110->bmplen)
-+ len=av7110->bmplen;
-+ if (len>2*1024)
-+ len=2*1024;
-+ iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
-+ iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
-+ memcpy(av7110->debi_virt, av7110->bmpbuf+av7110->bmpp, len);
-+ av7110->bmpp+=len;
-+ av7110->bmplen-=len;
-+ wait_for_debi_done(av7110);
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) | MASK_19 );
-+ if (len<5) len=5; /* we want a real DEBI DMA */
-+ iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_CI_GET:
-+ case DATA_COMMON_INTERFACE:
-+ case DATA_FSECTION:
-+ case DATA_IPMPE:
-+ case DATA_PIPING:
-+ if (!len || len>4*1024) {
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ break;
-+ } /* yes, fall through */
-+ case DATA_TS_RECORD:
-+ case DATA_PES_RECORD:
-+ wait_for_debi_done(av7110);
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) | MASK_19);
-+ irdebi(av7110, DEBISWAB, DPRAM_BASE+rxbuf, 0, len);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_DEBUG_MESSAGE:
-+ wait_for_debi_done(av7110);
-+ if (!len || len>0xff) {
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ break;
-+ }
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) | MASK_19);
-+ irdebi(av7110, DEBISWAB, Reserved, 0, len);
-+ spin_unlock(&av7110->debilock);
-+ return;
-+
-+ case DATA_IRCOMMAND:
-+ IR_handle(av7110,
-+ swahw32(irdebi(av7110, DEBINOSWAP, Reserved, 0, 4)));
-+ iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-+ break;
-+
-+ default:
-+ printk("gpioirq unknown type=%d len=%d\n",
-+ av7110->debitype, av7110->debilen);
-+ break;
-+ }
-+ ARM_ClearMailBox(av7110);
-+ av7110->debitype=-1;
-+ spin_unlock(&av7110->debilock);
-+}
-+
-+
-+/****************************************************************************
-+ * DEBI command polling
-+ ****************************************************************************/
-+
-+
-+static int OutCommand(struct av7110 *av7110, u16* buf, int length)
-+{
-+ int i;
-+ u32 start;
-+#ifdef COM_DEBUG
-+ u32 stat;
-+#endif
-+
-+// DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!av7110->arm_ready) {
-+ DEB_D(("arm not ready.\n"));
-+ return -1;
-+ }
-+
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) )
-+ {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_FREE) {
-+ printk(KERN_ERR "%s: timeout waiting for COMMAND idle\n", __FUNCTION__);
-+ return -1;
-+ }
-+ }
-+
-+#ifndef _NOHANDSHAKE
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) )
-+ {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_SHAKE) {
-+ printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
-+ return -1;
-+ }
-+ }
-+#endif
-+
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2) & OSDQFull )
-+ {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_OSD) {
-+ printk(KERN_ERR "%s: timeout waiting for !OSDQFull\n", __FUNCTION__);
-+ return -1;
-+ }
-+ }
-+ for (i=2; i<length; i++)
-+ wdebi(av7110, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2);
-+
-+ if (length)
-+ wdebi(av7110, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2);
-+ else
-+ wdebi(av7110, DEBINOSWAP, COMMAND + 2, 0, 2);
-+
-+ wdebi(av7110, DEBINOSWAP, COMMAND, (u32) buf[0], 2);
-+
-+#ifdef COM_DEBUG
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) )
-+ {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_FREE) {
-+ printk(KERN_ERR "%s: timeout waiting for COMMAND to complete\n", __FUNCTION__);
-+ return -1;
-+ }
-+ }
-+
-+ stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
-+ if (stat & GPMQOver) {
-+ printk(KERN_ERR "%s: GPMQOver\n", __FUNCTION__);
-+ return -1;
-+ }
-+ else if (stat & OSDQOver) {
-+ printk(KERN_ERR "%s: OSDQOver\n", __FUNCTION__);
-+ return -1;
-+ }
-+#endif
-+
-+ return 0;
-+}
-+
-+static inline int SOutCommand(struct av7110 *av7110, u16* buf, int length)
-+{
-+ int ret;
-+
-+// DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!av7110->arm_ready) {
-+ DEB_D(("arm not ready.\n"));
-+ return -1;
-+ }
-+
-+ if (down_interruptible(&av7110->dcomlock))
-+ return -ERESTARTSYS;
-+
-+ ret=OutCommand(av7110, buf, length);
-+ up(&av7110->dcomlock);
-+ if (ret)
-+ printk("SOutCommand error\n");
-+ return ret;
-+}
-+
-+
-+static int outcom(struct av7110 *av7110, int type, int com, int num, ...)
-+{
-+ va_list args;
-+ u16 buf[num+2];
-+ int i, ret;
-+
-+// DEB_EE(("av7110: %p\n",av7110));
-+
-+ buf[0]=(( type << 8 ) | com);
-+ buf[1]=num;
-+
-+ if (num) {
-+ va_start(args, num);
-+ for (i=0; i<num; i++)
-+ buf[i+2]=va_arg(args, u32);
-+ va_end(args);
-+ }
-+
-+ ret = SOutCommand(av7110, buf, num+2);
-+ if (ret)
-+ printk("outcom error\n");
-+ return ret;
-+}
-+
-+int SendCICommand(struct av7110 *av7110, u8 subcom, u8 *Params, u8 ParamLen)
-+{
-+ int i, ret;
-+ u16 CommandBuffer[18] = { ((COMTYPE_COMMON_IF << 8) + subcom),
-+ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ for(i=0; (i<ParamLen)&&(i<32); i++)
-+ {
-+ if(i%2 == 0)
-+ CommandBuffer[(i/2)+2] = (u16)(Params[i]) << 8;
-+ else
-+ CommandBuffer[(i/2)+2] |= Params[i];
-+ }
-+
-+ ret = SOutCommand(av7110, CommandBuffer, 18);
-+ if (ret)
-+ printk("SendCICommand error\n");
-+ return ret;
-+}
-+
-+
-+static int CommandRequest(struct av7110 *av7110, u16 *Buff, int length, u16 *buf, int n)
-+{
-+ int err;
-+ s16 i;
-+ u32 start;
-+#ifdef COM_DEBUG
-+ u32 stat;
-+#endif
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!av7110->arm_ready) {
-+ DEB_D(("arm not ready.\n"));
-+ return -1;
-+ }
-+
-+ if (down_interruptible(&av7110->dcomlock))
-+ return -ERESTARTSYS;
-+
-+ if ((err = OutCommand(av7110, Buff, length)) < 0) {
-+ up(&av7110->dcomlock);
-+ printk("CommandRequest error\n");
-+ return err;
-+ }
-+
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) )
-+ {
-+#ifdef _NOHANDSHAKE
-+ dvb_delay(1);
-+#endif
-+ if ((jiffies - start) > ARM_WAIT_FREE) {
-+ printk("%s: timeout waiting for COMMAND to complete\n", __FUNCTION__);
-+ up(&av7110->dcomlock);
-+ return -1;
-+ }
-+ }
-+
-+#ifndef _NOHANDSHAKE
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_SHAKE) {
-+ printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
-+ up(&av7110->dcomlock);
-+ return -1;
-+ }
-+ }
-+#endif
-+
-+#ifdef COM_DEBUG
-+ stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
-+ if (stat & GPMQOver) {
-+ printk(KERN_ERR "%s: GPMQOver\n", __FUNCTION__);
-+ up(&av7110->dcomlock);
-+ return -1;
-+ }
-+ else if (stat & OSDQOver) {
-+ printk(KERN_ERR "%s: OSDQOver\n", __FUNCTION__);
-+ up(&av7110->dcomlock);
-+ return -1;
-+ }
-+#endif
-+
-+ for (i=0; i<n; i++)
-+ buf[i] = rdebi(av7110, DEBINOSWAP, COM_BUFF + 2*i, 0, 2);
-+
-+ up(&av7110->dcomlock);
-+ return 0;
-+}
-+
-+
-+static inline int RequestParameter(struct av7110 *av7110, u16 tag, u16* Buff, s16 length)
-+{
-+ int ret;
-+ ret = CommandRequest(av7110, &tag, 0, Buff, length);
-+ if (ret)
-+ printk("RequestParameter error\n");
-+ return ret;
-+}
-+
-+
-+/****************************************************************************
-+ * Firmware commands
-+ ****************************************************************************/
-+
-+/* msp3400 i2c subaddresses */
-+#define MSP_WR_DEM 0x10
-+#define MSP_RD_DEM 0x11
-+#define MSP_WR_DSP 0x12
-+#define MSP_RD_DSP 0x13
-+
-+static inline int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val)
-+{
-+ u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff };
-+ struct dvb_i2c_bus *i2c = av7110->i2c_bus;
-+ struct i2c_msg msgs = { .flags = 0, .addr = 0x40, .len = 5, .buf = msg};
-+
-+ if (i2c->xfer(i2c, &msgs, 1) != 1) {
-+ printk("av7110(%d): %s(%u = %u) failed\n",
-+ av7110->dvb_adapter->num, __FUNCTION__, reg, val);
-+ return -EIO;
-+ }
-+ return 0;
-+}
-+
-+static inline int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
-+{
-+ u8 msg1[3]={ dev, reg>>8, reg&0xff };
-+ u8 msg2[2];
-+ struct dvb_i2c_bus *i2c = av7110->i2c_bus;
-+ struct i2c_msg msgs[2] = {
-+ { .flags = 0, .addr = 0x40, .len = 3, .buf = msg1},
-+ { .flags = I2C_M_RD, .addr = 0x40, .len = 2, .buf = msg2}
-+ };
-+
-+ if (i2c->xfer(i2c, msgs, 2) != 2) {
-+ printk("av7110(%d): %s(%u) failed\n",
-+ av7110->dvb_adapter->num, __FUNCTION__, reg);
-+ return -EIO;
-+ }
-+ *val = (msg2[0] << 8) | msg2[1];
-+ return 0;
-+}
-+
-+static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data)
-+{
-+// DEB_EE(("av7110: %p\n",av7110));
-+
-+ return outcom(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data);
-+}
-+
-+static int SetVolume(struct av7110 *av7110, int volleft, int volright)
-+{
-+ int err, vol, val, balance = 0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ switch (av7110->adac_type) {
-+ case DVB_ADAC_TI:
-+ volleft = (volleft * 256) / 1036;
-+ volright = (volright * 256) / 1036;
-+ if (volleft > 0x3f)
-+ volleft = 0x3f;
-+ if (volright > 0x3f)
-+ volright = 0x3f;
-+ if ((err = SendDAC(av7110, 3, 0x80 + volleft)))
-+ return err;
-+ return SendDAC(av7110, 4, volright);
-+
-+ case DVB_ADAC_CRYSTAL:
-+ volleft=127-volleft/2;
-+ volright=127-volright/2;
-+ i2c_writereg(av7110, 0x20, 0x03, volleft);
-+ i2c_writereg(av7110, 0x20, 0x04, volright);
-+ return 0;
-+
-+ case DVB_ADAC_MSP:
-+ vol = (volleft > volright) ? volleft : volright;
-+ val = (vol * 0x73 / 255) << 8;
-+ if (vol > 0) {
-+ balance = ((volright-volleft) * 127) / vol;
-+ }
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8);
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0006, val); /* headphonesr */
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+#ifdef CONFIG_DVB_AV7110_OSD
-+
-+static inline int ResetBlend(struct av7110 *av7110, u8 windownr)
-+{
-+ return outcom(av7110, COMTYPE_OSD, SetNonBlend, 1, windownr);
-+}
-+
-+static inline int SetColorBlend(struct av7110 *av7110, u8 windownr)
-+{
-+ return outcom(av7110, COMTYPE_OSD, SetCBlend, 1, windownr);
-+}
-+
-+static inline int SetWindowBlend(struct av7110 *av7110, u8 windownr, u8 blending)
-+{
-+ return outcom(av7110, COMTYPE_OSD, SetWBlend, 2, windownr, blending);
-+}
-+
-+static inline int SetBlend_(struct av7110 *av7110, u8 windownr,
-+ enum av7110_osd_palette_type colordepth, u16 index, u8 blending)
-+{
-+ return outcom(av7110, COMTYPE_OSD, SetBlend, 4,
-+ windownr, colordepth, index, blending);
-+}
-+
-+static inline int SetColor_(struct av7110 *av7110, u8 windownr,
-+ enum av7110_osd_palette_type colordepth, u16 index, u16 colorhi, u16 colorlo)
-+{
-+ return outcom(av7110, COMTYPE_OSD, SetColor, 5,
-+ windownr, colordepth, index, colorhi, colorlo);
-+}
-+
-+static inline int BringToTop(struct av7110 *av7110, u8 windownr)
-+{
-+ return outcom(av7110, COMTYPE_OSD, WTop, 1, windownr);
-+}
-+
-+static inline int SetFont(struct av7110 *av7110, u8 windownr, u8 fontsize,
-+ u16 colorfg, u16 colorbg)
-+{
-+ return outcom(av7110, COMTYPE_OSD, Set_Font, 4,
-+ windownr, fontsize, colorfg, colorbg);
-+}
-+
-+static int FlushText(struct av7110 *av7110)
-+{
-+ u32 start;
-+
-+ if (down_interruptible(&av7110->dcomlock))
-+ return -ERESTARTSYS;
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_OSD) {
-+ printk(KERN_ERR "%s: timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__);
-+ up(&av7110->dcomlock);
-+ return -1;
-+ }
-+ }
-+ up(&av7110->dcomlock);
-+ return 0;
-+}
-+
-+static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf)
-+{
-+ int i, ret;
-+ u32 start;
-+ int length=strlen(buf)+1;
-+ u16 cbuf[5] = { (COMTYPE_OSD<<8) + DText, 3, win, x, y };
-+
-+ if (down_interruptible(&av7110->dcomlock))
-+ return -ERESTARTSYS;
-+
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_OSD) {
-+ printk(KERN_ERR "%s: timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__);
-+ up(&av7110->dcomlock);
-+ return -1;
-+ }
-+ }
-+#ifndef _NOHANDSHAKE
-+ start = jiffies;
-+ while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
-+ dvb_delay(1);
-+ if ((jiffies - start) > ARM_WAIT_SHAKE) {
-+ printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
-+ up(&av7110->dcomlock);
-+ return -1;
-+ }
-+ }
-+#endif
-+ for (i=0; i<length/2; i++)
-+ wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2,
-+ swab16(*(u16 *)(buf+2*i)), 2);
-+ if (length&1)
-+ wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2, 0, 2);
-+ ret=OutCommand(av7110, cbuf, 5);
-+ up(&av7110->dcomlock);
-+ if (ret)
-+ printk("WriteText error\n");
-+ return ret;
-+}
-+
-+static inline int DrawLine(struct av7110 *av7110, u8 windownr,
-+ u16 x, u16 y, u16 dx, u16 dy, u16 color)
-+{
-+ return outcom(av7110, COMTYPE_OSD, DLine, 6,
-+ windownr, x, y, dx, dy, color);
-+}
-+
-+static inline int DrawBlock(struct av7110 *av7110, u8 windownr,
-+ u16 x, u16 y, u16 dx, u16 dy, u16 color)
-+{
-+ return outcom(av7110, COMTYPE_OSD, DBox, 6,
-+ windownr, x, y, dx, dy, color);
-+}
-+
-+static inline int HideWindow(struct av7110 *av7110, u8 windownr)
-+{
-+ return outcom(av7110, COMTYPE_OSD, WHide, 1, windownr);
-+}
-+
-+static inline int MoveWindowRel(struct av7110 *av7110, u8 windownr, u16 x, u16 y)
-+{
-+ return outcom(av7110, COMTYPE_OSD, WMoveD, 3, windownr, x, y);
-+}
-+
-+static inline int MoveWindowAbs(struct av7110 *av7110, u8 windownr, u16 x, u16 y)
-+{
-+ return outcom(av7110, COMTYPE_OSD, WMoveA, 3, windownr, x, y);
-+}
-+
-+static inline int DestroyOSDWindow(struct av7110 *av7110, u8 windownr)
-+{
-+ return outcom(av7110, COMTYPE_OSD, WDestroy, 1, windownr);
-+}
-+
-+#if 0
-+static void DestroyOSDWindows(struct av7110 *av7110)
-+{
-+ int i;
-+
-+ for (i=1; i<7; i++)
-+ outcom(av7110, COMTYPE_OSD, WDestroy, 1, i);
-+}
-+#endif
-+
-+static inline int CreateOSDWindow(struct av7110 *av7110, u8 windownr,
-+ enum av7110_window_display_type disptype, u16 width, u16 height)
-+{
-+ return outcom(av7110, COMTYPE_OSD, WCreate, 4,
-+ windownr, disptype, width, height);
-+}
-+
-+
-+static enum av7110_osd_palette_type bpp2pal[8]={Pal1Bit, Pal2Bit, 0, Pal4Bit, 0, 0, 0, Pal8Bit};
-+static enum av7110_window_display_type bpp2bit[8]={BITMAP1, BITMAP2, 0, BITMAP4, 0, 0, 0, BITMAP8};
-+
-+static inline int LoadBitmap(struct av7110 *av7110, u16 format, u16 dx, u16 dy, int inc, u8* data)
-+{
-+ int bpp;
-+ int i;
-+ int d, delta;
-+ u8 c;
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (av7110->bmp_state==BMP_LOADING) {
-+ add_wait_queue(&av7110->bmpq, &wait);
-+ while (1) {
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ if (av7110->bmp_state!=BMP_LOADING
-+ || signal_pending(current))
-+ break;
-+ schedule();
-+ }
-+ set_current_state(TASK_RUNNING);
-+ remove_wait_queue(&av7110->bmpq, &wait);
-+ }
-+ if (av7110->bmp_state==BMP_LOADING)
-+ return -1;
-+ av7110->bmp_state=BMP_LOADING;
-+ if (format==BITMAP8) { bpp=8; delta = 1; }
-+ else if (format==BITMAP4) { bpp=4; delta = 2; }
-+ else if (format==BITMAP2) { bpp=2; delta = 4; }
-+ else if (format==BITMAP1) { bpp=1; delta = 8; }
-+ else {
-+ av7110->bmp_state=BMP_NONE;
-+ return -1;
-+ }
-+ av7110->bmplen= ((dx*dy*bpp+7)&~7)/8;
-+ av7110->bmpp=0;
-+ if (av7110->bmplen>32768) {
-+ av7110->bmp_state=BMP_NONE;
-+ return -1;
-+ }
-+ for (i=0; i<dy; i++) {
-+ if (copy_from_user(av7110->bmpbuf+1024+i*dx, data+i*inc, dx)) {
-+ av7110->bmp_state=BMP_NONE;
-+ return -1;
-+ }
-+ }
-+ if (format != BITMAP8) {
-+ for (i=0; i<dx*dy/delta; i++) {
-+ c = ((u8 *)av7110->bmpbuf)[1024+i*delta+delta-1];
-+ for (d=delta-2; d>=0; d--) {
-+ c |= (((u8 *)av7110->bmpbuf)[1024+i*delta+d]
-+ << ((delta-d-1)*bpp));
-+ ((u8 *)av7110->bmpbuf)[1024+i] = c;
-+ }
-+ }
-+ }
-+ av7110->bmplen+=1024;
-+ return outcom(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy);
-+}
-+
-+static int BlitBitmap(struct av7110 *av7110, u16 win, u16 x, u16 y, u16 trans)
-+{
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (av7110->bmp_state==BMP_NONE)
-+ return -1;
-+ if (av7110->bmp_state==BMP_LOADING) {
-+ add_wait_queue(&av7110->bmpq, &wait);
-+ while (1) {
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ if (av7110->bmp_state!=BMP_LOADING
-+ || signal_pending(current))
-+ break;
-+ schedule();
-+ }
-+ set_current_state(TASK_RUNNING);
-+ remove_wait_queue(&av7110->bmpq, &wait);
-+ }
-+ if (av7110->bmp_state==BMP_LOADED)
-+ return outcom(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans);
-+ return -1;
-+}
-+
-+static inline int ReleaseBitmap(struct av7110 *av7110)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (av7110->bmp_state!=BMP_LOADED)
-+ return -1;
-+ av7110->bmp_state=BMP_NONE;
-+ return outcom(av7110, COMTYPE_OSD, ReleaseBmp, 0);
-+}
-+
-+static u32 RGB2YUV(u16 R, u16 G, u16 B)
-+{
-+ u16 y, u, v;
-+ u16 Y, Cr, Cb;
-+
-+ y = R * 77 + G * 150 + B * 29; // Luma=0.299R+0.587G+0.114B 0..65535
-+ u = 2048+B * 8 -(y>>5); // Cr 0..4095
-+ v = 2048+R * 8 -(y>>5); // Cb 0..4095
-+
-+ Y=y/256;
-+ Cb=u/16;
-+ Cr=v/16;
-+
-+ return Cr|(Cb<<16)|(Y<<8);
-+}
-+
-+static void OSDSetColor(struct av7110 *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend)
-+{
-+ u16 ch, cl;
-+ u32 yuv;
-+
-+ yuv=blend ? RGB2YUV(r,g,b) : 0;
-+ cl=(yuv&0xffff);
-+ ch=((yuv>>16)&0xffff);
-+ SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
-+ color, ch, cl);
-+ SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
-+ color, ((blend>>4)&0x0f));
-+}
-+
-+static int OSDSetPalette(struct av7110 *av7110, u32 *colors, u8 first, u8 last)
-+{
-+ int i;
-+ int length = last - first + 1;
-+
-+ if (length * 4 > DATA_BUFF3_SIZE)
-+ return -1;
-+
-+ for (i=0; i<length; i++) {
-+ u32 blend = (colors[i] & 0xF0000000) >> 4;
-+ u32 yuv = blend ? RGB2YUV(colors[i] & 0xFF, (colors[i] >> 8) & 0xFF, (colors[i] >> 16) & 0xFF) | blend : 0;
-+ yuv = ((yuv & 0xFFFF0000) >> 16) | ((yuv & 0x0000FFFF) << 16); // TODO kls2003-06-15: not sure if this is endian-proof
-+ wdebi(av7110, DEBINOSWAP, DATA_BUFF3_BASE + i*4, yuv, 4);
-+ }
-+ return outcom(av7110, COMTYPE_OSD, Set_Palette, 4,
-+ av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], first, last);
-+}
-+
-+static int OSDSetBlock(struct av7110 *av7110, int x0, int y0, int x1, int y1, int inc, u8 *data)
-+{
-+ uint w, h, bpp, bpl, size, lpb, bnum, brest;
-+ int i;
-+
-+ w=x1-x0+1; h=y1-y0+1;
-+ if (inc<=0)
-+ inc=w;
-+ if (w<=0 || w>720 || h<=0 || h>576)
-+ return -1;
-+ bpp=av7110->osdbpp[av7110->osdwin]+1;
-+ bpl=((w*bpp+7)&~7)/8;
-+ size=h*bpl;
-+ lpb=(32*1024)/bpl;
-+ bnum=size/(lpb*bpl);
-+ brest=size-bnum*lpb*bpl;
-+
-+ for (i=0; i<bnum; i++) {
-+ LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, lpb, inc, data);
-+ BlitBitmap(av7110, av7110->osdwin, x0, y0+i*lpb, 0);
-+ data+=lpb*inc;
-+ }
-+ if (brest) {
-+ LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, brest/bpl, inc, data);
-+ BlitBitmap(av7110, av7110->osdwin, x0, y0+bnum*lpb, 0);
-+ }
-+ ReleaseBitmap(av7110);
-+ return 0;
-+}
-+
-+static int OSD_DrawCommand(struct av7110 *av7110, osd_cmd_t *dc)
-+{
-+ switch (dc->cmd) {
-+ case OSD_Close:
-+ DestroyOSDWindow(av7110, av7110->osdwin);
-+ return 0;
-+ case OSD_Open:
-+ av7110->osdbpp[av7110->osdwin]=(dc->color-1)&7;
-+ CreateOSDWindow(av7110, av7110->osdwin, bpp2bit[av7110->osdbpp[av7110->osdwin]],
-+ dc->x1-dc->x0+1, dc->y1-dc->y0+1);
-+ if (!dc->data) {
-+ MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
-+ SetColorBlend(av7110, av7110->osdwin);
-+ }
-+ return 0;
-+ case OSD_Show:
-+ MoveWindowRel(av7110, av7110->osdwin, 0, 0);
-+ return 0;
-+ case OSD_Hide:
-+ HideWindow(av7110, av7110->osdwin);
-+ return 0;
-+ case OSD_Clear:
-+ DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0);
-+ return 0;
-+ case OSD_Fill:
-+ DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color);
-+ return 0;
-+ case OSD_SetColor:
-+ OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1);
-+ return 0;
-+ case OSD_SetPalette:
-+ {
-+ if (FW_VERSION(av7110->arm_app) >= 0x2618)
-+ OSDSetPalette(av7110, (u32 *)dc->data, dc->color, dc->x0);
-+ else {
-+ int i, len=dc->x0-dc->color+1;
-+ u8 *colors=(u8 *)dc->data;
-+
-+ for (i=0; i<len; i++)
-+ OSDSetColor(av7110, dc->color+i,
-+ colors[i*4] , colors[i*4+1],
-+ colors[i*4+2], colors[i*4+3]);
-+ }
-+ return 0;
-+ }
-+ case OSD_SetTrans:
-+ return 0;
-+ case OSD_SetPixel:
-+ DrawLine(av7110, av7110->osdwin,
-+ dc->x0, dc->y0, 0, 0,
-+ dc->color);
-+ return 0;
-+ case OSD_GetPixel:
-+ return 0;
-+
-+ case OSD_SetRow:
-+ dc->y1=dc->y0;
-+ case OSD_SetBlock:
-+ OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data);
-+ return 0;
-+
-+ case OSD_FillRow:
-+ DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
-+ dc->x1-dc->x0+1, dc->y1,
-+ dc->color);
-+ return 0;
-+ case OSD_FillBlock:
-+ DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
-+ dc->x1-dc->x0+1, dc->y1-dc->y0+1,
-+ dc->color);
-+ return 0;
-+ case OSD_Line:
-+ DrawLine(av7110, av7110->osdwin,
-+ dc->x0, dc->y0, dc->x1-dc->x0, dc->y1-dc->y0,
-+ dc->color);
-+ return 0;
-+ case OSD_Query:
-+ return 0;
-+ case OSD_Test:
-+ return 0;
-+ case OSD_Text:
-+ {
-+ char textbuf[240];
-+
-+ if (strncpy_from_user(textbuf, dc->data, 240)<0)
-+ return -EFAULT;
-+ textbuf[239]=0;
-+ if (dc->x1>3)
-+ dc->x1=3;
-+ SetFont(av7110, av7110->osdwin, dc->x1,
-+ (u16) (dc->color&0xffff), (u16) (dc->color>>16));
-+ FlushText(av7110);
-+ WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf);
-+ return 0;
-+ }
-+ case OSD_SetWindow:
-+ if (dc->x0<1 || dc->x0>7)
-+ return -EINVAL;
-+ av7110->osdwin=dc->x0;
-+ return 0;
-+ case OSD_MoveWindow:
-+ MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
-+ SetColorBlend(av7110, av7110->osdwin);
-+ return 0;
-+ default:
-+ return -EINVAL;
-+ }
-+}
-+
-+
-+static int dvb_osd_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, void *parg)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (cmd==OSD_SEND_CMD)
-+ return OSD_DrawCommand(av7110, (osd_cmd_t *)parg);
-+
-+ return -EINVAL;
-+}
-+
-+
-+static struct file_operations dvb_osd_fops = {
-+ .owner = THIS_MODULE,
-+ .ioctl = dvb_generic_ioctl,
-+ .open = dvb_generic_open,
-+ .release = dvb_generic_release,
-+};
-+
-+static struct dvb_device dvbdev_osd = {
-+ .priv = 0,
-+ .users = 1,
-+ .writers = 1,
-+ .fops = &dvb_osd_fops,
-+ .kernel_ioctl = dvb_osd_ioctl,
-+};
-+
-+#endif /* CONFIG_DVB_AV7110_OSD */
-+
-+
-+/* get version of the firmware ROM, RTSL, video ucode and ARM application */
-+
-+static void firmversion(struct av7110 *av7110)
-+{
-+ u16 buf[20];
-+
-+ u16 tag = ((COMTYPE_REQUEST << 8) + ReqVersion);
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ RequestParameter(av7110, tag, buf, 16);
-+
-+ av7110->arm_fw=(buf[0] << 16) + buf[1];
-+ av7110->arm_rtsl=(buf[2] << 16) + buf[3];
-+ av7110->arm_vid=(buf[4] << 16) + buf[5];
-+ av7110->arm_app=(buf[6] << 16) + buf[7];
-+ av7110->avtype=(buf[8] << 16) + buf[9];
-+
-+ printk ("DVB: AV711%d(%d) - firm %08x, rtsl %08x, vid %08x, app %08x\n",
-+ av7110->avtype, av7110->dvb_adapter->num, av7110->arm_fw,
-+ av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
-+
-+ /* print firmware capabilities */
-+ if (FW_CI_LL_SUPPORT(av7110->arm_app))
-+ printk ("DVB: AV711%d(%d) - firmware supports CI link layer interface\n",
-+ av7110->avtype, av7110->dvb_adapter->num);
-+ else
-+ printk ("DVB: AV711%d(%d) - no firmware support for CI link layer interface\n",
-+ av7110->avtype, av7110->dvb_adapter->num);
-+
-+ return;
-+}
-+
-+static int waitdebi(struct av7110 *av7110, int adr, int state)
-+{
-+ int k;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ for (k=0; k<100; k++, udelay(500)) {
-+ if (irdebi(av7110, DEBINOSWAP, adr, 0, 2) == state)
-+ return 0;
-+ }
-+ return -1;
-+}
-+
-+
-+static int load_dram(struct av7110 *av7110, u32 *data, int len)
-+{
-+ int i;
-+ int blocks, rest;
-+ u32 base, bootblock=BOOT_BLOCK;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ blocks=len/BOOT_MAX_SIZE;
-+ rest=len % BOOT_MAX_SIZE;
-+ base=DRAM_START_CODE;
-+
-+ for (i=0; i<blocks; i++) {
-+ if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
-+ return -1;
-+ DEB_D(("Writing DRAM block %d\n",i));
-+ mwdebi(av7110, DEBISWAB, bootblock,
-+ ((char*)data) + i*(BOOT_MAX_SIZE),
-+ BOOT_MAX_SIZE);
-+ bootblock^=0x1400;
-+ iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
-+ iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, BOOT_MAX_SIZE, 2);
-+ iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-+ base+=BOOT_MAX_SIZE;
-+ }
-+
-+ if (rest > 0) {
-+ if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
-+ return -1;
-+ if (rest>4)
-+ mwdebi(av7110, DEBISWAB, bootblock, ((char*)data) + i*(BOOT_MAX_SIZE), rest);
-+ else
-+ mwdebi(av7110, DEBISWAB, bootblock, ((char*)data) + i*(BOOT_MAX_SIZE) - 4, rest+4);
-+
-+ iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
-+ iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2);
-+ iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-+ }
-+ if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
-+ return -1;
-+ iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2);
-+ iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-+ if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0)
-+ return -1;
-+ return 0;
-+}
-+
-+
-+static u8 bootcode[] = {
-+ 0xea, 0x00, 0x00, 0x0e, 0xe1, 0xb0, 0xf0, 0x0e, /* 0x0000 */
-+ 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04,
-+ 0xe2, 0x5e, 0xf0, 0x08, 0xe2, 0x5e, 0xf0, 0x04,
-+ 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04,
-+ 0x2c, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c,
-+ 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x34,
-+ 0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0x5a, 0x5a,
-+ 0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09,
-+ 0xe5, 0x9f, 0xd0, 0x5c, 0xe5, 0x9f, 0x40, 0x54, /* 0x0040 */
-+ 0xe3, 0xa0, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x00,
-+ 0xe5, 0x84, 0x00, 0x04, 0xe1, 0xd4, 0x10, 0xb0,
-+ 0xe3, 0x51, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xfc,
-+ 0xe1, 0xa0, 0x10, 0x0d, 0xe5, 0x94, 0x30, 0x04,
-+ 0xe1, 0xd4, 0x20, 0xb2, 0xe2, 0x82, 0x20, 0x3f,
-+ 0xe1, 0xb0, 0x23, 0x22, 0x03, 0xa0, 0x00, 0x02,
-+ 0xe1, 0xc4, 0x00, 0xb0, 0x0a, 0xff, 0xff, 0xf4,
-+ 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, /* 0x0080 */
-+ 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0,
-+ 0xe2, 0x52, 0x20, 0x01, 0x1a, 0xff, 0xff, 0xf9,
-+ 0xe2, 0x2d, 0xdb, 0x05, 0xea, 0xff, 0xff, 0xec,
-+ 0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00,
-+};
-+
-+#include "av7110_firm.h"
-+
-+static int bootarm(struct av7110 *av7110)
-+{
-+ struct saa7146_dev *dev= av7110->dev;
-+ u32 ret;
-+ int i;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
-+
-+ /* Disable DEBI and GPIO irq */
-+ IER_DISABLE(av7110->dev, MASK_03|MASK_19);
-+/*
-+ saa7146_write(av7110->dev, IER,
-+ saa7146_read(av7110->dev, IER) &
-+ ~(MASK_19 | MASK_03));
-+*/
-+ saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
-+
-+ /* enable DEBI */
-+ saa7146_write(av7110->dev, MC1, 0x08800880);
-+ saa7146_write(av7110->dev, DD1_STREAM_B, 0x00000000);
-+ saa7146_write(av7110->dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-+
-+ /* test DEBI */
-+ iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4);
-+ if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4))!=0x10325476) {
-+ printk(KERN_ERR "dvb: debi test in bootarm() failed: "
-+ "%08x != %08x\n", ret, 0x10325476);;
-+ return -1;
-+ }
-+ for (i=0; i<8192; i+=4)
-+ iwdebi(av7110, DEBISWAP, DPRAM_BASE+i, 0x00, 4);
-+ DEB_D(("bootarm: debi test OK\n"));
-+
-+ /* boot */
-+ DEB_D(("bootarm: load boot code\n"));
-+
-+ saa7146_setgpio(dev, ARM_IRQ_LINE, SAA7146_GPIO_IRQLO);
-+ //saa7146_setgpio(dev, DEBI_DONE_LINE, SAA7146_GPIO_INPUT);
-+ //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT);
-+
-+ mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode));
-+ iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-+
-+ wait_for_debi_done(av7110);
-+ saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI);
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ schedule_timeout(HZ);
-+
-+ DEB_D(("bootarm: load dram code\n"));
-+
-+ if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0)
-+ return -1;
-+
-+ saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
-+ mdelay(1);
-+
-+ DEB_D(("bootarm: load dpram code\n"));
-+
-+ mwdebi(av7110, DEBISWAB, DPRAM_BASE, Dpram, sizeof(Dpram));
-+
-+ wait_for_debi_done(av7110);
-+
-+ saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI);
-+ mdelay(800);
-+
-+ //ARM_ClearIrq(av7110);
-+ ARM_ResetMailBox(av7110);
-+ saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
-+ IER_ENABLE(av7110->dev, MASK_03);
-+// saa7146_write(av7110->dev, IER,
-+// saa7146_read(av7110->dev, IER) | MASK_03 );
-+
-+ av7110->arm_errors=0;
-+ av7110->arm_ready=1;
-+ return 0;
-+}
-+
-+static inline int SetPIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
-+ u16 subpid, u16 pcrpid)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (vpid == 0x1fff || apid == 0x1fff ||
-+ ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff) {
-+ vpid = apid = ttpid = subpid = pcrpid = 0;
-+ av7110->pids[DMX_PES_VIDEO] = 0;
-+ av7110->pids[DMX_PES_AUDIO] = 0;
-+ av7110->pids[DMX_PES_TELETEXT] = 0;
-+ av7110->pids[DMX_PES_PCR] = 0;
-+ }
-+
-+ return outcom(av7110, COMTYPE_PIDFILTER, MultiPID, 5,
-+ pcrpid, vpid, apid, ttpid, subpid);
-+}
-+
-+static void ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid,
-+ u16 subpid, u16 pcrpid)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (down_interruptible(&av7110->pid_mutex))
-+ return;
-+
-+ if (!(vpid&0x8000)) av7110->pids[DMX_PES_VIDEO]=vpid;
-+ if (!(apid&0x8000)) av7110->pids[DMX_PES_AUDIO]=apid;
-+ if (!(ttpid&0x8000)) av7110->pids[DMX_PES_TELETEXT]=ttpid;
-+ if (!(pcrpid&0x8000)) av7110->pids[DMX_PES_PCR]=pcrpid;
-+
-+ av7110->pids[DMX_PES_SUBTITLE]=0;
-+
-+ if (av7110->fe_synced) {
-+ pcrpid = av7110->pids[DMX_PES_PCR];
-+ SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid);
-+ }
-+
-+ up(&av7110->pid_mutex);
-+}
-+
-+
-+static void SetMode(struct av7110 *av7110, int mode)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ outcom(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode);
-+
-+ if (!av7110->playing) {
-+ ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO],
-+ av7110->pids[DMX_PES_AUDIO],
-+ av7110->pids[DMX_PES_TELETEXT],
-+ 0, av7110->pids[DMX_PES_PCR]);
-+ outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-+ }
-+}
-+
-+static inline void TestMode(struct av7110 *av7110, int mode)
-+{
-+// DEB_EE(("av7110: %p\n",av7110));
-+ outcom(av7110, COMTYPE_ENCODER, SetTestMode, 1, mode);
-+}
-+
-+static inline void VidMode(struct av7110 *av7110, int mode)
-+{
-+// DEB_EE(("av7110: %p\n",av7110));
-+ outcom(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode);
-+}
-+
-+
-+static int inline vidcom(struct av7110 *av7110, u32 com, u32 arg)
-+{
-+// DEB_EE(("av7110: %p\n",av7110));
-+ return outcom(av7110, 0x80, 0x02, 4,
-+ (com>>16), (com&0xffff),
-+ (arg>>16), (arg&0xffff));
-+}
-+
-+static int inline audcom(struct av7110 *av7110, u32 com)
-+{
-+// DEB_EE(("av7110: %p\n",av7110));
-+ return outcom(av7110, 0x80, 0x03, 4,
-+ (com>>16), (com&0xffff));
-+}
-+
-+static inline void Set22K(struct av7110 *av7110, int state)
-+{
-+ DEB_EE(("av7110: %p\n",av7110));
-+ outcom(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0);
-+}
-+
-+
-+static int SendDiSEqCMsg(struct av7110 *av7110, int len, u8 *msg, unsigned long burst)
-+{
-+ int i;
-+ u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) + SendDiSEqC),
-+ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (len>10)
-+ len=10;
-+
-+ buf[1] = len+2;
-+ buf[2] = len;
-+
-+ if (burst!=-1)
-+ buf[3]=burst ? 0x01 : 0x00;
-+ else
-+ buf[3]=0xffff;
-+
-+ for (i=0; i<len; i++)
-+ buf[i+4]=msg[i];
-+
-+ if (SOutCommand(av7110, buf, 18))
-+ printk("SendDiSEqCMsg error\n");
-+
-+ return 0;
-+}
-+
-+/****************************************************************************
-+ * I2C client commands
-+ ****************************************************************************/
-+
-+static inline int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val)
-+{
-+ u8 msg[2]={ reg, val };
-+ struct dvb_i2c_bus *i2c = av7110->i2c_bus;
-+ struct i2c_msg msgs;
-+
-+ msgs.flags=0;
-+ msgs.addr=id/2;
-+ msgs.len=2;
-+ msgs.buf=msg;
-+ return i2c->xfer (i2c, &msgs, 1);
-+}
-+
-+static inline u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg)
-+{
-+ struct dvb_i2c_bus *i2c = av7110->i2c_bus;
-+ u8 mm1[] = {0x00};
-+ u8 mm2[] = {0x00};
-+ struct i2c_msg msgs[2];
-+
-+ msgs[0].flags=0;
-+ msgs[1].flags=I2C_M_RD;
-+ msgs[0].addr=msgs[1].addr=id/2;
-+ mm1[0]=reg;
-+ msgs[0].len=1; msgs[1].len=1;
-+ msgs[0].buf=mm1; msgs[1].buf=mm2;
-+ i2c->xfer(i2c, msgs, 2);
-+
-+ return mm2[0];
-+}
-+
-+
-+/****************************************************************************
-+ * I/O buffer management and control
-+ ****************************************************************************/
-+
-+static int sw2mode[16] = {
-+ VIDEO_MODE_PAL, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL,
-+ VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, VIDEO_MODE_NTSC,
-+ VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
-+ VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
-+};
-+
-+static void get_video_format(struct av7110 *av7110, u8 *buf, int count)
-+{
-+ int i;
-+ int hsize,vsize;
-+ int sw;
-+ u8 *p;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (av7110->sinfo)
-+ return;
-+ for (i=7; i<count-10; i++) {
-+ p=buf+i;
-+ if (p[0] || p[1] || p[2]!=0x01 || p[3]!=0xb3)
-+ continue;
-+ p+=4;
-+ hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4);
-+ vsize = ((p[1] &0x0F) << 8) | (p[2]);
-+ sw = (p[3]&0x0F);
-+ SetMode(av7110, sw2mode[sw]);
-+ DEB_S(("dvb: playback %dx%d fr=%d\n", hsize, vsize, sw));
-+ av7110->sinfo=1;
-+ break;
-+ }
-+}
-+
-+static inline long aux_ring_buffer_write(struct dvb_ringbuffer *rbuf, const char *buf, unsigned long count)
-+{
-+ unsigned long todo = count;
-+ int free;
-+
-+ while (todo > 0) {
-+ if (dvb_ringbuffer_free(rbuf)<2048) {
-+ if (wait_event_interruptible(rbuf->queue,
-+ (dvb_ringbuffer_free(rbuf)>=2048)))
-+ return count-todo;
-+ }
-+ free = dvb_ringbuffer_free(rbuf);
-+ if (free > todo)
-+ free = todo;
-+ (void)dvb_ringbuffer_write(rbuf,buf,free,0);
-+ todo -= free;
-+ buf += free;
-+ }
-+
-+ return count-todo;
-+}
-+
-+static void play_video_cb(u8 *buf, int count, void *priv)
-+{
-+ struct av7110 *av7110=(struct av7110 *) priv;
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if ((buf[3]&0xe0)==0xe0) {
-+ get_video_format(av7110, buf, count);
-+ aux_ring_buffer_write(&av7110->avout, buf, count);
-+ } else
-+ aux_ring_buffer_write(&av7110->aout, buf, count);
-+}
-+
-+static void play_audio_cb(u8 *buf, int count, void *priv)
-+{
-+ struct av7110 *av7110=(struct av7110 *) priv;
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ aux_ring_buffer_write(&av7110->aout, buf, count);
-+}
-+
-+#define FREE_COND (dvb_ringbuffer_free(&av7110->avout)>=20*1024 && dvb_ringbuffer_free(&av7110->aout)>=20*1024)
-+
-+static ssize_t dvb_play(struct av7110 *av7110, const u8 *buf,
-+ unsigned long count, int nonblock, int type, int umem)
-+{
-+ unsigned long todo = count, n;
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!av7110->kbuf[type])
-+ return -ENOBUFS;
-+
-+ if (nonblock && !FREE_COND)
-+ return -EWOULDBLOCK;
-+
-+ while (todo>0) {
-+ if (!FREE_COND) {
-+ if (nonblock)
-+ return count-todo;
-+ if (wait_event_interruptible(av7110->avout.queue,
-+ FREE_COND))
-+ return count-todo;
-+ }
-+ n=todo;
-+ if (n>IPACKS*2)
-+ n=IPACKS*2;
-+ if (umem) {
-+ if (copy_from_user(av7110->kbuf[type], buf, n))
-+ return -EFAULT;
-+ av7110_ipack_instant_repack(av7110->kbuf[type], n,
-+ &av7110->ipack[type]);
-+ } else {
-+ av7110_ipack_instant_repack(buf, n,
-+ &av7110->ipack[type]);
-+ }
-+ todo -= n;
-+ buf += n;
-+ }
-+ return count-todo;
-+}
-+
-+static ssize_t dvb_aplay(struct av7110 *av7110, const u8 *buf,
-+ unsigned long count, int nonblock, int type)
-+{
-+ unsigned long todo = count, n;
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!av7110->kbuf[type])
-+ return -ENOBUFS;
-+ if (nonblock && dvb_ringbuffer_free(&av7110->aout)<20*1024)
-+ return -EWOULDBLOCK;
-+
-+ while (todo>0) {
-+ if (dvb_ringbuffer_free(&av7110->aout)<20*1024) {
-+ if (nonblock)
-+ return count-todo;
-+ if (wait_event_interruptible(av7110->aout.queue,
-+ (dvb_ringbuffer_free(&av7110->aout)>=
-+ 20*1024)))
-+ return count-todo;
-+ }
-+ n=todo;
-+ if (n>IPACKS*2)
-+ n=IPACKS*2;
-+ if (copy_from_user(av7110->kbuf[type], buf, n))
-+ return -EFAULT;
-+ av7110_ipack_instant_repack(av7110->kbuf[type], n,
-+ &av7110->ipack[type]);
-+// memcpy(dvb->kbuf[type], buf, n);
-+ todo -= n;
-+ buf += n;
-+ }
-+ return count-todo;
-+}
-+
-+void init_p2t(struct av7110_p2t *p, struct dvb_demux_feed *feed)
-+{
-+ memset(p->pes,0,TS_SIZE);
-+ p->counter = 0;
-+ p->pos = 0;
-+ p->frags = 0;
-+ if (feed) p->feed = feed;
-+}
-+
-+void clear_p2t(struct av7110_p2t *p)
-+{
-+ memset(p->pes,0,TS_SIZE);
-+// p->counter = 0;
-+ p->pos = 0;
-+ p->frags = 0;
-+}
-+
-+
-+long int find_pes_header(u8 const *buf, long int length, int *frags)
-+{
-+ int c = 0;
-+ int found = 0;
-+
-+ *frags = 0;
-+
-+ while (c < length-3 && !found) {
-+ if (buf[c] == 0x00 && buf[c+1] == 0x00 &&
-+ buf[c+2] == 0x01) {
-+ switch ( buf[c+3] ) {
-+
-+ case PROG_STREAM_MAP:
-+ case PRIVATE_STREAM2:
-+ case PROG_STREAM_DIR:
-+ case ECM_STREAM :
-+ case EMM_STREAM :
-+ case PADDING_STREAM :
-+ case DSM_CC_STREAM :
-+ case ISO13522_STREAM:
-+ case PRIVATE_STREAM1:
-+ case AUDIO_STREAM_S ... AUDIO_STREAM_E:
-+ case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-+ found = 1;
-+ break;
-+
-+ default:
-+ c++;
-+ break;
-+ }
-+ } else c++;
-+ }
-+ if (c == length-3 && !found){
-+ if (buf[length-1] == 0x00) *frags = 1;
-+ if (buf[length-2] == 0x00 &&
-+ buf[length-1] == 0x00) *frags = 2;
-+ if (buf[length-3] == 0x00 &&
-+ buf[length-2] == 0x00 &&
-+ buf[length-1] == 0x01) *frags = 3;
-+ return -1;
-+ }
-+
-+ return c;
-+}
-+
-+void pes_to_ts( u8 const *buf, long int length, u16 pid, struct av7110_p2t *p)
-+{
-+ int c,c2,l,add;
-+ int check,rest;
-+
-+ c = 0;
-+ c2 = 0;
-+ if (p->frags){
-+ check = 0;
-+ switch(p->frags){
-+ case 1:
-+ if ( buf[c] == 0x00 && buf[c+1] == 0x01 ){
-+ check = 1;
-+ c += 2;
-+ }
-+ break;
-+ case 2:
-+ if ( buf[c] == 0x01 ){
-+ check = 1;
-+ c++;
-+ }
-+ break;
-+ case 3:
-+ check = 1;
-+ }
-+ if(check){
-+ switch ( buf[c] ) {
-+
-+ case PROG_STREAM_MAP:
-+ case PRIVATE_STREAM2:
-+ case PROG_STREAM_DIR:
-+ case ECM_STREAM :
-+ case EMM_STREAM :
-+ case PADDING_STREAM :
-+ case DSM_CC_STREAM :
-+ case ISO13522_STREAM:
-+ case PRIVATE_STREAM1:
-+ case AUDIO_STREAM_S ... AUDIO_STREAM_E:
-+ case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-+ p->pes[0] = 0x00;
-+ p->pes[1] = 0x00;
-+ p->pes[2] = 0x01;
-+ p->pes[3] = buf[c];
-+ p->pos=4;
-+ memcpy(p->pes+p->pos,buf+c,(TS_SIZE-4)-p->pos);
-+ c += (TS_SIZE-4)-p->pos;
-+ p_to_t(p->pes,(TS_SIZE-4),pid,&p->counter,
-+ p->feed);
-+ clear_p2t(p);
-+ break;
-+
-+ default:
-+ c=0;
-+ break;
-+ }
-+ }
-+ p->frags = 0;
-+ }
-+
-+ if (p->pos){
-+ c2 = find_pes_header(buf+c,length-c,&p->frags);
-+ if (c2 >= 0 && c2 < (TS_SIZE-4)-p->pos){
-+ l = c2+c;
-+ } else l = (TS_SIZE-4)-p->pos;
-+ memcpy(p->pes+p->pos,buf,l);
-+ c += l;
-+ p->pos += l;
-+ p_to_t(p->pes,p->pos,pid,&p->counter, p->feed);
-+ clear_p2t(p);
-+ }
-+
-+ add = 0;
-+ while (c < length){
-+ c2 = find_pes_header(buf+c+add,length-c-add,&p->frags);
-+ if (c2 >= 0) {
-+ c2 += c+add;
-+ if (c2 > c){
-+ p_to_t(buf+c,c2-c,pid,&p->counter,
-+ p->feed);
-+ c = c2;
-+ clear_p2t(p);
-+ add = 0;
-+ } else add = 1;
-+ } else {
-+ l = length-c;
-+ rest = l % (TS_SIZE-4);
-+ l -= rest;
-+ p_to_t(buf+c,l,pid,&p->counter,
-+ p->feed);
-+ memcpy(p->pes,buf+c+l,rest);
-+ p->pos = rest;
-+ c = length;
-+ }
-+ }
-+}
-+
-+
-+int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length)
-+{
-+ int i;
-+ int c = 0;
-+ int fill;
-+ u8 tshead[4] = { 0x47, 0x00, 0x00, 0x10};
-+
-+ fill = (TS_SIZE-4)-length;
-+ if (pes_start) tshead[1] = 0x40;
-+ if (fill) tshead[3] = 0x30;
-+ tshead[1] |= (u8)((pid & 0x1F00) >> 8);
-+ tshead[2] |= (u8)(pid & 0x00FF);
-+ tshead[3] |= ((*counter)++ & 0x0F) ;
-+ memcpy(buf,tshead,4);
-+ c+=4;
-+
-+
-+ if (fill){
-+ buf[4] = fill-1;
-+ c++;
-+ if (fill >1){
-+ buf[5] = 0x00;
-+ c++;
-+ }
-+ for ( i = 6; i < fill+4; i++){
-+ buf[i] = 0xFF;
-+ c++;
-+ }
-+ }
-+
-+ return c;
-+}
-+
-+
-+void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter,
-+ struct dvb_demux_feed *feed)
-+{
-+
-+ int l, pes_start;
-+ u8 obuf[TS_SIZE];
-+ long int c = 0;
-+
-+ pes_start = 0;
-+ if ( length > 3 &&
-+ buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01 )
-+ switch (buf[3]){
-+ case PROG_STREAM_MAP:
-+ case PRIVATE_STREAM2:
-+ case PROG_STREAM_DIR:
-+ case ECM_STREAM :
-+ case EMM_STREAM :
-+ case PADDING_STREAM :
-+ case DSM_CC_STREAM :
-+ case ISO13522_STREAM:
-+ case PRIVATE_STREAM1:
-+ case AUDIO_STREAM_S ... AUDIO_STREAM_E:
-+ case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-+ pes_start = 1;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ while ( c < length ){
-+ memset(obuf,0,TS_SIZE);
-+ if (length - c >= (TS_SIZE-4)){
-+ l = write_ts_header2(pid, counter, pes_start
-+ , obuf, (TS_SIZE-4));
-+ memcpy(obuf+l, buf+c, TS_SIZE-l);
-+ c += TS_SIZE-l;
-+ } else {
-+ l = write_ts_header2(pid, counter, pes_start
-+ , obuf, length-c);
-+ memcpy(obuf+l, buf+c, TS_SIZE-l);
-+ c = length;
-+ }
-+ feed->cb.ts(obuf, 188, 0, 0, &feed->feed.ts, DMX_OK);
-+ pes_start = 0;
-+ }
-+}
-+
-+/****************************************************************************
-+ * V4L SECTION
-+ ****************************************************************************/
-+
-+static struct v4l2_input inputs[2] = {
-+ {
-+ .index = 0,
-+ .name = "DVB",
-+ .type = V4L2_INPUT_TYPE_CAMERA,
-+ .audioset = 1,
-+ .tuner = 0, /* ignored */
-+ .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
-+ .status = 0,
-+ }, {
-+ .index = 1,
-+ .name = "Television",
-+ .type = V4L2_INPUT_TYPE_TUNER,
-+ .audioset = 2,
-+ .tuner = 0,
-+ .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M,
-+ .status = 0,
-+ }
-+};
-+
-+/* taken from ves1820.c */
-+static int ves1820_writereg(struct saa7146_dev *dev, u8 reg, u8 data)
-+{
-+ u8 addr = 0x09;
-+ u8 buf[] = { 0x00, reg, data };
-+ struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = buf, .len = 3 };
-+
-+ DEB_EE(("av7710: dev: %p\n",dev));
-+
-+ if( 1 != saa7146_i2c_transfer(dev, &msg, 1, 1)) {
-+ return -1;
-+ }
-+ return 0;
-+}
-+
-+static int tuner_write(struct saa7146_dev *dev, u8 addr, u8 data [4])
-+{
-+ struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = data, .len = 4 };
-+
-+ DEB_EE(("av7710: dev: %p\n",dev));
-+
-+ if( 1 != saa7146_i2c_transfer(dev, &msg, 1, 1)) {
-+ return -1;
-+ }
-+ return 0;
-+}
-+
-+
-+/**
-+ * set up the downconverter frequency divisor for a
-+ * reference clock comparision frequency of 62.5 kHz.
-+ */
-+static int tuner_set_tv_freq (struct saa7146_dev *dev, u32 freq)
-+{
-+ u32 div;
-+ u8 config;
-+ u8 buf [4];
-+
-+ DEB_EE(("av7710: freq: 0x%08x\n",freq));
-+
-+ /* magic number: 614. tuning with the frequency given by v4l2
-+ is always off by 614*62.5 = 38375 kHz...*/
-+ div = freq + 614;
-+
-+ buf[0] = (div >> 8) & 0x7f;
-+ buf[1] = div & 0xff;
-+ buf[2] = 0x8e;
-+
-+ if (freq < (u32) 16*168.25 )
-+ config = 0xa0;
-+ else if (freq < (u32) 16*447.25)
-+ config = 0x90;
-+ else
-+ config = 0x30;
-+ config &= ~0x02;
-+
-+ buf[3] = config;
-+
-+ return tuner_write (dev, 0x61, buf);
-+}
-+
-+static struct saa7146_standard analog_standard[];
-+static struct saa7146_standard dvb_standard[];
-+static struct saa7146_standard standard[];
-+
-+static struct v4l2_audio msp3400_v4l2_audio = {
-+ .index = 0,
-+ .name = "Television",
-+ .capability = V4L2_AUDCAP_STEREO
-+};
-+
-+int av7110_dvb_c_switch(struct saa7146_fh *fh)
-+{
-+ struct saa7146_dev *dev = fh->dev;
-+ struct saa7146_vv *vv = dev->vv_data;
-+ struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
-+ u16 adswitch;
-+ u8 band = 0;
-+ int source, sync;
-+ struct saa7146_fh *ov_fh = NULL;
-+ int restart_overlay = 0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if( vv->ov_data != NULL ) {
-+ ov_fh = vv->ov_data->fh;
-+ saa7146_stop_preview(ov_fh);
-+ restart_overlay = 1;
-+ }
-+
-+ if( 0 != av7110->current_input ) {
-+ adswitch = 1;
-+ band = 0x68; /* analog band */
-+ source = SAA7146_HPS_SOURCE_PORT_B;
-+ sync = SAA7146_HPS_SYNC_PORT_B;
-+ memcpy(standard,analog_standard,sizeof(struct saa7146_standard)*2);
-+ printk("av7110: switching to analog TV\n");
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0000); // loudspeaker source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0000); // headphone source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0000); // SCART 1 source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); // loudspeaker + headphone
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume
-+ } else {
-+ adswitch = 0;
-+ band = 0x28; /* digital band */
-+ source = SAA7146_HPS_SOURCE_PORT_A;
-+ sync = SAA7146_HPS_SYNC_PORT_A;
-+ memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
-+ printk("av7110: switching DVB mode\n");
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
-+ }
-+
-+ /* hmm, this does not do anything!? */
-+ if (outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, adswitch))
-+ printk("ADSwitch error\n");
-+
-+ if( 0 != ves1820_writereg(dev, 0x0f, band )) {
-+ printk("setting band in demodulator failed.\n");
-+ }
-+ saa7146_set_hps_source_and_sync(dev, source, sync);
-+
-+ /* restart overlay if it was active before */
-+ if( 0 != restart_overlay ) {
-+ saa7146_start_preview(ov_fh);
-+ }
-+
-+ return 0;
-+}
-+
-+int av7110_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg)
-+{
-+ struct saa7146_dev *dev = fh->dev;
-+ struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
-+ DEB_EE(("saa7146_dev: %p\n",dev));
-+
-+ switch(cmd) {
-+ case VIDIOC_G_TUNER:
-+ {
-+ struct v4l2_tuner *t = arg;
-+ u16 stereo_det;
-+ s8 stereo;
-+
-+ DEB_EE(("VIDIOC_G_TUNER: %d\n", t->index));
-+
-+ if( 0 == av7110->has_analog_tuner || t->index != 0 ) {
-+ return -EINVAL;
-+ }
-+
-+ memset(t,0,sizeof(*t));
-+ strcpy(t->name, "Television");
-+
-+ t->type = V4L2_TUNER_ANALOG_TV;
-+ t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO |
-+ V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
-+ t->rangelow = 772; /* 48.25 MHZ / 62.5 kHz = 772, see fi1216mk2-specs, page 2 */
-+ t->rangehigh = 13684; /* 855.25 MHz / 62.5 kHz = 13684 */
-+ /* FIXME: add the real signal strength here */
-+ t->signal = 0xffff;
-+ t->afc = 0;
-+
-+msp_readreg(av7110, MSP_RD_DEM, 0x007e, &stereo_det);
-+printk("VIDIOC_G_TUNER: msp3400 TV standard detection: 0x%04x\n", stereo_det);
-+
-+ msp_readreg(av7110, MSP_RD_DSP, 0x0018, &stereo_det);
-+ printk("VIDIOC_G_TUNER: msp3400 stereo detection: 0x%04x\n", stereo_det);
-+ stereo = (s8)(stereo_det >> 8);
-+ if (stereo > 0x10) {
-+ /* stereo */
-+ t->rxsubchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO;
-+ t->audmode = V4L2_TUNER_MODE_STEREO;
-+ }
-+ else if (stereo < -0x10) {
-+ /* bilingual*/
-+ t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
-+ t->audmode = V4L2_TUNER_MODE_LANG1;
-+ }
-+ else /* mono */
-+ t->rxsubchans = V4L2_TUNER_SUB_MONO;
-+
-+ return 0;
-+ }
-+ case VIDIOC_S_TUNER:
-+ {
-+ struct v4l2_tuner *t = arg;
-+ u16 fm_matrix, src;
-+ DEB_EE(("VIDIOC_S_TUNER: %d\n", t->index));
-+
-+ if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
-+ return -EINVAL;
-+ }
-+
-+
-+ switch(t->audmode) {
-+ case V4L2_TUNER_MODE_STEREO:
-+ DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n"));
-+ fm_matrix = 0x3001; // stereo
-+ src = 0x0020;
-+ break;
-+ case V4L2_TUNER_MODE_LANG1:
-+ DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n"));
-+ fm_matrix = 0x3000; // mono
-+ src = 0x0000;
-+ break;
-+ case V4L2_TUNER_MODE_LANG2:
-+ DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG2\n"));
-+ fm_matrix = 0x3000; // mono
-+ src = 0x0010;
-+ break;
-+ default: /* case V4L2_TUNER_MODE_MONO: {*/
-+ DEB_D(("VIDIOC_S_TUNER: TDA9840_SET_MONO\n"));
-+ fm_matrix = 0x3000; // mono
-+ src = 0x0030;
-+ break;
-+ }
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000e, fm_matrix);
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0008, src);
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0009, src);
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000a, src);
-+
-+ return 0;
-+ }
-+ case VIDIOC_G_FREQUENCY:
-+ {
-+ struct v4l2_frequency *f = arg;
-+
-+ DEB_EE(("VIDIOC_G_FREQ: freq:0x%08x.\n", f->frequency));
-+
-+ if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
-+ return -EINVAL;
-+ }
-+
-+ memset(f,0,sizeof(*f));
-+ f->type = V4L2_TUNER_ANALOG_TV;
-+ f->frequency = av7110->current_freq;
-+
-+ return 0;
-+ }
-+ case VIDIOC_S_FREQUENCY:
-+ {
-+ struct v4l2_frequency *f = arg;
-+
-+ DEB_EE(("VIDIOC_S_FREQUENCY: freq:0x%08x.\n",f->frequency));
-+
-+ if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) {
-+ return -EINVAL;
-+ }
-+
-+ if (V4L2_TUNER_ANALOG_TV != f->type)
-+ return -EINVAL;
-+
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0xffe0); // fast mute
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0xffe0);
-+
-+ /* tune in desired frequency */
-+ tuner_set_tv_freq(dev, f->frequency);
-+ av7110->current_freq = f->frequency;
-+
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x003f); // start stereo detection
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x0000);
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); // loudspeaker + headphone
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume
-+
-+ return 0;
-+ }
-+ case VIDIOC_ENUMINPUT:
-+ {
-+ struct v4l2_input *i = arg;
-+
-+ DEB_EE(("VIDIOC_ENUMINPUT: %d\n", i->index));
-+
-+ if( 0 != av7110->has_analog_tuner ) {
-+ if( i->index < 0 || i->index >= 2) {
-+ return -EINVAL;
-+ }
-+ } else {
-+ if( i->index != 0 ) {
-+ return -EINVAL;
-+ }
-+ }
-+
-+ memcpy(i, &inputs[i->index], sizeof(struct v4l2_input));
-+
-+ return 0;
-+ }
-+ case VIDIOC_G_INPUT:
-+ {
-+ int *input = (int *)arg;
-+ *input = av7110->current_input;
-+ DEB_EE(("VIDIOC_G_INPUT: %d\n", *input));
-+ return 0;
-+ }
-+ case VIDIOC_S_INPUT:
-+ {
-+ int input = *(int *)arg;
-+
-+ DEB_EE(("VIDIOC_S_INPUT: %d\n", input));
-+
-+ if( 0 == av7110->has_analog_tuner ) {
-+ return 0;
-+ }
-+
-+ if( input < 0 || input >= 2) {
-+ return -EINVAL;
-+ }
-+
-+ /* fixme: switch inputs here */
-+ av7110->current_input = input;
-+ return av7110_dvb_c_switch(fh);
-+ }
-+ case VIDIOC_G_AUDIO:
-+ {
-+ struct v4l2_audio *a = arg;
-+
-+ DEB_EE(("VIDIOC_G_AUDIO: %d\n", a->index));
-+ if (a->index != 0)
-+ return -EINVAL;
-+ memcpy(a, &msp3400_v4l2_audio, sizeof(struct v4l2_audio));
-+ break;
-+ }
-+ case VIDIOC_S_AUDIO:
-+ {
-+ struct v4l2_audio *a = arg;
-+ DEB_EE(("VIDIOC_S_AUDIO: %d\n", a->index));
-+ break;
-+ }
-+ default:
-+ printk("no such ioctl\n");
-+ return -ENOIOCTLCMD;
-+ }
-+ return 0;
-+}
-+
-+static unsigned int dvb_audio_poll(struct file *file, poll_table *wait)
-+{
-+ struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-+ struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
-+ unsigned int mask = 0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ poll_wait(file, &av7110->aout.queue, wait);
-+
-+ if (av7110->playing) {
-+ if (dvb_ringbuffer_free(&av7110->aout)>=20*1024)
-+ mask |= (POLLOUT | POLLWRNORM);
-+ } else /* if not playing: may play if asked for */
-+ mask = (POLLOUT | POLLWRNORM);
-+
-+ return mask;
-+}
-+
-+
-+/****************************************************************************
-+ * END OF V4L SECTION
-+ ****************************************************************************/
-+
-+
-+/****************************************************************************
-+ * DVB API SECTION
-+ ****************************************************************************/
-+
-+
-+/******************************************************************************
-+ * hardware filter functions
-+ ******************************************************************************/
-+
-+static int StartHWFilter(struct dvb_demux_filter *dvbdmxfilter)
-+{
-+ struct dvb_demux_feed *dvbdmxfeed=dvbdmxfilter->feed;
-+ struct av7110 *av7110=(struct av7110 *) dvbdmxfeed->demux->priv;
-+ u16 buf[20];
-+ int ret, i;
-+ u16 handle;
-+// u16 mode=0x0320;
-+ u16 mode=0xb96a;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (dvbdmxfilter->type==DMX_TYPE_SEC) {
-+ if (hw_sections) {
-+ buf[4]=(dvbdmxfilter->filter.filter_value[0]<<8)|
-+ dvbdmxfilter->maskandmode[0];
-+ for (i=3; i<18; i++)
-+ buf[i+4-2]=(dvbdmxfilter->filter.filter_value[i]<<8)|
-+ dvbdmxfilter->maskandmode[i];
-+ mode=4;
-+ }
-+ } else
-+ if ((dvbdmxfeed->ts_type & TS_PACKET) &&
-+ !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY))
-+ init_p2t(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed);
-+
-+ buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter;
-+ buf[1] = 16;
-+ buf[2] = dvbdmxfeed->pid;
-+ buf[3] = mode;
-+
-+ ret=CommandRequest(av7110, buf, 20, &handle, 1);
-+ if (ret<0) {
-+ printk("StartHWFilter error\n");
-+ return ret;
-+ }
-+
-+ av7110->handle2filter[handle]=dvbdmxfilter;
-+ dvbdmxfilter->hw_handle=handle;
-+
-+ return ret;
-+}
-+
-+static int StopHWFilter(struct dvb_demux_filter *dvbdmxfilter)
-+{
-+ struct av7110 *av7110=(struct av7110 *) dvbdmxfilter->feed->demux->priv;
-+ u16 buf[3];
-+ u16 answ[2];
-+ int ret;
-+ u16 handle;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ handle=dvbdmxfilter->hw_handle;
-+ if (handle>32) {
-+ DEB_S(("dvb: StopHWFilter tried to stop invalid filter %d.\n",
-+ handle));
-+ DEB_S(("dvb: filter type = %d\n", dvbdmxfilter->type));
-+ return 0;
-+ }
-+
-+ av7110->handle2filter[handle]=NULL;
-+
-+ buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter;
-+ buf[1] = 1;
-+ buf[2] = handle;
-+ ret=CommandRequest(av7110, buf, 3, answ, 2);
-+ if (ret)
-+ printk("StopHWFilter error\n");
-+
-+ if (answ[1] != handle) {
-+ DEB_S(("dvb: filter %d shutdown error :%d\n", handle, answ[1]));
-+ ret=-1;
-+ }
-+ return ret;
-+}
-+
-+
-+static int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len)
-+{
-+ struct dvb_demux *demux = feed->demux;
-+ struct av7110 *av7110 = (struct av7110 *) demux->priv;
-+ struct ipack *ipack = &av7110->ipack[feed->pes_type];
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ switch (feed->pes_type) {
-+ case 0:
-+ if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
-+ return -EINVAL;
-+ break;
-+ case 1:
-+ if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY)
-+ return -EINVAL;
-+ break;
-+ default:
-+ return -1;
-+ }
-+
-+ if (!(buf[3] & 0x10)) { // no payload?
-+ return -1;
-+ }
-+ if (buf[1] & 0x40)
-+ av7110_ipack_flush(ipack);
-+
-+ if (buf[3] & 0x20) { // adaptation field?
-+ len -= buf[4]+1;
-+ buf += buf[4]+1;
-+ if (!len)
-+ return 0;
-+ }
-+
-+ av7110_ipack_instant_repack(buf+4, len-4, &av7110->ipack[feed->pes_type]);
-+ return 0;
-+}
-+
-+
-+static void dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed)
-+{
-+ struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-+ struct av7110 *av7110=(struct av7110 *) dvbdmx->priv;
-+ u16 *pid=dvbdmx->pids, npids[5];
-+ int i;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ npids[0]=npids[1]=npids[2]=npids[3]=0xffff;
-+ npids[4]=0xffff;
-+ i=dvbdmxfeed->pes_type;
-+ npids[i]=(pid[i]&0x8000) ? 0 : pid[i];
-+ if ((i==2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) {
-+ npids[i]=0;
-+ ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
-+ StartHWFilter(dvbdmxfeed->filter);
-+ return;
-+ }
-+ if (dvbdmxfeed->pes_type<=2 || dvbdmxfeed->pes_type==4)
-+ ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
-+
-+ if (dvbdmxfeed->pes_type<2 && npids[0])
-+ if (av7110->fe_synced)
-+ outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-+
-+ if ((dvbdmxfeed->ts_type & TS_PACKET)) {
-+ if (dvbdmxfeed->pes_type == 0 &&
-+ !(dvbdmx->pids[0]&0x8000))
-+ AV_StartRecord(av7110, RP_AUDIO,
-+ dvbdmxfeed);
-+ if (dvbdmxfeed->pes_type == 1 &&
-+ !(dvbdmx->pids[1]&0x8000))
-+ AV_StartRecord(av7110, RP_VIDEO,
-+ dvbdmxfeed);
-+ }
-+}
-+
-+static void dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed)
-+{
-+ struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-+ struct av7110 *av7110=(struct av7110 *) dvbdmx->priv;
-+ u16 *pid=dvbdmx->pids, npids[5];
-+ int i;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (dvbdmxfeed->pes_type<=1) {
-+ AV_Stop(av7110, dvbdmxfeed->pes_type ?
-+ RP_VIDEO : RP_AUDIO);
-+ if (!av7110->rec_mode)
-+ dvbdmx->recording=0;
-+ if (!av7110->playing)
-+ dvbdmx->playing=0;
-+ }
-+ npids[0]=npids[1]=npids[2]=npids[3]=0xffff;
-+ npids[4]=0xffff;
-+ i=dvbdmxfeed->pes_type;
-+ switch (i) {
-+ case 2: //teletext
-+ if (dvbdmxfeed->ts_type & TS_PACKET)
-+ StopHWFilter(dvbdmxfeed->filter);
-+ npids[2]=0;
-+ break;
-+ case 0:
-+ case 1:
-+ case 4:
-+ if (!pids_off)
-+ return;
-+ npids[i]=(pid[i]&0x8000) ? 0 : pid[i];
-+ break;
-+ }
-+ ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
-+}
-+
-+static int av7110_start_feed(struct dvb_demux_feed *feed)
-+{
-+ struct dvb_demux *demux = feed->demux;
-+ struct av7110 *av7110 = (struct av7110 *) demux->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!demux->dmx.frontend)
-+ return -EINVAL;
-+
-+ if (feed->pid > 0x1fff)
-+ return -EINVAL;
-+
-+ if (feed->type == DMX_TYPE_TS) {
-+ if ((feed->ts_type & TS_DECODER) &&
-+ (feed->pes_type < DMX_TS_PES_OTHER)) {
-+ switch (demux->dmx.frontend->source) {
-+ case DMX_MEMORY_FE:
-+ if (feed->ts_type & TS_DECODER)
-+ if (feed->pes_type < 2 &&
-+ !(demux->pids[0] & 0x8000) &&
-+ !(demux->pids[1] & 0x8000)) {
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
-+ AV_StartPlay(av7110,RP_AV);
-+ demux->playing = 1;
-+ }
-+ break;
-+ default:
-+ dvb_feed_start_pid(feed);
-+ break;
-+ }
-+ } else
-+ if ((feed->ts_type & TS_PACKET) &&
-+ (demux->dmx.frontend->source!=DMX_MEMORY_FE))
-+ StartHWFilter(feed->filter);
-+ }
-+
-+ if (feed->type == DMX_TYPE_SEC) {
-+ int i;
-+
-+ for (i=0; i<demux->filternum; i++) {
-+ if (demux->filter[i].state!=DMX_STATE_READY)
-+ continue;
-+ if (demux->filter[i].type!=DMX_TYPE_SEC)
-+ continue;
-+ if (demux->filter[i].filter.parent!=&feed->feed.sec)
-+ continue;
-+ demux->filter[i].state=DMX_STATE_GO;
-+ if (demux->dmx.frontend->source!=DMX_MEMORY_FE)
-+ StartHWFilter(&demux->filter[i]);
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+static int av7110_stop_feed(struct dvb_demux_feed *feed)
-+{
-+ struct dvb_demux *demux = feed->demux;
-+ struct av7110 *av7110 = (struct av7110 *) demux->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (feed->type == DMX_TYPE_TS) {
-+ if (feed->ts_type & TS_DECODER) {
-+ if (feed->pes_type >= DMX_TS_PES_OTHER ||
-+ !demux->pesfilter[feed->pes_type])
-+ return -EINVAL;
-+ demux->pids[feed->pes_type]|=0x8000;
-+ demux->pesfilter[feed->pes_type]=0;
-+ }
-+ if (feed->ts_type & TS_DECODER &&
-+ feed->pes_type < DMX_TS_PES_OTHER) {
-+ dvb_feed_stop_pid(feed);
-+ } else
-+ if ((feed->ts_type & TS_PACKET) &&
-+ (demux->dmx.frontend->source != DMX_MEMORY_FE))
-+ StopHWFilter(feed->filter);
-+ }
-+
-+ if (feed->type == DMX_TYPE_SEC) {
-+ int i;
-+
-+ for (i=0; i<demux->filternum; i++)
-+ if (demux->filter[i].state==DMX_STATE_GO &&
-+ demux->filter[i].filter.parent==&feed->feed.sec) {
-+ demux->filter[i].state=DMX_STATE_READY;
-+ if (demux->dmx.frontend->source!=DMX_MEMORY_FE)
-+ StopHWFilter(&demux->filter[i]);
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+static void restart_feeds(struct av7110 *av7110)
-+{
-+ struct dvb_demux *dvbdmx=&av7110->demux;
-+ struct dvb_demux_feed *feed;
-+ int mode;
-+ int i;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ mode=av7110->playing;
-+ av7110->playing=0;
-+ av7110->rec_mode=0;
-+
-+ for (i=0; i<dvbdmx->filternum; i++) {
-+ feed=&dvbdmx->feed[i];
-+ if (feed->state==DMX_STATE_GO)
-+ av7110_start_feed(feed);
-+ }
-+
-+ if (mode)
-+ AV_StartPlay(av7110, mode);
-+}
-+
-+static int dvb_get_stc(struct dmx_demux *demux, unsigned int num,
-+ uint64_t *stc, unsigned int *base)
-+{
-+ int ret;
-+ u16 fwstc[4];
-+ u16 tag = ((COMTYPE_REQUEST << 8) + ReqSTC);
-+ struct dvb_demux *dvbdemux;
-+ struct av7110 *av7110;
-+
-+ /* pointer casting paranoia... */
-+ if (!demux)
-+ BUG();
-+ dvbdemux = (struct dvb_demux *) demux->priv;
-+ if (!dvbdemux)
-+ BUG();
-+ av7110 = (struct av7110 *) dvbdemux->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (num != 0)
-+ return -EINVAL;
-+
-+ ret = CommandRequest(av7110, &tag, 0, fwstc, 4);
-+ if (ret) {
-+ printk(KERN_ERR "%s: CommandRequest error\n", __FUNCTION__);
-+ return -EIO;
-+ }
-+ DEB_EE(("av7110: fwstc = %04hx %04hx %04hx %04hx\n",
-+ fwstc[0], fwstc[1], fwstc[2], fwstc[3]));
-+
-+ *stc = (((uint64_t) ((fwstc[3] & 0x8000) >> 15)) << 32) |
-+ (((uint64_t)fwstc[1]) << 16) | ((uint64_t)fwstc[0]);
-+ *base = 1;
-+
-+ DEB_EE(("av7110: stc = %lu\n", (unsigned long)*stc));
-+
-+ return 0;
-+}
-+
-+
-+/******************************************************************************
-+ * SEC device file operations
-+ ******************************************************************************/
-+
-+static int av7110_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
-+{
-+ struct av7110 *av7110 = fe->before_after_data;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ switch (cmd) {
-+ case FE_SET_TONE:
-+ switch ((fe_sec_tone_mode_t) arg) {
-+ case SEC_TONE_ON:
-+ Set22K (av7110, 1);
-+ break;
-+ case SEC_TONE_OFF:
-+ Set22K (av7110, 0);
-+ break;
-+ default:
-+ return -EINVAL;
-+ };
-+ break;
-+
-+ case FE_DISEQC_SEND_MASTER_CMD:
-+ {
-+ struct dvb_diseqc_master_cmd *cmd = arg;
-+ SendDiSEqCMsg (av7110, cmd->msg_len, cmd->msg, -1);
-+ break;
-+ }
-+
-+ case FE_DISEQC_SEND_BURST:
-+ SendDiSEqCMsg (av7110, 0, NULL, (unsigned long)arg);
-+ break;
-+
-+ default:
-+ return -EOPNOTSUPP;
-+ };
-+
-+ return 0;
-+}
-+
-+/******************************************************************************
-+ * CI link layer file ops (FIXME: move this to separate module later)
-+ ******************************************************************************/
-+
-+int ci_ll_init(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf, int size)
-+{
-+ dvb_ringbuffer_init(cirbuf, vmalloc(size), size);
-+ dvb_ringbuffer_init(ciwbuf, vmalloc(size), size);
-+ return 0;
-+}
-+
-+void ci_ll_flush(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
-+{
-+ dvb_ringbuffer_flush_spinlock_wakeup(cirbuf);
-+ dvb_ringbuffer_flush_spinlock_wakeup(ciwbuf);
-+}
-+
-+void ci_ll_release(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
-+{
-+ vfree(cirbuf->data);
-+ cirbuf->data=0;
-+ vfree(ciwbuf->data);
-+ ciwbuf->data=0;
-+}
-+
-+
-+int ci_ll_reset(struct dvb_ringbuffer *cibuf, struct file *file,
-+ int slots, ca_slot_info_t *slot)
-+{
-+ int i;
-+ int len=0;
-+ u8 msg[8]={0x00,0x06,0,0x00,0xff,0x02,0x00,0x00};
-+
-+ for (i=0; i<2; i++) {
-+ if (slots & (1<<i))
-+ len+=8;
-+ }
-+
-+ if (dvb_ringbuffer_free(cibuf) < len)
-+ return -EBUSY;
-+
-+ for (i=0; i<2; i++) {
-+ if (slots & (1<<i)) {
-+ msg[2]=i;
-+ dvb_ringbuffer_write(cibuf,msg,8,0);
-+ slot[i].flags=0;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+static ssize_t ci_ll_write(struct dvb_ringbuffer *cibuf, struct file *file, const char *buf, size_t count, loff_t *ppos)
-+{
-+ int free;
-+ int non_blocking=file->f_flags&O_NONBLOCK;
-+
-+ if (count>2048)
-+ return -EINVAL;
-+ free=dvb_ringbuffer_free(cibuf);
-+ if (count+2>free) {
-+ if (non_blocking)
-+ return -EWOULDBLOCK;
-+ if (wait_event_interruptible(cibuf->queue,
-+ (dvb_ringbuffer_free(cibuf)>=count+2)))
-+ return 0;
-+ }
-+
-+ DVB_RINGBUFFER_WRITE_BYTE(cibuf,count>>8);
-+ DVB_RINGBUFFER_WRITE_BYTE(cibuf,count&0xff);
-+
-+ return dvb_ringbuffer_write(cibuf,buf,count,1);
-+}
-+
-+static ssize_t ci_ll_read(struct dvb_ringbuffer *cibuf, struct file *file, char *buf, size_t count, loff_t *ppos)
-+{
-+ int avail;
-+ int non_blocking=file->f_flags&O_NONBLOCK;
-+ ssize_t len;
-+
-+ if (!cibuf->data || !count)
-+ return 0;
-+ if (non_blocking && (dvb_ringbuffer_empty(cibuf)))
-+ return -EWOULDBLOCK;
-+ if (wait_event_interruptible(cibuf->queue,
-+ !dvb_ringbuffer_empty(cibuf)))
-+ return 0;
-+ avail=dvb_ringbuffer_avail(cibuf);
-+ if (avail<4)
-+ return 0;
-+ len= DVB_RINGBUFFER_PEEK(cibuf,0)<<8;
-+ len|=DVB_RINGBUFFER_PEEK(cibuf,1);
-+ if (avail<len+2 || count<len)
-+ return -EINVAL;
-+ DVB_RINGBUFFER_SKIP(cibuf,2);
-+
-+ return dvb_ringbuffer_read(cibuf,buf,len,1);
-+}
-+
-+static int dvb_ca_open(struct inode *inode, struct file *file)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+ int err=dvb_generic_open(inode, file);
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (err<0)
-+ return err;
-+ ci_ll_flush(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
-+ return 0;
-+}
-+
-+static unsigned int dvb_ca_poll (struct file *file, poll_table *wait)
-+{
-+ struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-+ struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
-+ struct dvb_ringbuffer *rbuf = &av7110->ci_rbuffer;
-+ struct dvb_ringbuffer *wbuf = &av7110->ci_wbuffer;
-+ unsigned int mask = 0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ poll_wait (file, &rbuf->queue, wait);
-+
-+ if (!dvb_ringbuffer_empty(rbuf))
-+ mask |= POLLIN;
-+
-+ if (dvb_ringbuffer_avail(wbuf)>1024)
-+ mask |= POLLOUT;
-+
-+ return mask;
-+}
-+
-+static int dvb_ca_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, void *parg)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+ unsigned long arg=(unsigned long) parg;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ switch (cmd) {
-+ case CA_RESET:
-+#ifdef NEW_CI
-+
-+ return ci_ll_reset(&av7110->ci_wbuffer, file, arg, &av7110->ci_slot[0]);
-+#endif
-+ break;
-+
-+ case CA_GET_CAP:
-+ {
-+ ca_caps_t cap;
-+
-+ cap.slot_num=2;
-+#ifdef NEW_CI
-+ cap.slot_type=(FW_CI_LL_SUPPORT(av7110->arm_app) ? CA_CI_LINK : CA_CI) | CA_DESCR;
-+#else
-+ cap.slot_type=CA_CI|CA_DESCR;
-+#endif
-+ cap.descr_num=16;
-+ cap.descr_type=CA_ECD;
-+ memcpy(parg, &cap, sizeof(cap));
-+ }
-+ break;
-+
-+ case CA_GET_SLOT_INFO:
-+ {
-+ ca_slot_info_t *info=(ca_slot_info_t *)parg;
-+
-+ if (info->num>1)
-+ return -EINVAL;
-+ av7110->ci_slot[info->num].num = info->num;
-+#ifdef NEW_CI
-+ av7110->ci_slot[info->num].type = FW_CI_LL_SUPPORT(av7110->arm_app) ? CA_CI_LINK : CA_CI;
-+#else
-+ av7110->ci_slot[info->num].type = CA_CI;
-+#endif
-+ memcpy(info, &av7110->ci_slot[info->num], sizeof(ca_slot_info_t));
-+ }
-+ break;
-+
-+ case CA_GET_MSG:
-+ break;
-+
-+ case CA_SEND_MSG:
-+ break;
-+
-+ case CA_GET_DESCR_INFO:
-+ {
-+ ca_descr_info_t info;
-+
-+ info.num=16;
-+ info.type=CA_ECD;
-+ memcpy (parg, &info, sizeof (info));
-+ }
-+ break;
-+
-+ case CA_SET_DESCR:
-+ {
-+ ca_descr_t *descr=(ca_descr_t*) parg;
-+
-+ if (descr->index>=16)
-+ return -EINVAL;
-+ if (descr->parity>1)
-+ return -EINVAL;
-+ outcom(av7110, COMTYPE_PIDFILTER, SetDescr, 5,
-+ (descr->index<<8)|descr->parity,
-+ (descr->cw[0]<<8)|descr->cw[1],
-+ (descr->cw[2]<<8)|descr->cw[3],
-+ (descr->cw[4]<<8)|descr->cw[5],
-+ (descr->cw[6]<<8)|descr->cw[7]);
-+ }
-+ break;
-+
-+ default:
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+static ssize_t dvb_ca_write(struct file *file, const char *buf,
-+ size_t count, loff_t *ppos)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+ return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos);
-+}
-+
-+static ssize_t dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+ return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos);
-+}
-+
-+
-+
-+/******************************************************************************
-+ * Video MPEG decoder events
-+ ******************************************************************************/
-+static void dvb_video_add_event (struct av7110 *av7110, struct video_event *event)
-+{
-+ struct dvb_video_events *events = &av7110->video_events;
-+ int wp;
-+
-+ DEB_D(("\n"));
-+
-+ spin_lock_bh(&events->lock);
-+
-+ wp = (events->eventw + 1) % MAX_VIDEO_EVENT;
-+
-+ if (wp == events->eventr) {
-+ events->overflow = 1;
-+ events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT;
-+ }
-+
-+ //FIXME: timestamp?
-+ memcpy(&events->events[events->eventw], event, sizeof(struct video_event));
-+
-+ events->eventw = wp;
-+
-+ spin_unlock_bh(&events->lock);
-+
-+ wake_up_interruptible (&events->wait_queue);
-+}
-+
-+
-+static int dvb_video_get_event (struct av7110 *av7110, struct video_event *event, int flags)
-+{
-+ struct dvb_video_events *events = &av7110->video_events;
-+
-+ DEB_D(("\n"));
-+
-+ if (events->overflow) {
-+ events->overflow = 0;
-+ return -EOVERFLOW;
-+ }
-+
-+ if (events->eventw == events->eventr) {
-+ int ret;
-+
-+ if (flags & O_NONBLOCK)
-+ return -EWOULDBLOCK;
-+
-+ ret = wait_event_interruptible (events->wait_queue,
-+ events->eventw != events->eventr);
-+ if (ret < 0)
-+ return ret;
-+ }
-+
-+ spin_lock_bh(&events->lock);
-+
-+ memcpy (event, &events->events[events->eventr],
-+ sizeof(struct video_event));
-+
-+ events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT;
-+
-+ spin_unlock_bh(&events->lock);
-+
-+ return 0;
-+}
-+
-+
-+/******************************************************************************
-+ * DVB device file operations
-+ ******************************************************************************/
-+
-+static unsigned int dvb_video_poll(struct file *file, poll_table *wait)
-+{
-+ struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
-+ struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
-+ unsigned int mask = 0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
-+ poll_wait(file, &av7110->avout.queue, wait);
-+ }
-+
-+ poll_wait(file, &av7110->video_events.wait_queue, wait);
-+
-+ if (av7110->video_events.eventw != av7110->video_events.eventr)
-+ mask = POLLPRI;
-+
-+ if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
-+ if (av7110->playing) {
-+ if (FREE_COND)
-+ mask |= (POLLOUT | POLLWRNORM);
-+ } else /* if not playing: may play if asked for */
-+ mask |= (POLLOUT | POLLWRNORM);
-+ }
-+
-+ return mask;
-+}
-+
-+static ssize_t dvb_video_write(struct file *file, const char *buf,
-+ size_t count, loff_t *ppos)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
-+ return -EPERM;
-+ }
-+
-+ if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY)
-+ return -EPERM;
-+
-+ return dvb_play(av7110, buf, count, file->f_flags&O_NONBLOCK, 1, 1);
-+}
-+
-+static ssize_t dvb_audio_write(struct file *file, const char *buf,
-+ size_t count, loff_t *ppos)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (av7110->audiostate.stream_source!=AUDIO_SOURCE_MEMORY) {
-+ printk(KERN_ERR "not audio source memory\n");
-+ return -EPERM;
-+ }
-+ return dvb_aplay(av7110, buf, count, file->f_flags&O_NONBLOCK, 0);
-+}
-+
-+u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 };
-+
-+#define MIN_IFRAME 400000
-+
-+static int play_iframe(struct av7110 *av7110, u8 *buf, unsigned int len, int nonblock)
-+{
-+ int i, n=1;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!(av7110->playing&RP_VIDEO)) {
-+ if (AV_StartPlay(av7110, RP_VIDEO) < 0)
-+ return -EBUSY;
-+ n=MIN_IFRAME/len+1;
-+ }
-+
-+ /* setting n always > 1, fixes problems when playing stillframes
-+ consisting of I- and P-Frames */
-+ n=MIN_IFRAME/len+1;
-+
-+ /* FIXME: nonblock? */
-+ dvb_play(av7110, iframe_header, sizeof(iframe_header), 0, 1, 0);
-+
-+ for (i=0; i<n; i++)
-+ dvb_play(av7110, buf, len, 0, 1, 1);
-+
-+ av7110_ipack_flush(&av7110->ipack[1]);
-+ return 0;
-+}
-+
-+
-+static int dvb_video_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, void *parg)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+ unsigned long arg=(unsigned long) parg;
-+ int ret=0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if ((file->f_flags&O_ACCMODE)==O_RDONLY) {
-+ if ( cmd!=VIDEO_GET_STATUS && cmd!=VIDEO_GET_EVENT &&
-+ cmd!=VIDEO_GET_SIZE ) {
-+ return -EPERM;
-+ }
-+ }
-+
-+ switch (cmd) {
-+ case VIDEO_STOP:
-+ av7110->videostate.play_state=VIDEO_STOPPED;
-+ if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY)
-+ AV_Stop(av7110, RP_VIDEO);
-+ else
-+ vidcom(av7110, 0x000e,
-+ av7110->videostate.video_blank ? 0 : 1);
-+ av7110->trickmode=TRICK_NONE;
-+ break;
-+
-+ case VIDEO_PLAY:
-+ av7110->trickmode=TRICK_NONE;
-+ if (av7110->videostate.play_state==VIDEO_FREEZED) {
-+ av7110->videostate.play_state=VIDEO_PLAYING;
-+ vidcom(av7110, 0x000d, 0);
-+ }
-+
-+ if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) {
-+ if (av7110->playing==RP_AV) {
-+ outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-+ av7110->playing&=~RP_VIDEO;
-+ }
-+ AV_StartPlay(av7110,RP_VIDEO);
-+ vidcom(av7110, 0x000d, 0);
-+ } else {
-+ //AV_Stop(av7110, RP_VIDEO);
-+ vidcom(av7110, 0x000d, 0);
-+ }
-+ av7110->videostate.play_state=VIDEO_PLAYING;
-+ break;
-+
-+ case VIDEO_FREEZE:
-+ av7110->videostate.play_state=VIDEO_FREEZED;
-+ if (av7110->playing&RP_VIDEO)
-+ outcom(av7110, COMTYPE_REC_PLAY, __Pause, 0);
-+ else
-+ vidcom(av7110, 0x0102, 1);
-+ av7110->trickmode=TRICK_FREEZE;
-+ break;
-+
-+ case VIDEO_CONTINUE:
-+ if (av7110->playing&RP_VIDEO)
-+ outcom(av7110, COMTYPE_REC_PLAY, __Continue, 0);
-+ vidcom(av7110, 0x000d, 0);
-+ av7110->videostate.play_state=VIDEO_PLAYING;
-+ av7110->trickmode=TRICK_NONE;
-+ break;
-+
-+ case VIDEO_SELECT_SOURCE:
-+ av7110->videostate.stream_source=(video_stream_source_t) arg;
-+ break;
-+
-+ case VIDEO_SET_BLANK:
-+ av7110->videostate.video_blank=(int) arg;
-+ break;
-+
-+ case VIDEO_GET_STATUS:
-+ memcpy(parg, &av7110->videostate, sizeof(struct video_status));
-+ break;
-+
-+ case VIDEO_GET_EVENT:
-+ ret=dvb_video_get_event(av7110, parg, file->f_flags);
-+ break;
-+
-+ case VIDEO_GET_SIZE:
-+ memcpy(parg, &av7110->video_size, sizeof(video_size_t));
-+ break;
-+
-+ case VIDEO_SET_DISPLAY_FORMAT:
-+ {
-+ video_displayformat_t format=(video_displayformat_t) arg;
-+ u16 val=0;
-+
-+ switch(format) {
-+ case VIDEO_PAN_SCAN:
-+ val=VID_PAN_SCAN_PREF;
-+ break;
-+
-+ case VIDEO_LETTER_BOX:
-+ val=VID_VC_AND_PS_PREF;
-+ break;
-+
-+ case VIDEO_CENTER_CUT_OUT:
-+ val=VID_CENTRE_CUT_PREF;
-+ break;
-+
-+ default:
-+ ret=-EINVAL;
-+ break;
-+ }
-+ if (ret<0)
-+ break;
-+ av7110->videostate.video_format=format;
-+ ret=outcom(av7110, COMTYPE_ENCODER, SetPanScanType,
-+ 1, (u16) val);
-+ break;
-+ }
-+
-+ case VIDEO_SET_FORMAT:
-+ if (arg>1) {
-+ ret=-EINVAL;
-+ break;
-+ }
-+ av7110->display_ar=arg;
-+ ret=outcom(av7110, COMTYPE_ENCODER, SetMonitorType,
-+ 1, (u16) arg);
-+ break;
-+
-+ case VIDEO_STILLPICTURE:
-+ {
-+ struct video_still_picture *pic=
-+ (struct video_still_picture *) parg;
-+ av7110->videostate.stream_source = VIDEO_SOURCE_MEMORY;
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
-+ ret = play_iframe(av7110, pic->iFrame, pic->size,
-+ file->f_flags&O_NONBLOCK);
-+ break;
-+ }
-+
-+ case VIDEO_FAST_FORWARD:
-+ //note: arg is ignored by firmware
-+ if (av7110->playing&RP_VIDEO)
-+ outcom(av7110, COMTYPE_REC_PLAY,
-+ __Scan_I, 2, AV_PES, 0);
-+ else
-+ vidcom(av7110, 0x16, arg);
-+ av7110->trickmode=TRICK_FAST;
-+ av7110->videostate.play_state=VIDEO_PLAYING;
-+ break;
-+
-+ case VIDEO_SLOWMOTION:
-+ if (av7110->playing&RP_VIDEO) {
-+ outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0);
-+ vidcom(av7110, 0x22, arg);
-+ } else {
-+ vidcom(av7110, 0x0d, 0);
-+ vidcom(av7110, 0x0e, 0);
-+ vidcom(av7110, 0x22, arg);
-+ }
-+ av7110->trickmode=TRICK_SLOW;
-+ av7110->videostate.play_state=VIDEO_PLAYING;
-+ break;
-+
-+ case VIDEO_GET_CAPABILITIES:
-+ *(int *)parg=VIDEO_CAP_MPEG1|
-+ VIDEO_CAP_MPEG2|
-+ VIDEO_CAP_SYS|
-+ VIDEO_CAP_PROG;
-+ break;
-+
-+ case VIDEO_CLEAR_BUFFER:
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
-+ av7110_ipack_reset(&av7110->ipack[1]);
-+
-+ if (av7110->playing==RP_AV) {
-+ outcom(av7110, COMTYPE_REC_PLAY,
-+ __Play, 2, AV_PES, 0);
-+ if (av7110->trickmode==TRICK_FAST)
-+ outcom(av7110, COMTYPE_REC_PLAY,
-+ __Scan_I, 2, AV_PES, 0);
-+ if (av7110->trickmode==TRICK_SLOW) {
-+ outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0);
-+ vidcom(av7110, 0x22, arg);
-+ }
-+ if (av7110->trickmode==TRICK_FREEZE)
-+ vidcom(av7110, 0x000e, 1);
-+ }
-+ break;
-+
-+ case VIDEO_SET_STREAMTYPE:
-+
-+ break;
-+
-+ default:
-+ ret=-ENOIOCTLCMD;
-+ break;
-+ }
-+ return ret;
-+}
-+
-+static int dvb_audio_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, void *parg)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+ unsigned long arg=(unsigned long) parg;
-+ int ret=0;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
-+ (cmd!=AUDIO_GET_STATUS))
-+ return -EPERM;
-+
-+ switch (cmd) {
-+ case AUDIO_STOP:
-+ if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
-+ AV_Stop(av7110, RP_AUDIO);
-+ else
-+ audcom(av7110, 1);
-+ av7110->audiostate.play_state=AUDIO_STOPPED;
-+ break;
-+
-+ case AUDIO_PLAY:
-+ if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
-+ AV_StartPlay(av7110, RP_AUDIO);
-+ audcom(av7110, 2);
-+ av7110->audiostate.play_state=AUDIO_PLAYING;
-+ break;
-+
-+ case AUDIO_PAUSE:
-+ audcom(av7110, 1);
-+ av7110->audiostate.play_state=AUDIO_PAUSED;
-+ break;
-+
-+ case AUDIO_CONTINUE:
-+ if (av7110->audiostate.play_state==AUDIO_PAUSED) {
-+ av7110->audiostate.play_state=AUDIO_PLAYING;
-+ audcom(av7110, 0x12);
-+ }
-+ break;
-+
-+ case AUDIO_SELECT_SOURCE:
-+ av7110->audiostate.stream_source=(audio_stream_source_t) arg;
-+ break;
-+
-+ case AUDIO_SET_MUTE:
-+ {
-+ audcom(av7110, arg ? 1 : 2);
-+ av7110->audiostate.mute_state=(int) arg;
-+ break;
-+ }
-+
-+ case AUDIO_SET_AV_SYNC:
-+ av7110->audiostate.AV_sync_state=(int) arg;
-+ audcom(av7110, arg ? 0x0f : 0x0e);
-+ break;
-+
-+ case AUDIO_SET_BYPASS_MODE:
-+ ret=-EINVAL;
-+ break;
-+
-+ case AUDIO_CHANNEL_SELECT:
-+ av7110->audiostate.channel_select=(audio_channel_select_t) arg;
-+
-+ switch(av7110->audiostate.channel_select) {
-+ case AUDIO_STEREO:
-+ audcom(av7110, 0x80);
-+ break;
-+
-+ case AUDIO_MONO_LEFT:
-+ audcom(av7110, 0x100);
-+ break;
-+
-+ case AUDIO_MONO_RIGHT:
-+ audcom(av7110, 0x200);
-+ break;
-+
-+ default:
-+ ret=-EINVAL;
-+ break;
-+ }
-+ break;
-+
-+ case AUDIO_GET_STATUS:
-+ memcpy(parg, &av7110->audiostate, sizeof(struct audio_status));
-+ break;
-+
-+ case AUDIO_GET_CAPABILITIES:
-+ *(int *)parg=AUDIO_CAP_LPCM|
-+ AUDIO_CAP_MP1|
-+ AUDIO_CAP_MP2;
-+ break;
-+
-+ case AUDIO_CLEAR_BUFFER:
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
-+ av7110_ipack_reset(&av7110->ipack[0]);
-+ if (av7110->playing==RP_AV)
-+ outcom(av7110, COMTYPE_REC_PLAY,
-+ __Play, 2, AV_PES, 0);
-+ break;
-+ case AUDIO_SET_ID:
-+
-+ break;
-+ case AUDIO_SET_MIXER:
-+ {
-+ struct audio_mixer *amix=(struct audio_mixer *)parg;
-+
-+ SetVolume(av7110, amix->volume_left, amix->volume_right);
-+ break;
-+ }
-+ case AUDIO_SET_STREAMTYPE:
-+ break;
-+ default:
-+ ret=-ENOIOCTLCMD;
-+ break;
-+ }
-+ return ret;
-+}
-+
-+
-+static int dvb_video_open(struct inode *inode, struct file *file)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+ int err;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if ((err=dvb_generic_open(inode, file))<0)
-+ return err;
-+
-+ if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
-+ av7110->video_blank=1;
-+ av7110->audiostate.AV_sync_state=1;
-+ av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX;
-+
-+ /* empty event queue */
-+ av7110->video_events.eventr = av7110->video_events.eventw = 0;
-+ }
-+
-+ return 0;
-+}
-+
-+static int dvb_video_release(struct inode *inode, struct file *file)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
-+ AV_Stop(av7110, RP_VIDEO);
-+ }
-+
-+ return dvb_generic_release(inode, file);
-+}
-+
-+static int dvb_audio_open(struct inode *inode, struct file *file)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+ int err=dvb_generic_open(inode, file);
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (err<0)
-+ return err;
-+ dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
-+ av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX;
-+ return 0;
-+}
-+
-+static int dvb_audio_release(struct inode *inode, struct file *file)
-+{
-+ struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-+ struct av7110 *av7110=(struct av7110 *) dvbdev->priv;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ AV_Stop(av7110, RP_AUDIO);
-+ return dvb_generic_release(inode, file);
-+}
-+
-+
-+
-+/******************************************************************************
-+ * driver registration
-+ ******************************************************************************/
-+
-+static struct file_operations dvb_video_fops = {
-+ .owner = THIS_MODULE,
-+ .write = dvb_video_write,
-+ .ioctl = dvb_generic_ioctl,
-+ .open = dvb_video_open,
-+ .release = dvb_video_release,
-+ .poll = dvb_video_poll,
-+};
-+
-+static struct dvb_device dvbdev_video = {
-+ .priv = 0,
-+ .users = 6,
-+ .readers = 5, /* arbitrary */
-+ .writers = 1,
-+ .fops = &dvb_video_fops,
-+ .kernel_ioctl = dvb_video_ioctl,
-+};
-+
-+static struct file_operations dvb_audio_fops = {
-+ .owner = THIS_MODULE,
-+ .write = dvb_audio_write,
-+ .ioctl = dvb_generic_ioctl,
-+ .open = dvb_audio_open,
-+ .release = dvb_audio_release,
-+ .poll = dvb_audio_poll,
-+};
-+
-+static struct dvb_device dvbdev_audio = {
-+ .priv = 0,
-+ .users = 1,
-+ .writers = 1,
-+ .fops = &dvb_audio_fops,
-+ .kernel_ioctl = dvb_audio_ioctl,
-+};
-+
-+static struct file_operations dvb_ca_fops = {
-+ .owner = THIS_MODULE,
-+ .read = dvb_ca_read,
-+ .write = dvb_ca_write,
-+ .ioctl = dvb_generic_ioctl,
-+ .open = dvb_ca_open,
-+ .release = dvb_generic_release,
-+ .poll = dvb_ca_poll,
-+};
-+
-+static struct dvb_device dvbdev_ca = {
-+ .priv = 0,
-+ .users = 1,
-+ .writers = 1,
-+ .fops = &dvb_ca_fops,
-+ .kernel_ioctl = dvb_ca_ioctl,
-+};
-+
-+
-+static void av7110_before_after_tune (fe_status_t s, void *data)
-+{
-+ struct av7110 *av7110 = data;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ av7110->fe_synced = (s & FE_HAS_LOCK) ? 1 : 0;
-+
-+ if (av7110->playing)
-+ return;
-+
-+ if (down_interruptible(&av7110->pid_mutex))
-+ return;
-+
-+ if (av7110->fe_synced) {
-+ SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO],
-+ av7110->pids[DMX_PES_AUDIO],
-+ av7110->pids[DMX_PES_TELETEXT], 0,
-+ av7110->pids[DMX_PES_PCR]);
-+ outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-+ } else {
-+ SetPIDs(av7110, 0, 0, 0, 0, 0);
-+ outcom(av7110, COMTYPE_PIDFILTER, FlushTSQueue, 0);
-+ }
-+
-+ up(&av7110->pid_mutex);
-+}
-+
-+
-+static int av7110_register(struct av7110 *av7110)
-+{
-+ int ret, i;
-+ struct dvb_demux *dvbdemux=&av7110->demux;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (av7110->registered)
-+ return -1;
-+
-+ av7110->registered=1;
-+
-+ dvb_add_frontend_notifier (av7110->dvb_adapter,
-+ av7110_before_after_tune, av7110);
-+
-+ /**
-+ * init DiSEqC stuff
-+ */
-+ dvb_add_frontend_ioctls (av7110->dvb_adapter,
-+ av7110_diseqc_ioctl, NULL, av7110);
-+
-+ av7110->audiostate.AV_sync_state=0;
-+ av7110->audiostate.mute_state=0;
-+ av7110->audiostate.play_state=AUDIO_STOPPED;
-+ av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX;
-+ av7110->audiostate.channel_select=AUDIO_STEREO;
-+ av7110->audiostate.bypass_mode=0;
-+
-+ av7110->videostate.video_blank=0;
-+ av7110->videostate.play_state=VIDEO_STOPPED;
-+ av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX;
-+ av7110->videostate.video_format=VIDEO_FORMAT_4_3;
-+ av7110->videostate.display_format=VIDEO_CENTER_CUT_OUT;
-+ av7110->display_ar=VIDEO_FORMAT_4_3;
-+
-+ dvbdemux->priv = (void *) av7110;
-+
-+ for (i=0; i<32; i++)
-+ av7110->handle2filter[i]=NULL;
-+
-+ dvbdemux->filternum = 32;
-+ dvbdemux->feednum = 32;
-+ dvbdemux->start_feed = av7110_start_feed;
-+ dvbdemux->stop_feed = av7110_stop_feed;
-+ dvbdemux->write_to_decoder = av7110_write_to_decoder;
-+ dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
-+ DMX_MEMORY_BASED_FILTERING);
-+
-+ dvb_dmx_init(&av7110->demux);
-+ av7110->demux.dmx.get_stc = dvb_get_stc;
-+
-+ av7110->dmxdev.filternum = 32;
-+ av7110->dmxdev.demux = &dvbdemux->dmx;
-+ av7110->dmxdev.capabilities = 0;
-+
-+ dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
-+
-+ av7110->hw_frontend.source = DMX_FRONTEND_0;
-+
-+ ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
-+
-+ if (ret < 0)
-+ return ret;
-+
-+ av7110->mem_frontend.source = DMX_MEMORY_FE;
-+
-+ ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
-+
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx,
-+ &av7110->hw_frontend);
-+ if (ret < 0)
-+ return ret;
-+
-+ init_waitqueue_head(&av7110->video_events.wait_queue);
-+ spin_lock_init(&av7110->video_events.lock);
-+ av7110->video_events.eventw = av7110->video_events.eventr = 0;
-+ av7110->video_events.overflow = 0;
-+ memset(&av7110->video_size, 0, sizeof (video_size_t));
-+
-+ dvb_register_device(av7110->dvb_adapter, &av7110->video_dev,
-+ &dvbdev_video, av7110, DVB_DEVICE_VIDEO);
-+
-+ dvb_register_device(av7110->dvb_adapter, &av7110->audio_dev,
-+ &dvbdev_audio, av7110, DVB_DEVICE_AUDIO);
-+
-+ dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev,
-+ &dvbdev_ca, av7110, DVB_DEVICE_CA);
-+#ifdef CONFIG_DVB_AV7110_OSD
-+ dvb_register_device(av7110->dvb_adapter, &av7110->osd_dev,
-+ &dvbdev_osd, av7110, DVB_DEVICE_OSD);
-+#endif
-+#ifdef USE_DVB_DSP
-+ dvb->dsp_dev = dvb_register_dsp(dvb_audio_open,
-+ dvb_audio_release,
-+ dvb_audio_ioctl,
-+ dvb_audio_write,
-+ av7110->audio_dev);
-+#endif
-+// }
-+
-+ dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
-+
-+ return 0;
-+}
-+
-+
-+static void dvb_unregister(struct av7110 *av7110)
-+{
-+ struct dvb_demux *dvbdemux=&av7110->demux;
-+
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ if (!av7110->registered)
-+ return;
-+
-+ dvb_net_release(&av7110->dvb_net);
-+
-+ dvbdemux->dmx.close(&dvbdemux->dmx);
-+ dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
-+ dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
-+
-+ dvb_dmxdev_release(&av7110->dmxdev);
-+ dvb_dmx_release(&av7110->demux);
-+
-+ dvb_remove_frontend_notifier (av7110->dvb_adapter,
-+ av7110_before_after_tune);
-+
-+ dvb_remove_frontend_ioctls (av7110->dvb_adapter,
-+ av7110_diseqc_ioctl, NULL);
-+
-+ dvb_unregister_device(av7110->audio_dev);
-+ dvb_unregister_device(av7110->video_dev);
-+ dvb_unregister_device(av7110->osd_dev);
-+ dvb_unregister_device(av7110->ca_dev);
-+#ifdef USE_DVB_DSP
-+ dvb_unregister_dsp(av7110->dsp_dev);
-+#endif
-+// }
-+}
-+
-+static int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], int num)
-+{
-+ struct saa7146_dev *dev = i2c->data;
-+ return saa7146_i2c_transfer(dev, msgs, num, 6);
-+}
-+
-+/****************************************************************************
-+ * INITIALIZATION
-+ ****************************************************************************/
-+
-+struct saa7146_extension_ioctls ioctls[] = {
-+ { VIDIOC_ENUMINPUT, SAA7146_EXCLUSIVE },
-+ { VIDIOC_G_INPUT, SAA7146_EXCLUSIVE },
-+ { VIDIOC_S_INPUT, SAA7146_EXCLUSIVE },
-+ { VIDIOC_G_FREQUENCY, SAA7146_EXCLUSIVE },
-+ { VIDIOC_S_FREQUENCY, SAA7146_EXCLUSIVE },
-+ { VIDIOC_G_TUNER, SAA7146_EXCLUSIVE },
-+ { VIDIOC_S_TUNER, SAA7146_EXCLUSIVE },
-+ { VIDIOC_G_AUDIO, SAA7146_EXCLUSIVE },
-+ { VIDIOC_S_AUDIO, SAA7146_EXCLUSIVE },
-+ { 0, 0 }
-+};
-+
-+static u8 saa7113_init_regs[] = {
-+ 0x02, 0xd0,
-+ 0x03, 0x23,
-+ 0x04, 0x00,
-+ 0x05, 0x00,
-+ 0x06, 0xe9,
-+ 0x07, 0x0d,
-+ 0x08, 0x98,
-+ 0x09, 0x02,
-+ 0x0a, 0x80,
-+ 0x0b, 0x40,
-+ 0x0c, 0x40,
-+ 0x0d, 0x00,
-+ 0x0e, 0x01,
-+ 0x0f, 0x7c,
-+ 0x10, 0x48,
-+ 0x11, 0x0c,
-+ 0x12, 0x8b,
-+ 0x13, 0x1a,
-+ 0x14, 0x00,
-+ 0x15, 0x00,
-+ 0x16, 0x00,
-+ 0x17, 0x00,
-+ 0x18, 0x00,
-+ 0x19, 0x00,
-+ 0x1a, 0x00,
-+ 0x1b, 0x00,
-+ 0x1c, 0x00,
-+ 0x1d, 0x00,
-+ 0x1e, 0x00,
-+
-+ 0x41, 0x77,
-+ 0x42, 0x77,
-+ 0x43, 0x77,
-+ 0x44, 0x77,
-+ 0x45, 0x77,
-+ 0x46, 0x77,
-+ 0x47, 0x77,
-+ 0x48, 0x77,
-+ 0x49, 0x77,
-+ 0x4a, 0x77,
-+ 0x4b, 0x77,
-+ 0x4c, 0x77,
-+ 0x4d, 0x77,
-+ 0x4e, 0x77,
-+ 0x4f, 0x77,
-+ 0x50, 0x77,
-+ 0x51, 0x77,
-+ 0x52, 0x77,
-+ 0x53, 0x77,
-+ 0x54, 0x77,
-+ 0x55, 0x77,
-+ 0x56, 0x77,
-+ 0x57, 0xff,
-+
-+ 0xff
-+};
-+
-+
-+static struct saa7146_ext_vv av7110_vv_data_st;
-+static struct saa7146_ext_vv av7110_vv_data_c;
-+
-+static int av7110_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext)
-+{
-+ struct av7110 *av7110 = NULL;
-+ int ret = 0;
-+
-+ if (!(av7110 = kmalloc (sizeof (struct av7110), GFP_KERNEL))) {
-+ printk ("%s: out of memory!\n", __FUNCTION__);
-+ return -ENOMEM;
-+ }
-+
-+ memset(av7110, 0, sizeof(struct av7110));
-+
-+ av7110->card_name = (char*)pci_ext->ext_priv;
-+ (struct av7110*)dev->ext_priv = av7110;
-+
-+ DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
-+
-+ av7110->dev=(struct saa7146_dev *)dev;
-+ dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name);
-+
-+ /* the Siemens DVB needs this if you want to have the i2c chips
-+ get recognized before the main driver is fully loaded */
-+ saa7146_write(dev, GPIO_CTRL, 0x500000);
-+
-+ saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */
-+
-+ av7110->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
-+ av7110->dvb_adapter, 0);
-+
-+ if (!av7110->i2c_bus) {
-+ dvb_unregister_adapter (av7110->dvb_adapter);
-+ kfree(av7110);
-+ return -ENOMEM;
-+ }
-+
-+ ttpci_eeprom_parse_mac(av7110->i2c_bus);
-+
-+ saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
-+ saa7146_write(dev, BCS_CTRL, 0x80400040);
-+
-+ /* set dd1 stream a & b */
-+ saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-+ saa7146_write(dev, DD1_INIT, 0x03000000);
-+ saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-+
-+ /* upload all */
-+ saa7146_write(dev, MC2, 0x077c077c);
-+ saa7146_write(dev, GPIO_CTRL, 0x000000);
-+
-+ tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
-+ tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
-+
-+ sema_init(&av7110->pid_mutex, 1);
-+
-+ /* locks for data transfers from/to AV7110 */
-+ spin_lock_init (&av7110->debilock);
-+ sema_init(&av7110->dcomlock, 1);
-+ av7110->debilock=SPIN_LOCK_UNLOCKED;
-+ av7110->debitype=-1;
-+
-+ /* default OSD window */
-+ av7110->osdwin=1;
-+
-+ /* ARM "watchdog" */
-+ init_waitqueue_head(&av7110->arm_wait);
-+ av7110->arm_thread=0;
-+
-+ av7110->vidmode=VIDEO_MODE_PAL;
-+
-+ av7110_ipack_init(&av7110->ipack[0], IPACKS, play_audio_cb);
-+ av7110->ipack[0].data=(void *) av7110;
-+ av7110_ipack_init(&av7110->ipack[1], IPACKS, play_video_cb);
-+ av7110->ipack[1].data=(void *) av7110;
-+
-+
-+ /* allocate and init buffers */
-+ av7110->debi_virt = pci_alloc_consistent(dev->pci, 8192,
-+ &av7110->debi_bus);
-+ if (!av7110->debi_virt) {
-+ ret = -ENOMEM;
-+ goto err;
-+ }
-+
-+ av7110->iobuf = vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS);
-+ if (!av7110->iobuf) {
-+ ret = -ENOMEM;
-+ goto err;
-+ }
-+
-+ dvb_ringbuffer_init(&av7110->avout, av7110->iobuf, AVOUTLEN);
-+ dvb_ringbuffer_init(&av7110->aout, av7110->iobuf+AVOUTLEN, AOUTLEN);
-+
-+ /* init BMP buffer */
-+ av7110->bmpbuf=av7110->iobuf+AVOUTLEN+AOUTLEN;
-+ init_waitqueue_head(&av7110->bmpq);
-+
-+ av7110->kbuf[0]=(u8 *)(av7110->iobuf+AVOUTLEN+AOUTLEN+BMPLEN);
-+ av7110->kbuf[1]=av7110->kbuf[0]+2*IPACKS;
-+
-+ /* CI link layer buffers */
-+ ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192);
-+
-+ /* handle different card types */
-+
-+ /* load firmware into AV7110 cards */
-+
-+ bootarm(av7110);
-+ firmversion(av7110);
-+
-+ if (FW_VERSION(av7110->arm_app)<0x2501)
-+ printk ("av7110: Warning, firmware version 0x%04x is too old. "
-+ "System might be unstable!\n", FW_VERSION(av7110->arm_app));
-+
-+ kernel_thread(arm_thread, (void *) av7110, 0);
-+
-+ /* set internal volume control to maximum */
-+ av7110->adac_type = DVB_ADAC_TI;
-+ SetVolume(av7110, 0xff, 0xff);
-+
-+ VidMode(av7110, vidmode);
-+
-+ /* remaining inits according to card and frontend type */
-+ av7110->has_analog_tuner = 0;
-+ av7110->current_input = 0;
-+ if (i2c_writereg(av7110, 0x20, 0x00, 0x00)==1) {
-+ printk ("av7110(%d): Crystal audio DAC detected\n",
-+ av7110->dvb_adapter->num);
-+ av7110->adac_type = DVB_ADAC_CRYSTAL;
-+ i2c_writereg(av7110, 0x20, 0x01, 0xd2);
-+ i2c_writereg(av7110, 0x20, 0x02, 0x49);
-+ i2c_writereg(av7110, 0x20, 0x03, 0x00);
-+ i2c_writereg(av7110, 0x20, 0x04, 0x00);
-+
-+ /**
-+ * some special handling for the Siemens DVB-C cards...
-+ */
-+ } else if (i2c_writereg(av7110, 0x80, 0x0, 0x80) == 1
-+ && i2c_writereg(av7110, 0x80, 0x0, 0) == 1) {
-+ u16 version1, version2;
-+ printk ("av7110(%d): DVB-C analog module detected, "
-+ "initializing MSP3400\n",
-+ av7110->dvb_adapter->num);
-+ av7110->adac_type = DVB_ADAC_MSP;
-+ dvb_delay(100); // the probing above resets the msp...
-+ msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1);
-+ msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2);
-+ printk("av7110(%d): MSP3400 version 0x%04x 0x%04x\n",
-+ av7110->dvb_adapter->num, version1, version2);
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00);
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
-+ msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
-+ msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x4800); // prescale SCART
-+
-+ if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
-+ INFO(("saa7113 not accessible.\n"));
-+ }
-+ else {
-+ u8 *i = saa7113_init_regs;
-+ av7110->has_analog_tuner = 1;
-+ /* init the saa7113 */
-+ while (*i != 0xff) {
-+ if (i2c_writereg(av7110, 0x48, i[0], i[1]) != 1) {
-+ printk("av7110(%d): saa7113 initialization failed",
-+ av7110->dvb_adapter->num);
-+ break;
-+ }
-+ i += 2;
-+ }
-+ /* setup msp for analog sound: B/G Dual-FM */
-+ msp_writereg(av7110, MSP_WR_DEM, 0x00bb, 0x02d0); // AD_CV
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0001, 3); // FIR1
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0001, 18); // FIR1
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0001, 27); // FIR1
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0001, 48); // FIR1
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0001, 66); // FIR1
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0001, 72); // FIR1
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 4); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 64); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 0); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 3); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 18); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 27); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 48); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 66); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0005, 72); // FIR2
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0083, 0xa000); // MODE_REG
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0093, 0x00aa); // DCO1_LO 5.74MHz
-+ msp_writereg(av7110, MSP_WR_DEM, 0x009b, 0x04fc); // DCO1_HI
-+ msp_writereg(av7110, MSP_WR_DEM, 0x00a3, 0x038e); // DCO2_LO 5.5MHz
-+ msp_writereg(av7110, MSP_WR_DEM, 0x00ab, 0x04c6); // DCO2_HI
-+ msp_writereg(av7110, MSP_WR_DEM, 0x0056, 0); // LOAD_REG 1/2
-+ }
-+
-+ memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2);
-+ /* set dd1 stream a & b */
-+ saa7146_write(dev, DD1_STREAM_B, 0x00000000);
-+ saa7146_write(dev, DD1_INIT, 0x03000700);
-+ saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-+ }
-+ else if (dev->pci->subsystem_vendor == 0x110a) {
-+ printk("av7110(%d): DVB-C w/o analog module detected\n",
-+ av7110->dvb_adapter->num);
-+ av7110->adac_type = DVB_ADAC_NONE;
-+ }
-+ else {
-+ av7110->adac_type = adac;
-+ printk("av7110(%d): adac type set to %d\n",
-+ av7110->dvb_adapter->num, av7110->adac_type);
-+ }
-+
-+ if (av7110->adac_type == DVB_ADAC_NONE || av7110->adac_type == DVB_ADAC_MSP) {
-+ // switch DVB SCART on
-+ outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
-+ outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
-+ if (rgb_on)
-+ saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
-+ //saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
-+ }
-+
-+ SetVolume(av7110, 0xff, 0xff);
-+
-+ av7110_setup_irc_config (av7110, 0);
-+ av7110_register(av7110);
-+
-+ /* special case DVB-C: these cards have an analog tuner
-+ plus need some special handling, so we have separate
-+ saa7146_ext_vv data for these... */
-+ if (0 != av7110->has_analog_tuner) {
-+ ret = saa7146_vv_init(dev, &av7110_vv_data_c);
-+ } else {
-+ ret = saa7146_vv_init(dev, &av7110_vv_data_st);
-+ }
-+
-+ if ( 0 != ret) {
-+ ERR(("cannot init capture device. skipping.\n"));
-+ ret = -ENODEV;
-+ goto err;
-+ }
-+
-+ if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_GRABBER)) {
-+ ERR(("cannot register capture device. skipping.\n"));
-+ ret = -ENODEV;
-+ goto video_err;
-+ }
-+
-+ if (0 != av7110->has_analog_tuner) {
-+ if( 0 != saa7146_register_device(&av7110->vbi_dev, dev, "av7110", VFL_TYPE_VBI)) {
-+ ERR(("cannot register vbi v4l2 device. skipping.\n"));
-+ }
-+ /* we use this to remember that this dvb-c card cannot do vbi */
-+ av7110->has_analog_tuner = 2;
-+ }
-+
-+ printk(KERN_INFO "av7110: found av7110-%d.\n",av7110_num);
-+ av7110_num++;
-+ return 0;
-+
-+video_err:
-+ saa7146_vv_release(dev);
-+
-+err:
-+ if (NULL != av7110 ) {
-+ kfree(av7110);
-+ }
-+ if (NULL != av7110->debi_virt) {
-+ pci_free_consistent(dev->pci, 8192, av7110->debi_virt, av7110->debi_bus);
-+ }
-+ if (NULL != av7110->iobuf) {
-+ vfree(av7110->iobuf);
-+ }
-+
-+ dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter,
-+ av7110->i2c_bus->id);
-+
-+ dvb_unregister_adapter (av7110->dvb_adapter);
-+
-+ return ret;
-+}
-+
-+static int av7110_detach (struct saa7146_dev* saa)
-+{
-+ struct av7110 *av7110 = (struct av7110*)saa->ext_priv;
-+ DEB_EE(("av7110: %p\n",av7110));
-+
-+ saa7146_unregister_device(&av7110->v4l_dev, saa);
-+ if (2 == av7110->has_analog_tuner) {
-+ saa7146_unregister_device(&av7110->vbi_dev, saa);
-+ }
-+
-+ av7110->arm_rmmod=1;
-+ wake_up_interruptible(&av7110->arm_wait);
-+
-+ while (av7110->arm_thread)
-+ dvb_delay(1);
-+
-+ dvb_unregister(av7110);
-+
-+ IER_DISABLE(saa, (MASK_19 | MASK_03));
-+// saa7146_write (av7110->dev, IER,
-+// saa7146_read(av7110->dev, IER) & ~(MASK_19 | MASK_03));
-+
-+ saa7146_write(av7110->dev, ISR,(MASK_19 | MASK_03));
-+
-+ ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
-+ av7110_ipack_free(&av7110->ipack[0]);
-+ av7110_ipack_free(&av7110->ipack[1]);
-+ vfree(av7110->iobuf);
-+ pci_free_consistent(saa->pci, 8192, av7110->debi_virt,
-+ av7110->debi_bus);
-+
-+ dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, av7110->i2c_bus->id);
-+ dvb_unregister_adapter (av7110->dvb_adapter);
-+
-+ kfree (av7110);
-+
-+ saa->ext_priv = NULL;
-+ av7110_num--;
-+
-+ return 0;
-+}
-+
-+
-+static void av7110_irq(struct saa7146_dev* dev, u32 *isr)
-+{
-+ struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
-+
-+// DEB_INT(("dev: %p, av7110: %p\n",dev,av7110));
-+
-+ if (*isr & MASK_19)
-+ tasklet_schedule (&av7110->debi_tasklet);
-+
-+ if (*isr & MASK_03)
-+ tasklet_schedule (&av7110->gpio_tasklet);
-+}
-+
-+
-+/* FIXME: these values are experimental values that look better than the
-+ values from the latest "official" driver -- at least for me... (MiHu) */
-+static struct saa7146_standard standard[] = {
-+ {
-+ .name = "PAL", .id = V4L2_STD_PAL_BG,
-+ .v_offset = 0x15, .v_field = 288, .v_calc = 576,
-+ .h_offset = 0x4a, .h_pixels = 708, .h_calc = 709,
-+ .v_max_out = 576, .h_max_out = 768,
-+ }, {
-+ .name = "NTSC", .id = V4L2_STD_NTSC,
-+ .v_offset = 0x10, .v_field = 244, .v_calc = 480,
-+ .h_offset = 0x40, .h_pixels = 708, .h_calc = 709,
-+ .v_max_out = 480, .h_max_out = 640,
-+ }
-+};
-+
-+static struct saa7146_standard analog_standard[] = {
-+ {
-+ .name = "PAL", .id = V4L2_STD_PAL_BG,
-+ .v_offset = 0x18 /* 0 */ , .v_field = 288, .v_calc = 576,
-+ .h_offset = 0x08, .h_pixels = 708, .h_calc = 709,
-+ .v_max_out = 576, .h_max_out = 768,
-+ }, {
-+ .name = "NTSC", .id = V4L2_STD_NTSC,
-+ .v_offset = 0x10, .v_field = 244, .v_calc = 480,
-+ .h_offset = 0x40, .h_pixels = 708, .h_calc = 709,
-+ .v_max_out = 480, .h_max_out = 640,
-+ }
-+};
-+
-+static struct saa7146_standard dvb_standard[] = {
-+ {
-+ .name = "PAL", .id = V4L2_STD_PAL_BG,
-+ .v_offset = 0x14, .v_field = 288, .v_calc = 576,
-+ .h_offset = 0x4a, .h_pixels = 708, .h_calc = 709,
-+ .v_max_out = 576, .h_max_out = 768,
-+ }, {
-+ .name = "NTSC", .id = V4L2_STD_NTSC,
-+ .v_offset = 0x10, .v_field = 244, .v_calc = 480,
-+ .h_offset = 0x40, .h_pixels = 708, .h_calc = 709,
-+ .v_max_out = 480, .h_max_out = 640,
-+ }
-+};
-+
-+static struct saa7146_extension av7110_extension;
-+
-+#define MAKE_AV7110_INFO(x_var,x_name) \
-+static struct saa7146_pci_extension_data x_var = { \
-+ .ext_priv = x_name, \
-+ .ext = &av7110_extension }
-+
-+MAKE_AV7110_INFO(fs_1_5, "Siemens cable card PCI rev1.5");
-+MAKE_AV7110_INFO(fs_1_3, "Siemens/Technotrend/Hauppauge PCI rev1.3");
-+MAKE_AV7110_INFO(tt_1_6, "Technotrend/Hauppauge PCI rev1.3 or 1.6");
-+MAKE_AV7110_INFO(tt_2_1, "Technotrend/Hauppauge PCI rev2.1");
-+MAKE_AV7110_INFO(tt_t, "Technotrend/Hauppauge PCI DVB-T");
-+MAKE_AV7110_INFO(unkwn0, "Technotrend/Hauppauge PCI rev?(unknown0)?");
-+MAKE_AV7110_INFO(unkwn1, "Technotrend/Hauppauge PCI rev?(unknown1)?");
-+MAKE_AV7110_INFO(unkwn2, "Technotrend/Hauppauge PCI rev?(unknown2)?");
-+MAKE_AV7110_INFO(nexus, "Technotrend/Hauppauge Nexus PCI DVB-S");
-+MAKE_AV7110_INFO(dvboc11,"Octal/Technotrend DVB-C for iTV");
-+
-+static struct pci_device_id pci_tbl[] = {
-+ MAKE_EXTENSION_PCI(fs_1_5, 0x110a, 0xffff),
-+ MAKE_EXTENSION_PCI(fs_1_5, 0x110a, 0x0000),
-+ MAKE_EXTENSION_PCI(fs_1_3, 0x13c2, 0x0000),
-+ MAKE_EXTENSION_PCI(unkwn0, 0x13c2, 0x1002),
-+ MAKE_EXTENSION_PCI(tt_1_6, 0x13c2, 0x0001),
-+ MAKE_EXTENSION_PCI(tt_2_1, 0x13c2, 0x0002),
-+ MAKE_EXTENSION_PCI(tt_2_1, 0x13c2, 0x0003),
-+ MAKE_EXTENSION_PCI(tt_2_1, 0x13c2, 0x0004),
-+ MAKE_EXTENSION_PCI(tt_1_6, 0x13c2, 0x0006),
-+ MAKE_EXTENSION_PCI(tt_t, 0x13c2, 0x0008),
-+ MAKE_EXTENSION_PCI(tt_2_1, 0x13c2, 0x1102),
-+ MAKE_EXTENSION_PCI(unkwn1, 0xffc2, 0x0000),
-+ MAKE_EXTENSION_PCI(unkwn2, 0x00a1, 0x00a1),
-+ MAKE_EXTENSION_PCI(nexus, 0x00a1, 0xa1a0),
-+ MAKE_EXTENSION_PCI(dvboc11,0x13c2, 0x000a),
-+ {
-+ .vendor = 0,
-+ }
-+};
-+
-+MODULE_DEVICE_TABLE(pci, pci_tbl);
-+
-+static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
-+{
-+ struct av7110 *av7110 = (struct av7110*)dev->ext_priv;
-+ if (std->id == V4L2_STD_PAL) {
-+ av7110->vidmode = VIDEO_MODE_PAL;
-+ SetMode(av7110, av7110->vidmode);
-+ }
-+ else if (std->id == V4L2_STD_NTSC) {
-+ av7110->vidmode = VIDEO_MODE_NTSC;
-+ SetMode(av7110, av7110->vidmode);
-+ }
-+ else
-+ return -1;
-+
-+ return 0;
-+}
-+
-+
-+static struct saa7146_ext_vv av7110_vv_data_st = {
-+ .inputs = 1,
-+ .audios = 1,
-+ .capabilities = 0,
-+ .flags = 0,
-+
-+ .stds = &standard[0],
-+ .num_stds = sizeof(standard)/sizeof(struct saa7146_standard),
-+ .std_callback = &std_callback,
-+
-+ .ioctls = &ioctls[0],
-+ .ioctl = av7110_ioctl,
-+};
-+
-+static struct saa7146_ext_vv av7110_vv_data_c = {
-+ .inputs = 1,
-+ .audios = 1,
-+ .capabilities = V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE,
-+ .flags = SAA7146_USE_PORT_B_FOR_VBI,
-+
-+ .stds = &standard[0],
-+ .num_stds = sizeof(standard)/sizeof(struct saa7146_standard),
-+ .std_callback = &std_callback,
-+
-+ .ioctls = &ioctls[0],
-+ .ioctl = av7110_ioctl,
-+};
-+
-+
-+static struct saa7146_extension av7110_extension = {
-+ .name = "dvb\0",
-+ .flags = SAA7146_I2C_SHORT_DELAY,
-+
-+ .module = THIS_MODULE,
-+ .pci_tbl = &pci_tbl[0],
-+ .attach = av7110_attach,
-+ .detach = av7110_detach,
-+
-+ .irq_mask = MASK_19|MASK_03,
-+ .irq_func = av7110_irq,
-+};
-+
-+
-+static int __init av7110_init(void)
-+{
-+ int retval;
-+ retval = saa7146_register_extension(&av7110_extension);
-+ if (retval)
-+ goto failed_saa7146_register;
-+
-+ retval = av7110_ir_init();
-+ if (retval)
-+ goto failed_av7110_ir_init;
-+ return 0;
-+failed_av7110_ir_init:
-+ saa7146_unregister_extension(&av7110_extension);
-+failed_saa7146_register:
-+ return retval;
-+}
-+
-+
-+static void __exit av7110_exit(void)
-+{
-+ av7110_ir_exit();
-+ saa7146_unregister_extension(&av7110_extension);
-+}
-+
-+module_init(av7110_init);
-+module_exit(av7110_exit);
-+
-+MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by "
-+ "Siemens, Technotrend, Hauppauge");
-+MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
-+MODULE_LICENSE("GPL");
-+
-+MODULE_PARM(av7110_debug,"i");
-+MODULE_PARM(vidmode,"i");
-+MODULE_PARM_DESC(vidmode,"analog video out: 0 off, 1 CVBS+RGB (default), 2 CVBS+YC, 3 YC");
-+MODULE_PARM(pids_off,"i");
-+MODULE_PARM_DESC(pids_off,"clear video/audio/PCR PID filters when demux is closed");
-+MODULE_PARM(adac,"i");
-+MODULE_PARM_DESC(adac,"audio DAC type: 0 TI, 1 CRYSTAL, 2 MSP (use if autodetection fails)");
-+MODULE_PARM(hw_sections, "i");
-+MODULE_PARM_DESC(hw_sections, "0 use software section filter, 1 use hardware");
-+MODULE_PARM(rgb_on, "i");
-+MODULE_PARM_DESC(rgb_on, "For Siemens DVB-C cards only: Enable RGB control"
-+ " signal on SCART pin 16 to switch SCART video mode from CVBS to RGB");
---- linux-2.6.0/drivers/media/dvb/ttpci/av7110_firm.h 2003-10-25 14:45:45.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,28315 +0,0 @@
--
--#include <asm/types.h>
--
--static u8 Dpram [] = {
-- 0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e,
-- 0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04,
-- 0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00,
-- 0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04,
-- 0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0x5c, 0xcc,
-- 0x2e, 0x01, 0xcb, 0x40, 0xa5, 0xa5, 0x5a, 0x5a,
-- 0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09,
-- 0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00,
-- 0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01,
-- 0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x25,
-- 0x68, 0x00, 0x40, 0x52, 0x42, 0x08, 0xd1, 0x0b,
-- 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x07,
-- 0x32, 0x20, 0x0a, 0x00, 0x42, 0x08, 0xd1, 0x03,
-- 0x0a, 0x00, 0x42, 0x08, 0xd0, 0x29, 0x32, 0x20,
-- 0x21, 0x0f, 0x42, 0x08, 0xd1, 0x01, 0x32, 0x10,
-- 0x09, 0x00, 0x21, 0x01, 0x42, 0x08, 0xd1, 0x08,
-- 0x1d, 0x12, 0x21, 0x02, 0x42, 0x08, 0xd1, 0x04,
-- 0x1d, 0x12, 0x21, 0x04, 0x42, 0x08, 0xd1, 0x00,
-- 0x1d, 0x12, 0x48, 0x13, 0x68, 0x00, 0xb4, 0x01,
-- 0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x0f,
-- 0x60, 0x01, 0x48, 0x0d, 0x58, 0x82, 0x48, 0x01,
-- 0x46, 0x86, 0x47, 0x10, 0x2c, 0x00, 0x00, 0xb1,
-- 0xbc, 0x02, 0x48, 0x0b, 0x68, 0x02, 0x23, 0x20,
-- 0x05, 0x1b, 0x40, 0x1a, 0x43, 0x99, 0x43, 0x11,
-- 0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00,
-- 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00,
-- 0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04,
-- 0x2e, 0x08, 0x3a, 0xf4, 0x66, 0x00, 0x00, 0x14,
-- 0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0x5d, 0xd4,
-- 0x2c, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
--};
--
--
--static u8 Root [] = {
-- 0xb4, 0x90, 0x49, 0x18, 0x1c, 0x0b, 0x4a, 0x18,
-- 0x1a, 0x50, 0x4f, 0x18, 0x1a, 0x79, 0x10, 0x8f,
-- 0x21, 0x00, 0x2f, 0x00, 0xdd, 0x04, 0xcb, 0x10,
-- 0xc2, 0x10, 0x31, 0x01, 0x42, 0xb9, 0xdb, 0xfa,
-- 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11,
-- 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11,
-- 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11,
-- 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11,
-- 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11,
-- 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11,
-- 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11,
-- 0x49, 0x13, 0x18, 0x08, 0x49, 0x13, 0x60, 0x08,
-- 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x01, 0xc8, 0x08,
-- 0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x01, 0xc9, 0x08,
-- 0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x28,
-- 0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x2c,
-- 0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x30,
-- 0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x34,
-- 0x2e, 0x01, 0xc8, 0x74, 0x2e, 0x01, 0xca, 0x38,
-- 0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x3c,
-- 0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x40,
-- 0x2e, 0x01, 0xc8, 0x08, 0x2e, 0x01, 0xca, 0x44,
-- 0xb5, 0xf0, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x07,
-- 0xb0, 0x82, 0x2a, 0x00, 0xd1, 0x03, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x0e, 0x38,
-- 0x06, 0x00, 0x21, 0x0b, 0x06, 0x89, 0x4b, 0x43,
-- 0x93, 0x01, 0x42, 0x88, 0xd1, 0x32, 0x08, 0x78,
-- 0xd3, 0x05, 0x1e, 0x78, 0x88, 0x00, 0x70, 0x20,
-- 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01, 0x08, 0xb8,
-- 0xd3, 0x0f, 0x2d, 0x02, 0xdb, 0x0d, 0x08, 0x60,
-- 0xd3, 0x06, 0x88, 0x39, 0x0a, 0x09, 0x70, 0x21,
-- 0x88, 0x38, 0x70, 0x60, 0x34, 0x02, 0xe0, 0x02,
-- 0x88, 0x38, 0x80, 0x20, 0x34, 0x02, 0x3d, 0x02,
-- 0x37, 0x02, 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad,
-- 0xd0, 0x08, 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38,
-- 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x6a,
-- 0x19, 0x7f, 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x54,
-- 0x68, 0x38, 0x90, 0x00, 0x46, 0x6f, 0x78, 0x38,
-- 0x70, 0x20, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01,
-- 0xd1, 0xf9, 0xe0, 0x4a, 0x0e, 0x20, 0x06, 0x00,
-- 0x42, 0x88, 0xd1, 0x3f, 0xe0, 0x14, 0x08, 0x60,
-- 0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff,
-- 0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11,
-- 0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09,
-- 0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11,
-- 0x80, 0x21, 0x34, 0x01, 0x3d, 0x01, 0x37, 0x01,
-- 0x07, 0xb8, 0xd0, 0x01, 0x2d, 0x00, 0xdc, 0xe6,
-- 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 0xd0, 0x06,
-- 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 0x1c, 0x21,
-- 0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x33, 0x19, 0x7f,
-- 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x1d, 0x08, 0x60,
-- 0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff,
-- 0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11,
-- 0x80, 0x01, 0xe0, 0x06, 0x88, 0x21, 0x06, 0x09,
-- 0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11,
-- 0x80, 0x21, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01,
-- 0xd1, 0xe9, 0xe0, 0x06, 0x9b, 0x01, 0x68, 0x1b,
-- 0x1c, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18,
-- 0xfb, 0x11, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48,
-- 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfc, 0x50,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x4f, 0x10,
-- 0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04,
-- 0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a,
-- 0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00,
-- 0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x54,
-- 0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07,
-- 0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a,
-- 0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x49, 0xb0, 0x01,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
-- 0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x1d,
-- 0x24, 0x10, 0x68, 0x3b, 0x2b, 0x00, 0xd1, 0x1a,
-- 0x28, 0x00, 0xd0, 0x18, 0x20, 0xa5, 0x01, 0xc0,
-- 0xf0, 0x05, 0xfb, 0x64, 0x60, 0x38, 0x8a, 0xbf,
-- 0x1c, 0x03, 0x2f, 0x00, 0xd0, 0x0c, 0x2b, 0x00,
-- 0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c,
-- 0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d, 0x1c, 0x39,
-- 0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xc7, 0xb0, 0x03,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2b, 0x00,
-- 0xd0, 0xfa, 0x28, 0x00, 0xd1, 0xf8, 0x8a, 0xbd,
-- 0x2d, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00,
-- 0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d,
-- 0x1c, 0x29, 0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xb2,
-- 0xb0, 0x03, 0x68, 0x38, 0xf0, 0x05, 0xfb, 0x44,
-- 0x20, 0x00, 0x60, 0x38, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00,
-- 0xb5, 0xf0, 0x9f, 0x05, 0x04, 0x04, 0x0c, 0x24,
-- 0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36,
-- 0x04, 0x19, 0x0c, 0x09, 0xb0, 0x82, 0x91, 0x00,
-- 0x04, 0x38, 0x0c, 0x00, 0xb0, 0x81, 0x49, 0x89,
-- 0x4f, 0x89, 0x42, 0x8d, 0xd1, 0x00, 0x89, 0xbd,
-- 0x42, 0x8e, 0xd1, 0x00, 0x8a, 0x3e, 0x4a, 0x87,
-- 0x42, 0x95, 0xd1, 0x02, 0x89, 0xbd, 0x08, 0xd3,
-- 0x81, 0xbb, 0x4b, 0x84, 0x42, 0x9e, 0xd1, 0x02,
-- 0x8a, 0x3e, 0x08, 0xdb, 0x82, 0x3b, 0x9a, 0x01,
-- 0x42, 0x8a, 0xd1, 0x01, 0x8a, 0xba, 0x92, 0x01,
-- 0x8a, 0xbb, 0x99, 0x01, 0x42, 0x99, 0xd0, 0x20,
-- 0x68, 0x38, 0x90, 0x02, 0x28, 0x00, 0xd0, 0x1a,
-- 0x2b, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00,
-- 0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x19, 0x23, 0x10,
-- 0x22, 0x1d, 0x98, 0x05, 0xf0, 0x0a, 0xfb, 0x6a,
-- 0xb0, 0x03, 0x99, 0x01, 0x29, 0x00, 0xd0, 0x0a,
-- 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07,
-- 0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, 0x68, 0x38,
-- 0xf0, 0x0a, 0xfb, 0x5c, 0xb0, 0x03, 0x99, 0x01,
-- 0x82, 0xb9, 0x4b, 0x6d, 0x42, 0x9c, 0xd0, 0x37,
-- 0xdc, 0x28, 0x2c, 0x00, 0xd0, 0x2e, 0x3b, 0x02,
-- 0x42, 0x9c, 0xd0, 0x29, 0x4b, 0x69, 0x42, 0x9c,
-- 0xd1, 0x00, 0x1c, 0x34, 0x22, 0x00, 0xb4, 0x04,
-- 0x23, 0x00, 0x49, 0x62, 0x20, 0x1c, 0xf0, 0x0a,
-- 0xfc, 0xe3, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85,
-- 0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44,
-- 0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x0b, 0xf8, 0x1c,
-- 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2,
-- 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0a, 0xfe, 0x94,
-- 0x2d, 0x00, 0xd0, 0x33, 0x2d, 0x01, 0xd1, 0x11,
-- 0x25, 0x00, 0xe0, 0x32, 0x4b, 0x55, 0x42, 0x9c,
-- 0xd0, 0x04, 0x33, 0x01, 0x42, 0x9c, 0xd1, 0xd9,
-- 0x89, 0x3c, 0xe7, 0xd7, 0x2d, 0x00, 0xd0, 0x01,
-- 0x1c, 0x2c, 0xe7, 0xd3, 0x1c, 0x34, 0xe7, 0xd1,
-- 0x1c, 0x2c, 0xe7, 0xcf, 0x42, 0xac, 0xd1, 0x01,
-- 0x20, 0x80, 0xe0, 0x00, 0x20, 0x00, 0x22, 0x00,
-- 0xb4, 0x04, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02,
-- 0x43, 0x02, 0x23, 0x01, 0x20, 0x1f, 0x1c, 0x29,
-- 0xf0, 0x0a, 0xfc, 0xaa, 0x23, 0x01, 0x02, 0x9b,
-- 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01,
-- 0xf0, 0x0a, 0xfe, 0x66, 0x21, 0x00, 0x20, 0x1f,
-- 0xf0, 0x0b, 0xfb, 0x58, 0x20, 0x01, 0xf0, 0x0d,
-- 0xff, 0x47, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x0d,
-- 0xff, 0x43, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02,
-- 0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00,
-- 0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x0e, 0xf8, 0x9a,
-- 0x20, 0x1e, 0xf0, 0x0b, 0xf8, 0x97, 0x23, 0x03,
-- 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02,
-- 0x20, 0x1e, 0xf0, 0x0a, 0xfe, 0x45, 0x82, 0x3e,
-- 0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02,
-- 0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00,
-- 0x90, 0x00, 0xf0, 0x1c, 0xf9, 0x57, 0x23, 0x01,
-- 0x04, 0x1b, 0x43, 0x18, 0xf0, 0x1c, 0xf9, 0x56,
-- 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfd, 0x78,
-- 0x20, 0xff, 0x49, 0x29, 0x68, 0x09, 0x70, 0x08,
-- 0x49, 0x28, 0x48, 0x29, 0x23, 0x1e, 0x22, 0x10,
-- 0xf0, 0x0e, 0xfe, 0xac, 0x48, 0x27, 0x68, 0x00,
-- 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01,
-- 0xf0, 0x1c, 0xf9, 0x3c, 0x4b, 0x24, 0x40, 0x18,
-- 0xf0, 0x1c, 0xf9, 0x3c, 0x22, 0x00, 0xb4, 0x04,
-- 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02,
-- 0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31,
-- 0xf0, 0x0a, 0xfc, 0x4a, 0x23, 0x01, 0x02, 0x9b,
-- 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01,
-- 0xf0, 0x0a, 0xfe, 0x06, 0x21, 0x00, 0x20, 0x1e,
-- 0xf0, 0x0b, 0xfa, 0xf8, 0x42, 0xac, 0xd0, 0x13,
-- 0x42, 0xb4, 0xd0, 0x11, 0x2c, 0x00, 0xd0, 0x0f,
-- 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01,
-- 0x20, 0x1c, 0xf0, 0x0a, 0xfd, 0xf5, 0x22, 0x00,
-- 0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c,
-- 0x1c, 0x21, 0xf0, 0x0a, 0xfc, 0x29, 0xb0, 0x01,
-- 0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe,
-- 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc,
-- 0x2e, 0x08, 0x5e, 0x2c, 0x2e, 0x08, 0x47, 0x60,
-- 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x5e, 0x58,
-- 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0x22, 0x00,
-- 0xb4, 0x04, 0x04, 0x01, 0x0c, 0x09, 0x23, 0x00,
-- 0x4a, 0x03, 0x1e, 0x50, 0xf7, 0xff, 0xfe, 0xc0,
-- 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0x22, 0x00,
-- 0xb4, 0x04, 0x04, 0x02, 0x0c, 0x12, 0x23, 0x00,
-- 0x49, 0x03, 0x1e, 0x48, 0xf7, 0xff, 0xfe, 0xb0,
-- 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0x04, 0x00,
-- 0x0c, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x0b,
-- 0x28, 0x02, 0xd1, 0x02, 0x02, 0x00, 0xf0, 0x0d,
-- 0xff, 0xf1, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x80,
-- 0xf0, 0x0d, 0xff, 0xec, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0xff, 0x30, 0x01, 0xf0, 0x0d, 0xff, 0xe6,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00,
-- 0x4c, 0x1b, 0x20, 0x01, 0x04, 0x80, 0x21, 0x00,
-- 0x22, 0x00, 0xc4, 0x86, 0xc4, 0x84, 0x3c, 0x14,
-- 0xf0, 0x05, 0xf9, 0x70, 0x61, 0x60, 0x28, 0x00,
-- 0xd0, 0x06, 0x21, 0x01, 0x04, 0x89, 0x61, 0xe1,
-- 0x18, 0x41, 0x62, 0x20, 0x61, 0xa1, 0xe0, 0x02,
-- 0x61, 0xe7, 0x61, 0xa7, 0x62, 0x27, 0x68, 0x21,
-- 0x00, 0xc9, 0x4a, 0x10, 0x18, 0x89, 0x60, 0x48,
-- 0x20, 0x00, 0x49, 0x0f, 0x4d, 0x0f, 0x00, 0x42,
-- 0x52, 0x8d, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00,
-- 0x28, 0x1d, 0xdb, 0xf8, 0x20, 0x00, 0x1c, 0x39,
-- 0x4c, 0x0b, 0x4f, 0x0c, 0x4b, 0x0c, 0x00, 0x42,
-- 0x52, 0xa5, 0x00, 0x82, 0x50, 0xb9, 0x50, 0x99,
-- 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20,
-- 0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70,
-- 0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x49, 0xe8,
-- 0x2e, 0x08, 0x4a, 0x68, 0xb4, 0xf0, 0xb0, 0x81,
-- 0x49, 0x25, 0xc9, 0x0c, 0x39, 0x08, 0x1a, 0xd2,
-- 0x60, 0x8a, 0xd5, 0x02, 0x32, 0xff, 0x32, 0x01,
-- 0x60, 0x8a, 0x6a, 0x0a, 0x62, 0x8a, 0x68, 0x8f,
-- 0x2f, 0xfe, 0xdb, 0x03, 0x20, 0x00, 0xb0, 0x01,
-- 0xbc, 0xf0, 0x47, 0x70, 0x30, 0x03, 0x08, 0x80,
-- 0x00, 0x80, 0x4c, 0x1b, 0x69, 0xa6, 0x69, 0x64,
-- 0x2f, 0x3e, 0xdb, 0x24, 0x00, 0xdb, 0x4f, 0x19,
-- 0x19, 0xdb, 0x68, 0x5b, 0x62, 0x4b, 0x93, 0x00,
-- 0x1a, 0x9f, 0x4b, 0x15, 0x69, 0xdd, 0x2f, 0x00,
-- 0xdc, 0x00, 0x19, 0x7f, 0x23, 0x01, 0x03, 0x1b,
-- 0x18, 0xc3, 0x42, 0xbb, 0xdd, 0x0f, 0x18, 0x17,
-- 0x42, 0xb7, 0xdb, 0x09, 0x9a, 0x00, 0x1b, 0x12,
-- 0x2a, 0x00, 0xdc, 0x00, 0x19, 0x52, 0x42, 0x93,
-- 0xdd, 0x11, 0x18, 0x20, 0x62, 0x08, 0xe0, 0x0e,
-- 0x62, 0x0f, 0x1c, 0x14, 0xe0, 0x0b, 0x18, 0x10,
-- 0x62, 0x08, 0x1c, 0x14, 0xe0, 0x07, 0x18, 0x12,
-- 0x42, 0xb2, 0xdb, 0x00, 0x62, 0x0c, 0x6a, 0x0a,
-- 0x18, 0x10, 0x62, 0x08, 0x1c, 0x14, 0x1c, 0x20,
-- 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70,
-- 0x48, 0x03, 0x6a, 0x81, 0x62, 0x01, 0x69, 0x01,
-- 0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x00, 0x1c, 0xb5, 0xf7, 0x04, 0x05,
-- 0x0c, 0x2d, 0x04, 0x0e, 0x0c, 0x36, 0xb0, 0x81,
-- 0x23, 0x01, 0x03, 0x1b, 0x98, 0x03, 0x42, 0x9e,
-- 0xdd, 0x05, 0x20, 0xff, 0xb0, 0x01, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x4f, 0x24,
-- 0x68, 0xb9, 0x29, 0xff, 0xdb, 0x02, 0x20, 0xff,
-- 0xb0, 0x01, 0xe7, 0xf4, 0x00, 0x69, 0x19, 0x49,
-- 0x00, 0x89, 0x4a, 0x20, 0x18, 0x8c, 0x89, 0x21,
-- 0x29, 0x01, 0xd0, 0x02, 0x20, 0xff, 0xb0, 0x01,
-- 0xe7, 0xe9, 0x79, 0x81, 0x91, 0x00, 0x88, 0xa0,
-- 0x08, 0x40, 0x07, 0x80, 0xd1, 0x02, 0x1c, 0x28,
-- 0xf0, 0x05, 0xfb, 0xca, 0x88, 0xa0, 0x23, 0x06,
-- 0x40, 0x18, 0x28, 0x02, 0xd1, 0x09, 0x88, 0xe0,
-- 0x99, 0x00, 0x42, 0x88, 0xd1, 0x05, 0x1c, 0x28,
-- 0xf0, 0x05, 0xfb, 0xbe, 0x20, 0xff, 0xb0, 0x01,
-- 0xe7, 0xd1, 0x88, 0xe0, 0x4b, 0x10, 0x42, 0x98,
-- 0xd1, 0x01, 0x99, 0x00, 0x80, 0xe1, 0x68, 0x39,
-- 0x00, 0xc8, 0x4a, 0x0e, 0x52, 0x15, 0x18, 0x80,
-- 0x80, 0x46, 0x9a, 0x03, 0x31, 0x01, 0x60, 0x42,
-- 0x20, 0x00, 0x23, 0xff, 0x60, 0x39, 0x33, 0x01,
-- 0x42, 0x99, 0xd1, 0x00, 0x60, 0x38, 0x68, 0xb9,
-- 0x31, 0x01, 0x60, 0xb9, 0x68, 0xfb, 0x42, 0x99,
-- 0xdd, 0x00, 0x60, 0xf9, 0xb0, 0x01, 0xe7, 0xb2,
-- 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x47, 0x78,
-- 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x3b, 0x70,
-- 0xb5, 0xf0, 0x20, 0xff, 0xb0, 0x82, 0x49, 0x33,
-- 0x91, 0x01, 0x49, 0x33, 0x8e, 0x89, 0x29, 0x00,
-- 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x4f, 0x30, 0xcf, 0x0a, 0x3f, 0x08,
-- 0x1a, 0xc9, 0x60, 0xb9, 0x1c, 0x0a, 0xd5, 0x02,
-- 0x1d, 0xd1, 0x31, 0xf9, 0x60, 0xb9, 0x68, 0xb9,
-- 0x29, 0x00, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0xda, 0x49, 0x28,
-- 0x5a, 0x8d, 0x18, 0x51, 0x88, 0x4c, 0x68, 0x49,
-- 0x91, 0x00, 0x00, 0xa9, 0x4a, 0x25, 0x58, 0x56,
-- 0x2e, 0x00, 0xd0, 0x07, 0x48, 0x24, 0x58, 0x43,
-- 0x99, 0x00, 0x1c, 0x28, 0x1c, 0x22, 0xf0, 0x17,
-- 0xff, 0xff, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x29,
-- 0x06, 0xed, 0x0e, 0xed, 0x1c, 0xe0, 0x08, 0x82,
-- 0x00, 0x92, 0x98, 0x00, 0x99, 0x01, 0x6a, 0xfb,
-- 0xf0, 0x17, 0xff, 0xec, 0x00, 0x68, 0x19, 0x40,
-- 0x00, 0x80, 0x49, 0x1a, 0x18, 0x40, 0x88, 0x80,
-- 0x21, 0x0c, 0x40, 0x01, 0x29, 0x0c, 0xd1, 0x04,
-- 0x02, 0x29, 0x31, 0x02, 0x04, 0x09, 0x0c, 0x09,
-- 0xe0, 0x03, 0x02, 0x29, 0x31, 0x01, 0x04, 0x09,
-- 0x0c, 0x09, 0x08, 0x40, 0xd3, 0x04, 0x04, 0x08,
-- 0x0c, 0x00, 0x21, 0x01, 0x03, 0xc9, 0x43, 0x01,
-- 0x48, 0x09, 0x85, 0x01, 0x85, 0x44, 0x21, 0x01,
-- 0x02, 0x49, 0x86, 0x81, 0x68, 0x78, 0x28, 0xff,
-- 0xd1, 0x02, 0x20, 0x00, 0x60, 0x78, 0xe0, 0x01,
-- 0x30, 0x01, 0x60, 0x78, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x02, 0x00,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x1c,
-- 0x2e, 0x08, 0x3b, 0x70, 0x2e, 0x08, 0x49, 0xe8,
-- 0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x47, 0x78,
-- 0xb4, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x4f, 0x14,
-- 0x8e, 0xba, 0x2a, 0x00, 0xd0, 0x03, 0x20, 0x00,
-- 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0x05,
-- 0x4c, 0x10, 0x1d, 0x48, 0xd5, 0x00, 0x30, 0x01,
-- 0x10, 0x40, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00,
-- 0x29, 0x02, 0xdb, 0xf2, 0x29, 0xe0, 0xdc, 0xf0,
-- 0x22, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x53,
-- 0x5a, 0xee, 0x52, 0xe6, 0x32, 0x01, 0x04, 0x12,
-- 0x0c, 0x12, 0x42, 0x8a, 0xdb, 0xf7, 0x22, 0x04,
-- 0x85, 0x3a, 0x00, 0x49, 0x85, 0x79, 0x21, 0x0f,
-- 0x02, 0x49, 0x86, 0xb9, 0xbc, 0xf0, 0x47, 0x70,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00,
-- 0xb5, 0xb0, 0x27, 0x00, 0x4d, 0x13, 0x8e, 0xa9,
-- 0x29, 0x00, 0xd0, 0x03, 0x43, 0xf8, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x79, 0x04, 0x09,
-- 0x0c, 0x09, 0x1c, 0x3a, 0x1c, 0x0f, 0x56, 0x81,
-- 0x29, 0x00, 0xd1, 0xf7, 0x24, 0x00, 0x2f, 0xfe,
-- 0xdd, 0x03, 0x27, 0xfe, 0x1d, 0xc1, 0x31, 0xd9,
-- 0x77, 0xcc, 0x1c, 0x7a, 0x49, 0x08, 0xf7, 0xff,
-- 0xfb, 0xc3, 0x20, 0x04, 0x85, 0x28, 0x1c, 0xf8,
-- 0x08, 0x80, 0x00, 0x80, 0x85, 0x68, 0x20, 0x0f,
-- 0x02, 0x40, 0x86, 0xa8, 0x1c, 0x20, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2c, 0x00, 0x1e, 0x00, 0xb4, 0xf0, 0x4b, 0x1b,
-- 0x8e, 0x9b, 0x2b, 0x00, 0xd0, 0x03, 0x20, 0x00,
-- 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0xd4,
-- 0xd5, 0x00, 0x34, 0x01, 0x10, 0x64, 0x1c, 0x0d,
-- 0x4f, 0x15, 0x02, 0x00, 0x04, 0x00, 0x0c, 0x00,
-- 0x78, 0x4e, 0x0a, 0x33, 0xd3, 0x07, 0x06, 0x73,
-- 0x0e, 0x5b, 0x18, 0x59, 0x78, 0x89, 0x43, 0x08,
-- 0x04, 0x00, 0x0c, 0x00, 0xe0, 0x03, 0x78, 0x89,
-- 0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, 0x80, 0x38,
-- 0x20, 0x00, 0x2c, 0x00, 0xdd, 0x06, 0x00, 0x41,
-- 0x5a, 0x6b, 0x19, 0xc9, 0x80, 0x4b, 0x30, 0x01,
-- 0x42, 0xa0, 0xdb, 0xf8, 0x20, 0x0b, 0x49, 0x05,
-- 0x85, 0x08, 0x1c, 0x90, 0x85, 0x48, 0x20, 0x01,
-- 0x02, 0x40, 0x86, 0x88, 0x20, 0x00, 0xbc, 0xf0,
-- 0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2c, 0x00, 0x02, 0x00, 0x04, 0x02, 0x0c, 0x12,
-- 0x48, 0x0c, 0x6f, 0xc1, 0x20, 0x00, 0x43, 0xc0,
-- 0x29, 0x00, 0xd1, 0x12, 0x49, 0x0a, 0x8e, 0xcb,
-- 0x2b, 0x00, 0xd1, 0x0e, 0x8d, 0x8b, 0x2b, 0x00,
-- 0xd1, 0x0b, 0x48, 0x08, 0x86, 0xc2, 0x23, 0x07,
-- 0x86, 0x83, 0x85, 0x8b, 0x85, 0xca, 0x20, 0x09,
-- 0x02, 0x40, 0x86, 0xc8, 0x20, 0x01, 0x87, 0x88,
-- 0x20, 0x00, 0x47, 0x70, 0x2c, 0x00, 0x1f, 0x80,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0,
-- 0xb5, 0x80, 0x1c, 0x01, 0x4a, 0x0d, 0x8e, 0xd3,
-- 0x20, 0x00, 0x43, 0xc0, 0x2b, 0x00, 0xd1, 0x12,
-- 0x8d, 0x93, 0x2b, 0x07, 0xd1, 0x0f, 0x8d, 0xd7,
-- 0x20, 0x00, 0x85, 0x90, 0x2f, 0x00, 0xd0, 0x0a,
-- 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9f, 0xdc, 0x06,
-- 0x1c, 0x3a, 0x48, 0x05, 0x4b, 0x05, 0x6a, 0xdb,
-- 0xf0, 0x17, 0xfe, 0xdc, 0x1c, 0x38, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x00, 0x1c,
-- 0xb5, 0xf0, 0xb0, 0x83, 0x49, 0x62, 0x8e, 0x88,
-- 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x4e, 0x5f, 0x78, 0x30,
-- 0x49, 0x5f, 0x91, 0x02, 0x78, 0x09, 0x42, 0x88,
-- 0xd1, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0x00, 0x4d, 0x5b, 0x4b, 0x5c,
-- 0x93, 0x01, 0x1d, 0xd9, 0x31, 0x19, 0x7d, 0x0a,
-- 0x00, 0x53, 0x18, 0x9b, 0x01, 0x1b, 0x19, 0x5b,
-- 0x78, 0xdc, 0x1c, 0x1f, 0x79, 0x1b, 0x42, 0x9c,
-- 0xd1, 0x04, 0x79, 0x7b, 0x07, 0xdb, 0x0f, 0xdb,
-- 0x2b, 0x01, 0xd1, 0x06, 0x7d, 0x0b, 0x93, 0x00,
-- 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52, 0x75, 0x0a,
-- 0xe0, 0x08, 0x32, 0x01, 0x07, 0x52, 0x0f, 0x52,
-- 0x75, 0x0a, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00,
-- 0x28, 0x08, 0xdb, 0xe0, 0x28, 0x08, 0xd1, 0x03,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x98, 0x00, 0x00, 0x43, 0x18, 0x18, 0x01, 0x00,
-- 0x19, 0x47, 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0,
-- 0x89, 0x84, 0x23, 0x01, 0x03, 0x1b, 0x42, 0x9c,
-- 0xdd, 0x00, 0x1c, 0x1c, 0x68, 0x81, 0x89, 0xc0,
-- 0x18, 0x08, 0x1c, 0xe1, 0x08, 0x8a, 0x00, 0x92,
-- 0x49, 0x3e, 0x9b, 0x01, 0x6a, 0xdb, 0xf0, 0x17,
-- 0xfe, 0x79, 0x88, 0x38, 0x02, 0x00, 0x30, 0x09,
-- 0x49, 0x35, 0x85, 0x08, 0x85, 0x4c, 0x20, 0x01,
-- 0x02, 0x40, 0x86, 0x88, 0x78, 0xf8, 0x00, 0xc0,
-- 0x19, 0xc0, 0x89, 0xc1, 0x19, 0x09, 0x81, 0xc1,
-- 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 0x89, 0x81,
-- 0x1b, 0x09, 0x81, 0x81, 0x78, 0xf8, 0x00, 0xc0,
-- 0x19, 0xc0, 0x89, 0x81, 0x29, 0x00, 0xd1, 0x4f,
-- 0x24, 0x00, 0x81, 0xc4, 0x78, 0xf9, 0x6a, 0xb8,
-- 0x18, 0x40, 0x73, 0x04, 0x78, 0xf8, 0x30, 0x01,
-- 0x07, 0x80, 0x0f, 0x80, 0x70, 0xf8, 0x78, 0x30,
-- 0x30, 0x01, 0x70, 0x30, 0x78, 0xf8, 0x79, 0x39,
-- 0x42, 0x88, 0xd1, 0x3d, 0x79, 0x78, 0x21, 0x02,
-- 0x40, 0x01, 0x29, 0x02, 0xd1, 0x1e, 0x70, 0xfc,
-- 0x71, 0x3c, 0x71, 0x7c, 0x49, 0x22, 0x80, 0x39,
-- 0x6a, 0xb8, 0x68, 0x00, 0xf0, 0x04, 0xfe, 0xac,
-- 0x6a, 0xb8, 0xf0, 0x04, 0xfe, 0xa9, 0x20, 0x00,
-- 0x49, 0x1d, 0x00, 0x42, 0x18, 0x12, 0x01, 0x12,
-- 0x5a, 0xaa, 0x42, 0x8a, 0xd1, 0x04, 0x30, 0x01,
-- 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4,
-- 0x28, 0x08, 0xd1, 0x1d, 0x70, 0x34, 0x99, 0x02,
-- 0x70, 0x0c, 0xe0, 0x19, 0x07, 0xc0, 0x0f, 0xc0,
-- 0x28, 0x01, 0xd1, 0x15, 0x70, 0xfc, 0x71, 0x3c,
-- 0x21, 0x06, 0x1d, 0xf8, 0x30, 0x19, 0x73, 0x41,
-- 0x6a, 0xb9, 0x72, 0x0c, 0x79, 0x79, 0x08, 0x49,
-- 0x00, 0x49, 0x71, 0x79, 0x22, 0x04, 0x7b, 0x01,
-- 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85,
-- 0x6a, 0xbb, 0xf0, 0x0a, 0xfb, 0x07, 0xb0, 0x02,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xbc,
-- 0x2e, 0x08, 0x03, 0xb8, 0x2e, 0x08, 0x44, 0x68,
-- 0x2e, 0x08, 0x00, 0x1c, 0x2c, 0x00, 0x02, 0x00,
-- 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x4f, 0x0b,
-- 0x68, 0x38, 0x28, 0x00, 0xd1, 0x0f, 0x20, 0x2f,
-- 0x02, 0x80, 0xf0, 0x04, 0xfe, 0x87, 0x60, 0x38,
-- 0x20, 0x00, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07,
-- 0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x20, 0x2f,
-- 0x02, 0x80, 0x49, 0x06, 0x60, 0x08, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90,
-- 0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94,
-- 0x2e, 0x02, 0x5c, 0x9c, 0x2e, 0x02, 0x5c, 0xa0,
-- 0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04,
-- 0xfe, 0x73, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90,
-- 0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x36, 0x8e, 0x90,
-- 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x48, 0x33, 0x68, 0x01,
-- 0x4e, 0x33, 0x68, 0x30, 0x1a, 0x0f, 0xd1, 0x03,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2f, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b,
-- 0x18, 0xff, 0x4c, 0x2e, 0x6b, 0xa1, 0x1c, 0x4a,
-- 0x49, 0x2d, 0x68, 0x09, 0x42, 0x8a, 0xd9, 0x13,
-- 0x23, 0x2f, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x4a, 0x23, 0x8e, 0xd2, 0x2a, 0x00, 0xd0, 0x07,
-- 0x23, 0xeb, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x63, 0xa1, 0x4b, 0x22, 0x42, 0x9f, 0xdd, 0x00,
-- 0x1c, 0x1f, 0x21, 0x2f, 0x02, 0x89, 0x1a, 0x0d,
-- 0x49, 0x1f, 0x91, 0x01, 0x42, 0xaf, 0xdd, 0x14,
-- 0x1b, 0x7a, 0x92, 0x00, 0x99, 0x01, 0x68, 0x09,
-- 0x18, 0x08, 0x1c, 0x2a, 0x49, 0x1b, 0x6b, 0x23,
-- 0xf0, 0x17, 0xfd, 0x84, 0x4b, 0x19, 0x18, 0xe9,
-- 0x98, 0x01, 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x23,
-- 0xf0, 0x17, 0xfd, 0x7c, 0x9a, 0x00, 0x60, 0x32,
-- 0xe0, 0x0e, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08,
-- 0x1c, 0x3a, 0x49, 0x12, 0x6b, 0x23, 0xf0, 0x17,
-- 0xfd, 0x71, 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f,
-- 0x02, 0x80, 0xf0, 0x17, 0xfd, 0x75, 0x60, 0x31,
-- 0x20, 0x12, 0x4a, 0x05, 0x85, 0x10, 0x85, 0x57,
-- 0x20, 0x01, 0x02, 0x40, 0x86, 0x90, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x02, 0x5c, 0x98,
-- 0x2e, 0x02, 0x5c, 0x94, 0x2e, 0x08, 0x00, 0x1c,
-- 0x2e, 0x08, 0x05, 0xb0, 0x00, 0x00, 0x0f, 0x6c,
-- 0x2e, 0x02, 0x5c, 0x90, 0x2c, 0x00, 0x02, 0x00,
-- 0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x49, 0x03,
-- 0x60, 0x08, 0x49, 0x03, 0x60, 0x08, 0x47, 0x70,
-- 0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94,
-- 0x2e, 0x02, 0x5c, 0x9c, 0x2a, 0x00, 0xd0, 0x05,
-- 0x78, 0x03, 0x70, 0x0b, 0x30, 0x01, 0x31, 0x01,
-- 0x3a, 0x01, 0xd1, 0xf9, 0x47, 0x70, 0xb5, 0xf3,
-- 0xb0, 0x83, 0x98, 0x03, 0x78, 0x40, 0x00, 0x80,
-- 0x1c, 0x0f, 0x49, 0x3d, 0x58, 0x08, 0x28, 0x00,
-- 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x03, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x03,
-- 0x88, 0x45, 0x30, 0x04, 0xc8, 0x41, 0x1d, 0xf2,
-- 0x32, 0xb9, 0x1a, 0x14, 0x23, 0x01, 0x03, 0x1b,
-- 0x42, 0x9d, 0xdd, 0x03, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x03, 0xe7, 0xec, 0x19, 0x79, 0x91, 0x00,
-- 0x4b, 0x30, 0x93, 0x02, 0x2c, 0xbc, 0xdc, 0x01,
-- 0x2c, 0x00, 0xda, 0x07, 0x9b, 0x02, 0x68, 0x18,
-- 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x03, 0xe7, 0xdc, 0x42, 0xac, 0xdb, 0x06,
-- 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a,
-- 0xf0, 0x17, 0xfd, 0x00, 0xe0, 0x44, 0x2d, 0x00,
-- 0xdd, 0x42, 0x4b, 0x25, 0x93, 0x01, 0x99, 0x00,
-- 0x42, 0x8f, 0xd9, 0x07, 0x9b, 0x02, 0x68, 0x18,
-- 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x03, 0xe7, 0xc4, 0x42, 0xa5, 0xdd, 0x07,
-- 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x22,
-- 0xf0, 0x17, 0xfc, 0xe8, 0x68, 0x36, 0xe0, 0x05,
-- 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a,
-- 0xf0, 0x17, 0xfc, 0xe0, 0x19, 0x3f, 0x1b, 0x2d,
-- 0x79, 0xb0, 0x19, 0x80, 0x9a, 0x03, 0x78, 0x52,
-- 0x00, 0xd3, 0x1a, 0x9a, 0x00, 0x92, 0x9b, 0x01,
-- 0x68, 0x1b, 0x18, 0xd2, 0x78, 0x92, 0x06, 0xd2,
-- 0x0e, 0xd2, 0x1d, 0x31, 0x2a, 0x12, 0xd1, 0x06,
-- 0x78, 0xca, 0x0a, 0x12, 0xd2, 0x03, 0x78, 0x89,
-- 0x29, 0x09, 0xd1, 0x00, 0x38, 0x01, 0x1d, 0xf1,
-- 0x31, 0xb9, 0x1a, 0x0c, 0x2c, 0xbc, 0xdc, 0x01,
-- 0x2c, 0x00, 0xda, 0x03, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x03, 0xe7, 0x90, 0x2d, 0x00, 0xdc, 0xbe,
-- 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x8b, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x00, 0x58,
-- 0x2e, 0x08, 0x5d, 0xc4, 0xb4, 0xf0, 0x68, 0x42,
-- 0x68, 0x84, 0x1d, 0xe1, 0x31, 0xb7, 0x1c, 0x16,
-- 0xb0, 0x81, 0x42, 0x91, 0xd9, 0x09, 0x78, 0x51,
-- 0x07, 0x09, 0x0f, 0x09, 0x02, 0x09, 0x78, 0x92,
-- 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09,
-- 0xe0, 0x5b, 0x68, 0x21, 0x79, 0x8b, 0x93, 0x00,
-- 0x1d, 0x0f, 0x18, 0x59, 0x78, 0x45, 0x00, 0xeb,
-- 0x1b, 0x5b, 0x00, 0x9b, 0x4d, 0x2b, 0x68, 0x2d,
-- 0x19, 0x5b, 0x78, 0x9b, 0x06, 0xdb, 0x0e, 0xdb,
-- 0x2b, 0x12, 0xd1, 0x31, 0x1d, 0xe3, 0x33, 0xb9,
-- 0x1b, 0x9b, 0x06, 0x1d, 0x0e, 0x2d, 0x78, 0xfe,
-- 0x0a, 0x33, 0xd2, 0x29, 0x2d, 0x0e, 0xda, 0x27,
-- 0x9b, 0x00, 0x2b, 0x09, 0xdd, 0x06, 0x79, 0x3b,
-- 0x18, 0xfb, 0x33, 0x05, 0x42, 0x8b, 0xd0, 0x1f,
-- 0x39, 0x01, 0xe0, 0x1d, 0x9b, 0x00, 0x2b, 0x09,
-- 0xd1, 0x1a, 0x79, 0x3b, 0x2b, 0x00, 0xd0, 0x01,
-- 0x39, 0x01, 0xe0, 0x15, 0x39, 0x01, 0x1d, 0xe3,
-- 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x09, 0x78, 0x53,
-- 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, 0x04, 0x1b,
-- 0x0c, 0x1b, 0x33, 0x03, 0x04, 0x1b, 0x0c, 0x1b,
-- 0xe0, 0x03, 0x78, 0x4b, 0x33, 0x03, 0x04, 0x1b,
-- 0x0c, 0x1b, 0x42, 0x9d, 0xda, 0x00, 0x31, 0x01,
-- 0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x93, 0xd9, 0x0b,
-- 0x78, 0x52, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12,
-- 0x04, 0x12, 0x0c, 0x12, 0x78, 0x09, 0x18, 0x51,
-- 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 0xe0, 0x08,
-- 0x78, 0x0a, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12,
-- 0x78, 0x49, 0x43, 0x11, 0x31, 0x03, 0x04, 0x09,
-- 0x0c, 0x09, 0x80, 0x41, 0xb0, 0x01, 0xbc, 0xf0,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4,
-- 0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00,
-- 0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70,
-- 0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x43, 0x70, 0x48, 0x01, 0x68, 0x80,
-- 0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70,
-- 0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00,
-- 0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70,
-- 0xb4, 0xf0, 0x1c, 0x03, 0x20, 0x00, 0xb0, 0x82,
-- 0x49, 0x53, 0x91, 0x01, 0x68, 0x89, 0x18, 0xcf,
-- 0x97, 0x00, 0x08, 0xca, 0x07, 0x4c, 0x0f, 0x64,
-- 0x49, 0x4f, 0x68, 0x09, 0xd1, 0x32, 0x1c, 0x1f,
-- 0xd5, 0x04, 0x42, 0x7f, 0x07, 0x7f, 0x0f, 0x7f,
-- 0x42, 0x7f, 0xe0, 0x01, 0x07, 0x7f, 0x0f, 0x7f,
-- 0x2f, 0x00, 0xd1, 0x27, 0x2b, 0x10, 0xd0, 0x16,
-- 0xdc, 0x05, 0x2b, 0x00, 0xd0, 0x5a, 0x2b, 0x08,
-- 0xd1, 0x59, 0x5c, 0x88, 0xe0, 0x81, 0x2b, 0x18,
-- 0xd0, 0x13, 0x2b, 0x20, 0xd1, 0x53, 0x5c, 0x88,
-- 0x06, 0x00, 0x18, 0x89, 0x78, 0x4a, 0x04, 0x12,
-- 0x18, 0x80, 0x78, 0x8a, 0x02, 0x12, 0x18, 0x80,
-- 0x78, 0xc9, 0x18, 0x40, 0xe0, 0x71, 0x5c, 0x88,
-- 0x02, 0x00, 0x18, 0x89, 0x78, 0x49, 0x18, 0x40,
-- 0xe0, 0x6b, 0x5c, 0x88, 0x04, 0x00, 0x18, 0x89,
-- 0x78, 0x4a, 0x02, 0x12, 0x18, 0x80, 0x78, 0x89,
-- 0x18, 0x40, 0xe0, 0x62, 0x2b, 0x00, 0xd1, 0x03,
-- 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70,
-- 0x9f, 0x00, 0x08, 0xfd, 0x07, 0x7f, 0x0f, 0x7f,
-- 0x2b, 0x20, 0xdc, 0x56, 0x1a, 0xae, 0x4d, 0x2f,
-- 0x2e, 0x05, 0xd2, 0x52, 0xa3, 0x01, 0x5d, 0x9b,
-- 0x00, 0x5b, 0x44, 0x9f, 0x02, 0x09, 0x14, 0x25,
-- 0x38, 0x00, 0x5c, 0x88, 0x5d, 0x29, 0x40, 0x08,
-- 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x44,
-- 0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a,
-- 0x02, 0x12, 0x5c, 0x08, 0x18, 0x80, 0x21, 0x08,
-- 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x39, 0x1c, 0x50,
-- 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12,
-- 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00,
-- 0x5c, 0xc9, 0x18, 0x08, 0x21, 0x08, 0x1b, 0xc9,
-- 0x40, 0xc8, 0xe0, 0x2a, 0xe0, 0x29, 0xe0, 0x28,
-- 0x1c, 0x50, 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a,
-- 0x02, 0x12, 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80,
-- 0x02, 0x00, 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18,
-- 0x02, 0x00, 0x5c, 0x89, 0x18, 0x08, 0x21, 0x08,
-- 0x1b, 0xc9, 0x40, 0xc8, 0xe0, 0x15, 0x1c, 0x50,
-- 0x5c, 0x8a, 0x5d, 0x2b, 0x40, 0x1a, 0x02, 0x12,
-- 0x1c, 0x43, 0x5c, 0x08, 0x18, 0x80, 0x02, 0x00,
-- 0x1c, 0x5a, 0x5c, 0xcb, 0x18, 0x18, 0x02, 0x03,
-- 0x1c, 0x50, 0x5c, 0x8a, 0x18, 0xd2, 0x40, 0xba,
-- 0x5c, 0x08, 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8,
-- 0x18, 0x80, 0x99, 0x01, 0x9f, 0x00, 0x60, 0x8f,
-- 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x43, 0x70, 0x2e, 0x08, 0x00, 0x60,
-- 0xb5, 0xb0, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x00,
-- 0x2f, 0x00, 0xdd, 0x09, 0x00, 0x85, 0x18, 0x2d,
-- 0x00, 0x6d, 0x20, 0x04, 0xf7, 0xff, 0xff, 0x44,
-- 0x19, 0x40, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf5,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x47, 0x70, 0xb5, 0xb0, 0x1c, 0x0c, 0x1c, 0x05,
-- 0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x1b, 0xfb, 0x16,
-- 0x49, 0x25, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xde,
-- 0xf0, 0x1b, 0xfa, 0xd4, 0x4b, 0x23, 0x40, 0x18,
-- 0xf0, 0x1b, 0xfa, 0xd4, 0xf0, 0x1b, 0xfb, 0x40,
-- 0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b,
-- 0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d,
-- 0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x0f,
-- 0xf8, 0xd5, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08,
-- 0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c,
-- 0x27, 0x00, 0x4d, 0x18, 0xf0, 0x0f, 0xf9, 0x36,
-- 0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf,
-- 0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x0f,
-- 0xf9, 0x37, 0xf0, 0x0f, 0xf9, 0x2b, 0x28, 0x00,
-- 0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x0f,
-- 0xf8, 0xb9, 0xf0, 0x1b, 0xfa, 0xdf, 0x21, 0x00,
-- 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xa7, 0xf0, 0x1b,
-- 0xfa, 0x9d, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18,
-- 0xf0, 0x1b, 0xfa, 0x9c, 0xf0, 0x1b, 0xfb, 0x08,
-- 0x46, 0x68, 0xf0, 0x0f, 0xf8, 0xf3, 0x98, 0x04,
-- 0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff,
-- 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10,
-- 0xb5, 0xff, 0x9e, 0x09, 0x1c, 0x04, 0x1c, 0x0d,
-- 0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x1b, 0xfa, 0xba,
-- 0x49, 0x31, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x82,
-- 0xf0, 0x1b, 0xfa, 0x78, 0x4b, 0x2f, 0x40, 0x18,
-- 0xf0, 0x1b, 0xfa, 0x78, 0xf0, 0x1b, 0xfa, 0xe4,
-- 0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e,
-- 0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10,
-- 0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x0f,
-- 0xf8, 0x79, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08,
-- 0x72, 0x1f, 0x20, 0xff, 0xab, 0x09, 0x70, 0x58,
-- 0x1c, 0x60, 0x71, 0x18, 0x9b, 0x16, 0x93, 0x0b,
-- 0xab, 0x0c, 0x70, 0x1e, 0x20, 0xff, 0x70, 0x58,
-- 0x24, 0x00, 0x4d, 0x20, 0xf0, 0x0f, 0xf8, 0xd2,
-- 0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac,
-- 0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01,
-- 0xa9, 0x0a, 0xf0, 0x0f, 0xf8, 0xd1, 0xe0, 0x03,
-- 0x20, 0x02, 0xa9, 0x07, 0xf0, 0x0f, 0xf8, 0xcc,
-- 0xf0, 0x0f, 0xf8, 0xc0, 0x28, 0x00, 0xd1, 0xfb,
-- 0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x0f,
-- 0xf8, 0x4d, 0xf0, 0x1b, 0xfa, 0x73, 0x21, 0x00,
-- 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x3b, 0xf0, 0x1b,
-- 0xfa, 0x31, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18,
-- 0xf0, 0x1b, 0xfa, 0x30, 0xf0, 0x1b, 0xfa, 0x9c,
-- 0x46, 0x68, 0xf0, 0x0f, 0xf8, 0x87, 0x98, 0x01,
-- 0x0a, 0x80, 0xd2, 0x05, 0x20, 0x01, 0xb0, 0x13,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x1c, 0x38, 0xb0, 0x13, 0xe7, 0xf8, 0x00, 0x00,
-- 0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff,
-- 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10,
-- 0x1c, 0x01, 0x48, 0x04, 0x61, 0xc1, 0x68, 0x00,
-- 0x28, 0x00, 0xd1, 0x01, 0x48, 0x02, 0x60, 0x01,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68,
-- 0x6e, 0x00, 0x17, 0x00, 0xb5, 0xb0, 0x4f, 0x41,
-- 0x69, 0x38, 0x4c, 0x41, 0x28, 0x00, 0xd0, 0x07,
-- 0x20, 0x03, 0x60, 0x20, 0x69, 0x38, 0x38, 0x01,
-- 0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x21, 0x02, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x04,
-- 0x60, 0x21, 0x69, 0x78, 0x38, 0x01, 0x61, 0x78,
-- 0xd1, 0xf3, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x20,
-- 0x38, 0x01, 0x60, 0xf8, 0x4a, 0x35, 0xd0, 0x08,
-- 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20, 0x7f, 0xd2,
-- 0x1e, 0x45, 0x40, 0xea, 0x07, 0xd2, 0x0f, 0xd2,
-- 0xe0, 0x09, 0x68, 0xbb, 0x18, 0xd2, 0x3a, 0x20,
-- 0x7f, 0xd2, 0x4b, 0x2f, 0x5c, 0x9a, 0x23, 0x01,
-- 0x40, 0x5a, 0x06, 0x12, 0x0e, 0x12, 0x23, 0x01,
-- 0x2a, 0x00, 0xd0, 0x02, 0x61, 0x79, 0x61, 0x3b,
-- 0xe0, 0x01, 0x61, 0x39, 0x61, 0x7b, 0x28, 0x00,
-- 0xd1, 0xcf, 0x68, 0xb8, 0x30, 0x01, 0x60, 0xb8,
-- 0x23, 0x09, 0x68, 0x7a, 0x1c, 0x01, 0x42, 0x90,
-- 0xdc, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0x20, 0x1c, 0x55, 0x42, 0x8d,
-- 0xd1, 0x03, 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x1c, 0x95, 0x42, 0x8d, 0xd1, 0x0d,
-- 0x7e, 0x3d, 0x2d, 0xff, 0xd0, 0x0a, 0x2d, 0x00,
-- 0xd0, 0x03, 0x60, 0xfb, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0x19, 0x61, 0x38, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x32, 0x03, 0x42, 0x8a,
-- 0xd1, 0x04, 0x20, 0x22, 0x61, 0x78, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x69, 0xf9, 0x60, 0x21,
-- 0x68, 0x79, 0x68, 0xba, 0x31, 0x04, 0x42, 0x91,
-- 0xd1, 0x0a, 0x69, 0xf9, 0x29, 0x00, 0xd0, 0x03,
-- 0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0xf0, 0x04, 0xf8, 0xac, 0x20, 0x00, 0x60, 0x38,
-- 0x69, 0xf8, 0x60, 0x20, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68,
-- 0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x43, 0x7c,
-- 0x2e, 0x08, 0x00, 0x68, 0xb5, 0xb0, 0x04, 0x0b,
-- 0x0c, 0x1b, 0x04, 0x14, 0x0c, 0x24, 0x49, 0x14,
-- 0x68, 0x0a, 0x2a, 0x00, 0xd0, 0x02, 0x68, 0x0a,
-- 0x2a, 0x00, 0xd1, 0xfc, 0x22, 0x01, 0x60, 0x0a,
-- 0x2b, 0x0a, 0xdd, 0x00, 0x23, 0x0a, 0x22, 0x00,
-- 0x4f, 0x0e, 0x2b, 0x00, 0xdd, 0x05, 0x00, 0x55,
-- 0x5b, 0x45, 0x54, 0xbd, 0x32, 0x01, 0x42, 0x9a,
-- 0xdb, 0xf9, 0x76, 0x0c, 0x20, 0xff, 0x18, 0xfa,
-- 0x70, 0x50, 0x20, 0x00, 0x60, 0x4b, 0x22, 0x20,
-- 0x61, 0x08, 0x61, 0x4a, 0x60, 0x88, 0x60, 0xc8,
-- 0x49, 0x05, 0x20, 0x32, 0xf0, 0x04, 0xf8, 0x48,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x43, 0x7c,
-- 0x2e, 0x00, 0x17, 0x01, 0xb5, 0x80, 0x04, 0x01,
-- 0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88,
-- 0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01,
-- 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7,
-- 0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2,
-- 0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04,
-- 0xfb, 0x17, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42,
-- 0x18, 0x12, 0x00, 0x92, 0x4b, 0x04, 0x5a, 0x9a,
-- 0x81, 0x0a, 0xb0, 0x08, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x88,
-- 0x2e, 0x08, 0x47, 0x78, 0xb5, 0xf0, 0xb0, 0xb3,
-- 0xa8, 0x01, 0xf0, 0x0f, 0xfd, 0xc9, 0x49, 0x61,
-- 0x68, 0x0f, 0x68, 0x4d, 0x68, 0x8c, 0x03, 0x20,
-- 0x05, 0x2a, 0x0d, 0x12, 0x43, 0x10, 0x04, 0x00,
-- 0x0c, 0x00, 0x4b, 0x5d, 0x8e, 0x9a, 0x2a, 0x00,
-- 0xd1, 0x16, 0x89, 0xda, 0x42, 0x90, 0xd0, 0x01,
-- 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x89, 0x9e,
-- 0x42, 0xb7, 0xd0, 0x01, 0x26, 0x01, 0xe0, 0x00,
-- 0x26, 0x00, 0x43, 0x32, 0xd0, 0x08, 0x81, 0x9f,
-- 0x81, 0xd8, 0x20, 0x00, 0x85, 0x58, 0x20, 0x0d,
-- 0x85, 0x18, 0x20, 0x01, 0x02, 0x40, 0x86, 0x98,
-- 0x68, 0xce, 0x69, 0x08, 0x90, 0x00, 0x1c, 0x38,
-- 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xfa, 0x72,
-- 0x1c, 0x20, 0xf0, 0x00, 0xfb, 0x8d, 0xa0, 0x4b,
-- 0x22, 0x00, 0x21, 0x11, 0xf0, 0x04, 0xff, 0xc2,
-- 0x22, 0x0a, 0x21, 0x11, 0x98, 0x1b, 0xf0, 0x05,
-- 0xf8, 0x1f, 0x22, 0x14, 0x21, 0x11, 0x1c, 0x38,
-- 0xf0, 0x05, 0xf8, 0x1a, 0x22, 0x1e, 0x21, 0x11,
-- 0x1c, 0x28, 0xf0, 0x05, 0xf8, 0x15, 0x22, 0x28,
-- 0x21, 0x11, 0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x10,
-- 0x22, 0x32, 0x21, 0x11, 0x1c, 0x30, 0xf0, 0x05,
-- 0xf8, 0x0b, 0x22, 0x3c, 0x21, 0x11, 0x98, 0x00,
-- 0xf0, 0x05, 0xf8, 0x06, 0xa0, 0x3b, 0x22, 0x00,
-- 0x21, 0x13, 0xf0, 0x04, 0xff, 0x9f, 0x22, 0x0a,
-- 0x21, 0x13, 0x4f, 0x35, 0x8d, 0x78, 0xf0, 0x04,
-- 0xff, 0xfb, 0xa0, 0x38, 0x22, 0x14, 0x21, 0x13,
-- 0xf0, 0x04, 0xff, 0x94, 0x22, 0x1e, 0x21, 0x13,
-- 0x8d, 0xf8, 0xf0, 0x04, 0xff, 0xf1, 0xa0, 0x35,
-- 0x22, 0x00, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x8a,
-- 0x22, 0x0a, 0x21, 0x14, 0x8e, 0xb8, 0xf0, 0x04,
-- 0xff, 0xe7, 0xa0, 0x32, 0x22, 0x14, 0x21, 0x14,
-- 0xf0, 0x04, 0xff, 0x80, 0x22, 0x1e, 0x21, 0x14,
-- 0x8e, 0xf8, 0xf0, 0x04, 0xff, 0xdd, 0xa0, 0x2f,
-- 0x22, 0x28, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x76,
-- 0x22, 0x32, 0x21, 0x14, 0x48, 0x2e, 0x6f, 0xc0,
-- 0xf0, 0x04, 0xff, 0xd2, 0xa0, 0x2d, 0x22, 0x00,
-- 0x21, 0x15, 0xf0, 0x04, 0xff, 0x6b, 0x22, 0x0a,
-- 0x21, 0x15, 0x8d, 0x38, 0xf0, 0x04, 0xff, 0xc8,
-- 0xa0, 0x2b, 0x22, 0x14, 0x21, 0x15, 0xf0, 0x04,
-- 0xff, 0x61, 0x22, 0x1e, 0x21, 0x15, 0x8d, 0xb8,
-- 0xf0, 0x04, 0xff, 0xbe, 0xa0, 0x29, 0x22, 0x00,
-- 0x21, 0x10, 0xf0, 0x04, 0xff, 0x57, 0xf0, 0x0f,
-- 0xfe, 0xf1, 0x22, 0x0a, 0x21, 0x10, 0xf0, 0x04,
-- 0xff, 0xb3, 0xa0, 0x26, 0x22, 0x14, 0x21, 0x10,
-- 0xf0, 0x04, 0xff, 0x4c, 0x22, 0x1e, 0x21, 0x10,
-- 0x27, 0x33, 0x06, 0x7f, 0x6d, 0x78, 0xf0, 0x04,
-- 0xff, 0xa7, 0xa0, 0x22, 0x22, 0x28, 0x21, 0x10,
-- 0xf0, 0x04, 0xff, 0x40, 0xf0, 0x0f, 0xfe, 0xda,
-- 0x6d, 0x79, 0x1a, 0x08, 0x22, 0x32, 0x21, 0x10,
-- 0xf0, 0x04, 0xff, 0x9a, 0xb0, 0x33, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0c, 0x00,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x73, 0x74, 0x61, 0x74,
-- 0x73, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x6c, 0x65,
-- 0x6e, 0x3a, 0x00, 0x00, 0x74, 0x78, 0x6c, 0x65,
-- 0x6e, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x62, 0x75,
-- 0x66, 0x66, 0x3a, 0x00, 0x74, 0x78, 0x62, 0x75,
-- 0x66, 0x66, 0x3a, 0x00, 0x69, 0x66, 0x5f, 0x75,
-- 0x73, 0x65, 0x64, 0x3a, 0x00, 0x00, 0x00, 0x00,
-- 0x2c, 0x00, 0x1f, 0x80, 0x72, 0x78, 0x73, 0x74,
-- 0x61, 0x74, 0x65, 0x3a, 0x00, 0x00, 0x00, 0x00,
-- 0x74, 0x78, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a,
-- 0x00, 0x00, 0x00, 0x00, 0x65, 0x6e, 0x64, 0x63,
-- 0x75, 0x72, 0x3a, 0x00, 0x76, 0x69, 0x64, 0x62,
-- 0x75, 0x66, 0x3a, 0x00, 0x6f, 0x73, 0x64, 0x3a,
-- 0x00, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x25, 0x00,
-- 0x20, 0x00, 0x49, 0x19, 0x81, 0xc8, 0x81, 0x88,
-- 0x4e, 0x18, 0x4c, 0x19, 0x4f, 0x19, 0x68, 0x30,
-- 0x68, 0x00, 0x00, 0x40, 0x0a, 0x40, 0x02, 0x40,
-- 0x21, 0x19, 0x06, 0x89, 0x6a, 0x89, 0x4b, 0x16,
-- 0x40, 0x19, 0x0a, 0x49, 0x43, 0x08, 0x49, 0x15,
-- 0x64, 0x08, 0xf0, 0x01, 0xfc, 0x57, 0xf0, 0x02,
-- 0xf9, 0x6b, 0x68, 0x38, 0x30, 0x01, 0x60, 0x38,
-- 0x48, 0x11, 0x88, 0x01, 0x31, 0x01, 0x80, 0x01,
-- 0x20, 0x0c, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x9a,
-- 0x29, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xfe, 0xd6,
-- 0x20, 0x32, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x92,
-- 0x42, 0x85, 0xd0, 0xd8, 0x1c, 0x05, 0xf0, 0x00,
-- 0xfe, 0x39, 0x20, 0x00, 0x60, 0x38, 0xe7, 0xd2,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x5e, 0x38,
-- 0x2e, 0x08, 0x05, 0xb0, 0x2e, 0x08, 0x01, 0x88,
-- 0x00, 0x03, 0xfe, 0x00, 0x2c, 0x00, 0x1f, 0x80,
-- 0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0xf0, 0x27, 0x00,
-- 0xb0, 0x94, 0x46, 0x68, 0x4c, 0x2f, 0xcc, 0x6e,
-- 0xc0, 0x6e, 0xcc, 0x6e, 0xc0, 0x6e, 0x23, 0x28,
-- 0x22, 0x41, 0x00, 0xd2, 0x21, 0x00, 0x20, 0x01,
-- 0xf0, 0x08, 0xfa, 0x30, 0x22, 0xff, 0x21, 0x64,
-- 0x20, 0x01, 0x32, 0xf5, 0xf0, 0x08, 0xfa, 0xf2,
-- 0x20, 0x00, 0x46, 0x69, 0x5c, 0x09, 0x40, 0x41,
-- 0x23, 0x35, 0x40, 0x59, 0xaa, 0x0a, 0x54, 0x11,
-- 0x30, 0x01, 0x28, 0x25, 0xdb, 0xf5, 0x24, 0x00,
-- 0xa9, 0x0a, 0x54, 0x0c, 0x22, 0x00, 0x20, 0x01,
-- 0x1c, 0x23, 0xf0, 0x08, 0xfd, 0x50, 0x4e, 0x1e,
-- 0x4d, 0x1e, 0x4c, 0x1f, 0xf0, 0x03, 0xff, 0x80,
-- 0xf0, 0x03, 0xff, 0x7e, 0x28, 0x28, 0xd9, 0x10,
-- 0x42, 0xb0, 0xd3, 0x0e, 0x69, 0xe9, 0x08, 0xc9,
-- 0xd3, 0x0b, 0x4b, 0x1a, 0x18, 0xc1, 0x20, 0x1e,
-- 0xf0, 0x17, 0xf8, 0x40, 0x21, 0x64, 0x1d, 0xc2,
-- 0x32, 0xff, 0x32, 0xee, 0x20, 0x01, 0xf0, 0x08,
-- 0xfa, 0xc5, 0xf0, 0x01, 0xfb, 0xe7, 0xf0, 0x02,
-- 0xf8, 0xfb, 0xf0, 0x03, 0xff, 0x65, 0x1c, 0x01,
-- 0x20, 0x7d, 0x00, 0xc0, 0xf0, 0x17, 0xf8, 0x2e,
-- 0x1c, 0x01, 0x48, 0x0f, 0x88, 0x02, 0x32, 0x01,
-- 0x80, 0x02, 0x42, 0xb9, 0xd0, 0xd6, 0x2f, 0x04,
-- 0xd3, 0x06, 0x20, 0x01, 0xf0, 0x08, 0xf9, 0xce,
-- 0xb0, 0x14, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0xc7, 0x20, 0x00,
-- 0x60, 0x20, 0xe7, 0xc7, 0x2e, 0x02, 0x5e, 0x00,
-- 0x00, 0x00, 0x0b, 0xb8, 0x72, 0x00, 0x01, 0x00,
-- 0x2e, 0x08, 0x01, 0x88, 0xff, 0xff, 0xf4, 0x48,
-- 0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0x80, 0x27, 0x00,
-- 0x48, 0x07, 0x81, 0x07, 0xf0, 0x03, 0xfd, 0x5e,
-- 0xf7, 0xff, 0xff, 0x88, 0xf0, 0x00, 0xf8, 0xce,
-- 0xf0, 0x05, 0xfe, 0xfe, 0xf7, 0xff, 0xff, 0x3e,
-- 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x4d, 0x29,
-- 0x68, 0x01, 0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb,
-- 0x68, 0x41, 0x10, 0x89, 0x68, 0x82, 0x10, 0x92,
-- 0x00, 0x89, 0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03,
-- 0x05, 0x89, 0x27, 0x35, 0x06, 0x7f, 0x60, 0x39,
-- 0x49, 0x21, 0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6,
-- 0x60, 0x0e, 0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04,
-- 0xc8, 0x40, 0xc5, 0x40, 0x31, 0x01, 0x42, 0x99,
-- 0xd3, 0xfa, 0x23, 0x00, 0x49, 0x1b, 0x65, 0x8b,
-- 0x20, 0x00, 0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20,
-- 0x64, 0x8d, 0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa,
-- 0x48, 0x17, 0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b,
-- 0x60, 0x3b, 0x22, 0x01, 0x64, 0xca, 0x21, 0x00,
-- 0x4a, 0x14, 0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05,
-- 0x33, 0x01, 0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01,
-- 0x42, 0x91, 0xdb, 0xf6, 0x48, 0x10, 0x68, 0x01,
-- 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x49, 0x0f,
-- 0x20, 0x33, 0x06, 0x40, 0x65, 0x41, 0x49, 0x0e,
-- 0x65, 0x81, 0x49, 0x0e, 0x66, 0x81, 0x39, 0x04,
-- 0x66, 0x41, 0x21, 0x03, 0x67, 0x01, 0x21, 0x00,
-- 0x20, 0x0d, 0xf0, 0x0f, 0xf9, 0xc9, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x70, 0x6a, 0x00, 0x00, 0x80,
-- 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10,
-- 0x6a, 0x00, 0x00, 0x10, 0xcc, 0x00, 0x0f, 0x84,
-- 0xcc, 0x00, 0x0f, 0x88, 0x98, 0x00, 0x0f, 0x88,
-- 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08,
-- 0xf0, 0x0f, 0xfe, 0x04, 0x48, 0x08, 0x21, 0x40,
-- 0xf0, 0x0f, 0xfa, 0xd4, 0x20, 0x01, 0x21, 0x35,
-- 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0,
-- 0x49, 0x04, 0x63, 0x08, 0x20, 0x00, 0x21, 0x39,
-- 0x06, 0x49, 0x62, 0xc8, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x01, 0xcc, 0x90, 0x72, 0x00, 0x01, 0x00,
-- 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0f, 0xd0, 0x10,
-- 0x29, 0x01, 0xd0, 0x12, 0x29, 0x02, 0xd0, 0x14,
-- 0x29, 0x03, 0xd1, 0x01, 0x49, 0x0c, 0x60, 0x01,
-- 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00,
-- 0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x43, 0xbc, 0x08,
-- 0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01,
-- 0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01,
-- 0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01,
-- 0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94,
-- 0x00, 0x08, 0x10, 0x08, 0xb5, 0x00, 0x1c, 0x01,
-- 0x48, 0x0b, 0xd0, 0x0e, 0x29, 0x01, 0xd0, 0x0f,
-- 0x29, 0x02, 0xd1, 0x01, 0x21, 0x04, 0x60, 0x41,
-- 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00,
-- 0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x1f, 0xbc, 0x08,
-- 0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3,
-- 0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00,
-- 0x2e, 0x08, 0x01, 0x94, 0xb5, 0x80, 0x4b, 0x09,
-- 0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x10,
-- 0xf8, 0x53, 0x20, 0x0b, 0xf0, 0x10, 0xf9, 0x75,
-- 0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03,
-- 0xff, 0x45, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc0,
-- 0x2e, 0x08, 0x01, 0xd0, 0xb5, 0xb0, 0x25, 0x00,
-- 0x1c, 0x0c, 0x1c, 0x07, 0x2a, 0x08, 0xd2, 0x30,
-- 0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x2c, 0x29, 0x29, 0x03, 0x29, 0x29, 0x03, 0x29,
-- 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x4d, 0x23, 0x2d,
-- 0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x13, 0x23, 0x0b,
-- 0x01, 0x9b, 0x42, 0x9f, 0xd0, 0x0f, 0x23, 0xff,
-- 0x33, 0xe1, 0x42, 0x9f, 0xd0, 0x0b, 0x23, 0xff,
-- 0x33, 0x61, 0x42, 0x9f, 0xd0, 0x07, 0x23, 0x21,
-- 0x01, 0x1b, 0x42, 0x9f, 0xd0, 0x03, 0x23, 0x11,
-- 0x01, 0x5b, 0x42, 0x9f, 0xd1, 0x08, 0x23, 0x09,
-- 0x01, 0x9b, 0x42, 0x9c, 0xd0, 0x09, 0x08, 0x5b,
-- 0x42, 0x9c, 0xd0, 0x06, 0x2c, 0xf0, 0xd0, 0x04,
-- 0x25, 0x01, 0xe0, 0x02, 0x20, 0x01, 0xf0, 0x00,
-- 0xf8, 0x27, 0x4f, 0x12, 0x6c, 0x78, 0x42, 0x85,
-- 0xd0, 0x1c, 0x1d, 0xfb, 0x33, 0x35, 0x2d, 0x00,
-- 0xd0, 0x12, 0x1f, 0xda, 0x3a, 0x0d, 0x21, 0x03,
-- 0x1d, 0x10, 0xb4, 0x07, 0x22, 0x0b, 0xb4, 0x04,
-- 0x1c, 0x19, 0x23, 0x00, 0x22, 0x00, 0x20, 0x00,
-- 0xf0, 0x0a, 0xfc, 0x4c, 0x6a, 0xb8, 0x1c, 0x29,
-- 0xb0, 0x04, 0xf0, 0x0b, 0xfd, 0x9b, 0xe0, 0x04,
-- 0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x0a,
-- 0xff, 0x51, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94,
-- 0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x81, 0x4d, 0x56,
-- 0x1d, 0xee, 0x36, 0x19, 0x79, 0x30, 0x42, 0x87,
-- 0xd1, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x24, 0x00, 0x6c, 0x68, 0x28, 0x00,
-- 0xd0, 0x05, 0x64, 0x6c, 0x4a, 0x4f, 0x21, 0x00,
-- 0x6a, 0xa8, 0xf0, 0x0a, 0xff, 0x33, 0x71, 0x37,
-- 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0f, 0xf8, 0xc4,
-- 0x20, 0x00, 0xf0, 0x0c, 0xfb, 0xc5, 0x20, 0x1f,
-- 0xf0, 0x09, 0xfc, 0x5a, 0x26, 0x03, 0x02, 0x76,
-- 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f,
-- 0x1c, 0x33, 0xf0, 0x09, 0xfa, 0xd1, 0x20, 0x1e,
-- 0xf0, 0x09, 0xfd, 0x18, 0x22, 0x01, 0x02, 0xd2,
-- 0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x09,
-- 0xfa, 0xc7, 0x1c, 0x39, 0x27, 0x1c, 0x48, 0x3e,
-- 0x26, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02,
-- 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x03, 0x12, 0x03, 0x21, 0x12, 0x30, 0x48, 0x39,
-- 0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xc3, 0xab, 0x00,
-- 0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9f,
-- 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0f,
-- 0xfc, 0xe5, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9,
-- 0xf0, 0x0f, 0xf9, 0xb4, 0xab, 0x00, 0x70, 0x1c,
-- 0x70, 0x5c, 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00,
-- 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, 0xfc, 0xd6,
-- 0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xa6,
-- 0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58,
-- 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00,
-- 0x20, 0x08, 0xf0, 0x0f, 0xfc, 0xc7, 0xe0, 0x0d,
-- 0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x0f, 0xf9, 0x96,
-- 0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9e,
-- 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08,
-- 0xf0, 0x0f, 0xfc, 0xb8, 0x20, 0x01, 0x21, 0x35,
-- 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0,
-- 0x49, 0x19, 0x63, 0x08, 0x20, 0x39, 0x06, 0x40,
-- 0x62, 0xc4, 0xcd, 0x03, 0x43, 0x08, 0x22, 0x00,
-- 0x21, 0x1e, 0xf0, 0x0f, 0xfd, 0x0f, 0x48, 0x15,
-- 0xf0, 0x0c, 0xfa, 0xd0, 0x20, 0x00, 0xf0, 0x0c,
-- 0xfb, 0x41, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68,
-- 0x20, 0x00, 0xf0, 0x03, 0xfb, 0x3f, 0x20, 0x01,
-- 0xf0, 0x0c, 0xfb, 0x46, 0x4a, 0x0e, 0xb4, 0x04,
-- 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8,
-- 0xf7, 0xfe, 0xfb, 0x4e, 0x21, 0x00, 0x20, 0x0d,
-- 0xb0, 0x01, 0xf0, 0x0f, 0xf8, 0x35, 0xb0, 0x01,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xd0,
-- 0x2e, 0x02, 0x12, 0xfc, 0x2e, 0x01, 0xcc, 0x90,
-- 0x72, 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x80,
-- 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe,
-- 0xb5, 0xb0, 0x1c, 0x07, 0x4c, 0x10, 0x6a, 0x20,
-- 0x42, 0x87, 0xd0, 0x19, 0x20, 0x00, 0x2f, 0x03,
-- 0xd1, 0x02, 0x21, 0x01, 0x61, 0x61, 0xe0, 0x00,
-- 0x61, 0x60, 0x21, 0x02, 0x4d, 0x0b, 0x60, 0x29,
-- 0x71, 0x28, 0x71, 0x68, 0x22, 0x01, 0xb4, 0x04,
-- 0x7a, 0x23, 0x7c, 0x22, 0x7b, 0x21, 0x20, 0x00,
-- 0xf0, 0x0f, 0xfb, 0x02, 0x69, 0x61, 0x1c, 0x28,
-- 0xb0, 0x01, 0xf0, 0x10, 0xfb, 0xa9, 0x62, 0x27,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac,
-- 0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a,
-- 0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48,
-- 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00,
-- 0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff,
-- 0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a,
-- 0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xdc,
-- 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x0b,
-- 0xd0, 0x02, 0x20, 0x00, 0x73, 0x38, 0xe0, 0x01,
-- 0x20, 0x01, 0x73, 0x38, 0x22, 0x01, 0xb4, 0x04,
-- 0x7a, 0x3b, 0x7c, 0x3a, 0x7b, 0x39, 0x20, 0x00,
-- 0xf0, 0x0f, 0xfa, 0xca, 0x69, 0x79, 0xb0, 0x01,
-- 0x48, 0x03, 0xf0, 0x10, 0xfb, 0x71, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x94,
-- 0x2e, 0x08, 0x01, 0xac, 0xb5, 0x80, 0x06, 0x00,
-- 0x0e, 0x00, 0x1c, 0x01, 0x4f, 0x08, 0x74, 0x39,
-- 0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7b, 0x39,
-- 0x1c, 0x02, 0x20, 0x00, 0xf0, 0x0f, 0xfa, 0xb0,
-- 0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x10,
-- 0xfb, 0x57, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac,
-- 0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01,
-- 0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09,
-- 0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39,
-- 0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20,
-- 0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x43, 0x88,
-- 0x2e, 0x08, 0x44, 0x08, 0x2e, 0x08, 0x44, 0x48,
-- 0x2e, 0x08, 0x44, 0x28, 0x06, 0x00, 0x0e, 0x00,
-- 0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05,
-- 0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00,
-- 0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03,
-- 0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe4,
-- 0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08,
-- 0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38,
-- 0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x23,
-- 0xfb, 0xc1, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1,
-- 0x31, 0x05, 0x20, 0x00, 0xf0, 0x23, 0xfb, 0xba,
-- 0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09,
-- 0x20, 0x00, 0xf0, 0x23, 0xfb, 0xb3, 0x43, 0x2c,
-- 0x1c, 0x20, 0x4c, 0x2c, 0x68, 0x21, 0x43, 0x08,
-- 0x27, 0x00, 0x60, 0x20, 0x1c, 0x05, 0xd0, 0x4a,
-- 0x48, 0x29, 0x90, 0x03, 0x48, 0x29, 0x90, 0x02,
-- 0x4a, 0x29, 0x92, 0x01, 0x4e, 0x29, 0x08, 0x68,
-- 0xd3, 0x3c, 0x98, 0x03, 0x5d, 0xc0, 0x28, 0x00,
-- 0xd0, 0x32, 0x98, 0x02, 0x5d, 0xc0, 0x28, 0x00,
-- 0xd0, 0x2a, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10,
-- 0xff, 0x69, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01,
-- 0xd1, 0x1b, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60,
-- 0x5d, 0xf0, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff,
-- 0x55, 0xf0, 0x21, 0x00, 0x00, 0xb8, 0x9a, 0x01,
-- 0x50, 0x11, 0xe0, 0x1f, 0x20, 0x02, 0x1c, 0x39,
-- 0xf0, 0x00, 0xf8, 0x8e, 0x28, 0x00, 0xd1, 0x19,
-- 0x21, 0x00, 0x55, 0xf1, 0x20, 0x01, 0x40, 0xb8,
-- 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20,
-- 0xe0, 0x10, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0,
-- 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0xe0, 0x09,
-- 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 0xe0, 0x05,
-- 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21,
-- 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 0x06, 0x07,
-- 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xbb, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x01, 0xe4,
-- 0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x44, 0x48,
-- 0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08,
-- 0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x4c, 0x26,
-- 0x68, 0x25, 0x2d, 0x00, 0xd0, 0x44, 0x4e, 0x25,
-- 0x48, 0x25, 0x90, 0x04, 0x49, 0x25, 0x91, 0x03,
-- 0x4a, 0x25, 0x92, 0x02, 0x48, 0x25, 0x90, 0x01,
-- 0x08, 0x68, 0xd3, 0x34, 0x5d, 0xf0, 0x28, 0x00,
-- 0xd0, 0x2b, 0x98, 0x04, 0x5d, 0xc0, 0x28, 0x00,
-- 0xd0, 0x2d, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10,
-- 0xff, 0x05, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01,
-- 0xd1, 0x18, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60,
-- 0x00, 0xb8, 0x99, 0x03, 0x58, 0x09, 0x69, 0x09,
-- 0x9a, 0x02, 0x50, 0x11, 0x20, 0x02, 0x1c, 0x39,
-- 0xf0, 0x00, 0xf8, 0x2e, 0x28, 0x00, 0xd1, 0x16,
-- 0x21, 0x00, 0x98, 0x01, 0x55, 0xc1, 0x20, 0x01,
-- 0x40, 0xb8, 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08,
-- 0x60, 0x20, 0xe0, 0x0c, 0x20, 0x01, 0x40, 0xb8,
-- 0x43, 0xc0, 0x68, 0x21, 0x40, 0x08, 0x60, 0x20,
-- 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0,
-- 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78,
-- 0x06, 0x07, 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xc3,
-- 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x44, 0x28,
-- 0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x5e, 0x5c,
-- 0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08,
-- 0xb4, 0xf0, 0x06, 0x03, 0x0e, 0x1b, 0xb0, 0x82,
-- 0x93, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa2,
-- 0xb0, 0x81, 0x48, 0x33, 0x58, 0x80, 0x90, 0x00,
-- 0x28, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03,
-- 0xbc, 0xf0, 0x47, 0x70, 0x48, 0x2f, 0x68, 0x00,
-- 0x18, 0x17, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80,
-- 0x49, 0x2d, 0x68, 0x09, 0x18, 0x41, 0x9b, 0x01,
-- 0x48, 0x2c, 0x4d, 0x2d, 0x95, 0x02, 0x2b, 0x01,
-- 0xd0, 0x2a, 0x2b, 0x02, 0xd1, 0x47, 0x4d, 0x2b,
-- 0x58, 0xab, 0x2b, 0x00, 0xd1, 0x03, 0x20, 0xff,
-- 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4b,
-- 0x23, 0x00, 0x50, 0xab, 0x22, 0x00, 0x5c, 0x83,
-- 0x42, 0xa3, 0xd1, 0x07, 0x00, 0x93, 0x9d, 0x02,
-- 0x58, 0xeb, 0x78, 0x5e, 0x1c, 0x5d, 0x23, 0x80,
-- 0x43, 0x9e, 0x70, 0x2e, 0x32, 0x01, 0x06, 0x12,
-- 0x0e, 0x12, 0x2a, 0x20, 0xdb, 0xef, 0x88, 0x08,
-- 0x4b, 0x1d, 0x40, 0x18, 0x80, 0x08, 0x98, 0x00,
-- 0x9b, 0x01, 0x70, 0xc3, 0x68, 0x38, 0x23, 0x01,
-- 0x03, 0x5b, 0x43, 0x18, 0x60, 0x38, 0xe0, 0x1a,
-- 0x68, 0x3a, 0x4b, 0x18, 0x40, 0x1a, 0x60, 0x3a,
-- 0x9a, 0x00, 0x9b, 0x01, 0x70, 0xd3, 0x23, 0x00,
-- 0x60, 0x8b, 0x70, 0xcb, 0x60, 0xcb, 0x21, 0x00,
-- 0x5c, 0x42, 0x42, 0xa2, 0xd1, 0x06, 0x00, 0x8a,
-- 0x9d, 0x02, 0x58, 0xaa, 0x78, 0x57, 0x23, 0x80,
-- 0x43, 0x3b, 0x70, 0x53, 0x31, 0x01, 0x06, 0x09,
-- 0x0e, 0x09, 0x29, 0x20, 0xdb, 0xf0, 0x20, 0x00,
-- 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x20, 0xbc,
-- 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4,
-- 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x43, 0x88,
-- 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff,
-- 0xb4, 0xf0, 0x78, 0x43, 0x00, 0x9e, 0x49, 0x32,
-- 0x59, 0x8c, 0x88, 0x42, 0x68, 0x87, 0x68, 0x40,
-- 0x1d, 0xf9, 0x31, 0xb9, 0x1a, 0x09, 0x42, 0x91,
-- 0xda, 0x3d, 0x25, 0x00, 0x1c, 0x18, 0x00, 0xdb,
-- 0x1a, 0x18, 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b,
-- 0x18, 0xc0, 0x78, 0x80, 0x06, 0xc0, 0x0e, 0xc0,
-- 0x28, 0x12, 0xd1, 0x02, 0x29, 0x0e, 0xda, 0x00,
-- 0x25, 0x01, 0x2a, 0x00, 0xdd, 0x2b, 0x42, 0x8a,
-- 0xdd, 0x05, 0x68, 0x3f, 0x2f, 0x00, 0xd1, 0x02,
-- 0x20, 0xba, 0xbc, 0xf0, 0x47, 0x70, 0x1a, 0x52,
-- 0x79, 0xb9, 0x23, 0xc0, 0x1a, 0x59, 0x79, 0xfb,
-- 0x1d, 0x38, 0x08, 0x5b, 0xd3, 0x01, 0x22, 0x00,
-- 0xe0, 0x16, 0x2d, 0x00, 0xd0, 0x14, 0x42, 0x91,
-- 0xdb, 0x01, 0x31, 0x01, 0xe0, 0x10, 0x1c, 0x4b,
-- 0x42, 0x93, 0xd1, 0x0d, 0x78, 0x85, 0x2d, 0x09,
-- 0xdd, 0x06, 0x79, 0x05, 0x78, 0x80, 0x35, 0x09,
-- 0x42, 0x85, 0xd0, 0x05, 0x1c, 0x19, 0xe0, 0x03,
-- 0x78, 0x80, 0x28, 0x09, 0xd1, 0x00, 0x1c, 0x19,
-- 0x25, 0x00, 0x2a, 0x00, 0xdc, 0xd3, 0x69, 0x21,
-- 0x20, 0x00, 0x1c, 0x0a, 0x42, 0xb9, 0xd0, 0xd4,
-- 0x68, 0x0b, 0x42, 0xbb, 0xd0, 0x08, 0x68, 0x09,
-- 0x29, 0x00, 0xd1, 0x02, 0x20, 0xba, 0xbc, 0xf0,
-- 0x47, 0x70, 0x68, 0x0b, 0x42, 0xbb, 0xd1, 0xf6,
-- 0x4b, 0x07, 0x51, 0x9a, 0x60, 0x08, 0x69, 0xa2,
-- 0x69, 0x23, 0x60, 0x13, 0x61, 0xa1, 0x61, 0x27,
-- 0x61, 0x67, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4,
-- 0x2e, 0x08, 0x43, 0x88, 0xb5, 0xf0, 0x06, 0x07,
-- 0x0e, 0x3f, 0x04, 0x0c, 0x0c, 0x24, 0x06, 0x15,
-- 0x0e, 0x2d, 0x00, 0xf8, 0x49, 0x2c, 0x68, 0x09,
-- 0x18, 0x40, 0x00, 0xb9, 0x4a, 0x2b, 0x68, 0x12,
-- 0x18, 0x8a, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89,
-- 0x4b, 0x29, 0x68, 0x1b, 0x18, 0xc9, 0x68, 0x16,
-- 0x23, 0x01, 0x03, 0x5b, 0x43, 0x9e, 0x60, 0x16,
-- 0x68, 0x06, 0x23, 0x03, 0x03, 0x9b, 0x43, 0x9e,
-- 0x60, 0x06, 0x4b, 0x24, 0x42, 0x9c, 0xd0, 0x36,
-- 0x68, 0x06, 0x23, 0x21, 0x43, 0x9e, 0x60, 0x06,
-- 0x68, 0x16, 0x23, 0x07, 0x03, 0x5b, 0x40, 0x33,
-- 0x60, 0x13, 0x23, 0x07, 0x03, 0x5b, 0x43, 0x9c,
-- 0x1c, 0x23, 0x68, 0x14, 0x43, 0x23, 0x60, 0x13,
-- 0x22, 0x00, 0x75, 0x0a, 0x88, 0x0c, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x9c, 0x80, 0x0c, 0x07, 0xab,
-- 0x0f, 0x9b, 0x2b, 0x01, 0xd1, 0x04, 0x88, 0x0c,
-- 0x23, 0x10, 0x43, 0x23, 0x80, 0x0b, 0xe0, 0x03,
-- 0x88, 0x0c, 0x23, 0x10, 0x43, 0x9c, 0x80, 0x0c,
-- 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19,
-- 0x60, 0x01, 0x00, 0xf9, 0x4b, 0x0e, 0x68, 0x1b,
-- 0x18, 0xc9, 0x60, 0x4a, 0x68, 0x01, 0x4b, 0x0d,
-- 0x43, 0x19, 0x60, 0x01, 0x68, 0x01, 0x60, 0x01,
-- 0x21, 0x0f, 0x60, 0x41, 0xe0, 0x04, 0x1c, 0x38,
-- 0xf0, 0x0d, 0xff, 0x1a, 0x28, 0x00, 0xd1, 0x00,
-- 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0xa0,
-- 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07,
-- 0xb0, 0x8a, 0x48, 0x58, 0x29, 0x00, 0xd1, 0x0a,
-- 0x4d, 0x57, 0x69, 0x01, 0x91, 0x04, 0x49, 0x57,
-- 0x91, 0x03, 0x69, 0x41, 0x91, 0x02, 0x6a, 0x00,
-- 0x1e, 0x43, 0x93, 0x01, 0xe0, 0x0b, 0x29, 0x20,
-- 0xd1, 0x15, 0x4d, 0x53, 0x69, 0x81, 0x91, 0x04,
-- 0x49, 0x52, 0x91, 0x03, 0x69, 0xc1, 0x91, 0x02,
-- 0x6a, 0x40, 0x1e, 0x43, 0x93, 0x01, 0x24, 0x00,
-- 0x4b, 0x4f, 0x93, 0x09, 0x4a, 0x4f, 0x92, 0x08,
-- 0x4b, 0x4f, 0x93, 0x07, 0x4e, 0x4f, 0x96, 0x06,
-- 0x4a, 0x4f, 0x92, 0x05, 0xe0, 0x7a, 0x20, 0xb3,
-- 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x98, 0x04, 0x00, 0x80, 0x19, 0x40, 0x23, 0x01,
-- 0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x98, 0x04,
-- 0x00, 0x80, 0x58, 0x28, 0x9a, 0x04, 0x18, 0xaa,
-- 0x00, 0x5b, 0x18, 0xd2, 0x78, 0x12, 0x92, 0x00,
-- 0x22, 0x00, 0x9b, 0x04, 0x18, 0xee, 0x23, 0x01,
-- 0x02, 0xdb, 0x18, 0xf3, 0x70, 0x1a, 0x9a, 0x04,
-- 0x32, 0x01, 0x92, 0x04, 0x9b, 0x01, 0x40, 0x1a,
-- 0x92, 0x04, 0x29, 0x00, 0xd0, 0x56, 0xb0, 0x82,
-- 0x91, 0x01, 0x21, 0x01, 0x9a, 0x02, 0x2a, 0x80,
-- 0xd1, 0x19, 0x22, 0x00, 0x9b, 0x01, 0x40, 0x0b,
-- 0xd0, 0x10, 0x9b, 0x0b, 0x5c, 0x9b, 0x2b, 0xff,
-- 0xd0, 0x0c, 0x9b, 0x0b, 0x5c, 0x9b, 0x93, 0x00,
-- 0x00, 0x91, 0x9a, 0x0a, 0x58, 0x52, 0x00, 0xa1,
-- 0x19, 0xc9, 0x61, 0x0a, 0x1c, 0x61, 0x06, 0x0c,
-- 0x0e, 0x24, 0xe0, 0x1c, 0x00, 0x49, 0x32, 0x01,
-- 0x2a, 0x10, 0xd3, 0xe7, 0xe0, 0x17, 0x22, 0x00,
-- 0x9b, 0x01, 0x40, 0x0b, 0xd0, 0x0f, 0x9b, 0x09,
-- 0x5c, 0x9b, 0x2b, 0xff, 0xd0, 0x0b, 0x93, 0x00,
-- 0x00, 0x93, 0x9e, 0x08, 0x58, 0xf6, 0x00, 0xa3,
-- 0x19, 0xdb, 0x61, 0x1e, 0x28, 0x00, 0xd0, 0x02,
-- 0x1c, 0x63, 0x06, 0x1c, 0x0e, 0x24, 0x00, 0x49,
-- 0x32, 0x01, 0x2a, 0x20, 0xd3, 0xe8, 0x2c, 0x00,
-- 0xd0, 0x1b, 0x9b, 0x00, 0x70, 0x7b, 0x60, 0x78,
-- 0x9b, 0x00, 0x00, 0x99, 0x9a, 0x07, 0x58, 0x52,
-- 0x69, 0x51, 0xe0, 0x07, 0x68, 0x09, 0x29, 0x00,
-- 0xd1, 0x04, 0x20, 0xba, 0xb0, 0x0c, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x42, 0x88, 0xd3, 0xf5,
-- 0x1d, 0xcb, 0x33, 0xb9, 0x42, 0x83, 0xd3, 0xf1,
-- 0x60, 0xb9, 0x61, 0x51, 0x1c, 0x38, 0xf0, 0x0d,
-- 0xff, 0x24, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02,
-- 0x42, 0x88, 0xd0, 0x01, 0x2c, 0x00, 0xd0, 0x83,
-- 0x70, 0x3c, 0x98, 0x04, 0x99, 0x03, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80,
-- 0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x90,
-- 0x2e, 0x08, 0x69, 0x90, 0x9e, 0x00, 0x04, 0x98,
-- 0x2e, 0x08, 0x5f, 0xc4, 0x2e, 0x08, 0x5f, 0x64,
-- 0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5e, 0xe4,
-- 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0x00, 0x20, 0xff,
-- 0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00,
-- 0xf0, 0x1a, 0xf9, 0x9e, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x01, 0xe4, 0xb5, 0xf0, 0x06, 0x07,
-- 0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x20, 0x10,
-- 0x2f, 0x1f, 0xdc, 0x2c, 0x2c, 0x1f, 0xdc, 0x2a,
-- 0x1c, 0x39, 0x43, 0x21, 0x08, 0x49, 0xd2, 0x26,
-- 0x49, 0x14, 0x1c, 0x38, 0xf0, 0x1a, 0xf9, 0x9a,
-- 0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30,
-- 0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x1a,
-- 0xf9, 0x84, 0xf0, 0x1a, 0xf9, 0x87, 0x43, 0xa8,
-- 0xf0, 0x1a, 0xf9, 0x88, 0xf0, 0x1a, 0xf9, 0x82,
-- 0x43, 0xa0, 0xf0, 0x1a, 0xf9, 0x83, 0x1c, 0x38,
-- 0xf0, 0x10, 0xf8, 0x66, 0x1c, 0x04, 0xd1, 0x07,
-- 0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a,
-- 0x1c, 0x33, 0xf0, 0x10, 0xff, 0x17, 0x1c, 0x04,
-- 0xf7, 0xff, 0xfc, 0x8e, 0x1c, 0x20, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2d, 0x43,
-- 0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d,
-- 0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05,
-- 0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00,
-- 0xb4, 0x07, 0x21, 0x10, 0x1c, 0x1a, 0xb4, 0x06,
-- 0x23, 0x10, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32,
-- 0xf0, 0x00, 0xf8, 0x54, 0xb0, 0x05, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04,
-- 0x0e, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16,
-- 0x0e, 0x36, 0x9f, 0x05, 0x06, 0x38, 0x0e, 0x00,
-- 0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x21, 0x18,
-- 0x1c, 0x1a, 0xb4, 0x06, 0x23, 0x11, 0x1c, 0x20,
-- 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xf8, 0x3a,
-- 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d,
-- 0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05,
-- 0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00,
-- 0xb4, 0x07, 0x21, 0x20, 0x1c, 0x1a, 0xb4, 0x06,
-- 0x23, 0x51, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x32,
-- 0xf0, 0x00, 0xf8, 0x20, 0xb0, 0x05, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x03,
-- 0x0e, 0x1b, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16,
-- 0x0e, 0x36, 0x9c, 0x09, 0x9f, 0x0a, 0x06, 0x20,
-- 0x0e, 0x00, 0x22, 0x00, 0x1c, 0x39, 0xb4, 0x07,
-- 0x21, 0x10, 0x9a, 0x06, 0xb4, 0x06, 0x1c, 0x18,
-- 0x23, 0x62, 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00,
-- 0xf8, 0x05, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9e, 0x09,
-- 0x9f, 0x0b, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x09,
-- 0x0c, 0x09, 0xb0, 0x88, 0x91, 0x00, 0x06, 0x15,
-- 0x0e, 0x2d, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01,
-- 0x06, 0x32, 0x0e, 0x12, 0x92, 0x02, 0x06, 0x38,
-- 0x0e, 0x00, 0x90, 0x03, 0xb0, 0x82, 0xf0, 0x1a,
-- 0xf8, 0xe9, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff,
-- 0x90, 0x00, 0xf0, 0x1a, 0xf8, 0xe3, 0x23, 0x01,
-- 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x1a, 0xf8, 0xe2,
-- 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x03,
-- 0x08, 0x40, 0xd3, 0x02, 0x22, 0x12, 0x92, 0x01,
-- 0xe0, 0x01, 0x22, 0x11, 0x92, 0x01, 0x22, 0x01,
-- 0x1c, 0x11, 0x40, 0xa9, 0x4b, 0x5f, 0x1c, 0x0f,
-- 0x68, 0x18, 0x40, 0x07, 0xd0, 0x01, 0x27, 0x11,
-- 0xe0, 0xa2, 0x27, 0x00, 0x43, 0x08, 0x60, 0x18,
-- 0x23, 0x1c, 0x98, 0x05, 0x40, 0x18, 0x28, 0x1c,
-- 0xd1, 0x06, 0x21, 0x01, 0x20, 0x7d, 0x01, 0x00,
-- 0xf0, 0x10, 0xfb, 0xc4, 0x1c, 0x06, 0xe0, 0x0d,
-- 0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01,
-- 0x20, 0xc8, 0xf0, 0x10, 0xfb, 0xbb, 0x1c, 0x06,
-- 0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x10,
-- 0xfb, 0xb5, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03,
-- 0xf9, 0x6d, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c,
-- 0x91, 0x08, 0x50, 0x88, 0x00, 0xa1, 0x91, 0x07,
-- 0x48, 0x4a, 0x90, 0x06, 0x58, 0x40, 0x28, 0x00,
-- 0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x5e,
-- 0x99, 0x07, 0x9a, 0x06, 0x50, 0x50, 0x98, 0x09,
-- 0x99, 0x08, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x04,
-- 0x98, 0x06, 0x99, 0x07, 0x58, 0x40, 0x28, 0x00,
-- 0xd1, 0x01, 0x27, 0x13, 0xe0, 0x64, 0x99, 0x07,
-- 0x4a, 0x3f, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x3a,
-- 0x9a, 0x01, 0xb4, 0x04, 0x23, 0x40, 0x1c, 0x31,
-- 0x1c, 0x22, 0xf0, 0x10, 0xfc, 0x13, 0xb0, 0x01,
-- 0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b,
-- 0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20,
-- 0xf0, 0x08, 0xfd, 0x56, 0x22, 0x00, 0xb4, 0x04,
-- 0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20,
-- 0xf0, 0x08, 0xfb, 0x8a, 0xb0, 0x01, 0x1c, 0x07,
-- 0xd1, 0x04, 0x22, 0x01, 0x48, 0x2f, 0x55, 0x02,
-- 0x48, 0x2f, 0x55, 0x02, 0x2f, 0x00, 0xd1, 0x16,
-- 0x98, 0x16, 0x28, 0x00, 0xd0, 0x13, 0x21, 0x02,
-- 0x98, 0x16, 0xf0, 0x10, 0xfb, 0x63, 0x1c, 0x07,
-- 0x00, 0x80, 0xf0, 0x03, 0xf9, 0x1b, 0x99, 0x07,
-- 0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05,
-- 0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x10, 0xfb, 0x77,
-- 0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00,
-- 0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06,
-- 0x20, 0x5c, 0xf0, 0x03, 0xf9, 0x07, 0x28, 0x00,
-- 0xd1, 0x02, 0x27, 0x13, 0xe0, 0x00, 0x20, 0x00,
-- 0x1c, 0x02, 0x98, 0x05, 0x99, 0x17, 0xb4, 0x07,
-- 0x1c, 0x2a, 0xb4, 0x04, 0x98, 0x0d, 0x99, 0x0c,
-- 0x58, 0x08, 0x99, 0x18, 0x9a, 0x08, 0x9b, 0x07,
-- 0xf0, 0x00, 0xf9, 0x1c, 0xb0, 0x04, 0x2f, 0x00,
-- 0xd1, 0x06, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08,
-- 0x1c, 0x21, 0xf0, 0x0c, 0xfd, 0xf7, 0x1c, 0x07,
-- 0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29,
-- 0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0xf0, 0x1a, 0xf8, 0x1b, 0x4b, 0x0c,
-- 0x40, 0x18, 0xf0, 0x1a, 0xf8, 0x1b, 0x1c, 0x38,
-- 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xec,
-- 0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x02, 0x70,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x44, 0x48,
-- 0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x02, 0xf0,
-- 0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07,
-- 0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83,
-- 0xf0, 0x19, 0xff, 0xf8, 0x0d, 0x40, 0xd2, 0x09,
-- 0x20, 0xff, 0x90, 0x00, 0xf0, 0x19, 0xff, 0xf2,
-- 0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x19,
-- 0xff, 0xf1, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00,
-- 0x24, 0x00, 0x20, 0x01, 0x40, 0xa8, 0x1c, 0x02,
-- 0x49, 0x3f, 0x1c, 0x13, 0x68, 0x08, 0x40, 0x03,
-- 0xd0, 0x69, 0x43, 0xd2, 0x40, 0x10, 0x00, 0xae,
-- 0x60, 0x08, 0x4d, 0x3c, 0x59, 0xa8, 0x28, 0x00,
-- 0xd0, 0x62, 0x78, 0x81, 0x91, 0x02, 0x08, 0x49,
-- 0xd3, 0x02, 0x23, 0x12, 0x93, 0x01, 0xe0, 0x01,
-- 0x23, 0x11, 0x93, 0x01, 0x1c, 0x39, 0xf0, 0x0c,
-- 0xfe, 0x11, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00,
-- 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0xac,
-- 0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01,
-- 0xf0, 0x03, 0xf8, 0xa6, 0x59, 0xa8, 0xf0, 0x03,
-- 0xf8, 0xa3, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd,
-- 0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00,
-- 0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x10, 0xf9, 0x36,
-- 0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80,
-- 0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25,
-- 0xf0, 0x10, 0xfa, 0xd1, 0x28, 0x00, 0xd0, 0x03,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x9b, 0x02,
-- 0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x08, 0xfa, 0xb8,
-- 0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01,
-- 0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a,
-- 0x1c, 0x33, 0x48, 0x18, 0xf0, 0x10, 0xfb, 0x22,
-- 0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6,
-- 0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfa, 0xc1, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03,
-- 0xf8, 0x67, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80,
-- 0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03,
-- 0xf8, 0x5f, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00,
-- 0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0xf0, 0x19, 0xff, 0x6f, 0x4b, 0x0b,
-- 0x40, 0x18, 0xf0, 0x19, 0xff, 0x6f, 0x1c, 0x20,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x01, 0xec, 0x2e, 0x08, 0x01, 0xf0,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x44, 0x28,
-- 0x2e, 0x08, 0x02, 0x70, 0xff, 0xef, 0xff, 0xff,
-- 0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x80,
-- 0x1c, 0x0c, 0x1c, 0x17, 0xb0, 0xad, 0x49, 0x1c,
-- 0x58, 0x08, 0x90, 0x04, 0x78, 0x81, 0x23, 0x04,
-- 0x40, 0x19, 0x25, 0x00, 0x29, 0x00, 0xd0, 0x0b,
-- 0xa9, 0x25, 0xf0, 0x0d, 0xf9, 0xd3, 0xab, 0x00,
-- 0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68,
-- 0x21, 0x00, 0xf0, 0x0d, 0xf9, 0xf2, 0xe0, 0x0c,
-- 0x78, 0x00, 0x0a, 0x00, 0xd3, 0x04, 0x20, 0x01,
-- 0x03, 0x00, 0xab, 0x00, 0x80, 0x58, 0xe0, 0x03,
-- 0x20, 0x01, 0x02, 0x80, 0xab, 0x00, 0x80, 0x58,
-- 0x20, 0x00, 0x28, 0x00, 0xd1, 0x0e, 0xa8, 0x00,
-- 0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xea,
-- 0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13,
-- 0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x0d,
-- 0xf9, 0xd4, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d,
-- 0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x01, 0xf0, 0xb4, 0xf0, 0x06, 0x12,
-- 0x0e, 0x12, 0x06, 0x1b, 0x0e, 0x1b, 0x9c, 0x06,
-- 0x9f, 0x07, 0x9d, 0x05, 0x9e, 0x04, 0x06, 0x36,
-- 0x0e, 0x36, 0x06, 0x2d, 0xd0, 0x02, 0x25, 0x80,
-- 0x70, 0x05, 0xe0, 0x01, 0x25, 0x00, 0x70, 0x05,
-- 0x25, 0x00, 0x70, 0x45, 0x80, 0x85, 0x72, 0x05,
-- 0x70, 0xc6, 0x70, 0x83, 0x62, 0xc4, 0x63, 0x07,
-- 0x27, 0x00, 0x23, 0x00, 0x2a, 0x00, 0xdd, 0x10,
-- 0x5c, 0xcc, 0x19, 0xc5, 0x73, 0x2c, 0x18, 0xcc,
-- 0x78, 0x66, 0x1c, 0x7c, 0x06, 0x25, 0x0e, 0x2d,
-- 0x1c, 0x3c, 0x18, 0x24, 0x77, 0x26, 0x33, 0x02,
-- 0x06, 0x1b, 0x0e, 0x1b, 0x1c, 0x2f, 0x42, 0x93,
-- 0xdb, 0xee, 0xbc, 0xf0, 0x47, 0x70, 0xb5, 0xf0,
-- 0xb0, 0xac, 0x21, 0x00, 0xa8, 0x07, 0xf0, 0x0d,
-- 0xf8, 0x59, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06,
-- 0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06,
-- 0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x0d,
-- 0xfc, 0x20, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08,
-- 0x69, 0x07, 0x78, 0xfe, 0xad, 0x07, 0x88, 0x6d,
-- 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 0xa8, 0x07,
-- 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x6f, 0x78, 0xb8,
-- 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38,
-- 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x9c, 0xe0, 0x08,
-- 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10,
-- 0xfe, 0xd9, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00,
-- 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0,
-- 0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0x3a,
-- 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39,
-- 0xf0, 0x0d, 0xfa, 0x92, 0x28, 0x00, 0xd1, 0x09,
-- 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd,
-- 0xfe, 0x89, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd,
-- 0xfe, 0x7b, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x78,
-- 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06,
-- 0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x0d,
-- 0xf8, 0xfb, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x58,
-- 0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08,
-- 0xf0, 0x0c, 0xff, 0xfc, 0x22, 0x05, 0x21, 0x16,
-- 0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x76, 0x2c, 0xb2,
-- 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x0c,
-- 0xff, 0xab, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06,
-- 0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06,
-- 0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x0d,
-- 0xfb, 0xb8, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08,
-- 0x69, 0x07, 0x78, 0xf8, 0x90, 0x07, 0xae, 0x08,
-- 0x88, 0x76, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12,
-- 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x06,
-- 0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a,
-- 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x33,
-- 0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01,
-- 0xf0, 0x10, 0xfe, 0x70, 0xe0, 0x02, 0x20, 0x40,
-- 0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00,
-- 0x09, 0xc0, 0xd3, 0x29, 0x78, 0xb8, 0x09, 0x80,
-- 0xd3, 0x0f, 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10,
-- 0xff, 0xcd, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00,
-- 0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80,
-- 0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0xd4,
-- 0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfd, 0xbe,
-- 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39,
-- 0xf0, 0x0d, 0xfa, 0x16, 0x28, 0x00, 0xd1, 0x09,
-- 0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd,
-- 0xfe, 0x0d, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd,
-- 0xfd, 0xff, 0xe0, 0x01, 0xf7, 0xfd, 0xfd, 0xfc,
-- 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06,
-- 0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00,
-- 0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x0d, 0xf8, 0x7c,
-- 0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08,
-- 0xf0, 0x0c, 0xff, 0x3e, 0xf7, 0xff, 0xf9, 0x58,
-- 0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88,
-- 0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06,
-- 0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89,
-- 0xf7, 0xff, 0xf9, 0xc6, 0xb0, 0x2d, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x26, 0x00,
-- 0x48, 0x28, 0x71, 0x06, 0x70, 0x06, 0x20, 0x00,
-- 0x4f, 0x27, 0x4a, 0x28, 0x49, 0x28, 0x00, 0x43,
-- 0x52, 0xd6, 0x52, 0xfe, 0x00, 0x83, 0x50, 0xce,
-- 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x1d,
-- 0xdb, 0xf5, 0x28, 0x20, 0xda, 0x08, 0x00, 0x43,
-- 0x52, 0xd6, 0x00, 0x83, 0x50, 0xce, 0x30, 0x01,
-- 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf6,
-- 0x20, 0x01, 0x02, 0x80, 0xf0, 0x19, 0xfd, 0xcd,
-- 0xf0, 0x19, 0xfd, 0xd0, 0x4b, 0x1b, 0x40, 0x18,
-- 0xf0, 0x19, 0xfd, 0xd0, 0x49, 0x1a, 0x20, 0x0a,
-- 0xf0, 0x19, 0xfd, 0xd0, 0x21, 0x00, 0x4f, 0x19,
-- 0x20, 0xff, 0x4a, 0x19, 0x00, 0x4b, 0x18, 0x5b,
-- 0x01, 0x1b, 0x52, 0xd7, 0x18, 0x9b, 0x70, 0x98,
-- 0x70, 0xde, 0x71, 0x1e, 0x1d, 0xdc, 0x34, 0x19,
-- 0x73, 0x26, 0x71, 0x5e, 0x1c, 0x1d, 0x23, 0x06,
-- 0x73, 0x63, 0x23, 0x00, 0x00, 0xdc, 0x19, 0x2c,
-- 0x81, 0xa6, 0x81, 0xe6, 0x33, 0x01, 0x06, 0x1b,
-- 0x0e, 0x1b, 0x60, 0xa6, 0x2b, 0x04, 0xdb, 0xf5,
-- 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08,
-- 0xdb, 0xe0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xb8,
-- 0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70,
-- 0x2e, 0x08, 0x45, 0xe8, 0xff, 0xff, 0xfb, 0xff,
-- 0x2e, 0x00, 0x31, 0x7d, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x44, 0x68, 0xb5, 0xf0, 0x06, 0x00,
-- 0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x04, 0x09,
-- 0x0c, 0x09, 0x91, 0x01, 0x06, 0x10, 0x0e, 0x00,
-- 0x04, 0x1c, 0x0c, 0x24, 0x27, 0x00, 0x49, 0x5a,
-- 0x00, 0x7b, 0x19, 0xdb, 0x01, 0x1b, 0x5a, 0xcd,
-- 0x4b, 0x58, 0x42, 0x9d, 0xd1, 0x01, 0x1c, 0x3a,
-- 0xe0, 0x04, 0x1c, 0x7b, 0x06, 0x1f, 0x0e, 0x3f,
-- 0x2f, 0x08, 0xdb, 0xf1, 0x2f, 0x08, 0xd1, 0x05,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x46, 0x4f, 0x50,
-- 0x97, 0x02, 0x5b, 0xbb, 0x2b, 0x00, 0xd0, 0x05,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x9f, 0x02,
-- 0x53, 0xbb, 0x00, 0x53, 0x18, 0x9a, 0x01, 0x12,
-- 0x18, 0x57, 0x80, 0x38, 0x20, 0x14, 0xf0, 0x02,
-- 0xfe, 0x19, 0x1c, 0x01, 0x62, 0xb8, 0x20, 0x00,
-- 0x29, 0x00, 0xd1, 0x08, 0x49, 0x41, 0x80, 0x39,
-- 0x9f, 0x02, 0x53, 0xb8, 0x43, 0xc0, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0d,
-- 0x21, 0xff, 0x02, 0x09, 0x40, 0x21, 0x12, 0x08,
-- 0x28, 0x09, 0xd2, 0x1f, 0xa3, 0x01, 0x5c, 0x1b,
-- 0x00, 0x5b, 0x44, 0x9f, 0x1b, 0x04, 0x06, 0x09,
-- 0x0c, 0x0f, 0x12, 0x15, 0x18, 0x00, 0x24, 0xb8,
-- 0xe0, 0x16, 0x24, 0xff, 0x34, 0x71, 0xe0, 0x13,
-- 0x24, 0x01, 0x02, 0xa4, 0xe0, 0x10, 0x24, 0x01,
-- 0x02, 0xe4, 0xe0, 0x0d, 0x24, 0x01, 0x03, 0x24,
-- 0xe0, 0x0a, 0x24, 0x01, 0x03, 0x64, 0xe0, 0x07,
-- 0x24, 0x01, 0x03, 0xa4, 0xe0, 0x04, 0x24, 0x01,
-- 0x03, 0xe4, 0xe0, 0x01, 0x24, 0x01, 0x02, 0xa4,
-- 0x80, 0xac, 0x88, 0xa8, 0x00, 0x80, 0xf0, 0x02,
-- 0xfd, 0xdd, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d,
-- 0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02,
-- 0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xf4,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x70, 0xb8,
-- 0x26, 0x00, 0x88, 0x38, 0x00, 0x80, 0x49, 0x1d,
-- 0x50, 0x0e, 0x20, 0x00, 0x1c, 0x01, 0x43, 0x61,
-- 0x68, 0x2a, 0x18, 0x8a, 0x00, 0xc1, 0x19, 0xc9,
-- 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x60, 0x8a,
-- 0x28, 0x04, 0xdb, 0xf3, 0x20, 0xb8, 0x1c, 0x21,
-- 0xf0, 0x15, 0xfd, 0x94, 0x1d, 0xfc, 0x34, 0x19,
-- 0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01,
-- 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x08,
-- 0xf9, 0xc7, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8,
-- 0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x07,
-- 0xff, 0xfb, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01,
-- 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85,
-- 0x6a, 0xbb, 0xf0, 0x08, 0xfa, 0x43, 0x1c, 0x30,
-- 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x44, 0x68, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x45, 0xe8,
-- 0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x08,
-- 0xff, 0xd7, 0x21, 0x00, 0x4f, 0x24, 0x4b, 0x25,
-- 0x93, 0x01, 0x4a, 0x25, 0x00, 0x48, 0x18, 0x40,
-- 0x01, 0x00, 0x19, 0xc0, 0x78, 0x84, 0x9d, 0x00,
-- 0x40, 0xe5, 0x07, 0xeb, 0x0f, 0xdb, 0x2b, 0x01,
-- 0xd1, 0x31, 0x6a, 0x83, 0x7a, 0x1c, 0x2c, 0xa4,
-- 0xd0, 0x01, 0x2c, 0xa5, 0xd1, 0x2b, 0x1d, 0xc4,
-- 0x34, 0x19, 0xe0, 0x0e, 0x79, 0x05, 0x73, 0x65,
-- 0x88, 0xde, 0x79, 0x05, 0x00, 0xed, 0x18, 0x2d,
-- 0x81, 0xae, 0x79, 0x05, 0x35, 0x01, 0x07, 0xad,
-- 0x0f, 0xad, 0x71, 0x05, 0x78, 0x15, 0x35, 0x01,
-- 0x70, 0x15, 0x7a, 0x9d, 0x7b, 0x66, 0x42, 0xb5,
-- 0xd0, 0x02, 0x79, 0x45, 0x2d, 0x00, 0xd0, 0xe9,
-- 0x7a, 0x1b, 0x2b, 0xa5, 0xd1, 0x0f, 0x79, 0x43,
-- 0x07, 0xdc, 0x0f, 0xe4, 0x2c, 0x01, 0xd0, 0x0a,
-- 0x1c, 0x1c, 0x23, 0x01, 0x43, 0x23, 0x71, 0x43,
-- 0x88, 0x00, 0x00, 0x80, 0x9b, 0x01, 0x18, 0xc0,
-- 0x68, 0x03, 0x33, 0x01, 0x60, 0x03, 0x1c, 0x48,
-- 0x06, 0x01, 0x0e, 0x09, 0x29, 0x08, 0xdb, 0xbd,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x44, 0x68, 0x2e, 0x08, 0x45, 0xe8,
-- 0x2e, 0x08, 0x03, 0xb8, 0xb5, 0xf0, 0x04, 0x05,
-- 0x0c, 0x2d, 0x20, 0x00, 0x4c, 0x31, 0x00, 0x42,
-- 0x18, 0x12, 0x01, 0x12, 0x5a, 0xa2, 0x42, 0xaa,
-- 0xd1, 0x01, 0x1c, 0x01, 0xe0, 0x04, 0x30, 0x01,
-- 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf2,
-- 0x28, 0x08, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x48,
-- 0x18, 0x40, 0x01, 0x00, 0x19, 0x07, 0x78, 0xb8,
-- 0x49, 0x25, 0xf0, 0x08, 0xfa, 0x0f, 0x79, 0x78,
-- 0x23, 0x02, 0x43, 0x18, 0x71, 0x78, 0x78, 0xbe,
-- 0x20, 0xff, 0x70, 0xb8, 0x21, 0x00, 0x1d, 0xf8,
-- 0x30, 0x19, 0x73, 0x01, 0x21, 0x06, 0x73, 0x41,
-- 0x78, 0xf8, 0x79, 0x39, 0x42, 0x88, 0xd1, 0x11,
-- 0x79, 0x78, 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01,
-- 0xd0, 0x0c, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38,
-- 0x71, 0x78, 0x48, 0x17, 0x80, 0x38, 0x6a, 0xb8,
-- 0x68, 0x00, 0xf0, 0x02, 0xfd, 0x15, 0x6a, 0xb8,
-- 0xf0, 0x02, 0xfd, 0x12, 0x4f, 0x12, 0x00, 0x68,
-- 0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12,
-- 0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11,
-- 0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x03, 0xf8, 0x12,
-- 0x20, 0x00, 0x00, 0x41, 0x18, 0x09, 0x01, 0x09,
-- 0x5a, 0x61, 0x42, 0xb9, 0xd1, 0x04, 0x30, 0x01,
-- 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4,
-- 0x28, 0x08, 0xd1, 0x03, 0x21, 0x00, 0x48, 0x08,
-- 0x71, 0x01, 0x70, 0x01, 0x20, 0x00, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x44, 0x68,
-- 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30,
-- 0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x49, 0x70,
-- 0x2e, 0x08, 0x03, 0xb8, 0xb5, 0x80, 0x1c, 0x07,
-- 0x30, 0x28, 0xf0, 0x02, 0xfc, 0xbb, 0x49, 0x07,
-- 0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0,
-- 0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f,
-- 0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0,
-- 0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07,
-- 0x30, 0x28, 0xf0, 0x02, 0xfc, 0xa3, 0x49, 0x06,
-- 0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0,
-- 0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x03, 0xc0, 0xb4, 0x80, 0x04, 0x09,
-- 0x0c, 0x09, 0x88, 0x02, 0x42, 0x8a, 0xd0, 0x18,
-- 0x4a, 0x0d, 0x8f, 0x13, 0x2b, 0x01, 0xd0, 0x04,
-- 0x23, 0x01, 0x87, 0x13, 0x8f, 0x17, 0x2f, 0x01,
-- 0xd1, 0xfb, 0x88, 0x03, 0x42, 0x8b, 0xd0, 0x03,
-- 0x80, 0x01, 0x88, 0x03, 0x42, 0x8b, 0xd1, 0xfb,
-- 0x8f, 0x11, 0x1c, 0x10, 0x29, 0x00, 0xd0, 0x04,
-- 0x21, 0x00, 0x87, 0x01, 0x8f, 0x02, 0x2a, 0x00,
-- 0xd1, 0xfb, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00,
-- 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x80, 0x48, 0x1f,
-- 0x8f, 0x40, 0x28, 0x00, 0xd1, 0x37, 0x4f, 0x1e,
-- 0x88, 0x38, 0x12, 0x00, 0x4a, 0x1d, 0x28, 0x06,
-- 0xd0, 0x1e, 0xdc, 0x08, 0x28, 0x06, 0xd2, 0x26,
-- 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x2a, 0x12, 0x12, 0x0d, 0x22, 0x12, 0x28, 0x07,
-- 0xd0, 0x15, 0x28, 0x09, 0xd0, 0x0b, 0x28, 0x0b,
-- 0xd0, 0x14, 0x28, 0x80, 0xd1, 0x17, 0xf0, 0x00,
-- 0xf9, 0x1f, 0xe0, 0x18, 0x88, 0x79, 0x88, 0x38,
-- 0xf0, 0x00, 0xf8, 0x24, 0xe0, 0x13, 0x88, 0x79,
-- 0x88, 0x38, 0xf0, 0x00, 0xf8, 0xbd, 0xe0, 0x0e,
-- 0xf0, 0x00, 0xf9, 0x6a, 0xe0, 0x0b, 0xf0, 0x00,
-- 0xf9, 0xd5, 0xe0, 0x08, 0x88, 0x79, 0x88, 0x38,
-- 0xf0, 0x00, 0xfc, 0x9c, 0xe0, 0x03, 0x48, 0x08,
-- 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00,
-- 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9f, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00,
-- 0x2e, 0x08, 0x04, 0x00, 0xb5, 0xf0, 0x04, 0x04,
-- 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17,
-- 0x2d, 0x10, 0xdd, 0x03, 0x20, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x19, 0xfb, 0x92,
-- 0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01,
-- 0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02,
-- 0x48, 0x1c, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46,
-- 0x4b, 0x1b, 0x42, 0xb5, 0xdd, 0x0a, 0x88, 0x19,
-- 0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01,
-- 0xf0, 0x19, 0xfb, 0xb2, 0x20, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x64, 0x05, 0x35, 0x28,
-- 0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d,
-- 0x23, 0x10, 0x43, 0x33, 0x80, 0x2b, 0x6d, 0x03,
-- 0x80, 0x9c, 0x6d, 0x04, 0x80, 0xe2, 0x23, 0x00,
-- 0x29, 0x00, 0xdd, 0x08, 0x88, 0x3d, 0x00, 0x5c,
-- 0x6d, 0x06, 0x19, 0xa4, 0x81, 0x25, 0x33, 0x01,
-- 0x37, 0x02, 0x42, 0x8b, 0xdb, 0xf6, 0x6d, 0x01,
-- 0x18, 0x8a, 0x6c, 0xc3, 0x42, 0x9a, 0xd9, 0x00,
-- 0x6c, 0x82, 0x60, 0x0a, 0x65, 0x02, 0xf0, 0x19,
-- 0xfb, 0x8b, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0,
-- 0x2c, 0x00, 0x00, 0xf8, 0xb4, 0xf0, 0x04, 0x04,
-- 0x0c, 0x24, 0x04, 0x08, 0x0c, 0x00, 0x28, 0x10,
-- 0xdd, 0x02, 0x20, 0x02, 0xbc, 0xf0, 0x47, 0x70,
-- 0x30, 0x01, 0x4f, 0x1c, 0x40, 0x07, 0x1c, 0xb8,
-- 0x00, 0x40, 0x1d, 0x01, 0x48, 0x1a, 0x6d, 0x83,
-- 0x18, 0x5d, 0x6d, 0xc6, 0x4b, 0x19, 0x42, 0xb5,
-- 0xdd, 0x07, 0x88, 0x19, 0x1c, 0x18, 0x23, 0x02,
-- 0x43, 0x19, 0x80, 0x01, 0x20, 0x01, 0xbc, 0xf0,
-- 0x47, 0x70, 0x65, 0x85, 0x35, 0x28, 0x42, 0xb5,
-- 0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x01,
-- 0x43, 0x33, 0x80, 0x2b, 0x6e, 0x83, 0x80, 0x9c,
-- 0x6e, 0x84, 0x80, 0xe1, 0x23, 0x00, 0x2f, 0x00,
-- 0xdd, 0x08, 0x88, 0x15, 0x00, 0x5c, 0x6e, 0x86,
-- 0x19, 0xa4, 0x81, 0x25, 0x32, 0x02, 0x33, 0x01,
-- 0x42, 0xbb, 0xdb, 0xf6, 0x6e, 0x82, 0x18, 0x51,
-- 0x6e, 0x43, 0x42, 0x99, 0xd3, 0x00, 0x6e, 0x01,
-- 0x60, 0x11, 0x66, 0x81, 0x20, 0x00, 0xbc, 0xf0,
-- 0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe,
-- 0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8,
-- 0xb5, 0xb0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d,
-- 0x0c, 0x2d, 0x1c, 0x17, 0xf0, 0x19, 0xfa, 0xfa,
-- 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xff,
-- 0xff, 0xa9, 0x1c, 0x07, 0xf0, 0x19, 0xfb, 0x28,
-- 0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x09,
-- 0x0c, 0x09, 0x29, 0x08, 0xdd, 0x02, 0x20, 0x02,
-- 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x88, 0x1d, 0xc7,
-- 0x37, 0x01, 0x48, 0x19, 0x6d, 0x83, 0x19, 0xdd,
-- 0x6d, 0xc6, 0x4b, 0x18, 0x42, 0xb5, 0xdd, 0x07,
-- 0x88, 0x19, 0x1c, 0x18, 0x23, 0x02, 0x43, 0x19,
-- 0x80, 0x01, 0x20, 0x01, 0xbc, 0xf0, 0x47, 0x70,
-- 0x65, 0x85, 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04,
-- 0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x01, 0x43, 0x33,
-- 0x80, 0x2b, 0x6e, 0x83, 0x80, 0x9c, 0x6e, 0x84,
-- 0x80, 0xe7, 0x23, 0x00, 0x6e, 0x84, 0x29, 0x00,
-- 0xdd, 0x06, 0xca, 0x40, 0x00, 0x9d, 0x19, 0x2d,
-- 0x60, 0xae, 0x33, 0x01, 0x42, 0x8b, 0xdb, 0xf8,
-- 0x6e, 0x81, 0x19, 0xca, 0x6e, 0x43, 0x42, 0x9a,
-- 0xd3, 0x00, 0x6e, 0x02, 0x60, 0x0a, 0x66, 0x82,
-- 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8,
-- 0xb5, 0x80, 0x48, 0x28, 0x88, 0x00, 0x06, 0x00,
-- 0x0e, 0x00, 0x4f, 0x27, 0x28, 0x01, 0xd0, 0x13,
-- 0x28, 0x02, 0xd0, 0x1a, 0x28, 0x03, 0xd1, 0x0c,
-- 0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xdb, 0x02,
-- 0x88, 0x41, 0x29, 0x0f, 0xdd, 0x2f, 0x88, 0x01,
-- 0x04, 0x09, 0x88, 0x40, 0x43, 0x08, 0xf0, 0x0b,
-- 0xf9, 0x81, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x68, 0x38, 0x88, 0x82, 0x88, 0x41, 0x88, 0x00,
-- 0xf0, 0x0e, 0xf8, 0x60, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09,
-- 0x88, 0xc2, 0x43, 0x11, 0x88, 0x02, 0x04, 0x12,
-- 0x88, 0x40, 0x43, 0x10, 0xf0, 0x0d, 0xfd, 0x04,
-- 0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xd1, 0x08,
-- 0x88, 0x81, 0x04, 0x09, 0x88, 0xc0, 0x43, 0x08,
-- 0xf0, 0x0a, 0xff, 0xfe, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0x01, 0xf0, 0x0a, 0xff, 0xf8,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x41,
-- 0x48, 0x08, 0x29, 0x0e, 0xd1, 0x02, 0x21, 0x00,
-- 0x60, 0x01, 0xe0, 0x01, 0x21, 0x01, 0x60, 0x01,
-- 0x68, 0x00, 0xf0, 0x00, 0xfb, 0xe1, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x00, 0xfc,
-- 0x2e, 0x08, 0x03, 0xc0, 0x2e, 0x08, 0x04, 0xf4,
-- 0xb5, 0x90, 0x48, 0x31, 0x88, 0x00, 0x06, 0x04,
-- 0x0e, 0x24, 0x48, 0x30, 0x22, 0x03, 0x21, 0x02,
-- 0x4f, 0x2f, 0x2c, 0x08, 0xd2, 0x4f, 0xa3, 0x02,
-- 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x04, 0x4b, 0x10, 0x16, 0x1c, 0x28, 0x34, 0x3f,
-- 0x68, 0x39, 0x88, 0x49, 0x06, 0x09, 0x0e, 0x09,
-- 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x03,
-- 0xfa, 0xa7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x03, 0xf7, 0xfd, 0xff, 0xe1, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, 0xf7, 0xfd,
-- 0xff, 0xdb, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x88, 0x00, 0x4b, 0x1e, 0x28, 0x00, 0xd0, 0x03,
-- 0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x88, 0x00, 0x4b, 0x19, 0x28, 0x00, 0xd0, 0x03,
-- 0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xf0, 0x02, 0xfe, 0x72, 0x68, 0x39, 0x88, 0x4a,
-- 0x1d, 0x08, 0x88, 0x09, 0xf7, 0xfe, 0xf8, 0x52,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38,
-- 0x88, 0x81, 0x04, 0x09, 0x88, 0xc2, 0x18, 0x8a,
-- 0x88, 0x01, 0x04, 0x09, 0x88, 0x40, 0x50, 0x0a,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x1d, 0xf8,
-- 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00,
-- 0x2e, 0x08, 0x03, 0xc0, 0x6e, 0x00, 0x13, 0x00,
-- 0x6e, 0x00, 0x12, 0x00, 0xb5, 0x90, 0xb0, 0x86,
-- 0x48, 0x80, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00,
-- 0x4c, 0x7f, 0x4f, 0x80, 0x28, 0x0b, 0xd2, 0x61,
-- 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x05, 0x0f, 0x17, 0x3a, 0x5e, 0x86, 0x90, 0xbd,
-- 0xc5, 0xd3, 0xd8, 0x00, 0xf0, 0x0b, 0xfb, 0x38,
-- 0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08,
-- 0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0xe0,
-- 0x20, 0x1e, 0xa9, 0x05, 0xf0, 0x0b, 0xfa, 0x3a,
-- 0x98, 0x05, 0x68, 0x39, 0x80, 0x08, 0xe0, 0xd8,
-- 0x1c, 0x20, 0xf0, 0x0d, 0xfe, 0x31, 0x20, 0x00,
-- 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b,
-- 0x52, 0x99, 0x30, 0x01, 0x28, 0x04, 0xdd, 0xf7,
-- 0x20, 0x07, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42,
-- 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x91,
-- 0x30, 0x01, 0x28, 0x0b, 0xdd, 0xf5, 0x20, 0x0d,
-- 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b,
-- 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x51, 0x30, 0x01,
-- 0x28, 0x12, 0xdd, 0xf5, 0xe0, 0xb5, 0x20, 0x13,
-- 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b,
-- 0x18, 0xd2, 0x3a, 0x40, 0x83, 0x51, 0x30, 0x01,
-- 0x28, 0x15, 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81,
-- 0x19, 0x09, 0x6d, 0x89, 0x00, 0x42, 0x68, 0x3b,
-- 0x18, 0xd2, 0x80, 0xd1, 0x30, 0x01, 0x28, 0x0a,
-- 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 0x19, 0x09,
-- 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b,
-- 0x18, 0xd2, 0x83, 0x91, 0x30, 0x01, 0x28, 0x01,
-- 0xdd, 0xf4, 0xe0, 0x92, 0xe0, 0x8c, 0x20, 0x02,
-- 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 0x68, 0x49,
-- 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40,
-- 0x87, 0x91, 0x30, 0x01, 0x28, 0x05, 0xdd, 0xf3,
-- 0x20, 0x09, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80,
-- 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2,
-- 0x3a, 0x40, 0x86, 0xd1, 0x30, 0x01, 0x28, 0x0f,
-- 0xdd, 0xf3, 0x20, 0x11, 0x00, 0x81, 0x19, 0x09,
-- 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b,
-- 0x18, 0xd2, 0x3a, 0x40, 0x86, 0x91, 0x30, 0x01,
-- 0x28, 0x13, 0xdd, 0xf3, 0xe0, 0x69, 0x22, 0x00,
-- 0x21, 0x00, 0x20, 0x01, 0x02, 0xc0, 0xf7, 0xff,
-- 0xfe, 0x47, 0x6f, 0xb8, 0x49, 0x36, 0x80, 0x08,
-- 0xe0, 0x5f, 0xa8, 0x02, 0xf0, 0x10, 0xfc, 0x18,
-- 0x98, 0x02, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x08,
-- 0x98, 0x02, 0x68, 0x39, 0x80, 0x48, 0x98, 0x03,
-- 0x0c, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x03,
-- 0x68, 0x39, 0x80, 0xc8, 0x98, 0x04, 0x0c, 0x00,
-- 0x68, 0x39, 0x81, 0x08, 0x98, 0x04, 0x68, 0x39,
-- 0x81, 0x48, 0x20, 0x00, 0x68, 0x39, 0x81, 0x88,
-- 0x68, 0x38, 0x89, 0x81, 0x23, 0x01, 0x03, 0xdb,
-- 0x43, 0x19, 0x81, 0x81, 0x48, 0x25, 0x68, 0x39,
-- 0x81, 0xc8, 0x48, 0x25, 0x68, 0x01, 0x14, 0x09,
-- 0x68, 0x3a, 0x82, 0x11, 0x68, 0x00, 0x68, 0x39,
-- 0x82, 0x48, 0xe0, 0x32, 0x20, 0x19, 0x06, 0x80,
-- 0x6b, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x68, 0x39,
-- 0x80, 0x08, 0xe0, 0x2a, 0x68, 0x38, 0x88, 0x01,
-- 0x04, 0x09, 0x88, 0x40, 0x18, 0x08, 0x68, 0x00,
-- 0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08,
-- 0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0x1c,
-- 0x48, 0x16, 0x68, 0x00, 0x68, 0x39, 0x80, 0x08,
-- 0xe0, 0x17, 0x46, 0x69, 0xa8, 0x01, 0xf0, 0x08,
-- 0xfb, 0xb9, 0x98, 0x01, 0x68, 0x39, 0x80, 0x08,
-- 0x98, 0x01, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x48,
-- 0x98, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x00,
-- 0x0c, 0x00, 0x68, 0x39, 0x80, 0xc8, 0xe0, 0x04,
-- 0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01,
-- 0x86, 0x81, 0xb0, 0x06, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc,
-- 0x2e, 0x08, 0x46, 0x68, 0x2e, 0x08, 0x03, 0xc0,
-- 0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x26, 0x1a,
-- 0x2e, 0x08, 0x05, 0x68, 0x2e, 0x08, 0x00, 0x58,
-- 0xb5, 0xf0, 0x4f, 0x6e, 0x25, 0x00, 0x6f, 0xf8,
-- 0x28, 0x00, 0xd0, 0x08, 0xf0, 0x06, 0xff, 0x4a,
-- 0x28, 0x00, 0xd0, 0x00, 0x67, 0xfd, 0x20, 0x01,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0x38,
-- 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x38, 0x6d, 0x7c,
-- 0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x88, 0xa0, 0x06, 0x00,
-- 0x0e, 0x00, 0x28, 0x15, 0xd2, 0x56, 0xa3, 0x02,
-- 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x0b, 0x12, 0x1c, 0x16, 0x22, 0x53, 0x26, 0x31,
-- 0x3c, 0x47, 0x57, 0x61, 0x68, 0x6d, 0x71, 0x75,
-- 0x7d, 0x84, 0x83, 0x83, 0x87, 0x00, 0x89, 0xe3,
-- 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06,
-- 0xfa, 0xc5, 0xe0, 0x70, 0x89, 0x20, 0xf0, 0x06,
-- 0xfa, 0xa9, 0xe0, 0x6c, 0x89, 0xa2, 0x89, 0x61,
-- 0x89, 0x20, 0xf0, 0x06, 0xfb, 0x83, 0xe0, 0x66,
-- 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06,
-- 0xfb, 0x2b, 0xe0, 0x60, 0x89, 0x20, 0xf0, 0x06,
-- 0xfb, 0xc1, 0xe0, 0x5c, 0x8a, 0x62, 0x8a, 0x21,
-- 0xb4, 0x06, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61,
-- 0x89, 0x20, 0xf0, 0x06, 0xfc, 0x45, 0xb0, 0x02,
-- 0xe0, 0x51, 0x8a, 0x62, 0x8a, 0x21, 0xb4, 0x06,
-- 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20,
-- 0xf0, 0x06, 0xfc, 0x8c, 0xb0, 0x02, 0xe0, 0x46,
-- 0x89, 0xa3, 0x89, 0x62, 0x89, 0x20, 0x49, 0x3c,
-- 0xf0, 0x06, 0xfd, 0xcd, 0x21, 0x00, 0x48, 0x3a,
-- 0xf7, 0xff, 0xfc, 0x58, 0xe0, 0x3b, 0x89, 0xe0,
-- 0x04, 0x03, 0x14, 0x1b, 0x89, 0xa0, 0x04, 0x02,
-- 0x14, 0x12, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06,
-- 0xfd, 0xed, 0xe0, 0x30, 0xe0, 0x4c, 0x89, 0x20,
-- 0xf0, 0x06, 0xfb, 0xa0, 0xe0, 0x2b, 0x89, 0xe0,
-- 0x04, 0x00, 0x8a, 0x21, 0x18, 0x43, 0x89, 0xa2,
-- 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfe, 0x40,
-- 0xe0, 0x21, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61,
-- 0x89, 0x20, 0xf0, 0x06, 0xfe, 0x71, 0xe0, 0x1a,
-- 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xc2,
-- 0xe0, 0x15, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xdc,
-- 0xe0, 0x11, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xec,
-- 0xe0, 0x0d, 0x20, 0x01, 0x67, 0xf8, 0x89, 0xa2,
-- 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xff, 0x04,
-- 0xe0, 0x05, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61,
-- 0x89, 0x20, 0xf0, 0x06, 0xff, 0x67, 0xe0, 0x1b,
-- 0xf0, 0x06, 0xff, 0xfe, 0xe0, 0x18, 0x89, 0x20,
-- 0xb0, 0x82, 0x90, 0x01, 0x89, 0x61, 0x91, 0x00,
-- 0x89, 0xa5, 0x89, 0xe0, 0x1b, 0x40, 0x24, 0x00,
-- 0x1c, 0x46, 0x2e, 0x00, 0xdd, 0x0b, 0x00, 0xa0,
-- 0x4b, 0x12, 0x18, 0xc0, 0x19, 0x2a, 0x68, 0x03,
-- 0x98, 0x01, 0x99, 0x00, 0xf0, 0x06, 0xfe, 0x04,
-- 0x34, 0x01, 0x42, 0xb4, 0xdb, 0xf3, 0xb0, 0x02,
-- 0x6d, 0x78, 0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08,
-- 0x64, 0x38, 0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28,
-- 0xdb, 0x05, 0x48, 0x09, 0x88, 0x01, 0x23, 0x10,
-- 0x43, 0xdb, 0x40, 0x19, 0x80, 0x01, 0x6d, 0x78,
-- 0x68, 0x00, 0x65, 0x78, 0x20, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x03, 0xc0,
-- 0x2c, 0x00, 0x01, 0x20, 0x2c, 0x00, 0x1a, 0x00,
-- 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x90, 0x4f, 0x66,
-- 0x6e, 0xf8, 0x6e, 0xb9, 0x42, 0x81, 0xd0, 0x57,
-- 0x88, 0x81, 0x0a, 0x0a, 0x2a, 0x0a, 0xd2, 0x5a,
-- 0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x93, 0x04, 0x50, 0x93, 0x93, 0x57, 0x93, 0x93,
-- 0x7c, 0x82, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00,
-- 0x29, 0x0c, 0xd2, 0x4c, 0xa3, 0x01, 0x5c, 0x5b,
-- 0x00, 0x5b, 0x44, 0x9f, 0x1d, 0x09, 0x13, 0x3c,
-- 0x85, 0x85, 0x85, 0x85, 0x85, 0x39, 0x85, 0x05,
-- 0x89, 0x00, 0xf0, 0x03, 0xf8, 0xc1, 0xe0, 0x7b,
-- 0x22, 0x00, 0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23,
-- 0x4a, 0x52, 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0x5c,
-- 0xb0, 0x01, 0xe0, 0x71, 0x22, 0x00, 0xb4, 0x04,
-- 0x89, 0x02, 0x1c, 0x23, 0x49, 0x4d, 0x1e, 0x48,
-- 0xf7, 0xfc, 0xfd, 0x52, 0xb0, 0x01, 0xe0, 0x67,
-- 0x8a, 0x02, 0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82,
-- 0x89, 0x41, 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0x48,
-- 0x6e, 0xf8, 0x89, 0x01, 0xb0, 0x01, 0x29, 0x00,
-- 0xd1, 0x5a, 0x89, 0x41, 0x29, 0x00, 0xd1, 0x57,
-- 0x89, 0x81, 0x29, 0x00, 0xd1, 0x54, 0x89, 0xc1,
-- 0x29, 0x00, 0xd1, 0x51, 0x8a, 0x00, 0x28, 0x00,
-- 0xd1, 0x4e, 0xf7, 0xfd, 0xfa, 0x85, 0xe0, 0x62,
-- 0xf7, 0xfc, 0xfc, 0xc6, 0xe0, 0x5f, 0x21, 0x18,
-- 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0xaf, 0xe0, 0x5a,
-- 0xe0, 0x6a, 0x06, 0x09, 0xd1, 0x40, 0x89, 0x00,
-- 0xf7, 0xfc, 0xfe, 0x7c, 0xe0, 0x53, 0xe0, 0x52,
-- 0x06, 0x09, 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x4e,
-- 0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, 0x89, 0x00,
-- 0xf7, 0xfe, 0xf8, 0x6a, 0xe0, 0x43, 0x89, 0x00,
-- 0xf7, 0xfe, 0xf8, 0x8c, 0xe0, 0x3f, 0x89, 0x00,
-- 0xf7, 0xfe, 0xf9, 0x1a, 0xe0, 0x3b, 0x89, 0x00,
-- 0xf7, 0xfe, 0xf9, 0xfe, 0xe0, 0x37, 0x89, 0x00,
-- 0xf7, 0xfe, 0xfa, 0x30, 0xe0, 0x33, 0x89, 0x00,
-- 0x06, 0x00, 0x0e, 0x00, 0xf7, 0xfe, 0xfa, 0x0c,
-- 0xe0, 0x2d, 0x06, 0x08, 0xd1, 0x14, 0x6f, 0xb8,
-- 0x30, 0x01, 0x67, 0xb8, 0xe0, 0x27, 0x06, 0x09,
-- 0x0e, 0x09, 0x29, 0x08, 0xd2, 0x23, 0xa3, 0x02,
-- 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x04, 0x0d, 0x09, 0x10, 0x13, 0x17, 0x1a, 0x1d,
-- 0x89, 0x00, 0xf0, 0x01, 0xf9, 0x7f, 0xe0, 0x16,
-- 0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, 0xf9, 0xa6,
-- 0xe0, 0x11, 0xf0, 0x01, 0xf9, 0xf1, 0xe0, 0x0e,
-- 0xf0, 0x01, 0xfa, 0x48, 0xe0, 0x0b, 0x89, 0x00,
-- 0xf0, 0x01, 0xfa, 0xcc, 0xe0, 0x07, 0xf0, 0x01,
-- 0xfb, 0x05, 0xe0, 0x04, 0xf0, 0x01, 0xfb, 0x1e,
-- 0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x7b, 0x6e, 0xf8,
-- 0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, 0x65, 0xb8,
-- 0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x04,
-- 0x48, 0x07, 0x88, 0x01, 0x08, 0x49, 0x00, 0x49,
-- 0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, 0x66, 0xf8,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x03, 0xc0, 0x00, 0x00, 0xff, 0xff,
-- 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00,
-- 0x0e, 0x00, 0x1c, 0x17, 0x28, 0x03, 0xd0, 0x0b,
-- 0x28, 0x07, 0xd0, 0x0e, 0x28, 0x08, 0xd1, 0x03,
-- 0x88, 0x38, 0xf0, 0x02, 0xfa, 0x39, 0x80, 0x78,
-- 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x22,
-- 0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a,
-- 0xf0, 0x02, 0xf8, 0xaa, 0x49, 0x01, 0x68, 0x09,
-- 0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc0,
-- 0x48, 0x0d, 0x6f, 0xc0, 0x28, 0x00, 0xd1, 0x0c,
-- 0x49, 0x0c, 0x60, 0x08, 0x48, 0x0c, 0x8e, 0x83,
-- 0x49, 0x0c, 0x22, 0x01, 0x2b, 0x00, 0xd0, 0x05,
-- 0x8d, 0x03, 0x86, 0x8b, 0x8d, 0x43, 0x86, 0xcb,
-- 0x87, 0x82, 0x47, 0x70, 0x8e, 0xc3, 0x2b, 0x00,
-- 0xd0, 0xfb, 0x8d, 0x83, 0x86, 0x8b, 0x8d, 0xc3,
-- 0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x00, 0x00,
-- 0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x40,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0,
-- 0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x71, 0xf7, 0xfd,
-- 0xf8, 0x37, 0xf7, 0xfc, 0xfe, 0xdd, 0xf7, 0xfd,
-- 0xf9, 0x37, 0xf0, 0x03, 0xf8, 0x71, 0xf7, 0xff,
-- 0xff, 0xcf, 0x48, 0x09, 0x8e, 0x80, 0x28, 0x00,
-- 0xd1, 0x0b, 0x48, 0x08, 0x6f, 0xc0, 0x28, 0x00,
-- 0xd1, 0x01, 0xf0, 0x03, 0xfd, 0xe3, 0xf7, 0xff,
-- 0xfd, 0xe7, 0x28, 0x00, 0xd1, 0x01, 0xf7, 0xff,
-- 0xfe, 0xc9, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1f, 0x80,
-- 0xb4, 0x80, 0x02, 0x4f, 0x4b, 0x07, 0x40, 0x3b,
-- 0x43, 0x1a, 0x23, 0x19, 0x06, 0x9b, 0x62, 0x9a,
-- 0x0a, 0x49, 0x02, 0x49, 0x08, 0x49, 0x07, 0xc0,
-- 0x43, 0x08, 0x49, 0x03, 0x68, 0x09, 0x60, 0x08,
-- 0xbc, 0x80, 0x47, 0x70, 0x00, 0x03, 0xfe, 0x00,
-- 0x2e, 0x08, 0x5e, 0x38, 0xb4, 0x90, 0x4b, 0x0c,
-- 0x68, 0x1f, 0x68, 0x3f, 0x0f, 0xff, 0x60, 0x07,
-- 0x68, 0x18, 0x68, 0x00, 0x00, 0x40, 0x0a, 0x47,
-- 0x02, 0x7f, 0x20, 0x19, 0x06, 0x80, 0x6a, 0x84,
-- 0x4b, 0x06, 0x40, 0x23, 0x0a, 0x5b, 0x43, 0x3b,
-- 0x60, 0x0b, 0x6a, 0x80, 0x05, 0xc0, 0x0d, 0xc0,
-- 0x60, 0x10, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x38, 0x00, 0x03, 0xfe, 0x00,
-- 0xb5, 0x00, 0x49, 0x1d, 0x62, 0xc8, 0x28, 0x00,
-- 0xd0, 0x11, 0x28, 0x01, 0xd0, 0x1b, 0x28, 0x02,
-- 0xd0, 0x25, 0x28, 0x03, 0xd1, 0x09, 0x48, 0x19,
-- 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01,
-- 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x0b,
-- 0xf9, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x13,
-- 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01,
-- 0x48, 0x11, 0x68, 0x01, 0x04, 0x03, 0x43, 0x19,
-- 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x0d,
-- 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01,
-- 0x48, 0x0b, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19,
-- 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x07,
-- 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01,
-- 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b,
-- 0xf9, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0xc4, 0x6a, 0x00, 0x00, 0x18,
-- 0x6c, 0x00, 0x00, 0x20, 0xff, 0xdf, 0xff, 0xff,
-- 0xb5, 0x90, 0x48, 0x11, 0x6c, 0xc1, 0x6c, 0x80,
-- 0x1a, 0x0f, 0x48, 0x10, 0xd5, 0x01, 0x69, 0x01,
-- 0x18, 0x7f, 0x69, 0x00, 0x10, 0x80, 0x4c, 0x0e,
-- 0x42, 0xb8, 0xda, 0x0b, 0x68, 0xe0, 0x28, 0x00,
-- 0xd1, 0x08, 0x48, 0x0c, 0x68, 0x01, 0x23, 0x02,
-- 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x20, 0x02,
-- 0xf0, 0x0a, 0xfd, 0x0c, 0x2f, 0x00, 0xd1, 0x04,
-- 0x20, 0x01, 0x61, 0xe0, 0x6b, 0xa0, 0x30, 0x01,
-- 0x63, 0xa0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44,
-- 0x2e, 0x08, 0x04, 0xc4, 0x6c, 0x00, 0x00, 0x20,
-- 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x0a, 0xfc, 0xf6,
-- 0x20, 0x1e, 0xf0, 0x07, 0xfc, 0xf3, 0x23, 0x03,
-- 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02,
-- 0x20, 0x1e, 0xf0, 0x07, 0xfa, 0xa1, 0x22, 0x00,
-- 0xb4, 0x04, 0x23, 0x02, 0x22, 0x02, 0x49, 0x07,
-- 0x20, 0x1e, 0xf0, 0x07, 0xf8, 0xd5, 0x23, 0x01,
-- 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e,
-- 0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x91, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
-- 0xb5, 0x00, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0d,
-- 0xf8, 0x6b, 0x20, 0x1f, 0xf0, 0x07, 0xfc, 0x04,
-- 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2,
-- 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x07, 0xfa, 0x7c,
-- 0x20, 0x00, 0xf0, 0x0a, 0xfb, 0x61, 0x22, 0x00,
-- 0xb4, 0x04, 0x23, 0x01, 0x22, 0x02, 0x49, 0x07,
-- 0x20, 0x1f, 0xf0, 0x07, 0xf8, 0xad, 0x23, 0x01,
-- 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f,
-- 0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x69, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe,
-- 0xb5, 0x80, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x0a,
-- 0x61, 0x38, 0x49, 0x0a, 0x6c, 0x89, 0x61, 0x79,
-- 0xf0, 0x01, 0xfe, 0x3c, 0x1d, 0xf9, 0x31, 0x79,
-- 0x61, 0x08, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00,
-- 0x61, 0xf8, 0x62, 0x38, 0x64, 0xf8, 0x20, 0xff,
-- 0x72, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80,
-- 0xb5, 0x80, 0x4f, 0x05, 0x69, 0x38, 0x28, 0x00,
-- 0xd0, 0x03, 0xf0, 0x01, 0xfe, 0x45, 0x20, 0x00,
-- 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x4a, 0x0d,
-- 0xb4, 0x04, 0x1f, 0x10, 0x1e, 0x51, 0x1c, 0x13,
-- 0xf7, 0xfc, 0xfb, 0x2a, 0x21, 0x33, 0x06, 0x49,
-- 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01,
-- 0x48, 0x07, 0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1,
-- 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 0x02, 0xc9,
-- 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 0x76, 0x01,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x04, 0x44, 0xb5, 0x00, 0x4a, 0x10,
-- 0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0f,
-- 0x1e, 0xc8, 0xf7, 0xfc, 0xfb, 0x09, 0x21, 0x33,
-- 0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82,
-- 0xb0, 0x01, 0x48, 0x0b, 0x62, 0x42, 0x6d, 0x49,
-- 0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, 0x21, 0x01,
-- 0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, 0x30, 0x60,
-- 0x76, 0x01, 0x48, 0x06, 0x23, 0x02, 0x68, 0x01,
-- 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18,
-- 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe,
-- 0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x00, 0x04,
-- 0x48, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x68, 0x01,
-- 0x40, 0x19, 0x60, 0x01, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x00, 0x04, 0xb5, 0xf0, 0x20, 0x0f,
-- 0x02, 0x40, 0x4c, 0x11, 0x61, 0x20, 0x20, 0x00,
-- 0xf7, 0xfc, 0xfc, 0x1c, 0x48, 0x0f, 0xf7, 0xfc,
-- 0xfc, 0x19, 0x26, 0x00, 0x1d, 0xe0, 0x30, 0x59,
-- 0x77, 0x06, 0x25, 0xff, 0x1d, 0xe7, 0x37, 0x79,
-- 0x70, 0x3d, 0x20, 0x01, 0x63, 0x78, 0x60, 0xe6,
-- 0x69, 0x78, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41,
-- 0x01, 0x40, 0xf0, 0x01, 0xfd, 0xab, 0x61, 0x78,
-- 0x69, 0x78, 0x28, 0x00, 0xd0, 0x01, 0x76, 0x3e,
-- 0x70, 0x3d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff,
-- 0xb5, 0x00, 0x20, 0x00, 0xf7, 0xfd, 0xff, 0xbc,
-- 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x06,
-- 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0xa8,
-- 0x21, 0x00, 0x20, 0x0d, 0xb0, 0x01, 0xf0, 0x0c,
-- 0xff, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x22, 0x00,
-- 0xb4, 0x04, 0x27, 0x00, 0x1c, 0x3b, 0x4a, 0x17,
-- 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0x94,
-- 0x22, 0x00, 0xb0, 0x01, 0xb4, 0x04, 0x1c, 0x3b,
-- 0x4a, 0x12, 0x49, 0x13, 0x20, 0x00, 0xf7, 0xfc,
-- 0xfa, 0x8b, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88,
-- 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0f,
-- 0x62, 0x42, 0x6d, 0x49, 0x63, 0x01, 0x21, 0x01,
-- 0x02, 0xc9, 0x64, 0x81, 0x21, 0x01, 0x65, 0x87,
-- 0x30, 0x60, 0x76, 0x01, 0x77, 0x07, 0x22, 0x00,
-- 0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x28,
-- 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x59, 0x21, 0x00,
-- 0x20, 0x0d, 0xf0, 0x0c, 0xff, 0x59, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff,
-- 0x00, 0x00, 0x1f, 0xfe, 0x2e, 0x08, 0x04, 0x44,
-- 0xb5, 0xf0, 0x06, 0x05, 0x0e, 0x2d, 0x20, 0x0f,
-- 0x02, 0x40, 0x4f, 0x2f, 0x26, 0x33, 0x06, 0x76,
-- 0x61, 0x38, 0x6d, 0xb0, 0x6d, 0x71, 0x1a, 0x40,
-- 0x62, 0x78, 0x62, 0xb8, 0x20, 0x00, 0x1d, 0xfc,
-- 0x34, 0x79, 0x60, 0xe0, 0x2d, 0x00, 0xd0, 0x02,
-- 0x20, 0xff, 0xf7, 0xfd, 0xff, 0x59, 0x22, 0x00,
-- 0xb4, 0x04, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00,
-- 0xf7, 0xfc, 0xfa, 0x46, 0x22, 0x01, 0x21, 0x01,
-- 0x20, 0x00, 0xb0, 0x01, 0xf0, 0x0a, 0xff, 0xcc,
-- 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b, 0xf8, 0x8c,
-- 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x1d,
-- 0x20, 0x00, 0x1e, 0x51, 0xf7, 0xfc, 0xfa, 0x34,
-- 0x20, 0x01, 0x63, 0x60, 0x69, 0x60, 0xb0, 0x01,
-- 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40,
-- 0xf0, 0x01, 0xfd, 0x14, 0x61, 0x60, 0x69, 0x60,
-- 0x28, 0x00, 0xd0, 0x03, 0x20, 0x00, 0x76, 0x20,
-- 0x20, 0xff, 0x70, 0x20, 0x6d, 0x70, 0x63, 0x38,
-- 0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x20, 0x00,
-- 0x26, 0x01, 0x65, 0xb8, 0x1d, 0xf9, 0x31, 0x59,
-- 0x76, 0x0e, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00,
-- 0xf7, 0xff, 0xfd, 0xc6, 0x21, 0x00, 0x20, 0x0d,
-- 0xf0, 0x0c, 0xfe, 0xfa, 0x20, 0x00, 0x60, 0xf8,
-- 0x2d, 0x00, 0xd1, 0x02, 0xf7, 0xff, 0xfd, 0xf0,
-- 0x61, 0xe6, 0x20, 0x00, 0x60, 0xb8, 0x66, 0x38,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff,
-- 0xb5, 0xb0, 0x4f, 0x45, 0x25, 0x00, 0x6d, 0x38,
-- 0x4c, 0x44, 0x28, 0x05, 0xd2, 0x14, 0xa3, 0x02,
-- 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x10, 0x03, 0x2e, 0x65, 0x73, 0x00, 0x4d, 0x40,
-- 0x68, 0x28, 0x08, 0x41, 0xd2, 0x08, 0x08, 0xc0,
-- 0xd3, 0x09, 0xf7, 0xff, 0xfe, 0xb3, 0x23, 0x04,
-- 0x43, 0xdb, 0x68, 0x28, 0x40, 0x18, 0x60, 0x28,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78,
-- 0x28, 0x00, 0xd0, 0xf9, 0x28, 0x01, 0xd0, 0x01,
-- 0x28, 0x05, 0xd1, 0x06, 0xf0, 0x00, 0xf8, 0x6c,
-- 0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xf0, 0xf0, 0x00,
-- 0xf9, 0x29, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01,
-- 0x28, 0x05, 0xd1, 0xe9, 0x8e, 0xa0, 0x28, 0x00,
-- 0xd1, 0xe6, 0xf0, 0x00, 0xfa, 0x4b, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00,
-- 0xd1, 0xde, 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00,
-- 0x28, 0x06, 0xd1, 0x15, 0x48, 0x27, 0x78, 0x00,
-- 0x28, 0x00, 0xd0, 0x06, 0x6d, 0x78, 0x28, 0x01,
-- 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00,
-- 0xfc, 0xcd, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01,
-- 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0x2e,
-- 0x85, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x8d, 0xa0, 0x28, 0x00, 0xd1, 0xc0, 0x6d, 0x78,
-- 0x28, 0x01, 0xd0, 0x08, 0x28, 0x04, 0xd0, 0x0b,
-- 0x28, 0x05, 0xd1, 0xb9, 0xf0, 0x00, 0xfd, 0xe4,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00,
-- 0xfd, 0xb9, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0xf0, 0x00, 0xfd, 0x88, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0xa7,
-- 0x20, 0x06, 0x85, 0xa0, 0x85, 0xe5, 0x20, 0x09,
-- 0x02, 0x40, 0x86, 0xe0, 0x20, 0x04, 0x65, 0x38,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0,
-- 0x28, 0x00, 0xd1, 0x99, 0x8d, 0xa0, 0x06, 0x00,
-- 0x0e, 0x00, 0x28, 0x06, 0xd1, 0x94, 0x85, 0xa5,
-- 0x65, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x04, 0x44, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2e, 0x08, 0x00, 0x04, 0x2e, 0x08, 0x04, 0xc4,
-- 0xb5, 0xb0, 0x48, 0x46, 0x6c, 0xc1, 0x4c, 0x46,
-- 0x64, 0x21, 0x69, 0x60, 0x1a, 0x09, 0x1d, 0xe7,
-- 0x37, 0x79, 0x63, 0xf9, 0x29, 0x00, 0xda, 0x02,
-- 0x69, 0x22, 0x18, 0x89, 0x63, 0xf9, 0x23, 0xff,
-- 0x6b, 0xf9, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x73,
-- 0x22, 0x01, 0x03, 0x12, 0x42, 0x91, 0xdd, 0x00,
-- 0x63, 0xfa, 0x6b, 0xf9, 0x08, 0x89, 0x00, 0x89,
-- 0x63, 0xf9, 0x7a, 0x3a, 0x2a, 0x00, 0xd0, 0x05,
-- 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc2, 0x61, 0xe2,
-- 0x22, 0x00, 0x72, 0x3a, 0x18, 0x42, 0x49, 0x35,
-- 0x25, 0x12, 0x42, 0x8a, 0xdd, 0x2c, 0x1a, 0x08,
-- 0x64, 0x38, 0xf0, 0x18, 0xfb, 0x5f, 0x4b, 0x32,
-- 0x40, 0x18, 0xf0, 0x18, 0xfb, 0x5f, 0x22, 0x00,
-- 0x49, 0x30, 0xb4, 0x06, 0x69, 0x60, 0x69, 0x39,
-- 0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9,
-- 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x6c, 0x3a,
-- 0x1c, 0x2b, 0xf0, 0x0f, 0xf8, 0x67, 0x22, 0x00,
-- 0xb0, 0x02, 0x49, 0x28, 0xb4, 0x06, 0x6b, 0xf8,
-- 0x6c, 0x39, 0x1a, 0x42, 0x69, 0x39, 0x1c, 0x2b,
-- 0x48, 0x25, 0xf0, 0x0f, 0xf8, 0x5b, 0xb0, 0x02,
-- 0xf0, 0x18, 0xfb, 0x3c, 0x23, 0x01, 0x04, 0x9b,
-- 0x43, 0x18, 0xf0, 0x18, 0xfb, 0x3b, 0xe0, 0x1d,
-- 0xf0, 0x18, 0xfb, 0x34, 0x4b, 0x1c, 0x40, 0x18,
-- 0xf0, 0x18, 0xfb, 0x34, 0x22, 0x00, 0x49, 0x1b,
-- 0xb4, 0x06, 0x69, 0x60, 0x69, 0x39, 0x18, 0x41,
-- 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d,
-- 0x06, 0x9b, 0x1a, 0xc0, 0x6b, 0xfa, 0x1c, 0x2b,
-- 0xf0, 0x0f, 0xf8, 0x3c, 0xb0, 0x02, 0xf0, 0x18,
-- 0xfb, 0x1d, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18,
-- 0xf0, 0x18, 0xfb, 0x1c, 0x69, 0x60, 0x6b, 0xf9,
-- 0x18, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1,
-- 0x61, 0x60, 0x4b, 0x0e, 0x42, 0x99, 0xd3, 0x02,
-- 0x69, 0x21, 0x1a, 0x40, 0x61, 0x60, 0x23, 0xff,
-- 0x03, 0x5b, 0x69, 0x60, 0x1a, 0xc0, 0xe0, 0x00,
-- 0xe0, 0x00, 0x62, 0x20, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80,
-- 0x2e, 0x08, 0x04, 0x44, 0x00, 0x1f, 0xfe, 0x00,
-- 0xff, 0xfb, 0xff, 0xff, 0x9e, 0x00, 0x08, 0x00,
-- 0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00,
-- 0x21, 0x00, 0x23, 0xff, 0x68, 0x02, 0x33, 0xc1,
-- 0x42, 0x9a, 0xd0, 0x01, 0x1c, 0x08, 0x47, 0x70,
-- 0x79, 0xc2, 0x0a, 0x12, 0xd2, 0x01, 0x1c, 0x08,
-- 0x47, 0x70, 0x7a, 0x41, 0x23, 0x0e, 0x40, 0x19,
-- 0x07, 0x49, 0x7a, 0x82, 0x05, 0x92, 0x43, 0x11,
-- 0x7a, 0xc2, 0x23, 0xfe, 0x40, 0x1a, 0x03, 0x92,
-- 0x43, 0x11, 0x7b, 0x02, 0x01, 0xd2, 0x43, 0x11,
-- 0x7b, 0x40, 0x40, 0x18, 0x08, 0x40, 0x43, 0x08,
-- 0x49, 0x01, 0x67, 0x08, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0x44, 0xb5, 0xf0, 0xb0, 0x86,
-- 0x4c, 0x8c, 0x6c, 0xe0, 0x1d, 0xe7, 0x37, 0x79,
-- 0x1d, 0xfd, 0x35, 0x39, 0x28, 0x00, 0xd0, 0x04,
-- 0x28, 0x01, 0xd0, 0x3a, 0x28, 0x02, 0xd1, 0x73,
-- 0xe0, 0x74, 0x69, 0xe0, 0x6a, 0x21, 0x1a, 0x09,
-- 0x63, 0xf9, 0x1c, 0x0a, 0xd5, 0x02, 0x69, 0x21,
-- 0x18, 0x51, 0x63, 0xf9, 0x6b, 0xf9, 0x29, 0x04,
-- 0xdb, 0x67, 0x69, 0x3e, 0x5c, 0x31, 0x06, 0x0a,
-- 0x65, 0x7a, 0x92, 0x05, 0x1c, 0x41, 0x69, 0x20,
-- 0x90, 0x04, 0xf0, 0x14, 0xfb, 0x29, 0x61, 0xe1,
-- 0x5c, 0x70, 0x04, 0x00, 0x9a, 0x05, 0x18, 0x82,
-- 0x65, 0x7a, 0x92, 0x03, 0x98, 0x04, 0x31, 0x01,
-- 0xf0, 0x14, 0xfb, 0x1e, 0x61, 0xe1, 0x5c, 0x70,
-- 0x02, 0x00, 0x9a, 0x03, 0x18, 0x80, 0x65, 0x78,
-- 0x90, 0x02, 0x98, 0x04, 0x31, 0x01, 0xf0, 0x14,
-- 0xfb, 0x13, 0x61, 0xe1, 0x5c, 0x70, 0x9a, 0x02,
-- 0x18, 0x80, 0x65, 0x78, 0x98, 0x04, 0x31, 0x01,
-- 0xf0, 0x14, 0xfb, 0x0a, 0x20, 0x01, 0x64, 0xe0,
-- 0x61, 0xe1, 0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40,
-- 0x63, 0xf8, 0x1c, 0x01, 0xd4, 0x05, 0x48, 0x67,
-- 0x69, 0x06, 0x30, 0x80, 0x69, 0x02, 0x92, 0x01,
-- 0xe0, 0x03, 0x69, 0x20, 0x18, 0x08, 0x63, 0xf8,
-- 0xe7, 0xf5, 0x6b, 0xf8, 0x90, 0x00, 0x28, 0x02,
-- 0xdb, 0x22, 0x6d, 0x78, 0x09, 0x01, 0x01, 0x09,
-- 0x23, 0xff, 0x33, 0xc1, 0x42, 0x99, 0xd1, 0x31,
-- 0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x11, 0x02, 0x09,
-- 0x83, 0x29, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14,
-- 0xfa, 0xe3, 0x61, 0xe1, 0x69, 0x38, 0x5c, 0x40,
-- 0x8b, 0x2a, 0x18, 0x80, 0x83, 0x28, 0x8b, 0x28,
-- 0x30, 0x06, 0x83, 0x28, 0x19, 0x88, 0x1f, 0x41,
-- 0x1c, 0x30, 0xf0, 0x14, 0xfa, 0xd5, 0x61, 0xe1,
-- 0x21, 0xff, 0x71, 0x39, 0x20, 0x02, 0x64, 0xe0,
-- 0x6c, 0xe0, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x01,
-- 0xe0, 0x94, 0xe0, 0x93, 0x6a, 0x20, 0x69, 0xe1,
-- 0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, 0xd5, 0x02,
-- 0x69, 0x20, 0x18, 0x08, 0x63, 0xf8, 0x79, 0x38,
-- 0x28, 0x00, 0xd0, 0x13, 0x20, 0x01, 0x02, 0xc0,
-- 0x83, 0xa8, 0xe0, 0x11, 0x02, 0x01, 0x65, 0x79,
-- 0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x12, 0x18, 0x51,
-- 0x65, 0x79, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14,
-- 0xfa, 0xaf, 0x61, 0xe1, 0x98, 0x00, 0x38, 0x01,
-- 0x63, 0xf8, 0xe7, 0xb2, 0x48, 0x3c, 0x83, 0xa8,
-- 0x8b, 0x28, 0x6b, 0xf9, 0x42, 0x88, 0xda, 0x01,
-- 0x63, 0xf8, 0xe0, 0x02, 0x8b, 0xa8, 0x42, 0x81,
-- 0xdb, 0x68, 0x8b, 0xa8, 0x6b, 0xf9, 0x42, 0x81,
-- 0xdd, 0x00, 0x63, 0xf8, 0x48, 0x35, 0x21, 0x00,
-- 0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff,
-- 0x31, 0xc1, 0x66, 0x78, 0x80, 0x01, 0x48, 0x32,
-- 0x66, 0x78, 0x79, 0x39, 0x29, 0x00, 0xd0, 0x21,
-- 0x21, 0x00, 0x71, 0x39, 0x69, 0x3b, 0x69, 0x20,
-- 0x18, 0x1a, 0xb4, 0x04, 0x69, 0xe0, 0x18, 0x18,
-- 0x6b, 0xfa, 0x49, 0x2a, 0xf0, 0x00, 0xfe, 0xf4,
-- 0x6b, 0xf8, 0x38, 0x06, 0x6e, 0x79, 0x80, 0x08,
-- 0x31, 0x02, 0x66, 0x79, 0xb0, 0x01, 0x48, 0x25,
-- 0xf7, 0xff, 0xff, 0x02, 0x8b, 0x28, 0x6b, 0xf9,
-- 0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xf9,
-- 0x18, 0x41, 0x69, 0x20, 0xf0, 0x14, 0xfa, 0x6c,
-- 0x61, 0xe1, 0xe0, 0x26, 0x6b, 0xf9, 0x31, 0x03,
-- 0x80, 0x01, 0x48, 0x1e, 0x21, 0x01, 0x03, 0xc9,
-- 0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff,
-- 0x66, 0x78, 0x80, 0x01, 0x48, 0x1a, 0x66, 0x78,
-- 0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04,
-- 0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x17,
-- 0xf0, 0x00, 0xfe, 0xc6, 0x8b, 0x28, 0x6b, 0xf9,
-- 0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xfe,
-- 0x19, 0x81, 0x69, 0x20, 0xb0, 0x01, 0xf0, 0x14,
-- 0xfa, 0x47, 0x1d, 0xf0, 0x30, 0x02, 0x61, 0xe1,
-- 0x63, 0xf8, 0x8b, 0x28, 0x28, 0x00, 0xd1, 0x01,
-- 0x21, 0x00, 0x64, 0xe0, 0x21, 0x10, 0x48, 0x0c,
-- 0x85, 0x01, 0x6b, 0xf9, 0x85, 0x41, 0x21, 0x01,
-- 0x02, 0x49, 0x86, 0x81, 0xb0, 0x06, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44,
-- 0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00,
-- 0x2c, 0x00, 0x02, 0x04, 0x2c, 0x00, 0x02, 0x06,
-- 0x2c, 0x00, 0x02, 0x0a, 0x2c, 0x00, 0x02, 0x09,
-- 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x20, 0x33,
-- 0x06, 0x40, 0x6e, 0x40, 0xb0, 0x81, 0x4f, 0x77,
-- 0x63, 0xb8, 0x6a, 0xf9, 0x1a, 0x40, 0x1d, 0xfc,
-- 0x34, 0x79, 0x63, 0xe0, 0x28, 0x00, 0xda, 0x02,
-- 0x6a, 0x79, 0x18, 0x40, 0x63, 0xe0, 0x6b, 0xe0,
-- 0x4b, 0x71, 0x42, 0x98, 0xdc, 0x03, 0xb0, 0x01,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0xb9,
-- 0x48, 0x6e, 0x1d, 0xc5, 0x35, 0x59, 0x29, 0x00,
-- 0xd1, 0x16, 0x7e, 0x01, 0x29, 0x00, 0xd1, 0x13,
-- 0x21, 0x01, 0x75, 0x01, 0x21, 0x05, 0x84, 0x29,
-- 0x23, 0x0d, 0x06, 0x9b, 0x6c, 0x79, 0x1a, 0xca,
-- 0x68, 0x52, 0x31, 0x08, 0x23, 0x05, 0x02, 0x5b,
-- 0x64, 0x79, 0x66, 0xba, 0x42, 0x99, 0xdb, 0x06,
-- 0x21, 0x01, 0x02, 0xc9, 0x64, 0x79, 0xe0, 0x02,
-- 0x21, 0x00, 0x75, 0x01, 0x84, 0x29, 0x8c, 0x29,
-- 0x1c, 0x4a, 0x6a, 0xfb, 0x1a, 0x9a, 0x07, 0x92,
-- 0x0f, 0x92, 0x18, 0x51, 0x84, 0x29, 0x7e, 0x01,
-- 0x29, 0x00, 0xd0, 0x03, 0x21, 0x00, 0x66, 0x39,
-- 0x66, 0x79, 0x76, 0x01, 0x6c, 0x79, 0x4a, 0x58,
-- 0x69, 0x52, 0x42, 0x91, 0xd0, 0x26, 0x6e, 0x7a,
-- 0x2a, 0x00, 0xd1, 0x10, 0x23, 0x0d, 0x06, 0x9b,
-- 0x1a, 0xc9, 0x68, 0x09, 0x66, 0x79, 0x1c, 0x0a,
-- 0x6e, 0x3b, 0x18, 0x59, 0x66, 0x39, 0x4b, 0x51,
-- 0x42, 0x99, 0xdb, 0x04, 0x32, 0x01, 0x31, 0x01,
-- 0x40, 0x19, 0x66, 0x39, 0x66, 0x7a, 0x6e, 0x79,
-- 0x6d, 0xba, 0x1a, 0x89, 0x65, 0x21, 0x91, 0x00,
-- 0x8c, 0x2b, 0x4e, 0x4b, 0x1a, 0xf3, 0x42, 0x8b,
-- 0xd3, 0x04, 0x63, 0xe1, 0x21, 0x00, 0x65, 0xb9,
-- 0x66, 0x79, 0xe0, 0x0a, 0x18, 0xd1, 0x63, 0xe3,
-- 0x65, 0xb9, 0xe0, 0x06, 0x8c, 0x29, 0x4a, 0x44,
-- 0x1a, 0x51, 0x63, 0xe1, 0x6d, 0xba, 0x18, 0x51,
-- 0x65, 0xb9, 0x49, 0x42, 0x66, 0x61, 0x8c, 0x2a,
-- 0x6b, 0xe1, 0x18, 0x89, 0x31, 0x03, 0x83, 0xa9,
-- 0x22, 0x00, 0x6e, 0x61, 0x80, 0x0a, 0x31, 0x02,
-- 0x22, 0xff, 0x32, 0xe1, 0x66, 0x61, 0x80, 0x0a,
-- 0x31, 0x02, 0x66, 0x61, 0x8b, 0xaa, 0x80, 0x0a,
-- 0x31, 0x02, 0x66, 0x61, 0x7d, 0x00, 0x28, 0x00,
-- 0xd0, 0x1d, 0x4a, 0x37, 0x80, 0x0a, 0x1c, 0x88,
-- 0x66, 0x60, 0x8c, 0x29, 0x02, 0x09, 0x6e, 0xba,
-- 0x0f, 0x52, 0x23, 0x06, 0x40, 0x1a, 0x43, 0x11,
-- 0x23, 0x21, 0x43, 0x19, 0x80, 0x01, 0x30, 0x02,
-- 0x66, 0x60, 0x6e, 0xb9, 0x0b, 0x89, 0x23, 0x01,
-- 0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 0x66, 0x60,
-- 0x6e, 0xb9, 0x00, 0x49, 0x43, 0x19, 0x80, 0x01,
-- 0x30, 0x02, 0x66, 0x60, 0xe0, 0x0b, 0x20, 0x01,
-- 0x03, 0xc0, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61,
-- 0x8c, 0x28, 0x02, 0x00, 0x23, 0xff, 0x43, 0x18,
-- 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 0x48, 0x23,
-- 0x6e, 0x61, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61,
-- 0x80, 0x08, 0x31, 0x02, 0x22, 0x33, 0x06, 0x52,
-- 0x66, 0x61, 0x00, 0x53, 0x6d, 0x90, 0x18, 0xc2,
-- 0xb4, 0x04, 0x08, 0x5a, 0x6d, 0x50, 0x18, 0xc6,
-- 0x8c, 0x28, 0x4b, 0x1b, 0x18, 0xc1, 0x00, 0x53,
-- 0x6a, 0xf8, 0x18, 0xc0, 0x6b, 0xe2, 0x1c, 0x33,
-- 0xf0, 0x00, 0xfd, 0xbe, 0x6a, 0xf8, 0x6b, 0xe1,
-- 0x18, 0x40, 0x22, 0x33, 0x06, 0x52, 0x62, 0xf8,
-- 0x6d, 0x92, 0xb0, 0x01, 0x42, 0x90, 0xdb, 0x02,
-- 0x6a, 0x79, 0x1a, 0x40, 0x62, 0xf8, 0x21, 0xff,
-- 0x31, 0x11, 0x48, 0x10, 0x85, 0x01, 0x8b, 0xa9,
-- 0x31, 0x06, 0x85, 0x41, 0x21, 0x01, 0x02, 0x49,
-- 0x86, 0x81, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44,
-- 0x00, 0x00, 0x0f, 0xee, 0x2e, 0x08, 0x04, 0xa4,
-- 0xcc, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff,
-- 0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00,
-- 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff,
-- 0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0,
-- 0xb5, 0xb0, 0x1c, 0x07, 0xb0, 0x83, 0x4d, 0x20,
-- 0x6b, 0x28, 0xf7, 0xff, 0xfa, 0x51, 0x48, 0x1f,
-- 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x03,
-- 0x1f, 0xe9, 0x39, 0x79, 0x69, 0x09, 0x18, 0x40,
-- 0x6e, 0xa9, 0x29, 0x00, 0xd0, 0x22, 0x29, 0x10,
-- 0xd0, 0x20, 0x29, 0x20, 0xd0, 0x24, 0x29, 0x30,
-- 0xd1, 0x04, 0x24, 0x2d, 0x43, 0x44, 0xd5, 0x00,
-- 0x34, 0x3f, 0x11, 0xa4, 0x46, 0x6a, 0xa8, 0x01,
-- 0xa9, 0x02, 0xf7, 0xff, 0xfa, 0x17, 0x1b, 0x38,
-- 0x99, 0x02, 0x1a, 0x08, 0x22, 0x7d, 0x01, 0x52,
-- 0x42, 0x90, 0xdc, 0x01, 0x42, 0x90, 0xda, 0x05,
-- 0x1a, 0x09, 0x91, 0x02, 0x22, 0x00, 0x20, 0x00,
-- 0xf7, 0xff, 0xf9, 0xf2, 0xb0, 0x03, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x01, 0x04, 0x1a, 0x24,
-- 0xd5, 0x00, 0x34, 0x1f, 0x11, 0x64, 0xe7, 0xe1,
-- 0x21, 0x4b, 0x43, 0x41, 0x20, 0x93, 0xf0, 0x14,
-- 0xf8, 0xd7, 0x1c, 0x04, 0xe7, 0xda, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0xc4, 0x66, 0x00, 0x00, 0x80,
-- 0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x83, 0x4c, 0x18,
-- 0x6f, 0x60, 0x30, 0x01, 0x46, 0x6a, 0x67, 0x60,
-- 0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, 0xf9, 0xe6,
-- 0x4b, 0x14, 0x18, 0xf9, 0x98, 0x02, 0x1a, 0x40,
-- 0x4b, 0x13, 0x42, 0x98, 0xdc, 0x04, 0x42, 0xd8,
-- 0xdb, 0x02, 0x69, 0xe0, 0x28, 0x01, 0xd1, 0x07,
-- 0x91, 0x02, 0x20, 0x00, 0x90, 0x01, 0x22, 0x00,
-- 0xf7, 0xff, 0xf9, 0xbe, 0x20, 0x01, 0x61, 0xe0,
-- 0x69, 0xe0, 0x28, 0x00, 0xd0, 0x0b, 0x6b, 0x20,
-- 0xf7, 0xff, 0xf9, 0xea, 0x6f, 0x60, 0x67, 0xa0,
-- 0x48, 0x08, 0x60, 0x07, 0x6f, 0xe0, 0x30, 0x01,
-- 0x67, 0xe0, 0x20, 0x00, 0x61, 0xe0, 0xb0, 0x03,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0xc4, 0xff, 0xff, 0xec, 0x78,
-- 0x00, 0x02, 0xbf, 0x20, 0x2e, 0x08, 0x05, 0x44,
-- 0xb4, 0xf0, 0x1c, 0x1c, 0x23, 0x00, 0x9f, 0x04,
-- 0x60, 0x3b, 0x79, 0x85, 0x23, 0xc0, 0x40, 0x1d,
-- 0x4b, 0x33, 0x2d, 0x80, 0xd1, 0x16, 0x25, 0x02,
-- 0x60, 0x9d, 0x79, 0xc5, 0x0a, 0x2b, 0xd3, 0x06,
-- 0x7a, 0x45, 0x23, 0xe0, 0x40, 0x2b, 0x2b, 0x20,
-- 0xd1, 0x01, 0x23, 0x09, 0x60, 0x3b, 0x7a, 0x03,
-- 0x33, 0x09, 0x60, 0x13, 0x79, 0x02, 0x02, 0x12,
-- 0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2,
-- 0x60, 0x22, 0xe0, 0x25, 0x25, 0x06, 0x26, 0x01,
-- 0x60, 0x9e, 0x79, 0x83, 0x2b, 0xff, 0xd1, 0x03,
-- 0x35, 0x01, 0x5d, 0x43, 0x2b, 0xff, 0xd0, 0xfb,
-- 0x5d, 0x46, 0x23, 0xc0, 0x40, 0x33, 0x2b, 0x40,
-- 0xd1, 0x00, 0x35, 0x02, 0x5d, 0x46, 0x09, 0x33,
-- 0x07, 0x9b, 0xd0, 0x08, 0x60, 0x3d, 0x5d, 0x46,
-- 0x09, 0x73, 0xd3, 0x02, 0x1d, 0xeb, 0x33, 0x03,
-- 0xe0, 0x02, 0x1d, 0x6b, 0xe0, 0x00, 0x1c, 0x6b,
-- 0x60, 0x13, 0x79, 0x02, 0x02, 0x12, 0x79, 0x45,
-- 0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22,
-- 0x68, 0x3a, 0x2a, 0x00, 0xd0, 0x20, 0x5c, 0x82,
-- 0x23, 0x0e, 0x40, 0x1a, 0x07, 0x52, 0x60, 0x0a,
-- 0x68, 0x3b, 0x18, 0xc3, 0x78, 0x5b, 0x05, 0x9b,
-- 0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3,
-- 0x78, 0x9c, 0x23, 0xfe, 0x40, 0x23, 0x03, 0x9b,
-- 0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3,
-- 0x78, 0xdb, 0x01, 0xdb, 0x43, 0x1a, 0x60, 0x0a,
-- 0x68, 0x3b, 0x18, 0xc0, 0x79, 0x00, 0x23, 0xfe,
-- 0x40, 0x18, 0x08, 0x40, 0x43, 0x10, 0x60, 0x08,
-- 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0x44, 0xb5, 0xb0, 0xb0, 0x83,
-- 0x48, 0x43, 0x49, 0x44, 0x8d, 0xc9, 0x4c, 0x44,
-- 0x63, 0xe1, 0x29, 0x06, 0xda, 0x03, 0xb0, 0x03,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x01,
-- 0x09, 0x09, 0x01, 0x09, 0x23, 0xff, 0x33, 0xe1,
-- 0x42, 0x99, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04,
-- 0xaa, 0x03, 0xab, 0x02, 0x49, 0x39, 0xf7, 0xff,
-- 0xff, 0x6f, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03,
-- 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x6b, 0xe1,
-- 0x42, 0x88, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x4f, 0x30,
-- 0x28, 0x00, 0xd0, 0x2e, 0x6e, 0x38, 0x6d, 0xb9,
-- 0x18, 0x40, 0x23, 0x01, 0x06, 0x1b, 0x66, 0x38,
-- 0x42, 0x98, 0xdb, 0x04, 0x43, 0xdb, 0x18, 0xc0,
-- 0x66, 0x38, 0x1e, 0x48, 0x65, 0xb8, 0x23, 0x0d,
-- 0x06, 0x9b, 0x6d, 0xb8, 0x6c, 0xb9, 0x1a, 0xc9,
-- 0x60, 0x08, 0x6e, 0xe0, 0x6c, 0xb9, 0x1a, 0xc9,
-- 0x60, 0x48, 0x20, 0x00, 0x65, 0xb8, 0x6c, 0xb8,
-- 0x30, 0x08, 0x23, 0x05, 0x02, 0x5b, 0x64, 0xb8,
-- 0x42, 0x98, 0xd1, 0x02, 0x20, 0x01, 0x02, 0xc0,
-- 0x64, 0xb8, 0x6c, 0xb8, 0x49, 0x1d, 0x61, 0x48,
-- 0x6d, 0x78, 0x28, 0x04, 0xd1, 0x05, 0x68, 0xe0,
-- 0x28, 0x00, 0xd1, 0x02, 0x6e, 0xe0, 0xf7, 0xff,
-- 0xfe, 0xef, 0x24, 0x33, 0x06, 0x64, 0x00, 0x63,
-- 0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, 0x6d, 0x60,
-- 0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, 0x98, 0x03,
-- 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x2b,
-- 0xf0, 0x00, 0xfc, 0x52, 0xb0, 0x01, 0x6d, 0xb8,
-- 0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, 0x48, 0x0e,
-- 0x68, 0x02, 0x18, 0x51, 0x60, 0x01, 0x6e, 0x60,
-- 0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, 0x48, 0x0a,
-- 0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, 0x60, 0x01,
-- 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2e, 0x08, 0x04, 0xc4, 0x2e, 0x08, 0x05, 0x30,
-- 0x2e, 0x08, 0x04, 0x44, 0xcc, 0x00, 0x0f, 0x00,
-- 0x66, 0x00, 0x00, 0x64, 0xb5, 0xf0, 0xb0, 0x83,
-- 0x4e, 0x65, 0x25, 0x00, 0x4f, 0x65, 0x6a, 0xf8,
-- 0xf7, 0xff, 0xf8, 0xc2, 0x48, 0x64, 0x8d, 0xc0,
-- 0x63, 0xf8, 0x28, 0x0a, 0xda, 0x03, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x34,
-- 0x09, 0x60, 0x01, 0x40, 0x23, 0xff, 0x33, 0xc1,
-- 0x42, 0x98, 0xd0, 0x07, 0x23, 0xff, 0x33, 0xbe,
-- 0x42, 0x9c, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04,
-- 0xaa, 0x03, 0xab, 0x02, 0x49, 0x57, 0x1c, 0x30,
-- 0xf7, 0xff, 0xfe, 0xce, 0xb0, 0x01, 0x28, 0x00,
-- 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x98, 0x02, 0x99, 0x01, 0x18, 0x41,
-- 0x6b, 0xfa, 0x42, 0x91, 0xd0, 0x03, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01,
-- 0x1c, 0x22, 0x4c, 0x4d, 0x23, 0xff, 0x33, 0xbe,
-- 0x42, 0x9a, 0xd1, 0x3c, 0x5c, 0x30, 0x28, 0xa0,
-- 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0xe0, 0x28, 0x00, 0xd1, 0x1b,
-- 0x20, 0x02, 0x63, 0x78, 0x60, 0xe1, 0x21, 0x00,
-- 0x20, 0x00, 0xf0, 0x09, 0xfd, 0x8d, 0x20, 0x00,
-- 0xf7, 0xfb, 0xfd, 0xd4, 0x98, 0x02, 0x4b, 0x3c,
-- 0x18, 0xc0, 0x79, 0x40, 0x23, 0x30, 0x40, 0x18,
-- 0x66, 0xb8, 0xd0, 0x16, 0x28, 0x10, 0xd0, 0x14,
-- 0x28, 0x20, 0xd0, 0x17, 0x28, 0x30, 0xd1, 0x03,
-- 0x21, 0x20, 0x20, 0x1e, 0xf0, 0x0a, 0xf8, 0xa7,
-- 0x98, 0x00, 0x28, 0x00, 0xd0, 0x2b, 0x6d, 0x60,
-- 0x28, 0x05, 0xd1, 0x28, 0x68, 0xf8, 0x28, 0x00,
-- 0xd1, 0x25, 0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x00,
-- 0xe0, 0x21, 0x21, 0x02, 0x20, 0x1e, 0xf0, 0x0a,
-- 0xf8, 0x96, 0xe7, 0xed, 0x21, 0x08, 0x20, 0x1e,
-- 0xf0, 0x0a, 0xf8, 0x91, 0xe7, 0xe8, 0x68, 0xe0,
-- 0x28, 0x00, 0xd0, 0x08, 0x20, 0x00, 0x63, 0x79,
-- 0x21, 0x00, 0x60, 0xe0, 0xf0, 0x09, 0xfd, 0x58,
-- 0x20, 0x02, 0xf0, 0x09, 0xfd, 0xab, 0x98, 0x00,
-- 0x28, 0x00, 0xd0, 0x08, 0x6d, 0x60, 0x28, 0x05,
-- 0xd1, 0x05, 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x02,
-- 0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x25, 0x68, 0xe0,
-- 0x28, 0x00, 0xd0, 0x01, 0x98, 0x02, 0x1d, 0xc5,
-- 0x6b, 0xf8, 0x1b, 0x42, 0x63, 0xfa, 0x7e, 0x39,
-- 0x69, 0x78, 0x18, 0x41, 0x4b, 0x16, 0x18, 0xe8,
-- 0xf7, 0xfb, 0xfb, 0x3a, 0x7e, 0x38, 0x6b, 0xf9,
-- 0x18, 0x40, 0x07, 0x81, 0x0f, 0x89, 0x76, 0x39,
-- 0x1a, 0x44, 0x20, 0x01, 0x06, 0x00, 0x49, 0x15,
-- 0x60, 0x08, 0xf0, 0x17, 0xfe, 0x57, 0x4b, 0x14,
-- 0x40, 0x18, 0xf0, 0x17, 0xfe, 0x57, 0x22, 0x04,
-- 0x49, 0x10, 0xb4, 0x06, 0x23, 0x12, 0x21, 0x1e,
-- 0x69, 0x78, 0x1c, 0x22, 0xf0, 0x0e, 0xfb, 0x66,
-- 0xb0, 0x02, 0xf0, 0x17, 0xfe, 0x47, 0x23, 0x01,
-- 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, 0xfe, 0x46,
-- 0x69, 0x78, 0x59, 0x01, 0x60, 0x01, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x04, 0xc4,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x34,
-- 0x2e, 0x08, 0x04, 0x44, 0x9e, 0x00, 0x08, 0x00,
-- 0xff, 0xfb, 0xff, 0xff, 0x20, 0x33, 0x06, 0x40,
-- 0x6e, 0x81, 0x6e, 0x40, 0x1a, 0x09, 0x48, 0x0f,
-- 0x63, 0xc1, 0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc2,
-- 0x3a, 0x79, 0x6a, 0x52, 0x18, 0x89, 0x63, 0xc1,
-- 0x6b, 0xc1, 0x08, 0x89, 0x00, 0x89, 0x23, 0x01,
-- 0x02, 0xdb, 0x63, 0xc1, 0x42, 0x99, 0xdd, 0x0b,
-- 0x4a, 0x07, 0x42, 0x91, 0xdd, 0x00, 0x63, 0xc2,
-- 0x4a, 0x06, 0x49, 0x07, 0x85, 0x8a, 0x6b, 0xc0,
-- 0x85, 0xc8, 0x20, 0x09, 0x02, 0x40, 0x86, 0xc8,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4,
-- 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x02, 0x06,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x48, 0x0f, 0x78, 0x01,
-- 0x29, 0x00, 0xd0, 0x1a, 0x49, 0x0e, 0x6c, 0x8a,
-- 0x6c, 0xc9, 0x1a, 0x51, 0x63, 0xc1, 0x1c, 0x0a,
-- 0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc1, 0x39, 0x79,
-- 0x69, 0x09, 0x18, 0x51, 0x63, 0xc1, 0x23, 0x01,
-- 0x03, 0x1b, 0x6b, 0xc1, 0x42, 0x99, 0xdb, 0x08,
-- 0x22, 0xff, 0x32, 0x07, 0x49, 0x05, 0x85, 0x8a,
-- 0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, 0x02, 0x40,
-- 0x86, 0xc8, 0x47, 0x70, 0x2e, 0x08, 0x04, 0xc4,
-- 0x66, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x1f, 0xc0,
-- 0xb4, 0x80, 0x20, 0x00, 0x49, 0x1e, 0x6c, 0x8a,
-- 0x6c, 0xc9, 0x1a, 0x52, 0x49, 0x1d, 0x2a, 0x00,
-- 0xdc, 0x01, 0x69, 0x0b, 0x18, 0xd2, 0x23, 0x01,
-- 0x02, 0xdb, 0x42, 0x9a, 0xdd, 0x00, 0x08, 0xd8,
-- 0x22, 0x33, 0x06, 0x52, 0x6e, 0x93, 0x6e, 0x52,
-- 0x1a, 0x9a, 0x2a, 0x00, 0xdc, 0x01, 0x6a, 0x4b,
-- 0x18, 0xd2, 0x08, 0x92, 0x00, 0x92, 0x4b, 0x14,
-- 0x68, 0xdb, 0x2b, 0x00, 0xd0, 0x06, 0x23, 0x01,
-- 0x03, 0x1b, 0x6a, 0x4f, 0x18, 0xfb, 0x6a, 0x89,
-- 0x1a, 0x59, 0xe0, 0x01, 0x21, 0x01, 0x03, 0x09,
-- 0x42, 0x8a, 0xdd, 0x04, 0x04, 0x00, 0x0c, 0x00,
-- 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 0x28, 0x00,
-- 0xd0, 0x0b, 0x4b, 0x0a, 0x42, 0x9a, 0xdd, 0x00,
-- 0x1c, 0x1a, 0x21, 0x06, 0x43, 0x01, 0x48, 0x08,
-- 0x85, 0x81, 0x85, 0xc2, 0x21, 0x09, 0x02, 0x49,
-- 0x86, 0xc1, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44,
-- 0x2e, 0x08, 0x04, 0xc4, 0x00, 0x00, 0xff, 0xff,
-- 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x04, 0x00,
-- 0x0c, 0x00, 0x4f, 0x13, 0x6d, 0x39, 0x29, 0x00,
-- 0xd1, 0x10, 0x24, 0x01, 0x28, 0x01, 0xd0, 0x10,
-- 0x28, 0x04, 0xd0, 0x15, 0x28, 0x05, 0xd1, 0x09,
-- 0xf7, 0xff, 0xf8, 0x48, 0xf7, 0xfe, 0xff, 0xfc,
-- 0x20, 0x00, 0x66, 0xf8, 0x67, 0x38, 0x20, 0x05,
-- 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf1, 0x65, 0x3c,
-- 0x65, 0x7c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xf7, 0xff, 0xf8, 0x34, 0x20, 0x04, 0x65, 0x78,
-- 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x04, 0x00,
-- 0x0c, 0x00, 0x4f, 0x23, 0x6d, 0x39, 0x29, 0x00,
-- 0xd0, 0x0e, 0x29, 0x02, 0xd1, 0x09, 0x6d, 0x78,
-- 0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x27,
-- 0x28, 0x05, 0xd1, 0x02, 0x20, 0xff, 0xf7, 0xff,
-- 0xf8, 0xc7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x24, 0x02, 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04,
-- 0xd0, 0x12, 0x28, 0x05, 0xd1, 0xf5, 0x20, 0x00,
-- 0xf7, 0xff, 0xf8, 0xba, 0x20, 0x05, 0x65, 0x78,
-- 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xf7, 0xff, 0xf8, 0x38, 0x20, 0x01, 0x65, 0x78,
-- 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xf7, 0xff, 0xf8, 0x70, 0x20, 0x04, 0x65, 0x78,
-- 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0xf0,
-- 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0xec,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x02,
-- 0xf0, 0x09, 0xfc, 0x4c, 0x20, 0xff, 0x49, 0x03,
-- 0x70, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x04, 0xc4,
-- 0xb5, 0xf0, 0x4f, 0x2b, 0x24, 0x00, 0x6d, 0x38,
-- 0x28, 0x01, 0xd0, 0x1e, 0x28, 0x02, 0xd1, 0x19,
-- 0x26, 0x03, 0x6d, 0x78, 0x1d, 0xfd, 0x35, 0x79,
-- 0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x3f,
-- 0x28, 0x05, 0xd1, 0x0f, 0x20, 0x02, 0x63, 0x6c,
-- 0xf0, 0x09, 0xfc, 0x2c, 0x20, 0x00, 0xf7, 0xfb,
-- 0xfc, 0x1d, 0xf7, 0xff, 0xf8, 0x21, 0x65, 0x3e,
-- 0x20, 0x00, 0x65, 0x78, 0xf7, 0xfe, 0xfe, 0xb8,
-- 0x20, 0x01, 0x61, 0xe8, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x0c,
-- 0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0xf5,
-- 0xf7, 0xfe, 0xff, 0x82, 0xf7, 0xfe, 0xff, 0xd8,
-- 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0xf7, 0xfe, 0xff, 0x79, 0x65, 0x3c,
-- 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xf7, 0xfe, 0xff, 0xca, 0x65, 0x3c, 0x65, 0x7c,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x63, 0x6c,
-- 0x20, 0x02, 0x60, 0xfc, 0xf0, 0x09, 0xfb, 0xfa,
-- 0x20, 0x00, 0xf7, 0xfb, 0xfb, 0xeb, 0x65, 0x7c,
-- 0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xf7, 0xfe, 0xff, 0xea, 0x65, 0x7c, 0x65, 0x3e,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x4c, 0x1b,
-- 0x68, 0xe0, 0x28, 0x03, 0xd0, 0x1f, 0x1f, 0xe7,
-- 0x3f, 0x79, 0x6d, 0x38, 0x28, 0x02, 0xd1, 0x1a,
-- 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x1a, 0x28, 0x04,
-- 0xd0, 0x20, 0x28, 0x05, 0xd1, 0x13, 0x4a, 0x14,
-- 0x49, 0x14, 0x48, 0x15, 0xf7, 0xfe, 0xfe, 0x4a,
-- 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0x68,
-- 0x20, 0x01, 0xf0, 0x09, 0xfb, 0xcb, 0x20, 0x03,
-- 0x60, 0xe0, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x02,
-- 0x20, 0x01, 0xf0, 0x09, 0xfb, 0xc3, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0xf0, 0x09,
-- 0xfb, 0xbd, 0x20, 0x00, 0x70, 0x20, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0b,
-- 0xf0, 0x0b, 0xff, 0x4e, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4,
-- 0x2e, 0x08, 0x05, 0x50, 0x2e, 0x08, 0x05, 0x48,
-- 0x2e, 0x08, 0x05, 0x4c, 0xb5, 0xf0, 0x4c, 0x21,
-- 0x6d, 0x20, 0x28, 0x02, 0xd1, 0x24, 0x26, 0xff,
-- 0x6d, 0x60, 0x1d, 0xe7, 0x37, 0x79, 0x28, 0x01,
-- 0xd0, 0x1d, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x05,
-- 0xd1, 0x1a, 0x20, 0x01, 0xf0, 0x09, 0xfb, 0x96,
-- 0x25, 0x00, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x04,
-- 0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xfb, 0x38,
-- 0x60, 0xe5, 0x70, 0x3e, 0x68, 0xf8, 0x28, 0x03,
-- 0xd1, 0x14, 0x48, 0x13, 0x22, 0x00, 0x68, 0x41,
-- 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xe5, 0x6b, 0x38,
-- 0xf7, 0xfe, 0xfe, 0x16, 0xe0, 0x0f, 0x70, 0x3e,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00,
-- 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x11, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x61, 0xf8,
-- 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x05, 0x20, 0x02,
-- 0x60, 0xfd, 0xf0, 0x09, 0xfb, 0x6b, 0x21, 0x00,
-- 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44,
-- 0x2e, 0x08, 0x05, 0x44, 0xb5, 0xb0, 0x04, 0x07,
-- 0x0c, 0x3f, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01,
-- 0x2f, 0x3f, 0xdd, 0x00, 0x27, 0x3f, 0x48, 0x17,
-- 0x6d, 0x01, 0x29, 0x02, 0xd1, 0x13, 0x6d, 0x40,
-- 0x25, 0x02, 0x4c, 0x15, 0x28, 0x04, 0xd0, 0x11,
-- 0x28, 0x05, 0xd1, 0x0c, 0x21, 0x00, 0x20, 0x0e,
-- 0xf0, 0x0b, 0xfe, 0xe2, 0x21, 0x00, 0x20, 0x0d,
-- 0xf0, 0x0b, 0xfe, 0xde, 0x20, 0x22, 0x1c, 0x39,
-- 0xf0, 0x0b, 0xfe, 0xda, 0x60, 0xe5, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e,
-- 0xf0, 0x0b, 0xfe, 0xd2, 0x21, 0x00, 0x20, 0x0d,
-- 0xf0, 0x0b, 0xfe, 0xce, 0x20, 0x22, 0x1c, 0x39,
-- 0xf0, 0x0b, 0xfe, 0xca, 0x20, 0x00, 0xf7, 0xfe,
-- 0xfd, 0xc3, 0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44,
-- 0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b,
-- 0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40,
-- 0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b,
-- 0x21, 0x00, 0x20, 0x16, 0xf0, 0x0b, 0xfe, 0xb0,
-- 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xa9, 0x21, 0x00,
-- 0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44,
-- 0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b,
-- 0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40,
-- 0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b,
-- 0x21, 0x00, 0x20, 0x1a, 0xf0, 0x0b, 0xfe, 0x94,
-- 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0x8d, 0x21, 0x00,
-- 0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44,
-- 0x2e, 0x08, 0x04, 0xc4, 0x48, 0x03, 0x6d, 0x00,
-- 0x28, 0x00, 0xd1, 0x00, 0x47, 0x70, 0x20, 0xff,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44,
-- 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x52,
-- 0x6d, 0x29, 0x48, 0x52, 0x26, 0x00, 0x29, 0x01,
-- 0xd0, 0x4c, 0x29, 0x02, 0xd1, 0x6e, 0x6d, 0x69,
-- 0x29, 0x01, 0xd0, 0x20, 0x29, 0x04, 0xd0, 0x2e,
-- 0x29, 0x05, 0xd1, 0x3e, 0x6c, 0xc1, 0x6c, 0x80,
-- 0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40,
-- 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13,
-- 0xfc, 0x1b, 0x70, 0x20, 0x20, 0x33, 0x06, 0x40,
-- 0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01,
-- 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41,
-- 0x6a, 0x68, 0xf0, 0x13, 0xfc, 0x0d, 0x70, 0x38,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0xc1,
-- 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29,
-- 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28,
-- 0xf0, 0x13, 0xfb, 0xfe, 0x70, 0x20, 0x70, 0x3e,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33,
-- 0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08,
-- 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64,
-- 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xec,
-- 0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x69, 0x29, 0x01,
-- 0xd0, 0x21, 0x29, 0x04, 0xd0, 0x2f, 0x29, 0x05,
-- 0xd1, 0x3f, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40,
-- 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64,
-- 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xfb, 0xd0,
-- 0x70, 0x20, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8,
-- 0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69,
-- 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68,
-- 0xf0, 0x13, 0xfb, 0xc2, 0x70, 0x38, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x26, 0x69, 0x69,
-- 0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29,
-- 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28,
-- 0xf0, 0x13, 0xfb, 0xb2, 0x70, 0x20, 0x70, 0x3e,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x33,
-- 0x06, 0x49, 0x6a, 0xe8, 0x6e, 0x49, 0x1a, 0x08,
-- 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64,
-- 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xa0,
-- 0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80,
-- 0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2,
-- 0x1c, 0x0d, 0x21, 0x00, 0x1c, 0x1c, 0x42, 0xba,
-- 0xda, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x42, 0xa0, 0xd3, 0x01, 0x42, 0xb0,
-- 0xd9, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x19, 0xc1, 0x42, 0xb1, 0xd9, 0x0c,
-- 0x1a, 0x32, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x29,
-- 0xf7, 0xfa, 0xff, 0xc2, 0x6c, 0x30, 0x1a, 0x3a,
-- 0x18, 0x29, 0x1c, 0x20, 0xf7, 0xfa, 0xff, 0xbc,
-- 0xe0, 0x03, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfa,
-- 0xff, 0xb7, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4,
-- 0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2,
-- 0x1c, 0x05, 0x20, 0x00, 0x1c, 0x1c, 0x42, 0xba,
-- 0xdb, 0x18, 0x42, 0xa1, 0xd3, 0x16, 0x42, 0xb1,
-- 0xd2, 0x14, 0x19, 0xc8, 0x42, 0xb0, 0xd9, 0x0c,
-- 0x1a, 0x72, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x28,
-- 0xf7, 0xfa, 0xff, 0x9a, 0x6c, 0x30, 0x1a, 0x3a,
-- 0x18, 0x28, 0x1c, 0x21, 0xf7, 0xfa, 0xff, 0x94,
-- 0xe0, 0x03, 0x1c, 0x28, 0x1c, 0x3a, 0xf7, 0xfa,
-- 0xff, 0x8f, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4,
-- 0x47, 0x70, 0xb5, 0x00, 0xb0, 0x82, 0x46, 0x6a,
-- 0x49, 0x06, 0xa8, 0x01, 0xf7, 0xfe, 0xfc, 0x4e,
-- 0x21, 0x00, 0x20, 0x0b, 0xf0, 0x0b, 0xfd, 0x6c,
-- 0x20, 0x03, 0x49, 0x03, 0x61, 0x08, 0xb0, 0x02,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0x58,
-- 0x2e, 0x08, 0x05, 0x44, 0xb5, 0x80, 0x4f, 0x0b,
-- 0x22, 0x00, 0x20, 0x00, 0x69, 0x79, 0xf7, 0xfe,
-- 0xfc, 0x23, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b,
-- 0xfd, 0x57, 0x21, 0x01, 0x1f, 0xf8, 0x38, 0x79,
-- 0x61, 0xc1, 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x4c,
-- 0x20, 0x00, 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x44,
-- 0xb5, 0x80, 0x4f, 0x06, 0x68, 0x38, 0x1d, 0xc1,
-- 0x31, 0xb5, 0x20, 0x2f, 0x02, 0x80, 0xf0, 0x13,
-- 0xfa, 0xfb, 0x60, 0x39, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5c, 0x9c,
-- 0x48, 0x05, 0x8f, 0xc1, 0x29, 0x00, 0xd0, 0x05,
-- 0x21, 0x00, 0x87, 0xc1, 0x48, 0x03, 0x69, 0x01,
-- 0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x5c,
-- 0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x48, 0x03,
-- 0x69, 0x41, 0x31, 0x01, 0x61, 0x41, 0x47, 0x70,
-- 0x2e, 0x08, 0x47, 0x50, 0x2e, 0x08, 0x05, 0x5c,
-- 0xb5, 0x00, 0xb0, 0x88, 0x46, 0x68, 0xf0, 0x0e,
-- 0xf8, 0xfd, 0x48, 0x07, 0x69, 0x81, 0x31, 0x01,
-- 0x23, 0x01, 0x22, 0x06, 0x61, 0x81, 0x21, 0x47,
-- 0x02, 0x49, 0x05, 0x48, 0xf0, 0x0d, 0xff, 0xea,
-- 0xb0, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x05, 0x5c, 0xb5, 0x80, 0x1c, 0x07,
-- 0x20, 0xff, 0x30, 0xcd, 0xb0, 0x85, 0x90, 0x00,
-- 0x20, 0x01, 0x02, 0x40, 0x90, 0x02, 0x48, 0x0e,
-- 0x90, 0x04, 0x20, 0x0e, 0xab, 0x03, 0x80, 0x18,
-- 0x46, 0x68, 0xf0, 0x0e, 0xf9, 0x0f, 0x2f, 0x00,
-- 0xd0, 0x0d, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40,
-- 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc7, 0x98, 0x02,
-- 0x1e, 0x79, 0xf0, 0x00, 0xfb, 0x21, 0x98, 0x02,
-- 0x1a, 0x38, 0x49, 0x04, 0x60, 0x88, 0xb0, 0x05,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x1c, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x5c,
-- 0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00,
-- 0xf0, 0x09, 0xfd, 0x76, 0x48, 0x04, 0x68, 0x00,
-- 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01,
-- 0xf0, 0x00, 0xf9, 0xe4, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x5e, 0x58, 0xb5, 0xf0, 0x48, 0x53,
-- 0x4e, 0x53, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x53,
-- 0x86, 0xe7, 0x86, 0xa7, 0x48, 0x52, 0x60, 0x07,
-- 0xf0, 0x05, 0xfc, 0x76, 0x48, 0x51, 0xf0, 0x0e,
-- 0xfd, 0x23, 0xf7, 0xfa, 0xfe, 0x71, 0x21, 0xff,
-- 0x48, 0x4f, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00,
-- 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01,
-- 0x4a, 0x4c, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc,
-- 0xfa, 0xf7, 0x20, 0x01, 0xf7, 0xff, 0xff, 0xa2,
-- 0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xf8, 0xb4,
-- 0xf0, 0x01, 0xfa, 0xac, 0x48, 0x46, 0x60, 0x07,
-- 0x25, 0x02, 0x48, 0x46, 0x60, 0x05, 0x20, 0x03,
-- 0x49, 0x45, 0x60, 0x08, 0x49, 0x45, 0x60, 0x08,
-- 0x49, 0x45, 0x60, 0x0d, 0x49, 0x45, 0x60, 0x08,
-- 0x48, 0x45, 0x60, 0x07, 0x48, 0x45, 0x65, 0x87,
-- 0xf0, 0x00, 0xf9, 0x84, 0xf0, 0x0e, 0xfd, 0x90,
-- 0x20, 0x00, 0xf0, 0x0c, 0xfa, 0xcd, 0x28, 0x00,
-- 0xd1, 0x60, 0x48, 0x41, 0xf0, 0x08, 0xff, 0x06,
-- 0x20, 0x00, 0xf0, 0x08, 0xff, 0x77, 0x87, 0xe7,
-- 0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03,
-- 0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x0b,
-- 0xff, 0x73, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc,
-- 0xfc, 0x53, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d,
-- 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xab, 0x20, 0x7d,
-- 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xbf, 0xf0, 0x04,
-- 0xfb, 0x8d, 0xf0, 0x04, 0xfb, 0xcb, 0xf7, 0xfb,
-- 0xf8, 0xe5, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfc,
-- 0xff, 0xf5, 0xf7, 0xfd, 0xfb, 0xa3, 0xf7, 0xfb,
-- 0xfc, 0x11, 0x20, 0xff, 0xf7, 0xfa, 0xff, 0x2c,
-- 0x05, 0xa8, 0xf0, 0x17, 0xf9, 0x8a, 0x49, 0x29,
-- 0x20, 0x17, 0xf0, 0x17, 0xf9, 0x93, 0x49, 0x28,
-- 0x20, 0x08, 0xf0, 0x17, 0xf9, 0x8f, 0xf0, 0x17,
-- 0xf9, 0x85, 0x4b, 0x26, 0x40, 0x18, 0xf0, 0x17,
-- 0xf9, 0x85, 0x01, 0xe8, 0xf0, 0x17, 0xf9, 0x79,
-- 0x48, 0x23, 0x23, 0x01, 0x22, 0x08, 0x21, 0x81,
-- 0x01, 0x09, 0x60, 0x07, 0xf0, 0x0b, 0xfe, 0x84,
-- 0xf0, 0x01, 0xfa, 0xd2, 0x49, 0x1f, 0x20, 0x04,
-- 0xf0, 0x17, 0xf9, 0x78, 0xf0, 0x17, 0xf9, 0x6e,
-- 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17,
-- 0xf9, 0x6d, 0x20, 0x10, 0xf0, 0x17, 0xf9, 0x61,
-- 0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfd,
-- 0xfd, 0x91, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
-- 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2e, 0x08, 0x04, 0x94, 0x07, 0x77, 0x77, 0x20,
-- 0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x5c,
-- 0x6e, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00,
-- 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x15, 0x00,
-- 0x6e, 0x00, 0x16, 0x00, 0x6e, 0x00, 0x17, 0x00,
-- 0x6e, 0x00, 0x18, 0x00, 0xcc, 0x00, 0x0f, 0x80,
-- 0x00, 0x80, 0x10, 0x80, 0x2e, 0x00, 0x56, 0x25,
-- 0x2e, 0x00, 0x56, 0x45, 0xff, 0xff, 0xfe, 0xff,
-- 0x2e, 0x08, 0x47, 0x50, 0x2e, 0x00, 0x56, 0x05,
-- 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17,
-- 0xf9, 0x69, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01,
-- 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f,
-- 0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff,
-- 0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47,
-- 0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21,
-- 0xf0, 0x17, 0xf9, 0x20, 0xf0, 0x17, 0xf9, 0x16,
-- 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17,
-- 0xf9, 0x15, 0xf0, 0x17, 0xf9, 0x81, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8,
-- 0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x03, 0x00,
-- 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17,
-- 0xf9, 0x3d, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01,
-- 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f,
-- 0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff,
-- 0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47,
-- 0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21,
-- 0xf0, 0x17, 0xf8, 0xf4, 0xf0, 0x17, 0xf8, 0xea,
-- 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17,
-- 0xf8, 0xe9, 0xf0, 0x17, 0xf9, 0x55, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8,
-- 0x6e, 0x00, 0x03, 0x00, 0xb5, 0x00, 0xf0, 0x17,
-- 0xf9, 0x15, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08,
-- 0xf0, 0x17, 0xf8, 0xd4, 0x23, 0x02, 0x43, 0x18,
-- 0xf0, 0x17, 0xf8, 0xd4, 0xf0, 0x17, 0xf9, 0x40,
-- 0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x03, 0x00,
-- 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17,
-- 0xf9, 0x01, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01,
-- 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f,
-- 0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff,
-- 0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47,
-- 0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21,
-- 0xf0, 0x17, 0xf8, 0xb8, 0xf0, 0x17, 0xf8, 0xae,
-- 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17,
-- 0xf8, 0xad, 0xf0, 0x17, 0xf9, 0x19, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8,
-- 0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x04, 0x00,
-- 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17,
-- 0xf8, 0xd5, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01,
-- 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f,
-- 0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff,
-- 0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47,
-- 0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21,
-- 0xf0, 0x17, 0xf8, 0x8c, 0xf0, 0x17, 0xf8, 0x82,
-- 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17,
-- 0xf8, 0x81, 0xf0, 0x17, 0xf8, 0xed, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8,
-- 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0xf0, 0x17,
-- 0xf8, 0xad, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08,
-- 0xf0, 0x17, 0xf8, 0x6c, 0x23, 0x20, 0x43, 0x18,
-- 0xf0, 0x17, 0xf8, 0x6c, 0xf0, 0x17, 0xf8, 0xd8,
-- 0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x04, 0x00,
-- 0xb5, 0x00, 0x48, 0x0b, 0x68, 0x41, 0x31, 0x14,
-- 0x60, 0x41, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81,
-- 0x48, 0x08, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05,
-- 0x28, 0x01, 0xd1, 0x01, 0xf7, 0xfe, 0xfa, 0x58,
-- 0xbc, 0x08, 0x47, 0x18, 0x48, 0x04, 0x21, 0x10,
-- 0xf0, 0x09, 0xfc, 0x82, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x04, 0xf8,
-- 0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x00, 0xf0, 0x17,
-- 0xf8, 0x7d, 0x21, 0x00, 0x48, 0x08, 0x60, 0x41,
-- 0x60, 0x81, 0x49, 0x08, 0x20, 0x07, 0xf0, 0x17,
-- 0xf8, 0x41, 0xf0, 0x17, 0xf8, 0x37, 0x23, 0x80,
-- 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 0xf8, 0x36,
-- 0xf0, 0x17, 0xf8, 0xa2, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5a, 0x45,
-- 0x48, 0x01, 0x68, 0x40, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x90, 0x49, 0x0d,
-- 0x1c, 0x0f, 0x48, 0x0d, 0x24, 0x1e, 0x22, 0x10,
-- 0x1c, 0x23, 0xf0, 0x09, 0xfd, 0x83, 0x22, 0x02,
-- 0x21, 0x10, 0x1c, 0x38, 0x1c, 0x23, 0xf0, 0x05,
-- 0xff, 0xeb, 0x49, 0x08, 0x20, 0x10, 0xf0, 0x17,
-- 0xf8, 0x19, 0xf0, 0x17, 0xf8, 0x0f, 0x4b, 0x06,
-- 0x40, 0x18, 0xf0, 0x17, 0xf8, 0x0f, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60,
-- 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5b, 0x09,
-- 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0xb0, 0x86,
-- 0x46, 0x68, 0x49, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c,
-- 0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c,
-- 0x48, 0x09, 0xab, 0x00, 0xcb, 0x0e, 0xb0, 0x03,
-- 0xf0, 0x09, 0xfd, 0x88, 0xb0, 0x03, 0x48, 0x07,
-- 0x68, 0x01, 0x08, 0x4a, 0xd3, 0x04, 0x08, 0x49,
-- 0x00, 0x49, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60,
-- 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x00, 0x04,
-- 0xb5, 0x80, 0x29, 0x0c, 0xd2, 0x00, 0x21, 0x0c,
-- 0x31, 0x07, 0x08, 0xc9, 0x00, 0xc9, 0x27, 0x00,
-- 0x68, 0x02, 0x42, 0x82, 0xd0, 0x03, 0x68, 0x93,
-- 0x42, 0x8b, 0xd3, 0x0d, 0x1c, 0x17, 0x2f, 0x00,
-- 0xd0, 0x1e, 0x68, 0xb8, 0x1a, 0x42, 0x2a, 0x0c,
-- 0xd2, 0x00, 0x1c, 0x01, 0x1a, 0x42, 0xd1, 0x05,
-- 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x76, 0xe0, 0x0c,
-- 0x68, 0x12, 0xe7, 0xea, 0x1d, 0xca, 0x32, 0x01,
-- 0x1a, 0x80, 0x60, 0xb8, 0x19, 0xc0, 0x1d, 0xc7,
-- 0x37, 0x01, 0x20, 0x00, 0x60, 0x38, 0x60, 0x78,
-- 0x60, 0xb9, 0x68, 0xb8, 0x60, 0x38, 0x1d, 0xf8,
-- 0x30, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xb0, 0x1f, 0xcc, 0x3c, 0x01, 0x68, 0x21,
-- 0x19, 0x0a, 0x60, 0xa1, 0x68, 0x07, 0x32, 0x08,
-- 0x42, 0x87, 0xd1, 0x06, 0x68, 0x41, 0x1c, 0x20,
-- 0xf0, 0x00, 0xf8, 0x48, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x42, 0x97, 0xd1, 0x0f, 0x68, 0x7d,
-- 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x46, 0x68, 0xa0,
-- 0x68, 0xb9, 0x18, 0x40, 0x30, 0x08, 0x60, 0xa0,
-- 0x1c, 0x20, 0x1c, 0x29, 0xf0, 0x00, 0xf8, 0x36,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xbb,
-- 0x19, 0xdb, 0x33, 0x08, 0x42, 0xa3, 0xd1, 0x13,
-- 0x68, 0xb8, 0x18, 0x40, 0x30, 0x08, 0x60, 0xb8,
-- 0x19, 0xc0, 0x68, 0x3c, 0x30, 0x08, 0x42, 0xa0,
-- 0xd1, 0xdc, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x29,
-- 0x68, 0xb8, 0x68, 0xa1, 0x18, 0x40, 0x30, 0x08,
-- 0x60, 0xb8, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x42, 0xbc, 0xd2, 0x06, 0x68, 0x79, 0x1c, 0x20,
-- 0xf0, 0x00, 0xf8, 0x14, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0x3f, 0xe7, 0xc0, 0xb5, 0x00,
-- 0x31, 0x10, 0x32, 0x01, 0x1c, 0x0b, 0x1a, 0x51,
-- 0x39, 0x08, 0x60, 0x99, 0x60, 0x00, 0x1c, 0x01,
-- 0x60, 0x40, 0x1c, 0x18, 0xf0, 0x00, 0xf8, 0x02,
-- 0xbc, 0x08, 0x47, 0x18, 0x68, 0x0a, 0x60, 0x02,
-- 0x60, 0x08, 0x68, 0x02, 0x60, 0x50, 0x60, 0x41,
-- 0x47, 0x70, 0xc8, 0x06, 0x38, 0x08, 0x60, 0x11,
-- 0xc8, 0x03, 0x60, 0x41, 0x47, 0x70, 0xb5, 0x00,
-- 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff,
-- 0xff, 0xde, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x90, 0x1c, 0x07,
-- 0xf0, 0x16, 0xff, 0x38, 0x23, 0x11, 0x05, 0x1b,
-- 0x1c, 0x04, 0x43, 0x18, 0xf0, 0x16, 0xff, 0x36,
-- 0x1c, 0x39, 0x48, 0x05, 0xf7, 0xff, 0xff, 0x50,
-- 0x1c, 0x07, 0x1c, 0x20, 0xf0, 0x16, 0xff, 0x2e,
-- 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x00, 0x1c, 0x01,
-- 0x48, 0x02, 0xf7, 0xff, 0xff, 0x41, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc,
-- 0xb5, 0x90, 0x1c, 0x07, 0xd0, 0x0e, 0xf0, 0x16,
-- 0xff, 0x15, 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04,
-- 0x43, 0x18, 0xf0, 0x16, 0xff, 0x13, 0x1c, 0x39,
-- 0x48, 0x04, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x20,
-- 0xf0, 0x16, 0xff, 0x0c, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc,
-- 0xb5, 0x00, 0x4a, 0x04, 0xc2, 0x03, 0x1c, 0x0a,
-- 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x97,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4,
-- 0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x1c, 0x01,
-- 0x48, 0x02, 0xf7, 0xff, 0xff, 0x11, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4,
-- 0xb5, 0x00, 0x49, 0x08, 0x68, 0x0a, 0x42, 0x90,
-- 0xd3, 0x02, 0x68, 0x49, 0x42, 0x88, 0xd9, 0x03,
-- 0xf7, 0xff, 0xff, 0xc6, 0xbc, 0x08, 0x47, 0x18,
-- 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x30,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4,
-- 0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x4a, 0x05,
-- 0x60, 0x90, 0x60, 0xd1, 0x1c, 0x0a, 0x1c, 0x01,
-- 0x48, 0x03, 0xf7, 0xff, 0xff, 0x68, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb4,
-- 0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x1c, 0x01,
-- 0x48, 0x02, 0xf7, 0xff, 0xfe, 0xe1, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd4,
-- 0xb5, 0x00, 0x49, 0x08, 0x68, 0x8a, 0x42, 0x90,
-- 0xd3, 0x02, 0x68, 0xc9, 0x42, 0x88, 0xd9, 0x03,
-- 0xf7, 0xff, 0xff, 0x96, 0xbc, 0x08, 0x47, 0x18,
-- 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x00,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4,
-- 0x2e, 0x08, 0x05, 0xd4, 0xb5, 0xf0, 0x06, 0x07,
-- 0x0e, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81,
-- 0x91, 0x00, 0x06, 0x16, 0x0e, 0x36, 0x00, 0xbd,
-- 0x4c, 0x15, 0x59, 0x60, 0x28, 0x00, 0xd1, 0x15,
-- 0xf7, 0xfb, 0xf9, 0x10, 0x22, 0x00, 0xb4, 0x04,
-- 0x23, 0x00, 0x22, 0x02, 0x99, 0x01, 0x1c, 0x38,
-- 0xf0, 0x05, 0xf9, 0xaa, 0x23, 0x01, 0x02, 0x9b,
-- 0x00, 0x5a, 0x21, 0x01, 0x1c, 0x38, 0xb0, 0x01,
-- 0xf0, 0x05, 0xfb, 0x66, 0x20, 0x03, 0x00, 0x71,
-- 0x4a, 0x0a, 0x52, 0x50, 0x59, 0x60, 0x30, 0x01,
-- 0x51, 0x60, 0x48, 0x09, 0x23, 0x14, 0x5e, 0xc1,
-- 0x29, 0x00, 0xd1, 0x02, 0x49, 0x07, 0x4a, 0x08,
-- 0x65, 0xd1, 0x8a, 0x81, 0x31, 0x01, 0x82, 0x81,
-- 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x02, 0x5c, 0x10, 0x2e, 0x08, 0x49, 0x70,
-- 0x2e, 0x08, 0x07, 0x5c, 0x2e, 0x02, 0x5a, 0x20,
-- 0xa0, 0x00, 0x0d, 0x00, 0xb5, 0xb0, 0x06, 0x07,
-- 0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0x00, 0xb9,
-- 0x48, 0x1b, 0x58, 0x42, 0x3a, 0x01, 0x50, 0x42,
-- 0x24, 0x00, 0x2a, 0x00, 0xd1, 0x1f, 0x23, 0x01,
-- 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x02, 0x1c, 0x38,
-- 0xf0, 0x05, 0xfb, 0x32, 0x22, 0x00, 0xb4, 0x04,
-- 0x1c, 0x38, 0x1c, 0x23, 0x49, 0x13, 0xf0, 0x05,
-- 0xf9, 0x67, 0x00, 0x69, 0xb0, 0x01, 0x48, 0x12,
-- 0x52, 0x44, 0x48, 0x10, 0x4a, 0x11, 0x52, 0x50,
-- 0x00, 0x79, 0x4a, 0x11, 0x52, 0x50, 0x00, 0x6a,
-- 0x19, 0x52, 0x00, 0x92, 0x4b, 0x0f, 0x18, 0xd1,
-- 0x81, 0x0c, 0x52, 0x98, 0x80, 0x48, 0x48, 0x0e,
-- 0x8a, 0x81, 0x39, 0x01, 0x82, 0x81, 0x23, 0x14,
-- 0x5e, 0xc0, 0x28, 0x00, 0xd1, 0x03, 0x20, 0xd7,
-- 0x00, 0xc0, 0x49, 0x0a, 0x65, 0xc8, 0x1c, 0x20,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x02, 0x5c, 0x10, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0x30,
-- 0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78,
-- 0x2e, 0x08, 0x07, 0x5c, 0xa0, 0x00, 0x0d, 0x00,
-- 0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0c,
-- 0x0c, 0x24, 0x1c, 0x17, 0xb0, 0x8a, 0x46, 0x69,
-- 0x1c, 0x30, 0x1c, 0x22, 0xf0, 0x00, 0xf8, 0xb0,
-- 0x23, 0x01, 0x1c, 0x05, 0x42, 0xd8, 0xd1, 0x03,
-- 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x4b, 0x4e, 0x42, 0x9c, 0xd1, 0x06, 0xa8, 0x00,
-- 0x88, 0x00, 0x1c, 0x31, 0x1c, 0x2a, 0xf7, 0xff,
-- 0xff, 0x55, 0xe0, 0x7f, 0x20, 0x20, 0x40, 0x20,
-- 0x28, 0x20, 0xd1, 0x1f, 0x06, 0x2a, 0x0e, 0x12,
-- 0xa8, 0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00,
-- 0x1c, 0x31, 0x1c, 0x23, 0xf7, 0xfd, 0xf8, 0x5a,
-- 0x28, 0x00, 0xd0, 0x6f, 0x48, 0x42, 0x00, 0x69,
-- 0x4a, 0x42, 0x52, 0x50, 0xa9, 0x00, 0x88, 0x09,
-- 0x00, 0x49, 0x4a, 0x41, 0x52, 0x50, 0xa8, 0x00,
-- 0x88, 0x00, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xce,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x21, 0x00,
-- 0xaa, 0x01, 0x88, 0x3b, 0x0a, 0x1b, 0x70, 0x13,
-- 0x88, 0x3b, 0x93, 0x09, 0x32, 0x01, 0x06, 0x1b,
-- 0xd0, 0x02, 0x1c, 0x48, 0x06, 0x00, 0x0e, 0x00,
-- 0x9b, 0x09, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01,
-- 0x37, 0x02, 0x29, 0x0e, 0xdb, 0xed, 0x21, 0x00,
-- 0x23, 0x00, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01,
-- 0x29, 0x04, 0xdb, 0xfa, 0x21, 0x0c, 0x40, 0x21,
-- 0x29, 0x0c, 0xd1, 0x03, 0x04, 0x21, 0x0c, 0x09,
-- 0x24, 0x01, 0x43, 0x0c, 0x28, 0x06, 0xdc, 0x0e,
-- 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a,
-- 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00,
-- 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc,
-- 0xfc, 0x37, 0xb0, 0x01, 0xe0, 0x1e, 0x28, 0x0a,
-- 0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04,
-- 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00,
-- 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02,
-- 0xf7, 0xfc, 0xfc, 0x40, 0xb0, 0x01, 0xe0, 0x0d,
-- 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a,
-- 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00,
-- 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc,
-- 0xfc, 0x4b, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x05,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0xa8, 0x00,
-- 0x88, 0x00, 0x00, 0x6a, 0x19, 0x52, 0x00, 0x92,
-- 0x49, 0x0a, 0x52, 0x88, 0x18, 0x50, 0x80, 0x46,
-- 0x80, 0x84, 0x49, 0x05, 0x80, 0xc1, 0x21, 0x01,
-- 0x81, 0x01, 0x1c, 0x28, 0xb0, 0x0a, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xb9, 0x6a,
-- 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30,
-- 0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78,
-- 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x17,
-- 0x0c, 0x3f, 0xb0, 0x82, 0x48, 0x58, 0x22, 0x00,
-- 0x4d, 0x58, 0x95, 0x01, 0x1c, 0x06, 0x00, 0x53,
-- 0x9d, 0x01, 0x5a, 0xed, 0x42, 0xb5, 0xd1, 0x02,
-- 0x04, 0x10, 0x0c, 0x00, 0xe0, 0x02, 0x32, 0x01,
-- 0x2a, 0x20, 0xdb, 0xf4, 0x42, 0xb0, 0xd1, 0x04,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0,
-- 0x47, 0x70, 0x80, 0x0e, 0x4a, 0x4e, 0x92, 0x00,
-- 0x4d, 0x4e, 0x4a, 0x4f, 0x4b, 0x4f, 0x42, 0x9f,
-- 0xd1, 0x32, 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7,
-- 0x42, 0xa7, 0xd1, 0x0a, 0x00, 0x5f, 0x5b, 0xef,
-- 0x2f, 0x03, 0xd1, 0x01, 0x80, 0x0b, 0xe0, 0x07,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0,
-- 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xed,
-- 0x88, 0x0f, 0x4b, 0x3f, 0x42, 0x9f, 0xd1, 0x0a,
-- 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd6, 0x4b, 0x3c,
-- 0x42, 0x9e, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02,
-- 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf5, 0x88, 0x0f,
-- 0x4b, 0x37, 0x42, 0x9f, 0xd1, 0x04, 0x20, 0x00,
-- 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70,
-- 0x23, 0x03, 0x00, 0x47, 0x9e, 0x00, 0x53, 0xf3,
-- 0x88, 0x0f, 0x00, 0x7f, 0x53, 0xeb, 0xe0, 0x54,
-- 0x23, 0x20, 0x40, 0x3b, 0x2b, 0x20, 0xd1, 0x1e,
-- 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7,
-- 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02,
-- 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c,
-- 0xdb, 0xf3, 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd5,
-- 0x42, 0xb5, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02,
-- 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf6, 0x88, 0x0f,
-- 0x42, 0xb7, 0xd1, 0x36, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x00,
-- 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a,
-- 0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x02, 0xd1, 0x01,
-- 0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01,
-- 0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x14,
-- 0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b,
-- 0x5a, 0xd6, 0x4b, 0x11, 0x42, 0x9e, 0xd1, 0x01,
-- 0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c,
-- 0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x0c, 0x42, 0x9f,
-- 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02,
-- 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x02, 0x00, 0x47,
-- 0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f,
-- 0x53, 0xeb, 0x00, 0x43, 0x9d, 0x01, 0x52, 0xec,
-- 0x88, 0x09, 0x00, 0x49, 0x52, 0x54, 0x04, 0x00,
-- 0x14, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70,
-- 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30,
-- 0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0xb0,
-- 0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xb9, 0x6a,
-- 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81,
-- 0x4a, 0x34, 0x92, 0x00, 0x1c, 0x11, 0x42, 0x97,
-- 0xd0, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0x00,
-- 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x7c, 0x4a, 0x2e, 0x5b, 0x10,
-- 0x42, 0x88, 0xd1, 0x05, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x49, 0x28, 0x53, 0x11, 0x23, 0x00, 0x49, 0x29,
-- 0x00, 0x5e, 0x5b, 0x8e, 0x42, 0x86, 0xd1, 0x02,
-- 0x04, 0x1d, 0x0c, 0x2d, 0xe0, 0x02, 0x33, 0x01,
-- 0x2b, 0x1c, 0xdb, 0xf5, 0x23, 0x00, 0x00, 0x5e,
-- 0x5b, 0x96, 0x42, 0x86, 0xd1, 0x03, 0x04, 0x1a,
-- 0x0c, 0x12, 0x92, 0x00, 0xe0, 0x02, 0x33, 0x01,
-- 0x2b, 0x20, 0xdb, 0xf4, 0x9a, 0x00, 0x4e, 0x1b,
-- 0x42, 0xb2, 0xd1, 0x0d, 0x22, 0x00, 0x00, 0x53,
-- 0x5a, 0xcb, 0x42, 0x83, 0xd1, 0x05, 0x23, 0x00,
-- 0x00, 0x50, 0x4a, 0x19, 0x52, 0x13, 0x52, 0x0e,
-- 0xe0, 0x02, 0x32, 0x01, 0x2a, 0x1c, 0xdb, 0xf2,
-- 0x4e, 0x16, 0x5b, 0x30, 0x28, 0x02, 0xd1, 0x05,
-- 0x23, 0x00, 0x53, 0x33, 0x1c, 0x28, 0x1c, 0x39,
-- 0xf0, 0x00, 0xf8, 0x38, 0x5b, 0x30, 0x28, 0x01,
-- 0xd1, 0x0a, 0x1c, 0x38, 0xf7, 0xfc, 0xff, 0xce,
-- 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x5b, 0x30, 0x28, 0x03, 0xd1, 0x03, 0x1c, 0x28,
-- 0x1c, 0x39, 0xf7, 0xff, 0xfd, 0xcb, 0x04, 0x38,
-- 0x14, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x48, 0xf8,
-- 0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70,
-- 0x04, 0x01, 0x0c, 0x09, 0x20, 0x02, 0x00, 0x4b,
-- 0x18, 0x5b, 0x00, 0x9b, 0x4a, 0x03, 0x18, 0x99,
-- 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 0x80, 0x48,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x47, 0x78,
-- 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x0f,
-- 0x0c, 0x3f, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x00,
-- 0x0e, 0x00, 0xf7, 0xfc, 0xfc, 0x03, 0x20, 0x00,
-- 0x00, 0x7b, 0x19, 0xdb, 0x00, 0x9b, 0x4a, 0x04,
-- 0x18, 0x99, 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0,
-- 0x80, 0x48, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x47, 0x78, 0x00, 0x00, 0xff, 0xff,
-- 0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0x78, 0x42,
-- 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 0x05, 0x12,
-- 0x0d, 0x12, 0x27, 0x00, 0x43, 0xff, 0x32, 0x03,
-- 0x42, 0x8a, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x05, 0xfd, 0xec,
-- 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x09,
-- 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x81, 0x90, 0x00,
-- 0x06, 0x09, 0x0e, 0x09, 0x06, 0x12, 0x0e, 0x12,
-- 0xb0, 0x88, 0x4f, 0x16, 0x68, 0xb8, 0x28, 0x0c,
-- 0xdb, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x09,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x00, 0x23, 0x00, 0x00, 0x45, 0x46, 0x6e,
-- 0x53, 0x73, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00,
-- 0x28, 0x10, 0xdb, 0xf7, 0x02, 0x08, 0x43, 0x10,
-- 0xab, 0x00, 0x80, 0x18, 0x46, 0x6a, 0x21, 0x04,
-- 0x98, 0x08, 0xf7, 0xff, 0xfd, 0x95, 0x28, 0x00,
-- 0xda, 0x01, 0xb0, 0x09, 0xe7, 0xe4, 0x00, 0x81,
-- 0x4a, 0x05, 0x50, 0x54, 0x9b, 0x0c, 0x4a, 0x05,
-- 0x50, 0x53, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9,
-- 0xb0, 0x09, 0xe7, 0xd9, 0x2e, 0x08, 0x07, 0x74,
-- 0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x49, 0xe8,
-- 0xb5, 0x80, 0x04, 0x07, 0x14, 0x3f, 0xd5, 0x04,
-- 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xf4,
-- 0x20, 0x00, 0x00, 0xb9, 0x4a, 0x05, 0x50, 0x50,
-- 0x4a, 0x05, 0x50, 0x50, 0x49, 0x05, 0x68, 0x8a,
-- 0x3a, 0x01, 0x60, 0x8a, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x49, 0xe8,
-- 0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x07, 0x74,
-- 0xb5, 0x90, 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8,
-- 0x58, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0xd6, 0x37, 0x01, 0x2f, 0x20,
-- 0xdb, 0xf5, 0x20, 0x00, 0x49, 0x03, 0x60, 0xc8,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x49, 0xe8, 0x2e, 0x08, 0x07, 0x74,
-- 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xe5, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0xf0, 0x04, 0x00, 0x14, 0x00,
-- 0xb0, 0x83, 0x90, 0x00, 0x1c, 0x0f, 0x04, 0x11,
-- 0x0c, 0x09, 0x24, 0x00, 0x1c, 0x38, 0x1c, 0x1d,
-- 0x1c, 0x0e, 0xb0, 0x81, 0xf7, 0xff, 0xff, 0x58,
-- 0x1c, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x03,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x78, 0xf9, 0x02, 0x09, 0x79, 0x3a, 0x43, 0x11,
-- 0x04, 0x09, 0x0c, 0x09, 0x88, 0x2a, 0x42, 0x91,
-- 0xd0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x7a, 0x39, 0x02, 0x09, 0x7a, 0x7a,
-- 0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0x91, 0x00,
-- 0x7a, 0xb9, 0x02, 0x09, 0x7a, 0xfa, 0x43, 0x11,
-- 0x05, 0x0b, 0x0d, 0x1b, 0x1d, 0xf9, 0x31, 0x05,
-- 0x27, 0x00, 0x1d, 0xd8, 0x30, 0x09, 0x1a, 0x32,
-- 0x2b, 0x00, 0xdd, 0x0a, 0x78, 0x08, 0x28, 0x09,
-- 0xd1, 0x00, 0x37, 0x01, 0x78, 0x48, 0x1c, 0x85,
-- 0x1b, 0x5b, 0x18, 0x40, 0x1c, 0x81, 0x2b, 0x00,
-- 0xdc, 0xf4, 0x2a, 0x00, 0xdd, 0x36, 0x48, 0x26,
-- 0x88, 0x06, 0x96, 0x03, 0x88, 0x85, 0x95, 0x02,
-- 0x78, 0xc8, 0x02, 0x00, 0x79, 0x0b, 0x43, 0x18,
-- 0x05, 0x00, 0x0d, 0x00, 0x78, 0x0b, 0x2b, 0x01,
-- 0xd0, 0x01, 0x2b, 0x02, 0xd1, 0x06, 0x78, 0x4d,
-- 0x02, 0x2d, 0x78, 0x8e, 0x43, 0x35, 0x04, 0xed,
-- 0x0c, 0xed, 0x9e, 0x03, 0x2b, 0x04, 0xd0, 0x01,
-- 0x2b, 0x03, 0xd1, 0x09, 0x78, 0x4b, 0x02, 0x1b,
-- 0x78, 0x8d, 0x43, 0x2b, 0x04, 0xdb, 0x0c, 0xdb,
-- 0x9d, 0x02, 0x42, 0xab, 0xd1, 0x00, 0x24, 0x01,
-- 0x1d, 0x43, 0x1a, 0xd2, 0x31, 0x05, 0x28, 0x00,
-- 0xdd, 0x0a, 0x78, 0x0b, 0x2b, 0x09, 0xd1, 0x00,
-- 0x37, 0x01, 0x78, 0x4b, 0x1c, 0x9d, 0x1b, 0x40,
-- 0x18, 0x59, 0x31, 0x02, 0x28, 0x00, 0xdc, 0xf4,
-- 0x2a, 0x00, 0xdc, 0xcd, 0x2c, 0x00, 0xd0, 0x09,
-- 0xf7, 0xff, 0xff, 0x62, 0x99, 0x00, 0x48, 0x09,
-- 0x80, 0x01, 0x2f, 0x00, 0xd1, 0x07, 0xf7, 0xfa,
-- 0xf8, 0x45, 0xe0, 0x04, 0x98, 0x01, 0xf7, 0xff,
-- 0xff, 0x37, 0xf0, 0x00, 0xf8, 0x23, 0x20, 0x00,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x00, 0x08,
-- 0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0f,
-- 0x0c, 0x3f, 0x4b, 0x07, 0x68, 0xd8, 0x28, 0x80,
-- 0xda, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x00, 0x41,
-- 0x4c, 0x04, 0x52, 0x67, 0x4f, 0x04, 0x52, 0x7a,
-- 0x30, 0x01, 0x60, 0xd8, 0xbc, 0x90, 0x47, 0x70,
-- 0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x4a, 0xe8,
-- 0x2e, 0x08, 0x4b, 0xe8, 0xb5, 0x90, 0x4f, 0x13,
-- 0x24, 0x00, 0x43, 0xe4, 0x68, 0xf8, 0x28, 0x00,
-- 0xd1, 0x03, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x40, 0x49, 0x0e, 0x18, 0x41,
-- 0x1e, 0x8a, 0xb4, 0x04, 0x49, 0x0d, 0x18, 0x40,
-- 0x38, 0x40, 0x8f, 0xc0, 0x4b, 0x0c, 0x22, 0xff,
-- 0x21, 0x02, 0xf7, 0xff, 0xfe, 0xbb, 0xb0, 0x01,
-- 0x28, 0x00, 0xda, 0x03, 0x1c, 0x20, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 0x38, 0x01,
-- 0x60, 0xf8, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74,
-- 0x2e, 0x08, 0x4b, 0xe8, 0x2e, 0x08, 0x4a, 0xe8,
-- 0x2e, 0x00, 0x64, 0x57, 0xb5, 0xf0, 0x04, 0x05,
-- 0x14, 0x2d, 0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09,
-- 0x1c, 0x0e, 0x4c, 0x28, 0x23, 0x02, 0x69, 0x20,
-- 0x42, 0xd8, 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfe, 0x77, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x28,
-- 0xf7, 0xff, 0xfe, 0xce, 0x20, 0x00, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x79, 0xb8, 0x69, 0x21,
-- 0x42, 0x88, 0xd1, 0x09, 0x20, 0x01, 0x43, 0xc0,
-- 0x61, 0x20, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xc0,
-- 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x23, 0x01, 0x42, 0xd9, 0xd1, 0x02, 0x61, 0x20,
-- 0x20, 0x00, 0x60, 0xe0, 0x37, 0x08, 0x1f, 0xf4,
-- 0x3c, 0x05, 0x2c, 0x00, 0xdd, 0x11, 0x78, 0x38,
-- 0x02, 0x00, 0x78, 0x79, 0x43, 0x08, 0x04, 0x00,
-- 0x0c, 0x00, 0x78, 0xb9, 0x02, 0x09, 0x78, 0xfa,
-- 0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0xf7, 0xff,
-- 0xff, 0x77, 0x37, 0x04, 0x3c, 0x04, 0x2c, 0x00,
-- 0xdc, 0xed, 0xf7, 0xff, 0xff, 0x8b, 0xf7, 0xff,
-- 0xff, 0x89, 0xf7, 0xff, 0xff, 0x87, 0xf7, 0xff,
-- 0xff, 0x85, 0xf7, 0xff, 0xff, 0x83, 0xf7, 0xff,
-- 0xff, 0x81, 0xf7, 0xff, 0xff, 0x7f, 0xf7, 0xff,
-- 0xff, 0x7d, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74,
-- 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d,
-- 0x0c, 0x2d, 0x26, 0x00, 0x43, 0xf6, 0x4f, 0x0f,
-- 0x62, 0x3e, 0x61, 0xfe, 0x61, 0xbe, 0xf7, 0xff,
-- 0xfe, 0x9b, 0x2d, 0x00, 0xd0, 0x13, 0x2c, 0x00,
-- 0xd0, 0x11, 0x0c, 0xf0, 0x42, 0x85, 0xd0, 0x0e,
-- 0x42, 0x84, 0xd0, 0x0c, 0x80, 0x3c, 0x80, 0xbd,
-- 0x20, 0x00, 0x61, 0x3e, 0x22, 0x00, 0x61, 0x78,
-- 0xb4, 0x04, 0x4b, 0x05, 0x22, 0xff, 0x21, 0x00,
-- 0xf7, 0xff, 0xfe, 0x28, 0xb0, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x74,
-- 0x2e, 0x00, 0x66, 0x19, 0x56, 0x47, 0x41, 0x38,
-- 0x78, 0x31, 0x36, 0x00, 0xb5, 0x00, 0xb0, 0x81,
-- 0x48, 0x05, 0x69, 0xc0, 0x68, 0x80, 0x46, 0x6b,
-- 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0d, 0xfe, 0x7a,
-- 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x27, 0x00,
-- 0xb0, 0x85, 0x97, 0x00, 0x26, 0x10, 0x96, 0x01,
-- 0x25, 0x05, 0x01, 0xed, 0x95, 0x02, 0x20, 0xff,
-- 0x30, 0xd1, 0x90, 0x03, 0x97, 0x04, 0x22, 0x00,
-- 0x21, 0x00, 0xb4, 0x06, 0x4c, 0x0d, 0x69, 0xe0,
-- 0x68, 0x81, 0x1c, 0x08, 0xaa, 0x02, 0x1c, 0x3b,
-- 0xf0, 0x0e, 0xf8, 0xe2, 0xb0, 0x02, 0x97, 0x00,
-- 0x20, 0xff, 0x30, 0xd1, 0x90, 0x01, 0x95, 0x02,
-- 0x96, 0x03, 0x97, 0x04, 0x69, 0xe0, 0x68, 0x80,
-- 0x46, 0x69, 0xf0, 0x0e, 0xf8, 0x13, 0xf7, 0xff,
-- 0xff, 0xc9, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10,
-- 0xb5, 0x90, 0x20, 0x07, 0xb0, 0x85, 0xf0, 0x03,
-- 0xfb, 0xfd, 0x24, 0xff, 0x34, 0xe1, 0x22, 0x05,
-- 0x01, 0xd2, 0x21, 0x00, 0x20, 0x07, 0x1c, 0x23,
-- 0xf0, 0x03, 0xfc, 0x0c, 0x27, 0x00, 0x22, 0x00,
-- 0x21, 0x02, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x03,
-- 0xff, 0xcf, 0x22, 0x01, 0x21, 0x01, 0x20, 0x07,
-- 0x1c, 0x3b, 0xf0, 0x03, 0xff, 0x67, 0x22, 0x32,
-- 0x21, 0x32, 0x20, 0x07, 0xf0, 0x03, 0xfc, 0xc2,
-- 0x97, 0x00, 0x97, 0x01, 0x20, 0x05, 0x01, 0xc0,
-- 0x90, 0x02, 0x94, 0x03, 0x97, 0x04, 0x48, 0x06,
-- 0x69, 0xc0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0d,
-- 0xff, 0xdd, 0xf7, 0xff, 0xff, 0x93, 0xb0, 0x05,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x01, 0x00,
-- 0x4b, 0x2a, 0x18, 0xc0, 0x4b, 0x2a, 0x69, 0xdb,
-- 0x69, 0x9f, 0x00, 0x8b, 0x18, 0x59, 0x02, 0x09,
-- 0x18, 0x89, 0x18, 0x79, 0x78, 0x02, 0x70, 0x0a,
-- 0x78, 0x42, 0x1d, 0xcb, 0x33, 0x39, 0x74, 0x1a,
-- 0x78, 0x82, 0x1d, 0xcb, 0x33, 0x99, 0x70, 0x1a,
-- 0x78, 0xc2, 0x1d, 0xcb, 0x33, 0xd9, 0x74, 0x1a,
-- 0x79, 0x02, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0x3a,
-- 0x70, 0x1a, 0x79, 0x42, 0x1d, 0xcb, 0x33, 0xff,
-- 0x33, 0x7a, 0x74, 0x1a, 0x79, 0x82, 0x1d, 0xcb,
-- 0x33, 0xff, 0x33, 0xda, 0x70, 0x1a, 0x79, 0xc2,
-- 0x23, 0x11, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a,
-- 0x7a, 0x02, 0x23, 0x05, 0x01, 0xdb, 0x18, 0xcb,
-- 0x70, 0x1a, 0x7a, 0x42, 0x23, 0x0b, 0x01, 0x9b,
-- 0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x82, 0x23, 0x19,
-- 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0xc2,
-- 0x23, 0x1b, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a,
-- 0x7b, 0x02, 0x23, 0x0f, 0x01, 0x9b, 0x18, 0xcb,
-- 0x70, 0x1a, 0x7b, 0x42, 0x23, 0x01, 0x02, 0x9b,
-- 0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x82, 0x23, 0x23,
-- 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0xc0,
-- 0x23, 0x25, 0x01, 0x5b, 0x18, 0xc9, 0x74, 0x08,
-- 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x07, 0x98,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x23, 0x00,
-- 0x1c, 0x07, 0x56, 0xc0, 0x1c, 0x14, 0x1c, 0x0d,
-- 0x28, 0x00, 0xd0, 0x0f, 0x20, 0x50, 0x1c, 0x21,
-- 0xf0, 0x12, 0xf9, 0x96, 0x19, 0x41, 0x23, 0x00,
-- 0x56, 0xf8, 0x1c, 0x22, 0xf7, 0xff, 0xff, 0x92,
-- 0x23, 0x00, 0x37, 0x01, 0x56, 0xf8, 0x34, 0x01,
-- 0x28, 0x00, 0xd1, 0xef, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x90, 0x06, 0x00, 0x0e, 0x00,
-- 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 0x14, 0x3f,
-- 0x09, 0x03, 0xb0, 0x81, 0x4a, 0x08, 0x5c, 0xd4,
-- 0xab, 0x00, 0x70, 0x1c, 0x07, 0x00, 0x0f, 0x00,
-- 0x5c, 0x10, 0x70, 0x58, 0x20, 0x00, 0x70, 0x98,
-- 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xce,
-- 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x17, 0xb0, 0xb5, 0x90, 0x04, 0x00,
-- 0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x17,
-- 0x14, 0x3f, 0x0b, 0x03, 0xb0, 0x82, 0x4a, 0x0f,
-- 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, 0x0a, 0x03,
-- 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00,
-- 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b,
-- 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x9c, 0x07, 0x00,
-- 0x0f, 0x00, 0x5c, 0x10, 0x70, 0xd8, 0x20, 0x00,
-- 0x71, 0x18, 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff,
-- 0xff, 0xa5, 0xb0, 0x02, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0,
-- 0xb5, 0x90, 0x04, 0x0f, 0x14, 0x3f, 0x04, 0x12,
-- 0x14, 0x12, 0x0f, 0x03, 0xb0, 0x83, 0x49, 0x1b,
-- 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x1c, 0x0e, 0x03,
-- 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00,
-- 0x70, 0x5c, 0x0d, 0x03, 0x07, 0x1b, 0x0f, 0x1b,
-- 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x9c, 0x0c, 0x03,
-- 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00,
-- 0x70, 0xdc, 0x0b, 0x03, 0x07, 0x1b, 0x0f, 0x1b,
-- 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x1c, 0x0a, 0x03,
-- 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x01,
-- 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b,
-- 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x9c, 0x07, 0x00,
-- 0x0f, 0x00, 0x5c, 0x08, 0x70, 0xd8, 0x20, 0x00,
-- 0x71, 0x18, 0x46, 0x68, 0x1c, 0x39, 0xf7, 0xff,
-- 0xff, 0x65, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0,
-- 0xb5, 0xf0, 0x1c, 0x04, 0x04, 0x10, 0x14, 0x00,
-- 0xb0, 0x81, 0x90, 0x00, 0x04, 0x1e, 0x14, 0x36,
-- 0x22, 0x3c, 0x1c, 0x20, 0x1c, 0x0f, 0xb0, 0x85,
-- 0xf0, 0x12, 0xf9, 0x2a, 0xa3, 0x72, 0xcb, 0x0c,
-- 0xf0, 0x12, 0xf9, 0x36, 0xf0, 0x12, 0xf9, 0x38,
-- 0x4d, 0x71, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x18,
-- 0x22, 0x38, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12,
-- 0xf9, 0x1b, 0xa3, 0x6b, 0xcb, 0x0c, 0xf0, 0x12,
-- 0xf9, 0x27, 0xf0, 0x12, 0xf9, 0x29, 0x5c, 0x28,
-- 0xab, 0x02, 0x70, 0x58, 0x22, 0x34, 0x1c, 0x20,
-- 0x1c, 0x39, 0xf0, 0x12, 0xf9, 0x0d, 0xa3, 0x64,
-- 0xcb, 0x0c, 0xf0, 0x12, 0xf9, 0x19, 0xf0, 0x12,
-- 0xf9, 0x1b, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x98,
-- 0x22, 0x30, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12,
-- 0xf8, 0xff, 0xa3, 0x5d, 0xcb, 0x0c, 0xf0, 0x12,
-- 0xf9, 0x0b, 0xf0, 0x12, 0xf9, 0x0d, 0x5c, 0x28,
-- 0xab, 0x02, 0x70, 0xd8, 0x22, 0x2c, 0x1c, 0x20,
-- 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xf1, 0xa3, 0x56,
-- 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xfd, 0xf0, 0x12,
-- 0xf8, 0xff, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x18,
-- 0x22, 0x28, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12,
-- 0xf8, 0xe3, 0xa3, 0x4f, 0xcb, 0x0c, 0xf0, 0x12,
-- 0xf8, 0xef, 0xf0, 0x12, 0xf8, 0xf1, 0x5c, 0x28,
-- 0xab, 0x03, 0x70, 0x58, 0x22, 0x24, 0x1c, 0x20,
-- 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xd5, 0xa3, 0x48,
-- 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xe1, 0xf0, 0x12,
-- 0xf8, 0xe3, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x98,
-- 0x22, 0x20, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12,
-- 0xf8, 0xc7, 0xa3, 0x41, 0xcb, 0x0c, 0xf0, 0x12,
-- 0xf8, 0xd3, 0xf0, 0x12, 0xf8, 0xd5, 0x5c, 0x28,
-- 0xab, 0x03, 0x70, 0xd8, 0x22, 0x1c, 0x1c, 0x20,
-- 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xb9, 0xa3, 0x3a,
-- 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xc5, 0xf0, 0x12,
-- 0xf8, 0xc7, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x18,
-- 0x22, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12,
-- 0xf8, 0xab, 0xa3, 0x33, 0xcb, 0x0c, 0xf0, 0x12,
-- 0xf8, 0xb7, 0xf0, 0x12, 0xf8, 0xb9, 0x5c, 0x28,
-- 0xab, 0x00, 0x70, 0x58, 0x22, 0x14, 0x1c, 0x20,
-- 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x9d, 0xa3, 0x2c,
-- 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xa9, 0xf0, 0x12,
-- 0xf8, 0xab, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x98,
-- 0x22, 0x10, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12,
-- 0xf8, 0x8f, 0xa3, 0x25, 0xcb, 0x0c, 0xf0, 0x12,
-- 0xf8, 0x9b, 0xf0, 0x12, 0xf8, 0x9d, 0x5c, 0x28,
-- 0xab, 0x00, 0x70, 0xd8, 0x22, 0x0c, 0x1c, 0x20,
-- 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x81, 0xa3, 0x1e,
-- 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x8d, 0xf0, 0x12,
-- 0xf8, 0x8f, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x18,
-- 0x22, 0x08, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12,
-- 0xf8, 0x73, 0xa3, 0x17, 0xcb, 0x0c, 0xf0, 0x12,
-- 0xf8, 0x7f, 0xf0, 0x12, 0xf8, 0x81, 0x5c, 0x28,
-- 0xab, 0x01, 0x70, 0x58, 0x22, 0x04, 0x1c, 0x20,
-- 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x65, 0xa3, 0x10,
-- 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x71, 0xf0, 0x12,
-- 0xf8, 0x73, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x98,
-- 0xa3, 0x0b, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39,
-- 0xf0, 0x12, 0xf8, 0x66, 0xf0, 0x12, 0xf8, 0x68,
-- 0x5c, 0x28, 0xab, 0x01, 0x70, 0xd8, 0x20, 0x00,
-- 0x73, 0x18, 0x46, 0x68, 0x99, 0x05, 0x1c, 0x32,
-- 0x33, 0x0c, 0xf7, 0xff, 0xfe, 0x6f, 0xb0, 0x06,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
-- 0x2e, 0x08, 0x17, 0xb0, 0x21, 0x00, 0xb0, 0x81,
-- 0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01,
-- 0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xdb, 0xf9,
-- 0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x06,
-- 0x0e, 0x36, 0x25, 0x02, 0x48, 0x0d, 0x60, 0x05,
-- 0x27, 0x07, 0x4c, 0x0d, 0x60, 0x25, 0x20, 0x01,
-- 0x40, 0xb8, 0x40, 0x30, 0xd0, 0x01, 0x20, 0x03,
-- 0xe0, 0x00, 0x20, 0x02, 0x49, 0x09, 0x60, 0x08,
-- 0x20, 0x0a, 0xf7, 0xff, 0xff, 0xdf, 0x20, 0x03,
-- 0x60, 0x20, 0x20, 0x0c, 0xf7, 0xff, 0xff, 0xda,
-- 0x3f, 0x01, 0xd5, 0xeb, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x14, 0x00,
-- 0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00,
-- 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x0f,
-- 0x0e, 0x3f, 0x06, 0x00, 0x0e, 0x00, 0x23, 0x80,
-- 0x43, 0x18, 0xf7, 0xff, 0xff, 0xcf, 0x20, 0x14,
-- 0xf7, 0xff, 0xff, 0xc0, 0x1c, 0x38, 0xf7, 0xff,
-- 0xff, 0xc9, 0x20, 0x03, 0x49, 0x04, 0x60, 0x08,
-- 0x20, 0x00, 0x49, 0x04, 0x60, 0x08, 0x49, 0x04,
-- 0x60, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x12, 0x00,
-- 0x6e, 0x00, 0x13, 0x00, 0xb5, 0x00, 0x21, 0x01,
-- 0x20, 0x02, 0xf7, 0xff, 0xff, 0xd9, 0x48, 0x10,
-- 0xf7, 0xff, 0xff, 0xa4, 0x21, 0x00, 0x20, 0x02,
-- 0xf7, 0xff, 0xff, 0xd2, 0x48, 0x0d, 0xf7, 0xff,
-- 0xff, 0x9d, 0x21, 0x44, 0x20, 0x00, 0xf7, 0xff,
-- 0xff, 0xcb, 0x21, 0x81, 0x20, 0x01, 0xf7, 0xff,
-- 0xff, 0xc7, 0x21, 0xf0, 0x20, 0x02, 0xf7, 0xff,
-- 0xff, 0xc3, 0x21, 0x45, 0x20, 0x03, 0xf7, 0xff,
-- 0xff, 0xbf, 0x21, 0x45, 0x20, 0x04, 0xf7, 0xff,
-- 0xff, 0xbb, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0xc3, 0x50,
-- 0xb5, 0x80, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x08,
-- 0x0e, 0x00, 0x28, 0x45, 0xdd, 0x00, 0x20, 0x45,
-- 0x1d, 0xc1, 0x31, 0x79, 0x20, 0x03, 0xf7, 0xff,
-- 0xff, 0xa7, 0x2f, 0x45, 0xdd, 0x00, 0x27, 0x45,
-- 0x20, 0x04, 0x1d, 0xf9, 0x31, 0x79, 0xf7, 0xff,
-- 0xff, 0x9f, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xeb, 0x23, 0x01,
-- 0x03, 0x5b, 0x43, 0x18, 0xf0, 0x15, 0xfe, 0xea,
-- 0xf0, 0x15, 0xfe, 0xe4, 0x23, 0x01, 0x03, 0x9b,
-- 0x43, 0x18, 0xf0, 0x15, 0xfe, 0xe3, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xda,
-- 0x4b, 0x05, 0x40, 0x18, 0xf0, 0x15, 0xfe, 0xda,
-- 0xf0, 0x15, 0xfe, 0xd4, 0x4b, 0x03, 0x40, 0x18,
-- 0xf0, 0x15, 0xfe, 0xd4, 0xbc, 0x08, 0x47, 0x18,
-- 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff,
-- 0xb5, 0x80, 0x07, 0x01, 0x0f, 0x09, 0x29, 0x02,
-- 0xd2, 0x19, 0x00, 0x89, 0x4a, 0x0d, 0x58, 0x51,
-- 0x4f, 0x0d, 0x0c, 0x00, 0x60, 0x39, 0xd3, 0x05,
-- 0x23, 0x01, 0x02, 0x5b, 0x68, 0x08, 0x43, 0x18,
-- 0x60, 0x08, 0xe0, 0x03, 0x68, 0x08, 0x4b, 0x09,
-- 0x40, 0x18, 0x60, 0x08, 0xf7, 0xff, 0xff, 0xc4,
-- 0x68, 0x38, 0xf0, 0x0e, 0xfb, 0xb1, 0x20, 0x00,
-- 0x61, 0xb8, 0xf7, 0xff, 0xff, 0xce, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x3c,
-- 0x2e, 0x08, 0x17, 0xc0, 0xff, 0xff, 0xfd, 0xff,
-- 0xb5, 0x00, 0x4a, 0x09, 0x1f, 0x11, 0x20, 0x0e,
-- 0xf0, 0x0e, 0xfb, 0x58, 0x28, 0x00, 0xd1, 0x09,
-- 0x48, 0x06, 0xf0, 0x0e, 0xfb, 0x99, 0x49, 0x06,
-- 0x20, 0x0e, 0xf0, 0x15, 0xfe, 0x9b, 0xf7, 0xff,
-- 0xff, 0xb4, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x17, 0xd8, 0x2e, 0x08, 0x19, 0x00,
-- 0x2e, 0x00, 0x6e, 0x0b, 0xb5, 0x00, 0xf7, 0xff,
-- 0xff, 0x97, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x15,
-- 0xfe, 0x89, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00,
-- 0x48, 0x04, 0x7d, 0x01, 0x29, 0x01, 0xd1, 0x02,
-- 0x69, 0x80, 0xf0, 0x00, 0xf8, 0x05, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xc0,
-- 0xb5, 0x90, 0x1c, 0x07, 0x4c, 0x12, 0x68, 0x20,
-- 0x49, 0x12, 0x42, 0x88, 0xd1, 0x01, 0x0b, 0x38,
-- 0xd1, 0x1a, 0xf7, 0xff, 0xff, 0x79, 0x60, 0x67,
-- 0x69, 0x21, 0x1c, 0x38, 0x29, 0x00, 0xd1, 0x11,
-- 0x68, 0xe1, 0x1c, 0x4a, 0x68, 0xe1, 0x60, 0xe2,
-- 0x00, 0x89, 0x4a, 0x0b, 0x50, 0x50, 0x68, 0xe0,
-- 0x28, 0x64, 0xd1, 0x01, 0x20, 0x00, 0x60, 0xe0,
-- 0x68, 0xe0, 0x68, 0xa1, 0x42, 0x88, 0xd1, 0x01,
-- 0x20, 0x01, 0x61, 0x20, 0xf7, 0xff, 0xff, 0x71,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x19, 0x00,
-- 0x2e, 0x08, 0x4c, 0xe8, 0xb5, 0x90, 0x1c, 0x07,
-- 0xf7, 0xff, 0xff, 0x52, 0x48, 0x10, 0x69, 0x01,
-- 0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x81,
-- 0x68, 0xc2, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x81,
-- 0x1c, 0x4a, 0x68, 0x81, 0x60, 0x82, 0x00, 0x89,
-- 0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x81,
-- 0x29, 0x64, 0xd1, 0x00, 0x60, 0x84, 0x61, 0x04,
-- 0xf7, 0xff, 0xff, 0x4b, 0x20, 0x01, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x45,
-- 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x4c, 0xe8,
-- 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x0e, 0x8e, 0xb8,
-- 0x28, 0x00, 0xd1, 0x04, 0x46, 0x68, 0xf7, 0xff,
-- 0xff, 0xcd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x00,
-- 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x98, 0x00, 0x49, 0x07, 0x60, 0x08,
-- 0x20, 0x08, 0x85, 0x38, 0x20, 0x04, 0x85, 0x78,
-- 0x20, 0x0f, 0x02, 0x40, 0x86, 0xb8, 0x20, 0x01,
-- 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00,
-- 0x06, 0x00, 0x16, 0x00, 0x28, 0x30, 0xdb, 0x03,
-- 0x28, 0x39, 0xdc, 0x01, 0x20, 0x01, 0x47, 0x70,
-- 0x20, 0x00, 0x47, 0x70, 0xb5, 0xff, 0x26, 0x00,
-- 0x1c, 0x07, 0x20, 0x00, 0x1c, 0x14, 0x22, 0x30,
-- 0x9d, 0x09, 0x54, 0x3a, 0x30, 0x01, 0x28, 0x1f,
-- 0xdb, 0xfb, 0x20, 0x00, 0x77, 0xf8, 0x29, 0x00,
-- 0xda, 0x02, 0x2d, 0x00, 0xd1, 0x00, 0x42, 0x49,
-- 0x25, 0x1e, 0x29, 0x00, 0xd0, 0x14, 0x1c, 0x20,
-- 0xf0, 0x11, 0xfe, 0x78, 0x31, 0x30, 0x55, 0x79,
-- 0x57, 0x79, 0x29, 0x39, 0xdd, 0x07, 0x31, 0x07,
-- 0x55, 0x79, 0x9b, 0x03, 0x2b, 0x00, 0xd0, 0x02,
-- 0x5d, 0x79, 0x31, 0x20, 0x55, 0x79, 0x1c, 0x01,
-- 0x3d, 0x01, 0x36, 0x01, 0x28, 0x00, 0xd1, 0xea,
-- 0x2e, 0x00, 0xd1, 0x00, 0x26, 0x01, 0x1c, 0x30,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xff, 0x9e, 0x09, 0x20, 0x01, 0x1c, 0x0f,
-- 0x21, 0x00, 0xb0, 0x94, 0x91, 0x12, 0x91, 0x11,
-- 0x91, 0x10, 0x91, 0x0f, 0x91, 0x0e, 0x25, 0x00,
-- 0x42, 0x41, 0x91, 0x0d, 0x21, 0x00, 0x91, 0x0c,
-- 0x1c, 0x14, 0x92, 0x00, 0x23, 0x00, 0x56, 0xe1,
-- 0x29, 0x2b, 0xd0, 0x10, 0xdc, 0x07, 0x29, 0x20,
-- 0xd0, 0x15, 0x29, 0x23, 0xd1, 0x17, 0x21, 0x01,
-- 0x91, 0x0f, 0x18, 0x64, 0xe0, 0x14, 0x29, 0x2d,
-- 0xd0, 0x09, 0x29, 0x30, 0xd1, 0x0f, 0x21, 0x01,
-- 0x91, 0x0e, 0x18, 0x64, 0xe0, 0x0c, 0x21, 0x01,
-- 0x91, 0x12, 0x18, 0x64, 0xe0, 0x08, 0x21, 0x01,
-- 0x91, 0x11, 0x18, 0x64, 0xe0, 0x04, 0x21, 0x01,
-- 0x91, 0x10, 0x18, 0x64, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd1, 0xdb, 0x23, 0x00, 0x56, 0xe0,
-- 0xf7, 0xff, 0xff, 0x8a, 0x28, 0x00, 0xd0, 0x15,
-- 0x25, 0x00, 0x23, 0x00, 0x56, 0xe0, 0xf7, 0xff,
-- 0xff, 0x83, 0x28, 0x00, 0xd0, 0x19, 0x00, 0xa8,
-- 0x19, 0x40, 0x00, 0x40, 0x23, 0x00, 0x56, 0xe1,
-- 0x18, 0x08, 0x34, 0x01, 0x1f, 0xc5, 0x3d, 0x29,
-- 0x56, 0xe0, 0xf7, 0xff, 0xff, 0x75, 0x28, 0x00,
-- 0xd1, 0xf1, 0xe0, 0x0a, 0x23, 0x00, 0x56, 0xe0,
-- 0x28, 0x2a, 0xd1, 0x06, 0x9b, 0x17, 0xcb, 0x20,
-- 0x93, 0x17, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30,
-- 0x34, 0x01, 0x23, 0x00, 0x56, 0xe0, 0x28, 0x2e,
-- 0xd1, 0x16, 0x20, 0x00, 0x90, 0x0d, 0x34, 0x01,
-- 0x56, 0xe0, 0xf7, 0xff, 0xff, 0x5d, 0x28, 0x00,
-- 0xd0, 0x0e, 0x98, 0x0d, 0x00, 0x83, 0x18, 0x18,
-- 0x00, 0x40, 0x23, 0x00, 0x56, 0xe1, 0x18, 0x08,
-- 0x38, 0x30, 0x90, 0x0d, 0x34, 0x01, 0x56, 0xe0,
-- 0xf7, 0xff, 0xff, 0x4e, 0x28, 0x00, 0xd1, 0xf0,
-- 0x23, 0x00, 0x56, 0xe0, 0x28, 0x68, 0xd0, 0x01,
-- 0x28, 0x6c, 0xd1, 0x02, 0x90, 0x0c, 0x34, 0x01,
-- 0xe0, 0x04, 0x28, 0x46, 0xd0, 0x01, 0x28, 0x4e,
-- 0xd1, 0x00, 0x34, 0x01, 0x23, 0x00, 0x56, 0xe0,
-- 0x21, 0x25, 0x34, 0x01, 0x28, 0x67, 0xd0, 0x12,
-- 0xdc, 0x1d, 0x28, 0x63, 0xd0, 0x54, 0xdc, 0x08,
-- 0x28, 0x25, 0xd0, 0x73, 0x28, 0x45, 0xd0, 0x0a,
-- 0x28, 0x47, 0xd0, 0x08, 0x28, 0x58, 0xd1, 0x6e,
-- 0xe0, 0x53, 0x28, 0x64, 0xd0, 0x6c, 0x28, 0x65,
-- 0xd0, 0x01, 0x28, 0x66, 0xd1, 0x67, 0x98, 0x0c,
-- 0x28, 0x6c, 0xd1, 0x66, 0x68, 0x30, 0x30, 0x03,
-- 0x60, 0x30, 0x22, 0x08, 0x99, 0x17, 0xa8, 0x09,
-- 0xf0, 0x11, 0xfd, 0xe0, 0xe0, 0xe5, 0x28, 0x70,
-- 0xd0, 0x3d, 0xdc, 0x36, 0x28, 0x69, 0xd0, 0x57,
-- 0x28, 0x6e, 0xd0, 0x57, 0x28, 0x6f, 0xd1, 0x52,
-- 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 0x9b, 0x17,
-- 0x68, 0x19, 0x91, 0x13, 0x98, 0x0c, 0x28, 0x68,
-- 0xd1, 0x09, 0x99, 0x13, 0x04, 0x09, 0x0c, 0x09,
-- 0x91, 0x13, 0x0c, 0x08, 0xd3, 0x03, 0x99, 0x13,
-- 0x4b, 0xeb, 0x43, 0x19, 0x91, 0x13, 0x22, 0x01,
-- 0xb4, 0x04, 0x23, 0x00, 0x22, 0x08, 0x99, 0x14,
-- 0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xff, 0xb0, 0x01,
-- 0x99, 0x0f, 0x1c, 0x06, 0x29, 0x00, 0xd0, 0x03,
-- 0x99, 0x13, 0x29, 0x00, 0xd0, 0x00, 0x3e, 0x01,
-- 0x99, 0x12, 0x29, 0x00, 0xd0, 0x55, 0x20, 0x2b,
-- 0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39,
-- 0x2d, 0x00, 0xd0, 0x73, 0x3d, 0x01, 0xe0, 0xe7,
-- 0xe0, 0x3f, 0x28, 0x73, 0xd0, 0x6f, 0x28, 0x75,
-- 0xd0, 0x6e, 0x28, 0x78, 0xd1, 0x1b, 0x23, 0x01,
-- 0x93, 0x0b, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30,
-- 0x23, 0x1f, 0x1f, 0xe0, 0x38, 0x19, 0x56, 0xc0,
-- 0x28, 0x58, 0xd1, 0x01, 0x23, 0x00, 0x93, 0x0b,
-- 0x9b, 0x17, 0x68, 0x19, 0x98, 0x0c, 0x28, 0x68,
-- 0xd1, 0x05, 0x04, 0x09, 0x0c, 0x09, 0x0c, 0x08,
-- 0xd3, 0x01, 0x4b, 0xcd, 0x43, 0x19, 0x22, 0x01,
-- 0xb4, 0x04, 0xe0, 0x04, 0xe0, 0x16, 0xe1, 0x88,
-- 0xe0, 0x28, 0xe0, 0x7e, 0xe0, 0x91, 0x22, 0x10,
-- 0x9b, 0x0c, 0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xbe,
-- 0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00,
-- 0xd0, 0x52, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08,
-- 0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x57,
-- 0x3d, 0x01, 0xe1, 0x0a, 0x68, 0x38, 0x70, 0x01,
-- 0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03,
-- 0xe1, 0x70, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30,
-- 0x98, 0x17, 0x68, 0x01, 0x68, 0x38, 0x70, 0x01,
-- 0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03,
-- 0xe1, 0x64, 0xe0, 0x74, 0x68, 0x30, 0x30, 0x01,
-- 0x60, 0x30, 0x98, 0x17, 0x68, 0x01, 0x91, 0x13,
-- 0x98, 0x0c, 0x28, 0x68, 0xd1, 0x09, 0x99, 0x13,
-- 0x04, 0x09, 0x0c, 0x09, 0x91, 0x13, 0x0c, 0x08,
-- 0xd3, 0x03, 0x99, 0x13, 0x4b, 0xac, 0x43, 0x19,
-- 0x91, 0x13, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00,
-- 0x22, 0x0a, 0x99, 0x14, 0xa8, 0x02, 0xf7, 0xff,
-- 0xfe, 0x81, 0xb0, 0x01, 0x1c, 0x06, 0x20, 0x2d,
-- 0x99, 0x12, 0x29, 0x00, 0xd0, 0x15, 0x99, 0x13,
-- 0x29, 0x00, 0xe0, 0x02, 0xe0, 0x87, 0xe0, 0x5a,
-- 0xe0, 0x97, 0xda, 0x04, 0x68, 0x39, 0x70, 0x08,
-- 0x31, 0x01, 0x60, 0x39, 0xe0, 0x04, 0x20, 0x2b,
-- 0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39,
-- 0x2d, 0x00, 0xd0, 0x65, 0x3d, 0x01, 0xe0, 0x76,
-- 0xe0, 0xb4, 0x99, 0x10, 0x29, 0x00, 0xd0, 0x11,
-- 0x99, 0x13, 0x29, 0x00, 0xda, 0x05, 0x68, 0x39,
-- 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 0xe0, 0x05,
-- 0xe0, 0xb3, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01,
-- 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x4f,
-- 0x3d, 0x01, 0xe0, 0x60, 0x99, 0x13, 0x29, 0x00,
-- 0xda, 0x5d, 0x68, 0x39, 0x70, 0x08, 0x31, 0x01,
-- 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x44, 0x3d, 0x01,
-- 0xe0, 0xab, 0x68, 0x30, 0x30, 0x02, 0x60, 0x30,
-- 0x22, 0x08, 0x99, 0x17, 0xa8, 0x09, 0xf0, 0x11,
-- 0xfc, 0xf9, 0x68, 0x38, 0xa1, 0x85, 0x22, 0x10,
-- 0xf0, 0x11, 0xfc, 0xf4, 0x68, 0x38, 0xf0, 0x11,
-- 0xfd, 0x35, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38,
-- 0xe0, 0xf8, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30,
-- 0x98, 0x17, 0x68, 0x00, 0x68, 0x39, 0x9a, 0x14,
-- 0x1a, 0x89, 0x60, 0x01, 0xe0, 0xee, 0x99, 0x10,
-- 0x29, 0x00, 0xd0, 0x21, 0x21, 0x20, 0x68, 0x38,
-- 0x70, 0x01, 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00,
-- 0xd0, 0x1a, 0x3d, 0x01, 0xe0, 0x81, 0x68, 0x30,
-- 0x30, 0x01, 0x60, 0x30, 0x98, 0x17, 0xf0, 0x11,
-- 0xfd, 0x15, 0x1c, 0x06, 0x98, 0x0d, 0x28, 0x00,
-- 0xdd, 0x03, 0x98, 0x0d, 0x42, 0xb0, 0xda, 0x00,
-- 0x9e, 0x0d, 0x2d, 0x00, 0xd0, 0x09, 0x21, 0x20,
-- 0x68, 0x38, 0x1c, 0x2a, 0xf0, 0x11, 0xfd, 0x28,
-- 0x23, 0x00, 0x68, 0x38, 0x55, 0x43, 0xe0, 0x03,
-- 0xe0, 0x67, 0x23, 0x00, 0x68, 0x38, 0x55, 0x83,
-- 0x2d, 0x00, 0xd0, 0x0d, 0x42, 0xae, 0xda, 0x0b,
-- 0x99, 0x11, 0x29, 0x00, 0xd1, 0x08, 0x68, 0x38,
-- 0x19, 0x40, 0x1b, 0x80, 0x99, 0x17, 0x1c, 0x32,
-- 0xf0, 0x11, 0xfd, 0x2c, 0xe0, 0x0a, 0xe0, 0x54,
-- 0x2d, 0x00, 0xd0, 0x02, 0x42, 0xae, 0xdb, 0x00,
-- 0x36, 0x01, 0x99, 0x17, 0x68, 0x38, 0x1c, 0x32,
-- 0xf0, 0x11, 0xfd, 0x20, 0x68, 0x38, 0xf0, 0x11,
-- 0xfc, 0xe1, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38,
-- 0xe0, 0xa4, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30,
-- 0x98, 0x17, 0x99, 0x0c, 0x29, 0x68, 0xd1, 0x02,
-- 0x23, 0x01, 0x03, 0xdb, 0x40, 0x18, 0x22, 0x01,
-- 0xb4, 0x04, 0x98, 0x18, 0x68, 0x01, 0x23, 0x00,
-- 0x22, 0x0a, 0xa8, 0x02, 0xf7, 0xff, 0xfd, 0xca,
-- 0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00,
-- 0xd0, 0x08, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08,
-- 0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x24,
-- 0x3d, 0x01, 0xe0, 0x22, 0x99, 0x10, 0x29, 0x00,
-- 0xd0, 0x1f, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01,
-- 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x18,
-- 0x3d, 0x01, 0xe0, 0x16, 0x99, 0x10, 0x29, 0x00,
-- 0xd0, 0x07, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01,
-- 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x00,
-- 0x3d, 0x01, 0x99, 0x0f, 0x29, 0x00, 0xd0, 0x08,
-- 0x21, 0x30, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01,
-- 0x21, 0x78, 0x60, 0x38, 0x70, 0x01, 0x30, 0x01,
-- 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x48, 0x42, 0xb5,
-- 0xdd, 0x46, 0x99, 0x11, 0x29, 0x00, 0xd0, 0x02,
-- 0x99, 0x0e, 0x29, 0x00, 0xd0, 0x2a, 0x99, 0x0e,
-- 0x29, 0x00, 0xd0, 0x0c, 0x20, 0x00, 0x1b, 0xa9,
-- 0x29, 0x00, 0xdd, 0x14, 0x22, 0x30, 0x68, 0x3b,
-- 0x70, 0x1a, 0x33, 0x01, 0x60, 0x3b, 0x30, 0x01,
-- 0x42, 0x81, 0xdc, 0xf8, 0xe0, 0x0b, 0x20, 0x00,
-- 0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07, 0x23, 0x20,
-- 0x68, 0x3a, 0x70, 0x13, 0x32, 0x01, 0x60, 0x3a,
-- 0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8, 0x21, 0x20,
-- 0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08, 0x1e, 0x41,
-- 0x68, 0x38, 0xf0, 0x11, 0xfc, 0xd3, 0x68, 0x38,
-- 0xf0, 0x11, 0xfc, 0x68, 0x68, 0x39, 0x18, 0x40,
-- 0x60, 0x38, 0xe0, 0x2b, 0x68, 0x38, 0xf0, 0x11,
-- 0xfc, 0x61, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38,
-- 0x20, 0x00, 0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07,
-- 0x23, 0x20, 0x68, 0x3a, 0x70, 0x13, 0x32, 0x01,
-- 0x60, 0x3a, 0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8,
-- 0x23, 0x00, 0x68, 0x38, 0x70, 0x03, 0xe0, 0x15,
-- 0x21, 0x20, 0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08,
-- 0x1e, 0x41, 0x68, 0x38, 0xf0, 0x11, 0xfc, 0xae,
-- 0x68, 0x38, 0xf0, 0x11, 0xfc, 0x43, 0x68, 0x39,
-- 0x18, 0x40, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03,
-- 0xe0, 0x04, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01,
-- 0x60, 0x38, 0x9c, 0x00, 0x1c, 0x20, 0xb0, 0x14,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xff, 0xff, 0x00, 0x00, 0x28, 0x46, 0x50, 0x20,
-- 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b,
-- 0x65, 0x64, 0x29, 0x00, 0xb5, 0x87, 0x23, 0x00,
-- 0x98, 0x01, 0x9f, 0x00, 0x56, 0xc0, 0x28, 0x00,
-- 0xd0, 0x2f, 0xe0, 0x05, 0x30, 0x01, 0x90, 0x01,
-- 0x98, 0x00, 0x70, 0x01, 0x30, 0x01, 0x90, 0x00,
-- 0x23, 0x00, 0x98, 0x01, 0x56, 0xc1, 0x29, 0x25,
-- 0xd0, 0x01, 0x29, 0x00, 0xd1, 0xf2, 0x23, 0x00,
-- 0x99, 0x01, 0x56, 0xc9, 0x29, 0x00, 0xd0, 0x17,
-- 0x23, 0x01, 0x56, 0xc0, 0x28, 0x00, 0xd0, 0x13,
-- 0x20, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x6a,
-- 0xb4, 0x04, 0x98, 0x03, 0x1c, 0x42, 0x9b, 0x04,
-- 0x1c, 0x38, 0xa9, 0x02, 0xf7, 0xff, 0xfd, 0x30,
-- 0xb0, 0x01, 0x90, 0x02, 0x98, 0x00, 0x00, 0x80,
-- 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, 0xb0, 0x01,
-- 0x23, 0x00, 0x98, 0x01, 0x56, 0xc0, 0x28, 0x00,
-- 0xd1, 0xd6, 0x20, 0x00, 0x99, 0x00, 0x70, 0x08,
-- 0x31, 0x01, 0x91, 0x00, 0x1c, 0x38, 0xf0, 0x11,
-- 0xfb, 0xe9, 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0xb4, 0x0f, 0xb5, 0x00, 0x98, 0x01,
-- 0x99, 0x02, 0xaa, 0x03, 0xf7, 0xff, 0xff, 0xb6,
-- 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0xb4, 0x0f,
-- 0xb5, 0x00, 0xb0, 0xb8, 0x46, 0x68, 0x99, 0x39,
-- 0xaa, 0x3a, 0xf7, 0xff, 0xff, 0xab, 0x46, 0x68,
-- 0xf0, 0x11, 0xfb, 0xd0, 0x1c, 0x01, 0x46, 0x68,
-- 0xf7, 0xf9, 0xfb, 0x7e, 0xb0, 0x38, 0xbc, 0x08,
-- 0xb0, 0x04, 0x47, 0x18, 0x21, 0x00, 0xb0, 0x81,
-- 0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01,
-- 0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xd3, 0xf9,
-- 0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x0d,
-- 0x0e, 0x2d, 0xb0, 0x83, 0x49, 0x23, 0x68, 0x09,
-- 0x91, 0x01, 0x26, 0x09, 0x1d, 0xc4, 0x34, 0x19,
-- 0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04,
-- 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20,
-- 0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, 0xf8, 0x0c,
-- 0xb0, 0x01, 0xaf, 0x01, 0x78, 0x3f, 0xab, 0x02,
-- 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18,
-- 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03,
-- 0xab, 0x02, 0xf7, 0xf9, 0xff, 0xfd, 0xb0, 0x01,
-- 0xa9, 0x01, 0x78, 0x09, 0x91, 0x00, 0xab, 0x02,
-- 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18,
-- 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03,
-- 0xab, 0x02, 0xf7, 0xf9, 0xff, 0xed, 0xb0, 0x01,
-- 0xa8, 0x01, 0x78, 0x00, 0x99, 0x00, 0x42, 0x8f,
-- 0xd1, 0x06, 0x42, 0x87, 0xd1, 0x04, 0x1c, 0x38,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x1e, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xd1, 0xc3,
-- 0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5e, 0x28,
-- 0xb5, 0xf0, 0x06, 0x0c, 0x0e, 0x24, 0x06, 0x16,
-- 0x0e, 0x36, 0x25, 0x0a, 0xb0, 0x82, 0xab, 0x00,
-- 0x70, 0x1c, 0x70, 0x5e, 0x1c, 0x07, 0x30, 0x20,
-- 0x90, 0x01, 0x98, 0x01, 0x7b, 0x00, 0x46, 0x69,
-- 0x22, 0x02, 0xf7, 0xf9, 0xff, 0x66, 0x1c, 0x38,
-- 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x9b, 0x1c, 0x01,
-- 0x2c, 0x00, 0xd0, 0x05, 0x2c, 0x09, 0xd0, 0x03,
-- 0x2c, 0x1f, 0xd1, 0x03, 0x20, 0x7f, 0xe0, 0x02,
-- 0x20, 0x5e, 0xe0, 0x00, 0x20, 0xff, 0x40, 0x71,
-- 0x40, 0x08, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x1e, 0x68, 0x06, 0x05,
-- 0x0e, 0x2d, 0xd1, 0xde, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07,
-- 0x2a, 0x00, 0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00,
-- 0x24, 0x00, 0x00, 0x90, 0x19, 0xc0, 0x6c, 0x02,
-- 0x42, 0x8a, 0xd0, 0x15, 0x64, 0x01, 0x20, 0x03,
-- 0x4a, 0x19, 0x29, 0x01, 0xd0, 0x13, 0x29, 0x02,
-- 0xd0, 0x1f, 0x29, 0x03, 0xd1, 0x0c, 0x60, 0x10,
-- 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x66,
-- 0x23, 0xf3, 0x40, 0x18, 0x22, 0x08, 0x43, 0x02,
-- 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0xac,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x60, 0x10,
-- 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x56,
-- 0x22, 0xf3, 0x40, 0x02, 0x1c, 0x38, 0x1c, 0x21,
-- 0xf7, 0xff, 0xff, 0x9e, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff,
-- 0xff, 0x49, 0x23, 0xf3, 0x40, 0x18, 0x22, 0x04,
-- 0x43, 0x02, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff,
-- 0xff, 0x8f, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x6e, 0x00, 0x11, 0x00, 0xb5, 0xf0, 0x1c, 0x0c,
-- 0x68, 0x41, 0x68, 0x09, 0x68, 0x80, 0x1c, 0x1f,
-- 0x28, 0x00, 0xd0, 0x01, 0x6b, 0x8b, 0xe0, 0x00,
-- 0x23, 0x00, 0x6b, 0x0e, 0x43, 0x32, 0x6b, 0xcd,
-- 0x43, 0x2a, 0x43, 0x1a, 0x43, 0x1e, 0x1c, 0x15,
-- 0x1c, 0x02, 0x1c, 0x08, 0x21, 0x01, 0xf7, 0xff,
-- 0xff, 0xa5, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x07,
-- 0x88, 0x29, 0x54, 0x21, 0x88, 0x31, 0x54, 0x21,
-- 0x30, 0x01, 0x35, 0x02, 0x42, 0xb8, 0xdb, 0xf7,
-- 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xff, 0x68, 0x41, 0x68, 0x0c, 0x68, 0x80,
-- 0x1c, 0x1f, 0x28, 0x00, 0xd0, 0x01, 0x6b, 0xa6,
-- 0xe0, 0x00, 0x26, 0x00, 0x6b, 0x21, 0x43, 0x11,
-- 0x6b, 0xe2, 0x43, 0x11, 0x43, 0x31, 0x1c, 0x02,
-- 0x1c, 0x0d, 0x21, 0x01, 0x1c, 0x20, 0xf7, 0xff,
-- 0xff, 0x81, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x09,
-- 0x99, 0x01, 0x5c, 0x09, 0x80, 0x29, 0x6b, 0x21,
-- 0x19, 0x89, 0x88, 0x09, 0x30, 0x01, 0x35, 0x02,
-- 0x42, 0xb8, 0xdb, 0xf5, 0x1c, 0x38, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0,
-- 0x68, 0x42, 0x68, 0x17, 0x68, 0x82, 0x2a, 0x00,
-- 0xd0, 0x01, 0x6b, 0xbc, 0xe0, 0x00, 0x24, 0x00,
-- 0x08, 0x48, 0xd3, 0x0a, 0x23, 0xfe, 0x40, 0x19,
-- 0x6b, 0x38, 0x43, 0x08, 0x6b, 0x79, 0x43, 0x08,
-- 0x6b, 0xf9, 0x43, 0x08, 0x43, 0x20, 0x1c, 0x05,
-- 0xe0, 0x05, 0x6b, 0x38, 0x43, 0x08, 0x6b, 0xf9,
-- 0x43, 0x08, 0x43, 0x20, 0x1c, 0x05, 0x21, 0x02,
-- 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x4f, 0x6b, 0x38,
-- 0x43, 0x20, 0x88, 0x29, 0x88, 0x01, 0x88, 0x00,
-- 0x06, 0x00, 0x0e, 0x00, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d,
-- 0x68, 0x42, 0x68, 0x13, 0x68, 0x82, 0x2a, 0x00,
-- 0xd0, 0x01, 0x6b, 0x98, 0xe0, 0x00, 0x20, 0x00,
-- 0x07, 0xcc, 0x0f, 0xe4, 0xd0, 0x08, 0x6b, 0x1f,
-- 0x43, 0x39, 0x6b, 0x5f, 0x43, 0x39, 0x6b, 0xdf,
-- 0x43, 0x39, 0x43, 0x01, 0x1c, 0x0f, 0xe0, 0x05,
-- 0x6b, 0x1f, 0x43, 0x39, 0x6b, 0xdf, 0x43, 0x39,
-- 0x43, 0x01, 0x1c, 0x0f, 0x21, 0x02, 0x1c, 0x18,
-- 0xf7, 0xff, 0xff, 0x24, 0x80, 0x3d, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 0xb5, 0x80,
-- 0x68, 0x41, 0x68, 0x0a, 0x68, 0x81, 0x29, 0x00,
-- 0xd0, 0x01, 0x21, 0x09, 0xe0, 0x00, 0x21, 0x00,
-- 0x27, 0x00, 0x69, 0x80, 0x28, 0x06, 0xd1, 0x03,
-- 0x20, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x1c, 0x10, 0x6c, 0xd2, 0xf0, 0x11, 0xf9, 0xa8,
-- 0x08, 0x40, 0xd3, 0x00, 0x27, 0x01, 0x1c, 0x38,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0,
-- 0x68, 0x42, 0x68, 0x17, 0x68, 0x80, 0x28, 0x00,
-- 0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00, 0x24, 0x00,
-- 0x29, 0x00, 0xd0, 0x16, 0x29, 0x01, 0xd0, 0x21,
-- 0x29, 0x02, 0xd1, 0x0e, 0x22, 0x80, 0x6c, 0xbb,
-- 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x8e,
-- 0x48, 0x1e, 0xf7, 0xff, 0xfe, 0x5f, 0x22, 0x00,
-- 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11,
-- 0xf9, 0x85, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21,
-- 0xf0, 0x11, 0xf9, 0x7a, 0x22, 0x9f, 0x40, 0x02,
-- 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11,
-- 0xf9, 0x75, 0xe7, 0xee, 0x6c, 0xfa, 0x1c, 0x38,
-- 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x6d, 0x22, 0x20,
-- 0x43, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21,
-- 0xf0, 0x11, 0xf9, 0x68, 0x25, 0x00, 0x6c, 0xfa,
-- 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x60,
-- 0x1c, 0x06, 0x09, 0x80, 0xd2, 0x05, 0x20, 0x14,
-- 0xf7, 0xff, 0xfe, 0x30, 0x35, 0x01, 0x2d, 0x0a,
-- 0xdb, 0xf1, 0x22, 0x40, 0x43, 0x32, 0x6c, 0xbb,
-- 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x52,
-- 0xe7, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x86, 0xa0,
-- 0xb5, 0x80, 0x49, 0x0f, 0x4f, 0x0f, 0x8e, 0xfa,
-- 0x20, 0x00, 0x43, 0xc0, 0x2a, 0x00, 0xd1, 0x13,
-- 0x8d, 0xba, 0x06, 0x12, 0x0e, 0x12, 0x2a, 0x0c,
-- 0xd1, 0x0e, 0x8d, 0xf8, 0x28, 0x00, 0xd0, 0x09,
-- 0x8d, 0xf8, 0x1e, 0x82, 0xb4, 0x04, 0x78, 0x4a,
-- 0x1c, 0x8b, 0x78, 0x09, 0x48, 0x06, 0xf0, 0x00,
-- 0xfd, 0x5f, 0xb0, 0x01, 0x20, 0x00, 0x85, 0xb8,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2e, 0x08, 0x4e, 0x78, 0x48, 0x08, 0x8d, 0x81,
-- 0x29, 0x00, 0xd0, 0x02, 0x20, 0x00, 0x43, 0xc0,
-- 0x47, 0x70, 0x21, 0x0c, 0x85, 0x81, 0x21, 0x01,
-- 0x02, 0xc9, 0x85, 0xc1, 0x21, 0x09, 0x02, 0x49,
-- 0x86, 0xc1, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00,
-- 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x4f, 0x15,
-- 0x68, 0x38, 0x28, 0x00, 0xd0, 0x23, 0xf7, 0xff,
-- 0xff, 0xbf, 0x48, 0x13, 0x68, 0x00, 0x68, 0x79,
-- 0x1a, 0x41, 0x29, 0x02, 0xd3, 0x1b, 0x60, 0x78,
-- 0x4c, 0x10, 0x8e, 0xa0, 0x4f, 0x10, 0x28, 0x00,
-- 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0xd0,
-- 0x8e, 0xa0, 0x28, 0x00, 0xd1, 0x04, 0x23, 0xc9,
-- 0x00, 0x9b, 0x18, 0xf8, 0xf0, 0x00, 0xfc, 0xc8,
-- 0x69, 0xb8, 0x28, 0x06, 0xd0, 0x05, 0x23, 0x03,
-- 0x02, 0x1b, 0x18, 0xf8, 0x6b, 0xc0, 0x28, 0x06,
-- 0xd1, 0x01, 0xf7, 0xff, 0xff, 0xc3, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x44,
-- 0x2e, 0x08, 0x05, 0xb0, 0x2c, 0x00, 0x1f, 0xc0,
-- 0x2e, 0x08, 0x4e, 0xc8, 0xb5, 0x00, 0x1c, 0x10,
-- 0x1c, 0x1a, 0x1c, 0x03, 0x1c, 0x08, 0x1c, 0x19,
-- 0xf7, 0xf9, 0xf9, 0x84, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0x90, 0x4f, 0x23, 0x24, 0x02, 0x48, 0x23,
-- 0x60, 0x04, 0x22, 0x50, 0x21, 0x00, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf9, 0x8a, 0x20, 0x80, 0x1d, 0xf9,
-- 0x31, 0x19, 0x73, 0x08, 0x20, 0x03, 0x07, 0x00,
-- 0x63, 0x38, 0x02, 0xe0, 0x63, 0x78, 0x03, 0x20,
-- 0x63, 0xb8, 0x03, 0x60, 0x63, 0xf8, 0x48, 0x1a,
-- 0x64, 0xb8, 0x48, 0x1a, 0x64, 0xf8, 0x60, 0x3f,
-- 0x48, 0x19, 0x60, 0xf8, 0x60, 0x7c, 0x24, 0x00,
-- 0x60, 0xbc, 0x48, 0x18, 0x61, 0x78, 0x48, 0x18,
-- 0x61, 0xb8, 0x48, 0x18, 0x61, 0xf8, 0x48, 0x18,
-- 0x62, 0x38, 0x48, 0x18, 0x61, 0x38, 0x48, 0x18,
-- 0x62, 0x78, 0x48, 0x18, 0x62, 0xb8, 0x1c, 0x38,
-- 0xf0, 0x00, 0xf8, 0xbc, 0x4f, 0x16, 0x28, 0x00,
-- 0xd0, 0x03, 0x60, 0x3c, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0x01, 0x06, 0x40, 0xf0, 0x15,
-- 0xf8, 0x1c, 0x48, 0x12, 0xf7, 0xff, 0xfd, 0x6a,
-- 0x20, 0x01, 0x60, 0x38, 0x48, 0x10, 0x68, 0x00,
-- 0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x4e, 0x78, 0x6e, 0x00, 0x11, 0x00,
-- 0x2e, 0x00, 0x76, 0x55, 0x2e, 0x00, 0x75, 0xb9,
-- 0x2e, 0x08, 0x4e, 0xc8, 0x2e, 0x00, 0x77, 0x41,
-- 0x2e, 0x00, 0x77, 0x8d, 0x2e, 0x00, 0x77, 0xdb,
-- 0x2e, 0x00, 0x78, 0x2f, 0x2e, 0x00, 0x7a, 0x39,
-- 0x2e, 0x00, 0x78, 0x7b, 0x2e, 0x00, 0x78, 0xb3,
-- 0x2e, 0x08, 0x1a, 0x44, 0x00, 0x06, 0x1a, 0x80,
-- 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0x80, 0x22, 0x80,
-- 0x21, 0x1f, 0x6c, 0x83, 0x1c, 0x07, 0xf0, 0x11,
-- 0xf8, 0x69, 0x48, 0x3f, 0xf7, 0xff, 0xfd, 0x3a,
-- 0x22, 0x55, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x60, 0x21, 0x02, 0x6c, 0xfa,
-- 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x59, 0x28, 0x55,
-- 0xd0, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x22, 0x33, 0x21, 0x05,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x4e,
-- 0x22, 0x33, 0x21, 0x0e, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x48, 0x22, 0x21, 0x21, 0x17,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x42,
-- 0x22, 0x00, 0x21, 0x01, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x3c, 0x22, 0x00, 0x21, 0x0a,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x36,
-- 0x22, 0x01, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x30, 0x22, 0x01, 0x21, 0x0b,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x2a,
-- 0x22, 0x00, 0x21, 0x03, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x24, 0x22, 0x00, 0x21, 0x0c,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x1e,
-- 0x22, 0x00, 0x21, 0x04, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x18, 0x22, 0x01, 0x21, 0x0d,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x12,
-- 0x22, 0x02, 0x21, 0x1e, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x0c, 0x22, 0x04, 0x21, 0x1c,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x06,
-- 0x22, 0x03, 0x21, 0x1b, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x11, 0xf8, 0x00, 0x22, 0x01, 0x21, 0x1f,
-- 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0xfa,
-- 0x22, 0x01, 0x21, 0x18, 0x6c, 0xbb, 0x1c, 0x38,
-- 0xf0, 0x10, 0xff, 0xf4, 0x21, 0x1a, 0x6c, 0xfa,
-- 0x1c, 0x38, 0xf0, 0x10, 0xff, 0xed, 0x20, 0x00,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x00, 0x00, 0xc3, 0x50, 0xb5, 0x90, 0x1c, 0x07,
-- 0xf7, 0xff, 0xff, 0x74, 0x28, 0x00, 0xda, 0x04,
-- 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x24, 0x00, 0x64, 0x3c, 0x64, 0x7c,
-- 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x2f, 0x1c, 0x20,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0xb5, 0x00, 0x1c, 0x13, 0x1c, 0x0a, 0x1c, 0x01,
-- 0x1c, 0x18, 0xf0, 0x00, 0xf8, 0xeb, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x0b, 0x68, 0x54,
-- 0x69, 0x27, 0x1c, 0x11, 0x2f, 0x00, 0xd0, 0x07,
-- 0x68, 0x89, 0x1c, 0x02, 0x1c, 0x20, 0xf0, 0x10,
-- 0xff, 0xc5, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x90, 0x69, 0x82, 0x68, 0x44,
-- 0xb0, 0x81, 0x42, 0x8a, 0xd1, 0x03, 0xb0, 0x01,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0xff,
-- 0xab, 0x00, 0x61, 0x81, 0x70, 0x1a, 0x22, 0x02,
-- 0x70, 0x5a, 0x22, 0x00, 0x70, 0x9a, 0x70, 0xd9,
-- 0x69, 0x27, 0x2f, 0x00, 0xd0, 0x05, 0x46, 0x6a,
-- 0x68, 0x81, 0x23, 0x04, 0x1c, 0x20, 0xf0, 0x10,
-- 0xff, 0xa1, 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x00, 0x49, 0x04, 0x68, 0x09,
-- 0x31, 0x19, 0x61, 0x01, 0x21, 0x00, 0xf7, 0xff,
-- 0xff, 0xd8, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0xf0, 0x1c, 0x07,
-- 0x68, 0x40, 0x69, 0x40, 0x25, 0x00, 0xb0, 0x9e,
-- 0x28, 0x00, 0xd1, 0x08, 0x21, 0x02, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0xc7, 0x1c, 0x28, 0xb0, 0x1e,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x23, 0x11,
-- 0x01, 0x5b, 0x18, 0xfc, 0x70, 0x25, 0x23, 0xff,
-- 0x22, 0x00, 0x68, 0x7e, 0x69, 0x76, 0x1c, 0x38,
-- 0x1c, 0x21, 0x33, 0x01, 0xf0, 0x10, 0xff, 0x70,
-- 0x46, 0x68, 0x22, 0xff, 0x1c, 0x21, 0x32, 0x01,
-- 0xf0, 0x01, 0xfa, 0xea, 0x28, 0x00, 0xda, 0x11,
-- 0x23, 0x03, 0x02, 0x1b, 0x18, 0xf8, 0x6a, 0x01,
-- 0x31, 0x01, 0x62, 0x01, 0x29, 0x64, 0xdd, 0x03,
-- 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa1,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x1e, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x46, 0x68, 0x1d, 0xc1,
-- 0x31, 0x6b, 0x23, 0x01, 0x9a, 0x16, 0x68, 0x7c,
-- 0x69, 0xa4, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x48,
-- 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8d,
-- 0x21, 0x01, 0x68, 0x7a, 0x6a, 0x92, 0x1c, 0x38,
-- 0xf0, 0x10, 0xff, 0x3a, 0x1c, 0x28, 0xb0, 0x1e,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00,
-- 0x21, 0x01, 0x68, 0x42, 0x69, 0xd2, 0xf0, 0x10,
-- 0xff, 0x2f, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0,
-- 0x1d, 0xc6, 0x36, 0x19, 0x1c, 0x07, 0xf7, 0xff,
-- 0xff, 0xf2, 0x0a, 0x00, 0xd2, 0x03, 0x20, 0x00,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x02,
-- 0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10,
-- 0xff, 0x1b, 0x1c, 0x04, 0x21, 0x03, 0x68, 0x7a,
-- 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x14,
-- 0x02, 0x00, 0x43, 0x20, 0x04, 0x04, 0x0c, 0x24,
-- 0x69, 0xf8, 0x42, 0xa0, 0xda, 0x01, 0x04, 0x04,
-- 0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, 0xdd, 0x09,
-- 0x21, 0x00, 0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38,
-- 0xf0, 0x10, 0xff, 0x02, 0x55, 0x70, 0x35, 0x01,
-- 0x42, 0xa5, 0xdb, 0xf5, 0x1c, 0x21, 0xa0, 0x07,
-- 0xf0, 0x11, 0xf8, 0x22, 0x69, 0xb8, 0x28, 0x06,
-- 0xd1, 0x04, 0x68, 0xf8, 0x1c, 0x31, 0x1c, 0x22,
-- 0xf0, 0x00, 0xff, 0x40, 0x1c, 0x20, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x63,
-- 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x61,
-- 0x74, 0x61, 0x20, 0x6c, 0x65, 0x6e, 0x3d, 0x25,
-- 0x64, 0x0a, 0x00, 0x00, 0xb5, 0xf0, 0x1c, 0x14,
-- 0x1c, 0x0d, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xab,
-- 0x22, 0x01, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b,
-- 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xd3, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0x99, 0x09, 0xc0, 0xd3, 0x23,
-- 0x06, 0x22, 0x0e, 0x12, 0x21, 0x02, 0x68, 0x7b,
-- 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xc6,
-- 0x12, 0x22, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b,
-- 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xbf, 0x26, 0x00,
-- 0x2c, 0x00, 0xdd, 0x09, 0x5d, 0xaa, 0x21, 0x00,
-- 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10,
-- 0xfe, 0xb5, 0x36, 0x01, 0x42, 0xa6, 0xdb, 0xf5,
-- 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x78, 0x08, 0x80,
-- 0xd3, 0x02, 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xd0,
-- 0x22, 0x00, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b,
-- 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xa3, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0x69, 0x08, 0x80, 0xd3, 0x02,
-- 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xc1, 0x20, 0x00,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f,
-- 0x77, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x77,
-- 0x72, 0x69, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72,
-- 0x6f, 0x72, 0x20, 0x31, 0x0a, 0x00, 0x00, 0x00,
-- 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f,
-- 0x77, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x77,
-- 0x72, 0x69, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72,
-- 0x6f, 0x72, 0x20, 0x32, 0x0a, 0x00, 0x00, 0x00,
-- 0xb5, 0x00, 0x1c, 0x0a, 0x1d, 0xc1, 0x31, 0xff,
-- 0x31, 0x1a, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x0d,
-- 0xf0, 0x10, 0xff, 0x8e, 0x22, 0x08, 0x21, 0x01,
-- 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10,
-- 0xfe, 0x61, 0x21, 0x03, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfe, 0xa8, 0x48, 0x0a, 0x68, 0x00, 0x30, 0x05,
-- 0x61, 0x38, 0x20, 0x00, 0x23, 0x03, 0x02, 0x1b,
-- 0x18, 0xf9, 0x62, 0x08, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x73,
-- 0x65, 0x74, 0x0a, 0x00, 0x2e, 0x08, 0x05, 0xb0,
-- 0xb5, 0x90, 0x22, 0x00, 0x21, 0x01, 0x68, 0x43,
-- 0x6a, 0x1b, 0x1c, 0x07, 0xf0, 0x10, 0xfe, 0x3e,
-- 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x04, 0x23, 0x40,
-- 0x40, 0x18, 0x4c, 0x14, 0xd1, 0x13, 0x68, 0x20,
-- 0x30, 0x05, 0x23, 0x03, 0x02, 0x1b, 0x61, 0x38,
-- 0x18, 0xf8, 0x6a, 0x01, 0x31, 0x01, 0x62, 0x01,
-- 0x29, 0x0a, 0xdd, 0x03, 0x21, 0x00, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfe, 0x73, 0x20, 0x00, 0x43, 0xc0,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x04,
-- 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38,
-- 0xf0, 0x10, 0xfe, 0x1c, 0x21, 0x04, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfe, 0x63, 0x68, 0x20, 0x30, 0x05,
-- 0x61, 0x38, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0,
-- 0xb5, 0xf0, 0x26, 0xff, 0x36, 0x01, 0x61, 0xc6,
-- 0x1d, 0xc5, 0x35, 0x19, 0x1c, 0x07, 0xf7, 0xff,
-- 0xfe, 0xd6, 0x4c, 0x17, 0x28, 0x00, 0xd1, 0x0d,
-- 0xa0, 0x16, 0xf0, 0x10, 0xff, 0x25, 0x21, 0xfe,
-- 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x46, 0x68, 0x20,
-- 0x61, 0x78, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, 0x02, 0x00,
-- 0x78, 0x69, 0x43, 0x01, 0x61, 0xf9, 0xa0, 0x19,
-- 0xf0, 0x10, 0xff, 0x12, 0x69, 0xf8, 0x42, 0xb0,
-- 0xdd, 0x00, 0x61, 0xfe, 0x22, 0x02, 0x21, 0x01,
-- 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10,
-- 0xfd, 0xe1, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38,
-- 0x21, 0x05, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x25,
-- 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64,
-- 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20,
-- 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f,
-- 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x75,
-- 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a,
-- 0x65, 0x0a, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64,
-- 0x75, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66,
-- 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20,
-- 0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00,
-- 0xb5, 0xb0, 0x1c, 0x07, 0xf7, 0xff, 0xfe, 0x6f,
-- 0x23, 0x40, 0x40, 0x18, 0x25, 0x00, 0x43, 0xed,
-- 0x4c, 0x3d, 0x28, 0x00, 0xd1, 0x0c, 0xa0, 0x3d,
-- 0xf0, 0x10, 0xfe, 0xc2, 0x21, 0xff, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfd, 0xe3, 0x68, 0x20, 0x61, 0x78,
-- 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x22, 0x03, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b,
-- 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x8b, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfe, 0x51, 0x09, 0xc0, 0xd2, 0x0c,
-- 0xa0, 0x3d, 0xf0, 0x10, 0xfe, 0xa9, 0x21, 0xff,
-- 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xca, 0x68, 0x20,
-- 0x61, 0x78, 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x22, 0x02, 0x21, 0x02, 0x68, 0x7b,
-- 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x72,
-- 0x22, 0x00, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b,
-- 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x6b, 0x69, 0xf8,
-- 0x12, 0x02, 0x21, 0x00, 0x68, 0x7b, 0x6a, 0x1b,
-- 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x63, 0x69, 0xf8,
-- 0x06, 0x02, 0x0e, 0x12, 0x21, 0x00, 0x68, 0x7b,
-- 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x5a,
-- 0xa0, 0x34, 0xf0, 0x10, 0xfe, 0x7d, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfe, 0x1d, 0x08, 0x80, 0xd3, 0x02,
-- 0xa0, 0x3e, 0xf0, 0x10, 0xfe, 0x75, 0x22, 0x00,
-- 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38,
-- 0xf0, 0x10, 0xfd, 0x48, 0x68, 0xf8, 0x69, 0xf9,
-- 0xf0, 0x00, 0xfa, 0x3e, 0x48, 0x42, 0x68, 0xf9,
-- 0x4b, 0x42, 0x18, 0xc9, 0x61, 0x48, 0x68, 0xf8,
-- 0x18, 0xc0, 0x61, 0x07, 0x48, 0x40, 0x68, 0xf9,
-- 0x18, 0xc9, 0x61, 0x88, 0x68, 0xf8, 0x18, 0xc0,
-- 0x60, 0xc7, 0x69, 0xf9, 0xa0, 0x3d, 0xf0, 0x10,
-- 0xfe, 0x57, 0x68, 0x20, 0x61, 0x38, 0x21, 0x06,
-- 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x76, 0x20, 0x00,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64,
-- 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20,
-- 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f,
-- 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65,
-- 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20,
-- 0x73, 0x69, 0x7a, 0x65, 0x0a, 0x00, 0x00, 0x00,
-- 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a,
-- 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20,
-- 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64,
-- 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63,
-- 0x65, 0x69, 0x76, 0x65, 0x20, 0x62, 0x75, 0x66,
-- 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65,
-- 0x20, 0x32, 0x0a, 0x00, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x73, 0x65, 0x6e,
-- 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x65, 0x67,
-- 0x6f, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20,
-- 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73,
-- 0x69, 0x7a, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b,
-- 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75,
-- 0x6c, 0x65, 0x0a, 0x00, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x5f, 0x6e, 0x65, 0x67, 0x6f,
-- 0x74, 0x69, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x62,
-- 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69,
-- 0x7a, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65,
-- 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x00,
-- 0x2e, 0x00, 0x7c, 0x55, 0x00, 0x01, 0x3b, 0x80,
-- 0x2e, 0x00, 0x7c, 0x67, 0x63, 0x69, 0x5f, 0x73,
-- 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x62, 0x75, 0x66,
-- 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65,
-- 0x20, 0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a,
-- 0x00, 0x00, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07,
-- 0x20, 0xff, 0x30, 0x01, 0x61, 0xf8, 0x21, 0x00,
-- 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xea, 0x48, 0x05,
-- 0x68, 0x00, 0x61, 0x38, 0x48, 0x04, 0xf7, 0xfd,
-- 0xfc, 0xe5, 0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0,
-- 0x00, 0x01, 0x3b, 0x9c, 0xb5, 0x00, 0x68, 0xc0,
-- 0xf7, 0xfd, 0xfc, 0xfa, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0x80, 0x1c, 0x1f, 0x06, 0x0b, 0x0e, 0x1b,
-- 0x69, 0x81, 0x29, 0x06, 0xd0, 0x04, 0x20, 0x00,
-- 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x78, 0x11, 0x29, 0xff, 0xd1, 0x05, 0xf7, 0xff,
-- 0xfc, 0xe4, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0xc0, 0x1c, 0x11, 0x1c, 0x3a,
-- 0xf0, 0x00, 0xfb, 0x9a, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x69, 0x00, 0x49, 0x04, 0x68, 0x09,
-- 0x1a, 0x40, 0x4b, 0x04, 0x42, 0x98, 0xd2, 0x01,
-- 0x20, 0x00, 0x47, 0x70, 0x20, 0x01, 0x47, 0x70,
-- 0x2e, 0x08, 0x05, 0xb0, 0x80, 0x00, 0x00, 0x00,
-- 0xb5, 0x90, 0x68, 0x44, 0x6a, 0x61, 0x1c, 0x07,
-- 0x29, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x10,
-- 0xfc, 0x51, 0xe0, 0x00, 0x20, 0x01, 0x08, 0x40,
-- 0xd2, 0x06, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfc, 0x98, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x69, 0xb8, 0x28, 0x00, 0xd1, 0xf9, 0x6a, 0xa2,
-- 0x2a, 0x00, 0xd0, 0x03, 0x21, 0x02, 0x1c, 0x38,
-- 0xf0, 0x10, 0xfc, 0x3e, 0x21, 0x01, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfc, 0x87, 0x20, 0x00, 0x23, 0x03,
-- 0x02, 0x1b, 0x18, 0xf9, 0x62, 0x08, 0x48, 0x03,
-- 0x68, 0x00, 0x30, 0x19, 0x61, 0x38, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb0,
-- 0xb5, 0x90, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xcc,
-- 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xba, 0x28, 0x00,
-- 0xd1, 0x03, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x69, 0xb8, 0x4c, 0x23, 0x28, 0x05,
-- 0xd0, 0x30, 0xdc, 0x0b, 0x28, 0x01, 0xd0, 0x1e,
-- 0x28, 0x02, 0xd0, 0x23, 0x28, 0x03, 0xd0, 0x25,
-- 0x28, 0x04, 0xd1, 0x14, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfe, 0x03, 0xe0, 0x10, 0x28, 0x06, 0xd0, 0x25,
-- 0x28, 0xfe, 0xd0, 0x01, 0x28, 0xff, 0xd1, 0x0a,
-- 0x69, 0x78, 0x68, 0x21, 0x1a, 0x08, 0x23, 0xff,
-- 0x33, 0xf5, 0x42, 0x98, 0xd9, 0x03, 0x21, 0x00,
-- 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x4a, 0x20, 0x00,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x20,
-- 0x30, 0x05, 0x61, 0x38, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfc, 0x6d, 0xe7, 0xf4, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfd, 0x84, 0xe7, 0xf0, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfd, 0xa7, 0xe7, 0xec, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfe, 0x3f, 0xe7, 0xe8, 0x68, 0xf8, 0xf0, 0x00,
-- 0xfc, 0x53, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfc, 0xb1, 0x68, 0xf8, 0xf0, 0x00,
-- 0xfb, 0xd9, 0x68, 0x20, 0x30, 0x02, 0x61, 0x38,
-- 0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0,
-- 0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d, 0x9f, 0x04,
-- 0x68, 0x42, 0x1c, 0x1c, 0x42, 0x8a, 0xdc, 0x04,
-- 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0xc0, 0x23, 0xc9, 0x00, 0x9b,
-- 0x43, 0x59, 0x18, 0x40, 0x1c, 0x29, 0x1c, 0x22,
-- 0x1c, 0x3b, 0xf7, 0xff, 0xff, 0x35, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x24, 0x00,
-- 0x1c, 0x07, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x0a,
-- 0x21, 0xc9, 0x00, 0x89, 0x43, 0x61, 0x68, 0xf8,
-- 0x18, 0x40, 0xf7, 0xff, 0xff, 0x81, 0x68, 0x78,
-- 0x34, 0x01, 0x42, 0xa0, 0xdc, 0xf4, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x24, 0x00,
-- 0x1c, 0x07, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x0f,
-- 0x21, 0xc9, 0x00, 0x89, 0x43, 0x61, 0x68, 0xf8,
-- 0x18, 0x40, 0x60, 0x84, 0x68, 0x3a, 0xc0, 0x84,
-- 0x68, 0xf8, 0x18, 0x40, 0xf7, 0xff, 0xfe, 0xee,
-- 0x68, 0x78, 0x34, 0x01, 0x42, 0xa0, 0xdc, 0xef,
-- 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xf0, 0x25, 0x00, 0x1c, 0x07, 0x68, 0x40,
-- 0x1c, 0x0c, 0x28, 0x00, 0xdd, 0x0f, 0x26, 0x01,
-- 0x1c, 0x30, 0x40, 0xa8, 0x40, 0x20, 0xd0, 0x06,
-- 0x21, 0xc9, 0x00, 0x89, 0x43, 0x69, 0x68, 0xf8,
-- 0x18, 0x40, 0xf7, 0xff, 0xfb, 0xe6, 0x68, 0x78,
-- 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xf0, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 0x21, 0x00,
-- 0x78, 0x07, 0x22, 0x80, 0x43, 0xd2, 0x40, 0x3a,
-- 0x1c, 0x04, 0x0a, 0x3b, 0xd3, 0x0f, 0x27, 0x00,
-- 0x30, 0x01, 0x2a, 0x00, 0xdd, 0x0d, 0x1b, 0xd3,
-- 0x00, 0xdb, 0x78, 0x06, 0x1f, 0xdd, 0x3d, 0x01,
-- 0x40, 0xae, 0x43, 0x31, 0x30, 0x01, 0x37, 0x01,
-- 0x42, 0x97, 0xdb, 0xf4, 0xe0, 0x01, 0x30, 0x01,
-- 0x1c, 0x11, 0x1b, 0x00, 0x18, 0x40, 0xbc, 0xf0,
-- 0x47, 0x70, 0xb4, 0xb0, 0x22, 0x01, 0x28, 0x80,
-- 0xda, 0x02, 0x70, 0x08, 0xbc, 0xb0, 0x47, 0x70,
-- 0x27, 0x03, 0x25, 0xff, 0x00, 0xfc, 0x1c, 0x2b,
-- 0x40, 0xa3, 0x40, 0x03, 0xd0, 0x03, 0x1c, 0x03,
-- 0x41, 0x23, 0x54, 0x8b, 0x32, 0x01, 0x37, 0x01,
-- 0xd5, 0xf4, 0x20, 0x80, 0x43, 0x10, 0x70, 0x08,
-- 0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xb0, 0x22, 0x00,
-- 0x78, 0x41, 0x1c, 0x47, 0x20, 0x80, 0x43, 0xc0,
-- 0x40, 0x08, 0x0a, 0x09, 0xd3, 0x0f, 0x21, 0x00,
-- 0x37, 0x01, 0x28, 0x00, 0xdd, 0x0d, 0x1a, 0x43,
-- 0x00, 0xdb, 0x78, 0x3d, 0x1f, 0xdc, 0x3c, 0x01,
-- 0x40, 0xa5, 0x43, 0x2a, 0x31, 0x01, 0x37, 0x01,
-- 0x42, 0x81, 0xdb, 0xf4, 0xe0, 0x01, 0x1c, 0x02,
-- 0x37, 0x01, 0x78, 0x3b, 0xa1, 0x03, 0xa0, 0x04,
-- 0xf0, 0x10, 0xfc, 0x42, 0x78, 0x38, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x3a, 0x00,
-- 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-- 0x3a, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x65,
-- 0x6e, 0x3d, 0x25, 0x64, 0x2c, 0x20, 0x69, 0x64,
-- 0x3d, 0x25, 0x30, 0x32, 0x78, 0x0a, 0x00, 0x00,
-- 0xb5, 0xb0, 0x25, 0x00, 0x60, 0x01, 0x1c, 0x07,
-- 0x4b, 0x2f, 0x18, 0xc4, 0x72, 0x25, 0x72, 0x65,
-- 0x72, 0xa5, 0x72, 0xe5, 0x1c, 0x08, 0x21, 0x01,
-- 0x04, 0x09, 0xf0, 0x10, 0xfb, 0x01, 0x21, 0x01,
-- 0x02, 0x49, 0x42, 0x88, 0xdd, 0x01, 0x60, 0x79,
-- 0xe0, 0x00, 0x60, 0x78, 0x22, 0x01, 0x04, 0x12,
-- 0x21, 0x00, 0x1d, 0xf8, 0x30, 0x01, 0xf0, 0x10,
-- 0xfb, 0xa7, 0x20, 0x00, 0x43, 0xc1, 0x00, 0x82,
-- 0x19, 0xd2, 0x4b, 0x22, 0x18, 0xd3, 0x60, 0x9d,
-- 0x4b, 0x21, 0x18, 0xd3, 0x60, 0x9d, 0x23, 0x9d,
-- 0x02, 0x5b, 0x18, 0xd3, 0x60, 0x9d, 0x4b, 0x1f,
-- 0x18, 0xd2, 0x60, 0x95, 0x00, 0x42, 0x19, 0xd2,
-- 0x4b, 0x1d, 0x18, 0xd3, 0x81, 0x19, 0x4b, 0x1d,
-- 0x18, 0xd2, 0x81, 0x11, 0x30, 0x01, 0x28, 0x20,
-- 0xdb, 0xe5, 0x20, 0x00, 0x68, 0x79, 0x29, 0x00,
-- 0xdd, 0x11, 0x00, 0x41, 0x18, 0x09, 0x00, 0xc9,
-- 0x19, 0xc9, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc9,
-- 0x72, 0x0d, 0x60, 0xcd, 0x61, 0x0d, 0x61, 0x4d,
-- 0x76, 0x0d, 0x76, 0x4d, 0x61, 0xc8, 0x68, 0x79,
-- 0x30, 0x01, 0x42, 0x81, 0xdc, 0xed, 0x4b, 0x10,
-- 0x18, 0xf8, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x00,
-- 0xf0, 0x10, 0xfb, 0x6e, 0x4b, 0x0d, 0x18, 0xf8,
-- 0x22, 0xff, 0x21, 0x00, 0x32, 0x01, 0xf0, 0x10,
-- 0xfb, 0x67, 0x60, 0xe5, 0x61, 0x25, 0x61, 0x65,
-- 0x61, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x39, 0x00,
-- 0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3a, 0x80,
-- 0x00, 0x01, 0x3b, 0x00, 0x00, 0x01, 0x3b, 0x40,
-- 0x00, 0x01, 0x30, 0x08, 0x00, 0x01, 0x38, 0x08,
-- 0x21, 0x00, 0x70, 0x01, 0x60, 0x41, 0x60, 0x81,
-- 0x60, 0xc1, 0x74, 0x01, 0x74, 0x41, 0x47, 0x70,
-- 0xb4, 0x80, 0x21, 0x00, 0x68, 0x42, 0x2a, 0x00,
-- 0xdd, 0x18, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0xdb,
-- 0x18, 0x1f, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xfb,
-- 0x7a, 0x1b, 0x2b, 0x00, 0xd1, 0x0b, 0x22, 0x01,
-- 0x00, 0x4b, 0x18, 0x59, 0x00, 0xc9, 0x18, 0x08,
-- 0x04, 0x13, 0x18, 0xc1, 0x72, 0x0a, 0x4b, 0x05,
-- 0x18, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x31, 0x01,
-- 0x42, 0x8a, 0xdc, 0xe6, 0x20, 0x00, 0xbc, 0x80,
-- 0x47, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08,
-- 0xb5, 0xb0, 0x06, 0x1d, 0x0e, 0x2d, 0x1c, 0x14,
-- 0x68, 0x0a, 0x21, 0x00, 0x1c, 0x07, 0xf0, 0x10,
-- 0xfb, 0x1b, 0x70, 0x3d, 0x2c, 0x00, 0xd0, 0x04,
-- 0x20, 0x80, 0x70, 0x78, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0x00, 0x70, 0x78, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x99, 0x01,
-- 0x1c, 0x1c, 0x1c, 0x15, 0x1c, 0x07, 0x29, 0x00,
-- 0xd1, 0x04, 0x20, 0x00, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x28, 0xf7, 0xff,
-- 0xff, 0xb7, 0x1c, 0x06, 0xd1, 0x01, 0x20, 0x00,
-- 0xe7, 0xf4, 0x69, 0x70, 0x68, 0x29, 0x43, 0x48,
-- 0x19, 0x01, 0x23, 0x01, 0x04, 0x1b, 0x42, 0x99,
-- 0xdd, 0x01, 0x20, 0x00, 0xe7, 0xea, 0x18, 0x2d,
-- 0x99, 0x01, 0x1d, 0xe8, 0x30, 0x01, 0x1c, 0x22,
-- 0xf0, 0x10, 0xfa, 0x84, 0x74, 0x34, 0x7a, 0x68,
-- 0x74, 0x70, 0x2f, 0x00, 0xd0, 0x04, 0x68, 0xb8,
-- 0x60, 0xb0, 0x60, 0xf7, 0x60, 0xbe, 0xe0, 0x02,
-- 0x20, 0x00, 0x60, 0xb0, 0x60, 0xf0, 0x1c, 0x30,
-- 0xe7, 0xd4, 0xb5, 0xff, 0x9c, 0x09, 0x06, 0x25,
-- 0x0e, 0x2d, 0x24, 0x00, 0x43, 0xe4, 0x1c, 0x07,
-- 0x98, 0x02, 0x1c, 0x21, 0x4b, 0x4c, 0x18, 0xfa,
-- 0x28, 0x00, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x6a,
-- 0x20, 0x00, 0xe0, 0x2d, 0x20, 0x00, 0x00, 0x43,
-- 0x19, 0xde, 0x4b, 0x48, 0x18, 0xf6, 0x23, 0x08,
-- 0x5e, 0xf3, 0x42, 0xab, 0xd1, 0x00, 0x1c, 0x04,
-- 0x29, 0x00, 0xda, 0x04, 0x1c, 0x1e, 0x23, 0x01,
-- 0x42, 0xde, 0xd1, 0x00, 0x1c, 0x01, 0x30, 0x01,
-- 0x28, 0x20, 0xdb, 0xec, 0x20, 0x00, 0x43, 0xc0,
-- 0x42, 0x84, 0xd1, 0x05, 0x42, 0x81, 0xd0, 0x03,
-- 0x7a, 0x13, 0x33, 0x01, 0x72, 0x13, 0x1c, 0x0c,
-- 0x2c, 0x00, 0xdb, 0x44, 0x00, 0x60, 0x19, 0xc0,
-- 0x4b, 0x38, 0x18, 0xc0, 0x81, 0x05, 0x00, 0xa0,
-- 0x19, 0xc1, 0x4b, 0x37, 0x18, 0xc8, 0x68, 0x80,
-- 0x4b, 0x36, 0x18, 0xc9, 0x68, 0x8d, 0xe0, 0x2c,
-- 0x00, 0x43, 0x19, 0xde, 0x4b, 0x34, 0x18, 0xf6,
-- 0x23, 0x08, 0x5e, 0xf3, 0x42, 0xab, 0xd1, 0x00,
-- 0x1c, 0x04, 0x29, 0x00, 0xda, 0x04, 0x1c, 0x1e,
-- 0x23, 0x01, 0x42, 0xde, 0xd1, 0x00, 0x1c, 0x01,
-- 0x30, 0x01, 0x28, 0x20, 0xdb, 0xec, 0x20, 0x00,
-- 0x43, 0xc0, 0x42, 0x84, 0xd1, 0x05, 0x42, 0x81,
-- 0xd0, 0x03, 0x7a, 0x93, 0x33, 0x01, 0x72, 0x93,
-- 0x1c, 0x0c, 0x2c, 0x00, 0xdb, 0x17, 0x00, 0x60,
-- 0x19, 0xc0, 0x4b, 0x25, 0x18, 0xc0, 0x81, 0x05,
-- 0x00, 0xa0, 0x19, 0xc1, 0x23, 0x9d, 0x02, 0x5b,
-- 0x18, 0xc8, 0x68, 0x80, 0x4b, 0x21, 0x18, 0xc9,
-- 0x68, 0x8d, 0x28, 0x00, 0xd0, 0x0f, 0x99, 0x01,
-- 0x9b, 0x03, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x5a,
-- 0x28, 0x00, 0xd1, 0x12, 0x43, 0xc0, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff,
-- 0x20, 0x00, 0x43, 0xc0, 0xe7, 0xf7, 0x99, 0x01,
-- 0x9b, 0x03, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x4a,
-- 0x1c, 0x05, 0xd1, 0x01, 0x43, 0xe8, 0xe7, 0xee,
-- 0x1c, 0x28, 0x60, 0x44, 0x9a, 0x02, 0x2a, 0x00,
-- 0xd0, 0x0c, 0x2a, 0x01, 0xd1, 0x08, 0x00, 0xa1,
-- 0x19, 0xc9, 0x23, 0x9d, 0x02, 0x5b, 0x18, 0xca,
-- 0x60, 0x90, 0x4b, 0x0c, 0x18, 0xc8, 0x60, 0x85,
-- 0x1c, 0x20, 0xe7, 0xdc, 0x00, 0xa1, 0x19, 0xc9,
-- 0x4b, 0x05, 0x18, 0xca, 0x60, 0x90, 0x4b, 0x05,
-- 0x18, 0xc8, 0x60, 0x85, 0xe7, 0xf4, 0x00, 0x00,
-- 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x00,
-- 0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80,
-- 0x00, 0x01, 0x3b, 0x40, 0x00, 0x01, 0x3a, 0x80,
-- 0xb5, 0x80, 0x27, 0x00, 0x28, 0x00, 0xd1, 0x03,
-- 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x22, 0x00, 0x68, 0x81, 0x29, 0x00, 0xd0, 0x0b,
-- 0x68, 0xc3, 0x2b, 0x00, 0xd0, 0x05, 0x60, 0x99,
-- 0x68, 0xc1, 0x68, 0x82, 0x60, 0xd1, 0x68, 0xc7,
-- 0xe0, 0x07, 0x60, 0xca, 0x68, 0x87, 0xe0, 0x04,
-- 0x68, 0xc1, 0x29, 0x00, 0xd0, 0x01, 0x60, 0x8a,
-- 0x68, 0xc7, 0xf7, 0xff, 0xfe, 0xbd, 0x1c, 0x38,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf7,
-- 0x1c, 0x07, 0x98, 0x01, 0x68, 0x46, 0x99, 0x02,
-- 0x29, 0x00, 0xd0, 0x0b, 0x29, 0x01, 0xd1, 0x12,
-- 0x00, 0xb0, 0x19, 0xc0, 0x23, 0x9d, 0x02, 0x5b,
-- 0x18, 0xc1, 0x68, 0x8d, 0x4b, 0x2c, 0x18, 0xc0,
-- 0x68, 0x84, 0xe0, 0x0a, 0x00, 0xb0, 0x19, 0xc0,
-- 0x4b, 0x2a, 0x18, 0xc1, 0x68, 0x8d, 0x4b, 0x2a,
-- 0x18, 0xc0, 0x68, 0x84, 0xe0, 0x01, 0x25, 0x00,
-- 0x24, 0x00, 0x99, 0x01, 0x42, 0xa9, 0xd1, 0x08,
-- 0x98, 0x01, 0xf7, 0xff, 0xff, 0xb9, 0x99, 0x01,
-- 0x1c, 0x05, 0x42, 0xa1, 0xd1, 0x08, 0x24, 0x00,
-- 0xe0, 0x06, 0x99, 0x01, 0x42, 0xa1, 0xd1, 0x03,
-- 0x98, 0x01, 0xf7, 0xff, 0xff, 0xad, 0x1c, 0x04,
-- 0x22, 0x00, 0x43, 0xd2, 0x99, 0x02, 0x4b, 0x1d,
-- 0x18, 0xf8, 0x29, 0x00, 0xd0, 0x1a, 0x29, 0x01,
-- 0xd1, 0x14, 0x00, 0xb1, 0x19, 0xc9, 0x23, 0x9d,
-- 0x02, 0x5b, 0x18, 0xcb, 0x60, 0x9d, 0x4b, 0x14,
-- 0x18, 0xc9, 0x60, 0x8c, 0x2d, 0x00, 0xd1, 0x09,
-- 0x2c, 0x00, 0xd1, 0x07, 0x7a, 0x81, 0x39, 0x01,
-- 0x72, 0x81, 0x00, 0x70, 0x19, 0xc0, 0x4b, 0x12,
-- 0x18, 0xc0, 0x81, 0x02, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb1, 0x19, 0xc9,
-- 0x4b, 0x0a, 0x18, 0xcb, 0x60, 0x9d, 0x4b, 0x0a,
-- 0x18, 0xc9, 0x60, 0x8c, 0x2d, 0x00, 0xd1, 0xf1,
-- 0x2c, 0x00, 0xd1, 0xef, 0x7a, 0x01, 0x39, 0x01,
-- 0x72, 0x01, 0x00, 0x70, 0x19, 0xc0, 0x4b, 0x07,
-- 0x18, 0xc0, 0x81, 0x02, 0xe7, 0xe6, 0x00, 0x00,
-- 0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x39, 0x00,
-- 0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3b, 0x80,
-- 0x00, 0x01, 0x3b, 0x40, 0x00, 0x01, 0x3b, 0x00,
-- 0xb5, 0xf0, 0x1c, 0x17, 0x06, 0x1a, 0x0e, 0x12,
-- 0xb0, 0x82, 0x92, 0x00, 0x1c, 0x04, 0x1c, 0x08,
-- 0x1c, 0x0d, 0xb0, 0x81, 0xf7, 0xff, 0xfd, 0x8e,
-- 0x90, 0x00, 0x1c, 0x3a, 0x1c, 0x03, 0xa1, 0x27,
-- 0x48, 0x27, 0xf0, 0x10, 0xf9, 0xe9, 0x2f, 0x00,
-- 0xdd, 0x42, 0x4b, 0x26, 0x18, 0xe0, 0x90, 0x02,
-- 0x68, 0x20, 0x38, 0x02, 0x42, 0xb8, 0xda, 0x01,
-- 0x1c, 0x06, 0xe0, 0x00, 0x1c, 0x3e, 0x42, 0xbe,
-- 0xda, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00,
-- 0x98, 0x02, 0x9b, 0x00, 0x1c, 0x21, 0xf7, 0xff,
-- 0xfe, 0x47, 0x9a, 0x01, 0xb4, 0x04, 0x22, 0x00,
-- 0x99, 0x03, 0x1c, 0x20, 0x1c, 0xb3, 0xf7, 0xff,
-- 0xfe, 0x88, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x05,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x80, 0x19, 0x00,
-- 0x4b, 0x13, 0x18, 0xc0, 0x68, 0x80, 0x69, 0x40,
-- 0x68, 0x21, 0x43, 0x48, 0x30, 0x02, 0x19, 0x81,
-- 0x23, 0x01, 0x04, 0x1b, 0x42, 0x99, 0xdd, 0x05,
-- 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x18, 0x20, 0x30, 0x08,
-- 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x10, 0xf8, 0xda,
-- 0x1b, 0xbf, 0x19, 0xad, 0x2f, 0x00, 0xdc, 0xbf,
-- 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x3a, 0x00,
-- 0x2e, 0x00, 0x85, 0xcc, 0x00, 0x01, 0x38, 0x08,
-- 0x00, 0x01, 0x39, 0x00, 0xb5, 0xf3, 0xb0, 0x83,
-- 0x1c, 0x07, 0x99, 0x04, 0x00, 0x88, 0x19, 0xc0,
-- 0x4b, 0x2f, 0x18, 0xc0, 0x90, 0x02, 0x68, 0x84,
-- 0x4b, 0x2e, 0x18, 0xfb, 0x93, 0x01, 0x2c, 0x00,
-- 0xd0, 0x46, 0x25, 0x00, 0x7c, 0x26, 0x69, 0x60,
-- 0x68, 0x39, 0x43, 0x48, 0x7c, 0x61, 0x23, 0x80,
-- 0x40, 0x19, 0x91, 0x00, 0x30, 0x02, 0x19, 0x81,
-- 0x02, 0x5b, 0x39, 0x02, 0x42, 0x99, 0xdd, 0x04,
-- 0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x18, 0x38, 0x1d, 0xc1, 0x31, 0x01,
-- 0x19, 0x78, 0x1e, 0xb2, 0x4b, 0x20, 0x18, 0xc0,
-- 0xf0, 0x10, 0xf8, 0x9c, 0x19, 0xa8, 0x1e, 0x85,
-- 0x68, 0xa0, 0x42, 0xa0, 0xd0, 0x04, 0x1c, 0x04,
-- 0xd0, 0x02, 0x99, 0x00, 0x29, 0x00, 0xd1, 0xd9,
-- 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9d, 0xda, 0x1b,
-- 0x9b, 0x01, 0x68, 0xda, 0x4b, 0x16, 0x18, 0xf8,
-- 0x9b, 0x01, 0x69, 0x9b, 0x1c, 0x29, 0xf0, 0x10,
-- 0xf8, 0x2d, 0x28, 0x00, 0xd1, 0x18, 0x98, 0x02,
-- 0x68, 0x81, 0x29, 0x00, 0xd0, 0x0c, 0x7c, 0x48,
-- 0x24, 0x80, 0x40, 0x04, 0x22, 0x01, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfe, 0xd5, 0x98, 0x02, 0x68, 0x81,
-- 0x29, 0x00, 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0xf2,
-- 0x99, 0x04, 0x1c, 0x48, 0xd5, 0x06, 0x42, 0x40,
-- 0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x03,
-- 0xb0, 0x03, 0xe7, 0xbe, 0x06, 0xc0, 0x0e, 0xc0,
-- 0x9b, 0x01, 0x72, 0x58, 0xb0, 0x03, 0xe7, 0xb8,
-- 0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x3b, 0x80,
-- 0x00, 0x01, 0x30, 0x08, 0xb5, 0xf0, 0x21, 0x00,
-- 0x4b, 0x24, 0x18, 0xc4, 0x7a, 0xe7, 0x7a, 0xa2,
-- 0x25, 0x00, 0x2a, 0x00, 0xd1, 0x03, 0x1c, 0x28,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x00,
-- 0xe0, 0x1e, 0x00, 0x7b, 0x18, 0x1e, 0x4b, 0x1e,
-- 0x18, 0xf6, 0x23, 0x08, 0x5e, 0xf3, 0x2b, 0x00,
-- 0xdb, 0x0c, 0x00, 0xbb, 0x18, 0x1e, 0x23, 0x9d,
-- 0x02, 0x5b, 0x18, 0xf3, 0x68, 0x9b, 0x2b, 0x00,
-- 0xd0, 0x04, 0x7c, 0x5e, 0x0a, 0x33, 0xd2, 0x01,
-- 0x21, 0x01, 0xe0, 0x09, 0x37, 0x01, 0xd5, 0x04,
-- 0x42, 0x7f, 0x06, 0xff, 0x0e, 0xff, 0x42, 0x7f,
-- 0xe0, 0x01, 0x06, 0xff, 0x0e, 0xff, 0x32, 0x01,
-- 0x2a, 0x20, 0xda, 0x01, 0x29, 0x00, 0xd0, 0xdc,
-- 0x29, 0x00, 0xd1, 0x04, 0x72, 0xe5, 0x1c, 0x28,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x72, 0xe7,
-- 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x57, 0x1c, 0x78,
-- 0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0,
-- 0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0,
-- 0x72, 0xe0, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x00, 0x01, 0x3b, 0x80,
-- 0x00, 0x01, 0x3b, 0x40, 0xb5, 0xb0, 0x78, 0x0b,
-- 0x1c, 0x14, 0x1c, 0x05, 0x1c, 0x0f, 0xa1, 0x0c,
-- 0x48, 0x0c, 0xf0, 0x10, 0xf8, 0xd1, 0x78, 0x3a,
-- 0xb4, 0x04, 0x22, 0x01, 0x1c, 0x28, 0x1c, 0x39,
-- 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x86, 0xb0, 0x01,
-- 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x63, 0x69, 0x3a, 0x00, 0x2e, 0x00, 0x85, 0xcc,
-- 0xb5, 0xf0, 0x1c, 0x07, 0x4b, 0x2a, 0x18, 0xc4,
-- 0x7a, 0x65, 0x7a, 0x20, 0x28, 0x00, 0xd1, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00,
-- 0x43, 0xc1, 0xe0, 0x09, 0x35, 0x01, 0xd5, 0x04,
-- 0x42, 0x6d, 0x06, 0xed, 0x0e, 0xed, 0x42, 0x6d,
-- 0xe0, 0x01, 0x06, 0xed, 0x0e, 0xed, 0x30, 0x01,
-- 0x28, 0x20, 0xda, 0x07, 0x00, 0x6a, 0x19, 0xd2,
-- 0x4b, 0x1e, 0x18, 0xd2, 0x23, 0x08, 0x5e, 0xd2,
-- 0x42, 0x8a, 0xd0, 0xeb, 0x00, 0xa8, 0x19, 0xc0,
-- 0x4b, 0x1b, 0x18, 0xc1, 0x68, 0x89, 0x29, 0x00,
-- 0xd0, 0x10, 0x72, 0x65, 0x4b, 0x19, 0x18, 0xc6,
-- 0x68, 0xb1, 0x69, 0x48, 0x68, 0x3a, 0x43, 0x50,
-- 0x7c, 0x09, 0x18, 0x0a, 0x23, 0x01, 0x04, 0x1b,
-- 0x42, 0x9a, 0xdd, 0x08, 0x20, 0x00, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x72, 0x60,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x38,
-- 0x69, 0x22, 0x69, 0x63, 0x30, 0x08, 0xf0, 0x0f,
-- 0xff, 0x4d, 0x22, 0x00, 0x68, 0xb1, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfd, 0xfd, 0x1c, 0x68, 0xd5, 0x04,
-- 0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40,
-- 0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0, 0x72, 0x60,
-- 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x00,
-- 0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80,
-- 0xb5, 0xff, 0xb0, 0x8b, 0x9a, 0x0d, 0x1c, 0x1c,
-- 0x1c, 0x0f, 0x2a, 0x02, 0xda, 0x06, 0x20, 0x00,
-- 0x43, 0xc0, 0xb0, 0x0b, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x78, 0x79, 0x91, 0x04,
-- 0x31, 0x02, 0x78, 0x3b, 0x1c, 0x0d, 0x42, 0x83,
-- 0xd0, 0x07, 0x1c, 0x19, 0x1c, 0x02, 0xa0, 0xf9,
-- 0xf0, 0x10, 0xf8, 0x3e, 0x42, 0x68, 0xb0, 0x0b,
-- 0xe7, 0xec, 0x9a, 0x0d, 0x42, 0x91, 0xdd, 0x02,
-- 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xe6, 0x1d, 0x39,
-- 0x91, 0x0a, 0x1d, 0xe2, 0x32, 0x59, 0x92, 0x09,
-- 0x1d, 0xe6, 0x36, 0x39, 0x28, 0x1d, 0xd0, 0x63,
-- 0xdc, 0x08, 0x28, 0x15, 0xd0, 0x13, 0x28, 0x1a,
-- 0xd0, 0x5f, 0x28, 0x1b, 0xd0, 0x5e, 0x28, 0x1c,
-- 0xd0, 0x5a, 0xe0, 0x7a, 0x28, 0x20, 0xd0, 0x41,
-- 0x1c, 0xbe, 0x28, 0xc0, 0xd0, 0x74, 0x28, 0xc1,
-- 0xd1, 0x73, 0x98, 0x14, 0x28, 0x1b, 0xd0, 0x71,
-- 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xc6, 0x78, 0xb8,
-- 0x28, 0x05, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b,
-- 0xe7, 0xc0, 0x78, 0xf8, 0x28, 0x00, 0xd0, 0x02,
-- 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xba, 0x98, 0x04,
-- 0x1e, 0x82, 0x2a, 0x4f, 0xda, 0x04, 0x99, 0x0a,
-- 0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x33, 0xe0, 0x04,
-- 0x22, 0x4f, 0x99, 0x0a, 0x1c, 0x20, 0xf0, 0x0f,
-- 0xff, 0x2d, 0x78, 0xfa, 0x78, 0xb9, 0x9c, 0x0a,
-- 0xa0, 0xe0, 0x1c, 0x23, 0xf0, 0x0f, 0xff, 0xf4,
-- 0x98, 0x04, 0x18, 0x38, 0x1c, 0x47, 0x42, 0xa7,
-- 0xd9, 0x0c, 0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x62,
-- 0x19, 0x00, 0x1c, 0x44, 0x42, 0xa7, 0xd9, 0x03,
-- 0x1c, 0x21, 0xa0, 0xdd, 0xf0, 0x0f, 0xff, 0xe4,
-- 0x42, 0xa7, 0xd8, 0xf2, 0xa0, 0xd4, 0xf0, 0x0f,
-- 0xff, 0xdf, 0xe0, 0xe3, 0x98, 0x04, 0x28, 0x04,
-- 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0x89,
-- 0x78, 0xf8, 0x02, 0x00, 0x78, 0xb9, 0x43, 0x08,
-- 0x82, 0x30, 0x79, 0x78, 0x02, 0x00, 0x79, 0x39,
-- 0x43, 0x08, 0x82, 0x70, 0x8a, 0x72, 0x8a, 0x31,
-- 0xa0, 0xd1, 0xf0, 0x0f, 0xff, 0xc9, 0xe0, 0xcd,
-- 0xe2, 0x17, 0xe0, 0x00, 0xe0, 0x62, 0x78, 0xb8,
-- 0x07, 0x80, 0x0f, 0x80, 0x30, 0x01, 0x75, 0x30,
-- 0x78, 0xb8, 0x08, 0x80, 0x07, 0x00, 0x0f, 0x00,
-- 0x30, 0x01, 0x75, 0x70, 0x78, 0xf8, 0x9a, 0x09,
-- 0x73, 0x10, 0x20, 0x00, 0x65, 0xa0, 0x7d, 0x31,
-- 0x29, 0x00, 0xdd, 0x0e, 0x18, 0x39, 0x79, 0x09,
-- 0x00, 0xc2, 0x40, 0x91, 0x6d, 0xa2, 0x43, 0x11,
-- 0x65, 0xa1, 0x7d, 0x31, 0x30, 0x01, 0xe0, 0x02,
-- 0xe1, 0x02, 0xe1, 0xf9, 0xe1, 0x4b, 0x42, 0x81,
-- 0xdc, 0xf0, 0x7d, 0x30, 0x30, 0x04, 0x90, 0x03,
-- 0x7d, 0x72, 0x18, 0x39, 0x1d, 0xe0, 0x30, 0x55,
-- 0xf0, 0x0f, 0xfe, 0xcc, 0x7d, 0x70, 0x99, 0x03,
-- 0x18, 0x40, 0x90, 0x03, 0x6d, 0xa1, 0xa0, 0xbc,
-- 0xf0, 0x0f, 0xff, 0x92, 0x7d, 0x70, 0x28, 0x00,
-- 0xd0, 0x17, 0xa0, 0xbf, 0xf0, 0x0f, 0xff, 0x8c,
-- 0x21, 0x00, 0x91, 0x02, 0x7d, 0x70, 0x28, 0x00,
-- 0xdd, 0x0c, 0x99, 0x02, 0x18, 0x60, 0x30, 0x40,
-- 0x7f, 0x01, 0xa0, 0xbc, 0xf0, 0x0f, 0xff, 0x80,
-- 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, 0x7d, 0x70,
-- 0x42, 0x88, 0xdc, 0xf2, 0xa0, 0xb9, 0xf0, 0x0f,
-- 0xff, 0x77, 0x9a, 0x09, 0x7b, 0x11, 0xa0, 0xb8,
-- 0xf0, 0x0f, 0xff, 0x72, 0x22, 0x1a, 0xb4, 0x04,
-- 0x98, 0x04, 0x9a, 0x0e, 0x1a, 0x12, 0x18, 0x39,
-- 0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff, 0xff, 0x10,
-- 0xb0, 0x01, 0x28, 0x00, 0xda, 0x6a, 0x42, 0x68,
-- 0xb0, 0x0b, 0xe7, 0x13, 0x78, 0xb8, 0x06, 0x86,
-- 0x0e, 0xb6, 0x1c, 0x31, 0xa0, 0xb1, 0xf0, 0x0f,
-- 0xff, 0x5b, 0x9a, 0x09, 0x7b, 0x10, 0x42, 0xb0,
-- 0xd1, 0x01, 0x22, 0x01, 0x67, 0x62, 0x78, 0xb8,
-- 0x23, 0xc0, 0x40, 0x18, 0x28, 0xc0, 0xd0, 0x02,
-- 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xfe, 0x2e, 0x00,
-- 0xd1, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xf9,
-- 0x78, 0xf8, 0x28, 0x04, 0xd0, 0x02, 0x1c, 0x28,
-- 0xb0, 0x0b, 0xe6, 0xf3, 0x79, 0x38, 0x90, 0x08,
-- 0x23, 0x0b, 0x40, 0x18, 0x28, 0x09, 0xda, 0x02,
-- 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xea, 0x20, 0x00,
-- 0x21, 0x00, 0x79, 0x7a, 0x92, 0x07, 0x9a, 0x07,
-- 0x40, 0xca, 0x08, 0x52, 0xd3, 0x05, 0x30, 0x01,
-- 0x18, 0x3a, 0x79, 0x52, 0x0a, 0x12, 0xd3, 0x00,
-- 0x30, 0x01, 0x31, 0x01, 0x29, 0x08, 0xdb, 0xf2,
-- 0x1c, 0x41, 0x98, 0x08, 0x08, 0xc0, 0xd3, 0x22,
-- 0x20, 0x00, 0x18, 0x7a, 0x79, 0x52, 0x92, 0x06,
-- 0x07, 0x92, 0xd0, 0x0a, 0x19, 0xca, 0x79, 0x92,
-- 0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a,
-- 0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9,
-- 0x30, 0x01, 0x9a, 0x06, 0x08, 0x92, 0x07, 0x52,
-- 0xd0, 0x0b, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92,
-- 0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a,
-- 0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9,
-- 0x30, 0x01, 0x18, 0x08, 0x1c, 0x41, 0x18, 0x78,
-- 0x79, 0x40, 0x28, 0x22, 0xd0, 0x03, 0x1c, 0x28,
-- 0xb0, 0x0b, 0xe6, 0xab, 0xe1, 0x49, 0x1c, 0x48,
-- 0x99, 0x08, 0x09, 0x49, 0xd3, 0x05, 0x18, 0x39,
-- 0x79, 0x49, 0x09, 0x49, 0xd3, 0x00, 0x30, 0x02,
-- 0x30, 0x01, 0x99, 0x08, 0x09, 0x49, 0x07, 0x49,
-- 0xd0, 0x1b, 0x22, 0x00, 0x92, 0x01, 0x92, 0x00,
-- 0x18, 0x39, 0x79, 0x49, 0x91, 0x05, 0x08, 0xc9,
-- 0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03, 0x22, 0x01,
-- 0x39, 0x01, 0x40, 0x8a, 0x92, 0x01, 0x99, 0x05,
-- 0x09, 0x49, 0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03,
-- 0x22, 0x01, 0x39, 0x01, 0x40, 0x8a, 0x92, 0x00,
-- 0x99, 0x00, 0x9a, 0x01, 0x18, 0x51, 0x18, 0x08,
-- 0x30, 0x01, 0x1d, 0x41, 0x91, 0x03, 0x22, 0x1b,
-- 0xb4, 0x04, 0x99, 0x04, 0x9a, 0x0e, 0x1a, 0x52,
-- 0x18, 0x79, 0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff,
-- 0xfe, 0x6b, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x02,
-- 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x6e, 0x99, 0x03,
-- 0x18, 0x08, 0x22, 0x1b, 0xb4, 0x04, 0x9a, 0x0e,
-- 0x1a, 0x12, 0x18, 0x39, 0x20, 0xc1, 0x1c, 0x23,
-- 0xf7, 0xff, 0xfe, 0x5a, 0xb0, 0x01, 0x28, 0x00,
-- 0xda, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x5d,
-- 0x9a, 0x09, 0x74, 0x96, 0x9a, 0x09, 0x7c, 0x91,
-- 0xa0, 0x5d, 0xf0, 0x0f, 0xfe, 0xa5, 0xe0, 0xf4,
-- 0x98, 0x14, 0x28, 0x1a, 0xd1, 0x2f, 0x98, 0x04,
-- 0x28, 0x0e, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b,
-- 0xe6, 0x4c, 0x78, 0xb8, 0x28, 0x41, 0xd1, 0x02,
-- 0x78, 0xf8, 0x28, 0x02, 0xd0, 0x02, 0x42, 0x68,
-- 0xb0, 0x0b, 0xe6, 0x43, 0xa0, 0x5a, 0xf0, 0x0f,
-- 0xfe, 0x05, 0x99, 0x0a, 0x1c, 0x02, 0xa0, 0x58,
-- 0xf0, 0x0f, 0xfe, 0xba, 0x28, 0x00, 0xd0, 0x02,
-- 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x36, 0xa0, 0x54,
-- 0xf0, 0x0f, 0xfd, 0xf8, 0x19, 0xc0, 0x1d, 0x01,
-- 0x1d, 0xe0, 0x30, 0x66, 0x22, 0x04, 0x1c, 0x07,
-- 0xf0, 0x0f, 0xfe, 0x2c, 0x20, 0x00, 0x9a, 0x09,
-- 0x74, 0x50, 0x1c, 0x3a, 0xa1, 0x4c, 0xa0, 0x4f,
-- 0xf0, 0x0f, 0xfe, 0x72, 0xe0, 0xc1, 0x98, 0x14,
-- 0x28, 0x1b, 0xd1, 0x11, 0xa0, 0x4f, 0xf0, 0x0f,
-- 0xfd, 0xe1, 0x1c, 0x31, 0x1c, 0x02, 0xa0, 0x4d,
-- 0xf0, 0x0f, 0xfe, 0x96, 0x28, 0x00, 0xd0, 0x02,
-- 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x12, 0xa1, 0x49,
-- 0xa0, 0x4b, 0xf0, 0x0f, 0xfe, 0x5d, 0xe0, 0xac,
-- 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x0a, 0xa0, 0x4c,
-- 0xf0, 0x0f, 0xfd, 0xcc, 0x1c, 0x31, 0x1c, 0x02,
-- 0xa0, 0x49, 0xf0, 0x0f, 0xfe, 0x81, 0x28, 0x00,
-- 0xe0, 0x96, 0x00, 0x00, 0x74, 0x75, 0x70, 0x6c,
-- 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20,
-- 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x74,
-- 0x75, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x30,
-- 0x78, 0x25, 0x30, 0x32, 0x78, 0x20, 0x6e, 0x6f,
-- 0x74, 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78,
-- 0x0a, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73,
-- 0x5f, 0x31, 0x3a, 0x20, 0x25, 0x64, 0x2e, 0x25,
-- 0x64, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00,
-- 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, 0x00,
-- 0x6d, 0x61, 0x6e, 0x66, 0x69, 0x64, 0x3a, 0x20,
-- 0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x20, 0x20,
-- 0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00,
-- 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x62,
-- 0x61, 0x73, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25,
-- 0x30, 0x34, 0x78, 0x20, 0x00, 0x00, 0x00, 0x00,
-- 0x6d, 0x61, 0x73, 0x6b, 0x3a, 0x20, 0x30, 0x78,
-- 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x32, 0x78,
-- 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
-- 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64,
-- 0x65, 0x78, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30,
-- 0x32, 0x78, 0x0a, 0x00, 0x63, 0x6f, 0x6e, 0x66,
-- 0x69, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65,
-- 0x20, 0x6e, 0x62, 0x3a, 0x20, 0x30, 0x78, 0x25,
-- 0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00,
-- 0x63, 0x66, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c,
-- 0x65, 0x20, 0x63, 0x6f, 0x72, 0x20, 0x76, 0x61,
-- 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25,
-- 0x30, 0x32, 0x78, 0x20, 0x0a, 0x00, 0x00, 0x00,
-- 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x56,
-- 0x00, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73,
-- 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x25, 0x73, 0x25,
-- 0x73, 0x0a, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f,
-- 0x48, 0x4f, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00,
-- 0x73, 0x74, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x3a,
-- 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00,
-- 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x4d,
-- 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x00, 0x00, 0x00,
-- 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe5, 0x65,
-- 0x46, 0x79, 0x39, 0x1c, 0xa0, 0x04, 0xf0, 0x0f,
-- 0xfd, 0xaf, 0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5d,
-- 0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5a, 0x00, 0x00,
-- 0x73, 0x74, 0x63, 0x65, 0x5f, 0x70, 0x64, 0x3a,
-- 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00,
-- 0xb5, 0xf0, 0x26, 0x00, 0x1c, 0x04, 0x20, 0x00,
-- 0x67, 0x60, 0x1c, 0x0d, 0x1c, 0x17, 0xe0, 0x00,
-- 0x36, 0x01, 0x42, 0xbe, 0xda, 0x02, 0x5d, 0xa8,
-- 0x28, 0x1d, 0xd1, 0xf9, 0x22, 0x00, 0xb4, 0x04,
-- 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1d, 0x1c, 0x23,
-- 0xf7, 0xff, 0xfd, 0x32, 0xb0, 0x01, 0x28, 0x00,
-- 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0x22, 0x00,
-- 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1c,
-- 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x21, 0xb0, 0x01,
-- 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36,
-- 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9,
-- 0x20, 0x15, 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x10,
-- 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00,
-- 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba,
-- 0x19, 0xa9, 0x20, 0x20, 0x1c, 0x23, 0xf7, 0xff,
-- 0xfc, 0xff, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04,
-- 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04,
-- 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1a, 0x1c, 0x23,
-- 0xf7, 0xff, 0xfc, 0xee, 0xb0, 0x01, 0x28, 0x00,
-- 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0xe0, 0x10,
-- 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9,
-- 0x20, 0x1b, 0x1c, 0x23, 0xf7, 0xff, 0xfc, 0xdc,
-- 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00,
-- 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x18, 0x36, 0x42, 0xbe, 0xda, 0x02, 0x6f, 0x60,
-- 0x28, 0x00, 0xd0, 0xe9, 0x22, 0x00, 0xb4, 0x04,
-- 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x14, 0x1c, 0x23,
-- 0xf7, 0xff, 0xfc, 0xc6, 0xb0, 0x01, 0x28, 0x00,
-- 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf7, 0x06, 0x0e,
-- 0x0e, 0x36, 0xb0, 0x83, 0xf0, 0x0c, 0xfc, 0x40,
-- 0x1c, 0x05, 0xd0, 0x05, 0x00, 0xa8, 0x30, 0x0c,
-- 0xf7, 0xfc, 0xfc, 0x2c, 0x1c, 0x04, 0xd1, 0x01,
-- 0x20, 0x00, 0xe0, 0x22, 0x95, 0x01, 0x1d, 0xe0,
-- 0x30, 0x05, 0x90, 0x02, 0x46, 0x6a, 0xb4, 0x04,
-- 0x25, 0x00, 0x98, 0x04, 0x1c, 0x31, 0xaa, 0x02,
-- 0x1c, 0x2b, 0x1c, 0x27, 0xf0, 0x0c, 0xf9, 0xe6,
-- 0xb0, 0x01, 0x98, 0x00, 0x60, 0x38, 0x28, 0x00,
-- 0xd0, 0x0b, 0x99, 0x05, 0xf0, 0x0c, 0xfb, 0xbc,
-- 0x28, 0x00, 0xd1, 0x02, 0x60, 0x7d, 0x1c, 0x38,
-- 0xe0, 0x07, 0x68, 0x38, 0xa9, 0x01, 0xf0, 0x0c,
-- 0xfa, 0x05, 0x1c, 0x20, 0xf7, 0xfc, 0xfc, 0x28,
-- 0x1c, 0x28, 0xb0, 0x03, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x0b,
-- 0x9e, 0x09, 0xb0, 0x8b, 0x4a, 0x7c, 0x92, 0x0a,
-- 0x4d, 0x7c, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00,
-- 0x00, 0x81, 0x9a, 0x0a, 0x58, 0x51, 0x29, 0x00,
-- 0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x16, 0x30, 0x01,
-- 0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x12, 0x2c, 0x08,
-- 0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0a,
-- 0x58, 0x10, 0x28, 0x00, 0xd0, 0x0a, 0x20, 0x00,
-- 0xe0, 0xd8, 0x23, 0x20, 0x5e, 0xec, 0x1c, 0x60,
-- 0x84, 0x28, 0x5e, 0xe8, 0x28, 0x00, 0xd1, 0x01,
-- 0x20, 0x64, 0x84, 0x28, 0x98, 0x15, 0x28, 0x00,
-- 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x22, 0x01,
-- 0xe0, 0x02, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x03,
-- 0x92, 0x01, 0x1c, 0x30, 0xf0, 0x08, 0xfd, 0xf5,
-- 0x90, 0x00, 0x00, 0x80, 0x30, 0x80, 0xf7, 0xfc,
-- 0xfb, 0xc5, 0x1c, 0x07, 0xd0, 0xdf, 0x98, 0x00,
-- 0x1d, 0xc2, 0x32, 0x79, 0x21, 0x00, 0x1c, 0x38,
-- 0xf0, 0x0f, 0xfc, 0x2e, 0x98, 0x00, 0x60, 0xf8,
-- 0x1d, 0xf8, 0x30, 0x79, 0x61, 0x38, 0x98, 0x0d,
-- 0x86, 0x78, 0x98, 0x0e, 0x86, 0xb8, 0x98, 0x0b,
-- 0x90, 0x02, 0x99, 0x0c, 0x91, 0x03, 0x9a, 0x0d,
-- 0x18, 0x80, 0x38, 0x01, 0x90, 0x04, 0x98, 0x0e,
-- 0x18, 0x08, 0x38, 0x01, 0x90, 0x05, 0xa8, 0x02,
-- 0x1c, 0x31, 0xf0, 0x08, 0xfd, 0xd5, 0x61, 0x78,
-- 0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x0e, 0x2a, 0x01,
-- 0xd1, 0x27, 0x00, 0x80, 0xf7, 0xfc, 0xfb, 0x9a,
-- 0x61, 0xb8, 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79,
-- 0x00, 0x8a, 0x21, 0x00, 0xf0, 0x0f, 0xfc, 0x04,
-- 0x20, 0x01, 0xe0, 0x14, 0x23, 0x28, 0x5e, 0xe8,
-- 0x1c, 0x41, 0x85, 0x29, 0x28, 0x00, 0xd1, 0x01,
-- 0xf7, 0xf7, 0xf8, 0x5e, 0x69, 0x78, 0x00, 0x80,
-- 0xf7, 0xfc, 0xfb, 0xcc, 0x61, 0xb8, 0x28, 0x00,
-- 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00,
-- 0xf0, 0x0f, 0xfb, 0xee, 0x20, 0x00, 0x86, 0x38,
-- 0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, 0x43, 0x18,
-- 0xe0, 0x10, 0x98, 0x15, 0x61, 0xb8, 0x98, 0x15,
-- 0x0e, 0x00, 0x06, 0x00, 0x90, 0x15, 0x23, 0x0d,
-- 0x06, 0x9b, 0x42, 0xd8, 0xd1, 0x01, 0x20, 0x00,
-- 0xe0, 0x00, 0x20, 0x01, 0x86, 0x38, 0x69, 0xf8,
-- 0x4b, 0x33, 0x40, 0x18, 0x61, 0xf8, 0x69, 0xb8,
-- 0x28, 0x00, 0xd1, 0x06, 0x69, 0x78, 0x28, 0x00,
-- 0xd0, 0x03, 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x7c,
-- 0xe7, 0x75, 0x68, 0xf8, 0x90, 0x06, 0x69, 0x38,
-- 0x90, 0x07, 0x69, 0x78, 0x90, 0x08, 0x69, 0xb8,
-- 0x90, 0x09, 0xa8, 0x02, 0x1c, 0x21, 0x1d, 0xfa,
-- 0x32, 0x01, 0xb4, 0x07, 0x1c, 0x32, 0xb4, 0x04,
-- 0x20, 0x00, 0x9a, 0x05, 0xa9, 0x0a, 0xab, 0x0c,
-- 0xf0, 0x03, 0xf8, 0xa0, 0xb0, 0x04, 0x28, 0x00,
-- 0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x5f,
-- 0xe7, 0x59, 0x2e, 0x00, 0xd0, 0x09, 0x2e, 0x01,
-- 0xd0, 0x07, 0x2e, 0x02, 0xd0, 0x05, 0x2e, 0x03,
-- 0xd0, 0x03, 0x23, 0x02, 0x69, 0xf8, 0x43, 0x18,
-- 0x61, 0xf8, 0x85, 0xfc, 0x2c, 0x08, 0xd2, 0x02,
-- 0x00, 0xa0, 0x9a, 0x0a, 0x50, 0x17, 0x20, 0x01,
-- 0x24, 0x00, 0x63, 0xf8, 0x63, 0xbc, 0x85, 0xbe,
-- 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x18,
-- 0x8c, 0xa8, 0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38,
-- 0xf0, 0x00, 0xf8, 0xcb, 0x22, 0x00, 0x21, 0x00,
-- 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xa0, 0x98, 0x17,
-- 0x60, 0x38, 0x98, 0x17, 0x28, 0x00, 0xd0, 0x06,
-- 0x22, 0x00, 0x21, 0x03, 0x1c, 0x23, 0x9c, 0x17,
-- 0x1c, 0x38, 0xf0, 0x0f, 0xfa, 0xc1, 0x68, 0xb8,
-- 0x60, 0x78, 0x1c, 0x38, 0xb0, 0x0b, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c,
-- 0xff, 0xff, 0x7f, 0xff, 0xb5, 0x80, 0x1c, 0x07,
-- 0xb0, 0x82, 0x28, 0x00, 0xd0, 0x13, 0x68, 0x78,
-- 0x28, 0x00, 0xd1, 0x10, 0x68, 0xb8, 0x90, 0x00,
-- 0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x46, 0x69,
-- 0x68, 0x38, 0xf0, 0x0c, 0xf8, 0xe7, 0x22, 0x0c,
-- 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x58,
-- 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x05, 0xb0, 0x02,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90,
-- 0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, 0xd1, 0x03,
-- 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x00, 0x23, 0x00, 0x49, 0x22, 0x00, 0x82,
-- 0x58, 0x8c, 0x42, 0xbc, 0xd1, 0x00, 0x50, 0x8b,
-- 0x30, 0x01, 0x28, 0x08, 0xdb, 0xf7, 0x21, 0x00,
-- 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xc8, 0x68, 0xf8,
-- 0x90, 0x00, 0x69, 0x38, 0x90, 0x01, 0x69, 0x78,
-- 0x90, 0x02, 0x69, 0xb8, 0x90, 0x03, 0x46, 0x68,
-- 0x1d, 0xc2, 0x32, 0x01, 0x46, 0x69, 0x68, 0xb8,
-- 0xf0, 0x03, 0xfb, 0x24, 0x6a, 0x38, 0x28, 0x00,
-- 0xd0, 0x03, 0x68, 0x41, 0x39, 0x01, 0x60, 0x41,
-- 0x30, 0x04, 0x69, 0xf8, 0x0c, 0x00, 0xd3, 0x16,
-- 0x23, 0x30, 0x5e, 0xf8, 0x28, 0x00, 0xd1, 0x0d,
-- 0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xf9, 0x48, 0x0d,
-- 0x8d, 0x01, 0x39, 0x01, 0x04, 0x09, 0x14, 0x09,
-- 0x85, 0x01, 0xd1, 0x08, 0x20, 0xff, 0xf7, 0xf6,
-- 0xff, 0x73, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02,
-- 0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xb9, 0x22, 0x80,
-- 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x04,
-- 0x1c, 0x38, 0xf7, 0xfc, 0xfa, 0xb1, 0xe7, 0xb3,
-- 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c,
-- 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08,
-- 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 0xd1, 0x08,
-- 0x20, 0xff, 0x30, 0x01, 0x47, 0x70, 0x20, 0x02,
-- 0x47, 0x70, 0x20, 0x04, 0x47, 0x70, 0x20, 0x10,
-- 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 0xb5, 0x90,
-- 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, 0x06, 0x14,
-- 0x0e, 0x24, 0x28, 0x00, 0xd0, 0x0a, 0x21, 0x03,
-- 0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x1f, 0x68, 0xb8,
-- 0x1c, 0x21, 0xf0, 0x04, 0xfc, 0xc7, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x68, 0xb8,
-- 0xf0, 0x04, 0xfc, 0x14, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0xd0, 0x02,
-- 0x68, 0x80, 0x21, 0x02, 0xe0, 0x01, 0x68, 0x80,
-- 0x21, 0x00, 0xf0, 0x04, 0xfc, 0x07, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0x0e, 0x09,
-- 0x28, 0x00, 0xd0, 0x02, 0x68, 0x80, 0xf0, 0x04,
-- 0xfe, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0,
-- 0x23, 0x05, 0x43, 0x18, 0x4d, 0x08, 0x84, 0xa8,
-- 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, 0x58, 0x20,
-- 0x8c, 0xa9, 0x06, 0x09, 0x0e, 0x09, 0xf7, 0xff,
-- 0xff, 0xe8, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xf5,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c,
-- 0x48, 0x01, 0x23, 0x24, 0x5e, 0xc0, 0x47, 0x70,
-- 0x2e, 0x08, 0x1a, 0x4c, 0xb5, 0x90, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x28, 0x00, 0xd0, 0x15, 0x6a, 0x20,
-- 0x28, 0x00, 0xd0, 0x06, 0x42, 0xb8, 0xd0, 0x10,
-- 0x68, 0x41, 0x39, 0x01, 0x60, 0x41, 0x20, 0x00,
-- 0x62, 0x20, 0x2f, 0x00, 0xd0, 0x09, 0x68, 0xa0,
-- 0x68, 0x39, 0xf0, 0x0c, 0xf8, 0x19, 0x28, 0x00,
-- 0xd1, 0x03, 0x62, 0x27, 0x68, 0x78, 0x30, 0x01,
-- 0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0x00, 0x06, 0x09, 0xd0, 0x01, 0x21, 0x01,
-- 0xe0, 0x00, 0x21, 0x00, 0x68, 0x80, 0xf0, 0x04,
-- 0xfd, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90,
-- 0x1c, 0x07, 0x1c, 0x0c, 0xd0, 0x01, 0x21, 0x01,
-- 0xe0, 0x00, 0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04,
-- 0xf8, 0xa5, 0x2c, 0x00, 0xd0, 0x03, 0x23, 0x01,
-- 0x69, 0xf8, 0x43, 0x18, 0xe0, 0x02, 0x69, 0xf8,
-- 0x08, 0x40, 0x00, 0x40, 0x61, 0xf8, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x21, 0x07,
-- 0x07, 0x09, 0x63, 0x88, 0x47, 0x70, 0x00, 0x00,
-- 0xb5, 0x90, 0x9c, 0x03, 0x9f, 0x04, 0xb0, 0x85,
-- 0x91, 0x00, 0x92, 0x01, 0x93, 0x02, 0x94, 0x03,
-- 0x97, 0x04, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0a,
-- 0xff, 0x69, 0xb0, 0x05, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x86, 0x98, 0x06,
-- 0x6a, 0x40, 0x68, 0xc3, 0x93, 0x05, 0x98, 0x06,
-- 0x6b, 0xc0, 0x01, 0x80, 0x06, 0x05, 0x0e, 0x2d,
-- 0x95, 0x00, 0x68, 0x18, 0x01, 0x00, 0x30, 0x1f,
-- 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 0x90, 0x04,
-- 0x99, 0x07, 0x68, 0x48, 0x99, 0x04, 0x43, 0x48,
-- 0x99, 0x07, 0x68, 0x09, 0x08, 0xc9, 0x18, 0x0f,
-- 0x97, 0x03, 0x21, 0x00, 0x91, 0x02, 0x9b, 0x05,
-- 0x68, 0x58, 0x28, 0x00, 0xdd, 0x5e, 0x23, 0x32,
-- 0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58,
-- 0x9a, 0x08, 0x18, 0x81, 0x1c, 0x08, 0xd5, 0x00,
-- 0x30, 0x03, 0x10, 0x80, 0x29, 0x00, 0xda, 0x04,
-- 0x42, 0x49, 0x07, 0x89, 0x0f, 0x89, 0x42, 0x49,
-- 0xe0, 0x01, 0x07, 0x89, 0x0f, 0x89, 0x00, 0x4a,
-- 0x9d, 0x00, 0x41, 0x15, 0x1c, 0x2b, 0x06, 0x2d,
-- 0x0e, 0x2d, 0x27, 0xc0, 0x40, 0xd7, 0x06, 0x3a,
-- 0x0e, 0x12, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18,
-- 0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x33, 0x88,
-- 0x78, 0x1f, 0x33, 0x01, 0x93, 0x01, 0x24, 0x00,
-- 0x9b, 0x07, 0x68, 0x9b, 0x2b, 0x00, 0xd9, 0x23,
-- 0x0a, 0x3b, 0xd3, 0x05, 0x78, 0x03, 0x43, 0x93,
-- 0x70, 0x03, 0x78, 0x03, 0x43, 0x2b, 0x70, 0x03,
-- 0x31, 0x01, 0x29, 0x03, 0xdd, 0x04, 0x22, 0xc0,
-- 0x21, 0x00, 0x9d, 0x00, 0x30, 0x01, 0xe0, 0x05,
-- 0x10, 0x92, 0x06, 0x12, 0x0e, 0x12, 0x10, 0xab,
-- 0x06, 0x1d, 0x0e, 0x2d, 0x00, 0x7b, 0x06, 0x1f,
-- 0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x03,
-- 0x9b, 0x01, 0x78, 0x1f, 0x33, 0x01, 0x93, 0x01,
-- 0x9b, 0x07, 0x68, 0x9b, 0x42, 0xa3, 0xd8, 0xdb,
-- 0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03,
-- 0x9b, 0x09, 0x33, 0x01, 0x93, 0x09, 0x99, 0x02,
-- 0x31, 0x01, 0x91, 0x02, 0x9b, 0x05, 0x68, 0x58,
-- 0x42, 0x88, 0xdc, 0xa0, 0xb0, 0x06, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff,
-- 0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3,
-- 0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x07, 0x06,
-- 0x0f, 0x36, 0x96, 0x00, 0x01, 0x30, 0x06, 0x06,
-- 0x0e, 0x36, 0x96, 0x01, 0x68, 0x18, 0x01, 0x00,
-- 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0,
-- 0x90, 0x04, 0x68, 0x48, 0x9a, 0x04, 0x43, 0x50,
-- 0x68, 0x0a, 0x08, 0xd2, 0x18, 0x17, 0x97, 0x03,
-- 0x22, 0x00, 0x92, 0x02, 0x9b, 0x05, 0x68, 0x58,
-- 0x28, 0x00, 0xdd, 0x48, 0x23, 0x32, 0x98, 0x06,
-- 0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08,
-- 0x18, 0x82, 0x1c, 0x10, 0xd5, 0x00, 0x30, 0x01,
-- 0x10, 0x40, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18,
-- 0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x1d, 0xdd,
-- 0x35, 0x81, 0x78, 0x2f, 0x24, 0x00, 0x68, 0x8b,
-- 0x35, 0x01, 0x2b, 0x00, 0xd9, 0x21, 0x0a, 0x3b,
-- 0xd3, 0x10, 0x08, 0x53, 0xd3, 0x06, 0x78, 0x06,
-- 0x23, 0xf0, 0x40, 0x33, 0x70, 0x03, 0x78, 0x03,
-- 0x9e, 0x00, 0xe0, 0x05, 0x78, 0x03, 0x07, 0x1b,
-- 0x0f, 0x1b, 0x70, 0x03, 0x78, 0x03, 0x9e, 0x01,
-- 0x43, 0x33, 0x70, 0x03, 0x32, 0x01, 0x08, 0x53,
-- 0xd2, 0x00, 0x30, 0x01, 0x00, 0x7b, 0x06, 0x1f,
-- 0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x01,
-- 0x78, 0x2f, 0x35, 0x01, 0x68, 0x8b, 0x42, 0xa3,
-- 0xd8, 0xdd, 0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f,
-- 0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, 0x93, 0x09,
-- 0x9a, 0x02, 0x32, 0x01, 0x92, 0x02, 0x9b, 0x05,
-- 0x68, 0x58, 0x42, 0x90, 0xdc, 0xb6, 0xb0, 0x06,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x6a, 0x40,
-- 0x68, 0xc4, 0x98, 0x03, 0x6b, 0xc0, 0x06, 0x03,
-- 0x0e, 0x1b, 0x93, 0x00, 0x68, 0x20, 0x01, 0x00,
-- 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc2,
-- 0x92, 0x02, 0x68, 0x48, 0x43, 0x50, 0x68, 0x0a,
-- 0x08, 0xd2, 0x18, 0x10, 0x90, 0x01, 0x25, 0x00,
-- 0x68, 0x60, 0x28, 0x00, 0xdd, 0x35, 0x23, 0x32,
-- 0x98, 0x03, 0x5e, 0xc0, 0x9b, 0x06, 0x43, 0x58,
-- 0x9a, 0x05, 0x18, 0x80, 0x9a, 0x03, 0x69, 0x92,
-- 0x18, 0x17, 0x98, 0x01, 0x18, 0x20, 0x1d, 0xc6,
-- 0x36, 0x81, 0x78, 0x32, 0x20, 0x00, 0x68, 0x8b,
-- 0x36, 0x01, 0x2b, 0x00, 0xd9, 0x16, 0x0a, 0x13,
-- 0xd3, 0x01, 0x9b, 0x00, 0x70, 0x3b, 0x00, 0x52,
-- 0x06, 0x12, 0x0e, 0x12, 0xd1, 0x09, 0x1d, 0xc2,
-- 0x32, 0x01, 0x08, 0xd2, 0x00, 0xd2, 0x1a, 0x10,
-- 0x19, 0xc7, 0x1c, 0x10, 0x78, 0x32, 0x36, 0x01,
-- 0xe0, 0x01, 0x30, 0x01, 0x37, 0x01, 0x68, 0x8b,
-- 0x42, 0x83, 0xd8, 0xe8, 0x98, 0x01, 0x9a, 0x02,
-- 0x18, 0x80, 0x90, 0x01, 0x9b, 0x06, 0x33, 0x01,
-- 0x93, 0x06, 0x68, 0x60, 0x35, 0x01, 0x42, 0xa8,
-- 0xdc, 0xc9, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x2c,
-- 0x1c, 0x07, 0x5e, 0xc0, 0xb0, 0x85, 0x28, 0x01,
-- 0xd0, 0x0f, 0x28, 0x02, 0xd0, 0x07, 0x28, 0x03,
-- 0xd1, 0x11, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0x9a, 0xe0, 0x5d, 0xab, 0x06,
-- 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x23,
-- 0xe0, 0x57, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfe, 0x97, 0xe0, 0x51, 0x6a, 0x78,
-- 0x68, 0xc0, 0x90, 0x04, 0x68, 0x00, 0x01, 0x00,
-- 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0,
-- 0x90, 0x03, 0x99, 0x06, 0x68, 0x48, 0x99, 0x03,
-- 0x43, 0x48, 0x99, 0x06, 0x68, 0x09, 0x08, 0xc9,
-- 0x18, 0x09, 0x91, 0x02, 0x21, 0x00, 0x91, 0x01,
-- 0x98, 0x04, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x38,
-- 0x98, 0x04, 0x99, 0x02, 0x9e, 0x07, 0x18, 0x40,
-- 0x30, 0x88, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00,
-- 0x24, 0x00, 0x99, 0x06, 0x68, 0x88, 0x28, 0x00,
-- 0xd9, 0x1d, 0x0a, 0x28, 0xd3, 0x05, 0x68, 0xb8,
-- 0x6b, 0xfb, 0x9a, 0x08, 0x1c, 0x31, 0xf0, 0x0a,
-- 0xfb, 0x87, 0x00, 0x68, 0x06, 0x05, 0x0e, 0x2d,
-- 0xd1, 0x0b, 0x1d, 0xe0, 0x30, 0x01, 0x08, 0xc0,
-- 0x00, 0xc0, 0x1b, 0x01, 0x19, 0x8e, 0x1c, 0x04,
-- 0x98, 0x00, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00,
-- 0xe0, 0x01, 0x34, 0x01, 0x36, 0x01, 0x99, 0x06,
-- 0x68, 0x88, 0x42, 0xa0, 0xd8, 0xe1, 0x98, 0x03,
-- 0x99, 0x02, 0x18, 0x09, 0x91, 0x02, 0x9a, 0x08,
-- 0x32, 0x01, 0x92, 0x08, 0x99, 0x01, 0x31, 0x01,
-- 0x91, 0x01, 0x98, 0x04, 0x68, 0x40, 0x42, 0x88,
-- 0xdc, 0xc6, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07,
-- 0x20, 0x00, 0xb0, 0x88, 0xf0, 0x08, 0xfa, 0x35,
-- 0x90, 0x06, 0x00, 0x80, 0x30, 0x10, 0x00, 0x80,
-- 0xf7, 0xfc, 0xf8, 0x04, 0x1c, 0x04, 0x20, 0x00,
-- 0x2c, 0x00, 0xd1, 0x03, 0xb0, 0x08, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x1d, 0xe1, 0x31, 0x09,
-- 0x91, 0x07, 0x49, 0x19, 0x68, 0x4b, 0x1c, 0x5a,
-- 0x60, 0x4a, 0x60, 0x63, 0x60, 0xe7, 0x68, 0x39,
-- 0x01, 0x09, 0x31, 0x1f, 0x09, 0x49, 0x01, 0x49,
-- 0x90, 0x00, 0x90, 0x01, 0x1e, 0x48, 0x90, 0x02,
-- 0x68, 0xe0, 0x68, 0x40, 0x00, 0xc0, 0x38, 0x01,
-- 0x90, 0x03, 0x46, 0x68, 0x21, 0x00, 0xf0, 0x08,
-- 0xfa, 0x13, 0x60, 0xa0, 0x68, 0xe0, 0x30, 0x88,
-- 0x90, 0x05, 0x68, 0xa0, 0x90, 0x04, 0x46, 0x68,
-- 0x1c, 0x22, 0x68, 0x61, 0xb4, 0x07, 0x22, 0x00,
-- 0xb4, 0x04, 0x22, 0x01, 0x20, 0x00, 0xa9, 0x0a,
-- 0xab, 0x08, 0xf0, 0x02, 0xfd, 0x2b, 0xb0, 0x04,
-- 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0xf7, 0xfb,
-- 0xff, 0xeb, 0x24, 0x00, 0x1c, 0x20, 0xe7, 0xc5,
-- 0x2e, 0x08, 0x1a, 0x78, 0xb5, 0x80, 0x1c, 0x07,
-- 0xb0, 0x84, 0x28, 0x00, 0xd0, 0x1a, 0x20, 0x00,
-- 0xf0, 0x08, 0xf9, 0xe7, 0x90, 0x00, 0x1d, 0xf8,
-- 0x30, 0x09, 0x90, 0x01, 0x68, 0xb8, 0x90, 0x02,
-- 0x68, 0xf8, 0x30, 0x88, 0x90, 0x03, 0x46, 0x68,
-- 0x46, 0x69, 0x1d, 0xc2, 0x32, 0x01, 0x68, 0x38,
-- 0xf0, 0x03, 0xf8, 0x18, 0x22, 0x10, 0x21, 0x00,
-- 0x1c, 0x38, 0xf0, 0x0f, 0xf8, 0x19, 0x1c, 0x38,
-- 0xf7, 0xfb, 0xff, 0xc6, 0xb0, 0x04, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x32,
-- 0x1c, 0x07, 0x5e, 0xc0, 0x1c, 0x0c, 0x1c, 0x15,
-- 0xb0, 0x8a, 0x42, 0x90, 0xdd, 0x63, 0x6a, 0x78,
-- 0x28, 0x00, 0xd1, 0x0b, 0x4e, 0x38, 0x68, 0x30,
-- 0x28, 0x00, 0xd1, 0x05, 0x48, 0x37, 0xf7, 0xff,
-- 0xff, 0x7d, 0x60, 0x30, 0x28, 0x00, 0xd0, 0x61,
-- 0x68, 0x30, 0x62, 0x78, 0x23, 0x01, 0x6b, 0xb8,
-- 0x6a, 0x79, 0x42, 0xd8, 0xd1, 0x01, 0x22, 0x01,
-- 0xe0, 0x00, 0x22, 0x00, 0x92, 0x01, 0x68, 0xc8,
-- 0x90, 0x00, 0x68, 0x00, 0x90, 0x04, 0x98, 0x00,
-- 0x68, 0x40, 0x90, 0x03, 0x6b, 0xf8, 0x28, 0x01,
-- 0xd1, 0x01, 0x90, 0x02, 0xe0, 0x11, 0x20, 0x00,
-- 0x90, 0x02, 0x9a, 0x01, 0x2a, 0x00, 0xd1, 0x0c,
-- 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x57, 0x6b, 0xba,
-- 0x99, 0x03, 0xb4, 0x06, 0x1c, 0x03, 0x9a, 0x0f,
-- 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfd, 0x80,
-- 0xb0, 0x02, 0x99, 0x03, 0x91, 0x08, 0x20, 0x01,
-- 0x90, 0x09, 0x78, 0x20, 0x28, 0x00, 0xd0, 0x31,
-- 0x23, 0x32, 0x5e, 0xf8, 0x42, 0xa8, 0xdd, 0x22,
-- 0x78, 0x20, 0x99, 0x00, 0xf0, 0x00, 0xf8, 0x34,
-- 0x90, 0x07, 0x1c, 0x06, 0x78, 0x20, 0x07, 0x00,
-- 0x0f, 0x00, 0x99, 0x04, 0x43, 0x48, 0x90, 0x05,
-- 0x78, 0x20, 0x09, 0x00, 0x07, 0x40, 0x0f, 0x40,
-- 0x99, 0x03, 0x43, 0x48, 0x90, 0x06, 0x98, 0x02,
-- 0x34, 0x01, 0x28, 0x00, 0xd0, 0x0c, 0x99, 0x0d,
-- 0x9a, 0x01, 0xb4, 0x06, 0x6a, 0x78, 0x68, 0xb9,
-- 0x68, 0x00, 0xaa, 0x07, 0x1c, 0x2b, 0xf0, 0x0a,
-- 0xfd, 0x8b, 0xb0, 0x02, 0xe0, 0x06, 0xe0, 0x09,
-- 0x9b, 0x0d, 0x1c, 0x38, 0xa9, 0x05, 0x1c, 0x2a,
-- 0xf7, 0xff, 0xfe, 0xa8, 0x19, 0xad, 0x78, 0x20,
-- 0x28, 0x00, 0xd1, 0xcd, 0xb0, 0x0a, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44,
-- 0x29, 0x00, 0xd1, 0x00, 0x49, 0x02, 0x06, 0x40,
-- 0x0e, 0x40, 0x18, 0x40, 0x7a, 0x00, 0x47, 0x70,
-- 0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xb0, 0x1c, 0x04,
-- 0x1c, 0x0f, 0xd1, 0x08, 0x4f, 0x0c, 0x68, 0x38,
-- 0x28, 0x00, 0xd1, 0x03, 0x48, 0x0b, 0xf7, 0xff,
-- 0xfe, 0xf9, 0x60, 0x38, 0x68, 0x3f, 0x25, 0x00,
-- 0x78, 0x20, 0x28, 0x00, 0xd0, 0x08, 0x78, 0x20,
-- 0x68, 0xf9, 0x34, 0x01, 0xf7, 0xff, 0xff, 0xe0,
-- 0x19, 0x45, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xf6,
-- 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44,
-- 0xb5, 0x80, 0x28, 0x00, 0xd1, 0x08, 0x4f, 0x09,
-- 0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, 0x48, 0x08,
-- 0xf7, 0xff, 0xfe, 0xd8, 0x60, 0x38, 0x68, 0x38,
-- 0x28, 0x00, 0xd1, 0x02, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0xc0, 0x68, 0x40, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x78,
-- 0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xf0, 0xb0, 0x83,
-- 0x4a, 0x18, 0x21, 0x00, 0x20, 0xff, 0x30, 0x01,
-- 0xf7, 0xff, 0xfa, 0x98, 0x49, 0x16, 0x27, 0x00,
-- 0x64, 0x08, 0x49, 0x16, 0x91, 0x02, 0x49, 0x16,
-- 0x91, 0x01, 0x49, 0x16, 0x91, 0x00, 0x4c, 0x16,
-- 0x01, 0x38, 0x06, 0x01, 0x0e, 0x09, 0x20, 0x10,
-- 0x1c, 0x22, 0x1c, 0x0d, 0xf7, 0xff, 0xfa, 0x86,
-- 0x00, 0xbe, 0x99, 0x02, 0x51, 0x88, 0x20, 0x04,
-- 0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x7e,
-- 0x99, 0x01, 0x51, 0x88, 0x20, 0x02, 0x1c, 0x29,
-- 0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x77, 0x99, 0x00,
-- 0x51, 0x88, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xe3,
-- 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xc0,
-- 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50,
-- 0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x90,
-- 0x2e, 0x08, 0x1a, 0x80, 0xb5, 0x80, 0x48, 0x0c,
-- 0xf7, 0xff, 0xfe, 0x84, 0x4f, 0x0b, 0x64, 0x78,
-- 0x48, 0x0b, 0xf7, 0xff, 0xfe, 0x7f, 0x64, 0xb8,
-- 0x48, 0x0a, 0xf7, 0xff, 0xfe, 0x7b, 0x64, 0xf8,
-- 0x20, 0x00, 0x22, 0x00, 0x49, 0x08, 0x00, 0x83,
-- 0x50, 0xca, 0x30, 0x01, 0x28, 0x10, 0xdb, 0xfa,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x02, 0x5e, 0x2c, 0x2e, 0x08, 0x1c, 0x80,
-- 0x2e, 0x02, 0x94, 0xb8, 0x2e, 0x02, 0xd7, 0x44,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0x90, 0x04, 0x01,
-- 0x0c, 0x09, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x0b,
-- 0x29, 0x0f, 0xdc, 0x09, 0x00, 0x8c, 0x4f, 0x06,
-- 0x59, 0x39, 0x29, 0x00, 0xd0, 0x04, 0x1c, 0x08,
-- 0xf7, 0xff, 0xfb, 0x85, 0x20, 0x00, 0x51, 0x38,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xff, 0x04, 0x05,
-- 0x0c, 0x2d, 0x04, 0x10, 0x0c, 0x00, 0xb0, 0x82,
-- 0x90, 0x00, 0x04, 0x18, 0x0c, 0x00, 0x90, 0x01,
-- 0x2d, 0x00, 0xd0, 0x01, 0x2d, 0x0f, 0xdd, 0x01,
-- 0x20, 0xff, 0xe0, 0x53, 0x00, 0xaf, 0x4c, 0x2c,
-- 0x59, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x28,
-- 0xf7, 0xff, 0xff, 0xd0, 0x98, 0x00, 0x4a, 0x29,
-- 0x40, 0x02, 0x92, 0x00, 0x23, 0x2d, 0x01, 0x1b,
-- 0x42, 0x9a, 0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00,
-- 0x23, 0x09, 0x01, 0x9b, 0x98, 0x01, 0x42, 0x98,
-- 0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00, 0x2d, 0x08,
-- 0xda, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01,
-- 0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x9a, 0x06,
-- 0xb4, 0x04, 0x20, 0x00, 0x9a, 0x04, 0x9b, 0x05,
-- 0xf7, 0xff, 0xfa, 0x24, 0x51, 0xe0, 0xb0, 0x04,
-- 0x1c, 0x01, 0xd0, 0xd1, 0x48, 0x18, 0x6c, 0x82,
-- 0x62, 0x4a, 0x21, 0x01, 0x59, 0xe2, 0x63, 0xd1,
-- 0x21, 0x00, 0x43, 0xc9, 0x59, 0xe2, 0x63, 0x91,
-- 0x99, 0x03, 0x29, 0x08, 0xd2, 0x10, 0xa3, 0x02,
-- 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x04, 0x06, 0x08, 0x0b, 0x04, 0x06, 0x08, 0x0b,
-- 0x48, 0x0e, 0xe0, 0x02, 0x48, 0x0e, 0xe0, 0x00,
-- 0x48, 0x0e, 0x59, 0xc6, 0xe0, 0x00, 0x6c, 0x06,
-- 0x59, 0xe0, 0x1c, 0x31, 0xf7, 0xff, 0xfb, 0xd6,
-- 0x59, 0xe0, 0x68, 0x80, 0x21, 0x07, 0xf0, 0x04,
-- 0xf9, 0xbd, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0x00, 0x00, 0xff, 0xfe,
-- 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x90,
-- 0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x50,
-- 0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09,
-- 0x14, 0x09, 0x04, 0x16, 0x14, 0x36, 0xb0, 0x85,
-- 0x28, 0x07, 0xdc, 0x29, 0x00, 0x84, 0x4f, 0x21,
-- 0x59, 0x38, 0x28, 0x00, 0xd0, 0x24, 0x08, 0x49,
-- 0x00, 0x49, 0x04, 0x0d, 0x14, 0x2d, 0x68, 0x80,
-- 0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x6b, 0x98, 0x01,
-- 0x19, 0x40, 0x90, 0x01, 0x98, 0x03, 0x19, 0x40,
-- 0x90, 0x03, 0x98, 0x02, 0x19, 0x80, 0x90, 0x02,
-- 0x98, 0x04, 0x19, 0x80, 0x90, 0x04, 0x98, 0x01,
-- 0x49, 0x15, 0x42, 0x88, 0xd8, 0x0c, 0x98, 0x02,
-- 0x42, 0x88, 0xd8, 0x09, 0x23, 0x2d, 0x01, 0x1b,
-- 0x98, 0x01, 0x42, 0x98, 0xda, 0x04, 0x23, 0x09,
-- 0x01, 0x9b, 0x98, 0x02, 0x42, 0x98, 0xdb, 0x01,
-- 0x20, 0xff, 0xe0, 0x12, 0x59, 0x38, 0x68, 0x80,
-- 0xa9, 0x01, 0xf0, 0x02, 0xf8, 0x3b, 0x59, 0x38,
-- 0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xff, 0x0a,
-- 0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38,
-- 0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfc, 0x4e,
-- 0x20, 0x00, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10,
-- 0x80, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x04, 0x07,
-- 0x0c, 0x3f, 0x04, 0x0b, 0x0c, 0x1b, 0x04, 0x16,
-- 0x0c, 0x36, 0x20, 0xff, 0xb0, 0x85, 0x2f, 0x07,
-- 0xdc, 0x10, 0x00, 0xbc, 0x4f, 0x1c, 0x59, 0x39,
-- 0x29, 0x00, 0xd0, 0x0b, 0x08, 0x5a, 0x00, 0x52,
-- 0x04, 0x15, 0x0c, 0x2d, 0x23, 0x2d, 0x01, 0x1b,
-- 0x42, 0x9d, 0xda, 0x03, 0x23, 0x09, 0x01, 0x9b,
-- 0x42, 0x9e, 0xdb, 0x03, 0xb0, 0x05, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x68, 0x88, 0xa9, 0x01,
-- 0xf0, 0x04, 0xfa, 0x0c, 0x98, 0x03, 0x99, 0x01,
-- 0x1a, 0x40, 0x90, 0x03, 0x19, 0x40, 0x90, 0x03,
-- 0x98, 0x04, 0x99, 0x02, 0x1a, 0x40, 0x90, 0x04,
-- 0x19, 0x80, 0x90, 0x04, 0x95, 0x01, 0x96, 0x02,
-- 0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x01,
-- 0xff, 0xed, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69,
-- 0xf0, 0x03, 0xfe, 0xbc, 0x98, 0x00, 0x28, 0x00,
-- 0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01,
-- 0xf0, 0x03, 0xfc, 0x00, 0x20, 0x00, 0xe7, 0xd5,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0x00, 0x04, 0x00,
-- 0x0c, 0x00, 0x00, 0x80, 0x49, 0x04, 0x58, 0x08,
-- 0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x00,
-- 0xf0, 0x03, 0xfb, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0x80, 0x04, 0x01,
-- 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x0c,
-- 0x29, 0x01, 0xdb, 0x0a, 0x00, 0x88, 0x49, 0x06,
-- 0x58, 0x08, 0x27, 0x00, 0x28, 0x00, 0xd0, 0x03,
-- 0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfa, 0x36,
-- 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09,
-- 0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89,
-- 0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01,
-- 0x23, 0x32, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09,
-- 0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89,
-- 0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01,
-- 0x23, 0x34, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x04, 0x03,
-- 0x0c, 0x1b, 0x04, 0x0a, 0x0c, 0x12, 0x20, 0xff,
-- 0x2b, 0x07, 0xdc, 0x10, 0x00, 0x9d, 0x4f, 0x09,
-- 0x59, 0x79, 0x29, 0x00, 0xd0, 0x0b, 0x07, 0x14,
-- 0x0f, 0x24, 0x68, 0x88, 0x21, 0x03, 0xf0, 0x03,
-- 0xfe, 0xa5, 0x59, 0x78, 0x68, 0x80, 0x1c, 0x21,
-- 0xf0, 0x03, 0xff, 0x4c, 0x20, 0x00, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10,
-- 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff,
-- 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05,
-- 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88,
-- 0x21, 0x02, 0xf0, 0x03, 0xfe, 0x8b, 0x20, 0x00,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10,
-- 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff,
-- 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05,
-- 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88,
-- 0x21, 0x00, 0xf0, 0x03, 0xfe, 0x77, 0x20, 0x00,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10,
-- 0xb5, 0xf0, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x09,
-- 0x0c, 0x09, 0x04, 0x12, 0x0c, 0x12, 0x04, 0x1e,
-- 0x0c, 0x36, 0x9c, 0x05, 0x9f, 0x06, 0x04, 0x24,
-- 0x0c, 0x24, 0x04, 0x3f, 0x0c, 0x3f, 0x20, 0xff,
-- 0xb0, 0x85, 0x2d, 0x0f, 0xdc, 0x04, 0x00, 0xab,
-- 0x4d, 0x10, 0x58, 0xed, 0x2d, 0x00, 0xd1, 0x03,
-- 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x19, 0x88, 0x23, 0x32, 0x5e, 0xeb, 0x42, 0x98,
-- 0xdd, 0x02, 0x1a, 0x58, 0x04, 0x06, 0x0c, 0x36,
-- 0x19, 0x10, 0x23, 0x34, 0x5e, 0xeb, 0x42, 0x98,
-- 0xdd, 0x02, 0x1a, 0x98, 0x04, 0x04, 0x0c, 0x24,
-- 0x91, 0x00, 0x92, 0x01, 0x96, 0x02, 0x94, 0x03,
-- 0x97, 0x04, 0x46, 0x69, 0x68, 0xa8, 0xf0, 0x0a,
-- 0xfa, 0x1d, 0xe7, 0xe1, 0x2e, 0x08, 0x55, 0x10,
-- 0xb4, 0x80, 0x04, 0x03, 0x0c, 0x1b, 0x20, 0x00,
-- 0x29, 0x00, 0xdb, 0x0f, 0x2a, 0x00, 0xdb, 0x0d,
-- 0x00, 0x9b, 0x4f, 0x07, 0x58, 0xff, 0x2f, 0x00,
-- 0xd0, 0x08, 0x23, 0x32, 0x5e, 0xfb, 0x42, 0x8b,
-- 0xdd, 0x04, 0x23, 0x34, 0x5e, 0xf9, 0x42, 0x91,
-- 0xdd, 0x00, 0x20, 0x01, 0xbc, 0x80, 0x47, 0x70,
-- 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x9c, 0x06,
-- 0x9e, 0x05, 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x85,
-- 0x90, 0x00, 0x04, 0x08, 0x14, 0x00, 0x04, 0x17,
-- 0x14, 0x3f, 0x04, 0x1d, 0x14, 0x2d, 0x04, 0x31,
-- 0x14, 0x09, 0x91, 0x01, 0x04, 0x23, 0x0c, 0x1b,
-- 0x93, 0x02, 0xb0, 0x82, 0x99, 0x02, 0x00, 0x89,
-- 0x91, 0x06, 0x4a, 0x71, 0x92, 0x05, 0x58, 0x51,
-- 0x29, 0x00, 0xd1, 0x01, 0x20, 0xff, 0xe0, 0xd6,
-- 0x2d, 0x00, 0xda, 0x0e, 0x19, 0x40, 0x04, 0x00,
-- 0x14, 0x00, 0x42, 0x69, 0x04, 0x0d, 0x14, 0x2d,
-- 0x99, 0x03, 0x18, 0x79, 0x04, 0x0f, 0x14, 0x3f,
-- 0x99, 0x03, 0x42, 0x49, 0x04, 0x09, 0x14, 0x09,
-- 0x91, 0x03, 0x1c, 0x01, 0x1c, 0x04, 0x98, 0x02,
-- 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xb1, 0x28, 0x00,
-- 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08,
-- 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a,
-- 0xf0, 0x09, 0xff, 0x7a, 0x98, 0x03, 0x10, 0x40,
-- 0x90, 0x00, 0x10, 0x6e, 0x1c, 0x28, 0xb0, 0x82,
-- 0xf0, 0x0e, 0xfd, 0x58, 0xf0, 0x0e, 0xfd, 0x94,
-- 0x90, 0x00, 0x91, 0x01, 0x98, 0x05, 0xf0, 0x0e,
-- 0xfd, 0x51, 0xf0, 0x0e, 0xfd, 0x8d, 0x9a, 0x00,
-- 0x9b, 0x01, 0xb0, 0x02, 0xf0, 0x0e, 0xfd, 0x8c,
-- 0x28, 0x00, 0xd0, 0x4c, 0x98, 0x03, 0x28, 0x00,
-- 0xdd, 0x21, 0x26, 0x00, 0x2d, 0x00, 0xdd, 0x6d,
-- 0x98, 0x00, 0x99, 0x03, 0x18, 0x40, 0x90, 0x00,
-- 0x34, 0x01, 0x42, 0xa8, 0xdb, 0x03, 0x98, 0x00,
-- 0x1b, 0x40, 0x90, 0x00, 0x37, 0x01, 0x98, 0x02,
-- 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x78,
-- 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05,
-- 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21,
-- 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x41, 0x36, 0x01,
-- 0x42, 0xae, 0xdb, 0xe1, 0xe0, 0x76, 0x98, 0x03,
-- 0x42, 0x40, 0x04, 0x00, 0x14, 0x00, 0x90, 0x03,
-- 0x98, 0x00, 0x42, 0x46, 0x20, 0x00, 0x90, 0x01,
-- 0x2d, 0x00, 0xdd, 0x43, 0x98, 0x03, 0x18, 0x36,
-- 0x34, 0x01, 0x42, 0xae, 0xdb, 0x01, 0x1b, 0x76,
-- 0x3f, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a,
-- 0xf7, 0xff, 0xff, 0x52, 0x28, 0x00, 0xd0, 0x08,
-- 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80,
-- 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09,
-- 0xff, 0x1b, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01,
-- 0x42, 0xa8, 0xdb, 0xe3, 0xe0, 0x4e, 0x98, 0x03,
-- 0x28, 0x00, 0xdd, 0x24, 0x20, 0x00, 0x90, 0x01,
-- 0x98, 0x03, 0x28, 0x00, 0xdd, 0x1e, 0x19, 0x76,
-- 0x99, 0x03, 0x37, 0x01, 0x42, 0x8e, 0xdb, 0x02,
-- 0x98, 0x03, 0x1a, 0x36, 0x34, 0x01, 0x98, 0x02,
-- 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x2c,
-- 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05,
-- 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21,
-- 0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xf5, 0x98, 0x01,
-- 0x30, 0x01, 0x90, 0x01, 0x99, 0x03, 0x42, 0x88,
-- 0xdb, 0xe1, 0xe0, 0x27, 0xe0, 0x26, 0x98, 0x03,
-- 0x42, 0x40, 0x04, 0x01, 0x14, 0x09, 0x91, 0x03,
-- 0x20, 0x00, 0x90, 0x01, 0x29, 0x00, 0xdd, 0x1d,
-- 0x19, 0x76, 0x99, 0x03, 0x3f, 0x01, 0x42, 0x8e,
-- 0xdb, 0x02, 0x99, 0x03, 0x1a, 0x76, 0x34, 0x01,
-- 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff,
-- 0xff, 0x03, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06,
-- 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04,
-- 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xcc,
-- 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x99, 0x03,
-- 0x42, 0x88, 0xdb, 0xe1, 0x20, 0x00, 0xb0, 0x07,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x23, 0x00,
-- 0x88, 0x01, 0x0a, 0x0a, 0x06, 0x12, 0x0e, 0x12,
-- 0x06, 0x09, 0x0e, 0x09, 0x2a, 0xdf, 0xd0, 0x1a,
-- 0xdc, 0x07, 0x2a, 0xc4, 0xd0, 0x19, 0x2a, 0xd6,
-- 0xd0, 0x1b, 0x2a, 0xdc, 0xd1, 0x08, 0x22, 0x1e,
-- 0xe0, 0x06, 0x2a, 0xe4, 0xd0, 0x13, 0x2a, 0xf6,
-- 0xd0, 0x15, 0x2a, 0xfc, 0xd1, 0x00, 0x22, 0x1f,
-- 0x29, 0xdf, 0xd0, 0x26, 0xdc, 0x11, 0x29, 0xc4,
-- 0xd0, 0x25, 0x29, 0xd6, 0xd0, 0x27, 0x29, 0xdc,
-- 0xd1, 0x12, 0x21, 0x1e, 0xe0, 0x10, 0x22, 0x19,
-- 0xe7, 0xf2, 0x22, 0x1a, 0xe7, 0xf0, 0x22, 0x1b,
-- 0xe7, 0xee, 0x22, 0x1c, 0xe7, 0xec, 0x22, 0x1d,
-- 0xe7, 0xea, 0x29, 0xe4, 0xd0, 0x15, 0x29, 0xf6,
-- 0xd0, 0x17, 0x29, 0xfc, 0xd1, 0x00, 0x21, 0x1f,
-- 0x02, 0x17, 0x18, 0x7f, 0x80, 0x07, 0x30, 0x02,
-- 0x2a, 0x00, 0xd0, 0x04, 0x29, 0x00, 0xd0, 0x02,
-- 0x33, 0x01, 0x2b, 0x70, 0xdb, 0xc0, 0xbc, 0x80,
-- 0x47, 0x70, 0x21, 0x19, 0xe7, 0xf0, 0x21, 0x1a,
-- 0xe7, 0xee, 0x21, 0x1b, 0xe7, 0xec, 0x21, 0x1c,
-- 0xe7, 0xea, 0x21, 0x1d, 0xe7, 0xe8, 0xb5, 0xf0,
-- 0x1c, 0x0f, 0x1c, 0x11, 0x04, 0x02, 0x0c, 0x12,
-- 0x04, 0x0c, 0x0c, 0x24, 0x04, 0x1d, 0x0c, 0x2d,
-- 0x00, 0x96, 0xb0, 0x81, 0x48, 0x10, 0x90, 0x00,
-- 0x59, 0x81, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x16,
-- 0x2a, 0x00, 0xd0, 0x14, 0x2a, 0x0f, 0xdc, 0x12,
-- 0x23, 0x32, 0x5e, 0xca, 0x42, 0xa2, 0xdb, 0x0e,
-- 0x23, 0x34, 0x5e, 0xc9, 0x42, 0xa9, 0xdb, 0x0a,
-- 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x93, 0x98, 0x00,
-- 0x59, 0x80, 0x1c, 0x39, 0x1c, 0x22, 0x1c, 0x2b,
-- 0xf7, 0xff, 0xfb, 0x5c, 0x20, 0x00, 0xb0, 0x01,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0xb4, 0xb0, 0x04, 0x07,
-- 0x0c, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x14,
-- 0x14, 0x24, 0x04, 0x1a, 0x14, 0x12, 0x20, 0xff,
-- 0x2f, 0x0f, 0xdc, 0x1d, 0x00, 0xbd, 0x4f, 0x0f,
-- 0x59, 0x7b, 0x2b, 0x00, 0xd0, 0x18, 0x48, 0x0e,
-- 0x29, 0x01, 0xd0, 0x05, 0x29, 0x02, 0xd0, 0x01,
-- 0x29, 0x03, 0xd0, 0x03, 0x6c, 0x80, 0xe0, 0x02,
-- 0x6c, 0x40, 0xe0, 0x00, 0x6c, 0xc0, 0x62, 0x58,
-- 0x59, 0x78, 0x63, 0xc4, 0x20, 0x00, 0x43, 0xc0,
-- 0x42, 0x82, 0xd1, 0x02, 0x59, 0x79, 0x63, 0x88,
-- 0xe0, 0x01, 0x59, 0x78, 0x63, 0x82, 0x20, 0x00,
-- 0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x55, 0x10,
-- 0x2e, 0x08, 0x1c, 0x80, 0xb5, 0x00, 0x04, 0x00,
-- 0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0x00, 0x80,
-- 0x4a, 0x07, 0x58, 0x10, 0x28, 0x00, 0xd1, 0x02,
-- 0x20, 0xff, 0xbc, 0x08, 0x47, 0x18, 0x07, 0x89,
-- 0x0f, 0x89, 0x68, 0x80, 0xf0, 0x03, 0xfe, 0x76,
-- 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0x04, 0x09, 0x0c, 0x09,
-- 0x4b, 0x0a, 0x40, 0x18, 0x08, 0x4a, 0xd3, 0x01,
-- 0x23, 0x02, 0x43, 0x18, 0x08, 0x8a, 0xd3, 0x02,
-- 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, 0x08, 0xca,
-- 0xd3, 0x01, 0x23, 0x01, 0x43, 0x18, 0x09, 0x09,
-- 0xd3, 0x02, 0x23, 0x01, 0x04, 0x1b, 0x43, 0x18,
-- 0x47, 0x70, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xfc,
-- 0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x14,
-- 0x0c, 0x24, 0x1c, 0x1e, 0x1c, 0x0f, 0x28, 0x07,
-- 0xdc, 0x25, 0x28, 0x01, 0xdb, 0x23, 0x00, 0x85,
-- 0x48, 0x12, 0x59, 0x40, 0x28, 0x00, 0xd0, 0x1e,
-- 0x0e, 0x31, 0x02, 0x30, 0x0a, 0x00, 0xf7, 0xff,
-- 0xff, 0xd1, 0x1c, 0x06, 0x2f, 0x02, 0xd0, 0x0e,
-- 0x2f, 0x04, 0xd0, 0x0c, 0x2f, 0x10, 0xd0, 0x0a,
-- 0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x0e,
-- 0x06, 0x22, 0x0e, 0x12, 0x1c, 0x31, 0x48, 0x08,
-- 0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, 0x07, 0x22,
-- 0x0f, 0x12, 0x48, 0x06, 0x59, 0x40, 0x68, 0x00,
-- 0x1c, 0x31, 0xf0, 0x0b, 0xfa, 0xdb, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10,
-- 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50,
-- 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x10,
-- 0x0c, 0x00, 0x04, 0x1f, 0x0c, 0x3f, 0x22, 0x00,
-- 0xb0, 0x81, 0x92, 0x00, 0x2c, 0x07, 0xdc, 0x3a,
-- 0x2c, 0x01, 0xdb, 0x38, 0x00, 0xa4, 0x4a, 0x1e,
-- 0x59, 0x12, 0x2a, 0x00, 0xd0, 0x33, 0x29, 0x02,
-- 0xd0, 0x1b, 0x29, 0x04, 0xd0, 0x19, 0x29, 0x10,
-- 0xd0, 0x17, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99,
-- 0xd1, 0x29, 0x06, 0x02, 0x0e, 0x12, 0x46, 0x69,
-- 0x1c, 0x15, 0x4c, 0x16, 0x6c, 0x20, 0x68, 0x00,
-- 0xf0, 0x0b, 0xfa, 0xdc, 0x98, 0x00, 0x02, 0x00,
-- 0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x82,
-- 0x90, 0x00, 0x1c, 0x01, 0x6c, 0x20, 0x1c, 0x2a,
-- 0xe0, 0x12, 0x07, 0x02, 0x0f, 0x12, 0x1c, 0x15,
-- 0x4e, 0x0d, 0x59, 0x30, 0x68, 0x00, 0x46, 0x69,
-- 0xf0, 0x0b, 0xfa, 0xc8, 0x98, 0x00, 0x02, 0x00,
-- 0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x6e,
-- 0x90, 0x00, 0x1c, 0x01, 0x59, 0x30, 0x1c, 0x2a,
-- 0x68, 0x00, 0xf0, 0x0b, 0xfa, 0x8b, 0xb0, 0x01,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x55, 0x10, 0x2e, 0x08, 0x1c, 0x80,
-- 0x2e, 0x08, 0x55, 0x50, 0xb5, 0xf0, 0x4f, 0x28,
-- 0x25, 0x00, 0x24, 0xff, 0x69, 0x38, 0x28, 0x00,
-- 0xd1, 0x01, 0x60, 0xbd, 0xe0, 0x0c, 0x26, 0x05,
-- 0x68, 0xb9, 0x29, 0x07, 0xd2, 0xf9, 0xa3, 0x02,
-- 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x04, 0x08, 0x10, 0x1a, 0x21, 0x30, 0x38, 0x00,
-- 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x01, 0x02, 0x80, 0xf7, 0xf6, 0xfa, 0x86,
-- 0x28, 0x00, 0xdb, 0x2d, 0x20, 0x02, 0xe0, 0x25,
-- 0x48, 0x18, 0xf7, 0xf6, 0xfa, 0xa1, 0x28, 0x00,
-- 0xdb, 0x26, 0x89, 0xb8, 0x28, 0x00, 0xdd, 0x15,
-- 0x20, 0x03, 0xe0, 0x1b, 0x89, 0xb8, 0xf7, 0xf6,
-- 0xfa, 0x75, 0x28, 0x00, 0xdb, 0x1c, 0x20, 0x04,
-- 0xe0, 0x14, 0xf7, 0xf6, 0xfa, 0x91, 0x28, 0x00,
-- 0xdb, 0x16, 0x69, 0x39, 0x18, 0x09, 0x61, 0x39,
-- 0x89, 0xb9, 0x1a, 0x08, 0x81, 0xb8, 0x89, 0xb8,
-- 0x28, 0x00, 0xdc, 0xe9, 0x60, 0xbe, 0xe0, 0x0b,
-- 0x20, 0x00, 0xf7, 0xf6, 0xfa, 0x5f, 0x28, 0x00,
-- 0xd1, 0x06, 0x20, 0x06, 0x60, 0xb8, 0xe0, 0x03,
-- 0xf7, 0xf6, 0xfa, 0x7a, 0x28, 0x00, 0xda, 0xb8,
-- 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0,
-- 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d,
-- 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0xb0, 0x85,
-- 0xa8, 0x01, 0x49, 0x2e, 0xc9, 0x8e, 0xc0, 0x8e,
-- 0x2c, 0x00, 0xd0, 0x07, 0x2c, 0x01, 0xd0, 0x07,
-- 0x2c, 0x02, 0xd0, 0x07, 0x2c, 0x03, 0xd1, 0x3f,
-- 0x21, 0x08, 0xe0, 0x04, 0x21, 0x01, 0xe0, 0x02,
-- 0x21, 0x02, 0xe0, 0x00, 0x21, 0x04, 0x91, 0x00,
-- 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xdc, 0x33,
-- 0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdc, 0x2f,
-- 0x1e, 0x68, 0x90, 0x03, 0x1e, 0x70, 0x90, 0x04,
-- 0xa8, 0x01, 0x1c, 0x21, 0xf0, 0x07, 0xfb, 0xb8,
-- 0x4f, 0x1d, 0x60, 0x78, 0x00, 0x80, 0x23, 0x01,
-- 0x04, 0x1b, 0x42, 0x98, 0xdc, 0x20, 0x1f, 0xf8,
-- 0x38, 0x79, 0x67, 0xc4, 0x68, 0x38, 0x28, 0x00,
-- 0xd0, 0x0a, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b,
-- 0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfd, 0x42,
-- 0x68, 0x38, 0xf7, 0xfe, 0xfe, 0x90, 0xb0, 0x01,
-- 0x22, 0x00, 0x21, 0x0a, 0x20, 0x01, 0xb4, 0x07,
-- 0x1c, 0x22, 0xb4, 0x04, 0x21, 0x00, 0x20, 0x00,
-- 0x1c, 0x2a, 0x1c, 0x33, 0xf7, 0xfe, 0xfd, 0x62,
-- 0xb0, 0x04, 0x60, 0x38, 0x1c, 0x01, 0xd1, 0x03,
-- 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x69, 0x88, 0x99, 0x00, 0x43, 0x4d, 0x1d, 0xe9,
-- 0xd5, 0x00, 0x31, 0x07, 0x10, 0xc9, 0x43, 0x71,
-- 0x61, 0x38, 0x60, 0x79, 0x81, 0xb9, 0x20, 0x01,
-- 0x60, 0xb8, 0xe7, 0xed, 0x2e, 0x03, 0x39, 0x50,
-- 0x2e, 0x08, 0x1d, 0x00, 0xb5, 0xf0, 0x04, 0x00,
-- 0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x87,
-- 0x91, 0x00, 0x04, 0x11, 0x0c, 0x09, 0x91, 0x01,
-- 0x04, 0x19, 0x0c, 0x09, 0x91, 0x02, 0xb0, 0x85,
-- 0x28, 0x07, 0xdc, 0x43, 0x28, 0x01, 0xdb, 0x41,
-- 0x00, 0x85, 0x48, 0x3e, 0x90, 0x0b, 0x59, 0x41,
-- 0x29, 0x00, 0xd0, 0x3b, 0x48, 0x3c, 0x90, 0x0a,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x36, 0x23, 0x2c,
-- 0x5e, 0xca, 0x2a, 0x0b, 0xd2, 0x32, 0xa3, 0x02,
-- 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
-- 0x06, 0x06, 0x06, 0x00, 0x22, 0x00, 0x92, 0x00,
-- 0x92, 0x01, 0x23, 0x32, 0x5e, 0xc3, 0x93, 0x02,
-- 0x23, 0x34, 0x5e, 0xc0, 0x90, 0x03, 0x92, 0x04,
-- 0x98, 0x07, 0x08, 0x80, 0xd3, 0x40, 0x23, 0x2c,
-- 0x5e, 0xc8, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01,
-- 0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03,
-- 0xd1, 0x10, 0x27, 0xff, 0x37, 0x01, 0xe0, 0x04,
-- 0x27, 0x02, 0xe0, 0x02, 0x27, 0x04, 0xe0, 0x00,
-- 0x27, 0x10, 0x4e, 0x24, 0x23, 0xff, 0x33, 0x01,
-- 0x42, 0x9f, 0xd1, 0x16, 0x24, 0x00, 0x48, 0x22,
-- 0x90, 0x09, 0xe0, 0x03, 0xb0, 0x0c, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x58, 0x31,
-- 0x29, 0x00, 0xd0, 0x06, 0x06, 0x22, 0x0e, 0x12,
-- 0x98, 0x09, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b,
-- 0xf9, 0x5d, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1,
-- 0xe0, 0x12, 0x24, 0x00, 0x2f, 0x00, 0xdd, 0x0f,
-- 0x48, 0x16, 0x90, 0x08, 0x00, 0xa0, 0x58, 0x31,
-- 0x29, 0x00, 0xd0, 0x06, 0x07, 0x22, 0x0f, 0x12,
-- 0x98, 0x08, 0x59, 0x40, 0x68, 0x00, 0xf0, 0x0b,
-- 0xf9, 0x49, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1,
-- 0x98, 0x07, 0x08, 0x40, 0xd3, 0x01, 0x22, 0xff,
-- 0xe0, 0x00, 0x22, 0x00, 0x99, 0x06, 0xb4, 0x06,
-- 0x98, 0x0d, 0x59, 0x40, 0x68, 0x81, 0x98, 0x0c,
-- 0x68, 0x00, 0x68, 0x80, 0x9b, 0x07, 0xaa, 0x02,
-- 0xf0, 0x09, 0xff, 0x12, 0xb0, 0x0e, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10,
-- 0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0,
-- 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50,
-- 0xb5, 0x80, 0x4f, 0x0a, 0x68, 0x38, 0x28, 0x00,
-- 0xd0, 0x0c, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b,
-- 0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfc, 0x72,
-- 0x68, 0x38, 0xf7, 0xfe, 0xfd, 0xc0, 0x20, 0x00,
-- 0x60, 0x38, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1d, 0x00,
-- 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff,
-- 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05,
-- 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88,
-- 0x21, 0x01, 0xf0, 0x03, 0xfb, 0x93, 0x20, 0x00,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10,
-- 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff,
-- 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05,
-- 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88,
-- 0x21, 0x00, 0xf0, 0x03, 0xfb, 0x7f, 0x20, 0x00,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10,
-- 0xb5, 0xf7, 0xb0, 0x86, 0x9c, 0x07, 0x20, 0x00,
-- 0x6e, 0x40, 0x90, 0x05, 0x98, 0x05, 0x30, 0x0c,
-- 0x90, 0x05, 0x48, 0x7f, 0x90, 0x04, 0x98, 0x04,
-- 0x30, 0x0c, 0x90, 0x04, 0xf0, 0x11, 0xff, 0xf0,
-- 0x90, 0x01, 0xf0, 0x11, 0xff, 0xd3, 0x90, 0x00,
-- 0x20, 0x00, 0x43, 0xc0, 0x49, 0x79, 0x60, 0x08,
-- 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 0x60, 0x88,
-- 0x20, 0x00, 0x43, 0xc0, 0x49, 0x75, 0x61, 0x08,
-- 0x98, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x20, 0x00,
-- 0x6a, 0x40, 0x90, 0x03, 0x68, 0x20, 0x30, 0x05,
-- 0x99, 0x06, 0x1a, 0x08, 0x90, 0x06, 0x68, 0xe0,
-- 0x28, 0x00, 0xd0, 0x08, 0x68, 0x60, 0x99, 0x03,
-- 0x68, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x06, 0x68, 0x60,
-- 0x9a, 0x08, 0x42, 0x90, 0xd1, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x73,
-- 0x68, 0x27, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01,
-- 0x98, 0x05, 0xe0, 0x00, 0x98, 0x04, 0x1c, 0x06,
-- 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00,
-- 0x6e, 0x40, 0xe0, 0x00, 0x48, 0x5c, 0x90, 0x02,
-- 0x1d, 0xe5, 0x35, 0x0d, 0x68, 0xa0, 0x28, 0x08,
-- 0xd2, 0x5f, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b,
-- 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x16, 0x28, 0x3a,
-- 0x49, 0x55, 0x65, 0x71, 0x69, 0x20, 0x49, 0x55,
-- 0x60, 0x08, 0xcd, 0x02, 0x48, 0x53, 0x60, 0x41,
-- 0xcd, 0x02, 0x98, 0x02, 0x60, 0x01, 0x3f, 0x01,
-- 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02,
-- 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x67,
-- 0x69, 0x20, 0x49, 0x4c, 0x60, 0x88, 0xcd, 0x02,
-- 0x48, 0x4a, 0x60, 0xc1, 0xcd, 0x02, 0x98, 0x02,
-- 0x60, 0x41, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01,
-- 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02,
-- 0xe7, 0xf8, 0xe0, 0x55, 0x69, 0x20, 0x49, 0x43,
-- 0x61, 0x08, 0xcd, 0x02, 0x48, 0x41, 0x61, 0x41,
-- 0xcd, 0x02, 0x98, 0x02, 0x60, 0x81, 0x3f, 0x01,
-- 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02,
-- 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x43,
-- 0x69, 0x20, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x4b,
-- 0x21, 0x00, 0x6a, 0x89, 0x50, 0x0e, 0x1c, 0x38,
-- 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02,
-- 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x34, 0x69, 0x20,
-- 0x00, 0x80, 0x49, 0x33, 0x50, 0x0e, 0x1c, 0x38,
-- 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02,
-- 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x28, 0x69, 0x20,
-- 0x00, 0x80, 0x21, 0x00, 0x6e, 0x09, 0xe0, 0x01,
-- 0xe0, 0x28, 0xe0, 0x20, 0x50, 0x0e, 0x1c, 0x38,
-- 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02,
-- 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x18, 0x69, 0x20,
-- 0x00, 0x80, 0x49, 0x26, 0x50, 0x0e, 0x1c, 0x38,
-- 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02,
-- 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x0c, 0x69, 0x20,
-- 0x90, 0x03, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00,
-- 0xd0, 0x04, 0xcd, 0x02, 0x98, 0x03, 0xc0, 0x02,
-- 0x90, 0x03, 0xe7, 0xf6, 0xe0, 0x00, 0xe7, 0xff,
-- 0x68, 0xe0, 0x28, 0xff, 0xd1, 0x01, 0x96, 0x05,
-- 0xe0, 0x00, 0x96, 0x04, 0x68, 0x20, 0x00, 0x80,
-- 0x19, 0x00, 0x1d, 0xc4, 0x34, 0x0d, 0xe7, 0x3b,
-- 0x98, 0x01, 0x28, 0x00, 0xd1, 0x01, 0xf0, 0x11,
-- 0xff, 0x4f, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x01,
-- 0xf0, 0x11, 0xff, 0x2e, 0x20, 0x00, 0x6e, 0x80,
-- 0x68, 0x00, 0x4b, 0x0f, 0x42, 0x98, 0xd0, 0x06,
-- 0x48, 0x0d, 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08,
-- 0x20, 0x01, 0x49, 0x08, 0x62, 0x08, 0x20, 0x00,
-- 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 0x20, 0x00,
-- 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00,
-- 0x2e, 0x08, 0x59, 0xb0, 0x66, 0x00, 0x00, 0x80,
-- 0x2e, 0x08, 0x3a, 0xf4, 0x2e, 0x08, 0x1d, 0x14,
-- 0xda, 0xa5, 0xaa, 0x57, 0xb5, 0x80, 0xb0, 0xa7,
-- 0x46, 0x68, 0x4f, 0x08, 0x23, 0x13, 0xcf, 0x06,
-- 0xc0, 0x06, 0x3b, 0x01, 0xd1, 0xfb, 0xcf, 0x04,
-- 0xc0, 0x04, 0x46, 0x69, 0x4a, 0x04, 0x20, 0x27,
-- 0xf7, 0xff, 0xfe, 0xde, 0xb0, 0x27, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x03, 0x39, 0x60,
-- 0xf0, 0x24, 0x00, 0x09, 0xb5, 0xff, 0xb0, 0x83,
-- 0x99, 0x04, 0x04, 0x09, 0x0c, 0x09, 0x91, 0x00,
-- 0x9a, 0x05, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x06,
-- 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c,
-- 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x84,
-- 0x25, 0x00, 0x98, 0x07, 0x1d, 0xc2, 0x32, 0x21,
-- 0x92, 0x00, 0x20, 0xff, 0x30, 0x01, 0x68, 0x00,
-- 0x49, 0x6b, 0x60, 0x08, 0x98, 0x12, 0x28, 0x01,
-- 0xd1, 0x73, 0x98, 0x07, 0x28, 0x00, 0xd1, 0x05,
-- 0x20, 0x63, 0xb0, 0x07, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x91, 0x01,
-- 0x99, 0x01, 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99,
-- 0xd3, 0x04, 0xe0, 0x0a, 0x99, 0x01, 0x31, 0x01,
-- 0x91, 0x01, 0xe7, 0xf5, 0x20, 0x00, 0x99, 0x01,
-- 0x23, 0x2c, 0x43, 0x59, 0x9a, 0x00, 0x50, 0x50,
-- 0xe7, 0xf4, 0x98, 0x07, 0x49, 0x5b, 0x68, 0x09,
-- 0x60, 0x08, 0x98, 0x05, 0x28, 0x10, 0xdb, 0x01,
-- 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x99, 0x05,
-- 0x29, 0x1f, 0xdc, 0x01, 0x21, 0x01, 0xe0, 0x00,
-- 0x21, 0x00, 0x40, 0x08, 0xd0, 0x04, 0x98, 0x05,
-- 0x49, 0x53, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x02,
-- 0x20, 0x62, 0xb0, 0x07, 0xe7, 0xce, 0x20, 0x00,
-- 0x49, 0x4d, 0x68, 0x09, 0x70, 0x08, 0x1c, 0x30,
-- 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2,
-- 0x21, 0x01, 0xf0, 0x00, 0xfb, 0x01, 0x1c, 0x07,
-- 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07,
-- 0xe7, 0xbc, 0x22, 0x00, 0xb4, 0x04, 0x99, 0x05,
-- 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0xf0, 0x00,
-- 0xf9, 0x2f, 0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00,
-- 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xad,
-- 0x98, 0x06, 0x28, 0x00, 0xdb, 0x04, 0x98, 0x06,
-- 0x28, 0x3f, 0xdc, 0x01, 0x9d, 0x06, 0xe0, 0x00,
-- 0x25, 0x1b, 0x98, 0x11, 0x01, 0x80, 0x43, 0x05,
-- 0x23, 0x80, 0x43, 0x1d, 0x48, 0x39, 0x68, 0x01,
-- 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 0x48, 0x37,
-- 0x68, 0x01, 0x43, 0x29, 0x60, 0x01, 0xf0, 0x11,
-- 0xfe, 0x2d, 0x90, 0x03, 0xf0, 0x11, 0xfe, 0x44,
-- 0xe0, 0x00, 0xe0, 0x13, 0x90, 0x02, 0xf0, 0x11,
-- 0xfe, 0xa3, 0x1c, 0x04, 0x4b, 0x30, 0x40, 0x1c,
-- 0x1c, 0x20, 0xf0, 0x11, 0xfe, 0xa1, 0x98, 0x02,
-- 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x6c,
-- 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x11,
-- 0xfe, 0x4b, 0xe0, 0x43, 0x22, 0x00, 0xb4, 0x04,
-- 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0x49, 0x27,
-- 0xf0, 0x00, 0xf8, 0xee, 0xb0, 0x01, 0x1c, 0x07,
-- 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07,
-- 0xe7, 0x6c, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b,
-- 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0xf0, 0x00,
-- 0xfa, 0xa3, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02,
-- 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x5e, 0x48, 0x19,
-- 0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01,
-- 0x48, 0x16, 0x68, 0x01, 0x23, 0x1b, 0x43, 0x19,
-- 0x60, 0x01, 0x48, 0x12, 0x68, 0x00, 0x68, 0x00,
-- 0x90, 0x07, 0xf0, 0x11, 0xfd, 0xe7, 0x90, 0x03,
-- 0xf0, 0x11, 0xfd, 0xfe, 0x90, 0x02, 0xf0, 0x11,
-- 0xfe, 0x5f, 0x1c, 0x04, 0x23, 0x01, 0x04, 0x5b,
-- 0x43, 0x1c, 0x1c, 0x20, 0xf0, 0x11, 0xfe, 0x5c,
-- 0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11,
-- 0xfe, 0x27, 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01,
-- 0xf0, 0x11, 0xfe, 0x06, 0x1c, 0x38, 0xb0, 0x07,
-- 0xe7, 0x34, 0xb0, 0x04, 0xb0, 0x03, 0xe7, 0x31,
-- 0x2e, 0x08, 0x5d, 0xb8, 0x2e, 0x08, 0x5d, 0xb0,
-- 0x2e, 0x08, 0x5d, 0xb4, 0x68, 0x00, 0x00, 0x38,
-- 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
-- 0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xe7, 0xf0, 0x00,
-- 0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0,
-- 0xf0, 0x0b, 0xf9, 0x48, 0x26, 0x00, 0x2e, 0x04,
-- 0xd3, 0x02, 0xe0, 0x12, 0x36, 0x01, 0xe7, 0xfa,
-- 0x01, 0x30, 0x4b, 0x3c, 0x18, 0xc7, 0x25, 0x00,
-- 0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x08, 0x35, 0x01,
-- 0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00,
-- 0x60, 0xf8, 0x37, 0xff, 0x37, 0x01, 0xe7, 0xf6,
-- 0xe7, 0xec, 0x4f, 0x35, 0x25, 0x00, 0x2d, 0x04,
-- 0xd3, 0x02, 0xe0, 0x07, 0x35, 0x01, 0xe7, 0xfa,
-- 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8,
-- 0x37, 0x10, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x2f,
-- 0x68, 0x09, 0x70, 0x08, 0x24, 0x00, 0x2c, 0x20,
-- 0xd3, 0x02, 0xe0, 0x1f, 0x34, 0x01, 0xe7, 0xfa,
-- 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x2a, 0x68, 0x12,
-- 0x50, 0x11, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x28,
-- 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x21, 0x00,
-- 0x00, 0xe0, 0x4a, 0x26, 0x68, 0x12, 0x18, 0x80,
-- 0x60, 0x41, 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x24,
-- 0x68, 0x12, 0x50, 0x50, 0x20, 0x00, 0x00, 0xe1,
-- 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x21, 0x68, 0x12,
-- 0x52, 0x50, 0xe7, 0xdf, 0x20, 0x00, 0x21, 0x19,
-- 0x06, 0x89, 0x62, 0x48, 0x48, 0x1e, 0x21, 0x19,
-- 0x06, 0x89, 0x62, 0x48, 0x20, 0x00, 0x49, 0x1d,
-- 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x1b,
-- 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x19,
-- 0x68, 0x09, 0x60, 0xc8, 0x20, 0x00, 0x49, 0x17,
-- 0x68, 0x09, 0x61, 0x08, 0x20, 0x00, 0x49, 0x15,
-- 0x68, 0x09, 0x61, 0x48, 0x20, 0x00, 0x49, 0x13,
-- 0x68, 0x09, 0x61, 0x88, 0x20, 0x00, 0x49, 0x12,
-- 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x10,
-- 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0e,
-- 0x68, 0x09, 0x60, 0x88, 0x48, 0x0d, 0x68, 0x01,
-- 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x9e, 0x00, 0x00, 0xc0,
-- 0x9e, 0x00, 0x09, 0x80, 0x2e, 0x08, 0x5d, 0xbc,
-- 0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xd4,
-- 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4,
-- 0x00, 0x40, 0x00, 0x03, 0x2e, 0x08, 0x5e, 0x0c,
-- 0x2e, 0x08, 0x5e, 0x10, 0x6a, 0x00, 0x00, 0x10,
-- 0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x06, 0x04,
-- 0x0e, 0x24, 0x99, 0x04, 0x04, 0x08, 0x0c, 0x00,
-- 0x90, 0x00, 0x9a, 0x05, 0x06, 0x10, 0x0e, 0x00,
-- 0x90, 0x01, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00,
-- 0x90, 0x02, 0xb0, 0x81, 0x00, 0xe0, 0x49, 0xc1,
-- 0x68, 0x09, 0x18, 0x47, 0x00, 0xa0, 0x49, 0xc0,
-- 0x68, 0x09, 0x18, 0x45, 0x00, 0xe0, 0x1b, 0x00,
-- 0x00, 0x80, 0x49, 0xbe, 0x68, 0x09, 0x18, 0x46,
-- 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x68, 0x28, 0x4b, 0xb9, 0x40, 0x18, 0x60, 0x28,
-- 0x68, 0x38, 0x4b, 0xb8, 0x40, 0x18, 0x60, 0x38,
-- 0x68, 0x38, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x17,
-- 0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18,
-- 0x60, 0x38, 0x48, 0xb3, 0x68, 0x01, 0x08, 0x49,
-- 0x00, 0x49, 0x60, 0x01, 0x48, 0xb1, 0x68, 0x01,
-- 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01,
-- 0x98, 0x01, 0x4b, 0xaf, 0x42, 0x98, 0xd1, 0x03,
-- 0x20, 0x00, 0x49, 0xae, 0x68, 0x09, 0x60, 0x08,
-- 0x98, 0x01, 0x4b, 0xab, 0x42, 0x98, 0xd0, 0x73,
-- 0x68, 0x38, 0x23, 0x21, 0x43, 0xdb, 0x40, 0x18,
-- 0x60, 0x38, 0x68, 0x28, 0x23, 0x07, 0x03, 0x5b,
-- 0x40, 0x18, 0x60, 0x28, 0x98, 0x01, 0x4b, 0xa6,
-- 0x40, 0x18, 0x68, 0x29, 0x43, 0x08, 0x60, 0x28,
-- 0x20, 0x00, 0x75, 0x30, 0x98, 0x02, 0x07, 0x80,
-- 0x0f, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x88, 0x30,
-- 0x23, 0x10, 0x43, 0x18, 0x80, 0x30, 0xe0, 0x04,
-- 0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18,
-- 0x80, 0x30, 0x98, 0x02, 0x23, 0x80, 0x40, 0x18,
-- 0x28, 0x80, 0xd1, 0x08, 0x68, 0x38, 0x23, 0x40,
-- 0x43, 0x18, 0x60, 0x38, 0x20, 0xff, 0x49, 0x97,
-- 0x68, 0x09, 0x70, 0x08, 0xe0, 0x04, 0x68, 0x38,
-- 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38,
-- 0x98, 0x03, 0x28, 0x01, 0xd1, 0x36, 0x88, 0x30,
-- 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0x80, 0x30,
-- 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d,
-- 0x06, 0x9b, 0x1a, 0xc1, 0x00, 0xe0, 0x4a, 0x8c,
-- 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x01,
-- 0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, 0x03, 0x9b,
-- 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x4b, 0x87,
-- 0x43, 0x18, 0x60, 0x38, 0x48, 0x86, 0x70, 0x44,
-- 0x20, 0x00, 0x49, 0x86, 0x68, 0x09, 0x60, 0x08,
-- 0x20, 0x01, 0x02, 0xc0, 0x49, 0x84, 0x61, 0x48,
-- 0x49, 0x83, 0x61, 0x08, 0x20, 0x01, 0x49, 0x83,
-- 0x64, 0x48, 0x20, 0x00, 0x49, 0x81, 0x64, 0x48,
-- 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18,
-- 0x60, 0x28, 0x20, 0x00, 0x49, 0x7e, 0x68, 0x09,
-- 0x60, 0x08, 0xe0, 0x9a, 0x98, 0x03, 0x28, 0x02,
-- 0xd1, 0x30, 0x20, 0x33, 0x06, 0x40, 0xe0, 0x00,
-- 0xe0, 0x94, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b,
-- 0x1a, 0xc0, 0x00, 0xe1, 0x4a, 0x70, 0x68, 0x12,
-- 0x18, 0x89, 0x60, 0x48, 0x20, 0x02, 0x70, 0xb0,
-- 0x68, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x18,
-- 0x60, 0x38, 0x68, 0x38, 0x4b, 0x6b, 0x43, 0x18,
-- 0x60, 0x38, 0x48, 0x6b, 0x70, 0x84, 0x20, 0x00,
-- 0x49, 0x6e, 0x60, 0x08, 0x00, 0xe0, 0x49, 0x5b,
-- 0x68, 0x09, 0x58, 0x08, 0x23, 0xff, 0x33, 0x01,
-- 0x43, 0x18, 0x00, 0xe1, 0x4a, 0x57, 0x68, 0x12,
-- 0x50, 0x50, 0x20, 0x4b, 0x49, 0x67, 0x60, 0x08,
-- 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18,
-- 0x60, 0x28, 0xe0, 0x66, 0x98, 0x03, 0x28, 0x04,
-- 0xd1, 0x15, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x5a,
-- 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x98, 0x03,
-- 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 0x43, 0x18,
-- 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x48, 0x56,
-- 0x70, 0x04, 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b,
-- 0x43, 0x18, 0x60, 0x28, 0xe0, 0x4d, 0x98, 0x03,
-- 0x23, 0x10, 0x40, 0x18, 0xd0, 0x0f, 0x21, 0x00,
-- 0x00, 0xe0, 0x4a, 0x4d, 0x68, 0x12, 0x18, 0x80,
-- 0x60, 0x41, 0x68, 0x38, 0x4b, 0x52, 0x43, 0x18,
-- 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x37, 0x04,
-- 0x20, 0x0e, 0x60, 0x38, 0xe0, 0x39, 0x98, 0x03,
-- 0x28, 0x08, 0xd1, 0x23, 0x48, 0x4d, 0x68, 0x00,
-- 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x03,
-- 0x20, 0x4f, 0xb0, 0x04, 0xe6, 0xf8, 0xe0, 0x67,
-- 0x20, 0x01, 0x49, 0x48, 0x68, 0x09, 0x31, 0x60,
-- 0x76, 0x88, 0x48, 0x46, 0x68, 0x00, 0x30, 0x60,
-- 0x76, 0x04, 0x20, 0x01, 0x49, 0x43, 0x68, 0x09,
-- 0x31, 0x80, 0x70, 0xc8, 0x49, 0x42, 0x00, 0xe0,
-- 0x4a, 0x37, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41,
-- 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18,
-- 0x60, 0x28, 0xe0, 0x12, 0x21, 0x00, 0x00, 0xe0,
-- 0x4a, 0x31, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41,
-- 0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20,
-- 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x60, 0x38,
-- 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18,
-- 0x60, 0x28, 0xe0, 0x33, 0x98, 0x03, 0x23, 0x10,
-- 0x40, 0x18, 0xd0, 0x09, 0x1c, 0x20, 0xf0, 0x05,
-- 0xf8, 0x0f, 0x90, 0x00, 0x28, 0x00, 0xd0, 0x02,
-- 0x98, 0x00, 0xb0, 0x04, 0xe6, 0xbc, 0xe0, 0x1a,
-- 0x98, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x20, 0xff,
-- 0x49, 0x21, 0x70, 0x48, 0xe0, 0x13, 0x98, 0x03,
-- 0x28, 0x02, 0xd1, 0x03, 0x20, 0xff, 0x49, 0x1e,
-- 0x70, 0x88, 0xe0, 0x0c, 0x98, 0x03, 0x28, 0x08,
-- 0xd1, 0x09, 0x20, 0x00, 0x49, 0x21, 0x68, 0x09,
-- 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0x49, 0x1f,
-- 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x7d, 0x30,
-- 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 0xd1, 0x03,
-- 0x1c, 0x20, 0x49, 0x1c, 0xf0, 0x00, 0xf9, 0x16,
-- 0x20, 0x00, 0x70, 0xb0, 0x20, 0x00, 0xb0, 0x04,
-- 0xe6, 0x92, 0xb0, 0x01, 0xb0, 0x03, 0xe6, 0x8f,
-- 0xe6, 0x8e, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0,
-- 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4,
-- 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0xff,
-- 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20,
-- 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5d, 0xd8,
-- 0xff, 0xff, 0x1f, 0xff, 0x2e, 0x08, 0x5e, 0x2c,
-- 0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0x01,
-- 0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xfc,
-- 0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x80,
-- 0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x5e, 0x44,
-- 0x00, 0x00, 0x20, 0xa0, 0x2e, 0x08, 0x7c, 0x44,
-- 0x66, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x00, 0x00,
-- 0xb5, 0xff, 0x98, 0x00, 0x06, 0x01, 0x0e, 0x09,
-- 0x98, 0x01, 0x06, 0x02, 0x0e, 0x12, 0x98, 0x02,
-- 0x04, 0x07, 0x0c, 0x3f, 0x9b, 0x03, 0x04, 0x1c,
-- 0x0c, 0x24, 0x29, 0x20, 0xdb, 0x04, 0x20, 0xa2,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2a, 0x02, 0xd1, 0x0a, 0x00, 0xc8, 0x4b, 0x1f,
-- 0x68, 0x1b, 0x58, 0x18, 0x4b, 0x1e, 0x40, 0x18,
-- 0x00, 0xcb, 0x4d, 0x1c, 0x68, 0x2d, 0x50, 0xe8,
-- 0xe0, 0x30, 0x2a, 0x01, 0xd1, 0x0b, 0x00, 0xc8,
-- 0x4b, 0x18, 0x68, 0x1b, 0x58, 0x18, 0x43, 0x27,
-- 0x1c, 0x3b, 0x43, 0x18, 0x00, 0xcb, 0x4d, 0x15,
-- 0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x22, 0x20, 0x00,
-- 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x1e, 0x1c, 0x43,
-- 0x06, 0x1b, 0x16, 0x18, 0xe7, 0xf8, 0x2a, 0x03,
-- 0xd1, 0x0b, 0x00, 0xc3, 0x4d, 0x0d, 0x68, 0x2d,
-- 0x58, 0xeb, 0x1c, 0x3d, 0x43, 0x25, 0x43, 0x1d,
-- 0x00, 0xc3, 0x4e, 0x0a, 0x68, 0x36, 0x50, 0xf5,
-- 0xe0, 0x0b, 0x2a, 0x04, 0xd1, 0x09, 0x00, 0xc3,
-- 0x4d, 0x06, 0x68, 0x2d, 0x58, 0xed, 0x4b, 0x06,
-- 0x40, 0x2b, 0x00, 0xc5, 0x4e, 0x03, 0x68, 0x36,
-- 0x51, 0x73, 0xe7, 0xe0, 0x20, 0x00, 0xe7, 0xbb,
-- 0xe7, 0xba, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0,
-- 0xff, 0xff, 0xe1, 0xff, 0xb4, 0xb0, 0x1c, 0x07,
-- 0x1c, 0x0a, 0x06, 0x38, 0x0e, 0x00, 0x06, 0x11,
-- 0x0e, 0x09, 0x4c, 0x14, 0x68, 0x25, 0x4b, 0x14,
-- 0x40, 0x2b, 0x60, 0x23, 0x28, 0x01, 0xd1, 0x06,
-- 0x4c, 0x10, 0x68, 0x25, 0x23, 0x01, 0x04, 0x1b,
-- 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 0x28, 0x00,
-- 0xd1, 0x05, 0x4c, 0x0c, 0x68, 0x25, 0x23, 0x01,
-- 0x05, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0x29, 0x01,
-- 0xd1, 0x06, 0x4c, 0x08, 0x68, 0x25, 0x23, 0x01,
-- 0x03, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07,
-- 0x29, 0x02, 0xd1, 0x05, 0x4c, 0x03, 0x68, 0x25,
-- 0x23, 0x01, 0x03, 0xdb, 0x43, 0x2b, 0x60, 0x23,
-- 0xbc, 0xb0, 0x47, 0x70, 0x64, 0x00, 0x00, 0x24,
-- 0xff, 0xbe, 0x3f, 0xff, 0xb5, 0xff, 0x1c, 0x1f,
-- 0x9c, 0x09, 0xb0, 0x82, 0x98, 0x02, 0x04, 0x00,
-- 0x0c, 0x00, 0x90, 0x00, 0x99, 0x03, 0x06, 0x0a,
-- 0x0e, 0x12, 0x98, 0x04, 0x06, 0x05, 0x0e, 0x2d,
-- 0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x01,
-- 0x00, 0xd0, 0x1a, 0x80, 0x00, 0x80, 0x4b, 0x1b,
-- 0x68, 0x1b, 0x18, 0xc1, 0x2a, 0x20, 0xdb, 0x05,
-- 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x02,
-- 0x20, 0xaf, 0xb0, 0x02, 0xe7, 0xf6, 0x71, 0x8d,
-- 0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x12, 0x68, 0x36,
-- 0x19, 0x80, 0x60, 0x43, 0x1c, 0x20, 0x71, 0xc8,
-- 0x20, 0x00, 0x80, 0x88, 0x20, 0x00, 0x60, 0xc8,
-- 0x98, 0x00, 0x23, 0x01, 0x43, 0x18, 0x75, 0x08,
-- 0x98, 0x01, 0x74, 0x88, 0x60, 0x8f, 0x88, 0xb8,
-- 0x82, 0x08, 0x20, 0x00, 0x74, 0xc8, 0x88, 0xb8,
-- 0x61, 0x38, 0x20, 0x00, 0x73, 0x38, 0x20, 0x00,
-- 0x73, 0x78, 0x20, 0x00, 0x73, 0xb8, 0x20, 0x00,
-- 0x73, 0xf8, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd1,
-- 0xb0, 0x02, 0xe7, 0xcf, 0x2e, 0x08, 0x5d, 0xc4,
-- 0x2e, 0x08, 0x5d, 0xd4, 0xb5, 0xf3, 0x98, 0x00,
-- 0x06, 0x04, 0x0e, 0x24, 0x99, 0x01, 0x04, 0x0d,
-- 0x0c, 0x2d, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80,
-- 0x49, 0x25, 0x68, 0x09, 0x18, 0x47, 0x2c, 0x20,
-- 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x21, 0x42, 0x9d,
-- 0xd1, 0x27, 0x00, 0xe1, 0x4b, 0x20, 0x68, 0x1b,
-- 0x18, 0xc8, 0x00, 0xa1, 0x4b, 0x1f, 0x68, 0x1b,
-- 0x18, 0xca, 0x68, 0x11, 0x4b, 0x1e, 0x40, 0x19,
-- 0x60, 0x11, 0x68, 0x01, 0x23, 0x40, 0x40, 0x19,
-- 0xd0, 0x13, 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb,
-- 0x40, 0x19, 0x60, 0x01, 0x21, 0x00, 0x4b, 0x19,
-- 0x68, 0x1b, 0x70, 0x19, 0x49, 0x18, 0x68, 0x0b,
-- 0x08, 0x5b, 0x00, 0x5b, 0x60, 0x0b, 0x49, 0x17,
-- 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33,
-- 0x60, 0x0b, 0x68, 0x01, 0x4b, 0x14, 0x40, 0x19,
-- 0x60, 0x01, 0x20, 0x00, 0x75, 0x38, 0x20, 0x00,
-- 0x80, 0x38, 0x20, 0x00, 0x80, 0xb8, 0x68, 0xb8,
-- 0x72, 0x44, 0x20, 0xa0, 0x68, 0xb9, 0x72, 0x08,
-- 0x20, 0x00, 0x60, 0xb8, 0x79, 0xb9, 0x20, 0x01,
-- 0x40, 0x88, 0xf0, 0x11, 0xf9, 0xe5, 0x20, 0x00,
-- 0x71, 0xb8, 0x20, 0x00, 0xe7, 0xba, 0xe7, 0xb9,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc,
-- 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5d, 0xc0,
-- 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20,
-- 0xff, 0xff, 0x3f, 0xde, 0xb5, 0xff, 0x1c, 0x05,
-- 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x28, 0x0e, 0x00,
-- 0x06, 0x23, 0x0e, 0x1b, 0x06, 0x39, 0x0e, 0x09,
-- 0x9e, 0x03, 0x06, 0x36, 0x16, 0x32, 0x28, 0x20,
-- 0xda, 0x02, 0x4e, 0x08, 0x68, 0x36, 0x60, 0x30,
-- 0x4e, 0x07, 0x68, 0x36, 0x60, 0x33, 0x4e, 0x07,
-- 0x68, 0x36, 0x60, 0x31, 0x4e, 0x06, 0x68, 0x36,
-- 0x60, 0x32, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xec,
-- 0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4,
-- 0x2e, 0x08, 0x5d, 0xf8, 0x1c, 0x01, 0x06, 0x08,
-- 0x0e, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x22, 0x01,
-- 0x4b, 0x04, 0x68, 0x1b, 0x60, 0x1a, 0xe0, 0x03,
-- 0x22, 0x02, 0x4b, 0x02, 0x68, 0x1b, 0x60, 0x1a,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x34,
-- 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24,
-- 0xb0, 0x81, 0x27, 0x00, 0x26, 0x00, 0x4a, 0x55,
-- 0x92, 0x00, 0x00, 0xe0, 0x49, 0x54, 0x68, 0x09,
-- 0x58, 0x08, 0x23, 0x03, 0x03, 0x9b, 0x40, 0x18,
-- 0x23, 0x01, 0x03, 0x9b, 0x42, 0x98, 0xd0, 0x05,
-- 0x20, 0xa0, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0xe0, 0x49, 0x4c,
-- 0x68, 0x09, 0x58, 0x08, 0x21, 0x20, 0x43, 0x01,
-- 0x00, 0xe0, 0x4a, 0x49, 0x68, 0x12, 0x50, 0x11,
-- 0x21, 0x00, 0x48, 0x48, 0xf0, 0x05, 0xfc, 0x3c,
-- 0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x01,
-- 0xe0, 0x08, 0xe0, 0x82, 0x20, 0x02, 0xf0, 0x0c,
-- 0xf8, 0x75, 0x1c, 0x38, 0x37, 0x01, 0x4b, 0x43,
-- 0x42, 0x98, 0xd3, 0xf1, 0x4b, 0x41, 0x42, 0x9f,
-- 0xd3, 0x00, 0x26, 0xa1, 0x48, 0x40, 0x68, 0x01,
-- 0x4b, 0x40, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00,
-- 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x3e,
-- 0x68, 0x12, 0x18, 0x89, 0x70, 0x88, 0x20, 0x00,
-- 0x43, 0xc0, 0x49, 0x3c, 0x67, 0x48, 0x22, 0x00,
-- 0xb4, 0x04, 0x1c, 0x20, 0x23, 0x00, 0x22, 0x00,
-- 0x49, 0x39, 0xf7, 0xff, 0xfc, 0x69, 0xb0, 0x01,
-- 0x27, 0x00, 0x25, 0x00, 0x2d, 0x04, 0xdb, 0x02,
-- 0xe0, 0x1e, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa9,
-- 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x29,
-- 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xa1,
-- 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9,
-- 0x40, 0x01, 0xd0, 0x01, 0x37, 0x01, 0xe0, 0x00,
-- 0xe0, 0x02, 0x4b, 0x26, 0x42, 0x9f, 0xd3, 0xf4,
-- 0x4b, 0x24, 0x42, 0x9f, 0xd3, 0x02, 0x26, 0xa1,
-- 0xe0, 0x02, 0xe0, 0x3a, 0x27, 0x00, 0xe7, 0xe0,
-- 0x48, 0x26, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01,
-- 0x43, 0x19, 0x60, 0x01, 0x48, 0x21, 0x6d, 0x80,
-- 0x49, 0x20, 0x65, 0x88, 0x48, 0x1f, 0x6b, 0xc0,
-- 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00,
-- 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40,
-- 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x33,
-- 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49,
-- 0x66, 0x88, 0x20, 0x03, 0x02, 0x00, 0x49, 0x15,
-- 0x67, 0x48, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01,
-- 0x02, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00,
-- 0x49, 0x13, 0x65, 0x88, 0x20, 0x00, 0x49, 0x12,
-- 0x65, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x66, 0x08,
-- 0x21, 0x00, 0x20, 0xff, 0xf0, 0x05, 0xfb, 0xb8,
-- 0x1c, 0x30, 0xb0, 0x01, 0xe7, 0x66, 0xb0, 0x01,
-- 0xe7, 0x64, 0xe7, 0x63, 0x9e, 0x00, 0x00, 0xc0,
-- 0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0x80, 0x0f,
-- 0xcc, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x84, 0x80,
-- 0x66, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfd, 0xff,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x66, 0x00, 0x00, 0x80,
-- 0x00, 0x00, 0xff, 0xff, 0x66, 0x00, 0x00, 0xe0,
-- 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf1, 0x98, 0x00,
-- 0x06, 0x07, 0x0e, 0x3f, 0xb0, 0x81, 0x25, 0x00,
-- 0x26, 0x00, 0x4a, 0x2e, 0x92, 0x00, 0x00, 0xf8,
-- 0x49, 0x2d, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03,
-- 0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0xdb,
-- 0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01,
-- 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x38, 0x23, 0x00,
-- 0x22, 0x00, 0x49, 0x24, 0xf7, 0xff, 0xfb, 0xd0,
-- 0xb0, 0x01, 0x24, 0x00, 0x2c, 0x04, 0xdb, 0x02,
-- 0xe0, 0x1e, 0x34, 0x01, 0xe7, 0xfa, 0x00, 0xa1,
-- 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x21,
-- 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xb9,
-- 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9,
-- 0x40, 0x01, 0xd0, 0x01, 0x35, 0x01, 0xe0, 0x00,
-- 0xe0, 0x02, 0x4b, 0x17, 0x42, 0x9d, 0xd3, 0xf4,
-- 0x4b, 0x15, 0x42, 0x9d, 0xd9, 0x02, 0x26, 0xa1,
-- 0xe0, 0x02, 0xe0, 0x1d, 0x25, 0x00, 0xe7, 0xe0,
-- 0x20, 0x04, 0xf0, 0x02, 0xff, 0xb7, 0x20, 0x01,
-- 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 0x21, 0x00,
-- 0x00, 0xf8, 0x4a, 0x0b, 0x68, 0x12, 0x50, 0x11,
-- 0x21, 0x00, 0x00, 0xf8, 0x4a, 0x08, 0x68, 0x12,
-- 0x18, 0x80, 0x60, 0x41, 0x21, 0x00, 0x00, 0xb8,
-- 0x4a, 0x08, 0x68, 0x12, 0x50, 0x11, 0x1c, 0x30,
-- 0xb0, 0x01, 0xe7, 0xb5, 0xb0, 0x01, 0xe7, 0xb3,
-- 0xe7, 0xb2, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0,
-- 0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0xff, 0xff,
-- 0x00, 0x01, 0xd4, 0xc0, 0x2e, 0x08, 0x5d, 0xcc,
-- 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f,
-- 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03,
-- 0x06, 0x1e, 0x0e, 0x36, 0x2d, 0x1f, 0xdb, 0x04,
-- 0x20, 0xaf, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x2f, 0x20, 0xdb, 0x01, 0x20, 0xa2,
-- 0xe7, 0xf7, 0x2e, 0x80, 0xd0, 0x13, 0xf0, 0x11,
-- 0xf8, 0x89, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80,
-- 0x20, 0x01, 0xf0, 0x00, 0xfb, 0x6d, 0x2c, 0x80,
-- 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xb5, 0x98, 0x00,
-- 0x21, 0x80, 0x68, 0x49, 0x60, 0x08, 0x48, 0x09,
-- 0x68, 0x00, 0x70, 0x05, 0xe0, 0x0b, 0xf0, 0x11,
-- 0xf8, 0x75, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80,
-- 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x59, 0x2c, 0x80,
-- 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xa1, 0x20, 0x00,
-- 0xe7, 0xd3, 0xe7, 0xd2, 0x2e, 0x08, 0x5e, 0x1c,
-- 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36,
-- 0x9a, 0x02, 0x06, 0x17, 0x0e, 0x3f, 0x9b, 0x03,
-- 0x06, 0x1c, 0x0e, 0x24, 0xb0, 0x82, 0x20, 0x80,
-- 0x40, 0x38, 0x90, 0x00, 0x06, 0x7f, 0x0e, 0x7f,
-- 0x2e, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2c, 0x20, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x02,
-- 0xe7, 0xf6, 0x2f, 0x04, 0xd1, 0x00, 0x27, 0x00,
-- 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x17,
-- 0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x00,
-- 0x28, 0x00, 0xd0, 0x0d, 0xf0, 0x11, 0xf8, 0x3a,
-- 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92,
-- 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x1d, 0x2d, 0x80,
-- 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x65, 0xe0, 0x13,
-- 0xf0, 0x11, 0xf8, 0x2c, 0x1c, 0x05, 0x1c, 0x21,
-- 0x22, 0x01, 0x02, 0x92, 0x20, 0x01, 0xf0, 0x00,
-- 0xfb, 0x0f, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x11,
-- 0xf8, 0x57, 0x98, 0x02, 0x21, 0x80, 0x68, 0x89,
-- 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x55, 0xc6,
-- 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xc4, 0xb0, 0x02,
-- 0xe7, 0xc2, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4,
-- 0xb5, 0xff, 0xb0, 0x82, 0x99, 0x03, 0x04, 0x0d,
-- 0x0c, 0x2d, 0x9a, 0x04, 0x06, 0x10, 0x0e, 0x00,
-- 0x90, 0x00, 0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00,
-- 0x90, 0x01, 0x98, 0x00, 0x28, 0x1f, 0xdb, 0x05,
-- 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x23, 0x80,
-- 0x40, 0x18, 0xd1, 0x2f, 0x98, 0x00, 0x49, 0x2c,
-- 0x68, 0x09, 0x73, 0x08, 0x27, 0x00, 0x2f, 0x20,
-- 0xdb, 0x04, 0xe0, 0x26, 0x1c, 0x78, 0x06, 0x07,
-- 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8,
-- 0x99, 0x02, 0x40, 0x08, 0xd0, 0x1c, 0x24, 0x00,
-- 0x20, 0x40, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20,
-- 0x0c, 0x00, 0x24, 0x01, 0x03, 0xa4, 0x43, 0x04,
-- 0x20, 0x80, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20,
-- 0x0c, 0x00, 0x24, 0x01, 0x03, 0xe4, 0x43, 0x04,
-- 0xf0, 0x10, 0xff, 0xd4, 0x1c, 0x06, 0x1c, 0x22,
-- 0x1c, 0x39, 0x20, 0x01, 0xf0, 0x00, 0xfa, 0xb8,
-- 0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x00,
-- 0xe7, 0xd8, 0xe0, 0x24, 0x27, 0x00, 0x2f, 0x20,
-- 0xdb, 0x04, 0xe0, 0x20, 0x1c, 0x78, 0x06, 0x07,
-- 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8,
-- 0x99, 0x02, 0x40, 0x08, 0xd0, 0x16, 0x24, 0x00,
-- 0x20, 0x40, 0x40, 0x28, 0xd0, 0x01, 0x4b, 0x0d,
-- 0x40, 0x1c, 0x20, 0x80, 0x40, 0x28, 0xd0, 0x01,
-- 0x04, 0x64, 0x0c, 0x64, 0xf0, 0x10, 0xff, 0xae,
-- 0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x02,
-- 0xf0, 0x00, 0xfa, 0x92, 0x2e, 0x80, 0xd0, 0x01,
-- 0xf0, 0x10, 0xff, 0xda, 0xe7, 0xde, 0x20, 0x00,
-- 0xb0, 0x02, 0xe7, 0x9f, 0xb0, 0x02, 0xe7, 0x9d,
-- 0x2e, 0x08, 0x5e, 0x10, 0x00, 0x00, 0xbf, 0xff,
-- 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x07, 0x68, 0x01,
-- 0x20, 0x00, 0xf0, 0x19, 0xfe, 0x73, 0x60, 0x38,
-- 0x48, 0x04, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00,
-- 0xf0, 0x19, 0xfe, 0x6c, 0x60, 0x78, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x10,
-- 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e,
-- 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24,
-- 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20,
-- 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80,
-- 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x6e,
-- 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2,
-- 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x51, 0x2d, 0x80,
-- 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x99, 0xe0, 0x16,
-- 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b,
-- 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09,
-- 0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x56,
-- 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2,
-- 0x20, 0x01, 0xf0, 0x00, 0xfa, 0x39, 0x2d, 0x80,
-- 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x81, 0x20, 0x00,
-- 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x14,
-- 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e,
-- 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24,
-- 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20,
-- 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80,
-- 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x2e,
-- 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12,
-- 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x11, 0x2d, 0x80,
-- 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x59, 0xe0, 0x16,
-- 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b,
-- 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09,
-- 0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x16,
-- 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12,
-- 0x20, 0x01, 0xf0, 0x00, 0xf9, 0xf9, 0x2d, 0x80,
-- 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x41, 0x20, 0x00,
-- 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x18,
-- 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00,
-- 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d,
-- 0x0e, 0x2d, 0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36,
-- 0x9f, 0x04, 0x1c, 0x29, 0x98, 0x00, 0xf0, 0x00,
-- 0xf8, 0x91, 0x28, 0x00, 0xd0, 0x05, 0x20, 0xa2,
-- 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x79, 0x38, 0x79, 0x79, 0x18, 0x40,
-- 0x79, 0xb9, 0x18, 0x40, 0x06, 0x04, 0x0e, 0x24,
-- 0x79, 0xb8, 0x02, 0x00, 0x43, 0x04, 0x00, 0x68,
-- 0x19, 0x80, 0x01, 0x00, 0x49, 0x15, 0x68, 0x09,
-- 0x50, 0x0c, 0x9b, 0x04, 0x88, 0x99, 0x00, 0x68,
-- 0x19, 0x80, 0x01, 0x00, 0x4a, 0x11, 0x68, 0x12,
-- 0x18, 0x80, 0x60, 0x41, 0x78, 0x78, 0x78, 0x39,
-- 0x18, 0x40, 0x78, 0xb9, 0x18, 0x40, 0x06, 0x04,
-- 0x0e, 0x24, 0x78, 0xb8, 0x02, 0x00, 0x43, 0x04,
-- 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 0x49, 0x09,
-- 0x68, 0x09, 0x18, 0x40, 0x60, 0x84, 0x9b, 0x04,
-- 0x88, 0x19, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00,
-- 0x4a, 0x04, 0x68, 0x12, 0x18, 0x80, 0x60, 0xc1,
-- 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01,
-- 0xe7, 0xc3, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc8,
-- 0xb5, 0xff, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d,
-- 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x9a, 0x02,
-- 0x06, 0x16, 0x0e, 0x36, 0x1c, 0x21, 0x1c, 0x28,
-- 0xf0, 0x00, 0xf8, 0x40, 0x28, 0x00, 0xd0, 0x04,
-- 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20,
-- 0xf0, 0x00, 0xf8, 0x02, 0xe7, 0xf5, 0xe7, 0xf4,
-- 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13,
-- 0x06, 0x21, 0x0e, 0x09, 0x06, 0x3a, 0x0e, 0x12,
-- 0x29, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xf0,
-- 0x47, 0x70, 0x88, 0xdd, 0x00, 0x48, 0x18, 0x80,
-- 0x01, 0x00, 0x4e, 0x0f, 0x68, 0x36, 0x50, 0x35,
-- 0x88, 0x98, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d,
-- 0x4e, 0x0b, 0x68, 0x36, 0x19, 0xad, 0x60, 0x68,
-- 0x88, 0x58, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d,
-- 0x4e, 0x07, 0x68, 0x36, 0x19, 0xad, 0x60, 0xa8,
-- 0x88, 0x18, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d,
-- 0x4e, 0x03, 0x68, 0x36, 0x19, 0xad, 0x60, 0xe8,
-- 0x20, 0x00, 0xe7, 0xdc, 0xe7, 0xdb, 0x00, 0x00,
-- 0x2e, 0x08, 0x5d, 0xc8, 0xb4, 0xb0, 0x1c, 0x07,
-- 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x15,
-- 0x0e, 0x2d, 0xb0, 0x81, 0x29, 0x20, 0xdb, 0x03,
-- 0x20, 0xa2, 0xb0, 0x01, 0xbc, 0xb0, 0x47, 0x70,
-- 0x2d, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x01,
-- 0xe7, 0xf8, 0x00, 0xc8, 0x4b, 0x0a, 0x68, 0x1b,
-- 0x18, 0xc4, 0x68, 0x20, 0x90, 0x00, 0x98, 0x00,
-- 0x4b, 0x08, 0x40, 0x18, 0x90, 0x00, 0x00, 0x68,
-- 0x23, 0x1e, 0x40, 0x18, 0x9b, 0x00, 0x43, 0x18,
-- 0x90, 0x00, 0x98, 0x00, 0x60, 0x20, 0x20, 0x00,
-- 0xb0, 0x01, 0xe7, 0xe3, 0xb0, 0x01, 0xe7, 0xe1,
-- 0x2e, 0x08, 0x5d, 0xd0, 0xff, 0xff, 0xdf, 0xe1,
-- 0x20, 0xff, 0x49, 0x02, 0x68, 0x09, 0x70, 0x08,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x2c,
-- 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x83,
-- 0x20, 0x00, 0x43, 0xc0, 0x23, 0x19, 0x06, 0x9b,
-- 0x67, 0x58, 0x08, 0xb9, 0x00, 0x89, 0x1a, 0x78,
-- 0x90, 0x02, 0x98, 0x02, 0x18, 0x10, 0x07, 0x80,
-- 0x0f, 0x80, 0x90, 0x01, 0x98, 0x02, 0x18, 0x10,
-- 0x08, 0x80, 0x90, 0x00, 0x9b, 0x02, 0x20, 0x03,
-- 0x1a, 0xc0, 0x23, 0x19, 0x06, 0x9b, 0x67, 0xd8,
-- 0x24, 0x00, 0x98, 0x00, 0x42, 0x84, 0xd3, 0x02,
-- 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xf9, 0xc9, 0x08,
-- 0x20, 0x19, 0x06, 0x80, 0x67, 0x03, 0xe7, 0xf8,
-- 0x98, 0x01, 0x28, 0x00, 0xd0, 0x0b, 0x9b, 0x01,
-- 0x00, 0xd8, 0x25, 0x00, 0x43, 0xed, 0x40, 0xc5,
-- 0x1c, 0x2b, 0x43, 0xdb, 0x68, 0x0d, 0x40, 0x2b,
-- 0x25, 0x19, 0x06, 0xad, 0x67, 0x2b, 0x20, 0x19,
-- 0x06, 0x80, 0x6f, 0x40, 0xb0, 0x03, 0xbc, 0xb0,
-- 0x47, 0x70, 0xb0, 0x03, 0xe7, 0xfb, 0x1c, 0x01,
-- 0x06, 0x08, 0x0e, 0x00, 0x22, 0x19, 0x06, 0x92,
-- 0x63, 0x90, 0x47, 0x70, 0xb4, 0xf0, 0x48, 0x4d,
-- 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x74,
-- 0x22, 0x00, 0x27, 0x00, 0x49, 0x4a, 0x20, 0x00,
-- 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x16, 0x1c, 0x43,
-- 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x00, 0x83,
-- 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x23,
-- 0xd0, 0x0b, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23,
-- 0x43, 0x1f, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01,
-- 0x03, 0x5b, 0x43, 0x9c, 0x1c, 0x23, 0x00, 0x84,
-- 0x51, 0x0b, 0xe7, 0xe8, 0x20, 0x00, 0x28, 0x04,
-- 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x43, 0x06, 0x18,
-- 0x0e, 0x00, 0xe7, 0xf8, 0x01, 0x05, 0x4b, 0x39,
-- 0x18, 0xec, 0x22, 0x00, 0x2a, 0x04, 0xdb, 0x04,
-- 0xe0, 0x0e, 0x1c, 0x53, 0x06, 0x1a, 0x0e, 0x12,
-- 0xe7, 0xf8, 0x4b, 0x35, 0x60, 0x23, 0x4b, 0x35,
-- 0x60, 0x63, 0x23, 0x00, 0x60, 0xa3, 0x23, 0x00,
-- 0x60, 0xe3, 0x34, 0xff, 0x34, 0x01, 0xe7, 0xf0,
-- 0xe7, 0xe4, 0xb0, 0x82, 0x4b, 0x2b, 0x69, 0xdc,
-- 0x23, 0x0c, 0x40, 0x23, 0x08, 0x9c, 0xab, 0x01,
-- 0x70, 0x1c, 0x4b, 0x28, 0x69, 0xdc, 0x23, 0x30,
-- 0x40, 0x23, 0x09, 0x1c, 0xab, 0x00, 0x70, 0x1c,
-- 0xab, 0x01, 0x78, 0x1b, 0xac, 0x00, 0x78, 0x24,
-- 0x42, 0xa3, 0xd1, 0x09, 0x23, 0x33, 0x06, 0x5b,
-- 0x6b, 0xdb, 0x2b, 0x00, 0xd1, 0x04, 0x4b, 0x1f,
-- 0x6a, 0x9b, 0x07, 0xdb, 0x0f, 0xdb, 0xd0, 0x21,
-- 0x4b, 0x1c, 0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b,
-- 0x08, 0x9c, 0x00, 0xa5, 0x26, 0x01, 0x40, 0xae,
-- 0x1c, 0x33, 0x25, 0x33, 0x06, 0x6d, 0x64, 0x2b,
-- 0x25, 0x01, 0x40, 0xa5, 0x1c, 0x2b, 0x4d, 0x1a,
-- 0x63, 0xab, 0x4b, 0x14, 0x69, 0xdd, 0x23, 0x0c,
-- 0x40, 0x2b, 0x08, 0x9d, 0xab, 0x01, 0x70, 0x1d,
-- 0xe0, 0x00, 0xe0, 0x1d, 0x4b, 0x0f, 0x69, 0xdd,
-- 0x23, 0x30, 0x40, 0x2b, 0x09, 0x1d, 0xab, 0x00,
-- 0x70, 0x1d, 0xe7, 0xcd, 0xb0, 0x02, 0x20, 0x00,
-- 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x43,
-- 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x24, 0x01,
-- 0x40, 0x84, 0x1c, 0x23, 0x40, 0x3b, 0xd0, 0x06,
-- 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b,
-- 0x43, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xee,
-- 0xbc, 0xf0, 0x47, 0x70, 0x66, 0x00, 0x01, 0x00,
-- 0x64, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x00, 0xc0,
-- 0x9e, 0x00, 0x00, 0x00, 0x2e, 0x0f, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x03,
-- 0x1c, 0x0a, 0x48, 0x0a, 0x68, 0x00, 0x68, 0x01,
-- 0x20, 0x19, 0x06, 0x80, 0x6a, 0x80, 0x0a, 0x40,
-- 0x00, 0x4f, 0x43, 0x38, 0x60, 0x18, 0x0f, 0xc8,
-- 0x07, 0xc0, 0x60, 0x10, 0x68, 0x10, 0x0f, 0xc0,
-- 0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70,
-- 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x38,
-- 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x05, 0x68, 0x00,
-- 0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 0xf0, 0x19,
-- 0xfb, 0xfd, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x10,
-- 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13,
-- 0x06, 0x20, 0x0e, 0x00, 0x06, 0x39, 0x0e, 0x09,
-- 0x04, 0x1a, 0x0c, 0x12, 0x4d, 0x07, 0x68, 0x2d,
-- 0x70, 0xe8, 0x4d, 0x06, 0x68, 0x2d, 0x70, 0xa9,
-- 0x4d, 0x04, 0x68, 0x2d, 0x80, 0x2a, 0x25, 0x01,
-- 0x04, 0x2d, 0x26, 0x33, 0x06, 0x76, 0x60, 0x35,
-- 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x3c,
-- 0x20, 0x0d, 0x06, 0xc0, 0x69, 0xc0, 0x47, 0x70,
-- 0xe7, 0xfd, 0x1c, 0x01, 0x31, 0x01, 0x23, 0x2d,
-- 0x01, 0x1b, 0x42, 0x99, 0xd9, 0x03, 0x20, 0x2d,
-- 0x01, 0x00, 0x47, 0x70, 0xe0, 0x01, 0x1c, 0x08,
-- 0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, 0xb0, 0x85,
-- 0x20, 0x00, 0x90, 0x03, 0x20, 0x00, 0x90, 0x02,
-- 0x9f, 0x05, 0x69, 0x3d, 0x69, 0x38, 0x28, 0x13,
-- 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x05, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x06,
-- 0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, 0x1c, 0x41,
-- 0x91, 0x04, 0x69, 0x78, 0x23, 0x04, 0x40, 0x18,
-- 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04,
-- 0x00, 0xa8, 0x49, 0xf8, 0x58, 0x08, 0x99, 0x04,
-- 0x43, 0x48, 0x61, 0xf8, 0x99, 0x06, 0x68, 0x88,
-- 0x68, 0x09, 0x1a, 0x40, 0x30, 0x01, 0x63, 0xb8,
-- 0x68, 0xf8, 0x90, 0x01, 0x48, 0xf2, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x06, 0x98, 0x01, 0x28, 0x19,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0xe0, 0x05, 0x98, 0x01, 0x28, 0x08, 0xd3, 0x01,
-- 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00,
-- 0xd0, 0x07, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06,
-- 0xf0, 0x02, 0xf9, 0xea, 0x20, 0x00, 0xb0, 0x05,
-- 0xe7, 0xc5, 0x49, 0xe6, 0x20, 0x91, 0xf0, 0x19,
-- 0xfb, 0x7d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01,
-- 0xf0, 0x0b, 0xfb, 0x64, 0xe7, 0xf5, 0x98, 0x01,
-- 0x00, 0x80, 0x49, 0xe1, 0x58, 0x08, 0x99, 0x05,
-- 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0xdd,
-- 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 0xe7, 0xae,
-- 0x48, 0xd9, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03,
-- 0x2d, 0x0b, 0xdb, 0x26, 0x2d, 0x12, 0xdc, 0x24,
-- 0x2d, 0x0b, 0xdb, 0x0b, 0x2d, 0x12, 0xdc, 0x09,
-- 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05,
-- 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02,
-- 0xf9, 0xbb, 0xe0, 0x16, 0x6b, 0x38, 0xf7, 0xff,
-- 0xff, 0x7c, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00,
-- 0x48, 0xcf, 0xf0, 0x0c, 0xfb, 0x4b, 0x1d, 0xf8,
-- 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xac,
-- 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x6e, 0x90, 0x00,
-- 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xc8, 0xf0, 0x0c,
-- 0xfb, 0x6b, 0x48, 0xc8, 0x68, 0x00, 0x99, 0x05,
-- 0x42, 0x88, 0xd1, 0x30, 0x48, 0xc0, 0x68, 0x00,
-- 0x28, 0x00, 0xd1, 0x2c, 0x48, 0xc1, 0x68, 0x00,
-- 0x28, 0x00, 0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0,
-- 0x68, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x01,
-- 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9,
-- 0x60, 0xc8, 0x48, 0xba, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x0d, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00,
-- 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08,
-- 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d,
-- 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x0b, 0x6a, 0xb8,
-- 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01,
-- 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02,
-- 0x43, 0x08, 0x49, 0xaf, 0x60, 0x08, 0x2d, 0x0b,
-- 0xdb, 0x15, 0x2d, 0x12, 0xdc, 0x13, 0x48, 0xa9,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0f, 0x48, 0xa4,
-- 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0b, 0x20, 0x00,
-- 0x62, 0xb8, 0x20, 0x00, 0x62, 0xf8, 0x48, 0xa7,
-- 0x63, 0x38, 0x48, 0xa7, 0x63, 0x78, 0x6b, 0x38,
-- 0xf7, 0xff, 0xff, 0x1b, 0x90, 0x00, 0x48, 0x9c,
-- 0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d,
-- 0x06, 0xc0, 0x68, 0x80, 0x90, 0x03, 0x20, 0x00,
-- 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x01,
-- 0xfb, 0x07, 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x09,
-- 0x90, 0x00, 0x9a, 0x00, 0x99, 0x01, 0x1c, 0x38,
-- 0xf0, 0x01, 0xfa, 0x8c, 0x98, 0x03, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x88, 0x48, 0x93, 0x68, 0x00,
-- 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0b, 0x48, 0x8c,
-- 0x68, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x48, 0x8d,
-- 0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x98, 0x02,
-- 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0x86,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0x48, 0x87,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0xb0, 0x84,
-- 0x98, 0x05, 0xf0, 0x0c, 0xf9, 0xe1, 0x28, 0x00,
-- 0xd1, 0x0e, 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12,
-- 0xdd, 0x0a, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x0a,
-- 0xf0, 0x02, 0xf9, 0x12, 0x20, 0x92, 0x49, 0x7b,
-- 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe6, 0xea,
-- 0x49, 0x80, 0x20, 0x91, 0xf0, 0x19, 0xfa, 0xa2,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0c,
-- 0xfa, 0x22, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08,
-- 0x20, 0x01, 0x49, 0x7b, 0x68, 0x09, 0x60, 0x08,
-- 0x2d, 0x0b, 0xdb, 0x39, 0x2d, 0x12, 0xdc, 0x37,
-- 0xb0, 0x81, 0x24, 0x00, 0x20, 0x00, 0x90, 0x03,
-- 0x20, 0x01, 0x49, 0x75, 0x68, 0x09, 0x23, 0x07,
-- 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x6a, 0xb8,
-- 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01,
-- 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02,
-- 0x43, 0x08, 0x90, 0x00, 0x20, 0x00, 0x62, 0xb8,
-- 0x20, 0x00, 0x62, 0xf8, 0x48, 0x67, 0x63, 0x38,
-- 0x48, 0x67, 0x63, 0x78, 0x6b, 0x38, 0xf7, 0xff,
-- 0xfe, 0x9c, 0x90, 0x02, 0x48, 0x66, 0x68, 0x00,
-- 0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02,
-- 0x1c, 0x39, 0xf0, 0x0b, 0xfe, 0x05, 0x98, 0x00,
-- 0x49, 0x61, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x5e, 0x68, 0x00,
-- 0xf0, 0x0c, 0xf9, 0xf8, 0xb0, 0x01, 0xe1, 0x2b,
-- 0x24, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x16,
-- 0x2c, 0x07, 0xd2, 0x14, 0x6a, 0xf8, 0x05, 0x81,
-- 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83,
-- 0x18, 0x18, 0x00, 0xc0, 0xe0, 0x00, 0xe1, 0x3c,
-- 0x4a, 0x53, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81,
-- 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe6, 0x2e, 0x00,
-- 0xd1, 0x13, 0x2c, 0x18, 0xd2, 0x11, 0x6a, 0xf8,
-- 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01,
-- 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x48, 0x68, 0x12,
-- 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01,
-- 0xe7, 0xe9, 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff,
-- 0xfe, 0x50, 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x05,
-- 0x48, 0x3f, 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b,
-- 0xfc, 0xcb, 0xe0, 0x06, 0x2c, 0x18, 0xd2, 0x04,
-- 0x1f, 0xe0, 0x49, 0x3b, 0x68, 0x09, 0xf0, 0x0b,
-- 0xfd, 0x01, 0x48, 0x3a, 0x49, 0x38, 0x68, 0x09,
-- 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x66, 0xc8,
-- 0x48, 0x36, 0x49, 0x35, 0x68, 0x09, 0x23, 0x09,
-- 0x01, 0xdb, 0x18, 0xc9, 0x67, 0x08, 0x48, 0x33,
-- 0x49, 0x31, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb,
-- 0x18, 0xc9, 0x66, 0x88, 0x48, 0x2f, 0x49, 0x2e,
-- 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9,
-- 0x66, 0x48, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09,
-- 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88,
-- 0x6b, 0x79, 0x48, 0x27, 0x68, 0x00, 0xf0, 0x0b,
-- 0xfd, 0x4b, 0x94, 0x02, 0x1d, 0xf8, 0x30, 0x21,
-- 0x99, 0x0a, 0xf0, 0x02, 0xf8, 0x4d, 0x24, 0x00,
-- 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 0x2c, 0x07,
-- 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89,
-- 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 0x18, 0x18,
-- 0x00, 0xc0, 0x4a, 0x1b, 0x68, 0x12, 0x18, 0x80,
-- 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0,
-- 0x42, 0x81, 0xda, 0x00, 0x26, 0x01, 0xe7, 0xe8,
-- 0x2e, 0x00, 0xd1, 0x2f, 0x2c, 0x18, 0xd2, 0x2d,
-- 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20,
-- 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x10,
-- 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xda, 0x1c,
-- 0xe0, 0x1a, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0,
-- 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x7c, 0xbc,
-- 0x2e, 0x08, 0x5e, 0x4c, 0x00, 0x00, 0x02, 0xcf,
-- 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x94, 0x88,
-- 0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0xff, 0xff,
-- 0x26, 0x01, 0xe7, 0xcd, 0x3c, 0x01, 0x6b, 0x38,
-- 0xf7, 0xff, 0xfd, 0xc3, 0x90, 0x01, 0x2c, 0x07,
-- 0xd2, 0x12, 0x48, 0x48, 0x68, 0x01, 0x1c, 0x20,
-- 0xf0, 0x0b, 0xfb, 0xcc, 0x00, 0xa0, 0x19, 0x00,
-- 0x00, 0xc0, 0x49, 0x44, 0x68, 0x09, 0x18, 0x40,
-- 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x01,
-- 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x21, 0xe0, 0x4a,
-- 0x2c, 0x18, 0xd2, 0x48, 0x1f, 0xe0, 0x49, 0x3d,
-- 0x68, 0x09, 0xf0, 0x0b, 0xfc, 0x0b, 0x20, 0x4c,
-- 0x43, 0x60, 0x49, 0x3a, 0x68, 0x09, 0x18, 0x40,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x01,
-- 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x0d, 0x20, 0x4c,
-- 0x43, 0x60, 0x49, 0x34, 0x68, 0x09, 0x18, 0x40,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0,
-- 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x60,
-- 0x49, 0x2e, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff,
-- 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00,
-- 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x60,
-- 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff,
-- 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00,
-- 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c,
-- 0x43, 0x61, 0x4a, 0x22, 0x68, 0x12, 0x18, 0x89,
-- 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48,
-- 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x61,
-- 0x4a, 0x1c, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff,
-- 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x19,
-- 0x68, 0x00, 0xf0, 0x0c, 0xf8, 0xcf, 0x6b, 0x79,
-- 0x48, 0x16, 0x68, 0x00, 0xf0, 0x0b, 0xfc, 0x36,
-- 0x98, 0x02, 0x42, 0x84, 0xda, 0x01, 0x1c, 0x21,
-- 0xe0, 0x00, 0x99, 0x02, 0x91, 0x00, 0x99, 0x00,
-- 0x48, 0x10, 0x68, 0x00, 0xf0, 0x0b, 0xfd, 0x46,
-- 0x49, 0x0f, 0x20, 0x91, 0xf0, 0x19, 0xf9, 0x1e,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b,
-- 0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00,
-- 0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09,
-- 0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08,
-- 0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x05, 0xe5, 0x4b, 0xb0, 0x05,
-- 0xe5, 0x49, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8,
-- 0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xff, 0x1c, 0x07,
-- 0x9d, 0x09, 0xb0, 0x89, 0x26, 0x00, 0x20, 0x00,
-- 0x90, 0x03, 0x99, 0x0a, 0x68, 0x4c, 0x2d, 0x13,
-- 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x09, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x15,
-- 0x60, 0x04, 0x20, 0x00, 0x60, 0xe0, 0x20, 0x00,
-- 0x61, 0x20, 0x69, 0x60, 0x4b, 0xf9, 0x40, 0x18,
-- 0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xf8,
-- 0x40, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60,
-- 0x4b, 0xf6, 0x40, 0x18, 0x61, 0x60, 0x05, 0x80,
-- 0x69, 0x60, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18,
-- 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x4b, 0xf2,
-- 0x40, 0x18, 0x61, 0x60, 0x04, 0x40, 0x69, 0x60,
-- 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60,
-- 0x06, 0x80, 0x69, 0x60, 0x09, 0x40, 0x01, 0x40,
-- 0x61, 0x60, 0x06, 0xc0, 0x20, 0x00, 0x61, 0xa0,
-- 0x20, 0x00, 0x61, 0xe0, 0x20, 0x00, 0x62, 0x20,
-- 0x20, 0x00, 0x62, 0x60, 0x20, 0x00, 0x63, 0xa0,
-- 0x20, 0x00, 0x63, 0xe0, 0x20, 0x00, 0x64, 0x60,
-- 0x20, 0x00, 0x64, 0x20, 0x20, 0x00, 0x60, 0x20,
-- 0x20, 0x00, 0x71, 0x20, 0x99, 0x0a, 0x68, 0x48,
-- 0x64, 0xe0, 0x99, 0x0a, 0x68, 0x08, 0x64, 0xa0,
-- 0x1d, 0xe0, 0x30, 0x21, 0x99, 0x13, 0xf0, 0x01,
-- 0xff, 0x07, 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12,
-- 0xdc, 0x04, 0x1d, 0xe0, 0x30, 0x49, 0x99, 0x13,
-- 0xf0, 0x01, 0xfe, 0xfe, 0x6b, 0x20, 0x6a, 0xa1,
-- 0x1a, 0x40, 0x30, 0x01, 0x63, 0xa0, 0x00, 0xa8,
-- 0x49, 0xd4, 0x58, 0x08, 0x69, 0x61, 0x09, 0x49,
-- 0x01, 0x49, 0x06, 0xc0, 0x0e, 0xc0, 0x43, 0x08,
-- 0x61, 0x60, 0x06, 0xc0, 0x0e, 0xc0, 0x6b, 0x20,
-- 0x6a, 0xa1, 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04,
-- 0x69, 0x60, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02,
-- 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x00, 0xa8,
-- 0x49, 0xc9, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48,
-- 0x61, 0xe0, 0x2d, 0x13, 0xd1, 0x04, 0x20, 0x00,
-- 0x90, 0x14, 0x20, 0x00, 0x61, 0xa0, 0xe0, 0x13,
-- 0x9b, 0x0c, 0x68, 0x58, 0x90, 0x01, 0x98, 0x01,
-- 0x08, 0x80, 0x61, 0xa0, 0x98, 0x01, 0x64, 0x60,
-- 0x9b, 0x0c, 0x68, 0x18, 0x64, 0x20, 0x20, 0x00,
-- 0x62, 0x60, 0x9a, 0x0b, 0x63, 0xe2, 0x69, 0x60,
-- 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00,
-- 0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60,
-- 0x05, 0x80, 0x69, 0x60, 0x23, 0x0f, 0x02, 0x9b,
-- 0x43, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60,
-- 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60,
-- 0x06, 0x80, 0x69, 0x60, 0x23, 0xc0, 0x43, 0x18,
-- 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x23, 0x01,
-- 0x03, 0x9b, 0x43, 0x18, 0x61, 0x60, 0x04, 0x40,
-- 0x98, 0x14, 0x60, 0xe0, 0x61, 0x25, 0x48, 0xab,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x14,
-- 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00,
-- 0x20, 0x00, 0xe0, 0x05, 0x98, 0x14, 0x28, 0x08,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x09,
-- 0xe7, 0x35, 0x49, 0xa1, 0x20, 0x91, 0xf0, 0x19,
-- 0xf8, 0x21, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01,
-- 0xf0, 0x0b, 0xf8, 0x08, 0xe7, 0xf5, 0x48, 0x9d,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x53, 0x68, 0x38,
-- 0x01, 0x80, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x9a,
-- 0x40, 0x19, 0x07, 0xc0, 0x09, 0x80, 0x43, 0x08,
-- 0x60, 0xa0, 0x01, 0x80, 0x0f, 0xc0, 0x68, 0x38,
-- 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x95,
-- 0x40, 0x19, 0x07, 0xc0, 0x09, 0xc0, 0x43, 0x08,
-- 0x60, 0xa0, 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0x38,
-- 0x02, 0x00, 0x0e, 0x00, 0x68, 0xa1, 0x4b, 0x85,
-- 0x40, 0x19, 0x06, 0x00, 0x0e, 0x00, 0x04, 0x00,
-- 0x43, 0x08, 0x60, 0xa0, 0x02, 0x00, 0x0e, 0x00,
-- 0x48, 0x86, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2a,
-- 0x2f, 0x00, 0xd0, 0x28, 0x20, 0x0d, 0x06, 0xc0,
-- 0x6a, 0x00, 0x1c, 0x06, 0x68, 0x38, 0x4b, 0x85,
-- 0x43, 0x98, 0xd0, 0x06, 0x68, 0x38, 0x02, 0x00,
-- 0x0e, 0x01, 0x20, 0x01, 0x40, 0x88, 0x43, 0x06,
-- 0xe0, 0x05, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00,
-- 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x68, 0x38,
-- 0x4b, 0x7b, 0x43, 0x98, 0xd0, 0x08, 0x68, 0x38,
-- 0x02, 0x00, 0x0e, 0x00, 0x1d, 0xc1, 0x31, 0x01,
-- 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 0xe0, 0x06,
-- 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 0x30, 0x08,
-- 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x2d, 0x0b,
-- 0xdb, 0x0a, 0x2d, 0x12, 0xdc, 0x08, 0x48, 0x6f,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x20, 0x51,
-- 0x01, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08,
-- 0x98, 0x14, 0x00, 0x80, 0x49, 0x6c, 0x58, 0x08,
-- 0x28, 0x00, 0xd0, 0x01, 0x20, 0x83, 0x90, 0x03,
-- 0x2d, 0x0b, 0xdb, 0x08, 0x2d, 0x12, 0xdc, 0x06,
-- 0x48, 0x68, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01,
-- 0x20, 0x84, 0x90, 0x03, 0xe0, 0x06, 0x9a, 0x0b,
-- 0x2a, 0x01, 0xd1, 0x03, 0x2d, 0x13, 0xd0, 0x01,
-- 0x20, 0x82, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00,
-- 0xd0, 0x07, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08,
-- 0x20, 0x08, 0x60, 0xe0, 0x98, 0x03, 0xb0, 0x09,
-- 0xe6, 0xa1, 0x98, 0x15, 0x68, 0x01, 0x98, 0x14,
-- 0x00, 0x80, 0x4a, 0x59, 0x50, 0x11, 0x6a, 0xa0,
-- 0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xa0,
-- 0x6b, 0x20, 0x28, 0x00, 0xdc, 0x01, 0x20, 0x01,
-- 0x63, 0x20, 0x6a, 0xe0, 0x28, 0x00, 0xda, 0x01,
-- 0x20, 0x00, 0x62, 0xe0, 0x6b, 0x60, 0x4b, 0x52,
-- 0x42, 0x98, 0xdd, 0x01, 0x48, 0x50, 0x63, 0x60,
-- 0x6b, 0x20, 0xf7, 0xff, 0xfb, 0x9e, 0x90, 0x00,
-- 0x2d, 0x13, 0xd1, 0x05, 0x6a, 0xa1, 0x9a, 0x00,
-- 0x48, 0x4c, 0xf0, 0x0b, 0xff, 0x99, 0xe0, 0x15,
-- 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x03,
-- 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d,
-- 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04,
-- 0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x00,
-- 0xe0, 0x04, 0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x41,
-- 0xf0, 0x0b, 0xff, 0x82, 0x2d, 0x0b, 0xdb, 0x5f,
-- 0x2d, 0x12, 0xdc, 0x5e, 0x98, 0x15, 0x68, 0x00,
-- 0x49, 0x3a, 0x60, 0x08, 0x99, 0x13, 0xa8, 0x05,
-- 0xf0, 0x01, 0xfd, 0xae, 0xa9, 0x05, 0x98, 0x15,
-- 0x68, 0x00, 0xf0, 0x05, 0xfc, 0x5f, 0x1d, 0xe0,
-- 0x30, 0x21, 0xa9, 0x05, 0xf0, 0x01, 0xfd, 0xa4,
-- 0x20, 0x01, 0x49, 0x35, 0x65, 0x08, 0x20, 0x02,
-- 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00,
-- 0x20, 0x02, 0xf0, 0x04, 0xfa, 0xdd, 0x2d, 0x0b,
-- 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10,
-- 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00,
-- 0x20, 0x12, 0xf0, 0x04, 0xfa, 0xd1, 0x2d, 0x0c,
-- 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x03, 0x21, 0x00,
-- 0x20, 0x04, 0xf0, 0x04, 0xfa, 0xc9, 0x2d, 0x0d,
-- 0xd0, 0x01, 0x2d, 0x10, 0xd1, 0x03, 0x21, 0x00,
-- 0x20, 0x08, 0xf0, 0x04, 0xfa, 0xc1, 0x2d, 0x0e,
-- 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00,
-- 0x20, 0x01, 0xf0, 0x04, 0xfa, 0xb9, 0x48, 0x15,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0xb0, 0x82,
-- 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x18, 0xff, 0x06,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b,
-- 0xfe, 0x86, 0x20, 0x92, 0x49, 0x17, 0x60, 0x08,
-- 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x60, 0x08,
-- 0x20, 0x01, 0x49, 0x15, 0x68, 0x09, 0x23, 0x07,
-- 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x25,
-- 0xe0, 0xae, 0xe0, 0xad, 0xff, 0x00, 0xff, 0xff,
-- 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0xff,
-- 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x03, 0x3a, 0x04,
-- 0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x60, 0x84,
-- 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
-- 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x7c, 0xbc,
-- 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x7d, 0x94,
-- 0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x88,
-- 0x2e, 0x08, 0x7d, 0xb4, 0x6a, 0xa0, 0x30, 0x01,
-- 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89,
-- 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08,
-- 0x90, 0x00, 0x20, 0x00, 0x62, 0xa0, 0x20, 0x00,
-- 0x62, 0xe0, 0x48, 0x5f, 0x63, 0x20, 0x48, 0x5f,
-- 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0xe1,
-- 0x90, 0x02, 0x48, 0x5d, 0x68, 0x00, 0x23, 0x77,
-- 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x21,
-- 0xf0, 0x0b, 0xfa, 0x4a, 0x98, 0x00, 0x49, 0x58,
-- 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9,
-- 0x66, 0xc8, 0x48, 0x55, 0x68, 0x00, 0x21, 0x00,
-- 0xf0, 0x0b, 0xfa, 0xc4, 0x48, 0x52, 0x68, 0x00,
-- 0xf0, 0x0b, 0xfe, 0x38, 0x49, 0x51, 0x20, 0x91,
-- 0xf0, 0x18, 0xfe, 0x98, 0xe0, 0x00, 0xe0, 0x11,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf6, 0x48, 0x4c,
-- 0x68, 0x00, 0x90, 0x01, 0x48, 0x4c, 0x68, 0x00,
-- 0x49, 0x49, 0x60, 0x08, 0x98, 0x01, 0x49, 0x4a,
-- 0x60, 0x08, 0x20, 0x92, 0x49, 0x47, 0x60, 0x08,
-- 0xb0, 0x02, 0xe0, 0x40, 0x48, 0x47, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x0c, 0x6a, 0xa0, 0x30, 0x01,
-- 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89,
-- 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08,
-- 0x49, 0x41, 0x60, 0x08, 0xe0, 0x0c, 0x6a, 0xa0,
-- 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01,
-- 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02,
-- 0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88,
-- 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02,
-- 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88,
-- 0xf0, 0x00, 0xfe, 0x82, 0x48, 0x33, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x07, 0x20, 0x00, 0x62, 0xa0,
-- 0x20, 0x00, 0x62, 0xe0, 0x48, 0x2a, 0x63, 0x20,
-- 0x48, 0x2a, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff,
-- 0xfa, 0x78, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14,
-- 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xfb, 0x98, 0x02,
-- 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x05,
-- 0x2d, 0x13, 0xd1, 0x03, 0x20, 0x1f, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x01,
-- 0x2d, 0x12, 0xdd, 0x1a, 0x48, 0x23, 0x68, 0x00,
-- 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0,
-- 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x50,
-- 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x52, 0x90, 0x00,
-- 0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00,
-- 0xfd, 0xd5, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9,
-- 0x60, 0x88, 0x48, 0x14, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x06, 0x48, 0x14, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x62, 0x06,
-- 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07,
-- 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x03,
-- 0x98, 0x14, 0x21, 0x00, 0xf0, 0x0b, 0xfd, 0x0a,
-- 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0x00,
-- 0xb0, 0x09, 0xe5, 0x10, 0xb0, 0x09, 0xe5, 0x0e,
-- 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f,
-- 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88,
-- 0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x5e, 0x4c, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf7, 0xb0, 0x83,
-- 0x9f, 0x03, 0x69, 0x38, 0x90, 0x00, 0x98, 0x00,
-- 0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x03,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x6c, 0x78, 0x99, 0x04, 0x60, 0x48, 0x6c, 0x38,
-- 0x99, 0x04, 0x60, 0x08, 0x6c, 0xf8, 0x9a, 0x05,
-- 0x60, 0x50, 0x6c, 0xb8, 0x9a, 0x05, 0x60, 0x10,
-- 0x68, 0xfd, 0x48, 0xf9, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03,
-- 0xe7, 0xda, 0x49, 0xf0, 0x20, 0x91, 0xf0, 0x18,
-- 0xfd, 0xb9, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01,
-- 0xf0, 0x0a, 0xfd, 0xa0, 0xe7, 0xf5, 0x00, 0xa8,
-- 0x49, 0xeb, 0x58, 0x08, 0x99, 0x03, 0x42, 0x88,
-- 0xd0, 0x05, 0x20, 0x92, 0x49, 0xe7, 0x60, 0x08,
-- 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xc4, 0x21, 0x00,
-- 0x00, 0xa8, 0x4a, 0xe5, 0x50, 0x11, 0x48, 0xe2,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x38,
-- 0x28, 0x0b, 0xdb, 0x16, 0x69, 0x38, 0x28, 0x12,
-- 0xdc, 0x13, 0x48, 0xe0, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x06, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x03,
-- 0x69, 0x38, 0x28, 0x12, 0xdc, 0x00, 0xe0, 0x08,
-- 0x6b, 0x38, 0xf7, 0xff, 0xf9, 0xb6, 0x90, 0x01,
-- 0x6a, 0xb9, 0x9a, 0x01, 0x48, 0xd8, 0xf0, 0x0b,
-- 0xfd, 0x85, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x2e,
-- 0x69, 0x38, 0x28, 0x12, 0xdc, 0x2b, 0x48, 0xd0,
-- 0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x20, 0x00,
-- 0x49, 0xd2, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00,
-- 0x49, 0xd0, 0x65, 0x48, 0x20, 0x00, 0x49, 0xcf,
-- 0x65, 0x88, 0x20, 0x00, 0x49, 0xcd, 0x65, 0xc8,
-- 0x20, 0x00, 0x49, 0xcc, 0x66, 0x08, 0x20, 0x00,
-- 0x49, 0xcb, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02,
-- 0xf0, 0x04, 0xf9, 0x0a, 0x48, 0xc3, 0x68, 0x00,
-- 0x28, 0x00, 0xd1, 0x04, 0x48, 0xc5, 0x21, 0x0d,
-- 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x02, 0x48, 0xc3,
-- 0x49, 0xc3, 0x60, 0x08, 0xe0, 0x06, 0x69, 0x38,
-- 0x28, 0x13, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x08, 0x48, 0xb6, 0x68, 0x00,
-- 0x28, 0x00, 0xd1, 0x2c, 0x20, 0x0d, 0x06, 0xc0,
-- 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfd, 0x64,
-- 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb7,
-- 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0,
-- 0x00, 0xe9, 0x4b, 0xb4, 0x18, 0xc9, 0x60, 0x48,
-- 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb1,
-- 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 0x43, 0xc0,
-- 0x00, 0xe9, 0x4b, 0xae, 0x18, 0xc9, 0x64, 0x48,
-- 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 0x99, 0x02,
-- 0x40, 0x08, 0x90, 0x02, 0x98, 0x02, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x9c, 0x69, 0x38,
-- 0x28, 0x0b, 0xdb, 0x74, 0x69, 0x38, 0x28, 0x12,
-- 0xdc, 0x72, 0x48, 0x9b, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x6f, 0x20, 0x00, 0x49, 0x9d, 0x65, 0x08,
-- 0x20, 0x01, 0x03, 0x00, 0x49, 0x9b, 0x65, 0x48,
-- 0x20, 0x00, 0x49, 0x9a, 0x65, 0x88, 0x20, 0x00,
-- 0x49, 0x98, 0x65, 0xc8, 0x20, 0x00, 0x49, 0x97,
-- 0x66, 0x08, 0x20, 0x00, 0x49, 0x96, 0x60, 0x08,
-- 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8,
-- 0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf8, 0xa0,
-- 0x49, 0x95, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xf2,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b,
-- 0xfc, 0x72, 0x20, 0x92, 0x49, 0x90, 0x60, 0x08,
-- 0x48, 0x90, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 0x00, 0x40,
-- 0x49, 0x8c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xc9, 0x61, 0x88, 0x20, 0x01, 0x49, 0x89,
-- 0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x87,
-- 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9,
-- 0x66, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x83,
-- 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9,
-- 0x61, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7f,
-- 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9,
-- 0x61, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7b,
-- 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9,
-- 0x60, 0xc8, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77,
-- 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9,
-- 0x60, 0x88, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0xd9,
-- 0x90, 0x01, 0x48, 0x72, 0x68, 0x00, 0x23, 0x77,
-- 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39,
-- 0xf0, 0x0b, 0xf8, 0x42, 0xe0, 0x02, 0xe0, 0x23,
-- 0xe0, 0x22, 0xe0, 0x21, 0x48, 0x67, 0x49, 0x6b,
-- 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9,
-- 0x66, 0xc8, 0x48, 0x68, 0x68, 0x00, 0x21, 0x00,
-- 0xf0, 0x0b, 0xf8, 0xb8, 0x48, 0x65, 0x68, 0x00,
-- 0xf0, 0x0b, 0xfc, 0x2c, 0x49, 0x62, 0x20, 0x91,
-- 0xf0, 0x18, 0xfc, 0x8c, 0x28, 0x92, 0xd0, 0x00,
-- 0xe7, 0xf8, 0x48, 0x60, 0x68, 0x04, 0x48, 0x60,
-- 0x68, 0x00, 0x49, 0x5e, 0x60, 0x08, 0x48, 0x5e,
-- 0x60, 0x04, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08,
-- 0x48, 0x52, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73,
-- 0x48, 0x4d, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f,
-- 0x1c, 0x28, 0xf0, 0x0b, 0xfb, 0x9d, 0x28, 0x01,
-- 0xd1, 0x6a, 0x98, 0x00, 0x28, 0x0b, 0xdb, 0x02,
-- 0x98, 0x00, 0x28, 0x12, 0xdd, 0x65, 0xb0, 0x84,
-- 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0x66,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b,
-- 0xfb, 0xe6, 0x48, 0x4c, 0x68, 0x00, 0x68, 0x40,
-- 0x28, 0x00, 0xd0, 0x06, 0x48, 0x49, 0x68, 0x00,
-- 0x68, 0x40, 0x38, 0x01, 0x49, 0x47, 0x68, 0x09,
-- 0x60, 0x48, 0x20, 0x92, 0x49, 0x44, 0x60, 0x08,
-- 0x20, 0x01, 0x49, 0x44, 0x68, 0x09, 0x60, 0x08,
-- 0x24, 0x00, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02,
-- 0x28, 0x00, 0xd1, 0x15, 0x2c, 0x07, 0xd2, 0x13,
-- 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20,
-- 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0,
-- 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81,
-- 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe6,
-- 0x98, 0x02, 0x28, 0x00, 0xd1, 0x14, 0x2c, 0x18,
-- 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89,
-- 0x1c, 0x20, 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58,
-- 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff,
-- 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81,
-- 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe7,
-- 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0x41,
-- 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x09, 0x48, 0x25,
-- 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfe, 0xbc,
-- 0x48, 0x22, 0x68, 0x00, 0xf0, 0x0b, 0xfb, 0xa6,
-- 0xe0, 0x09, 0x2c, 0x18, 0xd2, 0x07, 0xe0, 0x01,
-- 0xe0, 0x95, 0xe0, 0x94, 0x1f, 0xe0, 0x49, 0x1d,
-- 0x68, 0x09, 0xf0, 0x0a, 0xfe, 0xeb, 0x48, 0x1b,
-- 0x68, 0x00, 0x4b, 0x1c, 0x18, 0xc0, 0xf0, 0x0b,
-- 0xf8, 0x0b, 0x20, 0x00, 0x49, 0x17, 0x68, 0x09,
-- 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88,
-- 0x48, 0x14, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07,
-- 0xd3, 0x2c, 0x48, 0x12, 0x68, 0x00, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe,
-- 0x43, 0x18, 0x49, 0x0e, 0x68, 0x09, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0xe0, 0x1c, 0x00, 0x00,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0,
-- 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x7d, 0x94, 0xcc, 0x00, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0xbc, 0x3f, 0xff, 0xff, 0xff,
-- 0x2e, 0x08, 0x5e, 0x4c, 0x68, 0x00, 0x04, 0x00,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x7d, 0xb8, 0x00, 0x00, 0x04, 0xcc,
-- 0x61, 0x88, 0xe0, 0x2d, 0x26, 0x01, 0x21, 0x00,
-- 0x91, 0x00, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40,
-- 0x99, 0x00, 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x06,
-- 0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0xe7, 0xf4,
-- 0x00, 0x70, 0x1c, 0x46, 0xe7, 0xf8, 0x08, 0x76,
-- 0x00, 0x76, 0x48, 0x23, 0x68, 0x00, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0,
-- 0x0f, 0xc0, 0x49, 0x1f, 0x68, 0x09, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1c,
-- 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0,
-- 0x69, 0x80, 0x43, 0x30, 0x49, 0x18, 0x68, 0x09,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88,
-- 0x1c, 0x21, 0x48, 0x15, 0x68, 0x00, 0xf0, 0x0a,
-- 0xff, 0xb1, 0x6b, 0x79, 0x48, 0x12, 0x68, 0x00,
-- 0xf0, 0x0a, 0xfe, 0xe6, 0x1c, 0x28, 0x21, 0x00,
-- 0xf0, 0x0b, 0xfa, 0x88, 0x49, 0x0f, 0x20, 0x91,
-- 0xf0, 0x18, 0xfb, 0x80, 0x28, 0x92, 0xd0, 0x00,
-- 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x03,
-- 0x48, 0x0b, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08,
-- 0x98, 0x03, 0x49, 0x09, 0x60, 0x08, 0x20, 0x92,
-- 0x49, 0x06, 0x60, 0x08, 0xb0, 0x04, 0x20, 0x92,
-- 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03,
-- 0xe5, 0x86, 0xb0, 0x03, 0xe5, 0x84, 0x00, 0x00,
-- 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88,
-- 0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x7c, 0xc0,
-- 0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01,
-- 0x9d, 0x05, 0x9f, 0x06, 0x69, 0x28, 0x90, 0x04,
-- 0x69, 0x3c, 0x98, 0x04, 0x28, 0x13, 0xd0, 0x01,
-- 0x2c, 0x13, 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x05,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x68, 0xee, 0x68, 0xf9, 0x91, 0x03, 0x48, 0xdf,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x20,
-- 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06,
-- 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x99, 0x03,
-- 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00,
-- 0x20, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03,
-- 0x60, 0xe9, 0x60, 0xfe, 0x20, 0x00, 0xb0, 0x05,
-- 0xe7, 0xce, 0xe1, 0x92, 0x1c, 0x3d, 0x9f, 0x05,
-- 0x9e, 0x03, 0x68, 0xf9, 0x91, 0x03, 0x9c, 0x04,
-- 0xe0, 0xaa, 0x48, 0xc6, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01,
-- 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05,
-- 0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x73,
-- 0x49, 0xbd, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0xfe,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a,
-- 0xfa, 0xe5, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xb9,
-- 0x58, 0x08, 0x42, 0xa8, 0xd1, 0x05, 0x99, 0x03,
-- 0x00, 0x88, 0x49, 0xb6, 0x58, 0x08, 0x42, 0xb8,
-- 0xd0, 0x05, 0x20, 0x92, 0x49, 0xb2, 0x60, 0x08,
-- 0x20, 0xff, 0xb0, 0x05, 0xe7, 0x98, 0x48, 0xb2,
-- 0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, 0x48, 0xb0,
-- 0x68, 0x00, 0x42, 0xb8, 0xd1, 0x0a, 0x20, 0x0d,
-- 0x06, 0xc0, 0x68, 0xc0, 0x90, 0x01, 0x98, 0x01,
-- 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0xc8, 0x99, 0x03, 0x60, 0xe9,
-- 0x60, 0xfe, 0x00, 0xb0, 0x49, 0xa5, 0x50, 0x0f,
-- 0x99, 0x03, 0x00, 0x88, 0x49, 0xa3, 0x50, 0x0d,
-- 0x48, 0xa0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x55,
-- 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02,
-- 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88,
-- 0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x40, 0x08,
-- 0xd1, 0x12, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88,
-- 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0b, 0x99, 0x03,
-- 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x99, 0x02,
-- 0x40, 0x08, 0x90, 0x02, 0x20, 0x01, 0x40, 0xb0,
-- 0x99, 0x02, 0x43, 0x08, 0x90, 0x02, 0xe0, 0x11,
-- 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02,
-- 0x40, 0x08, 0xd1, 0x0b, 0x20, 0x01, 0x40, 0xb0,
-- 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02,
-- 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02,
-- 0x43, 0x08, 0x90, 0x02, 0x6b, 0x28, 0xf7, 0xfe,
-- 0xfe, 0xbc, 0x90, 0x00, 0x9a, 0x00, 0xe0, 0x00,
-- 0xe0, 0x22, 0x99, 0x03, 0x1c, 0x28, 0xf0, 0x00,
-- 0xfa, 0x3d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0xb1,
-- 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38,
-- 0xf0, 0x00, 0xfa, 0x34, 0x98, 0x02, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x88, 0x48, 0x7c, 0x68, 0x00,
-- 0x42, 0xa8, 0xd0, 0x03, 0x48, 0x7a, 0x68, 0x00,
-- 0x42, 0xb8, 0xd1, 0x03, 0x98, 0x01, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, 0x49, 0x74,
-- 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x1b,
-- 0x49, 0x71, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0x66,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a,
-- 0xfa, 0x4d, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x6d,
-- 0x58, 0x08, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92,
-- 0x49, 0x69, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05,
-- 0xe7, 0x06, 0x2c, 0x0b, 0xdb, 0x12, 0x2c, 0x12,
-- 0xdc, 0x10, 0x48, 0x67, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x09, 0x48, 0x65, 0x68, 0x00, 0x42, 0xa8,
-- 0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08,
-- 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xf4, 0x48, 0x60,
-- 0x60, 0x07, 0xe0, 0x08, 0x6b, 0xf8, 0x28, 0x01,
-- 0xd1, 0x05, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08,
-- 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xe8, 0x48, 0x5a,
-- 0x68, 0x00, 0x42, 0xa8, 0xd1, 0x02, 0x20, 0x00,
-- 0x49, 0x57, 0x60, 0x08, 0x00, 0xb0, 0x49, 0x55,
-- 0x50, 0x0f, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe,
-- 0x48, 0x50, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x73,
-- 0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0x4e, 0x90, 0x00,
-- 0x6a, 0xa9, 0x9a, 0x00, 0x48, 0x4f, 0xf0, 0x0b,
-- 0xfa, 0x1d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x45,
-- 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0x4b,
-- 0xf0, 0x0b, 0xfa, 0x42, 0x48, 0x48, 0x68, 0x00,
-- 0x42, 0xa8, 0xd1, 0x0f, 0x20, 0x02, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0xc8, 0x2c, 0x0b, 0xdb, 0x01,
-- 0x2c, 0x12, 0xdd, 0x07, 0x21, 0x00, 0x20, 0x02,
-- 0xf0, 0x03, 0xfd, 0xae, 0x48, 0x42, 0x21, 0x0d,
-- 0x06, 0xc9, 0x61, 0x88, 0x2c, 0x0b, 0xdb, 0x42,
-- 0x2c, 0x12, 0xdc, 0x40, 0x98, 0x04, 0x42, 0xa0,
-- 0xd0, 0x2c, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9,
-- 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x03,
-- 0xfd, 0x9b, 0x2c, 0x0f, 0xd0, 0x05, 0x2c, 0x10,
-- 0xd0, 0x03, 0x2c, 0x11, 0xd0, 0x01, 0x2c, 0x0b,
-- 0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x03,
-- 0xfd, 0x8f, 0x2c, 0x0c, 0xd0, 0x01, 0x2c, 0x0f,
-- 0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x03,
-- 0xfd, 0x87, 0x2c, 0x0d, 0xd0, 0x01, 0x2c, 0x10,
-- 0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x03,
-- 0xfd, 0x7f, 0x2c, 0x0e, 0xd0, 0x01, 0x2c, 0x11,
-- 0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x03,
-- 0xfd, 0x77, 0xe0, 0x03, 0x20, 0x00, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0xc8, 0x6a, 0xb8, 0x30, 0x01,
-- 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89,
-- 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08,
-- 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d,
-- 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 0x20, 0x00,
-- 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x00,
-- 0xe0, 0x1f, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0,
-- 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 0xf0, 0x00,
-- 0xf9, 0xcf, 0x6b, 0x38, 0xf7, 0xfe, 0xfd, 0xd1,
-- 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38,
-- 0xf0, 0x00, 0xf9, 0x54, 0x98, 0x02, 0x21, 0x0d,
-- 0x06, 0xc9, 0x60, 0x88, 0x2c, 0x0b, 0xdb, 0x08,
-- 0x2c, 0x12, 0xdc, 0x06, 0x98, 0x04, 0x42, 0xa0,
-- 0xd1, 0x03, 0x20, 0x01, 0x21, 0x0d, 0x06, 0xc9,
-- 0x60, 0xc8, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x05, 0xe6, 0x3c, 0xb0, 0x05,
-- 0xe6, 0x3a, 0xe6, 0x39, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58,
-- 0x2e, 0x08, 0x7c, 0xbc, 0x2e, 0x08, 0x7d, 0x94,
-- 0x3f, 0xff, 0xff, 0xff, 0xb5, 0xf0, 0x1c, 0x07,
-- 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1c, 0x7d,
-- 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c,
-- 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x9a, 0x1c, 0x06,
-- 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00,
-- 0xf9, 0x1d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf0, 0x1c, 0x07,
-- 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1e, 0x7d,
-- 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c,
-- 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x82, 0x1c, 0x06,
-- 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00,
-- 0xf9, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x0f,
-- 0xb0, 0x86, 0x98, 0x06, 0x90, 0x05, 0x98, 0x05,
-- 0x68, 0xc5, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd0, 0x05, 0x20, 0xff, 0xb0, 0x06,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x98, 0x05, 0x69, 0x00, 0x28, 0x13, 0xd1, 0x02,
-- 0x20, 0xff, 0xb0, 0x06, 0xe7, 0xf4, 0x49, 0x69,
-- 0x20, 0x91, 0xf0, 0x18, 0xf9, 0x23, 0x28, 0x92,
-- 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xf9, 0x0a,
-- 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x64, 0x58, 0x08,
-- 0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92,
-- 0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x06,
-- 0xe7, 0xde, 0x42, 0xbd, 0xd1, 0x05, 0x20, 0x92,
-- 0x49, 0x5c, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06,
-- 0xe7, 0xd6, 0x20, 0x00, 0x00, 0xa9, 0x4a, 0x5a,
-- 0x50, 0x50, 0x98, 0x05, 0x60, 0xc7, 0x48, 0x59,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x48, 0x54,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x09, 0x99, 0x05,
-- 0x00, 0xb8, 0x4a, 0x53, 0x50, 0x11, 0x20, 0x92,
-- 0x49, 0x50, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06,
-- 0xe7, 0xbe, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80,
-- 0x1c, 0x04, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9,
-- 0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9,
-- 0x4b, 0x4b, 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00,
-- 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x48, 0x18, 0xc9,
-- 0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9,
-- 0x4b, 0x45, 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00,
-- 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x42, 0x18, 0xc9,
-- 0x64, 0x48, 0x20, 0x01, 0x90, 0x01, 0x20, 0x01,
-- 0x40, 0xa8, 0x40, 0x20, 0xd1, 0x01, 0x20, 0x00,
-- 0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0,
-- 0x40, 0x04, 0x1c, 0x3e, 0x42, 0xbd, 0xd9, 0x23,
-- 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 0x28, 0x00,
-- 0xd0, 0x01, 0x36, 0x01, 0xe7, 0xf8, 0x1e, 0x70,
-- 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xda, 0x04,
-- 0xe0, 0x07, 0x98, 0x04, 0x38, 0x01, 0x90, 0x04,
-- 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x32,
-- 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb8, 0x90, 0x03,
-- 0x20, 0xff, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x03,
-- 0x40, 0x08, 0x90, 0x03, 0x98, 0x03, 0x00, 0x40,
-- 0x90, 0x03, 0x00, 0x60, 0x90, 0x00, 0xe0, 0x1f,
-- 0x00, 0xb0, 0x49, 0x25, 0x58, 0x08, 0x28, 0x00,
-- 0xd0, 0x01, 0x3e, 0x01, 0xe7, 0xf8, 0x1c, 0x70,
-- 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xd9, 0x04,
-- 0xe0, 0x07, 0x98, 0x04, 0x30, 0x01, 0x90, 0x04,
-- 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x26,
-- 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb0, 0x90, 0x03,
-- 0x20, 0xff, 0x40, 0xb8, 0x43, 0xc0, 0x99, 0x03,
-- 0x40, 0x08, 0x90, 0x03, 0x08, 0x60, 0x90, 0x00,
-- 0x98, 0x00, 0x99, 0x03, 0x40, 0x08, 0x90, 0x00,
-- 0x98, 0x03, 0x43, 0x84, 0x98, 0x00, 0x43, 0x04,
-- 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x40, 0x04,
-- 0x98, 0x01, 0x40, 0xb8, 0x43, 0x04, 0x99, 0x05,
-- 0x00, 0xb8, 0x4a, 0x0d, 0x50, 0x11, 0x98, 0x05,
-- 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x92, 0x90, 0x02,
-- 0x9a, 0x02, 0x1c, 0x39, 0x98, 0x05, 0xf0, 0x00,
-- 0xf8, 0x15, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x84,
-- 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00,
-- 0xb0, 0x06, 0xe7, 0x25, 0xb0, 0x06, 0xe7, 0x23,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0,
-- 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84,
-- 0x68, 0x00, 0x04, 0x00, 0xb5, 0xf7, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x01, 0x3d, 0x4b, 0x2f, 0x18, 0xe9,
-- 0x1d, 0xe2, 0x32, 0x0d, 0x20, 0x00, 0x28, 0x03,
-- 0xd3, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa,
-- 0xca, 0x20, 0xc1, 0x20, 0xe7, 0xfa, 0x6a, 0xe3,
-- 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x28,
-- 0x18, 0xf3, 0x60, 0x1d, 0x6b, 0x63, 0x33, 0x01,
-- 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x24,
-- 0x18, 0xf3, 0x60, 0x5d, 0x6a, 0xa5, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x20,
-- 0x18, 0xf3, 0x64, 0x1d, 0x9d, 0x02, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x1c,
-- 0x18, 0xf3, 0x64, 0x5d, 0x4b, 0x1b, 0x68, 0x1b,
-- 0x2b, 0x01, 0xd1, 0x2a, 0x2f, 0x00, 0xd1, 0x28,
-- 0x4b, 0x17, 0x68, 0x5d, 0x23, 0x8f, 0x00, 0x9b,
-- 0x42, 0x9d, 0xd3, 0x03, 0x23, 0x8f, 0x00, 0x9b,
-- 0x4d, 0x13, 0x60, 0x6b, 0x4b, 0x12, 0x68, 0x1d,
-- 0x4b, 0x13, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x12,
-- 0x4d, 0x0f, 0x60, 0x2b, 0x4b, 0x0e, 0x6c, 0x5d,
-- 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x23, 0xb3,
-- 0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x0d,
-- 0x4d, 0x09, 0x64, 0x6b, 0x4b, 0x08, 0x6c, 0x1d,
-- 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x4b, 0x0a,
-- 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x09, 0x4d, 0x04,
-- 0x64, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x68, 0x00, 0x0c, 0x00,
-- 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x60, 0x84,
-- 0x00, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x06, 0xcc,
-- 0x00, 0x00, 0x02, 0xca, 0x00, 0x00, 0x06, 0xca,
-- 0xb4, 0xf0, 0x4f, 0x15, 0x4c, 0x15, 0x20, 0x00,
-- 0x21, 0x00, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x14,
-- 0x68, 0x6d, 0x42, 0x85, 0xdd, 0x1b, 0x1c, 0x05,
-- 0x30, 0x01, 0x00, 0xad, 0x59, 0x7b, 0x42, 0x93,
-- 0xd0, 0xf9, 0x4d, 0x0f, 0x68, 0x6d, 0x42, 0x85,
-- 0xda, 0x00, 0xe0, 0x10, 0x31, 0x01, 0x1c, 0x05,
-- 0x30, 0x01, 0x00, 0xad, 0x59, 0x7a, 0x42, 0x93,
-- 0xd0, 0xf9, 0x02, 0x95, 0x43, 0x1d, 0x1c, 0x2e,
-- 0xc4, 0x40, 0x4d, 0x07, 0x68, 0x6d, 0x42, 0x85,
-- 0xdb, 0x00, 0x31, 0x01, 0xe7, 0xdf, 0x25, 0x0d,
-- 0x06, 0xed, 0x61, 0x29, 0xbc, 0xf0, 0x47, 0x70,
-- 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x40,
-- 0x2e, 0x08, 0x7d, 0x94, 0xb5, 0xf3, 0xb0, 0x82,
-- 0x9d, 0x02, 0x69, 0x2c, 0x2c, 0x13, 0xd1, 0x05,
-- 0x20, 0x75, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x48, 0xf8,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02,
-- 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0xef,
-- 0x20, 0x91, 0xf0, 0x17, 0xff, 0x83, 0x28, 0x92,
-- 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xff, 0x6a,
-- 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xea, 0x58, 0x08,
-- 0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92,
-- 0x49, 0xe6, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02,
-- 0xe7, 0xd0, 0x48, 0xe3, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80,
-- 0x90, 0x01, 0x99, 0x03, 0x29, 0x01, 0xd1, 0x05,
-- 0x20, 0x01, 0x40, 0xb0, 0x99, 0x01, 0x43, 0x08,
-- 0x90, 0x01, 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb0,
-- 0x43, 0xc0, 0x99, 0x01, 0x40, 0x08, 0x90, 0x01,
-- 0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88,
-- 0x48, 0xd8, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73,
-- 0x48, 0xd3, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f,
-- 0x99, 0x03, 0x29, 0x01, 0xd1, 0x6c, 0xb0, 0x83,
-- 0x1c, 0x30, 0xf0, 0x0a, 0xfe, 0x71, 0x28, 0x01,
-- 0xd1, 0x05, 0x20, 0x92, 0x49, 0xcd, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x9e, 0x49, 0xce,
-- 0x20, 0x91, 0xf0, 0x17, 0xff, 0x3b, 0x28, 0x92,
-- 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfe, 0xbb,
-- 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x06,
-- 0x48, 0xc8, 0x68, 0x00, 0x68, 0x40, 0x30, 0x01,
-- 0x49, 0xc6, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92,
-- 0x49, 0xc3, 0x60, 0x08, 0x20, 0x01, 0x49, 0xc3,
-- 0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11,
-- 0x2c, 0x12, 0xdc, 0x0f, 0x48, 0xbf, 0x68, 0x00,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80,
-- 0x23, 0x01, 0x43, 0x18, 0x49, 0xbb, 0x68, 0x09,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88,
-- 0x27, 0x00, 0xe0, 0xbc, 0x27, 0x00, 0x20, 0x00,
-- 0x90, 0x01, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x15,
-- 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81,
-- 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83,
-- 0x18, 0x18, 0x00, 0xc0, 0x4a, 0xaf, 0x68, 0x12,
-- 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0,
-- 0x6f, 0xc0, 0x42, 0x81, 0xda, 0x01, 0x20, 0x01,
-- 0x90, 0x01, 0xe7, 0xe6, 0x98, 0x01, 0x28, 0x00,
-- 0xd1, 0x16, 0x2f, 0x18, 0xd2, 0x14, 0x6a, 0xe8,
-- 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01,
-- 0x23, 0x4c, 0x43, 0x58, 0x4a, 0xa3, 0x68, 0x12,
-- 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x69, 0x40, 0x42, 0x81, 0xda, 0x03, 0xe0, 0x00,
-- 0xe0, 0xb0, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe5,
-- 0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, 0xfb, 0x01,
-- 0x90, 0x00, 0x2f, 0x07, 0xd2, 0x16, 0x48, 0x99,
-- 0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xf9, 0x0a,
-- 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x95,
-- 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b,
-- 0x18, 0xc0, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a,
-- 0xfa, 0x5f, 0x48, 0x90, 0x68, 0x00, 0xf0, 0x0a,
-- 0xfe, 0x59, 0xe0, 0x4a, 0x2f, 0x18, 0xd2, 0x48,
-- 0x1f, 0xf8, 0x49, 0x8c, 0x68, 0x09, 0xf0, 0x0a,
-- 0xf9, 0x45, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x89,
-- 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x0a, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a,
-- 0xfa, 0x47, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x83,
-- 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17,
-- 0x20, 0x4c, 0x43, 0x78, 0x49, 0x7d, 0x68, 0x09,
-- 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b,
-- 0x20, 0x4c, 0x43, 0x78, 0x49, 0x77, 0x68, 0x09,
-- 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a,
-- 0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x71,
-- 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff,
-- 0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03,
-- 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x6b, 0x68, 0x12,
-- 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82,
-- 0x67, 0x48, 0x48, 0x68, 0x68, 0x00, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x00, 0x40,
-- 0x90, 0x03, 0x98, 0x03, 0x23, 0x02, 0x43, 0x18,
-- 0x90, 0x03, 0x48, 0x62, 0x68, 0x00, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0,
-- 0x0f, 0xc0, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03,
-- 0x98, 0x03, 0x49, 0x5c, 0x68, 0x09, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39,
-- 0x48, 0x58, 0x68, 0x00, 0xf0, 0x0a, 0xfa, 0x72,
-- 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04,
-- 0x6b, 0x69, 0x48, 0x54, 0x68, 0x00, 0xf0, 0x0a,
-- 0xf9, 0x4d, 0x1c, 0x30, 0x21, 0x01, 0xf0, 0x0a,
-- 0xfd, 0x45, 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x17,
-- 0xfe, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8,
-- 0x48, 0x4c, 0x68, 0x00, 0x90, 0x02, 0x48, 0x4c,
-- 0x68, 0x00, 0x49, 0x4a, 0x60, 0x08, 0x98, 0x02,
-- 0x49, 0x49, 0x60, 0x08, 0x20, 0x92, 0x49, 0x46,
-- 0x60, 0x08, 0xb0, 0x03, 0x48, 0x43, 0x68, 0x00,
-- 0x28, 0x01, 0xd1, 0x75, 0x48, 0x3e, 0x68, 0x00,
-- 0x28, 0x01, 0xd1, 0x71, 0x99, 0x03, 0x29, 0x00,
-- 0xd1, 0x6e, 0xb0, 0x85, 0x1c, 0x30, 0xf0, 0x0a,
-- 0xfd, 0x47, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92,
-- 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07,
-- 0xe6, 0x74, 0x49, 0x39, 0x20, 0x91, 0xf0, 0x17,
-- 0xfe, 0x11, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8,
-- 0xf0, 0x0a, 0xfd, 0x91, 0x2c, 0x0b, 0xdb, 0x01,
-- 0x2c, 0x12, 0xdd, 0x0b, 0x48, 0x33, 0x68, 0x00,
-- 0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, 0x48, 0x31,
-- 0x68, 0x00, 0x68, 0x40, 0x38, 0x01, 0x49, 0x2f,
-- 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 0x49, 0x2c,
-- 0x60, 0x08, 0x20, 0x01, 0x49, 0x2b, 0x68, 0x09,
-- 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12,
-- 0xdc, 0x0f, 0x48, 0x28, 0x68, 0x00, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40,
-- 0x00, 0x40, 0x49, 0x24, 0x68, 0x09, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x27, 0x00,
-- 0xe0, 0xb2, 0x27, 0x00, 0x20, 0x00, 0x90, 0x03,
-- 0x98, 0x03, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07,
-- 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89,
-- 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18,
-- 0x00, 0xc0, 0x4a, 0x18, 0x68, 0x12, 0x18, 0x80,
-- 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0,
-- 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x03,
-- 0xe7, 0xe6, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x26,
-- 0x2f, 0x18, 0xd2, 0x24, 0x6a, 0xe8, 0x05, 0x81,
-- 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c,
-- 0x43, 0x58, 0x4a, 0x0c, 0x68, 0x12, 0x18, 0x80,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0xe0, 0x00,
-- 0xe0, 0xa9, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x11,
-- 0x20, 0x01, 0x90, 0x03, 0xe0, 0x0e, 0x00, 0x00,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0,
-- 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x7d, 0xb8, 0xe7, 0xd5, 0x3f, 0x01,
-- 0x6b, 0x28, 0xf7, 0xfe, 0xf9, 0xc2, 0x90, 0x01,
-- 0x2f, 0x07, 0xd2, 0x09, 0x48, 0x4a, 0x68, 0x01,
-- 0x1c, 0x38, 0xf0, 0x0a, 0xf8, 0x3d, 0x48, 0x48,
-- 0x68, 0x00, 0xf0, 0x0a, 0xfd, 0x27, 0xe0, 0x06,
-- 0x2f, 0x18, 0xd2, 0x04, 0x1f, 0xf8, 0x49, 0x44,
-- 0x68, 0x09, 0xf0, 0x0a, 0xf8, 0x6f, 0x48, 0x42,
-- 0x68, 0x00, 0x4b, 0x42, 0x18, 0xc0, 0xf0, 0x0a,
-- 0xf9, 0x8f, 0x20, 0x00, 0x49, 0x3e, 0x68, 0x09,
-- 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88,
-- 0x48, 0x3b, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07,
-- 0xd3, 0x0e, 0x48, 0x39, 0x68, 0x00, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe,
-- 0x43, 0x18, 0x49, 0x35, 0x68, 0x09, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0xe0, 0x33,
-- 0x20, 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x02,
-- 0x48, 0x2f, 0x68, 0x00, 0x68, 0x40, 0x99, 0x02,
-- 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x08, 0x99, 0x02,
-- 0x31, 0x01, 0x91, 0x02, 0xe7, 0xf4, 0x98, 0x00,
-- 0x00, 0x40, 0x30, 0x01, 0x90, 0x00, 0xe7, 0xf6,
-- 0x98, 0x00, 0x08, 0x40, 0x00, 0x40, 0x90, 0x00,
-- 0x48, 0x25, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0,
-- 0x49, 0x21, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1e, 0x68, 0x00,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80,
-- 0x99, 0x00, 0x43, 0x08, 0x49, 0x1a, 0x68, 0x09,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88,
-- 0x1c, 0x39, 0x48, 0x17, 0x68, 0x00, 0xf0, 0x0a,
-- 0xf9, 0x4d, 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12,
-- 0xdd, 0x04, 0x6b, 0x69, 0x48, 0x12, 0x68, 0x00,
-- 0xf0, 0x0a, 0xf8, 0x7e, 0x1c, 0x30, 0x21, 0x00,
-- 0xf0, 0x0a, 0xfc, 0x20, 0x49, 0x10, 0x20, 0x91,
-- 0xf0, 0x17, 0xfd, 0x18, 0x28, 0x92, 0xd0, 0x00,
-- 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x04,
-- 0x48, 0x0c, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08,
-- 0x98, 0x04, 0x49, 0x0a, 0x60, 0x08, 0x20, 0x92,
-- 0x49, 0x07, 0x60, 0x08, 0xb0, 0x05, 0x20, 0x92,
-- 0x49, 0x07, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02,
-- 0xe5, 0x60, 0xb0, 0x02, 0xe5, 0x5e, 0x00, 0x00,
-- 0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0x04, 0xcc,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8,
-- 0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf3, 0x1c, 0x07,
-- 0x1c, 0x3e, 0x69, 0x30, 0x28, 0x13, 0xd1, 0x04,
-- 0x20, 0x75, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0xf4, 0x48, 0x1e, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x05, 0x2c, 0x19, 0xd3, 0x01,
-- 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04,
-- 0x2c, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00,
-- 0x20, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff,
-- 0xe7, 0xe7, 0x49, 0x16, 0x20, 0x91, 0xf0, 0x17,
-- 0xfc, 0xd1, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01,
-- 0xf0, 0x09, 0xfc, 0xb8, 0xe7, 0xf5, 0x00, 0xa0,
-- 0x49, 0x11, 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x04,
-- 0x20, 0x92, 0x49, 0x0e, 0x60, 0x08, 0x20, 0xff,
-- 0xe7, 0xd3, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80,
-- 0x1c, 0x05, 0x20, 0x01, 0x40, 0xa0, 0x40, 0x05,
-- 0x2d, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x99, 0x01,
-- 0x60, 0x08, 0xe0, 0x02, 0x20, 0x01, 0x99, 0x01,
-- 0x60, 0x08, 0x20, 0x92, 0x49, 0x03, 0x60, 0x08,
-- 0x20, 0x00, 0xe7, 0xbe, 0xe7, 0xbd, 0x00, 0x00,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0,
-- 0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x07,
-- 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60,
-- 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x89,
-- 0x0f, 0x89, 0x02, 0x09, 0x43, 0x08, 0x61, 0x60,
-- 0x05, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0x7a,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09,
-- 0xfc, 0x61, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37,
-- 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92,
-- 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01,
-- 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c,
-- 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28,
-- 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x00, 0x1d, 0xe6,
-- 0x36, 0x0d, 0x68, 0x30, 0x99, 0x00, 0x60, 0x08,
-- 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a,
-- 0xfb, 0x73, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92,
-- 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03,
-- 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17,
-- 0xfc, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8,
-- 0xf0, 0x0a, 0xfb, 0xbd, 0x20, 0x92, 0x49, 0x1c,
-- 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09,
-- 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20,
-- 0xf0, 0x0a, 0xfb, 0x6e, 0x90, 0x00, 0x69, 0x60,
-- 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91,
-- 0xf0, 0x17, 0xfc, 0x24, 0x28, 0x92, 0xd0, 0x00,
-- 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01,
-- 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08,
-- 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92,
-- 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92,
-- 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01,
-- 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00,
-- 0xff, 0xff, 0xfc, 0xff, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58,
-- 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07,
-- 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60,
-- 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x09,
-- 0x0f, 0x09, 0x02, 0x89, 0x43, 0x08, 0x61, 0x60,
-- 0x04, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0xce,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09,
-- 0xfb, 0xb5, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37,
-- 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92,
-- 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01,
-- 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c,
-- 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28,
-- 0x4b, 0x2d, 0x18, 0xc6, 0x1d, 0xe0, 0x30, 0x0d,
-- 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x60, 0x30,
-- 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a,
-- 0xfa, 0xc7, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92,
-- 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03,
-- 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17,
-- 0xfb, 0x91, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8,
-- 0xf0, 0x0a, 0xfb, 0x11, 0x20, 0x92, 0x49, 0x1c,
-- 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09,
-- 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20,
-- 0xf0, 0x0a, 0xfa, 0xc2, 0x90, 0x00, 0x69, 0x60,
-- 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91,
-- 0xf0, 0x17, 0xfb, 0x78, 0x28, 0x92, 0xd0, 0x00,
-- 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01,
-- 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08,
-- 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92,
-- 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92,
-- 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01,
-- 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00,
-- 0xff, 0xff, 0xc3, 0xff, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58,
-- 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07,
-- 0xb0, 0x82, 0x1c, 0x3c, 0x68, 0xe5, 0x26, 0x00,
-- 0x99, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x26, 0x01,
-- 0x69, 0x60, 0x06, 0x80, 0x0f, 0xc0, 0x42, 0xb0,
-- 0xd1, 0x05, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x60,
-- 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x07, 0xf1,
-- 0x0e, 0x89, 0x43, 0x08, 0x61, 0x60, 0x06, 0x80,
-- 0x48, 0x44, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05,
-- 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00,
-- 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01,
-- 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00,
-- 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xde,
-- 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0x16,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09,
-- 0xfa, 0xfd, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37,
-- 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92,
-- 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02,
-- 0xe7, 0xc9, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0e,
-- 0x69, 0x20, 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x28,
-- 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0,
-- 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 0x68, 0x00,
-- 0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82,
-- 0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0x0d, 0x28, 0x00,
-- 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x9f, 0x49, 0x20,
-- 0x20, 0x91, 0xf0, 0x17, 0xfa, 0xd7, 0x28, 0x92,
-- 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfa, 0x57,
-- 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01,
-- 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19,
-- 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0x08,
-- 0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8,
-- 0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xfa, 0xbe,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11,
-- 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00,
-- 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e,
-- 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08,
-- 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x6b, 0xb0, 0x02,
-- 0xe7, 0x69, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58,
-- 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf0, 0x1c, 0x04,
-- 0x1c, 0x0f, 0xb0, 0x83, 0x1c, 0x25, 0x69, 0x28,
-- 0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee,
-- 0x20, 0x04, 0x40, 0x38, 0x08, 0x81, 0x91, 0x02,
-- 0x69, 0x68, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18,
-- 0x07, 0xb9, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08,
-- 0x61, 0x68, 0x06, 0x00, 0x69, 0x68, 0x4b, 0x48,
-- 0x40, 0x18, 0x99, 0x02, 0x07, 0xc9, 0x0c, 0x49,
-- 0x43, 0x08, 0x61, 0x68, 0x04, 0x40, 0x48, 0x45,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02,
-- 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xd0, 0x49, 0x3c,
-- 0x20, 0x91, 0xf0, 0x17, 0xfa, 0x57, 0x28, 0x92,
-- 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfa, 0x3e,
-- 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08,
-- 0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x34,
-- 0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xbb,
-- 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05,
-- 0x69, 0x28, 0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x28,
-- 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x30, 0x4b, 0x2e,
-- 0x18, 0xc0, 0x90, 0x01, 0x1d, 0xe8, 0x30, 0x0d,
-- 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x99, 0x01,
-- 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00,
-- 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00,
-- 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x30,
-- 0xf0, 0x0a, 0xf9, 0x4e, 0x28, 0x00, 0xd1, 0x05,
-- 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00,
-- 0xb0, 0x05, 0xe7, 0x91, 0x49, 0x20, 0x20, 0x91,
-- 0xf0, 0x17, 0xfa, 0x18, 0x28, 0x92, 0xd0, 0x00,
-- 0xe7, 0xf8, 0xf0, 0x0a, 0xf9, 0x98, 0x20, 0x92,
-- 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b,
-- 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 0x68, 0x01,
-- 0x1c, 0x28, 0xf0, 0x0a, 0xf9, 0x49, 0x90, 0x00,
-- 0x69, 0x68, 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14,
-- 0x20, 0x91, 0xf0, 0x17, 0xf9, 0xff, 0x28, 0x92,
-- 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00,
-- 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f,
-- 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08,
-- 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02,
-- 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00,
-- 0xb0, 0x03, 0xe7, 0x5d, 0xb0, 0x03, 0xe7, 0x5b,
-- 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58,
-- 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x7d, 0xb8, 0x1c, 0x01, 0x20, 0x0d,
-- 0x06, 0xc0, 0x60, 0x41, 0x48, 0x02, 0x63, 0x81,
-- 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00,
-- 0x68, 0x00, 0x0d, 0x00, 0x20, 0x0d, 0x06, 0xc0,
-- 0x68, 0x40, 0x02, 0x00, 0x0a, 0x00, 0x47, 0x70,
-- 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x68, 0xd0,
-- 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x03, 0x1c, 0x0a,
-- 0x1c, 0x19, 0x69, 0x08, 0x28, 0x13, 0xd1, 0x01,
-- 0x20, 0x75, 0x47, 0x70, 0x69, 0x08, 0x28, 0x0b,
-- 0xdb, 0x0b, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x08,
-- 0x6d, 0x08, 0x60, 0x10, 0x6d, 0x88, 0x60, 0x90,
-- 0x6d, 0x48, 0x60, 0x50, 0x6d, 0xc8, 0x60, 0xd0,
-- 0xe0, 0x07, 0x6a, 0x88, 0x60, 0x10, 0x6b, 0x08,
-- 0x60, 0x90, 0x6a, 0xc8, 0x60, 0x50, 0x6b, 0x48,
-- 0x60, 0xd0, 0x20, 0x00, 0xe7, 0xe5, 0xe7, 0xe4,
-- 0x1c, 0x03, 0x1c, 0x0a, 0x68, 0x10, 0x60, 0x18,
-- 0x68, 0x90, 0x60, 0x98, 0x68, 0x50, 0x60, 0x58,
-- 0x68, 0xd0, 0x60, 0xd8, 0x47, 0x70, 0xe7, 0xfd,
-- 0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, 0x05, 0x80,
-- 0x0f, 0x80, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01,
-- 0x1c, 0x0a, 0x69, 0x50, 0x12, 0x80, 0x07, 0x00,
-- 0x0f, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80,
-- 0x1c, 0x01, 0x1c, 0x0f, 0x22, 0x01, 0x69, 0x78,
-- 0x23, 0x20, 0x40, 0x18, 0xd1, 0x00, 0x22, 0x00,
-- 0x1c, 0x10, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc,
-- 0x1c, 0x01, 0x1c, 0x0b, 0x69, 0x18, 0x28, 0x13,
-- 0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, 0x69, 0x58,
-- 0x06, 0x00, 0x0f, 0x82, 0x69, 0x58, 0x04, 0x40,
-- 0x0f, 0xc0, 0x00, 0x80, 0x43, 0x02, 0x1c, 0x10,
-- 0xe7, 0xf4, 0xe7, 0xf3, 0x1c, 0x01, 0x20, 0x0d,
-- 0x06, 0xc0, 0x61, 0x41, 0x20, 0x00, 0x47, 0x70,
-- 0xe7, 0xfd, 0x20, 0x0d, 0x06, 0xc0, 0x69, 0x40,
-- 0x1c, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd,
-- 0x1c, 0x01, 0x22, 0x00, 0x29, 0x01, 0xd1, 0x00,
-- 0x22, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0,
-- 0x1c, 0x03, 0x2b, 0x02, 0xd1, 0x01, 0x29, 0x00,
-- 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0xc2,
-- 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x21, 0x01,
-- 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x02,
-- 0x2a, 0x00, 0xd1, 0x00, 0x21, 0x00, 0x1c, 0x08,
-- 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a,
-- 0x69, 0x10, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x90,
-- 0x1c, 0x07, 0x1c, 0x0a, 0x1c, 0x39, 0x69, 0x08,
-- 0x28, 0x13, 0xd0, 0x05, 0x69, 0x08, 0x28, 0x0b,
-- 0xdb, 0x05, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x02,
-- 0x20, 0x86, 0xbc, 0x90, 0x47, 0x70, 0x6b, 0x8c,
-- 0x69, 0x48, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00,
-- 0x08, 0x64, 0x69, 0x08, 0x00, 0x80, 0x4b, 0x03,
-- 0x58, 0x18, 0x43, 0x60, 0x60, 0x10, 0x20, 0x00,
-- 0xe7, 0xef, 0xe7, 0xee, 0x2e, 0x03, 0x3a, 0x54,
-- 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x9c, 0x02,
-- 0x69, 0x20, 0x28, 0x13, 0xd0, 0x05, 0x69, 0x20,
-- 0x28, 0x0b, 0xdb, 0x08, 0x69, 0x20, 0x28, 0x12,
-- 0xdc, 0x05, 0x20, 0x86, 0xb0, 0x01, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe5,
-- 0x68, 0x38, 0x64, 0x20, 0x68, 0x7e, 0x64, 0x66,
-- 0x08, 0xb6, 0x61, 0xa6, 0x48, 0x3f, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01,
-- 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04,
-- 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00,
-- 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00,
-- 0xb0, 0x01, 0xe7, 0xe0, 0x49, 0x36, 0x20, 0x91,
-- 0xf0, 0x17, 0xf8, 0xdc, 0x28, 0x92, 0xd0, 0x03,
-- 0x20, 0x01, 0xf0, 0x09, 0xf8, 0xc3, 0xe7, 0xf5,
-- 0x00, 0xa8, 0x49, 0x32, 0x58, 0x08, 0x99, 0x02,
-- 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x2e,
-- 0x60, 0x08, 0x20, 0x86, 0xb0, 0x01, 0xe7, 0xca,
-- 0x48, 0x2a, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x06,
-- 0x01, 0x28, 0x4b, 0x2b, 0x18, 0xc0, 0x90, 0x00,
-- 0x98, 0x00, 0x60, 0x06, 0xe0, 0x41, 0x48, 0x25,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27,
-- 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82,
-- 0x1c, 0x28, 0xf0, 0x09, 0xff, 0xdd, 0x28, 0x00,
-- 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xab, 0x49, 0x20,
-- 0x20, 0x91, 0xf0, 0x17, 0xf8, 0xa7, 0x28, 0x92,
-- 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xf8, 0x27,
-- 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01,
-- 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19,
-- 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x09, 0xff, 0xd8,
-- 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x61, 0x08,
-- 0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xf8, 0x8e,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11,
-- 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00,
-- 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e,
-- 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08,
-- 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x77, 0xb0, 0x01,
-- 0xe7, 0x75, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58,
-- 0x68, 0x00, 0x0c, 0x04, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x7d, 0xb8, 0xb4, 0x80, 0x1c, 0x01,
-- 0x06, 0x0b, 0x0e, 0x1b, 0x22, 0x01, 0x2a, 0x19,
-- 0xd3, 0x02, 0xe0, 0x0f, 0x32, 0x01, 0xe7, 0xfa,
-- 0x00, 0x90, 0x4f, 0x08, 0x58, 0x38, 0x68, 0x80,
-- 0x02, 0x00, 0x0e, 0x00, 0x42, 0x98, 0xd1, 0x04,
-- 0x00, 0x90, 0x4f, 0x04, 0x58, 0x38, 0xbc, 0x80,
-- 0x47, 0x70, 0xe7, 0xef, 0x20, 0x00, 0xe7, 0xfa,
-- 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58,
-- 0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38,
-- 0x16, 0x01, 0x48, 0x20, 0x60, 0x02, 0x48, 0x20,
-- 0x68, 0x80, 0x23, 0x33, 0x06, 0x5b, 0x65, 0xd8,
-- 0x48, 0x1d, 0x68, 0xc0, 0x23, 0x33, 0x06, 0x5b,
-- 0x66, 0x18, 0x48, 0x1c, 0x4b, 0x1a, 0x60, 0x98,
-- 0x48, 0x1b, 0x4b, 0x19, 0x60, 0xd8, 0x20, 0x01,
-- 0x23, 0x33, 0x06, 0x5b, 0x66, 0xd8, 0x48, 0x19,
-- 0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x23,
-- 0x60, 0x03, 0x48, 0x16, 0x68, 0x04, 0x23, 0x01,
-- 0x04, 0xdb, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03,
-- 0x29, 0x00, 0xd1, 0x10, 0x20, 0xff, 0x30, 0x14,
-- 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0x48, 0x10,
-- 0x68, 0x04, 0x23, 0xff, 0x33, 0x01, 0x43, 0x9c,
-- 0x1c, 0x23, 0x60, 0x03, 0x48, 0x0d, 0x23, 0x1b,
-- 0x06, 0x9b, 0x64, 0x18, 0xe0, 0x08, 0x20, 0xff,
-- 0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18,
-- 0x48, 0x02, 0x68, 0x00, 0x4b, 0x08, 0x60, 0x18,
-- 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x50,
-- 0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00,
-- 0xcc, 0x1f, 0xfe, 0x00, 0x6c, 0x00, 0x00, 0x40,
-- 0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x82, 0x18,
-- 0x6c, 0x00, 0x00, 0x80, 0xb4, 0xf0, 0x1c, 0x01,
-- 0xb0, 0x82, 0x23, 0x1b, 0x06, 0x9b, 0x6a, 0x1b,
-- 0x1c, 0x18, 0x27, 0x00, 0x22, 0x00, 0x08, 0x40,
-- 0x00, 0x40, 0x4b, 0xaf, 0x68, 0x1c, 0x08, 0x64,
-- 0x00, 0x64, 0x60, 0x1c, 0x4b, 0xad, 0x68, 0x1b,
-- 0x1c, 0x1d, 0x23, 0x1b, 0x06, 0x9b, 0x6c, 0x1b,
-- 0x93, 0x01, 0x23, 0xff, 0x33, 0x01, 0x40, 0x03,
-- 0xd0, 0x00, 0x22, 0xff, 0x23, 0x01, 0x04, 0x9b,
-- 0x40, 0x03, 0xd0, 0x1b, 0x4c, 0xa4, 0x68, 0x26,
-- 0x23, 0x01, 0x04, 0x9b, 0x43, 0x9e, 0x1c, 0x33,
-- 0x60, 0x23, 0x4c, 0xa1, 0x68, 0x26, 0x23, 0x01,
-- 0x43, 0x33, 0x60, 0x23, 0x23, 0x00, 0x93, 0x00,
-- 0x9b, 0x00, 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04,
-- 0x9b, 0x00, 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7,
-- 0xe7, 0xfa, 0x4b, 0x99, 0x68, 0x1c, 0x08, 0x64,
-- 0x00, 0x64, 0x60, 0x1c, 0x23, 0x01, 0x02, 0x9b,
-- 0x40, 0x0b, 0xd0, 0x29, 0x23, 0x01, 0x02, 0xdb,
-- 0x40, 0x0b, 0xd0, 0x01, 0x4b, 0x94, 0x40, 0x18,
-- 0x23, 0x01, 0x03, 0x1b, 0x40, 0x0b, 0xd0, 0x02,
-- 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x4b, 0x91,
-- 0x40, 0x18, 0x02, 0x4c, 0x23, 0x7f, 0x02, 0x5b,
-- 0x40, 0x23, 0x43, 0x18, 0x23, 0x40, 0x40, 0x0b,
-- 0xd0, 0x03, 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18,
-- 0xe0, 0x0a, 0x4b, 0x8b, 0x40, 0x18, 0x23, 0x20,
-- 0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, 0x04, 0x1b,
-- 0x43, 0x18, 0xe0, 0x01, 0x4b, 0x87, 0x40, 0x18,
-- 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0xe0, 0xfc,
-- 0x23, 0x04, 0x40, 0x0b, 0xd0, 0x0f, 0x4c, 0x7e,
-- 0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23,
-- 0x4b, 0x81, 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64,
-- 0x65, 0xe3, 0x4b, 0x7f, 0x68, 0xdb, 0x24, 0x33,
-- 0x06, 0x64, 0x66, 0x23, 0xe0, 0xe9, 0x23, 0x01,
-- 0x03, 0x5b, 0x40, 0x0b, 0xd0, 0x13, 0x4b, 0x7a,
-- 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 0x65, 0xe3,
-- 0x4b, 0x77, 0x68, 0xdb, 0x24, 0x33, 0x06, 0x64,
-- 0x66, 0x23, 0x23, 0x01, 0x24, 0x33, 0x06, 0x64,
-- 0x66, 0xe3, 0x4c, 0x6d, 0x68, 0x26, 0x23, 0x01,
-- 0x43, 0x33, 0x60, 0x23, 0xe0, 0xd1, 0x07, 0xcb,
-- 0x0f, 0xdb, 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18,
-- 0xe0, 0x05, 0x23, 0x02, 0x40, 0x0b, 0xd0, 0x02,
-- 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x07,
-- 0x01, 0xdb, 0x40, 0x0b, 0xd0, 0x0f, 0x23, 0x0c,
-- 0x43, 0xdb, 0x40, 0x18, 0x23, 0xff, 0x33, 0x01,
-- 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x04, 0x43, 0x18,
-- 0xe0, 0x05, 0x23, 0x01, 0x02, 0x5b, 0x40, 0x0b,
-- 0xd0, 0x01, 0x23, 0x08, 0x43, 0x18, 0x23, 0x01,
-- 0x04, 0x1b, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x01,
-- 0x04, 0x9b, 0x43, 0x98, 0x1c, 0x04, 0x20, 0x01,
-- 0x04, 0xc0, 0x43, 0x20, 0x23, 0x01, 0x43, 0x18,
-- 0x23, 0x78, 0x40, 0x0b, 0xd0, 0x73, 0x23, 0x30,
-- 0x40, 0x03, 0xd0, 0x06, 0x2b, 0x10, 0xd0, 0x04,
-- 0x2b, 0x20, 0xd0, 0x42, 0x2b, 0x30, 0xd0, 0x40,
-- 0xe0, 0x81, 0x23, 0x10, 0x40, 0x0b, 0xd1, 0x02,
-- 0x23, 0x08, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x30,
-- 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b,
-- 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0xe0, 0x2f,
-- 0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20,
-- 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18,
-- 0xe0, 0x01, 0x23, 0x30, 0x43, 0x18, 0x23, 0x01,
-- 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18,
-- 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x43,
-- 0x68, 0x1b, 0x4c, 0x43, 0x60, 0x23, 0xe0, 0x17,
-- 0x07, 0xab, 0x0f, 0x9b, 0xd0, 0x09, 0x2b, 0x01,
-- 0xd0, 0x02, 0x2b, 0x02, 0xd0, 0x0a, 0xe0, 0x0e,
-- 0x4b, 0x3e, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23,
-- 0xe0, 0x0a, 0x4b, 0x3d, 0x24, 0x1b, 0x06, 0xa4,
-- 0x64, 0x23, 0xe0, 0x05, 0x4b, 0x3b, 0x24, 0x1b,
-- 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x00, 0xe7, 0xff,
-- 0xe0, 0x42, 0x23, 0x40, 0x40, 0x0b, 0xd1, 0x02,
-- 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x0b, 0x23, 0x30,
-- 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b,
-- 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 0xe0, 0x01,
-- 0x23, 0x30, 0x43, 0x18, 0xe0, 0x2e, 0x23, 0x30,
-- 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b,
-- 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x23, 0x01,
-- 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18,
-- 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x23,
-- 0x68, 0x1b, 0x4c, 0x23, 0x60, 0x23, 0xe0, 0x19,
-- 0x07, 0xab, 0x0f, 0x9b, 0xe0, 0x00, 0xe0, 0x17,
-- 0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02,
-- 0xd0, 0x0a, 0xe0, 0x0e, 0x4b, 0x20, 0x24, 0x1b,
-- 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x0a, 0x4b, 0x1f,
-- 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x05,
-- 0x4b, 0x1d, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23,
-- 0xe0, 0x00, 0xe7, 0xff, 0xe0, 0x00, 0xe7, 0xff,
-- 0x2f, 0x00, 0xd1, 0x12, 0x23, 0x1b, 0x06, 0x9b,
-- 0x62, 0x18, 0x23, 0x00, 0x93, 0x00, 0x9b, 0x00,
-- 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00,
-- 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa,
-- 0x4b, 0x03, 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64,
-- 0x60, 0x1c, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70,
-- 0x6c, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x68, 0x00,
-- 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff,
-- 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-- 0x2e, 0x08, 0x7c, 0x1c, 0x2e, 0x08, 0x5e, 0x50,
-- 0x6c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x98, 0x60,
-- 0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28,
-- 0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18,
-- 0x00, 0x02, 0x42, 0x18, 0xb5, 0xf3, 0x1c, 0x0f,
-- 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00,
-- 0x90, 0x00, 0x98, 0x00, 0x28, 0x20, 0xdb, 0x05,
-- 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 0x06, 0x40,
-- 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 0x6d, 0xc9,
-- 0x1a, 0x46, 0x48, 0x12, 0x6c, 0x80, 0x1c, 0x04,
-- 0x48, 0x10, 0x6c, 0xc0, 0x1c, 0x05, 0x42, 0xac,
-- 0xd9, 0x09, 0x1b, 0x60, 0x21, 0x64, 0x43, 0x41,
-- 0x1c, 0x30, 0xf0, 0x09, 0xff, 0xcb, 0x21, 0x64,
-- 0x1a, 0x08, 0x60, 0x38, 0xe0, 0x06, 0x1b, 0x28,
-- 0x21, 0x64, 0x43, 0x41, 0x1c, 0x30, 0xf0, 0x09,
-- 0xff, 0xc1, 0x60, 0x38, 0x42, 0xac, 0xd1, 0x03,
-- 0x20, 0x31, 0xb0, 0x01, 0xe7, 0xd6, 0xe0, 0x02,
-- 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd2, 0xb0, 0x01,
-- 0xe7, 0xd0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80,
-- 0xb5, 0xff, 0x1c, 0x14, 0x1c, 0x1f, 0xb0, 0x82,
-- 0x98, 0x02, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x00,
-- 0x98, 0x0b, 0x06, 0x03, 0x16, 0x1b, 0x93, 0x01,
-- 0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05,
-- 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x9b, 0x05, 0x2b, 0x1f,
-- 0xdd, 0x02, 0x20, 0xaf, 0xb0, 0x06, 0xe7, 0xf5,
-- 0x98, 0x07, 0x90, 0x01, 0x2f, 0x00, 0xd0, 0x47,
-- 0xb0, 0x81, 0x98, 0x08, 0x22, 0x00, 0x92, 0x00,
-- 0x22, 0x1b, 0x06, 0x92, 0x6a, 0x12, 0x23, 0x01,
-- 0x05, 0x1b, 0x40, 0x1a, 0xd0, 0x01, 0x22, 0xff,
-- 0x92, 0x00, 0x25, 0x00, 0x08, 0x62, 0x42, 0xaa,
-- 0xd8, 0x02, 0xe0, 0x34, 0x35, 0x01, 0xe7, 0xf9,
-- 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x1e, 0x88, 0x02,
-- 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x12, 0x12,
-- 0x88, 0x03, 0x02, 0x1b, 0x43, 0x1a, 0x04, 0x11,
-- 0x0c, 0x09, 0x2f, 0x00, 0xda, 0x05, 0x42, 0x7a,
-- 0x41, 0x11, 0x1c, 0x0b, 0x04, 0x19, 0x0c, 0x09,
-- 0xe0, 0x03, 0x40, 0xb9, 0x1c, 0x0a, 0x04, 0x11,
-- 0x0c, 0x09, 0x22, 0xff, 0x02, 0x12, 0x40, 0x0a,
-- 0x12, 0x12, 0x02, 0x0b, 0x43, 0x13, 0x80, 0x03,
-- 0x30, 0x02, 0xe0, 0x0f, 0x2f, 0x00, 0xda, 0x07,
-- 0x88, 0x02, 0x42, 0x7e, 0x41, 0x32, 0x04, 0x12,
-- 0x0c, 0x12, 0x80, 0x02, 0x30, 0x02, 0xe0, 0x05,
-- 0x88, 0x02, 0x40, 0xba, 0x04, 0x12, 0x0c, 0x12,
-- 0x80, 0x02, 0x30, 0x02, 0xe7, 0xca, 0xb0, 0x01,
-- 0x49, 0x23, 0x91, 0x03, 0x20, 0x01, 0x06, 0x00,
-- 0x99, 0x03, 0x60, 0x08, 0x48, 0x21, 0x6c, 0x80,
-- 0x49, 0x20, 0x6c, 0xc9, 0x1a, 0x40, 0x90, 0x00,
-- 0x98, 0x00, 0x28, 0x00, 0xdc, 0x09, 0x20, 0x33,
-- 0x06, 0x40, 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49,
-- 0x6d, 0xc9, 0x1a, 0x40, 0x99, 0x00, 0x18, 0x40,
-- 0x90, 0x00, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb,
-- 0x42, 0x98, 0xda, 0x02, 0x20, 0x06, 0xf0, 0x08,
-- 0xfd, 0x8d, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb,
-- 0x42, 0x98, 0xdb, 0xdf, 0x98, 0x00, 0x42, 0x84,
-- 0xd9, 0x02, 0x98, 0x00, 0x90, 0x02, 0xe0, 0x00,
-- 0x94, 0x02, 0x22, 0x04, 0x99, 0x03, 0xb4, 0x06,
-- 0x9b, 0x07, 0x9a, 0x04, 0x99, 0x06, 0x98, 0x03,
-- 0xf0, 0x04, 0xfb, 0x8c, 0xb0, 0x02, 0x98, 0x02,
-- 0x1a, 0x24, 0x98, 0x01, 0x99, 0x02, 0x18, 0x40,
-- 0x90, 0x01, 0x20, 0x00, 0x90, 0x00, 0x2c, 0x00,
-- 0xd1, 0xc4, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x65,
-- 0xb0, 0x04, 0xb0, 0x02, 0xe7, 0x62, 0x00, 0x00,
-- 0x9e, 0x00, 0x08, 0x00, 0x66, 0x00, 0x00, 0x80,
-- 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x07, 0xc0,
-- 0x0f, 0xc0, 0x4a, 0x03, 0x68, 0x12, 0x1c, 0x01,
-- 0x43, 0x11, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd,
-- 0x6c, 0x00, 0x08, 0x00, 0xb4, 0x90, 0x1c, 0x01,
-- 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x04,
-- 0x48, 0x1b, 0x68, 0x00, 0x1c, 0x07, 0x20, 0x30,
-- 0x40, 0x20, 0xd0, 0x06, 0x28, 0x10, 0xd0, 0x06,
-- 0x28, 0x20, 0xd0, 0x06, 0x28, 0x30, 0xd0, 0x06,
-- 0xe0, 0x07, 0x22, 0x01, 0xe0, 0x08, 0x22, 0x02,
-- 0xe0, 0x06, 0x22, 0x04, 0xe0, 0x04, 0x22, 0x08,
-- 0xe0, 0x02, 0x20, 0x30, 0xbc, 0x90, 0x47, 0x70,
-- 0x20, 0x03, 0x07, 0x40, 0x40, 0x38, 0x0f, 0x40,
-- 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x02,
-- 0xd0, 0x06, 0xe0, 0x08, 0x23, 0x10, 0x43, 0x1a,
-- 0xe0, 0x07, 0x23, 0x20, 0x43, 0x1a, 0xe0, 0x04,
-- 0x23, 0x40, 0x43, 0x1a, 0xe0, 0x01, 0x20, 0x30,
-- 0xe7, 0xe8, 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38,
-- 0xd1, 0x01, 0x23, 0x80, 0x43, 0x1a, 0x60, 0x0a,
-- 0x20, 0x00, 0xe7, 0xdf, 0xe7, 0xde, 0x00, 0x00,
-- 0x6c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x48, 0x01,
-- 0x60, 0x01, 0x47, 0x70, 0x6c, 0x00, 0x00, 0x80,
-- 0x1c, 0x01, 0x29, 0x1f, 0xdd, 0x01, 0x20, 0xaf,
-- 0x47, 0x70, 0x20, 0x80, 0x6c, 0x00, 0x60, 0x01,
-- 0x20, 0x00, 0xe7, 0xf9, 0xe7, 0xf8, 0xb5, 0xf3,
-- 0x1c, 0x0a, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x03,
-- 0x0e, 0x1b, 0x93, 0x00, 0xb0, 0x81, 0x20, 0x1b,
-- 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x01, 0x25, 0x00,
-- 0x20, 0x00, 0x90, 0x00, 0x20, 0x1b, 0x06, 0x80,
-- 0x6c, 0x00, 0x1c, 0x04, 0x27, 0x00, 0x9b, 0x01,
-- 0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d,
-- 0x06, 0x9b, 0x1a, 0xc0, 0x9b, 0x01, 0x00, 0xdb,
-- 0x4e, 0x5f, 0x68, 0x36, 0x19, 0x9b, 0x60, 0x58,
-- 0x20, 0xff, 0x30, 0x01, 0x40, 0x08, 0xd0, 0x01,
-- 0x20, 0xff, 0x90, 0x00, 0x23, 0x01, 0x04, 0xdb,
-- 0x43, 0x99, 0x1c, 0x08, 0x21, 0x01, 0x04, 0x89,
-- 0x43, 0x01, 0x20, 0x01, 0x03, 0x00, 0x40, 0x10,
-- 0xd0, 0x05, 0x06, 0x90, 0x0e, 0x80, 0xd0, 0x02,
-- 0x23, 0x01, 0x05, 0x1b, 0x43, 0x19, 0x23, 0x30,
-- 0x43, 0xdb, 0x40, 0x19, 0x05, 0x10, 0x0d, 0x00,
-- 0x28, 0x40, 0xd0, 0x48, 0xdc, 0x0e, 0x28, 0x08,
-- 0xd0, 0x32, 0xdc, 0x06, 0x28, 0x01, 0xd0, 0x1e,
-- 0x28, 0x02, 0xd0, 0x21, 0x28, 0x04, 0xd0, 0x26,
-- 0xe0, 0x67, 0x28, 0x10, 0xd0, 0x2f, 0x28, 0x20,
-- 0xd0, 0x32, 0xe0, 0x62, 0x23, 0x01, 0x02, 0x5b,
-- 0x42, 0x98, 0xd0, 0x49, 0xdc, 0x06, 0x28, 0x80,
-- 0xd0, 0x38, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98,
-- 0xd0, 0x3b, 0xe0, 0x56, 0x23, 0x01, 0x02, 0x9b,
-- 0x42, 0x98, 0xd0, 0x44, 0x23, 0x01, 0x02, 0xdb,
-- 0x42, 0x98, 0xd0, 0x47, 0xe0, 0x4d, 0x4b, 0x3d,
-- 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x3b, 0xe0, 0x49,
-- 0x23, 0x10, 0x43, 0x19, 0x4b, 0x39, 0x42, 0x9c,
-- 0xd0, 0x00, 0x4f, 0x38, 0xe0, 0x42, 0x4b, 0x38,
-- 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x36, 0xe0, 0x3d,
-- 0x23, 0x10, 0x43, 0x19, 0x4b, 0x34, 0x42, 0x9c,
-- 0xd0, 0x00, 0x4f, 0x33, 0xe0, 0x36, 0x4b, 0x33,
-- 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x31, 0xe0, 0x31,
-- 0x23, 0x10, 0x43, 0x19, 0x4b, 0x2f, 0x42, 0x9c,
-- 0xd0, 0x00, 0x4f, 0x2e, 0xe0, 0x2a, 0x23, 0x20,
-- 0x43, 0x19, 0x4b, 0x2d, 0x42, 0x9c, 0xd0, 0x00,
-- 0x4f, 0x2b, 0xe0, 0x23, 0x23, 0x30, 0x43, 0x19,
-- 0x4b, 0x29, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x28,
-- 0xe0, 0x1c, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x27,
-- 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x25, 0xe0, 0x15,
-- 0x23, 0x30, 0x43, 0x19, 0x4b, 0x23, 0x42, 0x9c,
-- 0xd0, 0x00, 0x4f, 0x22, 0xe0, 0x0e, 0x23, 0x20,
-- 0x43, 0x19, 0x4b, 0x21, 0x42, 0x9c, 0xd0, 0x00,
-- 0x4f, 0x1f, 0xe0, 0x07, 0x23, 0x30, 0x43, 0x19,
-- 0x4b, 0x1d, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x1c,
-- 0xe0, 0x00, 0xe7, 0xff, 0x98, 0x00, 0x28, 0x00,
-- 0xd0, 0x0a, 0x23, 0x01, 0x43, 0x19, 0x20, 0x1b,
-- 0x06, 0x80, 0x62, 0x01, 0x48, 0x17, 0x68, 0x00,
-- 0x4b, 0x17, 0x60, 0x18, 0x25, 0xff, 0xe0, 0x0e,
-- 0x23, 0x01, 0x43, 0x19, 0x2f, 0x00, 0xd0, 0x07,
-- 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x20, 0x1b,
-- 0x06, 0x80, 0x64, 0x07, 0x25, 0xff, 0xe0, 0x02,
-- 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x2d, 0x00,
-- 0xd1, 0x04, 0x48, 0x0e, 0x68, 0x03, 0x08, 0x5b,
-- 0x00, 0x5b, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x02,
-- 0xe7, 0x36, 0xb0, 0x01, 0xb0, 0x01, 0xe7, 0x33,
-- 0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x82, 0x18,
-- 0x00, 0x01, 0x42, 0x18, 0x00, 0x02, 0x42, 0x18,
-- 0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60,
-- 0x00, 0x02, 0x54, 0x28, 0x2e, 0x08, 0x5e, 0x50,
-- 0x6c, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20,
-- 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x49, 0x2c,
-- 0x46, 0x68, 0x22, 0x08, 0xf0, 0x09, 0xfd, 0xca,
-- 0x20, 0x04, 0xf7, 0xff, 0xfc, 0x23, 0x48, 0x29,
-- 0x68, 0x80, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8,
-- 0x48, 0x26, 0x68, 0xc0, 0x21, 0x33, 0x06, 0x49,
-- 0x66, 0x08, 0x48, 0x25, 0x68, 0x01, 0x23, 0x02,
-- 0x43, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x33,
-- 0x06, 0x49, 0x67, 0xc8, 0x48, 0x21, 0x68, 0x01,
-- 0x31, 0xff, 0x31, 0xff, 0x31, 0x02, 0x60, 0x01,
-- 0x1c, 0x78, 0x12, 0x00, 0xab, 0x01, 0x70, 0x18,
-- 0x1c, 0x78, 0xab, 0x01, 0x70, 0x58, 0x20, 0x33,
-- 0x06, 0x40, 0x6d, 0xc5, 0x4b, 0x1a, 0x43, 0x1d,
-- 0x26, 0x00, 0x2e, 0x10, 0xdb, 0x02, 0xe0, 0x18,
-- 0x36, 0x01, 0xe7, 0xfa, 0x24, 0x00, 0x2c, 0x07,
-- 0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa,
-- 0x46, 0x68, 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01,
-- 0xe7, 0xf8, 0x24, 0x00, 0x42, 0xbc, 0xdb, 0x02,
-- 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x02,
-- 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8,
-- 0xe7, 0xe6, 0x20, 0x33, 0x06, 0x40, 0x66, 0x05,
-- 0x48, 0x0a, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b,
-- 0x43, 0x19, 0x60, 0x01, 0xb0, 0x02, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x03, 0x39, 0xfc, 0x2e, 0x08, 0x7c, 0x1c,
-- 0x66, 0x00, 0x00, 0x70, 0x66, 0x00, 0x00, 0x5c,
-- 0xcc, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x20,
-- 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x20,
-- 0x0e, 0x00, 0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x02,
-- 0x06, 0x0a, 0x0e, 0x12, 0x21, 0x02, 0x40, 0x01,
-- 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x2f, 0x68, 0x1b,
-- 0x72, 0x19, 0xe0, 0x0c, 0x49, 0x2d, 0x68, 0x09,
-- 0x7a, 0x09, 0x29, 0xff, 0xd1, 0x03, 0x21, 0x00,
-- 0x4b, 0x2a, 0x68, 0x1b, 0x60, 0x19, 0x21, 0x00,
-- 0x4b, 0x28, 0x68, 0x1b, 0x72, 0x19, 0x07, 0xc1,
-- 0x0f, 0xc9, 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x25,
-- 0x68, 0x1b, 0x72, 0x59, 0xe0, 0x0c, 0x49, 0x23,
-- 0x68, 0x09, 0x7a, 0x49, 0x29, 0xff, 0xd1, 0x03,
-- 0x21, 0x00, 0x4b, 0x20, 0x68, 0x1b, 0x60, 0x59,
-- 0x21, 0x00, 0x4b, 0x1e, 0x68, 0x1b, 0x72, 0x59,
-- 0x2d, 0x01, 0xd1, 0x0f, 0x49, 0x1c, 0x68, 0x0e,
-- 0x23, 0x01, 0x05, 0x5b, 0x43, 0x9e, 0x1c, 0x33,
-- 0x60, 0x0b, 0x49, 0x1a, 0x68, 0x09, 0x78, 0x09,
-- 0x23, 0x02, 0x43, 0x19, 0x4b, 0x17, 0x68, 0x1b,
-- 0x70, 0x19, 0xe0, 0x0e, 0x49, 0x14, 0x68, 0x0e,
-- 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b,
-- 0x49, 0x12, 0x68, 0x09, 0x78, 0x09, 0x23, 0x02,
-- 0x43, 0xdb, 0x40, 0x19, 0x4b, 0x0f, 0x68, 0x1b,
-- 0x70, 0x19, 0x49, 0x0f, 0x62, 0x4a, 0x2a, 0x01,
-- 0xd1, 0x08, 0x49, 0x0c, 0x68, 0x09, 0x78, 0x09,
-- 0x23, 0x01, 0x43, 0x19, 0x4b, 0x09, 0x68, 0x1b,
-- 0x70, 0x19, 0xe0, 0x07, 0x49, 0x07, 0x68, 0x09,
-- 0x78, 0x09, 0x08, 0x49, 0x00, 0x49, 0x4b, 0x05,
-- 0x68, 0x1b, 0x70, 0x19, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x54,
-- 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x58,
-- 0xcc, 0x00, 0x0f, 0x80, 0xb4, 0x80, 0x1c, 0x07,
-- 0x1c, 0x0a, 0x68, 0x38, 0x49, 0x23, 0x68, 0x09,
-- 0x60, 0xc8, 0x68, 0x78, 0x49, 0x21, 0x68, 0x09,
-- 0x61, 0x08, 0x68, 0xb8, 0x49, 0x1f, 0x68, 0x09,
-- 0x61, 0x48, 0x68, 0xf8, 0x49, 0x1d, 0x68, 0x09,
-- 0x61, 0x88, 0x7d, 0x38, 0x49, 0x1b, 0x68, 0x09,
-- 0x31, 0x20, 0x70, 0x08, 0x7d, 0x78, 0x49, 0x19,
-- 0x68, 0x09, 0x31, 0x20, 0x70, 0x48, 0x69, 0x38,
-- 0x49, 0x16, 0x68, 0x09, 0x61, 0xc8, 0x7d, 0xb8,
-- 0x49, 0x14, 0x68, 0x09, 0x31, 0x20, 0x70, 0x88,
-- 0x68, 0x10, 0x49, 0x12, 0x68, 0x09, 0x62, 0x48,
-- 0x68, 0x50, 0x49, 0x10, 0x68, 0x09, 0x62, 0x88,
-- 0x68, 0x90, 0x49, 0x0e, 0x68, 0x09, 0x62, 0xc8,
-- 0x68, 0xd0, 0x49, 0x0c, 0x68, 0x09, 0x63, 0x08,
-- 0x7d, 0x10, 0x49, 0x0a, 0x68, 0x09, 0x31, 0x20,
-- 0x76, 0x08, 0x7d, 0x50, 0x49, 0x07, 0x68, 0x09,
-- 0x31, 0x20, 0x76, 0x48, 0x69, 0x10, 0x49, 0x05,
-- 0x68, 0x09, 0x63, 0x48, 0x7d, 0x90, 0x49, 0x03,
-- 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 0xbc, 0x80,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54,
-- 0x1c, 0x02, 0x1c, 0x0b, 0x48, 0x03, 0x68, 0x00,
-- 0x60, 0x02, 0x48, 0x02, 0x68, 0x00, 0x60, 0x43,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54,
-- 0xb5, 0xf3, 0xb0, 0x88, 0x98, 0x08, 0x68, 0x04,
-- 0x20, 0x01, 0x90, 0x06, 0x20, 0x01, 0x90, 0x05,
-- 0x48, 0x8c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x19,
-- 0x48, 0x8a, 0x68, 0x00, 0x38, 0x01, 0x49, 0x89,
-- 0x60, 0x08, 0x48, 0x88, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x10, 0x48, 0x87, 0x78, 0x80, 0x90, 0x00,
-- 0x98, 0x00, 0x00, 0xc0, 0x49, 0x85, 0x68, 0x09,
-- 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 0x43, 0x98,
-- 0x1c, 0x01, 0x98, 0x00, 0x00, 0xc0, 0x4a, 0x81,
-- 0x68, 0x12, 0x50, 0x11, 0x20, 0x33, 0x06, 0x40,
-- 0x6e, 0x00, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1,
-- 0x91, 0x02, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0,
-- 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x90, 0x01,
-- 0x48, 0x79, 0x68, 0x00, 0x42, 0x84, 0xd1, 0x73,
-- 0x98, 0x01, 0x1d, 0xc7, 0x37, 0x01, 0x78, 0x38,
-- 0x18, 0x38, 0x1c, 0x47, 0x48, 0x75, 0x6c, 0xc0,
-- 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x42, 0xb8,
-- 0xd9, 0x19, 0x78, 0x38, 0x28, 0xff, 0xd1, 0x12,
-- 0x78, 0x78, 0x23, 0xf0, 0x40, 0x18, 0x28, 0xf0,
-- 0xd1, 0x0d, 0x78, 0xb8, 0x10, 0x80, 0x07, 0x80,
-- 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x06,
-- 0x78, 0x78, 0x10, 0xc0, 0x07, 0xc0, 0x09, 0xc0,
-- 0x16, 0x00, 0x90, 0x05, 0xe0, 0x03, 0x21, 0x01,
-- 0x70, 0x39, 0x18, 0x7f, 0xe7, 0xde, 0x21, 0x40,
-- 0x91, 0x03, 0x25, 0x20, 0x21, 0x14, 0x91, 0x07,
-- 0x98, 0x06, 0x28, 0x00, 0xd1, 0x02, 0x25, 0x23,
-- 0x21, 0x12, 0x91, 0x07, 0x98, 0x06, 0x28, 0x02,
-- 0xd1, 0x02, 0x25, 0x30, 0x21, 0x18, 0x91, 0x07,
-- 0x98, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x00, 0x6d,
-- 0x21, 0x70, 0x91, 0x03, 0x99, 0x03, 0x00, 0x48,
-- 0x99, 0x02, 0x1a, 0x08, 0x90, 0x04, 0x98, 0x04,
-- 0x99, 0x02, 0x42, 0x88, 0xd3, 0x05, 0xe0, 0x4e,
-- 0x98, 0x04, 0x99, 0x03, 0x18, 0x40, 0x90, 0x04,
-- 0xe7, 0xf5, 0x9f, 0x04, 0x21, 0x00, 0x70, 0x39,
-- 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01,
-- 0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, 0x21, 0xc0,
-- 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 0x70, 0x39,
-- 0x37, 0x01, 0x21, 0x3a, 0x70, 0x39, 0x37, 0x01,
-- 0x21, 0x80, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00,
-- 0x70, 0x39, 0x37, 0x01, 0x99, 0x03, 0x1f, 0xc8,
-- 0x38, 0x02, 0x1b, 0x41, 0x70, 0x39, 0x37, 0x01,
-- 0x26, 0x00, 0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02,
-- 0x1b, 0x40, 0x42, 0xb0, 0xdc, 0x04, 0xe0, 0x00,
-- 0xe0, 0x34, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf4,
-- 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9,
-- 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0x98, 0x05,
-- 0x00, 0xc0, 0x21, 0xf7, 0x43, 0x01, 0x70, 0x39,
-- 0x37, 0x01, 0x99, 0x07, 0x70, 0x39, 0x37, 0x01,
-- 0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, 0x26, 0x00,
-- 0x1f, 0x28, 0x42, 0xb0, 0xdc, 0x02, 0xe0, 0x05,
-- 0x36, 0x01, 0xe7, 0xf9, 0x21, 0x00, 0x70, 0x39,
-- 0x37, 0x01, 0xe7, 0xf9, 0xe7, 0xb0, 0x99, 0x03,
-- 0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, 0x23, 0x0d,
-- 0x06, 0x9b, 0x18, 0xc0, 0x49, 0x29, 0x64, 0x88,
-- 0x99, 0x09, 0x20, 0x78, 0x40, 0x08, 0x23, 0x02,
-- 0x43, 0x18, 0xf7, 0xff, 0xfa, 0x17, 0x20, 0x01,
-- 0xf7, 0xff, 0xfa, 0x14, 0x48, 0x22, 0x68, 0x00,
-- 0x38, 0x02, 0x42, 0xa0, 0xd1, 0x09, 0x48, 0x22,
-- 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19,
-- 0x60, 0x01, 0x20, 0xff, 0x49, 0x1f, 0x68, 0x09,
-- 0x70, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x38, 0x02,
-- 0x42, 0xa0, 0xd3, 0x0f, 0x48, 0x1c, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x05, 0x48, 0x1a, 0x68, 0x00,
-- 0x23, 0x01, 0x06, 0x9b, 0x40, 0x18, 0xd0, 0x05,
-- 0x20, 0x32, 0x49, 0x13, 0x60, 0x08, 0x48, 0x12,
-- 0x68, 0x00, 0x1e, 0x84, 0x2c, 0x01, 0xd1, 0x02,
-- 0x20, 0x02, 0xf7, 0xff, 0xf9, 0xeb, 0x2c, 0xff,
-- 0xd1, 0x08, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0,
-- 0x30, 0xbc, 0x49, 0x0c, 0x6c, 0xc9, 0x42, 0x88,
-- 0xd2, 0x00, 0x24, 0x18, 0x2c, 0x00, 0xd0, 0x02,
-- 0x2c, 0xff, 0xd0, 0x00, 0x3c, 0x01, 0x98, 0x08,
-- 0x60, 0x04, 0xb0, 0x08, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x44,
-- 0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xd0,
-- 0x2e, 0x08, 0x1f, 0x18, 0x66, 0x00, 0x00, 0x80,
-- 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x2c,
-- 0x6c, 0x00, 0x08, 0x00, 0xb5, 0xff, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d,
-- 0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, 0x2e, 0x20,
-- 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x01,
-- 0x20, 0xaf, 0xe7, 0xf7, 0x20, 0x01, 0x03, 0x40,
-- 0xf7, 0xff, 0xf9, 0xac, 0x20, 0x14, 0x49, 0x09,
-- 0x60, 0x08, 0x20, 0xff, 0x60, 0x20, 0x1c, 0x33,
-- 0x1c, 0x29, 0x1c, 0x38, 0x22, 0x02, 0xf7, 0xfc,
-- 0xfa, 0x4b, 0x48, 0x05, 0x68, 0x01, 0x23, 0x01,
-- 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00,
-- 0xe7, 0xe0, 0xe7, 0xdf, 0x2e, 0x08, 0x1f, 0x18,
-- 0x6c, 0x00, 0x00, 0x20, 0xb4, 0x0f, 0xb5, 0xf0,
-- 0x1c, 0x07, 0xb0, 0x82, 0x20, 0x00, 0x49, 0x16,
-- 0x60, 0x08, 0x48, 0x16, 0x6f, 0x80, 0x23, 0x09,
-- 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xe1,
-- 0x00, 0xc0, 0xe0, 0x00, 0x48, 0x12, 0x1c, 0x05,
-- 0x68, 0x38, 0x28, 0xff, 0xd1, 0x17, 0x98, 0x0d,
-- 0x90, 0x00, 0x98, 0x0c, 0x90, 0x01, 0x98, 0x01,
-- 0x99, 0x00, 0x1a, 0x46, 0x08, 0x68, 0x19, 0x81,
-- 0x1c, 0x28, 0xf0, 0x09, 0xfa, 0xeb, 0x1c, 0x04,
-- 0x34, 0x01, 0x0f, 0xf0, 0x07, 0xc0, 0xd0, 0x00,
-- 0x24, 0x04, 0x2c, 0x32, 0xd9, 0x00, 0x24, 0x04,
-- 0x1d, 0xe0, 0x30, 0x0d, 0x60, 0x38, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18,
-- 0x2e, 0x08, 0x5e, 0x44, 0xcc, 0x00, 0x0f, 0x80,
-- 0x00, 0x00, 0x05, 0xdd, 0xb5, 0xf3, 0x1c, 0x07,
-- 0xb0, 0x81, 0x99, 0x02, 0x06, 0x09, 0x0e, 0x09,
-- 0x91, 0x00, 0xb0, 0x82, 0x99, 0x02, 0x29, 0x20,
-- 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x02,
-- 0x00, 0x88, 0x49, 0x2f, 0x58, 0x08, 0x90, 0x01,
-- 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03,
-- 0xe7, 0xf1, 0x20, 0x00, 0x70, 0x78, 0x78, 0xb8,
-- 0x07, 0x00, 0x0f, 0x00, 0x90, 0x00, 0x98, 0x00,
-- 0x28, 0x04, 0xd1, 0x1f, 0x6a, 0xfe, 0x24, 0x00,
-- 0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60,
-- 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0,
-- 0x19, 0x80, 0x68, 0x40, 0x00, 0xa1, 0x19, 0x89,
-- 0x64, 0x48, 0x21, 0x00, 0x00, 0xa0, 0x19, 0x80,
-- 0x62, 0x41, 0x00, 0xa0, 0x19, 0x80, 0x6c, 0x40,
-- 0x28, 0x00, 0xd0, 0x04, 0x20, 0x80, 0x41, 0x20,
-- 0x88, 0x31, 0x43, 0x08, 0x80, 0x30, 0xe7, 0xe6,
-- 0x88, 0x30, 0x80, 0x70, 0x78, 0xb8, 0x23, 0x20,
-- 0x40, 0x18, 0xd0, 0x1f, 0x6b, 0x3d, 0x20, 0x00,
-- 0x60, 0x28, 0x20, 0x00, 0x60, 0x68, 0x20, 0x00,
-- 0x60, 0xa8, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04,
-- 0xe0, 0x0c, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24,
-- 0xe7, 0xf8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49,
-- 0x60, 0xc8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49,
-- 0x63, 0x88, 0xe7, 0xf2, 0x20, 0x00, 0x62, 0xe8,
-- 0x20, 0x00, 0x63, 0x28, 0x20, 0x00, 0x63, 0x68,
-- 0x20, 0x00, 0x65, 0xa8, 0x99, 0x02, 0x1c, 0x38,
-- 0xf0, 0x00, 0xf8, 0x3e, 0xb0, 0x03, 0xe7, 0x9e,
-- 0xb0, 0x02, 0xb0, 0x01, 0xe7, 0x9b, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07,
-- 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x82,
-- 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x00, 0xa0, 0x49, 0x12, 0x58, 0x08, 0x1c, 0x05,
-- 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x02, 0xe7, 0xf3,
-- 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x84,
-- 0x1c, 0x06, 0xd0, 0x02, 0x1c, 0x30, 0xb0, 0x02,
-- 0xe7, 0xea, 0x78, 0x68, 0x21, 0x20, 0x40, 0x01,
-- 0x91, 0x00, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00,
-- 0xff, 0x3f, 0x68, 0xe9, 0x91, 0x01, 0x29, 0x00,
-- 0xd0, 0x03, 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x03,
-- 0xfe, 0x7a, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd7,
-- 0xb0, 0x02, 0xe7, 0xd5, 0x2e, 0x08, 0x5e, 0x5c,
-- 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f,
-- 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0xa1,
-- 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x00, 0x2f, 0x20,
-- 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8,
-- 0x4b, 0x9b, 0x58, 0x18, 0x90, 0x05, 0x28, 0x00,
-- 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf2,
-- 0x78, 0x90, 0x90, 0x01, 0x71, 0xd7, 0x78, 0xd1,
-- 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x73,
-- 0x29, 0x20, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x06,
-- 0xe7, 0xe5, 0x48, 0x92, 0x68, 0x00, 0x23, 0x01,
-- 0x42, 0xd8, 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06,
-- 0xe7, 0xdd, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x8d,
-- 0x68, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1,
-- 0xb0, 0x06, 0xe7, 0xd4, 0x00, 0x88, 0x4b, 0x8a,
-- 0x50, 0x1a, 0x48, 0x8a, 0x54, 0x47, 0x01, 0x08,
-- 0x4b, 0x89, 0x18, 0xc5, 0x7f, 0x10, 0x06, 0x00,
-- 0x7f, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7f, 0x93,
-- 0x02, 0x1b, 0x43, 0x18, 0x7f, 0xd3, 0x43, 0x03,
-- 0xc5, 0x08, 0x1d, 0xd0, 0x30, 0x19, 0x78, 0x00,
-- 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0x5b,
-- 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19,
-- 0x78, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3,
-- 0x33, 0x19, 0x78, 0xdb, 0x43, 0x03, 0xc5, 0x08,
-- 0x01, 0x08, 0x4b, 0x7a, 0x18, 0xc4, 0x7b, 0x10,
-- 0x06, 0x00, 0x7b, 0x53, 0x04, 0x1b, 0x43, 0x18,
-- 0x7b, 0x93, 0x02, 0x1b, 0x43, 0x18, 0x7b, 0xd3,
-- 0x43, 0x03, 0xc4, 0x08, 0x7c, 0x10, 0x06, 0x00,
-- 0x7c, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7c, 0x93,
-- 0x02, 0x1b, 0x43, 0x18, 0x7c, 0xd3, 0x43, 0x03,
-- 0xc4, 0x08, 0x98, 0x01, 0x07, 0xc0, 0x0f, 0xc0,
-- 0xd0, 0x20, 0x1d, 0xd0, 0x30, 0x19, 0x79, 0x00,
-- 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0x5b,
-- 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19,
-- 0x79, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3,
-- 0x33, 0x19, 0x79, 0xdb, 0x43, 0x03, 0xc5, 0x08,
-- 0x7d, 0x10, 0x06, 0x00, 0x7d, 0x53, 0x04, 0x1b,
-- 0x43, 0x18, 0x7d, 0x93, 0x02, 0x1b, 0xe0, 0x00,
-- 0xe0, 0x42, 0x43, 0x18, 0x7d, 0xd3, 0x43, 0x03,
-- 0xc4, 0x08, 0xe0, 0x03, 0x23, 0x00, 0xc5, 0x08,
-- 0x23, 0x00, 0xc4, 0x08, 0x23, 0xff, 0xc5, 0x08,
-- 0x20, 0x19, 0x06, 0x80, 0x6b, 0x00, 0x23, 0x08,
-- 0x40, 0x18, 0xd0, 0x06, 0x88, 0x90, 0x04, 0x00,
-- 0x19, 0xc3, 0x93, 0x02, 0x9b, 0x02, 0xc4, 0x08,
-- 0xe0, 0x00, 0xc4, 0x80, 0x98, 0x01, 0x23, 0x08,
-- 0x40, 0x18, 0xd0, 0x17, 0x48, 0x50, 0x5d, 0xc0,
-- 0x30, 0x01, 0x4b, 0x4f, 0x55, 0xd8, 0x7a, 0x10,
-- 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0x01,
-- 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 0x61, 0x18,
-- 0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x04,
-- 0x20, 0x01, 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b,
-- 0x61, 0x58, 0xe0, 0x05, 0x4e, 0x45, 0x20, 0x01,
-- 0x40, 0x88, 0x68, 0x33, 0x43, 0x18, 0x60, 0x30,
-- 0x20, 0x01, 0x40, 0x88, 0x4b, 0x3b, 0x68, 0x1b,
-- 0x43, 0x18, 0x4b, 0x3a, 0x60, 0x18, 0xe0, 0x4f,
-- 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x48,
-- 0x48, 0x3d, 0x88, 0x00, 0x4b, 0x3d, 0x42, 0x98,
-- 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 0xe7, 0x26,
-- 0x00, 0x88, 0x4b, 0x3b, 0x58, 0x18, 0x28, 0x00,
-- 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x1e,
-- 0x29, 0x10, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06,
-- 0xe7, 0x19, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x32,
-- 0x88, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1,
-- 0xb0, 0x06, 0xe7, 0x10, 0x98, 0x05, 0x78, 0x80,
-- 0x28, 0x02, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06,
-- 0xe7, 0x09, 0x00, 0x88, 0x4b, 0x2c, 0x50, 0x1a,
-- 0x48, 0x2c, 0x54, 0x47, 0x00, 0xf8, 0x1b, 0xc0,
-- 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 0x18, 0xc0,
-- 0x90, 0x04, 0x98, 0x04, 0x7e, 0x00, 0x28, 0xff,
-- 0xd1, 0x02, 0x98, 0x04, 0x76, 0x01, 0xe0, 0x01,
-- 0x98, 0x04, 0x76, 0x41, 0x4e, 0x25, 0x96, 0x03,
-- 0x1d, 0xd3, 0x33, 0x05, 0x00, 0x88, 0x9e, 0x03,
-- 0x50, 0x33, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x1c,
-- 0x88, 0x1b, 0x43, 0x18, 0x4b, 0x1a, 0x80, 0x18,
-- 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe6, 0xe2,
-- 0x78, 0x50, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18,
-- 0x70, 0x50, 0x98, 0x05, 0x78, 0x80, 0x28, 0x00,
-- 0xd1, 0x09, 0x98, 0x00, 0x68, 0x00, 0x23, 0x01,
-- 0x03, 0x5b, 0x43, 0x18, 0x9b, 0x00, 0x60, 0x18,
-- 0x20, 0x02, 0x9b, 0x05, 0x70, 0xd8, 0x98, 0x05,
-- 0x78, 0x80, 0x30, 0x01, 0x9b, 0x05, 0x70, 0x98,
-- 0x20, 0x00, 0xb0, 0x06, 0xe6, 0xc7, 0xb0, 0x06,
-- 0xe6, 0xc5, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xdc,
-- 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xa4,
-- 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00,
-- 0x2e, 0x08, 0x7b, 0xf4, 0x64, 0x00, 0x00, 0x18,
-- 0x2e, 0x08, 0x5e, 0xe0, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x9e, 0x00, 0x04, 0xb8,
-- 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f,
-- 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0x65,
-- 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x01, 0x2f, 0x20,
-- 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8,
-- 0x4b, 0x5f, 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02,
-- 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf3, 0x78, 0x90,
-- 0x90, 0x03, 0x78, 0xd1, 0x00, 0x88, 0x4b, 0x5b,
-- 0x58, 0x18, 0x42, 0x90, 0xd0, 0x02, 0x20, 0xb1,
-- 0xb0, 0x06, 0xe7, 0xe8, 0x98, 0x03, 0x23, 0x80,
-- 0x40, 0x18, 0xd1, 0x49, 0x01, 0x08, 0x4b, 0x56,
-- 0x18, 0xc3, 0x93, 0x00, 0x20, 0x00, 0x9b, 0x00,
-- 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 0x4e, 0x51,
-- 0x50, 0x33, 0x23, 0xff, 0x48, 0x51, 0x54, 0x43,
-- 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x50,
-- 0x68, 0x1b, 0x40, 0x18, 0x4b, 0x4e, 0x60, 0x18,
-- 0x98, 0x03, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x27,
-- 0x20, 0x01, 0x40, 0x88, 0x90, 0x04, 0x7a, 0x10,
-- 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x0b, 0x98, 0x04,
-- 0x23, 0x19, 0x06, 0x9b, 0x69, 0x1b, 0x40, 0x18,
-- 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b,
-- 0x61, 0x18, 0xe7, 0xf4, 0xe0, 0x0e, 0x7a, 0x10,
-- 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0a, 0x98, 0x04,
-- 0x23, 0x19, 0x06, 0x9b, 0x69, 0x5b, 0x40, 0x18,
-- 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b,
-- 0x61, 0x58, 0xe7, 0xf4, 0x48, 0x3b, 0x5d, 0xc0,
-- 0x38, 0x01, 0x4b, 0x3a, 0x55, 0xd8, 0xe0, 0x06,
-- 0x4e, 0x39, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0,
-- 0x68, 0x33, 0x40, 0x18, 0x60, 0x30, 0xe0, 0x36,
-- 0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x2f,
-- 0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x33,
-- 0x68, 0x1b, 0x18, 0xc3, 0x93, 0x02, 0x9b, 0x02,
-- 0x7e, 0x18, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff,
-- 0x9b, 0x02, 0x76, 0x18, 0xe0, 0x0a, 0x9b, 0x02,
-- 0x7e, 0x58, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff,
-- 0x9b, 0x02, 0x76, 0x58, 0xe0, 0x02, 0x20, 0xb1,
-- 0xb0, 0x06, 0xe7, 0x7c, 0x23, 0x00, 0x00, 0x88,
-- 0x4e, 0x27, 0x50, 0x33, 0x20, 0xff, 0x4b, 0x27,
-- 0x54, 0x58, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0,
-- 0x4b, 0x25, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x24,
-- 0x80, 0x18, 0x4e, 0x24, 0x96, 0x05, 0x23, 0x00,
-- 0x00, 0x88, 0x9e, 0x05, 0x50, 0x33, 0xe0, 0x02,
-- 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x63, 0x78, 0xa8,
-- 0x38, 0x01, 0x70, 0xa8, 0x78, 0x50, 0x23, 0x80,
-- 0x43, 0x18, 0x70, 0x50, 0x78, 0xa8, 0x28, 0x00,
-- 0xd1, 0x07, 0x98, 0x01, 0x68, 0x00, 0x4b, 0x1a,
-- 0x40, 0x18, 0x9b, 0x01, 0x60, 0x18, 0x20, 0x01,
-- 0x70, 0xe8, 0x24, 0x1f, 0x2c, 0x00, 0xd1, 0x02,
-- 0xe0, 0x0a, 0x3c, 0x01, 0xe7, 0xfa, 0x48, 0x0d,
-- 0x5d, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x19,
-- 0x06, 0x80, 0x64, 0xc4, 0xe0, 0x00, 0xe7, 0xf4,
-- 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x3f, 0xb0, 0x06,
-- 0xe7, 0x3d, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xe4,
-- 0x64, 0x00, 0x08, 0x08, 0x2e, 0x08, 0x5f, 0xa4,
-- 0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x7b, 0xf4,
-- 0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x5d, 0xc4,
-- 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4,
-- 0x2e, 0x08, 0x5e, 0xe0, 0x9e, 0x00, 0x04, 0xb8,
-- 0xff, 0xff, 0xdf, 0xff, 0x1c, 0x03, 0x1c, 0x0a,
-- 0x78, 0x58, 0x70, 0x10, 0x20, 0x00, 0x47, 0x70,
-- 0xe7, 0xfd, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81,
-- 0x9a, 0x03, 0x06, 0x10, 0x0e, 0x00, 0x90, 0x00,
-- 0xb0, 0x87, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18,
-- 0xd0, 0x4c, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18,
-- 0xd0, 0x48, 0x78, 0xb8, 0x90, 0x06, 0x99, 0x09,
-- 0x78, 0x88, 0x90, 0x05, 0x98, 0x06, 0x23, 0x20,
-- 0x40, 0x18, 0xd0, 0x3f, 0x98, 0x05, 0x23, 0x20,
-- 0x40, 0x18, 0xd0, 0x3b, 0x6b, 0x38, 0x90, 0x01,
-- 0x99, 0x09, 0x6b, 0x08, 0x90, 0x00, 0x98, 0x01,
-- 0x28, 0x00, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x00,
-- 0xd0, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb6, 0xb0, 0x08,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x98, 0x01, 0x68, 0x05, 0x98, 0x00, 0x68, 0x04,
-- 0x7a, 0x2e, 0x7a, 0x21, 0x91, 0x04, 0x7d, 0x6a,
-- 0x92, 0x03, 0x7d, 0x62, 0x92, 0x02, 0x98, 0x07,
-- 0x28, 0x00, 0xd0, 0x0a, 0x9a, 0x02, 0x99, 0x04,
-- 0x1c, 0x28, 0xf0, 0x00, 0xfc, 0xe5, 0x9a, 0x03,
-- 0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xfc, 0xe0,
-- 0xe0, 0x09, 0x99, 0x04, 0x1c, 0x28, 0x22, 0x00,
-- 0xf0, 0x00, 0xfc, 0xda, 0x1c, 0x31, 0x1c, 0x20,
-- 0x22, 0x00, 0xf0, 0x00, 0xfc, 0xd5, 0x20, 0x00,
-- 0xb0, 0x08, 0xe7, 0xd5, 0x20, 0xb1, 0xb0, 0x08,
-- 0xe7, 0xd2, 0xb0, 0x07, 0xb0, 0x01, 0xe7, 0xcf,
-- 0xb4, 0xf0, 0x1c, 0x02, 0x1c, 0x0b, 0x06, 0x1d,
-- 0x0e, 0x2d, 0xb0, 0x82, 0x2d, 0x00, 0xd1, 0x0a,
-- 0x48, 0x1a, 0x69, 0x00, 0x90, 0x01, 0x49, 0x1a,
-- 0x48, 0x18, 0x69, 0x40, 0x90, 0x00, 0x48, 0x17,
-- 0x6a, 0x00, 0x1e, 0x44, 0xe0, 0x10, 0x2d, 0x20,
-- 0xd1, 0x0a, 0x48, 0x14, 0x69, 0x80, 0x90, 0x01,
-- 0x49, 0x14, 0x48, 0x12, 0x69, 0xc0, 0x90, 0x00,
-- 0x48, 0x10, 0x6a, 0x40, 0x1e, 0x44, 0xe0, 0x03,
-- 0x20, 0xb3, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70,
-- 0x20, 0x00, 0x70, 0x10, 0x78, 0x50, 0x00, 0x80,
-- 0x4e, 0x0d, 0x58, 0x37, 0x69, 0x38, 0x61, 0x78,
-- 0x98, 0x01, 0x9e, 0x00, 0x42, 0xb0, 0xd0, 0x07,
-- 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x98, 0x01,
-- 0x40, 0x20, 0x90, 0x01, 0x98, 0x01, 0x60, 0x08,
-- 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xe6, 0xb0, 0x02,
-- 0xe7, 0xe4, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80,
-- 0x9e, 0x00, 0x04, 0x90, 0x9e, 0x00, 0x04, 0x98,
-- 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07,
-- 0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, 0x0e, 0x00,
-- 0x90, 0x00, 0xb0, 0x88, 0x98, 0x08, 0x28, 0x00,
-- 0xd1, 0x0e, 0x49, 0x69, 0x91, 0x02, 0x48, 0x69,
-- 0x69, 0x00, 0x90, 0x07, 0x48, 0x68, 0x90, 0x06,
-- 0x48, 0x66, 0x69, 0x40, 0x90, 0x05, 0x48, 0x65,
-- 0x6a, 0x00, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x17,
-- 0x98, 0x08, 0x28, 0x20, 0xd1, 0x0e, 0x49, 0x63,
-- 0x91, 0x02, 0x48, 0x60, 0x69, 0x80, 0x90, 0x07,
-- 0x48, 0x61, 0x90, 0x06, 0x48, 0x5d, 0x69, 0xc0,
-- 0x90, 0x05, 0x48, 0x5c, 0x6a, 0x40, 0x1e, 0x41,
-- 0x91, 0x04, 0xe0, 0x05, 0x20, 0xb3, 0xb0, 0x09,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x25, 0x00, 0x98, 0x07, 0x99, 0x05, 0x42, 0x88,
-- 0xd0, 0x73, 0x2d, 0x00, 0xd1, 0x72, 0x98, 0x07,
-- 0x00, 0x80, 0x99, 0x02, 0x18, 0x40, 0x23, 0x01,
-- 0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x91, 0x03,
-- 0x98, 0x07, 0x00, 0x80, 0x99, 0x02, 0x58, 0x08,
-- 0x90, 0x01, 0x99, 0x02, 0x98, 0x07, 0x18, 0x08,
-- 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc0, 0x78, 0x00,
-- 0x90, 0x00, 0x20, 0x00, 0x99, 0x02, 0x9a, 0x07,
-- 0x18, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc9,
-- 0x70, 0x08, 0x98, 0x07, 0x30, 0x01, 0x90, 0x07,
-- 0x98, 0x07, 0x99, 0x04, 0x40, 0x08, 0x90, 0x07,
-- 0x99, 0x03, 0x29, 0x00, 0xd0, 0x71, 0xb0, 0x83,
-- 0x20, 0x00, 0x90, 0x00, 0x99, 0x06, 0x91, 0x02,
-- 0x20, 0x01, 0x90, 0x01, 0x98, 0x03, 0x28, 0x80,
-- 0xd1, 0x1f, 0x24, 0x00, 0x2c, 0x10, 0xd3, 0x02,
-- 0xe0, 0x1a, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01,
-- 0x99, 0x02, 0x40, 0x08, 0xd0, 0x10, 0x48, 0x39,
-- 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0c, 0x48, 0x37,
-- 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x36,
-- 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01,
-- 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xe0, 0x03,
-- 0x98, 0x01, 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe4,
-- 0xe0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02,
-- 0xe0, 0x19, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01,
-- 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0f, 0x48, 0x2b,
-- 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0b, 0x48, 0x29,
-- 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x28,
-- 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01,
-- 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01,
-- 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe5, 0x2d, 0x00,
-- 0xe0, 0x01, 0xe0, 0x27, 0xe0, 0x26, 0xd0, 0x23,
-- 0xb0, 0x81, 0x98, 0x01, 0x70, 0x78, 0x98, 0x05,
-- 0x60, 0x78, 0x98, 0x01, 0x00, 0x80, 0x49, 0x1d,
-- 0x58, 0x08, 0x90, 0x00, 0x98, 0x00, 0x69, 0x46,
-- 0x98, 0x05, 0x42, 0xb0, 0xd3, 0x04, 0x1d, 0xf0,
-- 0x30, 0xb9, 0x99, 0x05, 0x42, 0x88, 0xd2, 0x08,
-- 0x68, 0x30, 0x28, 0x00, 0xd0, 0x01, 0x68, 0x36,
-- 0xe0, 0x02, 0x20, 0xba, 0xb0, 0x0d, 0xe7, 0x63,
-- 0xe7, 0xee, 0x60, 0xbe, 0x98, 0x00, 0x61, 0x46,
-- 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x02, 0xb0, 0x01,
-- 0xb0, 0x03, 0xe7, 0x5e, 0x70, 0x3d, 0x98, 0x07,
-- 0x99, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09,
-- 0xe7, 0x52, 0xb0, 0x08, 0xb0, 0x01, 0xe7, 0x4f,
-- 0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x80,
-- 0x9e, 0x00, 0x04, 0x90, 0x2e, 0x08, 0x69, 0x90,
-- 0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x5f, 0xc4,
-- 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xa4,
-- 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0x5c,
-- 0xb4, 0x90, 0x1c, 0x01, 0x78, 0x48, 0x00, 0x80,
-- 0x4c, 0x0d, 0x58, 0x23, 0x69, 0x1a, 0x68, 0x8f,
-- 0x42, 0xba, 0xd0, 0x12, 0x68, 0x10, 0x42, 0xb8,
-- 0xd0, 0x08, 0x68, 0x10, 0x28, 0x00, 0xd0, 0x01,
-- 0x68, 0x12, 0xe0, 0x02, 0x20, 0xba, 0xbc, 0x90,
-- 0x47, 0x70, 0xe7, 0xf3, 0x20, 0x00, 0x60, 0x10,
-- 0x69, 0x9c, 0x69, 0x18, 0x60, 0x20, 0x61, 0x1f,
-- 0x61, 0x9a, 0x20, 0x00, 0xe7, 0xf3, 0xe7, 0xf2,
-- 0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0xb0, 0x1c, 0x02,
-- 0x1c, 0x0f, 0x78, 0x90, 0x23, 0x04, 0x40, 0x18,
-- 0xd0, 0x1c, 0x78, 0x90, 0x23, 0x20, 0x40, 0x18,
-- 0xd0, 0x18, 0x6b, 0x14, 0x68, 0x20, 0x28, 0x00,
-- 0xd0, 0x02, 0x1d, 0xe5, 0x35, 0x05, 0xe0, 0x01,
-- 0x1d, 0xe5, 0x35, 0x31, 0x21, 0x00, 0x29, 0x08,
-- 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01,
-- 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x58, 0x2b,
-- 0x00, 0x88, 0x50, 0x3b, 0xe7, 0xf6, 0x20, 0x00,
-- 0xbc, 0xb0, 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb,
-- 0xe7, 0xfa, 0xb5, 0xf3, 0x1c, 0x0a, 0xb0, 0x93,
-- 0x20, 0x00, 0x90, 0x06, 0x98, 0x13, 0x69, 0x00,
-- 0x90, 0x00, 0x98, 0x00, 0x6b, 0x00, 0x90, 0x12,
-- 0x98, 0x00, 0x78, 0x80, 0x90, 0x05, 0x98, 0x12,
-- 0x68, 0x00, 0x90, 0x01, 0x28, 0x00, 0xd0, 0x03,
-- 0x98, 0x12, 0x30, 0x0c, 0x90, 0x09, 0xe0, 0x0e,
-- 0x98, 0x12, 0x6a, 0xc0, 0x90, 0x01, 0x28, 0x00,
-- 0xd0, 0x03, 0x98, 0x12, 0x30, 0x38, 0x90, 0x09,
-- 0xe0, 0x05, 0x20, 0xb1, 0xb0, 0x13, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00,
-- 0x90, 0x06, 0x98, 0x05, 0x23, 0x04, 0x40, 0x18,
-- 0xd0, 0x73, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04,
-- 0xe0, 0x0c, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09,
-- 0xe7, 0xf8, 0x98, 0x13, 0x30, 0x80, 0x69, 0x00,
-- 0x00, 0x8b, 0x58, 0xc0, 0x00, 0x8e, 0xab, 0x0a,
-- 0x51, 0x98, 0xe7, 0xf2, 0x9d, 0x01, 0x21, 0x00,
-- 0x29, 0x08, 0xdb, 0x04, 0xe0, 0xa7, 0x1c, 0x48,
-- 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88,
-- 0xab, 0x0a, 0x58, 0x18, 0x28, 0x00, 0xd0, 0x55,
-- 0x20, 0x00, 0x90, 0x08, 0x48, 0x73, 0x90, 0x07,
-- 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 0x28, 0x20,
-- 0xdb, 0x06, 0xe0, 0x8d, 0x98, 0x02, 0x30, 0x01,
-- 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xe7, 0xf5,
-- 0x00, 0x8b, 0xa8, 0x0a, 0x58, 0xc0, 0x9b, 0x07,
-- 0x40, 0x18, 0x90, 0x08, 0x28, 0x00, 0xd0, 0x73,
-- 0x00, 0x88, 0x9b, 0x09, 0x58, 0x18, 0x9b, 0x08,
-- 0x40, 0x18, 0xd0, 0x6e, 0x1d, 0xec, 0x34, 0x01,
-- 0x27, 0x00, 0x79, 0xa0, 0x9b, 0x06, 0x42, 0x98,
-- 0xd0, 0x08, 0x68, 0x68, 0x1c, 0x05, 0xd1, 0x02,
-- 0x20, 0xba, 0xb0, 0x13, 0xe7, 0xab, 0x1d, 0xec,
-- 0x34, 0x01, 0xe7, 0xf2, 0x78, 0x60, 0x07, 0x00,
-- 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f,
-- 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07,
-- 0x0c, 0x3f, 0x2a, 0x00, 0xd0, 0x42, 0x98, 0x13,
-- 0x88, 0x40, 0x42, 0xb8, 0xdb, 0x3a, 0x98, 0x13,
-- 0x88, 0x40, 0x1b, 0xc0, 0x9b, 0x13, 0x80, 0x58,
-- 0x20, 0xbc, 0x90, 0x04, 0x2f, 0x00, 0xdd, 0x30,
-- 0x2f, 0xbc, 0xdd, 0x1b, 0x20, 0x00, 0x90, 0x03,
-- 0x98, 0x03, 0x28, 0xbc, 0xdb, 0x09, 0xe0, 0x0d,
-- 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00,
-- 0xe0, 0x01, 0xe0, 0x4c, 0xe0, 0x41, 0x90, 0x03,
-- 0xe7, 0xf2, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13,
-- 0x32, 0x01, 0xe7, 0xf1, 0x1f, 0xf8, 0x38, 0xb5,
-- 0x04, 0x07, 0x0c, 0x3f, 0x68, 0x2d, 0x1d, 0xec,
-- 0x34, 0x01, 0xe0, 0x11, 0x20, 0x00, 0x90, 0x03,
-- 0x98, 0x03, 0x42, 0xb8, 0xdb, 0x06, 0xe0, 0x0a,
-- 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00,
-- 0x90, 0x03, 0xe7, 0xf5, 0x78, 0x23, 0x34, 0x01,
-- 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf4, 0x27, 0x00,
-- 0xe7, 0xcc, 0xe0, 0x02, 0x20, 0xb7, 0xb0, 0x13,
-- 0xe7, 0x59, 0xe0, 0x04, 0x98, 0x13, 0x88, 0x40,
-- 0x19, 0xc0, 0x9b, 0x13, 0x80, 0x58, 0x00, 0x88,
-- 0xab, 0x0a, 0x58, 0x18, 0x9b, 0x07, 0x43, 0x98,
-- 0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe0, 0x01,
-- 0xe0, 0x01, 0xe0, 0x00, 0x9d, 0x01, 0x98, 0x06,
-- 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06,
-- 0x98, 0x07, 0x08, 0x40, 0x90, 0x07, 0xe7, 0x71,
-- 0xe0, 0x04, 0x98, 0x06, 0x30, 0x20, 0x06, 0x00,
-- 0x0e, 0x00, 0x90, 0x06, 0xe7, 0x57, 0x20, 0x00,
-- 0xb0, 0x13, 0xe7, 0x34, 0xe0, 0x44, 0x98, 0x05,
-- 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3b, 0x98, 0x01,
-- 0x1d, 0xc4, 0x34, 0x01, 0x78, 0x60, 0x07, 0x00,
-- 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f,
-- 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07,
-- 0x0c, 0x3f, 0x2f, 0x00, 0xdd, 0x28, 0x2f, 0xbc,
-- 0xdd, 0x17, 0x21, 0x00, 0x29, 0xbc, 0xdb, 0x04,
-- 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09,
-- 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13,
-- 0x32, 0x01, 0xe7, 0xf6, 0x1f, 0xf8, 0x38, 0xb5,
-- 0x04, 0x07, 0x0c, 0x3f, 0x98, 0x01, 0x68, 0x00,
-- 0x90, 0x01, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01,
-- 0xe0, 0x0d, 0x21, 0x00, 0x42, 0xb9, 0xdb, 0x04,
-- 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09,
-- 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13,
-- 0x32, 0x01, 0xe7, 0xf6, 0x27, 0x00, 0xe7, 0xd4,
-- 0x20, 0x00, 0xb0, 0x13, 0xe6, 0xf3, 0x20, 0xb1,
-- 0xb0, 0x13, 0xe6, 0xf0, 0xb0, 0x13, 0xe6, 0xee,
-- 0xe6, 0xed, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
-- 0xb5, 0xf3, 0xb0, 0x84, 0x98, 0x04, 0x78, 0x40,
-- 0x00, 0x80, 0x49, 0x4b, 0x58, 0x08, 0x90, 0x03,
-- 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x04,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x98, 0x04, 0x68, 0x86, 0x98, 0x04, 0x88, 0x47,
-- 0x98, 0x04, 0x68, 0x44, 0x1d, 0xf0, 0x30, 0xb9,
-- 0x99, 0x04, 0x68, 0x49, 0x1a, 0x45, 0x42, 0xbd,
-- 0xdb, 0x0c, 0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc,
-- 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x04, 0xe7, 0xe7,
-- 0x1c, 0x3a, 0x99, 0x05, 0x1c, 0x20, 0xf0, 0x00,
-- 0xf9, 0x29, 0xe0, 0x6b, 0x20, 0x00, 0x90, 0x00,
-- 0x98, 0x04, 0x78, 0x40, 0x00, 0xc3, 0x1a, 0x18,
-- 0x00, 0x80, 0x49, 0x36, 0x68, 0x09, 0x18, 0x40,
-- 0x90, 0x01, 0x98, 0x01, 0x78, 0x80, 0x90, 0x02,
-- 0x98, 0x02, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02,
-- 0x98, 0x02, 0x28, 0x12, 0xd1, 0x03, 0x2d, 0x0e,
-- 0xda, 0x01, 0x20, 0x01, 0x90, 0x00, 0x2f, 0x00,
-- 0xdd, 0x50, 0xb0, 0x81, 0x42, 0xaf, 0xdd, 0x0d,
-- 0x2d, 0x00, 0xdb, 0x01, 0x2d, 0xbc, 0xdd, 0x02,
-- 0x20, 0xba, 0xb0, 0x05, 0xe7, 0xbc, 0x1c, 0x2a,
-- 0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xfe,
-- 0x68, 0x36, 0xe0, 0x0b, 0x2f, 0x00, 0xdb, 0x01,
-- 0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05,
-- 0xe7, 0xae, 0x1c, 0x3a, 0x99, 0x06, 0x1c, 0x20,
-- 0xf0, 0x00, 0xf8, 0xf0, 0x99, 0x06, 0x19, 0x49,
-- 0x91, 0x06, 0x1b, 0x7f, 0x1d, 0x31, 0x91, 0x00,
-- 0x99, 0x00, 0x78, 0x88, 0x19, 0x84, 0x98, 0x01,
-- 0x28, 0x00, 0xd0, 0x20, 0x99, 0x00, 0x78, 0xc8,
-- 0x23, 0x80, 0x40, 0x18, 0xd1, 0x1b, 0x1d, 0xf0,
-- 0x30, 0xb9, 0x1b, 0x05, 0x42, 0xbd, 0xdb, 0x01,
-- 0x3c, 0x01, 0xe0, 0x14, 0x1c, 0x68, 0x42, 0xb8,
-- 0xd1, 0x11, 0x99, 0x00, 0x78, 0x88, 0x28, 0x09,
-- 0xdd, 0x08, 0x99, 0x00, 0x79, 0x08, 0x30, 0x09,
-- 0x99, 0x00, 0x78, 0x89, 0x42, 0x88, 0xd0, 0x00,
-- 0x3c, 0x01, 0xe0, 0x04, 0x99, 0x00, 0x78, 0x88,
-- 0x28, 0x09, 0xd1, 0x00, 0x3c, 0x01, 0x20, 0x00,
-- 0x90, 0x01, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05,
-- 0xb0, 0x01, 0xe7, 0xac, 0x20, 0x00, 0xb0, 0x04,
-- 0xe7, 0x72, 0xb0, 0x04, 0xe7, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4,
-- 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24,
-- 0xb0, 0x83, 0x00, 0xa0, 0x4b, 0x4c, 0x58, 0x1d,
-- 0x78, 0x28, 0x90, 0x02, 0x2c, 0x20, 0xdb, 0x05,
-- 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x46,
-- 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0,
-- 0xb0, 0x03, 0xe7, 0xf3, 0x00, 0xe0, 0x1b, 0x00,
-- 0x00, 0x80, 0x4b, 0x42, 0x68, 0x1b, 0x18, 0xc7,
-- 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x63, 0x20, 0x00,
-- 0x42, 0x80, 0xd0, 0x20, 0x21, 0x00, 0x29, 0x20,
-- 0xdb, 0x04, 0xe0, 0x1b, 0x1c, 0x48, 0x06, 0x01,
-- 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x4b, 0x3a,
-- 0x58, 0x18, 0x90, 0x01, 0x98, 0x01, 0x79, 0xc0,
-- 0x42, 0xa0, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0x88,
-- 0x43, 0xc0, 0x4b, 0x36, 0x68, 0x1b, 0x40, 0x18,
-- 0x4b, 0x34, 0x60, 0x18, 0x23, 0x00, 0x00, 0x88,
-- 0x4e, 0x31, 0x50, 0x33, 0x23, 0xff, 0x48, 0x32,
-- 0x54, 0x43, 0xe7, 0xe3, 0xe0, 0x3f, 0x7e, 0x38,
-- 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x10, 0x20, 0xff,
-- 0x4b, 0x2e, 0x54, 0x98, 0x23, 0x00, 0x00, 0x90,
-- 0x4e, 0x2d, 0x50, 0x33, 0x20, 0x01, 0x40, 0x90,
-- 0x43, 0xc0, 0x4b, 0x2c, 0x88, 0x1b, 0x40, 0x18,
-- 0x4b, 0x2a, 0x80, 0x18, 0x20, 0xff, 0x76, 0x38,
-- 0x7e, 0x78, 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x11,
-- 0x20, 0xff, 0x4b, 0x24, 0x54, 0x98, 0x23, 0x00,
-- 0x00, 0x90, 0x4e, 0x23, 0x50, 0x33, 0x20, 0x01,
-- 0x40, 0x90, 0x43, 0xc0, 0x4b, 0x21, 0x88, 0x1b,
-- 0x40, 0x18, 0x4b, 0x20, 0x80, 0x18, 0x20, 0xff,
-- 0x76, 0x78, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x03,
-- 0xe7, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x1a,
-- 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0,
-- 0x4b, 0x18, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x17,
-- 0x80, 0x18, 0x4e, 0x17, 0x96, 0x00, 0x20, 0x00,
-- 0x00, 0x93, 0x9e, 0x00, 0x50, 0xf0, 0x98, 0x02,
-- 0x23, 0x20, 0x40, 0x18, 0xd0, 0xff, 0x21, 0x00,
-- 0x29, 0x0c, 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x48,
-- 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x00,
-- 0x18, 0x7b, 0x73, 0x18, 0xe7, 0xf7, 0x20, 0x00,
-- 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 0x20, 0x00,
-- 0xb0, 0x03, 0xe7, 0x6f, 0xb0, 0x03, 0xe7, 0x6d,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4,
-- 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xdc,
-- 0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5f, 0xc4,
-- 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5e, 0xe0,
-- 0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf0, 0x1c, 0x05,
-- 0x1c, 0x0c, 0x1c, 0x17, 0x20, 0x1d, 0x02, 0x80,
-- 0x69, 0x86, 0x1c, 0x3a, 0x1c, 0x29, 0x1c, 0x20,
-- 0xf0, 0x08, 0xfb, 0x32, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82,
-- 0x68, 0x48, 0x68, 0x8c, 0x1d, 0xe2, 0x32, 0xb7,
-- 0x42, 0x82, 0xd9, 0x09, 0x78, 0x42, 0x07, 0x12,
-- 0x0f, 0x12, 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a,
-- 0x32, 0x03, 0x04, 0x17, 0x0c, 0x3f, 0xe0, 0x41,
-- 0xb0, 0x82, 0x68, 0x23, 0x93, 0x01, 0x9b, 0x01,
-- 0x33, 0x04, 0x93, 0x00, 0x9b, 0x00, 0x78, 0x9b,
-- 0x9e, 0x01, 0x19, 0x9a, 0x78, 0x4e, 0x00, 0xf3,
-- 0x1b, 0x9b, 0x00, 0x9b, 0x4e, 0x1b, 0x68, 0x36,
-- 0x19, 0x9b, 0x93, 0x02, 0x9b, 0x02, 0x78, 0x9d,
-- 0x06, 0xed, 0x0e, 0xed, 0x2d, 0x12, 0xd1, 0x0f,
-- 0x1d, 0xe3, 0x33, 0xb9, 0x68, 0x4e, 0x1b, 0x9b,
-- 0x06, 0x1b, 0x0e, 0x1b, 0x93, 0x03, 0x9b, 0x00,
-- 0x78, 0xde, 0x23, 0x80, 0x40, 0x33, 0xd1, 0x03,
-- 0x9b, 0x03, 0x2b, 0x0e, 0xda, 0x00, 0x3a, 0x01,
-- 0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x83, 0xd9, 0x0b,
-- 0x78, 0x43, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b,
-- 0x04, 0x1f, 0x0c, 0x3f, 0x78, 0x13, 0x18, 0xfb,
-- 0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xe0, 0x08,
-- 0x78, 0x13, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b,
-- 0x78, 0x56, 0x43, 0x33, 0x33, 0x03, 0x04, 0x1f,
-- 0x0c, 0x3f, 0xb0, 0x02, 0x80, 0x4f, 0xb0, 0x02,
-- 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5d, 0xc4,
-- 0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x0b,
-- 0x0e, 0x1b, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x00,
-- 0xd1, 0x0a, 0x49, 0x24, 0x4b, 0x24, 0x69, 0x1b,
-- 0x1c, 0x18, 0x4b, 0x23, 0x69, 0x5b, 0x1c, 0x1c,
-- 0x4b, 0x21, 0x6a, 0x1b, 0x1e, 0x5a, 0xe0, 0x09,
-- 0x49, 0x20, 0x4b, 0x1f, 0x69, 0x9b, 0x1c, 0x18,
-- 0x4b, 0x1d, 0x69, 0xdb, 0x1c, 0x1c, 0x4b, 0x1c,
-- 0x6a, 0x5b, 0x1e, 0x5a, 0x9b, 0x01, 0x78, 0xdd,
-- 0x26, 0x01, 0x40, 0xae, 0x1c, 0x37, 0x42, 0xa0,
-- 0xd0, 0x26, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01,
-- 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x40, 0x3b,
-- 0xd0, 0x1b, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01,
-- 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x43, 0xbb,
-- 0x1c, 0x1d, 0x00, 0x83, 0x18, 0x5e, 0x23, 0x01,
-- 0x02, 0x9b, 0x18, 0xf3, 0x60, 0x1d, 0x00, 0x83,
-- 0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb,
-- 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x05, 0x25, 0x00,
-- 0x18, 0x0e, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xf3,
-- 0x70, 0x1d, 0x30, 0x01, 0x40, 0x10, 0xe7, 0xd6,
-- 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x90,
-- 0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0x69, 0x90,
-- 0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17,
-- 0x06, 0x21, 0x0e, 0x09, 0x06, 0x38, 0x0e, 0x00,
-- 0x72, 0x19, 0x28, 0x00, 0xd0, 0x00, 0x75, 0x58,
-- 0x68, 0x5b, 0x2b, 0x00, 0xd1, 0xf8, 0xbc, 0x90,
-- 0x47, 0x70, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07,
-- 0x68, 0xf8, 0x28, 0x1f, 0xd9, 0x03, 0x20, 0xe1,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1e,
-- 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18,
-- 0x49, 0x1b, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80,
-- 0x48, 0x19, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x18,
-- 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x16, 0x6d, 0x00,
-- 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18,
-- 0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80,
-- 0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x10,
-- 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x0e, 0x6f, 0xc1,
-- 0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x09, 0xc1, 0x09,
-- 0xcf, 0x08, 0xc1, 0x08, 0xf0, 0x00, 0xfc, 0x1e,
-- 0x20, 0x00, 0x49, 0x09, 0x60, 0x08, 0x20, 0x00,
-- 0x49, 0x07, 0x60, 0x48, 0x20, 0x00, 0x49, 0x06,
-- 0x60, 0x88, 0x49, 0x07, 0x20, 0x0b, 0xf0, 0x0c,
-- 0xf9, 0xb5, 0x20, 0xff, 0x30, 0x01, 0x49, 0x02,
-- 0x61, 0xc8, 0x20, 0x00, 0xe7, 0xc0, 0xe7, 0xbf,
-- 0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xfd, 0xff,
-- 0x2e, 0x01, 0x09, 0x15, 0x1c, 0x01, 0x48, 0x0e,
-- 0x6f, 0x00, 0x68, 0x00, 0x60, 0x08, 0x48, 0x0c,
-- 0x6e, 0x80, 0x68, 0x00, 0x60, 0x48, 0x48, 0x0a,
-- 0x6e, 0xc0, 0x68, 0x00, 0x60, 0x88, 0x48, 0x08,
-- 0x6f, 0x40, 0x68, 0x00, 0x60, 0xc8, 0x48, 0x06,
-- 0x68, 0x00, 0x61, 0x08, 0x48, 0x04, 0x68, 0x40,
-- 0x61, 0x48, 0x48, 0x03, 0x68, 0x80, 0x61, 0x88,
-- 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00,
-- 0x2e, 0x08, 0x1f, 0x1c, 0x48, 0x03, 0x6e, 0x80,
-- 0x68, 0x00, 0x07, 0x40, 0x0f, 0xc0, 0x47, 0x70,
-- 0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c,
-- 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x48, 0x37,
-- 0x69, 0xc0, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98,
-- 0xd0, 0x02, 0x20, 0xe0, 0xbc, 0x80, 0x47, 0x70,
-- 0x48, 0x32, 0x62, 0x07, 0x20, 0x00, 0x49, 0x31,
-- 0x62, 0x48, 0x48, 0x31, 0x60, 0x02, 0x48, 0x30,
-- 0x68, 0x00, 0x78, 0x00, 0x49, 0x2d, 0x61, 0x88,
-- 0x48, 0x2d, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x2b,
-- 0x61, 0x08, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40,
-- 0x49, 0x28, 0x60, 0xc8, 0x48, 0x27, 0x69, 0x80,
-- 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27,
-- 0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x23,
-- 0x61, 0xc8, 0x48, 0x22, 0x68, 0x40, 0x30, 0x01,
-- 0x49, 0x20, 0x60, 0x48, 0x48, 0x1f, 0x6d, 0x40,
-- 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x1d,
-- 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09,
-- 0x43, 0x08, 0x49, 0x1a, 0x6d, 0x49, 0x60, 0x08,
-- 0x06, 0x00, 0x48, 0x18, 0x6d, 0x00, 0x68, 0x00,
-- 0x4b, 0x19, 0x40, 0x18, 0x49, 0x15, 0x69, 0x89,
-- 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x13,
-- 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0x48, 0x11,
-- 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x13, 0x40, 0x18,
-- 0x49, 0x0e, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40,
-- 0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01,
-- 0x03, 0x1b, 0x43, 0x18, 0x49, 0x09, 0x6d, 0x09,
-- 0x60, 0x08, 0x04, 0xc0, 0x48, 0x07, 0x6d, 0x40,
-- 0x68, 0x00, 0x49, 0x06, 0x6f, 0x09, 0x60, 0x08,
-- 0x48, 0x04, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x03,
-- 0x6e, 0xc9, 0x60, 0x08, 0x20, 0x00, 0xe7, 0x99,
-- 0xe7, 0x98, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c,
-- 0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x01,
-- 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xff,
-- 0xb5, 0x00, 0x48, 0xf6, 0x6e, 0x80, 0x68, 0x00,
-- 0x23, 0x08, 0x40, 0x18, 0xd0, 0x74, 0x48, 0xf3,
-- 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xf2, 0x40, 0x18,
-- 0x49, 0xf0, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80,
-- 0x48, 0xee, 0x6e, 0x40, 0x68, 0x00, 0x0a, 0x00,
-- 0x02, 0x00, 0x49, 0xec, 0x6e, 0x49, 0x60, 0x08,
-- 0x06, 0x00, 0x48, 0xea, 0x6e, 0xc0, 0x68, 0x00,
-- 0x23, 0x01, 0x02, 0xdb, 0x40, 0x18, 0xd0, 0x3e,
-- 0x20, 0xff, 0x30, 0x01, 0x49, 0xe5, 0x61, 0xc8,
-- 0x48, 0xe4, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xe5,
-- 0x40, 0x18, 0x49, 0xe2, 0x6d, 0x09, 0x60, 0x08,
-- 0x04, 0xc0, 0x48, 0xe0, 0x6f, 0xc0, 0x68, 0x80,
-- 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xdd,
-- 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01,
-- 0x48, 0xdd, 0x68, 0x00, 0x7a, 0x00, 0x49, 0xd9,
-- 0x69, 0x09, 0x1a, 0x41, 0x48, 0xd7, 0x6f, 0xc0,
-- 0x68, 0x80, 0x68, 0x02, 0x4b, 0xd9, 0x40, 0x1a,
-- 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11,
-- 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0xd1,
-- 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x04,
-- 0x43, 0x19, 0x60, 0x01, 0x07, 0x48, 0x48, 0xcd,
-- 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88,
-- 0xf0, 0x0c, 0xf8, 0x96, 0x48, 0xc9, 0x68, 0x00,
-- 0x30, 0x01, 0x49, 0xc8, 0x60, 0x08, 0x48, 0xc7,
-- 0x69, 0xc0, 0x4b, 0xcb, 0x42, 0x98, 0xd0, 0x73,
-- 0xdc, 0x08, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98,
-- 0xd0, 0x6f, 0x23, 0x01, 0x02, 0x5b, 0x42, 0x98,
-- 0xd0, 0x07, 0xe2, 0xba, 0x4b, 0xc5, 0x42, 0x98,
-- 0xd0, 0x68, 0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x66,
-- 0xe2, 0xb3, 0x48, 0xbc, 0x6e, 0x80, 0x68, 0x00,
-- 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xe0, 0x00,
-- 0xe2, 0xcd, 0xd0, 0x3f, 0x48, 0xb7, 0x68, 0x00,
-- 0x30, 0x01, 0x49, 0xb6, 0x60, 0x08, 0x48, 0xb5,
-- 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xb5, 0x40, 0x18,
-- 0x49, 0xb2, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0,
-- 0x20, 0xff, 0x30, 0x01, 0x49, 0xaf, 0x61, 0xc8,
-- 0x48, 0xae, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01,
-- 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xab, 0x6a, 0x52,
-- 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0xac,
-- 0x68, 0x00, 0x7a, 0x00, 0x49, 0xa7, 0x69, 0x09,
-- 0x1a, 0x41, 0x48, 0xa6, 0x6f, 0xc0, 0x68, 0x80,
-- 0x68, 0x02, 0x4b, 0xa8, 0x40, 0x1a, 0x04, 0x09,
-- 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01,
-- 0x02, 0x08, 0x0c, 0x00, 0x48, 0x9f, 0x6f, 0xc0,
-- 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19,
-- 0x60, 0x01, 0x07, 0x88, 0x48, 0x9b, 0x6f, 0xc0,
-- 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0c,
-- 0xf8, 0x33, 0xe0, 0x5e, 0x48, 0x97, 0x69, 0x00,
-- 0x28, 0x00, 0xd0, 0x20, 0x48, 0x95, 0x69, 0x00,
-- 0x38, 0x01, 0x49, 0x94, 0x61, 0x08, 0x48, 0x93,
-- 0x68, 0xc0, 0x78, 0x00, 0x49, 0x91, 0x6c, 0x89,
-- 0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08,
-- 0x49, 0x8e, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00,
-- 0x0e, 0x00, 0x48, 0x8c, 0x68, 0xc0, 0xe0, 0x03,
-- 0xe1, 0x4b, 0xe2, 0x4d, 0xe0, 0x42, 0xe1, 0x93,
-- 0x30, 0x01, 0x49, 0x88, 0x60, 0xc8, 0x48, 0x8d,
-- 0x49, 0x86, 0x61, 0xc8, 0xe0, 0x39, 0x20, 0xff,
-- 0x30, 0x01, 0x49, 0x84, 0x61, 0xc8, 0x48, 0x83,
-- 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09,
-- 0x0a, 0x09, 0x4a, 0x80, 0x6a, 0x52, 0x06, 0x12,
-- 0x43, 0x11, 0x60, 0x01, 0x48, 0x80, 0x68, 0x00,
-- 0x7a, 0x00, 0x49, 0x7c, 0x69, 0x09, 0x1a, 0x41,
-- 0x48, 0x7a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02,
-- 0x4b, 0x7c, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09,
-- 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08,
-- 0x0c, 0x00, 0x48, 0x74, 0x6f, 0xc0, 0x68, 0x80,
-- 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01,
-- 0x07, 0xc8, 0x48, 0x70, 0x6f, 0xc0, 0x68, 0xc1,
-- 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0xdc,
-- 0x48, 0x6c, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x6d,
-- 0x40, 0x18, 0x49, 0x6a, 0x6d, 0x09, 0x60, 0x08,
-- 0x04, 0xc0, 0xe2, 0x08, 0x48, 0x67, 0x69, 0x00,
-- 0x28, 0x00, 0xd0, 0x5f, 0x48, 0x65, 0x6e, 0x80,
-- 0x68, 0x00, 0x23, 0xff, 0x33, 0x01, 0x40, 0x18,
-- 0xd0, 0x3f, 0x48, 0x62, 0x68, 0x00, 0x30, 0x01,
-- 0x49, 0x60, 0x60, 0x08, 0x48, 0x5f, 0x6d, 0x00,
-- 0x68, 0x00, 0x4b, 0x60, 0x40, 0x18, 0x49, 0x5d,
-- 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff,
-- 0x30, 0x01, 0x49, 0x5a, 0x61, 0xc8, 0x48, 0x59,
-- 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09,
-- 0x0a, 0x09, 0x4a, 0x56, 0x6a, 0x52, 0x06, 0x12,
-- 0x43, 0x11, 0x60, 0x01, 0x48, 0x56, 0x68, 0x00,
-- 0x7a, 0x00, 0x49, 0x52, 0x69, 0x09, 0x1a, 0x41,
-- 0x48, 0x50, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02,
-- 0x4b, 0x52, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09,
-- 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08,
-- 0x0c, 0x00, 0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80,
-- 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01,
-- 0x07, 0x88, 0x48, 0x46, 0x6f, 0xc0, 0x68, 0xc1,
-- 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0x88,
-- 0xe0, 0x17, 0x48, 0x42, 0x68, 0xc0, 0x78, 0x00,
-- 0x49, 0x40, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09,
-- 0x02, 0x09, 0x43, 0x08, 0x49, 0x3d, 0x6c, 0x89,
-- 0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x3b,
-- 0x68, 0xc0, 0x30, 0x01, 0x49, 0x39, 0x60, 0xc8,
-- 0x48, 0x38, 0x69, 0x00, 0x38, 0x01, 0x49, 0x37,
-- 0x61, 0x08, 0xe0, 0xa1, 0x48, 0x35, 0x6a, 0x00,
-- 0x38, 0x01, 0x49, 0x34, 0x62, 0x08, 0x48, 0x33,
-- 0x6a, 0x00, 0x28, 0x00, 0xd0, 0x4b, 0x48, 0x31,
-- 0x6a, 0x40, 0x30, 0x01, 0x49, 0x2f, 0x62, 0x48,
-- 0x48, 0x31, 0x68, 0x00, 0x30, 0x0c, 0x49, 0x30,
-- 0x60, 0x08, 0x48, 0x2f, 0x68, 0x00, 0x78, 0x00,
-- 0x49, 0x2a, 0x61, 0x88, 0x48, 0x2c, 0x68, 0x00,
-- 0x7a, 0x00, 0x49, 0x28, 0x61, 0x08, 0x48, 0x2a,
-- 0x68, 0x00, 0x68, 0x40, 0x49, 0x25, 0x60, 0xc8,
-- 0x48, 0x24, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0,
-- 0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01,
-- 0x02, 0x40, 0x49, 0x20, 0x61, 0xc8, 0x48, 0x1f,
-- 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b,
-- 0x43, 0x18, 0x49, 0x1c, 0x6d, 0x09, 0x60, 0x08,
-- 0x04, 0x80, 0x48, 0x1a, 0x6d, 0x40, 0x68, 0x00,
-- 0x0a, 0x00, 0x02, 0x00, 0x49, 0x17, 0x69, 0x89,
-- 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08,
-- 0x49, 0x14, 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00,
-- 0x48, 0x12, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19,
-- 0x40, 0x18, 0x49, 0x10, 0x69, 0x89, 0x07, 0xc9,
-- 0x0c, 0x49, 0x43, 0x08, 0x49, 0x0d, 0x6d, 0x09,
-- 0x60, 0x08, 0x04, 0x40, 0xe0, 0x4c, 0x20, 0xff,
-- 0x30, 0x01, 0x49, 0x0a, 0x61, 0xc8, 0x48, 0x09,
-- 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09,
-- 0x0a, 0x09, 0x4a, 0x06, 0x6a, 0x52, 0x06, 0x12,
-- 0x43, 0x11, 0x60, 0x01, 0x48, 0x06, 0x68, 0x00,
-- 0x7a, 0x00, 0x49, 0x02, 0x69, 0x09, 0x1a, 0x41,
-- 0x48, 0x00, 0xe0, 0x11, 0x2e, 0x08, 0x1f, 0x1c,
-- 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff,
-- 0x2e, 0x08, 0x60, 0x54, 0xff, 0x00, 0x00, 0xff,
-- 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02,
-- 0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xbf, 0xff,
-- 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0xa5,
-- 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09,
-- 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00,
-- 0x48, 0xa1, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01,
-- 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8,
-- 0x48, 0x9d, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01,
-- 0x40, 0x88, 0xf0, 0x0b, 0xfe, 0xd5, 0x48, 0x9a,
-- 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x99, 0x40, 0x18,
-- 0x49, 0x97, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0,
-- 0xe1, 0x01, 0x48, 0x95, 0x6e, 0x80, 0x68, 0x00,
-- 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xd0, 0x3f,
-- 0x48, 0x91, 0x68, 0x00, 0x30, 0x01, 0x49, 0x90,
-- 0x60, 0x08, 0x48, 0x8f, 0x6d, 0x00, 0x68, 0x00,
-- 0x4b, 0x8e, 0x40, 0x18, 0x49, 0x8c, 0x6d, 0x09,
-- 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 0x30, 0x01,
-- 0x49, 0x89, 0x61, 0xc8, 0x48, 0x88, 0x6f, 0xc0,
-- 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09,
-- 0x4a, 0x85, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11,
-- 0x60, 0x01, 0x48, 0x85, 0x68, 0x00, 0x7a, 0x00,
-- 0x49, 0x81, 0x69, 0x09, 0x1a, 0x41, 0x48, 0x80,
-- 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0x7d,
-- 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09,
-- 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00,
-- 0x48, 0x79, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01,
-- 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x07, 0x88,
-- 0x48, 0x75, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01,
-- 0x40, 0x88, 0xf0, 0x0b, 0xfe, 0x85, 0xe0, 0x02,
-- 0x48, 0x74, 0x49, 0x71, 0x61, 0xc8, 0xe0, 0xb6,
-- 0x48, 0x6f, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x62,
-- 0x48, 0x6d, 0x6e, 0x00, 0x68, 0x00, 0x49, 0x6c,
-- 0x68, 0xc9, 0x70, 0x08, 0x48, 0x6a, 0x68, 0xc0,
-- 0x30, 0x01, 0x49, 0x69, 0x60, 0xc8, 0x48, 0x68,
-- 0x69, 0x00, 0x38, 0x01, 0x49, 0x66, 0x61, 0x08,
-- 0x48, 0x65, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x4d,
-- 0x48, 0x63, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x49,
-- 0x48, 0x63, 0x68, 0x00, 0x7a, 0x40, 0x49, 0x60,
-- 0x6d, 0x09, 0x68, 0x09, 0x4b, 0x62, 0x40, 0x19,
-- 0x07, 0xc0, 0x0d, 0x40, 0x43, 0x08, 0x49, 0x5c,
-- 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 0x0f, 0xc0,
-- 0x20, 0xff, 0x30, 0x01, 0x49, 0x58, 0x61, 0xc8,
-- 0x48, 0x57, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x57,
-- 0x40, 0x18, 0x49, 0x55, 0x6d, 0x09, 0x60, 0x08,
-- 0x04, 0xc0, 0x48, 0x53, 0x6f, 0xc0, 0x68, 0x80,
-- 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x50,
-- 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01,
-- 0x48, 0x4f, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x4c,
-- 0x69, 0x09, 0x1a, 0x41, 0x48, 0x4a, 0x6f, 0xc0,
-- 0x68, 0x80, 0x68, 0x02, 0x4b, 0x47, 0x40, 0x1a,
-- 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11,
-- 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x44,
-- 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x01,
-- 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 0x48, 0x40,
-- 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88,
-- 0xf0, 0x0b, 0xfe, 0x1a, 0xe0, 0x4f, 0x48, 0x3c,
-- 0x6a, 0x00, 0x38, 0x01, 0x49, 0x3a, 0x62, 0x08,
-- 0x48, 0x39, 0x6a, 0x40, 0x30, 0x01, 0x49, 0x38,
-- 0x62, 0x48, 0x48, 0x39, 0x68, 0x00, 0x30, 0x0c,
-- 0x49, 0x37, 0x60, 0x08, 0x48, 0x36, 0x68, 0x00,
-- 0x78, 0x00, 0x49, 0x33, 0x61, 0x88, 0x48, 0x34,
-- 0x68, 0x00, 0x7a, 0x00, 0x49, 0x30, 0x61, 0x08,
-- 0x48, 0x31, 0x68, 0x00, 0x68, 0x40, 0x49, 0x2e,
-- 0x60, 0xc8, 0x48, 0x2d, 0x69, 0x80, 0x07, 0xc0,
-- 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x2f, 0xe0, 0x01,
-- 0x20, 0x01, 0x02, 0x40, 0x49, 0x28, 0x61, 0xc8,
-- 0x48, 0x27, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01,
-- 0x03, 0x5b, 0x43, 0x18, 0x49, 0x24, 0x6d, 0x09,
-- 0x60, 0x08, 0x04, 0x80, 0x48, 0x22, 0x6d, 0x40,
-- 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x20,
-- 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09,
-- 0x43, 0x08, 0x49, 0x1d, 0x6d, 0x49, 0x60, 0x08,
-- 0x06, 0x00, 0x48, 0x1b, 0x6d, 0x00, 0x68, 0x00,
-- 0x4b, 0x1f, 0x40, 0x18, 0x49, 0x18, 0x69, 0x89,
-- 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x16,
-- 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0xe0, 0x01,
-- 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x12, 0x6c, 0x80,
-- 0x68, 0x00, 0x49, 0x11, 0x6e, 0x49, 0x60, 0x08,
-- 0x48, 0x0f, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x0e,
-- 0x6f, 0x09, 0x60, 0x08, 0x48, 0x0c, 0x6d, 0x00,
-- 0x68, 0x00, 0x49, 0x0b, 0x6e, 0xc9, 0x60, 0x08,
-- 0x48, 0x09, 0x6c, 0xc0, 0x68, 0x00, 0x23, 0x08,
-- 0x43, 0x18, 0x49, 0x07, 0x6c, 0xc9, 0x60, 0x08,
-- 0x07, 0x00, 0x48, 0x05, 0x6c, 0xc0, 0x68, 0x00,
-- 0x49, 0x03, 0x6e, 0x89, 0x60, 0x08, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
-- 0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xef, 0xff,
-- 0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x03,
-- 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x02, 0x01,
-- 0xff, 0xff, 0xbf, 0xff, 0xb4, 0x80, 0x49, 0x2e,
-- 0x20, 0x00, 0x28, 0x08, 0xd3, 0x04, 0xe0, 0x06,
-- 0x1c, 0x42, 0x06, 0x10, 0x0e, 0x00, 0xe7, 0xf8,
-- 0x23, 0x00, 0xc1, 0x08, 0xe7, 0xf8, 0x4a, 0x29,
-- 0x6f, 0xd2, 0x68, 0x12, 0x4b, 0x27, 0x6d, 0x9b,
-- 0x68, 0x1b, 0x0a, 0x1b, 0x02, 0x1b, 0x06, 0x12,
-- 0x0e, 0x12, 0x43, 0x1a, 0x4b, 0x23, 0x6d, 0x9b,
-- 0x60, 0x1a, 0x06, 0x12, 0x0e, 0x12, 0x4a, 0x21,
-- 0x6f, 0xd2, 0x68, 0x52, 0x4b, 0x1f, 0x6d, 0x1b,
-- 0x68, 0x1f, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x9f,
-- 0x1c, 0x3b, 0x07, 0xd2, 0x0c, 0x12, 0x43, 0x1a,
-- 0x4b, 0x1a, 0x6d, 0x1b, 0x60, 0x1a, 0x04, 0x12,
-- 0x0f, 0xd2, 0x4a, 0x18, 0x6f, 0xd2, 0x69, 0x12,
-- 0x4b, 0x16, 0x6d, 0xdb, 0x68, 0x1b, 0x0c, 0x1b,
-- 0x04, 0x1b, 0x04, 0x12, 0x0c, 0x12, 0x43, 0x1a,
-- 0x4b, 0x12, 0x6d, 0xdb, 0x60, 0x1a, 0x04, 0x12,
-- 0x0c, 0x12, 0x4a, 0x10, 0x6d, 0x12, 0x68, 0x12,
-- 0x23, 0x01, 0x02, 0x5b, 0x43, 0x1a, 0x4b, 0x0d,
-- 0x6d, 0x1b, 0x60, 0x1a, 0x05, 0x92, 0x4a, 0x0b,
-- 0x6d, 0x12, 0x68, 0x12, 0x4b, 0x09, 0x6e, 0xdb,
-- 0x60, 0x1a, 0x4a, 0x08, 0x6d, 0x92, 0x68, 0x12,
-- 0x4b, 0x06, 0x6f, 0x5b, 0x60, 0x1a, 0x4a, 0x05,
-- 0x6d, 0xd2, 0x68, 0x12, 0x4b, 0x03, 0x6f, 0x9b,
-- 0x60, 0x1a, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x1f, 0x44, 0x2e, 0x08, 0x1f, 0x1c,
-- 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x22,
-- 0xd1, 0x07, 0x2c, 0x3f, 0xd8, 0x01, 0x2c, 0x01,
-- 0xd2, 0x03, 0x20, 0x38, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0x01, 0x49, 0x13, 0x70, 0x08,
-- 0x23, 0x01, 0x03, 0xdb, 0x42, 0x9f, 0xd0, 0x02,
-- 0x4b, 0x11, 0x42, 0x9f, 0xd1, 0x04, 0x48, 0x11,
-- 0x60, 0x07, 0x20, 0x00, 0xe7, 0xee, 0xe0, 0x18,
-- 0x2f, 0xff, 0xd1, 0x0b, 0x21, 0x00, 0x43, 0xc9,
-- 0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x1d, 0x48, 0x0c,
-- 0x68, 0x01, 0x48, 0x0c, 0x68, 0x00, 0xf0, 0x00,
-- 0xf8, 0x43, 0xe0, 0x07, 0x1c, 0x21, 0x1c, 0x38,
-- 0xf0, 0x00, 0xf8, 0x3e, 0x48, 0x07, 0x60, 0x07,
-- 0x48, 0x05, 0x60, 0x04, 0x20, 0x00, 0xe7, 0xd5,
-- 0xe7, 0xd4, 0xe7, 0xd3, 0x2e, 0x08, 0x60, 0x7c,
-- 0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00,
-- 0x2e, 0x08, 0x60, 0x78, 0x2e, 0x08, 0x1f, 0x9c,
-- 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x13,
-- 0x68, 0x5b, 0x1c, 0x18, 0x21, 0x00, 0x29, 0x02,
-- 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x4b, 0x06, 0x19,
-- 0x0e, 0x09, 0xe7, 0xf8, 0x23, 0x0d, 0x06, 0x9b,
-- 0x1a, 0xc4, 0x29, 0x00, 0xd1, 0x01, 0x60, 0x27,
-- 0xe0, 0x05, 0x23, 0x01, 0x42, 0xda, 0xd0, 0x01,
-- 0x60, 0x22, 0xe0, 0x00, 0xe0, 0x09, 0x1d, 0x05,
-- 0x23, 0x05, 0x02, 0x1b, 0x42, 0x9d, 0xdb, 0x02,
-- 0x20, 0x01, 0x02, 0x80, 0xe0, 0x00, 0x30, 0x04,
-- 0xe7, 0xe4, 0x4b, 0x02, 0x60, 0x58, 0xbc, 0xb0,
-- 0x47, 0x70, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x00,
-- 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x05, 0x20,
-- 0x0d, 0x00, 0x23, 0xff, 0x33, 0x04, 0x42, 0x98,
-- 0xd0, 0x50, 0xdc, 0x18, 0x28, 0x10, 0xd0, 0x2d,
-- 0xdc, 0x08, 0x28, 0x01, 0xd0, 0x23, 0x28, 0x02,
-- 0xd0, 0x1e, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x08,
-- 0xd0, 0x1d, 0xe0, 0x76, 0x28, 0x12, 0xd0, 0x1d,
-- 0x28, 0x22, 0xd0, 0x3a, 0x23, 0xff, 0x33, 0x02,
-- 0x42, 0x98, 0xd0, 0x24, 0x23, 0xff, 0x33, 0x03,
-- 0x42, 0x98, 0xd0, 0x29, 0xe0, 0x69, 0x38, 0xff,
-- 0x38, 0x05, 0x28, 0x08, 0xd2, 0x65, 0xa3, 0x02,
-- 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x35, 0x3c, 0x41, 0x4f, 0x56, 0x4b, 0x5d, 0x46,
-- 0x20, 0x00, 0x49, 0x32, 0x63, 0x48, 0x48, 0x31,
-- 0x62, 0x04, 0xe0, 0x5c, 0x20, 0x01, 0x49, 0x2f,
-- 0x63, 0x48, 0xe0, 0x58, 0x20, 0x00, 0x49, 0x2e,
-- 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10,
-- 0xf7, 0xff, 0xff, 0x92, 0xe0, 0x4f, 0x20, 0x01,
-- 0x49, 0x29, 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9,
-- 0x20, 0x10, 0xf7, 0xff, 0xff, 0x89, 0xe0, 0x46,
-- 0x20, 0x02, 0x49, 0x25, 0x67, 0x08, 0x21, 0x00,
-- 0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x80,
-- 0xe0, 0x3d, 0x1c, 0x39, 0x20, 0x22, 0xf7, 0xff,
-- 0xff, 0x7b, 0xe0, 0x38, 0x48, 0x1e, 0x65, 0xc7,
-- 0x21, 0x01, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x74,
-- 0xe0, 0x31, 0x48, 0x1b, 0x65, 0xc7, 0x21, 0x02,
-- 0x20, 0x35, 0xf7, 0xff, 0xff, 0x6d, 0xe0, 0x2a,
-- 0x21, 0x00, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x68,
-- 0xe0, 0x25, 0x21, 0x03, 0x20, 0x35, 0xf7, 0xff,
-- 0xff, 0x63, 0xe0, 0x20, 0x21, 0x04, 0x20, 0x35,
-- 0xf7, 0xff, 0xff, 0x5e, 0xe0, 0x1b, 0x20, 0x00,
-- 0x49, 0x0f, 0x65, 0xc8, 0xe0, 0x17, 0x48, 0x0e,
-- 0x66, 0x07, 0x21, 0x01, 0x20, 0x36, 0xf7, 0xff,
-- 0xff, 0x53, 0xe0, 0x10, 0x48, 0x0a, 0x66, 0x07,
-- 0x21, 0x02, 0x20, 0x36, 0xf7, 0xff, 0xff, 0x4c,
-- 0xe0, 0x09, 0x20, 0x00, 0x49, 0x06, 0x66, 0x08,
-- 0xe0, 0x05, 0x1c, 0x20, 0x21, 0x00, 0x43, 0xc9,
-- 0xf7, 0xff, 0xff, 0x42, 0xe7, 0xff, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80,
-- 0xcc, 0x00, 0x05, 0x00, 0xb4, 0xb0, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x38, 0x0e, 0x00,
-- 0x06, 0x19, 0x0e, 0x09, 0x29, 0x01, 0xd0, 0x08,
-- 0x22, 0x00, 0x4d, 0x09, 0x60, 0x2a, 0x22, 0x00,
-- 0x43, 0xd2, 0x4d, 0x08, 0x68, 0x2d, 0x60, 0x2a,
-- 0xe0, 0x08, 0x4a, 0x07, 0x68, 0x12, 0x60, 0x14,
-- 0x4a, 0x04, 0x68, 0x12, 0x60, 0x10, 0x22, 0x01,
-- 0x4d, 0x01, 0x60, 0x2a, 0xbc, 0xb0, 0x47, 0x70,
-- 0xcc, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x60, 0x70,
-- 0x2e, 0x08, 0x60, 0x6c, 0xb5, 0xf3, 0xb0, 0x81,
-- 0x99, 0x02, 0x06, 0x08, 0x16, 0x00, 0x90, 0x00,
-- 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 0x9c, 0x06,
-- 0x1d, 0xe6, 0x36, 0x05, 0xcc, 0x20, 0x07, 0xa8,
-- 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x00,
-- 0x08, 0xad, 0x3d, 0x03, 0xcc, 0x80, 0x08, 0xb8,
-- 0x00, 0x80, 0x19, 0x86, 0xcc, 0x02, 0x91, 0x04,
-- 0x99, 0x04, 0x08, 0x89, 0x91, 0x04, 0x20, 0x03,
-- 0x05, 0x80, 0x21, 0x35, 0x06, 0x49, 0x60, 0x08,
-- 0x48, 0x46, 0x68, 0x01, 0x08, 0x89, 0x00, 0x89,
-- 0x60, 0x01, 0x48, 0x45, 0x90, 0x03, 0x20, 0x00,
-- 0x90, 0x02, 0x98, 0x02, 0x42, 0xa8, 0xd3, 0x04,
-- 0xe0, 0x08, 0x98, 0x02, 0x30, 0x01, 0x90, 0x02,
-- 0xe7, 0xf7, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02,
-- 0x90, 0x03, 0xe7, 0xf6, 0x98, 0x00, 0x28, 0x00,
-- 0xd0, 0x03, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02,
-- 0x90, 0x03, 0x20, 0x00, 0x49, 0x39, 0x65, 0x88,
-- 0x9f, 0x04, 0x2f, 0x00, 0xd8, 0x02, 0xe0, 0x05,
-- 0x3f, 0x01, 0xe7, 0xfa, 0xce, 0x02, 0x48, 0x35,
-- 0x64, 0x81, 0xe7, 0xf9, 0x20, 0x00, 0x49, 0x34,
-- 0x60, 0x48, 0x20, 0x00, 0x21, 0x35, 0x06, 0x49,
-- 0x60, 0x08, 0x20, 0x00, 0x49, 0x2f, 0x66, 0x88,
-- 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 0x61, 0x88,
-- 0x20, 0x01, 0x49, 0x2c, 0x64, 0xc8, 0x48, 0x2c,
-- 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0e, 0x27, 0x00,
-- 0x2f, 0x64, 0xd3, 0x02, 0xe0, 0x02, 0x37, 0x01,
-- 0xe7, 0xfa, 0xe7, 0xfc, 0x98, 0x01, 0x1c, 0x41,
-- 0x91, 0x01, 0x4b, 0x26, 0x42, 0x98, 0xdb, 0x00,
-- 0xe0, 0x00, 0xe7, 0xec, 0x48, 0x24, 0x68, 0x01,
-- 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x48, 0x23,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x21,
-- 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0b, 0x48, 0x20,
-- 0x68, 0x40, 0x4b, 0x19, 0x18, 0xc0, 0x49, 0x1d,
-- 0x60, 0x08, 0x48, 0x1d, 0x68, 0x80, 0x4b, 0x16,
-- 0x18, 0xc0, 0x49, 0x1a, 0x60, 0x48, 0x48, 0x19,
-- 0x68, 0x00, 0x21, 0x33, 0x06, 0x49, 0x65, 0x48,
-- 0x48, 0x16, 0x68, 0x40, 0x21, 0x33, 0x06, 0x49,
-- 0x65, 0x88, 0x48, 0x14, 0x68, 0x40, 0x21, 0x33,
-- 0x06, 0x49, 0x66, 0x88, 0x48, 0x11, 0x68, 0x00,
-- 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x03,
-- 0x21, 0x33, 0x06, 0x49, 0x67, 0x08, 0x20, 0x00,
-- 0x49, 0x0e, 0x68, 0x09, 0x70, 0x08, 0x21, 0x00,
-- 0x20, 0x0d, 0xf7, 0xff, 0xfe, 0x2d, 0xb0, 0x05,
-- 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x70,
-- 0xcc, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x80,
-- 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10,
-- 0x6a, 0x00, 0x00, 0x10, 0x2e, 0x08, 0x7c, 0x1c,
-- 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x94, 0xa4,
-- 0x1c, 0x01, 0xb0, 0x81, 0x48, 0x27, 0x22, 0x00,
-- 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x16, 0xdb, 0x04,
-- 0xe0, 0x09, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00,
-- 0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b,
-- 0x50, 0xca, 0x30, 0x04, 0xe7, 0xf5, 0x48, 0x20,
-- 0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x0b,
-- 0xdb, 0x04, 0xe0, 0x0a, 0x9a, 0x00, 0x32, 0x01,
-- 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00,
-- 0x00, 0x92, 0x18, 0x52, 0x65, 0x93, 0x30, 0x04,
-- 0xe7, 0xf4, 0x48, 0x18, 0x22, 0x00, 0x92, 0x00,
-- 0x9a, 0x00, 0x2a, 0x11, 0xdb, 0x04, 0xe0, 0x0b,
-- 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7,
-- 0x68, 0x03, 0x9a, 0x00, 0x00, 0x92, 0x18, 0x52,
-- 0x32, 0x80, 0x60, 0x53, 0x30, 0x04, 0xe7, 0xf3,
-- 0x48, 0x0f, 0x22, 0x02, 0x92, 0x00, 0x9a, 0x00,
-- 0x2a, 0x05, 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00,
-- 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02,
-- 0x9b, 0x00, 0x00, 0x9b, 0x18, 0x5b, 0x33, 0x80,
-- 0x60, 0x5a, 0x30, 0x04, 0xe7, 0xf3, 0x4a, 0x07,
-- 0x6c, 0x12, 0x1d, 0xcb, 0x33, 0x79, 0x61, 0xda,
-- 0xb0, 0x01, 0x47, 0x70, 0xcc, 0x00, 0x05, 0x20,
-- 0xcc, 0x00, 0x0c, 0x00, 0xcc, 0x00, 0x0c, 0x5c,
-- 0xcc, 0x00, 0x0c, 0xa0, 0xcc, 0x00, 0x0c, 0x80,
-- 0xb4, 0xf0, 0x1c, 0x06, 0x1c, 0x0f, 0x1c, 0x14,
-- 0x1c, 0x1d, 0x06, 0x29, 0x0e, 0x09, 0x2c, 0x1f,
-- 0xdb, 0x02, 0x20, 0xaf, 0xbc, 0xf0, 0x47, 0x70,
-- 0x4b, 0x0b, 0x40, 0x1f, 0x48, 0x0b, 0x68, 0x00,
-- 0x60, 0x06, 0x29, 0x01, 0xd1, 0x07, 0x48, 0x0a,
-- 0x68, 0x02, 0x43, 0x3a, 0x60, 0x02, 0x20, 0x80,
-- 0x6e, 0x00, 0x60, 0x04, 0xe0, 0x05, 0x29, 0x02,
-- 0xd1, 0x03, 0x48, 0x05, 0x68, 0x02, 0x43, 0xba,
-- 0x60, 0x02, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5,
-- 0xff, 0xff, 0xf8, 0xff, 0x2e, 0x08, 0x60, 0x74,
-- 0xcc, 0x00, 0x02, 0x20, 0xb5, 0xf3, 0xb0, 0x81,
-- 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00,
-- 0x99, 0x02, 0x06, 0x0e, 0x0e, 0x36, 0x48, 0x1a,
-- 0x6f, 0x00, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0d,
-- 0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33,
-- 0x06, 0x49, 0x6d, 0x49, 0x1a, 0x41, 0x48, 0x14,
-- 0x6d, 0xc0, 0x4a, 0x13, 0x6d, 0x92, 0x1a, 0x80,
-- 0x18, 0x0d, 0xe0, 0x06, 0x20, 0x33, 0x06, 0x40,
-- 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49,
-- 0x1a, 0x45, 0x98, 0x00, 0x43, 0x68, 0x1c, 0x01,
-- 0x20, 0x64, 0xf0, 0x07, 0xfb, 0x43, 0x1c, 0x04,
-- 0x43, 0x6e, 0x1c, 0x31, 0x20, 0x64, 0xf0, 0x07,
-- 0xfb, 0x3d, 0x1c, 0x07, 0x08, 0xa4, 0x00, 0xa4,
-- 0x08, 0xbf, 0x00, 0xbf, 0x48, 0x05, 0x64, 0x84,
-- 0x48, 0x04, 0x64, 0xc7, 0xb0, 0x01, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0c, 0x80,
-- 0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d,
-- 0xb0, 0x82, 0x27, 0x00, 0x2d, 0x1f, 0xdb, 0x05,
-- 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2f, 0x00, 0xd1, 0x0d,
-- 0x48, 0x19, 0x69, 0x80, 0x28, 0x00, 0xd0, 0x00,
-- 0xe7, 0xfa, 0x20, 0x02, 0x49, 0x16, 0x61, 0x88,
-- 0x48, 0x15, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x00,
-- 0x27, 0xff, 0xe7, 0xef, 0x4c, 0x13, 0x94, 0x00,
-- 0x20, 0x01, 0x02, 0x40, 0x90, 0x01, 0x22, 0x00,
-- 0x99, 0x03, 0xb4, 0x06, 0x06, 0x2b, 0x16, 0x1b,
-- 0x9a, 0x03, 0x99, 0x04, 0x1c, 0x20, 0xf0, 0x01,
-- 0xff, 0x75, 0xb0, 0x02, 0x1c, 0x06, 0x2e, 0xd2,
-- 0xd1, 0x06, 0x20, 0x00, 0x49, 0x08, 0x61, 0x88,
-- 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xd2, 0xe0, 0x08,
-- 0x20, 0x00, 0x99, 0x00, 0x60, 0x08, 0x20, 0x00,
-- 0x49, 0x03, 0x61, 0x88, 0x20, 0x00, 0xb0, 0x02,
-- 0xe7, 0xc8, 0xb0, 0x02, 0xe7, 0xc6, 0x00, 0x00,
-- 0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x06, 0x00,
-- 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x9b, 0x01,
-- 0x06, 0x18, 0x0e, 0x00, 0x9b, 0x02, 0x06, 0x19,
-- 0x0e, 0x09, 0x9b, 0x03, 0x06, 0x1b, 0x0e, 0x1b,
-- 0x93, 0x00, 0x9b, 0x04, 0x06, 0x1a, 0x0e, 0x12,
-- 0x06, 0x3d, 0x0e, 0x2d, 0x2d, 0x01, 0xd1, 0x07,
-- 0x4c, 0x1c, 0x68, 0x26, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0xe0, 0x07,
-- 0x2d, 0x02, 0xd1, 0x05, 0x4c, 0x17, 0x68, 0x26,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x33, 0x60, 0x23,
-- 0x28, 0x00, 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x14,
-- 0x61, 0xe3, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02,
-- 0x23, 0x01, 0x4c, 0x11, 0x61, 0xe3, 0x29, 0x00,
-- 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x0e, 0x65, 0xa3,
-- 0xe0, 0x04, 0x29, 0x01, 0xd1, 0x02, 0x23, 0x01,
-- 0x4c, 0x0b, 0x65, 0xa3, 0x2a, 0x00, 0xd1, 0x03,
-- 0x23, 0x02, 0x4c, 0x09, 0x66, 0xe3, 0xe0, 0x04,
-- 0x2a, 0x01, 0xd1, 0x02, 0x23, 0x03, 0x4c, 0x06,
-- 0x66, 0xe3, 0x9b, 0x00, 0x4c, 0x04, 0x67, 0x23,
-- 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x20,
-- 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0xf0, 0x1c, 0x05,
-- 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36,
-- 0xb0, 0x84, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x04, 0x20, 0x39, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x01, 0xd1, 0x0a,
-- 0x94, 0x00, 0x97, 0x01, 0x48, 0x0f, 0x90, 0x02,
-- 0x48, 0x0f, 0x90, 0x03, 0x46, 0x68, 0x21, 0x01,
-- 0xf0, 0x00, 0xfd, 0x1a, 0xe0, 0x0f, 0x20, 0x00,
-- 0x90, 0x00, 0x20, 0x00, 0x90, 0x01, 0x48, 0x09,
-- 0x90, 0x02, 0x48, 0x09, 0x90, 0x03, 0x46, 0x68,
-- 0x21, 0x01, 0xf0, 0x00, 0xfd, 0x0d, 0x21, 0x00,
-- 0x20, 0x02, 0xf7, 0xff, 0xfc, 0x85, 0x20, 0x00,
-- 0xb0, 0x04, 0xe7, 0xdc, 0xb0, 0x04, 0xe7, 0xda,
-- 0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0xcf,
-- 0x00, 0x00, 0x02, 0x3f, 0xb4, 0xb0, 0x1c, 0x05,
-- 0x1c, 0x0c, 0x1c, 0x17, 0x48, 0x14, 0x6c, 0x00,
-- 0x1c, 0x01, 0x48, 0x13, 0x6f, 0x80, 0x23, 0x09,
-- 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x12, 0x20, 0x02,
-- 0x40, 0x20, 0xd0, 0x0c, 0x2d, 0x02, 0xd1, 0x0a,
-- 0x2f, 0x03, 0xd1, 0x00, 0x31, 0x04, 0x2f, 0x03,
-- 0xd2, 0x05, 0x07, 0xe0, 0x0f, 0xc0, 0xd0, 0x01,
-- 0x31, 0x05, 0xe0, 0x00, 0x31, 0x08, 0x2d, 0x02,
-- 0xd9, 0x00, 0x21, 0x12, 0x00, 0x48, 0x18, 0x40,
-- 0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09,
-- 0x43, 0x41, 0x48, 0x03, 0x69, 0x40, 0x18, 0x09,
-- 0x1c, 0x08, 0xbc, 0xb0, 0x47, 0x70, 0xe7, 0xfc,
-- 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x6a, 0xc0,
-- 0x1c, 0x01, 0x00, 0x48, 0x18, 0x40, 0x30, 0x01,
-- 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 0x43, 0x41,
-- 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 0x1c, 0x08,
-- 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00,
-- 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x68, 0x80,
-- 0x28, 0x00, 0xd1, 0x03, 0x48, 0x06, 0x69, 0x00,
-- 0x1c, 0x01, 0xe0, 0x02, 0x48, 0x04, 0x68, 0xc0,
-- 0x1c, 0x01, 0x4b, 0x02, 0x18, 0xc9, 0x1c, 0x08,
-- 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00,
-- 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0x90, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x48, 0x06, 0x6c, 0x40, 0x60, 0x20,
-- 0x48, 0x04, 0x6c, 0x80, 0x60, 0x38, 0xf7, 0xff,
-- 0xff, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xe7, 0xfb, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x00,
-- 0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17,
-- 0xf7, 0xff, 0xff, 0xd4, 0x1c, 0x06, 0x2d, 0x00,
-- 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x3a,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x08, 0x78,
-- 0x00, 0x40, 0xd0, 0x01, 0x20, 0x3a, 0xe7, 0xf7,
-- 0x20, 0x00, 0x49, 0x0d, 0x66, 0x88, 0x48, 0x0d,
-- 0x68, 0x01, 0x23, 0x12, 0x43, 0x19, 0x60, 0x01,
-- 0x48, 0x0b, 0x63, 0x45, 0x48, 0x0a, 0x63, 0x84,
-- 0x20, 0x01, 0x49, 0x09, 0x62, 0x48, 0x48, 0x09,
-- 0x68, 0x01, 0x23, 0x01, 0x40, 0x59, 0x60, 0x01,
-- 0x48, 0x05, 0x63, 0xc7, 0x48, 0x02, 0x60, 0x46,
-- 0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, 0x00, 0x00,
-- 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x48,
-- 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x00, 0x08,
-- 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x16,
-- 0x1c, 0x1d, 0x48, 0x10, 0x6a, 0x00, 0x28, 0x10,
-- 0xd0, 0x02, 0x20, 0x3b, 0xbc, 0xf0, 0x47, 0x70,
-- 0x48, 0x0d, 0x68, 0x00, 0x60, 0x38, 0x68, 0x38,
-- 0x4b, 0x0b, 0x18, 0xc0, 0x60, 0x38, 0x48, 0x0b,
-- 0x6b, 0x40, 0x60, 0x30, 0x48, 0x09, 0x6b, 0x80,
-- 0x60, 0x28, 0x48, 0x09, 0x6c, 0x80, 0x23, 0x10,
-- 0x40, 0x18, 0xd0, 0x02, 0x20, 0x02, 0x60, 0x20,
-- 0xe0, 0x01, 0x20, 0x01, 0x60, 0x20, 0x20, 0x00,
-- 0xe7, 0xe4, 0xe7, 0xe3, 0xcc, 0x00, 0x05, 0x00,
-- 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x80,
-- 0xcc, 0x00, 0x0f, 0x00, 0xb4, 0xf0, 0x1c, 0x05,
-- 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2a, 0x0e, 0x12,
-- 0x06, 0x21, 0x0e, 0x09, 0x2f, 0x00, 0xd1, 0x30,
-- 0xb0, 0x81, 0x46, 0x6f, 0x2a, 0x00, 0xd0, 0x06,
-- 0x2a, 0x08, 0xd0, 0x0d, 0x2a, 0x10, 0xd0, 0x14,
-- 0x2a, 0x18, 0xd0, 0x1b, 0xe0, 0x23, 0x20, 0x00,
-- 0x70, 0x38, 0x20, 0x00, 0x70, 0x78, 0x20, 0x0c,
-- 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x1b,
-- 0x20, 0x00, 0x70, 0x38, 0x20, 0x08, 0x70, 0x78,
-- 0x20, 0x1c, 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8,
-- 0xe0, 0x12, 0x20, 0x00, 0x70, 0x38, 0x20, 0x10,
-- 0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00,
-- 0x70, 0xf8, 0xe0, 0x09, 0x20, 0x00, 0x70, 0x38,
-- 0x20, 0x18, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8,
-- 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x00, 0xe7, 0xff,
-- 0xb0, 0x01, 0x23, 0x00, 0x56, 0xf8, 0x23, 0x39,
-- 0x06, 0x5b, 0x60, 0x18, 0x23, 0x01, 0x56, 0xf8,
-- 0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, 0x29, 0x00,
-- 0xd1, 0x06, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x20,
-- 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 0xe0, 0x06,
-- 0x29, 0x20, 0xd1, 0x04, 0x48, 0x09, 0x68, 0x06,
-- 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 0x23, 0x02,
-- 0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58,
-- 0x23, 0x03, 0x56, 0xf8, 0x4b, 0x04, 0x63, 0x18,
-- 0x20, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x64, 0x98,
-- 0xbc, 0xf0, 0x47, 0x70, 0x72, 0x00, 0x00, 0x1c,
-- 0x72, 0x00, 0x01, 0x00, 0xb4, 0xb0, 0x1c, 0x07,
-- 0x1c, 0x0d, 0x1c, 0x14, 0x06, 0x29, 0x0e, 0x09,
-- 0x06, 0x22, 0x0e, 0x12, 0xb0, 0x84, 0x29, 0x33,
-- 0xdc, 0x01, 0x2a, 0x0f, 0xdd, 0x03, 0x20, 0xff,
-- 0xb0, 0x04, 0xbc, 0xb0, 0x47, 0x70, 0x20, 0x39,
-- 0x06, 0x40, 0x63, 0x41, 0x20, 0x10, 0x43, 0x10,
-- 0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, 0x20, 0x39,
-- 0x06, 0x40, 0x68, 0x00, 0x90, 0x03, 0x98, 0x03,
-- 0x23, 0x9c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03,
-- 0x20, 0x39, 0x06, 0x40, 0x68, 0x40, 0x90, 0x01,
-- 0x98, 0x01, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18,
-- 0x90, 0x01, 0x06, 0x38, 0x0e, 0x00, 0xd0, 0x29,
-- 0x20, 0x10, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03,
-- 0x23, 0x80, 0x43, 0x18, 0x90, 0x03, 0x20, 0x08,
-- 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10,
-- 0x43, 0x18, 0x90, 0x03, 0x20, 0x04, 0x40, 0x38,
-- 0xd0, 0x04, 0x98, 0x03, 0x23, 0x08, 0x43, 0x18,
-- 0x90, 0x03, 0xe0, 0x0c, 0x20, 0x02, 0x40, 0x38,
-- 0xd0, 0x04, 0x98, 0x03, 0x23, 0x0c, 0x43, 0x18,
-- 0x90, 0x03, 0xe0, 0x04, 0x98, 0x03, 0x23, 0x0c,
-- 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x20,
-- 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x20,
-- 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39,
-- 0x06, 0x5b, 0x60, 0x18, 0x98, 0x01, 0x23, 0x39,
-- 0x06, 0x5b, 0x60, 0x58, 0x20, 0x39, 0x06, 0x40,
-- 0x6a, 0x00, 0x90, 0x00, 0x98, 0x00, 0x23, 0xf0,
-- 0x43, 0xdb, 0x43, 0x18, 0x90, 0x00, 0x20, 0xff,
-- 0x02, 0x00, 0x40, 0x38, 0xd0, 0x27, 0x20, 0xff,
-- 0x30, 0x01, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00,
-- 0x23, 0xfe, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01,
-- 0x02, 0x40, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00,
-- 0x23, 0xfd, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01,
-- 0x02, 0x80, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00,
-- 0x23, 0xfb, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01,
-- 0x02, 0xc0, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00,
-- 0x23, 0xf7, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01,
-- 0x03, 0x00, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00,
-- 0x23, 0xf0, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00,
-- 0x23, 0x39, 0x06, 0x5b, 0x62, 0x18, 0x20, 0x39,
-- 0x06, 0x40, 0x69, 0xc0, 0x90, 0x02, 0x98, 0x02,
-- 0x08, 0x40, 0x00, 0x40, 0x90, 0x02, 0x20, 0x39,
-- 0x06, 0x40, 0x6a, 0xc0, 0x90, 0x00, 0x98, 0x00,
-- 0x23, 0x1c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x00,
-- 0x20, 0x39, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03,
-- 0x98, 0x03, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18,
-- 0x90, 0x03, 0x20, 0x39, 0x06, 0x40, 0x6b, 0xc0,
-- 0x90, 0x01, 0x98, 0x01, 0x09, 0x00, 0x01, 0x00,
-- 0x90, 0x01, 0x48, 0x4a, 0x40, 0x38, 0xd0, 0x45,
-- 0x20, 0x01, 0x04, 0x00, 0x40, 0x38, 0xd0, 0x03,
-- 0x98, 0x02, 0x23, 0x01, 0x43, 0x18, 0x90, 0x02,
-- 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 0xd0, 0x03,
-- 0x98, 0x00, 0x23, 0x10, 0x43, 0x18, 0x90, 0x00,
-- 0x20, 0x07, 0x04, 0x40, 0x40, 0x38, 0x23, 0x01,
-- 0x04, 0x5b, 0x42, 0x98, 0xd0, 0x08, 0x23, 0x01,
-- 0x04, 0x9b, 0x42, 0x98, 0xd0, 0x07, 0x23, 0x01,
-- 0x04, 0xdb, 0x42, 0x98, 0xd0, 0x08, 0xe0, 0x0c,
-- 0x98, 0x00, 0x90, 0x00, 0xe0, 0x0a, 0x98, 0x00,
-- 0x23, 0x04, 0x43, 0x18, 0x90, 0x00, 0xe0, 0x05,
-- 0x98, 0x00, 0x23, 0x0c, 0x43, 0x18, 0x90, 0x00,
-- 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x01, 0x05, 0x80,
-- 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10,
-- 0x43, 0x18, 0x90, 0x03, 0x20, 0x01, 0x05, 0x00,
-- 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x08,
-- 0x43, 0x18, 0x90, 0x01, 0x20, 0x01, 0x05, 0x40,
-- 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x07,
-- 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39,
-- 0x06, 0x5b, 0x63, 0x98, 0x98, 0x02, 0x23, 0x39,
-- 0x06, 0x5b, 0x61, 0xd8, 0x98, 0x01, 0x23, 0x39,
-- 0x06, 0x5b, 0x63, 0xd8, 0x98, 0x00, 0x23, 0x39,
-- 0x06, 0x5b, 0x62, 0xd8, 0x20, 0x39, 0x06, 0x40,
-- 0x68, 0x80, 0x90, 0x03, 0x98, 0x03, 0x08, 0x80,
-- 0x00, 0x80, 0x90, 0x03, 0x0f, 0x38, 0x07, 0x00,
-- 0xd0, 0x26, 0x20, 0x01, 0x07, 0x00, 0x40, 0x38,
-- 0x23, 0x01, 0x07, 0x1b, 0x42, 0x98, 0xd1, 0x04,
-- 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 0x90, 0x03,
-- 0xe0, 0x07, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x04,
-- 0x98, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18,
-- 0x90, 0x03, 0x20, 0x01, 0x07, 0x40, 0x40, 0x38,
-- 0x23, 0x01, 0x07, 0x5b, 0x42, 0x98, 0xd1, 0x04,
-- 0x98, 0x03, 0x23, 0x01, 0x43, 0x18, 0x90, 0x03,
-- 0xe0, 0x06, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x03,
-- 0x98, 0x03, 0x08, 0x40, 0x00, 0x40, 0x90, 0x03,
-- 0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x98,
-- 0x20, 0x00, 0xb0, 0x04, 0xe6, 0xc1, 0xb0, 0x04,
-- 0xe6, 0xbf, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00,
-- 0x48, 0x02, 0x69, 0xc0, 0x06, 0x00, 0x16, 0x00,
-- 0x47, 0x70, 0xe7, 0xfd, 0x72, 0x00, 0x01, 0x00,
-- 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x23,
-- 0x16, 0x18, 0x06, 0x3b, 0x16, 0x19, 0x9b, 0x02,
-- 0x06, 0x1a, 0x0e, 0x12, 0x2a, 0x00, 0xd1, 0x0b,
-- 0x23, 0x39, 0x06, 0x5b, 0x60, 0xd8, 0x23, 0x39,
-- 0x06, 0x5b, 0x61, 0x19, 0x4d, 0x0b, 0x68, 0x2e,
-- 0x23, 0x01, 0x43, 0x33, 0x60, 0x2b, 0xe0, 0x0c,
-- 0x2a, 0x01, 0xd1, 0x0a, 0x23, 0x39, 0x06, 0x5b,
-- 0x61, 0x58, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x99,
-- 0x4d, 0x04, 0x68, 0x2e, 0x23, 0x02, 0x43, 0x33,
-- 0x60, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x72, 0x00, 0x00, 0x08,
-- 0xb4, 0x90, 0x1c, 0x01, 0x20, 0x92, 0x4b, 0x4b,
-- 0x60, 0x18, 0x20, 0x92, 0x4b, 0x4a, 0x60, 0x18,
-- 0x20, 0x10, 0x4b, 0x4a, 0x60, 0x18, 0x20, 0x00,
-- 0x4b, 0x48, 0x60, 0x58, 0x48, 0x48, 0x4b, 0x47,
-- 0x60, 0x98, 0x22, 0x00, 0x2a, 0x10, 0xdb, 0x02,
-- 0xe0, 0x07, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00,
-- 0x43, 0xc0, 0x00, 0x93, 0x4c, 0x42, 0x50, 0xe0,
-- 0xe7, 0xf7, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93,
-- 0x4c, 0x3f, 0x50, 0xe0, 0x22, 0x00, 0x2a, 0x08,
-- 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa,
-- 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 0x4b, 0x3b,
-- 0x18, 0xe3, 0x64, 0x18, 0xe7, 0xf6, 0x22, 0x00,
-- 0x2a, 0x20, 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01,
-- 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94,
-- 0x4b, 0x35, 0x18, 0xe3, 0x60, 0x18, 0xe7, 0xf6,
-- 0x22, 0x00, 0x2a, 0x19, 0xdb, 0x02, 0xe0, 0x06,
-- 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x00, 0x93,
-- 0x4c, 0x30, 0x50, 0xe0, 0xe7, 0xf8, 0x20, 0x00,
-- 0x4b, 0x2f, 0x60, 0x18, 0x20, 0x39, 0x06, 0x40,
-- 0x69, 0xc0, 0x27, 0x18, 0x40, 0x07, 0x2f, 0x00,
-- 0xd0, 0x03, 0x48, 0x2c, 0x4b, 0x2c, 0x60, 0x18,
-- 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x2a,
-- 0x60, 0x18, 0x20, 0x00, 0x4b, 0x29, 0x60, 0x18,
-- 0x20, 0x00, 0x4b, 0x28, 0x60, 0x58, 0x48, 0x28,
-- 0x4b, 0x26, 0x60, 0x98, 0x48, 0x24, 0x68, 0x00,
-- 0x4b, 0x24, 0x60, 0xd8, 0x48, 0x25, 0x60, 0x01,
-- 0x20, 0x0d, 0x06, 0xc0, 0x61, 0xc1, 0x20, 0x05,
-- 0x02, 0x00, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x18,
-- 0x48, 0x21, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x58,
-- 0x48, 0x1f, 0x4b, 0x16, 0x63, 0x98, 0x20, 0x00,
-- 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x98, 0x20, 0x00,
-- 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x18, 0x48, 0x1b,
-- 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x98, 0x20, 0x01,
-- 0x23, 0x0d, 0x06, 0xdb, 0x60, 0xd8, 0x48, 0x18,
-- 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x18, 0x48, 0x17,
-- 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x58, 0x20, 0x00,
-- 0x4b, 0x15, 0x60, 0x18, 0x48, 0x11, 0x4b, 0x15,
-- 0x60, 0x18, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70,
-- 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7d, 0x94,
-- 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x00,
-- 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x7c, 0x58,
-- 0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0x3f,
-- 0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0,
-- 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x60, 0x84,
-- 0x00, 0xf0, 0x29, 0x6d, 0x3f, 0xff, 0xff, 0xff,
-- 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xeb, 0x80,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x5e, 0x4c,
-- 0xb5, 0xff, 0xb0, 0x85, 0x20, 0x39, 0x06, 0x40,
-- 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 0x90, 0x00,
-- 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x5a,
-- 0x4b, 0x5a, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff,
-- 0x30, 0xe0, 0x4b, 0x58, 0x60, 0x18, 0x9c, 0x06,
-- 0x9f, 0x07, 0x22, 0x00, 0x21, 0x00, 0x98, 0x05,
-- 0x38, 0x0c, 0x28, 0x06, 0xd2, 0x0c, 0xa3, 0x02,
-- 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x04, 0x03, 0x06, 0x04, 0x03, 0x06, 0x32, 0x01,
-- 0x32, 0x01, 0xe0, 0x02, 0x3a, 0x01, 0xe0, 0x00,
-- 0xe7, 0xff, 0x98, 0x05, 0x38, 0x0b, 0x28, 0x08,
-- 0xd2, 0x15, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b,
-- 0x44, 0x9f, 0x1c, 0x00, 0x0a, 0x04, 0x04, 0x04,
-- 0x0a, 0x0a, 0x0a, 0x04, 0x25, 0x2d, 0x01, 0x2d,
-- 0x48, 0x44, 0x68, 0x00, 0x1c, 0x46, 0xe0, 0x0e,
-- 0x48, 0x43, 0x6c, 0x40, 0x1c, 0x05, 0x48, 0x43,
-- 0x68, 0x40, 0x1c, 0x06, 0xe0, 0x07, 0x21, 0xff,
-- 0x1c, 0x08, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0x2d, 0x00,
-- 0xd0, 0x01, 0x2e, 0x00, 0xd1, 0x04, 0x25, 0x2d,
-- 0x01, 0x2d, 0x48, 0x38, 0x68, 0x00, 0x1c, 0x46,
-- 0x29, 0xff, 0xd1, 0x02, 0x1c, 0x08, 0xb0, 0x05,
-- 0xe7, 0xec, 0x1e, 0x68, 0x90, 0x02, 0x1e, 0x70,
-- 0x90, 0x01, 0x23, 0x01, 0x42, 0xda, 0xd1, 0x08,
-- 0x42, 0x50, 0x40, 0x85, 0x1c, 0x2b, 0x1e, 0x5d,
-- 0x42, 0x50, 0x40, 0x86, 0x1c, 0x33, 0x1e, 0x5e,
-- 0xe0, 0x05, 0x41, 0x15, 0x1c, 0x28, 0x1e, 0x45,
-- 0x41, 0x16, 0x1c, 0x30, 0x1e, 0x46, 0x07, 0xe0,
-- 0x0f, 0xc0, 0xd0, 0x02, 0x21, 0x80, 0x08, 0x64,
-- 0x00, 0x64, 0x07, 0xf8, 0x0f, 0xc0, 0xd0, 0x02,
-- 0x21, 0x80, 0x08, 0x7f, 0x00, 0x7f, 0x19, 0x60,
-- 0x90, 0x04, 0x19, 0xb8, 0x90, 0x03, 0x2c, 0x00,
-- 0xda, 0x01, 0x21, 0x80, 0x24, 0x00, 0x98, 0x04,
-- 0x28, 0x01, 0xda, 0x02, 0x21, 0x80, 0x20, 0x01,
-- 0x90, 0x04, 0x4b, 0x1f, 0x42, 0x9c, 0xdb, 0x01,
-- 0x21, 0x80, 0x4c, 0x1e, 0x98, 0x04, 0x4b, 0x1c,
-- 0x42, 0x98, 0xdd, 0x02, 0x21, 0x80, 0x48, 0x1a,
-- 0x90, 0x04, 0x2f, 0x00, 0xda, 0x01, 0x21, 0x80,
-- 0x27, 0x00, 0x98, 0x03, 0x28, 0x01, 0xda, 0x02,
-- 0x21, 0x80, 0x20, 0x01, 0x90, 0x03, 0x48, 0x11,
-- 0x68, 0x00, 0x42, 0x87, 0xd3, 0x03, 0x21, 0x80,
-- 0x48, 0x0e, 0x68, 0x00, 0x1e, 0x47, 0x98, 0x03,
-- 0x4b, 0x0c, 0x68, 0x1b, 0x42, 0x98, 0xd9, 0x03,
-- 0x21, 0x80, 0x48, 0x0a, 0x68, 0x00, 0x90, 0x03,
-- 0x9b, 0x08, 0x60, 0x1c, 0x9b, 0x08, 0x60, 0x5f,
-- 0x98, 0x04, 0x9b, 0x08, 0x60, 0x98, 0x98, 0x03,
-- 0x9b, 0x08, 0x60, 0xd8, 0x1c, 0x08, 0xb0, 0x05,
-- 0xe7, 0x88, 0xb0, 0x05, 0xe7, 0x86, 0x00, 0x00,
-- 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80,
-- 0xcc, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x0c, 0x00,
-- 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce,
-- 0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0xb0, 0x81,
-- 0x2c, 0x0b, 0xdb, 0x19, 0x2c, 0x12, 0xdc, 0x17,
-- 0x68, 0xbe, 0x68, 0xf9, 0x91, 0x00, 0x68, 0x7a,
-- 0x1c, 0x3b, 0x68, 0x39, 0x1c, 0x20, 0xf7, 0xff,
-- 0xff, 0x23, 0x1c, 0x05, 0x68, 0xb8, 0x42, 0xb0,
-- 0xd0, 0x00, 0x25, 0x80, 0x68, 0xf8, 0x99, 0x00,
-- 0x42, 0x88, 0xd0, 0x00, 0x25, 0x80, 0x1c, 0x28,
-- 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x25, 0x00, 0x68, 0x38, 0x28, 0x00, 0xda, 0x02,
-- 0x25, 0x80, 0x20, 0x00, 0x60, 0x38, 0x68, 0x78,
-- 0x28, 0x00, 0xda, 0x02, 0x25, 0x80, 0x20, 0x00,
-- 0x60, 0x78, 0x68, 0x38, 0x07, 0xc0, 0x0f, 0xc0,
-- 0xd0, 0x04, 0x25, 0x80, 0x68, 0x38, 0x08, 0x40,
-- 0x00, 0x40, 0x60, 0x38, 0x68, 0xb8, 0x07, 0xc0,
-- 0x0f, 0xc0, 0xd1, 0x09, 0x25, 0x80, 0x68, 0xb8,
-- 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x68, 0xb8,
-- 0xe0, 0x01, 0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8,
-- 0x68, 0xb8, 0x68, 0x39, 0x42, 0x88, 0xdc, 0x03,
-- 0x25, 0x80, 0x68, 0x38, 0x30, 0x01, 0x60, 0xb8,
-- 0x68, 0x78, 0x68, 0xf9, 0x42, 0x88, 0xdb, 0x03,
-- 0x25, 0x80, 0x68, 0x78, 0x30, 0x01, 0x60, 0xf8,
-- 0x1c, 0x28, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01,
-- 0xe7, 0xc3, 0x1c, 0x02, 0x21, 0x18, 0xe0, 0x00,
-- 0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd,
-- 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x81,
-- 0x68, 0xb8, 0x68, 0x3b, 0x1a, 0xc0, 0x1c, 0x46,
-- 0x68, 0xf8, 0x68, 0x7b, 0x1a, 0xc0, 0x30, 0x01,
-- 0x90, 0x00, 0x00, 0x90, 0x4b, 0x15, 0x58, 0x1c,
-- 0x98, 0x00, 0x43, 0x46, 0x1c, 0x35, 0x07, 0xa0,
-- 0x0f, 0x80, 0x1c, 0x29, 0x40, 0x81, 0x2a, 0x0b,
-- 0xdb, 0x01, 0x2a, 0x12, 0xdd, 0x01, 0x2a, 0x13,
-- 0xd1, 0x01, 0x21, 0x00, 0xe0, 0x0a, 0x2a, 0x09,
-- 0xd0, 0x01, 0x2a, 0x0a, 0xd1, 0x03, 0x00, 0x69,
-- 0x19, 0x49, 0x00, 0xc9, 0xe0, 0x02, 0x2a, 0x08,
-- 0xd1, 0x00, 0x01, 0x29, 0x20, 0x04, 0x40, 0x20,
-- 0xd0, 0x00, 0x08, 0x49, 0x09, 0x4c, 0x06, 0xc8,
-- 0x0e, 0xc0, 0xd0, 0x00, 0x34, 0x01, 0x1c, 0x20,
-- 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0xb0, 0x01,
-- 0xe7, 0xfb, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04,
-- 0xb4, 0x80, 0x23, 0x00, 0x22, 0x01, 0x21, 0x00,
-- 0x29, 0x08, 0xdb, 0x02, 0xe0, 0x09, 0x31, 0x01,
-- 0xe7, 0xfa, 0x00, 0x88, 0x4f, 0x05, 0x58, 0x38,
-- 0x28, 0x00, 0xd0, 0x00, 0x43, 0x13, 0x00, 0x52,
-- 0xe7, 0xf5, 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70,
-- 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58,
-- 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x20, 0x39,
-- 0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18,
-- 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03,
-- 0x48, 0x32, 0x49, 0x33, 0x60, 0x08, 0xe0, 0x03,
-- 0x20, 0xff, 0x30, 0xe0, 0x49, 0x30, 0x60, 0x08,
-- 0x24, 0x00, 0x99, 0x01, 0x48, 0x2f, 0xf7, 0xfc,
-- 0xfa, 0x1f, 0x48, 0x2e, 0x68, 0x00, 0x28, 0x00,
-- 0xda, 0x03, 0x20, 0x00, 0x49, 0x2b, 0x60, 0x08,
-- 0x24, 0x80, 0x48, 0x2a, 0x68, 0x40, 0x28, 0x00,
-- 0xda, 0x03, 0x20, 0x00, 0x49, 0x27, 0x60, 0x48,
-- 0x24, 0x80, 0x48, 0x26, 0x68, 0x80, 0x4b, 0x26,
-- 0x42, 0x98, 0xdd, 0x03, 0x48, 0x24, 0x49, 0x23,
-- 0x60, 0x88, 0x24, 0x80, 0x48, 0x21, 0x68, 0xc0,
-- 0x49, 0x1f, 0x68, 0x09, 0x42, 0x88, 0xd9, 0x04,
-- 0x48, 0x1d, 0x68, 0x00, 0x49, 0x1d, 0x60, 0xc8,
-- 0x24, 0x80, 0x48, 0x1e, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x27, 0x2f, 0x01, 0xd1, 0x25, 0x48, 0x19,
-- 0x68, 0x06, 0x48, 0x18, 0x68, 0x45, 0x23, 0xff,
-- 0x33, 0x68, 0x42, 0x9e, 0xdd, 0x01, 0x26, 0xff,
-- 0x36, 0x68, 0x48, 0x13, 0x68, 0x00, 0x08, 0x40,
-- 0x42, 0xa8, 0xd2, 0x02, 0x48, 0x10, 0x68, 0x00,
-- 0x08, 0x45, 0x48, 0x13, 0x49, 0x13, 0x65, 0x48,
-- 0x48, 0x13, 0x43, 0x70, 0x23, 0x01, 0x04, 0x1b,
-- 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x88,
-- 0x20, 0x00, 0x49, 0x0e, 0x65, 0xc8, 0x48, 0x0d,
-- 0x66, 0x05, 0x1c, 0x38, 0x21, 0x00, 0xf7, 0xfe,
-- 0xff, 0x13, 0x1c, 0x20, 0xb0, 0x01, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01,
-- 0xe7, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3f,
-- 0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0,
-- 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x7c, 0xbc,
-- 0x00, 0x00, 0x07, 0xfa, 0xcc, 0x00, 0x00, 0x00,
-- 0x00, 0x0b, 0x60, 0xb6, 0xb5, 0xf0, 0x1c, 0x04,
-- 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x26, 0x69, 0x30,
-- 0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x04,
-- 0x20, 0x75, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x68, 0xf5, 0x68, 0x38, 0x08, 0x40,
-- 0x00, 0x40, 0x60, 0x38, 0x68, 0x78, 0x08, 0x40,
-- 0x00, 0x40, 0x60, 0x78, 0x68, 0xb8, 0x07, 0xc0,
-- 0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xb8, 0x38, 0x01,
-- 0x60, 0xb8, 0x68, 0xf8, 0x07, 0xc0, 0x0f, 0xc0,
-- 0xd1, 0x02, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8,
-- 0x1d, 0xf0, 0x30, 0x49, 0x1c, 0x39, 0xf7, 0xfc,
-- 0xf9, 0x8b, 0x48, 0x1c, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01,
-- 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01,
-- 0xe7, 0xcc, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x13,
-- 0xfb, 0x0d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01,
-- 0xf0, 0x05, 0xfa, 0xf4, 0xe7, 0xf5, 0x00, 0xa8,
-- 0x49, 0x0e, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05,
-- 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0xff,
-- 0xb0, 0x01, 0xe7, 0xb7, 0x48, 0x0a, 0x68, 0x00,
-- 0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x39, 0x1c, 0x20,
-- 0xf0, 0x00, 0xf8, 0x10, 0x20, 0x92, 0x49, 0x04,
-- 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xa9,
-- 0xb0, 0x01, 0xe7, 0xa7, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58,
-- 0x2e, 0x08, 0x7c, 0xbc, 0xb5, 0xf3, 0x1c, 0x0f,
-- 0xb0, 0x9b, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0,
-- 0x23, 0x18, 0x40, 0x18, 0x90, 0x01, 0x98, 0x01,
-- 0x28, 0x00, 0xd0, 0x03, 0x48, 0xf8, 0x49, 0xf9,
-- 0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0,
-- 0x49, 0xf6, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01,
-- 0x90, 0x06, 0x98, 0x1b, 0x90, 0x1a, 0x98, 0x1a,
-- 0x69, 0x05, 0x98, 0x1a, 0x68, 0xc0, 0x90, 0x19,
-- 0x48, 0xf1, 0x68, 0x00, 0x99, 0x1b, 0x42, 0x88,
-- 0xd1, 0x73, 0x20, 0x02, 0x90, 0x08, 0x2d, 0x0c,
-- 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x02, 0x20, 0x04,
-- 0x90, 0x08, 0xe0, 0x0c, 0x2d, 0x0d, 0xd0, 0x01,
-- 0x2d, 0x10, 0xd1, 0x02, 0x20, 0x08, 0x90, 0x08,
-- 0xe0, 0x05, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11,
-- 0xd1, 0x01, 0x20, 0x01, 0x90, 0x08, 0x68, 0xf8,
-- 0x68, 0x79, 0x1a, 0x40, 0x1c, 0x44, 0x2d, 0x0b,
-- 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10,
-- 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x11, 0x48, 0xdf,
-- 0x6c, 0x40, 0x1c, 0x06, 0x48, 0xdd, 0x6c, 0x81,
-- 0x91, 0x07, 0x2e, 0x00, 0xd0, 0x02, 0x99, 0x07,
-- 0x29, 0x00, 0xd1, 0x05, 0x26, 0x2d, 0x01, 0x36,
-- 0x48, 0xd6, 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07,
-- 0xe0, 0x05, 0x26, 0x2d, 0x01, 0x36, 0x48, 0xd3,
-- 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 0x49, 0xd4,
-- 0xa8, 0x15, 0xf7, 0xfc, 0xf8, 0xe9, 0x98, 0x17,
-- 0x1e, 0x71, 0x42, 0x88, 0xdd, 0x01, 0x1e, 0x70,
-- 0x90, 0x17, 0x98, 0x18, 0x99, 0x07, 0x39, 0x01,
-- 0x42, 0x88, 0xdd, 0x02, 0x99, 0x07, 0x1e, 0x48,
-- 0x90, 0x18, 0x98, 0x18, 0x99, 0x16, 0x1a, 0x40,
-- 0x00, 0x40, 0x1c, 0x81, 0x98, 0x08, 0xf0, 0x06,
-- 0xfb, 0xd3, 0x90, 0x0a, 0x98, 0x0a, 0x42, 0x84,
-- 0xdd, 0x00, 0x9c, 0x0a, 0x48, 0xc5, 0x6f, 0x00,
-- 0x90, 0x02, 0x20, 0x00, 0x90, 0x05, 0x98, 0x02,
-- 0x28, 0x02, 0xd0, 0x02, 0x98, 0x02, 0x28, 0x03,
-- 0xd1, 0x3a, 0x48, 0xc1, 0x6b, 0x00, 0x90, 0x04,
-- 0x48, 0xbe, 0x6e, 0xc1, 0x91, 0x03, 0x98, 0x04,
-- 0x99, 0x03, 0x42, 0x88, 0xdd, 0x21, 0x20, 0xc0,
-- 0x90, 0x06, 0x1d, 0x20, 0x28, 0x00, 0xda, 0x02,
-- 0xe0, 0x00, 0xe1, 0x8e, 0x30, 0x07, 0x10, 0xc0,
-- 0x90, 0x05, 0x98, 0x04, 0x28, 0x03, 0xd0, 0x14,
-- 0x99, 0x03, 0x29, 0x03, 0xd1, 0x07, 0x20, 0xcd,
-- 0x90, 0x06, 0x1d, 0x61, 0x20, 0x0a, 0xf0, 0x06,
-- 0xfb, 0xa3, 0x90, 0x05, 0xe0, 0x09, 0x98, 0x02,
-- 0x28, 0x02, 0xd1, 0x06, 0x20, 0x9a, 0x90, 0x06,
-- 0x1c, 0xa1, 0x20, 0x05, 0xf0, 0x06, 0xfb, 0x98,
-- 0x90, 0x05, 0x98, 0x06, 0x28, 0x9a, 0xd0, 0x02,
-- 0x98, 0x06, 0x28, 0xcd, 0xd1, 0x08, 0x2d, 0x0e,
-- 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x04, 0x20, 0x00,
-- 0x90, 0x05, 0x20, 0xff, 0x30, 0x01, 0x90, 0x06,
-- 0x2d, 0x12, 0xd1, 0x0b, 0x48, 0x9d, 0x68, 0x00,
-- 0x30, 0x01, 0x42, 0xa0, 0xd1, 0x06, 0x68, 0x78,
-- 0x28, 0x00, 0xd1, 0x03, 0x20, 0x01, 0x49, 0x9f,
-- 0x63, 0x48, 0xe0, 0x02, 0x20, 0x00, 0x49, 0x9d,
-- 0x63, 0x48, 0x98, 0x0a, 0x99, 0x06, 0x43, 0x48,
-- 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x00,
-- 0x42, 0xa0, 0xdd, 0x04, 0x20, 0x00, 0x90, 0x05,
-- 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 0x68, 0x78,
-- 0x99, 0x05, 0x18, 0x40, 0x60, 0x78, 0x1c, 0x39,
-- 0xa8, 0x11, 0xf7, 0xfc, 0xf8, 0x61, 0x1c, 0x29,
-- 0xa8, 0x11, 0xf7, 0xff, 0xfd, 0x71, 0x98, 0x12,
-- 0x49, 0x88, 0x68, 0x09, 0x39, 0x01, 0x42, 0x88,
-- 0xd1, 0x00, 0x24, 0x00, 0x99, 0x15, 0x91, 0x0d,
-- 0x98, 0x16, 0x90, 0x0f, 0x21, 0x00, 0x91, 0x10,
-- 0x68, 0x38, 0x28, 0x00, 0xda, 0x08, 0x68, 0x38,
-- 0x99, 0x08, 0x43, 0x48, 0x42, 0x41, 0x29, 0x00,
-- 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 0x91, 0x10,
-- 0x68, 0x78, 0x28, 0x00, 0xda, 0x0d, 0x68, 0x78,
-- 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 0xda, 0x00,
-- 0x30, 0x01, 0x10, 0x40, 0x02, 0x01, 0x98, 0x06,
-- 0xf0, 0x06, 0xfb, 0x36, 0x99, 0x0f, 0x1a, 0x08,
-- 0x90, 0x0f, 0x98, 0x18, 0x99, 0x0f, 0x42, 0x88,
-- 0xdc, 0x02, 0x98, 0x18, 0x30, 0x01, 0x90, 0x0f,
-- 0x98, 0x17, 0x99, 0x0d, 0x1a, 0x40, 0x30, 0x01,
-- 0x90, 0x0e, 0x98, 0x18, 0x99, 0x0f, 0x1a, 0x40,
-- 0x30, 0x01, 0x90, 0x09, 0x98, 0x09, 0x00, 0x41,
-- 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x1d, 0x99, 0x06,
-- 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 0x30, 0xff,
-- 0x12, 0x00, 0x90, 0x09, 0x68, 0xb8, 0x68, 0x39,
-- 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x0c, 0x98, 0x17,
-- 0x99, 0x15, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81,
-- 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x09, 0x90, 0x0b,
-- 0x98, 0x0b, 0x4b, 0x65, 0x40, 0x18, 0x90, 0x0b,
-- 0x98, 0x0b, 0x99, 0x08, 0x43, 0x48, 0x28, 0x00,
-- 0xda, 0x00, 0x30, 0x01, 0x10, 0x40, 0x90, 0x0e,
-- 0x99, 0x0c, 0x98, 0x0b, 0x42, 0x81, 0xdd, 0x01,
-- 0x98, 0x0b, 0x90, 0x0c, 0x99, 0x0c, 0x4b, 0x5c,
-- 0x40, 0x19, 0x91, 0x0c, 0x98, 0x0c, 0x28, 0x00,
-- 0xdd, 0x05, 0x68, 0x38, 0x99, 0x0c, 0x18, 0x40,
-- 0x38, 0x01, 0x90, 0x13, 0xe0, 0x02, 0x68, 0x38,
-- 0x30, 0x01, 0x90, 0x13, 0x98, 0x13, 0x28, 0x01,
-- 0xda, 0x01, 0x20, 0x01, 0x90, 0x13, 0x98, 0x13,
-- 0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, 0x48, 0x51,
-- 0x90, 0x13, 0x99, 0x06, 0x43, 0x4c, 0x1c, 0x20,
-- 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x04,
-- 0x98, 0x0a, 0x42, 0x84, 0xdd, 0x00, 0x9c, 0x0a,
-- 0x2c, 0x02, 0xda, 0x00, 0x24, 0x02, 0x68, 0x78,
-- 0x19, 0x00, 0x38, 0x01, 0x90, 0x14, 0x98, 0x14,
-- 0x28, 0x01, 0xda, 0x01, 0x20, 0x01, 0x90, 0x14,
-- 0x98, 0x14, 0x49, 0x3c, 0x68, 0x09, 0x42, 0x88,
-- 0xd9, 0x02, 0x48, 0x3a, 0x68, 0x00, 0x90, 0x14,
-- 0x98, 0x12, 0x49, 0x38, 0x68, 0x09, 0x39, 0x01,
-- 0x42, 0x88, 0xd9, 0x03, 0x48, 0x35, 0x68, 0x00,
-- 0x38, 0x01, 0x90, 0x12, 0x98, 0x09, 0x28, 0x04,
-- 0xdb, 0x01, 0x2c, 0x04, 0xda, 0x01, 0x20, 0x00,
-- 0x90, 0x0e, 0x98, 0x0e, 0x28, 0x03, 0xdb, 0x02,
-- 0x98, 0x0c, 0x28, 0x04, 0xda, 0x09, 0x20, 0x00,
-- 0x90, 0x0e, 0x48, 0x35, 0x90, 0x11, 0x48, 0x33,
-- 0x90, 0x13, 0x20, 0x00, 0x90, 0x12, 0x20, 0x01,
-- 0x90, 0x14, 0x21, 0x00, 0x91, 0x00, 0x98, 0x08,
-- 0x28, 0x01, 0xd1, 0x16, 0x98, 0x0e, 0x99, 0x10,
-- 0x1a, 0x40, 0x00, 0x40, 0x4b, 0x2b, 0x42, 0x98,
-- 0xdd, 0x0b, 0x98, 0x0e, 0x99, 0x10, 0x1a, 0x40,
-- 0x00, 0x40, 0x23, 0x2d, 0x01, 0x1b, 0x1a, 0xc1,
-- 0x29, 0x00, 0xda, 0x00, 0x31, 0x01, 0x10, 0x49,
-- 0x91, 0x00, 0x98, 0x0e, 0x42, 0xb0, 0xdd, 0x00,
-- 0x96, 0x0e, 0x99, 0x10, 0x42, 0xb1, 0xdd, 0x00,
-- 0x96, 0x10, 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49,
-- 0xf0, 0x06, 0xfa, 0x76, 0x99, 0x0d, 0x43, 0x48,
-- 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40,
-- 0x49, 0x1c, 0x65, 0x88, 0x1c, 0x30, 0x21, 0x01,
-- 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x69, 0x99, 0x10,
-- 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0,
-- 0x14, 0x40, 0x49, 0x16, 0x65, 0xc8, 0x1c, 0x30,
-- 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x5c,
-- 0x99, 0x0e, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b,
-- 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x48,
-- 0x99, 0x07, 0x1f, 0x08, 0x99, 0x0f, 0x42, 0x88,
-- 0xdc, 0x1b, 0x99, 0x07, 0x1f, 0x08, 0xe0, 0x17,
-- 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80,
-- 0x2e, 0x08, 0x7c, 0xbc, 0xcc, 0x00, 0x02, 0x00,
-- 0x2e, 0x08, 0x7d, 0xa0, 0xcc, 0x00, 0x0f, 0x80,
-- 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x01, 0x00,
-- 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0xcf,
-- 0x00, 0x00, 0x02, 0xce, 0xcc, 0x00, 0x00, 0x00,
-- 0x90, 0x0f, 0x98, 0x0f, 0x49, 0x0d, 0x66, 0x08,
-- 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06,
-- 0xfa, 0x2b, 0x99, 0x00, 0x43, 0x48, 0x23, 0x01,
-- 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 0x49, 0x07,
-- 0x66, 0x48, 0xa9, 0x11, 0x1c, 0x38, 0xf7, 0xfb,
-- 0xff, 0x1f, 0x20, 0x00, 0xb0, 0x1b, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x1b,
-- 0xe7, 0xf9, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00,
-- 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x2a, 0x00,
-- 0xd1, 0x02, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70,
-- 0x2f, 0x01, 0xd1, 0x20, 0x20, 0x00, 0x23, 0x00,
-- 0x4d, 0x13, 0x62, 0x2b, 0x23, 0x00, 0x4d, 0x12,
-- 0x62, 0xab, 0x4b, 0x12, 0x68, 0x9b, 0x1c, 0x1c,
-- 0x4b, 0x11, 0x6e, 0xdb, 0x1c, 0x19, 0x2c, 0x02,
-- 0xd0, 0x01, 0x29, 0x02, 0xd1, 0x01, 0x20, 0x08,
-- 0xe0, 0x00, 0x20, 0x07, 0x79, 0x13, 0x2b, 0x00,
-- 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x4b, 0x08,
-- 0x62, 0x58, 0x79, 0x55, 0x23, 0x80, 0x43, 0x2b,
-- 0x4d, 0x05, 0x62, 0xab, 0xe0, 0x05, 0x48, 0x07,
-- 0x68, 0x05, 0x23, 0x80, 0x43, 0x9d, 0x1c, 0x2b,
-- 0x60, 0x03, 0x20, 0x00, 0xe7, 0xd2, 0xe7, 0xd1,
-- 0x72, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x0c, 0x00,
-- 0xcc, 0x00, 0x0f, 0x80, 0x72, 0x00, 0x01, 0x28,
-- 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x98, 0x01,
-- 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02,
-- 0x06, 0x0c, 0x0e, 0x24, 0x98, 0x03, 0x06, 0x02,
-- 0x0e, 0x12, 0x9b, 0x04, 0x06, 0x1d, 0x0e, 0x2d,
-- 0x2f, 0x01, 0xd1, 0x1b, 0x20, 0x00, 0x4b, 0x14,
-- 0x62, 0x18, 0x20, 0x00, 0x4b, 0x12, 0x62, 0x98,
-- 0x98, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x01, 0x23,
-- 0x43, 0x18, 0x06, 0x01, 0x0e, 0x09, 0x48, 0x0e,
-- 0x62, 0x41, 0x07, 0x50, 0x0f, 0x40, 0x07, 0x6b,
-- 0x0f, 0x5b, 0x00, 0xdb, 0x43, 0x18, 0x06, 0x01,
-- 0x0e, 0x09, 0x20, 0x80, 0x43, 0x08, 0x4b, 0x08,
-- 0x62, 0x98, 0xe0, 0x05, 0x48, 0x07, 0x68, 0x06,
-- 0x23, 0x80, 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03,
-- 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9,
-- 0x72, 0x00, 0x01, 0x00, 0x72, 0x00, 0x01, 0x28,
-- 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f,
-- 0xb0, 0x81, 0x2f, 0x1f, 0xdb, 0x05, 0x20, 0xb3,
-- 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x48, 0x62, 0x23, 0x80, 0x68, 0x1b,
-- 0x60, 0x18, 0x48, 0x61, 0x23, 0x80, 0x6b, 0x1b,
-- 0x60, 0x18, 0x48, 0x60, 0x23, 0x80, 0x6b, 0x5b,
-- 0x60, 0x18, 0x48, 0x5f, 0x23, 0x80, 0x6b, 0x9b,
-- 0x60, 0x18, 0x20, 0x01, 0x40, 0xb8, 0x4b, 0x59,
-- 0x60, 0x18, 0x20, 0x00, 0x4b, 0x57, 0x71, 0x18,
-- 0x20, 0x00, 0x4b, 0x56, 0x71, 0x58, 0x48, 0x55,
-- 0x68, 0x00, 0x4b, 0x58, 0x60, 0x58, 0x48, 0x58,
-- 0x4b, 0x56, 0x60, 0x98, 0x48, 0x57, 0x4b, 0x55,
-- 0x60, 0xd8, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x53,
-- 0x62, 0x18, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x51,
-- 0x62, 0x58, 0x20, 0x03, 0x4b, 0x52, 0x75, 0x18,
-- 0x20, 0x0e, 0x4b, 0x51, 0x75, 0x58, 0x20, 0x04,
-- 0x4b, 0x4f, 0x75, 0x98, 0x20, 0x03, 0x4b, 0x4e,
-- 0x75, 0xd8, 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18,
-- 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 0x20, 0x0d,
-- 0x23, 0x19, 0x06, 0x9b, 0x63, 0x18, 0x22, 0x00,
-- 0x2a, 0x20, 0xdb, 0x04, 0xe0, 0x21, 0x1c, 0x50,
-- 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x25, 0x00,
-- 0x00, 0x93, 0x4e, 0x46, 0x50, 0xf5, 0x25, 0xff,
-- 0x4b, 0x45, 0x54, 0x9d, 0x01, 0x15, 0x4b, 0x45,
-- 0x18, 0xec, 0x01, 0x15, 0x4b, 0x44, 0x18, 0xe8,
-- 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20,
-- 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20,
-- 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20,
-- 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20,
-- 0xe7, 0xdd, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04,
-- 0xe0, 0x0b, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09,
-- 0xe7, 0xf8, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x2a,
-- 0x50, 0x23, 0x23, 0x00, 0x48, 0x35, 0x54, 0x43,
-- 0xe7, 0xf3, 0x4c, 0x35, 0x94, 0x00, 0x22, 0x00,
-- 0x2a, 0x10, 0xdb, 0x04, 0xe0, 0x0f, 0x1c, 0x50,
-- 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x20, 0x00,
-- 0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, 0x23, 0xff,
-- 0x48, 0x2f, 0x54, 0x83, 0x20, 0x00, 0x00, 0x93,
-- 0x9c, 0x00, 0x50, 0xe0, 0xe7, 0xef, 0x21, 0x00,
-- 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x04,
-- 0xe0, 0x2a, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09,
-- 0xe7, 0xf6, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x1a,
-- 0x50, 0x23, 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x18,
-- 0x19, 0x1c, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3,
-- 0x60, 0x18, 0x20, 0x00, 0x4b, 0x14, 0x18, 0x5c,
-- 0x23, 0x01, 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18,
-- 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x50, 0xe0,
-- 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x0f, 0x19, 0x1c,
-- 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 0x60, 0x18,
-- 0x20, 0x00, 0x4b, 0x0c, 0x18, 0x5c, 0x23, 0x01,
-- 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 0xe7, 0xd4,
-- 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x39, 0xb0, 0x01,
-- 0xe7, 0x37, 0x00, 0x00, 0x2e, 0x08, 0x72, 0xec,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x72, 0x90,
-- 0x2e, 0x08, 0x72, 0x9c, 0x9e, 0x00, 0x04, 0x80,
-- 0x2e, 0x08, 0x60, 0x90, 0x2e, 0x08, 0x69, 0x90,
-- 0x9e, 0x00, 0x04, 0xa0, 0x2e, 0x08, 0x5e, 0xdc,
-- 0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5e, 0xe4,
-- 0x2e, 0x08, 0x5f, 0xa4, 0x64, 0x00, 0x08, 0x00,
-- 0x64, 0x00, 0x10, 0x00, 0x2e, 0x08, 0x7b, 0xf4,
-- 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64,
-- 0x2e, 0x08, 0x5f, 0xc4, 0xb4, 0xb0, 0x1c, 0x07,
-- 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20,
-- 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xb0, 0x47, 0x70,
-- 0x00, 0x88, 0x4b, 0x0a, 0x58, 0x18, 0x1c, 0x05,
-- 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe8,
-- 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1,
-- 0x68, 0x60, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80,
-- 0x08, 0x80, 0x60, 0x38, 0x20, 0x00, 0xe7, 0xe9,
-- 0xe7, 0xe8, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c,
-- 0xb5, 0xff, 0xb0, 0x82, 0x9a, 0x04, 0x06, 0x11,
-- 0x0e, 0x09, 0x91, 0x00, 0x9b, 0x05, 0x06, 0x18,
-- 0x0e, 0x00, 0x90, 0x01, 0xb0, 0x83, 0x99, 0x03,
-- 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05,
-- 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x98, 0x05, 0x28, 0x00, 0xd0, 0x64, 0x98, 0x05,
-- 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xd8, 0xd3, 0x02,
-- 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xf0, 0x99, 0x06,
-- 0x23, 0xff, 0x33, 0x81, 0x42, 0x99, 0xd2, 0x02,
-- 0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xe8, 0x99, 0x03,
-- 0x00, 0x88, 0x49, 0x2c, 0x58, 0x08, 0x90, 0x02,
-- 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05,
-- 0xe7, 0xde, 0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1,
-- 0x39, 0x05, 0x91, 0x00, 0x9e, 0x05, 0x98, 0x05,
-- 0x1d, 0xc5, 0x35, 0x05, 0x60, 0x35, 0x99, 0x06,
-- 0x60, 0x71, 0x20, 0x00, 0x60, 0xb0, 0x98, 0x04,
-- 0x28, 0x10, 0xd1, 0x0a, 0x98, 0x02, 0x68, 0x84,
-- 0x98, 0x02, 0x30, 0x18, 0x90, 0x01, 0x1c, 0x2a,
-- 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x86,
-- 0xe0, 0x25, 0x98, 0x04, 0x28, 0x20, 0xd1, 0x1f,
-- 0x98, 0x02, 0x68, 0xc0, 0x1c, 0x07, 0xd1, 0x02,
-- 0x20, 0xb6, 0xb0, 0x05, 0xe7, 0xb8, 0x78, 0xb8,
-- 0x08, 0x40, 0x00, 0x40, 0x70, 0xb8, 0x69, 0x3c,
-- 0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x68, 0xb8,
-- 0x28, 0x00, 0xd1, 0x00, 0x60, 0xbd, 0x1c, 0x2a,
-- 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x6a,
-- 0x68, 0x79, 0x18, 0x40, 0x60, 0x78, 0x78, 0x78,
-- 0x99, 0x03, 0xf0, 0x00, 0xf8, 0xb9, 0xe0, 0x02,
-- 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0x9c, 0x68, 0xa0,
-- 0x28, 0x00, 0xd0, 0x01, 0x68, 0xa4, 0xe7, 0xfa,
-- 0x60, 0xa6, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x93,
-- 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0x90, 0xb0, 0x03,
-- 0xb0, 0x02, 0xe7, 0x8d, 0x2e, 0x08, 0x5e, 0x5c,
-- 0xb5, 0xff, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x16,
-- 0x0e, 0x36, 0x9b, 0x04, 0x06, 0x18, 0x0e, 0x00,
-- 0x90, 0x00, 0xb0, 0x83, 0x27, 0x00, 0x2e, 0x20,
-- 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb0,
-- 0x49, 0x45, 0x58, 0x08, 0x1c, 0x04, 0xd1, 0x02,
-- 0x20, 0xb0, 0xb0, 0x04, 0xe7, 0xf3, 0x78, 0xe0,
-- 0x28, 0x00, 0xd1, 0x73, 0x98, 0x03, 0x28, 0x20,
-- 0xd1, 0x19, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x02,
-- 0x20, 0xb6, 0xb0, 0x04, 0xe7, 0xe7, 0x69, 0x38,
-- 0x49, 0x3c, 0x60, 0x48, 0x48, 0x3b, 0x68, 0x40,
-- 0x68, 0x00, 0x60, 0xb8, 0x1d, 0xf8, 0x30, 0x05,
-- 0x90, 0x02, 0x20, 0x01, 0x90, 0x00, 0x48, 0x37,
-- 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1,
-- 0x39, 0x19, 0x91, 0x01, 0xe0, 0x1d, 0x98, 0x03,
-- 0x28, 0x10, 0xd1, 0x17, 0x68, 0xa0, 0x49, 0x31,
-- 0x60, 0x48, 0x48, 0x30, 0x68, 0x40, 0x68, 0x00,
-- 0x61, 0x20, 0x48, 0x2e, 0x68, 0x40, 0x68, 0x00,
-- 0x61, 0x60, 0x1d, 0xe0, 0x30, 0x11, 0x90, 0x02,
-- 0x48, 0x2a, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80,
-- 0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, 0x20, 0x00,
-- 0x90, 0x00, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x04,
-- 0xe7, 0xb5, 0x48, 0x24, 0x68, 0x40, 0x68, 0x80,
-- 0x28, 0x00, 0xd0, 0x37, 0x25, 0x00, 0x48, 0x21,
-- 0x68, 0x40, 0x68, 0x02, 0x99, 0x01, 0x98, 0x02,
-- 0xf0, 0x00, 0xfb, 0xe8, 0x19, 0x45, 0x48, 0x1d,
-- 0x68, 0x40, 0x49, 0x1c, 0x60, 0x08, 0x48, 0x1b,
-- 0x68, 0x00, 0x68, 0x80, 0x49, 0x19, 0x60, 0x48,
-- 0x48, 0x18, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80,
-- 0x1f, 0xc1, 0x39, 0x05, 0x91, 0x01, 0x48, 0x15,
-- 0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd1, 0xe2,
-- 0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x88,
-- 0x48, 0x10, 0x68, 0x40, 0x99, 0x04, 0x60, 0x08,
-- 0x48, 0x0e, 0x68, 0x40, 0x68, 0x40, 0x99, 0x05,
-- 0x60, 0x08, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x06,
-- 0x60, 0x7d, 0x78, 0x78, 0x1c, 0x31, 0xf0, 0x00,
-- 0xf8, 0x13, 0xe0, 0x00, 0xe0, 0x05, 0x20, 0x00,
-- 0xb0, 0x04, 0xe7, 0x78, 0x20, 0xb4, 0xb0, 0x04,
-- 0xe7, 0x75, 0x20, 0xbc, 0xb0, 0x04, 0xe7, 0x72,
-- 0xb0, 0x03, 0xb0, 0x01, 0xe7, 0x6f, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x60, 0x88,
-- 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12,
-- 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x81,
-- 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x01,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x00, 0xa0, 0x4b, 0x14, 0x58, 0x18, 0x1c, 0x05,
-- 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x01, 0xe7, 0xf3,
-- 0x68, 0xe8, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xb6,
-- 0xb0, 0x01, 0xe7, 0xed, 0x11, 0x10, 0x06, 0x00,
-- 0x0e, 0x00, 0x90, 0x00, 0x28, 0x00, 0xd1, 0x04,
-- 0x68, 0x48, 0x40, 0xd0, 0x06, 0x07, 0x0e, 0x3f,
-- 0xe0, 0x09, 0x68, 0x48, 0x07, 0x16, 0x0f, 0x36,
-- 0x40, 0xf0, 0x68, 0x4e, 0x40, 0xd6, 0x1c, 0x33,
-- 0x18, 0xc0, 0x06, 0x07, 0x0e, 0x3f, 0x70, 0x0f,
-- 0x70, 0x4a, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd3,
-- 0xb0, 0x01, 0xe7, 0xd1, 0x2e, 0x08, 0x5e, 0x5c,
-- 0xb4, 0xb0, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11,
-- 0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2,
-- 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4d, 0x08,
-- 0x58, 0x28, 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb0,
-- 0xe7, 0xf6, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x01,
-- 0x20, 0xb6, 0xe7, 0xf1, 0x78, 0x78, 0x70, 0x18,
-- 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00,
-- 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0xb0, 0x81,
-- 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00,
-- 0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x86,
-- 0x20, 0x00, 0x90, 0x00, 0x2d, 0x20, 0xdd, 0x05,
-- 0x20, 0xa2, 0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa8, 0x49, 0xa2,
-- 0x58, 0x08, 0x90, 0x04, 0x28, 0x00, 0xd1, 0x02,
-- 0x20, 0xb0, 0xb0, 0x07, 0xe7, 0xf2, 0x00, 0xa8,
-- 0x49, 0x9e, 0x68, 0x09, 0x18, 0x40, 0x90, 0x05,
-- 0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, 0x49, 0x9c,
-- 0x68, 0x09, 0x18, 0x46, 0x98, 0x06, 0x28, 0x00,
-- 0xd0, 0x73, 0x28, 0x01, 0xd0, 0x4f, 0x28, 0x02,
-- 0xd0, 0x00, 0xe1, 0x1d, 0x98, 0x04, 0x69, 0x00,
-- 0x60, 0x70, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0,
-- 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13,
-- 0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04,
-- 0xe0, 0x11, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f,
-- 0xe7, 0xf8, 0x48, 0x8e, 0x5d, 0xc0, 0x42, 0xa8,
-- 0xd1, 0x08, 0x00, 0xb8, 0x49, 0x8c, 0x58, 0x08,
-- 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb,
-- 0x40, 0x19, 0x70, 0x01, 0xe7, 0xed, 0xe0, 0x1e,
-- 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a,
-- 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8,
-- 0x48, 0x84, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11,
-- 0x00, 0xb8, 0x49, 0x83, 0x58, 0x08, 0x30, 0x01,
-- 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19,
-- 0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00,
-- 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02,
-- 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0x88, 0x30,
-- 0x4b, 0x7a, 0x40, 0x18, 0x80, 0x30, 0x98, 0x05,
-- 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18,
-- 0x99, 0x05, 0x60, 0x08, 0xe0, 0xd3, 0x98, 0x05,
-- 0x68, 0x00, 0x4b, 0x75, 0x40, 0x18, 0x99, 0x05,
-- 0x60, 0x08, 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00,
-- 0x70, 0xf0, 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04,
-- 0x78, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02,
-- 0x98, 0x02, 0x28, 0x13, 0xd0, 0x16, 0x27, 0x00,
-- 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x11, 0x1c, 0x78,
-- 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x63,
-- 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x08, 0x00, 0xb8,
-- 0xe0, 0x00, 0xe0, 0x27, 0x49, 0x60, 0x58, 0x0c,
-- 0x78, 0x60, 0x23, 0x80, 0x43, 0x18, 0x70, 0x60,
-- 0xe7, 0xed, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10,
-- 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07,
-- 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x59, 0x5d, 0xc0,
-- 0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x58,
-- 0x58, 0x08, 0x30, 0x01, 0x78, 0x01, 0x23, 0x80,
-- 0x43, 0xdb, 0x40, 0x19, 0x70, 0x01, 0x98, 0x00,
-- 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00,
-- 0x98, 0x00, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x00,
-- 0xe7, 0xe4, 0xe0, 0x88, 0x98, 0x05, 0x68, 0x00,
-- 0x4b, 0x4f, 0x40, 0x18, 0x99, 0x05, 0x60, 0x08,
-- 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 0x70, 0xf0,
-- 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40,
-- 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x04,
-- 0x78, 0x40, 0x21, 0x20, 0x40, 0x01, 0x91, 0x03,
-- 0x98, 0x02, 0x28, 0x13, 0xd0, 0x4c, 0x27, 0x00,
-- 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x47, 0x1c, 0x78,
-- 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x3b,
-- 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x3e, 0x00, 0xb8,
-- 0x49, 0x39, 0x58, 0x0c, 0x20, 0x80, 0x70, 0x60,
-- 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 0xfb, 0x30,
-- 0x78, 0xa0, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x28,
-- 0x6a, 0xe0, 0x22, 0x00, 0x92, 0x01, 0x99, 0x01,
-- 0x29, 0x08, 0xdb, 0x06, 0xe0, 0x1f, 0x99, 0x01,
-- 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x91, 0x01,
-- 0xe7, 0xf5, 0x99, 0x01, 0x00, 0x89, 0x18, 0x09,
-- 0x68, 0x49, 0x9a, 0x01, 0x00, 0x92, 0x18, 0x12,
-- 0x64, 0x51, 0x22, 0x00, 0x99, 0x01, 0x00, 0x89,
-- 0x18, 0x09, 0x62, 0x4a, 0x99, 0x01, 0x00, 0x89,
-- 0x18, 0x09, 0x6c, 0x49, 0x29, 0x00, 0xd0, 0x05,
-- 0x9a, 0x01, 0x21, 0x80, 0x41, 0x11, 0x88, 0x02,
-- 0x43, 0x11, 0x80, 0x01, 0xe7, 0xdf, 0x88, 0x01,
-- 0x80, 0x41, 0x78, 0xa0, 0x23, 0x20, 0x40, 0x18,
-- 0xd0, 0x04, 0x98, 0x04, 0x68, 0xc1, 0x1c, 0x20,
-- 0xf0, 0x00, 0xfa, 0x3d, 0xe7, 0xb7, 0xe0, 0x1e,
-- 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a,
-- 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8,
-- 0x48, 0x16, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11,
-- 0x00, 0xb8, 0x49, 0x15, 0x58, 0x0c, 0x20, 0x80,
-- 0x70, 0x60, 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd,
-- 0xfa, 0xe3, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00,
-- 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02,
-- 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0xe0, 0x02,
-- 0x20, 0xbc, 0xb0, 0x07, 0xe6, 0xbe, 0x98, 0x06,
-- 0x99, 0x04, 0x70, 0xc8, 0x20, 0x00, 0xb0, 0x07,
-- 0xe6, 0xb8, 0xb0, 0x06, 0xb0, 0x01, 0xe6, 0xb5,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4,
-- 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xc4,
-- 0x2e, 0x08, 0x5f, 0x64, 0xff, 0xff, 0xfb, 0xff,
-- 0xff, 0xff, 0xdf, 0xff, 0xb4, 0x90, 0x1c, 0x03,
-- 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20,
-- 0xdd, 0x02, 0x20, 0xa2, 0xbc, 0x90, 0x47, 0x70,
-- 0x00, 0x88, 0x4c, 0x05, 0x58, 0x20, 0x1c, 0x07,
-- 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x78, 0xf8,
-- 0x70, 0x18, 0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1,
-- 0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02,
-- 0x1c, 0x0f, 0x06, 0x38, 0x16, 0x04, 0x2a, 0x02,
-- 0xda, 0x02, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70,
-- 0x2c, 0x01, 0xd1, 0x01, 0x21, 0x28, 0xe0, 0x09,
-- 0x2c, 0x02, 0xd1, 0x01, 0x21, 0x20, 0xe0, 0x05,
-- 0x2c, 0x00, 0xd1, 0x01, 0x21, 0x0c, 0xe0, 0x01,
-- 0x20, 0x00, 0xe7, 0xef, 0x00, 0x50, 0x18, 0x80,
-- 0x01, 0x80, 0x18, 0x41, 0x1c, 0xc8, 0x08, 0x81,
-- 0x1c, 0x08, 0xe7, 0xe7, 0xe7, 0xe6, 0xb5, 0xf7,
-- 0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x11,
-- 0x0e, 0x09, 0x91, 0x00, 0xb0, 0x84, 0x99, 0x04,
-- 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x99, 0x04, 0x00, 0x88, 0x49, 0x29, 0x58, 0x08,
-- 0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05,
-- 0xe7, 0xf2, 0x2f, 0x00, 0xd1, 0x02, 0x20, 0xb4,
-- 0xb0, 0x05, 0xe7, 0xed, 0x4b, 0x24, 0x42, 0x9f,
-- 0xd1, 0x0a, 0x78, 0xf0, 0x28, 0x00, 0xd0, 0x02,
-- 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0xe4, 0x20, 0x00,
-- 0x60, 0xf0, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xdf,
-- 0x68, 0xf0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb4,
-- 0xb0, 0x05, 0xe7, 0xd9, 0x99, 0x06, 0x00, 0x88,
-- 0x1f, 0xc1, 0x39, 0x19, 0x91, 0x02, 0x20, 0xff,
-- 0x30, 0x81, 0x90, 0x01, 0x99, 0x02, 0x98, 0x01,
-- 0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x05,
-- 0xe7, 0xca, 0x1c, 0x3c, 0x60, 0xf4, 0x37, 0x14,
-- 0x1c, 0x3d, 0x37, 0x0c, 0x60, 0x2f, 0x99, 0x06,
-- 0x60, 0x69, 0x20, 0x00, 0x60, 0xa8, 0x97, 0x03,
-- 0x20, 0x00, 0x60, 0xe0, 0x1d, 0xe0, 0x30, 0x05,
-- 0x9a, 0x03, 0x99, 0x02, 0xf0, 0x00, 0xf9, 0x56,
-- 0x90, 0x00, 0x20, 0x00, 0x70, 0xa0, 0x98, 0x00,
-- 0x60, 0x60, 0x9a, 0x03, 0x60, 0xa2, 0x61, 0x25,
-- 0x99, 0x04, 0x20, 0x54, 0xf7, 0xff, 0xfd, 0xa0,
-- 0xb0, 0x05, 0xe7, 0xa9, 0xb0, 0x04, 0xb0, 0x01,
-- 0xe7, 0xa6, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c,
-- 0x00, 0x00, 0xff, 0xff, 0xb5, 0xff, 0xb0, 0x83,
-- 0x9a, 0x05, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00,
-- 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01,
-- 0x98, 0x0c, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x02,
-- 0xb0, 0x85, 0x99, 0x05, 0x29, 0x20, 0xdb, 0x05,
-- 0x20, 0xa2, 0xb0, 0x08, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x98, 0x08, 0x28, 0x00,
-- 0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x08, 0xe7, 0xf5,
-- 0x99, 0x05, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80,
-- 0x49, 0x83, 0x68, 0x09, 0x18, 0x47, 0x98, 0x08,
-- 0x4b, 0x82, 0x42, 0x98, 0xd1, 0x73, 0x99, 0x05,
-- 0x00, 0x88, 0x49, 0x81, 0x58, 0x08, 0x1c, 0x05,
-- 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0xe1,
-- 0x68, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x78, 0xe8,
-- 0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x08,
-- 0xe7, 0xd8, 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x54,
-- 0x20, 0x00, 0x42, 0x80, 0xd0, 0x1d, 0x24, 0x00,
-- 0x2c, 0x20, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60,
-- 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x48, 0x73,
-- 0x5d, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0e,
-- 0x20, 0x01, 0x40, 0xa0, 0x43, 0xc0, 0x49, 0x70,
-- 0x68, 0x09, 0x40, 0x08, 0x49, 0x6e, 0x60, 0x08,
-- 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x6d, 0x50, 0x50,
-- 0x20, 0xff, 0x49, 0x6a, 0x55, 0x08, 0xe7, 0xe6,
-- 0xe0, 0x33, 0x4a, 0x6b, 0x92, 0x03, 0x7e, 0x38,
-- 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 0x20, 0x00,
-- 0x00, 0xb1, 0x4a, 0x68, 0x50, 0x50, 0x20, 0x01,
-- 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x66, 0x68, 0x09,
-- 0x40, 0x08, 0x49, 0x65, 0x60, 0x08, 0x20, 0xff,
-- 0x76, 0x38, 0x21, 0xff, 0x48, 0x63, 0x55, 0x81,
-- 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11,
-- 0x7e, 0x78, 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14,
-- 0x21, 0x00, 0x00, 0xb0, 0x4a, 0x5b, 0x50, 0x11,
-- 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x5a,
-- 0x68, 0x09, 0x40, 0x08, 0x49, 0x58, 0x60, 0x08,
-- 0x20, 0xff, 0x76, 0x78, 0x20, 0xff, 0x49, 0x51,
-- 0x55, 0x88, 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03,
-- 0x50, 0x11, 0x20, 0x00, 0x99, 0x05, 0x00, 0x89,
-- 0x4a, 0x4b, 0x50, 0x50, 0x24, 0x00, 0x2c, 0x0c,
-- 0xdb, 0x06, 0xe0, 0x09, 0xe0, 0x00, 0xe0, 0x0e,
-- 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf6,
-- 0x20, 0x00, 0x19, 0x39, 0x73, 0x08, 0xe7, 0xf7,
-- 0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8,
-- 0x20, 0x00, 0xb0, 0x08, 0xe7, 0x66, 0x99, 0x05,
-- 0x00, 0x88, 0x49, 0x3f, 0x58, 0x08, 0x28, 0x00,
-- 0xd0, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0x5d,
-- 0x99, 0x07, 0x29, 0x11, 0xdb, 0x02, 0x99, 0x07,
-- 0x29, 0x13, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x08,
-- 0xe7, 0x54, 0x99, 0x09, 0x00, 0x88, 0x1f, 0xc1,
-- 0x39, 0x21, 0x91, 0x01, 0x20, 0xff, 0x30, 0x81,
-- 0x90, 0x00, 0x99, 0x01, 0x98, 0x00, 0x42, 0x81,
-- 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x08, 0xe7, 0x45,
-- 0x9d, 0x08, 0x98, 0x08, 0x30, 0x1c, 0x90, 0x08,
-- 0x98, 0x08, 0x90, 0x04, 0x98, 0x08, 0x30, 0x0c,
-- 0x90, 0x08, 0x98, 0x08, 0x90, 0x02, 0x9a, 0x02,
-- 0x98, 0x04, 0x60, 0x02, 0x99, 0x09, 0x98, 0x04,
-- 0x60, 0x41, 0x20, 0x00, 0x99, 0x04, 0x60, 0x88,
-- 0x20, 0x00, 0x61, 0xa8, 0x1d, 0xe8, 0x30, 0x11,
-- 0x9a, 0x02, 0x99, 0x01, 0xf0, 0x00, 0xf8, 0x56,
-- 0x20, 0x00, 0x70, 0x28, 0x98, 0x06, 0x99, 0x07,
-- 0x43, 0x08, 0x70, 0x68, 0x20, 0x00, 0x70, 0xa8,
-- 0x20, 0x02, 0x70, 0xe8, 0x20, 0x00, 0x71, 0x28,
-- 0x98, 0x04, 0x60, 0xa8, 0x20, 0x00, 0x60, 0xe8,
-- 0x9a, 0x02, 0x61, 0x2a, 0x9a, 0x02, 0x61, 0x6a,
-- 0x99, 0x05, 0x00, 0x88, 0x49, 0x16, 0x50, 0x0d,
-- 0x20, 0x00, 0x60, 0xf8, 0x88, 0x38, 0x4b, 0x1c,
-- 0x40, 0x18, 0x80, 0x38, 0x20, 0x00, 0x60, 0xb8,
-- 0x9a, 0x02, 0x60, 0x7a, 0x98, 0x06, 0x99, 0x07,
-- 0x43, 0x08, 0x70, 0xb8, 0x24, 0x00, 0x2c, 0x0c,
-- 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x60, 0x06, 0x04,
-- 0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, 0x19, 0x39,
-- 0x74, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38,
-- 0x20, 0x00, 0x70, 0xf8, 0x20, 0xff, 0x76, 0x38,
-- 0x20, 0xff, 0x76, 0x78, 0x20, 0x00, 0xb0, 0x08,
-- 0xe6, 0xec, 0xb0, 0x05, 0xb0, 0x03, 0xe6, 0xe9,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5f, 0xa4,
-- 0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x5e, 0xe4,
-- 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64,
-- 0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5f, 0xc4,
-- 0xff, 0xff, 0xfb, 0xff, 0xb4, 0x90, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x1c, 0x13, 0x21, 0x00, 0x68, 0x22,
-- 0x2a, 0x00, 0xd0, 0x00, 0x60, 0x13, 0x1d, 0xd8,
-- 0x30, 0xb9, 0x60, 0x18, 0x33, 0xc0, 0x31, 0x01,
-- 0x3f, 0xc0, 0x2f, 0xc0, 0xd8, 0xf7, 0x20, 0x00,
-- 0x60, 0x18, 0x60, 0x23, 0x31, 0x01, 0x1c, 0x08,
-- 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0xb4, 0x90,
-- 0x1c, 0x03, 0x1c, 0x0a, 0x6b, 0x18, 0x68, 0xd1,
-- 0x68, 0x07, 0x2f, 0x00, 0xd0, 0x0c, 0x68, 0x07,
-- 0x60, 0x0f, 0x68, 0x41, 0x68, 0x57, 0x68, 0x84,
-- 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x60, 0x07,
-- 0x27, 0x00, 0x60, 0x47, 0x27, 0x00, 0x60, 0x87,
-- 0x6a, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, 0x6a, 0xc7,
-- 0x60, 0x0f, 0x6b, 0x01, 0x68, 0x57, 0x6b, 0x44,
-- 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x62, 0xc7,
-- 0x27, 0x00, 0x63, 0x07, 0x27, 0x00, 0x63, 0x47,
-- 0x60, 0xd1, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc,
-- 0x20, 0x00, 0x49, 0x01, 0x70, 0x08, 0x47, 0x70,
-- 0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0xb0, 0x82,
-- 0x9b, 0x05, 0x06, 0x18, 0x16, 0x00, 0x90, 0x00,
-- 0x98, 0x0c, 0x06, 0x01, 0x16, 0x09, 0x91, 0x01,
-- 0x98, 0x00, 0x28, 0x1f, 0xdd, 0x05, 0x20, 0xaf,
-- 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x48, 0x37, 0x78, 0x00, 0x28, 0x00,
-- 0xd0, 0x03, 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xf4,
-- 0xe0, 0x64, 0x20, 0xff, 0x49, 0x32, 0x70, 0x08,
-- 0x49, 0x32, 0x98, 0x00, 0xf0, 0x09, 0xfa, 0xca,
-- 0x9a, 0x04, 0x2a, 0x00, 0xd9, 0x52, 0x20, 0xff,
-- 0x49, 0x2f, 0x70, 0x08, 0x9d, 0x02, 0x98, 0x0b,
-- 0x99, 0x01, 0x18, 0x44, 0x99, 0x01, 0x20, 0xc0,
-- 0x1a, 0x40, 0x9a, 0x04, 0x42, 0x90, 0xd9, 0x01,
-- 0x9f, 0x04, 0xe0, 0x02, 0x99, 0x01, 0x20, 0xc0,
-- 0x1a, 0x47, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28,
-- 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0xa5, 0x1c, 0x06,
-- 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04,
-- 0xf9, 0xa9, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28,
-- 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0x99, 0x1c, 0x06,
-- 0xe7, 0xf2, 0x98, 0x02, 0x19, 0xc0, 0x90, 0x02,
-- 0x9a, 0x04, 0x1b, 0xd2, 0x92, 0x04, 0x9d, 0x0b,
-- 0x9c, 0x03, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21,
-- 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x89, 0x1c, 0x06,
-- 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04,
-- 0xf9, 0x8d, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21,
-- 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x7d, 0x1c, 0x06,
-- 0xe7, 0xf2, 0x99, 0x03, 0x29, 0x20, 0xd3, 0x04,
-- 0x99, 0x01, 0x18, 0x78, 0x99, 0x03, 0x18, 0x41,
-- 0x91, 0x03, 0x48, 0x0b, 0x78, 0x00, 0x28, 0x00,
-- 0xd0, 0x03, 0x20, 0x03, 0xf0, 0x04, 0xf9, 0x76,
-- 0xe7, 0xf7, 0xe7, 0xa9, 0x20, 0x00, 0x49, 0x04,
-- 0x70, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x90,
-- 0xb0, 0x02, 0xe7, 0x8e, 0xe7, 0x8d, 0x00, 0x00,
-- 0x2e, 0x08, 0x1f, 0xa0, 0x2e, 0x01, 0x35, 0x35,
-- 0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0x1c, 0x0f,
-- 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 0x9b, 0x03,
-- 0x06, 0x1d, 0x0e, 0x2d, 0x2c, 0x1f, 0xdb, 0x04,
-- 0x20, 0xb3, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x04, 0x3a, 0x0c, 0x12, 0x2d, 0x01,
-- 0xd1, 0x73, 0x20, 0x01, 0x03, 0x40, 0x40, 0x10,
-- 0xd0, 0x0a, 0x4b, 0x6f, 0x40, 0x1a, 0x48, 0x6f,
-- 0x68, 0x00, 0x68, 0x00, 0x23, 0x02, 0x43, 0xdb,
-- 0x40, 0x18, 0x4b, 0x6c, 0x68, 0x1b, 0x60, 0x18,
-- 0x20, 0x01, 0x02, 0x40, 0x40, 0x10, 0xd0, 0x0a,
-- 0x4b, 0x69, 0x40, 0x1a, 0x48, 0x67, 0x68, 0x00,
-- 0x68, 0x00, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18,
-- 0x4b, 0x64, 0x68, 0x1b, 0x60, 0x18, 0x20, 0x01,
-- 0x05, 0x00, 0x40, 0x38, 0xd0, 0x08, 0x48, 0x63,
-- 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 0x05, 0x1b,
-- 0x43, 0x18, 0x4b, 0x60, 0x68, 0x1b, 0x61, 0x98,
-- 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x08,
-- 0x48, 0x5c, 0x68, 0x00, 0x69, 0x80, 0x23, 0x01,
-- 0x05, 0x5b, 0x43, 0x18, 0x4b, 0x59, 0x68, 0x1b,
-- 0x61, 0x98, 0x0a, 0x12, 0x48, 0x55, 0x68, 0x00,
-- 0x68, 0x00, 0x43, 0x90, 0x4b, 0x53, 0x68, 0x1b,
-- 0x60, 0x18, 0x48, 0x52, 0x68, 0x00, 0x68, 0x00,
-- 0x4b, 0x53, 0x65, 0x18, 0x48, 0x51, 0x68, 0x00,
-- 0x77, 0x04, 0x20, 0x09, 0x04, 0x80, 0x40, 0x38,
-- 0xd0, 0x35, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04,
-- 0xe0, 0x31, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09,
-- 0xe7, 0xf8, 0x20, 0x01, 0x40, 0x88, 0x9b, 0x00,
-- 0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x05, 0x40,
-- 0x40, 0x38, 0xd0, 0x0e, 0x00, 0xc8, 0x1a, 0x40,
-- 0x00, 0x80, 0x4b, 0x46, 0x68, 0x1b, 0x5a, 0x18,
-- 0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xcb,
-- 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x41, 0x68, 0x36,
-- 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 0x40, 0x38,
-- 0xd0, 0x10, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80,
-- 0xe0, 0x00, 0xe0, 0x0d, 0x4b, 0x3b, 0x68, 0x1b,
-- 0x5a, 0x18, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18,
-- 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x37,
-- 0x68, 0x36, 0x52, 0xf0, 0xe7, 0xcd, 0xe0, 0x5c,
-- 0x2d, 0x02, 0xd1, 0x5a, 0x0a, 0x12, 0x48, 0x2f,
-- 0x68, 0x00, 0x68, 0x00, 0x43, 0x10, 0x4b, 0x2d,
-- 0x68, 0x1b, 0x60, 0x18, 0x48, 0x2b, 0x68, 0x00,
-- 0x68, 0x00, 0x4b, 0x2d, 0x65, 0x18, 0x20, 0x01,
-- 0x05, 0x00, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x29,
-- 0x68, 0x00, 0x69, 0x80, 0x4b, 0x2a, 0x40, 0x18,
-- 0x4b, 0x26, 0x68, 0x1b, 0x61, 0x98, 0x20, 0x01,
-- 0x05, 0x40, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x23,
-- 0x68, 0x00, 0x69, 0x80, 0x4b, 0x25, 0x40, 0x18,
-- 0x4b, 0x20, 0x68, 0x1b, 0x61, 0x98, 0x21, 0x00,
-- 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48,
-- 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x09,
-- 0x04, 0x80, 0x40, 0x38, 0xd0, 0x28, 0x20, 0x01,
-- 0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x23,
-- 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0d,
-- 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x15,
-- 0x68, 0x1b, 0x5a, 0x18, 0x4b, 0x16, 0x40, 0x18,
-- 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x11,
-- 0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80,
-- 0x40, 0x38, 0xd0, 0x0d, 0x00, 0xc8, 0x1a, 0x40,
-- 0x00, 0x80, 0x4b, 0x0c, 0x68, 0x1b, 0x5a, 0x18,
-- 0x4b, 0x05, 0x40, 0x18, 0x00, 0xcb, 0x1a, 0x5b,
-- 0x00, 0x9b, 0x4e, 0x08, 0x68, 0x36, 0x52, 0xf0,
-- 0xe7, 0xcd, 0x20, 0x00, 0xe7, 0x15, 0xe7, 0x14,
-- 0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0x7c, 0x18,
-- 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5e, 0x0c,
-- 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xc4,
-- 0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
-- 0xff, 0xff, 0xfe, 0xff, 0xb5, 0x80, 0x1c, 0x07,
-- 0x48, 0x17, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x12,
-- 0xf8, 0x69, 0x60, 0x38, 0x48, 0x14, 0x68, 0x00,
-- 0x1d, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x62,
-- 0x60, 0x78, 0x48, 0x11, 0x68, 0x00, 0x1d, 0xc1,
-- 0x31, 0x05, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x5a,
-- 0x60, 0xf8, 0x48, 0x0d, 0x68, 0x00, 0x1d, 0xc1,
-- 0x31, 0x09, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x52,
-- 0x61, 0x38, 0x48, 0x09, 0x68, 0x00, 0x1d, 0xc1,
-- 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x4a,
-- 0x61, 0x78, 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1,
-- 0x31, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x42,
-- 0x60, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x5e, 0x0c, 0xb5, 0xf0, 0x1c, 0x07,
-- 0xb0, 0x82, 0x26, 0x00, 0x89, 0xb8, 0x23, 0x08,
-- 0x40, 0x18, 0xd0, 0x08, 0x48, 0x59, 0x6e, 0xc2,
-- 0x48, 0x58, 0x6f, 0x01, 0x48, 0x57, 0x6a, 0x00,
-- 0xf7, 0xfd, 0xff, 0x5c, 0x1c, 0x06, 0x89, 0xb8,
-- 0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, 0x48, 0x53,
-- 0x69, 0x40, 0x1c, 0x06, 0x89, 0xb8, 0x07, 0xc0,
-- 0x0f, 0xc0, 0xd0, 0x21, 0x48, 0x50, 0x68, 0xc0,
-- 0x90, 0x00, 0x68, 0x78, 0x02, 0x40, 0x99, 0x00,
-- 0x1a, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x33,
-- 0x06, 0x49, 0x65, 0xc8, 0x98, 0x00, 0x21, 0x33,
-- 0x06, 0x49, 0x66, 0x08, 0x98, 0x01, 0x49, 0x48,
-- 0x60, 0x88, 0x98, 0x00, 0x49, 0x46, 0x60, 0xc8,
-- 0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8,
-- 0x20, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8,
-- 0x89, 0xb8, 0x23, 0x02, 0x43, 0x18, 0x81, 0xb8,
-- 0x89, 0xb8, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3e,
-- 0x48, 0x3d, 0x68, 0x80, 0x1f, 0xc4, 0x3c, 0xff,
-- 0x3c, 0xfa, 0x68, 0x38, 0x02, 0x40, 0x1a, 0x25,
-- 0x48, 0x38, 0x60, 0x45, 0x48, 0x37, 0x60, 0x84,
-- 0x20, 0x33, 0x06, 0x40, 0x65, 0x45, 0x20, 0x33,
-- 0x06, 0x40, 0x65, 0x84, 0x1b, 0x60, 0x38, 0xc0,
-- 0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x21, 0x00,
-- 0x48, 0x32, 0xf7, 0xfd, 0xfb, 0x89, 0x48, 0x32,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xfa,
-- 0x48, 0x30, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01,
-- 0x43, 0x19, 0x60, 0x01, 0x48, 0x2e, 0x6d, 0x80,
-- 0x49, 0x2d, 0x65, 0x88, 0x48, 0x2c, 0x6b, 0xc0,
-- 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00,
-- 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x66, 0x45,
-- 0x20, 0x33, 0x06, 0x40, 0x66, 0x84, 0x21, 0x00,
-- 0x20, 0xff, 0xf7, 0xfd, 0xfb, 0x69, 0x48, 0x20,
-- 0x60, 0x05, 0x48, 0x1f, 0x60, 0x44, 0x89, 0xb8,
-- 0x23, 0x04, 0x40, 0x18, 0xd0, 0x21, 0x68, 0xb8,
-- 0x28, 0x00, 0xd1, 0x06, 0x48, 0x1f, 0x68, 0x01,
-- 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01,
-- 0xe0, 0x17, 0x69, 0x38, 0x49, 0x1a, 0x65, 0x88,
-- 0x69, 0x38, 0x68, 0xb9, 0x02, 0x49, 0x18, 0x40,
-- 0x49, 0x17, 0x65, 0xc8, 0x20, 0x03, 0x02, 0x00,
-- 0x49, 0x15, 0x67, 0x48, 0x20, 0x02, 0x49, 0x14,
-- 0x67, 0x88, 0x20, 0x40, 0x49, 0x12, 0x66, 0x08,
-- 0x48, 0x12, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19,
-- 0x60, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40,
-- 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x38,
-- 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d,
-- 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x78, 0x48, 0x0a,
-- 0x43, 0x30, 0x60, 0xb8, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80,
-- 0x2e, 0x08, 0x7c, 0x1c, 0x00, 0x00, 0x80, 0x0f,
-- 0xcc, 0x00, 0x05, 0x00, 0x66, 0x00, 0x00, 0xe0,
-- 0x66, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0xf0,
-- 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x1c, 0x02,
-- 0xb0, 0x81, 0x68, 0x93, 0x68, 0x54, 0x21, 0x00,
-- 0x1d, 0xd8, 0x30, 0xb9, 0x1b, 0x00, 0x06, 0x05,
-- 0x0e, 0x2d, 0x2d, 0x12, 0xda, 0x12, 0x21, 0x00,
-- 0x42, 0xa9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48,
-- 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x26,
-- 0x34, 0x01, 0x98, 0x02, 0x54, 0x46, 0xe7, 0xf6,
-- 0x68, 0x1b, 0x1d, 0x18, 0x90, 0x00, 0x98, 0x00,
-- 0x78, 0x80, 0x18, 0xc4, 0x1c, 0x0f, 0x2f, 0x12,
-- 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x78, 0x06, 0x07,
-- 0x0e, 0x3f, 0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01,
-- 0x98, 0x02, 0x55, 0xc6, 0xe7, 0xf6, 0x20, 0x00,
-- 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0xb4, 0xf0,
-- 0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, 0xb0, 0x82,
-- 0x20, 0x00, 0x70, 0x20, 0x78, 0x78, 0x23, 0x80,
-- 0x40, 0x18, 0xd0, 0x03, 0x20, 0xb1, 0xb0, 0x02,
-- 0xbc, 0xf0, 0x47, 0x70, 0x78, 0xba, 0x20, 0x40,
-- 0x40, 0x10, 0xd0, 0x2a, 0x07, 0x12, 0x0f, 0x12,
-- 0x07, 0xd0, 0x0f, 0xc0, 0xd0, 0x25, 0x20, 0x40,
-- 0x70, 0x20, 0x35, 0x0a, 0x21, 0x00, 0x1d, 0xf8,
-- 0x30, 0x0d, 0x90, 0x01, 0x1d, 0xf8, 0x30, 0x1d,
-- 0x90, 0x00, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04,
-- 0xe0, 0x14, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09,
-- 0xe7, 0xf8, 0x78, 0x2e, 0x35, 0x01, 0x98, 0x00,
-- 0x78, 0x03, 0x30, 0x01, 0x90, 0x00, 0x40, 0x33,
-- 0x98, 0x01, 0x78, 0x06, 0x30, 0x01, 0x90, 0x01,
-- 0x42, 0xb3, 0xd0, 0x02, 0x20, 0x00, 0x70, 0x20,
-- 0xe0, 0x00, 0xe7, 0xea, 0x20, 0x00, 0xb0, 0x02,
-- 0xe7, 0xce, 0x20, 0xb1, 0xb0, 0x02, 0xe7, 0xcb,
-- 0xb0, 0x02, 0xe7, 0xc9, 0xb5, 0xf7, 0x1c, 0x07,
-- 0xb0, 0x8d, 0x20, 0x00, 0x9a, 0x0f, 0x70, 0x10,
-- 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05,
-- 0x20, 0xb1, 0xb0, 0x0d, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x78, 0xb8, 0x90, 0x05,
-- 0x98, 0x05, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x73,
-- 0x98, 0x05, 0x07, 0x00, 0x0f, 0x00, 0x90, 0x05,
-- 0x98, 0x05, 0x23, 0x02, 0x40, 0x18, 0xd1, 0x03,
-- 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x68,
-- 0x99, 0x0e, 0x79, 0x48, 0x23, 0x3e, 0x40, 0x18,
-- 0x90, 0x0c, 0x78, 0xf8, 0x90, 0x04, 0x98, 0x04,
-- 0x01, 0x00, 0x4b, 0x81, 0x18, 0xc0, 0x90, 0x02,
-- 0x98, 0x02, 0x68, 0x00, 0x90, 0x01, 0x78, 0x7c,
-- 0x23, 0xbf, 0x40, 0x1c, 0x23, 0xfe, 0x40, 0x1c,
-- 0x20, 0x00, 0x90, 0x03, 0x98, 0x01, 0x06, 0x00,
-- 0x0e, 0x00, 0x99, 0x0c, 0x42, 0x88, 0xd0, 0x08,
-- 0x06, 0x20, 0x0e, 0x00, 0x24, 0x01, 0x43, 0x04,
-- 0x20, 0x01, 0x90, 0x03, 0x23, 0xdf, 0x40, 0x1c,
-- 0xe0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x03,
-- 0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, 0xe7, 0xbd,
-- 0x23, 0xfd, 0x40, 0x1c, 0x98, 0x05, 0x23, 0x04,
-- 0x40, 0x18, 0xd0, 0x73, 0x6a, 0xfd, 0x98, 0x03,
-- 0x28, 0x00, 0xd0, 0x14, 0x26, 0x00, 0x2e, 0x08,
-- 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x70, 0x06, 0x06,
-- 0x0e, 0x36, 0xe7, 0xf8, 0x00, 0xb0, 0x19, 0x40,
-- 0x68, 0x40, 0x00, 0xb1, 0x19, 0x49, 0x64, 0x48,
-- 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0x62, 0x48,
-- 0xe7, 0xf0, 0x88, 0x28, 0x80, 0x68, 0x20, 0x20,
-- 0x40, 0x20, 0xd1, 0x3e, 0x99, 0x0e, 0x79, 0xc8,
-- 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x0a,
-- 0x99, 0x0e, 0x79, 0xc8, 0x06, 0xc0, 0x0e, 0xc0,
-- 0x90, 0x09, 0x98, 0x0a, 0x30, 0x01, 0x06, 0x06,
-- 0x0e, 0x36, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x10,
-- 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xe7, 0xf8,
-- 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0xe0, 0x01,
-- 0xe0, 0x9d, 0xe0, 0x9c, 0x64, 0x48, 0x88, 0x68,
-- 0x21, 0x80, 0x41, 0x31, 0x43, 0x88, 0x80, 0x68,
-- 0xe7, 0xee, 0x98, 0x0a, 0x00, 0x80, 0x19, 0x40,
-- 0x6c, 0x41, 0x98, 0x09, 0x00, 0x80, 0x4a, 0x4b,
-- 0x58, 0x10, 0x40, 0x08, 0x99, 0x0a, 0x00, 0x89,
-- 0x19, 0x49, 0x64, 0x48, 0x06, 0x20, 0x0e, 0x00,
-- 0x24, 0x20, 0x43, 0x04, 0x98, 0x01, 0x0a, 0x00,
-- 0x02, 0x00, 0x90, 0x01, 0x98, 0x01, 0x99, 0x0c,
-- 0x43, 0x08, 0x90, 0x01, 0x98, 0x01, 0x99, 0x02,
-- 0x60, 0x08, 0x78, 0x38, 0x23, 0x80, 0x40, 0x18,
-- 0xd0, 0x19, 0x99, 0x0e, 0x7b, 0x08, 0x07, 0x42,
-- 0x0f, 0x52, 0x92, 0x07, 0x99, 0x0e, 0x7b, 0x08,
-- 0x08, 0xc0, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x08,
-- 0x1d, 0xe9, 0x31, 0x3d, 0x91, 0x06, 0x99, 0x06,
-- 0x9a, 0x08, 0x5c, 0x88, 0x49, 0x36, 0x9a, 0x07,
-- 0x5c, 0x89, 0xe0, 0x00, 0xe0, 0x4e, 0x40, 0x08,
-- 0x99, 0x06, 0x9a, 0x08, 0x54, 0x88, 0x99, 0x0e,
-- 0x79, 0x88, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x00,
-- 0x98, 0x00, 0x49, 0x30, 0x40, 0xc1, 0x91, 0x00,
-- 0x99, 0x0e, 0x79, 0x88, 0x09, 0x40, 0x06, 0x02,
-- 0x0e, 0x12, 0x92, 0x0b, 0x9a, 0x0b, 0x00, 0x90,
-- 0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, 0x40, 0x08,
-- 0xd0, 0x33, 0x06, 0x20, 0x0e, 0x00, 0x24, 0x40,
-- 0x43, 0x04, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40,
-- 0x6c, 0x40, 0x99, 0x00, 0x40, 0x41, 0x00, 0x90,
-- 0x19, 0x40, 0x64, 0x41, 0x9a, 0x0b, 0x00, 0x90,
-- 0x19, 0x40, 0x6a, 0x40, 0x99, 0x00, 0x43, 0x01,
-- 0x00, 0x90, 0x19, 0x40, 0x62, 0x41, 0x9a, 0x0b,
-- 0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x28, 0x00,
-- 0xd1, 0x17, 0x88, 0x68, 0x9a, 0x0b, 0x21, 0x80,
-- 0x41, 0x11, 0x43, 0x88, 0x80, 0x68, 0x88, 0x68,
-- 0x28, 0x00, 0xd1, 0x0e, 0x06, 0x20, 0x0e, 0x00,
-- 0x24, 0x02, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c,
-- 0x98, 0x0c, 0x30, 0x02, 0x06, 0x00, 0x0e, 0x00,
-- 0x90, 0x0c, 0x98, 0x0c, 0x23, 0x3e, 0x40, 0x18,
-- 0x90, 0x0c, 0xe0, 0x0a, 0x06, 0x20, 0x0e, 0x00,
-- 0x24, 0x40, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c,
-- 0x98, 0x0c, 0x1c, 0x41, 0x98, 0x04, 0xf0, 0x00,
-- 0xf8, 0x13, 0x9a, 0x0f, 0x70, 0x14, 0x70, 0x7c,
-- 0x20, 0x00, 0xb0, 0x0d, 0xe6, 0xe2, 0x20, 0xb1,
-- 0xb0, 0x0d, 0xe6, 0xdf, 0xb0, 0x0d, 0xe6, 0xdd,
-- 0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x20, 0x10,
-- 0x2e, 0x08, 0x20, 0x90, 0x80, 0x00, 0x00, 0x00,
-- 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f,
-- 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x00, 0xf8,
-- 0x4b, 0x13, 0x18, 0xc5, 0x01, 0x38, 0x4b, 0x13,
-- 0x18, 0xc4, 0x01, 0x38, 0x4b, 0x12, 0x18, 0xc2,
-- 0x68, 0x10, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18,
-- 0x60, 0x10, 0x2e, 0x3e, 0xdc, 0x15, 0x68, 0x20,
-- 0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x31,
-- 0x60, 0x21, 0x68, 0x28, 0x1c, 0x01, 0x0a, 0x09,
-- 0x02, 0x09, 0x23, 0x3e, 0x43, 0x19, 0x60, 0x29,
-- 0x68, 0x10, 0x23, 0x40, 0x43, 0x18, 0x60, 0x10,
-- 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x20, 0xbd, 0xe7, 0xf9, 0xe7, 0xf8,
-- 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00,
-- 0x64, 0x00, 0x08, 0x08, 0xb5, 0xf3, 0xb0, 0x93,
-- 0x98, 0x13, 0x69, 0x00, 0x90, 0x01, 0x98, 0x01,
-- 0x78, 0x40, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05,
-- 0x20, 0xbe, 0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x78, 0x80,
-- 0x90, 0x08, 0x98, 0x08, 0x23, 0x40, 0x40, 0x18,
-- 0xd0, 0x73, 0x98, 0x08, 0x23, 0x20, 0x40, 0x18,
-- 0xd0, 0x6f, 0x98, 0x01, 0x6b, 0x07, 0x98, 0x01,
-- 0x79, 0xc0, 0x00, 0x80, 0x49, 0x76, 0x58, 0x08,
-- 0x90, 0x00, 0x98, 0x00, 0x68, 0xc0, 0x1c, 0x06,
-- 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xe1,
-- 0x78, 0xb0, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x02,
-- 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xda, 0xa9, 0x11,
-- 0x1c, 0x30, 0xf0, 0x00, 0xf9, 0x2b, 0x90, 0x02,
-- 0x98, 0x11, 0x28, 0x00, 0xd1, 0x02, 0x98, 0x02,
-- 0xb0, 0x13, 0xe7, 0xcf, 0x98, 0x11, 0x90, 0x0e,
-- 0x20, 0x01, 0x90, 0x0b, 0x98, 0x13, 0x88, 0x40,
-- 0x90, 0x0d, 0x98, 0x13, 0x68, 0x40, 0x90, 0x06,
-- 0x98, 0x13, 0x68, 0x81, 0x91, 0x10, 0x99, 0x10,
-- 0x1d, 0xc8, 0x30, 0xb9, 0x90, 0x05, 0x98, 0x05,
-- 0x99, 0x06, 0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24,
-- 0x99, 0x14, 0x79, 0x88, 0x90, 0x03, 0x98, 0x03,
-- 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x0a, 0x98, 0x0a,
-- 0x49, 0x5a, 0x40, 0xc1, 0x91, 0x0a, 0x98, 0x03,
-- 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x09,
-- 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x6b, 0x80,
-- 0x99, 0x0a, 0x40, 0x08, 0xd0, 0x02, 0x20, 0xb1,
-- 0xb0, 0x13, 0xe7, 0x9f, 0x20, 0xb8, 0x90, 0x0c,
-- 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x20, 0x00,
-- 0x90, 0x07, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x10,
-- 0x99, 0x10, 0x68, 0x09, 0x91, 0x10, 0x99, 0x10,
-- 0x1d, 0x08, 0x90, 0x12, 0x98, 0x12, 0x78, 0x80,
-- 0x99, 0x10, 0x18, 0x40, 0x90, 0x06, 0x98, 0x12,
-- 0x78, 0x81, 0x20, 0xc0, 0x1a, 0x40, 0x04, 0x04,
-- 0x0c, 0x24, 0x98, 0x0d, 0x42, 0x84, 0xdb, 0x05,
-- 0xe0, 0x00, 0xe0, 0x7c, 0x9c, 0x0d, 0x20, 0x00,
-- 0x90, 0x0d, 0xe0, 0x06, 0x98, 0x0d, 0x1b, 0x00,
-- 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x01,
-- 0x90, 0x07, 0x98, 0x0c, 0x42, 0xa0, 0xda, 0x2e,
-- 0x25, 0x00, 0x98, 0x0c, 0x42, 0x85, 0xdb, 0x04,
-- 0xe0, 0x0c, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d,
-- 0xe7, 0xf7, 0x98, 0x06, 0x78, 0x01, 0x30, 0x01,
-- 0x90, 0x06, 0x98, 0x04, 0x70, 0x01, 0x30, 0x01,
-- 0x90, 0x04, 0xe7, 0xf2, 0x98, 0x0c, 0x1a, 0x20,
-- 0x04, 0x04, 0x0c, 0x24, 0xa9, 0x11, 0x1c, 0x30,
-- 0xf0, 0x00, 0xf8, 0xac, 0x90, 0x02, 0x98, 0x11,
-- 0x28, 0x00, 0xd1, 0x08, 0x98, 0x0e, 0x60, 0xb0,
-- 0x68, 0x70, 0x99, 0x0b, 0x18, 0x40, 0x60, 0x70,
-- 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x4a, 0x98, 0x0b,
-- 0x30, 0x01, 0x90, 0x0b, 0x20, 0xb8, 0x90, 0x0c,
-- 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x25, 0x00,
-- 0x42, 0xa5, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68,
-- 0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf8, 0x98, 0x06,
-- 0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04,
-- 0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2,
-- 0x98, 0x0c, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00,
-- 0x90, 0x0c, 0x98, 0x0d, 0x28, 0x00, 0xd1, 0x90,
-- 0x6b, 0x39, 0x91, 0x0f, 0x6a, 0xf8, 0x28, 0x00,
-- 0xd1, 0x02, 0x98, 0x0e, 0x62, 0xf8, 0xe0, 0x05,
-- 0x98, 0x0e, 0x99, 0x0f, 0x60, 0x08, 0x98, 0x0e,
-- 0x6d, 0xb9, 0x60, 0x08, 0x98, 0x09, 0x00, 0x80,
-- 0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x43, 0x01,
-- 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x63, 0x81,
-- 0x6b, 0x78, 0x99, 0x0b, 0x18, 0x40, 0x63, 0x78,
-- 0x20, 0x00, 0x99, 0x11, 0x60, 0x08, 0x98, 0x11,
-- 0x63, 0x38, 0x98, 0x0e, 0x30, 0x04, 0x65, 0xb8,
-- 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x02, 0x20, 0xb1,
-- 0xb0, 0x13, 0xe6, 0xff, 0xb0, 0x13, 0xe6, 0xfd,
-- 0x2e, 0x08, 0x5e, 0x5c, 0x80, 0x00, 0x00, 0x00,
-- 0xb4, 0xf0, 0x1c, 0x01, 0x78, 0x88, 0x23, 0x20,
-- 0x40, 0x18, 0xd0, 0x42, 0x79, 0xc8, 0x00, 0x80,
-- 0x4b, 0x21, 0x58, 0x1d, 0x6b, 0x0a, 0x68, 0xef,
-- 0x68, 0x10, 0x28, 0x00, 0xd0, 0x17, 0x68, 0xfe,
-- 0x68, 0x10, 0x60, 0x30, 0x68, 0x50, 0x60, 0xf8,
-- 0x68, 0x78, 0x68, 0x93, 0x18, 0xc0, 0x60, 0x78,
-- 0x20, 0x00, 0x60, 0x10, 0x20, 0x00, 0x60, 0x50,
-- 0x20, 0x00, 0x60, 0x90, 0x68, 0x78, 0x78, 0x3b,
-- 0x42, 0x98, 0xd9, 0x04, 0x78, 0xb8, 0x23, 0x02,
-- 0x43, 0xdb, 0x40, 0x18, 0x70, 0xb8, 0x6a, 0xd0,
-- 0x60, 0x10, 0x6b, 0x10, 0x60, 0x50, 0x6b, 0x50,
-- 0x60, 0x90, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04,
-- 0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24,
-- 0xe7, 0xf8, 0x00, 0xa0, 0x18, 0x80, 0x6b, 0x80,
-- 0x00, 0xa3, 0x18, 0x9b, 0x60, 0xd8, 0x23, 0x00,
-- 0x00, 0xa0, 0x18, 0x80, 0x63, 0x83, 0xe7, 0xf0,
-- 0x20, 0x00, 0x62, 0xd0, 0x20, 0x00, 0x63, 0x10,
-- 0x20, 0x00, 0x63, 0x50, 0x20, 0x00, 0xbc, 0xf0,
-- 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa,
-- 0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02,
-- 0x1c, 0x0f, 0x78, 0x14, 0x68, 0x90, 0x1c, 0x01,
-- 0xd1, 0x08, 0x20, 0x00, 0x60, 0x38, 0x78, 0x90,
-- 0x23, 0x01, 0x43, 0x18, 0x70, 0x90, 0x20, 0xb7,
-- 0xbc, 0x90, 0x47, 0x70, 0x68, 0x08, 0x60, 0x90,
-- 0x20, 0x00, 0x60, 0x48, 0x60, 0x39, 0x68, 0x50,
-- 0x38, 0x01, 0x60, 0x50, 0x68, 0x50, 0x42, 0xa0,
-- 0xd1, 0x02, 0x20, 0xbf, 0xe7, 0xf0, 0xe0, 0x01,
-- 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00,
-- 0x1c, 0x01, 0x22, 0x00, 0x6a, 0x50, 0x68, 0x02,
-- 0x60, 0x0a, 0x4a, 0x05, 0x6f, 0xd2, 0x60, 0x8a,
-- 0x4a, 0x04, 0x68, 0x12, 0x60, 0x4a, 0x22, 0x1d,
-- 0x02, 0x92, 0x68, 0x12, 0x60, 0xca, 0x47, 0x70,
-- 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x1f, 0xa4,
-- 0x1c, 0x01, 0x48, 0x02, 0x60, 0x01, 0x20, 0x00,
-- 0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x01, 0x00,
-- 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x62, 0x01,
-- 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01,
-- 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x7f,
-- 0x03, 0x9b, 0x40, 0x18, 0x03, 0x8a, 0x43, 0x10,
-- 0x22, 0x33, 0x06, 0x52, 0x62, 0xd0, 0x20, 0x00,
-- 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33,
-- 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x03, 0x03, 0x1b,
-- 0x40, 0x18, 0x43, 0x08, 0x22, 0x33, 0x06, 0x52,
-- 0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd,
-- 0x1c, 0x01, 0x06, 0x0a, 0x0e, 0x12, 0x2a, 0x00,
-- 0xd0, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0,
-- 0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, 0xe0, 0x04,
-- 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x4b, 0x04,
-- 0x40, 0x18, 0x23, 0x33, 0x06, 0x5b, 0x62, 0xd8,
-- 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00,
-- 0xff, 0xdf, 0xff, 0xff, 0x48, 0x04, 0x69, 0x80,
-- 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xff,
-- 0x47, 0x70, 0x20, 0x00, 0xe7, 0xfc, 0xe7, 0xfb,
-- 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x01,
-- 0x06, 0x0f, 0x0e, 0x3f, 0x4a, 0x08, 0x2f, 0x00,
-- 0xd0, 0x03, 0x68, 0x10, 0x23, 0x01, 0x43, 0x18,
-- 0xe0, 0x02, 0x68, 0x10, 0x08, 0x40, 0x00, 0x40,
-- 0x68, 0x13, 0x43, 0x18, 0x60, 0x10, 0x20, 0x00,
-- 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x98, 0xb4, 0x80, 0x1c, 0x07,
-- 0x1c, 0x0a, 0x4b, 0x06, 0x40, 0x1a, 0x4b, 0x06,
-- 0x40, 0x1f, 0x0b, 0x10, 0x02, 0x39, 0x43, 0x08,
-- 0x49, 0x04, 0x61, 0xc8, 0x20, 0x00, 0xbc, 0x80,
-- 0x47, 0x70, 0xe7, 0xfc, 0x01, 0xff, 0xf0, 0x00,
-- 0x00, 0xff, 0xf0, 0x00, 0x66, 0x00, 0x00, 0x80,
-- 0x48, 0x01, 0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd,
-- 0x66, 0x00, 0x00, 0x80, 0x1c, 0x01, 0x48, 0x07,
-- 0x68, 0x02, 0x4b, 0x07, 0x40, 0x1a, 0x60, 0x02,
-- 0x23, 0x01, 0x05, 0x9b, 0x42, 0x99, 0xd1, 0x03,
-- 0x48, 0x02, 0x68, 0x02, 0x43, 0x0a, 0x60, 0x02,
-- 0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x2c,
-- 0xff, 0xbf, 0xff, 0xff, 0x1c, 0x01, 0x20, 0x33,
-- 0x06, 0x40, 0x67, 0x41, 0x47, 0x70, 0x1c, 0x01,
-- 0x20, 0x33, 0x06, 0x40, 0x67, 0x81, 0x47, 0x70,
-- 0xb5, 0x90, 0x4c, 0x21, 0x20, 0x01, 0x60, 0x20,
-- 0xf0, 0x11, 0xfb, 0x6a, 0x48, 0x1f, 0x69, 0x84,
-- 0x27, 0x00, 0x2f, 0x04, 0xd3, 0x04, 0xe0, 0x06,
-- 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8,
-- 0x21, 0x00, 0xc4, 0x02, 0xe7, 0xf8, 0x20, 0x00,
-- 0x49, 0x18, 0x69, 0x49, 0x60, 0x08, 0x20, 0x00,
-- 0x49, 0x16, 0x69, 0x49, 0x60, 0x48, 0x20, 0x00,
-- 0x49, 0x14, 0x69, 0x49, 0x60, 0x88, 0x20, 0x00,
-- 0x49, 0x12, 0x69, 0x49, 0x60, 0xc8, 0x20, 0x00,
-- 0x49, 0x10, 0x69, 0x49, 0x61, 0x08, 0x20, 0x00,
-- 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x20, 0x00,
-- 0x49, 0x0c, 0x69, 0x49, 0x61, 0x88, 0x20, 0x00,
-- 0x49, 0x0a, 0x69, 0x49, 0x61, 0xc8, 0x20, 0x00,
-- 0x49, 0x08, 0x69, 0x49, 0x62, 0x08, 0x20, 0x00,
-- 0x49, 0x06, 0x69, 0x49, 0x62, 0x48, 0x20, 0x18,
-- 0x49, 0x04, 0x69, 0x49, 0x62, 0x88, 0x20, 0x00,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb,
-- 0x70, 0x00, 0x00, 0x38, 0x2e, 0x08, 0x1f, 0xa8,
-- 0xb5, 0xff, 0x1c, 0x0f, 0xb0, 0x81, 0x9c, 0x01,
-- 0x69, 0x20, 0x28, 0x08, 0xd1, 0x01, 0x08, 0x7f,
-- 0x00, 0x7f, 0x6b, 0xa0, 0x9a, 0x03, 0x43, 0x50,
-- 0x19, 0xc6, 0x69, 0x20, 0x00, 0x80, 0x49, 0x34,
-- 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00,
-- 0x08, 0x76, 0x69, 0x20, 0x00, 0x80, 0x49, 0x31,
-- 0x58, 0x08, 0x43, 0x70, 0x90, 0x00, 0x69, 0xa0,
-- 0x99, 0x00, 0x09, 0x49, 0x18, 0x45, 0x6b, 0xe0,
-- 0x28, 0x00, 0xd1, 0x02, 0x03, 0x28, 0x0b, 0x00,
-- 0xe0, 0x01, 0x02, 0x28, 0x0a, 0x00, 0x1c, 0x05,
-- 0xf0, 0x11, 0xfb, 0x08, 0xf0, 0x11, 0xfa, 0xe4,
-- 0x48, 0x27, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0,
-- 0x00, 0xc0, 0x49, 0x25, 0x69, 0x89, 0x60, 0x08,
-- 0x07, 0x40, 0x48, 0x23, 0x69, 0x80, 0x68, 0x00,
-- 0x01, 0x40, 0x09, 0x40, 0x49, 0x20, 0x69, 0x89,
-- 0x60, 0x08, 0x6b, 0xe0, 0x49, 0x1e, 0x69, 0x89,
-- 0x68, 0x09, 0x4b, 0x1e, 0x40, 0x19, 0x07, 0xc0,
-- 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1a, 0x69, 0x89,
-- 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x21,
-- 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0x51, 0x48, 0x16,
-- 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x16, 0x40, 0x18,
-- 0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08,
-- 0x49, 0x11, 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80,
-- 0x48, 0x0f, 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40,
-- 0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, 0x43, 0x08,
-- 0x49, 0x0b, 0x69, 0xc9, 0x60, 0x08, 0x99, 0x04,
-- 0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, 0xfe, 0xbc,
-- 0xf0, 0x00, 0xff, 0x9d, 0xf0, 0x11, 0xfa, 0xda,
-- 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9,
-- 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54,
-- 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff,
-- 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0f,
-- 0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08,
-- 0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0,
-- 0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20,
-- 0x00, 0x80, 0x49, 0x37, 0x58, 0x08, 0x23, 0x04,
-- 0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20,
-- 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x43, 0x70,
-- 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49,
-- 0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02,
-- 0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28,
-- 0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x11, 0xfa, 0x86,
-- 0xf0, 0x11, 0xfa, 0x62, 0x48, 0x2a, 0x69, 0x80,
-- 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x01,
-- 0x43, 0x18, 0x49, 0x27, 0x69, 0x89, 0x60, 0x08,
-- 0x07, 0x40, 0x6b, 0xe0, 0x49, 0x24, 0x69, 0x89,
-- 0x68, 0x09, 0x4b, 0x24, 0x40, 0x19, 0x07, 0xc0,
-- 0x0c, 0x80, 0x43, 0x08, 0x49, 0x20, 0x69, 0x89,
-- 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x48, 0x1e,
-- 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40,
-- 0x99, 0x00, 0x06, 0xc9, 0x43, 0x01, 0x48, 0x1a,
-- 0x69, 0x80, 0x60, 0x01, 0x1c, 0x21, 0x1c, 0x20,
-- 0xf0, 0x00, 0xfd, 0xca, 0x48, 0x16, 0x69, 0xc0,
-- 0x68, 0x00, 0x4b, 0x17, 0x40, 0x18, 0x02, 0x29,
-- 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x12,
-- 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x10,
-- 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40,
-- 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 0xf0, 0x00,
-- 0xff, 0x1e, 0xf0, 0x11, 0xfa, 0x39, 0x48, 0x0a,
-- 0x6b, 0x81, 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0xf0,
-- 0x9b, 0x04, 0x60, 0x18, 0xf0, 0x11, 0xfa, 0x52,
-- 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9,
-- 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54,
-- 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff,
-- 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0c,
-- 0x1c, 0x1f, 0xb0, 0x83, 0x9d, 0x03, 0x6b, 0x28,
-- 0x6a, 0xa9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00,
-- 0x19, 0xe0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01,
-- 0x98, 0x00, 0x1b, 0x07, 0x69, 0x28, 0x28, 0x08,
-- 0xd1, 0x02, 0x08, 0x7f, 0x08, 0x64, 0x00, 0x64,
-- 0x6b, 0xa8, 0x9a, 0x05, 0x43, 0x50, 0x19, 0x01,
-- 0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x38,
-- 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02,
-- 0x99, 0x01, 0x08, 0x49, 0x91, 0x01, 0x69, 0x28,
-- 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x99, 0x01,
-- 0x43, 0x48, 0x90, 0x02, 0x69, 0xa8, 0x99, 0x02,
-- 0x09, 0x49, 0x18, 0x46, 0x6b, 0xe8, 0x28, 0x00,
-- 0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01,
-- 0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11,
-- 0xf9, 0xed, 0xf0, 0x11, 0xf9, 0xc9, 0x48, 0x2a,
-- 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40,
-- 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 0x48, 0x26,
-- 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0,
-- 0x23, 0x02, 0x43, 0x18, 0x49, 0x22, 0x69, 0x89,
-- 0x60, 0x08, 0x07, 0x40, 0x6b, 0xe8, 0x49, 0x20,
-- 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1f, 0x40, 0x19,
-- 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1c,
-- 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0,
-- 0x1c, 0x29, 0x1c, 0x28, 0xf0, 0x00, 0xfd, 0x34,
-- 0x48, 0x17, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x18,
-- 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89,
-- 0x43, 0x08, 0x49, 0x13, 0x69, 0xc9, 0x60, 0x08,
-- 0x01, 0x80, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00,
-- 0x01, 0x40, 0x09, 0x40, 0x99, 0x02, 0x06, 0xc9,
-- 0x43, 0x08, 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08,
-- 0x99, 0x0c, 0x1c, 0x28, 0x22, 0x02, 0xf0, 0x00,
-- 0xfd, 0x9f, 0x48, 0x09, 0x69, 0x40, 0x62, 0x07,
-- 0xf0, 0x00, 0xfe, 0x7d, 0xf0, 0x11, 0xf9, 0xba,
-- 0x20, 0x00, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x03, 0xe7, 0xf9,
-- 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54,
-- 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff,
-- 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0xb0, 0x81,
-- 0x9f, 0x01, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40,
-- 0x30, 0x01, 0x90, 0x00, 0x9a, 0x03, 0x9b, 0x04,
-- 0x18, 0xd0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03,
-- 0x98, 0x00, 0x9a, 0x03, 0x1a, 0x83, 0x93, 0x04,
-- 0x69, 0x38, 0x28, 0x08, 0xd1, 0x03, 0x99, 0x02,
-- 0x08, 0x49, 0x00, 0x49, 0x91, 0x02, 0x6b, 0xb8,
-- 0x9a, 0x03, 0x43, 0x50, 0x99, 0x02, 0x18, 0x45,
-- 0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08,
-- 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 0x08, 0x6d,
-- 0x69, 0x38, 0x00, 0x80, 0x49, 0x39, 0x58, 0x08,
-- 0x1c, 0x06, 0x43, 0x6e, 0x69, 0xb8, 0x09, 0x71,
-- 0x18, 0x44, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02,
-- 0x03, 0x20, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x20,
-- 0x0a, 0x00, 0x1c, 0x04, 0xf0, 0x11, 0xf9, 0x56,
-- 0xf0, 0x11, 0xf9, 0x32, 0x48, 0x30, 0x69, 0x80,
-- 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x2e,
-- 0x69, 0x89, 0x60, 0x08, 0x48, 0x2c, 0x69, 0x80,
-- 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x03,
-- 0x43, 0x18, 0x49, 0x29, 0x69, 0x89, 0x60, 0x08,
-- 0x07, 0x40, 0x6b, 0xf8, 0x49, 0x26, 0x69, 0x89,
-- 0x68, 0x09, 0x4b, 0x26, 0x40, 0x19, 0x07, 0xc0,
-- 0x0c, 0x80, 0x43, 0x08, 0x49, 0x22, 0x69, 0x89,
-- 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x39,
-- 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x9d, 0x99, 0x0a,
-- 0x1c, 0x38, 0x22, 0x03, 0xf0, 0x00, 0xfd, 0x20,
-- 0x69, 0xf8, 0x49, 0x1b, 0x69, 0x49, 0x61, 0x08,
-- 0x48, 0x19, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x1a,
-- 0x40, 0x18, 0x02, 0x21, 0x0a, 0x09, 0x00, 0x89,
-- 0x43, 0x08, 0x49, 0x15, 0x69, 0xc9, 0x60, 0x08,
-- 0x01, 0x80, 0x48, 0x13, 0x69, 0xc0, 0x68, 0x00,
-- 0x01, 0x40, 0x09, 0x40, 0x06, 0xf1, 0x43, 0x08,
-- 0x49, 0x0f, 0x69, 0xc9, 0x60, 0x08, 0x48, 0x0e,
-- 0x69, 0x40, 0x61, 0x84, 0x06, 0xf0, 0x0e, 0xc0,
-- 0x49, 0x0b, 0x69, 0x49, 0x61, 0x48, 0x9b, 0x04,
-- 0x48, 0x09, 0x69, 0x40, 0x62, 0x43, 0xf0, 0x00,
-- 0xfd, 0xda, 0xf0, 0x11, 0xf9, 0x17, 0x20, 0x00,
-- 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00,
-- 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54,
-- 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff,
-- 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xf3, 0xb0, 0x86,
-- 0x9f, 0x06, 0x99, 0x07, 0x68, 0x8c, 0x99, 0x07,
-- 0x68, 0xc8, 0x90, 0x03, 0x99, 0x07, 0x68, 0x0d,
-- 0x99, 0x07, 0x68, 0x49, 0x91, 0x02, 0x6b, 0x78,
-- 0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01,
-- 0x6b, 0x38, 0x6a, 0xb9, 0x1a, 0x40, 0x30, 0x01,
-- 0x90, 0x00, 0x99, 0x02, 0x98, 0x03, 0x18, 0x08,
-- 0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01,
-- 0x99, 0x02, 0x1a, 0x40, 0x90, 0x03, 0x19, 0x28,
-- 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 0x98, 0x00,
-- 0x1b, 0x44, 0x69, 0x38, 0x28, 0x08, 0xd1, 0x02,
-- 0x08, 0x64, 0x08, 0x6d, 0x00, 0x6d, 0x6b, 0xb8,
-- 0x99, 0x02, 0x43, 0x48, 0x19, 0x41, 0x91, 0x04,
-- 0x69, 0x38, 0x00, 0x80, 0x49, 0x41, 0x58, 0x08,
-- 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04,
-- 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80,
-- 0x49, 0x3d, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48,
-- 0x90, 0x05, 0x69, 0xb8, 0x99, 0x05, 0x09, 0x49,
-- 0x18, 0x46, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02,
-- 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30,
-- 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11, 0xf8, 0x9a,
-- 0xf0, 0x11, 0xf8, 0x76, 0x48, 0x33, 0x69, 0x80,
-- 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x31,
-- 0x69, 0x89, 0x60, 0x08, 0x48, 0x2f, 0x69, 0x80,
-- 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x04,
-- 0x43, 0x18, 0x49, 0x2c, 0x69, 0x89, 0x60, 0x08,
-- 0x07, 0x40, 0x48, 0x2a, 0x69, 0xc0, 0x68, 0x00,
-- 0x01, 0x40, 0x09, 0x40, 0x99, 0x05, 0x06, 0xc9,
-- 0x43, 0x08, 0x49, 0x26, 0x69, 0xc9, 0x60, 0x08,
-- 0x48, 0x24, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x24,
-- 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89,
-- 0x43, 0x08, 0x49, 0x20, 0x69, 0xc9, 0x60, 0x08,
-- 0x01, 0x80, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00,
-- 0xfb, 0xd7, 0x6b, 0xf8, 0x49, 0x1b, 0x69, 0x89,
-- 0x68, 0x09, 0x4b, 0x1c, 0x40, 0x19, 0x07, 0xc0,
-- 0x0c, 0x80, 0x43, 0x08, 0x49, 0x17, 0x69, 0x89,
-- 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x99, 0x07,
-- 0x69, 0x09, 0x1c, 0x38, 0x22, 0x04, 0xf0, 0x00,
-- 0xfc, 0x4b, 0x69, 0xf8, 0x49, 0x11, 0x69, 0x49,
-- 0x61, 0x08, 0x98, 0x05, 0x06, 0xc0, 0x0e, 0xc0,
-- 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x48, 0x0d,
-- 0x69, 0x40, 0x61, 0x86, 0x48, 0x0b, 0x69, 0x40,
-- 0x62, 0x04, 0x98, 0x03, 0x49, 0x09, 0x69, 0x49,
-- 0x62, 0x48, 0xf0, 0x00, 0xfd, 0x18, 0xf0, 0x11,
-- 0xf8, 0x55, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06,
-- 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04,
-- 0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8,
-- 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xdf, 0xff,
-- 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b,
-- 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x93,
-- 0x98, 0x14, 0x90, 0x12, 0x99, 0x15, 0x91, 0x11,
-- 0xaf, 0x0c, 0x1c, 0x38, 0x9a, 0x16, 0xca, 0x5e,
-- 0xc0, 0x5e, 0x68, 0x39, 0x91, 0x04, 0x68, 0x79,
-- 0x91, 0x03, 0x98, 0x12, 0x99, 0x11, 0x42, 0x88,
-- 0xd1, 0x73, 0x99, 0x03, 0x42, 0x8d, 0xd9, 0x71,
-- 0x68, 0xb8, 0x90, 0x01, 0x68, 0xf8, 0x90, 0x02,
-- 0x99, 0x11, 0x6b, 0x48, 0x6a, 0xc9, 0x1a, 0x40,
-- 0x1c, 0x44, 0x99, 0x11, 0x6b, 0x08, 0x6a, 0x89,
-- 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x98, 0x02,
-- 0x18, 0x28, 0x42, 0xa0, 0xd9, 0x01, 0x1b, 0x61,
-- 0x91, 0x02, 0x9b, 0x17, 0x98, 0x01, 0x18, 0x18,
-- 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00,
-- 0x9b, 0x17, 0x1a, 0xc0, 0x90, 0x01, 0x98, 0x01,
-- 0x60, 0xb8, 0x98, 0x02, 0x60, 0xf8, 0x98, 0x12,
-- 0x69, 0xc0, 0x90, 0x0a, 0x98, 0x12, 0x6b, 0x80,
-- 0x99, 0x03, 0x43, 0x48, 0x99, 0x04, 0x18, 0x41,
-- 0x91, 0x05, 0x98, 0x12, 0x69, 0x00, 0x00, 0x80,
-- 0x49, 0x48, 0x58, 0x08, 0x99, 0x05, 0x43, 0x48,
-- 0x90, 0x0b, 0x98, 0x12, 0x69, 0x80, 0x99, 0x0b,
-- 0x09, 0x49, 0x18, 0x41, 0x91, 0x07, 0x98, 0x0a,
-- 0x99, 0x02, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x0b,
-- 0x09, 0x40, 0x99, 0x07, 0x18, 0x40, 0x90, 0x06,
-- 0x98, 0x06, 0x0b, 0xc0, 0x99, 0x07, 0x0b, 0xc9,
-- 0x1a, 0x40, 0x90, 0x09, 0x98, 0x09, 0x28, 0x00,
-- 0xd0, 0x56, 0x9e, 0x02, 0x98, 0x06, 0x04, 0x40,
-- 0x0c, 0x40, 0x01, 0x41, 0x91, 0x08, 0x99, 0x08,
-- 0x98, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x04,
-- 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 0x99, 0x03,
-- 0x98, 0x02, 0x18, 0x08, 0x1b, 0x00, 0x60, 0x78,
-- 0x60, 0xfc, 0x98, 0x02, 0x18, 0x28, 0x1b, 0x05,
-- 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19,
-- 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00,
-- 0xf8, 0x57, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09,
-- 0xe0, 0x01, 0xe0, 0x3c, 0xe0, 0x3b, 0x38, 0x01,
-- 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 0xd0, 0x1a,
-- 0x98, 0x0a, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04,
-- 0xf8, 0xf1, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80,
-- 0x60, 0x78, 0x60, 0xfc, 0x68, 0xf8, 0x1a, 0x2d,
-- 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19,
-- 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00,
-- 0xf8, 0x37, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09,
-- 0x38, 0x01, 0x90, 0x09, 0xe7, 0xe1, 0x68, 0x78,
-- 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfe, 0x68, 0xf8,
-- 0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06,
-- 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16,
-- 0xf0, 0x00, 0xf8, 0x22, 0xb0, 0x02, 0xe0, 0x09,
-- 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19,
-- 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00,
-- 0xf8, 0x17, 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13,
-- 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a,
-- 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0xb8,
-- 0xb0, 0x02, 0x20, 0x00, 0xb0, 0x14, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x13,
-- 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x54,
-- 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b,
-- 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x92,
-- 0x98, 0x13, 0x90, 0x11, 0x99, 0x14, 0x91, 0x10,
-- 0xaf, 0x0b, 0x1c, 0x38, 0x9a, 0x15, 0xca, 0x5e,
-- 0xc0, 0x5e, 0x68, 0x38, 0x90, 0x03, 0x68, 0x78,
-- 0x90, 0x02, 0x68, 0xb8, 0x90, 0x00, 0x68, 0xf9,
-- 0x91, 0x01, 0x98, 0x11, 0x69, 0xc0, 0x90, 0x09,
-- 0x99, 0x10, 0x6b, 0x88, 0x43, 0x68, 0x9b, 0x16,
-- 0x18, 0xc1, 0x91, 0x04, 0x99, 0x10, 0x69, 0x08,
-- 0x00, 0x80, 0x49, 0x42, 0x58, 0x08, 0x99, 0x04,
-- 0x43, 0x48, 0x90, 0x0a, 0x99, 0x10, 0x69, 0x88,
-- 0x99, 0x0a, 0x09, 0x49, 0x18, 0x40, 0x90, 0x06,
-- 0x98, 0x09, 0x99, 0x01, 0x43, 0x48, 0x90, 0x0a,
-- 0x98, 0x0a, 0x09, 0x40, 0x99, 0x06, 0x18, 0x40,
-- 0x90, 0x05, 0x98, 0x05, 0x0b, 0xc0, 0x99, 0x06,
-- 0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x08, 0x98, 0x08,
-- 0x28, 0x00, 0xd0, 0x53, 0x9e, 0x01, 0x98, 0x05,
-- 0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, 0x91, 0x07,
-- 0x99, 0x07, 0x98, 0x09, 0xf0, 0x04, 0xf8, 0x5e,
-- 0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01,
-- 0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x1b, 0x00,
-- 0x60, 0x78, 0x60, 0xfc, 0x99, 0x01, 0x18, 0x68,
-- 0x1b, 0x05, 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06,
-- 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15,
-- 0xf0, 0x00, 0xf8, 0x4a, 0xb0, 0x02, 0x1b, 0x36,
-- 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 0x98, 0x08,
-- 0x28, 0x00, 0xd0, 0x1a, 0x98, 0x09, 0x21, 0x01,
-- 0x03, 0x09, 0xf0, 0x04, 0xf8, 0x3b, 0x1c, 0x04,
-- 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc,
-- 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 0x1c, 0x29,
-- 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16,
-- 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x2d, 0xb0, 0x02,
-- 0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, 0x90, 0x08,
-- 0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78,
-- 0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12,
-- 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a,
-- 0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x18,
-- 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x12, 0x1c, 0x29,
-- 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16,
-- 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x0d, 0xb0, 0x02,
-- 0x20, 0x00, 0xb0, 0x13, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x12, 0xb0, 0x01,
-- 0xe7, 0xf8, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54,
-- 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02,
-- 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x8e, 0x9f, 0x0f,
-- 0x9c, 0x10, 0x9a, 0x11, 0x68, 0x10, 0x90, 0x07,
-- 0x9a, 0x11, 0x68, 0x50, 0x90, 0x06, 0x9a, 0x11,
-- 0x68, 0x91, 0x91, 0x08, 0x9a, 0x11, 0x68, 0xd0,
-- 0x90, 0x09, 0x6b, 0x60, 0x6a, 0xe1, 0x1a, 0x40,
-- 0x30, 0x01, 0x90, 0x01, 0x6b, 0x20, 0x6a, 0xa1,
-- 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x18,
-- 0x98, 0x09, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88,
-- 0xd9, 0x03, 0x98, 0x01, 0x99, 0x18, 0x1a, 0x41,
-- 0x91, 0x09, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58,
-- 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00,
-- 0x9b, 0x12, 0x1a, 0xc1, 0x91, 0x08, 0x22, 0x00,
-- 0x92, 0x05, 0x42, 0xa7, 0xd1, 0x20, 0x99, 0x18,
-- 0x98, 0x06, 0x42, 0x81, 0xd9, 0x0c, 0x22, 0x02,
-- 0x92, 0x05, 0x99, 0x06, 0x98, 0x09, 0x18, 0x08,
-- 0x1e, 0x41, 0x91, 0x06, 0x99, 0x18, 0x98, 0x09,
-- 0x18, 0x08, 0x1e, 0x41, 0x91, 0x18, 0xe0, 0x0f,
-- 0x9b, 0x12, 0x98, 0x07, 0x42, 0x83, 0xd9, 0x0b,
-- 0x22, 0x01, 0x92, 0x05, 0x98, 0x07, 0x99, 0x08,
-- 0x18, 0x40, 0x38, 0x01, 0x90, 0x07, 0x9b, 0x12,
-- 0x99, 0x08, 0x18, 0x58, 0x1e, 0x43, 0x93, 0x12,
-- 0x69, 0x38, 0x28, 0x08, 0xd1, 0x0a, 0x99, 0x08,
-- 0x08, 0x49, 0x91, 0x08, 0x98, 0x07, 0x08, 0x40,
-- 0x00, 0x40, 0x90, 0x07, 0x9b, 0x12, 0x08, 0x5b,
-- 0x00, 0x5b, 0x93, 0x12, 0x69, 0x38, 0x00, 0x80,
-- 0x49, 0xc6, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18,
-- 0x08, 0x80, 0x90, 0x03, 0x69, 0x20, 0x00, 0x80,
-- 0x49, 0xc2, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18,
-- 0x08, 0x80, 0x90, 0x02, 0x6b, 0xb8, 0x99, 0x06,
-- 0x43, 0x48, 0x99, 0x07, 0x18, 0x41, 0x91, 0x04,
-- 0x98, 0x03, 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04,
-- 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80,
-- 0x49, 0xb9, 0x58, 0x08, 0x99, 0x04, 0x1c, 0x06,
-- 0x43, 0x4e, 0x6b, 0xa0, 0x99, 0x18, 0x43, 0x48,
-- 0x9b, 0x12, 0x18, 0xc1, 0x91, 0x04, 0x98, 0x02,
-- 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49,
-- 0x91, 0x04, 0x69, 0x20, 0x00, 0x80, 0x49, 0xb0,
-- 0x58, 0x08, 0x99, 0x04, 0x1c, 0x05, 0x43, 0x4d,
-- 0x9a, 0x05, 0x2a, 0x01, 0xd1, 0x3d, 0x69, 0x38,
-- 0x28, 0x08, 0xd0, 0x3a, 0x69, 0x38, 0x28, 0x09,
-- 0xd0, 0x02, 0x69, 0x38, 0x28, 0x0a, 0xd1, 0x0a,
-- 0x36, 0x10, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41,
-- 0x91, 0x0b, 0x06, 0xf0, 0x0e, 0xc0, 0x1d, 0xc1,
-- 0x31, 0x01, 0x91, 0x0a, 0xe0, 0x0b, 0x69, 0xb8,
-- 0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0x38,
-- 0x00, 0x80, 0x49, 0x9f, 0x58, 0x08, 0x19, 0x86,
-- 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 0x69, 0x20,
-- 0x28, 0x09, 0xd0, 0x02, 0x69, 0x20, 0x28, 0x0a,
-- 0xd1, 0x0a, 0x35, 0x10, 0x69, 0xa0, 0x09, 0x69,
-- 0x18, 0x41, 0x91, 0x0d, 0x06, 0xe8, 0x0e, 0xc0,
-- 0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0c, 0xe0, 0x0b,
-- 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d,
-- 0x69, 0x20, 0x00, 0x80, 0x49, 0x90, 0x58, 0x08,
-- 0x19, 0x45, 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c,
-- 0xe0, 0x0d, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41,
-- 0x91, 0x0b, 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41,
-- 0x91, 0x0d, 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a,
-- 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 0x6b, 0xf8,
-- 0x28, 0x00, 0xd1, 0x03, 0x99, 0x0b, 0x03, 0x09,
-- 0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0b, 0x02, 0x09,
-- 0x0a, 0x09, 0x91, 0x0b, 0x6b, 0xe0, 0x28, 0x00,
-- 0xd1, 0x03, 0x99, 0x0d, 0x03, 0x09, 0x0b, 0x09,
-- 0xe0, 0x02, 0x99, 0x0d, 0x02, 0x09, 0x0a, 0x09,
-- 0x91, 0x0d, 0xf0, 0x10, 0xfd, 0x9b, 0xf0, 0x10,
-- 0xfd, 0x77, 0x48, 0x7a, 0x69, 0x80, 0x68, 0x00,
-- 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x05, 0x43, 0x18,
-- 0x49, 0x76, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40,
-- 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf8,
-- 0x98, 0x03, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x02,
-- 0x28, 0x00, 0xd0, 0x15, 0x48, 0x6f, 0x69, 0x80,
-- 0x68, 0x00, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x18,
-- 0x49, 0x6c, 0x69, 0x89, 0x60, 0x08, 0x07, 0x00,
-- 0x48, 0x6a, 0x69, 0x80, 0x68, 0x00, 0x4b, 0x6a,
-- 0x40, 0x18, 0x49, 0x68, 0x69, 0x89, 0x60, 0x08,
-- 0x05, 0xc0, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08,
-- 0x6b, 0xf8, 0x49, 0x64, 0x69, 0x89, 0x68, 0x09,
-- 0x4b, 0x64, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x40,
-- 0x43, 0x08, 0x49, 0x60, 0x69, 0x89, 0x60, 0x08,
-- 0x04, 0x40, 0x0f, 0xc0, 0x6b, 0xe0, 0x49, 0x5d,
-- 0x69, 0x89, 0x68, 0x09, 0x4b, 0x5e, 0x40, 0x19,
-- 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x59,
-- 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0,
-- 0x68, 0x38, 0x28, 0x00, 0xd0, 0x0d, 0x79, 0x38,
-- 0x49, 0x54, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x57,
-- 0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, 0x49, 0x51,
-- 0x69, 0x89, 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00,
-- 0xe0, 0x0d, 0x6a, 0x78, 0x78, 0x00, 0x49, 0x4d,
-- 0x69, 0x89, 0x68, 0x09, 0x4b, 0x4f, 0x40, 0x19,
-- 0x03, 0xc0, 0x43, 0x08, 0x49, 0x49, 0x69, 0x89,
-- 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 0x69, 0x20,
-- 0x00, 0x80, 0x49, 0x45, 0x58, 0x08, 0x99, 0x08,
-- 0x43, 0x48, 0x28, 0x40, 0xd9, 0x01, 0x21, 0x00,
-- 0xe0, 0x00, 0x21, 0x01, 0x1c, 0x08, 0x49, 0x41,
-- 0x69, 0x89, 0x68, 0x09, 0x4b, 0x44, 0x40, 0x19,
-- 0x07, 0xc2, 0x09, 0x52, 0x43, 0x11, 0x4a, 0x3d,
-- 0x69, 0x92, 0x60, 0x11, 0x01, 0x49, 0x0f, 0xc9,
-- 0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x3f,
-- 0x40, 0x19, 0x9a, 0x05, 0x07, 0x92, 0x0f, 0x92,
-- 0x05, 0xd2, 0x43, 0x11, 0x4a, 0x35, 0x69, 0x92,
-- 0x60, 0x11, 0x01, 0xc9, 0x49, 0x33, 0x69, 0x89,
-- 0x68, 0x09, 0x4b, 0x39, 0x40, 0x19, 0x9a, 0x0e,
-- 0x07, 0xd2, 0x09, 0x92, 0x43, 0x11, 0x4a, 0x2f,
-- 0x69, 0x92, 0x60, 0x11, 0x01, 0x89, 0x69, 0xf9,
-- 0x4a, 0x2c, 0x69, 0x52, 0x60, 0x11, 0x49, 0x2b,
-- 0x69, 0x89, 0x68, 0x09, 0x01, 0x49, 0x09, 0x49,
-- 0x9a, 0x0a, 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x27,
-- 0x69, 0x92, 0x60, 0x11, 0x99, 0x0a, 0x4a, 0x25,
-- 0x69, 0x52, 0x60, 0x51, 0x99, 0x0b, 0x4a, 0x23,
-- 0x69, 0x52, 0x60, 0x91, 0x99, 0x0b, 0x4a, 0x21,
-- 0x69, 0x52, 0x60, 0xd1, 0x69, 0xe1, 0x4a, 0x1f,
-- 0x69, 0x52, 0x61, 0x11, 0x49, 0x1d, 0x69, 0xc9,
-- 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 0x9a, 0x0c,
-- 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x19, 0x69, 0xd2,
-- 0x60, 0x11, 0x99, 0x0c, 0x4a, 0x17, 0x69, 0x52,
-- 0x61, 0x51, 0x99, 0x0d, 0x4a, 0x15, 0x69, 0x52,
-- 0x61, 0x91, 0x99, 0x0d, 0x4a, 0x13, 0x69, 0x52,
-- 0x61, 0xd1, 0x99, 0x09, 0x4a, 0x11, 0x69, 0x52,
-- 0x62, 0x51, 0x99, 0x08, 0x4a, 0x0f, 0x69, 0x52,
-- 0x62, 0x11, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x05,
-- 0x48, 0x14, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19,
-- 0x60, 0x01, 0xe0, 0x02, 0x48, 0x11, 0x21, 0x00,
-- 0x60, 0x01, 0xf0, 0x00, 0xf9, 0x8c, 0xf0, 0x10,
-- 0xfc, 0xc9, 0x20, 0x00, 0xb0, 0x0f, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x0e,
-- 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x04,
-- 0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8,
-- 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff,
-- 0xff, 0xff, 0xdf, 0xff, 0xff, 0x80, 0x7f, 0xff,
-- 0xfb, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff,
-- 0xfd, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x40,
-- 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38,
-- 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 0x23, 0x18,
-- 0x40, 0x18, 0x08, 0xc0, 0x49, 0x3a, 0x69, 0x89,
-- 0x68, 0x09, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x19,
-- 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x08,
-- 0x49, 0x35, 0x69, 0x89, 0x60, 0x08, 0x06, 0x00,
-- 0x0f, 0x80, 0x69, 0x38, 0x00, 0x80, 0x49, 0x31,
-- 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0x08, 0x80,
-- 0x49, 0x2f, 0x69, 0x89, 0x68, 0x09, 0x23, 0x08,
-- 0x43, 0xdb, 0x40, 0x19, 0x07, 0xc0, 0x0f, 0x00,
-- 0x43, 0x08, 0x49, 0x2b, 0x69, 0x89, 0x60, 0x08,
-- 0x07, 0x00, 0x0f, 0xc0, 0x69, 0x38, 0x00, 0x80,
-- 0x49, 0x26, 0x58, 0x08, 0x49, 0x26, 0x69, 0x89,
-- 0x68, 0x09, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x19,
-- 0x07, 0x80, 0x0f, 0x80, 0x01, 0x00, 0x43, 0x08,
-- 0x49, 0x21, 0x69, 0x89, 0x60, 0x08, 0x06, 0x80,
-- 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 0x49, 0x1d,
-- 0x58, 0x08, 0x23, 0x18, 0x40, 0x18, 0x08, 0xc0,
-- 0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1b,
-- 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0xc0,
-- 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 0x60, 0x08,
-- 0x04, 0xc0, 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80,
-- 0x49, 0x12, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18,
-- 0x08, 0x80, 0x49, 0x11, 0x69, 0x89, 0x68, 0x09,
-- 0x4b, 0x11, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0xc0,
-- 0x43, 0x08, 0x49, 0x0d, 0x69, 0x89, 0x60, 0x08,
-- 0x05, 0xc0, 0x0f, 0xc0, 0x69, 0x10, 0x00, 0x80,
-- 0x49, 0x08, 0x58, 0x08, 0x49, 0x08, 0x69, 0x89,
-- 0x68, 0x09, 0x4b, 0x0a, 0x40, 0x19, 0x07, 0x80,
-- 0x0f, 0x80, 0x02, 0x40, 0x43, 0x08, 0x49, 0x04,
-- 0x69, 0x89, 0x60, 0x08, 0x05, 0x40, 0x0f, 0x80,
-- 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x03, 0x3a, 0x04,
-- 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xe7, 0xff,
-- 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xff,
-- 0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x15,
-- 0x2d, 0x00, 0xd0, 0x06, 0x2d, 0x02, 0xd0, 0x21,
-- 0x2d, 0x03, 0xd0, 0x02, 0x2d, 0x04, 0xd0, 0x1d,
-- 0xe0, 0xa3, 0x69, 0x20, 0x28, 0x0b, 0xd2, 0x14,
-- 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x05, 0x07, 0x09, 0x0b, 0x05, 0x07, 0x09, 0x0b,
-- 0x0d, 0x0e, 0x0e, 0x00, 0x07, 0xff, 0xe0, 0x09,
-- 0x07, 0xbf, 0xe0, 0x07, 0x07, 0x3f, 0xe0, 0x05,
-- 0x06, 0x3f, 0xe0, 0x03, 0xe0, 0x02, 0x02, 0x3f,
-- 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x46, 0x6a, 0x00,
-- 0x60, 0x07, 0xe0, 0x86, 0x69, 0x20, 0x28, 0x0b,
-- 0xd2, 0x73, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b,
-- 0x44, 0x9f, 0x1c, 0x00, 0x06, 0x15, 0x24, 0x33,
-- 0x06, 0x15, 0x24, 0x33, 0x41, 0x45, 0x45, 0x00,
-- 0x01, 0xff, 0x48, 0x3d, 0x6a, 0x40, 0x68, 0x00,
-- 0x4b, 0x3c, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09,
-- 0x00, 0x89, 0x43, 0x08, 0x49, 0x38, 0x6a, 0x49,
-- 0x60, 0x08, 0x05, 0x80, 0xe0, 0x69, 0x01, 0xbf,
-- 0x48, 0x35, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x35,
-- 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89,
-- 0x43, 0x08, 0x49, 0x31, 0x6a, 0x49, 0x60, 0x08,
-- 0x05, 0x80, 0xe0, 0x5a, 0x01, 0x3f, 0x48, 0x2e,
-- 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x2d, 0x40, 0x18,
-- 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08,
-- 0x49, 0x29, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80,
-- 0xe0, 0x4b, 0x48, 0x27, 0x6a, 0x40, 0x68, 0x00,
-- 0x4b, 0x26, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09,
-- 0x00, 0x89, 0x43, 0x08, 0x49, 0x22, 0x6a, 0x49,
-- 0x60, 0x08, 0x05, 0x80, 0xe0, 0x3d, 0x48, 0x20,
-- 0x6a, 0x00, 0x60, 0x07, 0xe0, 0x39, 0x48, 0x1e,
-- 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18,
-- 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08,
-- 0x49, 0x19, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80,
-- 0x48, 0x17, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x18,
-- 0x40, 0x18, 0x21, 0xff, 0x02, 0x09, 0x40, 0x39,
-- 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 0x6a, 0x49,
-- 0x60, 0x08, 0x03, 0x80, 0x48, 0x10, 0x6a, 0x40,
-- 0x68, 0x00, 0x4b, 0x12, 0x40, 0x18, 0x21, 0xff,
-- 0x04, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x01,
-- 0x48, 0x0b, 0x6a, 0x40, 0x60, 0x01, 0x01, 0x88,
-- 0xe0, 0x00, 0xe0, 0x0d, 0x48, 0x08, 0x6a, 0x40,
-- 0x68, 0x00, 0x01, 0x80, 0x09, 0x80, 0x21, 0x3f,
-- 0x06, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x08,
-- 0x49, 0x03, 0x6a, 0x49, 0x60, 0x08, 0xe0, 0x00,
-- 0xe7, 0xff, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xfc, 0x03,
-- 0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, 0xff,
-- 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38,
-- 0x28, 0x0b, 0xd2, 0x1a, 0xa3, 0x01, 0x5c, 0x1b,
-- 0x00, 0x5b, 0x44, 0x9f, 0x05, 0x08, 0x0b, 0x0e,
-- 0x05, 0x08, 0x0b, 0x0e, 0x11, 0x13, 0x13, 0x00,
-- 0x68, 0x10, 0x0f, 0xc1, 0xe0, 0x0f, 0x68, 0x10,
-- 0x0f, 0x81, 0xe0, 0x0c, 0x68, 0x10, 0x0f, 0x01,
-- 0xe0, 0x09, 0x68, 0x10, 0x0e, 0x01, 0xe0, 0x06,
-- 0x68, 0x11, 0xe0, 0x04, 0x68, 0x10, 0x0a, 0x01,
-- 0xe0, 0x01, 0x68, 0x11, 0xe7, 0xff, 0x1c, 0x08,
-- 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x48, 0x14,
-- 0x69, 0x80, 0x68, 0x00, 0x49, 0x12, 0x6a, 0x89,
-- 0x60, 0x08, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00,
-- 0x49, 0x0f, 0x6a, 0xc9, 0x60, 0x08, 0x48, 0x0e,
-- 0x6a, 0x00, 0x68, 0x00, 0x49, 0x0c, 0x6b, 0x09,
-- 0x60, 0x08, 0x48, 0x0b, 0x6a, 0x40, 0x68, 0x00,
-- 0x49, 0x09, 0x6b, 0x49, 0x60, 0x08, 0x20, 0x01,
-- 0x49, 0x07, 0x6b, 0xc9, 0x60, 0x08, 0x20, 0x00,
-- 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0x49, 0x05,
-- 0x60, 0x48, 0x20, 0x00, 0x49, 0x03, 0x60, 0x88,
-- 0x20, 0x00, 0x49, 0x02, 0x60, 0xc8, 0x47, 0x70,
-- 0x2e, 0x08, 0x1f, 0xa8, 0x2e, 0x08, 0x1f, 0xac,
-- 0xb4, 0x90, 0x1c, 0x01, 0x29, 0x00, 0xd1, 0x02,
-- 0x20, 0x8d, 0xbc, 0x90, 0x47, 0x70, 0x4c, 0x08,
-- 0x1c, 0x0f, 0x22, 0x00, 0x23, 0xff, 0x33, 0x01,
-- 0x42, 0x9a, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01,
-- 0xe7, 0xf8, 0xcf, 0x08, 0xc4, 0x08, 0xe7, 0xfa,
-- 0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, 0x00, 0x00,
-- 0x68, 0x00, 0x18, 0x00, 0xb4, 0x90, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x1a, 0x0e, 0x12,
-- 0x1c, 0x21, 0x60, 0x0f, 0x71, 0x0a, 0x20, 0x00,
-- 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00,
-- 0xb5, 0x00, 0x48, 0x1d, 0x69, 0x00, 0x23, 0x04,
-- 0x40, 0x18, 0xd0, 0x19, 0x48, 0x1a, 0x69, 0x00,
-- 0x23, 0x02, 0x40, 0x18, 0xd0, 0x09, 0x48, 0x18,
-- 0x69, 0x40, 0x49, 0x18, 0x68, 0x09, 0x60, 0x08,
-- 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x70, 0x08,
-- 0xe0, 0x03, 0x20, 0x00, 0x49, 0x14, 0x68, 0x09,
-- 0x70, 0x08, 0x48, 0x14, 0x78, 0x01, 0x20, 0x01,
-- 0x40, 0x88, 0xf0, 0x07, 0xfb, 0x65, 0xe0, 0x18,
-- 0x48, 0x11, 0x6a, 0x80, 0x23, 0x02, 0x40, 0x18,
-- 0xd0, 0x13, 0x48, 0x0f, 0x6a, 0x80, 0x07, 0xc0,
-- 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0xfe, 0x49, 0x0d,
-- 0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x0e,
-- 0x49, 0x0a, 0x68, 0x09, 0x70, 0x08, 0x48, 0x0a,
-- 0x78, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x07,
-- 0xfb, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x6e, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x7c, 0x2c,
-- 0x2e, 0x08, 0x7c, 0x30, 0x2e, 0x08, 0x7c, 0x34,
-- 0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0x7c, 0x38,
-- 0x2e, 0x08, 0x7c, 0x3c, 0xb5, 0xf0, 0x1c, 0x05,
-- 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36,
-- 0x2e, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x49, 0x08, 0x20, 0x0d,
-- 0xf0, 0x07, 0xfb, 0x3c, 0x48, 0x07, 0x60, 0x04,
-- 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x70, 0x08,
-- 0x48, 0x05, 0x60, 0x07, 0x48, 0x05, 0x70, 0x06,
-- 0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, 0x00, 0x00,
-- 0x2e, 0x01, 0x53, 0xed, 0x2e, 0x08, 0x7c, 0x30,
-- 0x2e, 0x08, 0x7c, 0x2c, 0x2e, 0x08, 0x7c, 0x34,
-- 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25,
-- 0x0e, 0x2d, 0x2d, 0x1f, 0xdd, 0x03, 0x20, 0xaf,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x07,
-- 0x20, 0x0d, 0xf0, 0x07, 0xfb, 0x17, 0x48, 0x06,
-- 0x60, 0x07, 0x20, 0x00, 0x49, 0x04, 0x68, 0x09,
-- 0x70, 0x08, 0x48, 0x04, 0x70, 0x05, 0x20, 0x00,
-- 0xe7, 0xee, 0xe7, 0xed, 0x2e, 0x01, 0x53, 0xed,
-- 0x2e, 0x08, 0x7c, 0x38, 0x2e, 0x08, 0x7c, 0x3c,
-- 0xb4, 0xb0, 0x1c, 0x01, 0x4a, 0x35, 0x23, 0x01,
-- 0x60, 0x13, 0x4a, 0x35, 0x1c, 0x0f, 0x68, 0x3d,
-- 0xc2, 0x20, 0x88, 0x8d, 0xc2, 0x20, 0x88, 0xcb,
-- 0x60, 0x13, 0x68, 0x8c, 0x2c, 0x00, 0xd0, 0x57,
-- 0x4a, 0x30, 0x1c, 0x27, 0x20, 0x00, 0x28, 0x13,
-- 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa,
-- 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x2c,
-- 0x1d, 0xe7, 0x37, 0x45, 0x20, 0x00, 0x28, 0x0b,
-- 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa,
-- 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x27,
-- 0x1d, 0xe7, 0x37, 0x71, 0x20, 0x00, 0x28, 0x07,
-- 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa,
-- 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x22,
-- 0x1d, 0xe7, 0x37, 0x8d, 0x20, 0x00, 0x28, 0x09,
-- 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa,
-- 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x1d,
-- 0x1d, 0xe7, 0x37, 0xb1, 0x20, 0x00, 0x28, 0x09,
-- 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa,
-- 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x68, 0x0d,
-- 0x23, 0x01, 0x02, 0x9b, 0x40, 0x2b, 0xd0, 0x17,
-- 0x4a, 0x15, 0x1d, 0xe7, 0x37, 0xd5, 0x20, 0x00,
-- 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01,
-- 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa,
-- 0x4a, 0x10, 0x1d, 0xe7, 0x37, 0xf9, 0x20, 0x00,
-- 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01,
-- 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa,
-- 0x4a, 0x02, 0x23, 0x00, 0x60, 0x13, 0xbc, 0xb0,
-- 0x47, 0x70, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x0c,
-- 0x6e, 0x00, 0x0c, 0x00, 0x6e, 0x00, 0x08, 0x00,
-- 0x6e, 0x00, 0x08, 0x50, 0x6e, 0x00, 0x08, 0x80,
-- 0x6e, 0x00, 0x08, 0xa0, 0x6e, 0x00, 0x08, 0xd0,
-- 0x6e, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x09, 0x30,
-- 0xb4, 0xf0, 0x1c, 0x01, 0x69, 0x08, 0x06, 0xc0,
-- 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 0x69, 0x08,
-- 0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x02,
-- 0x20, 0xc3, 0xbc, 0xf0, 0x47, 0x70, 0x69, 0x08,
-- 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04,
-- 0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x0a,
-- 0xdd, 0x01, 0x20, 0xc4, 0xe7, 0xf1, 0x48, 0x4f,
-- 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01,
-- 0x20, 0xc0, 0xe7, 0xea, 0x68, 0x08, 0x07, 0x00,
-- 0x0f, 0xc0, 0x4b, 0x4b, 0x70, 0x18, 0x4f, 0x49,
-- 0x1c, 0x0c, 0x22, 0x00, 0x2a, 0x04, 0xd3, 0x02,
-- 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08,
-- 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x45, 0x69, 0x08,
-- 0x06, 0xc0, 0x0e, 0xc0, 0x00, 0x43, 0x18, 0x18,
-- 0x38, 0x03, 0x69, 0x0b, 0x05, 0x9b, 0x0e, 0xde,
-- 0x00, 0x73, 0x19, 0x9b, 0x3b, 0x03, 0x01, 0x5b,
-- 0x43, 0x18, 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x48,
-- 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x88, 0x05, 0x40,
-- 0x0d, 0x40, 0x69, 0x8b, 0x02, 0x9b, 0x0d, 0x5b,
-- 0x02, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x69, 0xcd,
-- 0x2d, 0x00, 0xd0, 0x63, 0x4f, 0x38, 0x1c, 0x2c,
-- 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04,
-- 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08,
-- 0xe7, 0xfa, 0x4f, 0x34, 0x1d, 0xec, 0x34, 0x1d,
-- 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04,
-- 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08,
-- 0xe7, 0xfa, 0x4f, 0x2f, 0x1d, 0xec, 0x34, 0x41,
-- 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04,
-- 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08,
-- 0xe7, 0xfa, 0x4f, 0x2a, 0x1d, 0xec, 0x34, 0x65,
-- 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04,
-- 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08,
-- 0xe7, 0xfa, 0x4f, 0x25, 0x1d, 0xec, 0x34, 0x89,
-- 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04,
-- 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08,
-- 0xe7, 0xfa, 0x4f, 0x20, 0x1d, 0xec, 0x34, 0x9d,
-- 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04,
-- 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08,
-- 0xe7, 0xfa, 0x68, 0x08, 0x23, 0x01, 0x02, 0x9b,
-- 0x40, 0x18, 0xd0, 0x17, 0x4f, 0x18, 0x1d, 0xec,
-- 0x34, 0xb1, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02,
-- 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08,
-- 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x13, 0x1d, 0xec,
-- 0x34, 0xc5, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02,
-- 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08,
-- 0xc7, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0x54,
-- 0xe7, 0x53, 0x00, 0x00, 0x6e, 0x00, 0x0e, 0x00,
-- 0x2e, 0x08, 0x7c, 0x3d, 0x6e, 0x00, 0x0e, 0x10,
-- 0x6e, 0x00, 0x0e, 0x14, 0x6e, 0x00, 0x0e, 0x18,
-- 0x6e, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0a, 0x24,
-- 0x6e, 0x00, 0x0a, 0x48, 0x6e, 0x00, 0x0a, 0x90,
-- 0x6e, 0x00, 0x0a, 0xc0, 0x6e, 0x00, 0x0a, 0xe4,
-- 0x6e, 0x00, 0x09, 0xc0, 0x6e, 0x00, 0x09, 0xe4,
-- 0x1c, 0x01, 0x48, 0x0c, 0x78, 0x00, 0x28, 0x00,
-- 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 0x48, 0x0a,
-- 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01,
-- 0x20, 0xc0, 0xe7, 0xf7, 0x20, 0x00, 0x4b, 0x06,
-- 0x61, 0x58, 0x4a, 0x06, 0x68, 0x08, 0x60, 0x10,
-- 0x4a, 0x05, 0x68, 0x48, 0x60, 0x10, 0x20, 0x00,
-- 0xe7, 0xec, 0xe7, 0xeb, 0x2e, 0x08, 0x7c, 0x3d,
-- 0x6e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x0e, 0x20,
-- 0x6e, 0x00, 0x0e, 0x24, 0x48, 0x09, 0x78, 0x00,
-- 0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70,
-- 0x48, 0x07, 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0,
-- 0xd0, 0x01, 0x20, 0xc2, 0xe7, 0xf7, 0x20, 0x01,
-- 0x49, 0x03, 0x61, 0x48, 0x20, 0x00, 0xe7, 0xf2,
-- 0xe7, 0xf1, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x3d,
-- 0x6e, 0x00, 0x0e, 0x00, 0xb5, 0xff, 0x1c, 0x04,
-- 0x1c, 0x0d, 0x1c, 0x17, 0x9e, 0x09, 0x20, 0x00,
-- 0x60, 0x30, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x07, 0x9b, 0x03, 0x2b, 0x00, 0xd1, 0x04,
-- 0x20, 0x8a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c,
-- 0xdd, 0x01, 0x20, 0x87, 0xe7, 0xf5, 0x19, 0x28,
-- 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xd9, 0x01,
-- 0x20, 0x88, 0xe7, 0xee, 0x68, 0x79, 0x1c, 0x20,
-- 0x80, 0x48, 0x70, 0x0d, 0x9b, 0x03, 0x60, 0x4b,
-- 0x68, 0x78, 0x60, 0xc8, 0x68, 0x38, 0x60, 0x88,
-- 0x60, 0x31, 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0,
-- 0x2e, 0x08, 0x60, 0x84, 0x1c, 0x03, 0x1c, 0x0a,
-- 0x1c, 0x19, 0x68, 0xc8, 0x60, 0x50, 0x68, 0x88,
-- 0x60, 0x10, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd,
-- 0xb5, 0xf3, 0xb0, 0x87, 0x21, 0x00, 0x91, 0x06,
-- 0x26, 0x00, 0x98, 0x07, 0xf0, 0x00, 0xfa, 0xcb,
-- 0x90, 0x03, 0x9c, 0x07, 0x9d, 0x08, 0x88, 0x69,
-- 0x91, 0x04, 0x98, 0x03, 0x99, 0x04, 0x42, 0x88,
-- 0xd0, 0x09, 0x48, 0xbb, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x07, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28,
-- 0x90, 0x05, 0x99, 0x04, 0x23, 0xff, 0x33, 0x01,
-- 0x42, 0x99, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07,
-- 0xe7, 0xf1, 0x98, 0x05, 0x99, 0x04, 0x18, 0x40,
-- 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02,
-- 0x20, 0xff, 0xb0, 0x07, 0xe7, 0xe7, 0x48, 0xad,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0xa0,
-- 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 0xd0, 0x05,
-- 0x68, 0x68, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8a,
-- 0xb0, 0x07, 0xe7, 0xd8, 0x62, 0x65, 0x69, 0x60,
-- 0x4b, 0xa5, 0x40, 0x18, 0x99, 0x05, 0x06, 0x09,
-- 0x0e, 0x09, 0x04, 0x09, 0x43, 0x08, 0x61, 0x60,
-- 0x02, 0x00, 0x68, 0xe0, 0x90, 0x00, 0x48, 0x9e,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x00,
-- 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00,
-- 0x20, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x28, 0x08,
-- 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00,
-- 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x07,
-- 0xe7, 0xb5, 0x48, 0x94, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x1e, 0x48, 0x91, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x1a, 0x68, 0xa0, 0x02, 0x00, 0x0e, 0x00,
-- 0x06, 0x01, 0x0e, 0x09, 0x91, 0x06, 0x99, 0x04,
-- 0x29, 0x04, 0xd0, 0x06, 0x29, 0x10, 0xd0, 0x07,
-- 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xd0, 0x06,
-- 0xe0, 0x08, 0x26, 0xff, 0x36, 0x01, 0xe0, 0x07,
-- 0x26, 0x01, 0x02, 0x76, 0xe0, 0x04, 0x26, 0x03,
-- 0x02, 0x36, 0xe0, 0x01, 0x26, 0x00, 0xe7, 0xff,
-- 0x49, 0x84, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0xca,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01,
-- 0xff, 0xb1, 0xe7, 0xf5, 0x98, 0x00, 0x00, 0x80,
-- 0x49, 0x7f, 0x58, 0x08, 0x99, 0x07, 0x42, 0x88,
-- 0xd0, 0x05, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08,
-- 0x20, 0xff, 0xb0, 0x07, 0xe7, 0x7b, 0x48, 0x77,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x73, 0x48, 0x74,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x6f, 0x98, 0x00,
-- 0xf0, 0x02, 0xfe, 0xd6, 0x28, 0x00, 0xd0, 0x6a,
-- 0xb0, 0x82, 0x49, 0x74, 0x20, 0x91, 0xf0, 0x0f,
-- 0xff, 0xa5, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8,
-- 0xf0, 0x02, 0xff, 0x25, 0x20, 0x92, 0x49, 0x6f,
-- 0x60, 0x08, 0x20, 0x01, 0x49, 0x6e, 0x68, 0x09,
-- 0x60, 0x08, 0x27, 0x00, 0x20, 0x00, 0x90, 0x00,
-- 0x98, 0x00, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07,
-- 0xd2, 0x13, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89,
-- 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18,
-- 0x00, 0xc0, 0x4a, 0x65, 0x68, 0x12, 0x18, 0x80,
-- 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0,
-- 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00,
-- 0xe7, 0xe6, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x14,
-- 0x2f, 0x18, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81,
-- 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c,
-- 0x43, 0x58, 0x4a, 0x59, 0x68, 0x12, 0x18, 0x80,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40,
-- 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00,
-- 0xe7, 0xe7, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x10,
-- 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x50,
-- 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b,
-- 0x18, 0xc0, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x38,
-- 0x48, 0x4b, 0x68, 0x00, 0xf0, 0x02, 0xfe, 0xee,
-- 0xe0, 0x46, 0x2f, 0x18, 0xd2, 0x44, 0x20, 0x4c,
-- 0x43, 0x78, 0x49, 0x47, 0x68, 0x09, 0x18, 0x40,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x21,
-- 0xf0, 0x02, 0xfb, 0x26, 0x20, 0x4c, 0x43, 0x78,
-- 0x49, 0x41, 0x68, 0x09, 0xe0, 0x00, 0xe0, 0x48,
-- 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x82,
-- 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c,
-- 0x43, 0x78, 0x49, 0x3b, 0x68, 0x09, 0x18, 0x40,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00,
-- 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c,
-- 0x43, 0x78, 0x49, 0x35, 0x68, 0x09, 0x18, 0x40,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00,
-- 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02,
-- 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12,
-- 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82,
-- 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c,
-- 0x43, 0x79, 0x4a, 0x29, 0x68, 0x12, 0x18, 0x89,
-- 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48,
-- 0x49, 0x24, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0x06,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x22,
-- 0x68, 0x00, 0x90, 0x01, 0x48, 0x21, 0x68, 0x00,
-- 0x49, 0x1f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x1f,
-- 0x60, 0x08, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08,
-- 0xb0, 0x02, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x1d, 0x98, 0x00, 0x01, 0x00, 0x4b, 0x1a,
-- 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d,
-- 0x90, 0x02, 0x98, 0x02, 0x68, 0x00, 0x99, 0x01,
-- 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x0d, 0x68, 0x68, 0x08, 0x80, 0x99, 0x06,
-- 0x00, 0x89, 0x4b, 0x12, 0x18, 0xc9, 0x67, 0x08,
-- 0x98, 0x05, 0x43, 0x30, 0x99, 0x06, 0x00, 0x89,
-- 0x4b, 0x0f, 0x18, 0xc9, 0x61, 0x08, 0x20, 0x92,
-- 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07,
-- 0xe6, 0x91, 0xb0, 0x07, 0xe6, 0x8f, 0x00, 0x00,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x60, 0x84,
-- 0xff, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x7c, 0xc0,
-- 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x94, 0x88,
-- 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8,
-- 0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x0e, 0x00,
-- 0x68, 0x00, 0x0e, 0x80, 0x1c, 0x01, 0x1c, 0x0a,
-- 0x6a, 0x53, 0x1c, 0x18, 0x47, 0x70, 0xe7, 0xfd,
-- 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x48, 0x2b,
-- 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x8a,
-- 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x98, 0x02, 0x90, 0x01, 0x98, 0x01,
-- 0x88, 0x44, 0x98, 0x01, 0x78, 0x06, 0x23, 0xff,
-- 0x33, 0x01, 0x42, 0x9c, 0xdd, 0x02, 0x20, 0xff,
-- 0xb0, 0x02, 0xe7, 0xee, 0x19, 0x30, 0x23, 0xff,
-- 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 0x20, 0xff,
-- 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0x1c, 0x20, 0x91,
-- 0xf0, 0x0f, 0xfe, 0x88, 0x28, 0x92, 0xd0, 0x03,
-- 0x20, 0x01, 0xf0, 0x01, 0xfe, 0x6f, 0xe7, 0xf5,
-- 0x2c, 0x10, 0xda, 0x0d, 0x25, 0x00, 0x42, 0xa5,
-- 0xdb, 0x02, 0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa,
-- 0xcf, 0x01, 0x19, 0x71, 0x00, 0x89, 0x4b, 0x13,
-- 0x18, 0xc9, 0x60, 0x08, 0xe7, 0xf6, 0xe0, 0x15,
-- 0x4a, 0x11, 0x43, 0x22, 0x92, 0x00, 0x20, 0x91,
-- 0x49, 0x10, 0x60, 0x08, 0x00, 0xb0, 0x4b, 0x0d,
-- 0x18, 0xc1, 0x9a, 0x00, 0x1c, 0x38, 0x23, 0x02,
-- 0xf0, 0x00, 0xfa, 0xfe, 0x28, 0x00, 0xd0, 0x00,
-- 0xe7, 0xf4, 0x48, 0x0a, 0x68, 0x00, 0x28, 0x92,
-- 0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x92, 0x49, 0x04,
-- 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xb0,
-- 0xb0, 0x02, 0xe7, 0xae, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x08, 0x00,
-- 0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc8,
-- 0x21, 0x04, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08,
-- 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f,
-- 0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02,
-- 0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01,
-- 0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c,
-- 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee,
-- 0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98,
-- 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6,
-- 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x0f, 0xfe, 0x1e,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01,
-- 0xfe, 0x05, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d,
-- 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08,
-- 0x35, 0x01, 0xe7, 0xfa, 0x19, 0x70, 0x00, 0x80,
-- 0x4b, 0x13, 0x18, 0xc0, 0x68, 0x01, 0xc7, 0x02,
-- 0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22,
-- 0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08,
-- 0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x00,
-- 0x1c, 0x39, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0x94,
-- 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a,
-- 0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa,
-- 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00,
-- 0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae,
-- 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4,
-- 0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0xc8, 0xb5, 0xf7, 0x9a, 0x02,
-- 0x06, 0x15, 0x0e, 0x2d, 0x9c, 0x00, 0x88, 0x66,
-- 0x42, 0xb5, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x20,
-- 0x19, 0x40, 0x06, 0x07, 0x0e, 0x3f, 0x23, 0xff,
-- 0x33, 0x01, 0x42, 0x9f, 0xdd, 0x01, 0x20, 0xff,
-- 0xe7, 0xf1, 0x49, 0x0a, 0x20, 0x91, 0xf0, 0x0f,
-- 0xfd, 0xc5, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01,
-- 0xf0, 0x01, 0xfd, 0xac, 0xe7, 0xf5, 0x99, 0x01,
-- 0x00, 0xb8, 0x4b, 0x05, 0x18, 0xc0, 0x60, 0x01,
-- 0x20, 0x92, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00,
-- 0xe7, 0xdd, 0xe7, 0xdc, 0x2e, 0x08, 0x7c, 0xc4,
-- 0x68, 0x00, 0x08, 0x00, 0xb5, 0xf7, 0x9a, 0x02,
-- 0x06, 0x14, 0x0e, 0x24, 0x9f, 0x00, 0x88, 0x7d,
-- 0x78, 0x38, 0x19, 0x00, 0x06, 0x06, 0x0e, 0x36,
-- 0x42, 0xac, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x0b,
-- 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x9b, 0x28, 0x92,
-- 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x82,
-- 0xe7, 0xf5, 0x00, 0xb0, 0x4b, 0x06, 0x18, 0xc0,
-- 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92,
-- 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xe6,
-- 0xe7, 0xe5, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4,
-- 0x68, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x1c, 0x0a,
-- 0x88, 0x50, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80,
-- 0x1c, 0x01, 0x1c, 0x0f, 0x69, 0x3a, 0x2a, 0x08,
-- 0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b,
-- 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x07, 0x09, 0x0b,
-- 0x04, 0x07, 0x09, 0x0b, 0x20, 0x02, 0xbc, 0x80,
-- 0x47, 0x70, 0x20, 0x04, 0xe7, 0xfb, 0x20, 0x10,
-- 0xe7, 0xf9, 0x20, 0xff, 0x30, 0x01, 0xe7, 0xf6,
-- 0x20, 0x00, 0xe7, 0xf4, 0xe7, 0xf3, 0xb5, 0xf3,
-- 0x98, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x48, 0x89,
-- 0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x8b,
-- 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x48, 0x85, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04,
-- 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf3,
-- 0xe0, 0xfe, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c,
-- 0xe7, 0xee, 0x49, 0x80, 0x20, 0x91, 0xf0, 0x0f,
-- 0xfd, 0x45, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01,
-- 0xf0, 0x01, 0xfd, 0x2c, 0xe7, 0xf5, 0x1c, 0x28,
-- 0xf7, 0xf8, 0xfc, 0xd8, 0x1c, 0x04, 0x2c, 0x00,
-- 0xd0, 0x09, 0x68, 0xa0, 0x4b, 0x78, 0x40, 0x18,
-- 0x99, 0x01, 0x07, 0xc9, 0x09, 0xc9, 0x43, 0x08,
-- 0x60, 0xa0, 0x01, 0xc0, 0xe0, 0x04, 0x20, 0x92,
-- 0x49, 0x72, 0x60, 0x08, 0x20, 0xff, 0xe7, 0xcf,
-- 0x48, 0x6f, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x11,
-- 0x99, 0x01, 0x29, 0x00, 0xd0, 0x06, 0x48, 0x6f,
-- 0x21, 0x01, 0x40, 0xa9, 0x68, 0x02, 0x43, 0x11,
-- 0x60, 0x01, 0xe0, 0x06, 0x48, 0x6b, 0x21, 0x01,
-- 0x40, 0xa9, 0x43, 0xc9, 0x68, 0x02, 0x40, 0x11,
-- 0x60, 0x01, 0xe0, 0xbf, 0x68, 0xe0, 0xf0, 0x02,
-- 0xfc, 0x3b, 0x28, 0x00, 0xd0, 0x73, 0xb0, 0x81,
-- 0x49, 0x65, 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x0a,
-- 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02,
-- 0xfc, 0x8a, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08,
-- 0x20, 0x01, 0x49, 0x60, 0x68, 0x09, 0x60, 0x08,
-- 0x27, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14,
-- 0x2f, 0x07, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81,
-- 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83,
-- 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x57, 0x68, 0x12,
-- 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0,
-- 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01,
-- 0xe7, 0xe8, 0x2e, 0x00, 0xd1, 0x13, 0x2f, 0x18,
-- 0xd2, 0x11, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89,
-- 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58,
-- 0x4a, 0x4c, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff,
-- 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81,
-- 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe9, 0x3f, 0x01,
-- 0x2f, 0x07, 0xd2, 0x32, 0x99, 0x02, 0x29, 0x00,
-- 0xd0, 0x16, 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0,
-- 0x49, 0x42, 0x68, 0x09, 0x18, 0x40, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, 0x4b, 0x40,
-- 0x43, 0x18, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9,
-- 0x4a, 0x3c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x17,
-- 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x37,
-- 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 0x02, 0x1b,
-- 0x18, 0xc0, 0x6e, 0x80, 0x04, 0x00, 0x0c, 0x00,
-- 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x31,
-- 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b,
-- 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x00, 0xe0, 0x45,
-- 0xe0, 0x2b, 0x99, 0x02, 0x29, 0x00, 0xd0, 0x14,
-- 0x20, 0x4c, 0x43, 0x78, 0x49, 0x29, 0x68, 0x09,
-- 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x68, 0x00, 0x4b, 0x27, 0x43, 0x18, 0x21, 0x4c,
-- 0x43, 0x79, 0x4a, 0x24, 0x68, 0x12, 0x18, 0x89,
-- 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x60, 0x08,
-- 0xe0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x1f,
-- 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00,
-- 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x19, 0x68, 0x12,
-- 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02,
-- 0x60, 0x08, 0x48, 0x16, 0x68, 0x00, 0xf0, 0x02,
-- 0xfc, 0x05, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x0f,
-- 0xfc, 0x65, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8,
-- 0x48, 0x10, 0x68, 0x00, 0x90, 0x00, 0x48, 0x11,
-- 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 0x98, 0x00,
-- 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a,
-- 0x60, 0x08, 0xb0, 0x01, 0x20, 0x92, 0x49, 0x05,
-- 0x60, 0x08, 0x20, 0x00, 0xe6, 0xf4, 0xe6, 0xf3,
-- 0xe6, 0xf2, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4,
-- 0xfe, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x20,
-- 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4,
-- 0xff, 0xff, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb8,
-- 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x26,
-- 0x0e, 0x36, 0x48, 0x0f, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x2e, 0x07, 0xdd, 0x01, 0x20, 0x8c,
-- 0xe7, 0xf8, 0x1c, 0x30, 0xf7, 0xf8, 0xfb, 0xc2,
-- 0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x04, 0x68, 0xa8,
-- 0x01, 0xc0, 0x0f, 0xc0, 0x60, 0x38, 0xe0, 0x04,
-- 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0xff,
-- 0xe7, 0xe8, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5,
-- 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4,
-- 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25,
-- 0x0e, 0x2d, 0x48, 0x20, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x48, 0x1d, 0x68, 0x00, 0x28, 0x01,
-- 0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c,
-- 0xe7, 0xf4, 0xe0, 0x2d, 0x2d, 0x07, 0xdd, 0x01,
-- 0x20, 0x8c, 0xe7, 0xef, 0x48, 0x16, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe9,
-- 0x49, 0x14, 0x20, 0x91, 0xf0, 0x0f, 0xfb, 0xee,
-- 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01,
-- 0xfb, 0xd5, 0xe7, 0xf5, 0x2f, 0x00, 0xd0, 0x08,
-- 0x48, 0x0f, 0x1d, 0xe9, 0x31, 0x01, 0x22, 0x01,
-- 0x40, 0x8a, 0x68, 0x01, 0x43, 0x11, 0x60, 0x01,
-- 0xe0, 0x08, 0x48, 0x0b, 0x1d, 0xea, 0x32, 0x01,
-- 0x21, 0x01, 0x40, 0x91, 0x43, 0xc9, 0x68, 0x02,
-- 0x40, 0x11, 0x60, 0x01, 0x20, 0x92, 0x49, 0x05,
-- 0x60, 0x08, 0x20, 0x00, 0xe7, 0xc6, 0xe7, 0xc5,
-- 0xe7, 0xc4, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4,
-- 0x68, 0x00, 0x00, 0x20, 0xb4, 0x90, 0x1c, 0x07,
-- 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x48, 0x10,
-- 0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8b,
-- 0xbc, 0x90, 0x47, 0x70, 0x29, 0x07, 0xdd, 0x01,
-- 0x20, 0x8c, 0xe7, 0xf9, 0x48, 0x0b, 0x68, 0x00,
-- 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf3,
-- 0x1d, 0xc8, 0x30, 0x01, 0x24, 0x01, 0x40, 0x84,
-- 0x1c, 0x23, 0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00,
-- 0x40, 0x18, 0x1d, 0xcc, 0x34, 0x01, 0x40, 0xe0,
-- 0x60, 0x10, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3,
-- 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84,
-- 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25,
-- 0x0e, 0x2d, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c,
-- 0xe7, 0xf8, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00,
-- 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf2, 0x49, 0x0c,
-- 0x20, 0x91, 0xf0, 0x0f, 0xfb, 0x7f, 0x28, 0x92,
-- 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfb, 0x66,
-- 0xe7, 0xf5, 0x08, 0xb8, 0x00, 0xa9, 0x4b, 0x07,
-- 0x18, 0xc9, 0x67, 0x08, 0x20, 0x92, 0x49, 0x04,
-- 0x60, 0x08, 0x20, 0x00, 0xe7, 0xde, 0xe7, 0xdd,
-- 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84,
-- 0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x0e, 0x00,
-- 0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17,
-- 0x1c, 0x1e, 0x04, 0x3f, 0x0c, 0x3f, 0x1c, 0x39,
-- 0x29, 0x00, 0xd8, 0x02, 0xe0, 0x04, 0x39, 0x01,
-- 0xe7, 0xfa, 0xcd, 0x04, 0xc4, 0x04, 0xe7, 0xfa,
-- 0x20, 0x92, 0x4a, 0x03, 0x60, 0x10, 0x20, 0x00,
-- 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0xc8, 0x20, 0x00, 0x6b, 0x00,
-- 0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6b, 0x40,
-- 0x49, 0x62, 0x60, 0x08, 0x48, 0x62, 0x49, 0x63,
-- 0x60, 0x08, 0x48, 0x63, 0x49, 0x63, 0x60, 0x08,
-- 0x20, 0x00, 0x6a, 0xc0, 0x49, 0x62, 0x60, 0x08,
-- 0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63,
-- 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 0x49, 0x64,
-- 0x60, 0x08, 0x20, 0x00, 0x6b, 0x80, 0x49, 0x63,
-- 0x60, 0x08, 0x20, 0x00, 0x6b, 0xc0, 0x49, 0x62,
-- 0x60, 0x08, 0x20, 0x00, 0x6c, 0x00, 0x49, 0x61,
-- 0x60, 0x08, 0x20, 0x00, 0x6c, 0x40, 0x49, 0x60,
-- 0x60, 0x08, 0x20, 0x00, 0x6c, 0x80, 0x49, 0x5f,
-- 0x60, 0x08, 0x20, 0x00, 0x6c, 0xc0, 0x49, 0x5e,
-- 0x60, 0x08, 0x20, 0x00, 0x6e, 0xc0, 0x49, 0x5d,
-- 0x60, 0x08, 0x20, 0x80, 0x6d, 0x00, 0x49, 0x5c,
-- 0x60, 0x08, 0x20, 0x80, 0x6d, 0x40, 0x49, 0x5b,
-- 0x60, 0x08, 0x20, 0x80, 0x6d, 0x80, 0x49, 0x5a,
-- 0x60, 0x08, 0x20, 0x00, 0x6d, 0x00, 0x49, 0x59,
-- 0x60, 0x08, 0x20, 0x00, 0x6d, 0x40, 0x49, 0x58,
-- 0x60, 0x08, 0x20, 0x00, 0x6d, 0x80, 0x49, 0x57,
-- 0x60, 0x08, 0x20, 0x00, 0x6d, 0xc0, 0x49, 0x56,
-- 0x60, 0x08, 0x20, 0x80, 0x6a, 0xc0, 0x49, 0x55,
-- 0x60, 0x08, 0x20, 0x80, 0x6d, 0xc0, 0x49, 0x54,
-- 0x60, 0x08, 0x20, 0x80, 0x6c, 0xc0, 0x49, 0x53,
-- 0x60, 0x08, 0x20, 0x80, 0x68, 0x40, 0x49, 0x52,
-- 0x60, 0x08, 0x20, 0x80, 0x68, 0x80, 0x49, 0x51,
-- 0x60, 0x08, 0x20, 0x80, 0x68, 0xc0, 0x49, 0x50,
-- 0x60, 0x08, 0x20, 0x80, 0x69, 0x00, 0x49, 0x4f,
-- 0x60, 0x08, 0x20, 0x80, 0x69, 0x40, 0x49, 0x4e,
-- 0x60, 0x08, 0x20, 0x80, 0x69, 0x80, 0x49, 0x4d,
-- 0x60, 0x08, 0x20, 0x80, 0x69, 0xc0, 0x49, 0x4c,
-- 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x49, 0x4b,
-- 0x60, 0x08, 0x20, 0x80, 0x6a, 0x40, 0x49, 0x4a,
-- 0x60, 0x08, 0x20, 0x80, 0x6a, 0x80, 0x49, 0x49,
-- 0x60, 0x08, 0x20, 0x00, 0x6f, 0x00, 0x49, 0x48,
-- 0x60, 0x08, 0x20, 0x00, 0x6f, 0x40, 0x49, 0x47,
-- 0x60, 0x08, 0x20, 0x80, 0x6c, 0x40, 0x49, 0x46,
-- 0x60, 0x08, 0x20, 0x80, 0x6c, 0x80, 0x49, 0x45,
-- 0x60, 0x08, 0x20, 0x80, 0x6e, 0x40, 0x49, 0x44,
-- 0x60, 0x08, 0x20, 0x80, 0x6e, 0x80, 0x49, 0x43,
-- 0x60, 0x08, 0x20, 0x00, 0x49, 0x42, 0x60, 0x08,
-- 0x20, 0x00, 0x49, 0x41, 0x60, 0x48, 0x48, 0x41,
-- 0x49, 0x3f, 0x60, 0x88, 0x48, 0x40, 0x49, 0x3e,
-- 0x60, 0xc8, 0x20, 0xff, 0x30, 0x01, 0x68, 0x40,
-- 0x49, 0x3e, 0x60, 0x08, 0x20, 0x80, 0x6e, 0xc0,
-- 0x49, 0x3d, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x00,
-- 0x49, 0x3c, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x40,
-- 0x49, 0x3b, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x80,
-- 0x49, 0x3a, 0x60, 0x08, 0x20, 0x80, 0x6f, 0xc0,
-- 0x49, 0x39, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01,
-- 0x68, 0x80, 0x49, 0x38, 0x60, 0x08, 0x47, 0x70,
-- 0x2e, 0x08, 0x5d, 0xbc, 0x2e, 0x08, 0x5d, 0xc0,
-- 0x64, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x5d, 0xc8,
-- 0x64, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xcc,
-- 0x2e, 0x08, 0x5d, 0xc4, 0x64, 0x00, 0x04, 0x00,
-- 0x2e, 0x08, 0x5d, 0xd0, 0x9e, 0x00, 0x00, 0x00,
-- 0x2e, 0x08, 0x5d, 0xe8, 0x9e, 0x00, 0x05, 0x00,
-- 0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x94, 0x9c,
-- 0x2e, 0x08, 0x94, 0xa0, 0x2e, 0x08, 0x94, 0xa4,
-- 0x2e, 0x08, 0x94, 0xa8, 0x2e, 0x08, 0x5d, 0xd8,
-- 0x2e, 0x08, 0x5d, 0xdc, 0x2e, 0x08, 0x5d, 0xec,
-- 0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4,
-- 0x2e, 0x08, 0x5d, 0xf8, 0x2e, 0x08, 0x5d, 0xe0,
-- 0x2e, 0x08, 0x5d, 0xe4, 0x2e, 0x08, 0x60, 0x6c,
-- 0x2e, 0x08, 0x60, 0x70, 0x2e, 0x08, 0x5d, 0xfc,
-- 0x2e, 0x08, 0x5e, 0x00, 0x2e, 0x08, 0x5e, 0x2c,
-- 0x2e, 0x08, 0x5e, 0x04, 0x2e, 0x08, 0x5e, 0x08,
-- 0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x5e, 0x10,
-- 0x2e, 0x08, 0x5e, 0x14, 0x2e, 0x08, 0x5e, 0x18,
-- 0x2e, 0x08, 0x5e, 0x1c, 0x2e, 0x08, 0x5e, 0x20,
-- 0x2e, 0x08, 0x5e, 0x24, 0x2e, 0x08, 0x5e, 0x28,
-- 0x2e, 0x08, 0x5d, 0xb0, 0x2e, 0x08, 0x5d, 0xb4,
-- 0x2e, 0x08, 0x7c, 0x44, 0x2e, 0x08, 0x5e, 0x54,
-- 0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x60, 0x74,
-- 0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00,
-- 0xcc, 0x1f, 0xfe, 0x00, 0x2e, 0x08, 0x5e, 0x40,
-- 0x2e, 0x08, 0x5e, 0x58, 0x2e, 0x08, 0x5e, 0x38,
-- 0x2e, 0x08, 0x5e, 0x3c, 0x2e, 0x08, 0x7c, 0x40,
-- 0x2e, 0x08, 0x7c, 0x18, 0x2e, 0x08, 0x5e, 0x48,
-- 0x49, 0x4f, 0x68, 0x0a, 0x23, 0x04, 0x43, 0x1a,
-- 0x60, 0x0a, 0x21, 0xff, 0x4a, 0x4d, 0x68, 0x12,
-- 0x32, 0x40, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x4b,
-- 0x68, 0x12, 0x32, 0x40, 0x76, 0x11, 0x21, 0xff,
-- 0x4a, 0x48, 0x68, 0x12, 0x32, 0x60, 0x72, 0x11,
-- 0x21, 0xff, 0x4a, 0x46, 0x68, 0x12, 0x32, 0x20,
-- 0x72, 0x11, 0x21, 0xff, 0x4a, 0x43, 0x68, 0x12,
-- 0x32, 0x20, 0x76, 0x11, 0x21, 0xff, 0x4a, 0x41,
-- 0x68, 0x12, 0x32, 0x60, 0x76, 0x11, 0x21, 0x00,
-- 0x4a, 0x3e, 0x68, 0x12, 0x32, 0x40, 0x72, 0x91,
-- 0x21, 0x00, 0x4a, 0x3c, 0x68, 0x12, 0x32, 0x40,
-- 0x76, 0x91, 0x21, 0x00, 0x4a, 0x39, 0x68, 0x12,
-- 0x32, 0x60, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x37,
-- 0x68, 0x12, 0x32, 0x20, 0x72, 0x91, 0x21, 0x00,
-- 0x4a, 0x34, 0x68, 0x12, 0x32, 0x20, 0x76, 0x91,
-- 0x21, 0x00, 0x4a, 0x32, 0x68, 0x12, 0x32, 0x60,
-- 0x76, 0x91, 0x21, 0x00, 0x4a, 0x2f, 0x68, 0x12,
-- 0x32, 0x80, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x2d,
-- 0x68, 0x12, 0x32, 0x80, 0x70, 0x51, 0x21, 0x00,
-- 0x4a, 0x2a, 0x68, 0x12, 0x32, 0x80, 0x70, 0x91,
-- 0x21, 0x00, 0x4a, 0x29, 0x60, 0x11, 0x21, 0x00,
-- 0x4a, 0x28, 0x64, 0x11, 0x21, 0x03, 0x4a, 0x28,
-- 0x61, 0x11, 0x49, 0x28, 0x68, 0x0a, 0x4b, 0x28,
-- 0x43, 0x1a, 0x60, 0x0a, 0x49, 0x26, 0x22, 0x33,
-- 0x06, 0x52, 0x60, 0x51, 0x21, 0x00, 0x4a, 0x25,
-- 0x70, 0x11, 0x21, 0x00, 0x4a, 0x23, 0x70, 0x51,
-- 0x21, 0x00, 0x4a, 0x22, 0x70, 0x91, 0x21, 0x00,
-- 0x4a, 0x20, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x1f,
-- 0x71, 0x11, 0x21, 0x00, 0x4a, 0x1d, 0x71, 0x51,
-- 0x21, 0x00, 0x4a, 0x1c, 0x71, 0x91, 0x21, 0x00,
-- 0x4a, 0x1a, 0x71, 0xd1, 0x21, 0x00, 0x4a, 0x19,
-- 0x72, 0x11, 0x21, 0x00, 0x4a, 0x17, 0x72, 0x51,
-- 0x21, 0x00, 0x4a, 0x16, 0x72, 0x91, 0x21, 0x00,
-- 0x4a, 0x14, 0x72, 0xd1, 0x21, 0x00, 0x4a, 0x13,
-- 0x73, 0x11, 0x21, 0xff, 0x4a, 0x11, 0x70, 0x11,
-- 0x21, 0x00, 0x4a, 0x10, 0x70, 0x11, 0x21, 0x00,
-- 0x4a, 0x0e, 0x70, 0x51, 0x20, 0x00, 0x28, 0x20,
-- 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x41, 0x06, 0x08,
-- 0x0e, 0x00, 0xe7, 0xf8, 0x21, 0xff, 0x4a, 0x03,
-- 0x68, 0x12, 0x54, 0x11, 0xe7, 0xf6, 0x47, 0x70,
-- 0x66, 0x00, 0x01, 0x18, 0x2e, 0x08, 0x7c, 0x44,
-- 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80,
-- 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08,
-- 0x23, 0x48, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x48,
-- 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39,
-- 0x0e, 0x09, 0x29, 0x05, 0xd2, 0x40, 0xa3, 0x02,
-- 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x03, 0x14, 0x07, 0x0d, 0x13, 0x00, 0x78, 0x10,
-- 0x4b, 0x1f, 0x70, 0x18, 0xe0, 0x38, 0x78, 0x50,
-- 0x4b, 0x1e, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x58,
-- 0xe0, 0x32, 0x78, 0x10, 0x4b, 0x1b, 0x68, 0x1b,
-- 0x33, 0x80, 0x71, 0x18, 0xe0, 0x2c, 0xe0, 0x2b,
-- 0x78, 0x10, 0x4b, 0x17, 0x70, 0x18, 0x78, 0x50,
-- 0x4b, 0x15, 0x70, 0x58, 0x78, 0x90, 0x4b, 0x14,
-- 0x70, 0x98, 0x78, 0xd0, 0x4b, 0x12, 0x70, 0xd8,
-- 0x79, 0x10, 0x4b, 0x11, 0x71, 0x18, 0x79, 0x50,
-- 0x4b, 0x0f, 0x71, 0x58, 0x79, 0x90, 0x4b, 0x0e,
-- 0x71, 0x98, 0x79, 0xd0, 0x4b, 0x0c, 0x71, 0xd8,
-- 0x7a, 0x10, 0x4b, 0x0b, 0x72, 0x18, 0x7a, 0x50,
-- 0x4b, 0x09, 0x72, 0x58, 0x7a, 0x90, 0x4b, 0x08,
-- 0x72, 0x98, 0x7a, 0xd0, 0x4b, 0x06, 0x72, 0xd8,
-- 0x7b, 0x10, 0x4b, 0x05, 0x73, 0x18, 0xe0, 0x03,
-- 0x20, 0x4a, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xff,
-- 0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0x48, 0x2e, 0x08, 0x7c, 0x44,
-- 0xb5, 0xf3, 0x1c, 0x07, 0x06, 0x3e, 0x0e, 0x36,
-- 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x2e, 0x20,
-- 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x02, 0xd0, 0x03,
-- 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b,
-- 0x48, 0xb8, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80,
-- 0x28, 0x00, 0xd1, 0x39, 0x48, 0xb5, 0x68, 0x00,
-- 0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x33,
-- 0x2c, 0x00, 0xd1, 0x17, 0x48, 0xb1, 0x68, 0x00,
-- 0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x2b,
-- 0x48, 0xae, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80,
-- 0x28, 0x00, 0xd1, 0x25, 0x48, 0xab, 0x68, 0x00,
-- 0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x1f,
-- 0x48, 0xa8, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80,
-- 0x28, 0x00, 0xd1, 0x19, 0x2c, 0x01, 0xd1, 0x19,
-- 0x48, 0xa4, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80,
-- 0x28, 0x00, 0xd1, 0x11, 0x48, 0xa1, 0x68, 0x00,
-- 0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0b,
-- 0x48, 0x9e, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80,
-- 0x28, 0x00, 0xd1, 0x05, 0x48, 0x9b, 0x68, 0x00,
-- 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x01,
-- 0x20, 0x49, 0xe7, 0xb3, 0x48, 0x97, 0x68, 0x00,
-- 0x55, 0x84, 0x2c, 0xff, 0xd0, 0x73, 0x20, 0x01,
-- 0x49, 0x95, 0x60, 0x48, 0x2c, 0x05, 0xd2, 0x6f,
-- 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x02, 0x34, 0x30, 0x30, 0x30, 0x00, 0x20, 0x02,
-- 0x49, 0x90, 0x61, 0x88, 0x48, 0x90, 0x6a, 0xc0,
-- 0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x01,
-- 0x23, 0x01, 0x07, 0x5b, 0x43, 0x19, 0x60, 0x01,
-- 0x48, 0x8e, 0x49, 0x8b, 0x62, 0xc8, 0x48, 0x8c,
-- 0x68, 0x01, 0x4b, 0x8d, 0x40, 0x19, 0x60, 0x01,
-- 0x20, 0x01, 0x21, 0x31, 0x06, 0x49, 0x61, 0x88,
-- 0x20, 0x15, 0x21, 0x31, 0x06, 0x49, 0x61, 0x08,
-- 0x20, 0x0f, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8,
-- 0x20, 0x0c, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8,
-- 0x20, 0x54, 0x21, 0x31, 0x06, 0x49, 0x62, 0xc8,
-- 0x20, 0x37, 0x21, 0x31, 0x06, 0x49, 0x60, 0x88,
-- 0xe0, 0x56, 0x20, 0x00, 0x49, 0x79, 0x61, 0x88,
-- 0xe0, 0x52, 0x20, 0x01, 0x49, 0x77, 0x61, 0x88,
-- 0x20, 0x01, 0x49, 0x7c, 0x62, 0x88, 0x48, 0x7c,
-- 0x78, 0x00, 0x06, 0x80, 0x0e, 0x80, 0x02, 0x80,
-- 0x49, 0x79, 0x78, 0x49, 0x07, 0xc9, 0x0d, 0x89,
-- 0x43, 0x08, 0x49, 0x77, 0x78, 0x89, 0x07, 0xc9,
-- 0x0d, 0xc9, 0x43, 0x08, 0x49, 0x74, 0x78, 0xc9,
-- 0x07, 0x89, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08,
-- 0x49, 0x71, 0x79, 0x09, 0x07, 0x89, 0x0f, 0x89,
-- 0x01, 0x09, 0x43, 0x08, 0x49, 0x6e, 0x79, 0x49,
-- 0x07, 0x89, 0x0f, 0x89, 0x00, 0x89, 0x43, 0x08,
-- 0x49, 0x6b, 0x79, 0x89, 0x07, 0x89, 0x0f, 0x89,
-- 0x43, 0x08, 0x49, 0x68, 0x62, 0x08, 0x48, 0x68,
-- 0x79, 0xc0, 0x07, 0xc0, 0x0e, 0x40, 0x49, 0x66,
-- 0x7a, 0x09, 0x07, 0xc9, 0xe0, 0x01, 0xe0, 0x21,
-- 0xe0, 0x18, 0x0e, 0xc9, 0x43, 0x08, 0x49, 0x62,
-- 0x7a, 0x49, 0x07, 0xc9, 0x0f, 0x09, 0x43, 0x08,
-- 0x49, 0x5f, 0x7a, 0x89, 0x07, 0xc9, 0x0f, 0x49,
-- 0x43, 0x08, 0x49, 0x5d, 0x7a, 0xc9, 0x07, 0xc9,
-- 0x0f, 0x89, 0x43, 0x08, 0x49, 0x5a, 0x7b, 0x09,
-- 0x07, 0xc9, 0x0f, 0xc9, 0x43, 0x08, 0x49, 0x57,
-- 0x62, 0x48, 0xe0, 0x01, 0x20, 0x4a, 0xe7, 0x1d,
-- 0x48, 0x51, 0x68, 0x01, 0x4b, 0x55, 0x40, 0x19,
-- 0x60, 0x01, 0xe0, 0x8f, 0x48, 0x49, 0x68, 0x00,
-- 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x08,
-- 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x00,
-- 0x22, 0x00, 0x49, 0x4f, 0xf7, 0xf4, 0xfc, 0x10,
-- 0xb0, 0x01, 0x20, 0x00, 0x49, 0x42, 0x60, 0x48,
-- 0x48, 0x45, 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19,
-- 0x60, 0x01, 0x48, 0x4a, 0x21, 0x33, 0x06, 0x49,
-- 0x60, 0x48, 0x48, 0x49, 0x68, 0x01, 0x23, 0x04,
-- 0x43, 0x19, 0x60, 0x01, 0x2c, 0x00, 0xd1, 0x0e,
-- 0x48, 0x3c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a,
-- 0x48, 0x3a, 0x68, 0x00, 0x49, 0x38, 0x62, 0xc8,
-- 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 0x20, 0x00,
-- 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 0x20, 0x00,
-- 0x49, 0x30, 0x68, 0x09, 0x31, 0x80, 0x70, 0x48,
-- 0x20, 0x00, 0x49, 0x2e, 0x68, 0x09, 0x31, 0x80,
-- 0x70, 0x88, 0x20, 0x00, 0x49, 0x39, 0x60, 0x08,
-- 0x20, 0x00, 0x49, 0x39, 0x64, 0x08, 0x20, 0x03,
-- 0x49, 0x2a, 0x61, 0x08, 0x25, 0x00, 0x2d, 0x20,
-- 0xd3, 0x02, 0xe0, 0x06, 0x35, 0x01, 0xe7, 0xfa,
-- 0x20, 0xff, 0x49, 0x24, 0x68, 0x09, 0x55, 0x48,
-- 0xe7, 0xf8, 0x20, 0xff, 0x49, 0x21, 0x68, 0x09,
-- 0x31, 0x40, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1f,
-- 0x68, 0x09, 0x31, 0x40, 0x76, 0x08, 0x20, 0xff,
-- 0x49, 0x1c, 0x68, 0x09, 0x31, 0x60, 0x72, 0x08,
-- 0x20, 0xff, 0x49, 0x1a, 0x68, 0x09, 0x31, 0x20,
-- 0x72, 0x08, 0x20, 0xff, 0x49, 0x17, 0x68, 0x09,
-- 0x31, 0x20, 0x76, 0x08, 0x20, 0xff, 0x49, 0x15,
-- 0x68, 0x09, 0x31, 0x60, 0x76, 0x08, 0x20, 0x00,
-- 0x49, 0x12, 0x68, 0x09, 0x31, 0x40, 0x72, 0x88,
-- 0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x31, 0x40,
-- 0x76, 0x88, 0x20, 0x00, 0x49, 0x0d, 0x68, 0x09,
-- 0x31, 0x60, 0x72, 0x88, 0x20, 0x00, 0x49, 0x0b,
-- 0x68, 0x09, 0x31, 0x20, 0x72, 0x88, 0x20, 0x00,
-- 0x49, 0x08, 0x68, 0x09, 0x31, 0x20, 0x76, 0x88,
-- 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x31, 0x60,
-- 0x76, 0x88, 0x20, 0x00, 0x49, 0x03, 0x68, 0x09,
-- 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0xe6, 0x85,
-- 0xe6, 0x84, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44,
-- 0x62, 0x00, 0x03, 0x00, 0x66, 0x00, 0x01, 0x00,
-- 0xa0, 0x00, 0x0d, 0x80, 0x2e, 0x08, 0x20, 0x08,
-- 0x66, 0x00, 0x00, 0x08, 0x2e, 0x01, 0x8b, 0xa8,
-- 0xdf, 0xff, 0xff, 0xff, 0x62, 0x01, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0x48, 0xfc, 0xb7, 0xff, 0xff,
-- 0x00, 0x00, 0xff, 0xff, 0x23, 0x48, 0x00, 0x00,
-- 0x66, 0x00, 0x01, 0x18, 0x9e, 0x00, 0x0a, 0x00,
-- 0x9e, 0x00, 0x0a, 0x80, 0xb5, 0xf7, 0x1c, 0x17,
-- 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 0x99, 0x01,
-- 0x06, 0x0d, 0x0e, 0x2d, 0x48, 0x6a, 0x68, 0x00,
-- 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 0x20, 0xa2,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf7,
-- 0x48, 0x64, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03,
-- 0x29, 0x04, 0xd1, 0x01, 0x20, 0x58, 0xe7, 0xef,
-- 0x48, 0x60, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03,
-- 0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, 0x0b,
-- 0x48, 0x5c, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01,
-- 0x29, 0x00, 0xd1, 0x05, 0x48, 0x59, 0x69, 0x80,
-- 0x28, 0x01, 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01,
-- 0x20, 0x4d, 0xe7, 0xd9, 0x29, 0x02, 0xd1, 0x05,
-- 0x48, 0x53, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80,
-- 0x28, 0x00, 0xd1, 0x17, 0x29, 0x03, 0xd1, 0x05,
-- 0x48, 0x4f, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80,
-- 0x28, 0x00, 0xd1, 0x0f, 0x29, 0x00, 0xd1, 0x05,
-- 0x48, 0x4b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80,
-- 0x28, 0x00, 0xd1, 0x07, 0x29, 0x01, 0xd1, 0x07,
-- 0x48, 0x47, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80,
-- 0x28, 0x00, 0xd0, 0x01, 0x20, 0x4e, 0xe7, 0xb7,
-- 0x68, 0x78, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x4c,
-- 0xe7, 0xb2, 0x23, 0x01, 0x01, 0x08, 0x4e, 0x40,
-- 0x68, 0x36, 0x19, 0x80, 0x30, 0x20, 0x72, 0x83,
-- 0x2d, 0x01, 0xd1, 0x0b, 0x20, 0x33, 0x06, 0x40,
-- 0x6e, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0,
-- 0x00, 0xd3, 0x4e, 0x3b, 0x68, 0x36, 0x19, 0x9b,
-- 0x60, 0x58, 0xe0, 0x12, 0x2d, 0x02, 0xd1, 0x0a,
-- 0x48, 0x38, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b,
-- 0x1a, 0xc3, 0x00, 0xd0, 0x4e, 0x34, 0x68, 0x36,
-- 0x19, 0x80, 0x60, 0x43, 0xe0, 0x05, 0x68, 0x3b,
-- 0x00, 0xd0, 0x4e, 0x31, 0x68, 0x36, 0x19, 0x80,
-- 0x60, 0x43, 0x68, 0x3b, 0x01, 0x08, 0x4e, 0x2c,
-- 0x68, 0x36, 0x19, 0x80, 0x62, 0x03, 0x68, 0x7b,
-- 0x01, 0x08, 0x4e, 0x29, 0x68, 0x36, 0x19, 0x80,
-- 0x62, 0x43, 0x01, 0x08, 0x4b, 0x26, 0x68, 0x1b,
-- 0x18, 0xc0, 0x62, 0xc7, 0x01, 0x08, 0x4b, 0x24,
-- 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x45,
-- 0x01, 0x08, 0x4b, 0x21, 0x68, 0x1b, 0x18, 0xc0,
-- 0x30, 0x20, 0x72, 0x02, 0x20, 0x00, 0x60, 0x78,
-- 0x20, 0x00, 0x72, 0x78, 0x20, 0x00, 0x4b, 0x20,
-- 0x60, 0x18, 0x20, 0x00, 0x4b, 0x1f, 0x64, 0x18,
-- 0x01, 0x08, 0x4b, 0x19, 0x68, 0x1b, 0x18, 0xc0,
-- 0x6a, 0x40, 0x28, 0xbc, 0xdd, 0x01, 0x24, 0xbc,
-- 0xe0, 0x04, 0x01, 0x08, 0x4b, 0x14, 0x68, 0x1b,
-- 0x18, 0xc0, 0x6a, 0x44, 0x48, 0x18, 0x60, 0x04,
-- 0x29, 0x01, 0xd1, 0x14, 0x20, 0x01, 0x4b, 0x17,
-- 0x62, 0x98, 0x48, 0x17, 0x68, 0x03, 0x04, 0x1b,
-- 0x0c, 0x1b, 0x60, 0x03, 0x48, 0x14, 0x04, 0x23,
-- 0x68, 0x06, 0x43, 0x33, 0x60, 0x03, 0x48, 0x13,
-- 0x68, 0x06, 0x23, 0x20, 0x43, 0x33, 0x60, 0x03,
-- 0x20, 0x01, 0x4b, 0x0e, 0x63, 0x18, 0x48, 0x07,
-- 0x69, 0x80, 0x28, 0x00, 0xd1, 0x04, 0x48, 0x0e,
-- 0x68, 0x06, 0x23, 0x28, 0x43, 0x33, 0x60, 0x03,
-- 0x20, 0x00, 0xe7, 0x31, 0xe7, 0x30, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00,
-- 0x2e, 0x08, 0x5d, 0xd4, 0x66, 0x00, 0x00, 0x80,
-- 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80,
-- 0x62, 0x00, 0x03, 0x00, 0x62, 0x01, 0x00, 0x00,
-- 0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24,
-- 0x64, 0x00, 0x00, 0x60, 0xb5, 0xf3, 0x1c, 0x0f,
-- 0x98, 0x00, 0x06, 0x06, 0x0e, 0x36, 0xb0, 0x82,
-- 0x4d, 0x68, 0x49, 0x69, 0x91, 0x01, 0x48, 0x69,
-- 0x68, 0x00, 0x5d, 0x84, 0x2e, 0x20, 0xdb, 0x05,
-- 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02,
-- 0x20, 0x4b, 0xb0, 0x02, 0xe7, 0xf6, 0x48, 0x62,
-- 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02,
-- 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04,
-- 0xd1, 0x0b, 0x48, 0x5d, 0x69, 0x80, 0x28, 0x02,
-- 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x5a,
-- 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01,
-- 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x02, 0xe7, 0xdd,
-- 0x48, 0x54, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80,
-- 0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x02,
-- 0xe7, 0xd4, 0x48, 0x50, 0x68, 0x00, 0x30, 0x80,
-- 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50,
-- 0xb0, 0x02, 0xe7, 0xcb, 0x68, 0x78, 0x28, 0x00,
-- 0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x02, 0xe7, 0xc5,
-- 0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc,
-- 0xf0, 0x01, 0xff, 0xac, 0x29, 0x00, 0xd0, 0x02,
-- 0x20, 0x59, 0xb0, 0x02, 0xe7, 0xba, 0x48, 0x43,
-- 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x21, 0x01,
-- 0x40, 0x81, 0x48, 0x41, 0x68, 0x40, 0x40, 0x08,
-- 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x02, 0x20, 0x51,
-- 0xb0, 0x02, 0xe7, 0xab, 0x20, 0x33, 0x06, 0x40,
-- 0x6b, 0x80, 0x90, 0x00, 0x23, 0x04, 0x40, 0x18,
-- 0xd0, 0x02, 0x20, 0x52, 0xb0, 0x02, 0xe7, 0xa1,
-- 0x2c, 0x00, 0xd1, 0x04, 0x48, 0x37, 0x68, 0x01,
-- 0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x20, 0x01,
-- 0x49, 0x32, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88,
-- 0x68, 0x38, 0x49, 0x30, 0x68, 0x09, 0x67, 0x08,
-- 0x68, 0x78, 0x49, 0x2e, 0x68, 0x09, 0x67, 0x48,
-- 0x48, 0x2c, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00,
-- 0x49, 0x2a, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48,
-- 0x48, 0x28, 0x68, 0x00, 0x30, 0x60, 0x76, 0x06,
-- 0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78,
-- 0x48, 0x24, 0x68, 0x00, 0x5d, 0x80, 0x28, 0x01,
-- 0xd1, 0x02, 0x20, 0x01, 0x49, 0x24, 0x62, 0x88,
-- 0x98, 0x00, 0x01, 0x00, 0x19, 0x45, 0x48, 0x1f,
-- 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07,
-- 0x48, 0x20, 0x60, 0xa8, 0x20, 0xbc, 0x49, 0x1b,
-- 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d,
-- 0x48, 0x18, 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01,
-- 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 0x48, 0x15,
-- 0x68, 0x00, 0x6f, 0x40, 0x49, 0x13, 0x68, 0x09,
-- 0x31, 0x80, 0x70, 0x08, 0x48, 0x11, 0x68, 0x00,
-- 0x30, 0x80, 0x78, 0x80, 0x00, 0x43, 0x18, 0x18,
-- 0x01, 0x80, 0x99, 0x01, 0x18, 0x41, 0x91, 0x01,
-- 0x48, 0x0c, 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28,
-- 0x99, 0x01, 0x1d, 0x08, 0x60, 0x68, 0x20, 0x01,
-- 0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01,
-- 0x40, 0x88, 0x21, 0x33, 0x06, 0x49, 0x63, 0x48,
-- 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x3a, 0xb0, 0x02,
-- 0xe7, 0x38, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80,
-- 0x9e, 0x00, 0x0b, 0x80, 0x2e, 0x08, 0x7c, 0x44,
-- 0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c,
-- 0x62, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbc,
-- 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x98, 0x01,
-- 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x82,
-- 0x48, 0xf9, 0x68, 0x00, 0x99, 0x02, 0x5c, 0x44,
-- 0x98, 0x02, 0x28, 0x20, 0xdb, 0x05, 0x20, 0xa2,
-- 0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b,
-- 0xb0, 0x03, 0xe7, 0xf6, 0x48, 0xf1, 0x69, 0x80,
-- 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03,
-- 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b,
-- 0x48, 0xec, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01,
-- 0x2c, 0x00, 0xd1, 0x05, 0x48, 0xe9, 0x69, 0x80,
-- 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02,
-- 0x20, 0x4d, 0xb0, 0x03, 0xe7, 0xdd, 0x48, 0xe4,
-- 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00,
-- 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x03, 0xe7, 0xd4,
-- 0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c,
-- 0xb0, 0x03, 0xe7, 0xce, 0x2c, 0x04, 0xd1, 0x08,
-- 0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xfe, 0xce,
-- 0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x03,
-- 0xe7, 0xc3, 0x48, 0xd7, 0x68, 0x00, 0x30, 0x80,
-- 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50,
-- 0xb0, 0x03, 0xe7, 0xba, 0x2c, 0x00, 0xd1, 0x04,
-- 0x48, 0xd3, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19,
-- 0x60, 0x01, 0x48, 0xd2, 0x68, 0x01, 0x23, 0x8d,
-- 0x05, 0x9b, 0x43, 0x19, 0x60, 0x01, 0x48, 0xd0,
-- 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x20, 0x01,
-- 0x49, 0xc9, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88,
-- 0x68, 0x38, 0x49, 0xc7, 0x68, 0x09, 0x67, 0x08,
-- 0x68, 0x78, 0x49, 0xc5, 0x68, 0x09, 0x67, 0x48,
-- 0x48, 0xc3, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00,
-- 0x49, 0xc1, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48,
-- 0x98, 0x02, 0x49, 0xbf, 0x68, 0x09, 0x31, 0x60,
-- 0x76, 0x08, 0x20, 0x00, 0x49, 0xbc, 0x68, 0x09,
-- 0x6f, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x49, 0xba,
-- 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xb8,
-- 0x68, 0x00, 0x99, 0x02, 0x5c, 0x40, 0x28, 0x01,
-- 0xd1, 0x02, 0x20, 0x01, 0x49, 0xb9, 0x62, 0x88,
-- 0x48, 0xb3, 0x68, 0x00, 0x30, 0x80, 0x78, 0x81,
-- 0x20, 0x01, 0x40, 0x88, 0x49, 0xb1, 0x68, 0x49,
-- 0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x1b,
-- 0x20, 0x00, 0x49, 0xad, 0x68, 0x09, 0x31, 0x60,
-- 0x76, 0x88, 0x20, 0x51, 0x49, 0xaa, 0x68, 0x09,
-- 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xa8, 0x68, 0x00,
-- 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07,
-- 0x48, 0xa5, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01,
-- 0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfd, 0xb0,
-- 0x20, 0x51, 0xb0, 0x03, 0xe7, 0x55, 0xe1, 0x6c,
-- 0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00,
-- 0x99, 0x00, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x07,
-- 0x20, 0x04, 0xf0, 0x00, 0xfc, 0xb3, 0x20, 0x33,
-- 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 0xe7, 0xf3,
-- 0x4d, 0x9d, 0x99, 0x00, 0x01, 0x08, 0x19, 0x45,
-- 0x48, 0x95, 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc,
-- 0xdd, 0x07, 0x48, 0x9a, 0x60, 0xa8, 0x20, 0xbc,
-- 0x49, 0x91, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08,
-- 0xe0, 0x0d, 0x48, 0x8f, 0x68, 0x00, 0x6f, 0x40,
-- 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8,
-- 0x48, 0x8b, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x8a,
-- 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0x48, 0x90,
-- 0x90, 0x01, 0x48, 0x87, 0x68, 0x00, 0x30, 0x80,
-- 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80,
-- 0x99, 0x01, 0x18, 0x40, 0x90, 0x01, 0x48, 0x82,
-- 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 0x98, 0x01,
-- 0x30, 0x04, 0x60, 0x68, 0x20, 0x01, 0x06, 0x00,
-- 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 0x40, 0x88,
-- 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 0x48, 0x83,
-- 0x6b, 0x00, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18,
-- 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 0xfc, 0x6a,
-- 0xe7, 0xf5, 0x20, 0x01, 0x06, 0x00, 0x21, 0x33,
-- 0x06, 0x49, 0x60, 0x48, 0x4e, 0x7c, 0x48, 0x72,
-- 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x01, 0x00,
-- 0x19, 0x86, 0x98, 0x01, 0x30, 0x04, 0x60, 0x30,
-- 0x48, 0x78, 0x60, 0x70, 0x48, 0x6c, 0x68, 0x00,
-- 0x30, 0x80, 0x78, 0x00, 0x23, 0x01, 0x07, 0x9b,
-- 0x43, 0x18, 0x60, 0xb0, 0x20, 0x01, 0x05, 0x80,
-- 0x60, 0xf0, 0x48, 0x67, 0x68, 0x00, 0x30, 0x80,
-- 0x78, 0x81, 0x20, 0x01, 0x40, 0x88, 0x49, 0x65,
-- 0x60, 0xc8, 0x48, 0x63, 0x68, 0x00, 0x30, 0x60,
-- 0x7e, 0x00, 0x49, 0x61, 0x68, 0x09, 0x5c, 0x08,
-- 0x28, 0x00, 0xd0, 0x48, 0x28, 0x01, 0xd0, 0x47,
-- 0x28, 0x02, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x21,
-- 0xe0, 0x5a, 0x48, 0x67, 0x68, 0x01, 0x23, 0x02,
-- 0x43, 0x19, 0x60, 0x01, 0x48, 0x58, 0x68, 0x00,
-- 0x6f, 0x40, 0x49, 0x57, 0x68, 0x09, 0x31, 0x80,
-- 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05,
-- 0x48, 0x5f, 0x68, 0x01, 0x23, 0x10, 0x43, 0x19,
-- 0x60, 0x01, 0xe0, 0x05, 0x48, 0x5c, 0x68, 0x01,
-- 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01,
-- 0x48, 0x59, 0x68, 0x01, 0x23, 0x08, 0x43, 0x19,
-- 0x60, 0x01, 0xe0, 0x39, 0x48, 0x56, 0x68, 0x01,
-- 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x48, 0x48,
-- 0x68, 0x00, 0x6f, 0x40, 0x49, 0x46, 0x68, 0x09,
-- 0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc,
-- 0xd8, 0x05, 0x48, 0x4f, 0x68, 0x01, 0x23, 0x10,
-- 0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, 0x48, 0x4c,
-- 0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19,
-- 0x60, 0x01, 0x48, 0x49, 0x68, 0x01, 0x23, 0x08,
-- 0x43, 0x19, 0x60, 0x01, 0xe0, 0x18, 0xe0, 0x17,
-- 0x48, 0x46, 0x68, 0x01, 0x04, 0x09, 0x0c, 0x09,
-- 0x60, 0x01, 0x48, 0x44, 0x49, 0x36, 0x68, 0x09,
-- 0x31, 0x80, 0x78, 0x09, 0x04, 0x09, 0x68, 0x02,
-- 0x43, 0x11, 0x60, 0x01, 0x48, 0x40, 0x68, 0x01,
-- 0x23, 0x20, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01,
-- 0x20, 0x01, 0x49, 0x34, 0x63, 0x08, 0xe7, 0xff,
-- 0x48, 0x36, 0x6b, 0x00, 0x23, 0x01, 0x05, 0x9b,
-- 0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00,
-- 0xfb, 0xd1, 0xe7, 0xf5, 0x20, 0x01, 0x05, 0x80,
-- 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x26,
-- 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x23, 0x01,
-- 0x40, 0x58, 0x49, 0x23, 0x68, 0x09, 0x31, 0x80,
-- 0x70, 0x88, 0x48, 0x21, 0x68, 0x00, 0x6f, 0x40,
-- 0x49, 0x1f, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09,
-- 0x1a, 0x40, 0x49, 0x1d, 0x68, 0x09, 0x67, 0x48,
-- 0x48, 0x1b, 0x68, 0x00, 0x6f, 0xc0, 0x30, 0x04,
-- 0x49, 0x19, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09,
-- 0x68, 0x02, 0x18, 0x89, 0x60, 0x01, 0x48, 0x16,
-- 0x68, 0x00, 0x6f, 0x00, 0x49, 0x14, 0x68, 0x09,
-- 0x31, 0x80, 0x78, 0x09, 0x18, 0x40, 0x49, 0x12,
-- 0x68, 0x09, 0x67, 0x08, 0x48, 0x10, 0x68, 0x00,
-- 0x6f, 0x40, 0x28, 0x00, 0xd0, 0x00, 0xe6, 0xb3,
-- 0x48, 0x11, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48,
-- 0x48, 0x0e, 0x68, 0x01, 0x4b, 0x19, 0x40, 0x19,
-- 0x60, 0x01, 0x20, 0x48, 0x49, 0x08, 0x68, 0x09,
-- 0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, 0x49, 0x06,
-- 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x04,
-- 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff,
-- 0xd0, 0x29, 0x48, 0x01, 0xe0, 0x20, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00,
-- 0x62, 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x08,
-- 0x23, 0x48, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00,
-- 0x9e, 0x00, 0x09, 0x80, 0x40, 0x00, 0x00, 0xbc,
-- 0x9e, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, 0x80,
-- 0x9e, 0x00, 0x09, 0xc0, 0x66, 0x00, 0x01, 0xf0,
-- 0x64, 0x00, 0x00, 0x60, 0x62, 0x01, 0x00, 0x20,
-- 0x62, 0x01, 0x00, 0x24, 0xfc, 0xb7, 0xff, 0xff,
-- 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01,
-- 0x40, 0x88, 0xf0, 0x05, 0xfc, 0x45, 0x20, 0x00,
-- 0xb0, 0x03, 0xe5, 0xea, 0xb0, 0x02, 0xb0, 0x01,
-- 0xe5, 0xe7, 0xe5, 0xe6, 0xb5, 0xb0, 0x1c, 0x07,
-- 0x06, 0x3d, 0x0e, 0x2d, 0x48, 0x5d, 0x68, 0x00,
-- 0x5d, 0x44, 0x2d, 0x20, 0xdb, 0x03, 0x20, 0xa2,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x59,
-- 0x68, 0x00, 0x5d, 0x40, 0x28, 0xff, 0xd1, 0x01,
-- 0x20, 0x4b, 0xe7, 0xf5, 0x48, 0x56, 0x69, 0x80,
-- 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03,
-- 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b,
-- 0x48, 0x51, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01,
-- 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x4e, 0x69, 0x80,
-- 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02,
-- 0x20, 0x4d, 0xe7, 0xdd, 0xe0, 0x90, 0x48, 0x4b,
-- 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01,
-- 0x48, 0x49, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48,
-- 0x48, 0x48, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19,
-- 0x60, 0x01, 0x20, 0x00, 0x49, 0x41, 0x68, 0x09,
-- 0x31, 0x80, 0x70, 0x88, 0x20, 0x00, 0x49, 0x3f,
-- 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 0x20, 0xff,
-- 0x49, 0x3c, 0x68, 0x09, 0x55, 0x48, 0x2c, 0x00,
-- 0xd1, 0x03, 0x20, 0x18, 0x21, 0x31, 0x06, 0x49,
-- 0x62, 0x48, 0x01, 0x20, 0x49, 0x37, 0x68, 0x09,
-- 0x18, 0x40, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00,
-- 0xd0, 0x28, 0x20, 0x00, 0x49, 0x38, 0x60, 0x08,
-- 0x20, 0x00, 0x49, 0x38, 0x64, 0x08, 0x20, 0x03,
-- 0x49, 0x31, 0x61, 0x08, 0x21, 0x55, 0x01, 0x20,
-- 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x6a, 0xc0,
-- 0x72, 0x41, 0x21, 0x00, 0x01, 0x20, 0x4a, 0x2b,
-- 0x68, 0x12, 0x18, 0x80, 0x30, 0x20, 0x72, 0x81,
-- 0x01, 0x20, 0x49, 0x28, 0x68, 0x09, 0x18, 0x40,
-- 0x6a, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x09,
-- 0x01, 0x20, 0x49, 0x24, 0x68, 0x09, 0x18, 0x40,
-- 0x6a, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88,
-- 0xf0, 0x05, 0xfb, 0xbe, 0x48, 0x1f, 0x68, 0x00,
-- 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x2b,
-- 0x48, 0x1c, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0,
-- 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 0x49, 0x19,
-- 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 0x22, 0x00,
-- 0xb4, 0x04, 0x1c, 0x28, 0x23, 0x00, 0x22, 0x00,
-- 0x49, 0x1b, 0xf7, 0xf3, 0xfe, 0xcd, 0xb0, 0x01,
-- 0x20, 0x55, 0x49, 0x12, 0x68, 0x09, 0x6f, 0xc9,
-- 0x72, 0x48, 0x20, 0x00, 0x49, 0x0f, 0x68, 0x09,
-- 0x31, 0x60, 0x76, 0x88, 0x48, 0x0d, 0x68, 0x00,
-- 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07,
-- 0x48, 0x0a, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01,
-- 0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfb, 0x8c,
-- 0x48, 0x09, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48,
-- 0x48, 0x06, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19,
-- 0x60, 0x01, 0x20, 0x00, 0xe7, 0x4c, 0xe7, 0x4b,
-- 0xe7, 0x4a, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44,
-- 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08,
-- 0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18,
-- 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80,
-- 0x00, 0x00, 0xff, 0xff, 0xfc, 0xb7, 0xff, 0xff,
-- 0xb5, 0xff, 0x1c, 0x1f, 0x98, 0x00, 0x06, 0x02,
-- 0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d,
-- 0x98, 0x02, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x2d,
-- 0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04,
-- 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b,
-- 0xe7, 0xf7, 0x48, 0x27, 0x69, 0x80, 0x28, 0x00,
-- 0xd1, 0x05, 0x29, 0x02, 0xd0, 0x03, 0x29, 0x03,
-- 0xd0, 0x01, 0x29, 0x04, 0xd1, 0x0b, 0x48, 0x22,
-- 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x29, 0x00,
-- 0xd1, 0x05, 0x48, 0x1f, 0x69, 0x80, 0x28, 0x01,
-- 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d,
-- 0xe7, 0xdf, 0x29, 0x05, 0xd2, 0x2a, 0xa3, 0x02,
-- 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00,
-- 0x03, 0x07, 0x04, 0x05, 0x06, 0x00, 0xe0, 0x24,
-- 0xe0, 0x23, 0xe0, 0x22, 0xe0, 0x21, 0x01, 0x08,
-- 0x4b, 0x12, 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20,
-- 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x48, 0x0f,
-- 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00,
-- 0xd0, 0x02, 0x20, 0x49, 0xe7, 0xc1, 0xe0, 0x13,
-- 0x2d, 0x00, 0xd1, 0x05, 0x00, 0xa0, 0x4b, 0x0b,
-- 0x18, 0xc0, 0x68, 0x00, 0x60, 0x38, 0xe0, 0x04,
-- 0x68, 0x38, 0x00, 0xa6, 0x4b, 0x07, 0x18, 0xf3,
-- 0x60, 0x18, 0xe0, 0x02, 0x20, 0x4a, 0xe7, 0xb0,
-- 0xe7, 0xff, 0x20, 0x00, 0xe7, 0xad, 0xe7, 0xac,
-- 0xe7, 0xab, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44,
-- 0x66, 0x00, 0x01, 0x00, 0x62, 0x01, 0x00, 0x80,
-- 0xb5, 0xf7, 0xb0, 0x82, 0x98, 0x02, 0x06, 0x03,
-- 0x0e, 0x1b, 0x93, 0x00, 0x99, 0x03, 0x06, 0x08,
-- 0x0e, 0x00, 0x90, 0x01, 0x9a, 0x04, 0x06, 0x15,
-- 0x0e, 0x2d, 0xb0, 0x84, 0x4a, 0xca, 0x4f, 0xcb,
-- 0x48, 0xcb, 0x68, 0x00, 0x9b, 0x04, 0x5c, 0xc4,
-- 0x48, 0xca, 0x90, 0x02, 0x21, 0x00, 0x23, 0x00,
-- 0x93, 0x01, 0x9b, 0x04, 0x2b, 0x20, 0xdb, 0x05,
-- 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02,
-- 0x20, 0x4b, 0xb0, 0x06, 0xe7, 0xf6, 0x48, 0xc2,
-- 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00,
-- 0xd1, 0x03, 0x48, 0xbf, 0x69, 0x80, 0x28, 0x02,
-- 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x06, 0xe7, 0xe9,
-- 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 0x48, 0xb8,
-- 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00,
-- 0xd0, 0x02, 0x20, 0x50, 0xb0, 0x06, 0xe7, 0xdd,
-- 0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 0x48, 0xb2,
-- 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00,
-- 0xd0, 0x08, 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08,
-- 0x48, 0xad, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80,
-- 0x28, 0x00, 0xd1, 0x02, 0x20, 0x5a, 0xb0, 0x06,
-- 0xe7, 0xc8, 0x20, 0x00, 0x4b, 0xa8, 0x68, 0x1b,
-- 0x6f, 0xdb, 0x72, 0x58, 0x98, 0x05, 0x28, 0x00,
-- 0xd1, 0x50, 0x2d, 0x01, 0xd0, 0x01, 0x2d, 0x02,
-- 0xd1, 0x32, 0x4e, 0xa6, 0x68, 0x30, 0x23, 0x01,
-- 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 0x20, 0x00,
-- 0x4b, 0xa3, 0x60, 0x18, 0x48, 0x9e, 0x68, 0x00,
-- 0x30, 0x80, 0x78, 0x40, 0x00, 0x43, 0x18, 0x18,
-- 0x01, 0x80, 0x9b, 0x02, 0x18, 0xc0, 0x90, 0x02,
-- 0x98, 0x02, 0x68, 0x01, 0x48, 0x9a, 0x69, 0x80,
-- 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x01,
-- 0x23, 0x20, 0x43, 0x19, 0x4b, 0x99, 0x43, 0x19,
-- 0x98, 0x02, 0x60, 0x01, 0x4e, 0x98, 0x68, 0x30,
-- 0x23, 0x01, 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30,
-- 0x4e, 0x92, 0x68, 0x30, 0x4b, 0x95, 0x40, 0x18,
-- 0x60, 0x30, 0x2c, 0x00, 0xd1, 0x04, 0x20, 0x00,
-- 0x4b, 0x8b, 0x68, 0x1b, 0x33, 0x20, 0x72, 0x98,
-- 0x2d, 0x02, 0xd0, 0x04, 0x20, 0x01, 0x04, 0xc0,
-- 0x23, 0x33, 0x06, 0x5b, 0x60, 0x18, 0x2c, 0x00,
-- 0xd1, 0x0f, 0x20, 0xff, 0x02, 0x00, 0x40, 0x08,
-- 0xd1, 0x0b, 0x2d, 0x02, 0xd0, 0x09, 0x48, 0x82,
-- 0x68, 0x00, 0x30, 0x80, 0x78, 0x40, 0x23, 0x01,
-- 0x40, 0x58, 0x4b, 0x7f, 0x68, 0x1b, 0x33, 0x80,
-- 0x70, 0x58, 0xe0, 0xed, 0x2d, 0x01, 0xd1, 0x73,
-- 0x2c, 0x00, 0xd1, 0x72, 0x20, 0x31, 0x06, 0x40,
-- 0x68, 0x80, 0x23, 0x08, 0x40, 0x18, 0xd1, 0x3a,
-- 0x48, 0x7a, 0x68, 0x06, 0x23, 0x05, 0x05, 0x9b,
-- 0x43, 0x33, 0x60, 0x03, 0x68, 0x10, 0x4b, 0x7c,
-- 0x40, 0x18, 0x60, 0x10, 0x32, 0xc0, 0x68, 0x10,
-- 0x4b, 0x79, 0x40, 0x18, 0x60, 0x10, 0x20, 0x00,
-- 0x4b, 0x6f, 0x68, 0x1b, 0x67, 0x58, 0x20, 0x00,
-- 0x4b, 0x6d, 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18,
-- 0x48, 0x6d, 0x68, 0x80, 0x23, 0x02, 0x40, 0x18,
-- 0xd1, 0x04, 0x20, 0x00, 0x4b, 0x68, 0x68, 0x1b,
-- 0x33, 0x60, 0x76, 0x98, 0x20, 0x5b, 0x4b, 0x66,
-- 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x4e, 0x6d,
-- 0x68, 0x30, 0x23, 0x02, 0x43, 0x18, 0x60, 0x30,
-- 0x4e, 0x67, 0x68, 0x30, 0x23, 0x05, 0x05, 0x9b,
-- 0x43, 0x18, 0x60, 0x30, 0x4e, 0x61, 0x68, 0x30,
-- 0x4b, 0x67, 0x40, 0x18, 0x60, 0x30, 0x20, 0x5b,
-- 0xb0, 0x06, 0xe7, 0x2b, 0xe0, 0xae, 0x48, 0x5d,
-- 0x68, 0x06, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x33,
-- 0x60, 0x03, 0x20, 0x31, 0x06, 0x40, 0x6a, 0x00,
-- 0x23, 0x04, 0x40, 0x18, 0xd1, 0x27, 0x9b, 0x01,
-- 0x20, 0x31, 0x06, 0x40, 0x6b, 0x00, 0x18, 0x1b,
-- 0x93, 0x01, 0x4e, 0x5c, 0x68, 0x30, 0x23, 0x3b,
-- 0x40, 0x18, 0x60, 0x30, 0x4e, 0x57, 0x68, 0x30,
-- 0x23, 0x0e, 0x43, 0x18, 0x60, 0x30, 0x4e, 0x55,
-- 0x68, 0x30, 0x23, 0x0c, 0x40, 0x18, 0x60, 0x30,
-- 0x20, 0x37, 0x23, 0x31, 0x06, 0x5b, 0x60, 0x98,
-- 0x20, 0x01, 0x90, 0x00, 0x98, 0x00, 0x28, 0x64,
-- 0xd3, 0x04, 0xe0, 0x07, 0x98, 0x00, 0x30, 0x01,
-- 0x90, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0xe0, 0x01,
-- 0xe0, 0x36, 0xe0, 0x34, 0xe7, 0xd1, 0x4e, 0x46,
-- 0x68, 0x30, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18,
-- 0x60, 0x30, 0x4e, 0x40, 0x68, 0x30, 0x4b, 0x48,
-- 0x40, 0x18, 0x60, 0x30, 0x48, 0x3c, 0x68, 0x40,
-- 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x5b, 0x4b, 0x38,
-- 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00,
-- 0x4b, 0x35, 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98,
-- 0x20, 0x5b, 0xb0, 0x06, 0xe6, 0xda, 0xe0, 0x5d,
-- 0x48, 0x31, 0x68, 0x00, 0x6f, 0xc0, 0x1d, 0x06,
-- 0x48, 0x2f, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00,
-- 0x9b, 0x01, 0x1a, 0xc0, 0x68, 0x33, 0x18, 0xc0,
-- 0x60, 0x30, 0x20, 0x5c, 0x4b, 0x2a, 0x68, 0x1b,
-- 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 0x4b, 0x28,
-- 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 0xe0, 0x3f,
-- 0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03,
-- 0x23, 0x04, 0x40, 0x18, 0xd0, 0x03, 0x20, 0x52,
-- 0xb0, 0x06, 0xe6, 0xb7, 0xe0, 0x3a, 0x98, 0x03,
-- 0x01, 0x00, 0x19, 0xc7, 0x48, 0x1e, 0x68, 0x00,
-- 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x29,
-- 0x60, 0xb8, 0x20, 0xbc, 0x4b, 0x1a, 0x68, 0x1b,
-- 0x33, 0x80, 0x70, 0x18, 0xe0, 0x0d, 0x48, 0x18,
-- 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b,
-- 0x43, 0x18, 0x60, 0xb8, 0x48, 0x14, 0x68, 0x00,
-- 0x6f, 0x40, 0x4b, 0x13, 0x68, 0x1b, 0x33, 0x80,
-- 0x70, 0x18, 0x48, 0x11, 0x68, 0x00, 0x30, 0x80,
-- 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80,
-- 0x18, 0x82, 0x48, 0x0d, 0x68, 0x00, 0x6f, 0x00,
-- 0x60, 0x38, 0x1d, 0x10, 0x60, 0x78, 0x20, 0x01,
-- 0x06, 0x00, 0x60, 0xf8, 0x9e, 0x03, 0x20, 0x01,
-- 0x40, 0xb0, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58,
-- 0x20, 0x00, 0xb0, 0x06, 0xe6, 0x7e, 0xb0, 0x04,
-- 0xb0, 0x02, 0xe6, 0x7b, 0xe6, 0x7a, 0x00, 0x00,
-- 0x9e, 0x00, 0x0b, 0x80, 0x9e, 0x00, 0x09, 0x80,
-- 0x2e, 0x08, 0x7c, 0x44, 0x9e, 0x00, 0x0a, 0x00,
-- 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08,
-- 0x62, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x04, 0xff, 0xf7, 0xff, 0xff,
-- 0xff, 0xff, 0x00, 0xff, 0x62, 0x00, 0x00, 0x1c,
-- 0xfe, 0xbf, 0xff, 0xff, 0x62, 0x00, 0x00, 0x08,
-- 0xff, 0xbf, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbc,
-- 0x48, 0x07, 0x69, 0x80, 0x28, 0x02, 0xd0, 0x03,
-- 0x48, 0x05, 0x69, 0x80, 0x28, 0x03, 0xd1, 0x04,
-- 0x20, 0x31, 0x06, 0x40, 0x6a, 0x80, 0x47, 0x70,
-- 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfb, 0xe7, 0xfa,
-- 0x66, 0x00, 0x01, 0x00, 0xb5, 0xb0, 0x27, 0x0f,
-- 0x20, 0x31, 0x06, 0x40, 0x68, 0xc0, 0x09, 0x05,
-- 0xf7, 0xff, 0xff, 0xe6, 0x43, 0xc4, 0x48, 0x18,
-- 0x69, 0x80, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x16,
-- 0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 0x1c, 0x38,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x09,
-- 0xd2, 0x1e, 0xa3, 0x02, 0x5d, 0x5b, 0x00, 0x5b,
-- 0x44, 0x9f, 0x1c, 0x00, 0x05, 0x05, 0x05, 0x05,
-- 0x05, 0x07, 0x07, 0x07, 0x0e, 0x00, 0x1c, 0x2f,
-- 0xe0, 0x13, 0x20, 0x08, 0x40, 0x20, 0xd0, 0x01,
-- 0x1c, 0x2f, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x0c,
-- 0x20, 0x08, 0x40, 0x20, 0xd0, 0x06, 0x20, 0x02,
-- 0x40, 0x20, 0xd0, 0x01, 0x27, 0x07, 0xe0, 0x00,
-- 0x27, 0x08, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x00,
-- 0xe7, 0xff, 0x1c, 0x38, 0xe7, 0xd8, 0xe7, 0xd7,
-- 0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x29, 0x07,
-- 0xd2, 0x0f, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b,
-- 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x05, 0x06, 0x09,
-- 0x08, 0x07, 0x0a, 0x00, 0xe0, 0x06, 0xe0, 0x05,
-- 0xe0, 0x04, 0xe0, 0x03, 0xe0, 0x02, 0xe0, 0x01,
-- 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x00, 0x47, 0x70,
-- 0xe7, 0xfd, 0x00, 0x00, 0x20, 0x1d, 0x02, 0x80,
-- 0x69, 0x80, 0x49, 0x06, 0x60, 0x08, 0x20, 0x1d,
-- 0x02, 0x80, 0x69, 0x40, 0x49, 0x04, 0x60, 0x08,
-- 0x20, 0x1d, 0x02, 0x80, 0x69, 0xc0, 0x49, 0x03,
-- 0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x90,
-- 0x2e, 0x08, 0x94, 0x94, 0x2e, 0x08, 0x94, 0x98,
-- 0xb5, 0xf1, 0xb0, 0x81, 0x20, 0x00, 0x4d, 0x21,
-- 0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00,
-- 0x43, 0xdb, 0x4c, 0x1f, 0x68, 0x64, 0x42, 0x8c,
-- 0xdd, 0x21, 0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4,
-- 0x9d, 0x00, 0x59, 0x2f, 0x42, 0x9f, 0xd0, 0xf8,
-- 0x4c, 0x19, 0x68, 0x64, 0x42, 0x8c, 0xda, 0x00,
-- 0xe0, 0x15, 0x32, 0x01, 0x1c, 0x0c, 0x31, 0x01,
-- 0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2b, 0x42, 0x9f,
-- 0xd0, 0xf8, 0x02, 0x9c, 0x43, 0x3c, 0x1c, 0x25,
-- 0x1c, 0x04, 0x30, 0x01, 0x00, 0xa4, 0x9e, 0x01,
-- 0x51, 0x35, 0x4c, 0x0f, 0x68, 0x64, 0x42, 0x8c,
-- 0xdb, 0x00, 0x32, 0x01, 0xe7, 0xd9, 0x28, 0x08,
-- 0xd3, 0x02, 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xfa,
-- 0x25, 0x00, 0x43, 0xed, 0x00, 0x84, 0x9e, 0x01,
-- 0x51, 0x35, 0xe7, 0xf7, 0x4c, 0x07, 0x68, 0x24,
-- 0x2c, 0x00, 0xd1, 0x02, 0x24, 0x0d, 0x06, 0xe4,
-- 0x61, 0x22, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0xcc,
-- 0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x94, 0x84,
-- 0xb5, 0x80, 0x48, 0xdc, 0x68, 0x00, 0x28, 0x00,
-- 0xd1, 0x04, 0x48, 0xda, 0x68, 0x00, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x92,
-- 0x48, 0xd7, 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8,
-- 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 0x49, 0xd9,
-- 0x60, 0x08, 0x48, 0xd3, 0x49, 0xd8, 0x68, 0x0b,
-- 0x4a, 0xd8, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0xda,
-- 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08,
-- 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08,
-- 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08,
-- 0x20, 0x00, 0x49, 0xca, 0x68, 0x09, 0x23, 0x07,
-- 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xce,
-- 0x49, 0xc6, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc5,
-- 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9,
-- 0x66, 0x88, 0x48, 0xc7, 0x49, 0xc1, 0x68, 0x09,
-- 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8,
-- 0x20, 0x00, 0x49, 0xc0, 0x68, 0x09, 0x23, 0x07,
-- 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc0,
-- 0x49, 0xbc, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xc9, 0x66, 0xc8, 0x27, 0x00, 0x2f, 0x19,
-- 0xd3, 0x02, 0xe0, 0x38, 0x37, 0x01, 0xe7, 0xfa,
-- 0x48, 0xba, 0x00, 0xb9, 0x4a, 0xb1, 0x68, 0x12,
-- 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9,
-- 0x62, 0x08, 0x48, 0xb6, 0x00, 0xb9, 0x4a, 0xad,
-- 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xc9, 0x60, 0x48, 0x48, 0xb1, 0x00, 0xb9,
-- 0x4a, 0xaa, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xad,
-- 0x00, 0xb9, 0x4a, 0xa6, 0x68, 0x12, 0x18, 0x89,
-- 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x60, 0x48,
-- 0x48, 0xa8, 0x00, 0xb9, 0x4a, 0xa3, 0x68, 0x12,
-- 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9,
-- 0x62, 0x08, 0x48, 0xa4, 0x00, 0xb9, 0x4a, 0x9f,
-- 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xc9, 0x60, 0x48, 0xe7, 0xc6, 0x27, 0x00,
-- 0x2f, 0x07, 0xd3, 0x02, 0xe0, 0x86, 0x37, 0x01,
-- 0xe7, 0xfa, 0x48, 0x9c, 0x00, 0xb9, 0x19, 0xc9,
-- 0x00, 0xc9, 0x4a, 0x92, 0x68, 0x12, 0x18, 0x89,
-- 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08,
-- 0x48, 0x96, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9,
-- 0x4a, 0x8c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x91,
-- 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x87,
-- 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb,
-- 0x18, 0xc9, 0x60, 0x48, 0x48, 0x8b, 0x00, 0xb9,
-- 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x81, 0x68, 0x12,
-- 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9,
-- 0x67, 0x88, 0x48, 0x86, 0x00, 0xb9, 0x19, 0xc9,
-- 0x00, 0xc9, 0x4a, 0x7e, 0x68, 0x12, 0x18, 0x89,
-- 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08,
-- 0x48, 0x80, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9,
-- 0x4a, 0x78, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x7b,
-- 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x73,
-- 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb,
-- 0x18, 0xc9, 0x60, 0x48, 0x48, 0x75, 0x00, 0xb9,
-- 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x6d, 0x68, 0x12,
-- 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9,
-- 0x67, 0x88, 0x48, 0x70, 0x00, 0xb9, 0x19, 0xc9,
-- 0x00, 0xc9, 0x4a, 0x6a, 0x68, 0x12, 0x18, 0x89,
-- 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08,
-- 0x48, 0x6a, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9,
-- 0x4a, 0x64, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x65,
-- 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x5f,
-- 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb,
-- 0x18, 0xc9, 0x60, 0x48, 0x48, 0x5f, 0x00, 0xb9,
-- 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x59, 0x68, 0x12,
-- 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9,
-- 0x67, 0x88, 0xe7, 0x78, 0x27, 0x00, 0x2f, 0x12,
-- 0xd3, 0x02, 0xe0, 0x56, 0x37, 0x01, 0xe7, 0xfa,
-- 0x48, 0x56, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x4d,
-- 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x53,
-- 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x49, 0x68, 0x12,
-- 0x18, 0x89, 0x62, 0x88, 0x48, 0x4f, 0x21, 0x4c,
-- 0x43, 0x79, 0x4a, 0x46, 0x68, 0x12, 0x18, 0x89,
-- 0x63, 0x08, 0x48, 0x4c, 0x21, 0x4c, 0x43, 0x79,
-- 0x4a, 0x42, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48,
-- 0x48, 0x48, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x41,
-- 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x45,
-- 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x3d, 0x68, 0x12,
-- 0x18, 0x89, 0x62, 0x88, 0x48, 0x41, 0x21, 0x4c,
-- 0x43, 0x79, 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x89,
-- 0x63, 0x08, 0x48, 0x3e, 0x21, 0x4c, 0x43, 0x79,
-- 0x4a, 0x36, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48,
-- 0x48, 0x3a, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x35,
-- 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x37,
-- 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x31, 0x68, 0x12,
-- 0x18, 0x89, 0x62, 0x88, 0x48, 0x33, 0x21, 0x4c,
-- 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89,
-- 0x63, 0x08, 0x48, 0x30, 0x21, 0x4c, 0x43, 0x79,
-- 0x4a, 0x2a, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48,
-- 0xe7, 0xa8, 0x20, 0x00, 0x49, 0x25, 0x68, 0x09,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8,
-- 0x20, 0x00, 0x49, 0x22, 0x68, 0x09, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x00,
-- 0x49, 0x1c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x19,
-- 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9,
-- 0x61, 0x88, 0x20, 0x00, 0x49, 0x19, 0x68, 0x09,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8,
-- 0x20, 0x00, 0x49, 0x16, 0x68, 0x09, 0x23, 0x0d,
-- 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x92,
-- 0x49, 0x17, 0x60, 0x08, 0x27, 0x00, 0x2f, 0x08,
-- 0xd3, 0x02, 0xe0, 0x08, 0x37, 0x01, 0xe7, 0xfa,
-- 0x20, 0x00, 0x43, 0xc0, 0x00, 0xb9, 0x4b, 0x13,
-- 0x18, 0xc9, 0x64, 0x08, 0xe7, 0xf6, 0x20, 0x10,
-- 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x08, 0x20, 0x01,
-- 0x49, 0x0f, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00,
-- 0xe6, 0x4d, 0xe6, 0x4c, 0x2e, 0x08, 0x60, 0x84,
-- 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xb0,
-- 0x2e, 0x08, 0x85, 0x54, 0x2e, 0x08, 0x7d, 0xb4,
-- 0x2e, 0x08, 0x8c, 0xec, 0x2e, 0x08, 0x7d, 0xb8,
-- 0x2e, 0x08, 0x94, 0x94, 0x00, 0x00, 0x16, 0xc8,
-- 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
-- 0x2e, 0x08, 0x94, 0x88, 0x68, 0x00, 0x0d, 0x00,
-- 0x2e, 0x08, 0x94, 0x84, 0xb5, 0x90, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00,
-- 0xf8, 0x4d, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00,
-- 0xf8, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x68, 0x78,
-- 0x28, 0x07, 0xd9, 0x1d, 0x23, 0x03, 0x02, 0x5b,
-- 0x18, 0xf8, 0x6d, 0x40, 0x28, 0x00, 0xd0, 0x06,
-- 0x23, 0x03, 0x02, 0x5b, 0x18, 0xf8, 0x6d, 0x80,
-- 0x04, 0x00, 0x0c, 0x00, 0xd1, 0x02, 0x20, 0x02,
-- 0x60, 0xb8, 0xe0, 0x01, 0x20, 0x03, 0x60, 0xb8,
-- 0x1d, 0xfd, 0x35, 0x05, 0x23, 0x65, 0x01, 0x1b,
-- 0x18, 0xfe, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x11,
-- 0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0xee,
-- 0x2c, 0x06, 0xd0, 0x18, 0x00, 0xa0, 0x19, 0x00,
-- 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b,
-- 0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0,
-- 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc5,
-- 0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12,
-- 0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x04,
-- 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xd3, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x90,
-- 0x2e, 0x08, 0x94, 0x98, 0xb5, 0xf0, 0x1c, 0x07,
-- 0x1c, 0x0c, 0x2f, 0x10, 0xd0, 0x13, 0x20, 0x4c,
-- 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x01,
-- 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5,
-- 0x35, 0x4d, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c,
-- 0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03,
-- 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xb3, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x98,
-- 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x39,
-- 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x07, 0x1c, 0x39,
-- 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x33, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x1c, 0x04,
-- 0x1c, 0x0f, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0,
-- 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc6,
-- 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0,
-- 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc5, 0x20, 0x06,
-- 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 0x00, 0xd2,
-- 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x09, 0x68, 0x1b,
-- 0xf0, 0x00, 0xfe, 0x84, 0x1d, 0xfe, 0x36, 0x05,
-- 0x23, 0x65, 0x01, 0x1b, 0x18, 0xfd, 0x1c, 0x31,
-- 0x1c, 0x28, 0x4a, 0x05, 0x68, 0x13, 0x22, 0x28,
-- 0xf0, 0x00, 0xfe, 0x78, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x98,
-- 0x2e, 0x08, 0x94, 0x90, 0xb5, 0xf0, 0x1c, 0x07,
-- 0x1c, 0x0c, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00,
-- 0x1d, 0xc6, 0x36, 0x4d, 0x20, 0x4c, 0x43, 0x78,
-- 0x19, 0x00, 0x1d, 0xc5, 0x35, 0x01, 0x20, 0x10,
-- 0x1b, 0xc0, 0x22, 0x4c, 0x43, 0x42, 0x1c, 0x31,
-- 0x1c, 0x28, 0x4b, 0x03, 0x68, 0x1b, 0xf0, 0x00,
-- 0xfe, 0x59, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x94, 0x98, 0xb4, 0xb0, 0x1c, 0x02,
-- 0x1c, 0x0f, 0x20, 0x00, 0x1c, 0x03, 0x30, 0x01,
-- 0x00, 0x9b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xe3, 0x68, 0x5b, 0x10, 0x7c, 0x34, 0x01,
-- 0x42, 0xa3, 0xd2, 0x00, 0xe7, 0xf2, 0x38, 0x01,
-- 0x21, 0x18, 0x42, 0x81, 0xd8, 0x02, 0xe0, 0x1a,
-- 0x39, 0x01, 0xe7, 0xfa, 0x00, 0x8b, 0x18, 0x9c,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xe3, 0x69, 0xdc,
-- 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xeb, 0x62, 0x1c, 0x00, 0x8b, 0x18, 0x9c,
-- 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x1c,
-- 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xeb, 0x60, 0x5c, 0xe7, 0xe4, 0x23, 0x00,
-- 0x2b, 0x00, 0xd0, 0x10, 0x10, 0x7b, 0x1c, 0x5c,
-- 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c,
-- 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xeb, 0x60, 0x5c, 0xe0, 0x0e, 0x10, 0x7c,
-- 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c,
-- 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xeb, 0x60, 0x5c, 0xbc, 0xb0, 0x47, 0x70,
-- 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x21, 0x00,
-- 0x1c, 0x0b, 0x31, 0x01, 0x00, 0x9b, 0x18, 0x9c,
-- 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b,
-- 0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd0, 0x00,
-- 0xe7, 0xf2, 0x39, 0x01, 0x1c, 0x08, 0x28, 0x18,
-- 0xd3, 0x02, 0xe0, 0x1a, 0x30, 0x01, 0xe7, 0xfa,
-- 0x00, 0x83, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb,
-- 0x18, 0xe3, 0x6a, 0x5c, 0x00, 0x83, 0x18, 0x9d,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c,
-- 0x00, 0x83, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xe3, 0x68, 0x9c, 0x00, 0x83, 0x18, 0x9d,
-- 0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c,
-- 0xe7, 0xe4, 0x4c, 0x06, 0x23, 0x07, 0x02, 0x1b,
-- 0x18, 0xd3, 0x60, 0x1c, 0x4c, 0x03, 0x23, 0x07,
-- 0x02, 0x1b, 0x18, 0xd3, 0x66, 0x5c, 0xbc, 0xb0,
-- 0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
-- 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x15,
-- 0x6a, 0xa1, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x19,
-- 0x62, 0x39, 0x21, 0x01, 0x02, 0x89, 0x43, 0x29,
-- 0x62, 0x79, 0x6a, 0xe1, 0x05, 0x89, 0x0d, 0x89,
-- 0x61, 0xf9, 0x6b, 0x61, 0x31, 0x01, 0x05, 0x89,
-- 0x0d, 0x89, 0x61, 0xb9, 0x69, 0x61, 0x60, 0xf9,
-- 0x69, 0xa1, 0x61, 0x39, 0x69, 0xe1, 0x61, 0x79,
-- 0x68, 0xa1, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x19,
-- 0xd0, 0x02, 0x49, 0x0f, 0x60, 0xb9, 0xe0, 0x01,
-- 0x21, 0x00, 0x60, 0xb9, 0x6a, 0x60, 0x28, 0x00,
-- 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x39, 0x78, 0x01,
-- 0x00, 0x89, 0x4b, 0x0a, 0x18, 0xc9, 0x60, 0x79,
-- 0x68, 0xb9, 0x88, 0x42, 0x43, 0x11, 0x60, 0xb9,
-- 0xe0, 0x07, 0x21, 0x00, 0x60, 0x39, 0x21, 0x00,
-- 0x60, 0x79, 0x68, 0xb9, 0x0c, 0x09, 0x04, 0x09,
-- 0x60, 0xb9, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00,
-- 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00,
-- 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x69, 0x79,
-- 0x60, 0xd1, 0x69, 0xb9, 0x61, 0x11, 0x69, 0xf9,
-- 0x61, 0x51, 0x68, 0xb9, 0x23, 0x01, 0x06, 0x1b,
-- 0x40, 0x19, 0xd0, 0x02, 0x49, 0x0e, 0x60, 0x91,
-- 0xe0, 0x01, 0x21, 0x00, 0x60, 0x91, 0x6a, 0x78,
-- 0x28, 0x00, 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x11,
-- 0x78, 0x01, 0x00, 0x89, 0x4b, 0x09, 0x18, 0xc9,
-- 0x60, 0x51, 0x68, 0x91, 0x88, 0x43, 0x43, 0x19,
-- 0x60, 0x91, 0xe0, 0x07, 0x21, 0x00, 0x60, 0x11,
-- 0x21, 0x00, 0x60, 0x51, 0x68, 0x91, 0x0c, 0x09,
-- 0x04, 0x09, 0x60, 0x91, 0xbc, 0x80, 0x47, 0x70,
-- 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00,
-- 0x1c, 0x01, 0x48, 0x07, 0x62, 0x08, 0x48, 0x06,
-- 0x62, 0x48, 0x48, 0x05, 0x61, 0xc8, 0x48, 0x04,
-- 0x61, 0x88, 0x20, 0x00, 0x60, 0x08, 0x20, 0x00,
-- 0x60, 0x48, 0x20, 0x00, 0x60, 0x88, 0x47, 0x70,
-- 0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0x1c, 0x07,
-- 0x1c, 0x0c, 0x2c, 0x07, 0xd2, 0x73, 0x25, 0x00,
-- 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01,
-- 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0,
-- 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0,
-- 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9,
-- 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9,
-- 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8,
-- 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b,
-- 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8,
-- 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b,
-- 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xf8,
-- 0xf0, 0x00, 0xfb, 0xd2, 0xe7, 0xcf, 0x23, 0xcf,
-- 0x00, 0xdb, 0x18, 0xf8, 0xf7, 0xff, 0xfb, 0xb8,
-- 0x25, 0x00, 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x54,
-- 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40,
-- 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb,
-- 0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49,
-- 0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb,
-- 0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a,
-- 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0,
-- 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02,
-- 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0,
-- 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01,
-- 0x48, 0xdb, 0xf0, 0x00, 0xfb, 0x6b, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c,
-- 0x43, 0x69, 0x19, 0xc9, 0xe0, 0x00, 0xe0, 0x94,
-- 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xcc,
-- 0xf0, 0x00, 0xfb, 0x7a, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x60,
-- 0xe7, 0xaa, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02,
-- 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69,
-- 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02,
-- 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98,
-- 0x1c, 0x01, 0x48, 0xb1, 0xf0, 0x00, 0xfb, 0x16,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0,
-- 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09,
-- 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x01, 0x48, 0xa2, 0xf0, 0x00,
-- 0xfb, 0x27, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x0d, 0xe7, 0xb0,
-- 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f,
-- 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69,
-- 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01,
-- 0x48, 0x8d, 0xf0, 0x00, 0xfa, 0xcf, 0xe7, 0xdf,
-- 0xe1, 0xca, 0x2c, 0x0e, 0xd3, 0x73, 0x3c, 0x07,
-- 0x1f, 0xe5, 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f,
-- 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69,
-- 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01,
-- 0x48, 0x79, 0xf0, 0x00, 0xfa, 0xd5, 0xe7, 0xdf,
-- 0x1c, 0x25, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x50,
-- 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9,
-- 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9,
-- 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98,
-- 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01,
-- 0x48, 0x61, 0xf0, 0x00, 0xfa, 0x77, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c,
-- 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88,
-- 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98,
-- 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98,
-- 0x1c, 0x01, 0x48, 0x53, 0xf0, 0x00, 0xfa, 0x88,
-- 0x20, 0x4c, 0x43, 0x68, 0xe0, 0x00, 0xe0, 0x29,
-- 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfa, 0x6c,
-- 0xe7, 0xae, 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02,
-- 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c,
-- 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88,
-- 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98,
-- 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98,
-- 0x1c, 0x01, 0x48, 0x3d, 0xf0, 0x00, 0xfa, 0x2e,
-- 0xe7, 0xdf, 0xe1, 0x29, 0x3c, 0x07, 0x1c, 0x25,
-- 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01,
-- 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0,
-- 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0,
-- 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9,
-- 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9,
-- 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8,
-- 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b,
-- 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8,
-- 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b,
-- 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x22,
-- 0xf0, 0x00, 0xfa, 0x26, 0xe7, 0xcf, 0x25, 0x00,
-- 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 0x35, 0x01,
-- 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9,
-- 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x10,
-- 0xf0, 0x00, 0xfa, 0x02, 0xe7, 0xdf, 0x1c, 0x25,
-- 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x55, 0x35, 0x01,
-- 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0,
-- 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0,
-- 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9,
-- 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9,
-- 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1d, 0x00, 0xa8,
-- 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0xe0, 0x01,
-- 0x2e, 0x08, 0x7d, 0x94, 0x23, 0x0b, 0x01, 0xdb,
-- 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40,
-- 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb,
-- 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x01, 0x48, 0x50, 0xf0, 0x00,
-- 0xf9, 0x9d, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9,
-- 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01,
-- 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x42,
-- 0xf0, 0x00, 0xf9, 0xae, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x94,
-- 0xe7, 0xa9, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02,
-- 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69,
-- 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02,
-- 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c,
-- 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff,
-- 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02,
-- 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98,
-- 0x1c, 0x01, 0x48, 0x27, 0xf0, 0x00, 0xf9, 0x4a,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0,
-- 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09,
-- 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b,
-- 0x43, 0x98, 0x1c, 0x01, 0x48, 0x18, 0xf0, 0x00,
-- 0xf9, 0x5b, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0,
-- 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x41, 0xe7, 0xb0,
-- 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f,
-- 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68,
-- 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69,
-- 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02,
-- 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0,
-- 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01,
-- 0x48, 0x03, 0xf0, 0x00, 0xf9, 0x03, 0xe7, 0xdf,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x7d, 0x94, 0xb4, 0x90, 0x1c, 0x02,
-- 0x1c, 0x0f, 0x3a, 0x01, 0x2f, 0x01, 0xd1, 0x0d,
-- 0x09, 0x50, 0x00, 0x80, 0x49, 0x0d, 0x58, 0x08,
-- 0x06, 0xd4, 0x0e, 0xe4, 0x21, 0x01, 0x40, 0xa1,
-- 0x43, 0x08, 0x09, 0x51, 0x00, 0x89, 0x4b, 0x09,
-- 0x50, 0x58, 0xe0, 0x0d, 0x09, 0x50, 0x00, 0x80,
-- 0x49, 0x06, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4,
-- 0x21, 0x01, 0x40, 0xa1, 0x43, 0xc9, 0x40, 0x01,
-- 0x09, 0x50, 0x00, 0x80, 0x4b, 0x01, 0x50, 0x19,
-- 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x8c,
-- 0xb4, 0x80, 0x1c, 0x01, 0x39, 0x01, 0x09, 0x48,
-- 0x00, 0x80, 0x4a, 0x08, 0x58, 0x10, 0x06, 0xca,
-- 0x0e, 0xd2, 0x27, 0x01, 0x40, 0x97, 0x1c, 0x3b,
-- 0x40, 0x18, 0xd0, 0x03, 0x20, 0x01, 0xbc, 0x80,
-- 0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfa,
-- 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c,
-- 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x54,
-- 0x6a, 0xf8, 0x05, 0x86, 0x0d, 0xb6, 0x2c, 0x07,
-- 0xda, 0x01, 0x1c, 0x20, 0xe0, 0x00, 0x20, 0x07,
-- 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02,
-- 0xe0, 0x15, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88,
-- 0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0xb0,
-- 0xd1, 0x08, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0,
-- 0x18, 0x80, 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0,
-- 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xe9, 0x1f, 0xe0,
-- 0x28, 0x11, 0xda, 0x01, 0x1f, 0xe0, 0xe0, 0x00,
-- 0x20, 0x11, 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9,
-- 0xd3, 0x02, 0xe0, 0x0d, 0x31, 0x01, 0xe7, 0xfa,
-- 0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x6a, 0x80,
-- 0x42, 0xb0, 0xd1, 0x04, 0x20, 0x4c, 0x43, 0x48,
-- 0x18, 0x80, 0x30, 0x0c, 0xe7, 0xe4, 0xe7, 0xf1,
-- 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 0xb5, 0x90,
-- 0x48, 0x07, 0x68, 0x04, 0x48, 0x07, 0x68, 0x07,
-- 0x1c, 0x39, 0x1c, 0x20, 0x4a, 0x06, 0x68, 0x13,
-- 0x22, 0xf3, 0x00, 0xd2, 0xf0, 0x00, 0xf9, 0xca,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8,
-- 0x2e, 0x08, 0x94, 0x90, 0xb4, 0xf0, 0x1c, 0x01,
-- 0xb0, 0x83, 0x22, 0x00, 0x68, 0x4b, 0x2b, 0x07,
-- 0xdd, 0x01, 0x23, 0x07, 0xe0, 0x00, 0x68, 0x4b,
-- 0x1c, 0x1c, 0x23, 0x00, 0x43, 0xdb, 0x93, 0x02,
-- 0x23, 0x00, 0x43, 0xdb, 0x93, 0x01, 0x23, 0x00,
-- 0x93, 0x00, 0x4b, 0x17, 0x68, 0x1b, 0x2b, 0x00,
-- 0xd0, 0x07, 0x4b, 0x15, 0x68, 0x1b, 0x6a, 0xdb,
-- 0x93, 0x02, 0x4b, 0x13, 0x68, 0x1b, 0x6b, 0x5b,
-- 0x93, 0x01, 0x20, 0x00, 0x42, 0xa0, 0xd3, 0x02,
-- 0xe0, 0x16, 0x30, 0x01, 0xe7, 0xfa, 0x00, 0x83,
-- 0x18, 0x1b, 0x00, 0xdb, 0x18, 0x5d, 0x23, 0x05,
-- 0x02, 0x1b, 0x18, 0xeb, 0x6e, 0x9f, 0x04, 0x3b,
-- 0x0c, 0x1b, 0xd0, 0x08, 0x0c, 0x3b, 0x04, 0x1b,
-- 0xd0, 0x05, 0x9b, 0x00, 0x18, 0xc5, 0x26, 0x01,
-- 0x40, 0xae, 0x1c, 0x33, 0x43, 0x1a, 0xe7, 0xe8,
-- 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xcb, 0x61, 0xda,
-- 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00,
-- 0x2e, 0x08, 0x7c, 0x58, 0xb4, 0x80, 0x1c, 0x01,
-- 0x20, 0x00, 0x68, 0x0a, 0x42, 0x90, 0xdb, 0x02,
-- 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xf9, 0x23, 0x00,
-- 0x43, 0xdb, 0x68, 0x8a, 0x00, 0x87, 0x51, 0xd3,
-- 0xe7, 0xf7, 0x22, 0x00, 0x43, 0xd2, 0x68, 0x8b,
-- 0x68, 0x0f, 0x00, 0xbf, 0x51, 0xda, 0x23, 0x00,
-- 0x43, 0xdb, 0x68, 0x8a, 0x68, 0x0f, 0x00, 0xbf,
-- 0x19, 0xd2, 0x60, 0x53, 0x22, 0x00, 0x60, 0x4a,
-- 0xbc, 0x80, 0x47, 0x70, 0xb4, 0xf0, 0x1c, 0x03,
-- 0x1c, 0x0c, 0x1c, 0x17, 0x68, 0x9a, 0xca, 0x40,
-- 0x42, 0xa6, 0xd2, 0x00, 0xe7, 0xfb, 0x3a, 0x04,
-- 0x1c, 0x11, 0xc9, 0x40, 0x42, 0xbe, 0xd2, 0x00,
-- 0xe7, 0xfb, 0x39, 0x04, 0x68, 0x10, 0x42, 0xa0,
-- 0xd1, 0x02, 0x68, 0x08, 0x42, 0xb8, 0xd0, 0x02,
-- 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 0x39, 0x04,
-- 0x68, 0x98, 0x68, 0x5e, 0x00, 0xb6, 0x19, 0x85,
-- 0x68, 0x58, 0x38, 0x02, 0x60, 0x58, 0x68, 0x50,
-- 0x60, 0x10, 0x32, 0x04, 0x42, 0x8a, 0xd3, 0xfa,
-- 0x68, 0x88, 0x60, 0x08, 0x31, 0x04, 0x42, 0xa9,
-- 0xd3, 0xfa, 0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8,
-- 0xb4, 0xf0, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17,
-- 0x68, 0x58, 0x68, 0x1e, 0x3e, 0x01, 0x42, 0xb0,
-- 0xdb, 0x02, 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70,
-- 0x68, 0x9a, 0xca, 0x40, 0x42, 0xa6, 0xd2, 0x00,
-- 0xe7, 0xfb, 0x3a, 0x04, 0x1c, 0x15, 0xcd, 0x40,
-- 0x42, 0xbe, 0xd2, 0x00, 0xe7, 0xfb, 0x68, 0x58,
-- 0x30, 0x02, 0x60, 0x58, 0x68, 0x98, 0x68, 0x5e,
-- 0x00, 0xb6, 0x19, 0x80, 0x1f, 0xc1, 0x39, 0x01,
-- 0x68, 0x08, 0x60, 0x88, 0x39, 0x04, 0x1d, 0xc8,
-- 0x30, 0x01, 0x42, 0xa8, 0xd8, 0xf8, 0x60, 0x8f,
-- 0x68, 0x08, 0x60, 0x48, 0x39, 0x04, 0x1d, 0x08,
-- 0x42, 0x90, 0xd8, 0xf9, 0x60, 0x14, 0x20, 0x00,
-- 0xe7, 0xd8, 0xe7, 0xd7, 0xb5, 0xf0, 0x1c, 0x07,
-- 0x1c, 0x0c, 0xb0, 0x81, 0x1c, 0x38, 0x21, 0x00,
-- 0xf0, 0x0c, 0xff, 0xe0, 0x1c, 0x06, 0x1c, 0x38,
-- 0x21, 0x01, 0xf0, 0x0c, 0xff, 0xdb, 0x90, 0x00,
-- 0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x50,
-- 0x49, 0x20, 0x68, 0x09, 0x60, 0x08, 0x99, 0x00,
-- 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x49, 0x49, 0x1e,
-- 0x68, 0x09, 0x60, 0x08, 0x48, 0x1b, 0x68, 0x00,
-- 0x68, 0x05, 0x48, 0x1c, 0x68, 0x01, 0x23, 0x02,
-- 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x2c, 0x00,
-- 0xd0, 0x0c, 0x48, 0x19, 0x68, 0x00, 0x78, 0x00,
-- 0x28, 0x00, 0xd0, 0x07, 0x48, 0x14, 0x68, 0x00,
-- 0x68, 0x05, 0x48, 0x14, 0x68, 0x01, 0x23, 0x02,
-- 0x43, 0x19, 0x60, 0x01, 0x1c, 0x20, 0x49, 0x13,
-- 0x68, 0x09, 0x70, 0x08, 0x48, 0x12, 0x63, 0xc5,
-- 0x20, 0x3f, 0x04, 0x00, 0x40, 0x28, 0x0c, 0x00,
-- 0x49, 0x10, 0x62, 0x08, 0x20, 0xff, 0x02, 0x00,
-- 0x40, 0x28, 0x0a, 0x00, 0x49, 0x0d, 0x62, 0x48,
-- 0x06, 0xa8, 0x0e, 0x80, 0x23, 0x80, 0x43, 0x18,
-- 0x49, 0x0a, 0x62, 0x88, 0x1c, 0x28, 0xb0, 0x01,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01,
-- 0xe7, 0xfa, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x9c,
-- 0x2e, 0x08, 0x94, 0xa0, 0x6a, 0x00, 0x00, 0x18,
-- 0x2e, 0x08, 0x94, 0xa4, 0x2e, 0x08, 0x94, 0xa8,
-- 0x68, 0x00, 0x0d, 0x00, 0x72, 0x00, 0x01, 0x00,
-- 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0xb9,
-- 0x0e, 0x89, 0x20, 0x01, 0x03, 0x80, 0x40, 0x10,
-- 0x09, 0xc0, 0x43, 0x01, 0x20, 0xf0, 0x40, 0x10,
-- 0x01, 0x40, 0x43, 0x01, 0x07, 0x10, 0x0f, 0x00,
-- 0x03, 0x00, 0x43, 0x01, 0x20, 0x07, 0x02, 0xc0,
-- 0x40, 0x10, 0x01, 0x40, 0x43, 0x01, 0x20, 0x07,
-- 0x02, 0x00, 0x40, 0x10, 0x02, 0xc0, 0x43, 0x01,
-- 0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc,
-- 0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17,
-- 0x9b, 0x03, 0x06, 0x18, 0x16, 0x06, 0x20, 0x33,
-- 0x06, 0x40, 0x6b, 0x80, 0x1c, 0x01, 0x20, 0x04,
-- 0x40, 0x08, 0xd0, 0x05, 0x20, 0xd0, 0xb0, 0x04,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x17,
-- 0x23, 0x04, 0x43, 0xdb, 0x40, 0x19, 0x01, 0x08,
-- 0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc2, 0x60, 0x15,
-- 0x60, 0x54, 0x2e, 0xfe, 0xd0, 0x04, 0x20, 0x01,
-- 0x40, 0xb0, 0x60, 0xd0, 0x4b, 0x06, 0x43, 0x1f,
-- 0x60, 0x97, 0x20, 0x01, 0x40, 0x88, 0x23, 0x33,
-- 0x06, 0x5b, 0x63, 0x58, 0x20, 0x00, 0xe7, 0xe2,
-- 0xe7, 0xe1, 0x00, 0x00, 0x2e, 0x08, 0x20, 0x0c,
-- 0x80, 0x00, 0x00, 0x00, 0xb4, 0xb0, 0x1c, 0x01,
-- 0x06, 0x08, 0x16, 0x04, 0x4f, 0x0c, 0x22, 0x00,
-- 0x20, 0x00, 0x28, 0x04, 0xd3, 0x02, 0xe0, 0x0b,
-- 0x30, 0x01, 0xe7, 0xfa, 0x01, 0x03, 0x19, 0xdb,
-- 0x68, 0x5b, 0x42, 0xa3, 0xd1, 0x03, 0x25, 0x01,
-- 0x40, 0x85, 0x1c, 0x2b, 0x43, 0x1a, 0xe7, 0xf3,
-- 0x23, 0x33, 0x06, 0x5b, 0x6c, 0x1b, 0x40, 0x13,
-- 0xd0, 0x00, 0xe7, 0xf9, 0xbc, 0xb0, 0x47, 0x70,
-- 0x9e, 0x00, 0x00, 0xc0, 0xe3, 0xa0, 0x14, 0x62,
-- 0xe5, 0x91, 0x10, 0x14, 0xe2, 0x01, 0x00, 0xff,
-- 0xe5, 0x9f, 0x10, 0x2c, 0xe5, 0xd1, 0x10, 0x00,
-- 0xe3, 0x51, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x05,
-- 0xe5, 0x9f, 0x10, 0x1c, 0xe5, 0xd1, 0x10, 0x00,
-- 0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x11, 0x12,
-- 0xe3, 0xa0, 0x24, 0x66, 0xe5, 0x82, 0x10, 0x10,
-- 0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x81, 0x00, 0x14,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x7c, 0x48,
-- 0x47, 0x00, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00,
-- 0x47, 0x10, 0x00, 0x00, 0x47, 0x18, 0x00, 0x00,
-- 0x47, 0x20, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00,
-- 0x47, 0x30, 0x00, 0x00, 0x47, 0x38, 0x00, 0x00,
-- 0x17, 0xcb, 0x40, 0x59, 0x1a, 0xc9, 0x17, 0xc2,
-- 0x40, 0x50, 0x1a, 0x80, 0xd1, 0x01, 0xf0, 0x00,
-- 0xfa, 0x07, 0xb4, 0x0c, 0x08, 0x4b, 0x1c, 0x02,
-- 0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb,
-- 0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91,
-- 0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89,
-- 0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, 0xbc, 0x0c,
-- 0x40, 0x5a, 0x40, 0x50, 0x1a, 0x80, 0x40, 0x59,
-- 0x1a, 0xc9, 0x47, 0x70, 0x08, 0x4b, 0x1c, 0x02,
-- 0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xe9, 0x42, 0x9a,
-- 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00,
-- 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 0x41, 0x5b,
-- 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82,
-- 0xd1, 0xf7, 0x1c, 0x18, 0x47, 0x70, 0x00, 0x00,
-- 0x3a, 0x20, 0xd5, 0x09, 0x42, 0x53, 0x32, 0x20,
-- 0x40, 0xd0, 0x46, 0x94, 0x1c, 0x0a, 0x40, 0x9a,
-- 0x43, 0x10, 0x46, 0x62, 0x40, 0xd1, 0x47, 0x70,
-- 0x1c, 0x08, 0x40, 0xd0, 0x21, 0x00, 0x47, 0x70,
-- 0x40, 0x10, 0x40, 0x19, 0x47, 0x70, 0x00, 0x00,
-- 0x47, 0x70, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93,
-- 0xd3, 0x30, 0x46, 0x84, 0x07, 0x8b, 0xd0, 0x07,
-- 0x1e, 0x52, 0xd3, 0x29, 0x78, 0x0b, 0x70, 0x03,
-- 0x1c, 0x40, 0x1c, 0x49, 0x07, 0x8b, 0xd1, 0xf7,
-- 0x07, 0x83, 0xd1, 0x17, 0x3a, 0x10, 0xd3, 0x05,
-- 0xb4, 0xb0, 0xc9, 0xb8, 0xc0, 0xb8, 0x3a, 0x10,
-- 0xd2, 0xfb, 0xbc, 0xb0, 0x32, 0x0c, 0xd3, 0x0f,
-- 0xc9, 0x08, 0xc0, 0x08, 0x1f, 0x12, 0xd2, 0xfb,
-- 0xe0, 0x0a, 0xc9, 0x08, 0x70, 0xc3, 0x0a, 0x1b,
-- 0x70, 0x83, 0x0a, 0x1b, 0x70, 0x43, 0x0a, 0x1b,
-- 0x70, 0x03, 0x1d, 0x00, 0x1f, 0x12, 0xd2, 0xf4,
-- 0x1c, 0xd2, 0xd3, 0x05, 0x78, 0x0b, 0x70, 0x03,
-- 0x1c, 0x49, 0x1c, 0x40, 0x1e, 0x52, 0xd2, 0xf9,
-- 0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x43, 0x0b,
-- 0x43, 0x13, 0x07, 0x9b, 0xd1, 0x04, 0x1f, 0x12,
-- 0x58, 0x8b, 0x50, 0x83, 0xd1, 0xfb, 0x47, 0x70,
-- 0x1e, 0x52, 0x5c, 0x8b, 0x54, 0x83, 0xd1, 0xfb,
-- 0x47, 0x70, 0x00, 0x00, 0x42, 0x41, 0x46, 0x8c,
-- 0x07, 0x83, 0xd0, 0x05, 0x78, 0x03, 0x2b, 0x00,
-- 0xd0, 0x16, 0x1c, 0x40, 0x07, 0x83, 0xd1, 0xf9,
-- 0x49, 0x0a, 0xc8, 0x04, 0x09, 0xc9, 0x1a, 0x53,
-- 0x43, 0x93, 0x01, 0xc9, 0x40, 0x0b, 0xd0, 0xf8,
-- 0x1f, 0x00, 0x0e, 0x13, 0xd0, 0x08, 0x1c, 0x40,
-- 0x02, 0x13, 0x0e, 0x1b, 0xd0, 0x04, 0x1c, 0x40,
-- 0x04, 0x13, 0x0e, 0x1b, 0xd0, 0x00, 0x1c, 0x40,
-- 0x44, 0x60, 0x47, 0x70, 0x80, 0x80, 0x80, 0x80,
-- 0x46, 0x84, 0x07, 0x83, 0xd0, 0x05, 0x1e, 0x52,
-- 0xd3, 0x12, 0x70, 0x01, 0x1c, 0x40, 0x07, 0x83,
-- 0xd1, 0xf9, 0x3a, 0x08, 0xd3, 0x07, 0x02, 0x0b,
-- 0x43, 0x19, 0x04, 0x0b, 0x43, 0x19, 0x1c, 0x0b,
-- 0xc0, 0x0a, 0x3a, 0x08, 0xd2, 0xfc, 0x1d, 0xd2,
-- 0xd3, 0x02, 0x54, 0x81, 0x1e, 0x52, 0xd2, 0xfc,
-- 0x46, 0x60, 0x47, 0x70, 0x46, 0x84, 0x1c, 0x03,
-- 0x43, 0x0b, 0x07, 0x9b, 0xd1, 0x15, 0x1f, 0x12,
-- 0xd3, 0x0b, 0xb4, 0xb0, 0x4c, 0x10, 0x01, 0xe5,
-- 0xc9, 0x80, 0x1b, 0x3b, 0x43, 0xbb, 0x40, 0x2b,
-- 0xd1, 0x0f, 0xc0, 0x80, 0x1f, 0x12, 0xd2, 0xf7,
-- 0xbc, 0xb0, 0x1c, 0xd2, 0xd3, 0x11, 0x78, 0x0b,
-- 0x70, 0x03, 0x1c, 0x49, 0x1c, 0x40, 0x2b, 0x00,
-- 0xd0, 0x09, 0x1e, 0x52, 0xd2, 0xf7, 0x46, 0x60,
-- 0x47, 0x70, 0xbc, 0xb0, 0x1f, 0x09, 0x1c, 0xd2,
-- 0xe7, 0xf1, 0x70, 0x03, 0x1c, 0x40, 0x1e, 0x52,
-- 0xd2, 0xfb, 0x46, 0x60, 0x47, 0x70, 0x00, 0x00,
-- 0x01, 0x01, 0x01, 0x01, 0x1c, 0x02, 0x43, 0x0a,
-- 0x07, 0x92, 0xd1, 0x13, 0x46, 0x84, 0xb4, 0x30,
-- 0x4c, 0x0c, 0x01, 0xe5, 0xe0, 0x00, 0xc0, 0x04,
-- 0xc9, 0x04, 0x1b, 0x13, 0x43, 0x93, 0x40, 0x2b,
-- 0xd0, 0xf9, 0xe0, 0x01, 0x02, 0x12, 0x1c, 0x40,
-- 0x0e, 0x13, 0x70, 0x03, 0xd1, 0xfa, 0xbc, 0x30,
-- 0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x78, 0x0a,
-- 0x70, 0x1a, 0x1c, 0x49, 0x1c, 0x5b, 0x2a, 0x00,
-- 0xd1, 0xf9, 0x47, 0x70, 0x01, 0x01, 0x01, 0x01,
-- 0xb5, 0x80, 0x00, 0x43, 0x15, 0x5f, 0x43, 0xff,
-- 0x1c, 0x02, 0x0f, 0xc0, 0x07, 0xc0, 0x2f, 0x00,
-- 0xd0, 0x15, 0x43, 0x0b, 0xd0, 0x0c, 0x28, 0x00,
-- 0xd1, 0x07, 0x1c, 0x10, 0xf0, 0x00, 0xf9, 0x00,
-- 0xf0, 0x00, 0xf9, 0x9a, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x21, 0x01, 0x1c, 0x10, 0xe0, 0x11,
-- 0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x98,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x03, 0x13,
-- 0x43, 0x0b, 0xd1, 0x05, 0x28, 0x00, 0xd1, 0x03,
-- 0x1c, 0x10, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x82,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x46, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08,
-- 0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b,
-- 0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0,
-- 0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7,
-- 0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4,
-- 0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b,
-- 0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f,
-- 0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04,
-- 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5,
-- 0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70,
-- 0x01, 0x01, 0x01, 0x01, 0x47, 0x78, 0x00, 0x00,
-- 0xe2, 0x10, 0xc1, 0x02, 0x12, 0x60, 0x00, 0x00,
-- 0x03, 0x30, 0x00, 0x00, 0x03, 0xa0, 0x10, 0x00,
-- 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x8c, 0xc1, 0x01,
-- 0xe3, 0x8c, 0xc6, 0x1e, 0xe1, 0xb0, 0x28, 0x20,
-- 0x01, 0xa0, 0x08, 0x00, 0x02, 0x4c, 0xc4, 0x01,
-- 0xe1, 0xb0, 0x2c, 0x20, 0x01, 0xa0, 0x04, 0x00,
-- 0x02, 0x4c, 0xc5, 0x02, 0xe1, 0xb0, 0x2e, 0x20,
-- 0x01, 0xa0, 0x02, 0x00, 0x02, 0x4c, 0xc5, 0x01,
-- 0xe1, 0xb0, 0x2f, 0x20, 0x01, 0xa0, 0x01, 0x00,
-- 0x02, 0x4c, 0xc6, 0x02, 0xe1, 0xb0, 0x2f, 0xa0,
-- 0x01, 0xa0, 0x00, 0x80, 0x02, 0x4c, 0xc6, 0x01,
-- 0xe1, 0xa0, 0x00, 0x80, 0xe1, 0xa0, 0x1a, 0x00,
-- 0xe1, 0x8c, 0x06, 0x20, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x22, 0x01, 0x07, 0xd2, 0x40, 0x50, 0x47, 0x70,
-- 0xe2, 0x20, 0x01, 0x02, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x00, 0x40, 0x08, 0x40, 0x47, 0x70, 0x00, 0x00,
-- 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff,
-- 0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82,
-- 0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80,
-- 0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a,
-- 0x3a, 0x00, 0x00, 0x12, 0xe1, 0x50, 0x00, 0x0c,
-- 0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x01, 0x0c,
-- 0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x18,
-- 0xe3, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2,
-- 0xea, 0x00, 0x01, 0x09, 0xe1, 0x50, 0x00, 0x0c,
-- 0x03, 0x51, 0x00, 0x00, 0x8a, 0x00, 0x01, 0x02,
-- 0xe1, 0xb0, 0x20, 0x82, 0x33, 0xa0, 0x00, 0x01,
-- 0x23, 0xa0, 0x00, 0x00, 0x03, 0x33, 0x00, 0x00,
-- 0x03, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00,
-- 0x8a, 0x00, 0x00, 0xf9, 0xe1, 0xb0, 0x20, 0x82,
-- 0x23, 0xa0, 0x00, 0x00, 0x21, 0x2f, 0xff, 0x1e,
-- 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03,
-- 0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02,
-- 0x01, 0x51, 0x00, 0x03, 0x83, 0xa0, 0x00, 0x01,
-- 0x93, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x28,
-- 0xe8, 0xac, 0x7f, 0xff, 0xe2, 0x8f, 0x00, 0x0c,
-- 0xe2, 0x4c, 0x10, 0x3c, 0xe2, 0x4e, 0xe0, 0x04,
-- 0xe5, 0x8c, 0xe0, 0x00, 0xea, 0x00, 0x01, 0x91,
-- 0x80, 0x00, 0x00, 0x20, 0x44, 0x69, 0x76, 0x69,
-- 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65,
-- 0x72, 0x6f, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x50,
-- 0xb5, 0xf0, 0xb0, 0x8f, 0xf0, 0x00, 0xfd, 0x01,
-- 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x0f, 0xf0, 0x00,
-- 0xfd, 0x3b, 0x90, 0x03, 0x91, 0x04, 0x92, 0x05,
-- 0xa3, 0x3e, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39,
-- 0xf0, 0x00, 0xfd, 0xae, 0x49, 0x3d, 0x22, 0x00,
-- 0x4f, 0x3d, 0x28, 0x00, 0xd0, 0x0a, 0x48, 0x3d,
-- 0xab, 0x03, 0xf0, 0x00, 0xfd, 0xfb, 0x90, 0x0c,
-- 0x91, 0x0d, 0x92, 0x0e, 0xaa, 0x03, 0xca, 0x07,
-- 0x1c, 0x3b, 0xe0, 0x08, 0x48, 0x38, 0xab, 0x03,
-- 0x3e, 0x01, 0xf0, 0x00, 0xfd, 0xef, 0x90, 0x0c,
-- 0x91, 0x0d, 0x92, 0x0e, 0x1c, 0x3b, 0xf0, 0x00,
-- 0xfe, 0x03, 0x1c, 0x3b, 0xf0, 0x00, 0xfd, 0xe6,
-- 0xab, 0x0c, 0xf0, 0x00, 0xfe, 0x17, 0x90, 0x09,
-- 0x91, 0x0a, 0x92, 0x0b, 0xf0, 0x00, 0xfe, 0x48,
-- 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x0f, 0x4a, 0x2d,
-- 0xb4, 0x04, 0x23, 0x03, 0x1c, 0x2a, 0xf0, 0x00,
-- 0xfe, 0x5b, 0x90, 0x01, 0x91, 0x02, 0x92, 0x03,
-- 0xb0, 0x01, 0x4a, 0x29, 0xb4, 0x04, 0x23, 0x03,
-- 0x1c, 0x20, 0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x00,
-- 0xfe, 0x65, 0xb0, 0x01, 0x46, 0x6b, 0xf0, 0x00,
-- 0xfd, 0xf9, 0xab, 0x09, 0xf0, 0x00, 0xfd, 0xdc,
-- 0xab, 0x09, 0xf0, 0x00, 0xfd, 0xbf, 0x2e, 0x00,
-- 0xd0, 0x2c, 0xb0, 0x86, 0xab, 0x0c, 0xc3, 0x07,
-- 0x1c, 0x30, 0xf0, 0x00, 0xfe, 0x69, 0x1c, 0x0c,
-- 0x1c, 0x05, 0x1c, 0x17, 0x4b, 0x1b, 0x1c, 0x1e,
-- 0xf0, 0x00, 0xfd, 0xca, 0x90, 0x03, 0x91, 0x04,
-- 0x92, 0x05, 0xab, 0x0c, 0xf0, 0x00, 0xfd, 0xaa,
-- 0x90, 0x06, 0x91, 0x07, 0x92, 0x08, 0xab, 0x03,
-- 0xf0, 0x00, 0xfe, 0x86, 0xab, 0x0c, 0xf0, 0x00,
-- 0xfe, 0x83, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02,
-- 0x1c, 0x28, 0x1c, 0x21, 0x1c, 0x3a, 0x1d, 0xf3,
-- 0x33, 0x05, 0xf0, 0x00, 0xfd, 0xb1, 0x46, 0x6b,
-- 0xf0, 0x00, 0xfd, 0x94, 0xab, 0x06, 0xf0, 0x00,
-- 0xfd, 0x91, 0xb0, 0x06, 0xb0, 0x0f, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x3f, 0xe6, 0xa0, 0x9e,
-- 0x66, 0x7f, 0x3b, 0xcd, 0x80, 0x00, 0x00, 0x00,
-- 0x2e, 0x03, 0x3b, 0x10, 0x80, 0x00, 0x3f, 0xff,
-- 0x80, 0x00, 0x3f, 0xfe, 0x2e, 0x03, 0x3a, 0xbc,
-- 0x2e, 0x03, 0x3a, 0xe0, 0x2e, 0x03, 0x3a, 0xa4,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x38, 0x80,
-- 0xe1, 0xa0, 0x38, 0xa3, 0xe1, 0xc0, 0x00, 0x03,
-- 0xe1, 0xd1, 0xc0, 0x80, 0x5a, 0x00, 0x00, 0x0c,
-- 0xe2, 0x53, 0x3b, 0x0f, 0x4a, 0x00, 0x00, 0x13,
-- 0x12, 0x83, 0xc0, 0x01, 0x13, 0x5c, 0x0b, 0x02,
-- 0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0xc5, 0xa2,
-- 0x2a, 0x00, 0x00, 0x58, 0xe1, 0x80, 0x0a, 0x03,
-- 0xe3, 0xc1, 0x11, 0x02, 0xe1, 0x80, 0x05, 0xa1,
-- 0xe1, 0x8c, 0x1a, 0x81, 0xe3, 0xa0, 0x30, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x01, 0x01,
-- 0x1a, 0x00, 0x00, 0x40, 0xe2, 0x00, 0x01, 0x02,
-- 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x33, 0x00, 0x00,
-- 0x13, 0xa0, 0x33, 0x19, 0x11, 0x2f, 0xff, 0x1e,
-- 0xe2, 0x93, 0x30, 0x34, 0x0a, 0x00, 0x00, 0x31,
-- 0x42, 0x00, 0x01, 0x02, 0x43, 0xa0, 0x10, 0x00,
-- 0x43, 0xa0, 0x30, 0x00, 0x41, 0x2f, 0xff, 0x1e,
-- 0xe2, 0x53, 0x30, 0x20, 0x0a, 0x00, 0x00, 0x13,
-- 0xba, 0x00, 0x00, 0x1a, 0xe1, 0xb0, 0xc3, 0x12,
-- 0x4a, 0x00, 0x00, 0x05, 0xe2, 0x63, 0xc0, 0x20,
-- 0xe1, 0x80, 0x0c, 0x31, 0xe1, 0xa0, 0x2c, 0x32,
-- 0xe1, 0x82, 0x13, 0x11, 0xe3, 0xa0, 0x30, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x96, 0xc0, 0x8c,
-- 0xe2, 0x63, 0xc0, 0x20, 0xe1, 0x80, 0x0c, 0x31,
-- 0xe1, 0xa0, 0x2c, 0x32, 0xe1, 0x82, 0x13, 0x11,
-- 0xe3, 0xa0, 0x30, 0x00, 0x03, 0x11, 0x00, 0x01,
-- 0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01,
-- 0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x32, 0x01, 0x02,
-- 0x41, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01,
-- 0x01, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01,
-- 0x22, 0x80, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe2, 0x83, 0x30, 0x20, 0xe1, 0xb0, 0xc3, 0x11,
-- 0x4a, 0x00, 0x00, 0x04, 0xe2, 0x63, 0xc0, 0x20,
-- 0xe1, 0xa0, 0x1c, 0x31, 0xe2, 0x00, 0x01, 0x02,
-- 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0x3c, 0x01, 0x02, 0x01, 0x92, 0xc0, 0x06,
-- 0xe2, 0x63, 0xc0, 0x20, 0xe1, 0xa0, 0x1c, 0x31,
-- 0x03, 0x11, 0x00, 0x01, 0x12, 0x81, 0x10, 0x01,
-- 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0x31, 0x01, 0x02, 0x03, 0x32, 0x00, 0x00,
-- 0x03, 0xa0, 0x10, 0x00, 0x13, 0xa0, 0x10, 0x01,
-- 0xe3, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0x10, 0x02, 0x02, 0x1a, 0x00, 0x00, 0x0b,
-- 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0x31, 0x00, 0x00,
-- 0x11, 0xb0, 0x10, 0x81, 0x43, 0xe0, 0x00, 0x00,
-- 0x41, 0x2f, 0xff, 0x1e, 0x03, 0x32, 0x00, 0x00,
-- 0x13, 0xa0, 0x34, 0x61, 0x11, 0x2f, 0xff, 0x1e,
-- 0xe2, 0x00, 0x01, 0x02, 0xe3, 0x80, 0x02, 0x07,
-- 0xe3, 0x80, 0x06, 0xff, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe1, 0xa0, 0x30, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0xc1, 0x11, 0x02, 0xe1, 0xa0, 0xcb, 0x02,
-- 0xe1, 0x9c, 0xc0, 0x06, 0xe2, 0x00, 0xc1, 0x02,
-- 0xe1, 0xa0, 0x0a, 0x03, 0xe1, 0x80, 0x05, 0xa1,
-- 0xe1, 0xa0, 0x1a, 0x81, 0xe1, 0x81, 0x15, 0xa2,
-- 0xe3, 0xa0, 0x30, 0x00, 0x0a, 0x00, 0x00, 0x06,
-- 0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01,
-- 0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c,
-- 0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x11, 0x00, 0x01,
-- 0x01, 0x80, 0x00, 0x0c, 0x01, 0x2f, 0xff, 0x1e,
-- 0xe2, 0x91, 0x10, 0x01, 0x22, 0x80, 0x00, 0x01,
-- 0xe2, 0x90, 0x26, 0x01, 0xe1, 0x80, 0x00, 0x0c,
-- 0x51, 0x2f, 0xff, 0x1e, 0xe3, 0xa0, 0x33, 0x19,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe3, 0xa0, 0x20, 0x01, 0xea, 0x00, 0x00, 0x01,
-- 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x20, 0x02,
-- 0xe2, 0x00, 0x31, 0x02, 0xe5, 0x9f, 0x00, 0x18,
-- 0xe5, 0x80, 0x20, 0x00, 0xe3, 0x31, 0x00, 0x00,
-- 0x03, 0xa0, 0x00, 0x00, 0x15, 0x9f, 0x00, 0x0c,
-- 0x18, 0x90, 0x00, 0x03, 0xe1, 0x80, 0x00, 0x03,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xb0,
-- 0x2e, 0x08, 0x20, 0xbc, 0xe3, 0x10, 0x06, 0x01,
-- 0x13, 0xa0, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1e,
-- 0xea, 0x00, 0x00, 0x0a, 0xe3, 0x12, 0x07, 0x02,
-- 0x0a, 0x00, 0x00, 0x08, 0xe1, 0x5c, 0x00, 0x80,
-- 0x83, 0xa0, 0x00, 0x00, 0x81, 0x2f, 0xff, 0x1e,
-- 0x03, 0x51, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00,
-- 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x10, 0x07, 0x02,
-- 0x13, 0xa0, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1e,
-- 0xe3, 0xa0, 0x35, 0x06, 0xea, 0x00, 0x04, 0xee,
-- 0xe1, 0x2f, 0xff, 0x1f, 0xea, 0x00, 0x00, 0x3e,
-- 0xe5, 0x9f, 0x04, 0x5c, 0xe3, 0x50, 0x00, 0x00,
-- 0x0a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x20,
-- 0xe3, 0xa0, 0x10, 0x01, 0xef, 0x12, 0x34, 0x56,
-- 0xe5, 0x9f, 0x04, 0x48, 0xe3, 0x50, 0x00, 0x00,
-- 0x0a, 0x00, 0x00, 0x05, 0xe5, 0x90, 0x10, 0x00,
-- 0xe5, 0x9f, 0x04, 0x3c, 0xe5, 0x90, 0x30, 0x00,
-- 0xe5, 0x9f, 0x04, 0x38, 0xe5, 0x90, 0xd0, 0x00,
-- 0xea, 0x00, 0x00, 0x0b, 0xe3, 0xa0, 0x00, 0x16,
-- 0xe5, 0x9f, 0x44, 0x18, 0xe2, 0x84, 0x20, 0xa8,
-- 0xe2, 0x84, 0x10, 0xa4, 0xe5, 0x81, 0x20, 0x00,
-- 0xef, 0x12, 0x34, 0x56, 0xe2, 0x84, 0x00, 0xa8,
-- 0xe5, 0x90, 0xd0, 0x08, 0xe5, 0x90, 0x30, 0x04,
-- 0xe5, 0x90, 0x10, 0x00, 0xe3, 0x51, 0x00, 0x00,
-- 0x05, 0x9f, 0x14, 0x04, 0xe2, 0x8f, 0x00, 0x10,
-- 0xeb, 0x00, 0x00, 0x36, 0xe5, 0x9f, 0x03, 0xfc,
-- 0xe5, 0x9f, 0x33, 0xfc, 0xeb, 0x00, 0x00, 0x12,
-- 0xea, 0x00, 0x00, 0x4e, 0x2e, 0x00, 0x04, 0x04,
-- 0x2e, 0x03, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00,
-- 0xe3, 0x1c, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x03,
-- 0xe1, 0xa0, 0xe0, 0x0f, 0xe1, 0x2f, 0xff, 0x1c,
-- 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0x8f, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1c,
-- 0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x40, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x1c, 0x02, 0x1c, 0x13,
-- 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00,
-- 0xe3, 0x13, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x03,
-- 0xe1, 0xa0, 0xe0, 0x0f, 0xe1, 0x2f, 0xff, 0x13,
-- 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0x8f, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x13,
-- 0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x40, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0xc0, 0x44,
-- 0xe8, 0x8c, 0xff, 0xff, 0xe2, 0x8f, 0x00, 0x00,
-- 0xea, 0x00, 0x0c, 0xac, 0x00, 0x80, 0x0e, 0x09,
-- 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64,
-- 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x6e,
-- 0x6c, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x6f,
-- 0x6e, 0x20, 0x61, 0x20, 0x54, 0x68, 0x75, 0x6d,
-- 0x62, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74,
-- 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f,
-- 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x00, 0x00,
-- 0x2e, 0x08, 0x21, 0x50, 0x47, 0x78, 0x00, 0x00,
-- 0xe5, 0x9f, 0x73, 0x08, 0xe5, 0x87, 0x00, 0x00,
-- 0xe2, 0x8f, 0x50, 0xc9, 0xe2, 0x85, 0x5c, 0x02,
-- 0xe5, 0x87, 0x50, 0x10, 0xe2, 0x8f, 0x50, 0xe9,
-- 0xe2, 0x85, 0x5c, 0x02, 0xe5, 0x87, 0x50, 0x14,
-- 0xe1, 0xa0, 0x80, 0x0e, 0xe2, 0x87, 0x00, 0x04,
-- 0xeb, 0x00, 0x02, 0x39, 0xe9, 0x2d, 0x01, 0x00,
-- 0xe3, 0xa0, 0x00, 0x00, 0xe5, 0xc7, 0x00, 0x2c,
-- 0xe2, 0x87, 0x00, 0x04, 0xeb, 0x00, 0x00, 0xce,
-- 0xe3, 0xa0, 0x40, 0x00, 0xe2, 0x8d, 0x00, 0x04,
-- 0xe5, 0x97, 0x10, 0x00, 0xe3, 0xa0, 0x30, 0x00,
-- 0xe5, 0xc7, 0x30, 0x2e, 0xe2, 0x81, 0x30, 0x08,
-- 0xe8, 0x91, 0x00, 0x06, 0xe5, 0x9f, 0xc2, 0xcc,
-- 0xeb, 0xff, 0xff, 0xb7, 0xe8, 0xbd, 0x40, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe3, 0xa0, 0x80, 0x01, 0xea, 0x00, 0x00, 0x01,
-- 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x80, 0x00,
-- 0xe1, 0xa0, 0x70, 0x00, 0xeb, 0x00, 0x02, 0x31,
-- 0xe1, 0xa0, 0x00, 0x08, 0xeb, 0x00, 0x00, 0x0d,
-- 0xe1, 0xa0, 0x20, 0x07, 0xe3, 0x52, 0x00, 0x00,
-- 0x12, 0x8f, 0x00, 0x08, 0x15, 0x9f, 0x10, 0x00,
-- 0xeb, 0x00, 0x0c, 0x6d, 0x41, 0x42, 0x45, 0x58,
-- 0x00, 0x80, 0x0e, 0x06, 0x52, 0x65, 0x74, 0x75,
-- 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20,
-- 0x74, 0x6f, 0x6f, 0x20, 0x6c, 0x61, 0x72, 0x67,
-- 0x65, 0x00, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x00,
-- 0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x32, 0x60,
-- 0xeb, 0xff, 0xff, 0xa9, 0xe8, 0xbd, 0x40, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe5, 0x9f, 0xc2, 0x28, 0xe5, 0xdc, 0x00, 0x2c,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x30, 0x00,
-- 0xe5, 0x9f, 0x12, 0x14, 0xe4, 0x81, 0xf0, 0x04,
-- 0xe8, 0xb3, 0x00, 0x04, 0xe8, 0xa1, 0x00, 0x04,
-- 0xe4, 0xd3, 0x20, 0x01, 0xe4, 0xc1, 0x20, 0x01,
-- 0xe3, 0x52, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xfb,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0x47, 0x78, 0x00, 0x00,
-- 0xe1, 0xa0, 0x80, 0x01, 0xeb, 0xff, 0xff, 0xf2,
-- 0xe5, 0x9f, 0x71, 0xe8, 0xe5, 0xd7, 0x20, 0x2f,
-- 0xe3, 0x52, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x2c,
-- 0xe3, 0xa0, 0x20, 0x01, 0xe5, 0xc7, 0x20, 0x2f,
-- 0xeb, 0x00, 0x00, 0x3b, 0xe1, 0xa0, 0x10, 0x08,
-- 0xeb, 0x00, 0x01, 0xfa, 0xe3, 0x50, 0x00, 0x00,
-- 0x0a, 0x00, 0x00, 0x1b, 0xe2, 0x88, 0xb0, 0x40,
-- 0xe9, 0x3b, 0x01, 0xef, 0xe9, 0x2c, 0x01, 0xef,
-- 0xe9, 0x3b, 0x01, 0xef, 0xe9, 0x2c, 0x01, 0xef,
-- 0xe5, 0x9f, 0x71, 0xa8, 0xe5, 0x97, 0x40, 0xa0,
-- 0xe3, 0x84, 0x40, 0x80, 0xe1, 0x21, 0xf0, 0x04,
-- 0xe1, 0xa0, 0xd0, 0x0c, 0xe1, 0xa0, 0xb0, 0x04,
-- 0xe5, 0x9f, 0x01, 0x8c, 0xe5, 0x90, 0x00, 0x04,
-- 0xe1, 0xa0, 0x10, 0x0d, 0xeb, 0x00, 0x02, 0x1a,
-- 0xe3, 0xa0, 0x10, 0x00, 0xe5, 0xc7, 0x10, 0x2f,
-- 0xe1, 0xa0, 0x10, 0x0d, 0xe3, 0x54, 0x00, 0x10,
-- 0x1a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x17,
-- 0xef, 0x12, 0x34, 0x56, 0xe3, 0x21, 0xf0, 0x93,
-- 0xe1, 0xa0, 0x00, 0x00, 0xe2, 0x81, 0xe0, 0x3c,
-- 0xe9, 0x5e, 0x7f, 0xff, 0xe1, 0xa0, 0x00, 0x00,
-- 0xe8, 0xde, 0x80, 0x00, 0xe2, 0x8f, 0x00, 0x00,
-- 0xea, 0x00, 0x0c, 0x2a, 0x00, 0x80, 0x0e, 0x07,
-- 0x4e, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b,
-- 0x20, 0x66, 0x6f, 0x72, 0x20, 0x54, 0x72, 0x61,
-- 0x70, 0x20, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
-- 0x72, 0x00, 0x00, 0x00, 0xe2, 0x8f, 0x00, 0x00,
-- 0xea, 0x00, 0x0c, 0x20, 0x00, 0x80, 0x0e, 0x00,
-- 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76,
-- 0x65, 0x20, 0x54, 0x72, 0x61, 0x70, 0x00, 0x00,
-- 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc1, 0x04,
-- 0xe3, 0xa0, 0x00, 0x00, 0xe5, 0xcc, 0x00, 0x2f,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe5, 0x9f, 0x00, 0xf0, 0xe5, 0x90, 0x00, 0x00,
-- 0xe5, 0x90, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x00, 0xdc,
-- 0xe2, 0x80, 0x00, 0x04, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0xcc,
-- 0xe3, 0x50, 0x0b, 0x02, 0x33, 0xa0, 0x0b, 0x02,
-- 0xe2, 0x8c, 0xc0, 0x04, 0xe9, 0x9c, 0x00, 0x0c,
-- 0xe0, 0x53, 0x31, 0x00, 0x21, 0x53, 0x00, 0x02,
-- 0x3a, 0x00, 0x00, 0x03, 0xe5, 0x81, 0x20, 0x00,
-- 0xe0, 0x82, 0x21, 0x00, 0xe5, 0x8c, 0x20, 0x04,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x50, 0x03,
-- 0xe1, 0xa0, 0x10, 0x0c, 0xeb, 0x00, 0x00, 0x44,
-- 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0d,
-- 0xe5, 0x9d, 0xc0, 0x08, 0xe9, 0x9c, 0x40, 0x04,
-- 0xe1, 0x5e, 0x00, 0x01, 0x10, 0x4e, 0x30, 0x02,
-- 0xe0, 0x81, 0xe0, 0x00, 0x11, 0xa0, 0x00, 0x02,
-- 0x11, 0xa0, 0x20, 0x01, 0xe9, 0x8c, 0x40, 0x04,
-- 0x13, 0x53, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x03,
-- 0xe8, 0xbd, 0x50, 0x03, 0xe5, 0x81, 0x00, 0x00,
-- 0xe1, 0xa0, 0x01, 0x43, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe8, 0xbd, 0x50, 0x03, 0xe9, 0x9c, 0x00, 0x0c,
-- 0xe0, 0x43, 0x00, 0x02, 0xe1, 0xb0, 0x01, 0x40,
-- 0x03, 0xa0, 0x20, 0x00, 0x15, 0x8c, 0x30, 0x04,
-- 0xe5, 0x81, 0x20, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe2, 0x80, 0x20, 0x03,
-- 0xe3, 0xc2, 0x20, 0x03, 0xe5, 0x9f, 0xc0, 0x24,
-- 0xe2, 0x8c, 0xc0, 0x08, 0xe8, 0x9c, 0x00, 0x03,
-- 0xe0, 0x90, 0x20, 0x02, 0x31, 0x52, 0x00, 0x01,
-- 0x35, 0x8c, 0x20, 0x00, 0x23, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xcc,
-- 0x2e, 0x08, 0x20, 0x98, 0x00, 0x00, 0x00, 0x00,
-- 0x2e, 0x02, 0x5d, 0xa4, 0x2e, 0x02, 0x5d, 0xa0,
-- 0x2e, 0x02, 0x5d, 0x9c, 0x2e, 0x08, 0x99, 0xfc,
-- 0x2e, 0x00, 0x1c, 0x39, 0x2e, 0x01, 0xa1, 0x35,
-- 0x2e, 0x01, 0x9f, 0xe9, 0x2e, 0x01, 0xa0, 0xa9,
-- 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04,
-- 0xe5, 0x90, 0x00, 0x00, 0xe2, 0x00, 0x04, 0xff,
-- 0xe3, 0x50, 0x04, 0xea, 0x03, 0xa0, 0x00, 0x01,
-- 0x13, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe2, 0x40, 0x0b, 0x05,
-- 0xe3, 0x50, 0x0b, 0x1b, 0x33, 0xa0, 0x00, 0x01,
-- 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe2, 0x8f, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20,
-- 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00,
-- 0x00, 0x02, 0x00, 0x00, 0x42, 0x72, 0x61, 0x6e,
-- 0x63, 0x68, 0x20, 0x54, 0x68, 0x72, 0x6f, 0x75,
-- 0x67, 0x68, 0x20, 0x5a, 0x65, 0x72, 0x6f, 0x00,
-- 0x00, 0x02, 0x00, 0x01, 0x55, 0x6e, 0x64, 0x65,
-- 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x49, 0x6e,
-- 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f,
-- 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02,
-- 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65,
-- 0x64, 0x20, 0x53, 0x57, 0x49, 0x20, 0x49, 0x6e,
-- 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f,
-- 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03,
-- 0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, 0x68,
-- 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x00, 0x00,
-- 0x00, 0x02, 0x00, 0x04, 0x44, 0x61, 0x74, 0x61,
-- 0x20, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x00, 0x00,
-- 0x00, 0x02, 0x00, 0x05, 0x41, 0x64, 0x64, 0x72,
-- 0x65, 0x73, 0x73, 0x20, 0x45, 0x78, 0x63, 0x65,
-- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00,
-- 0x00, 0x02, 0x00, 0x06, 0x55, 0x6e, 0x68, 0x61,
-- 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x49, 0x6e,
-- 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00,
-- 0x00, 0x02, 0x00, 0x07, 0x55, 0x6e, 0x68, 0x61,
-- 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x46, 0x61,
-- 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72,
-- 0x72, 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00,
-- 0x2e, 0x01, 0x99, 0x2c, 0x2e, 0x01, 0x99, 0x44,
-- 0x2e, 0x01, 0x99, 0x60, 0x2e, 0x01, 0x99, 0x80,
-- 0x2e, 0x01, 0x99, 0x94, 0x2e, 0x01, 0x99, 0xa4,
-- 0x2e, 0x01, 0x99, 0xbc, 0x2e, 0x01, 0x99, 0xd4,
-- 0xe2, 0x4f, 0x20, 0x28, 0xe7, 0x92, 0x01, 0x00,
-- 0xea, 0xff, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xb5, 0x04, 0xf0, 0x00,
-- 0xf8, 0x04, 0xbc, 0x08, 0x60, 0x1a, 0xbc, 0x08,
-- 0x47, 0x18, 0x47, 0x78, 0xe1, 0xb0, 0x00, 0x80,
-- 0x03, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x00, 0x60,
-- 0x03, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e,
-- 0xe1, 0xa0, 0x2a, 0xa0, 0xe1, 0xc0, 0x0a, 0x82,
-- 0xe1, 0xa0, 0x00, 0x60, 0xe3, 0x32, 0x00, 0x00,
-- 0xe2, 0x42, 0x2c, 0x03, 0xe2, 0x42, 0x20, 0xfe,
-- 0x0a, 0x00, 0x00, 0x06, 0xe3, 0x80, 0x04, 0x3f,
-- 0xe3, 0x80, 0x06, 0x0e, 0xe2, 0x22, 0x3b, 0x01,
-- 0xe3, 0x33, 0x00, 0x01, 0x11, 0x2f, 0xff, 0x1e,
-- 0xe3, 0xa0, 0x10, 0x01, 0xea, 0xff, 0xfe, 0x39,
-- 0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xa0, 0x06, 0x00,
-- 0xe2, 0x42, 0x20, 0x01, 0xe1, 0xb0, 0x00, 0x80,
-- 0x4a, 0x00, 0x00, 0x02, 0xe1, 0xb0, 0x10, 0x81,
-- 0x23, 0x80, 0x0a, 0x01, 0xea, 0xff, 0xff, 0xf9,
-- 0xe1, 0xa0, 0x04, 0xc0, 0xe3, 0xc0, 0x05, 0x01,
-- 0xe1, 0x8c, 0x01, 0x20, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0xb0, 0xc0, 0x80,
-- 0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x35, 0x0c,
-- 0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81,
-- 0xe1, 0x83, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e,
-- 0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02,
-- 0xe1, 0xb0, 0xca, 0xcc, 0x0a, 0x00, 0x00, 0x02,
-- 0xe3, 0x7c, 0x00, 0x01, 0x03, 0x80, 0x01, 0x01,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x11, 0x01, 0x02,
-- 0x01, 0x2f, 0xff, 0x1e, 0xe3, 0xd1, 0x11, 0x02,
-- 0x0a, 0x00, 0x00, 0x15, 0xe1, 0xb0, 0x38, 0x21,
-- 0x01, 0xa0, 0x18, 0x01, 0x03, 0xa0, 0xc0, 0x10,
-- 0x13, 0xa0, 0xc0, 0x00, 0xe1, 0xb0, 0x3c, 0x21,
-- 0x01, 0xa0, 0x14, 0x01, 0x02, 0x8c, 0xc0, 0x08,
-- 0xe1, 0xb0, 0x3e, 0x21, 0x01, 0xa0, 0x12, 0x01,
-- 0x02, 0x8c, 0xc0, 0x04, 0xe1, 0xb0, 0x3f, 0x21,
-- 0x01, 0xa0, 0x11, 0x01, 0x02, 0x8c, 0xc0, 0x02,
-- 0xe1, 0xb0, 0x3f, 0xa1, 0x01, 0xa0, 0x10, 0x81,
-- 0x02, 0x8c, 0xc0, 0x01, 0xe2, 0x6c, 0x30, 0x20,
-- 0xe1, 0x81, 0x13, 0x32, 0xe1, 0xa0, 0x2c, 0x12,
-- 0xe0, 0x40, 0x00, 0x0c, 0xe2, 0x80, 0x00, 0x01,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xb0, 0x38, 0x22,
-- 0x01, 0xa0, 0x28, 0x02, 0x03, 0xa0, 0xc0, 0x10,
-- 0x13, 0xa0, 0xc0, 0x00, 0xe1, 0xb0, 0x3c, 0x22,
-- 0x01, 0xa0, 0x24, 0x02, 0x02, 0x8c, 0xc0, 0x08,
-- 0xe1, 0xb0, 0x3e, 0x22, 0x01, 0xa0, 0x22, 0x02,
-- 0x02, 0x8c, 0xc0, 0x04, 0xe1, 0xb0, 0x3f, 0x22,
-- 0x01, 0xa0, 0x21, 0x02, 0x02, 0x8c, 0xc0, 0x02,
-- 0xe1, 0xb0, 0x3f, 0xa2, 0x01, 0xa0, 0x20, 0x82,
-- 0x02, 0x8c, 0xc0, 0x01, 0xe1, 0xa0, 0x10, 0x02,
-- 0xe3, 0xa0, 0x20, 0x00, 0xe2, 0x40, 0x00, 0x1f,
-- 0xe0, 0x40, 0x00, 0x0c, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xc4, 0xff,
-- 0xe3, 0x8c, 0xc6, 0x0e, 0xe1, 0x5c, 0x00, 0x82,
-- 0x9a, 0x00, 0x00, 0x0a, 0xe1, 0xb0, 0x00, 0x80,
-- 0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x0a,
-- 0x3a, 0x00, 0x00, 0x11, 0xe1, 0x50, 0x00, 0x0c,
-- 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xf2,
-- 0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x17,
-- 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2,
-- 0xea, 0xff, 0xfd, 0xef, 0xe1, 0x50, 0x00, 0x0c,
-- 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xe8,
-- 0xe1, 0xb0, 0x20, 0x82, 0x03, 0x33, 0x00, 0x00,
-- 0x83, 0xa0, 0x00, 0x01, 0x93, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c,
-- 0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfd, 0xe0,
-- 0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x01,
-- 0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02,
-- 0x01, 0x51, 0x00, 0x03, 0x93, 0xa0, 0x00, 0x00,
-- 0x83, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03,
-- 0x33, 0xa0, 0x00, 0x01, 0x23, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38,
-- 0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01,
-- 0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x02, 0x30,
-- 0xeb, 0x00, 0x03, 0x38, 0xe8, 0xbd, 0x4b, 0xf0,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x02, 0x86,
-- 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0,
-- 0xe8, 0x93, 0x00, 0x38, 0xe3, 0x10, 0x01, 0x01,
-- 0x03, 0x13, 0x01, 0x01, 0x1a, 0x00, 0x00, 0x03,
-- 0xeb, 0x00, 0x03, 0x5e, 0xeb, 0x00, 0x03, 0x2b,
-- 0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe2, 0x4f, 0xe0, 0x14, 0xe3, 0xa0, 0xb0, 0x00,
-- 0xea, 0x00, 0x03, 0xf8, 0x47, 0x78, 0x00, 0x00,
-- 0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0xd1, 0xc0, 0x80,
-- 0x41, 0xd4, 0xc0, 0x83, 0x5a, 0x00, 0x00, 0x04,
-- 0xe3, 0xa0, 0xb0, 0x04, 0xeb, 0x00, 0x04, 0x3f,
-- 0xeb, 0x00, 0x03, 0x1c, 0xe8, 0xbd, 0x4b, 0xf0,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe3, 0x11, 0x01, 0x02,
-- 0x0a, 0x00, 0x00, 0x08, 0xe3, 0x10, 0x01, 0x01,
-- 0x03, 0x13, 0x01, 0x01, 0x02, 0x4f, 0xe0, 0x24,
-- 0xe3, 0xa0, 0xb0, 0x04, 0x0a, 0x00, 0x05, 0x5b,
-- 0xe0, 0x23, 0x00, 0x00, 0xe2, 0x00, 0x01, 0x02,
-- 0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe3, 0x14, 0x01, 0x02, 0x03, 0xa0, 0x34, 0x62,
-- 0x13, 0xa0, 0x34, 0x61, 0xea, 0x00, 0x02, 0x9d,
-- 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0,
-- 0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0x40, 0x01,
-- 0xe1, 0xa0, 0x50, 0x02, 0xe3, 0x10, 0x01, 0x01,
-- 0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0x35,
-- 0xeb, 0x00, 0x03, 0x02, 0xe8, 0xbd, 0x4b, 0xf0,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x03, 0xcf,
-- 0xb4, 0x77, 0x46, 0x76, 0x1e, 0x5d, 0x9b, 0x06,
-- 0x1c, 0x1c, 0x34, 0x0c, 0xf7, 0xff, 0xff, 0x8c,
-- 0x1c, 0x23, 0x34, 0x0c, 0xf7, 0xff, 0xff, 0x6e,
-- 0x46, 0x6b, 0xf7, 0xff, 0xff, 0x85, 0x1e, 0x6d,
-- 0xd1, 0xf6, 0xb0, 0x03, 0x46, 0xb6, 0xbc, 0x70,
-- 0x47, 0x70, 0x00, 0x00, 0xb4, 0x77, 0x46, 0x76,
-- 0x1e, 0x5d, 0x9b, 0x06, 0x1c, 0x1c, 0x34, 0x0c,
-- 0xf7, 0xff, 0xff, 0x5c, 0x46, 0x6b, 0xf7, 0xff,
-- 0xff, 0x73, 0x1c, 0x23, 0x34, 0x0c, 0xf7, 0xff,
-- 0xff, 0x55, 0x1e, 0x6d, 0xd1, 0xf6, 0xb0, 0x03,
-- 0x46, 0xb6, 0xbc, 0x70, 0x47, 0x70, 0x00, 0x00,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0xb0, 0x10, 0x00,
-- 0xe2, 0x00, 0x01, 0x02, 0x42, 0x61, 0x10, 0x00,
-- 0xe3, 0xa0, 0x20, 0x00, 0x01, 0x2f, 0xff, 0x1e,
-- 0xe3, 0x80, 0x09, 0x01, 0xe3, 0x80, 0x00, 0x1e,
-- 0xe1, 0xb0, 0xc8, 0x21, 0x01, 0xa0, 0x18, 0x01,
-- 0x02, 0x40, 0x00, 0x10, 0xe1, 0xb0, 0xcc, 0x21,
-- 0x01, 0xa0, 0x14, 0x01, 0x02, 0x40, 0x00, 0x08,
-- 0xe1, 0xb0, 0xce, 0x21, 0x01, 0xa0, 0x12, 0x01,
-- 0x02, 0x40, 0x00, 0x04, 0xe1, 0xb0, 0xcf, 0x21,
-- 0x01, 0xa0, 0x11, 0x01, 0x02, 0x40, 0x00, 0x02,
-- 0xe1, 0xb0, 0xcf, 0xa1, 0x01, 0xa0, 0x10, 0x81,
-- 0x02, 0x40, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0,
-- 0xe8, 0x93, 0x00, 0x38, 0xe2, 0x23, 0x31, 0x02,
-- 0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01,
-- 0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x01, 0xbe,
-- 0xeb, 0x00, 0x02, 0xc6, 0xe8, 0xbd, 0x4b, 0xf0,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x02, 0x14,
-- 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0xb0, 0x00,
-- 0xe1, 0xa0, 0x20, 0x01, 0xe8, 0x80, 0x00, 0x0e,
-- 0xe5, 0x9f, 0xc0, 0x38, 0xe5, 0x8c, 0xd0, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe5, 0x9f, 0x20, 0x28, 0xe5, 0x92, 0x20, 0x00,
-- 0xe5, 0x91, 0x40, 0x2c, 0xe5, 0x91, 0xc0, 0x34,
-- 0xe1, 0x5c, 0x00, 0x02, 0x23, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00,
-- 0xe5, 0x9f, 0xc0, 0x08, 0xe5, 0x9c, 0xd0, 0x00,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x2e, 0x08, 0x21, 0x90, 0x47, 0x78, 0x00, 0x00,
-- 0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0xc0, 0xe4,
-- 0xe5, 0x9c, 0x00, 0x00, 0xe3, 0x50, 0x00, 0x00,
-- 0xe3, 0xa0, 0x00, 0x04, 0x15, 0x8c, 0x00, 0x04,
-- 0x0b, 0x00, 0x00, 0x01, 0xe8, 0xbd, 0x40, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe5, 0x9f, 0xc0, 0xcc,
-- 0xea, 0xff, 0xfd, 0x6b, 0xe3, 0xa0, 0x10, 0x0a,
-- 0xe3, 0x50, 0x01, 0x02, 0x13, 0x50, 0x01, 0x06,
-- 0x13, 0x50, 0x01, 0x16, 0x03, 0xa0, 0x10, 0x03,
-- 0xe3, 0x50, 0x01, 0x0a, 0x13, 0x50, 0x01, 0x0e,
-- 0x03, 0xa0, 0x10, 0x05, 0xe5, 0x9f, 0x20, 0xa8,
-- 0xe1, 0x50, 0x00, 0x02, 0xe2, 0x82, 0x20, 0xff,
-- 0x21, 0x52, 0x00, 0x00, 0x23, 0xa0, 0x10, 0x02,
-- 0xe3, 0x50, 0x01, 0x82, 0x03, 0xa0, 0x10, 0x02,
-- 0xe3, 0x50, 0x01, 0x86, 0x03, 0xa0, 0x10, 0x07,
-- 0xe5, 0x9f, 0x20, 0x88, 0xe0, 0x50, 0x20, 0x02,
-- 0x13, 0x52, 0x00, 0x01, 0x03, 0xa0, 0x10, 0x05,
-- 0xe1, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x02,
-- 0xe1, 0xa0, 0x30, 0x00, 0xeb, 0xff, 0xff, 0xe4,
-- 0xe8, 0xbd, 0x40, 0x02, 0xe5, 0x9f, 0xc0, 0x50,
-- 0xe3, 0xa0, 0x20, 0x01, 0xe5, 0xcc, 0x20, 0x00,
-- 0xe9, 0x2d, 0x00, 0x0a, 0xeb, 0xff, 0xff, 0xdc,
-- 0xea, 0x00, 0x00, 0x09, 0x47, 0x78, 0x00, 0x00,
-- 0xe5, 0x9f, 0xc0, 0x30, 0xe3, 0xa0, 0x10, 0x00,
-- 0xe5, 0x8c, 0x10, 0x00, 0xe5, 0x9c, 0x00, 0x04,
-- 0xe3, 0x50, 0x00, 0x00, 0x01, 0x2f, 0xff, 0x1e,
-- 0xe5, 0x8c, 0x10, 0x04, 0xea, 0xff, 0xff, 0xd2,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0xc0, 0x0d,
-- 0xe9, 0x2d, 0xd9, 0xf0, 0xe2, 0x4c, 0xb0, 0x04,
-- 0xe3, 0xa0, 0x10, 0x01, 0xea, 0xff, 0xfd, 0x88,
-- 0x2e, 0x08, 0x20, 0xb4, 0x2e, 0x08, 0x20, 0xc6,
-- 0x2e, 0x01, 0xb5, 0xe1, 0x80, 0x00, 0x02, 0x00,
-- 0x80, 0x80, 0x0e, 0xa0, 0xb5, 0xff, 0xa6, 0x23,
-- 0xa5, 0x22, 0xa4, 0x22, 0x68, 0x5a, 0x68, 0x1f,
-- 0x4b, 0x21, 0x60, 0x5a, 0x23, 0x00, 0x4a, 0x21,
-- 0x70, 0x13, 0x70, 0x53, 0x70, 0x93, 0x4a, 0x20,
-- 0x2a, 0x00, 0xd0, 0x02, 0x9a, 0x02, 0xf7, 0xff,
-- 0xff, 0xfe, 0x48, 0x1e, 0x28, 0x00, 0xd0, 0x01,
-- 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1c, 0x28, 0x00,
-- 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x1b,
-- 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xfc, 0xb2,
-- 0x48, 0x19, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff,
-- 0xff, 0xfe, 0x48, 0x18, 0x28, 0x00, 0xd0, 0x01,
-- 0xf0, 0x01, 0xfb, 0x18, 0x48, 0x16, 0x28, 0x00,
-- 0xd0, 0x01, 0xf0, 0x01, 0xfc, 0x89, 0x48, 0x15,
-- 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe,
-- 0xf7, 0xff, 0xff, 0xa0, 0x48, 0x12, 0x28, 0x00,
-- 0xd0, 0x04, 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x22,
-- 0xf0, 0x01, 0xfe, 0xa6, 0x2f, 0x00, 0xd0, 0x01,
-- 0xf7, 0xfe, 0xfd, 0xcc, 0xb0, 0x04, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x3a, 0x74, 0x74, 0x00,
-- 0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb9, 0x91,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb6, 0x71,
-- 0x2e, 0x01, 0xb9, 0x5d, 0x00, 0x00, 0x00, 0x00,
-- 0x2e, 0x01, 0xbd, 0xb5, 0xb5, 0x90, 0x28, 0x00,
-- 0xd0, 0x04, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x01,
-- 0xf7, 0xff, 0xff, 0xfe, 0x4f, 0x10, 0x68, 0x78,
-- 0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xfd, 0x94,
-- 0x20, 0x00, 0x60, 0x78, 0x4f, 0x0d, 0x78, 0x78,
-- 0x24, 0x01, 0x28, 0x00, 0xd1, 0x05, 0x70, 0x7c,
-- 0x48, 0x0b, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff,
-- 0xff, 0xfe, 0x78, 0xb8, 0x28, 0x00, 0xd1, 0x05,
-- 0x70, 0xbc, 0x48, 0x08, 0x28, 0x00, 0xd0, 0x01,
-- 0xf0, 0x01, 0xfe, 0xb2, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xbe, 0x55,
-- 0xb5, 0x90, 0x1c, 0x0c, 0x21, 0x01, 0x1c, 0x17,
-- 0xf0, 0x01, 0xfa, 0xbc, 0x21, 0x00, 0x1c, 0x20,
-- 0xf0, 0x01, 0xfa, 0xb8, 0x21, 0x02, 0x1c, 0x38,
-- 0xf0, 0x01, 0xfa, 0xb4, 0x20, 0x01, 0xf7, 0xff,
-- 0xfa, 0x5d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0xf1, 0x20, 0x00, 0xb0, 0x89, 0x90, 0x06,
-- 0x26, 0x00, 0x90, 0x05, 0x20, 0x01, 0x90, 0x04,
-- 0x27, 0x00, 0x20, 0x00, 0x90, 0x03, 0x90, 0x02,
-- 0x25, 0x00, 0x90, 0x01, 0xf0, 0x01, 0xfb, 0xe2,
-- 0x1c, 0x04, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x17,
-- 0x49, 0xe3, 0x5d, 0xe0, 0x5c, 0x08, 0x08, 0x40,
-- 0xd3, 0x06, 0x37, 0x01, 0x5d, 0xe0, 0x5c, 0x08,
-- 0x08, 0x40, 0xd2, 0xfa, 0xe0, 0x00, 0x37, 0x01,
-- 0x5d, 0xe0, 0x5c, 0x0a, 0x08, 0x52, 0xd2, 0x01,
-- 0x28, 0x00, 0xd1, 0xf8, 0x98, 0x04, 0x30, 0x01,
-- 0x90, 0x04, 0x5d, 0xe0, 0x28, 0x00, 0xd1, 0xe8,
-- 0x98, 0x04, 0x00, 0x80, 0xf0, 0x01, 0xfc, 0x16,
-- 0x4b, 0xd6, 0x93, 0x08, 0x60, 0x18, 0x1c, 0x78,
-- 0xf0, 0x01, 0xfc, 0x10, 0x9b, 0x08, 0x60, 0x58,
-- 0x48, 0xd3, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff,
-- 0xff, 0xfe, 0x21, 0x00, 0x20, 0x00, 0x90, 0x04,
-- 0x48, 0xd0, 0x90, 0x07, 0x78, 0x27, 0x34, 0x01,
-- 0x2e, 0x00, 0xd1, 0x58, 0x2f, 0x22, 0xd0, 0x01,
-- 0x2f, 0x27, 0xd1, 0x02, 0x97, 0x05, 0x1c, 0x3e,
-- 0xe0, 0x93, 0x98, 0x06, 0x42, 0x81, 0xd1, 0x4e,
-- 0x98, 0x03, 0x28, 0x00, 0xd1, 0x4b, 0x25, 0x00,
-- 0x43, 0xed, 0x1c, 0x2a, 0x95, 0x01, 0x22, 0x00,
-- 0xab, 0x00, 0x70, 0x1a, 0x70, 0x5a, 0x1e, 0x60,
-- 0x78, 0x02, 0x2a, 0x30, 0xdb, 0x04, 0x2a, 0x39,
-- 0xdc, 0x02, 0x30, 0x01, 0x1f, 0xd5, 0x3d, 0x29,
-- 0x78, 0x02, 0x2a, 0x3e, 0xd0, 0x01, 0x2a, 0x3c,
-- 0xd1, 0x35, 0x2a, 0x3e, 0xd1, 0x0e, 0x22, 0x77,
-- 0xab, 0x00, 0x70, 0x1a, 0x2d, 0x00, 0xd0, 0x63,
-- 0x2d, 0x02, 0xdc, 0x62, 0x78, 0x42, 0x30, 0x01,
-- 0x2a, 0x3e, 0xd1, 0x13, 0x22, 0x61, 0x70, 0x1a,
-- 0x30, 0x01, 0xe0, 0x0f, 0x30, 0x01, 0x1c, 0x02,
-- 0xe0, 0x02, 0x2b, 0x3e, 0xd0, 0x56, 0x32, 0x01,
-- 0x78, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x2b, 0x20,
-- 0xd1, 0xf7, 0x2d, 0x00, 0xdc, 0x4d, 0x22, 0x72,
-- 0xab, 0x00, 0x70, 0x1a, 0x78, 0x02, 0x2a, 0x26,
-- 0xd1, 0x24, 0x23, 0x01, 0x42, 0xdd, 0xd0, 0x19,
-- 0x2d, 0x00, 0xdd, 0x5e, 0x78, 0x42, 0x30, 0x01,
-- 0x2a, 0x30, 0xdb, 0x5b, 0x2a, 0x32, 0xdc, 0x3c,
-- 0x30, 0x01, 0x1c, 0x2b, 0xd5, 0x04, 0x07, 0xdb,
-- 0x0f, 0xdb, 0x42, 0x5b, 0xe0, 0x02, 0xe0, 0x42,
-- 0x07, 0xdb, 0x0f, 0xdb, 0x33, 0x31, 0x42, 0x9a,
-- 0xd1, 0x63, 0x22, 0x00, 0xab, 0x00, 0x70, 0x1a,
-- 0x95, 0x01, 0xe0, 0x11, 0x22, 0x02, 0x92, 0x01,
-- 0xaa, 0x00, 0x78, 0x12, 0x30, 0x01, 0x2a, 0x72,
-- 0xd0, 0x09, 0xe0, 0x06, 0x23, 0x01, 0x42, 0xdd,
-- 0xd1, 0x06, 0xaa, 0x00, 0x78, 0x12, 0x2a, 0x72,
-- 0xd0, 0x01, 0x25, 0x01, 0xe0, 0x00, 0x25, 0x00,
-- 0xaa, 0x00, 0x78, 0x12, 0x2a, 0x00, 0xd0, 0x16,
-- 0x22, 0x01, 0x92, 0x03, 0x4a, 0x8c, 0x78, 0x03,
-- 0x5c, 0xd3, 0x08, 0x5b, 0xd3, 0x04, 0x78, 0x43,
-- 0x5c, 0xd3, 0x30, 0x01, 0x08, 0x5b, 0xd2, 0xfa,
-- 0x78, 0x02, 0x2a, 0x22, 0xd0, 0x01, 0x2a, 0x27,
-- 0xd1, 0x0c, 0x30, 0x01, 0x1c, 0x16, 0xe0, 0x09,
-- 0xe0, 0x6a, 0xe0, 0xfb, 0xe0, 0x23, 0x78, 0x02,
-- 0x2a, 0x00, 0xd0, 0x03, 0x4b, 0x80, 0x5c, 0x9a,
-- 0x08, 0x52, 0xd3, 0x61, 0x22, 0x01, 0x92, 0x02,
-- 0x1c, 0x04, 0x78, 0x27, 0x34, 0x01, 0x2e, 0x00,
-- 0xd0, 0x15, 0x2f, 0x5c, 0xd1, 0x0b, 0x78, 0x20,
-- 0x28, 0x22, 0xd0, 0x03, 0x28, 0x5c, 0xd0, 0x01,
-- 0x28, 0x27, 0xd1, 0x04, 0x34, 0x01, 0x1c, 0x07,
-- 0xe0, 0x09, 0xe0, 0xdf, 0xe0, 0xde, 0x1c, 0x30,
-- 0x42, 0xb7, 0xd1, 0x04, 0x40, 0x7e, 0x78, 0x27,
-- 0x34, 0x01, 0x42, 0x87, 0xd0, 0xfa, 0x2f, 0x00,
-- 0xd0, 0x0c, 0x2e, 0x00, 0xd1, 0x03, 0x48, 0x6e,
-- 0x5d, 0xc0, 0x08, 0x40, 0xd2, 0x06, 0x1c, 0x08,
-- 0x9b, 0x08, 0x68, 0x5a, 0x54, 0x17, 0x31, 0x01,
-- 0xe0, 0x97, 0xe0, 0xc7, 0x98, 0x06, 0x42, 0x81,
-- 0xd1, 0x08, 0x98, 0x05, 0x28, 0x00, 0xd1, 0x05,
-- 0x98, 0x02, 0x28, 0x00, 0xd0, 0x74, 0x98, 0x03,
-- 0x28, 0x00, 0xd1, 0x72, 0x22, 0x00, 0x1c, 0x08,
-- 0x9b, 0x08, 0x68, 0x5b, 0x54, 0x1a, 0x98, 0x02,
-- 0x31, 0x01, 0x28, 0x00, 0xd0, 0x6a, 0x98, 0x03,
-- 0x28, 0x00, 0xd0, 0x13, 0x01, 0xa8, 0x99, 0x07,
-- 0x18, 0x42, 0x9b, 0x08, 0x68, 0x58, 0x99, 0x06,
-- 0x18, 0x40, 0x46, 0x69, 0xf0, 0x01, 0xfc, 0x72,
-- 0x28, 0x00, 0xd1, 0x07, 0x9b, 0x08, 0x68, 0x58,
-- 0x99, 0x06, 0x18, 0x41, 0xa2, 0x58, 0xa0, 0x5e,
-- 0xf7, 0xff, 0xfe, 0xb6, 0x23, 0x01, 0x98, 0x01,
-- 0x42, 0xd8, 0xdd, 0x51, 0x98, 0x01, 0x28, 0x00,
-- 0xda, 0x03, 0x40, 0x18, 0x42, 0x40, 0xe0, 0x02,
-- 0xe0, 0x90, 0x07, 0xc0, 0x0f, 0xc0, 0x1c, 0x41,
-- 0x98, 0x01, 0xf0, 0x01, 0xfd, 0x61, 0x01, 0x80,
-- 0x99, 0x07, 0x18, 0x40, 0xf0, 0x01, 0xf9, 0xfc,
-- 0x28, 0x00, 0xd1, 0x3d, 0xb0, 0x82, 0x98, 0x03,
-- 0x01, 0x80, 0x99, 0x09, 0x18, 0x40, 0x90, 0x01,
-- 0x9a, 0x03, 0x2a, 0x00, 0xda, 0x03, 0x07, 0xd2,
-- 0x0f, 0xd2, 0x42, 0x52, 0xe0, 0x01, 0x07, 0xd2,
-- 0x0f, 0xd2, 0x01, 0x90, 0x99, 0x09, 0x18, 0x40,
-- 0x30, 0x40, 0x90, 0x00, 0x20, 0xff, 0x30, 0x01,
-- 0xf0, 0x01, 0xfa, 0xe0, 0x1c, 0x01, 0x23, 0xff,
-- 0x22, 0x01, 0x02, 0x52, 0x98, 0x01, 0x33, 0x01,
-- 0xf0, 0x01, 0xfd, 0x56, 0x98, 0x01, 0x68, 0xc0,
-- 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 0x99, 0x01,
-- 0x60, 0xc8, 0x08, 0xd8, 0xf0, 0x01, 0xfa, 0xce,
-- 0x1c, 0x01, 0x23, 0xff, 0x22, 0x01, 0x02, 0x52,
-- 0x98, 0x00, 0x33, 0x01, 0xf0, 0x01, 0xfd, 0x44,
-- 0x98, 0x00, 0x68, 0xc0, 0x23, 0x01, 0x02, 0xdb,
-- 0x43, 0x18, 0x99, 0x00, 0x60, 0xc8, 0xe0, 0x02,
-- 0xe0, 0x13, 0xe0, 0x12, 0xe0, 0x05, 0xb0, 0x02,
-- 0x20, 0x00, 0x90, 0x02, 0x90, 0x03, 0x99, 0x06,
-- 0xe0, 0x0b, 0x9b, 0x08, 0x68, 0x58, 0x9a, 0x06,
-- 0x18, 0x82, 0x98, 0x04, 0x1c, 0x43, 0x93, 0x04,
-- 0x00, 0x80, 0x9b, 0x08, 0x68, 0x1b, 0x50, 0x1a,
-- 0x91, 0x06, 0x2f, 0x00, 0xd0, 0x01, 0x26, 0x00,
-- 0x96, 0x05, 0x2f, 0x00, 0xd0, 0x00, 0xe6, 0x9d,
-- 0x2e, 0x00, 0xd0, 0x0a, 0xb0, 0x81, 0xab, 0x00,
-- 0x70, 0x1e, 0x22, 0x00, 0x70, 0x5a, 0x46, 0x69,
-- 0xa2, 0x24, 0xa0, 0x25, 0xf7, 0xff, 0xfe, 0x3c,
-- 0xb0, 0x01, 0x22, 0x00, 0x98, 0x04, 0x00, 0x80,
-- 0x9b, 0x08, 0x68, 0x19, 0x50, 0x0a, 0x98, 0x04,
-- 0x28, 0x00, 0xdd, 0x0f, 0x9b, 0x08, 0x68, 0x18,
-- 0x68, 0x01, 0x68, 0x09, 0x4b, 0x21, 0x40, 0x19,
-- 0xa2, 0x21, 0x68, 0x12, 0x42, 0x91, 0xd1, 0x05,
-- 0x9b, 0x04, 0x3b, 0x01, 0x93, 0x04, 0x30, 0x04,
-- 0x9b, 0x08, 0x60, 0x18, 0x9a, 0x09, 0x9b, 0x08,
-- 0x68, 0x19, 0x98, 0x04, 0xf7, 0xff, 0xf8, 0x0f,
-- 0xf7, 0xff, 0xf8, 0x88, 0x1e, 0x61, 0xa2, 0x19,
-- 0xa0, 0x19, 0xf7, 0xff, 0xfe, 0x15, 0xb0, 0x09,
-- 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x21, 0xac, 0x2e, 0x08, 0x21, 0x9c,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc,
-- 0x27, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f,
-- 0x4f, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65,
-- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x00, 0x00,
-- 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x70,
-- 0x65, 0x6e, 0x20, 0x27, 0x00, 0x00, 0x00, 0x00,
-- 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20,
-- 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20,
-- 0x00, 0x00, 0x00, 0x00, 0xdf, 0xdf, 0xdf, 0xdf,
-- 0x52, 0x55, 0x4e, 0x00, 0x27, 0x0a, 0x00, 0x00,
-- 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72,
-- 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x69,
-- 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x49,
-- 0x2f, 0x4f, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72,
-- 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x27,
-- 0x00, 0x00, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00,
-- 0xe1, 0xa0, 0x68, 0x80, 0xe0, 0x56, 0x88, 0x83,
-- 0xe0, 0x20, 0xe0, 0x03, 0xe2, 0x00, 0x01, 0x02,
-- 0xe1, 0xa0, 0x38, 0xa6, 0x8a, 0x00, 0x00, 0x1a,
-- 0x01, 0xa0, 0x90, 0x08, 0x0a, 0x00, 0x00, 0x2e,
-- 0xe2, 0x68, 0x60, 0x00, 0xe1, 0xa0, 0x68, 0xa6,
-- 0xe0, 0x83, 0x30, 0x06, 0xe1, 0xa0, 0x92, 0xa6,
-- 0xe1, 0xc6, 0x62, 0x89, 0xe3, 0x59, 0x00, 0x02,
-- 0x33, 0x39, 0x00, 0x00, 0xe2, 0x66, 0x90, 0x20,
-- 0xe1, 0xa0, 0x89, 0x12, 0xe1, 0xa0, 0x26, 0x32,
-- 0xe1, 0x82, 0x29, 0x11, 0xe1, 0xa0, 0x16, 0x31,
-- 0x0a, 0x00, 0x00, 0x03, 0x11, 0x88, 0x81, 0x08,
-- 0x11, 0x82, 0x81, 0x28, 0x11, 0xa0, 0x20, 0x01,
-- 0x13, 0xa0, 0x10, 0x00, 0x3a, 0x00, 0x00, 0x04,
-- 0x21, 0x88, 0x80, 0x02, 0x21, 0x88, 0x81, 0x08,
-- 0x21, 0x81, 0x81, 0x28, 0x23, 0xa0, 0x20, 0x00,
-- 0x23, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x90, 0x00,
-- 0xea, 0x00, 0x00, 0x15, 0xe1, 0xa0, 0x68, 0xa8,
-- 0xe1, 0xa0, 0x82, 0xa6, 0xe1, 0xc6, 0x62, 0x88,
-- 0xe3, 0x58, 0x00, 0x02, 0x33, 0x38, 0x00, 0x00,
-- 0xe2, 0x66, 0x80, 0x20, 0xe1, 0xa0, 0x98, 0x15,
-- 0xe1, 0xa0, 0x56, 0x35, 0xe1, 0x85, 0x58, 0x14,
-- 0xe1, 0xa0, 0x46, 0x34, 0x0a, 0x00, 0x00, 0x03,
-- 0x11, 0x89, 0x91, 0x09, 0x11, 0x85, 0x91, 0x29,
-- 0x11, 0xa0, 0x50, 0x04, 0x13, 0xa0, 0x40, 0x00,
-- 0x3a, 0x00, 0x00, 0x04, 0x21, 0x89, 0x90, 0x05,
-- 0x21, 0x89, 0x91, 0x09, 0x21, 0x84, 0x91, 0x29,
-- 0x23, 0xa0, 0x50, 0x00, 0x23, 0xa0, 0x40, 0x00,
-- 0xe3, 0xa0, 0x80, 0x00, 0xe3, 0x1e, 0x01, 0x02,
-- 0x1a, 0x00, 0x00, 0x09, 0xe0, 0x98, 0x60, 0x09,
-- 0xe0, 0xb2, 0x20, 0x05, 0xe0, 0xb1, 0x10, 0x04,
-- 0x38, 0xbd, 0x80, 0x00, 0xe2, 0x83, 0x30, 0x01,
-- 0xe1, 0xb0, 0x10, 0x61, 0xe1, 0xb0, 0x20, 0x62,
-- 0xe1, 0x86, 0x60, 0x86, 0xe1, 0xa0, 0x60, 0x66,
-- 0xe8, 0xbd, 0x80, 0x00, 0xe0, 0x58, 0x60, 0x09,
-- 0xe0, 0xd2, 0x20, 0x05, 0xe0, 0xd1, 0x10, 0x04,
-- 0x2a, 0x00, 0x00, 0x03, 0xe2, 0x20, 0x01, 0x02,
-- 0xe2, 0x76, 0x60, 0x00, 0xe2, 0xf2, 0x20, 0x00,
-- 0xe2, 0xe1, 0x10, 0x00, 0xe3, 0x11, 0x01, 0x02,
-- 0x18, 0xbd, 0x80, 0x00, 0xe0, 0x96, 0x60, 0x06,
-- 0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01,
-- 0xe2, 0x43, 0x30, 0x01, 0xe3, 0x11, 0x01, 0x02,
-- 0x18, 0xbd, 0x80, 0x00, 0xe1, 0x91, 0xe0, 0x02,
-- 0x1b, 0x00, 0x06, 0x90, 0x18, 0xbd, 0x80, 0x00,
-- 0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00,
-- 0xe2, 0x8d, 0xd0, 0x04, 0xe8, 0xbd, 0x4b, 0xf0,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x98, 0x83,
-- 0xe3, 0x79, 0x08, 0x02, 0x30, 0x09, 0x90, 0x04,
-- 0xe0, 0x19, 0x90, 0x83, 0xe1, 0xa0, 0x88, 0x80,
-- 0xe3, 0x78, 0x08, 0x02, 0x30, 0x08, 0x80, 0x01,
-- 0xe0, 0x18, 0x80, 0x80, 0x4a, 0x00, 0x00, 0x14,
-- 0xe3, 0x19, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x22,
-- 0xe9, 0x2d, 0x40, 0x00, 0xe0, 0x11, 0x60, 0x80,
-- 0x43, 0xc1, 0x11, 0x02, 0x42, 0x80, 0x00, 0x01,
-- 0xe0, 0x14, 0x60, 0x83, 0x43, 0xc4, 0x41, 0x02,
-- 0x42, 0x83, 0x30, 0x01, 0xe3, 0x10, 0x01, 0x01,
-- 0x11, 0xb0, 0x68, 0x80, 0x1b, 0x00, 0x05, 0xf8,
-- 0xe3, 0x13, 0x01, 0x01, 0x11, 0xb0, 0x68, 0x83,
-- 0x1b, 0x00, 0x06, 0x2f, 0xeb, 0xff, 0xff, 0x8a,
-- 0xe3, 0x11, 0x01, 0x02, 0x18, 0xbd, 0x80, 0x00,
-- 0xe1, 0x91, 0xe0, 0x02, 0x1b, 0x00, 0x06, 0x6d,
-- 0xe8, 0xbd, 0x80, 0x00, 0xe3, 0x19, 0x01, 0x02,
-- 0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81,
-- 0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84,
-- 0x1a, 0x00, 0x06, 0xb7, 0xe0, 0x23, 0x85, 0x0b,
-- 0xe0, 0x38, 0x80, 0x00, 0x52, 0x00, 0x81, 0x02,
-- 0x5a, 0x00, 0x00, 0x0a, 0xe3, 0x80, 0x04, 0x61,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81,
-- 0x1a, 0x00, 0x06, 0xc0, 0xe2, 0x00, 0x81, 0x02,
-- 0xea, 0x00, 0x00, 0x04, 0xe1, 0x95, 0x80, 0x84,
-- 0x1a, 0x00, 0x06, 0xb3, 0xe2, 0x03, 0x81, 0x02,
-- 0xe3, 0x1b, 0x06, 0x02, 0x12, 0x28, 0x81, 0x02,
-- 0xe3, 0x1b, 0x06, 0x01, 0x12, 0x28, 0x81, 0x02,
-- 0xe2, 0x8f, 0x00, 0x14, 0xe8, 0x90, 0x00, 0x07,
-- 0xe1, 0x80, 0x00, 0x08, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xe8, 0xbd, 0x4b, 0xf0, 0xe5, 0x9f, 0x20, 0x6c,
-- 0xe5, 0x92, 0x10, 0x00, 0xe1, 0xa0, 0xc1, 0x83,
-- 0xe1, 0xa0, 0xcd, 0xac, 0xe1, 0x81, 0x10, 0x0c,
-- 0xe5, 0x82, 0x10, 0x00, 0xe3, 0x13, 0x03, 0x01,
-- 0x1a, 0x00, 0x00, 0x05, 0xe3, 0x13, 0x04, 0x02,
-- 0x1a, 0x00, 0x00, 0x07, 0xe3, 0x11, 0x08, 0x01,
-- 0x0a, 0x00, 0x00, 0x44, 0xe2, 0x8f, 0x00, 0x54,
-- 0xea, 0x00, 0x00, 0x06, 0xe3, 0x11, 0x07, 0x01,
-- 0x0a, 0x00, 0x00, 0x34, 0xe2, 0x8f, 0x00, 0x74,
-- 0xea, 0x00, 0x00, 0x02, 0xe3, 0x11, 0x08, 0x02,
-- 0x0a, 0x00, 0x00, 0x30, 0xe2, 0x8f, 0x00, 0x8c,
-- 0xe5, 0x9f, 0x10, 0x1c, 0xe2, 0x4e, 0xe0, 0x04,
-- 0xe5, 0x81, 0xe0, 0x3c, 0xe3, 0xa0, 0xec, 0xde,
-- 0xe3, 0x8e, 0xe0, 0xad, 0xe1, 0x8e, 0xe8, 0x0e,
-- 0xe8, 0x81, 0x7f, 0xff, 0xea, 0x00, 0x00, 0x01,
-- 0x2e, 0x08, 0x22, 0xac, 0x2e, 0x08, 0x22, 0xb0,
-- 0xe5, 0x9f, 0xc1, 0x2c, 0xe3, 0x5c, 0x00, 0x00,
-- 0x11, 0x2f, 0xff, 0x1c, 0xe6, 0x00, 0x00, 0x10,
-- 0x80, 0x00, 0x02, 0x00, 0x46, 0x6c, 0x6f, 0x61,
-- 0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69,
-- 0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70,
-- 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x49, 0x6e,
-- 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4f, 0x70,
-- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00,
-- 0x80, 0x00, 0x02, 0x01, 0x46, 0x6c, 0x6f, 0x61,
-- 0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69,
-- 0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70,
-- 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4f, 0x76,
-- 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x00, 0x00,
-- 0x80, 0x00, 0x02, 0x02, 0x46, 0x6c, 0x6f, 0x61,
-- 0x74, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x6f, 0x69,
-- 0x6e, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70,
-- 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x44, 0x69,
-- 0x76, 0x69, 0x64, 0x65, 0x20, 0x42, 0x79, 0x20,
-- 0x5a, 0x65, 0x72, 0x6f, 0x00, 0x00, 0x00, 0x00,
-- 0xe2, 0x00, 0x21, 0x02, 0xe3, 0x13, 0x07, 0x0f,
-- 0x1a, 0x00, 0x00, 0x13, 0xe3, 0x13, 0x05, 0x02,
-- 0x12, 0x8f, 0x00, 0x0c, 0x18, 0x90, 0x00, 0x03,
-- 0x05, 0x9f, 0x00, 0x0c, 0xe1, 0x80, 0x00, 0x02,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x7f, 0xf0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00,
-- 0xe3, 0x13, 0x07, 0x0f, 0x12, 0x00, 0x21, 0x02,
-- 0x1a, 0x00, 0x00, 0x07, 0xe3, 0x13, 0x05, 0x02,
-- 0x12, 0x8f, 0x00, 0x08, 0x18, 0x90, 0x00, 0x03,
-- 0x05, 0x9f, 0x00, 0x08, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x7f, 0xc0, 0x00, 0x00, 0xe3, 0x13, 0x07, 0x02,
-- 0x13, 0xa0, 0x00, 0x00, 0x13, 0xa0, 0x10, 0x00,
-- 0x11, 0x2f, 0xff, 0x1e, 0xe3, 0x13, 0x07, 0x01,
-- 0x13, 0xe0, 0x00, 0x00, 0x13, 0xe0, 0x10, 0x00,
-- 0x11, 0x2f, 0xff, 0x1e, 0xe3, 0x13, 0x06, 0x01,
-- 0x13, 0xa0, 0x00, 0x00, 0x13, 0xa0, 0x11, 0x02,
-- 0x03, 0xa0, 0x01, 0x02, 0xe3, 0x32, 0x01, 0x02,
-- 0x11, 0xe0, 0x00, 0x00, 0x11, 0xe0, 0x10, 0x01,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x01, 0x96, 0x91,
-- 0xe3, 0x10, 0x02, 0x06, 0x1a, 0x00, 0x00, 0x0d,
-- 0xe1, 0xb0, 0x80, 0x86, 0x0a, 0x00, 0x00, 0x0d,
-- 0x22, 0x92, 0x20, 0x01, 0x22, 0x91, 0x10, 0x01,
-- 0x23, 0xa0, 0x11, 0x02, 0xe2, 0xb3, 0x30, 0x00,
-- 0x4a, 0x00, 0x00, 0x0a, 0xe2, 0x83, 0xc0, 0x01,
-- 0xe3, 0xcc, 0xc1, 0x01, 0xe3, 0x5c, 0x09, 0x02,
-- 0xc3, 0xa0, 0x33, 0x19, 0xe2, 0x00, 0x01, 0x02,
-- 0xe1, 0x83, 0x00, 0x00, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe1, 0xa0, 0x30, 0x00, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0x21, 0xb0, 0x80, 0xa2, 0xea, 0xff, 0xff, 0xef,
-- 0xe3, 0x11, 0x01, 0x02, 0x1a, 0x00, 0x00, 0x04,
-- 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00,
-- 0xe2, 0x00, 0x01, 0x02, 0xe3, 0xa0, 0x30, 0x00,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xb0, 0xc8, 0x21,
-- 0x01, 0xa0, 0xc8, 0x22, 0x01, 0x8c, 0x18, 0x01,
-- 0x02, 0x83, 0x30, 0x10, 0xe1, 0xb0, 0xcc, 0x21,
-- 0x01, 0xa0, 0xcc, 0x22, 0x01, 0x8c, 0x14, 0x01,
-- 0x02, 0x83, 0x30, 0x08, 0xe1, 0xb0, 0xce, 0x21,
-- 0x01, 0xa0, 0xce, 0x22, 0x01, 0x8c, 0x12, 0x01,
-- 0x02, 0x83, 0x30, 0x04, 0xe1, 0xb0, 0xcf, 0x21,
-- 0x01, 0xa0, 0xcf, 0x22, 0x01, 0x8c, 0x11, 0x01,
-- 0x02, 0x83, 0x30, 0x02, 0xe1, 0xb0, 0xcf, 0xa1,
-- 0x01, 0xa0, 0xcf, 0xa2, 0x01, 0x8c, 0x10, 0x81,
-- 0x02, 0x83, 0x30, 0x01, 0xe1, 0xb0, 0x30, 0x03,
-- 0x4a, 0xff, 0xff, 0xe4, 0x5a, 0xff, 0xff, 0xda,
-- 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03,
-- 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02,
-- 0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f,
-- 0xe2, 0x43, 0x30, 0xfe, 0xe3, 0x32, 0x00, 0x00,
-- 0x0a, 0x00, 0x00, 0x5d, 0xe3, 0x35, 0x00, 0x00,
-- 0x0a, 0x00, 0x00, 0x3d, 0xe9, 0x2d, 0x48, 0x81,
-- 0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00,
-- 0xe1, 0xa0, 0x68, 0x24, 0xe1, 0xc4, 0x88, 0x06,
-- 0xe0, 0x09, 0x06, 0x90, 0xe0, 0x06, 0x06, 0x97,
-- 0xe0, 0x07, 0x07, 0x98, 0xe0, 0x97, 0x78, 0x06,
-- 0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x90,
-- 0xe0, 0x97, 0x78, 0x08, 0xe0, 0xa9, 0x08, 0x28,
-- 0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b,
-- 0xe1, 0xa0, 0x68, 0x25, 0xe1, 0xc5, 0x88, 0x06,
-- 0xe0, 0x09, 0x06, 0x9b, 0xe0, 0x06, 0x06, 0x9e,
-- 0xe0, 0x0e, 0x0e, 0x98, 0xe0, 0x9e, 0xe8, 0x06,
-- 0xe0, 0xa9, 0x98, 0x26, 0xe0, 0x08, 0x08, 0x9b,
-- 0xe0, 0x9e, 0xe8, 0x08, 0xe0, 0xa9, 0xb8, 0x28,
-- 0xe0, 0x97, 0x70, 0x0b, 0xe2, 0xa0, 0x00, 0x00,
-- 0xe0, 0x97, 0xb0, 0x0e, 0xe0, 0xb7, 0x70, 0x00,
-- 0xe2, 0xa0, 0x00, 0x00, 0xe0, 0x51, 0x80, 0x02,
-- 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x60, 0x00,
-- 0x31, 0xe0, 0x10, 0x01, 0x30, 0x44, 0x60, 0x05,
-- 0x10, 0x55, 0x90, 0x04, 0x03, 0xa0, 0x10, 0x00,
-- 0x31, 0xe0, 0x10, 0x01, 0x30, 0x46, 0x60, 0x08,
-- 0xe1, 0xa0, 0x48, 0x28, 0xe1, 0xc8, 0x58, 0x04,
-- 0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08,
-- 0xe0, 0x22, 0x68, 0x94, 0xe0, 0x08, 0x08, 0x95,
-- 0xe0, 0x06, 0x05, 0x99, 0xe0, 0x96, 0x68, 0x08,
-- 0xe0, 0xa2, 0x28, 0x28, 0xe0, 0x09, 0x09, 0x94,
-- 0xe0, 0x96, 0x68, 0x09, 0xe0, 0xa2, 0x28, 0x29,
-- 0xe0, 0x9b, 0x60, 0x06, 0xe0, 0xb7, 0x20, 0x02,
-- 0xe0, 0xb0, 0x10, 0x01, 0xe1, 0x8e, 0xe1, 0x0e,
-- 0xe1, 0x86, 0x61, 0x2e, 0x48, 0xbd, 0x88, 0x81,
-- 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02,
-- 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01,
-- 0xe8, 0xbd, 0x88, 0x81, 0xe1, 0xa0, 0x58, 0x24,
-- 0xe1, 0xc4, 0x68, 0x05, 0xe1, 0xa0, 0x88, 0x21,
-- 0xe1, 0xc1, 0x98, 0x08, 0xe0, 0x04, 0x08, 0x95,
-- 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x01, 0x06, 0x99,
-- 0xe0, 0x91, 0x18, 0x08, 0xe0, 0xa4, 0x48, 0x28,
-- 0xe0, 0x09, 0x09, 0x95, 0xe0, 0x91, 0x18, 0x09,
-- 0xe0, 0xa4, 0x48, 0x29, 0xe1, 0xa0, 0x88, 0x22,
-- 0xe1, 0xc2, 0x98, 0x08, 0xe0, 0x02, 0x08, 0x95,
-- 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99,
-- 0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa2, 0x28, 0x28,
-- 0xe0, 0x09, 0x09, 0x95, 0xe0, 0x96, 0x68, 0x09,
-- 0xe0, 0xa2, 0x58, 0x29, 0xe0, 0x95, 0x20, 0x01,
-- 0xe2, 0xb4, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e,
-- 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02,
-- 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x35, 0x00, 0x00,
-- 0x0a, 0x00, 0x00, 0x24, 0xe1, 0xa0, 0x28, 0x21,
-- 0xe1, 0xc1, 0x68, 0x02, 0xe1, 0xa0, 0x88, 0x24,
-- 0xe1, 0xc4, 0x98, 0x08, 0xe0, 0x01, 0x08, 0x92,
-- 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x04, 0x06, 0x99,
-- 0xe0, 0x94, 0x48, 0x08, 0xe0, 0xa1, 0x18, 0x28,
-- 0xe0, 0x09, 0x09, 0x92, 0xe0, 0x94, 0x48, 0x09,
-- 0xe0, 0xa1, 0x18, 0x29, 0xe1, 0xa0, 0x88, 0x25,
-- 0xe1, 0xc5, 0x98, 0x08, 0xe0, 0x05, 0x08, 0x92,
-- 0xe0, 0x08, 0x08, 0x96, 0xe0, 0x06, 0x06, 0x99,
-- 0xe0, 0x96, 0x68, 0x08, 0xe0, 0xa5, 0x58, 0x28,
-- 0xe0, 0x09, 0x09, 0x92, 0xe0, 0x96, 0x68, 0x09,
-- 0xe0, 0xa5, 0x28, 0x29, 0xe0, 0x92, 0x20, 0x04,
-- 0xe2, 0xb1, 0x10, 0x00, 0x41, 0xa0, 0xf0, 0x0e,
-- 0xe0, 0x96, 0x60, 0x06, 0xe0, 0xb2, 0x20, 0x02,
-- 0xe0, 0xa1, 0x10, 0x01, 0xe2, 0x43, 0x30, 0x01,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xc0, 0x81, 0x03,
-- 0xe3, 0xc3, 0x91, 0x03, 0xe0, 0x20, 0x00, 0x03,
-- 0xe2, 0x00, 0x01, 0x02, 0xe0, 0x88, 0x30, 0x09,
-- 0xe2, 0x43, 0x3c, 0x3f, 0xe2, 0x43, 0x30, 0xfe,
-- 0xe1, 0xa0, 0x58, 0x24, 0xe1, 0xc4, 0x68, 0x05,
-- 0xe1, 0xa0, 0x88, 0x21, 0xe1, 0xc1, 0x98, 0x08,
-- 0xe0, 0x01, 0x08, 0x95, 0xe0, 0x08, 0x08, 0x96,
-- 0xe0, 0x02, 0x06, 0x99, 0xe0, 0x92, 0x28, 0x08,
-- 0xe0, 0xa1, 0x18, 0x28, 0xe0, 0x09, 0x09, 0x95,
-- 0xe0, 0x92, 0x28, 0x09, 0xe0, 0xb1, 0x18, 0x29,
-- 0xe3, 0xa0, 0x60, 0x00, 0x41, 0xa0, 0xf0, 0x0e,
-- 0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01,
-- 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02,
-- 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83,
-- 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02,
-- 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80,
-- 0x4a, 0x00, 0x00, 0x1f, 0xe3, 0x19, 0x01, 0x02,
-- 0x1a, 0x00, 0x00, 0x2f, 0xe1, 0x91, 0x80, 0x02,
-- 0x11, 0x94, 0x80, 0x05, 0x0a, 0x00, 0x00, 0x13,
-- 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02,
-- 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83,
-- 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01,
-- 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03,
-- 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02,
-- 0xe0, 0x88, 0x30, 0x09, 0xe2, 0x43, 0x3c, 0x3f,
-- 0xe2, 0x43, 0x30, 0xfe, 0xe9, 0x2d, 0x40, 0x00,
-- 0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x04, 0xed,
-- 0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x05, 0x04,
-- 0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xff, 0x44,
-- 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02,
-- 0xe3, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x00,
-- 0xe3, 0xa0, 0x30, 0x00, 0xe3, 0xa0, 0x60, 0x00,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x19, 0x01, 0x02,
-- 0x0a, 0x00, 0x00, 0x09, 0xe1, 0x82, 0x80, 0x81,
-- 0xe1, 0x88, 0x80, 0x05, 0xe1, 0x98, 0x80, 0x84,
-- 0x1a, 0x00, 0x05, 0x2d, 0xe0, 0x20, 0x80, 0x03,
-- 0xe2, 0x08, 0x81, 0x02, 0xe2, 0x8f, 0x00, 0x44,
-- 0xe8, 0x90, 0x00, 0x07, 0xe1, 0x80, 0x00, 0x08,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x92, 0x80, 0x81,
-- 0x1a, 0x00, 0x05, 0x36, 0xe1, 0x94, 0x80, 0x05,
-- 0x1a, 0xff, 0xff, 0xf5, 0xe3, 0x80, 0x04, 0x61,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x95, 0x80, 0x84,
-- 0x1a, 0x00, 0x05, 0x27, 0xe1, 0x91, 0x80, 0x02,
-- 0x1a, 0xff, 0xff, 0xef, 0xe3, 0x80, 0x04, 0x61,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xe1, 0xa0, 0x80, 0x00,
-- 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08,
-- 0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04,
-- 0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02,
-- 0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08,
-- 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03,
-- 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02,
-- 0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f,
-- 0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x48, 0x89,
-- 0xe1, 0xa0, 0x08, 0x21, 0xe1, 0xc1, 0x78, 0x00,
-- 0xe1, 0xa0, 0xb8, 0x22, 0xe1, 0xc2, 0xe8, 0x0b,
-- 0xe2, 0x8f, 0x6e, 0x36, 0xe7, 0xd6, 0x64, 0x20,
-- 0xe0, 0x28, 0x66, 0x90, 0xe2, 0x68, 0x85, 0x02,
-- 0xe0, 0x06, 0x06, 0x98, 0xe1, 0xa0, 0x69, 0xa6,
-- 0xe2, 0x86, 0x60, 0x02, 0xe1, 0xa0, 0x86, 0xa1,
-- 0xe0, 0x29, 0x66, 0x98, 0xe2, 0x69, 0x92, 0x02,
-- 0xe1, 0xa0, 0x88, 0x29, 0xe1, 0xc9, 0x98, 0x08,
-- 0xe0, 0x02, 0x06, 0x99, 0xe0, 0x01, 0x06, 0x98,
-- 0xe0, 0x81, 0x68, 0x22, 0xe1, 0xa0, 0x63, 0x26,
-- 0xe1, 0xb0, 0x40, 0xa4, 0xe1, 0xb0, 0x50, 0x65,
-- 0x33, 0xa0, 0x30, 0x00, 0x23, 0xa0, 0x31, 0x02,
-- 0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96,
-- 0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99,
-- 0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90,
-- 0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99,
-- 0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28,
-- 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08,
-- 0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28,
-- 0xe1, 0xa0, 0x18, 0x09, 0xe1, 0xa0, 0x81, 0x24,
-- 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29,
-- 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88,
-- 0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90,
-- 0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88,
-- 0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99,
-- 0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8,
-- 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88,
-- 0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8,
-- 0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25,
-- 0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23,
-- 0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x81, 0x11, 0x89,
-- 0xe5, 0x9d, 0x80, 0x0c, 0xe3, 0x18, 0x00, 0x01,
-- 0x1a, 0x00, 0x00, 0x94, 0xe1, 0xa0, 0x87, 0xa4,
-- 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29,
-- 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x55, 0x50, 0x08,
-- 0xe0, 0x08, 0x09, 0x90, 0xe0, 0xc4, 0x40, 0x08,
-- 0xe0, 0x08, 0x0e, 0x99, 0xe0, 0x53, 0x38, 0x08,
-- 0xe0, 0xd5, 0x58, 0x28, 0xe0, 0x08, 0x07, 0x99,
-- 0x30, 0x45, 0x58, 0x08, 0x20, 0x55, 0x58, 0x08,
-- 0xe0, 0xc4, 0x48, 0x28, 0xe1, 0xa0, 0x2b, 0x09,
-- 0xe0, 0x81, 0x15, 0x29, 0xe1, 0xa0, 0x81, 0x24,
-- 0xe0, 0x09, 0x08, 0x96, 0xe1, 0xa0, 0x98, 0x29,
-- 0xe0, 0x08, 0x0b, 0x99, 0xe0, 0x53, 0x39, 0x88,
-- 0xe0, 0xd5, 0x56, 0xa8, 0xe0, 0x08, 0x09, 0x90,
-- 0x30, 0x45, 0x59, 0x88, 0x20, 0x55, 0x59, 0x88,
-- 0xe0, 0xc4, 0x46, 0xa8, 0xe0, 0x08, 0x0e, 0x99,
-- 0xe0, 0x53, 0x31, 0x88, 0xe0, 0xd5, 0x5e, 0xa8,
-- 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x51, 0x88,
-- 0x20, 0x55, 0x51, 0x88, 0xe0, 0xc4, 0x4e, 0xa8,
-- 0xe1, 0xa0, 0x4d, 0x04, 0xe1, 0x84, 0x43, 0x25,
-- 0xe1, 0xa0, 0x5d, 0x05, 0xe1, 0x85, 0x53, 0x23,
-- 0xe1, 0xa0, 0x3d, 0x03, 0xe0, 0x92, 0x24, 0x89,
-- 0xe2, 0xa1, 0x10, 0x00, 0xe5, 0x9d, 0x80, 0x0c,
-- 0xe3, 0x18, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x3f,
-- 0xe1, 0xa0, 0x87, 0xa4, 0xe0, 0x09, 0x08, 0x96,
-- 0xe1, 0xa0, 0x98, 0x29, 0xe0, 0x08, 0x0b, 0x99,
-- 0xe0, 0x55, 0x50, 0x08, 0xe0, 0x08, 0x09, 0x90,
-- 0xe0, 0xc4, 0x40, 0x08, 0xe0, 0x08, 0x0e, 0x99,
-- 0xe0, 0x53, 0x38, 0x08, 0xe0, 0xd5, 0x58, 0x28,
-- 0xe0, 0x08, 0x07, 0x99, 0x30, 0x45, 0x58, 0x08,
-- 0x20, 0x55, 0x58, 0x08, 0xe0, 0xc4, 0x48, 0x28,
-- 0xe1, 0xa0, 0x47, 0x04, 0xe1, 0x84, 0x49, 0x25,
-- 0xe1, 0xa0, 0x57, 0x05, 0xe1, 0x85, 0x59, 0x23,
-- 0xe1, 0xa0, 0x37, 0x03, 0xe1, 0xa0, 0x6e, 0x09,
-- 0xe0, 0x92, 0x22, 0x29, 0xe2, 0xa1, 0x10, 0x00,
-- 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b,
-- 0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x55, 0x90, 0x07,
-- 0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09,
-- 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03,
-- 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04,
-- 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07,
-- 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00,
-- 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08,
-- 0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00,
-- 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05,
-- 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b,
-- 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00,
-- 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09,
-- 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e,
-- 0xe1, 0x94, 0x80, 0x05, 0x13, 0x86, 0x60, 0x01,
-- 0xe0, 0x96, 0x6e, 0x0e, 0xe2, 0xb2, 0x20, 0x00,
-- 0xe2, 0xb1, 0x10, 0x00, 0x48, 0xbd, 0x88, 0x89,
-- 0xe8, 0xbd, 0x48, 0x89, 0xe0, 0x96, 0x60, 0x06,
-- 0xe0, 0xb2, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01,
-- 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b,
-- 0xe3, 0xa0, 0xe0, 0x00, 0xe0, 0x93, 0x30, 0x03,
-- 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xa4, 0x40, 0x04,
-- 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00,
-- 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08,
-- 0xe0, 0xae, 0xe0, 0x0e, 0xe3, 0xa0, 0xb0, 0x00,
-- 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05,
-- 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b,
-- 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00,
-- 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09,
-- 0x21, 0xa0, 0x40, 0x08, 0xe0, 0xae, 0xe0, 0x0e,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03,
-- 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04,
-- 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07,
-- 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00,
-- 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08,
-- 0xe0, 0xae, 0xe0, 0x0e, 0xe1, 0x84, 0x60, 0x05,
-- 0xe0, 0x92, 0x24, 0x8e, 0xe2, 0xb1, 0x10, 0x00,
-- 0x48, 0xbd, 0x88, 0x89, 0xe8, 0xbd, 0x48, 0x89,
-- 0xe0, 0x92, 0x20, 0x02, 0xe0, 0xa1, 0x10, 0x01,
-- 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe1, 0x87, 0x08, 0x00, 0xe1, 0x8e, 0x78, 0x0b,
-- 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05,
-- 0xe0, 0xa4, 0x40, 0x04, 0xe0, 0x55, 0x90, 0x07,
-- 0xe0, 0xd4, 0x80, 0x00, 0x21, 0xa0, 0x50, 0x09,
-- 0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x20,
-- 0xe3, 0xa0, 0xb0, 0x00, 0xe0, 0x93, 0x30, 0x03,
-- 0xe0, 0xb5, 0x50, 0x05, 0xe0, 0xb4, 0x40, 0x04,
-- 0xe0, 0xab, 0xb0, 0x0b, 0xe0, 0x55, 0x90, 0x07,
-- 0xe0, 0xd4, 0x80, 0x00, 0xe2, 0xdb, 0xb0, 0x00,
-- 0x21, 0xa0, 0x50, 0x09, 0x21, 0xa0, 0x40, 0x08,
-- 0x22, 0x81, 0x10, 0x10, 0xe3, 0xa0, 0xb0, 0x00,
-- 0xe0, 0x93, 0x30, 0x03, 0xe0, 0xb5, 0x50, 0x05,
-- 0xe0, 0xb4, 0x40, 0x04, 0xe0, 0xab, 0xb0, 0x0b,
-- 0xe0, 0x55, 0x90, 0x07, 0xe0, 0xd4, 0x80, 0x00,
-- 0xe2, 0xdb, 0xb0, 0x00, 0x21, 0xa0, 0x50, 0x09,
-- 0x21, 0xa0, 0x40, 0x08, 0x22, 0x81, 0x10, 0x08,
-- 0xe1, 0x84, 0x60, 0x05, 0xe3, 0xa0, 0x20, 0x00,
-- 0xe3, 0x31, 0x00, 0x00, 0x48, 0xbd, 0x88, 0x89,
-- 0xe8, 0xbd, 0x48, 0x89, 0xe1, 0xa0, 0x10, 0x81,
-- 0xe2, 0x43, 0x30, 0x01, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0x80, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a,
-- 0x79, 0x78, 0x77, 0x76, 0x76, 0x75, 0x74, 0x73,
-- 0x72, 0x71, 0x71, 0x70, 0x6f, 0x6e, 0x6e, 0x6d,
-- 0x6c, 0x6c, 0x6b, 0x6a, 0x6a, 0x69, 0x68, 0x68,
-- 0x67, 0x66, 0x66, 0x65, 0x64, 0x64, 0x63, 0x63,
-- 0x62, 0x61, 0x61, 0x60, 0x60, 0x5f, 0x5f, 0x5e,
-- 0x5e, 0x5d, 0x5d, 0x5c, 0x5c, 0x5b, 0x5b, 0x5a,
-- 0x5a, 0x59, 0x59, 0x58, 0x58, 0x57, 0x57, 0x56,
-- 0x56, 0x55, 0x55, 0x55, 0x54, 0x54, 0x53, 0x53,
-- 0x52, 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x50,
-- 0x4f, 0x4f, 0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4d,
-- 0x4c, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a,
-- 0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48, 0x47,
-- 0x47, 0x47, 0x47, 0x46, 0x46, 0x46, 0x45, 0x45,
-- 0x45, 0x44, 0x44, 0x44, 0x44, 0x43, 0x43, 0x43,
-- 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, 0x41, 0x41,
-- 0xe1, 0xa0, 0x98, 0x83, 0xe3, 0x79, 0x08, 0x02,
-- 0x30, 0x09, 0x90, 0x04, 0xe0, 0x19, 0x90, 0x83,
-- 0xe1, 0xa0, 0x88, 0x80, 0xe3, 0x78, 0x08, 0x02,
-- 0x30, 0x08, 0x80, 0x01, 0xe0, 0x18, 0x80, 0x80,
-- 0x4a, 0x00, 0x00, 0x20, 0xe3, 0x19, 0x01, 0x02,
-- 0x1a, 0x00, 0x00, 0x32, 0xe3, 0x1b, 0x00, 0x04,
-- 0x1a, 0x00, 0x00, 0x08, 0xe1, 0xa0, 0x80, 0x00,
-- 0xe1, 0xa0, 0x00, 0x03, 0xe1, 0xa0, 0x30, 0x08,
-- 0xe1, 0xa0, 0x80, 0x01, 0xe1, 0xa0, 0x10, 0x04,
-- 0xe1, 0xa0, 0x40, 0x08, 0xe1, 0xa0, 0x80, 0x02,
-- 0xe1, 0xa0, 0x20, 0x05, 0xe1, 0xa0, 0x50, 0x08,
-- 0xe0, 0x11, 0x60, 0x80, 0x43, 0xc1, 0x11, 0x02,
-- 0x42, 0x80, 0x00, 0x01, 0xe0, 0x14, 0x60, 0x83,
-- 0x43, 0xc4, 0x41, 0x02, 0x42, 0x83, 0x30, 0x01,
-- 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xc3, 0x91, 0x03,
-- 0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02,
-- 0xe0, 0x49, 0x30, 0x08, 0xe2, 0x83, 0x3c, 0x3f,
-- 0xe2, 0x83, 0x30, 0xff, 0xe9, 0x2d, 0x40, 0x00,
-- 0xe3, 0x11, 0x01, 0x02, 0x0b, 0x00, 0x03, 0xa1,
-- 0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x03, 0x86,
-- 0xe8, 0xbd, 0x40, 0x00, 0xea, 0xff, 0xfe, 0xb6,
-- 0xe3, 0x19, 0x01, 0x02, 0x0a, 0x00, 0x00, 0x05,
-- 0xe1, 0x82, 0x80, 0x81, 0xe1, 0x88, 0x80, 0x05,
-- 0xe1, 0x98, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xb6,
-- 0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x03, 0xc3,
-- 0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02,
-- 0xe3, 0x1b, 0x00, 0x04, 0x02, 0x8f, 0x00, 0x50,
-- 0x12, 0x8f, 0x00, 0x40, 0xe8, 0x90, 0x00, 0x07,
-- 0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00,
-- 0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xae,
-- 0xe0, 0x20, 0x80, 0x03, 0xe2, 0x08, 0x81, 0x02,
-- 0xe3, 0x1b, 0x00, 0x04, 0x12, 0x8f, 0x00, 0x20,
-- 0x02, 0x8f, 0x00, 0x10, 0xe8, 0x90, 0x00, 0x07,
-- 0xe1, 0x80, 0x00, 0x08, 0xe3, 0xa0, 0x30, 0x00,
-- 0xe3, 0xa0, 0x60, 0x00, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7f, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xb5, 0x00, 0x49, 0x02, 0xf0, 0x00, 0xf9, 0x2a,
-- 0xbc, 0x08, 0x47, 0x18, 0xff, 0xff, 0xff, 0xfd,
-- 0xb5, 0x80, 0x1c, 0x07, 0x28, 0x0a, 0xd2, 0x14,
-- 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f,
-- 0x10, 0x04, 0x10, 0x06, 0x08, 0x0a, 0x0c, 0x10,
-- 0x0e, 0x0e, 0xa0, 0x0f, 0xe0, 0x0c, 0xa0, 0x1a,
-- 0xe0, 0x0a, 0xa0, 0x33, 0xe0, 0x08, 0xa0, 0x3f,
-- 0xe0, 0x06, 0xa0, 0x4b, 0xe0, 0x04, 0xa0, 0x52,
-- 0xe0, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xff, 0x89,
-- 0x21, 0x03, 0xf0, 0x00, 0xf9, 0x27, 0x2f, 0x04,
-- 0xd1, 0x05, 0x20, 0x01, 0xf7, 0xfe, 0xf8, 0xd4,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe,
-- 0xfd, 0xb3, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x41, 0x62, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,
-- 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61,
-- 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x2e,
-- 0x67, 0x2e, 0x20, 0x61, 0x62, 0x6f, 0x72, 0x74,
-- 0x28, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
-- 0x69, 0x6f, 0x6e, 0x29, 0x00, 0x00, 0x00, 0x00,
-- 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20,
-- 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
-- 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x61, 0x6c,
-- 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x6e,
-- 0x2d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
-- 0x6e, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x63,
-- 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x65, 0x64,
-- 0x29, 0x0a, 0x5b, 0x69, 0x73, 0x20, 0x74, 0x68,
-- 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x69,
-- 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74,
-- 0x20, 0x65, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f,
-- 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
-- 0x6c, 0x65, 0x64, 0x3f, 0x5d, 0x00, 0x00, 0x00,
-- 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70,
-- 0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76,
-- 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20,
-- 0x75, 0x73, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x70,
-- 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x74,
-- 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65,
-- 0x64, 0x00, 0x00, 0x00, 0x49, 0x6c, 0x6c, 0x65,
-- 0x67, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72,
-- 0x65, 0x73, 0x73, 0x20, 0x28, 0x65, 0x2e, 0x67,
-- 0x2e, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x6c, 0x79,
-- 0x20, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65,
-- 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x62,
-- 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x29, 0x00, 0x00,
-- 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74,
-- 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75,
-- 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x63, 0x65,
-- 0x69, 0x76, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00,
-- 0x55, 0x73, 0x65, 0x72, 0x2d, 0x64, 0x65, 0x66,
-- 0x69, 0x6e, 0x65, 0x64, 0x20, 0x73, 0x69, 0x67,
-- 0x6e, 0x61, 0x6c, 0x00, 0xb5, 0x00, 0x20, 0x01,
-- 0x49, 0x05, 0x70, 0x08, 0xa0, 0x05, 0x21, 0x03,
-- 0xf0, 0x00, 0xf8, 0x78, 0x20, 0x64, 0xf7, 0xfe,
-- 0xf8, 0x27, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x21, 0x94, 0x53, 0x74, 0x61, 0x63,
-- 0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c,
-- 0x6f, 0x77, 0x0a, 0x00, 0xb5, 0x00, 0x28, 0x07,
-- 0xd1, 0x03, 0xf7, 0xff, 0xff, 0xe3, 0xbc, 0x08,
-- 0x47, 0x18, 0xf7, 0xff, 0xff, 0x19, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xf2,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x28, 0x00,
-- 0xdd, 0x01, 0x28, 0x0b, 0xdb, 0x05, 0x20, 0x03,
-- 0x49, 0x0b, 0x60, 0x08, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x87, 0x4b, 0x09, 0x59, 0xd9,
-- 0x4a, 0x09, 0x42, 0x91, 0xd1, 0x02, 0xf7, 0xff,
-- 0xff, 0xdd, 0xe0, 0x05, 0x4c, 0x07, 0x42, 0xa1,
-- 0xd0, 0x02, 0x51, 0xda, 0xf7, 0xfd, 0xfa, 0xee,
-- 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x20, 0xb0, 0x2e, 0x08, 0x94, 0xac,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
-- 0x28, 0x00, 0xdd, 0x09, 0x28, 0x0b, 0xda, 0x07,
-- 0x00, 0x80, 0x49, 0x04, 0x58, 0x08, 0x49, 0x04,
-- 0x42, 0x88, 0xd0, 0x01, 0x20, 0x01, 0x47, 0x70,
-- 0x20, 0x00, 0x47, 0x70, 0x2e, 0x08, 0x94, 0xac,
-- 0xff, 0xff, 0xff, 0xff, 0x28, 0x00, 0xdd, 0x01,
-- 0x28, 0x0b, 0xdb, 0x01, 0x48, 0x03, 0x47, 0x70,
-- 0x00, 0x83, 0x4a, 0x03, 0x58, 0xd0, 0x50, 0xd1,
-- 0x47, 0x70, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe,
-- 0x2e, 0x08, 0x94, 0xac, 0xb5, 0x90, 0x27, 0x01,
-- 0x4c, 0x05, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff,
-- 0xff, 0xe9, 0x37, 0x01, 0x2f, 0x0b, 0xdb, 0xf8,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0xff, 0xff, 0xff, 0xff, 0xb5, 0x90, 0x1c, 0x0c,
-- 0x1c, 0x07, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x09,
-- 0x48, 0x11, 0x78, 0x00, 0x28, 0x00, 0xd1, 0x05,
-- 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, 0xfb, 0x44,
-- 0x28, 0x00, 0xd1, 0x13, 0x08, 0x60, 0xd3, 0x02,
-- 0x20, 0x0a, 0xf0, 0x00, 0xf8, 0xd3, 0x78, 0x38,
-- 0x28, 0x00, 0xd0, 0x06, 0x78, 0x38, 0x37, 0x01,
-- 0xf0, 0x00, 0xf8, 0xcc, 0x78, 0x38, 0x28, 0x00,
-- 0xd1, 0xf8, 0x08, 0xa0, 0xd3, 0x02, 0x20, 0x0a,
-- 0xf0, 0x00, 0xf8, 0xc4, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x01, 0xbd, 0x35,
-- 0x2e, 0x08, 0x21, 0x94, 0xb5, 0x80, 0xb0, 0x83,
-- 0x90, 0x00, 0x91, 0x01, 0xf7, 0xfd, 0xfb, 0x1e,
-- 0x90, 0x02, 0x46, 0x69, 0x20, 0x01, 0xf0, 0x01,
-- 0xf8, 0x61, 0x23, 0x01, 0x1c, 0x07, 0x42, 0xd8,
-- 0xd1, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01,
-- 0xf8, 0x59, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38,
-- 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81,
-- 0x90, 0x00, 0x46, 0x69, 0x20, 0x02, 0xf0, 0x01,
-- 0xf8, 0x49, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00,
-- 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x43, 0x49, 0x03,
-- 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0,
-- 0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01,
-- 0x92, 0x02, 0x46, 0x69, 0x20, 0x05, 0xf0, 0x01,
-- 0xf8, 0x31, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00,
-- 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x2b, 0x49, 0x03,
-- 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0,
-- 0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01,
-- 0x92, 0x02, 0x93, 0x03, 0x46, 0x69, 0x20, 0x06,
-- 0xf0, 0x01, 0xf8, 0x18, 0x1c, 0x07, 0xd0, 0x05,
-- 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x12,
-- 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x00, 0xb0, 0x81,
-- 0x90, 0x00, 0x46, 0x69, 0x20, 0x08, 0xf0, 0x01,
-- 0xf8, 0x01, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18,
-- 0xb5, 0x00, 0x69, 0x40, 0xb0, 0x81, 0x90, 0x00,
-- 0x46, 0x69, 0x20, 0x09, 0xf0, 0x00, 0xff, 0xf6,
-- 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80,
-- 0xb0, 0x82, 0x90, 0x00, 0x91, 0x01, 0x46, 0x69,
-- 0x20, 0x0a, 0xf0, 0x00, 0xff, 0xeb, 0x1c, 0x07,
-- 0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00,
-- 0xff, 0xe5, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38,
-- 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81,
-- 0x90, 0x00, 0x46, 0x69, 0x20, 0x0b, 0xf0, 0x00,
-- 0xff, 0xd5, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00,
-- 0x20, 0x13, 0xf0, 0x00, 0xff, 0xcf, 0x49, 0x03,
-- 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0,
-- 0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69,
-- 0x20, 0x0c, 0xf0, 0x00, 0xff, 0xbf, 0xb0, 0x01,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0xb0, 0x83,
-- 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x46, 0x69,
-- 0x20, 0x0d, 0xf0, 0x00, 0xff, 0xb3, 0xb0, 0x03,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x01, 0x46, 0x69,
-- 0x20, 0x03, 0xf0, 0x00, 0xff, 0xab, 0xb0, 0x01,
-- 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0xb0, 0x82,
-- 0x90, 0x00, 0xf7, 0xfd, 0xfa, 0x5b, 0x90, 0x01,
-- 0x46, 0x69, 0x20, 0x12, 0xf0, 0x00, 0xff, 0x9e,
-- 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13,
-- 0xf0, 0x00, 0xff, 0x98, 0x49, 0x03, 0x60, 0x08,
-- 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0,
-- 0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfd,
-- 0xfa, 0x41, 0x90, 0x01, 0x46, 0x69, 0x20, 0x0e,
-- 0xf0, 0x00, 0xff, 0x84, 0x1c, 0x07, 0xd0, 0x05,
-- 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x7e,
-- 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x84,
-- 0x90, 0x00, 0x1c, 0x0f, 0xf7, 0xfd, 0xfa, 0x26,
-- 0x90, 0x01, 0x97, 0x02, 0x1c, 0x38, 0xf7, 0xfd,
-- 0xfa, 0x21, 0x90, 0x03, 0x46, 0x69, 0x20, 0x0f,
-- 0xf0, 0x00, 0xff, 0x64, 0x1c, 0x07, 0xd0, 0x05,
-- 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x5e,
-- 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04,
-- 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x82,
-- 0x4f, 0x08, 0x97, 0x00, 0x20, 0xff, 0x30, 0x01,
-- 0x90, 0x01, 0x46, 0x69, 0x20, 0x15, 0xf0, 0x00,
-- 0xff, 0x49, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x00,
-- 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xdc,
-- 0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00,
-- 0xff, 0x39, 0x49, 0x02, 0x68, 0x09, 0x1a, 0x40,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0xa4,
-- 0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00,
-- 0xff, 0x2d, 0x49, 0x02, 0x60, 0x08, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xa4,
-- 0xb5, 0x80, 0x21, 0x00, 0x1c, 0x07, 0x20, 0x11,
-- 0xf0, 0x00, 0xff, 0x20, 0x2f, 0x00, 0xd0, 0x00,
-- 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x00, 0x47, 0x70, 0xb4, 0x80, 0x20, 0x03,
-- 0x43, 0xc0, 0x23, 0x00, 0x49, 0x07, 0x54, 0x0b,
-- 0x30, 0x01, 0xd4, 0xfc, 0x20, 0x00, 0x4a, 0x06,
-- 0x5c, 0x17, 0x54, 0x0f, 0x18, 0x0f, 0x37, 0x80,
-- 0x70, 0x3b, 0x30, 0x01, 0x28, 0x80, 0xd3, 0xf7,
-- 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x21, 0xac,
-- 0x2e, 0x03, 0x3b, 0x58, 0xb5, 0x80, 0x49, 0x07,
-- 0x68, 0x09, 0xf7, 0xfd, 0xf9, 0x13, 0x1c, 0x07,
-- 0xd1, 0x03, 0xa1, 0x05, 0xa0, 0x05, 0xf0, 0x00,
-- 0xfc, 0xe7, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xa8,
-- 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x73,
-- 0x74, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x65, 0x66,
-- 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f,
-- 0x4f, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72,
-- 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
-- 0x6c, 0x69, 0x6b, 0x65, 0x00, 0x00, 0x00, 0x00,
-- 0x23, 0x80, 0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1,
-- 0x21, 0x00, 0x60, 0x01, 0x60, 0x81, 0x47, 0x70,
-- 0xb5, 0xf7, 0x68, 0xd5, 0x69, 0x56, 0x1c, 0x0c,
-- 0x1c, 0x17, 0x0d, 0x68, 0xd3, 0x05, 0x23, 0x10,
-- 0x43, 0x1d, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xfc,
-- 0x61, 0xb8, 0x48, 0x12, 0x40, 0x28, 0xd0, 0x08,
-- 0x69, 0xb9, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xc7,
-- 0x28, 0x00, 0xdb, 0x10, 0x4b, 0x0e, 0x40, 0x1d,
-- 0x60, 0xfd, 0x99, 0x00, 0x1c, 0x30, 0x1c, 0x22,
-- 0x1c, 0x2b, 0xf7, 0xff, 0xfe, 0x75, 0x00, 0x41,
-- 0x08, 0x49, 0x1a, 0x61, 0x69, 0xba, 0x18, 0x51,
-- 0x61, 0xb9, 0x28, 0x00, 0xd0, 0x08, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0xce, 0x20, 0x00, 0x43, 0xc0,
-- 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x00, 0xe7, 0xf9, 0x00, 0x02, 0x00, 0x10,
-- 0xff, 0xfd, 0xff, 0xef, 0xb5, 0xb0, 0x48, 0x15,
-- 0x68, 0xc1, 0x4b, 0x15, 0x40, 0x19, 0x1c, 0x1d,
-- 0x42, 0x99, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xd6,
-- 0x48, 0x12, 0x68, 0xc1, 0x4b, 0x10, 0x40, 0x19,
-- 0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xce,
-- 0x48, 0x0f, 0x68, 0xc1, 0x4b, 0x0c, 0x40, 0x19,
-- 0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xc6,
-- 0x27, 0x00, 0x4c, 0x0c, 0x01, 0xb8, 0x19, 0x00,
-- 0x68, 0xc1, 0x4b, 0x07, 0x40, 0x19, 0x42, 0xa9,
-- 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xbb, 0x37, 0x01,
-- 0x2f, 0x0d, 0xdb, 0xf3, 0xbc, 0xb0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc,
-- 0x00, 0x00, 0x02, 0x02, 0x2e, 0x08, 0x96, 0x1c,
-- 0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x96, 0x9c,
-- 0xb5, 0xf0, 0x1c, 0x07, 0x69, 0x04, 0x6a, 0xc0,
-- 0x68, 0x79, 0x42, 0x88, 0xd9, 0x00, 0x1c, 0x01,
-- 0x68, 0xf8, 0x4b, 0x13, 0x40, 0x18, 0x07, 0x82,
-- 0x0f, 0x92, 0x25, 0x00, 0x60, 0xf8, 0x2a, 0x01,
-- 0xd0, 0x1a, 0x22, 0x82, 0x40, 0x02, 0x15, 0x1e,
-- 0x2a, 0x02, 0xd1, 0x0a, 0x0c, 0x40, 0xd3, 0x13,
-- 0x42, 0xa1, 0xd0, 0x0a, 0x1b, 0x09, 0x1c, 0x20,
-- 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x75, 0x28, 0x00,
-- 0xd0, 0x03, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x62, 0xfc, 0x60, 0x7c, 0x60, 0xbd,
-- 0x68, 0xf8, 0x4b, 0x04, 0x40, 0x18, 0x60, 0xf8,
-- 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
-- 0xb5, 0x80, 0x1c, 0x07, 0x68, 0xc0, 0x23, 0x20,
-- 0x43, 0xdb, 0x40, 0x18, 0x60, 0xf8, 0x69, 0xb8,
-- 0x6a, 0xb9, 0x42, 0x88, 0xd0, 0x0d, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0xbe, 0x68, 0xf8, 0x4b, 0x08,
-- 0x40, 0x18, 0x23, 0x10, 0x43, 0x18, 0x60, 0xf8,
-- 0x6a, 0xb8, 0x61, 0xb8, 0x69, 0x38, 0x62, 0xf8,
-- 0x60, 0x78, 0x68, 0xf8, 0x4b, 0x03, 0x40, 0x18,
-- 0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xbf, 0xbf,
-- 0xb5, 0xf0, 0x1c, 0x07, 0x69, 0x40, 0xb0, 0x83,
-- 0x90, 0x01, 0x69, 0x38, 0x90, 0x00, 0x25, 0x00,
-- 0x68, 0xfe, 0x07, 0xb0, 0xd1, 0x01, 0x43, 0xc0,
-- 0xe0, 0x48, 0x09, 0x30, 0xd2, 0x40, 0x24, 0x10,
-- 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x3f, 0x1c, 0x05,
-- 0x0d, 0x70, 0xd3, 0x1b, 0x24, 0x00, 0x49, 0x21,
-- 0x91, 0x02, 0x01, 0xa0, 0x99, 0x02, 0x18, 0x40,
-- 0x42, 0xb8, 0xd0, 0x10, 0x68, 0xc1, 0x07, 0x8a,
-- 0xd0, 0x0d, 0x69, 0x42, 0x9b, 0x01, 0x42, 0x9a,
-- 0xd1, 0x09, 0x0d, 0x49, 0xd3, 0x07, 0x68, 0xc1,
-- 0x4b, 0x19, 0x40, 0x19, 0x60, 0xc1, 0x68, 0xf8,
-- 0x40, 0x18, 0x60, 0xf8, 0xe0, 0x02, 0x34, 0x01,
-- 0x2c, 0x10, 0xdb, 0xe6, 0x2c, 0x10, 0xd1, 0x06,
-- 0x98, 0x01, 0xf7, 0xff, 0xfd, 0x83, 0x28, 0x00,
-- 0xda, 0x01, 0x25, 0x00, 0x43, 0xed, 0x0b, 0x30,
-- 0xd3, 0x04, 0x98, 0x00, 0x49, 0x0f, 0x68, 0x09,
-- 0xf7, 0xfc, 0xff, 0xe0, 0x0d, 0xf0, 0x05, 0xc0,
-- 0x23, 0xa5, 0x05, 0xdb, 0x42, 0xd8, 0xd1, 0x07,
-- 0x48, 0x0b, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x38,
-- 0x1c, 0x29, 0xf7, 0xff, 0xff, 0xfe, 0x1c, 0x05,
-- 0x22, 0x40, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xfd,
-- 0xf8, 0x8f, 0x1c, 0x28, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc,
-- 0xff, 0xef, 0xff, 0xff, 0x2e, 0x08, 0x20, 0xac,
-- 0x00, 0x00, 0x00, 0x00, 0xb5, 0xf7, 0x1c, 0x10,
-- 0x1c, 0x0c, 0x1c, 0x17, 0xf7, 0xff, 0xff, 0x98,
-- 0x78, 0x20, 0x34, 0x01, 0x28, 0x61, 0xd0, 0x09,
-- 0x28, 0x72, 0xd0, 0x04, 0x28, 0x77, 0xd1, 0x25,
-- 0x26, 0x02, 0x25, 0x04, 0xe0, 0x04, 0x26, 0x01,
-- 0x25, 0x00, 0xe0, 0x01, 0x4e, 0x1a, 0x25, 0x08,
-- 0x78, 0x20, 0x34, 0x01, 0x28, 0x2b, 0xd0, 0x06,
-- 0x28, 0x62, 0xd1, 0x09, 0x23, 0x04, 0x43, 0x1e,
-- 0x23, 0x01, 0x43, 0x1d, 0xe7, 0xf4, 0x23, 0x03,
-- 0x43, 0x1e, 0x23, 0x02, 0x43, 0x1d, 0xe7, 0xef,
-- 0x1f, 0xe0, 0x38, 0x19, 0x7f, 0xc0, 0x28, 0x74,
-- 0xd1, 0x01, 0x23, 0x10, 0x43, 0x1d, 0x98, 0x00,
-- 0x1c, 0x29, 0xf7, 0xff, 0xfd, 0x0b, 0x23, 0x01,
-- 0x42, 0xd8, 0xd1, 0x04, 0x20, 0x00, 0xb0, 0x03,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00,
-- 0x60, 0x79, 0x61, 0x39, 0x21, 0x01, 0x03, 0x09,
-- 0x61, 0x78, 0x61, 0xf9, 0x60, 0xfe, 0x09, 0x28,
-- 0xd3, 0x04, 0x22, 0x02, 0x21, 0x00, 0x1c, 0x38,
-- 0xf0, 0x00, 0xfb, 0xc4, 0x1c, 0x38, 0xe7, 0xea,
-- 0x00, 0x00, 0x80, 0x02, 0xb5, 0x90, 0x23, 0x03,
-- 0x4f, 0x08, 0x01, 0x9a, 0x19, 0xd2, 0x68, 0xd4,
-- 0x07, 0xa4, 0xd1, 0x04, 0xf7, 0xff, 0xff, 0xaa,
-- 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x33, 0x01,
-- 0x2b, 0x10, 0xdb, 0xf2, 0x20, 0x00, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc,
-- 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x10,
-- 0x68, 0xe8, 0x08, 0x80, 0xd3, 0x18, 0x20, 0x01,
-- 0x4e, 0x0e, 0x70, 0x30, 0x40, 0x38, 0xd0, 0x03,
-- 0x20, 0x0a, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x1e,
-- 0x1c, 0x20, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0x2c,
-- 0x08, 0xb8, 0xd3, 0x03, 0x20, 0x0a, 0x1c, 0x29,
-- 0xf0, 0x00, 0xfc, 0x14, 0x20, 0x00, 0x70, 0x30,
-- 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x21, 0x94,
-- 0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x06, 0x21, 0x01,
-- 0xf7, 0xff, 0xfc, 0x80, 0x21, 0x02, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfc, 0x7c, 0x20, 0x01, 0xf7, 0xfd,
-- 0xfc, 0x25, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18,
-- 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, 0x74,
-- 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x00,
-- 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x0f,
-- 0x48, 0x20, 0x22, 0x01, 0x02, 0x92, 0x21, 0x00,
-- 0x1c, 0x06, 0xf7, 0xfc, 0xff, 0xd5, 0x4a, 0x1e,
-- 0x1c, 0x28, 0xa1, 0x1e, 0xf7, 0xff, 0xff, 0x4e,
-- 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x28, 0xf7, 0xff,
-- 0xff, 0xd3, 0x1c, 0x20, 0x1c, 0x32, 0xa1, 0x1a,
-- 0xf7, 0xff, 0xff, 0x44, 0x28, 0x00, 0xd1, 0x02,
-- 0x1c, 0x20, 0xf7, 0xff, 0xff, 0xc9, 0x4a, 0x17,
-- 0x1c, 0x38, 0x1c, 0x15, 0xa1, 0x13, 0xf7, 0xff,
-- 0xff, 0x39, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38,
-- 0xf7, 0xff, 0xff, 0xbe, 0x1c, 0x30, 0x26, 0x01,
-- 0x03, 0x36, 0x08, 0xf2, 0x21, 0x00, 0x1c, 0x33,
-- 0xf0, 0x00, 0xf8, 0x52, 0x28, 0x00, 0xd0, 0x02,
-- 0x1c, 0x20, 0xf7, 0xff, 0xff, 0xb1, 0x22, 0x01,
-- 0x02, 0x52, 0x21, 0x00, 0x1c, 0x28, 0x1c, 0x33,
-- 0xf0, 0x00, 0xf8, 0x46, 0x28, 0x00, 0xd0, 0x02,
-- 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa5, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc,
-- 0x2e, 0x08, 0x96, 0x5c, 0x77, 0x00, 0x00, 0x00,
-- 0x72, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x96, 0x1c,
-- 0xb5, 0x90, 0x27, 0x03, 0x4c, 0x09, 0x01, 0xb8,
-- 0x19, 0x00, 0xf7, 0xff, 0xfe, 0xa5, 0x37, 0x01,
-- 0x2f, 0x10, 0xdb, 0xf8, 0x27, 0x00, 0x01, 0xb8,
-- 0x19, 0x00, 0xf7, 0xff, 0xfe, 0x9d, 0x37, 0x01,
-- 0x2f, 0x03, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc,
-- 0xb5, 0xb0, 0x01, 0x80, 0x1c, 0x0f, 0x4c, 0x0a,
-- 0x19, 0x00, 0x1c, 0x05, 0xf7, 0xff, 0xfe, 0x8c,
-- 0x01, 0xb8, 0x19, 0x00, 0x23, 0x01, 0x05, 0x1b,
-- 0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1, 0x4b, 0x05,
-- 0x40, 0x19, 0x60, 0xe9, 0x69, 0x40, 0x61, 0x68,
-- 0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18,
-- 0x2e, 0x08, 0x95, 0xdc, 0x00, 0x10, 0x8f, 0x03,
-- 0xb4, 0xf0, 0x1c, 0x1f, 0x68, 0xc3, 0x07, 0x9e,
-- 0x0f, 0xb6, 0x25, 0x01, 0x1c, 0x1c, 0x2e, 0x00,
-- 0xd0, 0x13, 0x1c, 0x1e, 0x0d, 0xf3, 0xd2, 0x10,
-- 0x02, 0x2b, 0x42, 0x9a, 0xd0, 0x09, 0x00, 0x5b,
-- 0x42, 0x9a, 0xd0, 0x06, 0x00, 0x5b, 0x42, 0x9a,
-- 0xd1, 0x07, 0x27, 0x01, 0x1d, 0xc1, 0x31, 0x1d,
-- 0xe0, 0x06, 0x1e, 0x7e, 0x4b, 0x08, 0x42, 0x9e,
-- 0xd3, 0x02, 0x1c, 0x28, 0xbc, 0xf0, 0x47, 0x70,
-- 0x61, 0x01, 0x23, 0x0f, 0x02, 0x1b, 0x43, 0x9c,
-- 0x60, 0x41, 0x61, 0xc7, 0x1c, 0x21, 0x43, 0x11,
-- 0x60, 0xc1, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70,
-- 0x00, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x01, 0x02,
-- 0xe3, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x17,
-- 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21,
-- 0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10,
-- 0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01,
-- 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21,
-- 0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04,
-- 0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01,
-- 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1,
-- 0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01,
-- 0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x19, 0x31,
-- 0x81, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x60, 0x20,
-- 0xe1, 0x81, 0x16, 0x32, 0xe1, 0xa0, 0x28, 0x12,
-- 0x30, 0x40, 0x00, 0x09, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe3, 0x56, 0x05, 0x01, 0x3a, 0x00, 0x00, 0x16,
-- 0xe1, 0xb0, 0x10, 0x02, 0x01, 0xa0, 0xf0, 0x0e,
-- 0xe3, 0xa0, 0x20, 0x00, 0xe3, 0xa0, 0x80, 0x20,
-- 0xe1, 0xb0, 0x98, 0x21, 0x01, 0xa0, 0x18, 0x01,
-- 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x21,
-- 0x01, 0xa0, 0x14, 0x01, 0x02, 0x88, 0x80, 0x08,
-- 0xe1, 0xb0, 0x9e, 0x21, 0x01, 0xa0, 0x12, 0x01,
-- 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x21,
-- 0x01, 0xa0, 0x11, 0x01, 0x02, 0x88, 0x80, 0x02,
-- 0xe1, 0xb0, 0x9f, 0xa1, 0x01, 0xa0, 0x10, 0x81,
-- 0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6,
-- 0x81, 0xa0, 0x19, 0x31, 0x30, 0x40, 0x00, 0x09,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x88, 0xa6,
-- 0xe2, 0x68, 0x90, 0x20, 0xe1, 0xa0, 0x18, 0x11,
-- 0xe1, 0x81, 0x19, 0x32, 0xe1, 0xa0, 0x28, 0x12,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x03, 0x31, 0x02,
-- 0xe3, 0x34, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x17,
-- 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x24,
-- 0x01, 0xa0, 0x48, 0x04, 0x02, 0x88, 0x80, 0x10,
-- 0xe1, 0xb0, 0x9c, 0x24, 0x01, 0xa0, 0x44, 0x04,
-- 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x24,
-- 0x01, 0xa0, 0x42, 0x04, 0x02, 0x88, 0x80, 0x04,
-- 0xe1, 0xb0, 0x9f, 0x24, 0x01, 0xa0, 0x41, 0x04,
-- 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa4,
-- 0x01, 0xa0, 0x40, 0x84, 0x02, 0x88, 0x80, 0x01,
-- 0xe0, 0x58, 0x98, 0xa6, 0x81, 0xa0, 0x49, 0x34,
-- 0x81, 0xa0, 0x88, 0xa6, 0xe2, 0x68, 0x60, 0x20,
-- 0xe1, 0x84, 0x46, 0x35, 0xe1, 0xa0, 0x58, 0x15,
-- 0x30, 0x43, 0x30, 0x09, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe3, 0x56, 0x05, 0x01, 0x3a, 0x00, 0x00, 0x16,
-- 0xe1, 0xb0, 0x40, 0x05, 0x01, 0xa0, 0xf0, 0x0e,
-- 0xe3, 0xa0, 0x50, 0x00, 0xe3, 0xa0, 0x80, 0x20,
-- 0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04,
-- 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24,
-- 0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08,
-- 0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04,
-- 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24,
-- 0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02,
-- 0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84,
-- 0x02, 0x88, 0x80, 0x01, 0xe0, 0x58, 0x98, 0xa6,
-- 0x81, 0xa0, 0x49, 0x34, 0x30, 0x43, 0x30, 0x09,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0xa0, 0x88, 0xa6,
-- 0xe2, 0x68, 0x90, 0x20, 0xe1, 0xa0, 0x48, 0x14,
-- 0xe1, 0x84, 0x49, 0x35, 0xe1, 0xa0, 0x58, 0x15,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x20, 0x00,
-- 0xe2, 0x16, 0x01, 0x02, 0x12, 0x66, 0x10, 0x00,
-- 0x01, 0xb0, 0x10, 0x06, 0x03, 0xa0, 0x30, 0x00,
-- 0x01, 0xa0, 0xf0, 0x0e, 0xe3, 0xa0, 0x39, 0x01,
-- 0xe3, 0x83, 0x30, 0x1e, 0xe3, 0xa0, 0x60, 0x00,
-- 0xe3, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x10, 0x02,
-- 0x03, 0xa0, 0x20, 0x00, 0x02, 0x43, 0x30, 0x20,
-- 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21,
-- 0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10,
-- 0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01,
-- 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21,
-- 0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04,
-- 0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01,
-- 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1,
-- 0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01,
-- 0xe2, 0x78, 0x90, 0x20, 0xe1, 0x81, 0x19, 0x32,
-- 0xe1, 0xa0, 0x28, 0x12, 0xe0, 0x43, 0x30, 0x08,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe3, 0x34, 0x00, 0x00,
-- 0x01, 0xa0, 0x40, 0x05, 0x03, 0xa0, 0x50, 0x00,
-- 0x02, 0x43, 0x30, 0x20, 0xe3, 0xa0, 0x80, 0x00,
-- 0xe1, 0xb0, 0x98, 0x24, 0x01, 0xa0, 0x48, 0x04,
-- 0x02, 0x88, 0x80, 0x10, 0xe1, 0xb0, 0x9c, 0x24,
-- 0x01, 0xa0, 0x44, 0x04, 0x02, 0x88, 0x80, 0x08,
-- 0xe1, 0xb0, 0x9e, 0x24, 0x01, 0xa0, 0x42, 0x04,
-- 0x02, 0x88, 0x80, 0x04, 0xe1, 0xb0, 0x9f, 0x24,
-- 0x01, 0xa0, 0x41, 0x04, 0x02, 0x88, 0x80, 0x02,
-- 0xe1, 0xb0, 0x9f, 0xa4, 0x01, 0xa0, 0x40, 0x84,
-- 0x02, 0x88, 0x80, 0x01, 0xe2, 0x78, 0x90, 0x20,
-- 0xe1, 0x84, 0x49, 0x35, 0xe1, 0xa0, 0x58, 0x15,
-- 0xe0, 0x43, 0x30, 0x08, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe3, 0x31, 0x00, 0x00, 0x01, 0xa0, 0x10, 0x02,
-- 0x03, 0xa0, 0x20, 0x00, 0x02, 0x83, 0x30, 0x20,
-- 0xe3, 0xa0, 0x80, 0x00, 0xe1, 0xb0, 0x98, 0x21,
-- 0x01, 0xa0, 0x18, 0x01, 0x02, 0x88, 0x80, 0x10,
-- 0xe1, 0xb0, 0x9c, 0x21, 0x01, 0xa0, 0x14, 0x01,
-- 0x02, 0x88, 0x80, 0x08, 0xe1, 0xb0, 0x9e, 0x21,
-- 0x01, 0xa0, 0x12, 0x01, 0x02, 0x88, 0x80, 0x04,
-- 0xe1, 0xb0, 0x9f, 0x21, 0x01, 0xa0, 0x11, 0x01,
-- 0x02, 0x88, 0x80, 0x02, 0xe1, 0xb0, 0x9f, 0xa1,
-- 0x01, 0xa0, 0x10, 0x81, 0x02, 0x88, 0x80, 0x01,
-- 0xe2, 0x78, 0x90, 0x20, 0xe1, 0x81, 0x19, 0x32,
-- 0xe1, 0xa0, 0x28, 0x12, 0xe0, 0x83, 0x30, 0x08,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x40, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xe1, 0x92, 0x80, 0x81,
-- 0x0a, 0x00, 0x00, 0x05, 0xe3, 0x11, 0x01, 0x01,
-- 0x0a, 0x00, 0x00, 0x0c, 0xe1, 0x95, 0x80, 0x84,
-- 0x0a, 0x00, 0x00, 0x0a, 0xe3, 0x14, 0x01, 0x01,
-- 0x1a, 0x00, 0x00, 0x08, 0xe3, 0x14, 0x01, 0x01,
-- 0x0a, 0x00, 0x00, 0x28, 0xe1, 0xa0, 0x00, 0x03,
-- 0xe1, 0xa0, 0x10, 0x04, 0xe1, 0xa0, 0x20, 0x05,
-- 0xea, 0x00, 0x00, 0x04, 0xe3, 0x11, 0x01, 0x01,
-- 0x0a, 0x00, 0x00, 0x22, 0xea, 0x00, 0x00, 0x01,
-- 0xe3, 0x11, 0x01, 0x01, 0x0a, 0x00, 0x00, 0x1f,
-- 0xe3, 0x1b, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x16,
-- 0xe3, 0x1b, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x0c,
-- 0xe3, 0x1b, 0x0c, 0x02, 0x1a, 0x00, 0x00, 0x05,
-- 0xe3, 0xc0, 0x81, 0x03, 0xe3, 0xa0, 0x90, 0xff,
-- 0xe3, 0x89, 0x9c, 0x43, 0xe1, 0x58, 0x00, 0x09,
-- 0x33, 0xc2, 0x20, 0x01, 0x03, 0x82, 0x20, 0x01,
-- 0xe2, 0x00, 0x01, 0x03, 0xe3, 0x80, 0x00, 0xff,
-- 0xe3, 0x80, 0x0c, 0x7f, 0xe1, 0x30, 0x00, 0x00,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x00, 0x01, 0x03,
-- 0xe3, 0x80, 0x00, 0xff, 0xe3, 0x80, 0x0c, 0x43,
-- 0xe1, 0xa0, 0x25, 0xa2, 0xe1, 0xa0, 0x25, 0x82,
-- 0xe3, 0x81, 0x11, 0x02, 0xe1, 0x30, 0x00, 0x00,
-- 0xe1, 0xa0, 0xf0, 0x0e, 0xe2, 0x00, 0x01, 0x03,
-- 0xe3, 0x80, 0x00, 0x7f, 0xe3, 0x80, 0x09, 0x01,
-- 0xe3, 0xa0, 0x20, 0x00, 0xe3, 0xc1, 0x10, 0xff,
-- 0xe3, 0x81, 0x11, 0x02, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e,
-- 0xb5, 0x80, 0x1c, 0x0f, 0x29, 0x0f, 0xdd, 0x04,
-- 0x11, 0x39, 0xf7, 0xff, 0xff, 0xf9, 0x07, 0x3f,
-- 0x0f, 0x3f, 0x2f, 0x09, 0xdd, 0x02, 0x1d, 0xf9,
-- 0x31, 0x29, 0xe0, 0x01, 0x1d, 0xf9, 0x31, 0x50,
-- 0x70, 0x01, 0x30, 0x01, 0xbc, 0x80, 0xbc, 0x08,
-- 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x48, 0x0d,
-- 0x68, 0x01, 0x29, 0x00, 0xd1, 0x12, 0x4c, 0x0c,
-- 0x1c, 0x20, 0xa1, 0x0c, 0x22, 0x14, 0xf7, 0xfc,
-- 0xfc, 0xa1, 0x1d, 0xe0, 0x30, 0x0b, 0x1c, 0x39,
-- 0xf7, 0xff, 0xff, 0xda, 0x21, 0x29, 0x70, 0x01,
-- 0x21, 0x00, 0x70, 0x41, 0x1c, 0x20, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x30, 0x08, 0xbc, 0x90,
-- 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xcc,
-- 0x2e, 0x08, 0x99, 0xdc, 0x55, 0x6e, 0x6b, 0x6e,
-- 0x6f, 0x77, 0x6e, 0x20, 0x53, 0x69, 0x67, 0x6e,
-- 0x61, 0x6c, 0x20, 0x28, 0x30, 0x78, 0x00, 0x00,
-- 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0xa0, 0x09,
-- 0x21, 0x01, 0xf7, 0xff, 0xf9, 0x6f, 0x21, 0x00,
-- 0x1c, 0x20, 0xf7, 0xff, 0xf9, 0x6b, 0x21, 0x02,
-- 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x67, 0x20, 0x01,
-- 0xf7, 0xfd, 0xf9, 0x10, 0xbc, 0x90, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x2a, 0x2a, 0x2a, 0x20,
-- 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x65, 0x72,
-- 0x72, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x72,
-- 0x75, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
-- 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3a, 0x20,
-- 0x00, 0x00, 0x00, 0x00, 0xb5, 0xb0, 0x1c, 0x07,
-- 0x68, 0xc0, 0x07, 0x81, 0xd0, 0x1f, 0x23, 0x20,
-- 0x40, 0x18, 0xd0, 0x01, 0x6a, 0xbd, 0xe0, 0x04,
-- 0x68, 0x79, 0x69, 0xba, 0x18, 0x89, 0x69, 0x3a,
-- 0x1a, 0x8d, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38,
-- 0xf7, 0xff, 0xfb, 0xa2, 0x68, 0xf8, 0x4b, 0x0a,
-- 0x40, 0x18, 0x60, 0xf8, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfb, 0x67, 0x1c, 0x04, 0x22, 0x00, 0x1c, 0x38,
-- 0x1c, 0x29, 0xf0, 0x00, 0xf8, 0x27, 0x1c, 0x20,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0xff, 0xff, 0xcf, 0xff, 0xb5, 0xb0, 0x24, 0x00,
-- 0x28, 0x00, 0xd0, 0x03, 0xf7, 0xff, 0xff, 0xce,
-- 0x1c, 0x04, 0xe0, 0x0c, 0x27, 0x00, 0x4d, 0x08,
-- 0x01, 0xb8, 0x19, 0x40, 0xf7, 0xff, 0xff, 0xc6,
-- 0x28, 0x00, 0xd0, 0x01, 0x24, 0x00, 0x43, 0xe4,
-- 0x37, 0x01, 0x2f, 0x10, 0xdb, 0xf4, 0x1c, 0x20,
-- 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0x2e, 0x08, 0x95, 0xdc, 0xb5, 0xf7, 0x68, 0xc5,
-- 0x69, 0x46, 0x1c, 0x0c, 0x1c, 0x07, 0xb0, 0x81,
-- 0x48, 0x3c, 0x40, 0x28, 0xd0, 0x04, 0x1c, 0x38,
-- 0xf7, 0xff, 0xf9, 0x92, 0x28, 0x00, 0xd0, 0x01,
-- 0x20, 0x02, 0xe0, 0x6a, 0x9a, 0x03, 0x2a, 0x00,
-- 0xd0, 0x26, 0x2a, 0x01, 0xd0, 0x0b, 0x2a, 0x02,
-- 0xd1, 0x24, 0x1c, 0x30, 0xf7, 0xff, 0xf9, 0xbc,
-- 0x28, 0x00, 0xda, 0x09, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfa, 0xa7, 0x20, 0x01, 0xe0, 0x59, 0x1c, 0x38,
-- 0xf0, 0x00, 0xf8, 0x8c, 0x19, 0x04, 0xe0, 0x13,
-- 0x68, 0x79, 0x6a, 0xfa, 0x42, 0x8a, 0xd9, 0x00,
-- 0x1c, 0x11, 0x69, 0xba, 0x18, 0x89, 0x69, 0x3a,
-- 0x1a, 0x89, 0x68, 0xfa, 0x09, 0x92, 0xd3, 0x03,
-- 0x6a, 0xba, 0x42, 0x8a, 0xdd, 0x00, 0x1c, 0x11,
-- 0x42, 0x81, 0xdd, 0x00, 0x1c, 0x08, 0x18, 0x24,
-- 0x2c, 0x00, 0xda, 0x03, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfa, 0x87, 0xe7, 0xcd, 0x0b, 0xa8, 0xd3, 0x04,
-- 0x68, 0x78, 0x6a, 0xf9, 0x42, 0x81, 0xd2, 0x00,
-- 0x62, 0xf8, 0x69, 0xb8, 0x42, 0xa0, 0xdc, 0x10,
-- 0x68, 0x79, 0x6a, 0xfa, 0x42, 0x8a, 0xd9, 0x01,
-- 0x1c, 0x13, 0xe0, 0x00, 0x1c, 0x0b, 0x18, 0x1b,
-- 0x69, 0x3e, 0x1b, 0x9b, 0x42, 0xa3, 0xdb, 0x04,
-- 0x6b, 0x3b, 0x93, 0x00, 0x18, 0xc3, 0x42, 0xa3,
-- 0xdc, 0x06, 0x20, 0x20, 0x43, 0x28, 0x21, 0x00,
-- 0x60, 0x39, 0x60, 0xb9, 0x62, 0xbc, 0xe0, 0x14,
-- 0x1a, 0x24, 0x08, 0xa8, 0xd3, 0x03, 0x9b, 0x00,
-- 0x1b, 0x18, 0x42, 0x40, 0x60, 0xb8, 0x08, 0x68,
-- 0xd3, 0x06, 0x42, 0x8a, 0xd9, 0x00, 0x1c, 0x11,
-- 0x1b, 0x88, 0x1b, 0x00, 0x42, 0x40, 0x60, 0x38,
-- 0x19, 0x30, 0x23, 0x20, 0x43, 0x9d, 0x60, 0x78,
-- 0x1c, 0x28, 0x4b, 0x05, 0x40, 0x18, 0x60, 0xf8,
-- 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x03, 0xbc, 0xf0,
-- 0xbc, 0x08, 0x47, 0x18, 0x00, 0x10, 0x00, 0x03,
-- 0xff, 0xf7, 0xcf, 0xbf, 0xb5, 0x00, 0x68, 0x8a,
-- 0x68, 0x4b, 0x3a, 0x01, 0xd5, 0x03, 0xf0, 0x00,
-- 0xf8, 0x3f, 0xbc, 0x08, 0x47, 0x18, 0x06, 0x00,
-- 0x0e, 0x00, 0x70, 0x18, 0x33, 0x01, 0x60, 0x8a,
-- 0x60, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00,
-- 0xb5, 0xb0, 0x1c, 0x07, 0x78, 0x00, 0x1c, 0x0c,
-- 0x37, 0x01, 0x28, 0x00, 0xd0, 0x0e, 0x25, 0x00,
-- 0x43, 0xed, 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0xe8,
-- 0x42, 0xa8, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x78, 0x38, 0x37, 0x01,
-- 0x28, 0x00, 0xd1, 0xf2, 0x20, 0x00, 0xbc, 0xb0,
-- 0xbc, 0x08, 0x47, 0x18, 0x68, 0xc1, 0x07, 0x8a,
-- 0xd1, 0x04, 0x20, 0x01, 0x49, 0x09, 0x60, 0x08,
-- 0x42, 0x40, 0x47, 0x70, 0x09, 0x8a, 0xd3, 0x01,
-- 0x6a, 0x80, 0xe0, 0x04, 0x68, 0x42, 0x69, 0x83,
-- 0x18, 0xd2, 0x69, 0x00, 0x1a, 0x10, 0x0d, 0x09,
-- 0xd3, 0xf3, 0x28, 0x00, 0xdd, 0xf1, 0x38, 0x01,
-- 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0,
-- 0xb5, 0xf0, 0x1c, 0x04, 0x68, 0xc8, 0x1c, 0x0f,
-- 0x4b, 0x5a, 0x40, 0x18, 0x23, 0x01, 0x05, 0x9b,
-- 0x43, 0x18, 0x60, 0xc8, 0x09, 0x80, 0xd3, 0x02,
-- 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x95, 0x06, 0x26,
-- 0x0e, 0x36, 0x68, 0xb9, 0x29, 0x00, 0xda, 0x12,
-- 0x68, 0xf8, 0x0a, 0x82, 0xd2, 0x0f, 0x22, 0x00,
-- 0x43, 0xd2, 0x1a, 0x51, 0x23, 0x09, 0x03, 0x5b,
-- 0x43, 0x18, 0x60, 0xf8, 0x60, 0xb9, 0x68, 0x79,
-- 0x70, 0x0e, 0x31, 0x01, 0x60, 0x79, 0x1c, 0x30,
-- 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8,
-- 0x49, 0x49, 0x40, 0x01, 0x29, 0x02, 0xd0, 0x03,
-- 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0xcd, 0xe0, 0x7f,
-- 0x49, 0x46, 0x40, 0x01, 0x23, 0x01, 0x03, 0xdb,
-- 0x42, 0x99, 0xd1, 0x0b, 0x22, 0x02, 0x21, 0x00,
-- 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xfb, 0x68, 0xf8,
-- 0x09, 0x80, 0xd3, 0x02, 0x1c, 0x38, 0xf7, 0xff,
-- 0xfa, 0x63, 0x68, 0xf8, 0x25, 0x09, 0x03, 0x6d,
-- 0x43, 0x05, 0x60, 0xfd, 0x69, 0x38, 0x28, 0x00,
-- 0xd1, 0x2f, 0x1c, 0x38, 0xf7, 0xff, 0xf8, 0x88,
-- 0x28, 0x00, 0xd0, 0x18, 0x68, 0xf8, 0x0a, 0x00,
-- 0x07, 0x80, 0xd0, 0x09, 0x69, 0xf8, 0xf7, 0xff,
-- 0xf9, 0x7d, 0x61, 0x38, 0x60, 0x78, 0x23, 0x01,
-- 0x02, 0xdb, 0x43, 0x1d, 0x68, 0xf8, 0xe0, 0x1a,
-- 0x1d, 0xf8, 0x30, 0x1d, 0x61, 0x38, 0x60, 0x78,
-- 0x20, 0x01, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x1d,
-- 0x61, 0xf8, 0x60, 0xfd, 0xe0, 0x11, 0x69, 0xf8,
-- 0xf7, 0xff, 0xf9, 0x68, 0x61, 0x38, 0x60, 0x78,
-- 0x23, 0x01, 0x02, 0xdb, 0x43, 0x1d, 0x68, 0xf8,
-- 0x43, 0x28, 0x60, 0xf8, 0x0a, 0x29, 0x07, 0x89,
-- 0xd1, 0x03, 0x08, 0xdb, 0x43, 0x1d, 0x43, 0x28,
-- 0x60, 0xf8, 0x0a, 0x68, 0xd3, 0x19, 0x68, 0x78,
-- 0x6a, 0xf9, 0x69, 0x3c, 0x42, 0x81, 0xd9, 0x00,
-- 0x1c, 0x08, 0x1b, 0x01, 0xd0, 0x05, 0x1c, 0x20,
-- 0x1c, 0x3a, 0xf7, 0xff, 0xf9, 0x7d, 0x28, 0x00,
-- 0xd1, 0x26, 0x1c, 0x60, 0x62, 0xf8, 0x60, 0x78,
-- 0x69, 0xf8, 0x1e, 0x41, 0x63, 0x38, 0x60, 0xb9,
-- 0x70, 0x26, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x69, 0x38, 0x68, 0x7a, 0x70, 0x14,
-- 0x32, 0x01, 0x60, 0x7a, 0x6a, 0xf9, 0x42, 0x91,
-- 0xd8, 0x00, 0x1c, 0x11, 0x1a, 0x09, 0x69, 0xfa,
-- 0x63, 0x3a, 0x0a, 0xeb, 0xd2, 0x03, 0x2e, 0x0a,
-- 0xd0, 0x01, 0x42, 0x8a, 0xdc, 0x0d, 0x62, 0xf8,
-- 0x22, 0x00, 0x60, 0x78, 0x60, 0xba, 0x1c, 0x3a,
-- 0xf7, 0xff, 0xf9, 0x56, 0x28, 0x00, 0xd0, 0x04,
-- 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff,
-- 0x00, 0x00, 0x10, 0x8a, 0x00, 0x00, 0xa0, 0x10,
-- 0xb5, 0x00, 0x68, 0x8a, 0x68, 0x4b, 0x3a, 0x01,
-- 0xd5, 0x03, 0xf7, 0xff, 0xff, 0x39, 0xbc, 0x08,
-- 0x47, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x70, 0x18,
-- 0x33, 0x01, 0x60, 0x8a, 0x60, 0x4b, 0xbc, 0x08,
-- 0x47, 0x18, 0x00, 0x00, 0x47, 0x78, 0x46, 0xc0,
-- 0xe9, 0x2d, 0x40, 0x00, 0xe2, 0x8f, 0xe0, 0x00,
-- 0xef, 0x12, 0x34, 0x56, 0xe8, 0xbd, 0x40, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x10, 0x00,
-- 0xe3, 0xa0, 0x00, 0x18, 0xe5, 0x9f, 0x10, 0x18,
-- 0xef, 0x12, 0x34, 0x56, 0xea, 0xff, 0xff, 0xfe,
-- 0xe1, 0xa0, 0x10, 0x00, 0xe3, 0xa0, 0x00, 0x18,
-- 0xe5, 0x9f, 0x10, 0x08, 0xef, 0x12, 0x34, 0x56,
-- 0xea, 0xff, 0xff, 0xfe, 0x00, 0x02, 0x00, 0x26,
-- 0x00, 0x02, 0x00, 0x23, 0xe8, 0xb0, 0x01, 0xf0,
-- 0xe8, 0xa1, 0x01, 0xf0, 0xe8, 0xb0, 0x01, 0xf8,
-- 0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8,
-- 0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8,
-- 0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8,
-- 0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8,
-- 0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8,
-- 0xe8, 0xa1, 0x01, 0xf8, 0xe8, 0xb0, 0x01, 0xf8,
-- 0xe8, 0xa1, 0x01, 0xf8, 0xe2, 0x52, 0x20, 0xbc,
-- 0x1a, 0xff, 0xff, 0xed, 0xe8, 0xbd, 0x01, 0xf8,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe4, 0x90, 0x40, 0x04,
-- 0xe1, 0x85, 0x54, 0x24, 0xe4, 0x81, 0x50, 0x04,
-- 0xe1, 0xa0, 0x5c, 0x04, 0xe2, 0x53, 0x30, 0x04,
-- 0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x88,
-- 0xe4, 0x90, 0x40, 0x04, 0xe1, 0x85, 0x5c, 0x24,
-- 0xe4, 0x81, 0x50, 0x04, 0xe1, 0xa0, 0x54, 0x04,
-- 0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xf9,
-- 0xe5, 0x9f, 0xf0, 0x70, 0xe4, 0x90, 0x40, 0x04,
-- 0xe1, 0xa0, 0x58, 0x24, 0xe0, 0xc1, 0x50, 0xb2,
-- 0xe0, 0xc1, 0x40, 0xb2, 0xe2, 0x53, 0x30, 0x04,
-- 0x1a, 0xff, 0xff, 0xf9, 0xe5, 0x9f, 0xf0, 0x4c,
-- 0xe2, 0x03, 0x40, 0x0f, 0xe0, 0x53, 0x40, 0x04,
-- 0x0a, 0x00, 0x00, 0x0a, 0xe9, 0x2d, 0x00, 0xc4,
-- 0xe1, 0xa0, 0x20, 0x03, 0xe1, 0xa0, 0x30, 0x04,
-- 0xe8, 0xb0, 0x00, 0xf0, 0xe8, 0xa1, 0x00, 0xf0,
-- 0xe2, 0x53, 0x30, 0x10, 0x1a, 0xff, 0xff, 0xfb,
-- 0xe1, 0xa0, 0x30, 0x02, 0xe8, 0xbd, 0x00, 0xc4,
-- 0xe2, 0x13, 0x30, 0x0f, 0x0a, 0x00, 0x00, 0x03,
-- 0xe4, 0x90, 0x40, 0x04, 0xe4, 0x81, 0x40, 0x04,
-- 0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xfb,
-- 0xe5, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x2e, 0x01, 0xc9, 0xe4, 0x2e, 0x01, 0xc9, 0x88,
-- 0x2e, 0x01, 0xc9, 0xb8, 0xe9, 0x2d, 0x00, 0x38,
-- 0xe3, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x3f,
-- 0xe3, 0xe0, 0x30, 0x03, 0xe0, 0x12, 0x30, 0x03,
-- 0x0a, 0x00, 0x00, 0x30, 0xe2, 0x10, 0x30, 0x01,
-- 0x0a, 0x00, 0x00, 0x03, 0xe4, 0xd0, 0x30, 0x01,
-- 0xe4, 0xc1, 0x30, 0x01, 0xe2, 0x52, 0x20, 0x01,
-- 0x0a, 0x00, 0x00, 0x36, 0xe2, 0x10, 0x30, 0x02,
-- 0x0a, 0x00, 0x00, 0x05, 0xe0, 0xd0, 0x30, 0xb2,
-- 0xe1, 0xa0, 0x44, 0x23, 0xe4, 0xc1, 0x40, 0x01,
-- 0xe4, 0xc1, 0x30, 0x01, 0xe2, 0x52, 0x20, 0x02,
-- 0x0a, 0x00, 0x00, 0x2e, 0xe3, 0xe0, 0x30, 0x03,
-- 0xe0, 0x12, 0x30, 0x03, 0x0a, 0x00, 0x00, 0x1f,
-- 0xe2, 0x11, 0x40, 0x01, 0x0a, 0x00, 0x00, 0x19,
-- 0xe2, 0x11, 0x40, 0x02, 0x1a, 0x00, 0x00, 0x0b,
-- 0xe2, 0x41, 0x10, 0x01, 0xe5, 0x91, 0x50, 0x00,
-- 0xe1, 0xa0, 0x5c, 0x25, 0xe1, 0xa0, 0x5c, 0x05,
-- 0xe5, 0x9f, 0xf0, 0xa8, 0xe5, 0x91, 0x40, 0x00,
-- 0xe1, 0xa0, 0x44, 0x04, 0xe1, 0xa0, 0x44, 0x24,
-- 0xe1, 0x85, 0x50, 0x04, 0xe5, 0x81, 0x50, 0x00,
-- 0xe2, 0x81, 0x10, 0x01, 0xea, 0x00, 0x00, 0x0f,
-- 0xe2, 0x41, 0x10, 0x03, 0xe5, 0x91, 0x50, 0x00,
-- 0xe1, 0xa0, 0x54, 0x25, 0xe1, 0xa0, 0x54, 0x05,
-- 0xe5, 0x9f, 0xf0, 0x7c, 0xe5, 0x91, 0x40, 0x00,
-- 0xe1, 0xa0, 0x4c, 0x04, 0xe1, 0xa0, 0x4c, 0x24,
-- 0xe1, 0x85, 0x50, 0x04, 0xe5, 0x81, 0x50, 0x00,
-- 0xe2, 0x81, 0x10, 0x03, 0xea, 0x00, 0x00, 0x03,
-- 0xe2, 0x11, 0x40, 0x02, 0x0a, 0x00, 0x00, 0x00,
-- 0xe5, 0x9f, 0xf0, 0x5c, 0xe5, 0x9f, 0xf0, 0x48,
-- 0xe2, 0x12, 0x20, 0x03, 0x0a, 0x00, 0x00, 0x09,
-- 0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01,
-- 0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x05,
-- 0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01,
-- 0xe2, 0x52, 0x20, 0x01, 0x0a, 0x00, 0x00, 0x01,
-- 0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01,
-- 0xe8, 0xbd, 0x00, 0x38, 0xe3, 0x8e, 0xe0, 0x01,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x01, 0xf8,
-- 0xe5, 0x9f, 0xf0, 0x18, 0x2e, 0x01, 0xc8, 0x58,
-- 0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xc8, 0xac,
-- 0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xc8, 0x74,
-- 0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xc8, 0x90,
-- 0x2e, 0x01, 0xc8, 0x08, 0xe9, 0x2d, 0x5f, 0xff,
-- 0xe1, 0x4f, 0x00, 0x00, 0xe9, 0x2d, 0x00, 0x01,
-- 0xe2, 0x8f, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x10,
-- 0x21, 0xff, 0x48, 0x37, 0x68, 0x00, 0x40, 0x52,
-- 0x42, 0x08, 0xd1, 0x0b, 0x32, 0x20, 0x0a, 0x00,
-- 0x42, 0x08, 0xd1, 0x07, 0x32, 0x20, 0x0a, 0x00,
-- 0x42, 0x08, 0xd1, 0x03, 0x0a, 0x00, 0x42, 0x08,
-- 0xd0, 0x23, 0x32, 0x20, 0x21, 0x0f, 0x42, 0x08,
-- 0xd1, 0x01, 0x32, 0x10, 0x09, 0x00, 0x21, 0x01,
-- 0x42, 0x08, 0xd1, 0x08, 0x1d, 0x12, 0x21, 0x02,
-- 0x42, 0x08, 0xd1, 0x04, 0x1d, 0x12, 0x21, 0x04,
-- 0x42, 0x08, 0xd1, 0x00, 0x1d, 0x12, 0x48, 0x25,
-- 0x68, 0x00, 0xb4, 0x01, 0x08, 0x90, 0x21, 0x01,
-- 0x40, 0x81, 0x48, 0x21, 0x60, 0x01, 0x48, 0x1d,
-- 0x58, 0x82, 0x48, 0x01, 0x46, 0x86, 0x47, 0x10,
-- 0x2e, 0x01, 0xca, 0xc1, 0xbc, 0x02, 0x48, 0x1d,
-- 0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00,
-- 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00,
-- 0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04,
-- 0x48, 0x12, 0x21, 0x20, 0x4a, 0x12, 0x60, 0x02,
-- 0x1d, 0x00, 0x1e, 0x49, 0xd1, 0xfb, 0x20, 0x00,
-- 0x47, 0x70, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x46, 0x73, 0x49, 0x0e, 0x60, 0x08, 0x20, 0x00,
-- 0x47, 0x18, 0x46, 0x73, 0x49, 0x0c, 0x60, 0x08,
-- 0x20, 0x00, 0x47, 0x18, 0x46, 0x73, 0x48, 0x0b,
-- 0x68, 0x00, 0x47, 0x18, 0x46, 0x73, 0x49, 0x09,
-- 0x60, 0x08, 0x47, 0x18, 0x46, 0x73, 0x4a, 0x03,
-- 0x00, 0x80, 0x18, 0x12, 0x68, 0x10, 0x60, 0x11,
-- 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x3a, 0xf4,
-- 0x2e, 0x01, 0xca, 0xf0, 0x66, 0x00, 0x00, 0x10,
-- 0x66, 0x00, 0x00, 0x14, 0x66, 0x00, 0x00, 0x18,
-- 0x66, 0x00, 0x00, 0x1c, 0xe9, 0x2d, 0x5f, 0xf0,
-- 0xe1, 0x4f, 0x40, 0x00, 0xe3, 0x14, 0x00, 0x20,
-- 0x11, 0x5e, 0x40, 0xb2, 0x13, 0xc4, 0x4c, 0xff,
-- 0x05, 0x1e, 0x40, 0x04, 0x03, 0xc4, 0x44, 0xff,
-- 0xe5, 0x9f, 0x50, 0x14, 0xe7, 0x95, 0x51, 0x04,
-- 0xe5, 0x9f, 0xe0, 0x00, 0xe1, 0x2f, 0xff, 0x15,
-- 0x2e, 0x01, 0xcb, 0x70, 0xe8, 0xbd, 0x5f, 0xf0,
-- 0xe1, 0xb0, 0xf0, 0x0e, 0x2e, 0x08, 0x1f, 0xe8,
-- 0x00, 0x00, 0x00, 0xc0, 0x46, 0x73, 0x47, 0x78,
-- 0xe1, 0x0f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x80,
-- 0xe1, 0x29, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x80,
-- 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x10, 0x00,
-- 0xe3, 0x81, 0x00, 0x80, 0xe1, 0x69, 0xf0, 0x00,
-- 0xe2, 0x01, 0x00, 0x80, 0xe1, 0x2f, 0xff, 0x13,
-- 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00,
-- 0xe1, 0x0f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x40,
-- 0xe1, 0x29, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x40,
-- 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x10, 0x00,
-- 0xe3, 0x81, 0x00, 0x40, 0xe1, 0x69, 0xf0, 0x00,
-- 0xe2, 0x01, 0x00, 0x40, 0xe1, 0x2f, 0xff, 0x13,
-- 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00,
-- 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x80,
-- 0xe1, 0x29, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x00, 0x00,
-- 0xe3, 0xc0, 0x00, 0x80, 0xe1, 0x69, 0xf0, 0x00,
-- 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13,
-- 0x46, 0x73, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00,
-- 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x40,
-- 0xe1, 0x29, 0xf0, 0x00, 0xe3, 0xa0, 0x00, 0x00,
-- 0xe1, 0x2f, 0xff, 0x13, 0x46, 0x73, 0x00, 0x00,
-- 0x47, 0x78, 0x00, 0x00, 0xe1, 0x4f, 0x00, 0x00,
-- 0xe3, 0xc0, 0x00, 0x40, 0xe1, 0x69, 0xf0, 0x00,
-- 0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x13,
-- 0x46, 0x73, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00,
-- 0x46, 0x9f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
-- 0x46, 0x73, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00,
-- 0x46, 0x9f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x04,
-- 0x46, 0x73, 0x48, 0x03, 0x68, 0x00, 0x47, 0x18,
-- 0x46, 0x73, 0x49, 0x01, 0x60, 0x08, 0x47, 0x18,
-- 0x66, 0x00, 0x00, 0x08, 0x00, 0x00, 0x46, 0x6c,
-- 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x80,
-- 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x02, 0xd0,
-- 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x00, 0x15,
-- 0x00, 0x03, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x04, 0x90, 0x85, 0x00, 0x00, 0xa6, 0xee,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd0,
-- 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x08, 0x08, 0xa0, 0x00, 0x08, 0x08, 0x28,
-- 0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0xa0, 0x98,
-- 0x00, 0x08, 0x88, 0x68, 0x00, 0x08, 0x28, 0x98,
-- 0x00, 0x08, 0xac, 0xf4, 0x00, 0x08, 0xb8, 0x7c,
-- 0x00, 0x02, 0x02, 0x88, 0x00, 0x02, 0x08, 0x22,
-- 0x00, 0x02, 0x88, 0xaa, 0x00, 0x02, 0x22, 0xaa,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x04, 0x24,
-- 0x00, 0x04, 0x28, 0x6c, 0x00, 0x04, 0x28, 0x6c,
-- 0x00, 0x01, 0x10, 0x44, 0x00, 0x01, 0x20, 0x44,
-- 0x00, 0x01, 0x11, 0xaa, 0x00, 0x01, 0x88, 0x55,
-- 0x00, 0x01, 0x44, 0xaa, 0x00, 0x01, 0x44, 0x55,
-- 0x00, 0x20, 0x80, 0xa0, 0x00, 0x20, 0x80, 0xc0,
-- 0x00, 0x20, 0x20, 0xa0, 0x00, 0x20, 0x40, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x10, 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22,
-- 0x10, 0x10, 0x16, 0x18, 0x1b, 0x1d, 0x22, 0x25,
-- 0x13, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x22, 0x26,
-- 0x16, 0x16, 0x1a, 0x1b, 0x1d, 0x22, 0x25, 0x28,
-- 0x16, 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30,
-- 0x1a, 0x1b, 0x1d, 0x20, 0x23, 0x28, 0x30, 0x3a,
-- 0x1a, 0x1b, 0x1d, 0x22, 0x26, 0x2e, 0x38, 0x45,
-- 0x1b, 0x1d, 0x23, 0x26, 0x2e, 0x38, 0x45, 0x53,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x04, 0xd6, 0x00, 0x00, 0x1b, 0x08, 0x00,
-- 0x00, 0x1f, 0xde, 0x00, 0x00, 0x00, 0x50, 0x00,
-- 0x00, 0x09, 0xce, 0x00, 0x00, 0x13, 0x4c, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0x05, 0x28, 0x20, 0x01,
-- 0x00, 0x00, 0x02, 0x40, 0x71, 0x01, 0x00, 0x68,
-- 0xe0, 0x7f, 0xb0, 0x7f, 0x60, 0x40, 0xe0, 0x1d,
-- 0x90, 0x10, 0xb4, 0x81, 0xe8, 0xc0, 0xe0, 0xc2,
-- 0x90, 0x18, 0x00, 0x8a, 0x70, 0xc0, 0x0f, 0x87,
-- 0xe3, 0xe8, 0xc0, 0x00, 0x70, 0x40, 0xe0, 0x01,
-- 0xe0, 0x86, 0x00, 0x26, 0xd0, 0x28, 0xe0, 0x0e,
-- 0xd0, 0x0e, 0x0f, 0x0b, 0x70, 0x1d, 0xe0, 0x67,
-- 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87,
-- 0x0f, 0x87, 0x02, 0x20, 0xd0, 0x01, 0xe0, 0x25,
-- 0x0f, 0x45, 0x6f, 0x81, 0xdf, 0xa6, 0xe0, 0x36,
-- 0xe1, 0x30, 0xa0, 0x37, 0xc0, 0x00, 0xe0, 0x26,
-- 0x00, 0x33, 0xdf, 0x00, 0xe0, 0x32, 0x0f, 0xc5,
-- 0x0f, 0x87, 0x00, 0x27, 0xd0, 0x4c, 0xe0, 0x21,
-- 0x00, 0x33, 0xdf, 0x60, 0x00, 0x27, 0xd0, 0x56,
-- 0x60, 0x01, 0xe0, 0x2d, 0x03, 0xa0, 0xd0, 0x41,
-- 0xa0, 0x78, 0x00, 0x60, 0xd0, 0x41, 0xa0, 0x77,
-- 0x00, 0x22, 0xd0, 0x58, 0xa0, 0x76, 0x00, 0x21,
-- 0xd0, 0x7c, 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40,
-- 0x00, 0x06, 0x0f, 0x87, 0x00, 0x22, 0xdc, 0xf8,
-- 0xf0, 0x4a, 0xe1, 0x70, 0x07, 0xef, 0xdd, 0xbf,
-- 0x4f, 0x36, 0x1d, 0x99, 0x4d, 0x80, 0x10, 0x18,
-- 0xdd, 0x50, 0x60, 0x35, 0xdd, 0x72, 0xdd, 0x10,
-- 0x3d, 0xb4, 0xec, 0x57, 0x2d, 0x36, 0x1d, 0x03,
-- 0xbd, 0x04, 0xe4, 0x2b, 0x01, 0x46, 0x00, 0x06,
-- 0xac, 0xf6, 0x80, 0x3f, 0x0d, 0x0a, 0x10, 0x02,
-- 0x7d, 0x40, 0x10, 0x1e, 0xb0, 0x20, 0xbc, 0xe0,
-- 0x00, 0x06, 0x00, 0xc6, 0xe0, 0x52, 0xb7, 0x60,
-- 0xb7, 0x60, 0xc0, 0x5d, 0x30, 0x5f, 0xe4, 0x72,
-- 0xc7, 0x5e, 0x00, 0xed, 0xd0, 0x28, 0x70, 0x40,
-- 0xb0, 0x7f, 0x60, 0x40, 0xc0, 0x1d, 0x30, 0x1c,
-- 0xf8, 0x7e, 0x00, 0x21, 0xd0, 0x01, 0x00, 0x26,
-- 0xd0, 0x78, 0xa0, 0x38, 0x80, 0x3f, 0x70, 0x01,
-- 0xb0, 0x3f, 0x60, 0x01, 0x0f, 0x87, 0x80, 0x34,
-- 0x03, 0xef, 0xd8, 0x3f, 0xa8, 0x38, 0x01, 0x35,
-- 0xdc, 0x33, 0xe0, 0x46, 0xc0, 0x1c, 0xe4, 0xa5,
-- 0x97, 0x2e, 0x30, 0x1c, 0xe8, 0x8e, 0x00, 0x21,
-- 0xd0, 0x00, 0xa0, 0x38, 0xc0, 0x5d, 0x00, 0x23,
-- 0xd0, 0x00, 0x30, 0x40, 0x30, 0x5e, 0xe4, 0x99,
-- 0x20, 0x5e, 0xc0, 0x01, 0x30, 0x1c, 0xec, 0xa4,
-- 0xe0, 0x9d, 0x20, 0x5f, 0xc0, 0x1c, 0x30, 0x01,
-- 0xf4, 0xa5, 0xc0, 0x1c, 0x30, 0x1d, 0xec, 0xa4,
-- 0xe4, 0xa5, 0x90, 0x38, 0x00, 0x1b, 0xe8, 0xa5,
-- 0xa0, 0x66, 0xb1, 0x3f, 0xe4, 0xb3, 0xe8, 0xb1,
-- 0xc0, 0x4b, 0x30, 0x44, 0xf8, 0xb3, 0x60, 0x45,
-- 0xb1, 0x7c, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x05,
-- 0x80, 0x40, 0x72, 0xc5, 0x00, 0x06, 0x90, 0x55,
-- 0xd0, 0x01, 0x00, 0x40, 0xa0, 0x55, 0x0f, 0x87,
-- 0x01, 0x46, 0x00, 0x06, 0x03, 0xef, 0xd0, 0x3f,
-- 0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f,
-- 0x82, 0x34, 0x80, 0x3f, 0xf2, 0x1a, 0x80, 0x34,
-- 0x80, 0x3f, 0xf2, 0x1a, 0xd8, 0x00, 0xd8, 0x40,
-- 0xd8, 0x80, 0xd8, 0xc0, 0xd9, 0x00, 0xd9, 0x40,
-- 0xd9, 0x80, 0xd9, 0xc0, 0xda, 0x00, 0xda, 0x40,
-- 0xda, 0x80, 0xda, 0xc0, 0xdb, 0x00, 0xdb, 0x40,
-- 0xdb, 0x80, 0xdb, 0xc0, 0xdc, 0x00, 0xdc, 0x40,
-- 0xdc, 0x80, 0xdc, 0xc0, 0xdd, 0x00, 0xdd, 0x40,
-- 0xdd, 0x80, 0xdd, 0xc0, 0xde, 0x00, 0xde, 0x40,
-- 0xde, 0x80, 0xde, 0xc0, 0xdf, 0x00, 0xdf, 0x40,
-- 0xdf, 0x80, 0xdf, 0xc0, 0xde, 0x80, 0xde, 0xc1,
-- 0x00, 0x28, 0xd0, 0x60, 0x6e, 0x81, 0x80, 0x00,
-- 0x80, 0x05, 0x00, 0xe3, 0xd1, 0x88, 0x00, 0x73,
-- 0xd5, 0x80, 0x60, 0x06, 0xb1, 0xbc, 0x00, 0xfa,
-- 0xd0, 0x80, 0x60, 0x06, 0x00, 0x26, 0xd0, 0x6c,
-- 0x6e, 0x81, 0x04, 0xf4, 0xdc, 0x00, 0x00, 0xee,
-- 0xd1, 0x94, 0x60, 0x06, 0x00, 0xed, 0xd0, 0x50,
-- 0x6e, 0x81, 0x00, 0x22, 0xd0, 0x70, 0x6e, 0x81,
-- 0x00, 0xee, 0xd0, 0x74, 0x6e, 0x81, 0xd0, 0x4c,
-- 0x6e, 0x81, 0xd0, 0x02, 0x00, 0xef, 0xd0, 0x6c,
-- 0x60, 0x01, 0xd0, 0x03, 0x00, 0xef, 0xd0, 0x70,
-- 0x60, 0x01, 0x00, 0xe0, 0xd0, 0x48, 0xd0, 0x02,
-- 0x60, 0x01, 0x00, 0x32, 0xdf, 0x20, 0xa0, 0x1c,
-- 0x00, 0x21, 0xd0, 0x60, 0xa0, 0x76, 0x00, 0x34,
-- 0xd5, 0x70, 0x80, 0x3f, 0x00, 0x23, 0xd0, 0x5c,
-- 0x00, 0x4a, 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06,
-- 0x00, 0x22, 0xd1, 0xa4, 0x6e, 0xc6, 0xd0, 0x58,
-- 0x6e, 0xc1, 0xd0, 0xc9, 0x00, 0xed, 0xd0, 0x54,
-- 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x40, 0x60, 0xc1,
-- 0x00, 0x22, 0xd0, 0x60, 0x60, 0xc1, 0x82, 0x34,
-- 0x80, 0x3f, 0xd6, 0xd9, 0x01, 0x2d, 0xd6, 0x0c,
-- 0x16, 0x08, 0xd0, 0x55, 0xd0, 0x2c, 0x60, 0x40,
-- 0xd0, 0x70, 0x00, 0xfb, 0xd1, 0x00, 0x60, 0x01,
-- 0x00, 0x2b, 0xd4, 0x10, 0x00, 0x29, 0xd4, 0x40,
-- 0x00, 0x2b, 0xd0, 0x90, 0xc0, 0xc2, 0xd1, 0x18,
-- 0xd1, 0x44, 0xa1, 0x50, 0x00, 0x21, 0xd0, 0xb6,
-- 0xd0, 0xd7, 0x00, 0x29, 0xd0, 0x04, 0x64, 0x00,
-- 0xb0, 0x3c, 0x64, 0x40, 0x80, 0x34, 0x80, 0x3f,
-- 0xd0, 0x40, 0x00, 0x35, 0xd0, 0x00, 0x60, 0x01,
-- 0xd0, 0x48, 0x6e, 0x81, 0xd0, 0x44, 0x6e, 0x81,
-- 0x00, 0x64, 0xd1, 0x80, 0x6e, 0x86, 0x01, 0x3c,
-- 0xd2, 0x39, 0xe0, 0x46, 0xd0, 0x00, 0xd0, 0x40,
-- 0xd0, 0x80, 0xd0, 0xc0, 0xd1, 0x00, 0xd1, 0x40,
-- 0xd1, 0x80, 0xd1, 0xc0, 0xd2, 0x00, 0xd2, 0x40,
-- 0xd2, 0x80, 0xd2, 0xc0, 0xd3, 0x00, 0xd3, 0x40,
-- 0xd3, 0x80, 0xd3, 0xc0, 0xd4, 0x00, 0xd4, 0x40,
-- 0xd4, 0x80, 0xd4, 0xc0, 0xd5, 0x00, 0xd5, 0x40,
-- 0xd5, 0x80, 0xd5, 0xc0, 0xd6, 0x00, 0xd6, 0x40,
-- 0xd6, 0x80, 0xd6, 0xc0, 0xd7, 0x00, 0xd7, 0x40,
-- 0xd7, 0x80, 0xd7, 0xc0, 0x0f, 0xc5, 0x50, 0x00,
-- 0x01, 0x46, 0x00, 0x06, 0xde, 0x80, 0xde, 0xc1,
-- 0x03, 0x2f, 0xd0, 0x33, 0xa0, 0x38, 0xb0, 0x01,
-- 0xa0, 0x37, 0x80, 0x3f, 0x08, 0x20, 0xdf, 0x00,
-- 0x82, 0x34, 0x80, 0x3f, 0x00, 0xee, 0xd0, 0x08,
-- 0x77, 0xc0, 0xb0, 0x04, 0x77, 0x80, 0xb0, 0x04,
-- 0xc0, 0x5f, 0x30, 0x5e, 0x60, 0x40, 0xd7, 0x00,
-- 0xb7, 0x01, 0x80, 0x34, 0x80, 0x3f, 0x00, 0x60,
-- 0xd0, 0x80, 0x00, 0xec, 0xd0, 0x40, 0x60, 0x81,
-- 0xb0, 0x7c, 0x60, 0x81, 0x00, 0xa0, 0xd0, 0x80,
-- 0xb0, 0x74, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81,
-- 0x00, 0x68, 0xd0, 0x80, 0x6e, 0x82, 0x00, 0xef,
-- 0xd0, 0x8c, 0x6e, 0x82, 0x00, 0x06, 0xd0, 0x11,
-- 0xa0, 0x38, 0x80, 0x3f, 0x08, 0x20, 0xd0, 0x40,
-- 0x10, 0x48, 0xa0, 0x4a, 0xa0, 0x5b, 0x0c, 0x20,
-- 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0xa0, 0x0a,
-- 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40,
-- 0xa0, 0x4d, 0x80, 0x0a, 0x80, 0x07, 0x80, 0x1b,
-- 0x80, 0x27, 0x00, 0x60, 0xd0, 0x00, 0xa0, 0x09,
-- 0x80, 0x28, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69,
-- 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29,
-- 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20,
-- 0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x02, 0x30,
-- 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0,
-- 0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30,
-- 0xd0, 0x01, 0xa0, 0x38, 0x00, 0xea, 0xd0, 0x00,
-- 0xd0, 0x4e, 0x0f, 0x0b, 0x70, 0x40, 0x00, 0x06,
-- 0x00, 0x21, 0xd0, 0x88, 0x00, 0xe1, 0xd0, 0x60,
-- 0x60, 0x81, 0x00, 0x2b, 0xd0, 0x80, 0x00, 0xe0,
-- 0xd0, 0x6c, 0x60, 0x81, 0xb0, 0x7c, 0x00, 0x29,
-- 0xd0, 0x80, 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x82,
-- 0x60, 0x81, 0xb0, 0x7c, 0xd0, 0x85, 0x60, 0x81,
-- 0xb0, 0x7c, 0x03, 0xaa, 0xd0, 0x98, 0x60, 0x81,
-- 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27, 0xd0, 0x40,
-- 0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0xb0, 0x7c,
-- 0x6e, 0x81, 0x00, 0x27, 0xd1, 0x90, 0x6e, 0x86,
-- 0x00, 0x21, 0xd1, 0xb8, 0x6e, 0x86, 0x00, 0x66,
-- 0xd1, 0xa0, 0xd0, 0x00, 0x01, 0x64, 0xd0, 0x58,
-- 0x30, 0x01, 0x60, 0x06, 0x00, 0xed, 0xd1, 0xbc,
-- 0x6e, 0x86, 0x00, 0xec, 0xd1, 0xb8, 0x6e, 0x86,
-- 0xb1, 0x84, 0x6e, 0x86, 0x00, 0xee, 0xd1, 0x84,
-- 0x70, 0x46, 0x00, 0x65, 0xd1, 0x94, 0x60, 0x46,
-- 0x00, 0x64, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0x65,
-- 0xd1, 0x80, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86,
-- 0xb1, 0xbc, 0x6e, 0x86, 0x00, 0xed, 0xd1, 0xa8,
-- 0x6e, 0x86, 0xd0, 0x0e, 0xb1, 0xbc, 0x60, 0x06,
-- 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4,
-- 0x60, 0x06, 0x00, 0x28, 0xd1, 0xa4, 0x6e, 0x86,
-- 0x00, 0x27, 0xd1, 0x98, 0x6e, 0x86, 0x00, 0x64,
-- 0xd1, 0xa4, 0x6e, 0x86, 0xd2, 0x01, 0x00, 0x64,
-- 0xd0, 0x60, 0x62, 0x01, 0x00, 0x64, 0xd1, 0x80,
-- 0x70, 0x46, 0x6e, 0x86, 0x00, 0xef, 0xd1, 0x98,
-- 0x70, 0x86, 0x08, 0x20, 0xd0, 0xcf, 0x30, 0xc1,
-- 0xea, 0x42, 0xd0, 0x81, 0x00, 0x21, 0xd1, 0xa8,
-- 0x60, 0x86, 0x00, 0xed, 0xd1, 0xa0, 0x6e, 0xc6,
-- 0x00, 0x65, 0xd1, 0x98, 0x6e, 0xc6, 0x00, 0x22,
-- 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x00, 0xc6,
-- 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x50, 0x00,
-- 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x00, 0x64,
-- 0xd0, 0x60, 0x70, 0xc1, 0x00, 0xec, 0xd0, 0x40,
-- 0x71, 0x81, 0xb0, 0x7c, 0x71, 0xc1, 0xc0, 0x87,
-- 0x30, 0x86, 0xf9, 0x83, 0x10, 0xee, 0xe9, 0x76,
-- 0x10, 0xe1, 0xe9, 0x76, 0xe2, 0x57, 0x00, 0x63,
-- 0xd0, 0xbf, 0x72, 0x06, 0xb1, 0xbc, 0x41, 0x82,
-- 0x02, 0x1b, 0xe9, 0x8d, 0x72, 0x86, 0xb1, 0xbc,
-- 0x41, 0x82, 0xd0, 0x75, 0x30, 0x48, 0xe9, 0xfe,
-- 0xb0, 0x7f, 0xea, 0x00, 0x02, 0x1c, 0xe9, 0x96,
-- 0x15, 0xa3, 0xea, 0x57, 0x10, 0xf0, 0xe9, 0x9a,
-- 0x10, 0xfa, 0xf9, 0xa1, 0x15, 0xa3, 0xea, 0x57,
-- 0x00, 0x21, 0xd0, 0x4c, 0x70, 0x41, 0x10, 0x61,
-- 0xfa, 0x57, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40,
-- 0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0x00, 0x64,
-- 0xd0, 0x64, 0x62, 0x01, 0x12, 0x2b, 0xe9, 0xeb,
-- 0x12, 0x3b, 0xe9, 0xd5, 0x00, 0xec, 0xd0, 0x40,
-- 0x61, 0x81, 0x12, 0x2d, 0xe9, 0xbf, 0x12, 0x30,
-- 0xe9, 0xd4, 0x12, 0x36, 0xe9, 0xd4, 0x12, 0x3a,
-- 0xe9, 0xd4, 0xd0, 0x62, 0x30, 0x48, 0xe9, 0xf2,
-- 0x12, 0x2e, 0xe9, 0xf9, 0xe1, 0x76, 0x00, 0xed,
-- 0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42,
-- 0x60, 0x40, 0xb0, 0x08, 0x00, 0x21, 0xd0, 0x41,
-- 0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01,
-- 0xf2, 0x5a, 0x00, 0xed, 0xd0, 0x20, 0xd0, 0x41,
-- 0x60, 0x40, 0x10, 0xe1, 0xea, 0x3a, 0xe2, 0x57,
-- 0xe2, 0x53, 0x10, 0xee, 0xf9, 0xe9, 0x01, 0x46,
-- 0x82, 0x34, 0x80, 0x3f, 0x97, 0x2e, 0xc7, 0x5c,
-- 0xa7, 0x66, 0x81, 0x34, 0x80, 0x3f, 0x00, 0x21,
-- 0xd0, 0x01, 0xa0, 0x38, 0x00, 0xc6, 0x00, 0x21,
-- 0xd0, 0x15, 0x0b, 0x09, 0x00, 0x4d, 0xb0, 0x01,
-- 0xed, 0xe5, 0xd2, 0x1a, 0xe1, 0xec, 0xf1, 0x18,
-- 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xd0, 0x4e,
-- 0x60, 0x46, 0xe2, 0x54, 0xc0, 0x0a, 0x10, 0x06,
-- 0x52, 0x80, 0x00, 0xed, 0xd0, 0x40, 0x62, 0x81,
-- 0xe2, 0x53, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01,
-- 0xf2, 0x5a, 0xe1, 0x70, 0x12, 0xa3, 0xf6, 0x57,
-- 0x15, 0xa1, 0xfa, 0x57, 0x12, 0xa0, 0xea, 0x23,
-- 0x00, 0x65, 0xd1, 0x1c, 0xd0, 0x75, 0x30, 0x48,
-- 0xea, 0x0a, 0xb1, 0x3c, 0x71, 0x04, 0x11, 0x20,
-- 0xfa, 0x11, 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81,
-- 0xe2, 0x57, 0x12, 0xa1, 0xea, 0x33, 0x00, 0xe2,
-- 0xd0, 0x60, 0x70, 0x01, 0xb0, 0x7c, 0x70, 0x41,
-- 0x10, 0x0c, 0x50, 0x40, 0x0c, 0x30, 0xd0, 0x00,
-- 0x31, 0x01, 0xee, 0x21, 0x21, 0x00, 0xe6, 0x57,
-- 0xe2, 0x23, 0x31, 0x00, 0xfe, 0x57, 0xd0, 0x75,
-- 0x30, 0x48, 0xea, 0x28, 0xf2, 0x5a, 0xe2, 0x0d,
-- 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0x00, 0x63,
-- 0xd1, 0x3f, 0xb1, 0xbc, 0x41, 0x84, 0x61, 0x81,
-- 0xd0, 0x50, 0x60, 0x46, 0xe2, 0x57, 0x00, 0xed,
-- 0xd0, 0x7c, 0x70, 0x41, 0x08, 0x20, 0xd0, 0x00,
-- 0x10, 0x08, 0xe2, 0x1c, 0xd2, 0x84, 0x00, 0xed,
-- 0xd1, 0xa4, 0x62, 0x86, 0xd5, 0x00, 0xb5, 0x01,
-- 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc7, 0x5e,
-- 0x97, 0x2e, 0x81, 0x34, 0x80, 0x3f, 0x02, 0xe8,
-- 0xd0, 0x30, 0xa0, 0x37, 0xa0, 0x38, 0x08, 0x20,
-- 0xdf, 0x00, 0x80, 0x73, 0x80, 0x3f, 0x00, 0xc6,
-- 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0xf2, 0x5a,
-- 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01, 0x02, 0x3c,
-- 0xdc, 0x89, 0xe0, 0x46, 0x00, 0x28, 0xd0, 0x64,
-- 0x70, 0x81, 0x00, 0x22, 0xd0, 0x00, 0x50, 0x80,
-- 0x60, 0x81, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00,
-- 0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x00, 0xef,
-- 0xd1, 0x90, 0x70, 0x46, 0x10, 0x5c, 0x10, 0x65,
-- 0xed, 0x7d, 0xd0, 0x46, 0xc0, 0x0a, 0x10, 0x40,
-- 0x60, 0x46, 0x00, 0x22, 0xd0, 0x73, 0x30, 0x54,
-- 0xe9, 0x8e, 0x12, 0xa4, 0xe9, 0xb5, 0x15, 0x20,
-- 0xe9, 0xc0, 0xb0, 0x7b, 0xe9, 0xc3, 0xb0, 0x41,
-- 0xe9, 0xc9, 0xc0, 0x54, 0x10, 0x5c, 0x10, 0x6e,
-- 0xe9, 0xc6, 0xe1, 0xb5, 0x00, 0x28, 0xd1, 0xb0,
-- 0xd0, 0x00, 0x60, 0x06, 0x12, 0xa4, 0xf9, 0xb2,
-- 0x00, 0xed, 0xd1, 0x9c, 0x62, 0x86, 0xd2, 0x80,
-- 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86, 0xd0, 0x02,
-- 0x00, 0xec, 0xd1, 0xbc, 0x60, 0x06, 0x00, 0x64,
-- 0xd1, 0xa0, 0x72, 0x06, 0x12, 0x21, 0xf9, 0xa6,
-- 0xd2, 0x0d, 0x62, 0x06, 0x00, 0xed, 0xd1, 0xa0,
-- 0x61, 0x86, 0xd0, 0x0e, 0x00, 0xed, 0xd1, 0xac,
-- 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06, 0x00, 0x65,
-- 0xd1, 0xa4, 0x60, 0x06, 0x01, 0x7e, 0xd2, 0x32,
-- 0xe1, 0xcb, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60,
-- 0xd0, 0x00, 0x50, 0x40, 0xa0, 0x49, 0x80, 0x3f,
-- 0x00, 0xc6, 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0x70,
-- 0x01, 0xbf, 0xd0, 0x41, 0xe1, 0xcb, 0x01, 0xbb,
-- 0xda, 0x10, 0xe1, 0xcb, 0x01, 0xbd, 0xda, 0x0b,
-- 0xe1, 0xcb, 0x03, 0xb9, 0xd8, 0x10, 0x01, 0x46,
-- 0x90, 0x49, 0x00, 0x60, 0xd1, 0x00, 0x50, 0x44,
-- 0x30, 0x44, 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6,
-- 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0x01, 0xfa, 0xd4, 0x3d, 0x00, 0x25, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0x00, 0x26, 0xd0, 0x18, 0xd0, 0x40,
-- 0x60, 0x40, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40,
-- 0xd0, 0x82, 0x50, 0x42, 0x60, 0x40, 0x00, 0xec,
-- 0xd0, 0xa4, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x81,
-- 0x00, 0xec, 0xd1, 0x98, 0xd0, 0x41, 0x60, 0x46,
-- 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x8e, 0xd0, 0x40,
-- 0x60, 0x46, 0xe1, 0x81, 0xd0, 0x40, 0x00, 0xe6,
-- 0xd0, 0x10, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40,
-- 0xb0, 0x3c, 0x60, 0x40, 0xd0, 0xe0, 0x00, 0xea,
-- 0xd0, 0x40, 0x00, 0xe8, 0xd0, 0x82, 0x01, 0x46,
-- 0x70, 0x01, 0xb0, 0x7c, 0x60, 0x02, 0xb0, 0xbc,
-- 0x00, 0x06, 0x00, 0xc6, 0xb0, 0xc1, 0xed, 0x9b,
-- 0x80, 0x49, 0xd6, 0x44, 0xd5, 0x43, 0x00, 0xe0,
-- 0xd1, 0x80, 0x00, 0x06, 0x0b, 0x09, 0x01, 0x0d,
-- 0x0b, 0x09, 0x61, 0x06, 0xb1, 0xbc, 0x01, 0x4d,
-- 0x09, 0x09, 0x61, 0x46, 0xb1, 0xbc, 0x00, 0xcd,
-- 0x09, 0x09, 0x10, 0xe4, 0xed, 0xb8, 0x60, 0xc6,
-- 0xb1, 0xbc, 0x00, 0xcd, 0x60, 0xc6, 0x00, 0xed,
-- 0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xf9, 0xd8,
-- 0xd0, 0x0a, 0x40, 0x03, 0xe9, 0xc9, 0x10, 0xe2,
-- 0xe9, 0xc9, 0x10, 0xe7, 0xe9, 0xc9, 0x10, 0xe8,
-- 0xf9, 0xd8, 0x01, 0x46, 0x90, 0x10, 0x00, 0x20,
-- 0xd0, 0x44, 0x50, 0x40, 0x00, 0xc6, 0xa0, 0x50,
-- 0x00, 0xa0, 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40,
-- 0x00, 0xed, 0xd1, 0xa4, 0xd0, 0x04, 0x60, 0x06,
-- 0x00, 0xee, 0xd1, 0xac, 0x73, 0x86, 0x10, 0xe3,
-- 0xe5, 0xe3, 0xe9, 0xe8, 0x00, 0xe7, 0xd0, 0x40,
-- 0x00, 0xae, 0xd0, 0xbb, 0xe1, 0xec, 0x01, 0x24,
-- 0xd0, 0x6b, 0x00, 0xea, 0xd0, 0xa6, 0xe1, 0xec,
-- 0x01, 0x21, 0xd0, 0x7b, 0x00, 0xe8, 0xd0, 0x90,
-- 0x13, 0xa0, 0xf9, 0xef, 0xc0, 0x42, 0x00, 0xe0,
-- 0xd1, 0xa8, 0x60, 0x46, 0xb1, 0x98, 0x0b, 0xc9,
-- 0x00, 0x4d, 0x09, 0x09, 0x10, 0x44, 0x00, 0x8d,
-- 0x20, 0x42, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xb8,
-- 0x00, 0x90, 0xea, 0x1c, 0x0a, 0x89, 0x00, 0x8d,
-- 0x60, 0x86, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d,
-- 0x60, 0x46, 0x10, 0x60, 0xea, 0x10, 0x00, 0xe8,
-- 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 0xfa, 0x1c,
-- 0x08, 0x49, 0x00, 0xe0, 0xd1, 0xa4, 0x00, 0x4d,
-- 0x60, 0x46, 0x10, 0x60, 0xea, 0x20, 0x00, 0xe9,
-- 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60, 0xea, 0x20,
-- 0x00, 0xe0, 0xd1, 0x88, 0xd0, 0x40, 0x60, 0x46,
-- 0xd0, 0x00, 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0x46,
-- 0x00, 0xef, 0xd1, 0x9c, 0x70, 0x86, 0xb0, 0xb0,
-- 0xee, 0x2a, 0xd0, 0x81, 0x00, 0x90, 0xea, 0x2d,
-- 0x20, 0x01, 0x10, 0x41, 0x10, 0x9f, 0x10, 0xa0,
-- 0xee, 0x2a, 0x10, 0x1c, 0x00, 0x65, 0xd1, 0xa8,
-- 0x60, 0x06, 0x01, 0xb4, 0xd6, 0x3a, 0xe0, 0x46,
-- 0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0x0c, 0x09, 0x00, 0x06, 0x05, 0x0d,
-- 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xe9, 0xea,
-- 0xb0, 0x7d, 0xfa, 0x05, 0x09, 0x09, 0x01, 0xcd,
-- 0x11, 0xe1, 0xf9, 0xc7, 0x80, 0x09, 0x80, 0x27,
-- 0x0a, 0x09, 0xd6, 0x45, 0x00, 0xe1, 0xd1, 0xa0,
-- 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49,
-- 0x00, 0x4d, 0x60, 0x46, 0x00, 0x50, 0xe9, 0x91,
-- 0xd4, 0x01, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d,
-- 0x60, 0x46, 0x00, 0xe0, 0xd1, 0x80, 0x08, 0x89,
-- 0x00, 0x4d, 0x08, 0x89, 0x10, 0x4c, 0x71, 0x06,
-- 0x21, 0x01, 0x61, 0x06, 0xb1, 0xbc, 0x00, 0x4d,
-- 0x0b, 0x49, 0x10, 0x4c, 0x71, 0x46, 0x21, 0x41,
-- 0x61, 0x46, 0xb1, 0xb0, 0x00, 0x4d, 0x10, 0x5f,
-- 0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d,
-- 0x10, 0x4a, 0x70, 0x86, 0x20, 0x81, 0x60, 0x86,
-- 0x00, 0xe1, 0xd1, 0xac, 0x08, 0x49, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x09, 0x49, 0x00, 0x8d,
-- 0x60, 0x86, 0xc0, 0x02, 0x00, 0xe0, 0xd1, 0xa8,
-- 0x70, 0xc6, 0x10, 0xc0, 0xd0, 0x20, 0x30, 0x01,
-- 0x10, 0xc0, 0x60, 0xc6, 0xe1, 0x75, 0x11, 0xe2,
-- 0xf9, 0x75, 0x00, 0xe2, 0xd1, 0x80, 0x08, 0xc9,
-- 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49,
-- 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x10, 0x60,
-- 0xf9, 0xd7, 0xb1, 0xb4, 0xe1, 0xde, 0xd2, 0x03,
-- 0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0xb2, 0x01, 0xf9, 0xd8, 0x0b, 0xc9, 0x00, 0x4d,
-- 0x10, 0x49, 0x10, 0x56, 0x60, 0x46, 0xb1, 0xbc,
-- 0x0b, 0x89, 0x00, 0x4d, 0x10, 0x4a, 0x10, 0x56,
-- 0x60, 0x46, 0xe1, 0x75, 0x0b, 0x2c, 0xd4, 0x40,
-- 0xf3, 0xb0, 0xe1, 0x77, 0x00, 0xe0, 0xd0, 0x6c,
-- 0x00, 0xe0, 0xd1, 0x80, 0xd0, 0x0a, 0xf1, 0xfe,
-- 0x00, 0xe1, 0xd1, 0xb0, 0xd0, 0x02, 0xf1, 0xfe,
-- 0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0xb1, 0xbc,
-- 0x73, 0x46, 0xe2, 0x3c, 0x70, 0x81, 0x60, 0x86,
-- 0xb1, 0xbc, 0xb0, 0x7c, 0xb0, 0x01, 0xed, 0xfe,
-- 0x0f, 0xc5, 0x00, 0xe1, 0xd1, 0xa0, 0x70, 0x46,
-- 0xd0, 0x8f, 0x40, 0x42, 0x00, 0x25, 0xd0, 0xe0,
-- 0x00, 0x24, 0xd1, 0x20, 0x10, 0x6a, 0xea, 0x1e,
-- 0x00, 0x66, 0xd0, 0xe0, 0x00, 0x62, 0xd1, 0x00,
-- 0x10, 0x66, 0xea, 0x1e, 0x00, 0x6e, 0xd0, 0xc0,
-- 0x10, 0x64, 0xea, 0x1e, 0x00, 0x2b, 0xd0, 0xd0,
-- 0x00, 0x29, 0xd1, 0x00, 0x00, 0xe0, 0xd1, 0x80,
-- 0x76, 0x86, 0x16, 0xa0, 0xe9, 0xee, 0x30, 0xda,
-- 0xe5, 0xee, 0xb1, 0xbc, 0x73, 0x46, 0x13, 0x60,
-- 0xe9, 0xee, 0x31, 0x0d, 0xe5, 0xee, 0xd0, 0x82,
-- 0xb1, 0xbc, 0x70, 0x46, 0x10, 0x60, 0xe9, 0xee,
-- 0xb0, 0x81, 0xee, 0x2c, 0x00, 0xe0, 0xd0, 0x40,
-- 0x00, 0xe0, 0xd1, 0xac, 0xd0, 0x0a, 0xf1, 0xfe,
-- 0x00, 0xe1, 0xd0, 0x70, 0xd0, 0x02, 0xf1, 0xfe,
-- 0x00, 0xec, 0xd1, 0x98, 0xd0, 0x40, 0x60, 0x46,
-- 0x00, 0xe0, 0xd0, 0x8c, 0x70, 0x82, 0x00, 0x21,
-- 0xd0, 0x70, 0x60, 0x81, 0xd0, 0x40, 0x00, 0x25,
-- 0xd0, 0x20, 0x30, 0x1a, 0xfa, 0x50, 0x00, 0x24,
-- 0xd0, 0x20, 0x30, 0x0d, 0xfa, 0x50, 0xd0, 0x41,
-- 0x00, 0x21, 0xd1, 0x84, 0x60, 0x46, 0xb6, 0xb1,
-- 0x16, 0x9c, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46,
-- 0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0x00, 0xec, 0xd0, 0xa8, 0x70, 0xc2,
-- 0x10, 0xe0, 0xf9, 0x77, 0x00, 0xec, 0xd1, 0x9c,
-- 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0,
-- 0xe9, 0x84, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x77,
-- 0x0b, 0x49, 0x00, 0xe2, 0xd1, 0xa0, 0x00, 0x4d,
-- 0x10, 0x5f, 0x00, 0x6f, 0xd0, 0xff, 0x40, 0x43,
-- 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x89, 0x00, 0x4d,
-- 0x60, 0x46, 0x10, 0x61, 0xf9, 0x9b, 0xd3, 0xc2,
-- 0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0x0c, 0x09,
-- 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x9c, 0x00, 0x06,
-- 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54,
-- 0xf9, 0xa9, 0x0b, 0xa0, 0xd4, 0x40, 0xf3, 0xb0,
-- 0xe1, 0xa0, 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x40,
-- 0x60, 0x46, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46,
-- 0x0b, 0x09, 0x00, 0x4d, 0x0b, 0x09, 0x00, 0x4d,
-- 0x0a, 0x09, 0x01, 0x4d, 0x0a, 0x09, 0x00, 0x4d,
-- 0x01, 0x59, 0xe9, 0x96, 0x09, 0x09, 0x00, 0x4d,
-- 0x10, 0x5f, 0x10, 0x61, 0xf9, 0x96, 0x09, 0x09,
-- 0x01, 0x4d, 0x11, 0x5f, 0x0b, 0xc9, 0x00, 0x4d,
-- 0xc0, 0x01, 0x10, 0x5f, 0x11, 0x4e, 0x51, 0x41,
-- 0x08, 0x49, 0x00, 0x4d, 0x0b, 0xc9, 0x10, 0x0f,
-- 0x00, 0x4d, 0x50, 0x01, 0x00, 0xed, 0xd1, 0xb6,
-- 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3c, 0xa1, 0x7d,
-- 0x60, 0x06, 0x00, 0xc6, 0xd5, 0x00, 0xb5, 0x01,
-- 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00,
-- 0x00, 0xec, 0xd0, 0xac, 0x70, 0xc2, 0x10, 0xe0,
-- 0xf9, 0x70, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x41,
-- 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x7f,
-- 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x70, 0x0a, 0x89,
-- 0x0b, 0xcd, 0x00, 0xe3, 0xd1, 0x80, 0x6b, 0xc6,
-- 0x08, 0xc9, 0x05, 0x8d, 0x15, 0xa3, 0xee, 0x6e,
-- 0x15, 0xa0, 0xea, 0x6e, 0x90, 0x4d, 0xd0, 0x9f,
-- 0xd0, 0xdf, 0x40, 0x81, 0x10, 0x55, 0x40, 0xc1,
-- 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0x1d,
-- 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0xd1, 0x23,
-- 0x31, 0x03, 0x11, 0x02, 0x38, 0x04, 0xb0, 0x8d,
-- 0x10, 0x9d, 0x28, 0x02, 0xc0, 0x60, 0x00, 0x65,
-- 0xd1, 0x94, 0x71, 0x06, 0x68, 0x06, 0x30, 0x44,
-- 0x00, 0xed, 0xd1, 0xa8, 0x70, 0x06, 0x10, 0x20,
-- 0xe9, 0xb0, 0x00, 0xee, 0xd0, 0xc0, 0x70, 0xc3,
-- 0x20, 0x43, 0xb0, 0x01, 0xf9, 0xac, 0x60, 0x06,
-- 0x00, 0x64, 0xd1, 0xbc, 0x71, 0x06, 0xc0, 0x04,
-- 0x21, 0x01, 0x61, 0x06, 0x10, 0x20, 0xf5, 0xbb,
-- 0x11, 0x20, 0xe5, 0xbb, 0xb0, 0x41, 0x00, 0x65,
-- 0xd1, 0x80, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06,
-- 0x00, 0xed, 0xd1, 0xac, 0x71, 0x06, 0x15, 0xa1,
-- 0xe9, 0xcb, 0xb1, 0x3f, 0x61, 0x06, 0x15, 0xa3,
-- 0xf9, 0xd6, 0xd0, 0xbf, 0xe1, 0xd3, 0xd0, 0x40,
-- 0x60, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x61, 0x06,
-- 0x31, 0x02, 0xe5, 0xd3, 0x20, 0x84, 0x00, 0x65,
-- 0xd1, 0xa4, 0x60, 0x86, 0xd9, 0x40, 0x00, 0xec,
-- 0xd1, 0x94, 0x79, 0x06, 0xb1, 0x84, 0x78, 0xc6,
-- 0xc0, 0x63, 0x30, 0x64, 0xe9, 0xf8, 0x00, 0xa7,
-- 0xd0, 0xff, 0x7a, 0x63, 0x00, 0x65, 0xd0, 0x00,
-- 0x71, 0x00, 0x31, 0x29, 0xe5, 0xf8, 0xc0, 0x63,
-- 0xc8, 0xc1, 0xb0, 0x78, 0x40, 0x43, 0xc0, 0xa4,
-- 0x30, 0x81, 0xe9, 0xf2, 0x7a, 0x41, 0x31, 0x29,
-- 0xf5, 0xe8, 0x21, 0x29, 0x61, 0x00, 0xb8, 0xfc,
-- 0x79, 0x63, 0xb8, 0xfc, 0x48, 0xc3, 0x68, 0xc6,
-- 0x00, 0xed, 0xd1, 0xb8, 0x69, 0x46, 0x80, 0x28,
-- 0x0b, 0xc9, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41,
-- 0x00, 0xe3, 0xd1, 0x84, 0x00, 0x8d, 0x20, 0x42,
-- 0x60, 0x46, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x86,
-- 0x10, 0xa1, 0xee, 0x18, 0xe6, 0x6b, 0x90, 0x86,
-- 0x00, 0x90, 0xea, 0x18, 0x00, 0xed, 0xd0, 0x1c,
-- 0x70, 0x80, 0xb0, 0x81, 0xe6, 0x6b, 0x60, 0x80,
-- 0xb1, 0xa8, 0x70, 0x86, 0x10, 0xa0, 0xfa, 0x6b,
-- 0x00, 0x21, 0xd0, 0x38, 0x70, 0x80, 0x10, 0xa0,
-- 0xfa, 0x6b, 0x0f, 0xef, 0xd0, 0xbf, 0x30, 0x81,
-- 0xfa, 0x22, 0x60, 0x00, 0x08, 0x20, 0xd0, 0x00,
-- 0x5f, 0x00, 0x15, 0xa3, 0xea, 0x6b, 0x00, 0xee,
-- 0xd1, 0x80, 0x79, 0x46, 0x00, 0xf8, 0xd0, 0x00,
-- 0xc4, 0x40, 0x00, 0xe3, 0xd1, 0x84, 0x78, 0x46,
-- 0x0f, 0xef, 0xd0, 0x3f, 0x30, 0x21, 0xea, 0x48,
-- 0x00, 0xe0, 0xd1, 0x90, 0x78, 0x06, 0xc0, 0xa1,
-- 0x18, 0x43, 0x28, 0x42, 0x18, 0x43, 0x28, 0x42,
-- 0x18, 0x1e, 0xd8, 0x80, 0x08, 0x11, 0xea, 0x41,
-- 0x28, 0xa1, 0x18, 0x01, 0x18, 0x5f, 0x18, 0x60,
-- 0xee, 0x3e, 0xc0, 0x51, 0x30, 0x62, 0xee, 0x4e,
-- 0xc8, 0x91, 0x18, 0x9f, 0x00, 0x21, 0xd1, 0xb8,
-- 0xd0, 0x01, 0x60, 0x06, 0x00, 0xef, 0xd0, 0x10,
-- 0xd0, 0x72, 0x60, 0x40, 0x01, 0x46, 0x82, 0x34,
-- 0x80, 0x3f, 0xc8, 0xdc, 0xc9, 0x1d, 0x81, 0x34,
-- 0x80, 0x3f, 0x00, 0xc6, 0x38, 0xe4, 0xee, 0x5e,
-- 0xea, 0x52, 0x28, 0xe5, 0x01, 0x46, 0x90, 0x6d,
-- 0x28, 0xc1, 0x00, 0xc6, 0x38, 0xe2, 0xf6, 0x6b,
-- 0xdb, 0x08, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x21,
-- 0xd1, 0xb4, 0x61, 0x86, 0xe2, 0x52, 0x01, 0xf7,
-- 0xd2, 0x19, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01,
-- 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00,
-- 0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xdb, 0x09, 0x00, 0xe3, 0xd0, 0x1c,
-- 0x6b, 0x00, 0xda, 0xc1, 0x00, 0xe6, 0xd1, 0x98,
-- 0x70, 0x06, 0xb1, 0x84, 0x60, 0x06, 0xb1, 0x84,
-- 0x60, 0x06, 0x05, 0x9f, 0xe9, 0x9f, 0x08, 0x49,
-- 0xd1, 0x17, 0x46, 0x44, 0x00, 0x4d, 0x10, 0x43,
-- 0x26, 0x41, 0x08, 0xc9, 0x05, 0xcd, 0xb5, 0xc1,
-- 0xe5, 0xcc, 0xc0, 0x57, 0x15, 0xc6, 0x25, 0xc1,
-- 0x15, 0xa3, 0xf9, 0x9f, 0x08, 0x49, 0xd1, 0x0f,
-- 0x46, 0x44, 0x00, 0x4d, 0x10, 0x44, 0x26, 0x41,
-- 0x08, 0xc9, 0x06, 0x0d, 0xb6, 0x01, 0xe5, 0xcc,
-- 0xc0, 0x58, 0x16, 0x06, 0x26, 0x01, 0x08, 0x49,
-- 0x00, 0x4d, 0x10, 0x60, 0xe9, 0xa6, 0x0a, 0x09,
-- 0x00, 0x4d, 0xe1, 0x9f, 0x0c, 0x09, 0x90, 0x4d,
-- 0x10, 0x60, 0xe5, 0xa7, 0x00, 0x06, 0x05, 0x0d,
-- 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xb3,
-- 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xab, 0xb0, 0x7d,
-- 0xf9, 0xb8, 0x02, 0x34, 0xd4, 0x44, 0xe0, 0x46,
-- 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46,
-- 0x02, 0x3c, 0xdc, 0x89, 0x00, 0xec, 0xd1, 0x80,
-- 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81,
-- 0xe8, 0x46, 0x15, 0x63, 0xe9, 0xc9, 0x05, 0x5e,
-- 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46,
-- 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a,
-- 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0xcc, 0xc0, 0xcd, 0x01, 0xcd, 0x42, 0xcd, 0x83,
-- 0x00, 0xa0, 0xd0, 0x01, 0xa0, 0x38, 0xc8, 0x7f,
-- 0xc8, 0x06, 0xb1, 0xbe, 0xf3, 0x96, 0xc8, 0x80,
-- 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96, 0xc8, 0xc0,
-- 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x58, 0xc0,
-- 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40,
-- 0xc0, 0x22, 0xc0, 0x65, 0xc0, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0x00,
-- 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x96, 0xc9, 0x80,
-- 0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0xc0,
-- 0xf3, 0x92, 0x58, 0x80, 0xc0, 0x23, 0xc0, 0x62,
-- 0xd0, 0x88, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96,
-- 0xc8, 0xc0, 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96,
-- 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0, 0xc0, 0x24,
-- 0xc0, 0x67, 0xd0, 0x90, 0x20, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x80,
-- 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x96, 0xca, 0x00,
-- 0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xca, 0x40,
-- 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x25, 0xc0, 0x64,
-- 0xd0, 0x98, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96,
-- 0xc9, 0x40, 0xf3, 0x92, 0x58, 0x80, 0xf3, 0x96,
-- 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x23,
-- 0xc0, 0x64, 0xd0, 0x84, 0x20, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x59, 0x40,
-- 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x5a, 0x40,
-- 0xc0, 0x26, 0xc0, 0x69, 0xd0, 0xa0, 0x20, 0x86,
-- 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92,
-- 0x5a, 0x00, 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92,
-- 0x5a, 0x40, 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92,
-- 0x59, 0x80, 0xc0, 0x27, 0xc0, 0x66, 0xd0, 0xa8,
-- 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0xc0,
-- 0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x80,
-- 0xf3, 0x92, 0x58, 0xc0, 0xc0, 0x22, 0xc0, 0x63,
-- 0xd0, 0x8c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92,
-- 0x59, 0x80, 0xc0, 0x25, 0xc0, 0x66, 0xd0, 0x94,
-- 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80,
-- 0xf3, 0x92, 0x59, 0xc0, 0xf3, 0x96, 0xc8, 0xc0,
-- 0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x28, 0xc0, 0x6a,
-- 0xd0, 0xb0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96,
-- 0xc9, 0x40, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x29,
-- 0xc0, 0x65, 0xd0, 0xb8, 0x20, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0,
-- 0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x58, 0x80,
-- 0xc0, 0x24, 0xc0, 0x62, 0xd0, 0x9c, 0x20, 0x86,
-- 0xf3, 0x9a, 0xf3, 0x92, 0x5a, 0x00, 0xc0, 0x27,
-- 0xc0, 0x68, 0xd0, 0xa4, 0x20, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80,
-- 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40,
-- 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92, 0x5a, 0x80,
-- 0xc0, 0x23, 0xc0, 0x6a, 0xd0, 0xac, 0x20, 0x86,
-- 0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x26,
-- 0xc0, 0x65, 0xd0, 0xb4, 0x20, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92, 0x59, 0x00,
-- 0xc0, 0x29, 0xc0, 0x64, 0xd0, 0xbc, 0x20, 0x86,
-- 0xf3, 0x9a, 0xc0, 0x33, 0xc0, 0x74, 0xc0, 0xb5,
-- 0xc0, 0xf6, 0xd0, 0x40, 0x00, 0xa0, 0xd8, 0x00,
-- 0xa8, 0x38, 0x08, 0x45, 0x0a, 0x09, 0x00, 0x0d,
-- 0x0f, 0xc5, 0x50, 0x00, 0x0a, 0x09, 0x00, 0x0d,
-- 0x10, 0x08, 0x0f, 0xc5, 0x01, 0x46, 0x00, 0x06,
-- 0xa0, 0x7c, 0xa0, 0x3d, 0x60, 0x42, 0x00, 0xc6,
-- 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0x14, 0x48, 0xd0, 0x81, 0x00, 0xef, 0xd1, 0x8c,
-- 0x71, 0x46, 0x11, 0x60, 0xfb, 0xb1, 0x60, 0x86,
-- 0x71, 0x46, 0x31, 0x42, 0xfb, 0xb1, 0x00, 0xec,
-- 0xd1, 0x0c, 0x74, 0x84, 0x00, 0x68, 0xd0, 0x80,
-- 0x70, 0x02, 0x10, 0x20, 0xfb, 0xc4, 0xc4, 0x82,
-- 0xc4, 0xd2, 0xb4, 0xfc, 0xda, 0x00, 0xda, 0x4f,
-- 0x0a, 0x09, 0x0f, 0xef, 0xd0, 0x3f, 0xb4, 0x7f,
-- 0xca, 0x29, 0x1a, 0x18, 0x4a, 0x00, 0x1a, 0x48,
-- 0x00, 0x8d, 0x2a, 0x42, 0xd0, 0x03, 0x40, 0x11,
-- 0xfb, 0xe3, 0xb4, 0x44, 0x00, 0xa0, 0xd0, 0xc0,
-- 0x30, 0xd3, 0xff, 0xe3, 0xb4, 0xfe, 0x01, 0x46,
-- 0x00, 0x06, 0xaa, 0x3d, 0xaa, 0x7c, 0x6a, 0x53,
-- 0x00, 0xc6, 0xb4, 0xfe, 0xb4, 0x7c, 0x1a, 0x61,
-- 0xfb, 0xc8, 0xb4, 0x43, 0x00, 0xef, 0xd0, 0x3f,
-- 0x40, 0x11, 0xeb, 0xf7, 0xb0, 0xc4, 0xe7, 0xf7,
-- 0xeb, 0xee, 0x61, 0x53, 0x64, 0x52, 0x64, 0xc4,
-- 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04, 0x00, 0x21,
-- 0xd0, 0x80, 0x50, 0x02, 0x60, 0x04, 0x61, 0x46,
-- 0x0a, 0x09, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00,
-- 0x02, 0x31, 0xde, 0x13, 0x00, 0x27, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0x01, 0xfa, 0xd4, 0x3d, 0x00, 0x25,
-- 0xdc, 0xd8, 0xf0, 0x4a, 0x09, 0x09, 0x01, 0xcd,
-- 0x11, 0xe8, 0xf9, 0xe2, 0x00, 0xe3, 0xd1, 0x9c,
-- 0x09, 0x09, 0x05, 0xcd, 0xb5, 0xc1, 0x09, 0x09,
-- 0x00, 0x4d, 0xb0, 0x41, 0x10, 0x46, 0x25, 0xc1,
-- 0x09, 0x09, 0x06, 0x0d, 0xb6, 0x01, 0x09, 0x09,
-- 0x00, 0x4d, 0x08, 0x89, 0xb0, 0x41, 0x10, 0x46,
-- 0x26, 0x01, 0x00, 0x8d, 0x08, 0x89, 0x10, 0x82,
-- 0xd0, 0x04, 0xc0, 0x55, 0x00, 0x40, 0x40, 0x40,
-- 0x05, 0x4d, 0x08, 0x49, 0x0b, 0x0d, 0xd1, 0x00,
-- 0x15, 0x63, 0xe9, 0xa2, 0xd1, 0x01, 0x55, 0x41,
-- 0xdb, 0x01, 0x4b, 0x15, 0xa1, 0x1b, 0x08, 0x89,
-- 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41, 0xd1, 0x19,
-- 0x46, 0x44, 0x26, 0x41, 0x00, 0xcd, 0x08, 0x49,
-- 0x10, 0xc4, 0x00, 0x4d, 0x08, 0x49, 0x10, 0x41,
-- 0x20, 0x81, 0xa0, 0x89, 0x00, 0x4d, 0x10, 0x43,
-- 0x20, 0xc1, 0xa0, 0xe8, 0x08, 0x49, 0x00, 0x4d,
-- 0x1b, 0x03, 0x5b, 0x01, 0xbb, 0x3f, 0x6b, 0x06,
-- 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46,
-- 0x08, 0x49, 0xb1, 0xbc, 0x0a, 0xcd, 0x1a, 0xc2,
-- 0x4a, 0xd9, 0x1a, 0xde, 0x6a, 0xc6, 0x08, 0x49,
-- 0xb1, 0xbc, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60,
-- 0xea, 0x3e, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x08, 0xc9, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x09, 0xc9, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0x0a, 0x09, 0x00, 0x4d,
-- 0x60, 0x46, 0xe2, 0x3e, 0x11, 0xe3, 0xfa, 0x00,
-- 0x00, 0xe7, 0xd0, 0xc0, 0xd0, 0x84, 0xb0, 0x81,
-- 0xe6, 0x3e, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x43,
-- 0xb0, 0xfc, 0x10, 0x60, 0xe9, 0xe7, 0x10, 0xa3,
-- 0xf9, 0xf4, 0x00, 0xe8, 0xd1, 0x80, 0xe1, 0xf8,
-- 0x10, 0xa2, 0xf9, 0xfa, 0x00, 0xe9, 0xd1, 0x80,
-- 0xf2, 0xb0, 0xe1, 0xe7, 0xd2, 0x3f, 0x0a, 0x09,
-- 0x00, 0x4d, 0xb2, 0x01, 0xf5, 0xfb, 0xe1, 0xe7,
-- 0x11, 0xe7, 0xfa, 0x3e, 0xd4, 0x01, 0x00, 0xe1,
-- 0xd0, 0x24, 0x70, 0x00, 0x10, 0x21, 0xea, 0x0d,
-- 0x15, 0x63, 0xfa, 0x0d, 0xd4, 0x03, 0x44, 0x2c,
-- 0xb4, 0x3f, 0x00, 0xe6, 0xd1, 0x90, 0x0b, 0x09,
-- 0x00, 0x4d, 0x09, 0x49, 0x10, 0x45, 0x00, 0x8d,
-- 0x50, 0x81, 0xd0, 0x40, 0x10, 0x87, 0x10, 0x98,
-- 0x30, 0x42, 0xf2, 0x61, 0x60, 0x46, 0xb1, 0xbc,
-- 0x0b, 0x09, 0x00, 0x0d, 0x09, 0x49, 0x00, 0x0d,
-- 0xb4, 0x01, 0xfa, 0x0f, 0x00, 0xe6, 0xd0, 0x18,
-- 0x30, 0x06, 0xe6, 0x29, 0x60, 0x46, 0xb1, 0xbc,
-- 0xe2, 0x22, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46,
-- 0x10, 0x63, 0xea, 0x39, 0x10, 0x64, 0xea, 0x39,
-- 0x00, 0xe6, 0xd1, 0x90, 0xd0, 0x00, 0x60, 0x06,
-- 0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06,
-- 0xe2, 0x3e, 0x00, 0xef, 0xd1, 0x84, 0x70, 0x46,
-- 0x10, 0x60, 0xfa, 0x30, 0x0c, 0x09, 0x90, 0x4d,
-- 0x10, 0x60, 0xe6, 0x3f, 0x00, 0x06, 0x05, 0x0d,
-- 0x00, 0x22, 0xd0, 0x72, 0x30, 0x54, 0xfa, 0x4b,
-- 0xd4, 0x40, 0xf3, 0xb0, 0xe2, 0x43, 0xb0, 0x7d,
-- 0xe9, 0x7a, 0x00, 0xec, 0xd1, 0xa0, 0xd0, 0x40,
-- 0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, 0x00, 0xec,
-- 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc, 0x70, 0x86,
-- 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63, 0xea, 0x5e,
-- 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73, 0xd4, 0x3d,
-- 0xe0, 0x46, 0x00, 0xe0, 0xd0, 0x00, 0x70, 0xc0,
-- 0x10, 0xc1, 0x00, 0xe0, 0xd0, 0x08, 0x70, 0x00,
-- 0x10, 0x23, 0xea, 0x75, 0xc0, 0x83, 0x10, 0x9d,
-- 0x30, 0xc2, 0x10, 0x9f, 0x30, 0xc2, 0x00, 0xef,
-- 0xd0, 0xac, 0x70, 0x82, 0x10, 0xa3, 0xea, 0x75,
-- 0x10, 0xc1, 0xc0, 0x83, 0x30, 0x81, 0xe6, 0x7e,
-- 0xc0, 0x83, 0x20, 0x81, 0xf6, 0x7f, 0xd0, 0x40,
-- 0x30, 0x43, 0x0f, 0xc5, 0xc0, 0x43, 0x0f, 0xc5,
-- 0x00, 0xed, 0xd1, 0xa4, 0x72, 0x86, 0x15, 0xa3,
-- 0xee, 0x23, 0x15, 0xa1, 0xe6, 0x23, 0x08, 0x20,
-- 0xd0, 0x00, 0x5f, 0x00, 0xd8, 0xc4, 0x15, 0x63,
-- 0xe9, 0x7e, 0x48, 0xd5, 0x18, 0xde, 0x18, 0xe0,
-- 0xe9, 0xc2, 0x00, 0xed, 0xd1, 0xb4, 0x79, 0xc6,
-- 0x19, 0xe0, 0xe9, 0x8c, 0x00, 0xed, 0xd0, 0x3a,
-- 0x79, 0xc6, 0x69, 0xc0, 0xd9, 0xc0, 0x69, 0xc6,
-- 0x00, 0xed, 0xd0, 0x38, 0x79, 0x40, 0x19, 0x60,
-- 0xe9, 0x98, 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40,
-- 0x02, 0x20, 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40,
-- 0x15, 0xa3, 0xe9, 0x9f, 0x00, 0xec, 0xd1, 0xb8,
-- 0x79, 0xc6, 0x69, 0x46, 0xc9, 0x67, 0x00, 0xec,
-- 0xd9, 0xb4, 0x70, 0x66, 0x00, 0xec, 0xd1, 0xbc,
-- 0x70, 0x06, 0x10, 0x20, 0xed, 0xbe, 0x10, 0x60,
-- 0xe9, 0xc1, 0x00, 0xe0, 0xda, 0xa8, 0x7a, 0xaa,
-- 0xc0, 0x2a, 0x10, 0x1f, 0x00, 0x22, 0xd0, 0xa0,
-- 0x70, 0x82, 0x20, 0x6a, 0x00, 0x9f, 0xe9, 0xb5,
-- 0x20, 0x40, 0x19, 0x60, 0xf9, 0xb8, 0xc9, 0x41,
-- 0xb0, 0x48, 0x30, 0x65, 0xf5, 0xbd, 0xb0, 0x70,
-- 0xed, 0xbe, 0xd9, 0x40, 0x00, 0xed, 0xd1, 0xbc,
-- 0x69, 0x46, 0x69, 0x66, 0x12, 0xa4, 0xea, 0x21,
-- 0x00, 0xec, 0xd1, 0xbc, 0x73, 0xc6, 0x15, 0xa3,
-- 0xe9, 0xdf, 0x33, 0xe3, 0xe5, 0xd3, 0xed, 0xd2,
-- 0x63, 0xc6, 0x00, 0x21, 0xd1, 0xa8, 0x63, 0xc6,
-- 0x00, 0xed, 0xd1, 0xa0, 0x63, 0xc6, 0x15, 0xa1,
-- 0xf9, 0xdc, 0x12, 0xa3, 0xe5, 0xe3, 0xd3, 0xc2,
-- 0x00, 0xec, 0xd1, 0xbc, 0x63, 0xc6, 0xe1, 0xe3,
-- 0x12, 0xa3, 0xea, 0x21, 0xe1, 0xe3, 0x12, 0xa2,
-- 0xf6, 0x21, 0x13, 0xe0, 0xfa, 0x21, 0x00, 0xee,
-- 0xd1, 0x8c, 0x78, 0x06, 0xb1, 0xbc, 0x78, 0x46,
-- 0xb1, 0xbc, 0x78, 0x86, 0xd1, 0x88, 0x72, 0x46,
-- 0xd1, 0x84, 0x73, 0x06, 0x13, 0x20, 0xf9, 0xe3,
-- 0x00, 0x64, 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0xa2,
-- 0x30, 0x81, 0xe9, 0xff, 0x10, 0x70, 0xea, 0x11,
-- 0x10, 0x6d, 0xea, 0x14, 0x10, 0x76, 0xea, 0x19,
-- 0x10, 0x7a, 0xea, 0x28, 0xe2, 0x3b, 0x18, 0xe0,
-- 0xea, 0x3b, 0x00, 0xed, 0xd1, 0x80, 0x70, 0x86,
-- 0xb0, 0x81, 0xd0, 0x3f, 0x40, 0x02, 0x10, 0x20,
-- 0xea, 0x0c, 0x60, 0x86, 0xf3, 0x8a, 0xe1, 0xe3,
-- 0xc0, 0x02, 0x10, 0x1a, 0x50, 0x80, 0x60, 0x86,
-- 0xe2, 0x3b, 0x15, 0xa3, 0xea, 0x21, 0xe2, 0xe9,
-- 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86,
-- 0xe3, 0x0c, 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60,
-- 0x70, 0x06, 0x50, 0x40, 0x60, 0x46, 0x15, 0xa3,
-- 0xfb, 0x0c, 0xd5, 0x84, 0xe3, 0x0c, 0xd5, 0x00,
-- 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46,
-- 0x00, 0xed, 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06,
-- 0x50, 0x40, 0x60, 0x46, 0x15, 0xa2, 0xe7, 0x0c,
-- 0xee, 0x21, 0x00, 0x21, 0xd1, 0x8c, 0x18, 0xe0,
-- 0xfa, 0x39, 0x70, 0x46, 0x10, 0x61, 0xea, 0x70,
-- 0xe2, 0x21, 0x65, 0x86, 0xe2, 0x21, 0x18, 0xe0,
-- 0xea, 0x70, 0xd1, 0x80, 0x73, 0x06, 0x15, 0xa2,
-- 0xee, 0x68, 0x00, 0x22, 0xd1, 0x80, 0x70, 0x46,
-- 0x6b, 0x06, 0xcb, 0x01, 0xb1, 0xb4, 0x70, 0x46,
-- 0x6a, 0xc6, 0xca, 0xc1, 0x00, 0x65, 0xd1, 0x98,
-- 0x70, 0x46, 0x10, 0x61, 0xfa, 0x50, 0x02, 0x41,
-- 0xc3, 0x21, 0xc7, 0xe0, 0x02, 0x50, 0xea, 0x56,
-- 0xc3, 0x20, 0xc7, 0xe1, 0xd1, 0x88, 0xd0, 0x01,
-- 0x02, 0x40, 0x62, 0x46, 0x0f, 0xef, 0xd0, 0x7f,
-- 0x30, 0x6f, 0xfa, 0x5f, 0xc3, 0x20, 0xc7, 0x4c,
-- 0xd0, 0x00, 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46,
-- 0x60, 0x06, 0xb0, 0x41, 0x43, 0x01, 0xe2, 0x70,
-- 0xc3, 0x22, 0xc7, 0xcc, 0xc7, 0x60, 0xc7, 0xa1,
-- 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xa0,
-- 0xdb, 0x80, 0xd1, 0x00, 0x00, 0xef, 0xd1, 0xa8,
-- 0x70, 0x46, 0x10, 0x60, 0xfa, 0x7a, 0x00, 0xe0,
-- 0xd1, 0x88, 0x70, 0x46, 0x00, 0x22, 0xd1, 0xb0,
-- 0x70, 0x86, 0x30, 0x81, 0xea, 0x82, 0x60, 0x46,
-- 0xd0, 0x20, 0xf3, 0x06, 0x10, 0x63, 0xea, 0x87,
-- 0x10, 0x64, 0xea, 0x87, 0xe2, 0x95, 0x00, 0xef,
-- 0xd1, 0x6c, 0x71, 0x45, 0xc0, 0x05, 0x30, 0x01,
-- 0xf6, 0x95, 0xdb, 0x82, 0xd1, 0x01, 0x10, 0x63,
-- 0xea, 0x95, 0xd1, 0x02, 0x11, 0x62, 0xea, 0x95,
-- 0xd1, 0x03, 0xd1, 0x8c, 0x61, 0x06, 0xdb, 0x40,
-- 0x00, 0xe0, 0xd0, 0x00, 0x71, 0x00, 0xc0, 0x84,
-- 0x10, 0x9c, 0xb0, 0x96, 0xfa, 0xa0, 0xb1, 0x38,
-- 0xb0, 0x96, 0xfa, 0xa3, 0xb1, 0x30, 0x00, 0x29,
-- 0xd1, 0x84, 0x00, 0x22, 0xd0, 0x74, 0x70, 0x86,
-- 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2, 0xea, 0xae,
-- 0x60, 0x81, 0xdb, 0x41, 0xb0, 0x3c, 0xb1, 0xbc,
-- 0xb0, 0x7c, 0x71, 0x00, 0x70, 0x86, 0x70, 0xc1,
-- 0x61, 0x06, 0x30, 0xc2, 0xea, 0xb9, 0x60, 0x81,
-- 0xdb, 0x41, 0x00, 0xee, 0xd1, 0xb4, 0x70, 0x06,
-- 0xb1, 0xbc, 0x70, 0x46, 0x30, 0x40, 0xea, 0xc2,
-- 0x60, 0x06, 0xdb, 0x41, 0x00, 0x24, 0xd0, 0x60,
-- 0x30, 0x81, 0xea, 0xc7, 0x30, 0x81, 0x50, 0x02,
-- 0xea, 0xca, 0xd0, 0x01, 0x00, 0x22, 0xd1, 0xbc,
-- 0x70, 0x86, 0x30, 0x80, 0xea, 0xd2, 0x60, 0x06,
-- 0xd0, 0x10, 0xf3, 0x06, 0x00, 0x22, 0xd1, 0xa4,
-- 0x71, 0x06, 0xd0, 0x01, 0x41, 0x00, 0x5b, 0x44,
-- 0x5b, 0x6e, 0x6b, 0x46, 0x00, 0x28, 0xd0, 0x70,
-- 0x70, 0x41, 0x10, 0x62, 0xfa, 0xe6, 0xd1, 0x84,
-- 0x70, 0x06, 0x10, 0x20, 0xfa, 0xdf, 0x00, 0x22,
-- 0xd0, 0x00, 0xf3, 0x06, 0x02, 0x7d, 0xde, 0x68,
-- 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88, 0x71, 0x06,
-- 0x01, 0x1f, 0xfa, 0xfd, 0xd0, 0x41, 0x41, 0x01,
-- 0xd0, 0x62, 0x00, 0x65, 0xd0, 0x30, 0x70, 0x00,
-- 0x10, 0x21, 0xea, 0xfa, 0xee, 0xf9, 0x1a, 0xe1,
-- 0xfa, 0xfa, 0xd0, 0x52, 0x51, 0x01, 0x61, 0x06,
-- 0xe3, 0x0c, 0x18, 0xe0, 0xea, 0x70, 0xc7, 0x60,
-- 0xc7, 0xe1, 0x02, 0x50, 0xea, 0x70, 0xc7, 0x61,
-- 0xc7, 0xe0, 0xe2, 0x70, 0x00, 0x28, 0xdc, 0xa4,
-- 0x7c, 0x72, 0x5c, 0x40, 0x6c, 0x72, 0x0f, 0xc5,
-- 0x18, 0xe0, 0xeb, 0x82, 0xd9, 0x0d, 0x00, 0xee,
-- 0xd1, 0xa4, 0x70, 0x06, 0x10, 0x21, 0xfb, 0x7f,
-- 0xd9, 0x0c, 0x90, 0x06, 0x00, 0x10, 0xeb, 0x7f,
-- 0x00, 0x21, 0xd1, 0x88, 0x7a, 0x06, 0x1a, 0x20,
-- 0xeb, 0x7f, 0xd9, 0x00, 0x00, 0xed, 0xd1, 0xbc,
-- 0x79, 0x46, 0x19, 0x60, 0xeb, 0x7f, 0x39, 0x68,
-- 0xc0, 0xe5, 0xc0, 0x25, 0x10, 0x13, 0xb0, 0x0f,
-- 0xef, 0x7f, 0xb0, 0x22, 0xe7, 0x7f, 0x00, 0xe0,
-- 0xd1, 0xa8, 0x71, 0x46, 0x11, 0x5f, 0x29, 0x45,
-- 0x00, 0x22, 0xd0, 0x18, 0x00, 0x22, 0xd4, 0x54,
-- 0x00, 0x22, 0xd0, 0x9c, 0x70, 0x00, 0x74, 0x51,
-- 0x70, 0x42, 0x34, 0x40, 0xe7, 0x3c, 0xd0, 0x40,
-- 0x00, 0x22, 0xd4, 0x50, 0x74, 0x51, 0x34, 0x40,
-- 0xef, 0x42, 0x20, 0x45, 0x60, 0x42, 0x39, 0x41,
-- 0x19, 0x60, 0xf7, 0x5e, 0x00, 0x65, 0xd1, 0xa8,
-- 0x7a, 0x86, 0x29, 0x6a, 0x19, 0x59, 0xb9, 0x7e,
-- 0xf7, 0x75, 0x15, 0xa3, 0xf7, 0x57, 0x00, 0xed,
-- 0xd1, 0xac, 0x70, 0x06, 0x00, 0xed, 0xd1, 0xb0,
-- 0x70, 0x46, 0x30, 0x01, 0xfb, 0x7f, 0x00, 0x65,
-- 0xd1, 0x84, 0x70, 0x46, 0xb0, 0x7f, 0x60, 0x46,
-- 0xd5, 0x84, 0xe3, 0x7f, 0x11, 0x41, 0xd0, 0x4a,
-- 0x00, 0xed, 0xd1, 0xa0, 0x74, 0x46, 0xd0, 0x00,
-- 0x60, 0x06, 0x30, 0xc5, 0x39, 0x45, 0xe7, 0x6e,
-- 0x14, 0x60, 0xeb, 0x6b, 0xf3, 0x85, 0xb0, 0x41,
-- 0xef, 0x65, 0xe3, 0x71, 0x00, 0x66, 0xd1, 0xa0,
-- 0x60, 0xc6, 0x15, 0xa3, 0xeb, 0x7f, 0xf3, 0x85,
-- 0xe3, 0x7f, 0xd9, 0x01, 0x00, 0x66, 0xd1, 0xa0,
-- 0x70, 0x06, 0x30, 0x03, 0xe7, 0x7e, 0x10, 0x1d,
-- 0x10, 0x3b, 0xe7, 0x7f, 0x60, 0xc6, 0x00, 0x66,
-- 0xd1, 0xa4, 0x69, 0x06, 0x15, 0xa4, 0xea, 0x23,
-- 0xe2, 0x3b, 0x00, 0x65, 0xdd, 0x08, 0x7c, 0xf4,
-- 0xbc, 0xff, 0x6c, 0xf4, 0x00, 0xef, 0xdd, 0x10,
-- 0x7c, 0xf4, 0xbc, 0xfe, 0x6c, 0xf4, 0xc0, 0x3f,
-- 0xf1, 0x18, 0xf1, 0x16, 0xf1, 0x18, 0x00, 0x05,
-- 0x08, 0x20, 0xd0, 0x40, 0x5f, 0x01, 0x15, 0x63,
-- 0xe9, 0x77, 0x05, 0x5e, 0xeb, 0x08, 0x00, 0x22,
-- 0xd1, 0xa0, 0x6b, 0x06, 0x00, 0x22, 0xd1, 0xa8,
-- 0x6b, 0xc6, 0x00, 0x22, 0xd1, 0xac, 0x6a, 0xc6,
-- 0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c,
-- 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d, 0xb0, 0x3c,
-- 0xb1, 0xb4, 0x70, 0x40, 0x30, 0x5f, 0xe9, 0x8d,
-- 0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x10, 0xd0, 0x83,
-- 0x70, 0x40, 0x60, 0x46, 0xb0, 0x3c, 0xb1, 0xbc,
-- 0xb0, 0x81, 0xed, 0x90, 0x00, 0xee, 0xd0, 0x0c,
-- 0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x4c,
-- 0xe9, 0xa3, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40,
-- 0x30, 0x4c, 0xe9, 0xa3, 0xb1, 0xb4, 0x00, 0xe6,
-- 0xd0, 0x00, 0x61, 0x80, 0x00, 0x21, 0xd1, 0xb4,
-- 0x70, 0x06, 0x10, 0x20, 0xe9, 0xae, 0xd0, 0x00,
-- 0x60, 0x06, 0xf1, 0x18, 0x00, 0x21, 0xd1, 0x8c,
-- 0x70, 0x46, 0x65, 0x86, 0xde, 0xc0, 0x00, 0xee,
-- 0xd0, 0x20, 0x70, 0x00, 0x10, 0x22, 0xfd, 0xb9,
-- 0xde, 0xc2, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00,
-- 0x10, 0x21, 0xe9, 0xc0, 0x15, 0xa3, 0xe9, 0xdc,
-- 0xd0, 0x02, 0x4c, 0x00, 0x10, 0x63, 0xe9, 0xc5,
-- 0xcc, 0x3b, 0xd0, 0x04, 0x63, 0x00, 0xd0, 0x00,
-- 0x70, 0x00, 0x30, 0x1f, 0xfb, 0x08, 0xd0, 0x18,
-- 0x70, 0x00, 0x10, 0x20, 0xed, 0xc7, 0xd0, 0x04,
-- 0x70, 0x80, 0x10, 0xa0, 0xeb, 0x08, 0xf1, 0x16,
-- 0x00, 0x21, 0xd0, 0x9a, 0xc0, 0x39, 0x30, 0x1f,
-- 0x10, 0x18, 0x30, 0x02, 0xfd, 0xcf, 0xe3, 0x08,
-- 0x00, 0xe0, 0xd9, 0x04, 0x79, 0x24, 0xb9, 0x38,
-- 0x19, 0x1c, 0xdc, 0x88, 0x4c, 0xac, 0xd0, 0x02,
-- 0x40, 0x2c, 0x10, 0x02, 0x0c, 0x80, 0x10, 0x63,
-- 0xea, 0x70, 0x15, 0x63, 0xf9, 0xec, 0xf1, 0x18,
-- 0x00, 0xef, 0xdc, 0x00, 0x7c, 0x30, 0x00, 0x24,
-- 0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xf9, 0xf6,
-- 0xbc, 0x3b, 0xe1, 0xfd, 0x10, 0x22, 0xf9, 0xfa,
-- 0xbc, 0x38, 0xe1, 0xfd, 0x10, 0x23, 0xf9, 0xfd,
-- 0xbc, 0x3c, 0x1e, 0xe0, 0xea, 0x03, 0x15, 0x63,
-- 0xfa, 0x02, 0xbe, 0xfc, 0xdc, 0x12, 0x0e, 0xde,
-- 0xfa, 0x09, 0xc0, 0x24, 0x30, 0x30, 0xf6, 0x09,
-- 0x2c, 0x00, 0xd0, 0x2c, 0x6c, 0x00, 0x1e, 0xe0,
-- 0xea, 0x0f, 0xcc, 0x24, 0x1c, 0x1f, 0xd9, 0x40,
-- 0x06, 0x50, 0xea, 0x22, 0xc0, 0x24, 0xb0, 0x12,
-- 0xfe, 0x22, 0xd9, 0x74, 0x79, 0x65, 0x19, 0x5f,
-- 0x30, 0x25, 0xee, 0x1b, 0x29, 0x40, 0x19, 0x5f,
-- 0x19, 0x41, 0xc0, 0x25, 0x20, 0x30, 0x30, 0x24,
-- 0xe6, 0x22, 0x3c, 0x00, 0xd0, 0x38, 0x69, 0x40,
-- 0x1c, 0x05, 0xbc, 0x38, 0x3c, 0x32, 0x5c, 0x3b,
-- 0xbc, 0x3f, 0xd8, 0xec, 0x78, 0xe3, 0xc0, 0xa3,
-- 0x10, 0xb2, 0xf6, 0x2f, 0xd0, 0x92, 0x02, 0xe4,
-- 0xd8, 0x00, 0xd0, 0xc0, 0x20, 0xe0, 0xb0, 0x81,
-- 0xee, 0x32, 0xd0, 0x30, 0x60, 0xc0, 0x00, 0xac,
-- 0xd0, 0x20, 0xc0, 0xc0, 0xd8, 0x40, 0xc1, 0x23,
-- 0xd4, 0x64, 0x34, 0x63, 0xdc, 0x40, 0x0c, 0x1f,
-- 0xfa, 0x5b, 0xc0, 0x65, 0xb0, 0x41, 0xe6, 0x47,
-- 0x68, 0x40, 0xb0, 0x3c, 0xe2, 0x42, 0xc0, 0xc0,
-- 0x34, 0x65, 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f,
-- 0x20, 0xf1, 0x15, 0x63, 0xfa, 0x5c, 0xf2, 0x54,
-- 0xc1, 0x11, 0xc0, 0x83, 0xf2, 0xa5, 0xe2, 0x6f,
-- 0xb1, 0x01, 0xe6, 0x5a, 0x68, 0x40, 0x28, 0x60,
-- 0xb0, 0x3c, 0xe2, 0x54, 0x0f, 0xc5, 0xd9, 0x40,
-- 0xb1, 0x12, 0x11, 0x01, 0x21, 0x25, 0xf2, 0x54,
-- 0xc1, 0x11, 0xb1, 0x01, 0xe6, 0x6f, 0x20, 0x31,
-- 0x68, 0x40, 0x30, 0x31, 0xb0, 0x3c, 0x28, 0x60,
-- 0x70, 0x43, 0x30, 0x31, 0x60, 0x40, 0x20, 0x31,
-- 0xb0, 0x3c, 0xb0, 0xf8, 0xe2, 0x61, 0xe2, 0xf7,
-- 0xd8, 0xec, 0x78, 0xe3, 0x00, 0xa8, 0xd0, 0x80,
-- 0x00, 0xa8, 0xd1, 0x44, 0x00, 0xac, 0xd0, 0x20,
-- 0xc0, 0xc0, 0x0c, 0x1f, 0xfa, 0xb3, 0xd9, 0x78,
-- 0x79, 0x65, 0x39, 0x25, 0x19, 0x5f, 0xc9, 0xa5,
-- 0x19, 0x83, 0x20, 0x26, 0x20, 0xe6, 0x20, 0xa6,
-- 0x21, 0x66, 0xc1, 0x23, 0xc0, 0x64, 0x10, 0x5f,
-- 0x10, 0x9d, 0x20, 0x81, 0x31, 0x01, 0x30, 0x44,
-- 0xf6, 0x8e, 0x21, 0x01, 0x30, 0x84, 0x10, 0x83,
-- 0xc4, 0x64, 0x34, 0x63, 0xdc, 0x48, 0x4c, 0x70,
-- 0x1c, 0x5f, 0x15, 0x63, 0xfa, 0xc3, 0x20, 0xb1,
-- 0xf2, 0xa5, 0xc1, 0x24, 0x11, 0x1f, 0xc0, 0x85,
-- 0x30, 0xb1, 0xf2, 0xa5, 0xc1, 0x11, 0xc0, 0x83,
-- 0x0c, 0x9d, 0xfa, 0xa3, 0xb0, 0xbc, 0xf2, 0xa5,
-- 0xe2, 0xec, 0xb1, 0x01, 0xe6, 0x5a, 0x70, 0x42,
-- 0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x3c, 0xe2, 0xa5,
-- 0xb1, 0x01, 0xe6, 0x5a, 0x70, 0x42, 0xb0, 0xb8,
-- 0x60, 0x40, 0xb0, 0x38, 0xe2, 0xac, 0x00, 0xac,
-- 0xd0, 0x24, 0xc1, 0x23, 0xb1, 0x12, 0xf2, 0xac,
-- 0xd1, 0x24, 0x31, 0x23, 0x00, 0xa8, 0xd0, 0x84,
-- 0xf2, 0xac, 0xd1, 0x12, 0x00, 0xa8, 0xd0, 0x84,
-- 0xc0, 0x03, 0xf2, 0xac, 0xe2, 0xec, 0xd8, 0x82,
-- 0x48, 0x95, 0x18, 0x81, 0xb1, 0x01, 0xe6, 0xd9,
-- 0x20, 0xb1, 0x70, 0x42, 0x30, 0xb1, 0x20, 0x22,
-- 0x60, 0x40, 0x30, 0x22, 0xb0, 0xbc, 0xb0, 0x3c,
-- 0x30, 0xb1, 0x70, 0x42, 0x20, 0xb1, 0x30, 0x22,
-- 0x60, 0x40, 0x20, 0x22, 0xb0, 0xbc, 0xb0, 0x3c,
-- 0xe2, 0xc6, 0xc1, 0x11, 0xc0, 0x85, 0x30, 0xb1,
-- 0x20, 0xe2, 0xb1, 0x01, 0xe6, 0xec, 0x70, 0x42,
-- 0xb0, 0xb8, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22,
-- 0xb0, 0x3c, 0x70, 0x43, 0xb0, 0xf8, 0x30, 0x22,
-- 0x60, 0x40, 0x20, 0x22, 0xb0, 0x3c, 0xe2, 0xdd,
-- 0xd0, 0x08, 0x5c, 0x00, 0x3c, 0x32, 0xd0, 0x04,
-- 0x40, 0x30, 0x3c, 0x00, 0x15, 0x63, 0xfa, 0xf7,
-- 0x1e, 0xe0, 0xea, 0xf7, 0xbc, 0x3c, 0x00, 0xac,
-- 0xd0, 0xa0, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0x20,
-- 0xd1, 0x24, 0x70, 0x42, 0xb0, 0xbc, 0x60, 0x40,
-- 0xb0, 0x3c, 0xb1, 0x01, 0xee, 0xfd, 0xd0, 0x30,
-- 0x30, 0x30, 0xef, 0x03, 0xd0, 0x04, 0x63, 0x00,
-- 0x08, 0x20, 0xd0, 0x40, 0x3f, 0x01, 0x02, 0xba,
-- 0xde, 0x3c, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00,
-- 0x01, 0x46, 0xd0, 0x08, 0x94, 0x89, 0xd0, 0x8c,
-- 0x44, 0x82, 0x14, 0x9e, 0x30, 0x12, 0xd0, 0x88,
-- 0x10, 0x80, 0x00, 0xe8, 0xd1, 0x80, 0x70, 0xc6,
-- 0x00, 0x06, 0xa0, 0xbd, 0xa0, 0xfc, 0x80, 0x3f,
-- 0xb1, 0xbe, 0x60, 0xc6, 0x00, 0x06, 0x80, 0xa9,
-- 0x80, 0x3f, 0x80, 0x2a, 0x80, 0x3f, 0x00, 0x21,
-- 0xd0, 0x3c, 0x00, 0x0a, 0xb1, 0x82, 0xd0, 0x6b,
-- 0x70, 0x46, 0x00, 0x06, 0x80, 0x07, 0x01, 0x20,
-- 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29,
-- 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f,
-- 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29,
-- 0x80, 0x2b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08,
-- 0xa0, 0x27, 0x90, 0x09, 0xd0, 0x41, 0x40, 0x01,
-- 0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0xa0, 0x27,
-- 0x80, 0x3f, 0x00, 0xc6, 0x15, 0x63, 0xe9, 0xae,
-- 0x05, 0x5e, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x40,
-- 0x70, 0x81, 0x10, 0x9c, 0xb0, 0x96, 0xf9, 0xb7,
-- 0x00, 0x21, 0xd0, 0x40, 0xe1, 0xbb, 0xb0, 0x96,
-- 0xf9, 0xbe, 0x00, 0x22, 0xd0, 0x40, 0x27, 0xc1,
-- 0x27, 0x41, 0x27, 0x81, 0x90, 0x83, 0x00, 0x64,
-- 0xd0, 0x10, 0x60, 0x80, 0x01, 0x46, 0x82, 0x34,
-- 0x80, 0x3f, 0x00, 0x64, 0xd0, 0x14, 0x67, 0x40,
-- 0x80, 0x34, 0x80, 0x3f, 0x00, 0xc6, 0x90, 0xae,
-- 0x00, 0x64, 0xd0, 0x18, 0x60, 0x80, 0x90, 0xa6,
-- 0x00, 0x64, 0xd0, 0x1c, 0x60, 0x80, 0x15, 0x63,
-- 0xe9, 0xe3, 0x0c, 0x1f, 0xe9, 0xe3, 0x05, 0x50,
-- 0xf9, 0xe3, 0x15, 0xa3, 0xf9, 0xe3, 0x90, 0x4d,
-- 0x10, 0x60, 0xe5, 0xdb, 0x00, 0x06, 0x05, 0x0d,
-- 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x15, 0xa3,
-- 0xf9, 0xfb, 0x00, 0x21, 0xd0, 0x04, 0x70, 0x00,
-- 0x10, 0x21, 0xe9, 0xfb, 0xd0, 0x38, 0x70, 0x00,
-- 0x15, 0x63, 0xe9, 0xef, 0x10, 0x1f, 0x15, 0x21,
-- 0xe5, 0xe0, 0xd0, 0x64, 0x30, 0x54, 0xe5, 0xe0,
-- 0xc0, 0x40, 0xb0, 0x7f, 0x30, 0x54, 0xe9, 0xfb,
-- 0x0c, 0x09, 0x05, 0x0d, 0xe1, 0xef, 0xc0, 0x5f,
-- 0x10, 0x58, 0x10, 0x48, 0x00, 0xee, 0xd0, 0x8c,
-- 0xd0, 0xc3, 0x70, 0x02, 0x30, 0x01, 0xea, 0x10,
-- 0xb0, 0xbc, 0xb0, 0xc1, 0xee, 0x01, 0x00, 0x26,
-- 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40,
-- 0x15, 0xa3, 0xea, 0x0f, 0xb0, 0x88, 0x77, 0xc2,
-- 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40,
-- 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c,
-- 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9,
-- 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x1a, 0x0c, 0x49,
-- 0x00, 0x8d, 0xc0, 0x42, 0x10, 0x60, 0xea, 0x2a,
-- 0xb0, 0x5e, 0xb0, 0x43, 0xfe, 0x34, 0xd0, 0x61,
-- 0x23, 0x81, 0xe2, 0x1f, 0x0c, 0x09, 0x05, 0x0d,
-- 0x15, 0x20, 0xfe, 0x31, 0xd0, 0x65, 0x30, 0x54,
-- 0xee, 0x10, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46,
-- 0xc6, 0xd4, 0xb6, 0xc1, 0xe6, 0x31, 0xd0, 0x64,
-- 0x30, 0x5b, 0xfe, 0x31, 0xd7, 0x00, 0xb7, 0x01,
-- 0xd3, 0x81, 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x81,
-- 0x60, 0x80, 0x15, 0x63, 0xfa, 0x54, 0x00, 0x22,
-- 0xdc, 0xd8, 0x03, 0xf8, 0xd0, 0x10, 0xf0, 0x4a,
-- 0x15, 0xa3, 0xfa, 0x51, 0x02, 0xf7, 0xdc, 0x26,
-- 0x0c, 0x10, 0xf8, 0x46, 0x02, 0xfc, 0xd8, 0x22,
-- 0xe0, 0x46, 0x02, 0xf2, 0xd6, 0x2b, 0xe0, 0x46,
-- 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xfa, 0xd0, 0x10,
-- 0xf0, 0x4a, 0x03, 0x35, 0xda, 0x20, 0x15, 0xa3,
-- 0xe8, 0x46, 0x03, 0x30, 0xdc, 0x27, 0xe0, 0x46,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xe0, 0xe1, 0xec, 0xe2, 0x12,
-- 0xe2, 0x14, 0xe1, 0xc7, 0xe1, 0x30, 0x30, 0x5a,
-- 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54,
-- 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11,
-- 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20,
-- 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19,
-- 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xde,
-- 0xf9, 0xba, 0x03, 0xdf, 0xe9, 0x99, 0xd3, 0x40,
-- 0xca, 0x50, 0xd1, 0x42, 0xe2, 0xea, 0xc0, 0x50,
-- 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92,
-- 0x10, 0xe0, 0xe5, 0xa8, 0xc0, 0x01, 0x10, 0x01,
-- 0x20, 0x40, 0xc0, 0x02, 0x10, 0x01, 0x20, 0x80,
-- 0x10, 0x60, 0xfd, 0xab, 0xb0, 0x7f, 0x10, 0xa0,
-- 0xfd, 0xae, 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f,
-- 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83,
-- 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80,
-- 0x50, 0x42, 0x0f, 0xc5, 0xcb, 0xaa, 0xcb, 0xeb,
-- 0xca, 0x50, 0xd0, 0xc0, 0xb0, 0xc1, 0xf1, 0x9b,
-- 0xcb, 0x01, 0xd0, 0xc1, 0xf1, 0x9b, 0xcb, 0x41,
-- 0xba, 0x7f, 0xbb, 0x3f, 0xe2, 0xea, 0xcc, 0x5b,
-- 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43,
-- 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f,
-- 0x06, 0xd0, 0xe9, 0xd5, 0x01, 0x69, 0xd0, 0x20,
-- 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f,
-- 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00,
-- 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e,
-- 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe5,
-- 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xec, 0x80, 0x07,
-- 0xd4, 0x00, 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95,
-- 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c,
-- 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xfa, 0x06, 0x5e,
-- 0xfa, 0x03, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3,
-- 0xf9, 0xfa, 0xd3, 0xc4, 0x06, 0x5e, 0xfa, 0x03,
-- 0xd0, 0x43, 0x40, 0x4c, 0xea, 0x03, 0x08, 0x49,
-- 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46,
-- 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xea, 0x0a,
-- 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02,
-- 0xb0, 0x20, 0x03, 0x19, 0xea, 0x10, 0xb0, 0x20,
-- 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80,
-- 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0,
-- 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xd3, 0xe1, 0xdc, 0xe2, 0x00,
-- 0xe2, 0x02, 0xe1, 0xac, 0xe1, 0x30, 0x30, 0x5a,
-- 0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54,
-- 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11,
-- 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e,
-- 0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70,
-- 0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19,
-- 0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf,
-- 0xe9, 0xa1, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52,
-- 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x52,
-- 0xe1, 0xa5, 0x03, 0x1d, 0xf9, 0xa8, 0xca, 0x12,
-- 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e,
-- 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea,
-- 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80,
-- 0x17, 0x20, 0xf9, 0xd2, 0x00, 0xa8, 0xd0, 0x00,
-- 0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31,
-- 0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1,
-- 0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69,
-- 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc4, 0x3c, 0x80,
-- 0x0e, 0xd9, 0xe9, 0xc7, 0x3e, 0xc0, 0x3e, 0xf2,
-- 0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05,
-- 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30,
-- 0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xd3, 0xc2,
-- 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xd8, 0xf2, 0x32,
-- 0xb3, 0x81, 0xe9, 0xdc, 0x80, 0x07, 0xe2, 0x95,
-- 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c,
-- 0xe9, 0xe8, 0x06, 0x5e, 0xf9, 0xf1, 0x08, 0x89,
-- 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xe8, 0xd3, 0xc4,
-- 0x06, 0x5e, 0xf9, 0xf1, 0xd0, 0x43, 0x40, 0x4c,
-- 0xe9, 0xf1, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87,
-- 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6,
-- 0x03, 0x1c, 0xe9, 0xf8, 0x09, 0x49, 0x00, 0x0d,
-- 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19,
-- 0xe9, 0xfe, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b,
-- 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50,
-- 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xc1, 0xe1, 0xca, 0xe1, 0xee,
-- 0xe1, 0xf0, 0xe1, 0xa8, 0xe1, 0x30, 0x30, 0x5a,
-- 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54,
-- 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x64, 0x30, 0x5b, 0xfc, 0x11,
-- 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20,
-- 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19,
-- 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xdf,
-- 0xe9, 0x9d, 0xd3, 0x40, 0xca, 0x50, 0xcb, 0x52,
-- 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x52,
-- 0xe1, 0xa1, 0x03, 0x1d, 0xf9, 0xa4, 0xca, 0x12,
-- 0xca, 0x53, 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e,
-- 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea,
-- 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31,
-- 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1,
-- 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xb6, 0x01, 0x69,
-- 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08,
-- 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30,
-- 0x70, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4,
-- 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0,
-- 0xed, 0xc6, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xca,
-- 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c,
-- 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xd6, 0x06, 0x5e,
-- 0xf9, 0xdf, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3,
-- 0xf9, 0xd6, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xdf,
-- 0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xdf, 0x08, 0x49,
-- 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46,
-- 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe6,
-- 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02,
-- 0xb0, 0x20, 0x03, 0x19, 0xe9, 0xec, 0xb0, 0x20,
-- 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80,
-- 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0,
-- 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xdb, 0xe1, 0xe9, 0xe2, 0x00,
-- 0xe2, 0x02, 0xe1, 0xc3, 0xe1, 0x65, 0x30, 0x5a,
-- 0xe5, 0x8d, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54,
-- 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfc, 0x11,
-- 0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20,
-- 0xe9, 0x88, 0x03, 0x10, 0xe9, 0x93, 0x0f, 0x19,
-- 0xf9, 0x8f, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0,
-- 0xf9, 0x98, 0xca, 0x50, 0x03, 0xde, 0xf9, 0x9a,
-- 0xd1, 0x42, 0xe2, 0xea, 0xcb, 0xaa, 0xcb, 0xeb,
-- 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90, 0x10, 0x8c,
-- 0x10, 0x92, 0xd0, 0xc1, 0x05, 0x50, 0xe9, 0xa5,
-- 0xb0, 0xc2, 0x10, 0x60, 0xfd, 0xa8, 0xb0, 0x7f,
-- 0x10, 0xa0, 0xfd, 0xab, 0xb0, 0xbf, 0x10, 0x5f,
-- 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e, 0x20, 0x52,
-- 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c, 0x10, 0x82,
-- 0x40, 0x80, 0x50, 0x42, 0xd0, 0x81, 0x14, 0x1f,
-- 0x14, 0x01, 0x05, 0x50, 0xe9, 0xbd, 0x50, 0x42,
-- 0xe1, 0xbe, 0x54, 0x02, 0xca, 0x10, 0xca, 0x50,
-- 0xcb, 0x01, 0xcb, 0x41, 0xe2, 0xea, 0xcc, 0x5b,
-- 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43,
-- 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f,
-- 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50,
-- 0xf9, 0xd2, 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80,
-- 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80, 0x02, 0xe4,
-- 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0,
-- 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xe0, 0xf2, 0x32,
-- 0xb3, 0x81, 0xe9, 0xe9, 0x80, 0x07, 0xd4, 0x02,
-- 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50, 0xd3, 0x08,
-- 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56, 0x00, 0x48,
-- 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xf7,
-- 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xf6,
-- 0xd3, 0xc4, 0xe1, 0xf7, 0xb3, 0xc1, 0x01, 0x46,
-- 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xfe,
-- 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b,
-- 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x02, 0x44, 0x15,
-- 0x14, 0x1f, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0,
-- 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xc9, 0xe1, 0xd2, 0xe1, 0xe7,
-- 0xe1, 0xe9, 0xe1, 0xab, 0xe1, 0x30, 0x30, 0x5a,
-- 0xe5, 0x91, 0x06, 0x50, 0xe9, 0x83, 0xc0, 0x54,
-- 0x30, 0x5b, 0xb0, 0x42, 0xf8, 0x11, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x52, 0x30, 0x5b, 0xfc, 0x11,
-- 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x8e,
-- 0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70,
-- 0xed, 0x8e, 0x03, 0x10, 0xe9, 0x97, 0x0f, 0x19,
-- 0xf9, 0x93, 0xd1, 0x44, 0xe1, 0x79, 0x03, 0xd0,
-- 0xf9, 0xa0, 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d,
-- 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa4,
-- 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12, 0xca, 0x53,
-- 0xca, 0xae, 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e,
-- 0xfa, 0xea, 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24,
-- 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20,
-- 0xf9, 0xc8, 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b,
-- 0x20, 0x1b, 0x05, 0x50, 0xf9, 0xb8, 0xb0, 0x3f,
-- 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f,
-- 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xc1,
-- 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f,
-- 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1,
-- 0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0,
-- 0xed, 0xce, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xd2,
-- 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c,
-- 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xde, 0x08, 0x89,
-- 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xdd, 0xd3, 0xc4,
-- 0xe1, 0xde, 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c,
-- 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xe5, 0x09, 0x49,
-- 0x00, 0x0d, 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f,
-- 0xfa, 0x7f, 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90,
-- 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xa3, 0xc0, 0x00, 0xc0, 0x00,
-- 0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x30, 0x30, 0x5a,
-- 0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64,
-- 0x30, 0x5b, 0xfd, 0xb4, 0xc0, 0x39, 0x30, 0x31,
-- 0x10, 0x12, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42,
-- 0xd3, 0x40, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42,
-- 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40,
-- 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0,
-- 0xe9, 0x98, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80,
-- 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40,
-- 0x2c, 0x80, 0x01, 0xb5, 0xd4, 0x00, 0x2c, 0x80,
-- 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xf2, 0xd3,
-- 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc8,
-- 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20,
-- 0xe9, 0xbf, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41,
-- 0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc8,
-- 0x0f, 0x17, 0xf9, 0xb4, 0x0f, 0x49, 0xf2, 0xd3,
-- 0x0f, 0x19, 0xf9, 0xb8, 0xdf, 0x00, 0x00, 0x06,
-- 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b,
-- 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc8, 0x0f, 0x17,
-- 0xf9, 0xc3, 0x02, 0xf2, 0xd6, 0x2b, 0xe0, 0x46,
-- 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xb5, 0xc0, 0x00, 0xc0, 0x00,
-- 0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a,
-- 0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x64,
-- 0x30, 0x5b, 0xfd, 0xc6, 0xbc, 0x10, 0xd0, 0x10,
-- 0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x30,
-- 0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42,
-- 0xd3, 0x40, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00,
-- 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xb4,
-- 0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f,
-- 0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c,
-- 0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f,
-- 0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99,
-- 0xe9, 0xa6, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xa9,
-- 0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01,
-- 0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40,
-- 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80,
-- 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f,
-- 0x30, 0x5a, 0xe5, 0xda, 0x00, 0x26, 0xd0, 0x00,
-- 0x70, 0x00, 0x10, 0x20, 0xe9, 0xd1, 0x00, 0xe0,
-- 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b,
-- 0xb0, 0x41, 0xed, 0xda, 0x0f, 0x17, 0xf9, 0xc6,
-- 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xca,
-- 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29,
-- 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e,
-- 0xe5, 0xda, 0x0f, 0x17, 0xf9, 0xd5, 0x02, 0xf7,
-- 0xdc, 0x26, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0,
-- 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xa2, 0xc0, 0x00, 0xc0, 0x00,
-- 0xc0, 0x00, 0xe1, 0x8a, 0xe1, 0x65, 0x30, 0x5a,
-- 0xe5, 0x87, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52,
-- 0x30, 0x5b, 0xfd, 0xb3, 0xc0, 0x39, 0x30, 0x31,
-- 0x10, 0x11, 0x10, 0x20, 0xe9, 0x82, 0xd1, 0x42,
-- 0xd3, 0x41, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42,
-- 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40,
-- 0x1c, 0x49, 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c,
-- 0x10, 0x08, 0x20, 0x1f, 0x05, 0x50, 0xf9, 0x99,
-- 0xb0, 0x3c, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0xb5,
-- 0xd4, 0x00, 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80,
-- 0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c,
-- 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xc7, 0x00, 0x26,
-- 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbe,
-- 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b,
-- 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xc7, 0x0f, 0x17,
-- 0xf9, 0xb3, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19,
-- 0xf9, 0xb7, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb4,
-- 0xd6, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54,
-- 0xb0, 0x7e, 0xe5, 0xc7, 0x0f, 0x17, 0xf9, 0xc2,
-- 0x03, 0x30, 0xdc, 0x27, 0xe0, 0x46, 0xd3, 0x08,
-- 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00, 0x50, 0x00,
-- 0x03, 0x76, 0xd0, 0x73, 0x00, 0x24, 0xdc, 0xd8,
-- 0xf0, 0x4a, 0xe1, 0xac, 0xc0, 0x00, 0xc0, 0x00,
-- 0xc0, 0x00, 0xe1, 0x8e, 0xe1, 0x30, 0x30, 0x5a,
-- 0xe5, 0x8b, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x52,
-- 0x30, 0x5b, 0xfd, 0xbd, 0xbc, 0x10, 0xd0, 0x10,
-- 0x0c, 0x1e, 0xf9, 0x88, 0xbc, 0x10, 0xd0, 0x20,
-- 0xc0, 0x40, 0x30, 0x70, 0xed, 0x88, 0xd1, 0x42,
-- 0xd3, 0x41, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00,
-- 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xab,
-- 0x00, 0x2a, 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b,
-- 0x05, 0x50, 0xf9, 0x9b, 0xb0, 0x3f, 0x10, 0x02,
-- 0x7c, 0x40, 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69,
-- 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa4, 0x3c, 0x80,
-- 0xde, 0xa0, 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30,
-- 0x70, 0x00, 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e,
-- 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a,
-- 0xe5, 0xd1, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00,
-- 0x10, 0x20, 0xe9, 0xc8, 0x00, 0xe0, 0xd0, 0x44,
-- 0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41,
-- 0xed, 0xd1, 0x0f, 0x17, 0xf9, 0xbd, 0x0f, 0x49,
-- 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xc1, 0xdf, 0x00,
-- 0x00, 0x06, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46,
-- 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xd1,
-- 0x0f, 0x17, 0xf9, 0xcc, 0x03, 0x35, 0xda, 0x20,
-- 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95,
-- 0xd0, 0x61, 0x23, 0x81, 0x0c, 0x49, 0xd0, 0x61,
-- 0x00, 0x8d, 0x10, 0xa0, 0xea, 0x3b, 0x30, 0x42,
-- 0xe6, 0x30, 0x23, 0x82, 0x0f, 0xc5, 0x0c, 0x09,
-- 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x45, 0xd0, 0x65,
-- 0x15, 0x63, 0xea, 0x43, 0xd0, 0x53, 0x30, 0x54,
-- 0xee, 0x4a, 0x0f, 0x17, 0xfa, 0x45, 0x03, 0xb4,
-- 0xd6, 0x29, 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49,
-- 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0,
-- 0x00, 0x4d, 0xa0, 0x6c, 0xd0, 0xa1, 0x00, 0x88,
-- 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xfa, 0x53,
-- 0xf2, 0x32, 0xd3, 0x80, 0xe1, 0x76, 0xd1, 0xc2,
-- 0x41, 0xcf, 0x11, 0xdf, 0xd0, 0x41, 0x01, 0xc1,
-- 0x00, 0xef, 0xd0, 0xbe, 0x03, 0x10, 0xf9, 0x77,
-- 0x80, 0x07, 0x21, 0x96, 0x11, 0xa2, 0xe9, 0x78,
-- 0x03, 0x1d, 0xea, 0x73, 0xc0, 0xd7, 0xc2, 0x90,
-- 0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x72,
-- 0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x03, 0x1e,
-- 0xea, 0x8d, 0xc0, 0xd8, 0xc2, 0x92, 0xf2, 0xa4,
-- 0xc4, 0x8a, 0x03, 0xd0, 0xea, 0x7d, 0xc2, 0x93,
-- 0xf2, 0xa4, 0xc4, 0xca, 0xe2, 0x8d, 0xd3, 0xc0,
-- 0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a,
-- 0x03, 0xd0, 0xea, 0x88, 0xc2, 0x91, 0xf2, 0xa4,
-- 0xc4, 0x4a, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x61,
-- 0xf8, 0x11, 0x03, 0x1f, 0xea, 0x93, 0x0d, 0xc9,
-- 0x00, 0x4d, 0xd0, 0x1a, 0xe2, 0x98, 0x03, 0x10,
-- 0xfa, 0x97, 0xd0, 0x1d, 0xe2, 0x98, 0xd0, 0x18,
-- 0x0f, 0x16, 0xfa, 0x98, 0xd0, 0x4c, 0x40, 0x4c,
-- 0x10, 0x6c, 0xea, 0xa2, 0x03, 0xde, 0xfa, 0xa2,
-- 0x0f, 0x12, 0xfa, 0xa0, 0x00, 0x08, 0xe2, 0xd9,
-- 0xd2, 0x00, 0x13, 0xe1, 0xee, 0xa9, 0x08, 0x49,
-- 0x02, 0x0d, 0x00, 0xc8, 0xc2, 0xca, 0x12, 0x94,
-- 0xd0, 0x1f, 0x30, 0x07, 0x12, 0xc0, 0xc2, 0x43,
-- 0x12, 0x5a, 0x00, 0x0d, 0x03, 0xde, 0xea, 0xb6,
-- 0x0e, 0xc9, 0x04, 0x8d, 0x02, 0x48, 0x22, 0x80,
-- 0x12, 0x88, 0xd0, 0x0b, 0x30, 0x03, 0x12, 0x80,
-- 0xd0, 0x19, 0x20, 0x03, 0x12, 0x80, 0x00, 0x0d,
-- 0x22, 0xc0, 0x12, 0xc8, 0xd0, 0x0b, 0x30, 0x09,
-- 0x12, 0xc0, 0x12, 0xd8, 0xd0, 0x16, 0x20, 0x09,
-- 0x20, 0x07, 0x12, 0xc0, 0x42, 0xc2, 0x22, 0x8b,
-- 0x22, 0x88, 0x03, 0xde, 0xea, 0xd2, 0x0e, 0xc9,
-- 0xc4, 0x4a, 0x04, 0xcd, 0x0f, 0xc5, 0x01, 0x46,
-- 0x90, 0x4d, 0x00, 0xc6, 0x10, 0x60, 0xe6, 0xd3,
-- 0x0f, 0xc5, 0x01, 0xb5, 0xd4, 0x00, 0xca, 0x9d,
-- 0xcb, 0x9e, 0xca, 0xea, 0xcb, 0xee, 0x2a, 0xc0,
-- 0x2b, 0xc0, 0xca, 0x10, 0xca, 0x51, 0xcb, 0x12,
-- 0xcb, 0x53, 0xd1, 0x40, 0xd3, 0x41, 0xb7, 0x3f,
-- 0xc0, 0x5c, 0xe1, 0x7b, 0xd0, 0xc0, 0xc1, 0x28,
-- 0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x0f, 0x17,
-- 0xfa, 0xef, 0xcc, 0xe8, 0xcd, 0x29, 0xcd, 0x6c,
-- 0xcd, 0xad, 0xc8, 0x08, 0xc8, 0x49, 0xca, 0x0a,
-- 0xca, 0x4b, 0xf3, 0x31, 0xd0, 0xc1, 0xc1, 0x34,
-- 0xc2, 0x2a, 0xc2, 0xab, 0xf1, 0x7a, 0x00, 0x28,
-- 0xd9, 0xc0, 0xc8, 0x88, 0xc8, 0xc9, 0xa9, 0xf8,
-- 0xca, 0x8a, 0xca, 0xcb, 0x11, 0x62, 0xe9, 0x79,
-- 0xd0, 0xc0, 0xc1, 0x35, 0xc2, 0x2e, 0xc2, 0xaf,
-- 0xf1, 0x7a, 0xc9, 0x08, 0xc9, 0x49, 0xa9, 0xf8,
-- 0xcb, 0x0a, 0xcb, 0x4b, 0xd0, 0xc1, 0xc1, 0x36,
-- 0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc0, 0x27,
-- 0xc9, 0x88, 0xc9, 0xc9, 0xa0, 0x38, 0xcb, 0x8a,
-- 0xcb, 0xcb, 0xe1, 0x79, 0x5f, 0x0d, 0x07, 0x7d,
-- 0xde, 0x07, 0x11, 0x5e, 0x30, 0x05, 0xcd, 0xc0,
-- 0x00, 0x28, 0xd0, 0x00, 0xa0, 0x38, 0x11, 0x61,
-- 0xf9, 0x75, 0x00, 0xe2, 0xd0, 0x00, 0x0f, 0x1d,
-- 0xeb, 0x29, 0x00, 0x2d, 0xdf, 0x4b, 0xf3, 0x3f,
-- 0xe1, 0x75, 0x04, 0xeb, 0xd0, 0x00, 0x11, 0x62,
-- 0xeb, 0x36, 0xb0, 0x20, 0x0f, 0x19, 0xfb, 0x36,
-- 0xac, 0xe0, 0x01, 0xa4, 0xde, 0x00, 0x5e, 0x0d,
-- 0x00, 0x2d, 0xdf, 0x7a, 0xdd, 0xc0, 0xd8, 0x80,
-- 0xd9, 0x00, 0xd9, 0x80, 0x5f, 0x00, 0x01, 0x46,
-- 0x00, 0x28, 0xd0, 0x01, 0x00, 0x06, 0xa0, 0x37,
-- 0x80, 0x3f, 0x00, 0xc6, 0x0f, 0xc5, 0xad, 0xda,
-- 0xc6, 0xb1, 0xd0, 0x01, 0x01, 0xa3, 0xde, 0x1d,
-- 0x40, 0x30, 0x3e, 0x00, 0x80, 0x3f, 0x0e, 0x0a,
-- 0x66, 0xda, 0xc8, 0x28, 0xc8, 0x69, 0xc8, 0xaa,
-- 0xc8, 0xeb, 0x0c, 0x1e, 0xfb, 0x68, 0x26, 0xba,
-- 0x07, 0x7d, 0xdc, 0x00, 0x1d, 0xcf, 0x1d, 0xd1,
-- 0x5d, 0xc0, 0x00, 0x2d, 0xdf, 0x64, 0x0f, 0x87,
-- 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda,
-- 0xc9, 0x2c, 0xc9, 0x6d, 0xc9, 0xae, 0xc9, 0xef,
-- 0x0f, 0x2f, 0xd0, 0x37, 0x4f, 0x00, 0x0f, 0x1a,
-- 0xeb, 0xbe, 0x01, 0xa4, 0xde, 0x20, 0xd0, 0x01,
-- 0x40, 0x3c, 0x2e, 0x00, 0x00, 0x2d, 0xdf, 0x7a,
-- 0xac, 0xe0, 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe0,
-- 0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x1b, 0xeb, 0x9e,
-- 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe1, 0xbf, 0x79,
-- 0xbe, 0x34, 0x18, 0xa0, 0xeb, 0xb9, 0x0f, 0x87,
-- 0xad, 0x20, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe2,
-- 0xbf, 0x79, 0xbe, 0x3c, 0x0f, 0x87, 0x0e, 0x0a,
-- 0x76, 0xe3, 0x0f, 0x1b, 0xeb, 0xb3, 0xbf, 0x77,
-- 0xbe, 0x0c, 0x19, 0x20, 0xeb, 0xb9, 0x0f, 0x87,
-- 0xad, 0x60, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe4,
-- 0xbe, 0x3c, 0xbf, 0x75, 0x0f, 0x15, 0xf8, 0x1c,
-- 0x1f, 0x0a, 0x1f, 0x16, 0x0f, 0x87, 0x0e, 0x0a,
-- 0x76, 0xe5, 0xbf, 0x79, 0xbe, 0x34, 0x19, 0xa0,
-- 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0xa0, 0x80, 0x3f,
-- 0x0e, 0x0a, 0x76, 0xe6, 0xbe, 0x3c, 0xbf, 0x79,
-- 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe7, 0x0f, 0x15,
-- 0xeb, 0xbe, 0x00, 0x2f, 0xdf, 0x72, 0x1d, 0xe0,
-- 0xf8, 0x1c, 0x00, 0x28, 0xd0, 0x01, 0xa0, 0x38,
-- 0x80, 0x3f, 0x0f, 0x87, 0xd0, 0x01, 0x4d, 0xc0,
-- 0x1f, 0x0f, 0x1f, 0x11, 0x00, 0x2f, 0xdf, 0x76,
-- 0xc6, 0xb2, 0x03, 0x7d, 0xde, 0x0e, 0x01, 0xa3,
-- 0xde, 0x2d, 0x5d, 0xc0, 0x0f, 0x87, 0x1e, 0xe1,
-- 0xeb, 0xdb, 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a,
-- 0x66, 0xda, 0x0c, 0x1e, 0xfb, 0xe4, 0x26, 0xbb,
-- 0x03, 0xff, 0xdd, 0xff, 0x4d, 0xc0, 0x00, 0xa3,
-- 0xde, 0x2d, 0xbf, 0x56, 0x0f, 0x87, 0x07, 0x7d,
-- 0xde, 0x0e, 0x5d, 0xc0, 0x00, 0xa3, 0xde, 0x1d,
-- 0xad, 0xda, 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda,
-- 0xdf, 0x5c, 0xd0, 0x0e, 0x4f, 0x00, 0x0f, 0x87,
-- 0xd0, 0x06, 0x40, 0x3c, 0xeb, 0xf0, 0xbf, 0x3e,
-- 0xb0, 0x04, 0xe7, 0xf2, 0xeb, 0xf6, 0xbf, 0x0c,
-- 0xbf, 0x3a, 0x0f, 0x87, 0x0f, 0x1d, 0xfb, 0x4b,
-- 0xbf, 0x38, 0x0f, 0x87, 0x0f, 0x1c, 0xfb, 0xcb,
-- 0xbf, 0x30, 0x0f, 0x87, 0x50, 0x00, 0x50, 0x00,
-- 0x0f, 0x17, 0xf9, 0x70, 0x90, 0x4d, 0x10, 0x60,
-- 0xe5, 0x72, 0x0f, 0x49, 0x90, 0x4d, 0x10, 0x60,
-- 0xe5, 0x76, 0x0f, 0x19, 0xf9, 0x79, 0x01, 0x46,
-- 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6,
-- 0xdf, 0x00, 0x00, 0x06, 0x08, 0x20, 0xd0, 0x00,
-- 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x1b, 0x0c, 0x20,
-- 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x4d,
-- 0x0f, 0xff, 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d,
-- 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x95,
-- 0xd0, 0x01, 0xa0, 0x09, 0x80, 0x1b, 0xa0, 0x27,
-- 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a,
-- 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54,
-- 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40,
-- 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20,
-- 0xdf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38,
-- 0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37,
-- 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38,
-- 0xd0, 0x10, 0xa0, 0x38, 0x15, 0x63, 0xe9, 0xba,
-- 0x05, 0x5e, 0xf9, 0xfa, 0xc0, 0xdf, 0x00, 0xe0,
-- 0xd1, 0x80, 0x70, 0x06, 0x10, 0x1c, 0xc1, 0x40,
-- 0x11, 0x48, 0xd3, 0x10, 0x00, 0x21, 0xd0, 0x80,
-- 0xb0, 0x16, 0xe9, 0xca, 0xd3, 0x20, 0x10, 0x81,
-- 0xb0, 0x16, 0xf9, 0xfa, 0x30, 0xc2, 0xd2, 0x64,
-- 0xd0, 0x92, 0x00, 0xee, 0xd0, 0x54, 0x70, 0x41,
-- 0x30, 0x43, 0xed, 0xd7, 0xd2, 0x6c, 0x72, 0x49,
-- 0xc0, 0x89, 0xb0, 0xbf, 0x10, 0x9f, 0x22, 0x42,
-- 0x04, 0x31, 0xd0, 0x10, 0xc0, 0x42, 0x30, 0x49,
-- 0xe5, 0xde, 0x10, 0x03, 0xc1, 0x0c, 0xc1, 0x83,
-- 0xb1, 0xbe, 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d,
-- 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc,
-- 0xb1, 0x01, 0xed, 0xe1, 0xc1, 0x0c, 0x21, 0x85,
-- 0x01, 0x46, 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c,
-- 0x60, 0x06, 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01,
-- 0xed, 0xec, 0x02, 0xe4, 0xd0, 0x00, 0x20, 0xc0,
-- 0xb2, 0x41, 0xed, 0xd8, 0x15, 0xa3, 0xfa, 0x00,
-- 0xbc, 0x10, 0x0c, 0x1e, 0xfa, 0x00, 0xbc, 0x10,
-- 0xd0, 0x04, 0x70, 0x00, 0x10, 0x20, 0xfa, 0x00,
-- 0x00, 0x27, 0xd0, 0x10, 0xd0, 0x40, 0x60, 0x40,
-- 0x00, 0x26, 0xd0, 0x14, 0x60, 0x40, 0xb0, 0x28,
-- 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x01, 0x7a,
-- 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00,
-- 0x00, 0x28, 0xd1, 0xb0, 0x70, 0x06, 0xd0, 0x81,
-- 0x60, 0x86, 0x10, 0x20, 0xe9, 0xab, 0xb0, 0x3f,
-- 0x60, 0x06, 0x00, 0xec, 0xd1, 0x84, 0x70, 0x46,
-- 0xb1, 0x84, 0x70, 0x86, 0x30, 0x42, 0xe9, 0xab,
-- 0x70, 0x42, 0xd0, 0x35, 0x30, 0x40, 0xf9, 0xab,
-- 0x00, 0x63, 0xd0, 0x3f, 0xb0, 0xbc, 0x40, 0x80,
-- 0x70, 0xc2, 0x10, 0xe3, 0xe5, 0xab, 0xb0, 0xbc,
-- 0x40, 0x80, 0x60, 0x86, 0x00, 0x28, 0xd0, 0x24,
-- 0x70, 0x40, 0x00, 0x22, 0xd0, 0x80, 0x50, 0x42,
-- 0x60, 0x40, 0x00, 0x64, 0xd0, 0x60, 0xd0, 0x90,
-- 0x60, 0x81, 0x00, 0xed, 0xd1, 0x88, 0x70, 0x46,
-- 0x10, 0xe4, 0xe9, 0xa8, 0x00, 0x21, 0xd0, 0xe8,
-- 0xd0, 0x00, 0x60, 0x03, 0xd0, 0x81, 0x40, 0x42,
-- 0x60, 0x46, 0x02, 0x3c, 0xdc, 0x89, 0xe0, 0x46,
-- 0xd0, 0x82, 0x50, 0x42, 0x60, 0x46, 0x00, 0x23,
-- 0xd5, 0x3e, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46,
-- 0x01, 0x46, 0xdf, 0x5c, 0x08, 0x20, 0xd1, 0x00,
-- 0xcf, 0x04, 0x11, 0x08, 0xa1, 0x0a, 0xa1, 0x1b,
-- 0x11, 0x1f, 0xa1, 0x27, 0xd2, 0x80, 0xb2, 0x81,
-- 0x90, 0x4d, 0xc0, 0x01, 0x10, 0x14, 0x00, 0x16,
-- 0xe9, 0x8d, 0x80, 0x33, 0x80, 0x3f, 0x92, 0x8b,
-- 0x00, 0x23, 0xd0, 0x3f, 0x42, 0x80, 0xe9, 0x8d,
-- 0x0f, 0xff, 0xdf, 0xff, 0x40, 0x01, 0xa0, 0x0d,
-- 0xe1, 0x94, 0xa1, 0x0a, 0x00, 0xea, 0xd0, 0x00,
-- 0xd0, 0x8e, 0x00, 0x06, 0x0f, 0x0b, 0x70, 0x80,
-- 0x80, 0x73, 0x80, 0x0a, 0xd0, 0x00, 0x06, 0x50,
-- 0xf9, 0x9a, 0xd0, 0x01, 0xd0, 0x44, 0x40, 0x70,
-- 0x20, 0x01, 0x15, 0x63, 0xf9, 0xa1, 0x80, 0x1b,
-- 0xe1, 0xa2, 0x80, 0x5b, 0xa0, 0x27, 0x01, 0x20,
-- 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29,
-- 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f,
-- 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69,
-- 0x80, 0x2b, 0x80, 0x07, 0x08, 0x20, 0xd0, 0x00,
-- 0xcf, 0x00, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38,
-- 0x80, 0x3f, 0x01, 0xb2, 0xd2, 0x10, 0xa0, 0x37,
-- 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38,
-- 0x00, 0x30, 0xd0, 0x10, 0xa0, 0x38, 0x80, 0x3f,
-- 0x00, 0xc6, 0x00, 0x28, 0xd1, 0x24, 0x70, 0x04,
-- 0xd0, 0x41, 0x50, 0x01, 0x60, 0x04, 0x00, 0x27,
-- 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40,
-- 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40, 0xb0, 0x7f,
-- 0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0xd4, 0x00,
-- 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0xd3, 0x81,
-- 0x12, 0xa0, 0xed, 0xe3, 0xd0, 0x08, 0x0a, 0x09,
-- 0x00, 0x4d, 0xb0, 0x01, 0xed, 0xdf, 0x03, 0xbf,
-- 0xd4, 0x27, 0xe0, 0x46, 0x50, 0x00, 0x50, 0x00,
-- 0x02, 0x24, 0xd0, 0x00, 0xa0, 0x37, 0x00, 0x27,
-- 0xd3, 0xd0, 0x00, 0x26, 0xd0, 0x04, 0x73, 0xcf,
-- 0x13, 0xe1, 0xe9, 0x7b, 0xb0, 0x3c, 0xf2, 0x00,
-- 0x00, 0x26, 0xd0, 0x40, 0xd0, 0x00, 0x60, 0x01,
-- 0x00, 0x26, 0xd0, 0x14, 0xf2, 0x00, 0x00, 0x26,
-- 0xd0, 0x18, 0xf2, 0x00, 0x00, 0xee, 0xd0, 0x1c,
-- 0x71, 0x40, 0xd1, 0x24, 0x15, 0x63, 0xe9, 0x8d,
-- 0x11, 0x1f, 0xc7, 0x1a, 0xb7, 0x01, 0xd3, 0x81,
-- 0xc4, 0xd4, 0xf2, 0x04, 0x00, 0x26, 0xd0, 0x18,
-- 0x70, 0x40, 0xb0, 0x54, 0xfd, 0x9b, 0x00, 0xed,
-- 0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x13, 0xe1,
-- 0xf9, 0xbc, 0x15, 0xa3, 0xf9, 0xa1, 0x0c, 0x10,
-- 0xe9, 0xb9, 0x11, 0x61, 0xe5, 0xb3, 0xed, 0xb9,
-- 0x15, 0xa3, 0xf9, 0xab, 0x00, 0x26, 0xd0, 0x14,
-- 0x70, 0x40, 0x10, 0x62, 0xf5, 0xb3, 0x15, 0x22,
-- 0xe5, 0xb3, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb3,
-- 0x34, 0xd4, 0xf5, 0xb3, 0xe1, 0xbf, 0x03, 0xb4,
-- 0xd6, 0x29, 0x00, 0x26, 0xd0, 0x40, 0x60, 0x01,
-- 0xe1, 0xdb, 0x03, 0xb4, 0xd6, 0x29, 0xe0, 0x46,
-- 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x80, 0x07,
-- 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80,
-- 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80,
-- 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d,
-- 0x00, 0x50, 0xf9, 0xc9, 0x0c, 0x49, 0xd0, 0x61,
-- 0x00, 0x8d, 0x10, 0xa0, 0xe9, 0x90, 0x30, 0x42,
-- 0xf5, 0xd8, 0xd0, 0x61, 0x23, 0x81, 0xe1, 0xce,
-- 0x23, 0x82, 0x13, 0xa1, 0xf9, 0x90, 0xd0, 0x42,
-- 0x15, 0xa1, 0xf9, 0xdf, 0xb0, 0x7f, 0x00, 0x26,
-- 0xd0, 0x14, 0x70, 0x00, 0x30, 0x01, 0xf5, 0xe8,
-- 0x16, 0xe0, 0xe5, 0xe8, 0xb6, 0xc1, 0xbc, 0x20,
-- 0xc0, 0x44, 0x30, 0x5b, 0xfd, 0xb9, 0xc0, 0x44,
-- 0x30, 0x54, 0xe5, 0xb9, 0x15, 0x63, 0xf9, 0xf8,
-- 0x15, 0xa3, 0xf9, 0xf5, 0x03, 0x3c, 0xd8, 0x1c,
-- 0xe0, 0x46, 0x03, 0x39, 0xda, 0x17, 0xe0, 0x46,
-- 0x15, 0xa3, 0xf9, 0xfd, 0x03, 0x72, 0xde, 0x19,
-- 0xe0, 0x46, 0x03, 0x70, 0xd0, 0x17, 0xe0, 0x46,
-- 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x0f, 0xc5,
-- 0xdf, 0x00, 0x0c, 0x09, 0x05, 0x0d, 0x08, 0x20,
-- 0xdf, 0x00, 0x0f, 0xc5, 0x50, 0x00, 0x50, 0x00,
-- 0x00, 0xef, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x60,
-- 0xe9, 0x45, 0xb0, 0x04, 0x70, 0x40, 0xb0, 0x41,
-- 0xed, 0x44, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44,
-- 0x60, 0x40, 0x00, 0x64, 0xd0, 0x20, 0x70, 0x00,
-- 0x10, 0x30, 0xe9, 0x45, 0x00, 0x21, 0xd0, 0x28,
-- 0x60, 0x40, 0x00, 0x64, 0xd2, 0xc0, 0x70, 0x0b,
-- 0x00, 0x11, 0xe9, 0x6a, 0x08, 0x20, 0xd0, 0x4f,
-- 0x30, 0x40, 0xe9, 0x55, 0xb0, 0x4f, 0xf9, 0x6a,
-- 0x03, 0xef, 0xdf, 0xbf, 0xaf, 0xb8, 0xdf, 0x80,
-- 0x0f, 0x87, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20,
-- 0xed, 0x6c, 0xdf, 0x84, 0xd0, 0x40, 0x60, 0x7e,
-- 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60,
-- 0x01, 0xa0, 0xd0, 0x40, 0xa0, 0x78, 0x80, 0x34,
-- 0x80, 0x3f, 0x01, 0x3c, 0xd2, 0x39, 0x00, 0x21,
-- 0xdf, 0x86, 0x0f, 0x87, 0xd0, 0x40, 0x60, 0x4b,
-- 0x03, 0xe6, 0xd0, 0x08, 0xe0, 0x36, 0x50, 0x00,
-- 0x00, 0x28, 0xd0, 0x24, 0x72, 0xc0, 0xd0, 0x40,
-- 0x60, 0x40, 0xd0, 0x0c, 0x52, 0xc0, 0xc0, 0x1c,
-- 0x30, 0x1d, 0xf5, 0x3c, 0x20, 0x1f, 0x30, 0x1e,
-- 0x90, 0x6d, 0x20, 0x01, 0x00, 0x22, 0xd0, 0x58,
-- 0x60, 0x01, 0x00, 0xe3, 0xd0, 0x48, 0x70, 0x41,
-- 0x30, 0x40, 0xf5, 0x47, 0xb2, 0xc8, 0x00, 0xe3,
-- 0xd0, 0x4c, 0x70, 0x41, 0x30, 0x40, 0xfd, 0x4d,
-- 0xb2, 0xc4, 0x00, 0x28, 0xd0, 0x20, 0x70, 0x00,
-- 0x42, 0xc0, 0xa2, 0xc5, 0x12, 0xe0, 0xe9, 0x55,
-- 0x80, 0x40, 0x80, 0x34, 0x80, 0x3f, 0xcf, 0x95,
-- 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe8, 0xd0, 0x00,
-- 0x1f, 0xa3, 0xe9, 0x60, 0x03, 0xea, 0xd0, 0x00,
-- 0x00, 0x27, 0xd0, 0x4c, 0x7f, 0x81, 0x00, 0x27,
-- 0xd0, 0x54, 0x70, 0x41, 0x10, 0x60, 0x03, 0xa0,
-- 0xd0, 0x40, 0xa0, 0x78, 0xe0, 0x3c, 0x50, 0x00,
-- 0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0x41,
-- 0x30, 0x4d, 0x40, 0x43, 0x10, 0x43, 0x20, 0x81,
-- 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c, 0x20, 0x9b,
-- 0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42,
-- 0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02,
-- 0x10, 0x97, 0x01, 0xd0, 0xe9, 0x48, 0xb0, 0x96,
-- 0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48,
-- 0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42,
-- 0x41, 0x0d, 0x11, 0x02, 0x20, 0x44, 0x22, 0x01,
-- 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca,
-- 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5e, 0xc2, 0xca,
-- 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48, 0xd0, 0x78,
-- 0x03, 0x50, 0xf9, 0x69, 0xd0, 0x7c, 0x01, 0x9d,
-- 0xf9, 0x69, 0xc2, 0x48, 0xb2, 0x60, 0xc2, 0xca,
-- 0xb2, 0xf0, 0x11, 0x82, 0x41, 0x81, 0x22, 0x06,
-- 0x11, 0x9f, 0x41, 0x81, 0x22, 0x86, 0x0f, 0xc5,
-- 0xc0, 0x84, 0x10, 0x8c, 0x10, 0x92, 0xd1, 0x8f,
-- 0x41, 0x82, 0x10, 0x9c, 0xc1, 0xdb, 0x11, 0xc1,
-- 0x21, 0xc3, 0x20, 0x87, 0xc1, 0xc2, 0x10, 0x82,
-- 0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81,
-- 0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0,
-- 0xe9, 0x46, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82,
-- 0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91,
-- 0x10, 0x86, 0x20, 0x42, 0xd0, 0x81, 0x41, 0x02,
-- 0x11, 0x02, 0x20, 0x44, 0x22, 0x01, 0x22, 0x81,
-- 0x02, 0xe4, 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0,
-- 0x01, 0xd0, 0xe9, 0x5d, 0xc2, 0xca, 0x22, 0xc9,
-- 0xb2, 0xa0, 0x22, 0x48, 0x11, 0x9f, 0x11, 0x83,
-- 0x22, 0x06, 0x11, 0x9c, 0x11, 0x83, 0x22, 0x86,
-- 0x0f, 0xc5, 0xd0, 0x41, 0x40, 0x44, 0x20, 0x55,
-- 0x10, 0x62, 0xf9, 0x6f, 0x01, 0xb5, 0xd4, 0x00,
-- 0xc2, 0x9f, 0xc2, 0x1f, 0x22, 0x80, 0xe1, 0x30,
-- 0x0f, 0x11, 0xf9, 0x51, 0x90, 0x38, 0x80, 0x3f,
-- 0x00, 0x1b, 0xf9, 0x51, 0x00, 0x27, 0xd0, 0x04,
-- 0x70, 0x40, 0x30, 0x71, 0xf9, 0x51, 0xb0, 0x3c,
-- 0x70, 0x40, 0x30, 0x5d, 0xf9, 0x51, 0xb0, 0x08,
-- 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x10, 0x63,
-- 0xe5, 0x5d, 0x02, 0x20, 0xd0, 0x01, 0xa0, 0x37,
-- 0x00, 0x26, 0xd0, 0x24, 0x70, 0x40, 0xb0, 0x7f,
-- 0x60, 0x40, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x41,
-- 0x60, 0x40, 0x00, 0x26, 0xd0, 0x30, 0x70, 0x40,
-- 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x30, 0xd0, 0x40,
-- 0x60, 0x40, 0xb0, 0x3c, 0x6c, 0x40, 0xb0, 0x3c,
-- 0x67, 0x40, 0x00, 0x33, 0xdf, 0xb0, 0xe0, 0x36,
-- 0x00, 0x26, 0xd0, 0x1c, 0x70, 0x40, 0xb0, 0x7f,
-- 0x60, 0x40, 0xb0, 0x3c, 0x70, 0x40, 0xb0, 0x41,
-- 0x60, 0x40, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x35,
-- 0xc0, 0x3c, 0x10, 0x08, 0xa0, 0x0a, 0xa0, 0x27,
-- 0xa0, 0x1b, 0xdf, 0x5c, 0x01, 0xa0, 0xd0, 0x00,
-- 0xa0, 0x38, 0x80, 0x3f, 0x80, 0x34, 0x80, 0x3f,
-- 0x03, 0xbb, 0xd8, 0x1e, 0xcf, 0x95, 0x82, 0x34,
-- 0x80, 0x3f, 0x03, 0xe8, 0xd0, 0x00, 0x1f, 0xa3,
-- 0xe9, 0x55, 0x1f, 0xa0, 0xe9, 0x55, 0x03, 0xea,
-- 0xd0, 0x00, 0x00, 0x21, 0xdf, 0x86, 0xe0, 0x3c,
-- 0x89, 0x78, 0x89, 0x37, 0x00, 0xee, 0xd0, 0x14,
-- 0x76, 0x00, 0xd0, 0x30, 0x76, 0x40, 0x26, 0x58,
-- 0xd6, 0xd9, 0x00, 0xee, 0xd0, 0x20, 0x75, 0x40,
-- 0xd0, 0x1c, 0x71, 0x40, 0xd0, 0x20, 0x71, 0x00,
-- 0xd0, 0x24, 0x70, 0x80, 0xc4, 0x02, 0xd0, 0x28,
-- 0x70, 0xc0, 0x00, 0x21, 0xd0, 0x10, 0x72, 0x00,
-- 0x93, 0x90, 0xd4, 0x81, 0x13, 0x96, 0x43, 0x92,
-- 0x34, 0x8e, 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x86,
-- 0xde, 0x40, 0x7e, 0x79, 0xd0, 0x18, 0x70, 0x40,
-- 0xb0, 0x41, 0xf5, 0x58, 0xd3, 0x42, 0x50, 0x4d,
-- 0x60, 0x40, 0x10, 0x60, 0xe5, 0x62, 0xd0, 0x54,
-- 0x70, 0x01, 0xb0, 0x3c, 0x60, 0x01, 0x04, 0x2d,
-- 0xd0, 0x30, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x60,
-- 0x71, 0xc1, 0xd0, 0x4f, 0x41, 0xc1, 0x04, 0x20,
-- 0xd0, 0x28, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00,
-- 0x04, 0x22, 0xd0, 0x18, 0xd3, 0x44, 0x72, 0x8d,
-- 0x12, 0xa0, 0xe8, 0x36, 0xc0, 0x47, 0x10, 0x5d,
-- 0x30, 0x4e, 0xf8, 0x36, 0xb2, 0x3e, 0x60, 0x4d,
-- 0x00, 0xed, 0xd0, 0x48, 0x70, 0x01, 0xde, 0x45,
-- 0x50, 0x39, 0x00, 0x1b, 0xf9, 0x44, 0xb0, 0x01,
-- 0x00, 0x1c, 0xf9, 0x47, 0xb0, 0x04, 0x60, 0x01,
-- 0xd0, 0x40, 0x62, 0x81, 0xce, 0x4a, 0xd0, 0x43,
-- 0x41, 0xc1, 0xd0, 0x58, 0x61, 0xc1, 0x90, 0x43,
-- 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00, 0x10, 0x1f,
-- 0x20, 0x40, 0xb1, 0xc1, 0xf5, 0x54, 0x00, 0x21,
-- 0xd0, 0x08, 0x60, 0x40, 0x00, 0xe6, 0xd0, 0x40,
-- 0x70, 0x41, 0xd2, 0x94, 0x60, 0x4a, 0x04, 0x2c,
-- 0xd0, 0x08, 0x01, 0x90, 0xf8, 0x36, 0x04, 0x2d,
-- 0xd0, 0x30, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00,
-- 0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf9, 0x41,
-- 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28, 0x70, 0x00,
-- 0x20, 0x40, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40,
-- 0x00, 0x26, 0xd0, 0x74, 0x70, 0x01, 0xb0, 0x3f,
-- 0x60, 0x01, 0x00, 0xed, 0xd0, 0x48, 0x70, 0x41,
-- 0x00, 0x5e, 0xf9, 0x4b, 0x00, 0x21, 0xd0, 0x00,
-- 0x73, 0x80, 0xd4, 0x81, 0x34, 0x8e, 0x00, 0x34,
-- 0xd3, 0x70, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00,
-- 0xd1, 0x88, 0xd1, 0xc8, 0x01, 0x1b, 0xe9, 0x39,
-- 0x11, 0x9f, 0x11, 0xdf, 0xd4, 0x80, 0xd3, 0x81,
-- 0xe1, 0x43, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x00,
-- 0x00, 0x10, 0xf9, 0x37, 0x0c, 0x1f, 0xf9, 0x36,
-- 0x13, 0xa1, 0xe9, 0x43, 0xbe, 0x7c, 0x00, 0x69,
-- 0xd2, 0x54, 0x12, 0x48, 0xc0, 0x39, 0x30, 0x18,
-- 0xe5, 0x4b, 0xd2, 0x70, 0x72, 0x49, 0x22, 0x79,
-- 0x00, 0x21, 0xd0, 0x00, 0x63, 0x80, 0x04, 0x24,
-- 0xd0, 0x38, 0x02, 0x10, 0xe9, 0x56, 0xd0, 0x41,
-- 0x51, 0x41, 0xe0, 0x36, 0x15, 0x61, 0xe8, 0x36,
-- 0xd5, 0x80, 0xd3, 0x00, 0xd3, 0x40, 0x04, 0x28,
-- 0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00,
-- 0x00, 0x21, 0xd0, 0x18, 0x73, 0x00, 0xb0, 0x04,
-- 0x73, 0x80, 0xd2, 0x80, 0xb0, 0x38, 0x72, 0xc0,
-- 0x31, 0x0d, 0xc0, 0x0e, 0x10, 0x0b, 0x10, 0x20,
-- 0xe9, 0x42, 0xf5, 0x3f, 0x22, 0x8d, 0x10, 0x01,
-- 0x13, 0x5f, 0xe1, 0x3b, 0x33, 0x8b, 0x15, 0x61,
-- 0xf9, 0x49, 0x00, 0x21, 0xd0, 0x64, 0x70, 0x41,
-- 0x33, 0x81, 0x03, 0xd0, 0xe9, 0x4c, 0x20, 0x0b,
-- 0x13, 0xdf, 0x12, 0xc1, 0x13, 0xe0, 0xf9, 0x49,
-- 0x10, 0x03, 0xc0, 0x50, 0x10, 0x4b, 0x13, 0x0b,
-- 0x23, 0x00, 0x13, 0x20, 0xe9, 0x5c, 0xf5, 0x59,
-- 0x22, 0x81, 0x13, 0x01, 0x10, 0x5f, 0xe1, 0x55,
-- 0x12, 0x99, 0x12, 0x87, 0x21, 0x0a, 0x00, 0xa0,
-- 0xd2, 0x80, 0xc3, 0x0a, 0x03, 0x90, 0xe9, 0x66,
-- 0x22, 0x82, 0x23, 0x03, 0x10, 0x81, 0x10, 0xc1,
-- 0x13, 0x9f, 0x13, 0xa0, 0xed, 0x62, 0xc0, 0x8a,
-- 0xc0, 0xcc, 0x04, 0x26, 0xd0, 0x38, 0xe0, 0x36,
-- 0x15, 0x61, 0xf9, 0x3d, 0x07, 0x32, 0xd0, 0x00,
-- 0x30, 0x03, 0xed, 0x3d, 0xc0, 0x03, 0x10, 0x1d,
-- 0x30, 0xc0, 0xc0, 0x02, 0x10, 0x1d, 0x30, 0x80,
-- 0xe1, 0x32, 0x10, 0x94, 0x10, 0xd4, 0x00, 0x21,
-- 0xd0, 0x20, 0x73, 0x00, 0xc5, 0x8c, 0xd3, 0x4e,
-- 0x01, 0x1b, 0xe9, 0x48, 0x13, 0x1f, 0xd3, 0x4f,
-- 0x43, 0x4c, 0x13, 0x1c, 0xc0, 0x0c, 0x10, 0x03,
-- 0x20, 0x0c, 0xc0, 0x40, 0x10, 0x42, 0x20, 0x40,
-- 0x10, 0x46, 0x20, 0x4d, 0x10, 0x42, 0x2e, 0x41,
-- 0x10, 0x5c, 0x10, 0x43, 0x00, 0x59, 0xe9, 0x5b,
-- 0x01, 0x69, 0xd0, 0x20, 0x30, 0x40, 0x22, 0x41,
-- 0x04, 0x28, 0xd0, 0x18, 0xe0, 0x36, 0x50, 0x00,
-- 0x2c, 0x14, 0xd0, 0x34, 0x63, 0x00, 0xd0, 0x38,
-- 0x72, 0xc0, 0xc0, 0x51, 0x10, 0x5c, 0x30, 0x4b,
-- 0x10, 0x44, 0xd4, 0xc0, 0xd5, 0x00, 0xc0, 0x18,
-- 0x30, 0x39, 0xed, 0x5f, 0xd4, 0xd0, 0xc5, 0x01,
-- 0xd0, 0x18, 0x70, 0x00, 0x0c, 0x1f, 0xe9, 0x48,
-- 0x10, 0x20, 0xfd, 0x48, 0xd4, 0xc0, 0xd5, 0x00,
-- 0x10, 0x22, 0xe5, 0x4e, 0xd4, 0xc0, 0xbc, 0x30,
-- 0xd5, 0x00, 0xb5, 0x10, 0xb0, 0x3f, 0xf9, 0x52,
-- 0x3c, 0x01, 0x3c, 0x01, 0x02, 0x1f, 0xe9, 0x5f,
-- 0x00, 0xa8, 0xd3, 0xc0, 0xd3, 0xa4, 0x00, 0xaa,
-- 0xd0, 0x10, 0x70, 0x4f, 0xb3, 0xfc, 0x60, 0x40,
-- 0xb0, 0x3c, 0xb3, 0x81, 0xed, 0x59, 0x00, 0x21,
-- 0xd0, 0x28, 0x70, 0x00, 0x10, 0x20, 0xf9, 0x69,
-- 0x02, 0x1f, 0xf9, 0x6a, 0x90, 0x10, 0x00, 0x1e,
-- 0xe9, 0x6a, 0xb1, 0x7c, 0x04, 0x2a, 0xd0, 0x18,
-- 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00,
-- 0x01, 0x5e, 0xf9, 0x35, 0x01, 0x50, 0xe9, 0x35,
-- 0xb1, 0x78, 0xd2, 0x00, 0x01, 0x5c, 0xf9, 0x5f,
-- 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f, 0x11, 0x9f,
-- 0xce, 0x58, 0xc2, 0x59, 0x00, 0xaa, 0xd2, 0x10,
-- 0x14, 0x82, 0x22, 0x12, 0xc0, 0x0c, 0x10, 0x1f,
-- 0x10, 0x03, 0x22, 0x00, 0x70, 0x48, 0x03, 0x10,
-- 0xe9, 0x4c, 0xb2, 0x38, 0xbe, 0x60, 0xb2, 0x60,
-- 0x2e, 0x41, 0x10, 0x5f, 0x00, 0x59, 0xe9, 0x53,
-- 0x01, 0x69, 0xd0, 0x3c, 0x30, 0x40, 0x22, 0x41,
-- 0x13, 0x41, 0x2e, 0x4d, 0x13, 0x5d, 0x13, 0x43,
-- 0x22, 0x4d, 0x14, 0xe0, 0xe9, 0x5f, 0x33, 0x0b,
-- 0x13, 0x04, 0x2c, 0x0c, 0x35, 0x0c, 0xc3, 0x46,
-- 0xc3, 0x87, 0x04, 0x62, 0xd0, 0x10, 0x15, 0x62,
-- 0xfc, 0x36, 0x04, 0x60, 0xd0, 0x10, 0xe0, 0x36,
-- 0x00, 0x22, 0xd0, 0x74, 0x74, 0x01, 0xb0, 0x7c,
-- 0x74, 0x41, 0xb0, 0x7c, 0x71, 0x41, 0xd1, 0x18,
-- 0xc0, 0x10, 0x10, 0x1c, 0xb0, 0x16, 0xf9, 0x45,
-- 0x00, 0x24, 0xd0, 0x20, 0x30, 0x11, 0xf9, 0x45,
-- 0xb1, 0x70, 0x01, 0x50, 0xf9, 0x45, 0xb1, 0x20,
-- 0x14, 0x41, 0xc0, 0x90, 0x00, 0x2b, 0xd0, 0xd0,
-- 0x01, 0x50, 0xe9, 0x4b, 0xc0, 0xd0, 0x00, 0x35,
-- 0xdc, 0x00, 0x20, 0x11, 0x10, 0x1f, 0xa0, 0x1c,
-- 0x00, 0x21, 0xd0, 0x2c, 0x70, 0x00, 0x10, 0x05,
-- 0x51, 0x40, 0xd0, 0x1c, 0x61, 0x40, 0xd0, 0x20,
-- 0x61, 0x00, 0xd0, 0x24, 0x60, 0x80, 0xd0, 0x28,
-- 0x60, 0xc0, 0x04, 0x2d, 0xd0, 0x30, 0x00, 0x22,
-- 0xd0, 0x64, 0xb1, 0x81, 0x61, 0x81, 0xe0, 0x36,
-- 0x90, 0x50, 0xd0, 0x3c, 0x10, 0x41, 0x60, 0x40,
-- 0x15, 0x62, 0xfd, 0x3d, 0xc0, 0x10, 0x10, 0x1e,
-- 0x10, 0x07, 0x21, 0x00, 0x10, 0x16, 0x34, 0x00,
-- 0xc0, 0x90, 0xd3, 0x40, 0x00, 0x24, 0xd3, 0xc0,
-- 0x04, 0x23, 0xd0, 0x18, 0x01, 0x9f, 0xe8, 0x36,
-- 0xd0, 0x54, 0x70, 0x41, 0x73, 0x41, 0x04, 0x2e,
-- 0xd0, 0x28, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00,
-- 0x00, 0xef, 0xd3, 0x30, 0x73, 0x0c, 0xd0, 0x0c,
-- 0x70, 0x00, 0xc0, 0x40, 0x13, 0x24, 0xf5, 0x42,
-- 0x13, 0x22, 0xe9, 0x41, 0xe5, 0x43, 0xd3, 0x00,
-- 0x10, 0x22, 0xf9, 0x41, 0xd0, 0x01, 0xd0, 0x43,
-- 0xd3, 0x01, 0x21, 0x00, 0xd3, 0x40, 0x03, 0x10,
-- 0xf9, 0x47, 0xd3, 0x40, 0xe1, 0x61, 0x00, 0x23,
-- 0xd0, 0x00, 0x10, 0x61, 0xe9, 0x50, 0xb0, 0x33,
-- 0x10, 0x63, 0xe9, 0x50, 0x00, 0x22, 0xd0, 0x1a,
-- 0xc3, 0xc0, 0xd2, 0xc0, 0x00, 0x10, 0xe9, 0x55,
-- 0x22, 0xd0, 0x10, 0x1f, 0x14, 0x01, 0x10, 0x20,
-- 0xed, 0x52, 0x14, 0x18, 0x12, 0xd8, 0xc0, 0x8b,
-- 0x32, 0xd0, 0x12, 0xc3, 0x33, 0x4b, 0x13, 0x47,
-- 0x21, 0x0d, 0x04, 0x23, 0xd0, 0x18, 0xe0, 0x36,
-- 0x00, 0x24, 0xd0, 0x30, 0xd0, 0x40, 0x60, 0x40,
-- 0xd3, 0xc7, 0x43, 0xc4, 0x31, 0x0f, 0xd5, 0xd4,
-- 0x25, 0xcf, 0x15, 0xc4, 0x10, 0xdf, 0xc2, 0xc6,
-- 0xc3, 0x07, 0x11, 0x81, 0xb1, 0x3b, 0x15, 0x64,
-- 0xe9, 0x47, 0x10, 0xdf, 0x12, 0xc1, 0x11, 0x81,
-- 0x11, 0xc1, 0xb1, 0x3f, 0xb5, 0xf8, 0x90, 0x10,
-- 0x00, 0x16, 0xf9, 0x5e, 0xb5, 0xfc, 0xd0, 0x20,
-- 0x40, 0x39, 0x2e, 0x4b, 0x22, 0x4c, 0x12, 0x20,
-- 0xe9, 0x59, 0x20, 0x39, 0x00, 0x1b, 0xe9, 0x59,
-- 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5a, 0xf9, 0x59,
-- 0xb2, 0x38, 0x02, 0xe3, 0xd0, 0x00, 0x0e, 0x5a,
-- 0xe9, 0x5e, 0x2e, 0x40, 0x01, 0xee, 0xd2, 0x80,
-- 0x42, 0x84, 0xc0, 0x03, 0x30, 0x02, 0xf5, 0x6b,
-- 0x31, 0x0a, 0x12, 0x98, 0x20, 0x03, 0xf5, 0x69,
-- 0x12, 0x9f, 0x12, 0x87, 0x51, 0x0a, 0x00, 0x34,
-- 0xd4, 0xf0, 0xe0, 0x36, 0x50, 0x00, 0x50, 0x00,
-- 0xd3, 0xc7, 0x43, 0xc4, 0x15, 0x61, 0xf9, 0x48,
-- 0x10, 0xc1, 0xd5, 0xe0, 0xd1, 0x80, 0xd1, 0xc0,
-- 0x31, 0x0f, 0x13, 0xe1, 0xe9, 0x3c, 0xd3, 0xc0,
-- 0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x25, 0xcf,
-- 0x15, 0xc2, 0xd0, 0x03, 0x40, 0x16, 0x25, 0xc0,
-- 0x15, 0xc2, 0x15, 0x81, 0x35, 0x91, 0xe1, 0x5c,
-- 0x00, 0x24, 0xd0, 0x30, 0x63, 0xc0, 0x01, 0x50,
-- 0xe9, 0x54, 0x15, 0xa0, 0xf9, 0x55, 0x00, 0x24,
-- 0xd0, 0x34, 0x70, 0x00, 0x10, 0x20, 0xe9, 0x55,
-- 0xd3, 0xc0, 0x31, 0x0f, 0xd5, 0xfc, 0x25, 0xcf,
-- 0x15, 0xc3, 0x14, 0xa0, 0xe9, 0x5c, 0xb5, 0xfc,
-- 0x00, 0x34, 0xd4, 0xf0, 0xe0, 0x36, 0x50, 0x00,
-- 0xc4, 0x91, 0x34, 0x96, 0xed, 0x34, 0xd4, 0x80,
-- 0x14, 0x84, 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52,
-- 0x10, 0x5e, 0x34, 0x81, 0xb3, 0xc1, 0xe5, 0x41,
-- 0xc0, 0x52, 0x10, 0x5c, 0x24, 0x81, 0xb3, 0xc1,
-- 0xe5, 0x37, 0x02, 0xe8, 0xd0, 0x00, 0xb4, 0xb0,
-- 0x14, 0x9b, 0x00, 0x24, 0xd0, 0x60, 0x30, 0x52,
-- 0xed, 0x4a, 0x24, 0x81, 0x20, 0x12, 0xa0, 0x1c,
-- 0x10, 0x8a, 0x50, 0x83, 0xa0, 0x96, 0xa1, 0x50,
-- 0xa1, 0x11, 0xc0, 0x52, 0xd4, 0x84, 0x10, 0x6c,
-- 0xed, 0x56, 0xd4, 0x81, 0xd1, 0x00, 0xb1, 0x17,
-- 0x00, 0x23, 0xd1, 0x40, 0xc2, 0xb9, 0x22, 0x86,
-- 0x12, 0x20, 0xf9, 0x66, 0x02, 0xe3, 0xd0, 0x40,
-- 0x02, 0x9a, 0xe9, 0x63, 0x22, 0x81, 0x02, 0x5a,
-- 0xe9, 0x66, 0x22, 0x41, 0x75, 0xd7, 0xc3, 0xd7,
-- 0xd0, 0xd7, 0x00, 0x21, 0xd0, 0xb6, 0x8b, 0x38,
-- 0x00, 0x33, 0xdd, 0x08, 0xe0, 0x36, 0x50, 0x00,
-- 0xd0, 0x7c, 0x60, 0x01, 0xae, 0x52, 0xd0, 0x60,
-- 0x40, 0x79, 0x00, 0x13, 0xe8, 0xc9, 0xa2, 0x94,
-- 0x22, 0x86, 0x13, 0xe0, 0xe4, 0xd0, 0x13, 0xc1,
-- 0x15, 0x62, 0xfc, 0xd1, 0x13, 0xc1, 0xe0, 0xd1,
-- 0xc3, 0xd7, 0x03, 0xd9, 0xe8, 0xd4, 0x22, 0x8d,
-- 0x15, 0x62, 0xfc, 0xda, 0x03, 0xda, 0xe8, 0xda,
-- 0x22, 0x8d, 0x22, 0x8d, 0xce, 0x4a, 0x22, 0x86,
-- 0x00, 0x14, 0xe8, 0xe0, 0xa2, 0x53, 0x22, 0x47,
-- 0x03, 0xd1, 0xe8, 0xe8, 0x22, 0x4e, 0x15, 0x62,
-- 0xfc, 0xe8, 0x03, 0xd2, 0xe8, 0xe8, 0x22, 0x4e,
-- 0x12, 0x20, 0xe9, 0x09, 0x20, 0x79, 0x00, 0x5b,
-- 0xe8, 0xf4, 0x15, 0x20, 0xfc, 0xf1, 0x2c, 0x13,
-- 0x35, 0x13, 0x0e, 0x5b, 0xe8, 0xf4, 0xb2, 0x38,
-- 0x02, 0x9a, 0xe8, 0xfb, 0x70, 0x08, 0xd0, 0x7c,
-- 0x42, 0x81, 0x22, 0x98, 0x22, 0x80, 0x02, 0x5a,
-- 0xe9, 0x11, 0x70, 0x08, 0xd0, 0x78, 0x42, 0x41,
-- 0x22, 0x59, 0x10, 0x1f, 0x22, 0x40, 0x00, 0x19,
-- 0xe9, 0x11, 0x01, 0x69, 0xd0, 0x7c, 0x32, 0x41,
-- 0xe1, 0x11, 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a,
-- 0xe9, 0x0e, 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x11,
-- 0x22, 0x41, 0x0e, 0x5a, 0xe9, 0x15, 0xce, 0x4a,
-- 0x3e, 0x46, 0x0f, 0x87, 0xdd, 0x48, 0xe1, 0x19,
-- 0xdd, 0x40, 0xdc, 0xc8, 0xdd, 0x3c, 0x7d, 0x34,
-- 0x1d, 0x19, 0x3d, 0x35, 0x4d, 0x33, 0x4c, 0xec,
-- 0x3d, 0x33, 0xf9, 0x17, 0x0f, 0xc5, 0x50, 0x00,
-- 0xd0, 0x39, 0xd0, 0x35, 0xd0, 0x1d, 0xd0, 0x2d,
-- 0xd0, 0x3f, 0xd0, 0x2e, 0xd0, 0x3c, 0xd0, 0x37,
-- 0xd0, 0x33, 0xd0, 0x19, 0xd0, 0x33, 0xd0, 0x2e,
-- 0xd0, 0x3d, 0xd0, 0x3e, 0xd0, 0x27, 0xd0, 0x3e,
-- 0xd0, 0x3a, 0xd0, 0x2f, 0xd0, 0x32, 0x00, 0x00,
-- 0x00, 0x00, 0x46, 0x44, 0x00, 0x00, 0x10, 0x00,
-- 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x50, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
-- 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x02, 0xd0,
-- 0x00, 0x00, 0x00, 0x1e, 0x00, 0x05, 0x46, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90, 0x85,
-- 0x00, 0x00, 0xa6, 0xee, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x01, 0xe0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0xa0,
-- 0x00, 0x08, 0x08, 0x28, 0x00, 0x08, 0x88, 0x68,
-- 0x00, 0x08, 0xa0, 0x98, 0x00, 0x08, 0x88, 0x68,
-- 0x00, 0x08, 0x28, 0x98, 0x00, 0x08, 0xac, 0xf4,
-- 0x00, 0x08, 0xb8, 0x7c, 0x00, 0x02, 0x02, 0x88,
-- 0x00, 0x02, 0x08, 0x22, 0x00, 0x02, 0x88, 0xaa,
-- 0x00, 0x02, 0x22, 0xaa, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x24,
-- 0x00, 0x04, 0x04, 0x24, 0x00, 0x04, 0x28, 0x6c,
-- 0x00, 0x04, 0x28, 0x6c, 0x00, 0x01, 0x10, 0x44,
-- 0x00, 0x01, 0x20, 0x44, 0x00, 0x01, 0x11, 0xaa,
-- 0x00, 0x01, 0x88, 0x55, 0x00, 0x01, 0x44, 0xaa,
-- 0x00, 0x01, 0x44, 0x55, 0x00, 0x20, 0x80, 0xa0,
-- 0x00, 0x20, 0x80, 0xc0, 0x00, 0x20, 0x20, 0xa0,
-- 0x00, 0x20, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0,
-- 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16,
-- 0x1a, 0x1b, 0x1d, 0x22, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x13, 0x16,
-- 0x1a, 0x1b, 0x1d, 0x22, 0x10, 0x10, 0x16, 0x18,
-- 0x1b, 0x1d, 0x22, 0x25, 0x13, 0x16, 0x1a, 0x1b,
-- 0x1d, 0x22, 0x22, 0x26, 0x16, 0x16, 0x1a, 0x1b,
-- 0x1d, 0x22, 0x25, 0x28, 0x16, 0x1a, 0x1b, 0x1d,
-- 0x20, 0x23, 0x28, 0x30, 0x1a, 0x1b, 0x1d, 0x20,
-- 0x23, 0x28, 0x30, 0x3a, 0x1a, 0x1b, 0x1d, 0x22,
-- 0x26, 0x2e, 0x38, 0x45, 0x1b, 0x1d, 0x23, 0x26,
-- 0x2e, 0x38, 0x45, 0x53, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xd6, 0x00,
-- 0x00, 0x1b, 0x08, 0x00, 0x00, 0x1f, 0xde, 0x00,
-- 0x00, 0x00, 0x50, 0x00, 0x00, 0x08, 0x39, 0x00,
-- 0x00, 0x10, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-- 0x05, 0x28, 0x20, 0x01, 0x00, 0x00, 0x01, 0xe0,
-- 0x71, 0x01, 0x00, 0x68, 0xe0, 0x7f, 0xb0, 0x7f,
-- 0x60, 0x40, 0xe0, 0x1d, 0x90, 0x10, 0xb4, 0x81,
-- 0xe8, 0xc0, 0xe0, 0xc2, 0x90, 0x18, 0x00, 0x8a,
-- 0x70, 0xc0, 0x0f, 0x87, 0xe3, 0xe8, 0xc0, 0x00,
-- 0x70, 0x40, 0xe0, 0x01, 0xe0, 0x86, 0x00, 0x26,
-- 0xd0, 0x28, 0xe0, 0x0e, 0xd0, 0x0e, 0x0f, 0x0b,
-- 0x70, 0x1d, 0xe0, 0x67, 0x0f, 0x87, 0x0f, 0x87,
-- 0x0f, 0x87, 0x0f, 0x87, 0x0f, 0x87, 0x02, 0x20,
-- 0xd0, 0x01, 0xe0, 0x25, 0x0f, 0x45, 0x6f, 0x81,
-- 0xdf, 0xa6, 0xe0, 0x36, 0xe1, 0x30, 0xa0, 0x37,
-- 0xc0, 0x00, 0xe0, 0x26, 0x00, 0x33, 0xde, 0xc8,
-- 0xe0, 0x32, 0x0f, 0xc5, 0x0f, 0x87, 0x00, 0x27,
-- 0xd0, 0x4c, 0xe0, 0x21, 0x00, 0x33, 0xdf, 0x28,
-- 0x00, 0x27, 0xd0, 0x56, 0x60, 0x01, 0xe0, 0x2d,
-- 0x03, 0xa0, 0xd0, 0x41, 0xa0, 0x78, 0x00, 0x60,
-- 0xd0, 0x41, 0xa0, 0x77, 0x00, 0x22, 0xd0, 0x58,
-- 0xa0, 0x76, 0x00, 0x21, 0xd0, 0x7c, 0x00, 0x4a,
-- 0xd0, 0x72, 0x70, 0x40, 0x00, 0x06, 0x0f, 0x87,
-- 0x00, 0x22, 0xdc, 0xf8, 0xf0, 0x4a, 0xe1, 0x70,
-- 0x07, 0xef, 0xdd, 0xbf, 0x4f, 0x36, 0x1d, 0x99,
-- 0x4d, 0x80, 0x10, 0x18, 0xdd, 0x50, 0x60, 0x35,
-- 0xdd, 0x72, 0xdd, 0x10, 0x3d, 0xb4, 0xec, 0x57,
-- 0x2d, 0x36, 0x1d, 0x03, 0xbd, 0x04, 0xe4, 0x2b,
-- 0x01, 0x46, 0x00, 0x06, 0xac, 0xf6, 0x80, 0x3f,
-- 0x0d, 0x0a, 0x10, 0x02, 0x7d, 0x40, 0x10, 0x1e,
-- 0xb0, 0x20, 0xbc, 0xe0, 0x00, 0x06, 0x00, 0xc6,
-- 0xe0, 0x52, 0xb7, 0x60, 0xb7, 0x60, 0xc0, 0x5d,
-- 0x30, 0x5f, 0xe4, 0x72, 0xc7, 0x5e, 0x00, 0xed,
-- 0xd0, 0x28, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40,
-- 0xc0, 0x1d, 0x30, 0x1c, 0xf8, 0x7e, 0x00, 0x21,
-- 0xd0, 0x01, 0x00, 0x26, 0xd0, 0x78, 0xa0, 0x38,
-- 0x80, 0x3f, 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01,
-- 0x0f, 0x87, 0x80, 0x34, 0x03, 0xef, 0xd8, 0x3f,
-- 0xa8, 0x38, 0x01, 0x35, 0xdc, 0x33, 0xe0, 0x46,
-- 0xc0, 0x1c, 0xe4, 0xa5, 0x97, 0x2e, 0x30, 0x1c,
-- 0xe8, 0x8e, 0x00, 0x21, 0xd0, 0x00, 0xa0, 0x38,
-- 0xc0, 0x5d, 0x00, 0x23, 0xd0, 0x00, 0x30, 0x40,
-- 0x30, 0x5e, 0xe4, 0x99, 0x20, 0x5e, 0xc0, 0x01,
-- 0x30, 0x1c, 0xec, 0xa4, 0xe0, 0x9d, 0x20, 0x5f,
-- 0xc0, 0x1c, 0x30, 0x01, 0xf4, 0xa5, 0xc0, 0x1c,
-- 0x30, 0x1d, 0xec, 0xa4, 0xe4, 0xa5, 0x90, 0x38,
-- 0x00, 0x1b, 0xe8, 0xa5, 0xa0, 0x66, 0xb1, 0x3f,
-- 0xe4, 0xb3, 0xe8, 0xb1, 0xc0, 0x4b, 0x30, 0x44,
-- 0xf8, 0xb3, 0x60, 0x45, 0xb1, 0x7c, 0x01, 0x20,
-- 0xd0, 0x00, 0xa0, 0x05, 0x80, 0x40, 0x72, 0xc5,
-- 0x00, 0x06, 0x90, 0x55, 0xd0, 0x01, 0x00, 0x40,
-- 0xa0, 0x55, 0x0f, 0x87, 0x01, 0x46, 0x00, 0x06,
-- 0x03, 0xef, 0xd0, 0x3f, 0xa0, 0x38, 0xb0, 0x01,
-- 0xa0, 0x37, 0x80, 0x3f, 0x82, 0x34, 0x80, 0x3f,
-- 0xf2, 0x1a, 0x80, 0x34, 0x80, 0x3f, 0xf2, 0x1a,
-- 0xd8, 0x00, 0xd8, 0x40, 0xd8, 0x80, 0xd8, 0xc0,
-- 0xd9, 0x00, 0xd9, 0x40, 0xd9, 0x80, 0xd9, 0xc0,
-- 0xda, 0x00, 0xda, 0x40, 0xda, 0x80, 0xda, 0xc0,
-- 0xdb, 0x00, 0xdb, 0x40, 0xdb, 0x80, 0xdb, 0xc0,
-- 0xdc, 0x00, 0xdc, 0x40, 0xdc, 0x80, 0xdc, 0xc0,
-- 0xdd, 0x00, 0xdd, 0x40, 0xdd, 0x80, 0xdd, 0xc0,
-- 0xde, 0x00, 0xde, 0x40, 0xde, 0x80, 0xde, 0xc0,
-- 0xdf, 0x00, 0xdf, 0x40, 0xdf, 0x80, 0xdf, 0xc0,
-- 0xde, 0x80, 0xde, 0xc1, 0x00, 0x28, 0xd0, 0x60,
-- 0x6e, 0x81, 0x80, 0x00, 0x80, 0x05, 0x00, 0xe3,
-- 0xd1, 0x88, 0x00, 0x73, 0xd5, 0x80, 0x60, 0x06,
-- 0xb1, 0xbc, 0x00, 0xfa, 0xd0, 0x80, 0x60, 0x06,
-- 0x00, 0x26, 0xd0, 0x6c, 0x6e, 0x81, 0x04, 0x32,
-- 0xd2, 0x00, 0x00, 0xee, 0xd1, 0x94, 0x60, 0x06,
-- 0x00, 0xed, 0xd0, 0x50, 0x6e, 0x81, 0x00, 0x22,
-- 0xd0, 0x70, 0x6e, 0x81, 0x00, 0xee, 0xd0, 0x74,
-- 0x6e, 0x81, 0xd0, 0x4c, 0x6e, 0x81, 0xd0, 0x02,
-- 0x00, 0xef, 0xd0, 0x6c, 0x60, 0x01, 0xd0, 0x03,
-- 0x00, 0xef, 0xd0, 0x70, 0x60, 0x01, 0x00, 0xe0,
-- 0xd0, 0x48, 0xd0, 0x02, 0x60, 0x01, 0x00, 0x32,
-- 0xd6, 0xf0, 0xa0, 0x1c, 0x00, 0x21, 0xd0, 0x60,
-- 0xa0, 0x76, 0x00, 0x34, 0xd5, 0x48, 0x80, 0x3f,
-- 0x00, 0x23, 0xd0, 0x5c, 0x00, 0x4a, 0xd0, 0x72,
-- 0x70, 0x40, 0x00, 0x06, 0x00, 0x22, 0xd1, 0xa4,
-- 0x6e, 0xc6, 0xd0, 0x58, 0x6e, 0xc1, 0xd0, 0xc9,
-- 0x00, 0xed, 0xd0, 0x54, 0x60, 0xc1, 0x00, 0x22,
-- 0xd0, 0x40, 0x60, 0xc1, 0x00, 0x22, 0xd0, 0x60,
-- 0x60, 0xc1, 0x82, 0x34, 0x80, 0x3f, 0xd6, 0xd9,
-- 0x01, 0x20, 0xd6, 0x22, 0x16, 0x08, 0xd0, 0x5e,
-- 0xd0, 0x2c, 0x60, 0x40, 0xd0, 0x70, 0x01, 0x74,
-- 0xd6, 0x00, 0x60, 0x01, 0x00, 0x2b, 0xd4, 0x10,
-- 0x00, 0x27, 0xd4, 0x60, 0x00, 0x2b, 0xd0, 0x90,
-- 0xc0, 0xc2, 0xd1, 0x08, 0xd1, 0x44, 0xa1, 0x50,
-- 0x00, 0x21, 0xd0, 0xb6, 0xd0, 0xd7, 0x00, 0x29,
-- 0xd0, 0x04, 0x64, 0x00, 0xb0, 0x3c, 0x64, 0x40,
-- 0x80, 0x34, 0x80, 0x3f, 0xd0, 0x40, 0x00, 0x35,
-- 0xd0, 0x00, 0x60, 0x01, 0xd0, 0x48, 0x6e, 0x81,
-- 0xd0, 0x44, 0x6e, 0x81, 0x00, 0x64, 0xd1, 0x80,
-- 0x6e, 0x86, 0x01, 0x3c, 0xd2, 0x39, 0xe0, 0x46,
-- 0xd0, 0x00, 0xd0, 0x40, 0xd0, 0x80, 0xd0, 0xc0,
-- 0xd1, 0x00, 0xd1, 0x40, 0xd1, 0x80, 0xd1, 0xc0,
-- 0xd2, 0x00, 0xd2, 0x40, 0xd2, 0x80, 0xd2, 0xc0,
-- 0xd3, 0x00, 0xd3, 0x40, 0xd3, 0x80, 0xd3, 0xc0,
-- 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0,
-- 0xd5, 0x00, 0xd5, 0x40, 0xd5, 0x80, 0xd5, 0xc0,
-- 0xd6, 0x00, 0xd6, 0x40, 0xd6, 0x80, 0xd6, 0xc0,
-- 0xd7, 0x00, 0xd7, 0x40, 0xd7, 0x80, 0xd7, 0xc0,
-- 0x0f, 0xc5, 0x50, 0x00, 0x01, 0x46, 0x00, 0x06,
-- 0xde, 0x80, 0xde, 0xc1, 0x03, 0x2f, 0xd0, 0x33,
-- 0xa0, 0x38, 0xb0, 0x01, 0xa0, 0x37, 0x80, 0x3f,
-- 0x08, 0x20, 0xdf, 0x00, 0x82, 0x34, 0x80, 0x3f,
-- 0x00, 0xee, 0xd0, 0x08, 0x77, 0xc0, 0xb0, 0x04,
-- 0x77, 0x80, 0xb0, 0x04, 0xc0, 0x5f, 0x30, 0x5e,
-- 0x60, 0x40, 0xd7, 0x00, 0xb7, 0x01, 0x80, 0x34,
-- 0x80, 0x3f, 0x00, 0x60, 0xd0, 0x80, 0x00, 0xec,
-- 0xd0, 0x40, 0x60, 0x81, 0xb0, 0x7c, 0x60, 0x81,
-- 0x00, 0xa0, 0xd0, 0x80, 0xb0, 0x74, 0x60, 0x81,
-- 0xb0, 0x7c, 0x60, 0x81, 0x00, 0x68, 0xd0, 0x80,
-- 0x6e, 0x82, 0x00, 0xef, 0xd0, 0x8c, 0x6e, 0x82,
-- 0x00, 0x06, 0xd0, 0x11, 0xa0, 0x38, 0x80, 0x3f,
-- 0x08, 0x20, 0xd0, 0x40, 0x10, 0x48, 0xa0, 0x4a,
-- 0xa0, 0x5b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08,
-- 0xa0, 0x27, 0xa0, 0x0a, 0x90, 0x4d, 0x0f, 0xff,
-- 0xd8, 0x1f, 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a,
-- 0x80, 0x07, 0x80, 0x1b, 0x80, 0x27, 0x00, 0x60,
-- 0xd0, 0x00, 0xa0, 0x09, 0x80, 0x28, 0x01, 0x20,
-- 0xd0, 0x67, 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29,
-- 0x80, 0x6a, 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f,
-- 0xa0, 0x6a, 0x01, 0x20, 0xd0, 0x00, 0xa0, 0x29,
-- 0x80, 0x2b, 0x02, 0x30, 0xd0, 0x00, 0xa0, 0x38,
-- 0x80, 0x3f, 0x01, 0xb0, 0xd0, 0x10, 0xa0, 0x37,
-- 0x80, 0x3f, 0x02, 0x30, 0xd0, 0x01, 0xa0, 0x38,
-- 0x00, 0xea, 0xd0, 0x00, 0xd0, 0x4e, 0x0f, 0x0b,
-- 0x70, 0x40, 0x00, 0x06, 0x00, 0x21, 0xd0, 0x88,
-- 0x00, 0xe1, 0xd0, 0x60, 0x60, 0x81, 0x00, 0x2b,
-- 0xd0, 0x80, 0x00, 0xe0, 0xd0, 0x6c, 0x60, 0x81,
-- 0xb0, 0x7c, 0x00, 0x27, 0xd0, 0xa0, 0x60, 0x81,
-- 0xb0, 0x7c, 0xd0, 0x82, 0x60, 0x81, 0xb0, 0x7c,
-- 0xd0, 0x85, 0x60, 0x81, 0xb0, 0x7c, 0x03, 0xaa,
-- 0xd0, 0x98, 0x60, 0x81, 0xb0, 0x7c, 0x6e, 0x81,
-- 0x00, 0x27, 0xd0, 0x40, 0x6e, 0x81, 0xb0, 0x7c,
-- 0x6e, 0x81, 0xb0, 0x7c, 0x6e, 0x81, 0x00, 0x27,
-- 0xd1, 0x90, 0x6e, 0x86, 0x00, 0x21, 0xd1, 0xb8,
-- 0x6e, 0x86, 0x00, 0x66, 0xd1, 0xa0, 0xd0, 0x00,
-- 0x01, 0x26, 0xd0, 0x58, 0x30, 0x01, 0x60, 0x06,
-- 0x00, 0xed, 0xd1, 0xbc, 0x6e, 0x86, 0x00, 0xec,
-- 0xd1, 0xb8, 0x6e, 0x86, 0xb1, 0x84, 0x6e, 0x86,
-- 0x00, 0xee, 0xd1, 0x84, 0x70, 0x46, 0x00, 0x65,
-- 0xd1, 0x94, 0x60, 0x46, 0x00, 0x64, 0xd1, 0xbc,
-- 0x6e, 0x86, 0x00, 0x65, 0xd1, 0x80, 0x6e, 0x86,
-- 0xb1, 0xbc, 0x6e, 0x86, 0xb1, 0xbc, 0x6e, 0x86,
-- 0x00, 0xed, 0xd1, 0xa8, 0x6e, 0x86, 0xd0, 0x0e,
-- 0xb1, 0xbc, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06,
-- 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06, 0x00, 0x28,
-- 0xd1, 0xa4, 0x6e, 0x86, 0x00, 0x27, 0xd1, 0x98,
-- 0x6e, 0x86, 0x00, 0x64, 0xd1, 0xa4, 0x6e, 0x86,
-- 0xd2, 0x01, 0x00, 0x64, 0xd0, 0x60, 0x62, 0x01,
-- 0x00, 0x64, 0xd1, 0x80, 0x70, 0x46, 0x6e, 0x86,
-- 0x00, 0xef, 0xd1, 0x98, 0x70, 0x86, 0x08, 0x20,
-- 0xd0, 0xcf, 0x30, 0xc1, 0xea, 0x42, 0xd0, 0x81,
-- 0x00, 0x21, 0xd1, 0xa8, 0x60, 0x86, 0x00, 0xed,
-- 0xd1, 0xa0, 0x6e, 0xc6, 0x00, 0x65, 0xd1, 0x98,
-- 0x6e, 0xc6, 0x00, 0x22, 0xd0, 0x00, 0xa0, 0x05,
-- 0x80, 0x40, 0x00, 0xc6, 0x01, 0x73, 0xd4, 0x3d,
-- 0xe0, 0x46, 0x50, 0x00, 0x08, 0x20, 0xd0, 0x00,
-- 0x5f, 0x00, 0x00, 0x64, 0xd0, 0x60, 0x70, 0xc1,
-- 0x00, 0xec, 0xd0, 0x40, 0x71, 0x81, 0xb0, 0x7c,
-- 0x71, 0xc1, 0xc0, 0x87, 0x30, 0x86, 0xf9, 0x83,
-- 0x10, 0xee, 0xe9, 0x76, 0x10, 0xe1, 0xe9, 0x76,
-- 0xe2, 0x57, 0x00, 0x63, 0xd0, 0xbf, 0x72, 0x06,
-- 0xb1, 0xbc, 0x41, 0x82, 0x02, 0x1b, 0xe9, 0x8d,
-- 0x72, 0x86, 0xb1, 0xbc, 0x41, 0x82, 0xd0, 0x75,
-- 0x30, 0x48, 0xe9, 0xfe, 0xb0, 0x7f, 0xea, 0x00,
-- 0x02, 0x1c, 0xe9, 0x96, 0x15, 0xa3, 0xea, 0x57,
-- 0x10, 0xf0, 0xe9, 0x9a, 0x10, 0xfa, 0xf9, 0xa1,
-- 0x15, 0xa3, 0xea, 0x57, 0x00, 0x21, 0xd0, 0x4c,
-- 0x70, 0x41, 0x10, 0x61, 0xfa, 0x57, 0x00, 0xed,
-- 0xd0, 0x08, 0x70, 0x40, 0xd0, 0x85, 0x40, 0x42,
-- 0x60, 0x40, 0x00, 0x64, 0xd0, 0x64, 0x62, 0x01,
-- 0x12, 0x2b, 0xe9, 0xeb, 0x12, 0x3b, 0xe9, 0xd5,
-- 0x00, 0xec, 0xd0, 0x40, 0x61, 0x81, 0x12, 0x2d,
-- 0xe9, 0xbf, 0x12, 0x30, 0xe9, 0xd4, 0x12, 0x36,
-- 0xe9, 0xd4, 0x12, 0x3a, 0xe9, 0xd4, 0xd0, 0x62,
-- 0x30, 0x48, 0xe9, 0xf2, 0x12, 0x2e, 0xe9, 0xf9,
-- 0xe1, 0x76, 0x00, 0xed, 0xd0, 0x08, 0x70, 0x40,
-- 0xd0, 0x85, 0x40, 0x42, 0x60, 0x40, 0xb0, 0x08,
-- 0x00, 0x21, 0xd0, 0x41, 0x60, 0x40, 0x00, 0x64,
-- 0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0x00, 0xed,
-- 0xd0, 0x20, 0xd0, 0x41, 0x60, 0x40, 0x10, 0xe1,
-- 0xea, 0x3a, 0xe2, 0x57, 0xe2, 0x53, 0x10, 0xee,
-- 0xf9, 0xe9, 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f,
-- 0x97, 0x2e, 0xc7, 0x5c, 0xa7, 0x66, 0x81, 0x34,
-- 0x80, 0x3f, 0x00, 0x21, 0xd0, 0x01, 0xa0, 0x38,
-- 0x00, 0xc6, 0x00, 0x21, 0xd0, 0x15, 0x0b, 0x09,
-- 0x00, 0x4d, 0xb0, 0x01, 0xed, 0xe5, 0xd2, 0x1a,
-- 0xe1, 0xec, 0xf1, 0x18, 0x00, 0xec, 0xd0, 0x40,
-- 0x71, 0x81, 0xd0, 0x4e, 0x60, 0x46, 0xe2, 0x54,
-- 0xc0, 0x0a, 0x10, 0x06, 0x52, 0x80, 0x00, 0xed,
-- 0xd0, 0x40, 0x62, 0x81, 0xe2, 0x53, 0x00, 0x64,
-- 0xd0, 0x60, 0x62, 0x01, 0xf2, 0x5a, 0xe1, 0x70,
-- 0x12, 0xa3, 0xf6, 0x57, 0x15, 0xa1, 0xfa, 0x57,
-- 0x12, 0xa0, 0xea, 0x23, 0x00, 0x65, 0xd1, 0x1c,
-- 0xd0, 0x75, 0x30, 0x48, 0xea, 0x0a, 0xb1, 0x3c,
-- 0x71, 0x04, 0x11, 0x20, 0xfa, 0x11, 0x00, 0xec,
-- 0xd0, 0x40, 0x61, 0x81, 0xe2, 0x57, 0x12, 0xa1,
-- 0xea, 0x33, 0x00, 0xe2, 0xd0, 0x60, 0x70, 0x01,
-- 0xb0, 0x7c, 0x70, 0x41, 0x10, 0x0c, 0x50, 0x40,
-- 0x0c, 0x30, 0xd0, 0x00, 0x31, 0x01, 0xee, 0x21,
-- 0x21, 0x00, 0xe6, 0x57, 0xe2, 0x23, 0x31, 0x00,
-- 0xfe, 0x57, 0xd0, 0x75, 0x30, 0x48, 0xea, 0x28,
-- 0xf2, 0x5a, 0xe2, 0x0d, 0x00, 0xec, 0xd0, 0x40,
-- 0x71, 0x81, 0x00, 0x63, 0xd1, 0x3f, 0xb1, 0xbc,
-- 0x41, 0x84, 0x61, 0x81, 0xd0, 0x50, 0x60, 0x46,
-- 0xe2, 0x57, 0x00, 0xed, 0xd0, 0x7c, 0x70, 0x41,
-- 0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xe2, 0x1c,
-- 0xd2, 0x84, 0x00, 0xed, 0xd1, 0xa4, 0x62, 0x86,
-- 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x46, 0x82, 0x34,
-- 0x80, 0x3f, 0xc7, 0x5e, 0x97, 0x2e, 0x81, 0x34,
-- 0x80, 0x3f, 0x02, 0xe8, 0xd0, 0x30, 0xa0, 0x37,
-- 0xa0, 0x38, 0x08, 0x20, 0xdf, 0x00, 0x80, 0x73,
-- 0x80, 0x3f, 0x00, 0xc6, 0x01, 0x7a, 0xde, 0x1a,
-- 0xe0, 0x46, 0xf2, 0x5a, 0x00, 0x64, 0xd0, 0x60,
-- 0x62, 0x01, 0x02, 0x3c, 0xda, 0x89, 0xe0, 0x46,
-- 0x00, 0x28, 0xd0, 0x64, 0x70, 0x81, 0x00, 0x22,
-- 0xd0, 0x00, 0x50, 0x80, 0x60, 0x81, 0x0f, 0xc5,
-- 0x50, 0x00, 0x50, 0x00, 0x00, 0xed, 0xd1, 0xa4,
-- 0x72, 0x86, 0x00, 0xef, 0xd1, 0x90, 0x70, 0x46,
-- 0x10, 0x5c, 0x10, 0x65, 0xed, 0x7d, 0xd0, 0x46,
-- 0xc0, 0x0a, 0x10, 0x40, 0x60, 0x46, 0x00, 0x22,
-- 0xd0, 0x73, 0x30, 0x54, 0xe9, 0x8e, 0x12, 0xa4,
-- 0xe9, 0xb5, 0x15, 0x20, 0xe9, 0xc0, 0xb0, 0x7b,
-- 0xe9, 0xc3, 0xb0, 0x41, 0xe9, 0xc9, 0xc0, 0x54,
-- 0x10, 0x5c, 0x10, 0x6e, 0xe9, 0xc6, 0xe1, 0xb5,
-- 0x00, 0x28, 0xd1, 0xb0, 0xd0, 0x00, 0x60, 0x06,
-- 0x12, 0xa4, 0xf9, 0xb2, 0x00, 0xed, 0xd1, 0x9c,
-- 0x62, 0x86, 0xd2, 0x80, 0x00, 0xed, 0xd1, 0xa4,
-- 0x62, 0x86, 0xd0, 0x02, 0x00, 0xec, 0xd1, 0xbc,
-- 0x60, 0x06, 0x00, 0x64, 0xd1, 0xa0, 0x72, 0x06,
-- 0x12, 0x21, 0xf9, 0xa6, 0xd2, 0x0d, 0x62, 0x06,
-- 0x00, 0xed, 0xd1, 0xa0, 0x61, 0x86, 0xd0, 0x0e,
-- 0x00, 0xed, 0xd1, 0xac, 0x60, 0x06, 0xb1, 0xbc,
-- 0x60, 0x06, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x06,
-- 0x01, 0x7e, 0xd2, 0x31, 0xe1, 0xcb, 0x01, 0x46,
-- 0x90, 0x49, 0x00, 0x60, 0xd0, 0x00, 0x50, 0x40,
-- 0xa0, 0x49, 0x80, 0x3f, 0x00, 0xc6, 0x0c, 0x09,
-- 0x05, 0x0d, 0xe1, 0x70, 0x01, 0xbe, 0xde, 0x41,
-- 0xe1, 0xcb, 0x01, 0xbb, 0xd8, 0x10, 0xe1, 0xcb,
-- 0x01, 0xbd, 0xd8, 0x0b, 0xe1, 0xcb, 0x03, 0xb8,
-- 0xda, 0x10, 0x01, 0x46, 0x90, 0x49, 0x00, 0x60,
-- 0xd1, 0x00, 0x50, 0x44, 0x30, 0x44, 0xa0, 0x49,
-- 0x80, 0x3f, 0x00, 0xc6, 0xe0, 0x46, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x01, 0xfa, 0xd2, 0x3d,
-- 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0x26,
-- 0xd0, 0x18, 0xd0, 0x40, 0x60, 0x40, 0x00, 0x28,
-- 0xd0, 0x24, 0x70, 0x40, 0xd0, 0x82, 0x50, 0x42,
-- 0x60, 0x40, 0x00, 0xec, 0xd0, 0xa4, 0x70, 0xc2,
-- 0x10, 0xe0, 0xf9, 0x81, 0x00, 0xec, 0xd1, 0x98,
-- 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2, 0x10, 0xe0,
-- 0xe9, 0x8e, 0xd0, 0x40, 0x60, 0x46, 0xe1, 0x81,
-- 0xd0, 0x40, 0x00, 0xe6, 0xd0, 0x10, 0x60, 0x40,
-- 0xb0, 0x3c, 0x60, 0x40, 0xb0, 0x3c, 0x60, 0x40,
-- 0xd0, 0xe0, 0x00, 0xea, 0xd0, 0x40, 0x00, 0xe8,
-- 0xd0, 0x82, 0x01, 0x46, 0x70, 0x01, 0xb0, 0x7c,
-- 0x60, 0x02, 0xb0, 0xbc, 0x00, 0x06, 0x00, 0xc6,
-- 0xb0, 0xc1, 0xed, 0x9b, 0x80, 0x49, 0xd6, 0x44,
-- 0xd5, 0x43, 0x00, 0xe0, 0xd1, 0x80, 0x00, 0x06,
-- 0x0b, 0x09, 0x01, 0x0d, 0x0b, 0x09, 0x61, 0x06,
-- 0xb1, 0xbc, 0x01, 0x4d, 0x09, 0x09, 0x61, 0x46,
-- 0xb1, 0xbc, 0x00, 0xcd, 0x09, 0x09, 0x10, 0xe4,
-- 0xed, 0xb8, 0x60, 0xc6, 0xb1, 0xbc, 0x00, 0xcd,
-- 0x60, 0xc6, 0x00, 0xed, 0xd0, 0x04, 0x70, 0x00,
-- 0x10, 0x20, 0xf9, 0xd3, 0x10, 0xe3, 0xe9, 0xc4,
-- 0x10, 0xe6, 0xf9, 0xd3, 0x01, 0x46, 0x90, 0x10,
-- 0x00, 0x20, 0xd0, 0x44, 0x50, 0x40, 0x00, 0xc6,
-- 0xa0, 0x50, 0x00, 0xa0, 0xd0, 0x00, 0xa0, 0x05,
-- 0x80, 0x40, 0x00, 0xed, 0xd1, 0xa4, 0xd0, 0x04,
-- 0x60, 0x06, 0x00, 0xee, 0xd1, 0xac, 0x73, 0x86,
-- 0x10, 0xe3, 0xe5, 0xde, 0xe9, 0xe3, 0x00, 0xe7,
-- 0xd0, 0x40, 0x00, 0xae, 0xd0, 0xbb, 0xe1, 0xe7,
-- 0x01, 0x24, 0xd0, 0x6b, 0x00, 0xea, 0xd0, 0xa6,
-- 0xe1, 0xe7, 0x01, 0x21, 0xd0, 0x7b, 0x00, 0xe8,
-- 0xd0, 0x90, 0x13, 0xa0, 0xf9, 0xea, 0xc0, 0x42,
-- 0x00, 0xe0, 0xd1, 0xa8, 0x60, 0x46, 0xb1, 0x98,
-- 0x0b, 0xc9, 0x00, 0x4d, 0x09, 0x09, 0x10, 0x44,
-- 0x00, 0x8d, 0x20, 0x42, 0x10, 0x5f, 0x60, 0x46,
-- 0xb1, 0xb8, 0x00, 0x90, 0xea, 0x17, 0x0a, 0x89,
-- 0x00, 0x8d, 0x60, 0x86, 0xb1, 0xbc, 0x08, 0x49,
-- 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc, 0x08, 0x49,
-- 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 0xea, 0x0b,
-- 0x00, 0xe8, 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60,
-- 0xfa, 0x17, 0x08, 0x49, 0x00, 0xe0, 0xd1, 0xa4,
-- 0x00, 0x4d, 0x60, 0x46, 0x10, 0x60, 0xea, 0x1b,
-- 0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0x10, 0x60,
-- 0xea, 0x1b, 0x00, 0xe0, 0xd1, 0x88, 0xd0, 0x40,
-- 0x60, 0x46, 0xd0, 0x00, 0x00, 0xe0, 0xd1, 0xa8,
-- 0x70, 0x46, 0x00, 0xef, 0xd1, 0x9c, 0x70, 0x86,
-- 0xb0, 0xb0, 0xee, 0x25, 0xd0, 0x81, 0x00, 0x90,
-- 0xea, 0x28, 0x20, 0x01, 0x10, 0x41, 0x10, 0x9f,
-- 0x10, 0xa0, 0xee, 0x25, 0x10, 0x1c, 0x00, 0x65,
-- 0xd1, 0xa8, 0x60, 0x06, 0x01, 0xb4, 0xd4, 0x3a,
-- 0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13,
-- 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x0c, 0x09,
-- 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72,
-- 0x30, 0x54, 0xe9, 0xea, 0xb0, 0x7d, 0xfa, 0x05,
-- 0x09, 0x09, 0x01, 0xcd, 0x11, 0xe1, 0xf9, 0xc7,
-- 0x80, 0x09, 0x80, 0x27, 0x0a, 0x09, 0xd6, 0x45,
-- 0x00, 0xe1, 0xd1, 0xa0, 0x00, 0x4d, 0x60, 0x46,
-- 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46,
-- 0x00, 0x50, 0xe9, 0x91, 0xd4, 0x01, 0xb1, 0xbc,
-- 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x00, 0xe0,
-- 0xd1, 0x80, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x89,
-- 0x10, 0x4c, 0x71, 0x06, 0x21, 0x01, 0x61, 0x06,
-- 0xb1, 0xbc, 0x00, 0x4d, 0x0b, 0x49, 0x10, 0x4c,
-- 0x71, 0x46, 0x21, 0x41, 0x61, 0x46, 0xb1, 0xb0,
-- 0x00, 0x4d, 0x10, 0x5f, 0x60, 0x46, 0xb1, 0xbc,
-- 0x0a, 0x09, 0x00, 0x4d, 0x10, 0x4a, 0x70, 0x86,
-- 0x20, 0x81, 0x60, 0x86, 0x00, 0xe1, 0xd1, 0xac,
-- 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0x09, 0x49, 0x00, 0x8d, 0x60, 0x86, 0xc0, 0x02,
-- 0x00, 0xe0, 0xd1, 0xa8, 0x70, 0xc6, 0x10, 0xc0,
-- 0xd0, 0x20, 0x30, 0x01, 0x10, 0xc0, 0x60, 0xc6,
-- 0xe1, 0x75, 0x11, 0xe2, 0xf9, 0x75, 0x00, 0xe2,
-- 0xd1, 0x80, 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46,
-- 0xb1, 0xbc, 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46,
-- 0xb1, 0xbc, 0x10, 0x60, 0xf9, 0xd7, 0xb1, 0xb4,
-- 0xe1, 0xde, 0xd2, 0x03, 0x0a, 0x09, 0x00, 0x4d,
-- 0x60, 0x46, 0xb1, 0xbc, 0xb2, 0x01, 0xf9, 0xd8,
-- 0x0b, 0xc9, 0x00, 0x4d, 0x10, 0x49, 0x10, 0x56,
-- 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x89, 0x00, 0x4d,
-- 0x10, 0x4a, 0x10, 0x56, 0x60, 0x46, 0xe1, 0x75,
-- 0x0b, 0x2c, 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0x77,
-- 0x00, 0xe0, 0xd0, 0x6c, 0x00, 0xe0, 0xd1, 0x80,
-- 0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd1, 0xb0,
-- 0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xe0, 0xd1, 0x80,
-- 0x76, 0x86, 0xb1, 0xbc, 0x73, 0x46, 0xe2, 0x3c,
-- 0x70, 0x81, 0x60, 0x86, 0xb1, 0xbc, 0xb0, 0x7c,
-- 0xb0, 0x01, 0xed, 0xfe, 0x0f, 0xc5, 0x00, 0xe1,
-- 0xd1, 0xa0, 0x70, 0x46, 0xd0, 0x8f, 0x40, 0x42,
-- 0x00, 0x25, 0xd0, 0xe0, 0x00, 0x24, 0xd1, 0x20,
-- 0x10, 0x6a, 0xea, 0x1e, 0x00, 0x66, 0xd0, 0xe0,
-- 0x00, 0x62, 0xd1, 0x00, 0x10, 0x66, 0xea, 0x1e,
-- 0x00, 0x6e, 0xd0, 0xc0, 0x10, 0x64, 0xea, 0x1e,
-- 0x00, 0x2b, 0xd0, 0xd0, 0x00, 0x29, 0xd1, 0x00,
-- 0x00, 0xe0, 0xd1, 0x80, 0x76, 0x86, 0x16, 0xa0,
-- 0xe9, 0xee, 0x30, 0xda, 0xe5, 0xee, 0xb1, 0xbc,
-- 0x73, 0x46, 0x13, 0x60, 0xe9, 0xee, 0x31, 0x0d,
-- 0xe5, 0xee, 0xd0, 0x82, 0xb1, 0xbc, 0x70, 0x46,
-- 0x10, 0x60, 0xe9, 0xee, 0xb0, 0x81, 0xee, 0x2c,
-- 0x00, 0xe0, 0xd0, 0x40, 0x00, 0xe0, 0xd1, 0xac,
-- 0xd0, 0x0a, 0xf1, 0xfe, 0x00, 0xe1, 0xd0, 0x70,
-- 0xd0, 0x02, 0xf1, 0xfe, 0x00, 0xec, 0xd1, 0x98,
-- 0xd0, 0x40, 0x60, 0x46, 0x00, 0xe0, 0xd0, 0x8c,
-- 0x70, 0x82, 0x00, 0x21, 0xd0, 0x70, 0x60, 0x81,
-- 0xd0, 0x40, 0x00, 0x25, 0xd0, 0x20, 0x30, 0x1a,
-- 0xfa, 0x50, 0x00, 0x23, 0xd0, 0x30, 0x30, 0x0d,
-- 0xfa, 0x50, 0xd0, 0x41, 0x00, 0x21, 0xd1, 0x84,
-- 0x60, 0x46, 0xb6, 0xb1, 0x16, 0x9c, 0x01, 0x7a,
-- 0xde, 0x1a, 0xe0, 0x46, 0x02, 0x31, 0xdc, 0x13,
-- 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x00, 0xec,
-- 0xd0, 0xa8, 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x77,
-- 0x00, 0xec, 0xd1, 0x9c, 0xd0, 0x41, 0x60, 0x46,
-- 0x70, 0xc2, 0x10, 0xe0, 0xe9, 0x84, 0xd0, 0x40,
-- 0x60, 0x46, 0xe1, 0x77, 0x0b, 0x49, 0x00, 0xe2,
-- 0xd1, 0xa0, 0x00, 0x4d, 0x10, 0x5f, 0x00, 0x6f,
-- 0xd0, 0xff, 0x40, 0x43, 0x60, 0x46, 0xb1, 0xbc,
-- 0x0b, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0x08, 0x89, 0x00, 0x4d, 0x60, 0x46, 0x10, 0x61,
-- 0xf9, 0x9b, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc,
-- 0x63, 0xc6, 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60,
-- 0xe5, 0x9c, 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22,
-- 0xd0, 0x72, 0x30, 0x54, 0xf9, 0xa9, 0x0b, 0xa0,
-- 0xd4, 0x40, 0xf3, 0xb0, 0xe1, 0xa0, 0x00, 0xec,
-- 0xd1, 0x9c, 0xd0, 0x40, 0x60, 0x46, 0x01, 0x7a,
-- 0xde, 0x1a, 0xe0, 0x46, 0x0b, 0x09, 0x00, 0x4d,
-- 0x0b, 0x09, 0x00, 0x4d, 0x0a, 0x09, 0x01, 0x4d,
-- 0x0a, 0x09, 0x00, 0x4d, 0x01, 0x59, 0xe9, 0x96,
-- 0x09, 0x09, 0x00, 0x4d, 0x10, 0x5f, 0x10, 0x61,
-- 0xf9, 0x96, 0x09, 0x09, 0x01, 0x4d, 0x11, 0x5f,
-- 0x0b, 0xc9, 0x00, 0x4d, 0xc0, 0x01, 0x10, 0x5f,
-- 0x11, 0x4e, 0x51, 0x41, 0x08, 0x49, 0x00, 0x4d,
-- 0x0b, 0xc9, 0x10, 0x0f, 0x00, 0x4d, 0x50, 0x01,
-- 0x00, 0xed, 0xd1, 0xb6, 0x01, 0x46, 0x00, 0x06,
-- 0xa0, 0x3c, 0xa1, 0x7d, 0x60, 0x06, 0x00, 0xc6,
-- 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a,
-- 0xe0, 0x46, 0x50, 0x00, 0x00, 0xec, 0xd0, 0xac,
-- 0x70, 0xc2, 0x10, 0xe0, 0xf9, 0x70, 0x00, 0xec,
-- 0xd1, 0xa0, 0xd0, 0x41, 0x60, 0x46, 0x70, 0xc2,
-- 0x10, 0xe0, 0xe9, 0x7f, 0xd0, 0x40, 0x60, 0x46,
-- 0xe1, 0x70, 0x0a, 0x89, 0x0b, 0xcd, 0x00, 0xe3,
-- 0xd1, 0x80, 0x6b, 0xc6, 0x08, 0xc9, 0x05, 0x8d,
-- 0x15, 0xa3, 0xee, 0x6e, 0x15, 0xa0, 0xea, 0x6e,
-- 0x90, 0x4d, 0xd0, 0x9f, 0xd0, 0xdf, 0x40, 0x81,
-- 0x10, 0x55, 0x40, 0xc1, 0x01, 0x46, 0x82, 0x34,
-- 0x80, 0x3f, 0xc8, 0x1d, 0x81, 0x34, 0x80, 0x3f,
-- 0x00, 0xc6, 0xd1, 0x23, 0x31, 0x03, 0x11, 0x02,
-- 0x38, 0x04, 0xb0, 0x8d, 0x10, 0x9d, 0x28, 0x02,
-- 0xc0, 0x60, 0x00, 0x65, 0xd1, 0x94, 0x71, 0x06,
-- 0x68, 0x06, 0x30, 0x44, 0x00, 0xed, 0xd1, 0xa8,
-- 0x70, 0x06, 0x10, 0x20, 0xe9, 0xb0, 0x00, 0xee,
-- 0xd0, 0xc0, 0x70, 0xc3, 0x20, 0x43, 0xb0, 0x01,
-- 0xf9, 0xac, 0x60, 0x06, 0x00, 0x64, 0xd1, 0xbc,
-- 0x71, 0x06, 0xc0, 0x04, 0x21, 0x01, 0x61, 0x06,
-- 0x10, 0x20, 0xf5, 0xbb, 0x11, 0x20, 0xe5, 0xbb,
-- 0xb0, 0x41, 0x00, 0x65, 0xd1, 0x80, 0x71, 0x06,
-- 0x21, 0x01, 0x61, 0x06, 0x00, 0xed, 0xd1, 0xac,
-- 0x71, 0x06, 0x15, 0xa1, 0xe9, 0xcb, 0xb1, 0x3f,
-- 0x61, 0x06, 0x15, 0xa3, 0xf9, 0xd6, 0xd0, 0xbf,
-- 0xe1, 0xd3, 0xd0, 0x40, 0x60, 0x46, 0xb1, 0xbc,
-- 0x70, 0x86, 0x61, 0x06, 0x31, 0x02, 0xe5, 0xd3,
-- 0x20, 0x84, 0x00, 0x65, 0xd1, 0xa4, 0x60, 0x86,
-- 0xd9, 0x40, 0x00, 0xec, 0xd1, 0x94, 0x79, 0x06,
-- 0xb1, 0x84, 0x78, 0xc6, 0xc0, 0x63, 0x30, 0x64,
-- 0xe9, 0xf8, 0x00, 0xa7, 0xd0, 0xff, 0x7a, 0x63,
-- 0x00, 0x65, 0xd0, 0x00, 0x71, 0x00, 0x31, 0x29,
-- 0xe5, 0xf8, 0xc0, 0x63, 0xc8, 0xc1, 0xb0, 0x78,
-- 0x40, 0x43, 0xc0, 0xa4, 0x30, 0x81, 0xe9, 0xf2,
-- 0x7a, 0x41, 0x31, 0x29, 0xf5, 0xe8, 0x21, 0x29,
-- 0x61, 0x00, 0xb8, 0xfc, 0x79, 0x63, 0xb8, 0xfc,
-- 0x48, 0xc3, 0x68, 0xc6, 0x00, 0xed, 0xd1, 0xb8,
-- 0x69, 0x46, 0x80, 0x28, 0x0b, 0xc9, 0x00, 0x4d,
-- 0x08, 0x49, 0x10, 0x41, 0x00, 0xe3, 0xd1, 0x84,
-- 0x00, 0x8d, 0x20, 0x42, 0x60, 0x46, 0x00, 0xee,
-- 0xd1, 0xa4, 0x70, 0x86, 0x10, 0xa1, 0xee, 0x18,
-- 0xe6, 0x6b, 0x90, 0x86, 0x00, 0x90, 0xea, 0x18,
-- 0x00, 0xed, 0xd0, 0x1c, 0x70, 0x80, 0xb0, 0x81,
-- 0xe6, 0x6b, 0x60, 0x80, 0xb1, 0xa8, 0x70, 0x86,
-- 0x10, 0xa0, 0xfa, 0x6b, 0x00, 0x21, 0xd0, 0x38,
-- 0x70, 0x80, 0x10, 0xa0, 0xfa, 0x6b, 0x0f, 0xef,
-- 0xd0, 0xbf, 0x30, 0x81, 0xfa, 0x22, 0x60, 0x00,
-- 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00, 0x15, 0xa3,
-- 0xea, 0x6b, 0x00, 0xee, 0xd1, 0x80, 0x79, 0x46,
-- 0x00, 0xf8, 0xd0, 0x00, 0xc4, 0x40, 0x00, 0xe3,
-- 0xd1, 0x84, 0x78, 0x46, 0x0f, 0xef, 0xd0, 0x3f,
-- 0x30, 0x21, 0xea, 0x48, 0x00, 0xe0, 0xd1, 0x90,
-- 0x78, 0x06, 0xc0, 0xa1, 0x18, 0x43, 0x28, 0x42,
-- 0x18, 0x43, 0x28, 0x42, 0x18, 0x1e, 0xd8, 0x80,
-- 0x08, 0x11, 0xea, 0x41, 0x28, 0xa1, 0x18, 0x01,
-- 0x18, 0x5f, 0x18, 0x60, 0xee, 0x3e, 0xc0, 0x51,
-- 0x30, 0x62, 0xee, 0x4e, 0xc8, 0x91, 0x18, 0x9f,
-- 0x00, 0x21, 0xd1, 0xb8, 0xd0, 0x01, 0x60, 0x06,
-- 0x00, 0xef, 0xd0, 0x10, 0xd0, 0x72, 0x60, 0x40,
-- 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0xc8, 0xdc,
-- 0xc9, 0x1d, 0x81, 0x34, 0x80, 0x3f, 0x00, 0xc6,
-- 0x38, 0xe4, 0xee, 0x5e, 0xea, 0x52, 0x28, 0xe5,
-- 0x01, 0x46, 0x90, 0x6d, 0x28, 0xc1, 0x00, 0xc6,
-- 0x38, 0xe2, 0xf6, 0x6b, 0xdb, 0x08, 0xf1, 0x16,
-- 0xf1, 0x18, 0x00, 0x21, 0xd1, 0xb4, 0x61, 0x86,
-- 0xe2, 0x52, 0x01, 0xf7, 0xd0, 0x19, 0xe0, 0x46,
-- 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a, 0xde, 0x1a,
-- 0xe0, 0x46, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13,
-- 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0xdb, 0x09,
-- 0x00, 0xe3, 0xd0, 0x1c, 0x6b, 0x00, 0xda, 0xc1,
-- 0x00, 0xe6, 0xd1, 0x98, 0x70, 0x06, 0xb1, 0x84,
-- 0x60, 0x06, 0xb1, 0x84, 0x60, 0x06, 0x05, 0x9f,
-- 0xe9, 0x9f, 0x08, 0x49, 0xd1, 0x17, 0x46, 0x44,
-- 0x00, 0x4d, 0x10, 0x43, 0x26, 0x41, 0x08, 0xc9,
-- 0x05, 0xcd, 0xb5, 0xc1, 0xe5, 0xcc, 0xc0, 0x57,
-- 0x15, 0xc6, 0x25, 0xc1, 0x15, 0xa3, 0xf9, 0x9f,
-- 0x08, 0x49, 0xd1, 0x0f, 0x46, 0x44, 0x00, 0x4d,
-- 0x10, 0x44, 0x26, 0x41, 0x08, 0xc9, 0x06, 0x0d,
-- 0xb6, 0x01, 0xe5, 0xcc, 0xc0, 0x58, 0x16, 0x06,
-- 0x26, 0x01, 0x08, 0x49, 0x00, 0x4d, 0x10, 0x60,
-- 0xe9, 0xa6, 0x0a, 0x09, 0x00, 0x4d, 0xe1, 0x9f,
-- 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xa7,
-- 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72,
-- 0x30, 0x54, 0xf9, 0xb3, 0xd4, 0x40, 0xf3, 0xb0,
-- 0xe1, 0xab, 0xb0, 0x7d, 0xf9, 0xb8, 0x02, 0x34,
-- 0xd2, 0x44, 0xe0, 0x46, 0x00, 0xec, 0xd1, 0xa0,
-- 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c, 0xda, 0x89,
-- 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46, 0xb1, 0xbc,
-- 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46, 0x15, 0x63,
-- 0xe9, 0xc9, 0x05, 0x5e, 0xe8, 0x46, 0x01, 0x73,
-- 0xd4, 0x3d, 0xe0, 0x46, 0xd5, 0x00, 0xb5, 0x01,
-- 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0xcc, 0xc0, 0xcd, 0x01,
-- 0xcd, 0x42, 0xcd, 0x83, 0x00, 0xa0, 0xd0, 0x01,
-- 0xa0, 0x38, 0xc8, 0x7f, 0xc8, 0x06, 0xb1, 0xbe,
-- 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x58, 0x80,
-- 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x96, 0xc9, 0x00,
-- 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xc9, 0x40,
-- 0xf3, 0x92, 0x59, 0x40, 0xc0, 0x22, 0xc0, 0x65,
-- 0xc0, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0x80,
-- 0xf3, 0x92, 0x59, 0x00, 0xf3, 0x96, 0xc9, 0x40,
-- 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x59, 0x40,
-- 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x58, 0x80,
-- 0xc0, 0x23, 0xc0, 0x62, 0xd0, 0x88, 0x20, 0x86,
-- 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92,
-- 0x58, 0xc0, 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92,
-- 0x59, 0xc0, 0xc0, 0x24, 0xc0, 0x67, 0xd0, 0x90,
-- 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00,
-- 0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xc9, 0xc0,
-- 0xf3, 0x96, 0xca, 0x00, 0xf3, 0x92, 0x59, 0xc0,
-- 0xf3, 0x96, 0xca, 0x40, 0xf3, 0x92, 0x59, 0x00,
-- 0xc0, 0x25, 0xc0, 0x64, 0xd0, 0x98, 0x20, 0x86,
-- 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92,
-- 0x58, 0x80, 0xf3, 0x96, 0xc9, 0x00, 0xf3, 0x92,
-- 0x59, 0x00, 0xc0, 0x23, 0xc0, 0x64, 0xd0, 0x84,
-- 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc8, 0xc0,
-- 0xf3, 0x92, 0x59, 0x40, 0xf3, 0x96, 0xc9, 0x00,
-- 0xf3, 0x92, 0x5a, 0x40, 0xc0, 0x26, 0xc0, 0x69,
-- 0xd0, 0xa0, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96,
-- 0xc9, 0x80, 0xf3, 0x92, 0x5a, 0x00, 0xf3, 0x96,
-- 0xca, 0x40, 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96,
-- 0xca, 0x80, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x27,
-- 0xc0, 0x66, 0xd0, 0xa8, 0x20, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xc9, 0xc0, 0xf3, 0x92, 0x59, 0x00,
-- 0xf3, 0x96, 0xc9, 0x80, 0xf3, 0x92, 0x58, 0xc0,
-- 0xc0, 0x22, 0xc0, 0x63, 0xd0, 0x8c, 0x20, 0x86,
-- 0xf3, 0x9a, 0xf3, 0x92, 0x59, 0x80, 0xc0, 0x25,
-- 0xc0, 0x66, 0xd0, 0x94, 0x20, 0x86, 0xf3, 0x9a,
-- 0xf3, 0x96, 0xc8, 0x80, 0xf3, 0x92, 0x59, 0xc0,
-- 0xf3, 0x96, 0xc8, 0xc0, 0xf3, 0x92, 0x5a, 0x80,
-- 0xc0, 0x28, 0xc0, 0x6a, 0xd0, 0xb0, 0x20, 0x86,
-- 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x40, 0xf3, 0x92,
-- 0x59, 0x40, 0xc0, 0x29, 0xc0, 0x65, 0xd0, 0xb8,
-- 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x80,
-- 0xf3, 0x92, 0x58, 0xc0, 0xf3, 0x96, 0xca, 0x00,
-- 0xf3, 0x92, 0x58, 0x80, 0xc0, 0x24, 0xc0, 0x62,
-- 0xd0, 0x9c, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92,
-- 0x5a, 0x00, 0xc0, 0x27, 0xc0, 0x68, 0xd0, 0xa4,
-- 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xca, 0x80,
-- 0xf3, 0x92, 0x59, 0x80, 0xf3, 0x96, 0xca, 0x40,
-- 0xf3, 0x92, 0x5a, 0x40, 0xf3, 0x96, 0xc9, 0x40,
-- 0xf3, 0x92, 0x5a, 0x80, 0xc0, 0x23, 0xc0, 0x6a,
-- 0xd0, 0xac, 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x92,
-- 0x59, 0x40, 0xc0, 0x26, 0xc0, 0x65, 0xd0, 0xb4,
-- 0x20, 0x86, 0xf3, 0x9a, 0xf3, 0x96, 0xc9, 0x00,
-- 0xf3, 0x92, 0x59, 0x00, 0xc0, 0x29, 0xc0, 0x64,
-- 0xd0, 0xbc, 0x20, 0x86, 0xf3, 0x9a, 0xc0, 0x33,
-- 0xc0, 0x74, 0xc0, 0xb5, 0xc0, 0xf6, 0xd0, 0x40,
-- 0x00, 0xa0, 0xd8, 0x00, 0xa8, 0x38, 0x08, 0x45,
-- 0x0a, 0x09, 0x00, 0x0d, 0x0f, 0xc5, 0x50, 0x00,
-- 0x0a, 0x09, 0x00, 0x0d, 0x10, 0x08, 0x0f, 0xc5,
-- 0x01, 0x46, 0x00, 0x06, 0xa0, 0x7c, 0xa0, 0x3d,
-- 0x60, 0x42, 0x00, 0xc6, 0x0f, 0xc5, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x14, 0x48, 0xd0, 0x81,
-- 0x00, 0xef, 0xd1, 0x8c, 0x71, 0x46, 0x11, 0x60,
-- 0xfb, 0xb1, 0x60, 0x86, 0x71, 0x46, 0x31, 0x42,
-- 0xfb, 0xb1, 0x00, 0xec, 0xd1, 0x0c, 0x74, 0x84,
-- 0x00, 0x68, 0xd0, 0x80, 0x70, 0x02, 0x10, 0x20,
-- 0xfb, 0xc4, 0xc4, 0x82, 0xc4, 0xd2, 0xb4, 0xfc,
-- 0xda, 0x00, 0xda, 0x4f, 0x0a, 0x09, 0x0f, 0xef,
-- 0xd0, 0x3f, 0xb4, 0x7f, 0xca, 0x29, 0x1a, 0x18,
-- 0x4a, 0x00, 0x1a, 0x48, 0x00, 0x8d, 0x2a, 0x42,
-- 0xd0, 0x03, 0x40, 0x11, 0xfb, 0xe3, 0xb4, 0x44,
-- 0x00, 0xa0, 0xd0, 0xc0, 0x30, 0xd3, 0xff, 0xe3,
-- 0xb4, 0xfe, 0x01, 0x46, 0x00, 0x06, 0xaa, 0x3d,
-- 0xaa, 0x7c, 0x6a, 0x53, 0x00, 0xc6, 0xb4, 0xfe,
-- 0xb4, 0x7c, 0x1a, 0x61, 0xfb, 0xc8, 0xb4, 0x43,
-- 0x00, 0xef, 0xd0, 0x3f, 0x40, 0x11, 0xeb, 0xf7,
-- 0xb0, 0xc4, 0xe7, 0xf7, 0xeb, 0xee, 0x61, 0x53,
-- 0x64, 0x52, 0x64, 0xc4, 0x00, 0x28, 0xd1, 0x24,
-- 0x70, 0x04, 0x00, 0x21, 0xd0, 0x80, 0x50, 0x02,
-- 0x60, 0x04, 0x61, 0x46, 0x0a, 0x09, 0x0f, 0xc5,
-- 0x50, 0x00, 0x50, 0x00, 0x02, 0x31, 0xdc, 0x13,
-- 0x00, 0x27, 0xdc, 0xd8, 0xf0, 0x4a, 0x01, 0xfa,
-- 0xd2, 0x3d, 0x00, 0x25, 0xdc, 0xd8, 0xf0, 0x4a,
-- 0x09, 0x09, 0x01, 0xcd, 0x11, 0xe8, 0xf9, 0xe2,
-- 0x00, 0xe3, 0xd1, 0x9c, 0x09, 0x09, 0x05, 0xcd,
-- 0xb5, 0xc1, 0x09, 0x09, 0x00, 0x4d, 0xb0, 0x41,
-- 0x10, 0x46, 0x25, 0xc1, 0x09, 0x09, 0x06, 0x0d,
-- 0xb6, 0x01, 0x09, 0x09, 0x00, 0x4d, 0x08, 0x89,
-- 0xb0, 0x41, 0x10, 0x46, 0x26, 0x01, 0x00, 0x8d,
-- 0x08, 0x89, 0x10, 0x82, 0xd0, 0x04, 0xc0, 0x55,
-- 0x00, 0x40, 0x40, 0x40, 0x05, 0x4d, 0x08, 0x49,
-- 0x0b, 0x0d, 0xd1, 0x00, 0x15, 0x63, 0xe9, 0xa2,
-- 0xd1, 0x01, 0x55, 0x41, 0xdb, 0x01, 0x4b, 0x15,
-- 0xa1, 0x1b, 0x08, 0x89, 0x00, 0x4d, 0x08, 0x49,
-- 0x10, 0x41, 0xd1, 0x19, 0x46, 0x44, 0x26, 0x41,
-- 0x00, 0xcd, 0x08, 0x49, 0x10, 0xc4, 0x00, 0x4d,
-- 0x08, 0x49, 0x10, 0x41, 0x20, 0x81, 0xa0, 0x89,
-- 0x00, 0x4d, 0x10, 0x43, 0x20, 0xc1, 0xa0, 0xe8,
-- 0x08, 0x49, 0x00, 0x4d, 0x1b, 0x03, 0x5b, 0x01,
-- 0xbb, 0x3f, 0x6b, 0x06, 0x08, 0x49, 0xb1, 0xbc,
-- 0x00, 0x4d, 0x60, 0x46, 0x08, 0x49, 0xb1, 0xbc,
-- 0x0a, 0xcd, 0x1a, 0xc2, 0x4a, 0xd9, 0x1a, 0xde,
-- 0x6a, 0xc6, 0x08, 0x49, 0xb1, 0xbc, 0x00, 0x4d,
-- 0x60, 0x46, 0x10, 0x60, 0xea, 0x3e, 0xb1, 0xbc,
-- 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0x08, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0x08, 0x49, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0x09, 0xc9, 0x00, 0x4d, 0x60, 0x46, 0xb1, 0xbc,
-- 0x0a, 0x09, 0x00, 0x4d, 0x60, 0x46, 0xe2, 0x3e,
-- 0x11, 0xe3, 0xfa, 0x00, 0x00, 0xe7, 0xd0, 0xc0,
-- 0xd0, 0x84, 0xb0, 0x81, 0xe6, 0x3e, 0x08, 0x49,
-- 0x00, 0x4d, 0x60, 0x43, 0xb0, 0xfc, 0x10, 0x60,
-- 0xe9, 0xe7, 0x10, 0xa3, 0xf9, 0xf4, 0x00, 0xe8,
-- 0xd1, 0x80, 0xe1, 0xf8, 0x10, 0xa2, 0xf9, 0xfa,
-- 0x00, 0xe9, 0xd1, 0x80, 0xf2, 0xb0, 0xe1, 0xe7,
-- 0xd2, 0x3f, 0x0a, 0x09, 0x00, 0x4d, 0xb2, 0x01,
-- 0xf5, 0xfb, 0xe1, 0xe7, 0x11, 0xe7, 0xfa, 0x3e,
-- 0xd4, 0x01, 0x00, 0xe1, 0xd0, 0x24, 0x70, 0x00,
-- 0x10, 0x21, 0xea, 0x0d, 0x15, 0x63, 0xfa, 0x0d,
-- 0xd4, 0x03, 0x44, 0x2c, 0xb4, 0x3f, 0x00, 0xe6,
-- 0xd1, 0x90, 0x0b, 0x09, 0x00, 0x4d, 0x09, 0x49,
-- 0x10, 0x45, 0x00, 0x8d, 0x50, 0x81, 0xd0, 0x40,
-- 0x10, 0x87, 0x10, 0x98, 0x30, 0x42, 0xf2, 0x61,
-- 0x60, 0x46, 0xb1, 0xbc, 0x0b, 0x09, 0x00, 0x0d,
-- 0x09, 0x49, 0x00, 0x0d, 0xb4, 0x01, 0xfa, 0x0f,
-- 0x00, 0xe6, 0xd0, 0x18, 0x30, 0x06, 0xe6, 0x29,
-- 0x60, 0x46, 0xb1, 0xbc, 0xe2, 0x22, 0x00, 0xe0,
-- 0xd1, 0x88, 0x70, 0x46, 0x10, 0x63, 0xea, 0x39,
-- 0x10, 0x64, 0xea, 0x39, 0x00, 0xe6, 0xd1, 0x90,
-- 0xd0, 0x00, 0x60, 0x06, 0xb1, 0xbc, 0x60, 0x06,
-- 0xb1, 0xbc, 0x60, 0x06, 0xe2, 0x3e, 0x00, 0xef,
-- 0xd1, 0x84, 0x70, 0x46, 0x10, 0x60, 0xfa, 0x30,
-- 0x0c, 0x09, 0x90, 0x4d, 0x10, 0x60, 0xe6, 0x3f,
-- 0x00, 0x06, 0x05, 0x0d, 0x00, 0x22, 0xd0, 0x72,
-- 0x30, 0x54, 0xfa, 0x4b, 0xd4, 0x40, 0xf3, 0xb0,
-- 0xe2, 0x43, 0xb0, 0x7d, 0xe9, 0x7a, 0x00, 0xec,
-- 0xd1, 0xa0, 0xd0, 0x40, 0x60, 0x46, 0x02, 0x3c,
-- 0xda, 0x89, 0x00, 0xec, 0xd1, 0x80, 0x70, 0x46,
-- 0xb1, 0xbc, 0x70, 0x86, 0x30, 0x81, 0xe8, 0x46,
-- 0x15, 0x63, 0xea, 0x5e, 0x05, 0x5e, 0xe8, 0x46,
-- 0x01, 0x73, 0xd4, 0x3d, 0xe0, 0x46, 0x00, 0xe0,
-- 0xd0, 0x00, 0x70, 0xc0, 0x10, 0xc1, 0x00, 0xe0,
-- 0xd0, 0x08, 0x70, 0x00, 0x10, 0x23, 0xea, 0x75,
-- 0xc0, 0x83, 0x10, 0x9d, 0x30, 0xc2, 0x10, 0x9f,
-- 0x30, 0xc2, 0x00, 0xef, 0xd0, 0xac, 0x70, 0x82,
-- 0x10, 0xa3, 0xea, 0x75, 0x10, 0xc1, 0xc0, 0x83,
-- 0x30, 0x81, 0xe6, 0x7e, 0xc0, 0x83, 0x20, 0x81,
-- 0xf6, 0x7f, 0xd0, 0x40, 0x30, 0x43, 0x0f, 0xc5,
-- 0xc0, 0x43, 0x0f, 0xc5, 0x00, 0xed, 0xd1, 0xa4,
-- 0x72, 0x86, 0x15, 0xa3, 0xee, 0x23, 0x15, 0xa1,
-- 0xe6, 0x23, 0x08, 0x20, 0xd0, 0x00, 0x5f, 0x00,
-- 0xd8, 0xc4, 0x15, 0x63, 0xe9, 0x7e, 0x48, 0xd5,
-- 0x18, 0xde, 0x18, 0xe0, 0xe9, 0xc2, 0x00, 0xed,
-- 0xd1, 0xb4, 0x79, 0xc6, 0x19, 0xe0, 0xe9, 0x8c,
-- 0x00, 0xed, 0xd0, 0x3a, 0x79, 0xc6, 0x69, 0xc0,
-- 0xd9, 0xc0, 0x69, 0xc6, 0x00, 0xed, 0xd0, 0x38,
-- 0x79, 0x40, 0x19, 0x60, 0xe9, 0x98, 0x00, 0x28,
-- 0xd0, 0x24, 0x70, 0x40, 0x02, 0x20, 0xd0, 0x80,
-- 0x50, 0x42, 0x60, 0x40, 0x15, 0xa3, 0xe9, 0x9f,
-- 0x00, 0xec, 0xd1, 0xb8, 0x79, 0xc6, 0x69, 0x46,
-- 0xc9, 0x67, 0x00, 0xec, 0xd9, 0xb4, 0x70, 0x66,
-- 0x00, 0xec, 0xd1, 0xbc, 0x70, 0x06, 0x10, 0x20,
-- 0xed, 0xbe, 0x10, 0x60, 0xe9, 0xc1, 0x00, 0xe0,
-- 0xda, 0xa8, 0x7a, 0xaa, 0xc0, 0x2a, 0x10, 0x1f,
-- 0x00, 0x22, 0xd0, 0xa0, 0x70, 0x82, 0x20, 0x6a,
-- 0x00, 0x9f, 0xe9, 0xb5, 0x20, 0x40, 0x19, 0x60,
-- 0xf9, 0xb8, 0xc9, 0x41, 0xb0, 0x48, 0x30, 0x65,
-- 0xf5, 0xbd, 0xb0, 0x70, 0xed, 0xbe, 0xd9, 0x40,
-- 0x00, 0xed, 0xd1, 0xbc, 0x69, 0x46, 0x69, 0x66,
-- 0x12, 0xa4, 0xea, 0x21, 0x00, 0xec, 0xd1, 0xbc,
-- 0x73, 0xc6, 0x15, 0xa3, 0xe9, 0xdf, 0x33, 0xe3,
-- 0xe5, 0xd3, 0xed, 0xd2, 0x63, 0xc6, 0x00, 0x21,
-- 0xd1, 0xa8, 0x63, 0xc6, 0x00, 0xed, 0xd1, 0xa0,
-- 0x63, 0xc6, 0x15, 0xa1, 0xf9, 0xdc, 0x12, 0xa3,
-- 0xe5, 0xe3, 0xd3, 0xc2, 0x00, 0xec, 0xd1, 0xbc,
-- 0x63, 0xc6, 0xe1, 0xe3, 0x12, 0xa3, 0xea, 0x21,
-- 0xe1, 0xe3, 0x12, 0xa2, 0xf6, 0x21, 0x13, 0xe0,
-- 0xfa, 0x21, 0x00, 0xee, 0xd1, 0x8c, 0x78, 0x06,
-- 0xb1, 0xbc, 0x78, 0x46, 0xb1, 0xbc, 0x78, 0x86,
-- 0xd1, 0x88, 0x72, 0x46, 0xd1, 0x84, 0x73, 0x06,
-- 0x13, 0x20, 0xf9, 0xe3, 0x00, 0x64, 0xd1, 0xa0,
-- 0x70, 0x46, 0xd0, 0xa2, 0x30, 0x81, 0xe9, 0xff,
-- 0x10, 0x70, 0xea, 0x11, 0x10, 0x6d, 0xea, 0x14,
-- 0x10, 0x76, 0xea, 0x19, 0x10, 0x7a, 0xea, 0x28,
-- 0xe2, 0x3b, 0x18, 0xe0, 0xea, 0x3b, 0x00, 0xed,
-- 0xd1, 0x80, 0x70, 0x86, 0xb0, 0x81, 0xd0, 0x3f,
-- 0x40, 0x02, 0x10, 0x20, 0xea, 0x0c, 0x60, 0x86,
-- 0xf3, 0x8a, 0xe1, 0xe3, 0xc0, 0x02, 0x10, 0x1a,
-- 0x50, 0x80, 0x60, 0x86, 0xe2, 0x3b, 0x15, 0xa3,
-- 0xea, 0x21, 0xe2, 0xe9, 0xd2, 0x80, 0x00, 0xed,
-- 0xd1, 0xa4, 0x62, 0x86, 0xe3, 0x0c, 0x00, 0xed,
-- 0xd1, 0x88, 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40,
-- 0x60, 0x46, 0x15, 0xa3, 0xfb, 0x0c, 0xd5, 0x84,
-- 0xe3, 0x0c, 0xd5, 0x00, 0xb5, 0x01, 0x01, 0x7a,
-- 0xde, 0x1a, 0xe0, 0x46, 0x00, 0xed, 0xd1, 0x88,
-- 0xd0, 0x60, 0x70, 0x06, 0x50, 0x40, 0x60, 0x46,
-- 0x15, 0xa2, 0xe7, 0x0c, 0xee, 0x21, 0x00, 0x21,
-- 0xd1, 0x8c, 0x18, 0xe0, 0xfa, 0x39, 0x70, 0x46,
-- 0x10, 0x61, 0xea, 0x70, 0xe2, 0x21, 0x65, 0x86,
-- 0xe2, 0x21, 0x18, 0xe0, 0xea, 0x70, 0xd1, 0x80,
-- 0x73, 0x06, 0x15, 0xa2, 0xee, 0x68, 0x00, 0x22,
-- 0xd1, 0x80, 0x70, 0x46, 0x6b, 0x06, 0xcb, 0x01,
-- 0xb1, 0xb4, 0x70, 0x46, 0x6a, 0xc6, 0xca, 0xc1,
-- 0x00, 0x65, 0xd1, 0x98, 0x70, 0x46, 0x10, 0x61,
-- 0xfa, 0x50, 0x02, 0x41, 0xc3, 0x21, 0xc7, 0xe0,
-- 0x02, 0x50, 0xea, 0x56, 0xc3, 0x20, 0xc7, 0xe1,
-- 0xd1, 0x88, 0xd0, 0x01, 0x02, 0x40, 0x62, 0x46,
-- 0x0f, 0xef, 0xd0, 0x7f, 0x30, 0x6f, 0xfa, 0x5f,
-- 0xc3, 0x20, 0xc7, 0x4c, 0xd0, 0x00, 0x00, 0x65,
-- 0xd1, 0x98, 0x70, 0x46, 0x60, 0x06, 0xb0, 0x41,
-- 0x43, 0x01, 0xe2, 0x70, 0xc3, 0x22, 0xc7, 0xcc,
-- 0xc7, 0x60, 0xc7, 0xa1, 0x02, 0x50, 0xea, 0x70,
-- 0xc7, 0x61, 0xc7, 0xa0, 0xdb, 0x80, 0xd1, 0x00,
-- 0x00, 0xef, 0xd1, 0xa8, 0x70, 0x46, 0x10, 0x60,
-- 0xfa, 0x7a, 0x00, 0xe0, 0xd1, 0x88, 0x70, 0x46,
-- 0x00, 0x22, 0xd1, 0xb0, 0x70, 0x86, 0x30, 0x81,
-- 0xea, 0x82, 0x60, 0x46, 0xd0, 0x20, 0xf3, 0x06,
-- 0x10, 0x63, 0xea, 0x87, 0x10, 0x64, 0xea, 0x87,
-- 0xe2, 0x95, 0x00, 0xef, 0xd1, 0x6c, 0x71, 0x45,
-- 0xc0, 0x05, 0x30, 0x01, 0xf6, 0x95, 0xdb, 0x82,
-- 0xd1, 0x01, 0x10, 0x63, 0xea, 0x95, 0xd1, 0x02,
-- 0x11, 0x62, 0xea, 0x95, 0xd1, 0x03, 0xd1, 0x8c,
-- 0x61, 0x06, 0xdb, 0x40, 0x00, 0xe0, 0xd0, 0x00,
-- 0x71, 0x00, 0xc0, 0x84, 0x10, 0x9c, 0xb0, 0x96,
-- 0xfa, 0xa0, 0xb1, 0x38, 0xb0, 0x96, 0xfa, 0xa3,
-- 0xb1, 0x30, 0x00, 0x29, 0xd1, 0x84, 0x00, 0x22,
-- 0xd0, 0x74, 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06,
-- 0x30, 0xc2, 0xea, 0xae, 0x60, 0x81, 0xdb, 0x41,
-- 0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x7c, 0x71, 0x00,
-- 0x70, 0x86, 0x70, 0xc1, 0x61, 0x06, 0x30, 0xc2,
-- 0xea, 0xb9, 0x60, 0x81, 0xdb, 0x41, 0x00, 0xee,
-- 0xd1, 0xb4, 0x70, 0x06, 0xb1, 0xbc, 0x70, 0x46,
-- 0x30, 0x40, 0xea, 0xc2, 0x60, 0x06, 0xdb, 0x41,
-- 0x00, 0x23, 0xd0, 0x70, 0x30, 0x81, 0xea, 0xc7,
-- 0x30, 0x81, 0x50, 0x02, 0xea, 0xca, 0xd0, 0x01,
-- 0x00, 0x22, 0xd1, 0xbc, 0x70, 0x86, 0x30, 0x80,
-- 0xea, 0xd2, 0x60, 0x06, 0xd0, 0x10, 0xf3, 0x06,
-- 0x00, 0x22, 0xd1, 0xa4, 0x71, 0x06, 0xd0, 0x01,
-- 0x41, 0x00, 0x5b, 0x44, 0x5b, 0x6e, 0x6b, 0x46,
-- 0x00, 0x28, 0xd0, 0x70, 0x70, 0x41, 0x10, 0x62,
-- 0xfa, 0xe6, 0xd1, 0x84, 0x70, 0x06, 0x10, 0x20,
-- 0xfa, 0xdf, 0x00, 0x22, 0xd0, 0x00, 0xf3, 0x06,
-- 0x02, 0x7d, 0xdc, 0x62, 0xe0, 0x46, 0x00, 0xed,
-- 0xd1, 0x88, 0x71, 0x06, 0x01, 0x1f, 0xfa, 0xfd,
-- 0xd0, 0x41, 0x41, 0x01, 0xd0, 0x62, 0x00, 0x65,
-- 0xd0, 0x30, 0x70, 0x00, 0x10, 0x21, 0xea, 0xfa,
-- 0xee, 0xf9, 0x1a, 0xe1, 0xfa, 0xfa, 0xd0, 0x52,
-- 0x51, 0x01, 0x61, 0x06, 0xe3, 0x0c, 0x18, 0xe0,
-- 0xea, 0x70, 0xc7, 0x60, 0xc7, 0xe1, 0x02, 0x50,
-- 0xea, 0x70, 0xc7, 0x61, 0xc7, 0xe0, 0xe2, 0x70,
-- 0x00, 0x28, 0xdc, 0xa4, 0x7c, 0x72, 0x5c, 0x40,
-- 0x6c, 0x72, 0x0f, 0xc5, 0x18, 0xe0, 0xeb, 0x82,
-- 0xd9, 0x0d, 0x00, 0xee, 0xd1, 0xa4, 0x70, 0x06,
-- 0x10, 0x21, 0xfb, 0x7f, 0xd9, 0x0c, 0x90, 0x06,
-- 0x00, 0x10, 0xeb, 0x7f, 0x00, 0x21, 0xd1, 0x88,
-- 0x7a, 0x06, 0x1a, 0x20, 0xeb, 0x7f, 0xd9, 0x00,
-- 0x00, 0xed, 0xd1, 0xbc, 0x79, 0x46, 0x19, 0x60,
-- 0xeb, 0x7f, 0x39, 0x68, 0xc0, 0xe5, 0xc0, 0x25,
-- 0x10, 0x13, 0xb0, 0x0f, 0xef, 0x7f, 0xb0, 0x22,
-- 0xe7, 0x7f, 0x00, 0xe0, 0xd1, 0xa8, 0x71, 0x46,
-- 0x11, 0x5f, 0x29, 0x45, 0x00, 0x22, 0xd0, 0x18,
-- 0x00, 0x22, 0xd4, 0x54, 0x00, 0x22, 0xd0, 0x9c,
-- 0x70, 0x00, 0x74, 0x51, 0x70, 0x42, 0x34, 0x40,
-- 0xe7, 0x3c, 0xd0, 0x40, 0x00, 0x22, 0xd4, 0x50,
-- 0x74, 0x51, 0x34, 0x40, 0xef, 0x42, 0x20, 0x45,
-- 0x60, 0x42, 0x39, 0x41, 0x19, 0x60, 0xf7, 0x5e,
-- 0x00, 0x65, 0xd1, 0xa8, 0x7a, 0x86, 0x29, 0x6a,
-- 0x19, 0x59, 0xb9, 0x7e, 0xf7, 0x75, 0x15, 0xa3,
-- 0xf7, 0x57, 0x00, 0xed, 0xd1, 0xac, 0x70, 0x06,
-- 0x00, 0xed, 0xd1, 0xb0, 0x70, 0x46, 0x30, 0x01,
-- 0xfb, 0x7f, 0x00, 0x65, 0xd1, 0x84, 0x70, 0x46,
-- 0xb0, 0x7f, 0x60, 0x46, 0xd5, 0x84, 0xe3, 0x7f,
-- 0x11, 0x41, 0xd0, 0x4a, 0x00, 0xed, 0xd1, 0xa0,
-- 0x74, 0x46, 0xd0, 0x00, 0x60, 0x06, 0x30, 0xc5,
-- 0x39, 0x45, 0xe7, 0x6e, 0x14, 0x60, 0xeb, 0x6b,
-- 0xf3, 0x85, 0xb0, 0x41, 0xef, 0x65, 0xe3, 0x71,
-- 0x00, 0x66, 0xd1, 0xa0, 0x60, 0xc6, 0x15, 0xa3,
-- 0xeb, 0x7f, 0xf3, 0x85, 0xe3, 0x7f, 0xd9, 0x01,
-- 0x00, 0x66, 0xd1, 0xa0, 0x70, 0x06, 0x30, 0x03,
-- 0xe7, 0x7e, 0x10, 0x1d, 0x10, 0x3b, 0xe7, 0x7f,
-- 0x60, 0xc6, 0x00, 0x66, 0xd1, 0xa4, 0x69, 0x06,
-- 0x15, 0xa4, 0xea, 0x23, 0xe2, 0x3b, 0x00, 0x65,
-- 0xdd, 0x08, 0x7c, 0xf4, 0xbc, 0xff, 0x6c, 0xf4,
-- 0x00, 0xef, 0xdd, 0x10, 0x7c, 0xf4, 0xbc, 0xfe,
-- 0x6c, 0xf4, 0xc0, 0x3f, 0xf1, 0x18, 0xf1, 0x16,
-- 0xf1, 0x18, 0x00, 0x05, 0x08, 0x20, 0xd0, 0x40,
-- 0x5f, 0x01, 0x15, 0x63, 0xe9, 0x77, 0x05, 0x5e,
-- 0xea, 0xf2, 0x00, 0x22, 0xd1, 0xa0, 0x6b, 0x06,
-- 0x00, 0x22, 0xd1, 0xa8, 0x6b, 0xc6, 0x00, 0x22,
-- 0xd1, 0xac, 0x6a, 0xc6, 0x00, 0xee, 0xd0, 0x0c,
-- 0x00, 0xe6, 0xd1, 0x9c, 0x70, 0x40, 0x30, 0x5f,
-- 0xe9, 0x8d, 0xb0, 0x3c, 0xb1, 0xb4, 0x70, 0x40,
-- 0x30, 0x5f, 0xe9, 0x8d, 0xb1, 0xb4, 0x00, 0xe6,
-- 0xd0, 0x10, 0xd0, 0x83, 0x70, 0x40, 0x60, 0x46,
-- 0xb0, 0x3c, 0xb1, 0xbc, 0xb0, 0x81, 0xed, 0x90,
-- 0x00, 0xee, 0xd0, 0x0c, 0x00, 0xe6, 0xd1, 0x9c,
-- 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3, 0xb0, 0x3c,
-- 0xb1, 0xb4, 0x70, 0x40, 0x30, 0x4c, 0xe9, 0xa3,
-- 0xb1, 0xb4, 0x00, 0xe6, 0xd0, 0x00, 0x61, 0x80,
-- 0x00, 0x21, 0xd1, 0xb4, 0x70, 0x06, 0x10, 0x20,
-- 0xe9, 0xae, 0xd0, 0x00, 0x60, 0x06, 0xf1, 0x18,
-- 0x00, 0x21, 0xd1, 0x8c, 0x70, 0x46, 0x65, 0x86,
-- 0xde, 0xc0, 0x00, 0xee, 0xd0, 0x20, 0x70, 0x00,
-- 0x10, 0x22, 0xfd, 0xb9, 0xde, 0xc2, 0x00, 0x21,
-- 0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xc0,
-- 0x15, 0xa3, 0xe9, 0xdc, 0xd0, 0x02, 0x4c, 0x00,
-- 0x10, 0x63, 0xe9, 0xc5, 0xcc, 0x3b, 0xd0, 0x04,
-- 0x63, 0x00, 0xd0, 0x00, 0x70, 0x00, 0x30, 0x1f,
-- 0xfa, 0xf2, 0xd0, 0x18, 0x70, 0x00, 0x10, 0x20,
-- 0xed, 0xc7, 0xd0, 0x04, 0x70, 0x80, 0x10, 0xa0,
-- 0xea, 0xf2, 0xf1, 0x16, 0x00, 0x21, 0xd0, 0x9a,
-- 0xc0, 0x39, 0x30, 0x1f, 0x10, 0x18, 0x30, 0x02,
-- 0xfd, 0xcf, 0xe2, 0xf2, 0x00, 0xe0, 0xd9, 0x04,
-- 0x79, 0x24, 0xb9, 0x38, 0x19, 0x1c, 0xd0, 0x1e,
-- 0x30, 0x24, 0xf5, 0xe5, 0x29, 0x00, 0xdc, 0x88,
-- 0x4c, 0xac, 0xd0, 0x02, 0x40, 0x2c, 0x10, 0x02,
-- 0x0c, 0x80, 0x10, 0x63, 0xea, 0x5a, 0x15, 0x63,
-- 0xf9, 0xf0, 0xf1, 0x18, 0xdc, 0x1e, 0x1e, 0xe0,
-- 0xe9, 0xf6, 0x15, 0x63, 0xf9, 0xf6, 0xbe, 0xfc,
-- 0xd0, 0x2c, 0x6c, 0x00, 0xcc, 0x24, 0xd9, 0x40,
-- 0x06, 0x50, 0xea, 0x0c, 0xc0, 0x24, 0xb0, 0x0f,
-- 0xfe, 0x0c, 0xd9, 0x74, 0x79, 0x65, 0x19, 0x5f,
-- 0x30, 0x25, 0xee, 0x05, 0x29, 0x40, 0x19, 0x5f,
-- 0x19, 0x41, 0xc0, 0x25, 0x20, 0x30, 0x30, 0x24,
-- 0xe6, 0x0c, 0x3c, 0x00, 0xd0, 0x38, 0x69, 0x40,
-- 0x1c, 0x05, 0xbc, 0x38, 0x3c, 0x32, 0x5c, 0x3b,
-- 0xbc, 0x3f, 0xd8, 0xec, 0x78, 0xe3, 0xc0, 0xa3,
-- 0x10, 0xaf, 0xf6, 0x19, 0xd0, 0x8f, 0x02, 0xe4,
-- 0xd8, 0x00, 0xd0, 0xc0, 0x20, 0xe0, 0xb0, 0x81,
-- 0xee, 0x1c, 0xd0, 0x30, 0x60, 0xc0, 0x00, 0xab,
-- 0xd0, 0x30, 0xc0, 0xc0, 0xd8, 0x40, 0xc1, 0x23,
-- 0xd4, 0x5e, 0x34, 0x63, 0xdc, 0x40, 0x0c, 0x1f,
-- 0xfa, 0x45, 0xc0, 0x65, 0xb0, 0x41, 0xe6, 0x31,
-- 0x68, 0x40, 0xb0, 0x3c, 0xe2, 0x2c, 0xc0, 0xc0,
-- 0x34, 0x65, 0xdc, 0x48, 0x4c, 0x70, 0x1c, 0x5f,
-- 0x20, 0xf1, 0x15, 0x63, 0xfa, 0x46, 0xf2, 0x3e,
-- 0xc1, 0x11, 0xc0, 0x83, 0xf2, 0x8f, 0xe2, 0x59,
-- 0xb1, 0x01, 0xe6, 0x44, 0x68, 0x40, 0x28, 0x60,
-- 0xb0, 0x3c, 0xe2, 0x3e, 0x0f, 0xc5, 0xd9, 0x40,
-- 0xb1, 0x0f, 0x11, 0x01, 0x21, 0x25, 0xf2, 0x3e,
-- 0xc1, 0x11, 0xb1, 0x01, 0xe6, 0x59, 0x20, 0x31,
-- 0x68, 0x40, 0x30, 0x31, 0xb0, 0x3c, 0x28, 0x60,
-- 0x70, 0x43, 0x30, 0x31, 0x60, 0x40, 0x20, 0x31,
-- 0xb0, 0x3c, 0xb0, 0xf8, 0xe2, 0x4b, 0xe2, 0xe1,
-- 0xd8, 0xec, 0x78, 0xe3, 0x00, 0xa8, 0xd0, 0x80,
-- 0x00, 0xa8, 0xd1, 0x44, 0x00, 0xab, 0xd0, 0x30,
-- 0xc0, 0xc0, 0x0c, 0x1f, 0xfa, 0x9d, 0xd9, 0x78,
-- 0x79, 0x65, 0x39, 0x25, 0x19, 0x5f, 0xc9, 0xa5,
-- 0x19, 0x83, 0x20, 0x26, 0x20, 0xe6, 0x20, 0xa6,
-- 0x21, 0x66, 0xc1, 0x23, 0xc0, 0x64, 0x10, 0x5f,
-- 0x10, 0x9d, 0x20, 0x81, 0x31, 0x01, 0x30, 0x44,
-- 0xf6, 0x78, 0x21, 0x01, 0x30, 0x84, 0x10, 0x83,
-- 0xc4, 0x64, 0x34, 0x63, 0xdc, 0x48, 0x4c, 0x70,
-- 0x1c, 0x5f, 0x15, 0x63, 0xfa, 0xad, 0x20, 0xb1,
-- 0xf2, 0x8f, 0xc1, 0x24, 0x11, 0x1f, 0xc0, 0x85,
-- 0x30, 0xb1, 0xf2, 0x8f, 0xc1, 0x11, 0xc0, 0x83,
-- 0x0c, 0x9d, 0xfa, 0x8d, 0xb0, 0xbc, 0xf2, 0x8f,
-- 0xe2, 0xd6, 0xb1, 0x01, 0xe6, 0x44, 0x70, 0x42,
-- 0xb0, 0xb8, 0x60, 0x40, 0xb0, 0x3c, 0xe2, 0x8f,
-- 0xb1, 0x01, 0xe6, 0x44, 0x70, 0x42, 0xb0, 0xb8,
-- 0x60, 0x40, 0xb0, 0x38, 0xe2, 0x96, 0x00, 0xab,
-- 0xd0, 0x34, 0xc1, 0x23, 0xb1, 0x0f, 0xf2, 0x96,
-- 0xd1, 0x1e, 0x31, 0x23, 0x00, 0xa8, 0xd0, 0x84,
-- 0xf2, 0x96, 0xd1, 0x0f, 0x00, 0xa8, 0xd0, 0x84,
-- 0xc0, 0x03, 0xf2, 0x96, 0xe2, 0xd6, 0xd8, 0x82,
-- 0x48, 0x95, 0x18, 0x81, 0xb1, 0x01, 0xe6, 0xc3,
-- 0x20, 0xb1, 0x70, 0x42, 0x30, 0xb1, 0x20, 0x22,
-- 0x60, 0x40, 0x30, 0x22, 0xb0, 0xbc, 0xb0, 0x3c,
-- 0x30, 0xb1, 0x70, 0x42, 0x20, 0xb1, 0x30, 0x22,
-- 0x60, 0x40, 0x20, 0x22, 0xb0, 0xbc, 0xb0, 0x3c,
-- 0xe2, 0xb0, 0xc1, 0x11, 0xc0, 0x85, 0x30, 0xb1,
-- 0x20, 0xe2, 0xb1, 0x01, 0xe6, 0xd6, 0x70, 0x42,
-- 0xb0, 0xb8, 0x20, 0x22, 0x60, 0x40, 0x30, 0x22,
-- 0xb0, 0x3c, 0x70, 0x43, 0xb0, 0xf8, 0x30, 0x22,
-- 0x60, 0x40, 0x20, 0x22, 0xb0, 0x3c, 0xe2, 0xc7,
-- 0xd0, 0x08, 0x5c, 0x00, 0x3c, 0x32, 0xd0, 0x04,
-- 0x40, 0x30, 0x3c, 0x00, 0x15, 0x63, 0xfa, 0xe1,
-- 0x1e, 0xe0, 0xea, 0xe1, 0xbc, 0x3c, 0x00, 0xab,
-- 0xd0, 0xb0, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0x20,
-- 0xd1, 0x1e, 0x70, 0x42, 0xb0, 0xbc, 0x60, 0x40,
-- 0xb0, 0x3c, 0xb1, 0x01, 0xee, 0xe7, 0xd0, 0x30,
-- 0x30, 0x30, 0xee, 0xed, 0xd0, 0x04, 0x63, 0x00,
-- 0x08, 0x20, 0xd0, 0x40, 0x3f, 0x01, 0x02, 0xba,
-- 0xd0, 0x3c, 0xe0, 0x46, 0x01, 0x46, 0xd0, 0x08,
-- 0x94, 0x89, 0xd0, 0x8c, 0x44, 0x82, 0x14, 0x9e,
-- 0x30, 0x12, 0xd0, 0x88, 0x10, 0x80, 0x00, 0xe8,
-- 0xd1, 0x80, 0x70, 0xc6, 0x00, 0x06, 0xa0, 0xbd,
-- 0xa0, 0xfc, 0x80, 0x3f, 0xb1, 0xbe, 0x60, 0xc6,
-- 0x00, 0x06, 0x80, 0xa9, 0x80, 0x3f, 0x80, 0x2a,
-- 0x80, 0x3f, 0x00, 0x21, 0xd0, 0x3c, 0x00, 0x0a,
-- 0xb1, 0x82, 0xd0, 0x6b, 0x70, 0x46, 0x00, 0x06,
-- 0x80, 0x07, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69,
-- 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29,
-- 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20,
-- 0xd0, 0x00, 0xa0, 0x29, 0x80, 0x2b, 0x0c, 0x20,
-- 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x27, 0x90, 0x09,
-- 0xd0, 0x41, 0x40, 0x01, 0xd0, 0x44, 0x40, 0x70,
-- 0x20, 0x01, 0xa0, 0x27, 0x80, 0x3f, 0x00, 0xc6,
-- 0x15, 0x63, 0xe9, 0xae, 0x05, 0x5e, 0xe9, 0xbe,
-- 0x00, 0xe0, 0xd0, 0x40, 0x70, 0x81, 0x10, 0x9c,
-- 0xb0, 0x96, 0xf9, 0xb7, 0x00, 0x21, 0xd0, 0x40,
-- 0xe1, 0xbb, 0xb0, 0x96, 0xf9, 0xbe, 0x00, 0x22,
-- 0xd0, 0x40, 0x27, 0xc1, 0x27, 0x41, 0x27, 0x81,
-- 0x90, 0x83, 0x00, 0x64, 0xd0, 0x10, 0x60, 0x80,
-- 0x01, 0x46, 0x82, 0x34, 0x80, 0x3f, 0x00, 0x64,
-- 0xd0, 0x14, 0x67, 0x40, 0x80, 0x34, 0x80, 0x3f,
-- 0x00, 0xc6, 0x90, 0xae, 0x00, 0x64, 0xd0, 0x18,
-- 0x60, 0x80, 0x90, 0xa6, 0x00, 0x64, 0xd0, 0x1c,
-- 0x60, 0x80, 0x15, 0x63, 0xe9, 0xe3, 0x0c, 0x1f,
-- 0xe9, 0xe3, 0x05, 0x50, 0xf9, 0xe3, 0x15, 0xa3,
-- 0xf9, 0xe3, 0x90, 0x4d, 0x10, 0x60, 0xe5, 0xdb,
-- 0x00, 0x06, 0x05, 0x0d, 0x01, 0x7a, 0xde, 0x1a,
-- 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfb, 0x00, 0x21,
-- 0xd0, 0x04, 0x70, 0x00, 0x10, 0x21, 0xe9, 0xfb,
-- 0xd0, 0x38, 0x70, 0x00, 0x15, 0x63, 0xe9, 0xef,
-- 0x10, 0x1f, 0x15, 0x21, 0xe5, 0xe0, 0xd0, 0x5e,
-- 0x30, 0x54, 0xe5, 0xe0, 0xc0, 0x40, 0xb0, 0x7f,
-- 0x30, 0x54, 0xe9, 0xfb, 0x0c, 0x09, 0x05, 0x0d,
-- 0xe1, 0xef, 0xc0, 0x5f, 0x10, 0x58, 0x10, 0x48,
-- 0x00, 0xee, 0xd0, 0x8c, 0xd0, 0xc3, 0x70, 0x02,
-- 0x30, 0x01, 0xea, 0x10, 0xb0, 0xbc, 0xb0, 0xc1,
-- 0xee, 0x01, 0x00, 0x26, 0xd0, 0x20, 0x70, 0x40,
-- 0xb0, 0x7f, 0x60, 0x40, 0x15, 0xa3, 0xea, 0x0f,
-- 0xb0, 0x88, 0x77, 0xc2, 0x80, 0x07, 0x09, 0x49,
-- 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0,
-- 0x00, 0x4d, 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1,
-- 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50,
-- 0xfa, 0x1a, 0x0c, 0x49, 0x00, 0x8d, 0xc0, 0x42,
-- 0x10, 0x60, 0xea, 0x2a, 0xb0, 0x5e, 0xb0, 0x43,
-- 0xfe, 0x34, 0xd0, 0x61, 0x23, 0x81, 0xe2, 0x1f,
-- 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20, 0xfe, 0x31,
-- 0xd0, 0x5f, 0x30, 0x54, 0xee, 0x10, 0x03, 0xb3,
-- 0xd8, 0x29, 0xe0, 0x46, 0xc6, 0xd4, 0xb6, 0xc1,
-- 0xe6, 0x31, 0xd0, 0x5e, 0x30, 0x5b, 0xfe, 0x31,
-- 0xd7, 0x00, 0xb7, 0x01, 0xd3, 0x81, 0x00, 0x27,
-- 0xd0, 0x10, 0xd0, 0x81, 0x60, 0x80, 0x15, 0x63,
-- 0xfa, 0x54, 0x00, 0x22, 0xdc, 0xd8, 0x03, 0xf7,
-- 0xd2, 0x10, 0xf0, 0x4a, 0x15, 0xa3, 0xfa, 0x51,
-- 0x02, 0xf6, 0xde, 0x26, 0x0c, 0x10, 0xf8, 0x46,
-- 0x02, 0xfb, 0xda, 0x22, 0xe0, 0x46, 0x02, 0xf1,
-- 0xd8, 0x2b, 0xe0, 0x46, 0x00, 0x22, 0xdc, 0xd8,
-- 0x03, 0xf9, 0xd2, 0x10, 0xf0, 0x4a, 0x03, 0x34,
-- 0xdc, 0x20, 0x15, 0xa3, 0xe8, 0x46, 0x02, 0xff,
-- 0xde, 0x27, 0xe0, 0x46, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xe0,
-- 0xe1, 0xec, 0xe2, 0x12, 0xe2, 0x14, 0xe1, 0xc7,
-- 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50,
-- 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42,
-- 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e,
-- 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31,
-- 0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10,
-- 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44,
-- 0xe1, 0x79, 0x03, 0xde, 0xf9, 0xba, 0x03, 0xdf,
-- 0xe9, 0x99, 0xd3, 0x40, 0xca, 0x50, 0xd1, 0x42,
-- 0xe2, 0xea, 0xc0, 0x50, 0x10, 0x54, 0xc0, 0x90,
-- 0x10, 0x8c, 0x10, 0x92, 0x10, 0xe0, 0xe5, 0xa8,
-- 0xc0, 0x01, 0x10, 0x01, 0x20, 0x40, 0xc0, 0x02,
-- 0x10, 0x01, 0x20, 0x80, 0x10, 0x60, 0xfd, 0xab,
-- 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xae, 0xb0, 0xbf,
-- 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef, 0xd0, 0x3e,
-- 0x20, 0x52, 0x20, 0x83, 0x20, 0x93, 0x10, 0x4c,
-- 0x10, 0x82, 0x40, 0x80, 0x50, 0x42, 0x0f, 0xc5,
-- 0xcb, 0xaa, 0xcb, 0xeb, 0xca, 0x50, 0xd0, 0xc0,
-- 0xb0, 0xc1, 0xf1, 0x9b, 0xcb, 0x01, 0xd0, 0xc1,
-- 0xf1, 0x9b, 0xcb, 0x41, 0xba, 0x7f, 0xbb, 0x3f,
-- 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b,
-- 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48,
-- 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0xd5,
-- 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c,
-- 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80,
-- 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80, 0xde, 0x84,
-- 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3,
-- 0x13, 0xa0, 0xed, 0xe5, 0xf2, 0x32, 0xb3, 0x81,
-- 0xe9, 0xec, 0x80, 0x07, 0xd4, 0x00, 0xc4, 0x50,
-- 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71, 0x20, 0x56,
-- 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c,
-- 0xe9, 0xfa, 0x06, 0x5e, 0xfa, 0x03, 0x08, 0x89,
-- 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xfa, 0xd3, 0xc4,
-- 0x06, 0x5e, 0xfa, 0x03, 0xd0, 0x43, 0x40, 0x4c,
-- 0xea, 0x03, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87,
-- 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6,
-- 0x03, 0x1c, 0xea, 0x0a, 0x09, 0x49, 0x00, 0x0d,
-- 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19,
-- 0xea, 0x10, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b,
-- 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50,
-- 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xd3,
-- 0xe1, 0xdc, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xac,
-- 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50,
-- 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42,
-- 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e,
-- 0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10,
-- 0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x30,
-- 0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10,
-- 0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44,
-- 0xe1, 0x79, 0x03, 0xdf, 0xe9, 0xa1, 0xd3, 0x40,
-- 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa8,
-- 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa5, 0x03, 0x1d,
-- 0xf9, 0xa8, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae,
-- 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea,
-- 0xb1, 0x7e, 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00,
-- 0x2c, 0x40, 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xd2,
-- 0x00, 0xa8, 0xd0, 0x00, 0xcc, 0x5b, 0x1c, 0x5f,
-- 0x1c, 0x43, 0x20, 0x31, 0x7c, 0x40, 0xb0, 0x3c,
-- 0x7e, 0x80, 0xcc, 0xb1, 0xce, 0xfa, 0x1c, 0x9f,
-- 0x1e, 0xdf, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99,
-- 0xe9, 0xc4, 0x3c, 0x80, 0x0e, 0xd9, 0xe9, 0xc7,
-- 0x3e, 0xc0, 0x3e, 0xf2, 0x3e, 0xb1, 0xd0, 0x01,
-- 0x40, 0x1b, 0x10, 0x05, 0x20, 0x1f, 0x2c, 0x40,
-- 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80,
-- 0xe3, 0x1e, 0xd3, 0xc2, 0xf2, 0xd3, 0x13, 0xa0,
-- 0xed, 0xd8, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xdc,
-- 0x80, 0x07, 0xe2, 0x95, 0x0d, 0x09, 0xd1, 0x8c,
-- 0x03, 0x0d, 0x41, 0x8c, 0xe9, 0xe8, 0x06, 0x5e,
-- 0xf9, 0xf1, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3,
-- 0xf9, 0xe8, 0xd3, 0xc4, 0x06, 0x5e, 0xf9, 0xf1,
-- 0xd0, 0x43, 0x40, 0x4c, 0xe9, 0xf1, 0x08, 0x49,
-- 0x00, 0x8d, 0x10, 0x87, 0x53, 0x02, 0x01, 0x46,
-- 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c, 0xe9, 0xf8,
-- 0x09, 0x49, 0x00, 0x0d, 0xd0, 0x9f, 0x40, 0x02,
-- 0xb0, 0x20, 0x03, 0x19, 0xe9, 0xfe, 0xb0, 0x20,
-- 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x80,
-- 0xd4, 0x00, 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0,
-- 0xe2, 0x8d, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc1,
-- 0xe1, 0xca, 0xe1, 0xee, 0xe1, 0xf0, 0xe1, 0xa8,
-- 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50,
-- 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42,
-- 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x5e,
-- 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31,
-- 0x10, 0x12, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10,
-- 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44,
-- 0xe1, 0x79, 0x03, 0xdf, 0xe9, 0x9d, 0xd3, 0x40,
-- 0xca, 0x50, 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa4,
-- 0xca, 0x12, 0xca, 0x52, 0xe1, 0xa1, 0x03, 0x1d,
-- 0xf9, 0xa4, 0xca, 0x12, 0xca, 0x53, 0xca, 0xae,
-- 0xca, 0xef, 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea,
-- 0xb1, 0x7e, 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42,
-- 0x2c, 0x5b, 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40,
-- 0x1c, 0x48, 0xcc, 0xb1, 0x1c, 0x9f, 0x06, 0xd0,
-- 0xe9, 0xb6, 0x01, 0x69, 0xd0, 0x20, 0x3c, 0x80,
-- 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f, 0x2c, 0x40,
-- 0x2c, 0x80, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80,
-- 0xde, 0x84, 0xde, 0xc4, 0xe3, 0x1e, 0xd3, 0xc2,
-- 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xc6, 0xf2, 0x32,
-- 0xb3, 0x81, 0xe9, 0xca, 0x80, 0x07, 0xe2, 0x95,
-- 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c,
-- 0xe9, 0xd6, 0x06, 0x5e, 0xf9, 0xdf, 0x08, 0x89,
-- 0x03, 0xcd, 0x13, 0xe3, 0xf9, 0xd6, 0xd3, 0xc4,
-- 0x06, 0x5e, 0xf9, 0xdf, 0xd0, 0x43, 0x40, 0x4c,
-- 0xe9, 0xdf, 0x08, 0x49, 0x00, 0x8d, 0x10, 0x87,
-- 0x53, 0x02, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6,
-- 0x03, 0x1c, 0xe9, 0xe6, 0x09, 0x49, 0x00, 0x0d,
-- 0xd0, 0x9f, 0x40, 0x02, 0xb0, 0x20, 0x03, 0x19,
-- 0xe9, 0xec, 0xb0, 0x20, 0xa0, 0x2c, 0xe2, 0x5b,
-- 0x06, 0x5f, 0xfa, 0x80, 0xd4, 0x00, 0xc4, 0x50,
-- 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xdb,
-- 0xe1, 0xe9, 0xe2, 0x00, 0xe2, 0x02, 0xe1, 0xc3,
-- 0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x8d, 0x06, 0x50,
-- 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42,
-- 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f,
-- 0x30, 0x5b, 0xfc, 0x11, 0xc0, 0x39, 0x30, 0x31,
-- 0x10, 0x11, 0x10, 0x20, 0xe9, 0x88, 0x03, 0x10,
-- 0xe9, 0x93, 0x0f, 0x19, 0xf9, 0x8f, 0xd1, 0x44,
-- 0xe1, 0x79, 0x03, 0xd0, 0xf9, 0x98, 0xca, 0x50,
-- 0x03, 0xde, 0xf9, 0x9a, 0xd1, 0x42, 0xe2, 0xea,
-- 0xcb, 0xaa, 0xcb, 0xeb, 0xc0, 0x50, 0x10, 0x54,
-- 0xc0, 0x90, 0x10, 0x8c, 0x10, 0x92, 0xd0, 0xc1,
-- 0x05, 0x50, 0xe9, 0xa5, 0xb0, 0xc2, 0x10, 0x60,
-- 0xfd, 0xa8, 0xb0, 0x7f, 0x10, 0xa0, 0xfd, 0xab,
-- 0xb0, 0xbf, 0x10, 0x5f, 0x10, 0x9f, 0x00, 0xef,
-- 0xd0, 0x3e, 0x20, 0x52, 0x20, 0x83, 0x20, 0x93,
-- 0x10, 0x4c, 0x10, 0x82, 0x40, 0x80, 0x50, 0x42,
-- 0xd0, 0x81, 0x14, 0x1f, 0x14, 0x01, 0x05, 0x50,
-- 0xe9, 0xbd, 0x50, 0x42, 0xe1, 0xbe, 0x54, 0x02,
-- 0xca, 0x10, 0xca, 0x50, 0xcb, 0x01, 0xcb, 0x41,
-- 0xe2, 0xea, 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b,
-- 0xc0, 0x31, 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49,
-- 0xcc, 0xb1, 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08,
-- 0x20, 0x1f, 0x05, 0x50, 0xf9, 0xd2, 0xb0, 0x3c,
-- 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00,
-- 0x2c, 0x80, 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1,
-- 0xe3, 0x1e, 0xd3, 0xc0, 0xf2, 0xd3, 0x13, 0xa0,
-- 0xed, 0xe0, 0xf2, 0x32, 0xb3, 0x81, 0xe9, 0xe9,
-- 0x80, 0x07, 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f,
-- 0xc4, 0x50, 0xd3, 0x08, 0xe2, 0x95, 0xd0, 0x71,
-- 0x20, 0x56, 0x00, 0x48, 0xd1, 0x8c, 0x03, 0x0d,
-- 0x41, 0x8c, 0xe9, 0xf7, 0x08, 0x89, 0x03, 0xcd,
-- 0x13, 0xe3, 0xf9, 0xf6, 0xd3, 0xc4, 0xe1, 0xf7,
-- 0xb3, 0xc1, 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6,
-- 0x03, 0x1c, 0xe9, 0xfe, 0x09, 0x49, 0x00, 0x0d,
-- 0xa0, 0x2c, 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f,
-- 0xd4, 0x02, 0x44, 0x15, 0x14, 0x1f, 0xc4, 0x50,
-- 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xc9,
-- 0xe1, 0xd2, 0xe1, 0xe7, 0xe1, 0xe9, 0xe1, 0xab,
-- 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x91, 0x06, 0x50,
-- 0xe9, 0x83, 0xc0, 0x54, 0x30, 0x5b, 0xb0, 0x42,
-- 0xf8, 0x11, 0x37, 0x1a, 0xb6, 0xff, 0xd0, 0x4f,
-- 0x30, 0x5b, 0xfc, 0x11, 0xbc, 0x10, 0xd0, 0x10,
-- 0x0c, 0x1e, 0xf9, 0x8e, 0xbc, 0x10, 0xd0, 0x20,
-- 0xc0, 0x40, 0x30, 0x70, 0xed, 0x8e, 0x03, 0x10,
-- 0xe9, 0x97, 0x0f, 0x19, 0xf9, 0x93, 0xd1, 0x44,
-- 0xe1, 0x79, 0x03, 0xd0, 0xf9, 0xa0, 0xca, 0x50,
-- 0xcb, 0x52, 0x03, 0x1d, 0xf9, 0xa7, 0xca, 0x12,
-- 0xca, 0x52, 0xe1, 0xa4, 0x03, 0x1d, 0xf9, 0xa7,
-- 0xca, 0x12, 0xca, 0x53, 0xca, 0xae, 0xca, 0xef,
-- 0xb1, 0x7e, 0x03, 0x1e, 0xfa, 0xea, 0xb1, 0x7e,
-- 0xe2, 0xea, 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40,
-- 0x2c, 0x80, 0x17, 0x20, 0xf9, 0xc8, 0x00, 0x2a,
-- 0xd0, 0x00, 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50,
-- 0xf9, 0xb8, 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40,
-- 0xcc, 0xb1, 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c,
-- 0x0c, 0x99, 0xe9, 0xc1, 0x3c, 0x80, 0xde, 0xa0,
-- 0x2c, 0x5f, 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00,
-- 0x2c, 0x80, 0xde, 0xc1, 0xe3, 0x1e, 0xd3, 0xc0,
-- 0xf2, 0xd3, 0x13, 0xa0, 0xed, 0xce, 0xf2, 0x32,
-- 0xb3, 0x81, 0xe9, 0xd2, 0x80, 0x07, 0xe2, 0x95,
-- 0x0d, 0x09, 0xd1, 0x8c, 0x03, 0x0d, 0x41, 0x8c,
-- 0xe9, 0xde, 0x08, 0x89, 0x03, 0xcd, 0x13, 0xe3,
-- 0xf9, 0xdd, 0xd3, 0xc4, 0xe1, 0xde, 0xb3, 0xc1,
-- 0x01, 0x46, 0x90, 0x2c, 0x00, 0xc6, 0x03, 0x1c,
-- 0xe9, 0xe5, 0x09, 0x49, 0x00, 0x0d, 0xa0, 0x2c,
-- 0xe2, 0x5b, 0x06, 0x5f, 0xfa, 0x7f, 0xd4, 0x00,
-- 0xc4, 0x50, 0xc4, 0x90, 0xc4, 0xd0, 0xe2, 0x8d,
-- 0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa3,
-- 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a,
-- 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfd, 0xb4,
-- 0xc0, 0x39, 0x30, 0x31, 0x10, 0x12, 0x10, 0x20,
-- 0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea,
-- 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31,
-- 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x48, 0xcc, 0xb1,
-- 0x1c, 0x9f, 0x06, 0xd0, 0xe9, 0x98, 0x01, 0x69,
-- 0xd0, 0x20, 0x3c, 0x80, 0xc0, 0x1c, 0x10, 0x08,
-- 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0x01, 0x74,
-- 0xd6, 0x00, 0x2c, 0x80, 0xde, 0x84, 0xde, 0xc4,
-- 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f,
-- 0x30, 0x5a, 0xe5, 0xc8, 0x00, 0x26, 0xd0, 0x00,
-- 0x70, 0x00, 0x10, 0x20, 0xe9, 0xbf, 0x00, 0xe0,
-- 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5c, 0x30, 0x5b,
-- 0xb0, 0x41, 0xed, 0xc8, 0x0f, 0x17, 0xf9, 0xb4,
-- 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb8,
-- 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29,
-- 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e,
-- 0xe5, 0xc8, 0x0f, 0x17, 0xf9, 0xc3, 0x02, 0xf1,
-- 0xd8, 0x2b, 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0,
-- 0xe2, 0x95, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xb5,
-- 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e,
-- 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x5e, 0x30, 0x5b, 0xfd, 0xc6,
-- 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88,
-- 0xbc, 0x10, 0xd0, 0x30, 0xc0, 0x40, 0x30, 0x70,
-- 0xed, 0x88, 0xd1, 0x42, 0xd3, 0x40, 0xe2, 0xea,
-- 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80,
-- 0x17, 0x20, 0xf9, 0xb4, 0x00, 0xa8, 0xd0, 0x00,
-- 0xcc, 0x5b, 0x1c, 0x5f, 0x1c, 0x43, 0x20, 0x31,
-- 0x7c, 0x40, 0xb0, 0x3c, 0x7e, 0x80, 0xcc, 0xb1,
-- 0xce, 0xfa, 0x1c, 0x9f, 0x1e, 0xdf, 0x01, 0x69,
-- 0xd0, 0x3c, 0x0c, 0x99, 0xe9, 0xa6, 0x3c, 0x80,
-- 0x0e, 0xd9, 0xe9, 0xa9, 0x3e, 0xc0, 0x3e, 0xf2,
-- 0x3e, 0xb1, 0xd0, 0x01, 0x40, 0x1b, 0x10, 0x05,
-- 0x20, 0x1f, 0x2c, 0x40, 0x2c, 0x80, 0xd0, 0x30,
-- 0x70, 0x00, 0x2c, 0x80, 0xe3, 0x1e, 0xf2, 0xd3,
-- 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xda,
-- 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20,
-- 0xe9, 0xd1, 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41,
-- 0x10, 0x5c, 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xda,
-- 0x0f, 0x17, 0xf9, 0xc6, 0x0f, 0x49, 0xf2, 0xd3,
-- 0x0f, 0x19, 0xf9, 0xca, 0xdf, 0x00, 0x00, 0x06,
-- 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b,
-- 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xda, 0x0f, 0x17,
-- 0xf9, 0xd5, 0x02, 0xf6, 0xde, 0x26, 0xe0, 0x46,
-- 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xa2,
-- 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8a,
-- 0xe1, 0x65, 0x30, 0x5a, 0xe5, 0x87, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfd, 0xb3,
-- 0xc0, 0x39, 0x30, 0x31, 0x10, 0x11, 0x10, 0x20,
-- 0xe9, 0x82, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea,
-- 0xcc, 0x5b, 0x1c, 0x42, 0x2c, 0x5b, 0xc0, 0x31,
-- 0x1c, 0x43, 0x2c, 0x40, 0x1c, 0x49, 0xcc, 0xb1,
-- 0x1c, 0x9f, 0xc0, 0x1c, 0x10, 0x08, 0x20, 0x1f,
-- 0x05, 0x50, 0xf9, 0x99, 0xb0, 0x3c, 0x2c, 0x40,
-- 0x2c, 0x80, 0x01, 0x74, 0xd6, 0x00, 0x2c, 0x80,
-- 0x02, 0xe4, 0xde, 0x80, 0xde, 0xc1, 0xe3, 0x1e,
-- 0xf2, 0xd3, 0xc0, 0x5c, 0xb0, 0x7f, 0x30, 0x5a,
-- 0xe5, 0xc7, 0x00, 0x26, 0xd0, 0x00, 0x70, 0x00,
-- 0x10, 0x20, 0xe9, 0xbe, 0x00, 0xe0, 0xd0, 0x44,
-- 0x70, 0x41, 0x10, 0x5b, 0x30, 0x5b, 0xb0, 0x41,
-- 0xed, 0xc7, 0x0f, 0x17, 0xf9, 0xb3, 0x0f, 0x49,
-- 0xf2, 0xd3, 0x0f, 0x19, 0xf9, 0xb7, 0xdf, 0x00,
-- 0x00, 0x06, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46,
-- 0xc0, 0x5b, 0x30, 0x54, 0xb0, 0x7e, 0xe5, 0xc7,
-- 0x0f, 0x17, 0xf9, 0xc2, 0x02, 0xff, 0xde, 0x27,
-- 0xe0, 0x46, 0xd3, 0x08, 0xd3, 0xc0, 0xe2, 0x95,
-- 0x50, 0x00, 0x50, 0x00, 0x03, 0x75, 0xd2, 0x73,
-- 0x00, 0x24, 0xdc, 0xd8, 0xf0, 0x4a, 0xe1, 0xac,
-- 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xe1, 0x8e,
-- 0xe1, 0x30, 0x30, 0x5a, 0xe5, 0x8b, 0x37, 0x1a,
-- 0xb6, 0xff, 0xd0, 0x4f, 0x30, 0x5b, 0xfd, 0xbd,
-- 0xbc, 0x10, 0xd0, 0x10, 0x0c, 0x1e, 0xf9, 0x88,
-- 0xbc, 0x10, 0xd0, 0x20, 0xc0, 0x40, 0x30, 0x70,
-- 0xed, 0x88, 0xd1, 0x42, 0xd3, 0x41, 0xe2, 0xea,
-- 0x00, 0x24, 0xd0, 0x00, 0x2c, 0x40, 0x2c, 0x80,
-- 0x17, 0x20, 0xf9, 0xab, 0x00, 0x2a, 0xd0, 0x00,
-- 0x20, 0x1b, 0x20, 0x1b, 0x05, 0x50, 0xf9, 0x9b,
-- 0xb0, 0x3f, 0x10, 0x02, 0x7c, 0x40, 0xcc, 0xb1,
-- 0x1c, 0x9f, 0x01, 0x69, 0xd0, 0x3c, 0x0c, 0x99,
-- 0xe9, 0xa4, 0x3c, 0x80, 0xde, 0xa0, 0x2c, 0x5f,
-- 0x2c, 0x9f, 0xd0, 0x30, 0x70, 0x00, 0x2c, 0x80,
-- 0xde, 0xc1, 0xe3, 0x1e, 0xf2, 0xd3, 0xc0, 0x5c,
-- 0xb0, 0x7f, 0x30, 0x5a, 0xe5, 0xd1, 0x00, 0x26,
-- 0xd0, 0x00, 0x70, 0x00, 0x10, 0x20, 0xe9, 0xc8,
-- 0x00, 0xe0, 0xd0, 0x44, 0x70, 0x41, 0x10, 0x5b,
-- 0x30, 0x5b, 0xb0, 0x41, 0xed, 0xd1, 0x0f, 0x17,
-- 0xf9, 0xbd, 0x0f, 0x49, 0xf2, 0xd3, 0x0f, 0x19,
-- 0xf9, 0xc1, 0xdf, 0x00, 0x00, 0x06, 0x03, 0xb3,
-- 0xd8, 0x29, 0xe0, 0x46, 0xc0, 0x5b, 0x30, 0x54,
-- 0xb0, 0x7e, 0xe5, 0xd1, 0x0f, 0x17, 0xf9, 0xcc,
-- 0x03, 0x34, 0xdc, 0x20, 0xe0, 0x46, 0xd3, 0x08,
-- 0xd3, 0xc0, 0xe2, 0x95, 0xd0, 0x61, 0x23, 0x81,
-- 0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0,
-- 0xea, 0x3b, 0x30, 0x42, 0xe6, 0x30, 0x23, 0x82,
-- 0x0f, 0xc5, 0x0c, 0x09, 0x05, 0x0d, 0x15, 0x20,
-- 0xfe, 0x45, 0xd0, 0x5f, 0x15, 0x63, 0xea, 0x43,
-- 0xd0, 0x50, 0x30, 0x54, 0xee, 0x4a, 0x0f, 0x17,
-- 0xfa, 0x45, 0x03, 0xb3, 0xd8, 0x29, 0xe0, 0x46,
-- 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00, 0xd4, 0x40,
-- 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d, 0xa0, 0x6c,
-- 0xd0, 0xa1, 0x00, 0x88, 0xd0, 0xa9, 0x00, 0x4d,
-- 0x00, 0x50, 0xfa, 0x53, 0xf2, 0x32, 0xd3, 0x80,
-- 0xe1, 0x76, 0xd1, 0xc2, 0x41, 0xcf, 0x11, 0xdf,
-- 0xd0, 0x41, 0x01, 0xc1, 0x00, 0xef, 0xd0, 0xbe,
-- 0x03, 0x10, 0xf9, 0x77, 0x80, 0x07, 0x21, 0x96,
-- 0x11, 0xa2, 0xe9, 0x78, 0x03, 0x1d, 0xea, 0x73,
-- 0xc0, 0xd7, 0xc2, 0x90, 0xf2, 0xa4, 0xc4, 0x0a,
-- 0x03, 0xd0, 0xea, 0x72, 0xc2, 0x91, 0xf2, 0xa4,
-- 0xc4, 0x4a, 0x03, 0x1e, 0xea, 0x8d, 0xc0, 0xd8,
-- 0xc2, 0x92, 0xf2, 0xa4, 0xc4, 0x8a, 0x03, 0xd0,
-- 0xea, 0x7d, 0xc2, 0x93, 0xf2, 0xa4, 0xc4, 0xca,
-- 0xe2, 0x8d, 0xd3, 0xc0, 0xc0, 0xd7, 0xc2, 0x90,
-- 0xf2, 0xa4, 0xc4, 0x0a, 0x03, 0xd0, 0xea, 0x88,
-- 0xc2, 0x91, 0xf2, 0xa4, 0xc4, 0x4a, 0x08, 0x49,
-- 0x00, 0x4d, 0x10, 0x61, 0xf8, 0x11, 0x03, 0x1f,
-- 0xea, 0x93, 0x0d, 0xc9, 0x00, 0x4d, 0xd0, 0x1a,
-- 0xe2, 0x98, 0x03, 0x10, 0xfa, 0x97, 0xd0, 0x1d,
-- 0xe2, 0x98, 0xd0, 0x18, 0x0f, 0x16, 0xfa, 0x98,
-- 0xd0, 0x4c, 0x40, 0x4c, 0x10, 0x6c, 0xea, 0xa2,
-- 0x03, 0xde, 0xfa, 0xa2, 0x0f, 0x12, 0xfa, 0xa0,
-- 0x00, 0x08, 0xe2, 0xd9, 0xd2, 0x00, 0x13, 0xe1,
-- 0xee, 0xa9, 0x08, 0x49, 0x02, 0x0d, 0x00, 0xc8,
-- 0xc2, 0xca, 0x12, 0x94, 0xd0, 0x1f, 0x30, 0x07,
-- 0x12, 0xc0, 0xc2, 0x43, 0x12, 0x5a, 0x00, 0x0d,
-- 0x03, 0xde, 0xea, 0xb6, 0x0e, 0xc9, 0x04, 0x8d,
-- 0x02, 0x48, 0x22, 0x80, 0x12, 0x88, 0xd0, 0x0b,
-- 0x30, 0x03, 0x12, 0x80, 0xd0, 0x19, 0x20, 0x03,
-- 0x12, 0x80, 0x00, 0x0d, 0x22, 0xc0, 0x12, 0xc8,
-- 0xd0, 0x0b, 0x30, 0x09, 0x12, 0xc0, 0x12, 0xd8,
-- 0xd0, 0x16, 0x20, 0x09, 0x20, 0x07, 0x12, 0xc0,
-- 0x42, 0xc2, 0x22, 0x8b, 0x22, 0x88, 0x03, 0xde,
-- 0xea, 0xd2, 0x0e, 0xc9, 0xc4, 0x4a, 0x04, 0xcd,
-- 0x0f, 0xc5, 0x01, 0x46, 0x90, 0x4d, 0x00, 0xc6,
-- 0x10, 0x60, 0xe6, 0xd3, 0x0f, 0xc5, 0x01, 0x74,
-- 0xd6, 0x00, 0xca, 0x9d, 0xcb, 0x9e, 0xca, 0xea,
-- 0xcb, 0xee, 0x2a, 0xc0, 0x2b, 0xc0, 0xca, 0x10,
-- 0xca, 0x51, 0xcb, 0x12, 0xcb, 0x53, 0xd1, 0x40,
-- 0xd3, 0x41, 0xb7, 0x3f, 0xc0, 0x5c, 0xe1, 0x7b,
-- 0xd0, 0xc0, 0xc1, 0x28, 0xc2, 0x2a, 0xc2, 0xab,
-- 0xf1, 0x7a, 0x0f, 0x17, 0xfa, 0xef, 0xcc, 0xe8,
-- 0xcd, 0x29, 0xcd, 0x6c, 0xcd, 0xad, 0xc8, 0x08,
-- 0xc8, 0x49, 0xca, 0x0a, 0xca, 0x4b, 0xf3, 0x31,
-- 0xd0, 0xc1, 0xc1, 0x34, 0xc2, 0x2a, 0xc2, 0xab,
-- 0xf1, 0x7a, 0x00, 0x28, 0xd9, 0xc0, 0xc8, 0x88,
-- 0xc8, 0xc9, 0xa9, 0xf8, 0xca, 0x8a, 0xca, 0xcb,
-- 0x11, 0x62, 0xe9, 0x79, 0xd0, 0xc0, 0xc1, 0x35,
-- 0xc2, 0x2e, 0xc2, 0xaf, 0xf1, 0x7a, 0xc9, 0x08,
-- 0xc9, 0x49, 0xa9, 0xf8, 0xcb, 0x0a, 0xcb, 0x4b,
-- 0xd0, 0xc1, 0xc1, 0x36, 0xc2, 0x2e, 0xc2, 0xaf,
-- 0xf1, 0x7a, 0xc0, 0x27, 0xc9, 0x88, 0xc9, 0xc9,
-- 0xa0, 0x38, 0xcb, 0x8a, 0xcb, 0xcb, 0xe1, 0x79,
-- 0x5f, 0x0d, 0x07, 0x7d, 0xde, 0x07, 0x11, 0x5e,
-- 0x30, 0x05, 0xcd, 0xc0, 0x00, 0x28, 0xd0, 0x00,
-- 0xa0, 0x38, 0x11, 0x61, 0xf9, 0x75, 0x00, 0xe2,
-- 0xd0, 0x00, 0x0f, 0x1d, 0xeb, 0x29, 0x00, 0x2d,
-- 0xdf, 0x4b, 0xf3, 0x3f, 0xe1, 0x75, 0x04, 0xeb,
-- 0xd0, 0x00, 0x11, 0x62, 0xeb, 0x36, 0xb0, 0x20,
-- 0x0f, 0x19, 0xfb, 0x36, 0xac, 0xe0, 0x01, 0xa4,
-- 0xde, 0x00, 0x5e, 0x0d, 0x00, 0x2d, 0xdf, 0x7a,
-- 0xdd, 0xc0, 0xd8, 0x80, 0xd9, 0x00, 0xd9, 0x80,
-- 0x5f, 0x00, 0x01, 0x46, 0x00, 0x28, 0xd0, 0x01,
-- 0x00, 0x06, 0xa0, 0x37, 0x80, 0x3f, 0x00, 0xc6,
-- 0x0f, 0xc5, 0xad, 0xda, 0xc6, 0xb1, 0xd0, 0x01,
-- 0x01, 0xa3, 0xde, 0x1d, 0x40, 0x30, 0x3e, 0x00,
-- 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0xc8, 0x28,
-- 0xc8, 0x69, 0xc8, 0xaa, 0xc8, 0xeb, 0x0c, 0x1e,
-- 0xfb, 0x68, 0x26, 0xba, 0x07, 0x7d, 0xdc, 0x00,
-- 0x1d, 0xcf, 0x1d, 0xd1, 0x5d, 0xc0, 0x00, 0x2d,
-- 0xdf, 0x64, 0x0f, 0x87, 0xad, 0xda, 0x80, 0x3f,
-- 0x0e, 0x0a, 0x66, 0xda, 0xc9, 0x2c, 0xc9, 0x6d,
-- 0xc9, 0xae, 0xc9, 0xef, 0x0f, 0x2f, 0xd0, 0x37,
-- 0x4f, 0x00, 0x0f, 0x1a, 0xeb, 0xbe, 0x01, 0xa4,
-- 0xde, 0x20, 0xd0, 0x01, 0x40, 0x3c, 0x2e, 0x00,
-- 0x00, 0x2d, 0xdf, 0x7a, 0xac, 0xe0, 0x0f, 0x87,
-- 0x0e, 0x0a, 0x76, 0xe0, 0xbf, 0x79, 0xbe, 0x3c,
-- 0x0f, 0x1b, 0xeb, 0x9e, 0x0f, 0x87, 0x0e, 0x0a,
-- 0x76, 0xe1, 0xbf, 0x79, 0xbe, 0x34, 0x18, 0xa0,
-- 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x20, 0x80, 0x3f,
-- 0x0e, 0x0a, 0x76, 0xe2, 0xbf, 0x79, 0xbe, 0x3c,
-- 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe3, 0x0f, 0x1b,
-- 0xeb, 0xb3, 0xbf, 0x77, 0xbe, 0x0c, 0x19, 0x20,
-- 0xeb, 0xb9, 0x0f, 0x87, 0xad, 0x60, 0x80, 0x3f,
-- 0x0e, 0x0a, 0x76, 0xe4, 0xbe, 0x3c, 0xbf, 0x75,
-- 0x0f, 0x15, 0xf8, 0x1c, 0x1f, 0x0a, 0x1f, 0x16,
-- 0x0f, 0x87, 0x0e, 0x0a, 0x76, 0xe5, 0xbf, 0x79,
-- 0xbe, 0x34, 0x19, 0xa0, 0xeb, 0xb9, 0x0f, 0x87,
-- 0xad, 0xa0, 0x80, 0x3f, 0x0e, 0x0a, 0x76, 0xe6,
-- 0xbe, 0x3c, 0xbf, 0x79, 0x0f, 0x87, 0x0e, 0x0a,
-- 0x76, 0xe7, 0x0f, 0x15, 0xeb, 0xbe, 0x00, 0x2f,
-- 0xdf, 0x72, 0x1d, 0xe0, 0xf8, 0x1c, 0x00, 0x28,
-- 0xd0, 0x01, 0xa0, 0x38, 0x80, 0x3f, 0x0f, 0x87,
-- 0xd0, 0x01, 0x4d, 0xc0, 0x1f, 0x0f, 0x1f, 0x11,
-- 0x00, 0x2f, 0xdf, 0x76, 0xc6, 0xb2, 0x03, 0x7d,
-- 0xde, 0x0e, 0x01, 0xa3, 0xde, 0x2d, 0x5d, 0xc0,
-- 0x0f, 0x87, 0x1e, 0xe1, 0xeb, 0xdb, 0xad, 0xda,
-- 0x80, 0x3f, 0x0e, 0x0a, 0x66, 0xda, 0x0c, 0x1e,
-- 0xfb, 0xe4, 0x26, 0xbb, 0x03, 0xff, 0xdd, 0xff,
-- 0x4d, 0xc0, 0x00, 0xa3, 0xde, 0x2d, 0xbf, 0x56,
-- 0x0f, 0x87, 0x07, 0x7d, 0xde, 0x0e, 0x5d, 0xc0,
-- 0x00, 0xa3, 0xde, 0x1d, 0xad, 0xda, 0x80, 0x3f,
-- 0x0e, 0x0a, 0x66, 0xda, 0xdf, 0x5c, 0xd0, 0x0e,
-- 0x4f, 0x00, 0x0f, 0x87, 0xd0, 0x06, 0x40, 0x3c,
-- 0xeb, 0xf0, 0xbf, 0x3e, 0xb0, 0x04, 0xe7, 0xf2,
-- 0xeb, 0xf6, 0xbf, 0x0c, 0xbf, 0x3a, 0x0f, 0x87,
-- 0x0f, 0x1d, 0xfb, 0x4b, 0xbf, 0x38, 0x0f, 0x87,
-- 0x0f, 0x1c, 0xfb, 0xcb, 0xbf, 0x30, 0x0f, 0x87,
-- 0x50, 0x00, 0x50, 0x00, 0x0f, 0x17, 0xf9, 0x70,
-- 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x72, 0x0f, 0x49,
-- 0x90, 0x4d, 0x10, 0x60, 0xe5, 0x76, 0x0f, 0x19,
-- 0xf9, 0x79, 0x01, 0x46, 0xd0, 0x11, 0xa0, 0x38,
-- 0x80, 0x3f, 0x00, 0xc6, 0xdf, 0x00, 0x00, 0x06,
-- 0x08, 0x20, 0xd0, 0x00, 0x10, 0x08, 0xa0, 0x0a,
-- 0xa0, 0x1b, 0x0c, 0x20, 0xd0, 0x00, 0x10, 0x08,
-- 0xa0, 0x27, 0x90, 0x4d, 0x0f, 0xff, 0xd8, 0x1f,
-- 0x40, 0x40, 0xa0, 0x4d, 0x80, 0x0a, 0xd0, 0x00,
-- 0x06, 0x50, 0xf9, 0x95, 0xd0, 0x01, 0xa0, 0x09,
-- 0x80, 0x1b, 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67,
-- 0xa0, 0x69, 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a,
-- 0x84, 0x29, 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a,
-- 0x01, 0x20, 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b,
-- 0x80, 0x07, 0x08, 0x20, 0xdf, 0x00, 0x02, 0x30,
-- 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb0,
-- 0xd0, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30,
-- 0xd0, 0x01, 0xa0, 0x38, 0xd0, 0x10, 0xa0, 0x38,
-- 0x15, 0x63, 0xe9, 0xba, 0x05, 0x5e, 0xf9, 0xfa,
-- 0xc0, 0xdf, 0x00, 0xe0, 0xd1, 0x80, 0x70, 0x06,
-- 0x10, 0x1c, 0xc1, 0x40, 0x11, 0x48, 0xd3, 0x10,
-- 0x00, 0x21, 0xd0, 0x80, 0xb0, 0x16, 0xe9, 0xca,
-- 0xd3, 0x20, 0x10, 0x81, 0xb0, 0x16, 0xf9, 0xfa,
-- 0x30, 0xc2, 0xd2, 0x5e, 0xd0, 0x8f, 0x00, 0xee,
-- 0xd0, 0x54, 0x70, 0x41, 0x30, 0x43, 0xed, 0xd7,
-- 0xd2, 0x6c, 0x72, 0x49, 0xc0, 0x89, 0xb0, 0xbf,
-- 0x10, 0x9f, 0x22, 0x42, 0x04, 0x31, 0xd0, 0x10,
-- 0xc0, 0x42, 0x30, 0x49, 0xe5, 0xde, 0x10, 0x03,
-- 0xc1, 0x0c, 0xc1, 0x83, 0xb1, 0xbe, 0x01, 0x46,
-- 0x00, 0x06, 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06,
-- 0x00, 0xc6, 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xe1,
-- 0xc1, 0x0c, 0x21, 0x85, 0x01, 0x46, 0x00, 0x06,
-- 0xa0, 0x3d, 0xa0, 0x3c, 0x60, 0x06, 0x00, 0xc6,
-- 0xb1, 0xbc, 0xb1, 0x01, 0xed, 0xec, 0x02, 0xe4,
-- 0xd0, 0x00, 0x20, 0xc0, 0xb2, 0x41, 0xed, 0xd8,
-- 0x15, 0xa3, 0xfa, 0x00, 0xbc, 0x10, 0x0c, 0x1e,
-- 0xfa, 0x00, 0xbc, 0x10, 0xd0, 0x04, 0x70, 0x00,
-- 0x10, 0x20, 0xfa, 0x00, 0x00, 0x27, 0xd0, 0x10,
-- 0xd0, 0x40, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x14,
-- 0x60, 0x40, 0xb0, 0x28, 0x70, 0x40, 0xb0, 0x7f,
-- 0x60, 0x40, 0x01, 0x7a, 0xde, 0x1a, 0xe0, 0x46,
-- 0x50, 0x00, 0x50, 0x00, 0x00, 0x28, 0xd1, 0xb0,
-- 0x70, 0x06, 0xd0, 0x81, 0x60, 0x86, 0x10, 0x20,
-- 0xe9, 0xab, 0xb0, 0x3f, 0x60, 0x06, 0x00, 0xec,
-- 0xd1, 0x84, 0x70, 0x46, 0xb1, 0x84, 0x70, 0x86,
-- 0x30, 0x42, 0xe9, 0xab, 0x70, 0x42, 0xd0, 0x35,
-- 0x30, 0x40, 0xf9, 0xab, 0x00, 0x63, 0xd0, 0x3f,
-- 0xb0, 0xbc, 0x40, 0x80, 0x70, 0xc2, 0x10, 0xe3,
-- 0xe5, 0xab, 0xb0, 0xbc, 0x40, 0x80, 0x60, 0x86,
-- 0x00, 0x28, 0xd0, 0x24, 0x70, 0x40, 0x00, 0x22,
-- 0xd0, 0x80, 0x50, 0x42, 0x60, 0x40, 0x00, 0x64,
-- 0xd0, 0x60, 0xd0, 0x90, 0x60, 0x81, 0x00, 0xed,
-- 0xd1, 0x88, 0x70, 0x46, 0x10, 0xe4, 0xe9, 0xa8,
-- 0x00, 0x21, 0xd0, 0xe8, 0xd0, 0x00, 0x60, 0x03,
-- 0xd0, 0x81, 0x40, 0x42, 0x60, 0x46, 0x02, 0x3c,
-- 0xda, 0x89, 0xe0, 0x46, 0xd0, 0x82, 0x50, 0x42,
-- 0x60, 0x46, 0x00, 0x23, 0xd5, 0x3e, 0x01, 0x7a,
-- 0xde, 0x1a, 0xe0, 0x46, 0x01, 0x46, 0xdf, 0x5c,
-- 0x08, 0x20, 0xd1, 0x00, 0xcf, 0x04, 0x11, 0x08,
-- 0xa1, 0x0a, 0xa1, 0x1b, 0x11, 0x1f, 0xa1, 0x27,
-- 0xd2, 0x80, 0xb2, 0x81, 0x90, 0x4d, 0xc0, 0x01,
-- 0x10, 0x14, 0x00, 0x16, 0xe9, 0x8d, 0x80, 0x33,
-- 0x80, 0x3f, 0x92, 0x8b, 0x00, 0x23, 0xd0, 0x3f,
-- 0x42, 0x80, 0xe9, 0x8d, 0x0f, 0xff, 0xdf, 0xff,
-- 0x40, 0x01, 0xa0, 0x0d, 0xe1, 0x94, 0xa1, 0x0a,
-- 0x00, 0xea, 0xd0, 0x00, 0xd0, 0x8e, 0x00, 0x06,
-- 0x0f, 0x0b, 0x70, 0x80, 0x80, 0x73, 0x80, 0x0a,
-- 0xd0, 0x00, 0x06, 0x50, 0xf9, 0x9a, 0xd0, 0x01,
-- 0xd0, 0x44, 0x40, 0x70, 0x20, 0x01, 0x15, 0x63,
-- 0xf9, 0xa1, 0x80, 0x1b, 0xe1, 0xa2, 0x80, 0x5b,
-- 0xa0, 0x27, 0x01, 0x20, 0xd0, 0x67, 0xa0, 0x69,
-- 0x80, 0x2a, 0x82, 0x29, 0x80, 0x6a, 0x84, 0x29,
-- 0xd0, 0x54, 0x10, 0x4f, 0xa0, 0x6a, 0x01, 0x20,
-- 0xd0, 0x40, 0xa0, 0x69, 0x80, 0x2b, 0x80, 0x07,
-- 0x08, 0x20, 0xd0, 0x00, 0xcf, 0x00, 0x02, 0x30,
-- 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f, 0x01, 0xb2,
-- 0xd2, 0x10, 0xa0, 0x37, 0x80, 0x3f, 0x02, 0x30,
-- 0xd0, 0x01, 0xa0, 0x38, 0x00, 0x30, 0xd0, 0x10,
-- 0xa0, 0x38, 0x80, 0x3f, 0x00, 0xc6, 0x00, 0x28,
-- 0xd1, 0x24, 0x70, 0x04, 0xd0, 0x41, 0x50, 0x01,
-- 0x60, 0x04, 0x00, 0x27, 0xd0, 0x18, 0x70, 0x40,
-- 0xb0, 0x7f, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x20,
-- 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0x08, 0x20,
-- 0xdf, 0x00, 0xd4, 0x00, 0xd4, 0x40, 0xd4, 0x80,
-- 0xd4, 0xc0, 0xd3, 0x81, 0x12, 0xa0, 0xed, 0xe3,
-- 0xd0, 0x08, 0x0a, 0x09, 0x00, 0x4d, 0xb0, 0x01,
-- 0xed, 0xdf, 0x03, 0xbe, 0xd6, 0x27, 0xe0, 0x46,
-- 0x50, 0x00, 0x50, 0x00, 0x02, 0x24, 0xd0, 0x00,
-- 0xa0, 0x37, 0x00, 0x27, 0xd3, 0xd0, 0x00, 0x26,
-- 0xd0, 0x04, 0x73, 0xcf, 0x13, 0xe1, 0xe9, 0x7b,
-- 0xb0, 0x3c, 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x40,
-- 0xd0, 0x00, 0x60, 0x01, 0x00, 0x26, 0xd0, 0x14,
-- 0xf2, 0x00, 0x00, 0x26, 0xd0, 0x18, 0xf2, 0x00,
-- 0x00, 0xee, 0xd0, 0x1c, 0x71, 0x40, 0xd1, 0x1e,
-- 0x15, 0x63, 0xe9, 0x8d, 0x11, 0x1f, 0xc7, 0x1a,
-- 0xb7, 0x01, 0xd3, 0x81, 0xc4, 0xd4, 0xf2, 0x04,
-- 0x00, 0x26, 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x54,
-- 0xfd, 0x9b, 0x00, 0xed, 0xd0, 0x24, 0xd0, 0x44,
-- 0x60, 0x40, 0x13, 0xe1, 0xf9, 0xbc, 0x15, 0xa3,
-- 0xf9, 0xa1, 0x0c, 0x10, 0xe9, 0xb9, 0x11, 0x61,
-- 0xe5, 0xb3, 0xed, 0xb9, 0x15, 0xa3, 0xf9, 0xab,
-- 0x00, 0x26, 0xd0, 0x14, 0x70, 0x40, 0x10, 0x62,
-- 0xf5, 0xb3, 0x15, 0x22, 0xe5, 0xb3, 0xc0, 0x44,
-- 0x30, 0x54, 0xe5, 0xb3, 0x34, 0xd4, 0xf5, 0xb3,
-- 0xe1, 0xbf, 0x03, 0xb3, 0xd8, 0x29, 0x00, 0x26,
-- 0xd0, 0x40, 0x60, 0x01, 0xe1, 0xdb, 0x03, 0xb3,
-- 0xd8, 0x29, 0xe0, 0x46, 0x01, 0x7a, 0xde, 0x1a,
-- 0xe0, 0x46, 0x80, 0x07, 0x09, 0x49, 0xd4, 0x00,
-- 0xd4, 0x40, 0xd4, 0x80, 0xd4, 0xc0, 0x00, 0x4d,
-- 0xa0, 0x6c, 0xd3, 0x80, 0xd0, 0xa1, 0x00, 0x88,
-- 0xd0, 0xa9, 0x00, 0x4d, 0x00, 0x50, 0xf9, 0xc9,
-- 0x0c, 0x49, 0xd0, 0x61, 0x00, 0x8d, 0x10, 0xa0,
-- 0xe9, 0x90, 0x30, 0x42, 0xf5, 0xd8, 0xd0, 0x61,
-- 0x23, 0x81, 0xe1, 0xce, 0x23, 0x82, 0x13, 0xa1,
-- 0xf9, 0x90, 0xd0, 0x42, 0x15, 0xa1, 0xf9, 0xdf,
-- 0xb0, 0x7f, 0x00, 0x26, 0xd0, 0x14, 0x70, 0x00,
-- 0x30, 0x01, 0xf5, 0xe8, 0x16, 0xe0, 0xe5, 0xe8,
-- 0xb6, 0xc1, 0xbc, 0x20, 0xc0, 0x44, 0x30, 0x5b,
-- 0xfd, 0xb9, 0xc0, 0x44, 0x30, 0x54, 0xe5, 0xb9,
-- 0x15, 0x63, 0xf9, 0xf8, 0x15, 0xa3, 0xf9, 0xf5,
-- 0x03, 0x3b, 0xda, 0x1c, 0xe0, 0x46, 0x03, 0x38,
-- 0xdc, 0x17, 0xe0, 0x46, 0x15, 0xa3, 0xf9, 0xfd,
-- 0x03, 0x72, 0xd0, 0x19, 0xe0, 0x46, 0x03, 0x3f,
-- 0xd2, 0x17, 0xe0, 0x46, 0x70, 0x40, 0xb0, 0x7f,
-- 0x60, 0x40, 0x0f, 0xc5, 0xdf, 0x00, 0x0c, 0x09,
-- 0x05, 0x0d, 0x08, 0x20, 0xdf, 0x00, 0x0f, 0xc5,
-- 0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd0, 0x14,
-- 0x70, 0x40, 0x10, 0x60, 0xe9, 0x45, 0xb0, 0x04,
-- 0x70, 0x40, 0xb0, 0x41, 0xed, 0x44, 0x00, 0xed,
-- 0xd0, 0x24, 0xd0, 0x44, 0x60, 0x40, 0x00, 0x64,
-- 0xd0, 0x20, 0x70, 0x00, 0x10, 0x30, 0xe9, 0x45,
-- 0x00, 0x21, 0xd0, 0x28, 0x60, 0x40, 0x00, 0x64,
-- 0xd2, 0xc0, 0x70, 0x0b, 0x00, 0x11, 0xe9, 0x6a,
-- 0x08, 0x20, 0xd0, 0x4f, 0x30, 0x40, 0xe9, 0x55,
-- 0xb0, 0x4f, 0xf9, 0x6a, 0x03, 0xef, 0xdf, 0xbf,
-- 0xaf, 0xb8, 0xdf, 0x80, 0x0f, 0x87, 0xd0, 0x18,
-- 0x70, 0x00, 0x10, 0x20, 0xed, 0x6c, 0xdf, 0x84,
-- 0xd0, 0x40, 0x60, 0x7e, 0x00, 0x27, 0xd0, 0x54,
-- 0x70, 0x41, 0x10, 0x60, 0x01, 0xa0, 0xd0, 0x40,
-- 0xa0, 0x78, 0x80, 0x34, 0x80, 0x3f, 0x01, 0x3c,
-- 0xd2, 0x39, 0x00, 0x21, 0xdf, 0x86, 0x0f, 0x87,
-- 0xd0, 0x40, 0x60, 0x4b, 0x03, 0xe5, 0xd0, 0x10,
-- 0xe0, 0x36, 0x50, 0x00, 0x00, 0x28, 0xd0, 0x24,
-- 0x72, 0xc0, 0xd0, 0x40, 0x60, 0x40, 0xd0, 0x0c,
-- 0x52, 0xc0, 0xc0, 0x1c, 0x30, 0x1d, 0xf5, 0x3c,
-- 0x20, 0x1f, 0x30, 0x1e, 0x90, 0x6d, 0x20, 0x01,
-- 0x00, 0x22, 0xd0, 0x58, 0x60, 0x01, 0x00, 0xe3,
-- 0xd0, 0x48, 0x70, 0x41, 0x30, 0x40, 0xf5, 0x47,
-- 0xb2, 0xc8, 0x00, 0xe3, 0xd0, 0x4c, 0x70, 0x41,
-- 0x30, 0x40, 0xfd, 0x4d, 0xb2, 0xc4, 0x00, 0x28,
-- 0xd0, 0x20, 0x70, 0x00, 0x42, 0xc0, 0xa2, 0xc5,
-- 0x12, 0xe0, 0xe9, 0x55, 0x80, 0x40, 0x80, 0x34,
-- 0x80, 0x3f, 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f,
-- 0x03, 0xe7, 0xd0, 0x08, 0x1f, 0xa3, 0xe9, 0x60,
-- 0x03, 0xe9, 0xd0, 0x08, 0x00, 0x27, 0xd0, 0x4c,
-- 0x7f, 0x81, 0x00, 0x27, 0xd0, 0x54, 0x70, 0x41,
-- 0x10, 0x60, 0x03, 0xa0, 0xd0, 0x40, 0xa0, 0x78,
-- 0xe0, 0x3c, 0x50, 0x00, 0xc0, 0x84, 0x10, 0x8c,
-- 0x10, 0x92, 0xd0, 0x41, 0x30, 0x4d, 0x40, 0x43,
-- 0x10, 0x43, 0x20, 0x81, 0xd1, 0x8f, 0x41, 0x82,
-- 0x10, 0x9c, 0x20, 0x9b, 0xc1, 0xc2, 0x10, 0x82,
-- 0x20, 0x87, 0xc0, 0x42, 0x10, 0x43, 0x20, 0x81,
-- 0x10, 0x88, 0x22, 0x02, 0x10, 0x97, 0x01, 0xd0,
-- 0xe9, 0x48, 0xb0, 0x96, 0x10, 0x88, 0x22, 0x82,
-- 0xc0, 0x5c, 0x10, 0x48, 0xc0, 0x84, 0x10, 0x91,
-- 0x10, 0x86, 0x20, 0x42, 0x41, 0x0d, 0x11, 0x02,
-- 0x20, 0x44, 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4,
-- 0xd2, 0x40, 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0,
-- 0xe9, 0x5e, 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0,
-- 0x22, 0x48, 0xd0, 0x78, 0x03, 0x50, 0xf9, 0x69,
-- 0xd0, 0x7c, 0x01, 0x9d, 0xf9, 0x69, 0xc2, 0x48,
-- 0xb2, 0x60, 0xc2, 0xca, 0xb2, 0xf0, 0x11, 0x82,
-- 0x41, 0x81, 0x22, 0x06, 0x11, 0x9f, 0x41, 0x81,
-- 0x22, 0x86, 0x0f, 0xc5, 0xc0, 0x84, 0x10, 0x8c,
-- 0x10, 0x92, 0xd1, 0x8f, 0x41, 0x82, 0x10, 0x9c,
-- 0xc1, 0xdb, 0x11, 0xc1, 0x21, 0xc3, 0x20, 0x87,
-- 0xc1, 0xc2, 0x10, 0x82, 0x20, 0x87, 0xc0, 0x42,
-- 0x10, 0x43, 0x20, 0x81, 0x10, 0x88, 0x22, 0x02,
-- 0x10, 0x97, 0x01, 0xd0, 0xe9, 0x46, 0xb0, 0x96,
-- 0x10, 0x88, 0x22, 0x82, 0xc0, 0x5c, 0x10, 0x48,
-- 0xc0, 0x84, 0x10, 0x91, 0x10, 0x86, 0x20, 0x42,
-- 0xd0, 0x81, 0x41, 0x02, 0x11, 0x02, 0x20, 0x44,
-- 0x22, 0x01, 0x22, 0x81, 0x02, 0xe4, 0xd2, 0x40,
-- 0xc2, 0xca, 0xb2, 0xe0, 0x01, 0xd0, 0xe9, 0x5d,
-- 0xc2, 0xca, 0x22, 0xc9, 0xb2, 0xa0, 0x22, 0x48,
-- 0x11, 0x9f, 0x11, 0x83, 0x22, 0x06, 0x11, 0x9c,
-- 0x11, 0x83, 0x22, 0x86, 0x0f, 0xc5, 0xd0, 0x41,
-- 0x40, 0x44, 0x20, 0x55, 0x10, 0x62, 0xf9, 0x6f,
-- 0x01, 0x74, 0xd6, 0x00, 0xc2, 0x9f, 0xc2, 0x1f,
-- 0x22, 0x80, 0xe1, 0x30, 0x0f, 0x11, 0xf9, 0x51,
-- 0x90, 0x38, 0x80, 0x3f, 0x00, 0x1b, 0xf9, 0x51,
-- 0x00, 0x27, 0xd0, 0x04, 0x70, 0x40, 0x30, 0x71,
-- 0xf9, 0x51, 0xb0, 0x3c, 0x70, 0x40, 0x30, 0x5d,
-- 0xf9, 0x51, 0xb0, 0x08, 0x70, 0x40, 0xb0, 0x7f,
-- 0x60, 0x40, 0x10, 0x63, 0xe5, 0x5d, 0x02, 0x20,
-- 0xd0, 0x01, 0xa0, 0x37, 0x00, 0x26, 0xd0, 0x24,
-- 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x08,
-- 0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x00, 0x26,
-- 0xd0, 0x30, 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40,
-- 0xb0, 0x30, 0xd0, 0x40, 0x60, 0x40, 0xb0, 0x3c,
-- 0x6c, 0x40, 0xb0, 0x3c, 0x67, 0x40, 0x00, 0x33,
-- 0xdf, 0x78, 0xe0, 0x36, 0x00, 0x26, 0xd0, 0x1c,
-- 0x70, 0x40, 0xb0, 0x7f, 0x60, 0x40, 0xb0, 0x3c,
-- 0x70, 0x40, 0xb0, 0x41, 0x60, 0x40, 0x08, 0x20,
-- 0xdf, 0x00, 0x80, 0x35, 0xc0, 0x3c, 0x10, 0x08,
-- 0xa0, 0x0a, 0xa0, 0x27, 0xa0, 0x1b, 0xdf, 0x5c,
-- 0x01, 0xa0, 0xd0, 0x00, 0xa0, 0x38, 0x80, 0x3f,
-- 0x80, 0x34, 0x80, 0x3f, 0x03, 0xba, 0xda, 0x1e,
-- 0xcf, 0x95, 0x82, 0x34, 0x80, 0x3f, 0x03, 0xe7,
-- 0xd0, 0x08, 0x1f, 0xa3, 0xe9, 0x55, 0x1f, 0xa0,
-- 0xe9, 0x55, 0x03, 0xe9, 0xd0, 0x08, 0x00, 0x21,
-- 0xdf, 0x86, 0xe0, 0x3c, 0x89, 0x78, 0x89, 0x37,
-- 0x00, 0xee, 0xd0, 0x14, 0x76, 0x00, 0xd0, 0x30,
-- 0x76, 0x40, 0x26, 0x58, 0xd6, 0xd9, 0x00, 0xee,
-- 0xd0, 0x20, 0x75, 0x40, 0xd0, 0x1c, 0x71, 0x40,
-- 0xd0, 0x20, 0x71, 0x00, 0xd0, 0x24, 0x70, 0x80,
-- 0xc4, 0x02, 0xd0, 0x28, 0x70, 0xc0, 0x00, 0x21,
-- 0xd0, 0x10, 0x72, 0x00, 0x93, 0x90, 0xd4, 0x81,
-- 0x13, 0x96, 0x43, 0x92, 0x34, 0x8e, 0x00, 0x22,
-- 0xd1, 0xa4, 0x71, 0x86, 0xde, 0x40, 0x7e, 0x79,
-- 0xd0, 0x18, 0x70, 0x40, 0xb0, 0x41, 0xf5, 0x58,
-- 0xd3, 0x42, 0x50, 0x4d, 0x60, 0x40, 0x10, 0x60,
-- 0xe5, 0x62, 0xd0, 0x54, 0x70, 0x01, 0xb0, 0x3c,
-- 0x60, 0x01, 0x04, 0x2d, 0xd0, 0x08, 0xe0, 0x36,
-- 0x00, 0x22, 0xd0, 0x60, 0x71, 0xc1, 0xd0, 0x4f,
-- 0x41, 0xc1, 0x03, 0xef, 0xd0, 0x30, 0xe0, 0x36,
-- 0x50, 0x00, 0x50, 0x00, 0x04, 0x21, 0xd0, 0x20,
-- 0xd3, 0x44, 0x72, 0x8d, 0x12, 0xa0, 0xe8, 0x36,
-- 0xc0, 0x47, 0x10, 0x5d, 0x30, 0x4e, 0xf8, 0x36,
-- 0xb2, 0x3e, 0x60, 0x4d, 0x00, 0xed, 0xd0, 0x48,
-- 0x70, 0x01, 0xde, 0x45, 0x50, 0x39, 0x00, 0x1b,
-- 0xf9, 0x44, 0xb0, 0x01, 0x00, 0x1c, 0xf9, 0x47,
-- 0xb0, 0x04, 0x60, 0x01, 0xd0, 0x40, 0x62, 0x81,
-- 0xce, 0x4a, 0xd0, 0x43, 0x41, 0xc1, 0xd0, 0x58,
-- 0x61, 0xc1, 0x90, 0x43, 0x00, 0xe0, 0xd0, 0x28,
-- 0x70, 0x00, 0x10, 0x1f, 0x20, 0x40, 0xb1, 0xc1,
-- 0xf5, 0x54, 0x00, 0x21, 0xd0, 0x08, 0x60, 0x40,
-- 0x00, 0xe6, 0xd0, 0x40, 0x70, 0x41, 0xd2, 0x94,
-- 0x60, 0x4a, 0x04, 0x2b, 0xd0, 0x10, 0x01, 0x90,
-- 0xf8, 0x36, 0x04, 0x2d, 0xd0, 0x08, 0xe0, 0x36,
-- 0x50, 0x00, 0x50, 0x00, 0xc0, 0x47, 0x10, 0x5d,
-- 0x30, 0x4e, 0xf9, 0x41, 0x90, 0x43, 0x00, 0xe0,
-- 0xd0, 0x28, 0x70, 0x00, 0x20, 0x40, 0x00, 0x21,
-- 0xd0, 0x08, 0x60, 0x40, 0x00, 0x26, 0xd0, 0x74,
-- 0x70, 0x01, 0xb0, 0x3f, 0x60, 0x01, 0x00, 0xed,
-- 0xd0, 0x48, 0x70, 0x41, 0x00, 0x5e, 0xf9, 0x4b,
-- 0x00, 0x21, 0xd0, 0x00, 0x73, 0x80, 0xd4, 0x81,
-- 0x34, 0x8e, 0x00, 0x34, 0xd3, 0x48, 0xe0, 0x36,
-- 0x50, 0x00, 0x50, 0x00, 0xd1, 0x88, 0xd1, 0xc8,
-- 0x01, 0x1b, 0xe9, 0x39, 0x11, 0x9f, 0x11, 0xdf,
-- 0xd4, 0x80, 0xd3, 0x81, 0xe1, 0x43, 0x00, 0xed,
-- 0xd0, 0x08, 0x70, 0x00, 0x00, 0x10, 0xf9, 0x37,
-- 0x0c, 0x1f, 0xf9, 0x36, 0x13, 0xa1, 0xe9, 0x43,
-- 0xbe, 0x7c, 0x00, 0x65, 0xd2, 0x46, 0x12, 0x48,
-- 0xc0, 0x39, 0x30, 0x18, 0xe5, 0x4b, 0xd2, 0x70,
-- 0x72, 0x49, 0x22, 0x79, 0x00, 0x21, 0xd0, 0x00,
-- 0x63, 0x80, 0x04, 0x24, 0xd0, 0x00, 0x02, 0x10,
-- 0xe9, 0x56, 0xd0, 0x41, 0x51, 0x41, 0xe0, 0x36,
-- 0x15, 0x61, 0xe8, 0x36, 0xd5, 0x80, 0xd3, 0x00,
-- 0xd3, 0x40, 0x04, 0x27, 0xd0, 0x20, 0xe0, 0x36,
-- 0x50, 0x00, 0x50, 0x00, 0x00, 0x21, 0xd0, 0x18,
-- 0x73, 0x00, 0xb0, 0x04, 0x73, 0x80, 0xd2, 0x80,
-- 0xb0, 0x38, 0x72, 0xc0, 0x31, 0x0d, 0xc0, 0x0e,
-- 0x10, 0x0b, 0x10, 0x20, 0xe9, 0x42, 0xf5, 0x3f,
-- 0x22, 0x8d, 0x10, 0x01, 0x13, 0x5f, 0xe1, 0x3b,
-- 0x33, 0x8b, 0x15, 0x61, 0xf9, 0x49, 0x00, 0x21,
-- 0xd0, 0x64, 0x70, 0x41, 0x33, 0x81, 0x03, 0xd0,
-- 0xe9, 0x4c, 0x20, 0x0b, 0x13, 0xdf, 0x12, 0xc1,
-- 0x13, 0xe0, 0xf9, 0x49, 0x10, 0x03, 0xc0, 0x50,
-- 0x10, 0x4b, 0x13, 0x0b, 0x23, 0x00, 0x13, 0x20,
-- 0xe9, 0x5c, 0xf5, 0x59, 0x22, 0x81, 0x13, 0x01,
-- 0x10, 0x5f, 0xe1, 0x55, 0x12, 0x99, 0x12, 0x87,
-- 0x21, 0x0a, 0x00, 0xa0, 0xd2, 0x80, 0xc3, 0x0a,
-- 0x03, 0x90, 0xe9, 0x66, 0x22, 0x82, 0x23, 0x03,
-- 0x10, 0x81, 0x10, 0xc1, 0x13, 0x9f, 0x13, 0xa0,
-- 0xed, 0x62, 0xc0, 0x8a, 0xc0, 0xcc, 0x04, 0x26,
-- 0xd0, 0x00, 0xe0, 0x36, 0x15, 0x61, 0xf9, 0x3d,
-- 0x07, 0x32, 0xd0, 0x00, 0x30, 0x03, 0xed, 0x3d,
-- 0xc0, 0x03, 0x10, 0x1d, 0x30, 0xc0, 0xc0, 0x02,
-- 0x10, 0x1d, 0x30, 0x80, 0xe1, 0x32, 0x10, 0x94,
-- 0x10, 0xd4, 0x00, 0x21, 0xd0, 0x20, 0x73, 0x00,
-- 0xc5, 0x8c, 0xd3, 0x4e, 0x01, 0x1b, 0xe9, 0x48,
-- 0x13, 0x1f, 0xd3, 0x4f, 0x43, 0x4c, 0x13, 0x1c,
-- 0xc0, 0x0c, 0x10, 0x03, 0x20, 0x0c, 0xc0, 0x40,
-- 0x10, 0x42, 0x20, 0x40, 0x10, 0x46, 0x20, 0x4d,
-- 0x10, 0x42, 0x2e, 0x41, 0x10, 0x5c, 0x10, 0x43,
-- 0x00, 0x59, 0xe9, 0x5b, 0x01, 0x69, 0xd0, 0x20,
-- 0x30, 0x40, 0x22, 0x41, 0x04, 0x27, 0xd0, 0x20,
-- 0xe0, 0x36, 0x50, 0x00, 0x2c, 0x14, 0xd0, 0x34,
-- 0x63, 0x00, 0xd0, 0x38, 0x72, 0xc0, 0xc0, 0x51,
-- 0x10, 0x5c, 0x30, 0x4b, 0x10, 0x44, 0xd4, 0xc0,
-- 0xd5, 0x00, 0xc0, 0x18, 0x30, 0x39, 0xed, 0x5f,
-- 0xd4, 0xd0, 0xc5, 0x01, 0xd0, 0x18, 0x70, 0x00,
-- 0x0c, 0x1f, 0xe9, 0x48, 0x10, 0x20, 0xfd, 0x48,
-- 0xd4, 0xc0, 0xd5, 0x00, 0x10, 0x22, 0xe5, 0x4e,
-- 0xd4, 0xc0, 0xbc, 0x30, 0xd5, 0x00, 0xb5, 0x10,
-- 0xb0, 0x3f, 0xf9, 0x52, 0x3c, 0x01, 0x3c, 0x01,
-- 0x02, 0x1f, 0xe9, 0x5f, 0x00, 0xa8, 0xd3, 0xc0,
-- 0xd3, 0x9e, 0x00, 0xa9, 0xd0, 0x38, 0x70, 0x4f,
-- 0xb3, 0xfc, 0x60, 0x40, 0xb0, 0x3c, 0xb3, 0x81,
-- 0xed, 0x59, 0x00, 0x21, 0xd0, 0x28, 0x70, 0x00,
-- 0x10, 0x20, 0xf9, 0x69, 0x02, 0x1f, 0xf9, 0x6a,
-- 0x90, 0x10, 0x00, 0x1e, 0xe9, 0x6a, 0xb1, 0x7c,
-- 0x04, 0x29, 0xd0, 0x20, 0xe0, 0x36, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x01, 0x5e, 0xf9, 0x35,
-- 0x01, 0x50, 0xe9, 0x35, 0xb1, 0x78, 0xd2, 0x00,
-- 0x01, 0x5c, 0xf9, 0x5f, 0xc0, 0x18, 0x30, 0x39,
-- 0xed, 0x5f, 0x11, 0x9f, 0xce, 0x58, 0xc2, 0x59,
-- 0x00, 0xa9, 0xd2, 0x38, 0x14, 0x82, 0x22, 0x12,
-- 0xc0, 0x0c, 0x10, 0x1f, 0x10, 0x03, 0x22, 0x00,
-- 0x70, 0x48, 0x03, 0x10, 0xe9, 0x4c, 0xb2, 0x38,
-- 0xbe, 0x60, 0xb2, 0x60, 0x2e, 0x41, 0x10, 0x5f,
-- 0x00, 0x59, 0xe9, 0x53, 0x01, 0x69, 0xd0, 0x3c,
-- 0x30, 0x40, 0x22, 0x41, 0x13, 0x41, 0x2e, 0x4d,
-- 0x13, 0x5d, 0x13, 0x43, 0x22, 0x4d, 0x14, 0xe0,
-- 0xe9, 0x5f, 0x33, 0x0b, 0x13, 0x04, 0x2c, 0x0c,
-- 0x35, 0x0c, 0xc3, 0x46, 0xc3, 0x87, 0x04, 0x61,
-- 0xd0, 0x28, 0x15, 0x62, 0xfc, 0x36, 0x04, 0x2f,
-- 0xd0, 0x28, 0xe0, 0x36, 0x00, 0x22, 0xd0, 0x74,
-- 0x74, 0x01, 0xb0, 0x7c, 0x74, 0x41, 0xb0, 0x7c,
-- 0x00, 0x27, 0xd0, 0x20, 0x30, 0x11, 0xf5, 0x3b,
-- 0x24, 0x40, 0x71, 0x41, 0xd1, 0x08, 0xc0, 0x10,
-- 0x10, 0x1c, 0xb0, 0x16, 0xf9, 0x4a, 0x00, 0x23,
-- 0xd0, 0x30, 0x30, 0x11, 0xf9, 0x4a, 0xb1, 0x70,
-- 0x01, 0x50, 0xf9, 0x4a, 0xb1, 0x20, 0x14, 0x41,
-- 0xc0, 0x90, 0x00, 0x2b, 0xd0, 0xd0, 0x01, 0x50,
-- 0xe9, 0x50, 0xc0, 0xd0, 0x00, 0x34, 0xdc, 0x00,
-- 0x20, 0x11, 0x10, 0x1f, 0xa0, 0x1c, 0x00, 0x21,
-- 0xd0, 0x2c, 0x70, 0x00, 0x10, 0x05, 0x51, 0x40,
-- 0xd0, 0x1c, 0x61, 0x40, 0xd0, 0x20, 0x61, 0x00,
-- 0xd0, 0x24, 0x60, 0x80, 0xd0, 0x28, 0x60, 0xc0,
-- 0x04, 0x2d, 0xd0, 0x08, 0x00, 0x22, 0xd0, 0x64,
-- 0xb1, 0x81, 0x61, 0x81, 0xe0, 0x36, 0x50, 0x00,
-- 0x50, 0x00, 0x50, 0x00, 0x90, 0x50, 0xd0, 0x3c,
-- 0x10, 0x41, 0x60, 0x40, 0x15, 0x62, 0xfd, 0x3d,
-- 0xc0, 0x10, 0x10, 0x1e, 0x10, 0x07, 0x21, 0x00,
-- 0x10, 0x16, 0x34, 0x00, 0xc0, 0x90, 0xd3, 0x40,
-- 0x00, 0x24, 0xd3, 0xc0, 0x04, 0x22, 0xd0, 0x20,
-- 0x01, 0x9f, 0xe8, 0x36, 0xd0, 0x54, 0x70, 0x41,
-- 0x73, 0x41, 0x04, 0x2e, 0xd0, 0x00, 0xe0, 0x36,
-- 0x50, 0x00, 0x50, 0x00, 0x00, 0xef, 0xd3, 0x30,
-- 0x73, 0x0c, 0xd0, 0x0c, 0x70, 0x00, 0xc0, 0x40,
-- 0x13, 0x24, 0xf5, 0x42, 0x13, 0x22, 0xe9, 0x41,
-- 0xe5, 0x43, 0xd3, 0x00, 0x10, 0x22, 0xf9, 0x41,
-- 0xd0, 0x01, 0xd0, 0x43, 0xd3, 0x01, 0x21, 0x00,
-- 0xd3, 0x40, 0x03, 0x10, 0xf9, 0x47, 0xd3, 0x40,
-- 0xe1, 0x61, 0x00, 0x23, 0xd0, 0x00, 0x10, 0x61,
-- 0xe9, 0x50, 0xb0, 0x33, 0x10, 0x63, 0xe9, 0x50,
-- 0x00, 0x22, 0xd0, 0x1a, 0xc3, 0xc0, 0xd2, 0xc0,
-- 0x00, 0x10, 0xe9, 0x55, 0x22, 0xd0, 0x10, 0x1f,
-- 0x14, 0x01, 0x10, 0x20, 0xed, 0x52, 0x14, 0x18,
-- 0x12, 0xd8, 0xc0, 0x8b, 0x32, 0xd0, 0x12, 0xc3,
-- 0x33, 0x4b, 0x13, 0x47, 0x21, 0x0d, 0x04, 0x22,
-- 0xd0, 0x20, 0xe0, 0x36, 0x00, 0x24, 0xd0, 0x30,
-- 0xd0, 0x40, 0x60, 0x40, 0xd3, 0xc7, 0x43, 0xc4,
-- 0x31, 0x0f, 0xd5, 0xd4, 0x25, 0xcf, 0x15, 0xc4,
-- 0x10, 0xdf, 0xc2, 0xc6, 0xc3, 0x07, 0x11, 0x81,
-- 0xb1, 0x3b, 0x15, 0x64, 0xe9, 0x47, 0x10, 0xdf,
-- 0x12, 0xc1, 0x11, 0x81, 0x11, 0xc1, 0xb1, 0x3f,
-- 0xb5, 0xf8, 0x90, 0x10, 0x00, 0x16, 0xf9, 0x5e,
-- 0xb5, 0xfc, 0xd0, 0x20, 0x40, 0x39, 0x2e, 0x4b,
-- 0x22, 0x4c, 0x12, 0x20, 0xe9, 0x59, 0x20, 0x39,
-- 0x00, 0x1b, 0xe9, 0x59, 0x2c, 0x13, 0x35, 0x13,
-- 0x0e, 0x5a, 0xf9, 0x59, 0xb2, 0x38, 0x02, 0xe3,
-- 0xd0, 0x00, 0x0e, 0x5a, 0xe9, 0x5e, 0x2e, 0x40,
-- 0x01, 0xee, 0xd2, 0x80, 0x42, 0x84, 0xc0, 0x03,
-- 0x30, 0x02, 0xf5, 0x6b, 0x31, 0x0a, 0x12, 0x98,
-- 0x20, 0x03, 0xf5, 0x69, 0x12, 0x9f, 0x12, 0x87,
-- 0x51, 0x0a, 0x00, 0x34, 0xd4, 0xc8, 0xe0, 0x36,
-- 0x50, 0x00, 0x50, 0x00, 0xd3, 0xc7, 0x43, 0xc4,
-- 0x15, 0x61, 0xf9, 0x48, 0x10, 0xc1, 0xd5, 0xe0,
-- 0xd1, 0x80, 0xd1, 0xc0, 0x31, 0x0f, 0x13, 0xe1,
-- 0xe9, 0x3c, 0xd3, 0xc0, 0x00, 0x24, 0xd0, 0x30,
-- 0x63, 0xc0, 0x25, 0xcf, 0x15, 0xc2, 0xd0, 0x03,
-- 0x40, 0x16, 0x25, 0xc0, 0x15, 0xc2, 0x15, 0x81,
-- 0x35, 0x91, 0xe1, 0x5c, 0x00, 0x24, 0xd0, 0x30,
-- 0x63, 0xc0, 0x01, 0x50, 0xe9, 0x54, 0x15, 0xa0,
-- 0xf9, 0x55, 0x00, 0x24, 0xd0, 0x34, 0x70, 0x00,
-- 0x10, 0x20, 0xe9, 0x55, 0xd3, 0xc0, 0x31, 0x0f,
-- 0xd5, 0xfc, 0x25, 0xcf, 0x15, 0xc3, 0x14, 0xa0,
-- 0xe9, 0x5c, 0xb5, 0xfc, 0x00, 0x34, 0xd4, 0xc8,
-- 0xe0, 0x36, 0x50, 0x00, 0xc4, 0x91, 0x34, 0x96,
-- 0xed, 0x34, 0xd4, 0x80, 0x14, 0x84, 0xb3, 0xc1,
-- 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5e, 0x34, 0x81,
-- 0xb3, 0xc1, 0xe5, 0x41, 0xc0, 0x52, 0x10, 0x5c,
-- 0x24, 0x81, 0xb3, 0xc1, 0xe5, 0x37, 0x02, 0x68,
-- 0xd0, 0x00, 0xb4, 0xb0, 0x14, 0x9b, 0x00, 0x23,
-- 0xd0, 0x70, 0x30, 0x52, 0xed, 0x4a, 0x24, 0x81,
-- 0x20, 0x12, 0xa0, 0x1c, 0x10, 0x8a, 0x50, 0x83,
-- 0xa0, 0x96, 0xa1, 0x50, 0xa1, 0x11, 0xc0, 0x52,
-- 0xd4, 0x84, 0x10, 0x6c, 0xed, 0x56, 0xd4, 0x81,
-- 0xd1, 0x00, 0xb1, 0x13, 0x00, 0x23, 0xd1, 0x40,
-- 0xc2, 0xb9, 0x22, 0x86, 0x12, 0x20, 0xf9, 0x66,
-- 0x02, 0xe3, 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x63,
-- 0x22, 0x81, 0x02, 0x5a, 0xe9, 0x66, 0x22, 0x41,
-- 0x75, 0xd7, 0xc3, 0xd7, 0xd0, 0xd7, 0x00, 0x21,
-- 0xd0, 0xb6, 0x8b, 0x38, 0x00, 0x33, 0xdc, 0xd0,
-- 0xe0, 0x36, 0x50, 0x00, 0xd0, 0x7c, 0x60, 0x01,
-- 0xae, 0x52, 0xd0, 0x60, 0x40, 0x79, 0x00, 0x13,
-- 0xe8, 0xc9, 0xa2, 0x94, 0x22, 0x86, 0x13, 0xe0,
-- 0xe4, 0xd0, 0x13, 0xc1, 0x15, 0x62, 0xfc, 0xd1,
-- 0x13, 0xc1, 0xe0, 0xd1, 0xc3, 0xd7, 0x03, 0xd9,
-- 0xe8, 0xd4, 0x22, 0x8d, 0x15, 0x62, 0xfc, 0xda,
-- 0x03, 0xda, 0xe8, 0xda, 0x22, 0x8d, 0x22, 0x8d,
-- 0xce, 0x4a, 0x22, 0x86, 0x00, 0x14, 0xe8, 0xe0,
-- 0xa2, 0x53, 0x22, 0x47, 0x03, 0xd1, 0xe8, 0xe8,
-- 0x22, 0x4e, 0x15, 0x62, 0xfc, 0xe8, 0x03, 0xd2,
-- 0xe8, 0xe8, 0x22, 0x4e, 0x12, 0x20, 0xe9, 0x09,
-- 0x20, 0x79, 0x00, 0x5b, 0xe8, 0xf4, 0x15, 0x20,
-- 0xfc, 0xf1, 0x2c, 0x13, 0x35, 0x13, 0x0e, 0x5b,
-- 0xe8, 0xf4, 0xb2, 0x38, 0x02, 0x9a, 0xe8, 0xfb,
-- 0x70, 0x08, 0xd0, 0x7c, 0x42, 0x81, 0x22, 0x98,
-- 0x22, 0x80, 0x02, 0x5a, 0xe9, 0x11, 0x70, 0x08,
-- 0xd0, 0x78, 0x42, 0x41, 0x22, 0x59, 0x10, 0x1f,
-- 0x22, 0x40, 0x00, 0x19, 0xe9, 0x11, 0x01, 0x69,
-- 0xd0, 0x7c, 0x32, 0x41, 0xe1, 0x11, 0x02, 0xe3,
-- 0xd0, 0x40, 0x02, 0x9a, 0xe9, 0x0e, 0x22, 0x81,
-- 0x02, 0x5a, 0xe9, 0x11, 0x22, 0x41, 0x0e, 0x5a,
-- 0xe9, 0x15, 0xce, 0x4a, 0x3e, 0x46, 0x0f, 0x87,
-- 0xdd, 0x48, 0xe1, 0x19, 0xdd, 0x40, 0xdc, 0xc8,
-- 0xdd, 0x3c, 0x7d, 0x34, 0x1d, 0x19, 0x3d, 0x35,
-- 0x4d, 0x33, 0x4c, 0xec, 0x3d, 0x33, 0xf9, 0x17,
-- 0x0f, 0xc5, 0x50, 0x00, 0xd0, 0x39, 0xd0, 0x35,
-- 0xd0, 0x1d, 0xd0, 0x2d, 0xd0, 0x3f, 0xd0, 0x2e,
-- 0xd0, 0x3c, 0xd0, 0x37, 0xd0, 0x38, 0xd0, 0x19,
-- 0xd0, 0x33, 0xd0, 0x2e, 0xd0, 0x3d, 0xd0, 0x3e,
-- 0xd0, 0x27, 0xd0, 0x3e, 0xd0, 0x3a, 0xd0, 0x2f,
-- 0xd0, 0x32, 0x00, 0x00, 0x47, 0x78, 0x46, 0xc0,
-- 0xe1, 0x01, 0x00, 0x90, 0xe1, 0x2f, 0xff, 0x1e,
-- 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00,
-- 0xe5, 0x9f, 0x20, 0x6c, 0xe0, 0x21, 0x10, 0x01,
-- 0xe1, 0x02, 0x00, 0x91, 0xe3, 0x50, 0x00, 0x00,
-- 0x1a, 0x00, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x00,
-- 0xeb, 0x00, 0x38, 0x99, 0xea, 0xff, 0xff, 0xf7,
-- 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xb5, 0x00, 0x4a, 0x12, 0x68, 0x10, 0x28, 0x00,
-- 0xd1, 0x03, 0x20, 0x00, 0xf7, 0xf1, 0xff, 0xc6,
-- 0xe7, 0xf7, 0xbd, 0x00, 0x47, 0x78, 0x00, 0x00,
-- 0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x20, 0x2c,
-- 0xe3, 0xa0, 0x10, 0x01, 0xe1, 0x02, 0x00, 0x91,
-- 0xe3, 0x50, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x02,
-- 0xe3, 0xa0, 0x00, 0x00, 0xeb, 0x00, 0x38, 0x88,
-- 0xea, 0xff, 0xff, 0xf7, 0xe8, 0xbd, 0x00, 0x01,
-- 0xe1, 0x2f, 0xff, 0x10, 0x48, 0x02, 0x40, 0x49,
-- 0x60, 0x01, 0x47, 0x70, 0x70, 0x00, 0x00, 0x34,
-- 0x2e, 0x08, 0x1f, 0xa8, 0x47, 0x78, 0x46, 0xc0,
-- 0xe1, 0xa0, 0x09, 0x00, 0xe1, 0xb0, 0x10, 0x01,
-- 0x03, 0xc0, 0x01, 0x02, 0x13, 0x80, 0x01, 0x02,
-- 0xe3, 0xa0, 0x13, 0x3f, 0xe3, 0xa0, 0x30, 0x0e,
-- 0xe1, 0xb0, 0x10, 0x81, 0x3a, 0x00, 0x00, 0x04,
-- 0xe1, 0xb0, 0x00, 0x80, 0x32, 0x21, 0x13, 0x03,
-- 0xe2, 0x53, 0x30, 0x01, 0x1a, 0xff, 0xff, 0xf9,
-- 0xea, 0x00, 0x00, 0x03, 0xe1, 0xb0, 0x00, 0x80,
-- 0x22, 0x21, 0x13, 0x03, 0xe2, 0x53, 0x30, 0x01,
-- 0x1a, 0xff, 0xff, 0xf4, 0xe1, 0xa0, 0x0d, 0x21,
-- 0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x41, 0xf0,
-- 0xe2, 0x4d, 0xd0, 0x14, 0xe3, 0xa0, 0xc0, 0x44,
-- 0xe2, 0x8c, 0xc4, 0x66, 0xe5, 0x9c, 0xc0, 0x00,
-- 0xe5, 0x9f, 0x01, 0x94, 0xe5, 0x80, 0xc0, 0x00,
-- 0xe1, 0xa0, 0xc1, 0x4c, 0xe2, 0x0c, 0xc0, 0x03,
-- 0xe5, 0x9f, 0x01, 0x88, 0xe5, 0xc0, 0xc0, 0x00,
-- 0xe5, 0x9f, 0x01, 0x84, 0xe5, 0x90, 0x00, 0x00,
-- 0xe0, 0x80, 0x64, 0x0c, 0xe1, 0xa0, 0x70, 0x06,
-- 0xe8, 0xb7, 0x00, 0x01, 0xe2, 0x00, 0x40, 0x1f,
-- 0xe2, 0x8f, 0x2f, 0x69, 0xe7, 0x92, 0x21, 0x04,
-- 0xe3, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x51,
-- 0xe5, 0x9f, 0x32, 0x1c, 0xe2, 0x83, 0x50, 0xbc,
-- 0xe5, 0x9f, 0x12, 0x1c, 0xe1, 0x55, 0x00, 0x01,
-- 0x03, 0xa0, 0x50, 0x00, 0xe5, 0x9f, 0x12, 0x04,
-- 0xe1, 0x51, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x45,
-- 0xe5, 0x9f, 0x81, 0xf4, 0xe0, 0x88, 0x80, 0x03,
-- 0xe5, 0x9f, 0x11, 0x5c, 0xe1, 0xa0, 0x36, 0x20,
-- 0xe2, 0x03, 0x30, 0x0f, 0xe1, 0x81, 0x10, 0x03,
-- 0xe5, 0x9f, 0x21, 0x48, 0xe7, 0x92, 0x31, 0x04,
-- 0xe1, 0xa0, 0x39, 0x83, 0xe1, 0xa0, 0x35, 0xa3,
-- 0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x33, 0xa0,
-- 0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3b, 0x03,
-- 0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x35, 0x20,
-- 0xe2, 0x03, 0x30, 0x03, 0xe1, 0xa0, 0x32, 0x03,
-- 0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x3a, 0xa0,
-- 0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3b, 0x83,
-- 0xe1, 0x81, 0x10, 0x03, 0xe1, 0xa0, 0x34, 0xa0,
-- 0xe2, 0x03, 0x30, 0x01, 0xe1, 0xa0, 0x3a, 0x83,
-- 0xe1, 0x81, 0x10, 0x03, 0xe2, 0x00, 0x30, 0x60,
-- 0xe1, 0xa0, 0x30, 0x83, 0xe1, 0x81, 0x10, 0x03,
-- 0xe8, 0xa8, 0x00, 0x02, 0xe5, 0x9f, 0x00, 0xf0,
-- 0xe3, 0xa0, 0x10, 0x30, 0xe5, 0x80, 0x10, 0x00,
-- 0xe5, 0x9f, 0x00, 0x9c, 0xe5, 0xd0, 0x40, 0x00,
-- 0xe2, 0x84, 0x10, 0x01, 0xe5, 0xc0, 0x10, 0x00,
-- 0xe2, 0x04, 0x40, 0x00, 0xe5, 0x9f, 0x00, 0x98,
-- 0xe5, 0x90, 0x10, 0x00, 0xe3, 0x11, 0x00, 0x10,
-- 0x1a, 0x00, 0x00, 0x1a, 0xe5, 0x80, 0x10, 0x00,
-- 0xe5, 0x8f, 0x51, 0x4c, 0xe1, 0xa0, 0x22, 0x04,
-- 0xe1, 0x82, 0x10, 0x0c, 0xe5, 0x9f, 0x00, 0xac,
-- 0xe0, 0x80, 0x02, 0x01, 0xe5, 0x80, 0x70, 0x00,
-- 0xe5, 0x80, 0x80, 0x04, 0xe5, 0x9f, 0x10, 0x5c,
-- 0xe5, 0x80, 0x10, 0x08, 0xe5, 0x9f, 0x10, 0x58,
-- 0xe5, 0x80, 0x10, 0x0c, 0xe5, 0x9f, 0x00, 0x58,
-- 0xe5, 0x90, 0x10, 0x00, 0xe0, 0x84, 0x00, 0x01,
-- 0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x00, 0x12,
-- 0xe3, 0xa0, 0x10, 0x40, 0xe2, 0x81, 0x14, 0x66,
-- 0xe5, 0x81, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x01,
-- 0xe1, 0xa0, 0x0c, 0x11, 0xe3, 0xa0, 0x10, 0xb8,
-- 0xe2, 0x81, 0x14, 0x66, 0xe5, 0x81, 0x00, 0x00,
-- 0xe2, 0x8d, 0xd0, 0x14, 0xe8, 0xbd, 0x81, 0xf0,
-- 0xe5, 0x9f, 0x10, 0xf0, 0xe2, 0x81, 0x10, 0x01,
-- 0xe5, 0x8f, 0x10, 0xe8, 0xea, 0xff, 0xff, 0xf4,
-- 0xe5, 0x9f, 0xf0, 0x08, 0xa0, 0x00, 0x05, 0xc4,
-- 0x80, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x10,
-- 0x00, 0x00, 0x06, 0xf4, 0xa0, 0x00, 0x04, 0x28,
-- 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x05, 0x50,
-- 0x2c, 0x00, 0x1f, 0xe8, 0x2c, 0x00, 0x1f, 0xea,
-- 0x2c, 0x00, 0x1f, 0xf4, 0x00, 0x00, 0x05, 0xe0,
-- 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x12,
-- 0x2c, 0x00, 0x02, 0x00, 0x64, 0x00, 0x04, 0x00,
-- 0x64, 0x00, 0x00, 0x80, 0x47, 0x00, 0x00, 0x00,
-- 0x9e, 0x00, 0x00, 0xc0, 0x66, 0x00, 0x00, 0x50,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x07,
-- 0xe1, 0xb0, 0xf0, 0x0e, 0xe5, 0x9f, 0xf1, 0x00,
-- 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x08,
-- 0xea, 0x00, 0x00, 0x02, 0xe5, 0x9f, 0xf0, 0xec,
-- 0xe2, 0x5e, 0xf0, 0x04, 0x2c, 0x00, 0x00, 0xe8,
-- 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f,
-- 0xe3, 0x80, 0x00, 0x1b, 0xe1, 0x29, 0xf0, 0x00,
-- 0xe5, 0x9f, 0xd0, 0xd8, 0xe5, 0x9f, 0x00, 0xd8,
-- 0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00,
-- 0xe3, 0xc0, 0x00, 0x1f, 0xe3, 0x80, 0x00, 0x13,
-- 0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0xc4,
-- 0xe5, 0x9f, 0x00, 0xc4, 0xe0, 0x8d, 0xd0, 0x00,
-- 0xe1, 0x0f, 0x00, 0x00, 0xe3, 0xc0, 0x00, 0x1f,
-- 0xe3, 0x80, 0x00, 0x12, 0xe1, 0x29, 0xf0, 0x00,
-- 0xe5, 0x9f, 0xd0, 0xb0, 0xe5, 0x9f, 0x00, 0xb0,
-- 0xe0, 0x8d, 0xd0, 0x00, 0xe1, 0x0f, 0x00, 0x00,
-- 0xe3, 0xc0, 0x00, 0x9f, 0xe3, 0x80, 0x00, 0x10,
-- 0xe1, 0x29, 0xf0, 0x00, 0xe5, 0x9f, 0xd0, 0x60,
-- 0xeb, 0x00, 0x00, 0x08, 0xe5, 0x9f, 0x00, 0x64,
-- 0xe5, 0x9f, 0x10, 0x5c, 0xeb, 0x00, 0x37, 0xa7,
-- 0xe5, 0x9f, 0x00, 0x60, 0xe5, 0x9f, 0x10, 0x58,
-- 0xeb, 0x00, 0x37, 0xa7, 0xe5, 0x9f, 0xe0, 0x58,
-- 0xe3, 0x8e, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1e,
-- 0xe5, 0x9f, 0x00, 0x8c, 0xe5, 0x9f, 0x10, 0x8c,
-- 0xe5, 0x9f, 0x30, 0x8c, 0xe1, 0x50, 0x00, 0x01,
-- 0x0a, 0x00, 0x00, 0x03, 0xe1, 0x51, 0x00, 0x03,
-- 0x34, 0x90, 0x20, 0x04, 0x34, 0x81, 0x20, 0x04,
-- 0x3a, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0x10, 0x74,
-- 0xe3, 0xa0, 0x20, 0x00, 0xe1, 0x53, 0x00, 0x01,
-- 0x34, 0x83, 0x20, 0x04, 0x3a, 0xff, 0xff, 0xfc,
-- 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x1b, 0xff, 0xf0,
-- 0x2e, 0x1b, 0x7f, 0xf0, 0x2e, 0x1b, 0x7f, 0xef,
-- 0x2e, 0x08, 0x9a, 0x00, 0xcc, 0x1f, 0xff, 0xef,
-- 0xcc, 0x1f, 0x7f, 0xf0, 0x2e, 0x00, 0x1c, 0x39,
-- 0x2e, 0x01, 0xca, 0x48, 0x2e, 0x01, 0xcb, 0x40,
-- 0x2e, 0x08, 0x32, 0xf4, 0x00, 0x00, 0x08, 0x00,
-- 0x2e, 0x08, 0x22, 0xf4, 0x00, 0x00, 0x08, 0x00,
-- 0x2e, 0x08, 0x2a, 0xf4, 0x00, 0x00, 0x08, 0x00,
-- 0x2e, 0x08, 0x59, 0xb0, 0xe5, 0x9f, 0xf0, 0x04,
-- 0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04,
-- 0x2e, 0x08, 0x59, 0xb0, 0x2e, 0x08, 0x59, 0xb1,
-- 0x2e, 0x08, 0x59, 0xb2, 0x2e, 0x03, 0x3b, 0xfc,
-- 0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x3b, 0x70,
-- 0x2e, 0x08, 0x99, 0xfc, 0x1d, 0x77, 0x1e, 0x16,
-- 0x03, 0x00, 0x03, 0x03, 0x1d, 0x7f, 0x50, 0x50,
-- 0x4f, 0x5d, 0x49, 0x5d, 0x40, 0x4a, 0x44, 0x43,
-- 0x01, 0x49, 0x4d, 0x56, 0x48, 0x4b, 0x5d, 0x4f,
-- 0x5d, 0x4d, 0x4f, 0x0a, 0x78, 0x71, 0x73, 0x7f,
-- 0x70, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1b,
-- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
-- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
-- 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
-- 0x08, 0x0f, 0x0f, 0x0d, 0x13, 0x0d, 0x11, 0x0e,
-- 0x07, 0x08, 0x09, 0x0d, 0x0d, 0x15, 0x10, 0x05,
-- 0x08, 0x08, 0x09, 0x0e, 0x07, 0x08, 0x07, 0x07,
-- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
-- 0x0d, 0x0d, 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0d,
-- 0x18, 0x0f, 0x10, 0x11, 0x11, 0x10, 0x0f, 0x13,
-- 0x11, 0x06, 0x0c, 0x10, 0x0d, 0x13, 0x11, 0x13,
-- 0x10, 0x13, 0x11, 0x10, 0x0e, 0x11, 0x0f, 0x17,
-- 0x0f, 0x10, 0x0f, 0x07, 0x07, 0x07, 0x0c, 0x0d,
-- 0x08, 0x0d, 0x0e, 0x0c, 0x0e, 0x0d, 0x07, 0x0e,
-- 0x0e, 0x05, 0x06, 0x0c, 0x06, 0x14, 0x0e, 0x0d,
-- 0x0e, 0x0e, 0x08, 0x0c, 0x07, 0x0e, 0x0b, 0x11,
-- 0x0b, 0x0c, 0x0c, 0x08, 0x06, 0x08, 0x0e, 0x12,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00,
-- 0x1e, 0x0f, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x0c, 0xc0, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00,
-- 0x06, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00,
-- 0x0e, 0xe0, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x30, 0x01, 0x80, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00,
-- 0x0c, 0x60, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00,
-- 0x0c, 0x60, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x60, 0x00, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
-- 0x60, 0x00, 0xc0, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00,
-- 0x18, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0xf0, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00,
-- 0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0xfe, 0x00, 0x00, 0x00, 0x30, 0x78, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x60, 0x00, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0xfe, 0x00, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x3e, 0x60, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00,
-- 0x30, 0x01, 0x80, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00,
-- 0x60, 0x0c, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x38, 0x0e, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x37, 0x1c, 0x00, 0x00,
-- 0x60, 0x0c, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00,
-- 0x1e, 0x0f, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x1c, 0x1c, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x33, 0xf8, 0x00, 0x00,
-- 0xe0, 0x0e, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x0f, 0xf8, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x1f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x31, 0xf0, 0x00, 0x00,
-- 0xc0, 0x06, 0x00, 0x00, 0x1e, 0x30, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x07, 0xf0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00,
-- 0x1f, 0xc0, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x33, 0x07, 0x00, 0x00,
-- 0x0f, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00,
-- 0x7a, 0xf0, 0x00, 0x00, 0x61, 0x86, 0x00, 0x00,
-- 0x1c, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00,
-- 0x62, 0x30, 0x00, 0x00, 0x61, 0x8e, 0x00, 0x00,
-- 0x18, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x3f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x00, 0x00,
-- 0x62, 0x00, 0x00, 0x00, 0x61, 0x8c, 0x00, 0x00,
-- 0x18, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x66, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00,
-- 0x72, 0x00, 0x00, 0x00, 0x61, 0x9c, 0x00, 0x00,
-- 0x0c, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00,
-- 0x7a, 0x00, 0x00, 0x00, 0x61, 0xb8, 0x00, 0x00,
-- 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00,
-- 0x3f, 0x80, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00,
-- 0x0f, 0xe0, 0x00, 0x00, 0x1e, 0x73, 0xc0, 0x00,
-- 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00,
-- 0x02, 0xe0, 0x00, 0x00, 0x00, 0x66, 0x60, 0x00,
-- 0x39, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00,
-- 0x02, 0x70, 0x00, 0x00, 0x00, 0xec, 0x30, 0x00,
-- 0x70, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00,
-- 0x02, 0x30, 0x00, 0x00, 0x00, 0xcc, 0x30, 0x00,
-- 0x60, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00,
-- 0x62, 0x30, 0x00, 0x00, 0x01, 0xcc, 0x30, 0x00,
-- 0x60, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00,
-- 0x72, 0x70, 0x00, 0x00, 0x01, 0x8c, 0x30, 0x00,
-- 0x70, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0x3a, 0xf0, 0x00, 0x00, 0x03, 0x8c, 0x30, 0x00,
-- 0x38, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x03, 0x06, 0x60, 0x00,
-- 0x3f, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x07, 0x03, 0xc0, 0x00,
-- 0x0f, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x0f, 0xc0, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x0f, 0xc0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x1f, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x1f, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
-- 0x38, 0xf0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x70, 0x60, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x30, 0x60, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x1d, 0x80, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x06, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
-- 0x30, 0x60, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x0e, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00,
-- 0x30, 0x60, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x03, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x3e, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x00, 0x70, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00,
-- 0x0c, 0xc0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00,
-- 0x67, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x00, 0x60, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
-- 0x1c, 0xc0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x7f, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x1f, 0xc0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x38, 0xc0, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00,
-- 0x78, 0xe0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x1f, 0xc0, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x70, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x30, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x30, 0xe0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x70, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x60, 0x70, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xe0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x3e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x7f, 0xf0, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x30, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x38, 0x60, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x7f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x1f, 0xe0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x1f, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x7f, 0xf0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xff, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x30, 0x0f, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x38, 0x06, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x03, 0xff, 0xc0, 0x00, 0x07, 0xc0, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x30, 0x1e, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00,
-- 0x38, 0x06, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00,
-- 0x07, 0xc1, 0xe0, 0x00, 0x07, 0xc0, 0x00, 0x00,
-- 0x30, 0x1c, 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00,
-- 0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00,
-- 0x3c, 0x06, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00,
-- 0x0e, 0x00, 0x70, 0x00, 0x06, 0xc0, 0x00, 0x00,
-- 0x30, 0x0c, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00,
-- 0x3e, 0x06, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x1c, 0x79, 0xb8, 0x00, 0x0e, 0xe0, 0x00, 0x00,
-- 0x30, 0x0c, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00,
-- 0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x03, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00,
-- 0x36, 0x06, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00,
-- 0x39, 0xff, 0x9c, 0x00, 0x0c, 0x60, 0x00, 0x00,
-- 0x30, 0x0c, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00,
-- 0x37, 0x06, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0x31, 0xcf, 0x9c, 0x00, 0x0c, 0x60, 0x00, 0x00,
-- 0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x37, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x36, 0x0d, 0x80, 0x00,
-- 0x33, 0x06, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x33, 0x87, 0x0c, 0x00, 0x1c, 0x70, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x03, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x37, 0x1d, 0x80, 0x00,
-- 0x31, 0x86, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x77, 0x03, 0x0c, 0x00, 0x18, 0x30, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x03, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x60, 0x3f, 0x80, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00,
-- 0x31, 0xc6, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x67, 0x03, 0x0c, 0x00, 0x38, 0x38, 0x00, 0x00,
-- 0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x3f, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x3d, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00,
-- 0x30, 0xc6, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x66, 0x03, 0x0c, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x01, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x33, 0x19, 0x80, 0x00,
-- 0x30, 0x66, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x66, 0x07, 0x1c, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00,
-- 0x30, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0x01, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0xc0, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x31, 0xb1, 0x80, 0x00,
-- 0x30, 0x76, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0x66, 0x06, 0x18, 0x00, 0x70, 0x1c, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x60, 0xc0, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x31, 0xb1, 0x80, 0x00,
-- 0x30, 0x36, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00,
-- 0x67, 0x0e, 0x38, 0x00, 0x60, 0x0c, 0x00, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x60, 0xc0, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x31, 0xf1, 0x80, 0x00,
-- 0x30, 0x3e, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x77, 0x1e, 0x70, 0x00, 0x60, 0x0c, 0x00, 0x00,
-- 0x30, 0x1e, 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00,
-- 0x30, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x71, 0xc0, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x31, 0xf1, 0x80, 0x00,
-- 0x30, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00,
-- 0x73, 0xff, 0xe0, 0x00, 0xe0, 0x0e, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x3f, 0x80, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x30, 0xe1, 0x80, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00,
-- 0x39, 0xe7, 0xc0, 0x00, 0xc0, 0x06, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x1f, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x30, 0xe1, 0x80, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x3c, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xc0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00,
-- 0xff, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0xc0, 0x06, 0x00, 0x00, 0xc0, 0x38, 0x06, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00,
-- 0x7f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0xc0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
-- 0xff, 0xfc, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0xe0, 0x0e, 0x00, 0x00, 0xe0, 0x7c, 0x0e, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x7f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0xe0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x1e, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00,
-- 0x30, 0x1e, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x60, 0x0c, 0x00, 0x00, 0xe0, 0x7c, 0x0e, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00,
-- 0x00, 0x38, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x0e, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x60, 0x6c, 0x0c, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x01, 0x80, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x60, 0xec, 0x0c, 0x00,
-- 0x0e, 0xe0, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00,
-- 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0x30, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x70, 0xee, 0x1c, 0x00,
-- 0x06, 0xc0, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x30, 0x1e, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x70, 0xc6, 0x1c, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x1c, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x18, 0x30, 0x00, 0x00, 0x30, 0xc6, 0x18, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x18, 0x30, 0x00, 0x00, 0x31, 0xc7, 0x18, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x30, 0xe0, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x31, 0x83, 0x18, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00,
-- 0x30, 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x0c, 0x60, 0x00, 0x00, 0x39, 0x83, 0x38, 0x00,
-- 0x0e, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0x30, 0x38, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x0e, 0xe0, 0x00, 0x00, 0x1b, 0x83, 0xb0, 0x00,
-- 0x0e, 0xe0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x31, 0x80, 0x00,
-- 0x30, 0x38, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00,
-- 0x0e, 0xe0, 0x00, 0x00, 0x1b, 0x01, 0xb0, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0x3f, 0x80, 0x00,
-- 0x30, 0x1c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x1f, 0x01, 0xf0, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1e, 0x1f, 0x00, 0x00,
-- 0x30, 0x1e, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x1f, 0x01, 0xf0, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00,
-- 0x30, 0x0e, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0xff, 0xfc, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00,
-- 0x30, 0x07, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x0e, 0x00, 0xe0, 0x00,
-- 0xe0, 0x0e, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0xff, 0xfc, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x06, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x0f, 0xb0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0xfe, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00,
-- 0x33, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x37, 0xcf, 0x80, 0x00,
-- 0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3f, 0xdf, 0x80, 0x00,
-- 0x37, 0xe0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x38, 0xf0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x3c, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3c, 0xf9, 0xc0, 0x00,
-- 0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x38, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0xc0, 0x00,
-- 0x38, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3e, 0x60, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x33, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x60, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x33, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x70, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x71, 0xe0, 0x00, 0x00,
-- 0x3c, 0x70, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x38, 0xf0, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x1f, 0xf0, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x00, 0x00,
-- 0x33, 0xc0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x0f, 0x30, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x60, 0xc0, 0x00,
-- 0x30, 0x30, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x37, 0xc0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00,
-- 0x37, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0xfe, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0xc0, 0x60, 0x00, 0x00, 0xc0, 0x81, 0x80, 0x00,
-- 0xe0, 0x60, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00,
-- 0x3f, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0xfe, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0xc0, 0x60, 0x00, 0x00, 0xc1, 0xc1, 0x80, 0x00,
-- 0x60, 0xc0, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x3c, 0x70, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0xe0, 0xe0, 0x00, 0x00, 0xe1, 0xc1, 0x80, 0x00,
-- 0x31, 0xc0, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x01, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x60, 0xc0, 0x00, 0x00, 0x63, 0xe3, 0x00, 0x00,
-- 0x3b, 0x80, 0x00, 0x00, 0x30, 0xc0, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x3e, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x71, 0xc0, 0x00, 0x00, 0x63, 0x63, 0x00, 0x00,
-- 0x1f, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x7f, 0x98, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x31, 0x80, 0x00, 0x00, 0x67, 0x63, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x67, 0xf8, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x31, 0x80, 0x00, 0x00, 0x37, 0x76, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x41, 0xf0, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x3b, 0x80, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x30, 0x18, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
-- 0x1b, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00,
-- 0x1f, 0x00, 0x00, 0x00, 0x1d, 0x80, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00,
-- 0x1f, 0x00, 0x00, 0x00, 0x1e, 0x3c, 0x00, 0x00,
-- 0x3b, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x3c, 0x70, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0xe0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0xf0, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00,
-- 0x31, 0x80, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x37, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x3e, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00,
-- 0x60, 0xc0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
-- 0x7f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00,
-- 0x33, 0xc0, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00,
-- 0xe0, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x7f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
-- 0x00, 0x00, 0x00, 0x21, 0x16, 0x16, 0x16, 0x16,
-- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
-- 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
-- 0x16, 0x16, 0x16, 0x16, 0x0a, 0x12, 0x13, 0x10,
-- 0x17, 0x10, 0x15, 0x10, 0x08, 0x09, 0x0a, 0x10,
-- 0x10, 0x1a, 0x13, 0x06, 0x0a, 0x0a, 0x0b, 0x11,
-- 0x08, 0x0a, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08,
-- 0x11, 0x11, 0x11, 0x10, 0x1d, 0x13, 0x13, 0x15,
-- 0x15, 0x13, 0x12, 0x17, 0x15, 0x07, 0x0f, 0x13,
-- 0x10, 0x17, 0x15, 0x17, 0x13, 0x17, 0x15, 0x13,
-- 0x13, 0x15, 0x13, 0x1e, 0x13, 0x13, 0x12, 0x08,
-- 0x08, 0x08, 0x0e, 0x10, 0x0a, 0x10, 0x10, 0x0f,
-- 0x10, 0x10, 0x08, 0x10, 0x10, 0x07, 0x07, 0x0e,
-- 0x07, 0x19, 0x10, 0x10, 0x10, 0x10, 0x0a, 0x0f,
-- 0x08, 0x10, 0x0d, 0x15, 0x0d, 0x0d, 0x0e, 0x0a,
-- 0x08, 0x0a, 0x11, 0x16, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xf8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00,
-- 0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1e, 0x1c, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00,
-- 0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x0c, 0x00, 0x00, 0x03, 0xb8, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00,
-- 0x0e, 0x38, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x07, 0xbc, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xf8, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00,
-- 0x0f, 0xf0, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x0f, 0x1e, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x70, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x70, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x70, 0x00, 0x00, 0x1e, 0x0f, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x78, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00,
-- 0x38, 0x3e, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00,
-- 0x00, 0xfc, 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00,
-- 0x38, 0x1f, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x7f, 0x80, 0x00, 0x00,
-- 0x38, 0x07, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x3f, 0x9c, 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x78, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x78, 0x03, 0xc0, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x1e, 0x00, 0xf8, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x3c, 0x01, 0xe0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x39, 0xc3, 0x80, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0x70, 0x3c, 0x00, 0x00, 0x1f, 0x83, 0xf0, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x1f, 0x07, 0xc0, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x39, 0xe7, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0x78, 0x7c, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0xff, 0x00, 0x00, 0xe0, 0x01, 0xe0, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x7c, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x00,
-- 0x1f, 0x8e, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00,
-- 0x0f, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0x07, 0x1c, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00,
-- 0x0f, 0x80, 0x60, 0x00, 0x03, 0xe0, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00,
-- 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0x07, 0x1c, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xc0, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0x0f, 0x3c, 0x00, 0x00, 0x3d, 0xb8, 0x00, 0x00,
-- 0x38, 0xe0, 0xc0, 0x00, 0x0f, 0x78, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x76, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0x0e, 0x38, 0x00, 0x00, 0x79, 0xbc, 0x00, 0x00,
-- 0x30, 0x61, 0xc0, 0x00, 0x0e, 0x38, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0x0e, 0x38, 0x00, 0x00, 0x71, 0x9c, 0x00, 0x00,
-- 0x30, 0x61, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0xff, 0xfe, 0x00, 0x00, 0x71, 0x80, 0x00, 0x00,
-- 0x30, 0x63, 0x80, 0x00, 0x0e, 0x38, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x73, 0x80, 0x00, 0x00,
-- 0xff, 0xfe, 0x00, 0x00, 0x79, 0x80, 0x00, 0x00,
-- 0x30, 0x63, 0x00, 0x00, 0x0f, 0x78, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0xfe, 0x00, 0x00, 0x7d, 0x80, 0x00, 0x00,
-- 0x30, 0x67, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1e, 0x78, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00,
-- 0x38, 0xe6, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x1f, 0xce, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00,
-- 0x0f, 0x8c, 0x7c, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x70, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00,
-- 0x00, 0x1c, 0xfe, 0x00, 0x3e, 0xe2, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0xf0, 0x00, 0x00, 0x01, 0xbe, 0x00, 0x00,
-- 0x00, 0x19, 0xc7, 0x00, 0x38, 0x73, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0xfe, 0x00, 0x00, 0x01, 0x9e, 0x00, 0x00,
-- 0x00, 0x39, 0x83, 0x00, 0x78, 0x3f, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0xfe, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00,
-- 0x00, 0x31, 0x83, 0x00, 0x70, 0x3f, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0xfe, 0x00, 0x00, 0x71, 0x8e, 0x00, 0x00,
-- 0x00, 0x71, 0x83, 0x00, 0x70, 0x1f, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x71, 0x8e, 0x00, 0x00,
-- 0x00, 0x61, 0x83, 0x00, 0x70, 0x0f, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x79, 0x9e, 0x00, 0x00,
-- 0x00, 0xe1, 0x83, 0x00, 0x78, 0x1f, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x79, 0xe0, 0x00, 0x00, 0x3d, 0xbc, 0x00, 0x00,
-- 0x00, 0xc1, 0xc7, 0x00, 0x3c, 0x7f, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x71, 0xc0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x01, 0xc0, 0xfe, 0x00, 0x1f, 0xfb, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x71, 0xc0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00,
-- 0x01, 0x80, 0x7c, 0x00, 0x0f, 0xe1, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
-- 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00,
-- 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x00, 0x60, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00,
-- 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0xf0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x01, 0xe0, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00,
-- 0x03, 0xe0, 0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00,
-- 0x7c, 0x7c, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x1e, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x0f, 0xe0, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00,
-- 0x70, 0x3c, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x78, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x78, 0x0e, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00,
-- 0x1e, 0xe0, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x03, 0xb8, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x78, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x10, 0xe0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x3c, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00,
-- 0x7b, 0xe0, 0x00, 0x00, 0x73, 0xf0, 0x00, 0x00,
-- 0x00, 0x70, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x00, 0x1e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00,
-- 0x00, 0x78, 0x00, 0x00, 0x0f, 0x38, 0x00, 0x00,
-- 0x7f, 0xf8, 0x00, 0x00, 0x77, 0xf8, 0x00, 0x00,
-- 0x00, 0xf0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00,
-- 0x00, 0x3c, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x03, 0xf0, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00,
-- 0x7f, 0xfc, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
-- 0x00, 0x78, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x1c, 0x38, 0x00, 0x00,
-- 0x78, 0x3c, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00,
-- 0x01, 0xe0, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x3c, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
-- 0x00, 0xf0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
-- 0x00, 0x3c, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00,
-- 0x00, 0x1e, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
-- 0x01, 0xe0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00,
-- 0x00, 0x1e, 0x00, 0x00, 0x78, 0x38, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00,
-- 0x1f, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x0f, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x70, 0x0e, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00,
-- 0x78, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
-- 0x0f, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00,
-- 0x01, 0xf0, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x01, 0xfe, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x00, 0xff, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0x01, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x7c, 0x00, 0x7c, 0x00, 0x3c, 0x00, 0xe0, 0x00,
-- 0x01, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x07, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x07, 0xff, 0xc0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0x03, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x7c, 0x00, 0x7c, 0x00, 0x3c, 0x00, 0xe0, 0x00,
-- 0x07, 0xff, 0x80, 0x00, 0x01, 0xff, 0xff, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xc0, 0x00,
-- 0x3f, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x0f, 0xff, 0xe0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0x07, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x7e, 0x00, 0xfc, 0x00, 0x3e, 0x00, 0xe0, 0x00,
-- 0x0f, 0xff, 0xe0, 0x00, 0x03, 0xf8, 0x3f, 0x80,
-- 0x03, 0xb8, 0x00, 0x00, 0x38, 0x0f, 0x80, 0x00,
-- 0x1f, 0x83, 0xe0, 0x00, 0x38, 0x07, 0xc0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1f, 0x83, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x7e, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0xe0, 0x00,
-- 0x1f, 0x83, 0xf0, 0x00, 0x07, 0xc0, 0x07, 0xc0,
-- 0x07, 0xbc, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x3e, 0x01, 0xe0, 0x00, 0x38, 0x01, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3e, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x7f, 0x01, 0xfc, 0x00, 0x3f, 0x00, 0xe0, 0x00,
-- 0x3e, 0x00, 0xf8, 0x00, 0x07, 0x80, 0x03, 0xe0,
-- 0x07, 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x3c, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x77, 0x01, 0xdc, 0x00, 0x3b, 0x80, 0xe0, 0x00,
-- 0x3c, 0x00, 0x78, 0x00, 0x0f, 0x0f, 0x1d, 0xe0,
-- 0x07, 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x78, 0x00, 0x70, 0x00, 0x38, 0x00, 0xf0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x30, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x77, 0x01, 0xdc, 0x00, 0x3b, 0xc0, 0xe0, 0x00,
-- 0x78, 0x00, 0x3c, 0x00, 0x1e, 0x3f, 0xbc, 0xf0,
-- 0x0f, 0x1e, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00,
-- 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x77, 0x83, 0xdc, 0x00, 0x39, 0xc0, 0xe0, 0x00,
-- 0x78, 0x00, 0x3c, 0x00, 0x1e, 0x7f, 0xfc, 0xf0,
-- 0x0e, 0x0e, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00,
-- 0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x73, 0x83, 0x9c, 0x00, 0x38, 0xe0, 0xe0, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x1c, 0xf9, 0xf8, 0x70,
-- 0x0e, 0x0e, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00,
-- 0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x3b, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x73, 0x83, 0x9c, 0x00, 0x38, 0xe0, 0xe0, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x3c, 0xf0, 0xf8, 0x70,
-- 0x1e, 0x0f, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00,
-- 0x3f, 0xff, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x0f, 0xf8, 0x00, 0x3f, 0xff, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x73, 0xc7, 0x9c, 0x00, 0x38, 0x70, 0xe0, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x39, 0xe0, 0x78, 0x70,
-- 0x1c, 0x07, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x0f, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x71, 0xc7, 0x1c, 0x00, 0x38, 0x38, 0xe0, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x39, 0xe0, 0x78, 0x70,
-- 0x1f, 0xff, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x70, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x0f, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x3e, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x71, 0xc7, 0x1c, 0x00, 0x38, 0x38, 0xe0, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x39, 0xc0, 0x70, 0x70,
-- 0x3f, 0xff, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00,
-- 0x78, 0x00, 0x60, 0x00, 0x38, 0x00, 0xf0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x71, 0xef, 0x1c, 0x00, 0x38, 0x1c, 0xe0, 0x00,
-- 0x78, 0x00, 0x3c, 0x00, 0x39, 0xc0, 0xf0, 0xf0,
-- 0x3f, 0xff, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00,
-- 0x78, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xf0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00,
-- 0x38, 0x3e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0xee, 0x1c, 0x00, 0x38, 0x1e, 0xe0, 0x00,
-- 0x78, 0x00, 0x3c, 0x00, 0x39, 0xc0, 0xf0, 0xe0,
-- 0x38, 0x03, 0x80, 0x00, 0x38, 0x01, 0xc0, 0x00,
-- 0x3c, 0x00, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x38, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00,
-- 0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0xee, 0x1c, 0x00, 0x38, 0x0e, 0xe0, 0x00,
-- 0x3c, 0x00, 0x78, 0x00, 0x39, 0xe1, 0xe1, 0xc0,
-- 0x78, 0x03, 0xc0, 0x00, 0x38, 0x03, 0xc0, 0x00,
-- 0x3e, 0x01, 0xe0, 0x00, 0x38, 0x01, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3e, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00,
-- 0x38, 0x0f, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0xfe, 0x1c, 0x00, 0x38, 0x07, 0xe0, 0x00,
-- 0x1e, 0x00, 0xf8, 0x00, 0x3d, 0xe3, 0xe3, 0xc0,
-- 0x70, 0x01, 0xc0, 0x00, 0x38, 0x07, 0xc0, 0x00,
-- 0x1f, 0x87, 0xe0, 0x00, 0x38, 0x07, 0xc0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1f, 0x81, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x7c, 0xf8, 0x00, 0x00,
-- 0x38, 0x07, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x7c, 0x1c, 0x00, 0x38, 0x07, 0xe0, 0x00,
-- 0x1f, 0x83, 0xf0, 0x00, 0x3c, 0xff, 0xe7, 0x80,
-- 0x70, 0x01, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x0f, 0xff, 0xf0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00,
-- 0x38, 0x07, 0x80, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x7c, 0x1c, 0x00, 0x38, 0x03, 0xe0, 0x00,
-- 0x0f, 0xff, 0xe0, 0x00, 0x1e, 0xfe, 0xff, 0x00,
-- 0xe0, 0x01, 0xe0, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x07, 0xff, 0x80, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x03, 0xff, 0xe0, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00,
-- 0x38, 0x03, 0xc0, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x7c, 0x1c, 0x00, 0x38, 0x01, 0xe0, 0x00,
-- 0x03, 0xff, 0xc0, 0x00, 0x1e, 0x3c, 0x7c, 0x78,
-- 0xe0, 0x00, 0xe0, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x01, 0xfe, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00,
-- 0x3f, 0xff, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0xff, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00,
-- 0x38, 0x01, 0xe0, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x38, 0x1c, 0x00, 0x38, 0x01, 0xe0, 0x00,
-- 0x00, 0xfe, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x01, 0xf0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x0f, 0xe0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x01, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x00,
-- 0xe0, 0x0f, 0x80, 0x38, 0x78, 0x03, 0xc0, 0x00,
-- 0xf0, 0x01, 0xe0, 0x00, 0x7f, 0xff, 0x00, 0x00,
-- 0x3f, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
-- 0xfc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x07, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0xf0, 0x01, 0xe0, 0x00,
-- 0xf0, 0x0f, 0x80, 0x78, 0x3c, 0x07, 0x80, 0x00,
-- 0x70, 0x03, 0xc0, 0x00, 0x7f, 0xff, 0x00, 0x00,
-- 0x3f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
-- 0xfc, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x0f, 0xff, 0xe0, 0x00, 0x3f, 0xff, 0xc0, 0x00,
-- 0x1f, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0xf0, 0x1f, 0xc0, 0x78, 0x1c, 0x07, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x7f, 0xff, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0xc0, 0x00,
-- 0x1f, 0x83, 0xf0, 0x00, 0x38, 0x03, 0xe0, 0x00,
-- 0x3e, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x70, 0x01, 0xc0, 0x00,
-- 0x70, 0x1f, 0xc0, 0x70, 0x1e, 0x0f, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x0f, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00,
-- 0x1e, 0x00, 0xf8, 0x00, 0x38, 0x01, 0xe0, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x78, 0x03, 0xc0, 0x00,
-- 0x70, 0x1d, 0xc0, 0x70, 0x0f, 0x1e, 0x00, 0x00,
-- 0x1e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00,
-- 0x3c, 0x00, 0x78, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x78, 0x1d, 0xc0, 0xf0, 0x07, 0xbc, 0x00, 0x00,
-- 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00,
-- 0x38, 0x00, 0x3c, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x38, 0x07, 0x80, 0x00,
-- 0x78, 0x3d, 0xe0, 0xf0, 0x07, 0xbc, 0x00, 0x00,
-- 0x0f, 0x1e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x01, 0xc0, 0x00,
-- 0x78, 0x00, 0x3c, 0x00, 0x38, 0x01, 0xe0, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x3c, 0x07, 0x80, 0x00,
-- 0x38, 0x38, 0xe0, 0xe0, 0x03, 0xf8, 0x00, 0x00,
-- 0x07, 0x1c, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x38, 0x03, 0xe0, 0x00,
-- 0x1f, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x1c, 0x07, 0x00, 0x00,
-- 0x38, 0x38, 0xe0, 0xe0, 0x01, 0xf0, 0x00, 0x00,
-- 0x07, 0xbc, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x38, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0xc0, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0xc0, 0x00,
-- 0x0f, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x1e, 0x0f, 0x00, 0x00,
-- 0x3c, 0x38, 0xe1, 0xe0, 0x00, 0xe0, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x78, 0x78, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0x80, 0x00,
-- 0x03, 0xfe, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x1e, 0x0f, 0x00, 0x00,
-- 0x3c, 0x78, 0xf1, 0xe0, 0x01, 0xf0, 0x00, 0x00,
-- 0x01, 0xf0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x3f, 0xff, 0x00, 0x00,
-- 0x00, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x0e, 0x0e, 0x00, 0x00,
-- 0x1c, 0x70, 0x71, 0xc0, 0x01, 0xf0, 0x00, 0x00,
-- 0x01, 0xf0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x70, 0x00, 0x1c, 0x00, 0x38, 0x3c, 0x00, 0x00,
-- 0x00, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x0f, 0x1e, 0x00, 0x00,
-- 0x1c, 0x70, 0x71, 0xc0, 0x03, 0xb8, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x3c, 0x00, 0x38, 0x1e, 0x00, 0x00,
-- 0x00, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x07, 0x1c, 0x00, 0x00,
-- 0x1e, 0x70, 0x73, 0xc0, 0x07, 0xbc, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x08, 0x38, 0x00, 0x38, 0x0f, 0x00, 0x00,
-- 0x70, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x38, 0x00, 0xe0, 0x00, 0x07, 0x1c, 0x00, 0x00,
-- 0x1e, 0xf0, 0x7b, 0xc0, 0x0f, 0x1e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x0e, 0x78, 0x00, 0x38, 0x07, 0x80, 0x00,
-- 0x78, 0x03, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x3c, 0x01, 0xe0, 0x00, 0x07, 0xbc, 0x00, 0x00,
-- 0x0e, 0xe0, 0x3b, 0x80, 0x0f, 0x1e, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1e, 0x0f, 0xf0, 0x00, 0x38, 0x03, 0x80, 0x00,
-- 0x78, 0x07, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x3c, 0x01, 0xe0, 0x00, 0x03, 0xb8, 0x00, 0x00,
-- 0x0e, 0xe0, 0x3b, 0x80, 0x1e, 0x0f, 0x00, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1f, 0x83, 0xe0, 0x00, 0x38, 0x03, 0xc0, 0x00,
-- 0x3e, 0x0f, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x1f, 0x07, 0xc0, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x0f, 0xe0, 0x3f, 0x80, 0x3c, 0x07, 0x80, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x0f, 0xff, 0xf0, 0x00, 0x38, 0x01, 0xe0, 0x00,
-- 0x1f, 0xff, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x0f, 0xff, 0x80, 0x00, 0x03, 0xf8, 0x00, 0x00,
-- 0x0f, 0xe0, 0x3f, 0x80, 0x38, 0x03, 0x80, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x03, 0xff, 0xf8, 0x00, 0x38, 0x00, 0xe0, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x07, 0xff, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
-- 0x07, 0xc0, 0x1f, 0x00, 0x78, 0x03, 0xc0, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x01, 0xff, 0x3c, 0x00, 0x38, 0x00, 0xf0, 0x00,
-- 0x07, 0xf8, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
-- 0x03, 0xfe, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
-- 0x07, 0xc0, 0x1f, 0x00, 0xf0, 0x01, 0xe0, 0x00,
-- 0x00, 0xe0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xf0, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
-- 0x0f, 0x9c, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x39, 0xf0, 0xf8, 0x00, 0x39, 0xf0, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3f, 0xfb, 0xfc, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00,
-- 0x3c, 0x78, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3e, 0x3f, 0x1e, 0x00, 0x3e, 0x3c, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x1e, 0x0e, 0x00, 0x3c, 0x1c, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x1e, 0x00, 0x00,
-- 0x78, 0x1c, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3b, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xfc, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00,
-- 0x7f, 0xfe, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3f, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0x9c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3b, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x78, 0x1c, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x39, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x70, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x3c, 0x1e, 0x00, 0x00,
-- 0x78, 0x1c, 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00,
-- 0x78, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x3c, 0x00, 0x00, 0x3c, 0x1c, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x38, 0x3c, 0x00, 0x00,
-- 0x38, 0x1e, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x78, 0x7c, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00,
-- 0x3c, 0x78, 0x00, 0x00, 0x3c, 0x7c, 0x00, 0x00,
-- 0x3e, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0xfc, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xf0, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0x8e, 0x00, 0x00, 0x39, 0xf0, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x0f, 0x9c, 0x00, 0x00,
-- 0x07, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x0f, 0x9c, 0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x0e, 0x00, 0x38, 0x1c, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x78, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x7c, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x39, 0xf0, 0x00, 0x00,
-- 0x0f, 0x9c, 0x00, 0x00, 0x3b, 0xc0, 0x00, 0x00,
-- 0x1f, 0xe0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0xe0, 0x38, 0x00, 0x01,
-- 0xe0, 0x70, 0x3c, 0x00, 0xe0, 0x38, 0x00, 0x00,
-- 0xe0, 0x38, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x3f, 0xf0, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0xf0, 0x78, 0x00, 0x00,
-- 0xe0, 0x70, 0x38, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0xf0, 0x78, 0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x3e, 0x3c, 0x00, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00,
-- 0x78, 0x78, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0xe0, 0xf8, 0x38, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x3c, 0x1c, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x70, 0x38, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0xe0, 0xf8, 0x38, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x70, 0x70, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x7f, 0xe3, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x38, 0x1e, 0x00, 0x00,
-- 0x78, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x70, 0xd8, 0x70, 0x00, 0x1d, 0xc0, 0x00, 0x00,
-- 0x78, 0xf0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x7c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x71, 0xdc, 0x70, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x61, 0xff, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3f, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x71, 0x8c, 0x70, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x38, 0xe0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x40, 0x7c, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1f, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x31, 0x8c, 0x60, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x39, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00,
-- 0x33, 0x8e, 0xe0, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x1d, 0xc0, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x38, 0x0e, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x1d, 0xc0, 0x00, 0x00,
-- 0x3b, 0x06, 0xe0, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x1d, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x3c, 0x1e, 0x00, 0x00,
-- 0x78, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x70, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x0d, 0x80, 0x00, 0x00,
-- 0x1b, 0x06, 0xe0, 0x00, 0x1d, 0xc0, 0x00, 0x00,
-- 0x1f, 0xc0, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x3c, 0x1c, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x78, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x38, 0x3c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x1f, 0x07, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x3e, 0x3c, 0x00, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x3c, 0x7c, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00,
-- 0x1e, 0x07, 0xc0, 0x00, 0x38, 0xe0, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x3f, 0xf8, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1f, 0xf8, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00,
-- 0x1f, 0xfc, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x1e, 0x03, 0xc0, 0x00, 0x70, 0x70, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x40, 0x00, 0x39, 0xe0, 0x00, 0x00,
-- 0x07, 0x9c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x0f, 0xe0, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x0f, 0x9c, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x0e, 0x03, 0x80, 0x00, 0xe0, 0x38, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xff, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27,
-- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a,
-- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a,
-- 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a,
-- 0x0b, 0x15, 0x17, 0x13, 0x1a, 0x13, 0x19, 0x13,
-- 0x09, 0x0b, 0x0c, 0x13, 0x13, 0x1e, 0x17, 0x06,
-- 0x0b, 0x0b, 0x0d, 0x14, 0x09, 0x0b, 0x09, 0x09,
-- 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
-- 0x13, 0x13, 0x09, 0x09, 0x14, 0x14, 0x14, 0x13,
-- 0x23, 0x17, 0x17, 0x19, 0x19, 0x17, 0x15, 0x1a,
-- 0x19, 0x09, 0x11, 0x17, 0x13, 0x1d, 0x19, 0x1a,
-- 0x17, 0x1a, 0x19, 0x17, 0x15, 0x19, 0x17, 0x22,
-- 0x17, 0x15, 0x15, 0x09, 0x09, 0x09, 0x11, 0x13,
-- 0x0b, 0x12, 0x12, 0x11, 0x12, 0x12, 0x0a, 0x12,
-- 0x13, 0x07, 0x07, 0x11, 0x07, 0x1b, 0x13, 0x12,
-- 0x12, 0x12, 0x0b, 0x11, 0x09, 0x13, 0x11, 0x17,
-- 0x10, 0x11, 0x10, 0x0b, 0x09, 0x0b, 0x14, 0x1a,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc,
-- 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f,
-- 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00,
-- 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff,
-- 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc,
-- 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f,
-- 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00,
-- 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff,
-- 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc,
-- 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f,
-- 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00,
-- 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff,
-- 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc,
-- 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f,
-- 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00,
-- 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff,
-- 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3,
-- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3,
-- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3,
-- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00,
-- 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00,
-- 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00,
-- 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07,
-- 0x1c, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00,
-- 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00,
-- 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc,
-- 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f,
-- 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00,
-- 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff,
-- 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x00,
-- 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07,
-- 0x1c, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00,
-- 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x07,
-- 0x1c, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00,
-- 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x07, 0x1c, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00,
-- 0x00, 0x00, 0x01, 0xef, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00,
-- 0x00, 0x00, 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x07, 0x00,
-- 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f,
-- 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0e, 0x00,
-- 0x00, 0x00, 0x03, 0xc7, 0x80, 0x00, 0x00, 0x1f,
-- 0xfe, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00,
-- 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0e, 0x00,
-- 0x00, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x3f,
-- 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00,
-- 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00,
-- 0x00, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x00, 0x78,
-- 0x1f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00,
-- 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00,
-- 0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00, 0x70,
-- 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00,
-- 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00,
-- 0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00,
-- 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x00,
-- 0x00, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00,
-- 0x3f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00,
-- 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0f, 0x80,
-- 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x07,
-- 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00,
-- 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x07, 0xc0,
-- 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f,
-- 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00,
-- 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x01, 0xe0,
-- 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x3f,
-- 0xf7, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00,
-- 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf0,
-- 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x7c,
-- 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x1c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x70,
-- 0x00, 0x00, 0x3c, 0x00, 0x78, 0x00, 0x00, 0x70,
-- 0x07, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00,
-- 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1e, 0x00,
-- 0x3c, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20, 0x70,
-- 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x70,
-- 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00,
-- 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1e, 0x00,
-- 0x3c, 0x00, 0x00, 0x38, 0x07, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf0, 0xf0,
-- 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x70,
-- 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00,
-- 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00,
-- 0x78, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf9, 0xf0,
-- 0x00, 0x00, 0x78, 0x00, 0x3c, 0x00, 0x00, 0x7c,
-- 0x3f, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00,
-- 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0xc1,
-- 0xf8, 0x00, 0x00, 0x3e, 0x1f, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x7f, 0xe0,
-- 0x00, 0x00, 0x70, 0x00, 0x1c, 0x00, 0x00, 0x3f,
-- 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00,
-- 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff,
-- 0xf0, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00,
-- 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04,
-- 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08,
-- 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
-- 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00,
-- 0x04, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x3f, 0xc0,
-- 0x00, 0x00, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0x3f,
-- 0xf7, 0x80, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00,
-- 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff,
-- 0xe0, 0x00, 0x00, 0x1f, 0xfb, 0x80, 0x00, 0x00,
-- 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc,
-- 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f,
-- 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00,
-- 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff,
-- 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1f, 0x80,
-- 0x00, 0x00, 0xe0, 0x00, 0x0e, 0x00, 0x00, 0x0f,
-- 0xe3, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00,
-- 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff,
-- 0x80, 0x00, 0x00, 0x07, 0xe3, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x01,
-- 0xc3, 0x80, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
-- 0x00, 0x07, 0xc0, 0x0e, 0x00, 0x00, 0x00, 0xf8,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x01,
-- 0xc7, 0x80, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00,
-- 0x00, 0x1f, 0xe0, 0x1e, 0x00, 0x00, 0x01, 0xfe,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03,
-- 0xc7, 0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00,
-- 0x00, 0x1c, 0x70, 0x1c, 0x00, 0x00, 0x03, 0xfe,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03,
-- 0xc7, 0x00, 0x00, 0x00, 0x3e, 0xde, 0x00, 0x00,
-- 0x00, 0x3c, 0x78, 0x3c, 0x00, 0x00, 0x07, 0x8f,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x76, 0xe0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03,
-- 0x87, 0x00, 0x00, 0x00, 0x3c, 0xcf, 0x00, 0x00,
-- 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x07, 0x07,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03,
-- 0x87, 0x00, 0x00, 0x00, 0x38, 0xc7, 0x00, 0x00,
-- 0x00, 0x38, 0x38, 0x78, 0x00, 0x00, 0x07, 0x07,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x03,
-- 0x8f, 0x00, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00,
-- 0x00, 0x38, 0x38, 0x70, 0x00, 0x00, 0x07, 0x07,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x00, 0x7f,
-- 0xff, 0xc0, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00,
-- 0x00, 0x38, 0x38, 0xf0, 0x00, 0x00, 0x07, 0x8f,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
-- 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x70, 0xc0, 0x00, 0x00, 0x00, 0x7f,
-- 0xff, 0xc0, 0x00, 0x00, 0x3c, 0xc0, 0x00, 0x00,
-- 0x00, 0x38, 0x38, 0xe0, 0x00, 0x00, 0x03, 0x9e,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
-- 0xff, 0xc0, 0x00, 0x00, 0x1e, 0xc0, 0x00, 0x00,
-- 0x00, 0x3c, 0x79, 0xe0, 0x00, 0x00, 0x03, 0xfc,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
-- 0x0e, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00,
-- 0x00, 0x1c, 0x71, 0xc0, 0x00, 0x00, 0x01, 0xf8,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
-- 0x1e, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00,
-- 0x00, 0x1f, 0xe3, 0xc0, 0x00, 0x00, 0x03, 0xf0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0x1e, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00,
-- 0x00, 0x07, 0xc3, 0x8f, 0x80, 0x00, 0x07, 0xf0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-- 0x00, 0x00, 0x07, 0xbf, 0xc0, 0x00, 0x0f, 0x78,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00,
-- 0x00, 0x00, 0x07, 0x38, 0xe0, 0x00, 0x1e, 0x3c,
-- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
-- 0xff, 0xc0, 0x00, 0x00, 0x00, 0xc7, 0x80, 0x00,
-- 0x00, 0x00, 0x0f, 0x78, 0xf0, 0x00, 0x3c, 0x1e,
-- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
-- 0xff, 0xc0, 0x00, 0x00, 0x00, 0xc3, 0x80, 0x00,
-- 0x00, 0x00, 0x0e, 0x70, 0x70, 0x00, 0x38, 0x1e,
-- 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
-- 0xff, 0xc0, 0x00, 0x00, 0x00, 0xc3, 0x80, 0x00,
-- 0x00, 0x00, 0x1e, 0x70, 0x70, 0x00, 0x38, 0x0f,
-- 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
-- 0x38, 0x00, 0x00, 0x00, 0x70, 0xc3, 0x80, 0x00,
-- 0x00, 0x00, 0x1c, 0x70, 0x70, 0x00, 0x38, 0x07,
-- 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x38, 0x00, 0x00, 0x00, 0x78, 0xc7, 0x80, 0x00,
-- 0x00, 0x00, 0x3c, 0x70, 0x70, 0x00, 0x3c, 0x03,
-- 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x38, 0x00, 0x00, 0x00, 0x78, 0xc7, 0x80, 0x00,
-- 0x00, 0x00, 0x38, 0x70, 0x70, 0x00, 0x3c, 0x07,
-- 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x78, 0x00, 0x00, 0x00, 0x3e, 0xdf, 0x00, 0x00,
-- 0x00, 0x00, 0x70, 0x78, 0xf0, 0x00, 0x1f, 0x1f,
-- 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
-- 0x78, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00,
-- 0x00, 0x00, 0x70, 0x38, 0xe0, 0x00, 0x0f, 0xff,
-- 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
-- 0x70, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
-- 0x00, 0x00, 0xe0, 0x3f, 0xc0, 0x00, 0x07, 0xfe,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x70, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
-- 0x00, 0x00, 0xe0, 0x0f, 0x80, 0x00, 0x03, 0xf8,
-- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x80, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
-- 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x07,
-- 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x01, 0xfc,
-- 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f,
-- 0xfe, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff,
-- 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
-- 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f,
-- 0xff, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
-- 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff,
-- 0x80, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00,
-- 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00,
-- 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00,
-- 0x00, 0x00, 0x3e, 0x0f, 0x80, 0x00, 0x00, 0x3e,
-- 0x1f, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00,
-- 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0f,
-- 0x80, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x1e, 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0x80,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00,
-- 0x00, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x78,
-- 0x07, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
-- 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x03,
-- 0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x3c, 0x03, 0x80,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, 0xf0, 0x00,
-- 0x00, 0x00, 0x70, 0x03, 0xc0, 0x00, 0x00, 0x70,
-- 0x03, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
-- 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x01,
-- 0xc0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x78, 0x03, 0x80,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x03, 0x80, 0x00, 0x00,
-- 0x78, 0x03, 0xc0, 0x00, 0x00, 0x1f, 0x70, 0x00,
-- 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00,
-- 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
-- 0x78, 0x03, 0xc0, 0x00, 0x00, 0x1e, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x03, 0x80, 0x00, 0x00, 0x01, 0xee, 0x00, 0x00,
-- 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0,
-- 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x18, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x00, 0x03, 0xce, 0x00, 0x00,
-- 0x00, 0x3b, 0xf8, 0x00, 0x00, 0x00, 0x78, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x70, 0x01, 0xc0,
-- 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00,
-- 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xf8,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00,
-- 0x1f, 0x00, 0x00, 0x00, 0x03, 0xce, 0x00, 0x00,
-- 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x71, 0xfc,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x1e, 0x0f, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0,
-- 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
-- 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xfe,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01,
-- 0xfe, 0x00, 0x00, 0x00, 0x07, 0x8e, 0x00, 0x00,
-- 0x00, 0x7f, 0xff, 0x00, 0x00, 0x00, 0x77, 0xfe,
-- 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x78, 0x03, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00,
-- 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f,
-- 0x80, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x01,
-- 0xfe, 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x00,
-- 0x00, 0x7c, 0x0f, 0x80, 0x00, 0x00, 0x7f, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x07, 0xfc, 0x00, 0x00, 0x00, 0x78, 0x07, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0xc0, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01,
-- 0xff, 0x80, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00,
-- 0x00, 0x78, 0x03, 0x80, 0x00, 0x00, 0x7e, 0x0f,
-- 0x80, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-- 0xc0, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x7c, 0x03,
-- 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
-- 0x3e, 0x0f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0xc0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x3c, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x78, 0x03,
-- 0xc0, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00,
-- 0x78, 0x03, 0x80, 0x00, 0x00, 0x0f, 0xfd, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0x80, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x78, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01,
-- 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x78, 0x03, 0xc0, 0x00, 0x00, 0x07, 0xf1, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00,
-- 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xfe,
-- 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00,
-- 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01,
-- 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00,
-- 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xf8,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00,
-- 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01,
-- 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00,
-- 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xc0,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x78, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70,
-- 0x01, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00,
-- 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x70, 0x01,
-- 0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00,
-- 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x78,
-- 0x03, 0xc0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x78, 0x03, 0xc0, 0x00, 0x00, 0x38, 0x03,
-- 0xc0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00,
-- 0x78, 0x03, 0xc0, 0x00, 0x00, 0x70, 0x07, 0x80,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x78,
-- 0x07, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x3c, 0x03,
-- 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
-- 0x78, 0x03, 0xc0, 0x00, 0x00, 0x78, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3e,
-- 0x0f, 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x0f,
-- 0x80, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
-- 0x3e, 0x0f, 0x80, 0x00, 0x00, 0x3c, 0x1f, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x1f,
-- 0xff, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff,
-- 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00,
-- 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x0f,
-- 0xfe, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xfe,
-- 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00,
-- 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x03,
-- 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-- 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8,
-- 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00,
-- 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x7c, 0x00,
-- 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
-- 0x7f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00,
-- 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff,
-- 0xe0, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1f, 0x00, 0x07, 0xc0, 0x00, 0x1e, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00,
-- 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x7c, 0x00,
-- 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01,
-- 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00,
-- 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff,
-- 0xe0, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0xf8, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1e, 0x00,
-- 0x1c, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00,
-- 0x00, 0x7f, 0xff, 0xe0, 0x00, 0x00, 0xfe, 0x00,
-- 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03,
-- 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00,
-- 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff,
-- 0xe0, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x01, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0x00,
-- 0x1c, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00,
-- 0x00, 0xfe, 0x07, 0xf0, 0x00, 0x00, 0xfe, 0x00,
-- 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x07,
-- 0xc1, 0xf0, 0x00, 0x00, 0x1c, 0x01, 0xf8, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0xe0, 0xfc, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x03, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0x80,
-- 0x1c, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00,
-- 0x01, 0xf0, 0x00, 0xf8, 0x00, 0x00, 0xee, 0x00,
-- 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x0f,
-- 0x00, 0x78, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x80, 0x1e, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x07, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1f, 0xc0, 0x1f, 0xc0, 0x00, 0x1f, 0x80,
-- 0x1c, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x7c, 0x00, 0x01, 0xef, 0x00,
-- 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1e,
-- 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0e, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x0f, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1d, 0xc0, 0x1d, 0xc0, 0x00, 0x1f, 0xc0,
-- 0x1c, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00,
-- 0x07, 0x80, 0x00, 0x3c, 0x00, 0x01, 0xc7, 0x00,
-- 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c,
-- 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x1e, 0x00, 0x0f, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1d, 0xc0, 0x1d, 0xc0, 0x00, 0x1d, 0xc0,
-- 0x1c, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00,
-- 0x0f, 0x03, 0xe3, 0x9e, 0x00, 0x03, 0xc7, 0x80,
-- 0x00, 0x00, 0x1c, 0x00, 0x70, 0x00, 0x00, 0x1c,
-- 0x00, 0x18, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x06, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1d, 0xe0, 0x1d, 0xc0, 0x00, 0x1c, 0xe0,
-- 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x00,
-- 0x0f, 0x0f, 0xf7, 0x8e, 0x00, 0x03, 0xc7, 0x80,
-- 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x3c,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x7c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0xe0, 0x39, 0xc0, 0x00, 0x1c, 0xf0,
-- 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x00,
-- 0x1e, 0x1f, 0xff, 0x8f, 0x00, 0x03, 0x83, 0x80,
-- 0x00, 0x00, 0x1c, 0x01, 0xe0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0xe0, 0x39, 0xc0, 0x00, 0x1c, 0x70,
-- 0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x1c, 0x3e, 0x3f, 0x0f, 0x00, 0x07, 0x83, 0xc0,
-- 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d,
-- 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0xf0, 0x39, 0xc0, 0x00, 0x1c, 0x78,
-- 0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x1c, 0x3c, 0x1f, 0x07, 0x00, 0x07, 0x01, 0xc0,
-- 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff,
-- 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f,
-- 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0xf0, 0x79, 0xc0, 0x00, 0x1c, 0x3c,
-- 0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x3c, 0x78, 0x0f, 0x07, 0x00, 0x0f, 0x01, 0xe0,
-- 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff,
-- 0x80, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00,
-- 0x1f, 0xff, 0xfc, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f,
-- 0xfc, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x70, 0x71, 0xc0, 0x00, 0x1c, 0x1c,
-- 0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x38, 0x70, 0x0f, 0x07, 0x00, 0x0f, 0x01, 0xe0,
-- 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff,
-- 0x80, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f,
-- 0x9c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x70, 0x71, 0xc0, 0x00, 0x1c, 0x1e,
-- 0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x38, 0xf0, 0x0f, 0x07, 0x00, 0x0f, 0xff, 0xe0,
-- 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x03, 0xff, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1f,
-- 0x1e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x78, 0xf1, 0xc0, 0x00, 0x1c, 0x0f,
-- 0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x38, 0xe0, 0x0e, 0x07, 0x00, 0x1f, 0xff, 0xf0,
-- 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1e,
-- 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x38, 0xe1, 0xc0, 0x00, 0x1c, 0x07,
-- 0x1c, 0x00, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00,
-- 0x38, 0xe0, 0x0e, 0x0f, 0x00, 0x1f, 0xff, 0xf0,
-- 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x3c,
-- 0x00, 0x0c, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x00, 0x07, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x38, 0xe1, 0xc0, 0x00, 0x1c, 0x07,
-- 0x9c, 0x00, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x00,
-- 0x38, 0xe0, 0x1e, 0x0e, 0x00, 0x1c, 0x00, 0x70,
-- 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c,
-- 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x1c, 0x00, 0x07, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x3d, 0xe1, 0xc0, 0x00, 0x1c, 0x03,
-- 0x9c, 0x00, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x00,
-- 0x38, 0xe0, 0x1e, 0x1e, 0x00, 0x3c, 0x00, 0x78,
-- 0x00, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1e,
-- 0x00, 0x1e, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x1e, 0x00, 0x07, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x03, 0xc0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x1d, 0xc1, 0xc0, 0x00, 0x1c, 0x01,
-- 0xdc, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00,
-- 0x38, 0xe0, 0x3c, 0x1c, 0x00, 0x38, 0x00, 0x38,
-- 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e,
-- 0x00, 0x3c, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x70, 0x1c, 0x00, 0x00, 0x00, 0x1c,
-- 0x01, 0xe0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x1d, 0xc1, 0xc0, 0x00, 0x1c, 0x01,
-- 0xfc, 0x00, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x00,
-- 0x3c, 0xf0, 0x7c, 0x3c, 0x00, 0x78, 0x00, 0x3c,
-- 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f,
-- 0x00, 0x7c, 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x80, 0x1f, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x78, 0x3c, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0xf0, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x1f, 0xc1, 0xc0, 0x00, 0x1c, 0x00,
-- 0xfc, 0x00, 0x00, 0x0f, 0x80, 0x7c, 0x00, 0x00,
-- 0x3c, 0x78, 0xfc, 0xf8, 0x00, 0x78, 0x00, 0x3c,
-- 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x07,
-- 0xe1, 0xf8, 0x00, 0x00, 0x1c, 0x01, 0xf8, 0x00,
-- 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0xe0, 0x7f, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0x78, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x70, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1c, 0x1f, 0x81, 0xc0, 0x00, 0x1c, 0x00,
-- 0xfc, 0x00, 0x00, 0x07, 0xe1, 0xf8, 0x00, 0x00,
-- 0x1c, 0x7f, 0xff, 0xf0, 0x00, 0x70, 0x00, 0x1c,
-- 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x03,
-- 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00,
-- 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x78, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00,
-- 0x00, 0x1c, 0x0f, 0x81, 0xc0, 0x00, 0x1c, 0x00,
-- 0x7c, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00,
-- 0x1e, 0x3f, 0xdf, 0xe0, 0x00, 0xf0, 0x00, 0x1e,
-- 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01,
-- 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00,
-- 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x3c, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00,
-- 0x00, 0x1c, 0x0f, 0x81, 0xc0, 0x00, 0x1c, 0x00,
-- 0x3c, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00,
-- 0x0f, 0x1f, 0x0f, 0x87, 0x80, 0xe0, 0x00, 0x0e,
-- 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00,
-- 0x7f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00,
-- 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00,
-- 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
-- 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x1c,
-- 0x00, 0x1e, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00,
-- 0x00, 0x1c, 0x0f, 0x01, 0xc0, 0x00, 0x1c, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00,
-- 0x0f, 0x80, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x07, 0xc0, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xf0, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0xfe, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00,
-- 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x01,
-- 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xe0, 0x00,
-- 0x0e, 0x00, 0x00, 0xe0, 0x03, 0xe0, 0x03, 0x80,
-- 0x3c, 0x00, 0x78, 0x00, 0x00, 0xf0, 0x00, 0x78,
-- 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xc0,
-- 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x03,
-- 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xf0, 0x00,
-- 0x1e, 0x00, 0x00, 0xf0, 0x03, 0xe0, 0x07, 0x80,
-- 0x1e, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x70,
-- 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x03, 0xff, 0xe0,
-- 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x0f,
-- 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0xf0, 0x00,
-- 0x1e, 0x00, 0x00, 0xf0, 0x07, 0xe0, 0x07, 0x80,
-- 0x0e, 0x00, 0xe0, 0x00, 0x00, 0x78, 0x00, 0xf0,
-- 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x07, 0xc1, 0xf0,
-- 0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, 0x0f,
-- 0x83, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x78, 0x00,
-- 0x3c, 0x00, 0x00, 0x70, 0x07, 0xf0, 0x07, 0x00,
-- 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x3c, 0x01, 0xe0,
-- 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f, 0x00, 0x78,
-- 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1e,
-- 0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x78, 0x00,
-- 0x3c, 0x00, 0x00, 0x70, 0x07, 0x70, 0x07, 0x00,
-- 0x07, 0x83, 0xc0, 0x00, 0x00, 0x1c, 0x01, 0xc0,
-- 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e, 0x00, 0x3c,
-- 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c,
-- 0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00,
-- 0x38, 0x00, 0x00, 0x78, 0x07, 0x70, 0x0f, 0x00,
-- 0x03, 0x83, 0x80, 0x00, 0x00, 0x1e, 0x03, 0xc0,
-- 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x78,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x3c,
-- 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c,
-- 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00,
-- 0x78, 0x00, 0x00, 0x78, 0x0f, 0x78, 0x0f, 0x00,
-- 0x03, 0xc7, 0x80, 0x00, 0x00, 0x0f, 0x07, 0x80,
-- 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x1c,
-- 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x3c, 0x00,
-- 0x78, 0x00, 0x00, 0x38, 0x0e, 0x38, 0x0e, 0x00,
-- 0x01, 0xef, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x3c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x38, 0x00, 0x00, 0x3c, 0x00, 0x1e,
-- 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x1e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00,
-- 0x70, 0x00, 0x00, 0x38, 0x0e, 0x38, 0x0e, 0x00,
-- 0x00, 0xfe, 0x00, 0x00, 0x00, 0x07, 0x8f, 0x00,
-- 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x0e,
-- 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x0f,
-- 0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1e, 0x00,
-- 0xf0, 0x00, 0x00, 0x3c, 0x0e, 0x38, 0x1e, 0x00,
-- 0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x1e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x78, 0x00, 0x00, 0x38, 0x00, 0x0e,
-- 0x00, 0x00, 0x1c, 0x00, 0xf8, 0x00, 0x00, 0x0f,
-- 0xf8, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x1e, 0x00,
-- 0xf0, 0x00, 0x00, 0x3c, 0x1e, 0x3c, 0x1e, 0x00,
-- 0x00, 0x7c, 0x00, 0x00, 0x00, 0x03, 0xde, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x0e,
-- 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x07,
-- 0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x01,
-- 0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x1c, 0x1c, 0x00,
-- 0x00, 0x7c, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00,
-- 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x38, 0x00, 0x0e,
-- 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x01,
-- 0xff, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x0f, 0x01,
-- 0xe0, 0x00, 0x00, 0x1c, 0x1c, 0x1c, 0x1c, 0x00,
-- 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00,
-- 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x0e,
-- 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00,
-- 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x01,
-- 0xc0, 0x00, 0x00, 0x1e, 0x3c, 0x1c, 0x3c, 0x00,
-- 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00,
-- 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1f, 0xff, 0x80, 0x00, 0x00, 0x38, 0x00, 0x0e,
-- 0x00, 0x00, 0x1c, 0x0f, 0x00, 0x00, 0x00, 0x00,
-- 0x03, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x83,
-- 0xc0, 0x00, 0x00, 0x1e, 0x3c, 0x1e, 0x3c, 0x00,
-- 0x01, 0xef, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0e,
-- 0x00, 0x00, 0x1c, 0x07, 0x80, 0x00, 0x00, 0x00,
-- 0x00, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x07, 0x83,
-- 0xc0, 0x00, 0x00, 0x0e, 0x38, 0x0e, 0x38, 0x00,
-- 0x01, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x1e,
-- 0x00, 0x00, 0x1c, 0x07, 0xc0, 0x00, 0x00, 0x38,
-- 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xc7,
-- 0x80, 0x00, 0x00, 0x0e, 0x38, 0x0e, 0x38, 0x00,
-- 0x03, 0xc7, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c,
-- 0x00, 0x00, 0x1c, 0x03, 0xe0, 0x00, 0x00, 0x38,
-- 0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xc7,
-- 0x80, 0x00, 0x00, 0x0f, 0x78, 0x0f, 0x78, 0x00,
-- 0x07, 0x83, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0x3c,
-- 0x00, 0x00, 0x1c, 0x01, 0xf0, 0x00, 0x00, 0x3c,
-- 0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xc7,
-- 0x00, 0x00, 0x00, 0x0f, 0x70, 0x07, 0x78, 0x00,
-- 0x0f, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x07, 0xb8,
-- 0x00, 0x00, 0x1c, 0x00, 0xf0, 0x00, 0x00, 0x1c,
-- 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x01, 0xef,
-- 0x00, 0x00, 0x00, 0x07, 0x70, 0x07, 0x70, 0x00,
-- 0x0e, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x07, 0xf8,
-- 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x1e,
-- 0x00, 0xf8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x0f, 0x00, 0x78, 0x00, 0x00, 0x01, 0xef,
-- 0x00, 0x00, 0x00, 0x07, 0xf0, 0x07, 0xf0, 0x00,
-- 0x1e, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc1, 0xf0,
-- 0x00, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x00, 0x0f,
-- 0xc1, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x0f, 0xc1, 0xf8, 0x00, 0x00, 0x00, 0xfe,
-- 0x00, 0x00, 0x00, 0x07, 0xf0, 0x07, 0xf0, 0x00,
-- 0x3c, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8,
-- 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x00, 0x0f,
-- 0xff, 0xe0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xfe,
-- 0x00, 0x00, 0x00, 0x07, 0xe0, 0x03, 0xf0, 0x00,
-- 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfe,
-- 0x00, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x00, 0x03,
-- 0xff, 0xc0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7c,
-- 0x00, 0x00, 0x00, 0x03, 0xe0, 0x03, 0xe0, 0x00,
-- 0x78, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x9f,
-- 0x00, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x00, 0x00,
-- 0xff, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7c,
-- 0x00, 0x00, 0x00, 0x03, 0xe0, 0x03, 0xe0, 0x00,
-- 0xf0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x70, 0x00,
-- 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00,
-- 0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, 0x00, 0x03,
-- 0xf0, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00,
-- 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x80,
-- 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00,
-- 0x38, 0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x39, 0xf0, 0x7e, 0x00, 0x00, 0x39, 0xfc,
-- 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00,
-- 0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f,
-- 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00,
-- 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0xff, 0x80,
-- 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00, 0x00,
-- 0x3b, 0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x1f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x3b, 0xfc, 0xff, 0x00, 0x00, 0x3b, 0xff,
-- 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00,
-- 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f,
-- 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00,
-- 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0xff, 0x80,
-- 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00,
-- 0x3f, 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x3e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x3f, 0xfd, 0xff, 0x80, 0x00, 0x3f, 0xff,
-- 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1f, 0x00,
-- 0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e,
-- 0x1e, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00,
-- 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00,
-- 0x3f, 0x0f, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x3f, 0x1f, 0x8f, 0x80, 0x00, 0x3f, 0x0f,
-- 0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x00, 0x3c,
-- 0x0f, 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00, 0x00,
-- 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x1f, 0x00, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x3c, 0x1f, 0x07, 0x80, 0x00, 0x3c, 0x07,
-- 0x80, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78,
-- 0x07, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00,
-- 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00,
-- 0x3c, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x39,
-- 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x3c, 0x0f, 0x03, 0x80, 0x00, 0x3c, 0x03,
-- 0x80, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
-- 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00,
-- 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3b,
-- 0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00,
-- 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00,
-- 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xc0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00,
-- 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00,
-- 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf7, 0x00,
-- 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00,
-- 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x07, 0x00,
-- 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00,
-- 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c,
-- 0xf0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70,
-- 0x07, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00,
-- 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x0f, 0x00,
-- 0x00, 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78,
-- 0x0f, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00,
-- 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x78, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1f, 0x00,
-- 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x38,
-- 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00,
-- 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x38, 0x0f, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x3c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x3c, 0x0f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x3f, 0x00,
-- 0x00, 0x00, 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e,
-- 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00,
-- 0x00, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x3e, 0x1f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00,
-- 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f,
-- 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00,
-- 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x1e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf7, 0x80,
-- 0x00, 0x00, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f,
-- 0xf8, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00, 0x00,
-- 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe3, 0x80,
-- 0x00, 0x00, 0x39, 0xf8, 0x00, 0x00, 0x00, 0x07,
-- 0xf0, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00,
-- 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38,
-- 0x07, 0x80, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x0e, 0x03, 0x80, 0x00, 0x38, 0x03,
-- 0x80, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x7c, 0x3e, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-- 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
-- 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x39, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xe7, 0x00,
-- 0x00, 0x00, 0x39, 0xe0, 0x00, 0x00, 0x00, 0x0f,
-- 0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0xf0, 0x07,
-- 0x80, 0x00, 0x01, 0xe0, 0x38, 0x0f, 0x00, 0x00,
-- 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00,
-- 0x00, 0x00, 0x3b, 0xe0, 0x00, 0x00, 0x00, 0x1f,
-- 0xf8, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0xf0, 0x07,
-- 0x80, 0x00, 0x00, 0xe0, 0x3c, 0x0e, 0x00, 0x00,
-- 0x78, 0x0f, 0x00, 0x00, 0x00, 0x78, 0x0f, 0x00,
-- 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00,
-- 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x3f,
-- 0xfc, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07,
-- 0x00, 0x00, 0x00, 0xf0, 0x7c, 0x1e, 0x00, 0x00,
-- 0x38, 0x1e, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00,
-- 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00,
-- 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x78,
-- 0x3e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x78, 0x0f,
-- 0x00, 0x00, 0x00, 0xf0, 0x7c, 0x1e, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00,
-- 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
-- 0x40, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x38, 0x1f, 0x00,
-- 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x70,
-- 0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x0e,
-- 0x00, 0x00, 0x00, 0x70, 0x7c, 0x1c, 0x00, 0x00,
-- 0x1e, 0x38, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x00,
-- 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0,
-- 0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00,
-- 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x38, 0x0e,
-- 0x00, 0x00, 0x00, 0x70, 0xec, 0x1c, 0x00, 0x00,
-- 0x0e, 0x78, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00,
-- 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x1e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf1,
-- 0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3c, 0x03, 0x80, 0x00, 0x00, 0x70, 0x0f, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7e,
-- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x3c, 0x1e,
-- 0x00, 0x00, 0x00, 0x78, 0xee, 0x3c, 0x00, 0x00,
-- 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00,
-- 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x3c,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x71, 0xff,
-- 0xc0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xe0, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1c, 0x1c,
-- 0x00, 0x00, 0x00, 0x38, 0xee, 0x38, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x00, 0x1e, 0x1c, 0x00,
-- 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x78,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x60, 0x7f,
-- 0x80, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xfc, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x1e, 0x3c,
-- 0x00, 0x00, 0x00, 0x38, 0xe6, 0x38, 0x00, 0x00,
-- 0x03, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00,
-- 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x70,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x1f,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0xfe, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0e, 0x38,
-- 0x00, 0x00, 0x00, 0x3d, 0xc6, 0x78, 0x00, 0x00,
-- 0x03, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x00,
-- 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x78,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0xff, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0e, 0x38,
-- 0x00, 0x00, 0x00, 0x1d, 0xc7, 0x70, 0x00, 0x00,
-- 0x07, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x00,
-- 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x3c,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x38, 0x03, 0x80, 0x00, 0x00, 0x70, 0x07, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x0f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x0f, 0x78,
-- 0x00, 0x00, 0x00, 0x1d, 0xc7, 0x70, 0x00, 0x00,
-- 0x07, 0xf0, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00,
-- 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x1e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3c, 0x07, 0x80, 0x00, 0x00, 0x78, 0x0f, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x70,
-- 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x07, 0x80, 0x00, 0x00, 0x07, 0x70,
-- 0x00, 0x00, 0x00, 0x1d, 0xc3, 0x70, 0x00, 0x00,
-- 0x0f, 0x70, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00,
-- 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3c, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x0f, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x78,
-- 0x07, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x3c, 0x07, 0x80, 0x00, 0x00, 0x07, 0xf0,
-- 0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00,
-- 0x1e, 0x78, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00,
-- 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x3e, 0x3f, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3c,
-- 0x1f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,
-- 0x00, 0x3e, 0x1f, 0x80, 0x00, 0x00, 0x03, 0xe0,
-- 0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00,
-- 0x3c, 0x3c, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00,
-- 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0xfe, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x03, 0xe0,
-- 0x00, 0x00, 0x00, 0x0f, 0x83, 0xe0, 0x00, 0x00,
-- 0x38, 0x1c, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00,
-- 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf7, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x1f,
-- 0xfc, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-- 0x00, 0x1f, 0xfb, 0x80, 0x00, 0x00, 0x03, 0xe0,
-- 0x00, 0x00, 0x00, 0x0f, 0x03, 0xc0, 0x00, 0x00,
-- 0x78, 0x1e, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00,
-- 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00,
-- 0x39, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xe7, 0x00,
-- 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x07,
-- 0xf0, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
-- 0x00, 0x07, 0xe3, 0x80, 0x00, 0x00, 0x01, 0xc0,
-- 0x00, 0x00, 0x00, 0x07, 0x01, 0xc0, 0x00, 0x00,
-- 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00,
-- 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
-- 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
-- 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-- 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-- 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
-- 0xf0, 0x24, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0c, 0x94,
-- 0xea, 0xff, 0xfd, 0x70, 0xea, 0x00, 0x00, 0x01,
-- 0xe3, 0x5c, 0x00, 0xb7, 0xa5, 0x9f, 0xf0, 0x04,
-- 0xe0, 0x86, 0xc0, 0x0c, 0xe5, 0x9f, 0xf0, 0x00,
-- 0x00, 0x00, 0x0f, 0x74, 0x00, 0x00, 0x0c, 0x98,
-- 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x24, 0x00, 0x09,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff,
-- 0x00, 0x00, 0x0e, 0x4c, 0xea, 0xff, 0xfd, 0x03,
-- 0xea, 0x00, 0x00, 0x07, 0xe5, 0x9f, 0xc0, 0x1c,
-- 0xe5, 0x9c, 0x30, 0x00, 0xe3, 0x83, 0x33, 0x33,
-- 0xe1, 0x52, 0x00, 0x03, 0x05, 0x9f, 0xc0, 0x10,
-- 0x05, 0x9c, 0xc0, 0x00, 0x03, 0x8c, 0x23, 0x33,
-- 0xe5, 0x9f, 0xc0, 0x08, 0xe5, 0x9f, 0xf0, 0x08,
-- 0x66, 0x00, 0x00, 0x60, 0x66, 0x00, 0x00, 0x5c,
-- 0x66, 0x00, 0x00, 0x58, 0x00, 0x00, 0x0e, 0x50,
-- 0x00, 0x00, 0x00, 0x01, 0xf0, 0x24, 0x00, 0x09,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff,
-- 0x00, 0x00, 0x02, 0x6c, 0xa0, 0x00, 0x0b, 0x38,
-- 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x0f, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
-- 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05,
-- 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07,
-- 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x13,
-- 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x18,
-- 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a,
-- 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19,
-- 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18,
-- 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1f,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08,
-- 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18,
-- 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3f, 0xfe, 0xb1, 0x72, 0x17, 0xf7,
-- 0xd1, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xcd,
-- 0xf3, 0x57, 0x93, 0xc0, 0x00, 0x00, 0x00, 0x00,
-- 0x80, 0x00, 0x3f, 0xfe, 0xca, 0x20, 0xad, 0x9a,
-- 0xb5, 0xe9, 0x46, 0xe9, 0x00, 0x00, 0x40, 0x03,
-- 0x83, 0x12, 0x51, 0x00, 0xb5, 0x7f, 0x65, 0x09,
-- 0x80, 0x00, 0x40, 0x05, 0x80, 0x3f, 0xf8, 0x95,
-- 0x9d, 0xac, 0xd2, 0x28, 0x80, 0x00, 0x40, 0x04,
-- 0x8e, 0xac, 0x02, 0x5b, 0x3e, 0x70, 0x76, 0xbb,
-- 0x00, 0x00, 0x40, 0x07, 0x9c, 0x04, 0x1f, 0xd0,
-- 0xa9, 0x33, 0xef, 0x60, 0x80, 0x00, 0x40, 0x08,
-- 0xc0, 0x5f, 0xf4, 0xe0, 0x6c, 0x83, 0xbb, 0x96,
-- 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe,
-- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff,
-- 0xc9, 0x0f, 0xda, 0xa2, 0x21, 0x68, 0xc2, 0x35,
-- 0x00, 0x00, 0x3f, 0xfe, 0xb1, 0x73, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc,
-- 0xff, 0xfe, 0x2f, 0xf1, 0x48, 0x3b, 0x9d, 0x27,
-- 0x00, 0x00, 0x3f, 0xee, 0xe8, 0x08, 0x97, 0x58,
-- 0x10, 0x16, 0xb3, 0x7d, 0x40, 0x40, 0x40, 0x40,
-- 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41,
-- 0x41, 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
-- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
-- 0x40, 0x40, 0x40, 0x40, 0x05, 0x02, 0x02, 0x02,
-- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
-- 0x02, 0x02, 0x02, 0x02, 0x20, 0x20, 0x20, 0x20,
-- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x02, 0x02,
-- 0x02, 0x02, 0x02, 0x02, 0x02, 0x90, 0x90, 0x90,
-- 0x90, 0x90, 0x90, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
-- 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x02,
-- 0x02, 0x02, 0x02, 0x02, 0x02, 0x88, 0x88, 0x88,
-- 0x88, 0x88, 0x88, 0x08, 0x08, 0x08, 0x08, 0x08,
-- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
-- 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x02,
-- 0x02, 0x02, 0x02, 0x40, 0xe5, 0x9f, 0xc0, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x01, 0x79, 0x19,
-- 0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c,
-- 0x2e, 0x00, 0x5c, 0x7b, 0xe5, 0x9f, 0xc0, 0x00,
-- 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5d, 0x05,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x2e, 0x01, 0xc9, 0x08, 0x2e, 0x01, 0xca, 0x20,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xc9, 0x08,
-- 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
-- 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-- 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-- 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-- 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x40,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x2c, 0x00, 0x01, 0x00, 0x43, 0x6f, 0x70, 0x79,
-- 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x46, 0x75,
-- 0x6a, 0x69, 0x74, 0x73, 0x75, 0x20, 0x53, 0x69,
-- 0x65, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x26, 0x20,
-- 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x67, 0x65,
-- 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65,
-- 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6d,
-- 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x57, 0x5e, 0x61, 0xa3,
-- 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x0c,
-- 0x6c, 0x00, 0x00, 0x24, 0x64, 0x00, 0x00, 0x28,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0,
-- 0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00,
-- 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0,
-- 0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4,
-- 0x2e, 0x08, 0x05, 0xc4, 0x2e, 0x08, 0x05, 0xcc,
-- 0x2e, 0x08, 0x05, 0xcc, 0x2e, 0x08, 0x05, 0xd4,
-- 0x2e, 0x08, 0x05, 0xd4, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
-- 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3,
-- 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe,
-- 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
-- 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7,
-- 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff,
-- 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
-- 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3,
-- 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42,
-- 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
-- 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff,
-- 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c,
-- 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
-- 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63,
-- 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7,
-- 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
-- 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e,
-- 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18,
-- 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-- 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b,
-- 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6,
-- 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18,
-- 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe,
-- 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe,
-- 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
-- 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe,
-- 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c,
-- 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
-- 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18,
-- 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c,
-- 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06,
-- 0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
-- 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
-- 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff,
-- 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
-- 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18,
-- 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xd6, 0xd6,
-- 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30,
-- 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06,
-- 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
-- 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06,
-- 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
-- 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06,
-- 0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-- 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
-- 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60,
-- 0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
-- 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06,
-- 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18,
-- 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xde, 0xde,
-- 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe,
-- 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66,
-- 0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
-- 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66,
-- 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
-- 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
-- 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde,
-- 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78,
-- 0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
-- 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce,
-- 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60,
-- 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00,
-- 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
-- 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c,
-- 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7e, 0x7e, 0x5a, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6,
-- 0xd6, 0xfe, 0xee, 0x6c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x7c, 0x38, 0x38,
-- 0x7c, 0x6c, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfe, 0xc6, 0x86, 0x0c, 0x18, 0x30,
-- 0x60, 0xc2, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
-- 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38,
-- 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
-- 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-- 0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66,
-- 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0,
-- 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe,
-- 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x1c, 0x36, 0x32, 0x30, 0x78, 0x30,
-- 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00,
-- 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66,
-- 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
-- 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00,
-- 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78,
-- 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6,
-- 0xd6, 0xd6, 0xd6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
-- 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
-- 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66,
-- 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
-- 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30,
-- 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xd6,
-- 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x6c, 0x38,
-- 0x38, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18,
-- 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18,
-- 0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18,
-- 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
-- 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
-- 0xc0, 0xc2, 0x66, 0x3c, 0x18, 0x70, 0x00, 0x00,
-- 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
-- 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0,
-- 0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x70, 0x00, 0x00,
-- 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
-- 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe,
-- 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe,
-- 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
-- 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x38, 0x6c, 0x38, 0x10, 0x38, 0x6c, 0xc6, 0xfe,
-- 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x0c, 0x18, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78,
-- 0x68, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36,
-- 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
-- 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0,
-- 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60,
-- 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18,
-- 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde,
-- 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18,
-- 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
-- 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66,
-- 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
-- 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde,
-- 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60,
-- 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
-- 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06,
-- 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30,
-- 0x60, 0xdc, 0x86, 0x0c, 0x18, 0x3e, 0x00, 0x00,
-- 0x00, 0x60, 0xe0, 0x62, 0x66, 0x6c, 0x18, 0x30,
-- 0x66, 0xce, 0x9a, 0x3f, 0x06, 0x06, 0x00, 0x00,
-- 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18,
-- 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8,
-- 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
-- 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
-- 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
-- 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
-- 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
-- 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
-- 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
-- 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-- 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
-- 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
-- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
-- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
-- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8,
-- 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc,
-- 0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
-- 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c,
-- 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x18,
-- 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
-- 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66,
-- 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66,
-- 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6,
-- 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c,
-- 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
-- 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb,
-- 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb,
-- 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
-- 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
-- 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe,
-- 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
-- 0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c,
-- 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30,
-- 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
-- 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x7e,
-- 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
-- 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
-- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec,
-- 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x6c, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x3c, 0x66, 0x0c, 0x18, 0x32, 0x7e, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x7e,
-- 0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x67, 0x20,
-- 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10,
-- 0x2e, 0x08, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00,
-- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-- 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,
-- 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20,
-- 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21,
-- 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41,
-- 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38,
-- 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0xb1, 0x0e, 0xa6, 0x06, 0x53,
-- 0x2e, 0x08, 0x17, 0xdc, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13,
-- 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07,
-- 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0f,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a,
-- 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04,
-- 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10,
-- 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13,
-- 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04,
-- 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
-- 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x19,
-- 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x04, 0xf5, 0x11, 0x38, 0x06, 0x53,
-- 0x2e, 0x08, 0x19, 0x0c, 0x2e, 0x08, 0x19, 0x00,
-- 0x2e, 0x08, 0x1a, 0x30, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00,
-- 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
-- 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xda, 0x80,
-- 0x00, 0x5a, 0x51, 0xf0, 0x00, 0x36, 0x91, 0x22,
-- 0x00, 0xf0, 0x29, 0x6e, 0x00, 0x10, 0xd2, 0x92,
-- 0x00, 0xca, 0x6a, 0xde, 0x00, 0xa6, 0xaa, 0x10,
-- 0x00, 0x80, 0x3b, 0x80, 0x00, 0x80, 0xbc, 0x80,
-- 0x00, 0x80, 0x7e, 0x80, 0x00, 0xcf, 0x22, 0x73,
-- 0x00, 0x93, 0x48, 0x5d, 0x00, 0xa2, 0x73, 0x93,
-- 0x00, 0x25, 0xae, 0xad, 0x00, 0xa7, 0x9f, 0x60,
-- 0x00, 0x10, 0x10, 0x10, 0x00, 0x59, 0x10, 0x10,
-- 0x00, 0xa2, 0x10, 0x10, 0x00, 0xeb, 0x10, 0x10,
-- 0x00, 0x10, 0x10, 0x59, 0x00, 0x59, 0x10, 0x59,
-- 0x00, 0xa2, 0x10, 0x59, 0x00, 0xeb, 0x10, 0x59,
-- 0x00, 0x10, 0x10, 0xa2, 0x00, 0x59, 0x10, 0xa2,
-- 0x00, 0xa2, 0x10, 0xa2, 0x00, 0xeb, 0x10, 0xa2,
-- 0x00, 0x10, 0x10, 0xeb, 0x00, 0x59, 0x10, 0xeb,
-- 0x00, 0xa2, 0x10, 0xeb, 0x00, 0xeb, 0x10, 0xeb,
-- 0x00, 0x10, 0x2f, 0x10, 0x00, 0x59, 0x2f, 0x10,
-- 0x00, 0xa2, 0x2f, 0x10, 0x00, 0xeb, 0x2f, 0x10,
-- 0x00, 0x10, 0x2f, 0x59, 0x00, 0x59, 0x2f, 0x59,
-- 0x00, 0xa2, 0x2f, 0x59, 0x00, 0xeb, 0x2f, 0x59,
-- 0x00, 0x10, 0x2f, 0xa2, 0x00, 0x59, 0x2f, 0xa2,
-- 0x00, 0xa2, 0x2f, 0xa2, 0x00, 0xeb, 0x2f, 0xa2,
-- 0x00, 0x10, 0x2f, 0xeb, 0x00, 0x59, 0x2f, 0xeb,
-- 0x00, 0xa2, 0x2f, 0xeb, 0x00, 0xeb, 0x2f, 0xeb,
-- 0x00, 0x10, 0x4e, 0x10, 0x00, 0x59, 0x4e, 0x10,
-- 0x00, 0xa2, 0x4e, 0x10, 0x00, 0xeb, 0x4e, 0x10,
-- 0x00, 0x10, 0x4e, 0x59, 0x00, 0x59, 0x4e, 0x59,
-- 0x00, 0xa2, 0x4e, 0x59, 0x00, 0xeb, 0x4e, 0x59,
-- 0x00, 0x10, 0x4e, 0xa2, 0x00, 0x59, 0x4e, 0xa2,
-- 0x00, 0xa2, 0x4e, 0xa2, 0x00, 0xeb, 0x4e, 0xa2,
-- 0x00, 0x10, 0x4e, 0xeb, 0x00, 0x59, 0x4e, 0xeb,
-- 0x00, 0xa2, 0x4e, 0xeb, 0x00, 0xeb, 0x4e, 0xeb,
-- 0x00, 0x10, 0x6d, 0x10, 0x00, 0x59, 0x6d, 0x10,
-- 0x00, 0xa2, 0x6d, 0x10, 0x00, 0xeb, 0x6d, 0x10,
-- 0x00, 0x10, 0x6d, 0x59, 0x00, 0x59, 0x6d, 0x59,
-- 0x00, 0xa2, 0x6d, 0x59, 0x00, 0xeb, 0x6d, 0x59,
-- 0x00, 0x10, 0x6d, 0xa2, 0x00, 0x59, 0x6d, 0xa2,
-- 0x00, 0xa2, 0x6d, 0xa2, 0x00, 0xeb, 0x6d, 0xa2,
-- 0x00, 0x10, 0x6d, 0xeb, 0x00, 0x59, 0x6d, 0xeb,
-- 0x00, 0xa2, 0x6d, 0xeb, 0x00, 0xeb, 0x6d, 0xeb,
-- 0x00, 0x10, 0x8c, 0x10, 0x00, 0x59, 0x8c, 0x10,
-- 0x00, 0xa2, 0x8c, 0x10, 0x00, 0xeb, 0x8c, 0x10,
-- 0x00, 0x10, 0x8c, 0x59, 0x00, 0x59, 0x8c, 0x59,
-- 0x00, 0xa2, 0x8c, 0x59, 0x00, 0xeb, 0x8c, 0x59,
-- 0x00, 0x10, 0x8c, 0xa2, 0x00, 0x59, 0x8c, 0xa2,
-- 0x00, 0xa2, 0x8c, 0xa2, 0x00, 0xeb, 0x8c, 0xa2,
-- 0x00, 0x10, 0x8c, 0xeb, 0x00, 0x59, 0x8c, 0xeb,
-- 0x00, 0xa2, 0x8c, 0xeb, 0x00, 0xeb, 0x8c, 0xeb,
-- 0x00, 0x10, 0xab, 0x10, 0x00, 0x59, 0xab, 0x10,
-- 0x00, 0xa2, 0xab, 0x10, 0x00, 0xeb, 0xab, 0x10,
-- 0x00, 0x10, 0xab, 0x59, 0x00, 0x59, 0xab, 0x59,
-- 0x00, 0xa2, 0xab, 0x59, 0x00, 0xeb, 0xab, 0x59,
-- 0x00, 0x10, 0xab, 0xa2, 0x00, 0x59, 0xab, 0xa2,
-- 0x00, 0xa2, 0xab, 0xa2, 0x00, 0xeb, 0xab, 0xa2,
-- 0x00, 0x10, 0xab, 0xeb, 0x00, 0x59, 0xab, 0xeb,
-- 0x00, 0xa2, 0xab, 0xeb, 0x00, 0xeb, 0xab, 0xeb,
-- 0x00, 0x10, 0xca, 0x10, 0x00, 0x59, 0xca, 0x10,
-- 0x00, 0xa2, 0xca, 0x10, 0x00, 0xeb, 0xca, 0x10,
-- 0x00, 0x10, 0xca, 0x59, 0x00, 0x59, 0xca, 0x59,
-- 0x00, 0xa2, 0xca, 0x59, 0x00, 0xeb, 0xca, 0x59,
-- 0x00, 0x10, 0xca, 0xa2, 0x00, 0x59, 0xca, 0xa2,
-- 0x00, 0xa2, 0xca, 0xa2, 0x00, 0xeb, 0xca, 0xa2,
-- 0x00, 0x10, 0xca, 0xeb, 0x00, 0x59, 0xca, 0xeb,
-- 0x00, 0xa2, 0xca, 0xeb, 0x00, 0xeb, 0xca, 0xeb,
-- 0x00, 0x10, 0xe9, 0x10, 0x00, 0x59, 0xe9, 0x10,
-- 0x00, 0xa2, 0xe9, 0x10, 0x00, 0xeb, 0xe9, 0x10,
-- 0x00, 0x10, 0xe9, 0x59, 0x00, 0x59, 0xe9, 0x59,
-- 0x00, 0xa2, 0xe9, 0x59, 0x00, 0xeb, 0xe9, 0x59,
-- 0x00, 0x10, 0xe9, 0xa2, 0x00, 0x59, 0xe9, 0xa2,
-- 0x00, 0xa2, 0xe9, 0xa2, 0x00, 0xeb, 0xe9, 0xa2,
-- 0x00, 0x10, 0xe9, 0xeb, 0x00, 0x59, 0xe9, 0xeb,
-- 0x00, 0xa2, 0xe9, 0xeb, 0x00, 0xeb, 0xe9, 0xeb,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0xff, 0xff, 0x24, 0xc0, 0xc1, 0x11, 0x11, 0x10,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0f, 0x6d, 0xbb, 0xeb,
-- 0x8e, 0x01, 0xea, 0x25, 0x04, 0xd0, 0x82, 0x49,
-- 0xed, 0x4c, 0x8f, 0xc2, 0x66, 0x0b, 0x65, 0xc5,
-- 0x0c, 0xc2, 0x41, 0x19, 0x07, 0xa8, 0x94, 0x13,
-- 0x42, 0x09, 0x27, 0xb5, 0x32, 0x3f, 0x09, 0x98,
-- 0x2d, 0x97, 0x14, 0x33, 0x09, 0x04, 0x64, 0x00,
-- 0xff, 0xff, 0x24, 0xc0, 0xe0, 0x11, 0x21, 0x00,
-- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x13, 0x8e, 0xf7, 0xe7,
-- 0x6e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4, 0x05, 0x16,
-- 0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x5e, 0x9c, 0x0c,
-- 0xc3, 0xd2, 0xb4, 0x05, 0x16, 0x3c, 0x8e, 0x82,
-- 0xd4, 0x16, 0x5e, 0x9c, 0x0c, 0xc3, 0xd2, 0xb4,
-- 0x05, 0x16, 0x3c, 0x8e, 0x82, 0xd4, 0x16, 0x50,
-- 0xff, 0xff, 0x24, 0xc0, 0xd4, 0x11, 0x20, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x0d, 0x4d, 0xf8, 0xd5,
-- 0x9e, 0x7f, 0x02, 0x22, 0x08, 0xa3, 0xbd, 0x94,
-- 0x53, 0x16, 0x79, 0xfc, 0x08, 0x88, 0x22, 0x8e,
-- 0xf6, 0x51, 0x4c, 0x59, 0xe7, 0xf0, 0x22, 0x20,
-- 0x8a, 0x3b, 0xd9, 0x45, 0x31, 0x67, 0x9f, 0xc0,
-- 0x88, 0x82, 0x28, 0xef, 0x65, 0x14, 0xc4, 0x00,
-- 0xff, 0xff, 0x24, 0xc0, 0xe8, 0x00, 0x10, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x14, 0x6d, 0xfb, 0x1d,
-- 0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1, 0xd7, 0x7c,
-- 0x13, 0x88, 0x1f, 0xbb, 0x1d, 0x77, 0xc1, 0x38,
-- 0x81, 0xfb, 0xb1, 0xd7, 0x7c, 0x13, 0x88, 0x1f,
-- 0xbb, 0x1d, 0x77, 0xc1, 0x38, 0x81, 0xfb, 0xb1,
-- 0xd7, 0x7c, 0x13, 0x88, 0x1f, 0x80, 0x00, 0x00,
-- 0xff, 0xff, 0x24, 0xc0, 0x9b, 0x00, 0x20, 0x00,
-- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x50, 0x3d, 0x75, 0xf7,
-- 0x14, 0x0a, 0xc3, 0x29, 0x9f, 0x51, 0xbc, 0xfb,
-- 0xdc, 0x7b, 0x8a, 0x05, 0x61, 0x94, 0xcf, 0xa8,
-- 0xde, 0x7d, 0xee, 0x3d, 0xc5, 0x02, 0xb0, 0xca,
-- 0x67, 0xd4, 0x6f, 0x3e, 0xf7, 0x1e, 0xe2, 0x81,
-- 0x58, 0x65, 0x33, 0xea, 0x37, 0x9f, 0x7b, 0x80,
-- 0xff, 0xff, 0x24, 0xc0, 0x12, 0xe0, 0x00, 0x00,
-- 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xeb, 0x50, 0xfb, 0xe7,
-- 0x78, 0x1f, 0xde, 0xa1, 0x62, 0x99, 0x11, 0x36,
-- 0x02, 0x00, 0x97, 0xd6, 0x69, 0x98, 0x1f, 0xde,
-- 0xa1, 0x62, 0x99, 0x11, 0x36, 0x02, 0x00, 0x97,
-- 0xd6, 0x69, 0x98, 0x1f, 0xde, 0xa1, 0x62, 0x99,
-- 0x11, 0x36, 0x02, 0x00, 0x97, 0xd6, 0x69, 0x90,
-- 0xff, 0xff, 0x24, 0xc0, 0x11, 0xba, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xdf, 0x95, 0x03, 0xa1,
-- 0x49, 0xc5, 0x45, 0xe7, 0x96, 0xe6, 0x1d, 0xdc,
-- 0x0d, 0x50, 0xa4, 0xe2, 0xa2, 0xf3, 0xcb, 0x73,
-- 0x0e, 0xee, 0x06, 0xa8, 0x52, 0x71, 0x51, 0x79,
-- 0xe5, 0xb9, 0x87, 0x77, 0x03, 0x54, 0x29, 0x38,
-- 0xa8, 0xbc, 0xf2, 0xdc, 0xc3, 0xbb, 0x81, 0xa0,
-- 0xff, 0xff, 0x24, 0xc0, 0x11, 0x21, 0xc3, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0xe7, 0xae, 0x35, 0x0d,
-- 0x42, 0x14, 0xc2, 0xf9, 0x4a, 0x13, 0x55, 0xa6,
-- 0x6e, 0xf4, 0x88, 0x53, 0x0b, 0xe5, 0x28, 0x4d,
-- 0x56, 0x99, 0xbb, 0xd2, 0x21, 0x4c, 0x2f, 0x94,
-- 0xa1, 0x35, 0x5a, 0x66, 0xef, 0x48, 0x85, 0x30,
-- 0xbe, 0x52, 0x84, 0xd5, 0x69, 0x9b, 0xbd, 0x20,
-- 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x48,
-- 0x2e, 0x08, 0x1f, 0x4c, 0x2e, 0x08, 0x1f, 0x50,
-- 0x2e, 0x08, 0x1f, 0x58, 0x2e, 0x08, 0x1f, 0x5c,
-- 0x2e, 0x08, 0x1f, 0x60, 0x6e, 0x00, 0x01, 0x00,
-- 0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x08,
-- 0x6e, 0x00, 0x01, 0x0c, 0x6e, 0x00, 0x01, 0x04,
-- 0x6e, 0x00, 0x01, 0x10, 0x6e, 0x00, 0x01, 0x14,
-- 0x2e, 0x08, 0x60, 0x58, 0x00, 0x00, 0x00, 0x0d,
-- 0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x18,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x0d, 0x00,
-- 0x2e, 0x08, 0x1f, 0xac, 0x2e, 0x08, 0x1f, 0xb0,
-- 0x2e, 0x08, 0x1f, 0xb4, 0x2e, 0x08, 0x1f, 0xb8,
-- 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x04,
-- 0x70, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x0c,
-- 0x70, 0x00, 0x00, 0x10, 0x70, 0x00, 0x00, 0x30,
-- 0x2e, 0x01, 0xcc, 0x09, 0x2e, 0x01, 0xcb, 0x99,
-- 0x2e, 0x01, 0xcb, 0x11, 0x2e, 0x01, 0xcb, 0x09,
-- 0x2e, 0x01, 0xcc, 0x41, 0x2e, 0x01, 0xcb, 0xd1,
-- 0x2e, 0x01, 0xcc, 0x85, 0x2e, 0x01, 0xcc, 0x7d,
-- 0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80,
-- 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
-- 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
-- 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00,
-- 0xfe, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
-- 0xff, 0x80, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00,
-- 0xff, 0xe0, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00,
-- 0xff, 0xf8, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00,
-- 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
-- 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xc0, 0x00,
-- 0xff, 0xff, 0xe0, 0x00, 0xff, 0xff, 0xf0, 0x00,
-- 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xfc, 0x00,
-- 0xff, 0xff, 0xfe, 0x00, 0xff, 0xff, 0xff, 0x00,
-- 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xc0,
-- 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xf0,
-- 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfc,
-- 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
-- 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x7f, 0xef, 0xff, 0xff,
-- 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-- 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
-- 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0,
--};
--
---- linux-2.6.0/drivers/media/dvb/ttpci/av7110.h 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/media/dvb/ttpci/av7110.h 2003-12-28 23:22:39.000000000 -0800
-@@ -1,8 +1,6 @@
- #ifndef _AV7110_H_
- #define _AV7110_H_
-
--#define DVB_FIRM_PATH "/lib/DVB/"
--
- #include <linux/interrupt.h>
- #include <linux/socket.h>
- #include <linux/netdevice.h>
-@@ -169,7 +167,8 @@ enum av7110_pid_command {
- DelPIDFilter,
- Scan,
- SetDescr,
-- SetIR
-+ SetIR,
-+ FlushTSQueue
- };
-
- enum av7110_mpeg_command {
-@@ -544,6 +543,18 @@ struct av7110 {
- int dsp_dev;
-
- u32 ir_config;
-+
-+ /* firmware stuff */
-+ unsigned int device_initialized;
-+
-+ unsigned char *bin_fw;
-+ unsigned long size_fw;
-+
-+ unsigned char *bin_dpram;
-+ unsigned long size_dpram;
-+
-+ unsigned char *bin_root;
-+ unsigned long size_root;
- };
-
-
---- linux-2.6.0/drivers/media/dvb/ttpci/budget-ci.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/media/dvb/ttpci/budget-ci.c 2003-12-28 23:22:40.000000000 -0800
-@@ -41,75 +41,14 @@ struct budget_ci {
- struct tasklet_struct msp430_irq_tasklet;
- };
-
--
--
--#ifndef BORROWED_FROM_AV7110_H_BUT_REALLY_BELONGS_IN_SAA7146_DEFS_H
--
--#define DEBINOSWAP 0x000e0000
--#define GPIO_IRQHI 0x10
--#define GPIO_INPUT 0x00
--
--void gpio_set(struct saa7146_dev* saa, u8 pin, u8 data)
--{
-- u32 value = 0;
--
-- /* sanity check */
-- if(pin > 3)
-- return;
--
-- /* read old register contents */
-- value = saa7146_read(saa, GPIO_CTRL );
--
-- value &= ~(0xff << (8*pin));
-- value |= (data << (8*pin));
--
-- saa7146_write(saa, GPIO_CTRL, value);
--}
--
--
--
--static int wait_for_debi_done(struct saa7146_dev *saa)
--{
-- int start = jiffies;
--
-- /* wait for registers to be programmed */
-- while (1) {
-- if (saa7146_read(saa, MC2) & 2)
-- break;
-- if (jiffies - start > HZ / 20) {
-- printk ("DVB (%s): timed out while waiting"
-- " for registers getting programmed\n",
-- __FUNCTION__);
-- return -ETIMEDOUT;
-- }
-- }
--
-- /* wait for transfer to complete */
-- start = jiffies;
-- while (1) {
-- if (!(saa7146_read(saa, PSR) & SPCI_DEBI_S))
-- break;
-- saa7146_read(saa, MC2);
-- if (jiffies - start > HZ / 4) {
-- printk ("DVB (%s): timed out while waiting"
-- " for transfer completion\n",
-- __FUNCTION__);
-- return -ETIMEDOUT;
-- }
-- }
--
-- return 0;
--}
--
--
--static u32 debiread (struct saa7146_dev *saa, u32 config, int addr, int count)
-+static u32 budget_debiread4 (struct saa7146_dev *saa, u32 config, int addr, int count)
- {
- u32 result = 0;
-
- if (count > 4 || count <= 0)
- return 0;
-
-- if (wait_for_debi_done(saa) < 0)
-+ if (saa7146_wait_for_debi_done(saa) < 0)
- return 0;
-
- saa7146_write (saa, DEBI_COMMAND,
-@@ -118,7 +57,7 @@ static u32 debiread (struct saa7146_dev
- saa7146_write(saa, DEBI_CONFIG, config);
- saa7146_write(saa, MC2, (2 << 16) | 2);
-
-- wait_for_debi_done(saa);
-+ saa7146_wait_for_debi_done(saa);
-
- result = saa7146_read(saa, DEBI_AD);
- result &= (0xffffffffUL >> ((4 - count) * 8));
-@@ -126,20 +65,6 @@ static u32 debiread (struct saa7146_dev
- return result;
- }
-
--
--
--/* DEBI during interrupt */
--static inline u32 irdebi(struct saa7146_dev *saa, u32 config, int addr, u32 val, int count)
--{
-- u32 res;
-- res = debiread(saa, config, addr, count);
-- return res;
--}
--#endif
--
--
--
--
- /* from reading the following remotes:
- Zenith Universal 7 / TV Mode 807 / VCR Mode 837
- Hauppauge (from NOVA-CI-s box product)
-@@ -150,7 +75,7 @@ static u16 key_map[64] = {
- KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8,
- KEY_9,
- KEY_ENTER,
-- 0,
-+ KEY_RED,
- KEY_POWER, /* RADIO on Hauppauge */
- KEY_MUTE,
- 0,
-@@ -162,11 +87,11 @@ static u16 key_map[64] = {
- 0, 0, 0, 0, 0, 0, 0,
- KEY_UP, KEY_DOWN,
- KEY_OPTION, /* RESERVED on Hauppauge */
-- 0,
-+ KEY_BREAK,
- /* 0x2X */
- KEY_CHANNELUP, KEY_CHANNELDOWN,
- KEY_PREVIOUS, /* Prev. Ch on Zenith, SOURCE on Hauppauge */
-- 0, 0, 0,
-+ 0, KEY_RESTART, KEY_OK,
- KEY_CYCLEWINDOWS, /* MINIMIZE on Hauppauge */
- 0,
- KEY_ENTER, /* VCR mode on Zenith */
-@@ -177,7 +102,7 @@ static u16 key_map[64] = {
- KEY_MENU, /* FULL SCREEN on Hauppauge */
- 0,
- /* 0x3X */
-- 0,
-+ KEY_SLOW,
- KEY_PREVIOUS, /* VCR mode on Zenith */
- KEY_REWIND,
- 0,
-@@ -189,7 +114,7 @@ static u16 key_map[64] = {
- KEY_C,
- 0,
- KEY_EXIT,
-- 0,
-+ KEY_POWER2,
- KEY_TUNER, /* VCR mode on Zenith */
- 0,
- };
-@@ -217,7 +142,7 @@ static void msp430_ir_interrupt (unsigne
- struct budget_ci *budget_ci = (struct budget_ci*) data;
- struct saa7146_dev *saa = budget_ci->budget.dev;
- struct input_dev *dev = &budget_ci->input_dev;
-- unsigned int code = irdebi(saa, DEBINOSWAP, 0x1234, 0, 2) >> 8;
-+ unsigned int code = budget_debiread4(saa, DEBINOSWAP, 0x1234, 2) >> 8;
-
- if (code & 0x40) {
- code &= 0x3f;
-@@ -271,7 +196,7 @@ static int msp430_ir_init (struct budget
-
- saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_06);
-
-- gpio_set(saa, 3, GPIO_IRQHI);
-+ saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI);
-
- return 0;
- }
-@@ -283,8 +208,8 @@ static void msp430_ir_deinit (struct bud
- struct input_dev *dev = &budget_ci->input_dev;
-
- saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_06);
-- gpio_set(saa, 3, GPIO_INPUT);
-- gpio_set(saa, 2, GPIO_INPUT);
-+ saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
-+ saa7146_setgpio(saa, 2, SAA7146_GPIO_INPUT);
-
- if (del_timer(&dev->timer))
- input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
---- linux-2.6.0/drivers/media/dvb/ttpci/budget.h 2003-07-02 14:53:14.000000000 -0700
-+++ 25/drivers/media/dvb/ttpci/budget.h 2003-12-28 23:22:39.000000000 -0800
-@@ -64,8 +64,8 @@ static struct saa7146_pci_extension_data
- .ext_priv = &x_var ## _info, \
- .ext = &budget_extension };
-
--#define TS_WIDTH (4*188)
--#define TS_HEIGHT (1024/4)
-+#define TS_WIDTH (376)
-+#define TS_HEIGHT (512)
- #define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
- #define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
-
---- linux-2.6.0/drivers/media/dvb/ttpci/ttpci-eeprom.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/media/dvb/ttpci/ttpci-eeprom.c 2003-12-28 23:22:39.000000000 -0800
-@@ -142,3 +142,9 @@ int ttpci_eeprom_parse_mac(struct dvb_i2
- }
-
- EXPORT_SYMBOL(ttpci_eeprom_parse_mac);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
-+MODULE_DESCRIPTION("Decode dvb_net MAC address from EEPROM of PCI DVB cards "
-+ "made by Siemens, Technotrend, Hauppauge");
-+
---- linux-2.6.0/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c 2003-12-28 23:22:40.000000000 -0800
-@@ -742,11 +742,7 @@ static void ttusb_process_frame(struct t
- }
- }
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
--static void ttusb_iso_irq(struct urb *urb)
--#else
- static void ttusb_iso_irq(struct urb *urb, struct pt_regs *ptregs)
--#endif
- {
- struct ttusb *ttusb = urb->context;
-
-@@ -787,9 +783,7 @@ static void ttusb_iso_irq(struct urb *ur
- ttusb_process_frame(ttusb, data, len);
- }
- }
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- usb_submit_urb(urb, GFP_ATOMIC);
--#endif
- }
-
- static void ttusb_free_iso_urbs(struct ttusb *ttusb)
-@@ -879,13 +873,6 @@ static int ttusb_start_iso_xfer(struct t
- }
- }
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-- for (i = 0; i < ISO_BUF_COUNT; i++) {
-- int next = (i + 1) % ISO_BUF_COUNT;
-- ttusb->iso_urb[i]->next = ttusb->iso_urb[next];
-- }
--#endif
--
- for (i = 0; i < ISO_BUF_COUNT; i++) {
- if ((err = usb_submit_urb(ttusb->iso_urb[i], GFP_KERNEL))) {
- ttusb_stop_iso_xfer(ttusb);
-@@ -1076,22 +1063,6 @@ static struct file_operations stc_fops =
- };
- #endif
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
--static void *ttusb_probe(struct usb_device *udev, unsigned int ifnum,
-- const struct usb_device_id *id)
--{
-- struct ttusb *ttusb;
-- int result, channel;
--
-- if (ifnum != 0)
-- return NULL;
--
-- dprintk("%s: TTUSB DVB connected\n", __FUNCTION__);
--
-- if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
-- return NULL;
--
--#else
- static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
- {
- struct usb_device *udev;
-@@ -1105,8 +1076,6 @@ static int ttusb_probe(struct usb_interf
- if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
- return -ENOMEM;
-
--#endif
--
- memset(ttusb, 0, sizeof(struct ttusb));
-
- for (channel = 0; channel < TTUSB_MAXCHANNEL; ++channel) {
-@@ -1180,35 +1149,22 @@ static int ttusb_probe(struct usb_interf
- S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
- | S_IROTH | S_IWOTH, &stc_fops, ttusb);
- #endif
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-- return (void *) ttusb;
--#else
-+
- usb_set_intfdata(intf, (void *) ttusb);
-
- return 0;
--#endif
- }
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
--static void ttusb_disconnect(struct usb_device *udev, void *data)
--{
-- struct ttusb *ttusb = data;
--#else
- static void ttusb_disconnect(struct usb_interface *intf)
- {
- struct ttusb *ttusb = usb_get_intfdata(intf);
-
- usb_set_intfdata(intf, NULL);
--#endif
-
- ttusb->disconnecting = 1;
-
- ttusb_stop_iso_xfer(ttusb);
-
--#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69))
--#undef devfs_remove
--#define devfs_remove(x) devfs_unregister(ttusb->stc_devfs_handle);
--#endif
- #if 0
- devfs_remove(TTUSB_BUDGET_NAME);
- #endif
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.mod.c 2003-12-28 23:22:40.000000000 -0800
-@@ -0,0 +1,51 @@
-+#include <linux/module.h>
-+#include <linux/vermagic.h>
-+#include <linux/compiler.h>
-+
-+MODULE_INFO(vermagic, VERMAGIC_STRING);
-+
-+static const struct modversion_info ____versions[]
-+__attribute__((section("__versions"))) = {
-+ { 0x98a034c6, "struct_module" },
-+ { 0x1b636da2, "usb_deregister" },
-+ { 0x9c655b4f, "usb_register" },
-+ { 0x37a0cba, "kfree" },
-+ { 0xc490b263, "dvb_unregister_adapter" },
-+ { 0xf0ca7c9b, "dvb_unregister_i2c_bus" },
-+ { 0x213a4973, "dvb_dmxdev_release" },
-+ { 0x12014018, "dvb_net_release" },
-+ { 0x616af636, "dvb_net_init" },
-+ { 0x6a8b7cf7, "dvb_dmx_release" },
-+ { 0x107a341d, "dvb_dmxdev_init" },
-+ { 0x8fa22872, "dvb_dmx_init" },
-+ { 0x5117ed38, "dvb_add_frontend_ioctls" },
-+ { 0xfc17c7e7, "dvb_register_i2c_bus" },
-+ { 0x3ad6f025, "dvb_register_adapter" },
-+ { 0x7ac96080, "kmem_cache_alloc" },
-+ { 0xa73704a, "malloc_sizes" },
-+ { 0xdfcbe89f, "usb_set_interface" },
-+ { 0x4f0eac15, "usb_reset_configuration" },
-+ { 0x1b49153f, "usb_unlink_urb" },
-+ { 0xf136026d, "usb_alloc_urb" },
-+ { 0xe6f8a15d, "dma_alloc_coherent" },
-+ { 0xe8d874ea, "dma_free_coherent" },
-+ { 0x8ee31378, "usb_free_urb" },
-+ { 0x53e02b2e, "usb_submit_urb" },
-+ { 0xda02d67, "jiffies" },
-+ { 0x4f7c0ba8, "dvb_dmx_swfilter_packets" },
-+ { 0x9d669763, "memcpy" },
-+ { 0xd22b546, "__up_wakeup" },
-+ { 0x1b7d4074, "printk" },
-+ { 0x85eee601, "usb_bulk_msg" },
-+ { 0x28c3bbf5, "__down_failed_interruptible" },
-+ { 0xd533bec7, "__might_sleep" },
-+};
-+
-+static const char __module_depends[]
-+__attribute_used__
-+__attribute__((section(".modinfo"))) =
-+"depends=usbcore,dvb-core";
-+
-+MODULE_ALIAS("usb:v0B48p1003dl*dh*dc*dsc*dp*ic*isc*ip*");
-+MODULE_ALIAS("usb:v0B48p1004dl*dh*dc*dsc*dp*ic*isc*ip*");
-+MODULE_ALIAS("usb:v0B48p1005dl*dh*dc*dsc*dp*ic*isc*ip*");
---- linux-2.6.0/drivers/media/dvb/ttusb-dec/Kconfig 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/media/dvb/ttusb-dec/Kconfig 2003-12-28 23:22:40.000000000 -0800
-@@ -1,24 +1,26 @@
- config DVB_TTUSB_DEC
-- tristate "Technotrend/Hauppauge USB DEC2000-T devices"
-- depends on DVB_CORE && USB && !STANDALONE
-+ tristate "Technotrend/Hauppauge USB DEC devices"
-+ depends on DVB_CORE && USB && FW_LOADER
- help
- Support for external USB adapters designed by Technotrend and
-- produced by Hauppauge, shipped under the brand name 'DEC2000-T'.
-+ produced by Hauppauge, shipped under the brand name 'DEC2000-t'
-+ and 'DEC3000-s'.
-
- Even if these devices have a MPEG decoder built in, they transmit
- only compressed MPEG data over the USB bus, so you need
- an external software decoder to watch TV on your computer.
-
-- Say Y if you own such a device and want to use it.
-+ The DEC devices require firmware in order to boot into a mode in
-+ which they are slaves to the PC. See
-+ linux/Documentation/dvb/FIRMWARE for details.
-+
-+ The firmware can be obtained and put into the default
-+ locations as follows:
-
--config DVB_TTUSB_DEC_FIRMWARE_FILE
-- string "Full pathname of dec2000t.bin firmware file"
-- depends on DVB_TTUSB_DEC
-- default "/etc/dvb/dec2000t.bin"
-- help
-- The DEC2000-T requires a firmware in order to boot into a mode in
-- which it is a slave to the PC. The firmware file can obtained as
-- follows:
- wget http://hauppauge.lightpath.net/de/dec215a.exe
- unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_T.bin
-- mv STB_PC_T.bin /etc/dvb/dec2000t.bin
-+ mv STB_PC_T.bin /usr/lib/hotplug/firmware/dec2000t.bin
-+ unzip -j dec215a.exe Software/Oem/STB/App/Boot/STB_PC_S.bin
-+ mv STB_PC_S.bin /usr/lib/hotplug/firmware/dec3000s.bin
-+
-+ Say Y if you own such a device and want to use it.
---- linux-2.6.0/drivers/media/dvb/ttusb-dec/Makefile 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/media/dvb/ttusb-dec/Makefile 2003-12-28 23:22:40.000000000 -0800
-@@ -1,11 +1,3 @@
--
--obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o dec2000_frontend.o
-+obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o
-
- EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
--
--host-progs := fdump
--
--$(obj)/ttusb_dec.o: $(obj)/dsp_dec2000.h
--
--$(obj)/dsp_dec2000.h: $(patsubst "%", %, $(CONFIG_DVB_TTUSB_DEC_FIRMWARE_FILE)) $(obj)/fdump
-- $(obj)/fdump $< dsp_dec2000 > $@
---- linux-2.6.0/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2003-12-28 23:22:40.000000000 -0800
-@@ -19,19 +19,135 @@
- *
- */
-
--#include <linux/version.h>
-+#include <asm/semaphore.h>
-+#include <linux/list.h>
- #include <linux/module.h>
- #include <linux/pci.h>
- #include <linux/slab.h>
-+#include <linux/spinlock.h>
- #include <linux/usb.h>
-+#include <linux/version.h>
-+#include <linux/interrupt.h>
-+#include <linux/firmware.h>
-
--#include "ttusb_dec.h"
-+#include "dmxdev.h"
-+#include "dvb_demux.h"
-+#include "dvb_i2c.h"
-+#include "dvb_filter.h"
- #include "dvb_frontend.h"
-+#include "dvb_net.h"
-
- static int debug = 0;
-
- #define dprintk if (debug) printk
-
-+#define DRIVER_NAME "TechnoTrend/Hauppauge DEC USB"
-+
-+#define COMMAND_PIPE 0x03
-+#define RESULT_PIPE 0x84
-+#define STREAM_PIPE 0x88
-+
-+#define COMMAND_PACKET_SIZE 0x3c
-+#define ARM_PACKET_SIZE 0x1000
-+
-+#define ISO_BUF_COUNT 0x04
-+#define FRAMES_PER_ISO_BUF 0x04
-+#define ISO_FRAME_SIZE 0x0380
-+
-+#define MAX_AV_PES_LENGTH 6144
-+
-+#define LOF_HI 10600000
-+#define LOF_LO 9750000
-+
-+enum ttusb_model {
-+ TTUSB_DEC2000T,
-+ TTUSB_DEC3000S
-+};
-+
-+struct ttusb_dec {
-+ enum ttusb_model model;
-+ char *model_name;
-+ char *firmware_name;
-+
-+ /* DVB bits */
-+ struct dvb_adapter *adapter;
-+ struct dmxdev dmxdev;
-+ struct dvb_demux demux;
-+ struct dmx_frontend frontend;
-+ struct dvb_i2c_bus i2c_bus;
-+ struct dvb_net dvb_net;
-+ struct dvb_frontend_info *frontend_info;
-+ int (*frontend_ioctl) (struct dvb_frontend *, unsigned int, void *);
-+
-+ u16 pid[DMX_PES_OTHER];
-+ int hi_band;
-+
-+ /* USB bits */
-+ struct usb_device *udev;
-+ u8 trans_count;
-+ unsigned int command_pipe;
-+ unsigned int result_pipe;
-+ unsigned int stream_pipe;
-+ int interface;
-+ struct semaphore usb_sem;
-+
-+ void *iso_buffer;
-+ dma_addr_t iso_dma_handle;
-+ struct urb *iso_urb[ISO_BUF_COUNT];
-+ int iso_stream_count;
-+ struct semaphore iso_sem;
-+
-+ u8 av_pes[MAX_AV_PES_LENGTH + 4];
-+ int av_pes_state;
-+ int av_pes_length;
-+ int av_pes_payload_length;
-+
-+ struct dvb_filter_pes2ts a_pes2ts;
-+ struct dvb_filter_pes2ts v_pes2ts;
-+
-+ u8 v_pes[16 + MAX_AV_PES_LENGTH];
-+ int v_pes_length;
-+ int v_pes_postbytes;
-+
-+ struct list_head urb_frame_list;
-+ struct tasklet_struct urb_tasklet;
-+ spinlock_t urb_frame_list_lock;
-+
-+ int active; /* Loaded successfully */
-+};
-+
-+struct urb_frame {
-+ u8 data[ISO_FRAME_SIZE];
-+ int length;
-+ struct list_head urb_frame_list;
-+};
-+
-+static struct dvb_frontend_info dec2000t_frontend_info = {
-+ .name = "TechnoTrend/Hauppauge DEC2000-t Frontend",
-+ .type = FE_OFDM,
-+ .frequency_min = 51000000,
-+ .frequency_max = 858000000,
-+ .frequency_stepsize = 62500,
-+ .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-+ FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
-+ FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-+ FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
-+ FE_CAN_HIERARCHY_AUTO,
-+};
-+
-+static struct dvb_frontend_info dec3000s_frontend_info = {
-+ .name = "TechnoTrend/Hauppauge DEC3000-s Frontend",
-+ .type = FE_QPSK,
-+ .frequency_min = 950000,
-+ .frequency_max = 2150000,
-+ .frequency_stepsize = 125,
-+ .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
-+ FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
-+ FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-+ FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
-+ FE_CAN_HIERARCHY_AUTO,
-+};
-+
- static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,
- int param_length, const u8 params[],
- int *result_length, u8 cmd_result[])
-@@ -129,22 +245,8 @@ static void ttusb_dec_set_pids(struct tt
- ttusb_dec_av_pes2ts_cb, dec->demux.feed);
- dvb_filter_pes2ts_init(&dec->v_pes2ts, dec->pid[DMX_PES_VIDEO],
- ttusb_dec_av_pes2ts_cb, dec->demux.feed);
--}
--
--static int ttusb_dec_i2c_master_xfer(struct dvb_i2c_bus *i2c,
-- const struct i2c_msg msgs[], int num)
--{
-- int result, i;
--
-- dprintk("%s\n", __FUNCTION__);
--
-- for (i = 0; i < num; i++)
-- if ((result = ttusb_dec_send_command(i2c->data, msgs[i].addr,
-- msgs[i].len, msgs[i].buf,
-- NULL, NULL)))
-- return result;
--
-- return 0;
-+ dec->v_pes_length = 0;
-+ dec->v_pes_postbytes = 0;
- }
-
- static void ttusb_dec_process_av_pes(struct ttusb_dec * dec, u8 * av_pes,
-@@ -194,7 +296,8 @@ static void ttusb_dec_process_av_pes(str
- &av_pes[12], prebytes);
-
- dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
-- dec->v_pes_length + prebytes);
-+ dec->v_pes_length + prebytes,
-+ 1);
- }
-
- if (av_pes[5] & 0x10) {
-@@ -239,13 +342,14 @@ static void ttusb_dec_process_av_pes(str
-
- if (postbytes == 0)
- dvb_filter_pes2ts(&dec->v_pes2ts, dec->v_pes,
-- dec->v_pes_length);
-+ dec->v_pes_length, 1);
-
- break;
- }
-
- case 0x02: /* MainAudioStream */
-- dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 12);
-+ dvb_filter_pes2ts(&dec->a_pes2ts, &av_pes[8], length - 12,
-+ av_pes[5] & 0x10);
- break;
-
- default:
-@@ -367,11 +471,7 @@ static void ttusb_dec_process_urb_frame_
- }
- }
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
--static void ttusb_dec_process_urb(struct urb *urb)
--#else
- static void ttusb_dec_process_urb(struct urb *urb, struct pt_regs *ptregs)
--#endif
- {
- struct ttusb_dec *dec = urb->context;
-
-@@ -380,6 +480,7 @@ static void ttusb_dec_process_urb(struct
-
- for (i = 0; i < FRAMES_PER_ISO_BUF; i++) {
- struct usb_iso_packet_descriptor *d;
-+
- u8 *b;
- int length;
- struct urb_frame *frame;
-@@ -412,10 +513,8 @@ static void ttusb_dec_process_urb(struct
- urb->status);
- }
-
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- if (dec->iso_stream_count)
- usb_submit_urb(urb, GFP_ATOMIC);
--#endif
- }
-
- static void ttusb_dec_setup_urbs(struct ttusb_dec *dec)
-@@ -433,9 +532,8 @@ static void ttusb_dec_setup_urbs(struct
- urb->complete = ttusb_dec_process_urb;
- urb->pipe = dec->stream_pipe;
- urb->transfer_flags = URB_ISO_ASAP;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- urb->interval = 1;
--#endif
-+
- urb->number_of_packets = FRAMES_PER_ISO_BUF;
- urb->transfer_buffer_length = ISO_FRAME_SIZE *
- FRAMES_PER_ISO_BUF;
-@@ -502,8 +600,8 @@ static int ttusb_dec_start_iso_xfer(stru
- ttusb_dec_setup_urbs(dec);
-
- for (i = 0; i < ISO_BUF_COUNT; i++) {
-- if ((result = usb_submit_urb(dec->iso_urb[i]
-- , GFP_KERNEL))) {
-+ if ((result = usb_submit_urb(dec->iso_urb[i],
-+ GFP_ATOMIC))) {
- printk("%s: failed urb submission %d: "
- "error %d\n", __FUNCTION__, i, result);
-
-@@ -525,10 +623,6 @@ static int ttusb_dec_start_iso_xfer(stru
-
- up(&dec->iso_sem);
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-- ttusb_dec_set_streaming_interface(dec);
--#endif
--
- return 0;
- }
-
-@@ -659,7 +753,7 @@ static int ttusb_dec_alloc_iso_urbs(stru
- for (i = 0; i < ISO_BUF_COUNT; i++) {
- struct urb *urb;
-
-- if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_KERNEL))) {
-+ if (!(urb = usb_alloc_urb(FRAMES_PER_ISO_BUF, GFP_ATOMIC))) {
- ttusb_dec_free_iso_urbs(dec);
- return -ENOMEM;
- }
-@@ -669,13 +763,6 @@ static int ttusb_dec_alloc_iso_urbs(stru
-
- ttusb_dec_setup_urbs(dec);
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-- for (i = 0; i < ISO_BUF_COUNT; i++) {
-- int next = (i + 1) % ISO_BUF_COUNT;
-- dec->iso_urb[i]->next = dec->iso_urb[next];
-- }
--#endif
--
- return 0;
- }
-
-@@ -711,20 +798,45 @@ static void ttusb_dec_init_usb(struct tt
- ttusb_dec_alloc_iso_urbs(dec);
- }
-
--#include "dsp_dec2000.h"
--
- static int ttusb_dec_boot_dsp(struct ttusb_dec *dec)
- {
- int i, j, actual_len, result, size, trans_count;
-- u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xc8, 0x61,
-+ u8 b0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00 };
- u8 b1[] = { 0x61 };
- u8 b[ARM_PACKET_SIZE];
-- u32 dsp_length = htonl(sizeof(dsp_dec2000));
-+ u8 *firmware = NULL;
-+ size_t firmware_size = 0;
-+ u32 firmware_csum = 0;
-+ u32 firmware_size_nl;
-+ u32 firmware_csum_nl;
-+ const struct firmware *fw_entry = NULL;
-
- dprintk("%s\n", __FUNCTION__);
-
-- memcpy(b0, &dsp_length, 4);
-+ if (request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev)) {
-+ printk(KERN_ERR "%s: Firmware (%s) unavailable.\n",
-+ __FUNCTION__, dec->firmware_name);
-+ return 1;
-+ }
-+
-+ firmware = fw_entry->data;
-+ firmware_size = fw_entry->size;
-+
-+ switch (dec->model) {
-+ case TTUSB_DEC2000T:
-+ firmware_csum = 0x1bc86100;
-+ break;
-+
-+ case TTUSB_DEC3000S:
-+ firmware_csum = 0x00000000;
-+ break;
-+ }
-+
-+ firmware_size_nl = htonl(firmware_size);
-+ memcpy(b0, &firmware_size_nl, 4);
-+ firmware_csum_nl = htonl(firmware_csum);
-+ memcpy(&b0[6], &firmware_csum_nl, 4);
-
- result = ttusb_dec_send_command(dec, 0x41, sizeof(b0), b0, NULL, NULL);
-
-@@ -734,8 +846,8 @@ static int ttusb_dec_boot_dsp(struct ttu
- trans_count = 0;
- j = 0;
-
-- for (i = 0; i < sizeof(dsp_dec2000); i += COMMAND_PACKET_SIZE) {
-- size = sizeof(dsp_dec2000) - i;
-+ for (i = 0; i < firmware_size; i += COMMAND_PACKET_SIZE) {
-+ size = firmware_size - i;
- if (size > COMMAND_PACKET_SIZE)
- size = COMMAND_PACKET_SIZE;
-
-@@ -743,7 +855,7 @@ static int ttusb_dec_boot_dsp(struct ttu
- b[j + 1] = trans_count++;
- b[j + 2] = 0xf0;
- b[j + 3] = size;
-- memcpy(&b[j + 4], &dsp_dec2000[i], size);
-+ memcpy(&b[j + 4], &firmware[i], size);
-
- j += COMMAND_PACKET_SIZE + 4;
-
-@@ -764,7 +876,7 @@ static int ttusb_dec_boot_dsp(struct ttu
- return result;
- }
-
--static void ttusb_dec_init_stb(struct ttusb_dec *dec)
-+static int ttusb_dec_init_stb(struct ttusb_dec *dec)
- {
- u8 c[COMMAND_PACKET_SIZE];
- int c_length;
-@@ -774,9 +886,14 @@ static void ttusb_dec_init_stb(struct tt
-
- result = ttusb_dec_send_command(dec, 0x08, 0, NULL, &c_length, c);
-
-- if (!result)
-+ if (!result) {
- if (c_length != 0x0c || (c_length == 0x0c && c[9] != 0x63))
-- ttusb_dec_boot_dsp(dec);
-+ return ttusb_dec_boot_dsp(dec);
-+ else
-+ return 0;
-+ }
-+ else
-+ return result;
- }
-
- static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
-@@ -785,22 +902,13 @@ static int ttusb_dec_init_dvb(struct ttu
-
- dprintk("%s\n", __FUNCTION__);
-
-- if ((result = dvb_register_adapter(&dec->adapter, "dec2000")) < 0) {
-+ if ((result = dvb_register_adapter(&dec->adapter, dec->model_name)) < 0) {
- printk("%s: dvb_register_adapter failed: error %d\n",
- __FUNCTION__, result);
-
- return result;
- }
-
-- if (!(dec->i2c_bus = dvb_register_i2c_bus(ttusb_dec_i2c_master_xfer,
-- dec, dec->adapter, 0))) {
-- printk("%s: dvb_register_i2c_bus failed\n", __FUNCTION__);
--
-- dvb_unregister_adapter(dec->adapter);
--
-- return -ENOMEM;
-- }
--
- dec->demux.dmx.capabilities = DMX_TS_FILTERING | DMX_SECTION_FILTERING;
-
- dec->demux.priv = (void *)dec;
-@@ -814,8 +922,6 @@ static int ttusb_dec_init_dvb(struct ttu
- printk("%s: dvb_dmx_init failed: error %d\n", __FUNCTION__,
- result);
-
-- dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-- 0);
- dvb_unregister_adapter(dec->adapter);
-
- return result;
-@@ -830,8 +936,6 @@ static int ttusb_dec_init_dvb(struct ttu
- __FUNCTION__, result);
-
- dvb_dmx_release(&dec->demux);
-- dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-- 0);
- dvb_unregister_adapter(dec->adapter);
-
- return result;
-@@ -846,8 +950,6 @@ static int ttusb_dec_init_dvb(struct ttu
-
- dvb_dmxdev_release(&dec->dmxdev);
- dvb_dmx_release(&dec->demux);
-- dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-- 0);
- dvb_unregister_adapter(dec->adapter);
-
- return result;
-@@ -861,8 +963,6 @@ static int ttusb_dec_init_dvb(struct ttu
- dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
- dvb_dmxdev_release(&dec->dmxdev);
- dvb_dmx_release(&dec->demux);
-- dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter,
-- 0);
- dvb_unregister_adapter(dec->adapter);
-
- return result;
-@@ -882,7 +982,6 @@ static void ttusb_dec_exit_dvb(struct tt
- dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend);
- dvb_dmxdev_release(&dec->dmxdev);
- dvb_dmx_release(&dec->demux);
-- dvb_unregister_i2c_bus(ttusb_dec_i2c_master_xfer, dec->adapter, 0);
- dvb_unregister_adapter(dec->adapter);
- }
-
-@@ -914,35 +1013,257 @@ static void ttusb_dec_exit_tasklet(struc
- }
- }
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
--static void *ttusb_dec_probe(struct usb_device *udev, unsigned int ifnum,
-- const struct usb_device_id *id)
-+static int ttusb_dec_2000t_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
-+ void *arg)
- {
-- struct ttusb_dec *dec;
-+ struct ttusb_dec *dec = fe->data;
-
- dprintk("%s\n", __FUNCTION__);
-
-- if (ifnum != 0)
-- return NULL;
-+ switch (cmd) {
-+
-+ case FE_GET_INFO:
-+ dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
-+ memcpy(arg, dec->frontend_info,
-+ sizeof (struct dvb_frontend_info));
-+ break;
-+
-+ case FE_READ_STATUS: {
-+ fe_status_t *status = (fe_status_t *)arg;
-+ dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
-+ *status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
-+ FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
-+ break;
-+ }
-+
-+ case FE_READ_BER: {
-+ u32 *ber = (u32 *)arg;
-+ dprintk("%s: FE_READ_BER\n", __FUNCTION__);
-+ *ber = 0;
-+ return -ENOSYS;
-+ break;
-+ }
-+
-+ case FE_READ_SIGNAL_STRENGTH: {
-+ dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
-+ *(s32 *)arg = 0xFF;
-+ return -ENOSYS;
-+ break;
-+ }
-+
-+ case FE_READ_SNR:
-+ dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
-+ *(s32 *)arg = 0;
-+ return -ENOSYS;
-+ break;
-+
-+ case FE_READ_UNCORRECTED_BLOCKS:
-+ dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
-+ *(u32 *)arg = 0;
-+ return -ENOSYS;
-+ break;
-+
-+ case FE_SET_FRONTEND: {
-+ struct dvb_frontend_parameters *p =
-+ (struct dvb_frontend_parameters *)arg;
-+ u8 b[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
-+ 0x00, 0xff, 0x00, 0x00, 0x00, 0xff };
-+ u32 freq;
-+
-+ dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
-+
-+ dprintk(" frequency->%d\n", p->frequency);
-+ dprintk(" symbol_rate->%d\n",
-+ p->u.qam.symbol_rate);
-+ dprintk(" inversion->%d\n", p->inversion);
-+
-+ freq = htonl(p->frequency / 1000);
-+ memcpy(&b[4], &freq, sizeof (u32));
-+ ttusb_dec_send_command(dec, 0x71, sizeof(b), b, NULL, NULL);
-+
-+ break;
-+ }
-+
-+ case FE_GET_FRONTEND:
-+ dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
-+ break;
-+
-+ case FE_SLEEP:
-+ dprintk("%s: FE_SLEEP\n", __FUNCTION__);
-+ return -ENOSYS;
-+ break;
-+
-+ case FE_INIT:
-+ dprintk("%s: FE_INIT\n", __FUNCTION__);
-+ break;
-+
-+ case FE_RESET:
-+ dprintk("%s: FE_RESET\n", __FUNCTION__);
-+ break;
-+
-+ default:
-+ dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
-+ return -EINVAL;
-
-- if (!(dec = kmalloc(sizeof(struct ttusb_dec), GFP_KERNEL))) {
-- printk("%s: couldn't allocate memory.\n", __FUNCTION__);
-- return NULL;
- }
-
-- memset(dec, 0, sizeof(struct ttusb_dec));
-+ return 0;
-+}
-
-- dec->udev = udev;
-+static int ttusb_dec_3000s_frontend_ioctl(struct dvb_frontend *fe, unsigned int cmd,
-+ void *arg)
-+{
-+ struct ttusb_dec *dec = fe->data;
-
-- ttusb_dec_init_usb(dec);
-- ttusb_dec_init_stb(dec);
-- ttusb_dec_init_dvb(dec);
-- ttusb_dec_init_v_pes(dec);
-- ttusb_dec_init_tasklet(dec);
-+ dprintk("%s\n", __FUNCTION__);
-
-- return (void *)dec;
-+ switch (cmd) {
-+
-+ case FE_GET_INFO:
-+ dprintk("%s: FE_GET_INFO\n", __FUNCTION__);
-+ memcpy(arg, dec->frontend_info,
-+ sizeof (struct dvb_frontend_info));
-+ break;
-+
-+ case FE_READ_STATUS: {
-+ fe_status_t *status = (fe_status_t *)arg;
-+ dprintk("%s: FE_READ_STATUS\n", __FUNCTION__);
-+ *status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
-+ FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
-+ break;
-+ }
-+
-+ case FE_READ_BER: {
-+ u32 *ber = (u32 *)arg;
-+ dprintk("%s: FE_READ_BER\n", __FUNCTION__);
-+ *ber = 0;
-+ return -ENOSYS;
-+ break;
-+ }
-+
-+ case FE_READ_SIGNAL_STRENGTH: {
-+ dprintk("%s: FE_READ_SIGNAL_STRENGTH\n", __FUNCTION__);
-+ *(s32 *)arg = 0xFF;
-+ return -ENOSYS;
-+ break;
-+ }
-+
-+ case FE_READ_SNR:
-+ dprintk("%s: FE_READ_SNR\n", __FUNCTION__);
-+ *(s32 *)arg = 0;
-+ return -ENOSYS;
-+ break;
-+
-+ case FE_READ_UNCORRECTED_BLOCKS:
-+ dprintk("%s: FE_READ_UNCORRECTED_BLOCKS\n", __FUNCTION__);
-+ *(u32 *)arg = 0;
-+ return -ENOSYS;
-+ break;
-+
-+ case FE_SET_FRONTEND: {
-+ struct dvb_frontend_parameters *p =
-+ (struct dvb_frontend_parameters *)arg;
-+ u8 b[] = { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00 };
-+ u32 freq;
-+ u32 sym_rate;
-+ u32 band;
-+
-+
-+ dprintk("%s: FE_SET_FRONTEND\n", __FUNCTION__);
-+
-+ dprintk(" frequency->%d\n", p->frequency);
-+ dprintk(" symbol_rate->%d\n",
-+ p->u.qam.symbol_rate);
-+ dprintk(" inversion->%d\n", p->inversion);
-+
-+ freq = htonl(p->frequency * 1000 + (dec->hi_band ? LOF_HI : LOF_LO));
-+ memcpy(&b[4], &freq, sizeof(u32));
-+ sym_rate = htonl(p->u.qam.symbol_rate);
-+ memcpy(&b[12], &sym_rate, sizeof(u32));
-+ band = htonl(dec->hi_band ? LOF_HI : LOF_LO);
-+ memcpy(&b[24], &band, sizeof(u32));
-+
-+ ttusb_dec_send_command(dec, 0x71, sizeof(b), b, NULL, NULL);
-+
-+ break;
-+ }
-+
-+ case FE_GET_FRONTEND:
-+ dprintk("%s: FE_GET_FRONTEND\n", __FUNCTION__);
-+ break;
-+
-+ case FE_SLEEP:
-+ dprintk("%s: FE_SLEEP\n", __FUNCTION__);
-+ return -ENOSYS;
-+ break;
-+
-+ case FE_INIT:
-+ dprintk("%s: FE_INIT\n", __FUNCTION__);
-+ break;
-+
-+ case FE_RESET:
-+ dprintk("%s: FE_RESET\n", __FUNCTION__);
-+ break;
-+
-+ case FE_DISEQC_SEND_MASTER_CMD:
-+ dprintk("%s: FE_DISEQC_SEND_MASTER_CMD\n", __FUNCTION__);
-+ break;
-+
-+ case FE_DISEQC_SEND_BURST:
-+ dprintk("%s: FE_DISEQC_SEND_BURST\n", __FUNCTION__);
-+ break;
-+
-+ case FE_SET_TONE: {
-+ fe_sec_tone_mode_t tone = (fe_sec_tone_mode_t)arg;
-+ dprintk("%s: FE_SET_TONE\n", __FUNCTION__);
-+ dec->hi_band = (SEC_TONE_ON == tone);
-+ break;
-+ }
-+
-+ case FE_SET_VOLTAGE:
-+ dprintk("%s: FE_SET_VOLTAGE\n", __FUNCTION__);
-+ break;
-+
-+ default:
-+ dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
-+ return -EINVAL;
-+
-+ }
-+
-+ return 0;
-+}
-+
-+static void ttusb_dec_init_frontend(struct ttusb_dec *dec)
-+{
-+ dec->i2c_bus.adapter = dec->adapter;
-+
-+ switch (dec->model) {
-+ case TTUSB_DEC2000T:
-+ dec->frontend_info = &dec2000t_frontend_info;
-+ dec->frontend_ioctl = ttusb_dec_2000t_frontend_ioctl;
-+ break;
-+
-+ case TTUSB_DEC3000S:
-+ dec->frontend_info = &dec3000s_frontend_info;
-+ dec->frontend_ioctl = ttusb_dec_3000s_frontend_ioctl;
-+ break;
-+ }
-+
-+ dvb_register_frontend(dec->frontend_ioctl, &dec->i2c_bus, (void *)dec,
-+ dec->frontend_info);
-+}
-+
-+static void ttusb_dec_exit_frontend(struct ttusb_dec *dec)
-+{
-+ dvb_unregister_frontend(dec->frontend_ioctl, &dec->i2c_bus);
- }
--#else
-+
- static int ttusb_dec_probe(struct usb_interface *intf,
- const struct usb_device_id *id)
- {
-@@ -958,48 +1279,65 @@ static int ttusb_dec_probe(struct usb_in
- return -ENOMEM;
- }
-
-+ usb_set_intfdata(intf, (void *)dec);
-+
- memset(dec, 0, sizeof(struct ttusb_dec));
-
-+ switch (id->idProduct) {
-+ case 0x1006:
-+ dec->model = TTUSB_DEC3000S;
-+ dec->model_name = "DEC3000-s";
-+ dec->firmware_name = "dec3000s.bin";
-+ break;
-+
-+ case 0x1008:
-+ dec->model = TTUSB_DEC2000T;
-+ dec->model_name = "DEC2000-t";
-+ dec->firmware_name = "dec2000t.bin";
-+ break;
-+ }
-+
- dec->udev = udev;
-
- ttusb_dec_init_usb(dec);
-- ttusb_dec_init_stb(dec);
-+ if (ttusb_dec_init_stb(dec)) {
-+ ttusb_dec_exit_usb(dec);
-+ return 0;
-+ }
- ttusb_dec_init_dvb(dec);
-+ ttusb_dec_init_frontend(dec);
- ttusb_dec_init_v_pes(dec);
- ttusb_dec_init_tasklet(dec);
-
-- usb_set_intfdata(intf, (void *)dec);
-+ dec->active = 1;
-+
- ttusb_dec_set_streaming_interface(dec);
-
- return 0;
- }
--#endif
-
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
--static void ttusb_dec_disconnect(struct usb_device *udev, void *data)
--{
-- struct ttusb_dec *dec = data;
--#else
- static void ttusb_dec_disconnect(struct usb_interface *intf)
- {
- struct ttusb_dec *dec = usb_get_intfdata(intf);
-
- usb_set_intfdata(intf, NULL);
--#endif
-
- dprintk("%s\n", __FUNCTION__);
-
-+ if (dec->active) {
- ttusb_dec_exit_tasklet(dec);
- ttusb_dec_exit_usb(dec);
-+ ttusb_dec_exit_frontend(dec);
- ttusb_dec_exit_dvb(dec);
-+ }
-
- kfree(dec);
- }
-
- static struct usb_device_id ttusb_dec_table[] = {
-- {USB_DEVICE(0x0b48, 0x1006)}, /* Unconfirmed */
-- {USB_DEVICE(0x0b48, 0x1007)}, /* Unconfirmed */
-- {USB_DEVICE(0x0b48, 0x1008)}, /* DEC 2000 t */
-+ {USB_DEVICE(0x0b48, 0x1006)}, /* DEC3000-s */
-+ /*{USB_DEVICE(0x0b48, 0x1007)}, Unconfirmed */
-+ {USB_DEVICE(0x0b48, 0x1008)}, /* DEC2000-t */
- {}
- };
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/media/dvb/ttusb-dec/ttusb_dec.mod.c 2003-12-28 23:22:40.000000000 -0800
-@@ -0,0 +1,13 @@
-+#include <linux/module.h>
-+#include <linux/vermagic.h>
-+#include <linux/compiler.h>
-+
-+MODULE_INFO(vermagic, VERMAGIC_STRING);
-+
-+static const char __module_depends[]
-+__attribute_used__
-+__attribute__((section(".modinfo"))) =
-+"depends=dvb-core";
-+
-+MODULE_ALIAS("usb:v0B48p1006dl*dh*dc*dsc*dp*ic*isc*ip*");
-+MODULE_ALIAS("usb:v0B48p1008dl*dh*dc*dsc*dp*ic*isc*ip*");
---- linux-2.6.0/drivers/media/video/video-buf.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/media/video/video-buf.c 2003-12-28 23:22:12.000000000 -0800
-@@ -1078,7 +1078,7 @@ videobuf_vm_close(struct vm_area_struct
- */
- static struct page*
- videobuf_vm_nopage(struct vm_area_struct *vma, unsigned long vaddr,
-- int write_access)
-+ int *type)
- {
- struct page *page;
-
-@@ -1090,6 +1090,8 @@ videobuf_vm_nopage(struct vm_area_struct
- if (!page)
- return NOPAGE_OOM;
- clear_user_page(page_address(page), vaddr, page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return page;
- }
-
---- linux-2.6.0/drivers/message/i2o/i2o_block.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/message/i2o/i2o_block.c 2003-12-28 23:21:17.000000000 -0800
-@@ -885,10 +885,10 @@ static void i2o_block_biosparam(
- * Issue device specific ioctl calls.
- */
-
--static int i2ob_ioctl(struct inode *inode, struct file *file,
-+static int i2ob_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct i2ob_device *dev = disk->private_data;
-
- /* Anyone capable of this syscall can do *real bad* things */
-@@ -901,7 +901,7 @@ static int i2ob_ioctl(struct inode *inod
- struct hd_geometry g;
- i2o_block_biosparam(get_capacity(disk),
- &g.cylinders, &g.heads, &g.sectors);
-- g.start = get_start_sect(inode->i_bdev);
-+ g.start = get_start_sect(bdev);
- return copy_to_user((void *)arg,&g, sizeof(g))?-EFAULT:0;
- }
-
-@@ -927,9 +927,8 @@ static int i2ob_ioctl(struct inode *inod
- * Close the block device down
- */
-
--static int i2ob_release(struct inode *inode, struct file *file)
-+static int i2ob_release(struct gendisk *disk)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
- struct i2ob_device *dev = disk->private_data;
-
- /*
-@@ -999,9 +998,9 @@ static int i2ob_release(struct inode *in
- * Open the block device.
- */
-
--static int i2ob_open(struct inode *inode, struct file *file)
-+static int i2ob_open(struct block_device *bdev, struct file *file)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct i2ob_device *dev = disk->private_data;
-
- if(!dev->i2odev)
---- linux-2.6.0/drivers/mtd/chips/jedec_probe.c 2003-06-14 12:18:51.000000000 -0700
-+++ 25/drivers/mtd/chips/jedec_probe.c 2003-12-28 23:23:01.000000000 -0800
-@@ -8,6 +8,7 @@
-
- #include <linux/config.h>
- #include <linux/module.h>
-+#include <linux/init.h>
- #include <linux/types.h>
- #include <linux/kernel.h>
- #include <asm/io.h>
---- linux-2.6.0/drivers/mtd/maps/pcmciamtd.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/mtd/maps/pcmciamtd.c 2003-12-28 23:22:54.000000000 -0800
-@@ -125,7 +125,7 @@ static caddr_t remap_window(struct map_i
- DEBUG(2, "Remapping window from 0x%8.8x to 0x%8.8x",
- dev->offset, mrq.CardOffset);
- mrq.Page = 0;
-- if( (ret = CardServices(MapMemPage, win, &mrq)) != CS_SUCCESS) {
-+ if( (ret = pcmcia_map_mem_page(win, &mrq)) != CS_SUCCESS) {
- cs_error(dev->link.handle, MapMemPage, ret);
- return NULL;
- }
-@@ -332,7 +332,7 @@ static void pcmciamtd_set_vpp(struct map
- mod.Vpp1 = mod.Vpp2 = on ? dev->vpp : 0;
-
- DEBUG(2, "dev = %p on = %d vpp = %d\n", dev, on, dev->vpp);
-- ret = CardServices(ModifyConfiguration, link->handle, &mod);
-+ ret = pcmcia_modify_configuration(link->handle, &mod);
- if(ret != CS_SUCCESS) {
- cs_error(link->handle, ModifyConfiguration, ret);
- }
-@@ -355,9 +355,9 @@ static void pcmciamtd_release(dev_link_t
- iounmap(dev->win_base);
- dev->win_base = NULL;
- }
-- CardServices(ReleaseWindow, link->win);
-+ pcmcia_release_window(link->win);
- }
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- link->state &= ~DEV_CONFIG;
- }
-
-@@ -375,14 +375,14 @@ static void card_settings(struct pcmciam
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = RETURN_FIRST_TUPLE;
-
-- rc = CardServices(GetFirstTuple, link->handle, &tuple);
-+ rc = pcmcia_get_first_tuple(link->handle, &tuple);
- while(rc == CS_SUCCESS) {
-- rc = CardServices(GetTupleData, link->handle, &tuple);
-+ rc = pcmcia_get_tuple_data(link->handle, &tuple);
- if(rc != CS_SUCCESS) {
- cs_error(link->handle, GetTupleData, rc);
- break;
- }
-- rc = CardServices(ParseTuple, link->handle, &tuple, &parse);
-+ rc = pcmcia_parse_tuple(link->handle, &tuple, &parse);
- if(rc != CS_SUCCESS) {
- cs_error(link->handle, ParseTuple, rc);
- break;
-@@ -455,7 +455,7 @@ static void card_settings(struct pcmciam
- DEBUG(2, "Unknown tuple code %d", tuple.TupleCode);
- }
-
-- rc = CardServices(GetNextTuple, link->handle, &tuple, &parse);
-+ rc = pcmcia_get_next_tuple(link->handle, &tuple);
- }
- if(!dev->pcmcia_map.size)
- dev->pcmcia_map.size = MAX_PCMCIA_ADDR;
-@@ -489,8 +489,8 @@ static void card_settings(struct pcmciam
- * MTD device available to the system.
- */
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void pcmciamtd_config(dev_link_t *link)
- {
-@@ -512,7 +512,7 @@ static void pcmciamtd_config(dev_link_t
- link->state |= DEV_CONFIG;
-
- DEBUG(2, "Validating CIS");
-- ret = CardServices(ValidateCIS, link->handle, &cisinfo);
-+ ret = pcmcia_validate_cis(link->handle, &cisinfo);
- if(ret != CS_SUCCESS) {
- cs_error(link->handle, GetTupleData, ret);
- } else {
-@@ -547,8 +547,7 @@ static void pcmciamtd_config(dev_link_t
- int ret;
- DEBUG(2, "requesting window with size = %dKiB memspeed = %d",
- req.Size >> 10, req.AccessSpeed);
-- link->win = (window_handle_t)link->handle;
-- ret = CardServices(RequestWindow, &link->win, &req);
-+ ret = pcmcia_request_window(&link->handle, &req, &link->win);
- DEBUG(2, "ret = %d dev->win_size = %d", ret, dev->win_size);
- if(ret) {
- req.Size >>= 1;
-@@ -569,7 +568,7 @@ static void pcmciamtd_config(dev_link_t
- DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10);
-
- /* Get write protect status */
-- CS_CHECK(GetStatus, link->handle, &status);
-+ CS_CHECK(GetStatus, pcmcia_get_status(link->handle, &status));
- DEBUG(2, "status value: 0x%x window handle = 0x%8.8lx",
- status.CardState, (unsigned long)link->win);
- dev->win_base = ioremap(req.Base, req.Size);
-@@ -586,7 +585,7 @@ static void pcmciamtd_config(dev_link_t
- dev->pcmcia_map.map_priv_2 = (unsigned long)link->win;
-
- DEBUG(2, "Getting configuration");
-- CS_CHECK(GetConfigurationInfo, link->handle, &t);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link->handle, &t));
- DEBUG(2, "Vcc = %d Vpp1 = %d Vpp2 = %d", t.Vcc, t.Vpp1, t.Vpp2);
- dev->vpp = (vpp) ? vpp : t.Vpp1;
- link->conf.Attributes = 0;
-@@ -608,7 +607,7 @@ static void pcmciamtd_config(dev_link_t
- link->conf.ConfigIndex = 0;
- link->conf.Present = t.Present;
- DEBUG(2, "Setting Configuration");
-- ret = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ ret = pcmcia_request_configuration(link->handle, &link->conf);
- if(ret != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, ret);
- }
-@@ -757,7 +756,7 @@ static void pcmciamtd_detach(dev_link_t
- if (link->handle) {
- int ret;
- DEBUG(2, "Deregistering with card services");
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -804,7 +803,7 @@ static dev_link_t *pcmciamtd_attach(void
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
- DEBUG(2, "Calling RegisterClient");
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- pcmciamtd_detach(link);
---- linux-2.6.0/drivers/mtd/mtd_blkdevs.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/mtd/mtd_blkdevs.c 2003-12-28 23:21:17.000000000 -0800
-@@ -141,14 +141,12 @@ static void mtd_blktrans_request(struct
- }
-
-
--int blktrans_open(struct inode *i, struct file *f)
-+static int blktrans_open(struct block_device *bdev, struct file *f)
- {
-- struct mtd_blktrans_dev *dev;
-- struct mtd_blktrans_ops *tr;
-+ struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data;
-+ struct mtd_blktrans_ops *tr = dev->tr;
- int ret = -ENODEV;
-
-- dev = i->i_bdev->bd_disk->private_data;
-- tr = dev->tr;
-
- if (!try_module_get(dev->mtd->owner))
- goto out;
-@@ -172,15 +170,12 @@ int blktrans_open(struct inode *i, struc
- return ret;
- }
-
--int blktrans_release(struct inode *i, struct file *f)
-+static int blktrans_release(struct gendisk *disk)
- {
-- struct mtd_blktrans_dev *dev;
-- struct mtd_blktrans_ops *tr;
-+ struct mtd_blktrans_dev *dev = disk->private_data;
-+ struct mtd_blktrans_ops *tr = dev->tr;
- int ret = 0;
-
-- dev = i->i_bdev->bd_disk->private_data;
-- tr = dev->tr;
--
- if (tr->release)
- ret = tr->release(dev);
-
-@@ -194,10 +189,10 @@ int blktrans_release(struct inode *i, st
- }
-
-
--static int blktrans_ioctl(struct inode *inode, struct file *file,
-+static int blktrans_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct mtd_blktrans_dev *dev = inode->i_bdev->bd_disk->private_data;
-+ struct mtd_blktrans_dev *dev = bdev->bd_disk->private_data;
- struct mtd_blktrans_ops *tr = dev->tr;
-
- switch (cmd) {
-@@ -217,7 +212,7 @@ static int blktrans_ioctl(struct inode *
- if (ret)
- return ret;
-
-- g.start = get_start_sect(inode->i_bdev);
-+ g.start = get_start_sect(bdev);
- if (copy_to_user((void *)arg, &g, sizeof(g)))
- return -EFAULT;
- return 0;
---- linux-2.6.0/drivers/net/3c501.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/net/3c501.c 2003-12-28 23:21:00.000000000 -0800
-@@ -136,17 +136,14 @@ static const char version[] =
-
- #include "3c501.h"
-
--/* A zero-terminated list of I/O addresses to be probed.
-- The 3c501 can be at many locations, but here are the popular ones. */
--static unsigned int netcard_portlist[] __initdata = {
-- 0x280, 0x300, 0
--};
--
--
- /*
- * The boilerplate probe code.
- */
-
-+static int io=0x280;
-+static int irq=5;
-+static int mem_start;
-+
- /**
- * el1_probe: - probe for a 3c501
- * @dev: The device structure passed in to probe.
-@@ -160,23 +157,47 @@ static unsigned int netcard_portlist[] _
- * probe and failing to find anything.
- */
-
--int __init el1_probe(struct net_device *dev)
-+struct net_device * __init el1_probe(int unit)
- {
-- int i;
-- int base_addr = dev->base_addr;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-+ static unsigned ports[] = { 0x280, 0x300, 0};
-+ unsigned *port;
-+ int err = 0;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ mem_start = dev->mem_start & 7;
-+ }
-
- SET_MODULE_OWNER(dev);
-
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return el1_probe1(dev, base_addr);
-- else if (base_addr != 0) /* Don't probe at all. */
-- return -ENXIO;
--
-- for (i = 0; netcard_portlist[i]; i++)
-- if (el1_probe1(dev, netcard_portlist[i]) == 0)
-- return 0;
--
-- return -ENODEV;
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = el1_probe1(dev, io);
-+ } else if (io != 0) {
-+ err = -ENXIO; /* Don't probe at all. */
-+ } else {
-+ for (port = ports; *port && el1_probe1(dev, *port); port++)
-+ ;
-+ if (!*port)
-+ err = -ENODEV;
-+ }
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ release_region(dev->base_addr, EL1_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /**
-@@ -240,6 +261,8 @@ static int __init el1_probe1(struct net_
- * high.
- */
-
-+ dev->irq = irq;
-+
- if (dev->irq < 2)
- {
- unsigned long irq_mask;
-@@ -267,8 +290,8 @@ static int __init el1_probe1(struct net_
- dev->base_addr = ioaddr;
- memcpy(dev->dev_addr, station_addr, ETH_ALEN);
-
-- if (dev->mem_start & 0xf)
-- el_debug = dev->mem_start & 0x7;
-+ if (mem_start & 0xf)
-+ el_debug = mem_start & 0x7;
- if (autoirq)
- dev->irq = autoirq;
-
-@@ -282,17 +305,7 @@ static int __init el1_probe1(struct net_
- if (el_debug)
- printk(KERN_DEBUG "%s", version);
-
-- /*
-- * Initialize the device structure.
-- */
--
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (dev->priv == NULL) {
-- release_region(ioaddr, EL1_IO_EXTENT);
-- return -ENOMEM;
-- }
- memset(dev->priv, 0, sizeof(struct net_local));
--
- lp=dev->priv;
- spin_lock_init(&lp->lock);
-
-@@ -308,13 +321,6 @@ static int __init el1_probe1(struct net_
- dev->get_stats = &el1_get_stats;
- dev->set_multicast_list = &set_multicast_list;
- dev->ethtool_ops = &netdev_ethtool_ops;
--
-- /*
-- * Setup the generic properties
-- */
--
-- ether_setup(dev);
--
- return 0;
- }
-
-@@ -884,14 +890,8 @@ static struct ethtool_ops netdev_ethtool
-
- #ifdef MODULE
-
--static struct net_device dev_3c501 = {
-- .init = el1_probe,
-- .base_addr = 0x280,
-- .irq = 5,
--};
-+static struct net_device *dev_3c501;
-
--static int io=0x280;
--static int irq=5;
- MODULE_PARM(io, "i");
- MODULE_PARM(irq, "i");
- MODULE_PARM_DESC(io, "EtherLink I/O base address");
-@@ -911,10 +911,9 @@ MODULE_PARM_DESC(irq, "EtherLink IRQ num
-
- int init_module(void)
- {
-- dev_3c501.irq=irq;
-- dev_3c501.base_addr=io;
-- if (register_netdev(&dev_3c501) != 0)
-- return -EIO;
-+ dev_3c501 = el1_probe(-1);
-+ if (IS_ERR(dev_3c501))
-+ return PTR_ERR(dev_3c501);
- return 0;
- }
-
-@@ -927,19 +926,10 @@ int init_module(void)
-
- void cleanup_module(void)
- {
-- unregister_netdev(&dev_3c501);
--
-- /*
-- * Free up the private structure, or leak memory :-)
-- */
--
-- kfree(dev_3c501.priv);
-- dev_3c501.priv = NULL; /* gets re-allocated by el1_probe1 */
--
-- /*
-- * If we don't do this, we can't re-insmod it later.
-- */
-- release_region(dev_3c501.base_addr, EL1_IO_EXTENT);
-+ struct net_device *dev = dev_3c501;
-+ unregister_netdev(dev);
-+ release_region(dev->base_addr, EL1_IO_EXTENT);
-+ free_netdev(dev);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/3c501.h 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/3c501.h 2003-12-28 23:21:00.000000000 -0800
-@@ -3,7 +3,6 @@
- * Index to functions.
- */
-
--int el1_probe(struct net_device *dev);
- static int el1_probe1(struct net_device *dev, int ioaddr);
- static int el_open(struct net_device *dev);
- static void el_timeout(struct net_device *dev);
---- linux-2.6.0/drivers/net/3c503.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/net/3c503.c 2003-12-28 23:21:00.000000000 -0800
-@@ -60,7 +60,6 @@ static const char version[] =
- #include "3c503.h"
- #define WRD_COUNT 4
-
--int el2_probe(struct net_device *dev);
- static int el2_pio_probe(struct net_device *dev);
- static int el2_probe1(struct net_device *dev, int ioaddr);
-
-@@ -90,11 +89,11 @@ static struct ethtool_ops netdev_ethtool
- If the ethercard isn't found there is an optional probe for
- ethercard jumpered to programmed-I/O mode.
- */
--int __init
--el2_probe(struct net_device *dev)
-+static int __init do_el2_probe(struct net_device *dev)
- {
- int *addr, addrs[] = { 0xddffe, 0xd9ffe, 0xcdffe, 0xc9ffe, 0};
- int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-@@ -104,16 +103,13 @@ el2_probe(struct net_device *dev)
- return -ENXIO;
-
- for (addr = addrs; *addr; addr++) {
-- int i;
-- unsigned int base_bits = isa_readb(*addr);
-- /* Find first set bit. */
-- for(i = 7; i >= 0; i--, base_bits >>= 1)
-- if (base_bits & 0x1)
-- break;
-- if (base_bits != 1)
-+ unsigned base_bits = isa_readb(*addr);
-+ int i = ffs(base_bits) - 1;
-+ if (i == -1 || base_bits != (1 << i))
- continue;
- if (el2_probe1(dev, netcard_portlist[i]) == 0)
- return 0;
-+ dev->irq = irq;
- }
- #if ! defined(no_probe_nonshared_memory)
- return el2_pio_probe(dev);
-@@ -128,20 +124,54 @@ static int __init
- el2_pio_probe(struct net_device *dev)
- {
- int i;
-- int base_addr = dev ? dev->base_addr : 0;
-+ int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- if (base_addr > 0x1ff) /* Check a single specified location. */
- return el2_probe1(dev, base_addr);
- else if (base_addr != 0) /* Don't probe at all. */
- return -ENXIO;
-
-- for (i = 0; netcard_portlist[i]; i++)
-+ for (i = 0; netcard_portlist[i]; i++) {
- if (el2_probe1(dev, netcard_portlist[i]) == 0)
- return 0;
-+ dev->irq = irq;
-+ }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ /* NB: el2_close() handles free_irq */
-+ release_region(dev->base_addr, EL2_IO_EXTENT);
-+}
-+
-+struct net_device * __init el2_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_el2_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- /* Probe for the Etherlink II card at I/O port base IOADDR,
- returning non-zero on success. If found, set the station
- address and memory parameters in DEVICE. */
-@@ -152,15 +182,19 @@ el2_probe1(struct net_device *dev, int i
- static unsigned version_printed;
- unsigned long vendor_id;
-
-- /* FIXME: code reads ioaddr + 0x400, we request ioaddr + 16 */
- if (!request_region(ioaddr, EL2_IO_EXTENT, dev->name))
- return -EBUSY;
-
-+ if (!request_region(ioaddr + 0x400, 8, dev->name)) {
-+ retval = -EBUSY;
-+ goto out;
-+ }
-+
- /* Reset and/or avoid any lurking NE2000 */
- if (inb(ioaddr + 0x408) == 0xff) {
- mdelay(1);
- retval = -ENODEV;
-- goto out;
-+ goto out1;
- }
-
- /* We verify that it's a 3C503 board by checking the first three octets
-@@ -171,7 +205,7 @@ el2_probe1(struct net_device *dev, int i
- if ( (iobase_reg & (iobase_reg - 1))
- || (membase_reg & (membase_reg - 1))) {
- retval = -ENODEV;
-- goto out;
-+ goto out1;
- }
- saved_406 = inb_p(ioaddr + 0x406);
- outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */
-@@ -184,19 +218,13 @@ el2_probe1(struct net_device *dev, int i
- /* Restore the register we frobbed. */
- outb(saved_406, ioaddr + 0x406);
- retval = -ENODEV;
-- goto out;
-+ goto out1;
- }
-
- if (ei_debug && version_printed++ == 0)
- printk(version);
-
- dev->base_addr = ioaddr;
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk ("3c503: unable to allocate memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out;
-- }
-
- printk("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr);
-
-@@ -322,7 +350,10 @@ el2_probe1(struct net_device *dev, int i
- printk("\n%s: %s, %dkB RAM, using programmed I/O (REJUMPER for SHARED MEMORY).\n",
- dev->name, ei_status.name, (wordlength+1)<<3);
- }
-+ release_region(ioaddr + 0x400, 8);
- return 0;
-+out1:
-+ release_region(ioaddr + 0x400, 8);
- out:
- release_region(ioaddr, EL2_IO_EXTENT);
- return retval;
-@@ -633,7 +664,7 @@ static struct ethtool_ops netdev_ethtool
- #ifdef MODULE
- #define MAX_EL2_CARDS 4 /* Max number of EL2 cards per module */
-
--static struct net_device dev_el2[MAX_EL2_CARDS];
-+static struct net_device *dev_el2[MAX_EL2_CARDS];
- static int io[MAX_EL2_CARDS];
- static int irq[MAX_EL2_CARDS];
- static int xcvr[MAX_EL2_CARDS]; /* choose int. or ext. xcvr */
-@@ -651,28 +682,34 @@ ISA device autoprobes on a running machi
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
-- struct net_device *dev = &dev_el2[this_dev];
-- dev->irq = irq[this_dev];
-- dev->base_addr = io[this_dev];
-- dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */
-- dev->init = el2_probe;
- if (io[this_dev] == 0) {
- if (this_dev != 0) break; /* only autoprobe 1st one */
- printk(KERN_NOTICE "3c503.c: Presently autoprobing (not recommended) for a single card.\n");
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
-+ dev->irq = irq[this_dev];
-+ dev->base_addr = io[this_dev];
-+ dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */
-+ if (do_el2_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_el2[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -681,13 +718,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
-- struct net_device *dev = &dev_el2[this_dev];
-- if (dev->priv != NULL) {
-- void *priv = dev->priv;
-- /* NB: el2_close() handles free_irq */
-- release_region(dev->base_addr, EL2_IO_EXTENT);
-+ struct net_device *dev = dev_el2[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/3c505.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/net/3c505.c 2003-12-28 23:21:00.000000000 -0800
-@@ -1293,42 +1293,6 @@ static void elp_set_mc_list(struct net_d
- }
- }
-
--/******************************************************
-- *
-- * initialise Etherlink Plus board
-- *
-- ******************************************************/
--
--static inline void elp_init(struct net_device *dev)
--{
-- elp_device *adapter = dev->priv;
--
-- /*
-- * set ptrs to various functions
-- */
-- dev->open = elp_open; /* local */
-- dev->stop = elp_close; /* local */
-- dev->get_stats = elp_get_stats; /* local */
-- dev->hard_start_xmit = elp_start_xmit; /* local */
-- dev->tx_timeout = elp_timeout; /* local */
-- dev->watchdog_timeo = 10*HZ;
-- dev->set_multicast_list = elp_set_mc_list; /* local */
-- dev->ethtool_ops = &netdev_ethtool_ops; /* local */
--
-- /* Setup the generic properties */
-- ether_setup(dev);
--
-- /*
-- * setup ptr to adapter specific information
-- */
-- memset(&(adapter->stats), 0, sizeof(struct net_device_stats));
--
-- /*
-- * memory information
-- */
-- dev->mem_start = dev->mem_end = 0;
--}
--
- /************************************************************
- *
- * A couple of tests to see if there's 3C505 or not
-@@ -1442,12 +1406,13 @@ static int __init elp_autodetect(struct
- * work at all if it was in a weird state).
- */
-
--int __init elplus_probe(struct net_device *dev)
-+static int __init elplus_setup(struct net_device *dev)
- {
-- elp_device *adapter;
-+ elp_device *adapter = dev->priv;
- int i, tries, tries1, okay;
- unsigned long timeout;
- unsigned long cookie = 0;
-+ int err = -ENODEV;
-
- SET_MODULE_OWNER(dev);
-
-@@ -1456,17 +1421,8 @@ int __init elplus_probe(struct net_devic
- */
-
- dev->base_addr = elp_autodetect(dev);
-- if (!(dev->base_addr))
-- return -ENODEV;
--
-- /*
-- * setup ptr to adapter specific information
-- */
-- adapter = (elp_device *) (dev->priv = kmalloc(sizeof(elp_device), GFP_KERNEL));
-- if (adapter == NULL) {
-- printk(KERN_ERR "%s: out of memory\n", dev->name);
-+ if (!dev->base_addr)
- return -ENODEV;
-- }
-
- adapter->send_pcb_semaphore = 0;
-
-@@ -1544,8 +1500,7 @@ int __init elplus_probe(struct net_devic
- outb_control(adapter->hcr_val & ~(FLSH | ATTN), dev);
- }
- printk(KERN_ERR "%s: failed to initialise 3c505\n", dev->name);
-- release_region(dev->base_addr, ELP_IO_EXTENT);
-- return -ENODEV;
-+ goto out;
-
- okay:
- if (dev->irq) { /* Is there a preset IRQ? */
-@@ -1560,14 +1515,14 @@ int __init elplus_probe(struct net_devic
- case 0:
- printk(KERN_ERR "%s: IRQ probe failed: check 3c505 jumpers.\n",
- dev->name);
-- return -ENODEV;
-+ goto out;
- case 1:
- case 6:
- case 8:
- case 13:
- printk(KERN_ERR "%s: Impossible IRQ %d reported by probe_irq_off().\n",
- dev->name, dev->irq);
-- return -ENODEV;
-+ goto out;
- }
- /*
- * Now we have the IRQ number so we can disable the interrupts from
-@@ -1636,16 +1591,48 @@ int __init elplus_probe(struct net_devic
- printk(KERN_ERR "%s: adapter configuration failed\n", dev->name);
- }
-
-- /*
-- * initialise the device
-- */
-- elp_init(dev);
-+ dev->open = elp_open; /* local */
-+ dev->stop = elp_close; /* local */
-+ dev->get_stats = elp_get_stats; /* local */
-+ dev->hard_start_xmit = elp_start_xmit; /* local */
-+ dev->tx_timeout = elp_timeout; /* local */
-+ dev->watchdog_timeo = 10*HZ;
-+ dev->set_multicast_list = elp_set_mc_list; /* local */
-+ dev->ethtool_ops = &netdev_ethtool_ops; /* local */
-+
-+ memset(&(adapter->stats), 0, sizeof(struct net_device_stats));
-+ dev->mem_start = dev->mem_end = 0;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out;
-
- return 0;
-+out:
-+ release_region(dev->base_addr, ELP_IO_EXTENT);
-+ return err;
-+}
-+
-+struct net_device * __init elplus_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(elp_device));
-+ int err;
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = elplus_setup(dev);
-+ if (err) {
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+ }
-+ return dev;
- }
-
- #ifdef MODULE
--static struct net_device dev_3c505[ELP_MAX_CARDS];
-+static struct net_device *dev_3c505[ELP_MAX_CARDS];
- static int io[ELP_MAX_CARDS];
- static int irq[ELP_MAX_CARDS];
- static int dma[ELP_MAX_CARDS];
-@@ -1661,10 +1648,12 @@ int init_module(void)
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < ELP_MAX_CARDS; this_dev++) {
-- struct net_device *dev = &dev_3c505[this_dev];
-+ struct net_device *dev = alloc_etherdev(sizeof(elp_device));
-+ if (!dev)
-+ break;
-+
- dev->irq = irq[this_dev];
- dev->base_addr = io[this_dev];
-- dev->init = elplus_probe;
- if (dma[this_dev]) {
- dev->dma = dma[this_dev];
- } else {
-@@ -1672,16 +1661,22 @@ int init_module(void)
- printk(KERN_WARNING "3c505.c: warning, using default DMA channel,\n");
- }
- if (io[this_dev] == 0) {
-- if (this_dev) break;
-+ if (this_dev) {
-+ free_netdev(dev);
-+ break;
-+ }
- printk(KERN_NOTICE "3c505.c: module autoprobe not recommended, give io=xx.\n");
- }
-- if (register_netdev(dev) != 0) {
-+ if (elplus_setup(dev) != 0) {
- printk(KERN_WARNING "3c505.c: Failed to register card at 0x%x.\n", io[this_dev]);
-- if (found != 0) return 0;
-- return -ENXIO;
-+ free_netdev(dev);
-+ break;
- }
-+ dev_3c505[this_dev] = dev;
- found++;
- }
-+ if (!found)
-+ return -ENODEV;
- return 0;
- }
-
-@@ -1690,12 +1685,11 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < ELP_MAX_CARDS; this_dev++) {
-- struct net_device *dev = &dev_3c505[this_dev];
-- if (dev->priv != NULL) {
-+ struct net_device *dev = dev_3c505[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(dev->priv);
-- dev->priv = NULL;
- release_region(dev->base_addr, ELP_IO_EXTENT);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/3c507.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/3c507.c 2003-12-28 23:21:00.000000000 -0800
-@@ -74,10 +74,6 @@ static unsigned int net_debug = NET_DEBU
- #define debug net_debug
-
-
--/* A zero-terminated list of common I/O addresses to be probed. */
--static unsigned int netcard_portlist[] __initdata =
-- { 0x300, 0x320, 0x340, 0x280, 0};
--
- /*
- Details of the i82586.
-
-@@ -286,8 +282,6 @@ static unsigned short init_words[] = {
-
- /* Index to functions, as function prototypes. */
-
--extern int el16_probe(struct net_device *dev); /* Called from Space.c */
--
- static int el16_probe1(struct net_device *dev, int ioaddr);
- static int el16_open(struct net_device *dev);
- static int el16_send_packet(struct sk_buff *skb, struct net_device *dev);
-@@ -301,6 +295,10 @@ static void hardware_send_packet(struct
- static void init_82586_mem(struct net_device *dev);
- static struct ethtool_ops netdev_ethtool_ops;
-
-+static int io = 0x300;
-+static int irq;
-+static int mem_start;
-+
- \f
- /* Check for a network adaptor of this type, and return '0' iff one exists.
- If dev->base_addr == 0, probe all likely locations.
-@@ -309,23 +307,50 @@ static struct ethtool_ops netdev_ethtool
- device and return success.
- */
-
--int __init el16_probe(struct net_device *dev)
-+struct net_device * __init el16_probe(int unit)
- {
-- int base_addr = dev->base_addr;
-- int i;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-+ static unsigned ports[] = { 0x300, 0x320, 0x340, 0x280, 0};
-+ unsigned *port;
-+ int err = -ENODEV;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ mem_start = dev->mem_start & 15;
-+ }
-
- SET_MODULE_OWNER(dev);
-
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return el16_probe1(dev, base_addr);
-- else if (base_addr != 0)
-- return -ENXIO; /* Don't probe at all. */
--
-- for (i = 0; netcard_portlist[i]; i++)
-- if (el16_probe1(dev, netcard_portlist[i]) == 0)
-- return 0;
-+ if (io > 0x1ff) /* Check a single specified location. */
-+ err = el16_probe1(dev, io);
-+ else if (io != 0)
-+ err = -ENXIO; /* Don't probe at all. */
-+ else {
-+ for (port = ports; *port; port++) {
-+ err = el16_probe1(dev, *port);
-+ if (!err)
-+ break;
-+ }
-+ }
-
-- return -ENODEV;
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, EL16_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int __init el16_probe1(struct net_device *dev, int ioaddr)
-@@ -383,8 +408,8 @@ static int __init el16_probe1(struct net
- printk(" %02x", dev->dev_addr[i]);
- }
-
-- if ((dev->mem_start & 0xf) > 0)
-- net_debug = dev->mem_start & 7;
-+ if (mem_start)
-+ net_debug = mem_start & 7;
-
- #ifdef MEM_BASE
- dev->mem_start = MEM_BASE;
-@@ -416,27 +441,18 @@ static int __init el16_probe1(struct net
- if (net_debug)
- printk(version);
-
-- /* Initialize the device structure. */
-- lp = dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (dev->priv == NULL) {
-- retval = -ENOMEM;
-- goto out;
-- }
-- memset(dev->priv, 0, sizeof(struct net_local));
-+ lp = dev->priv;
-+ memset(lp, 0, sizeof(*lp));
- spin_lock_init(&lp->lock);
-
-- dev->open = el16_open;
-- dev->stop = el16_close;
-+ dev->open = el16_open;
-+ dev->stop = el16_close;
- dev->hard_start_xmit = el16_send_packet;
- dev->get_stats = el16_get_stats;
- dev->tx_timeout = el16_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
- dev->ethtool_ops = &netdev_ethtool_ops;
--
-- ether_setup(dev); /* Generic ethernet behaviour */
--
-- dev->flags&=~IFF_MULTICAST; /* Multicast doesn't work */
--
-+ dev->flags &= ~IFF_MULTICAST; /* Multicast doesn't work */
- return 0;
- out:
- release_region(ioaddr, EL16_IO_EXTENT);
-@@ -899,9 +915,7 @@ static struct ethtool_ops netdev_ethtool
- };
-
- #ifdef MODULE
--static struct net_device dev_3c507;
--static int io = 0x300;
--static int irq;
-+static struct net_device *dev_3c507;
- MODULE_PARM(io, "i");
- MODULE_PARM(irq, "i");
- MODULE_PARM_DESC(io, "EtherLink16 I/O base address");
-@@ -911,26 +925,18 @@ int init_module(void)
- {
- if (io == 0)
- printk("3c507: You should not use auto-probing with insmod!\n");
-- dev_3c507.base_addr = io;
-- dev_3c507.irq = irq;
-- dev_3c507.init = el16_probe;
-- if (register_netdev(&dev_3c507) != 0) {
-- printk("3c507: register_netdev() returned non-zero.\n");
-- return -EIO;
-- }
-- return 0;
-+ dev_3c507 = el16_probe(-1);
-+ return IS_ERR(dev_3c507) ? PTR_ERR(dev_3c507) : 0;
- }
-
- void
- cleanup_module(void)
- {
-- unregister_netdev(&dev_3c507);
-- kfree(dev_3c507.priv);
-- dev_3c507.priv = NULL;
--
-- /* If we don't do this, we can't re-insmod it later. */
-- free_irq(dev_3c507.irq, &dev_3c507);
-- release_region(dev_3c507.base_addr, EL16_IO_EXTENT);
-+ struct net_device *dev = dev_3c507;
-+ unregister_netdev(dev);
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, EL16_IO_EXTENT);
-+ free_netdev(dev);
- }
- #endif /* MODULE */
- MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/net/3c515.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/net/3c515.c 2003-12-28 23:21:00.000000000 -0800
-@@ -307,7 +307,8 @@ struct boom_tx_desc {
-
- struct corkscrew_private {
- const char *product_name;
-- struct net_device *next_module;
-+ struct list_head list;
-+ struct net_device *our_dev;
- /* The Rx and Tx rings are here to keep them quad-word-aligned. */
- struct boom_rx_desc rx_ring[RX_RING_SIZE];
- struct boom_tx_desc tx_ring[TX_RING_SIZE];
-@@ -329,6 +330,7 @@ struct corkscrew_private {
- full_bus_master_tx:1, full_bus_master_rx:1, /* Boomerang */
- tx_full:1;
- spinlock_t lock;
-+ struct device *dev;
- };
-
- /* The action to take with a media selection timer tick.
-@@ -367,17 +369,12 @@ static struct isapnp_device_id corkscrew
-
- MODULE_DEVICE_TABLE(isapnp, corkscrew_isapnp_adapters);
-
--static int corkscrew_isapnp_phys_addr[3];
--
- static int nopnp;
- #endif /* __ISAPNP__ */
-
--static int corkscrew_scan(struct net_device *dev);
--static struct net_device *corkscrew_found_device(struct net_device *dev,
-- int ioaddr, int irq,
-- int product_index,
-- int options);
--static int corkscrew_probe1(struct net_device *dev);
-+static struct net_device *corkscrew_scan(int unit);
-+static void corkscrew_setup(struct net_device *dev, int ioaddr,
-+ struct pnp_dev *idev, int card_number);
- static int corkscrew_open(struct net_device *dev);
- static void corkscrew_timer(unsigned long arg);
- static int corkscrew_start_xmit(struct sk_buff *skb,
-@@ -413,47 +410,99 @@ static int options[MAX_UNITS] = { -1, -1
- #ifdef MODULE
- static int debug = -1;
- /* A list of all installed Vortex devices, for removing the driver module. */
--static struct net_device *root_corkscrew_dev;
-+/* we will need locking (and refcounting) if we ever use it for more */
-+static LIST_HEAD(root_corkscrew_dev);
-
- int init_module(void)
- {
-- int cards_found;
--
-+ int found = 0;
- if (debug >= 0)
- corkscrew_debug = debug;
- if (corkscrew_debug)
- printk(version);
--
-- root_corkscrew_dev = NULL;
-- cards_found = corkscrew_scan(NULL);
-- return cards_found ? 0 : -ENODEV;
-+ while (corkscrew_scan(-1))
-+ found++;
-+ return found ? 0 : -ENODEV;
- }
-
- #else
--int tc515_probe(struct net_device *dev)
-+struct net_device *tc515_probe(int unit)
- {
-- int cards_found = 0;
-+ struct net_device *dev = corkscrew_scan(unit);
-+ static int printed;
-
-- SET_MODULE_OWNER(dev);
--
-- cards_found = corkscrew_scan(dev);
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-
-- if (corkscrew_debug > 0 && cards_found)
-+ if (corkscrew_debug > 0 && !printed) {
-+ printed = 1;
- printk(version);
-+ }
-
-- return cards_found ? 0 : -ENODEV;
-+ return dev;
- }
- #endif /* not MODULE */
-
--static int corkscrew_scan(struct net_device *dev)
-+static int check_device(unsigned ioaddr)
-+{
-+ int timer;
-+
-+ if (!request_region(ioaddr, CORKSCREW_TOTAL_SIZE, "3c515"))
-+ return 0;
-+ /* Check the resource configuration for a matching ioaddr. */
-+ if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0)) {
-+ release_region(ioaddr, CORKSCREW_TOTAL_SIZE);
-+ return 0;
-+ }
-+ /* Verify by reading the device ID from the EEPROM. */
-+ outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd);
-+ /* Pause for at least 162 us. for the read to take place. */
-+ for (timer = 4; timer >= 0; timer--) {
-+ udelay(162);
-+ if ((inw(ioaddr + Wn0EepromCmd) & 0x0200) == 0)
-+ break;
-+ }
-+ if (inw(ioaddr + Wn0EepromData) != 0x6d50) {
-+ release_region(ioaddr, CORKSCREW_TOTAL_SIZE);
-+ return 0;
-+ }
-+ return 1;
-+}
-+
-+static void cleanup_card(struct net_device *dev)
- {
-- int cards_found = 0;
-+ struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv;
-+ list_del_init(&vp->list);
-+ if (dev->dma)
-+ free_dma(dev->dma);
-+ outw(TotalReset, dev->base_addr + EL3_CMD);
-+ release_region(dev->base_addr, CORKSCREW_TOTAL_SIZE);
-+ if (vp->dev)
-+ pnp_device_detach(to_pnp_dev(vp->dev));
-+}
-+
-+static struct net_device *corkscrew_scan(int unit)
-+{
-+ struct net_device *dev;
-+ static int cards_found = 0;
- static int ioaddr;
-+ int err;
- #ifdef __ISAPNP__
- short i;
- static int pnp_cards;
- #endif
-
-+ dev = alloc_etherdev(sizeof(struct corkscrew_private));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-+
-+ SET_MODULE_OWNER(dev);
-+
- #ifdef __ISAPNP__
- if(nopnp == 1)
- goto no_pnp;
-@@ -470,7 +519,7 @@ static int corkscrew_scan(struct net_dev
- if (pnp_activate_dev(idev) < 0) {
- printk("pnp activate failed (out of resources?)\n");
- pnp_device_detach(idev);
-- return -ENOMEM;
-+ continue;
- }
- if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0)) {
- pnp_device_detach(idev);
-@@ -478,40 +527,22 @@ static int corkscrew_scan(struct net_dev
- }
- ioaddr = pnp_port_start(idev, 0);
- irq = pnp_irq(idev, 0);
-- if(corkscrew_debug)
-- printk ("ISAPNP reports %s at i/o 0x%x, irq %d\n",
-- (char*) corkscrew_isapnp_adapters[i].driver_data, ioaddr, irq);
--
-- if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0)) {
-+ if (!check_device(ioaddr)) {
- pnp_device_detach(idev);
- continue;
- }
-- /* Verify by reading the device ID from the EEPROM. */
-- {
-- int timer;
-- outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd);
-- /* Pause for at least 162 us. for the read to take place. */
-- for (timer = 4; timer >= 0; timer--) {
-- udelay(162);
-- if ((inw(ioaddr + Wn0EepromCmd) & 0x0200)
-- == 0)
-- break;
-- }
-- if (inw(ioaddr + Wn0EepromData) != 0x6d50) {
-- pnp_device_detach(idev);
-- continue;
-- }
-- }
-+ if(corkscrew_debug)
-+ printk ("ISAPNP reports %s at i/o 0x%x, irq %d\n",
-+ (char*) corkscrew_isapnp_adapters[i].driver_data, ioaddr, irq);
- printk(KERN_INFO "3c515 Resource configuration register %#4.4x, DCR %4.4x.\n",
- inl(ioaddr + 0x2002), inw(ioaddr + 0x2000));
- /* irq = inw(ioaddr + 0x2002) & 15; */ /* Use the irq from isapnp */
-- corkscrew_isapnp_phys_addr[pnp_cards] = ioaddr;
-- corkscrew_found_device(dev, ioaddr, irq, CORKSCREW_ID, dev
-- && dev->mem_start ? dev->
-- mem_start : options[cards_found]);
-- dev = 0;
-+ corkscrew_setup(dev, ioaddr, idev, cards_found++);
- pnp_cards++;
-- cards_found++;
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-+ cleanup_card(dev);
- }
- }
- no_pnp:
-@@ -519,122 +550,64 @@ no_pnp:
-
- /* Check all locations on the ISA bus -- evil! */
- for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x20) {
-- int irq;
--#ifdef __ISAPNP__
-- /* Make sure this was not already picked up by isapnp */
-- if(ioaddr == corkscrew_isapnp_phys_addr[0]) continue;
-- if(ioaddr == corkscrew_isapnp_phys_addr[1]) continue;
-- if(ioaddr == corkscrew_isapnp_phys_addr[2]) continue;
--#endif /* __ISAPNP__ */
-- if (check_region(ioaddr, CORKSCREW_TOTAL_SIZE))
-+ if (!check_device(ioaddr))
- continue;
-- /* Check the resource configuration for a matching ioaddr. */
-- if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0))
-- continue;
-- /* Verify by reading the device ID from the EEPROM. */
-- {
-- int timer;
-- outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd);
-- /* Pause for at least 162 us. for the read to take place. */
-- for (timer = 4; timer >= 0; timer--) {
-- udelay(162);
-- if ((inw(ioaddr + Wn0EepromCmd) & 0x0200)
-- == 0)
-- break;
-- }
-- if (inw(ioaddr + Wn0EepromData) != 0x6d50)
-- continue;
-- }
-+
- printk(KERN_INFO "3c515 Resource configuration register %#4.4x, DCR %4.4x.\n",
- inl(ioaddr + 0x2002), inw(ioaddr + 0x2000));
-- irq = inw(ioaddr + 0x2002) & 15;
-- corkscrew_found_device(dev, ioaddr, irq, CORKSCREW_ID,
-- dev && dev->mem_start ? dev->mem_start :
-- (cards_found >= MAX_UNITS ? -1 :
-- options[cards_found]));
-- dev = 0;
-- cards_found++;
-+ corkscrew_setup(dev, ioaddr, NULL, cards_found++);
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-+ cleanup_card(dev);
- }
-- if (corkscrew_debug)
-- printk(KERN_INFO "%d 3c515 cards found.\n", cards_found);
-- return cards_found;
-+ free_netdev(dev);
-+ return NULL;
- }
-
--static struct net_device *corkscrew_found_device(struct net_device *dev,
-- int ioaddr, int irq,
-- int product_index,
-- int options)
-+static void corkscrew_setup(struct net_device *dev, int ioaddr,
-+ struct pnp_dev *idev, int card_number)
- {
-- struct corkscrew_private *vp;
--
--#ifdef MODULE
-- /* Allocate and fill new device structure. */
-- int dev_size = sizeof(struct net_device) + sizeof(struct corkscrew_private) + 15; /* Pad for alignment */
-+ struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv;
-+ unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */
-+ int i;
-+ int irq;
-
-- dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL);
-- if (!dev)
-- return NULL;
-- memset(dev, 0, dev_size);
-- /* Align the Rx and Tx ring entries. */
-- dev->priv = (void *) (((long) dev + sizeof(struct net_device) + 15) & ~15);
-- vp = (struct corkscrew_private *) dev->priv;
-- dev->base_addr = ioaddr;
-- dev->irq = irq;
-- dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0);
-- dev->init = corkscrew_probe1;
-- vp->product_name = "3c515";
-- vp->options = options;
-- if (options >= 0) {
-- vp->media_override = ((options & 7) == 2) ? 0 : options & 7;
-- vp->full_duplex = (options & 8) ? 1 : 0;
-- vp->bus_master = (options & 16) ? 1 : 0;
-+ if (idev) {
-+ irq = pnp_irq(idev, 0);
-+ vp->dev = &idev->dev;
- } else {
-- vp->media_override = 7;
-- vp->full_duplex = 0;
-- vp->bus_master = 0;
-+ irq = inw(ioaddr + 0x2002) & 15;
- }
-- ether_setup(dev);
-- vp->next_module = root_corkscrew_dev;
-- root_corkscrew_dev = dev;
-- SET_MODULE_OWNER(dev);
-- if (register_netdev(dev) != 0) {
-- kfree(dev);
-- return NULL;
-- }
--#else /* not a MODULE */
-- /* Caution: quad-word alignment required for rings! */
-- dev->priv = kmalloc(sizeof(struct corkscrew_private), GFP_KERNEL);
-- if (!dev->priv)
-- return NULL;
-- memset(dev->priv, 0, sizeof(struct corkscrew_private));
-- dev = init_etherdev(dev, sizeof(struct corkscrew_private));
-+
- dev->base_addr = ioaddr;
- dev->irq = irq;
-- dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0);
-- vp = (struct corkscrew_private *) dev->priv;
-+ dev->dma = inw(ioaddr + 0x2000) & 7;
- vp->product_name = "3c515";
-- vp->options = options;
-- if (options >= 0) {
-- vp->media_override = ((options & 7) == 2) ? 0 : options & 7;
-- vp->full_duplex = (options & 8) ? 1 : 0;
-- vp->bus_master = (options & 16) ? 1 : 0;
-+ vp->options = dev->mem_start;
-+ vp->our_dev = dev;
-+
-+ if (!vp->options) {
-+ if (card_number >= MAX_UNITS)
-+ vp->options = -1;
-+ else
-+ vp->options = options[card_number];
-+ }
-+
-+ if (vp->options >= 0) {
-+ vp->media_override = vp->options & 7;
-+ if (vp->media_override == 2)
-+ vp->media_override = 0;
-+ vp->full_duplex = (vp->options & 8) ? 1 : 0;
-+ vp->bus_master = (vp->options & 16) ? 1 : 0;
- } else {
- vp->media_override = 7;
- vp->full_duplex = 0;
- vp->bus_master = 0;
- }
--
-- corkscrew_probe1(dev);
--#endif /* MODULE */
-- return dev;
--}
--
--static int corkscrew_probe1(struct net_device *dev)
--{
-- int ioaddr = dev->base_addr;
-- struct corkscrew_private *vp = (struct corkscrew_private *) dev->priv;
-- unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */
-- int i;
-+#ifdef MODULE
-+ list_add(&vp->list, &root_corkscrew_dev);
-+#endif
-
- printk(KERN_INFO "%s: 3Com %s at %#3x,", dev->name, vp->product_name, ioaddr);
-
-@@ -706,9 +679,6 @@ static int corkscrew_probe1(struct net_d
- /* vp->full_bus_master_rx = 0; */
- vp->full_bus_master_rx = (vp->capabilities & 0x20) ? 1 : 0;
-
-- /* We do a request_region() to register /proc/ioports info. */
-- request_region(ioaddr, CORKSCREW_TOTAL_SIZE, vp->product_name);
--
- /* The 3c51x-specific entries in the device structure. */
- dev->open = &corkscrew_open;
- dev->hard_start_xmit = &corkscrew_start_xmit;
-@@ -718,8 +688,6 @@ static int corkscrew_probe1(struct net_d
- dev->get_stats = &corkscrew_get_stats;
- dev->set_multicast_list = &set_rx_mode;
- dev->ethtool_ops = &netdev_ethtool_ops;
--
-- return 0;
- }
- \f
-
-@@ -1607,20 +1575,16 @@ static struct ethtool_ops netdev_ethtool
- #ifdef MODULE
- void cleanup_module(void)
- {
-- struct net_device *next_dev;
--
-- while (root_corkscrew_dev) {
-- next_dev =
-- ((struct corkscrew_private *) root_corkscrew_dev->
-- priv)->next_module;
-- if (root_corkscrew_dev->dma)
-- free_dma(root_corkscrew_dev->dma);
-- unregister_netdev(root_corkscrew_dev);
-- outw(TotalReset, root_corkscrew_dev->base_addr + EL3_CMD);
-- release_region(root_corkscrew_dev->base_addr,
-- CORKSCREW_TOTAL_SIZE);
-- free_netdev(root_corkscrew_dev);
-- root_corkscrew_dev = next_dev;
-+ while (!list_empty(&root_corkscrew_dev)) {
-+ struct net_device *dev;
-+ struct corkscrew_private *vp;
-+
-+ vp = list_entry(root_corkscrew_dev.next,
-+ struct corkscrew_private, list);
-+ dev = vp->our_dev;
-+ unregister_netdev(dev);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/3c523.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/3c523.c 2003-12-28 23:21:00.000000000 -0800
-@@ -410,7 +410,7 @@ static int elmc_getinfo(char *buf, int s
-
- /*****************************************************************/
-
--int __init elmc_probe(struct net_device *dev)
-+static int __init do_elmc_probe(struct net_device *dev)
- {
- static int slot;
- int base_addr = dev->base_addr;
-@@ -420,7 +420,7 @@ int __init elmc_probe(struct net_device
- int i = 0;
- unsigned int size = 0;
- int retval;
-- struct priv *pr;
-+ struct priv *pr = dev->priv;
-
- SET_MODULE_OWNER(dev);
- if (MCA_bus == 0) {
-@@ -455,10 +455,9 @@ int __init elmc_probe(struct net_device
- }
-
- /* we didn't find any 3c523 in the slots we checked for */
-- if (slot == MCA_NOTFOUND) {
-- retval = ((base_addr || irq) ? -ENXIO : -ENODEV);
-- goto err_out;
-- }
-+ if (slot == MCA_NOTFOUND)
-+ return ((base_addr || irq) ? -ENXIO : -ENODEV);
-+
- mca_set_adapter_name(slot, "3Com 3c523 Etherlink/MC");
- mca_set_adapter_procfn(slot, (MCA_ProcFn) elmc_getinfo, dev);
-
-@@ -497,13 +496,7 @@ int __init elmc_probe(struct net_device
- break;
- }
-
-- pr = dev->priv = kmalloc(sizeof(struct priv), GFP_KERNEL);
-- if (dev->priv == NULL) {
-- retval = -ENOMEM;
-- goto err_out;
-- }
- memset(pr, 0, sizeof(struct priv));
--
- pr->slot = slot;
-
- printk(KERN_INFO "%s: 3Com 3c523 Rev 0x%x at %#lx\n", dev->name, (int) revision,
-@@ -530,8 +523,6 @@ int __init elmc_probe(struct net_device
- if (!check586(dev, dev->mem_start, size)) {
- printk(KERN_ERR "%s: memprobe, Can't find memory at 0x%lx!\n", dev->name,
- dev->mem_start);
-- kfree(dev->priv);
-- dev->priv = NULL;
- retval = -ENODEV;
- goto err_out;
- }
-@@ -573,8 +564,6 @@ int __init elmc_probe(struct net_device
- #endif
- dev->ethtool_ops = &netdev_ethtool_ops;
-
-- ether_setup(dev);
--
- /* note that we haven't actually requested the IRQ from the kernel.
- That gets done in elmc_open(). I'm not sure that's such a good idea,
- but it works, so I'll go with it. */
-@@ -585,9 +574,41 @@ int __init elmc_probe(struct net_device
-
- return 0;
- err_out:
-+ mca_set_adapter_procfn(slot, NULL, NULL);
- release_region(dev->base_addr, ELMC_IO_EXTENT);
- return retval;
- }
-+
-+static void cleanup_card(struct net_device *dev)
-+{
-+ mca_set_adapter_procfn(((struct priv *) (dev->priv))->slot, NULL, NULL);
-+ release_region(dev->base_addr, ELMC_IO_EXTENT);
-+}
-+
-+struct net_device * __init elmc_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct priv));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_elmc_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-
- /**********************************************
- * init the chip (elmc-interrupt should be disabled?!)
-@@ -1245,7 +1266,7 @@ static struct ethtool_ops netdev_ethtool
- /* Increase if needed ;) */
- #define MAX_3C523_CARDS 4
-
--static struct net_device dev_elmc[MAX_3C523_CARDS];
-+static struct net_device *dev_elmc[MAX_3C523_CARDS];
- static int irq[MAX_3C523_CARDS];
- static int io[MAX_3C523_CARDS];
- MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_3C523_CARDS) "i");
-@@ -1258,16 +1279,24 @@ int init_module(void)
- int this_dev,found = 0;
-
- /* Loop until we either can't find any more cards, or we have MAX_3C523_CARDS */
-- for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++)
-- {
-- struct net_device *dev = &dev_elmc[this_dev];
-+ for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++) {
-+ struct net_device *dev = alloc_etherdev(sizeof(struct priv));
-+ if (!dev)
-+ break;
- dev->irq=irq[this_dev];
- dev->base_addr=io[this_dev];
-- dev->init=elmc_probe;
-- if(register_netdev(dev)!=0) {
-- if(io[this_dev]==0) break;
-- printk(KERN_WARNING "3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]);
-- } else found++;
-+ if (do_elmc_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_elmc[this_dev] = dev;
-+ found++;
-+ continue;
-+ }
-+ cleanup_card(dev);
-+ }
-+ free_netdev(dev);
-+ if (io[this_dev]==0)
-+ break;
-+ printk(KERN_WARNING "3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]);
- }
-
- if(found==0) {
-@@ -1279,31 +1308,12 @@ int init_module(void)
- void cleanup_module(void)
- {
- int this_dev;
-- for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++) {
--
-- struct net_device *dev = &dev_elmc[this_dev];
-- if(dev->priv) {
-- /* shutdown interrupts on the card */
-- elmc_id_reset586();
-- if (dev->irq != 0) {
-- /* this should be done by close, but if we failed to
-- initialize properly something may have gotten hosed. */
-- free_irq(dev->irq, dev);
-- dev->irq = 0;
-- }
-- if (dev->base_addr != 0) {
-- release_region(dev->base_addr, ELMC_IO_EXTENT);
-- dev->base_addr = 0;
-- }
-- irq[this_dev] = 0;
-- io[this_dev] = 0;
-+ for (this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++) {
-+ struct net_device *dev = dev_elmc[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
--
-- mca_set_adapter_procfn(((struct priv *) (dev->priv))->slot,
-- NULL, NULL);
--
-- kfree(dev->priv);
-- dev->priv = NULL;
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/3c527.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/3c527.c 2003-12-28 23:21:00.000000000 -0800
-@@ -1,9 +1,10 @@
--/* 3c527.c: 3Com Etherlink/MC32 driver for Linux 2.4
-+/* 3c527.c: 3Com Etherlink/MC32 driver for Linux 2.4 and 2.6.
- *
- * (c) Copyright 1998 Red Hat Software Inc
- * Written by Alan Cox.
- * Further debugging by Carl Drougge.
-- * Modified by Richard Procter (rnp@netlink.co.nz)
-+ * Initial SMP support by Felipe W Damasio <felipewd@terra.com.br>
-+ * Heavily modified by Richard Procter <rnp@paradise.net.nz>
- *
- * Based on skeleton.c written 1993-94 by Donald Becker and ne2.c
- * (for the MCA stuff) written by Wim Dumon.
-@@ -17,11 +18,11 @@
- */
-
- #define DRV_NAME "3c527"
--#define DRV_VERSION "0.6a"
--#define DRV_RELDATE "2001/11/17"
-+#define DRV_VERSION "0.7-SMP"
-+#define DRV_RELDATE "2003/09/21"
-
- static const char *version =
--DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Richard Proctor (rnp@netlink.co.nz)\n";
-+DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Richard Procter <rnp@paradise.net.nz>\n";
-
- /**
- * DOC: Traps for the unwary
-@@ -100,7 +101,9 @@ DRV_NAME ".c:v" DRV_VERSION " " DRV_RELD
- #include <linux/string.h>
- #include <linux/wait.h>
- #include <linux/ethtool.h>
-+#include <linux/completion.h>
-
-+#include <asm/semaphore.h>
- #include <asm/uaccess.h>
- #include <asm/system.h>
- #include <asm/bitops.h>
-@@ -143,19 +146,19 @@ static unsigned int mc32_debug = NET_DEB
- static const int WORKAROUND_82586=1;
-
- /* Pointers to buffers and their on-card records */
--
- struct mc32_ring_desc
- {
- volatile struct skb_header *p;
- struct sk_buff *skb;
- };
-
--
- /* Information that needs to be kept for each board. */
- struct mc32_local
- {
-- struct net_device_stats net_stats;
- int slot;
-+
-+ u32 base;
-+ struct net_device_stats net_stats;
- volatile struct mc32_mailbox *rx_box;
- volatile struct mc32_mailbox *tx_box;
- volatile struct mc32_mailbox *exec_box;
-@@ -165,22 +168,23 @@ struct mc32_local
- u16 tx_len; /* Transmit list count */
- u16 rx_len; /* Receive list count */
-
-- u32 base;
-- u16 exec_pending;
-- u16 mc_reload_wait; /* a multicast load request is pending */
-+ u16 xceiver_desired_state; /* HALTED or RUNNING */
-+ u16 cmd_nonblocking; /* Thread is uninterested in command result */
-+ u16 mc_reload_wait; /* A multicast load request is pending */
- u32 mc_list_valid; /* True when the mclist is set */
-- u16 xceiver_state; /* Current transceiver state. bitmapped */
-- u16 desired_state; /* The state we want the transceiver to be in */
-- atomic_t tx_count; /* buffers left */
-- wait_queue_head_t event;
-
- struct mc32_ring_desc tx_ring[TX_RING_LEN]; /* Host Transmit ring */
- struct mc32_ring_desc rx_ring[RX_RING_LEN]; /* Host Receive ring */
-
-+ atomic_t tx_count; /* buffers left */
-+ atomic_t tx_ring_head; /* index to tx en-queue end */
- u16 tx_ring_tail; /* index to tx de-queue end */
-- u16 tx_ring_head; /* index to tx en-queue end */
-
- u16 rx_ring_tail; /* index to rx de-queue end */
-+
-+ struct semaphore cmd_mutex; /* Serialises issuing of execute commands */
-+ struct completion execution_cmd; /* Card has completed an execute command */
-+ struct completion xceiver_cmd; /* Card has completed a tx or rx command */
- };
-
- /* The station (ethernet) address prefix, used for a sanity check. */
-@@ -208,8 +212,6 @@ static inline u16 next_tx(u16 tx) { retu
-
-
- /* Index to functions, as function prototypes. */
--extern int mc32_probe(struct net_device *dev);
--
- static int mc32_probe1(struct net_device *dev, int ioaddr);
- static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len);
- static int mc32_open(struct net_device *dev);
-@@ -222,9 +224,19 @@ static void mc32_set_multicast_list(stru
- static void mc32_reset_multicast_list(struct net_device *dev);
- static struct ethtool_ops netdev_ethtool_ops;
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ struct mc32_local *lp=dev->priv;
-+ unsigned slot = lp->slot;
-+ mca_mark_as_unused(slot);
-+ mca_set_adapter_name(slot, NULL);
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, MC32_IO_EXTENT);
-+}
-+
- /**
- * mc32_probe - Search for supported boards
-- * @dev: device to probe
-+ * @unit: interface number to use
- *
- * Because MCA bus is a real bus and we can scan for cards we could do a
- * single scan for all boards here. Right now we use the passed in device
-@@ -232,11 +244,18 @@ static struct ethtool_ops netdev_ethtool
- * in particular.
- */
-
--int __init mc32_probe(struct net_device *dev)
-+struct net_device *__init mc32_probe(int unit)
- {
-+ struct net_device *dev = alloc_etherdev(sizeof(struct mc32_local));
- static int current_mca_slot = -1;
- int i;
-- int adapter_found = 0;
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0)
-+ sprintf(dev->name, "eth%d", unit);
-
- SET_MODULE_OWNER(dev);
-
-@@ -247,22 +266,28 @@ int __init mc32_probe(struct net_device
- Autodetecting MCA cards is extremely simple.
- Just search for the card. */
-
-- for(i = 0; (mc32_adapters[i].name != NULL) && !adapter_found; i++) {
-+ for(i = 0; (mc32_adapters[i].name != NULL); i++) {
- current_mca_slot =
- mca_find_unused_adapter(mc32_adapters[i].id, 0);
-
-- if((current_mca_slot != MCA_NOTFOUND) && !adapter_found) {
-+ if(current_mca_slot != MCA_NOTFOUND) {
- if(!mc32_probe1(dev, current_mca_slot))
- {
- mca_set_adapter_name(current_mca_slot,
- mc32_adapters[i].name);
- mca_mark_as_used(current_mca_slot);
-- return 0;
-+ err = register_netdev(dev);
-+ if (err) {
-+ cleanup_card(dev);
-+ free_netdev(dev);
-+ dev = ERR_PTR(err);
-+ }
-+ return dev;
- }
-
- }
- }
-- return -ENODEV;
-+ return ERR_PTR(-ENODEV);
- }
-
- /**
-@@ -282,7 +307,7 @@ static int __init mc32_probe1(struct net
- int i, err;
- u8 POS;
- u32 base;
-- struct mc32_local *lp;
-+ struct mc32_local *lp = dev->priv;
- static u16 mca_io_bases[]={
- 0x7280,0x7290,
- 0x7680,0x7690,
-@@ -409,24 +434,14 @@ static int __init mc32_probe1(struct net
- * Grab the IRQ
- */
-
-- i = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ, dev->name, dev);
-- if (i) {
-+ err = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
-+ if (err) {
- release_region(dev->base_addr, MC32_IO_EXTENT);
- printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq);
-- return i;
-+ goto err_exit_ports;
- }
-
--
-- /* Initialize the device structure. */
-- dev->priv = kmalloc(sizeof(struct mc32_local), GFP_KERNEL);
-- if (dev->priv == NULL)
-- {
-- err = -ENOMEM;
-- goto err_exit_irq;
-- }
--
-- memset(dev->priv, 0, sizeof(struct mc32_local));
-- lp = dev->priv;
-+ memset(lp, 0, sizeof(struct mc32_local));
- lp->slot = slot;
-
- i=0;
-@@ -440,7 +455,7 @@ static int __init mc32_probe1(struct net
- {
- printk(KERN_ERR "%s: failed to boot adapter.\n", dev->name);
- err = -ENODEV;
-- goto err_exit_free;
-+ goto err_exit_irq;
- }
- udelay(1000);
- if(inb(dev->base_addr+2)&(1<<5))
-@@ -455,7 +470,7 @@ static int __init mc32_probe1(struct net
- else
- printk(KERN_ERR "%s: unknown failure %d.\n", dev->name, base);
- err = -ENODEV;
-- goto err_exit_free;
-+ goto err_exit_irq;
- }
-
- base=0;
-@@ -471,7 +486,7 @@ static int __init mc32_probe1(struct net
- {
- printk(KERN_ERR "%s: mailbox read fail (%d).\n", dev->name, i);
- err = -ENODEV;
-- goto err_exit_free;
-+ goto err_exit_irq;
- }
- }
-
-@@ -498,7 +513,9 @@ static int __init mc32_probe1(struct net
- lp->tx_len = lp->exec_box->data[9]; /* Transmit list count */
- lp->rx_len = lp->exec_box->data[11]; /* Receive list count */
-
-- init_waitqueue_head(&lp->event);
-+ init_MUTEX_LOCKED(&lp->cmd_mutex);
-+ init_completion(&lp->execution_cmd);
-+ init_completion(&lp->xceiver_cmd);
-
- printk("%s: Firmware Rev %d. %d RX buffers, %d TX buffers. Base of 0x%08X.\n",
- dev->name, lp->exec_box->data[12], lp->rx_len, lp->tx_len, lp->base);
-@@ -511,20 +528,12 @@ static int __init mc32_probe1(struct net
- dev->tx_timeout = mc32_timeout;
- dev->watchdog_timeo = HZ*5; /* Board does all the work */
- dev->ethtool_ops = &netdev_ethtool_ops;
--
-- lp->xceiver_state = HALTED;
--
-- lp->tx_ring_tail=lp->tx_ring_head=0;
-
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--
- return 0;
-
--err_exit_free:
-- kfree(dev->priv);
- err_exit_irq:
- free_irq(dev->irq, dev);
-+err_exit_ports:
- release_region(dev->base_addr, MC32_IO_EXTENT);
- return err;
- }
-@@ -539,7 +548,7 @@ err_exit_irq:
- * status of any pending commands and takes very little time at all.
- */
-
--static void mc32_ready_poll(struct net_device *dev)
-+static inline void mc32_ready_poll(struct net_device *dev)
- {
- int ioaddr = dev->base_addr;
- while(!(inb(ioaddr+HOST_STATUS)&HOST_STATUS_CRR));
-@@ -554,31 +563,38 @@ static void mc32_ready_poll(struct net_d
- * @len: Length of the data block
- *
- * Send a command from interrupt state. If there is a command
-- * currently being executed then we return an error of -1. It simply
-- * isn't viable to wait around as commands may be slow. Providing we
-- * get in, we busy wait for the board to become ready to accept the
-- * command and issue it. We do not wait for the command to complete
-- * --- the card will interrupt us when it's done.
-+ * currently being executed then we return an error of -1. It
-+ * simply isn't viable to wait around as commands may be
-+ * slow. This can theoretically be starved on SMP, but it's hard
-+ * to see a realistic situation. We do not wait for the command
-+ * to complete --- we rely on the interrupt handler to tidy up
-+ * after us.
- */
-
- static int mc32_command_nowait(struct net_device *dev, u16 cmd, void *data, int len)
- {
- struct mc32_local *lp = (struct mc32_local *)dev->priv;
- int ioaddr = dev->base_addr;
-+ int ret = -1;
-
-- if(lp->exec_pending)
-- return -1;
--
-- lp->exec_pending=3;
-- lp->exec_box->mbox=0;
-- lp->exec_box->mbox=cmd;
-- memcpy((void *)lp->exec_box->data, data, len);
-- barrier(); /* the memcpy forgot the volatile so be sure */
-+ if (down_trylock(&lp->cmd_mutex) == 0)
-+ {
-+ lp->cmd_nonblocking=1;
-+ lp->exec_box->mbox=0;
-+ lp->exec_box->mbox=cmd;
-+ memcpy((void *)lp->exec_box->data, data, len);
-+ barrier(); /* the memcpy forgot the volatile so be sure */
-+
-+ /* Send the command */
-+ mc32_ready_poll(dev);
-+ outb(1<<6, ioaddr+HOST_CMD);
-
-- /* Send the command */
-- while(!(inb(ioaddr+HOST_STATUS)&HOST_STATUS_CRR));
-- outb(1<<6, ioaddr+HOST_CMD);
-- return 0;
-+ ret = 0;
-+
-+ /* Interrupt handler will signal mutex on completion */
-+ }
-+
-+ return ret;
- }
-
-
-@@ -592,76 +608,47 @@ static int mc32_command_nowait(struct ne
- * Sends exec commands in a user context. This permits us to wait around
- * for the replies and also to wait for the command buffer to complete
- * from a previous command before we execute our command. After our
-- * command completes we will complete any pending multicast reload
-+ * command completes we will attempt any pending multicast reload
- * we blocked off by hogging the exec buffer.
- *
- * You feed the card a command, you wait, it interrupts you get a
- * reply. All well and good. The complication arises because you use
- * commands for filter list changes which come in at bh level from things
- * like IPV6 group stuff.
-- *
-- * We have a simple state machine
-- *
-- * 0 - nothing issued
-- *
-- * 1 - command issued, wait reply
-- *
-- * 2 - reply waiting - reader then goes to state 0
-- *
-- * 3 - command issued, trash reply. In which case the irq
-- * takes it back to state 0
-- *
- */
-
- static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len)
- {
- struct mc32_local *lp = (struct mc32_local *)dev->priv;
- int ioaddr = dev->base_addr;
-- unsigned long flags;
- int ret = 0;
-
-+ down(&lp->cmd_mutex);
-+
- /*
-- * Wait for a command
-- */
--
-- save_flags(flags);
-- cli();
--
-- while(lp->exec_pending)
-- sleep_on(&lp->event);
--
-- /*
-- * Issue mine
-+ * My Turn
- */
-
-- lp->exec_pending=1;
--
-- restore_flags(flags);
--
-+ lp->cmd_nonblocking=0;
- lp->exec_box->mbox=0;
- lp->exec_box->mbox=cmd;
- memcpy((void *)lp->exec_box->data, data, len);
- barrier(); /* the memcpy forgot the volatile so be sure */
-
-- /* Send the command */
-- while(!(inb(ioaddr+HOST_STATUS)&HOST_STATUS_CRR));
-- outb(1<<6, ioaddr+HOST_CMD);
-+ mc32_ready_poll(dev);
-+ outb(1<<6, ioaddr+HOST_CMD);
-
-- save_flags(flags);
-- cli();
--
-- while(lp->exec_pending!=2)
-- sleep_on(&lp->event);
-- lp->exec_pending=0;
-- restore_flags(flags);
-+ wait_for_completion(&lp->execution_cmd);
-
- if(lp->exec_box->mbox&(1<<13))
- ret = -1;
-
-+ up(&lp->cmd_mutex);
-+
- /*
-- * A multicast set got blocked - do it now
-- */
--
-+ * A multicast set got blocked - try it now
-+ */
-+
- if(lp->mc_reload_wait)
- {
- mc32_reset_multicast_list(dev);
-@@ -678,11 +665,9 @@ static int mc32_command(struct net_devic
- * This may be called from the interrupt state, where it is used
- * to restart the rx ring if the card runs out of rx buffers.
- *
-- * First, we check if it's ok to start the transceiver. We then show
-- * the card where to start in the rx ring and issue the
-- * commands to start reception and transmission. We don't wait
-- * around for these to complete.
-- */
-+ * We must first check if it's ok to (re)start the transceiver. See
-+ * mc32_close for details.
-+ */
-
- static void mc32_start_transceiver(struct net_device *dev) {
-
-@@ -690,24 +675,20 @@ static void mc32_start_transceiver(struc
- int ioaddr = dev->base_addr;
-
- /* Ignore RX overflow on device closure */
-- if (lp->desired_state==HALTED)
-+ if (lp->xceiver_desired_state==HALTED)
- return;
-
-+ /* Give the card the offset to the post-EOL-bit RX descriptor */
- mc32_ready_poll(dev);
--
-- lp->tx_box->mbox=0;
- lp->rx_box->mbox=0;
--
-- /* Give the card the offset to the post-EOL-bit RX descriptor */
- lp->rx_box->data[0]=lp->rx_ring[prev_rx(lp->rx_ring_tail)].p->next;
--
- outb(HOST_CMD_START_RX, ioaddr+HOST_CMD);
-
- mc32_ready_poll(dev);
-+ lp->tx_box->mbox=0;
- outb(HOST_CMD_RESTRT_TX, ioaddr+HOST_CMD); /* card ignores this on RX restart */
-
- /* We are not interrupted on start completion */
-- lp->xceiver_state=RUNNING;
- }
-
-
-@@ -727,25 +708,17 @@ static void mc32_halt_transceiver(struct
- {
- struct mc32_local *lp = (struct mc32_local *)dev->priv;
- int ioaddr = dev->base_addr;
-- unsigned long flags;
-
- mc32_ready_poll(dev);
--
-- lp->tx_box->mbox=0;
- lp->rx_box->mbox=0;
--
- outb(HOST_CMD_SUSPND_RX, ioaddr+HOST_CMD);
-+ wait_for_completion(&lp->xceiver_cmd);
-+
- mc32_ready_poll(dev);
-+ lp->tx_box->mbox=0;
- outb(HOST_CMD_SUSPND_TX, ioaddr+HOST_CMD);
--
-- save_flags(flags);
-- cli();
--
-- while(lp->xceiver_state!=HALTED)
-- sleep_on(&lp->event);
--
-- restore_flags(flags);
--}
-+ wait_for_completion(&lp->xceiver_cmd);
-+}
-
-
- /**
-@@ -756,7 +729,7 @@ static void mc32_halt_transceiver(struct
- * the point where mc32_start_transceiver() can be called.
- *
- * The card sets up the receive ring for us. We are required to use the
-- * ring it provides although we can change the size of the ring.
-+ * ring it provides, although the size of the ring is configurable.
- *
- * We allocate an sk_buff for each ring entry in turn and
- * initalise its house-keeping info. At the same time, we read
-@@ -777,7 +750,7 @@ static int mc32_load_rx_ring(struct net_
-
- rx_base=lp->rx_chain;
-
-- for(i=0;i<RX_RING_LEN;i++)
-+ for(i=0; i<RX_RING_LEN; i++)
- {
- lp->rx_ring[i].skb=alloc_skb(1532, GFP_KERNEL);
- skb_reserve(lp->rx_ring[i].skb, 18);
-@@ -814,21 +787,19 @@ static int mc32_load_rx_ring(struct net_
- *
- * Free the buffer for each ring slot. This may be called
- * before mc32_load_rx_ring(), eg. on error in mc32_open().
-+ * Requires rx skb pointers to point to a valid skb, or NULL.
- */
-
- static void mc32_flush_rx_ring(struct net_device *dev)
- {
- struct mc32_local *lp = (struct mc32_local *)dev->priv;
--
-- struct sk_buff *skb;
- int i;
-
- for(i=0; i < RX_RING_LEN; i++)
- {
-- skb = lp->rx_ring[i].skb;
-- if (skb!=NULL) {
-- kfree_skb(skb);
-- skb=NULL;
-+ if (lp->rx_ring[i].skb) {
-+ dev_kfree_skb(lp->rx_ring[i].skb);
-+ lp->rx_ring[i].skb = NULL;
- }
- lp->rx_ring[i].p=NULL;
- }
-@@ -860,7 +831,7 @@ static void mc32_load_tx_ring(struct net
-
- tx_base=lp->tx_box->data[0];
-
-- for(i=0;i<lp->tx_len;i++)
-+ for(i=0 ; i<TX_RING_LEN ; i++)
- {
- p=isa_bus_to_virt(lp->base+tx_base);
- lp->tx_ring[i].p=p;
-@@ -869,11 +840,12 @@ static void mc32_load_tx_ring(struct net
- tx_base=p->next;
- }
-
-- /* -1 so that tx_ring_head cannot "lap" tx_ring_tail, */
-- /* which would be bad news for mc32_tx_ring as cur. implemented */
-+ /* -1 so that tx_ring_head cannot "lap" tx_ring_tail */
-+ /* see mc32_tx_ring */
-
- atomic_set(&lp->tx_count, TX_RING_LEN-1);
-- lp->tx_ring_head=lp->tx_ring_tail=0;
-+ atomic_set(&lp->tx_ring_head, 0);
-+ lp->tx_ring_tail=0;
- }
-
-
-@@ -881,47 +853,29 @@ static void mc32_load_tx_ring(struct net
- * mc32_flush_tx_ring - free transmit ring
- * @lp: Local data of 3c527 to flush the tx ring of
- *
-- * We have to consider two cases here. We want to free the pending
-- * buffers only. If the ring buffer head is past the start then the
-- * ring segment we wish to free wraps through zero. The tx ring
-- * house-keeping variables are then reset.
-+ * If the ring is non-empty, zip over the it, freeing any
-+ * allocated skb_buffs. The tx ring house-keeping variables are
-+ * then reset. Requires rx skb pointers to point to a valid skb,
-+ * or NULL.
- */
-
- static void mc32_flush_tx_ring(struct net_device *dev)
- {
- struct mc32_local *lp = (struct mc32_local *)dev->priv;
--
-- if(lp->tx_ring_tail!=lp->tx_ring_head)
-+ int i;
-+
-+ for (i=0; i < TX_RING_LEN; i++)
- {
-- int i;
-- if(lp->tx_ring_tail < lp->tx_ring_head)
-+ if (lp->tx_ring[i].skb)
- {
-- for(i=lp->tx_ring_tail;i<lp->tx_ring_head;i++)
-- {
-- dev_kfree_skb(lp->tx_ring[i].skb);
-- lp->tx_ring[i].skb=NULL;
-- lp->tx_ring[i].p=NULL;
-- }
-- }
-- else
-- {
-- for(i=lp->tx_ring_tail; i<TX_RING_LEN; i++)
-- {
-- dev_kfree_skb(lp->tx_ring[i].skb);
-- lp->tx_ring[i].skb=NULL;
-- lp->tx_ring[i].p=NULL;
-- }
-- for(i=0; i<lp->tx_ring_head; i++)
-- {
-- dev_kfree_skb(lp->tx_ring[i].skb);
-- lp->tx_ring[i].skb=NULL;
-- lp->tx_ring[i].p=NULL;
-- }
-+ dev_kfree_skb(lp->tx_ring[i].skb);
-+ lp->tx_ring[i].skb = NULL;
- }
- }
--
-+
- atomic_set(&lp->tx_count, 0);
-- lp->tx_ring_tail=lp->tx_ring_head=0;
-+ atomic_set(&lp->tx_ring_head, 0);
-+ lp->tx_ring_tail=0;
- }
-
-
-@@ -958,6 +912,12 @@ static int mc32_open(struct net_device *
- regs|=HOST_CTRL_INTE;
- outb(regs, ioaddr+HOST_CTRL);
-
-+ /*
-+ * Allow ourselves to issue commands
-+ */
-+
-+ up(&lp->cmd_mutex);
-+
-
- /*
- * Send the indications on command
-@@ -1010,7 +970,7 @@ static int mc32_open(struct net_device *
- return -ENOBUFS;
- }
-
-- lp->desired_state = RUNNING;
-+ lp->xceiver_desired_state = RUNNING;
-
- /* And finally, set the ball rolling... */
- mc32_start_transceiver(dev);
-@@ -1047,61 +1007,64 @@ static void mc32_timeout(struct net_devi
- * Transmit a buffer. This normally means throwing the buffer onto
- * the transmit queue as the queue is quite large. If the queue is
- * full then we set tx_busy and return. Once the interrupt handler
-- * gets messages telling it to reclaim transmit queue entries we will
-+ * gets messages telling it to reclaim transmit queue entries, we will
- * clear tx_busy and the kernel will start calling this again.
- *
-- * We use cli rather than spinlocks. Since I have no access to an SMP
-- * MCA machine I don't plan to change it. It is probably the top
-- * performance hit for this driver on SMP however.
-+ * We do not disable interrupts or acquire any locks; this can
-+ * run concurrently with mc32_tx_ring(), and the function itself
-+ * is serialised at a higher layer. However, similarly for the
-+ * card itself, we must ensure that we update tx_ring_head only
-+ * after we've established a valid packet on the tx ring (and
-+ * before we let the card "see" it, to prevent it racing with the
-+ * irq handler).
-+ *
- */
-
- static int mc32_send_packet(struct sk_buff *skb, struct net_device *dev)
- {
- struct mc32_local *lp = (struct mc32_local *)dev->priv;
-- unsigned long flags;
--
-+ u32 head = atomic_read(&lp->tx_ring_head);
-+
- volatile struct skb_header *p, *np;
-
- netif_stop_queue(dev);
-
-- save_flags(flags);
-- cli();
--
-- if(atomic_read(&lp->tx_count)==0)
-- {
-- restore_flags(flags);
-+ if(atomic_read(&lp->tx_count)==0) {
- return 1;
- }
-
-+ skb = skb_padto(skb, ETH_ZLEN);
-+ if (skb == NULL) {
-+ netif_wake_queue(dev);
-+ return 0;
-+ }
-+
- atomic_dec(&lp->tx_count);
-
- /* P is the last sending/sent buffer as a pointer */
-- p=lp->tx_ring[lp->tx_ring_head].p;
-+ p=lp->tx_ring[head].p;
-
-- lp->tx_ring_head=next_tx(lp->tx_ring_head);
-+ head = next_tx(head);
-
- /* NP is the buffer we will be loading */
-- np=lp->tx_ring[lp->tx_ring_head].p;
--
-- if (skb->len < ETH_ZLEN) {
-- skb = skb_padto(skb, ETH_ZLEN);
-- if (skb == NULL)
-- goto out;
-- }
--
-+ np=lp->tx_ring[head].p;
-+
- /* We will need this to flush the buffer out */
-- lp->tx_ring[lp->tx_ring_head].skb = skb;
--
-- np->length = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
--
-+ lp->tx_ring[head].skb=skb;
-+
-+ np->length = unlikely(skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
- np->data = isa_virt_to_bus(skb->data);
- np->status = 0;
- np->control = CONTROL_EOP | CONTROL_EOL;
- wmb();
-
-- p->control &= ~CONTROL_EOL; /* Clear EOL on p */
--out:
-- restore_flags(flags);
-+ /*
-+ * The new frame has been setup; we can now
-+ * let the interrupt handler and card "see" it
-+ */
-+
-+ atomic_set(&lp->tx_ring_head, head);
-+ p->control &= ~CONTROL_EOL;
-
- netif_wake_queue(dev);
- return 0;
-@@ -1182,10 +1145,11 @@ static void mc32_rx_ring(struct net_devi
- {
- struct mc32_local *lp=dev->priv;
- volatile struct skb_header *p;
-- u16 rx_ring_tail = lp->rx_ring_tail;
-- u16 rx_old_tail = rx_ring_tail;
--
-+ u16 rx_ring_tail;
-+ u16 rx_old_tail;
- int x=0;
-+
-+ rx_old_tail = rx_ring_tail = lp->rx_ring_tail;
-
- do
- {
-@@ -1275,9 +1239,14 @@ static void mc32_tx_ring(struct net_devi
- struct mc32_local *lp=(struct mc32_local *)dev->priv;
- volatile struct skb_header *np;
-
-- /* NB: lp->tx_count=TX_RING_LEN-1 so that tx_ring_head cannot "lap" tail here */
-+ /*
-+ * We rely on head==tail to mean 'queue empty'.
-+ * This is why lp->tx_count=TX_RING_LEN-1: in order to prevent
-+ * tx_ring_head wrapping to tail and confusing a 'queue empty'
-+ * condition with 'queue full'
-+ */
-
-- while (lp->tx_ring_tail != lp->tx_ring_head)
-+ while (lp->tx_ring_tail != atomic_read(&lp->tx_ring_head))
- {
- u16 t;
-
-@@ -1388,8 +1357,7 @@ static irqreturn_t mc32_interrupt(int ir
- break;
- case 3: /* Halt */
- case 4: /* Abort */
-- lp->xceiver_state |= TX_HALTED;
-- wake_up(&lp->event);
-+ complete(&lp->xceiver_cmd);
- break;
- default:
- printk("%s: strange tx ack %d\n", dev->name, status&7);
-@@ -1404,8 +1372,7 @@ static irqreturn_t mc32_interrupt(int ir
- break;
- case 3: /* Halt */
- case 4: /* Abort */
-- lp->xceiver_state |= RX_HALTED;
-- wake_up(&lp->event);
-+ complete(&lp->xceiver_cmd);
- break;
- case 6:
- /* Out of RX buffers stat */
-@@ -1421,26 +1388,17 @@ static irqreturn_t mc32_interrupt(int ir
- status>>=3;
- if(status&1)
- {
--
-- /* 0=no 1=yes 2=replied, get cmd, 3 = wait reply & dump it */
--
-- if(lp->exec_pending!=3) {
-- lp->exec_pending=2;
-- wake_up(&lp->event);
-- }
-- else
-- {
-- lp->exec_pending=0;
--
-- /* A new multicast set may have been
-- blocked while the old one was
-- running. If so, do it now. */
-+ /*
-+ * No thread is waiting: we need to tidy
-+ * up ourself.
-+ */
-
-+ if (lp->cmd_nonblocking) {
-+ up(&lp->cmd_mutex);
- if (lp->mc_reload_wait)
- mc32_reset_multicast_list(dev);
-- else
-- wake_up(&lp->event);
- }
-+ else complete(&lp->execution_cmd);
- }
- if(status&2)
- {
-@@ -1493,12 +1451,12 @@ static irqreturn_t mc32_interrupt(int ir
- static int mc32_close(struct net_device *dev)
- {
- struct mc32_local *lp = (struct mc32_local *)dev->priv;
--
- int ioaddr = dev->base_addr;
-+
- u8 regs;
- u16 one=1;
-
-- lp->desired_state = HALTED;
-+ lp->xceiver_desired_state = HALTED;
- netif_stop_queue(dev);
-
- /*
-@@ -1511,11 +1469,10 @@ static int mc32_close(struct net_device
-
- mc32_halt_transceiver(dev);
-
-- /* Catch any waiting commands */
-+ /* Ensure we issue no more commands beyond this point */
-+
-+ down(&lp->cmd_mutex);
-
-- while(lp->exec_pending==1)
-- sleep_on(&lp->event);
--
- /* Ok the card is now stopping */
-
- regs=inb(ioaddr+HOST_CTRL);
-@@ -1542,12 +1499,9 @@ static int mc32_close(struct net_device
-
- static struct net_device_stats *mc32_get_stats(struct net_device *dev)
- {
-- struct mc32_local *lp;
-+ struct mc32_local *lp = (struct mc32_local *)dev->priv;
-
- mc32_update_stats(dev);
--
-- lp = (struct mc32_local *)dev->priv;
--
- return &lp->net_stats;
- }
-
-@@ -1684,7 +1638,7 @@ static struct ethtool_ops netdev_ethtool
-
- #ifdef MODULE
-
--static struct net_device this_device;
-+static struct net_device *this_device;
-
- /**
- * init_module - entry point
-@@ -1696,12 +1650,9 @@ static struct net_device this_device;
-
- int init_module(void)
- {
-- int result;
--
-- this_device.init = mc32_probe;
-- if ((result = register_netdev(&this_device)) != 0)
-- return result;
--
-+ this_device = mc32_probe(-1);
-+ if (IS_ERR(this_device))
-+ return PTR_ERR(this_device);
- return 0;
- }
-
-@@ -1718,24 +1669,9 @@ int init_module(void)
-
- void cleanup_module(void)
- {
-- int slot;
--
-- unregister_netdev(&this_device);
--
-- /*
-- * If we don't do this, we can't re-insmod it later.
-- */
--
-- if (this_device.priv)
-- {
-- struct mc32_local *lp=this_device.priv;
-- slot = lp->slot;
-- mca_mark_as_unused(slot);
-- mca_set_adapter_name(slot, NULL);
-- kfree(this_device.priv);
-- }
-- free_irq(this_device.irq, &this_device);
-- release_region(this_device.base_addr, MC32_IO_EXTENT);
-+ unregister_netdev(this_device);
-+ cleanup_card(this_device);
-+ free_netdev(this_device);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/3c527.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/3c527.h 2003-12-28 23:21:00.000000000 -0800
-@@ -27,10 +27,8 @@
-
- #define HOST_RAMPAGE 8
-
--#define RX_HALTED (1<<0)
--#define TX_HALTED (1<<1)
--#define HALTED (RX_HALTED | TX_HALTED)
--#define RUNNING 0
-+#define HALTED 0
-+#define RUNNING 1
-
- struct mc32_mailbox
- {
---- linux-2.6.0/drivers/net/3c59x.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/3c59x.c 2003-12-28 23:21:00.000000000 -0800
-@@ -920,6 +920,18 @@ static struct net_device *compaq_net_dev
-
- static int vortex_cards_found;
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void poll_vortex(struct net_device *dev)
-+{
-+ struct vortex_private *vp = (struct vortex_private *)dev->priv;
-+ unsigned long flags;
-+ local_save_flags(flags);
-+ local_irq_disable();
-+ (vp->full_bus_master_rx ? boomerang_interrupt:vortex_interrupt)(dev->irq,dev,NULL);
-+ local_irq_restore(flags);
-+}
-+#endif
-+
- #ifdef CONFIG_PM
-
- static int vortex_suspend (struct pci_dev *pdev, u32 state)
-@@ -1450,6 +1462,9 @@ static int __devinit vortex_probe1(struc
- dev->set_multicast_list = set_rx_mode;
- dev->tx_timeout = vortex_tx_timeout;
- dev->watchdog_timeo = (watchdog * HZ) / 1000;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = poll_vortex;
-+#endif
- if (pdev) {
- vp->pm_state_valid = 1;
- pci_save_state(VORTEX_PCI(vp), vp->power_state);
---- linux-2.6.0/drivers/net/68360enet.c 2003-06-14 12:17:59.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,951 +0,0 @@
--/*
-- * Ethernet driver for Motorola MPC8xx.
-- * Copyright (c) 2000 Michael Leslie <mleslie@lineo.com>
-- * Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
-- *
-- * I copied the basic skeleton from the lance driver, because I did not
-- * know how to write the Linux driver, but I did know how the LANCE worked.
-- *
-- * This version of the driver is somewhat selectable for the different
-- * processor/board combinations. It works for the boards I know about
-- * now, and should be easily modified to include others. Some of the
-- * configuration information is contained in "commproc.h" and the
-- * remainder is here.
-- *
-- * Buffer descriptors are kept in the CPM dual port RAM, and the frame
-- * buffers are in the host memory.
-- *
-- * Right now, I am very watseful with the buffers. I allocate memory
-- * pages and then divide them into 2K frame buffers. This way I know I
-- * have buffers large enough to hold one frame within one buffer descriptor.
-- * Once I get this working, I will use 64 or 128 byte CPM buffers, which
-- * will be much more memory efficient and will easily handle lots of
-- * small packets.
-- *
-- */
--#include <linux/config.h>
--#include <linux/kernel.h>
--#include <linux/string.h>
--#include <linux/ptrace.h>
--#include <linux/errno.h>
--#include <linux/ioport.h>
--#include <linux/interrupt.h>
--#include <linux/pci.h>
--#include <linux/init.h>
--#include <linux/delay.h>
--#include <linux/netdevice.h>
--#include <linux/etherdevice.h>
--#include <linux/skbuff.h>
--#include <linux/spinlock.h>
--
--#include <asm/irq.h>
--#include <asm/m68360.h>
--/* #include <asm/8xx_immap.h> */
--/* #include <asm/pgtable.h> */
--/* #include <asm/mpc8xx.h> */
--#include <asm/bitops.h>
--/* #include <asm/uaccess.h> */
--#include <asm/commproc.h>
--
--
--/*
-- * Theory of Operation
-- *
-- * The MPC8xx CPM performs the Ethernet processing on SCC1. It can use
-- * an aribtrary number of buffers on byte boundaries, but must have at
-- * least two receive buffers to prevent constant overrun conditions.
-- *
-- * The buffer descriptors are allocated from the CPM dual port memory
-- * with the data buffers allocated from host memory, just like all other
-- * serial communication protocols. The host memory buffers are allocated
-- * from the free page pool, and then divided into smaller receive and
-- * transmit buffers. The size of the buffers should be a power of two,
-- * since that nicely divides the page. This creates a ring buffer
-- * structure similar to the LANCE and other controllers.
-- *
-- * Like the LANCE driver:
-- * The driver runs as two independent, single-threaded flows of control. One
-- * is the send-packet routine, which enforces single-threaded use by the
-- * cep->tx_busy flag. The other thread is the interrupt handler, which is
-- * single threaded by the hardware and other software.
-- *
-- * The send packet thread has partial control over the Tx ring and the
-- * 'cep->tx_busy' flag. It sets the tx_busy flag whenever it's queuing a Tx
-- * packet. If the next queue slot is empty, it clears the tx_busy flag when
-- * finished otherwise it sets the 'lp->tx_full' flag.
-- *
-- * The MBX has a control register external to the MPC8xx that has some
-- * control of the Ethernet interface. Information is in the manual for
-- * your board.
-- *
-- * The RPX boards have an external control/status register. Consult the
-- * programming documents for details unique to your board.
-- *
-- * For the TQM8xx(L) modules, there is no control register interface.
-- * All functions are directly controlled using I/O pins. See commproc.h.
-- */
--
--
--/* The transmitter timeout
-- */
--#define TX_TIMEOUT (2*HZ)
--
--/* The number of Tx and Rx buffers. These are allocated statically here.
-- * We don't need to allocate pages for the transmitter. We just use
-- * the skbuffer directly.
-- */
--#ifdef CONFIG_ENET_BIG_BUFFERS
--#define RX_RING_SIZE 64
--#define TX_RING_SIZE 64 /* Must be power of two */
--#define TX_RING_MOD_MASK 63 /* for this to work */
--#else
--#define RX_RING_SIZE 8
--#define TX_RING_SIZE 8 /* Must be power of two */
--#define TX_RING_MOD_MASK 7 /* for this to work */
--#endif
--
--#define CPM_ENET_RX_FRSIZE 2048 /* overkill left over from ppc page-based allocation */
--static char rx_buf_pool[RX_RING_SIZE * CPM_ENET_RX_FRSIZE];
--
--
--/* The CPM stores dest/src/type, data, and checksum for receive packets.
-- */
--#define PKT_MAXBUF_SIZE 1518
--#define PKT_MINBUF_SIZE 64
--#define PKT_MAXBLR_SIZE 1520
--
--/* The CPM buffer descriptors track the ring buffers. The rx_bd_base and
-- * tx_bd_base always point to the base of the buffer descriptors. The
-- * cur_rx and cur_tx point to the currently available buffer.
-- * The dirty_tx tracks the current buffer that is being sent by the
-- * controller. The cur_tx and dirty_tx are equal under both completely
-- * empty and completely full conditions. The empty/ready indicator in
-- * the buffer descriptor determines the actual condition.
-- */
--struct scc_enet_private {
-- /* The saved address of a sent-in-place packet/buffer, for skfree(). */
-- struct sk_buff* tx_skbuff[TX_RING_SIZE];
-- ushort skb_cur;
-- ushort skb_dirty;
--
-- /* CPM dual port RAM relative addresses.
-- */
-- QUICC_BD *rx_bd_base; /* Address of Rx and Tx buffers. */
-- QUICC_BD *tx_bd_base;
-- QUICC_BD *cur_rx, *cur_tx; /* The next free ring entry */
-- QUICC_BD *dirty_tx; /* The ring entries to be free()ed. */
-- volatile struct scc_regs *sccp;
-- /* struct net_device_stats stats; */
-- struct net_device_stats stats;
-- uint tx_full;
-- /* spinlock_t lock; */
-- volatile unsigned int lock;
--};
--
--
--
--static int scc_enet_open(struct net_device *dev);
--static int scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
--static int scc_enet_rx(struct net_device *dev);
--static irqreturn_t scc_enet_interrupt(int vec, void *dev_id, struct pt_regs *fp);
--static int scc_enet_close(struct net_device *dev);
--/* static struct net_device_stats *scc_enet_get_stats(struct net_device *dev); */
--static struct net_device_stats *scc_enet_get_stats(struct net_device *dev);
--static void set_multicast_list(struct net_device *dev);
--
--/* Get this from various configuration locations (depends on board).
--*/
--/*static ushort my_enet_addr[] = { 0x0800, 0x3e26, 0x1559 };*/
--
--/* Typically, 860(T) boards use SCC1 for Ethernet, and other 8xx boards
-- * use SCC2. This is easily extended if necessary.
-- */
--
--#define CONFIG_SCC1_ENET /* by default */
--
--#ifdef CONFIG_SCC1_ENET
--#define CPM_CR_ENET CPM_CR_CH_SCC1
--#define PROFF_ENET PROFF_SCC1
--#define SCC_ENET 0
--#define CPMVEC_ENET CPMVEC_SCC1
--#endif
--
--#ifdef CONFIG_SCC2_ENET
--#define CPM_CR_ENET CPM_CR_CH_SCC2
--#define PROFF_ENET PROFF_SCC2
--#define SCC_ENET 1 /* Index, not number! */
--#define CPMVEC_ENET CPMVEC_SCC2
--#endif
--
--static int
--scc_enet_open(struct net_device *dev)
--{
--
-- /* I should reset the ring buffers here, but I don't yet know
-- * a simple way to do that.
-- * mleslie: That's no biggie. Worth doing, too.
-- */
--
-- /* netif_start_queue(dev); */
-- return 0; /* Always succeed */
--}
--
--
--static int
--scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
--{
-- struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
-- volatile QUICC_BD *bdp;
--
-- /* Fill in a Tx ring entry */
-- bdp = cep->cur_tx;
--
--#ifndef final_version
-- if (bdp->status & BD_ENET_TX_READY) {
-- /* Ooops. All transmit buffers are full. Bail out.
-- * This should not happen, since cep->tx_busy should be set.
-- */
-- printk("%s: tx queue full!.\n", dev->name);
-- return 1;
-- }
--#endif
--
-- /* Clear all of the status flags.
-- */
-- bdp->status &= ~BD_ENET_TX_STATS;
--
-- /* If the frame is short, tell CPM to pad it.
-- */
-- if (skb->len <= ETH_ZLEN)
-- bdp->status |= BD_ENET_TX_PAD;
-- else
-- bdp->status &= ~BD_ENET_TX_PAD;
--
-- /* Set buffer length and buffer pointer.
-- */
-- bdp->length = skb->len;
-- /* bdp->buf = __pa(skb->data); */
-- bdp->buf = skb->data;
--
-- /* Save skb pointer.
-- */
-- cep->tx_skbuff[cep->skb_cur] = skb;
--
-- /* cep->stats.tx_bytes += skb->len; */ /* TODO: It would really be nice... */
--
-- cep->skb_cur = (cep->skb_cur+1) & TX_RING_MOD_MASK;
--
--
-- /* Push the data cache so the CPM does not get stale memory
-- * data.
-- */
--/* flush_dcache_range((unsigned long)(skb->data), */
--/* (unsigned long)(skb->data + skb->len)); */
--
-- /* spin_lock_irq(&cep->lock); */ /* TODO: SPINLOCK */
-- local_irq_disable();
-- if (cep->lock > 0) {
-- printk ("scc_enet_start_xmit() lock == %d\n", cep->lock);
-- } else {
-- cep->lock++;
-- }
--
-- /* Send it on its way. Tell CPM its ready, interrupt when done,
-- * its the last BD of the frame, and to put the CRC on the end.
-- */
-- bdp->status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST | BD_ENET_TX_TC);
--
-- dev->trans_start = jiffies;
--
-- /* If this was the last BD in the ring, start at the beginning again.
-- */
-- if (bdp->status & BD_ENET_TX_WRAP)
-- bdp = cep->tx_bd_base;
-- else
-- bdp++;
--
-- if (bdp->status & BD_ENET_TX_READY) {
-- /* netif_stop_queue(dev); */
-- cep->tx_full = 1;
-- }
--
-- cep->cur_tx = (QUICC_BD *)bdp;
--
-- /* spin_unlock_irq(&cep->lock); */ /* TODO: SPINLOCK */
-- cep->lock--;
-- sti();
--
-- return 0;
--}
--
--#if 0
--static void
--scc_enet_timeout(struct net_device *dev)
--{
-- struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
--
-- printk("%s: transmit timed out.\n", dev->name);
-- cep->stats.tx_errors++;
--#ifndef final_version
-- {
-- int i;
-- QUICC_BD *bdp;
-- printk(" Ring data dump: cur_tx %p%s cur_rx %p.\n",
-- cep->cur_tx, cep->tx_full ? " (full)" : "",
-- cep->cur_rx);
-- bdp = cep->tx_bd_base;
-- for (i = 0 ; i < TX_RING_SIZE; i++, bdp++)
-- printk("%04x %04x %08x\n",
-- bdp->status,
-- bdp->length,
-- (int)(bdp->buf));
-- bdp = cep->rx_bd_base;
-- for (i = 0 ; i < RX_RING_SIZE; i++, bdp++)
-- printk("%04x %04x %08x\n",
-- bdp->status,
-- bdp->length,
-- (int)(bdp->buf));
-- }
--#endif
--/* if (!cep->tx_full) */
--/* netif_wake_queue(dev); */
--}
--#endif
--
--/* The interrupt handler.
-- * This is called from the CPM handler, not the MPC core interrupt.
-- */
--static irqreturn_t scc_enet_interrupt(int vec, void *dev_id, struct pt_regs *fp)
--{
-- struct net_device *dev = (struct net_device *)dev_id;
-- volatile struct scc_enet_private *cep;
-- volatile QUICC_BD *bdp;
-- ushort int_events;
-- int must_restart;
--
-- cep = (struct scc_enet_private *)dev->priv;
--
-- /* Get the interrupt events that caused us to be here.
-- */
-- int_events = cep->sccp->scc_scce;
-- cep->sccp->scc_scce = int_events;
-- must_restart = 0;
--
-- /* Handle receive event in its own function.
-- */
-- if (int_events & SCCE_ENET_RXF)
-- scc_enet_rx(dev_id);
--
-- /* Check for a transmit error. The manual is a little unclear
-- * about this, so the debug code until I get it figured out. It
-- * appears that if TXE is set, then TXB is not set. However,
-- * if carrier sense is lost during frame transmission, the TXE
-- * bit is set, "and continues the buffer transmission normally."
-- * I don't know if "normally" implies TXB is set when the buffer
-- * descriptor is closed.....trial and error :-).
-- */
--
-- /* Transmit OK, or non-fatal error. Update the buffer descriptors.
-- */
-- if (int_events & (SCCE_ENET_TXE | SCCE_ENET_TXB)) {
-- /* spin_lock(&cep->lock); */ /* TODO: SPINLOCK */
-- /* local_irq_disable(); */
-- if (cep->lock > 0) {
-- printk ("scc_enet_interrupt() lock == %d\n", cep->lock);
-- } else {
-- cep->lock++;
-- }
--
-- bdp = cep->dirty_tx;
-- while ((bdp->status&BD_ENET_TX_READY)==0) {
-- if ((bdp==cep->cur_tx) && (cep->tx_full == 0))
-- break;
--
-- if (bdp->status & BD_ENET_TX_HB) /* No heartbeat */
-- cep->stats.tx_heartbeat_errors++;
-- if (bdp->status & BD_ENET_TX_LC) /* Late collision */
-- cep->stats.tx_window_errors++;
-- if (bdp->status & BD_ENET_TX_RL) /* Retrans limit */
-- cep->stats.tx_aborted_errors++;
-- if (bdp->status & BD_ENET_TX_UN) /* Underrun */
-- cep->stats.tx_fifo_errors++;
-- if (bdp->status & BD_ENET_TX_CSL) /* Carrier lost */
-- cep->stats.tx_carrier_errors++;
--
--
-- /* No heartbeat or Lost carrier are not really bad errors.
-- * The others require a restart transmit command.
-- */
-- if (bdp->status &
-- (BD_ENET_TX_LC | BD_ENET_TX_RL | BD_ENET_TX_UN)) {
-- must_restart = 1;
-- cep->stats.tx_errors++;
-- }
--
-- cep->stats.tx_packets++;
--
-- /* Deferred means some collisions occurred during transmit,
-- * but we eventually sent the packet OK.
-- */
-- if (bdp->status & BD_ENET_TX_DEF)
-- cep->stats.collisions++;
--
-- /* Free the sk buffer associated with this last transmit.
-- */
-- /* dev_kfree_skb_irq(cep->tx_skbuff[cep->skb_dirty]); */
-- dev_kfree_skb (cep->tx_skbuff[cep->skb_dirty]);
-- cep->skb_dirty = (cep->skb_dirty + 1) & TX_RING_MOD_MASK;
--
-- /* Update pointer to next buffer descriptor to be transmitted.
-- */
-- if (bdp->status & BD_ENET_TX_WRAP)
-- bdp = cep->tx_bd_base;
-- else
-- bdp++;
--
-- /* I don't know if we can be held off from processing these
-- * interrupts for more than one frame time. I really hope
-- * not. In such a case, we would now want to check the
-- * currently available BD (cur_tx) and determine if any
-- * buffers between the dirty_tx and cur_tx have also been
-- * sent. We would want to process anything in between that
-- * does not have BD_ENET_TX_READY set.
-- */
--
-- /* Since we have freed up a buffer, the ring is no longer
-- * full.
-- */
-- if (cep->tx_full) {
-- cep->tx_full = 0;
--/* if (netif_queue_stopped(dev)) */
--/* netif_wake_queue(dev); */
-- }
--
-- cep->dirty_tx = (QUICC_BD *)bdp;
-- }
--
-- if (must_restart) {
-- volatile QUICC *cp;
--
-- /* Some transmit errors cause the transmitter to shut
-- * down. We now issue a restart transmit. Since the
-- * errors close the BD and update the pointers, the restart
-- * _should_ pick up without having to reset any of our
-- * pointers either.
-- */
-- cp = pquicc;
-- cp->cp_cr =
-- mk_cr_cmd(CPM_CR_ENET, CPM_CR_RESTART_TX) | CPM_CR_FLG;
-- while (cp->cp_cr & CPM_CR_FLG);
-- }
-- /* spin_unlock(&cep->lock); */ /* TODO: SPINLOCK */
-- /* sti(); */
-- cep->lock--;
-- }
--
-- /* Check for receive busy, i.e. packets coming but no place to
-- * put them. This "can't happen" because the receive interrupt
-- * is tossing previous frames.
-- */
-- if (int_events & SCCE_ENET_BSY) {
-- cep->stats.rx_dropped++;
-- printk("CPM ENET: BSY can't happen.\n");
-- }
--
-- return IRQ_HANDLED;
--}
--
--/* During a receive, the cur_rx points to the current incoming buffer.
-- * When we update through the ring, if the next incoming buffer has
-- * not been given to the system, we just set the empty indicator,
-- * effectively tossing the packet.
-- */
--static int
--scc_enet_rx(struct net_device *dev)
--{
-- struct scc_enet_private *cep;
-- volatile QUICC_BD *bdp;
-- struct sk_buff *skb;
-- ushort pkt_len;
--
-- cep = (struct scc_enet_private *)dev->priv;
--
-- /* First, grab all of the stats for the incoming packet.
-- * These get messed up if we get called due to a busy condition.
-- */
-- bdp = cep->cur_rx;
--
-- for (;;) {
-- if (bdp->status & BD_ENET_RX_EMPTY)
-- break;
--
--#ifndef final_version
-- /* Since we have allocated space to hold a complete frame, both
-- * the first and last indicators should be set.
-- */
-- if ((bdp->status & (BD_ENET_RX_FIRST | BD_ENET_RX_LAST)) !=
-- (BD_ENET_RX_FIRST | BD_ENET_RX_LAST))
-- printk("CPM ENET: rcv is not first+last\n");
--#endif
--
-- /* Frame too long or too short.
-- */
-- if (bdp->status & (BD_ENET_RX_LG | BD_ENET_RX_SH))
-- cep->stats.rx_length_errors++;
-- if (bdp->status & BD_ENET_RX_NO) /* Frame alignment */
-- cep->stats.rx_frame_errors++;
-- if (bdp->status & BD_ENET_RX_CR) /* CRC Error */
-- cep->stats.rx_crc_errors++;
-- if (bdp->status & BD_ENET_RX_OV) /* FIFO overrun */
-- cep->stats.rx_crc_errors++;
--
-- /* Report late collisions as a frame error.
-- * On this error, the BD is closed, but we don't know what we
-- * have in the buffer. So, just drop this frame on the floor.
-- */
-- if (bdp->status & BD_ENET_RX_CL) {
-- cep->stats.rx_frame_errors++;
-- }
-- else {
--
-- /* Process the incoming frame.
-- */
-- cep->stats.rx_packets++;
-- pkt_len = bdp->length;
-- /* cep->stats.rx_bytes += pkt_len; */ /* TODO: It would really be nice... */
--
-- /* This does 16 byte alignment, much more than we need.
-- * The packet length includes FCS, but we don't want to
-- * include that when passing upstream as it messes up
-- * bridging applications.
-- */
-- skb = dev_alloc_skb(pkt_len-4);
--
-- if (skb == NULL) {
-- printk("%s: Memory squeeze, dropping packet.\n", dev->name);
-- cep->stats.rx_dropped++;
-- }
-- else {
-- skb->dev = dev;
-- skb_put(skb,pkt_len-4); /* Make room */
-- eth_copy_and_sum(skb, (unsigned char *)bdp->buf, pkt_len-4, 0);
-- skb->protocol=eth_type_trans(skb,dev);
-- netif_rx(skb);
-- }
-- }
--
-- /* Clear the status flags for this buffer.
-- */
-- bdp->status &= ~BD_ENET_RX_STATS;
--
-- /* Mark the buffer empty.
-- */
-- bdp->status |= BD_ENET_RX_EMPTY;
--
-- /* Update BD pointer to next entry.
-- */
-- if (bdp->status & BD_ENET_RX_WRAP)
-- bdp = cep->rx_bd_base;
-- else
-- bdp++;
--
-- }
-- cep->cur_rx = (QUICC_BD *)bdp;
--
-- return 0;
--}
--
--static int
--scc_enet_close(struct net_device *dev)
--{
-- /* Don't know what to do yet.
-- */
-- /* netif_stop_queue(dev); */
--
-- return 0;
--}
--
--/* static struct net_device_stats *scc_enet_get_stats(struct net_device *dev) */
--static struct net_device_stats *scc_enet_get_stats(struct net_device *dev)
--{
-- struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
--
-- return &cep->stats;
--}
--
--/* Set or clear the multicast filter for this adaptor.
-- * Skeleton taken from sunlance driver.
-- * The CPM Ethernet implementation allows Multicast as well as individual
-- * MAC address filtering. Some of the drivers check to make sure it is
-- * a group multicast address, and discard those that are not. I guess I
-- * will do the same for now, but just remove the test if you want
-- * individual filtering as well (do the upper net layers want or support
-- * this kind of feature?).
-- */
--
--static void set_multicast_list(struct net_device *dev)
--{
-- struct scc_enet_private *cep;
-- struct dev_mc_list *dmi;
-- u_char *mcptr, *tdptr;
-- volatile scc_enet_t *ep;
-- int i, j;
-- volatile QUICC *cp = pquicc;
--
-- cep = (struct scc_enet_private *)dev->priv;
--
-- /* Get pointer to SCC area in parameter RAM.
-- */
-- ep = (scc_enet_t *)dev->base_addr;
--
-- if (dev->flags&IFF_PROMISC) {
--
-- /* Log any net taps. */
-- printk("%s: Promiscuous mode enabled.\n", dev->name);
-- cep->sccp->scc_psmr |= ETHER_PRO;
-- } else {
--
-- cep->sccp->scc_psmr &= ~ETHER_PRO;
--
-- if (dev->flags & IFF_ALLMULTI) {
-- /* Catch all multicast addresses, so set the
-- * filter to all 1's.
-- */
-- ep->sen_gaddr1 = 0xffff;
-- ep->sen_gaddr2 = 0xffff;
-- ep->sen_gaddr3 = 0xffff;
-- ep->sen_gaddr4 = 0xffff;
-- }
-- else {
-- /* Clear filter and add the addresses in the list.
-- */
-- ep->sen_gaddr1 = 0;
-- ep->sen_gaddr2 = 0;
-- ep->sen_gaddr3 = 0;
-- ep->sen_gaddr4 = 0;
--
-- dmi = dev->mc_list;
--
-- for (i=0; i<dev->mc_count; i++) {
--
-- /* Only support group multicast for now.
-- */
-- if (!(dmi->dmi_addr[0] & 1))
-- continue;
--
-- /* The address in dmi_addr is LSB first,
-- * and taddr is MSB first. We have to
-- * copy bytes MSB first from dmi_addr.
-- */
-- mcptr = (u_char *)dmi->dmi_addr + 5;
-- tdptr = (u_char *)&ep->sen_taddrh;
-- for (j=0; j<6; j++)
-- *tdptr++ = *mcptr--;
--
-- /* Ask CPM to run CRC and set bit in
-- * filter mask.
-- */
-- cp->cp_cr = mk_cr_cmd(CPM_CR_ENET, CPM_CR_SET_GADDR) | CPM_CR_FLG;
-- /* this delay is necessary here -- Cort */
-- udelay(10);
-- while (cp->cp_cr & CPM_CR_FLG);
-- }
-- }
-- }
--}
--
--
--/* Initialize the CPM Ethernet on SCC.
-- */
--int scc_enet_init(void)
--{
-- struct net_device *dev;
-- struct scc_enet_private *cep;
-- int i, j;
-- unsigned char *eap;
-- /* unsigned long mem_addr; */
-- /* pte_t *pte; */
-- /* bd_t *bd; */ /* `board tag' used by ppc - TODO: integrate uC bootloader vars */
-- volatile QUICC_BD *bdp;
-- volatile QUICC *cp;
-- volatile struct scc_regs *sccp;
-- volatile struct ethernet_pram *ep;
-- /* volatile immap_t *immap; */
--
-- cp = pquicc; /* Get pointer to Communication Processor */
--
-- /* immap = (immap_t *)IMAP_ADDR; */ /* and to internal registers */
--
-- /* bd = (bd_t *)__res; */
--
-- /* Allocate some private information.
-- */
-- cep = (struct scc_enet_private *)kmalloc(sizeof(*cep), GFP_KERNEL);
-- memset(cep, 0, sizeof(*cep));
-- /* __clear_user(cep,sizeof(*cep)); */
-- /* spin_lock_init(&cep->lock); */ /* TODO: SPINLOCK */
--
-- /* Create an Ethernet device instance.
-- */
-- dev = init_etherdev(0, 0);
--
-- /* Get pointer to SCC area in parameter RAM.
-- */
-- /* ep = (ethernet_pram *)(&cp->cp_dparam[PROFF_ENET]); */
-- ep = &pquicc->pram[SCC_ENET].enet_scc;
--
-- /* And another to the SCC register area.
-- */
-- sccp = &pquicc->scc_regs[SCC_ENET];
-- cep->sccp = sccp; /* Keep the pointer handy */
--
-- /* Disable receive and transmit in case EPPC-Bug started it.
-- */
-- sccp->scc_gsmr.w.low &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
--
-- /* Set up 360 pins for SCC interface to ethernet transceiver.
-- * Pin mappings (PA_xx and PC_xx) are defined in commproc.h
-- */
--
-- /* Configure port A pins for Txd and Rxd.
-- */
-- pquicc->pio_papar |= (PA_ENET_RXD | PA_ENET_TXD);
-- pquicc->pio_padir &= ~(PA_ENET_RXD | PA_ENET_TXD);
-- pquicc->pio_paodr &= ~PA_ENET_TXD;
--
-- /* Configure port C pins to enable CLSN and RENA.
-- */
-- pquicc->pio_pcpar &= ~(PC_ENET_CLSN | PC_ENET_RENA);
-- pquicc->pio_pcdir &= ~(PC_ENET_CLSN | PC_ENET_RENA);
-- pquicc->pio_pcso |= (PC_ENET_CLSN | PC_ENET_RENA);
--
-- /* Configure port A for TCLK and RCLK.
-- */
-- pquicc->pio_papar |= (PA_ENET_TCLK | PA_ENET_RCLK);
-- pquicc->pio_padir &= ~(PA_ENET_TCLK | PA_ENET_RCLK);
--
-- /* Configure Serial Interface clock routing.
-- * First, clear all SCC bits to zero, then set the ones we want.
-- */
-- pquicc->si_sicr &= ~SICR_ENET_MASK;
-- pquicc->si_sicr |= SICR_ENET_CLKRT;
--
--
-- /* Allocate space for the buffer descriptors in the DP ram.
-- * These are relative offsets in the DP ram address space.
-- * Initialize base addresses for the buffer descriptors.
-- */
-- i = m360_cpm_dpalloc(sizeof(QUICC_BD) * RX_RING_SIZE);
-- ep->rbase = i;
-- cep->rx_bd_base = (QUICC_BD *)((uint)pquicc + i);
--
-- i = m360_cpm_dpalloc(sizeof(QUICC_BD) * TX_RING_SIZE);
-- ep->tbase = i;
-- cep->tx_bd_base = (QUICC_BD *)((uint)pquicc + i);
--
-- cep->dirty_tx = cep->cur_tx = cep->tx_bd_base;
-- cep->cur_rx = cep->rx_bd_base;
--
-- /* Issue init Rx BD command for SCC.
-- * Manual says to perform an Init Rx parameters here. We have
-- * to perform both Rx and Tx because the SCC may have been
-- * already running. [In uCquicc's case, I don't think that is so - mles]
-- * In addition, we have to do it later because we don't yet have
-- * all of the BD control/status set properly.
-- cp->cp_cpcr = mk_cr_cmd(CPM_CR_ENET, CPM_CR_INIT_RX) | CPM_CR_FLG;
-- while (cp->cp_cpcr & CPM_CR_FLG);
-- */
--
-- /* Initialize function code registers for big-endian.
-- */
-- ep->rfcr = (SCC_EB | SCC_FC_DMA);
-- ep->tfcr = (SCC_EB | SCC_FC_DMA);
--
-- /* Set maximum bytes per receive buffer.
-- * This appears to be an Ethernet frame size, not the buffer
-- * fragment size. It must be a multiple of four.
-- */
-- ep->mrblr = PKT_MAXBLR_SIZE;
--
-- /* Set CRC preset and mask.
-- */
-- ep->c_pres = 0xffffffff;
-- ep->c_mask = 0xdebb20e3; /* see 360UM p. 7-247 */
--
-- ep->crcec = 0; /* CRC Error counter */
-- ep->alec = 0; /* alignment error counter */
-- ep->disfc = 0; /* discard frame counter */
--
-- ep->pads = 0x8888; /* Tx short frame pad character */
-- ep->ret_lim = 0x000f; /* Retry limit threshold */
--
-- ep->mflr = PKT_MAXBUF_SIZE; /* maximum frame length register */
-- ep->minflr = PKT_MINBUF_SIZE; /* minimum frame length register */
--
-- ep->maxd1 = PKT_MAXBLR_SIZE; /* maximum DMA1 length */
-- ep->maxd2 = PKT_MAXBLR_SIZE; /* maximum DMA2 length */
--
-- /* Clear hash tables, group and individual.
-- */
-- ep->gaddr1 = ep->gaddr2 = ep->gaddr3 = ep->gaddr4 = 0;
-- ep->iaddr1 = ep->iaddr2 = ep->iaddr3 = ep->iaddr4 = 0;
--
-- /* Set Ethernet station address.
-- *
-- * The uCbootloader provides a hook to the kernel to retrieve
-- * stuff like the MAC address. This is retrieved in config_BSP()
-- */
--#if defined (CONFIG_UCQUICC)
-- {
-- extern unsigned char *scc1_hwaddr;
--
-- eap = (char *)ep->paddr.b;
-- for (i=5; i>=0; i--)
-- *eap++ = dev->dev_addr[i] = scc1_hwaddr[i];
-- }
--#endif
--
--
--/* #ifndef CONFIG_MBX */
--/* eap = (unsigned char *)&(ep->paddrh); */
--
--/* for (i=5; i>=0; i--) */
--/* *eap++ = dev->dev_addr[i] = bd->bi_enetaddr[i]; */
--/* #else */
--/* for (i=5; i>=0; i--) */
--/* dev->dev_addr[i] = *eap++; */
--/* #endif */
--
-- ep->p_per = 0; /* 'cause the book says so */
-- ep->taddr_l = 0; /* temp address (LSB) */
-- ep->taddr_m = 0;
-- ep->taddr_h = 0; /* temp address (MSB) */
--
-- /* Now allocate the host memory pages and initialize the
-- * buffer descriptors.
-- */
-- /* initialize rx buffer descriptors */
-- bdp = cep->tx_bd_base;
-- for (j=0; j<(TX_RING_SIZE-1); j++) {
-- bdp->buf = 0;
-- bdp->status = 0;
-- bdp++;
-- }
-- bdp->buf = 0;
-- bdp->status = BD_SC_WRAP;
--
--
-- /* initialize rx buffer descriptors */
-- bdp = cep->rx_bd_base;
-- for (j=0; j<(RX_RING_SIZE-1); j++) {
-- bdp->buf = &rx_buf_pool[j * CPM_ENET_RX_FRSIZE];
-- bdp->status = BD_SC_EMPTY | BD_SC_INTRPT;
-- bdp++;
-- }
-- bdp->buf = &rx_buf_pool[j * CPM_ENET_RX_FRSIZE];
-- bdp->status = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT;
--
--
--
-- /* Let's re-initialize the channel now. We have to do it later
-- * than the manual describes because we have just now finished
-- * the BD initialization.
-- */
-- cp->cp_cr = mk_cr_cmd(CPM_CR_ENET, CPM_CR_INIT_TRX) | CPM_CR_FLG;
-- while (cp->cp_cr & CPM_CR_FLG);
--
-- cep->skb_cur = cep->skb_dirty = 0;
--
-- sccp->scc_scce = 0xffff; /* Clear any pending events */
--
-- /* Enable interrupts for transmit error, complete frame
-- * received, and any transmit buffer we have also set the
-- * interrupt flag.
-- */
-- sccp->scc_sccm = (SCCE_ENET_TXE | SCCE_ENET_RXF | SCCE_ENET_TXB);
--
-- /* Install our interrupt handler.
-- */
-- /* cpm_install_handler(CPMVEC_ENET, scc_enet_interrupt, dev); */
-- request_irq(CPMVEC_ENET, scc_enet_interrupt,
-- IRQ_FLG_LOCK, dev->name, (void *)dev);
--
-- /* Set GSMR_H to enable all normal operating modes.
-- * Set GSMR_L to enable Ethernet to MC68160.
-- */
-- sccp->scc_gsmr.w.high = 0;
-- sccp->scc_gsmr.w.low = (SCC_GSMRL_TCI | SCC_GSMRL_TPL_48 |
-- SCC_GSMRL_TPP_10 | SCC_GSMRL_MODE_ENET);
--
-- /* Set sync/delimiters.
-- */
-- sccp->scc_dsr = 0xd555;
--
-- /* Set processing mode. Use Ethernet CRC, catch broadcast, and
-- * start frame search 22 bit times after RENA.
-- */
-- sccp->scc_psmr = (SCC_PMSR_ENCRC /* Ethernet CRC mode */
-- /* | SCC_PSMR_HBC */ /* Enable heartbeat */
-- /* | SCC_PMSR_PRO */ /* Promiscuous mode */
-- /* | SCC_PMSR_FDE */ /* Full duplex enable */
-- | ETHER_NIB_22);
-- /* sccp->scc_psmr = (SCC_PMSR_PRO | ETHER_CRC_32 | ETHER_NIB_22); */
--
--
-- /* It is now OK to enable the Ethernet transmitter.
-- * Unfortunately, there are board implementation differences here.
-- */
--#if defined(CONFIG_UCQUICC)
--/* immap->im_ioport.iop_pcpar |= PC_ENET_TENA; */
--/* immap->im_ioport.iop_pcdir &= ~PC_ENET_TENA; */
-- cp->pio_pcpar |= PC_ENET_TENA; /* t_en */
-- cp->pio_pcdir &= ~PC_ENET_TENA;
--
-- cp->pip_pbpar &= ~(0x00000200); /* power up ethernet transceiver */
-- cp->pip_pbdir |= (0x00000200);
-- cp->pip_pbdat |= (0x00000200);
--#endif
--
--
-- dev->base_addr = (unsigned long)ep;
-- dev->priv = cep;
--#if 0
-- dev->name = "CPM_ENET";
--#endif
--
-- /* The CPM Ethernet specific entries in the device structure. */
-- dev->open = scc_enet_open;
-- dev->hard_start_xmit = scc_enet_start_xmit;
-- /* dev->tx_timeout = scc_enet_timeout; */
-- /* dev->watchdog_timeo = TX_TIMEOUT; */
-- dev->stop = scc_enet_close;
-- dev->get_stats = scc_enet_get_stats;
-- dev->set_multicast_list = set_multicast_list;
--
-- /* And last, enable the transmit and receive processing.
-- */
-- sccp->scc_gsmr.w.low |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
--
-- printk("%s: CPM ENET Version 0.3, ", dev->name);
-- for (i=0; i<5; i++)
-- printk("%02x:", dev->dev_addr[i]);
-- printk("%02x\n", dev->dev_addr[5]);
--
-- return 0;
--}
--
--
--
--int m68360_enet_probe(struct device *dev)
--{
-- return(scc_enet_init ());
--}
--
--
--/*
-- * Local variables:
-- * c-indent-level: 4
-- * c-basic-offset: 4
-- * tab-width: 4
-- * End:
-- */
---- linux-2.6.0/drivers/net/8139too.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/8139too.c 2003-12-28 23:22:01.000000000 -0800
-@@ -92,7 +92,7 @@
- */
-
- #define DRV_NAME "8139too"
--#define DRV_VERSION "0.9.26"
-+#define DRV_VERSION "0.9.27"
-
-
- #include <linux/config.h>
-@@ -117,17 +117,17 @@
- #define RTL8139_DRIVER_NAME DRV_NAME " Fast Ethernet driver " DRV_VERSION
- #define PFX DRV_NAME ": "
-
-+/* Default Message level */
-+#define RTL8139_DEF_MSG_ENABLE (NETIF_MSG_DRV | \
-+ NETIF_MSG_PROBE | \
-+ NETIF_MSG_LINK)
-+
-
- /* enable PIO instead of MMIO, if CONFIG_8139TOO_PIO is selected */
- #ifdef CONFIG_8139TOO_PIO
- #define USE_IO_OPS 1
- #endif
-
--/* use a 16K rx ring buffer instead of the default 32K */
--#ifdef CONFIG_SH_DREAMCAST
--#define USE_BUF16K 1
--#endif
--
- /* define to 1 to enable copious debugging info */
- #undef RTL8139_DEBUG
-
-@@ -146,9 +146,9 @@
- # define assert(expr) do {} while (0)
- #else
- # define assert(expr) \
-- if(!(expr)) { \
-- printk( "Assertion failed! %s,%s,%s,line=%d\n", \
-- #expr,__FILE__,__FUNCTION__,__LINE__); \
-+ if(unlikely(!(expr))) { \
-+ printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
-+ #expr,__FILE__,__FUNCTION__,__LINE__); \
- }
- #endif
-
-@@ -159,9 +159,6 @@
- static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
- static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
-
--/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
--static int max_interrupt_work = 20;
--
- /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
- The RTL chips use a 64 element hash table based on the Ethernet CRC. */
- static int multicast_filter_limit = 32;
-@@ -169,16 +166,16 @@ static int multicast_filter_limit = 32;
- /* bitmapped message enable number */
- static int debug = -1;
-
--/* Size of the in-memory receive ring. */
--#ifdef USE_BUF16K
--#define RX_BUF_LEN_IDX 1 /* 0==8K, 1==16K, 2==32K, 3==64K */
--#else
--#define RX_BUF_LEN_IDX 2 /* 0==8K, 1==16K, 2==32K, 3==64K */
--#endif
--#define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
-+/* Ring size is now a config option */
-+#define RX_BUF_LEN (8192 << CONFIG_8139_RXBUF_IDX)
- #define RX_BUF_PAD 16
- #define RX_BUF_WRAP_PAD 2048 /* spare padding to handle lack of packet wrap */
-+
-+#if RX_BUF_LEN == 65536
-+#define RX_BUF_TOT_LEN RX_BUF_LEN
-+#else
- #define RX_BUF_TOT_LEN (RX_BUF_LEN + RX_BUF_PAD + RX_BUF_WRAP_PAD)
-+#endif
-
- /* Number of Tx descriptor registers. */
- #define NUM_TX_DESC 4
-@@ -251,6 +248,10 @@ static struct pci_device_id rtl8139_pci_
- {0x11db, 0x1234, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
- {0x1432, 0x9130, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
- {0x02ac, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
-+ {0x018a, 0x0106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
-+ {0x126c, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
-+ {0x1743, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
-+ {0x021b, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
-
- #ifdef CONFIG_SH_SECUREEDGE5410
- /* Bogus 8139 silicon reports 8129 without external PROM :-( */
-@@ -450,7 +451,7 @@ enum RxConfigBits {
- RxCfgRcv32K = (1 << 12),
- RxCfgRcv64K = (1 << 11) | (1 << 12),
-
-- /* Disable packet wrap at end of Rx buffer */
-+ /* Disable packet wrap at end of Rx buffer. (not possible with 64k) */
- RxNoWrap = (1 << 7),
- };
-
-@@ -560,6 +561,7 @@ struct rtl8139_private {
- int drv_flags;
- struct pci_dev *pci_dev;
- u32 pci_state[16];
-+ u32 msg_enable;
- struct net_device_stats stats;
- unsigned char *rx_ring;
- unsigned int cur_rx; /* Index into the Rx buffer of next Rx pkt. */
-@@ -574,6 +576,7 @@ struct rtl8139_private {
- char twistie, twist_row, twist_col; /* Twister tune state. */
- unsigned int default_port:4; /* Last dev->if_port value. */
- spinlock_t lock;
-+ spinlock_t rx_lock;
- chip_t chipset;
- pid_t thr_pid;
- wait_queue_head_t thr_wait;
-@@ -590,13 +593,11 @@ MODULE_DESCRIPTION ("RealTek RTL-8139 Fa
- MODULE_LICENSE("GPL");
-
- MODULE_PARM (multicast_filter_limit, "i");
--MODULE_PARM (max_interrupt_work, "i");
- MODULE_PARM (media, "1-" __MODULE_STRING(MAX_UNITS) "i");
- MODULE_PARM (full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
- MODULE_PARM (debug, "i");
- MODULE_PARM_DESC (debug, "8139too bitmapped message enable number");
- MODULE_PARM_DESC (multicast_filter_limit, "8139too maximum number of filtered multicast addresses");
--MODULE_PARM_DESC (max_interrupt_work, "8139too maximum events handled per interrupt");
- MODULE_PARM_DESC (media, "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps");
- MODULE_PARM_DESC (full_duplex, "8139too: Force full duplex for board(s) (1)");
-
-@@ -610,6 +611,10 @@ static void rtl8139_tx_timeout (struct n
- static void rtl8139_init_ring (struct net_device *dev);
- static int rtl8139_start_xmit (struct sk_buff *skb,
- struct net_device *dev);
-+static int rtl8139_poll(struct net_device *dev, int *budget);
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void rtl8139_poll_controller(struct net_device *dev);
-+#endif
- static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance,
- struct pt_regs *regs);
- static int rtl8139_close (struct net_device *dev);
-@@ -682,16 +687,32 @@ static const u16 rtl8139_intr_mask =
- PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver |
- TxErr | TxOK | RxErr | RxOK;
-
--#ifdef USE_BUF16K
-+static const u16 rtl8139_norx_intr_mask =
-+ PCIErr | PCSTimeout | RxUnderrun |
-+ TxErr | TxOK | RxErr ;
-+
-+#if CONFIG_8139_RXBUF_IDX == 0
-+static const unsigned int rtl8139_rx_config =
-+ RxCfgRcv8K | RxNoWrap |
-+ (RX_FIFO_THRESH << RxCfgFIFOShift) |
-+ (RX_DMA_BURST << RxCfgDMAShift);
-+#elif CONFIG_8139_RXBUF_IDX == 1
- static const unsigned int rtl8139_rx_config =
- RxCfgRcv16K | RxNoWrap |
- (RX_FIFO_THRESH << RxCfgFIFOShift) |
- (RX_DMA_BURST << RxCfgDMAShift);
--#else
-+#elif CONFIG_8139_RXBUF_IDX == 2
- static const unsigned int rtl8139_rx_config =
- RxCfgRcv32K | RxNoWrap |
- (RX_FIFO_THRESH << RxCfgFIFOShift) |
- (RX_DMA_BURST << RxCfgDMAShift);
-+#elif CONFIG_8139_RXBUF_IDX == 3
-+static const unsigned int rtl8139_rx_config =
-+ RxCfgRcv64K |
-+ (RX_FIFO_THRESH << RxCfgFIFOShift) |
-+ (RX_DMA_BURST << RxCfgDMAShift);
-+#else
-+#error "Invalid configuration for 8139_RXBUF_IDX"
- #endif
-
- static const unsigned int rtl8139_tx_config =
-@@ -868,9 +889,7 @@ static int __devinit rtl8139_init_board
-
- match:
- DPRINTK ("chipset id (%d) == index %d, '%s'\n",
-- tmp,
-- tp->chipset,
-- rtl_chip_info[tp->chipset].name);
-+ version, i, rtl_chip_info[i].name);
-
- if (tp->chipset >= CH_8139B) {
- u8 new_tmp8 = tmp8 = RTL_R8 (Config1);
-@@ -964,6 +983,8 @@ static int __devinit rtl8139_init_one (s
- /* The Rtl8139-specific entries in the device structure. */
- dev->open = rtl8139_open;
- dev->hard_start_xmit = rtl8139_start_xmit;
-+ dev->poll = rtl8139_poll;
-+ dev->weight = 64;
- dev->stop = rtl8139_close;
- dev->get_stats = rtl8139_get_stats;
- dev->set_multicast_list = rtl8139_set_rx_mode;
-@@ -971,6 +992,9 @@ static int __devinit rtl8139_init_one (s
- dev->ethtool_ops = &rtl8139_ethtool_ops;
- dev->tx_timeout = rtl8139_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = rtl8139_poll_controller;
-+#endif
-
- /* note: the hardware is not capable of sg/csum/highdma, however
- * through the use of skb_copy_and_csum_dev we enable these
-@@ -986,7 +1010,10 @@ static int __devinit rtl8139_init_one (s
- /* note: tp->chipset set in rtl8139_init_board */
- tp->drv_flags = board_info[ent->driver_data].hw_flags;
- tp->mmio_addr = ioaddr;
-+ tp->msg_enable =
-+ (debug < 0 ? RTL8139_DEF_MSG_ENABLE : ((1 << debug) - 1));
- spin_lock_init (&tp->lock);
-+ spin_lock_init (&tp->rx_lock);
- init_waitqueue_head (&tp->thr_wait);
- init_completion (&tp->thr_exited);
- tp->mii.dev = dev;
-@@ -1288,9 +1315,7 @@ static int rtl8139_open (struct net_devi
- {
- struct rtl8139_private *tp = dev->priv;
- int retval;
--#ifdef RTL8139_DEBUG
- void *ioaddr = tp->mmio_addr;
--#endif
-
- retval = request_irq (dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev);
- if (retval)
-@@ -1319,8 +1344,10 @@ static int rtl8139_open (struct net_devi
-
- rtl8139_init_ring (dev);
- rtl8139_hw_start (dev);
-+ netif_start_queue (dev);
-
-- DPRINTK ("%s: rtl8139_open() ioaddr %#lx IRQ %d"
-+ if (netif_msg_ifup(tp))
-+ printk(KERN_DEBUG "%s: rtl8139_open() ioaddr %#lx IRQ %d"
- " GP Pins %2.2x %s-duplex.\n",
- dev->name, pci_resource_start (tp->pci_dev, 1),
- dev->irq, RTL_R8 (MediaStatus),
-@@ -1337,7 +1364,7 @@ static void rtl_check_media (struct net_
- struct rtl8139_private *tp = dev->priv;
-
- if (tp->phys[0] >= 0) {
-- mii_check_media(&tp->mii, 1, init_media);
-+ mii_check_media(&tp->mii, netif_msg_link(tp), init_media);
- }
- }
-
-@@ -1407,8 +1434,6 @@ static void rtl8139_hw_start (struct net
-
- /* Enable all known interrupts by setting the interrupt mask. */
- RTL_W16 (IntrMask, rtl8139_intr_mask);
--
-- netif_start_queue (dev);
- }
-
-
-@@ -1631,7 +1656,7 @@ static inline void rtl8139_start_thread(
- }
- }
-
--static void rtl8139_tx_clear (struct rtl8139_private *tp)
-+static inline void rtl8139_tx_clear (struct rtl8139_private *tp)
- {
- tp->cur_tx = 0;
- tp->dirty_tx = 0;
-@@ -1661,6 +1686,7 @@ static void rtl8139_tx_timeout (struct n
- if (tmp8 & CmdTxEnb)
- RTL_W8 (ChipCmd, CmdRxEnb);
-
-+ spin_lock(&tp->rx_lock);
- /* Disable interrupts by clearing the interrupt mask. */
- RTL_W16 (IntrMask, 0x0000);
-
-@@ -1679,9 +1705,12 @@ static void rtl8139_tx_timeout (struct n
- spin_unlock_irqrestore (&tp->lock, flags);
-
- /* ...and finally, reset everything */
-- rtl8139_hw_start (dev);
--
-- netif_wake_queue (dev);
-+ if (netif_running(dev)) {
-+ rtl8139_hw_start (dev);
-+ netif_wake_queue (dev);
-+ }
-+ spin_unlock(&tp->rx_lock);
-+
- }
-
-
-@@ -1695,6 +1724,7 @@ static int rtl8139_start_xmit (struct sk
- /* Calculate the next Tx descriptor entry. */
- entry = tp->cur_tx % NUM_TX_DESC;
-
-+ /* Note: the chip doesn't have auto-pad! */
- if (likely(len < TX_BUF_SIZE)) {
- if (len < ETH_ZLEN)
- memset(tp->tx_buf[entry], 0, ETH_ZLEN);
-@@ -1706,7 +1736,6 @@ static int rtl8139_start_xmit (struct sk
- return 0;
- }
-
-- /* Note: the chip doesn't have auto-pad! */
- spin_lock_irq(&tp->lock);
- RTL_W32_F (TxStatus0 + (entry * sizeof (u32)),
- tp->tx_flag | max(len, (unsigned int)ETH_ZLEN));
-@@ -1720,8 +1749,9 @@ static int rtl8139_start_xmit (struct sk
- netif_stop_queue (dev);
- spin_unlock_irq(&tp->lock);
-
-- DPRINTK ("%s: Queued Tx packet size %u to slot %d.\n",
-- dev->name, len, entry);
-+ if (netif_msg_tx_queued(tp))
-+ printk (KERN_DEBUG "%s: Queued Tx packet size %u to slot %d.\n",
-+ dev->name, len, entry);
-
- return 0;
- }
-@@ -1751,8 +1781,9 @@ static void rtl8139_tx_interrupt (struct
- /* Note: TxCarrierLost is always asserted at 100mbps. */
- if (txstatus & (TxOutOfWindow | TxAborted)) {
- /* There was an major error, log it. */
-- DPRINTK ("%s: Transmit error, Tx status %8.8x.\n",
-- dev->name, txstatus);
-+ if (netif_msg_tx_err(tp))
-+ printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
-+ dev->name, txstatus);
- tp->stats.tx_errors++;
- if (txstatus & TxAborted) {
- tp->stats.tx_aborted_errors++;
-@@ -1792,8 +1823,7 @@ static void rtl8139_tx_interrupt (struct
- if (tp->dirty_tx != dirty_tx) {
- tp->dirty_tx = dirty_tx;
- mb();
-- if (netif_queue_stopped (dev))
-- netif_wake_queue (dev);
-+ netif_wake_queue (dev);
- }
- }
-
-@@ -1807,8 +1837,9 @@ static void rtl8139_rx_err (u32 rx_statu
- int tmp_work;
- #endif
-
-- DPRINTK ("%s: Ethernet frame had errors, status %8.8x.\n",
-- dev->name, rx_status);
-+ if (netif_msg_rx_err (tp))
-+ printk(KERN_DEBUG "%s: Ethernet frame had errors, status %8.8x.\n",
-+ dev->name, rx_status);
- tp->stats.rx_errors++;
- if (!(rx_status & RxStatusOK)) {
- if (rx_status & RxTooLong) {
-@@ -1880,30 +1911,41 @@ static void rtl8139_rx_err (u32 rx_statu
- #endif
- }
-
--static void rtl8139_rx_interrupt (struct net_device *dev,
-- struct rtl8139_private *tp, void *ioaddr)
--{
-- unsigned char *rx_ring;
-- u16 cur_rx;
--
-- assert (dev != NULL);
-- assert (tp != NULL);
-- assert (ioaddr != NULL);
-+#if CONFIG_8139_RXBUF_IDX == 3
-+static __inline__ void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
-+ u32 offset, unsigned int size)
-+{
-+ u32 left = RX_BUF_LEN - offset;
-+
-+ if (size > left) {
-+ memcpy(skb->data, ring + offset, left);
-+ memcpy(skb->data+left, ring, size - left);
-+ } else
-+ memcpy(skb->data, ring + offset, size);
-+}
-+#endif
-
-- rx_ring = tp->rx_ring;
-- cur_rx = tp->cur_rx;
-+static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
-+ int budget)
-+{
-+ void *ioaddr = tp->mmio_addr;
-+ int received = 0;
-+ unsigned char *rx_ring = tp->rx_ring;
-+ unsigned int cur_rx = tp->cur_rx;
-
- DPRINTK ("%s: In rtl8139_rx(), current %4.4x BufAddr %4.4x,"
- " free to %4.4x, Cmd %2.2x.\n", dev->name, cur_rx,
- RTL_R16 (RxBufAddr),
- RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd));
-
-- while ((RTL_R8 (ChipCmd) & RxBufEmpty) == 0) {
-- int ring_offset = cur_rx % RX_BUF_LEN;
-+ while (netif_running(dev) && received < budget
-+ && (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) {
-+ u32 ring_offset = cur_rx % RX_BUF_LEN;
- u32 rx_status;
- unsigned int rx_size;
- unsigned int pkt_size;
- struct sk_buff *skb;
-+ u16 status;
-
- rmb();
-
-@@ -1912,8 +1954,9 @@ static void rtl8139_rx_interrupt (struct
- rx_size = rx_status >> 16;
- pkt_size = rx_size - 4;
-
-- DPRINTK ("%s: rtl8139_rx() status %4.4x, size %4.4x,"
-- " cur %4.4x.\n", dev->name, rx_status,
-+ if (netif_msg_rx_status(tp))
-+ printk(KERN_DEBUG "%s: rtl8139_rx() status %4.4x, size %4.4x,"
-+ " cur %4.4x.\n", dev->name, rx_status,
- rx_size, cur_rx);
- #if RTL8139_DEBUG > 2
- {
-@@ -1930,9 +1973,9 @@ static void rtl8139_rx_interrupt (struct
- * Theoretically, this should never happen
- * since EarlyRx is disabled.
- */
-- if (rx_size == 0xfff0) {
-+ if (unlikely(rx_size == 0xfff0)) {
- tp->xstats.early_rx++;
-- break;
-+ goto done;
- }
-
- /* If Rx err or invalid rx_size/rx_status received
-@@ -1940,55 +1983,69 @@ static void rtl8139_rx_interrupt (struct
- * Rx process gets reset, so we abort any further
- * Rx processing.
- */
-- if ((rx_size > (MAX_ETH_FRAME_SIZE+4)) ||
-- (rx_size < 8) ||
-- (!(rx_status & RxStatusOK))) {
-+ if (unlikely((rx_size > (MAX_ETH_FRAME_SIZE+4)) ||
-+ (rx_size < 8) ||
-+ (!(rx_status & RxStatusOK)))) {
- rtl8139_rx_err (rx_status, dev, tp, ioaddr);
-- return;
-+ return -1;
- }
-
- /* Malloc up new buffer, compatible with net-2e. */
- /* Omit the four octet CRC from the length. */
-
-- /* TODO: consider allocating skb's outside of
-- * interrupt context, both to speed interrupt processing,
-- * and also to reduce the chances of having to
-- * drop packets here under memory pressure.
-- */
--
- skb = dev_alloc_skb (pkt_size + 2);
-- if (skb) {
-+ if (likely(skb)) {
- skb->dev = dev;
- skb_reserve (skb, 2); /* 16 byte align the IP fields. */
--
-+#if CONFIG_8139_RXBUF_IDX == 3
-+ wrap_copy(skb, rx_ring, ring_offset+4, pkt_size);
-+#else
- eth_copy_and_sum (skb, &rx_ring[ring_offset + 4], pkt_size, 0);
-+#endif
- skb_put (skb, pkt_size);
-
- skb->protocol = eth_type_trans (skb, dev);
-- netif_rx (skb);
-+
- dev->last_rx = jiffies;
- tp->stats.rx_bytes += pkt_size;
- tp->stats.rx_packets++;
-+
-+ netif_receive_skb (skb);
- } else {
-- printk (KERN_WARNING
-- "%s: Memory squeeze, dropping packet.\n",
-- dev->name);
-+ if (net_ratelimit())
-+ printk (KERN_WARNING
-+ "%s: Memory squeeze, dropping packet.\n",
-+ dev->name);
- tp->stats.rx_dropped++;
- }
-+ received++;
-
- cur_rx = (cur_rx + rx_size + 4 + 3) & ~3;
-- RTL_W16 (RxBufPtr, cur_rx - 16);
-+ RTL_W16 (RxBufPtr, (u16) (cur_rx - 16));
-
-- if (RTL_R16 (IntrStatus) & RxAckBits)
-+ /* Clear out errors and receive interrupts */
-+ status = RTL_R16 (IntrStatus) & RxAckBits;
-+ if (likely(status != 0)) {
-+ if (unlikely(status & (RxFIFOOver | RxOverflow))) {
-+ tp->stats.rx_errors++;
-+ if (status & RxFIFOOver)
-+ tp->stats.rx_fifo_errors++;
-+ }
- RTL_W16_F (IntrStatus, RxAckBits);
-+ }
- }
-
-+ done:
-+
-+#if RTL8139_DEBUG > 1
- DPRINTK ("%s: Done rtl8139_rx(), current %4.4x BufAddr %4.4x,"
- " free to %4.4x, Cmd %2.2x.\n", dev->name, cur_rx,
- RTL_R16 (RxBufAddr),
- RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd));
-+#endif
-
- tp->cur_rx = cur_rx;
-+ return received;
- }
-
-
-@@ -2014,14 +2071,12 @@ static void rtl8139_weird_interrupt (str
- status &= ~RxUnderrun;
- }
-
-- /* XXX along with rtl8139_rx_err, are we double-counting errors? */
-- if (status &
-- (RxUnderrun | RxOverflow | RxErr | RxFIFOOver))
-+ if (status & (RxUnderrun | RxErr))
- tp->stats.rx_errors++;
-
- if (status & PCSTimeout)
- tp->stats.rx_length_errors++;
-- if (status & (RxUnderrun | RxFIFOOver))
-+ if (status & RxUnderrun)
- tp->stats.rx_fifo_errors++;
- if (status & PCIErr) {
- u16 pci_cmd_status;
-@@ -2033,6 +2088,39 @@ static void rtl8139_weird_interrupt (str
- }
- }
-
-+static int rtl8139_poll(struct net_device *dev, int *budget)
-+{
-+ struct rtl8139_private *tp = dev->priv;
-+ void *ioaddr = tp->mmio_addr;
-+ int orig_budget = min(*budget, dev->quota);
-+ int done = 1;
-+
-+ spin_lock(&tp->rx_lock);
-+ if (likely(RTL_R16(IntrStatus) & RxAckBits)) {
-+ int work_done;
-+
-+ work_done = rtl8139_rx(dev, tp, orig_budget);
-+ if (likely(work_done > 0)) {
-+ *budget -= work_done;
-+ dev->quota -= work_done;
-+ done = (work_done < orig_budget);
-+ }
-+ }
-+
-+ if (done) {
-+ /*
-+ * Order is important since data can get interrupted
-+ * again when we think we are done.
-+ */
-+ local_irq_disable();
-+ RTL_W16_F(IntrMask, rtl8139_intr_mask);
-+ __netif_rx_complete(dev);
-+ local_irq_enable();
-+ }
-+ spin_unlock(&tp->rx_lock);
-+
-+ return !done;
-+}
-
- /* The interrupt handler does all of the Rx thread work and cleans up
- after the Tx thread. */
-@@ -2041,68 +2129,59 @@ static irqreturn_t rtl8139_interrupt (in
- {
- struct net_device *dev = (struct net_device *) dev_instance;
- struct rtl8139_private *tp = dev->priv;
-- int boguscnt = max_interrupt_work;
- void *ioaddr = tp->mmio_addr;
-- int ackstat, status;
-+ u16 status, ackstat;
- int link_changed = 0; /* avoid bogus "uninit" warning */
- int handled = 0;
-
- spin_lock (&tp->lock);
-+ status = RTL_R16 (IntrStatus);
-
-- do {
-- status = RTL_R16 (IntrStatus);
-+ /* shared irq? */
-+ if (unlikely((status & rtl8139_intr_mask) == 0))
-+ goto out;
-
-- /* h/w no longer present (hotplug?) or major error, bail */
-- if (status == 0xFFFF)
-- break;
-+ handled = 1;
-
-- if ((status &
-- (PCIErr | PCSTimeout | RxUnderrun | RxOverflow |
-- RxFIFOOver | TxErr | TxOK | RxErr | RxOK)) == 0)
-- break;
-+ /* h/w no longer present (hotplug?) or major error, bail */
-+ if (unlikely(status == 0xFFFF))
-+ goto out;
-
-- handled = 1;
-+ /* close possible race's with dev_close */
-+ if (unlikely(!netif_running(dev))) {
-+ RTL_W16 (IntrMask, 0);
-+ goto out;
-+ }
-
-- /* Acknowledge all of the current interrupt sources ASAP, but
-- an first get an additional status bit from CSCR. */
-- if (status & RxUnderrun)
-- link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit;
-+ /* Acknowledge all of the current interrupt sources ASAP, but
-+ an first get an additional status bit from CSCR. */
-+ if (unlikely(status & RxUnderrun))
-+ link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit;
-
-- /* The chip takes special action when we clear RxAckBits,
-- * so we clear them later in rtl8139_rx_interrupt
-- */
-- ackstat = status & ~(RxAckBits | TxErr);
-+ ackstat = status & ~(RxAckBits | TxErr);
-+ if (ackstat)
- RTL_W16 (IntrStatus, ackstat);
-
-- DPRINTK ("%s: interrupt status=%#4.4x ackstat=%#4.4x new intstat=%#4.4x.\n",
-- dev->name, status, ackstat, RTL_R16 (IntrStatus));
--
-- if (netif_running (dev) && (status & RxAckBits))
-- rtl8139_rx_interrupt (dev, tp, ioaddr);
--
-- /* Check uncommon events with one test. */
-- if (status & (PCIErr | PCSTimeout | RxUnderrun | RxOverflow |
-- RxFIFOOver | RxErr))
-- rtl8139_weird_interrupt (dev, tp, ioaddr,
-- status, link_changed);
--
-- if (netif_running (dev) && (status & (TxOK | TxErr))) {
-- rtl8139_tx_interrupt (dev, tp, ioaddr);
-- if (status & TxErr)
-- RTL_W16 (IntrStatus, TxErr);
-+ /* Receive packets are processed by poll routine.
-+ If not running start it now. */
-+ if (status & RxAckBits){
-+ if (netif_rx_schedule_prep(dev)) {
-+ RTL_W16_F (IntrMask, rtl8139_norx_intr_mask);
-+ __netif_rx_schedule (dev);
- }
--
-- boguscnt--;
-- } while (boguscnt > 0);
--
-- if (boguscnt <= 0) {
-- printk (KERN_WARNING "%s: Too much work at interrupt, "
-- "IntrStatus=0x%4.4x.\n", dev->name, status);
--
-- /* Clear all interrupt sources. */
-- RTL_W16 (IntrStatus, 0xffff);
- }
-
-+ /* Check uncommon events with one test. */
-+ if (unlikely(status & (PCIErr | PCSTimeout | RxUnderrun | RxErr)))
-+ rtl8139_weird_interrupt (dev, tp, ioaddr,
-+ status, link_changed);
-+
-+ if (status & (TxOK | TxErr)) {
-+ rtl8139_tx_interrupt (dev, tp, ioaddr);
-+ if (status & TxErr)
-+ RTL_W16 (IntrStatus, TxErr);
-+ }
-+ out:
- spin_unlock (&tp->lock);
-
- DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n",
-@@ -2110,6 +2189,18 @@ static irqreturn_t rtl8139_interrupt (in
- return IRQ_RETVAL(handled);
- }
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+/*
-+ * Polling receive - used by netconsole and other diagnostic tools
-+ * to allow network i/o with interrupts disabled.
-+ */
-+static void rtl8139_poll_controller(struct net_device *dev)
-+{
-+ disable_irq(dev->irq);
-+ rtl8139_interrupt(dev->irq, dev, NULL);
-+ enable_irq(dev->irq);
-+}
-+#endif
-
- static int rtl8139_close (struct net_device *dev)
- {
-@@ -2130,8 +2221,9 @@ static int rtl8139_close (struct net_dev
- }
- wait_for_completion (&tp->thr_exited);
- }
--
-- DPRINTK ("%s: Shutting down ethercard, status was 0x%4.4x.\n",
-+
-+ if (netif_msg_ifdown(tp))
-+ printk(KERN_DEBUG "%s: Shutting down ethercard, status was 0x%4.4x.\n",
- dev->name, RTL_R16 (IntrStatus));
-
- spin_lock_irqsave (&tp->lock, flags);
-@@ -2289,12 +2381,14 @@ static u32 rtl8139_get_link(struct net_d
-
- static u32 rtl8139_get_msglevel(struct net_device *dev)
- {
-- return debug;
-+ struct rtl8139_private *np = dev->priv;
-+ return np->msg_enable;
- }
-
- static void rtl8139_set_msglevel(struct net_device *dev, u32 datum)
- {
-- debug = datum;
-+ struct rtl8139_private *np = dev->priv;
-+ np->msg_enable = datum;
- }
-
- /* TODO: we are too slack to do reg dumping for pio, for now */
-@@ -2475,10 +2569,11 @@ static int rtl8139_suspend (struct pci_d
- tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
- RTL_W32 (RxMissed, 0);
-
-+ spin_unlock_irqrestore (&tp->lock, flags);
-+
- pci_set_power_state (pdev, 3);
- pci_save_state (pdev, tp->pci_state);
-
-- spin_unlock_irqrestore (&tp->lock, flags);
- return 0;
- }
-
---- linux-2.6.0/drivers/net/82596.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/82596.c 2003-12-28 23:21:00.000000000 -0800
-@@ -1129,21 +1129,40 @@ static void print_eth(unsigned char *add
- printk(" %02X%02X, %s\n", add[12], add[13], str);
- }
-
--int __init i82596_probe(struct net_device *dev)
-+static int io = 0x300;
-+static int irq = 10;
-+
-+struct net_device * __init i82596_probe(int unit)
- {
-+ struct net_device *dev;
- int i;
- struct i596_private *lp;
- char eth_addr[8];
- static int probed;
-+ int err;
-
- if (probed)
-- return -ENODEV;
-+ return ERR_PTR(-ENODEV);
- probed++;
-+
-+ dev = alloc_etherdev(0);
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ } else {
-+ dev->base_addr = io;
-+ dev->irq = irq;
-+ }
-+
- #ifdef ENABLE_MVME16x_NET
- if (MACH_IS_MVME16x) {
- if (mvme16x_config & MVME16x_CONFIG_NO_ETHERNET) {
- printk(KERN_NOTICE "Ethernet probe disabled - chip not present\n");
-- return -ENODEV;
-+ err = -ENODEV;
-+ goto out;
- }
- memcpy(eth_addr, (void *) 0xfffc1f2c, 6); /* YUCK! Get addr from NOVRAM */
- dev->base_addr = MVME_I596_BASE;
-@@ -1174,7 +1193,8 @@ int __init i82596_probe(struct net_devic
-
- if (!request_region(ioaddr, I596_TOTAL_SIZE, dev->name)) {
- printk(KERN_ERR "82596: IO address 0x%04x in use\n", ioaddr);
-- return -EBUSY;
-+ err = -EBUSY;
-+ goto out;
- }
-
- for (i = 0; i < 8; i++) {
-@@ -1190,8 +1210,8 @@ int __init i82596_probe(struct net_devic
-
- if ((checksum % 0x100) ||
- (memcmp(eth_addr, "\x00\x00\x49", 3) != 0)) {
-- release_region(ioaddr, I596_TOTAL_SIZE);
-- return -ENODEV;
-+ err = -ENODEV;
-+ goto out1;
- }
-
- dev->base_addr = ioaddr;
-@@ -1200,13 +1220,10 @@ int __init i82596_probe(struct net_devic
- #endif
- dev->mem_start = (int)__get_free_pages(GFP_ATOMIC, 0);
- if (!dev->mem_start) {
--#ifdef ENABLE_APRICOT
-- release_region(dev->base_addr, I596_TOTAL_SIZE);
--#endif
-- return -ENOMEM;
-+ err = -ENOMEM;
-+ goto out1;
- }
-
-- ether_setup(dev);
- DEB(DEB_PROBE,printk(KERN_INFO "%s: 82596 at %#3lx,", dev->name, dev->base_addr));
-
- for (i = 0; i < 6; i++)
-@@ -1244,7 +1261,26 @@ int __init i82596_probe(struct net_devic
- lp->scb.rfd = I596_NULL;
- lp->lock = SPIN_LOCK_UNLOCKED;
-
-- return 0;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out2;
-+ return dev;
-+out2:
-+#ifdef __mc68000__
-+ /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING,
-+ * XXX which may be invalid (CONFIG_060_WRITETHROUGH)
-+ */
-+ kernel_set_cachemode((void *)(dev->mem_start), 4096,
-+ IOMAP_FULL_CACHING);
-+#endif
-+ free_page ((u32)(dev->mem_start));
-+out1:
-+#ifdef ENABLE_APRICOT
-+ release_region(dev->base_addr, I596_TOTAL_SIZE);
-+#endif
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static irqreturn_t i596_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-@@ -1532,11 +1568,9 @@ static void set_multicast_list(struct ne
- }
-
- #ifdef MODULE
--static struct net_device dev_82596 = { .init = i82596_probe };
-+static struct net_device *dev_82596;
-
- #ifdef ENABLE_APRICOT
--static int io = 0x300;
--static int irq = 10;
- MODULE_PARM(irq, "i");
- MODULE_PARM_DESC(irq, "Apricot IRQ number");
- #endif
-@@ -1547,34 +1581,31 @@ static int debug = -1;
-
- int init_module(void)
- {
--#ifdef ENABLE_APRICOT
-- dev_82596.base_addr = io;
-- dev_82596.irq = irq;
--#endif
- if (debug >= 0)
- i596_debug = debug;
-- if (register_netdev(&dev_82596) != 0)
-- return -EIO;
-+ dev_82596 = i82596_probe(-1);
-+ if (IS_ERR(dev_82596))
-+ return PTR_ERR(dev_82596);
- return 0;
- }
-
- void cleanup_module(void)
- {
-- unregister_netdev(&dev_82596);
-+ unregister_netdev(dev_82596);
- #ifdef __mc68000__
- /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING,
- * XXX which may be invalid (CONFIG_060_WRITETHROUGH)
- */
-
-- kernel_set_cachemode((void *)(dev_82596.mem_start), 4096,
-+ kernel_set_cachemode((void *)(dev_82596->mem_start), 4096,
- IOMAP_FULL_CACHING);
- #endif
-- free_page ((u32)(dev_82596.mem_start));
-- dev_82596.priv = NULL;
-+ free_page ((u32)(dev_82596->mem_start));
- #ifdef ENABLE_APRICOT
- /* If we don't do this, we can't re-insmod it later. */
-- release_region(dev_82596.base_addr, I596_TOTAL_SIZE);
-+ release_region(dev_82596->base_addr, I596_TOTAL_SIZE);
- #endif
-+ free_netdev(dev_82596);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/8390.c 2003-09-27 18:57:44.000000000 -0700
-+++ 25/drivers/net/8390.c 2003-12-28 23:21:00.000000000 -0800
-@@ -157,15 +157,8 @@ static void do_set_multicast_list(struct
- int ei_open(struct net_device *dev)
- {
- unsigned long flags;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
-
-- /* This can't happen unless somebody forgot to call ethdev_init(). */
-- if (ei_local == NULL)
-- {
-- printk(KERN_EMERG "%s: ei_open passed a non-existent device!\n", dev->name);
-- return -ENXIO;
-- }
--
- /* The card I/O part of the driver (e.g. 3c503) can hook a Tx timeout
- wrapper that does e.g. media check & then calls ei_tx_timeout. */
- if (dev->tx_timeout == NULL)
-@@ -196,7 +189,7 @@ int ei_open(struct net_device *dev)
- */
- int ei_close(struct net_device *dev)
- {
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- unsigned long flags;
-
- /*
-@@ -221,7 +214,7 @@ int ei_close(struct net_device *dev)
- void ei_tx_timeout(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int txsr, isr, tickssofar = jiffies - dev->trans_start;
- unsigned long flags;
-
-@@ -267,7 +260,7 @@ void ei_tx_timeout(struct net_device *de
- static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int length, send_length, output_page;
- unsigned long flags;
- char scratch[ETH_ZLEN];
-@@ -435,7 +428,7 @@ irqreturn_t ei_interrupt(int irq, void *
- }
-
- e8390_base = dev->base_addr;
-- ei_local = (struct ei_device *) dev->priv;
-+ ei_local = (struct ei_device *) netdev_priv(dev);
-
- /*
- * Protect the irq test too.
-@@ -540,7 +533,7 @@ irqreturn_t ei_interrupt(int irq, void *
- static void ei_tx_err(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- unsigned char txsr = inb_p(e8390_base+EN0_TSR);
- unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
-
-@@ -583,7 +576,7 @@ static void ei_tx_err(struct net_device
- static void ei_tx_intr(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int status = inb(e8390_base + EN0_TSR);
-
- outb_p(ENISR_TX, e8390_base + EN0_ISR); /* Ack intr. */
-@@ -675,7 +668,7 @@ static void ei_tx_intr(struct net_device
- static void ei_receive(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- unsigned char rxing_page, this_frame, next_frame;
- unsigned short current_offset;
- int rx_pkt_count = 0;
-@@ -813,7 +806,7 @@ static void ei_rx_overrun(struct net_dev
- {
- long e8390_base = dev->base_addr;
- unsigned char was_txing, must_resend = 0;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
-
- /*
- * Record whether a Tx was in progress and then issue the
-@@ -881,7 +874,7 @@ static void ei_rx_overrun(struct net_dev
- static struct net_device_stats *get_stats(struct net_device *dev)
- {
- long ioaddr = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- unsigned long flags;
-
- /* If the card is stopped, just return the present stats. */
-@@ -936,7 +929,7 @@ static void do_set_multicast_list(struct
- {
- long e8390_base = dev->base_addr;
- int i;
-- struct ei_device *ei_local = (struct ei_device*)dev->priv;
-+ struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev);
-
- if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI)))
- {
-@@ -990,53 +983,34 @@ static void do_set_multicast_list(struct
- static void set_multicast_list(struct net_device *dev)
- {
- unsigned long flags;
-- struct ei_device *ei_local = (struct ei_device*)dev->priv;
-+ struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev);
-
- spin_lock_irqsave(&ei_local->page_lock, flags);
- do_set_multicast_list(dev);
- spin_unlock_irqrestore(&ei_local->page_lock, flags);
- }
-
--static inline void ei_device_init(struct ei_device *ei_local)
--{
-- spin_lock_init(&ei_local->page_lock);
--}
--
- /**
-- * ethdev_init - init rest of 8390 device struct
-+ * ethdev_setup - init rest of 8390 device struct
- * @dev: network device structure to init
- *
- * Initialize the rest of the 8390 device structure. Do NOT __init
- * this, as it is used by 8390 based modular drivers too.
- */
-
--int ethdev_init(struct net_device *dev)
-+static void ethdev_setup(struct net_device *dev)
- {
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- if (ei_debug > 1)
- printk(version);
-
-- if (dev->priv == NULL)
-- {
-- dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL);
-- if (dev->priv == NULL)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct ei_device));
-- ei_device_init(dev->priv);
-- }
--
- dev->hard_start_xmit = &ei_start_xmit;
- dev->get_stats = get_stats;
- dev->set_multicast_list = &set_multicast_list;
-
- ether_setup(dev);
--
-- return 0;
--}
-
--/* wrapper to make alloc_netdev happy; probably should just cast... */
--static void __ethdev_init(struct net_device *dev)
--{
-- ethdev_init(dev);
-+ spin_lock_init(&ei_local->page_lock);
- }
-
- /**
-@@ -1044,15 +1018,10 @@ static void __ethdev_init(struct net_dev
- *
- * Allocate 8390-specific net_device.
- */
--struct net_device *alloc_ei_netdev(void)
-+struct net_device *__alloc_ei_netdev(int size)
- {
-- struct net_device *dev;
--
-- dev = alloc_netdev(sizeof(struct ei_device), "eth%d", __ethdev_init);
-- if (dev)
-- ei_device_init(dev->priv);
--
-- return dev;
-+ return alloc_netdev(sizeof(struct ei_device) + size, "eth%d",
-+ ethdev_setup);
- }
-
- \f
-@@ -1072,7 +1041,7 @@ struct net_device *alloc_ei_netdev(void)
- void NS8390_init(struct net_device *dev, int startp)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int i;
- int endcfg = ei_local->word16
- ? (0x48 | ENDCFG_WTS | (ei_local->bigendian ? ENDCFG_BOS : 0))
-@@ -1136,7 +1105,7 @@ static void NS8390_trigger_send(struct n
- int start_page)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev);
-
- outb_p(E8390_NODMA+E8390_PAGE0, e8390_base+E8390_CMD);
-
-@@ -1156,9 +1125,8 @@ EXPORT_SYMBOL(ei_open);
- EXPORT_SYMBOL(ei_close);
- EXPORT_SYMBOL(ei_interrupt);
- EXPORT_SYMBOL(ei_tx_timeout);
--EXPORT_SYMBOL(ethdev_init);
- EXPORT_SYMBOL(NS8390_init);
--EXPORT_SYMBOL(alloc_ei_netdev);
-+EXPORT_SYMBOL(__alloc_ei_netdev);
-
- #if defined(MODULE)
-
---- linux-2.6.0/drivers/net/8390.h 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/8390.h 2003-12-28 23:21:00.000000000 -0800
-@@ -39,12 +39,15 @@ extern int ei_debug;
- #define ei_debug 1
- #endif
-
--extern int ethdev_init(struct net_device *dev);
- extern void NS8390_init(struct net_device *dev, int startp);
- extern int ei_open(struct net_device *dev);
- extern int ei_close(struct net_device *dev);
- extern irqreturn_t ei_interrupt(int irq, void *dev_id, struct pt_regs *regs);
--extern struct net_device *alloc_ei_netdev(void);
-+extern struct net_device *__alloc_ei_netdev(int size);
-+static inline struct net_device *alloc_ei_netdev(void)
-+{
-+ return __alloc_ei_netdev(0);
-+}
-
- /* You have one of these per-board */
- struct ei_device {
-@@ -84,7 +87,7 @@ struct ei_device {
- /* The maximum time waited (in jiffies) before assuming a Tx failed. (20ms) */
- #define TX_TIMEOUT (20*HZ/100)
-
--#define ei_status (*(struct ei_device *)(dev->priv))
-+#define ei_status (*(struct ei_device *)netdev_priv(dev))
-
- /* Some generic ethernet register configurations. */
- #define E8390_TX_IRQ_MASK 0xa /* For register EN0_ISR */
---- linux-2.6.0/drivers/net/a2065.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/a2065.c 2003-12-28 23:21:00.000000000 -0800
-@@ -737,7 +737,7 @@ static int __init a2065_probe(void)
- continue;
- }
-
-- dev = init_etherdev(NULL, sizeof(struct lance_private));
-+ dev = alloc_etherdev(sizeof(struct lance_private));
-
- if (dev == NULL) {
- release_resource(r1);
-@@ -791,17 +791,22 @@ static int __init a2065_probe(void)
- dev->set_multicast_list = &lance_set_multicast;
- dev->dma = 0;
-
--#ifdef MODULE
-- priv->next_module = root_a2065_dev;
-- root_a2065_dev = priv;
--#endif
-- ether_setup(dev);
- init_timer(&priv->multicast_timer);
- priv->multicast_timer.data = (unsigned long) dev;
- priv->multicast_timer.function =
- (void (*)(unsigned long)) &lance_set_multicast;
-
-- res = 0;
-+ res = register_netdev(dev);
-+ if (res) {
-+ release_resource(r1);
-+ release_resource(r2);
-+ free_netdev(dev);
-+ break;
-+ }
-+#ifdef MODULE
-+ priv->next_module = root_a2065_dev;
-+ root_a2065_dev = priv;
-+#endif
- }
- return res;
- }
---- linux-2.6.0/drivers/net/ac3200.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ac3200.c 2003-12-28 23:21:00.000000000 -0800
-@@ -75,7 +75,6 @@ static const char *port_name[4] = { "10b
- #define AC_START_PG 0x00 /* First page of 8390 TX buffer */
- #define AC_STOP_PG 0x80 /* Last page +1 of the 8390 RX ring */
-
--int ac3200_probe(struct net_device *dev);
- static int ac_probe1(int ioaddr, struct net_device *dev);
-
- static int ac_open(struct net_device *dev);
-@@ -96,9 +95,11 @@ static int ac_close_card(struct net_devi
- or the unique value in the station address PROM.
- */
-
--int __init ac3200_probe(struct net_device *dev)
-+static int __init do_ac3200_probe(struct net_device *dev)
- {
- unsigned short ioaddr = dev->base_addr;
-+ int irq = dev->irq;
-+ int mem_start = dev->mem_start;
-
- SET_MODULE_OWNER(dev);
-
-@@ -110,13 +111,50 @@ int __init ac3200_probe(struct net_devic
- if ( ! EISA_bus)
- return -ENXIO;
-
-- for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000)
-+ for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
- if (ac_probe1(ioaddr, dev) == 0)
- return 0;
-+ dev->irq = irq;
-+ dev->mem_start = mem_start;
-+ }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ /* Someday free_irq may be in ac_close_card() */
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, AC_IO_EXTENT);
-+ if (ei_status.reg0)
-+ iounmap((void *)dev->mem_start);
-+}
-+
-+struct net_device * __init ac3200_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_ac3200_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init ac_probe1(int ioaddr, struct net_device *dev)
- {
- int i, retval;
-@@ -156,13 +194,6 @@ static int __init ac_probe1(int ioaddr,
- }
- #endif
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (", unable to allocate memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out;
-- }
--
- /* Assign and allocate the interrupt now. */
- if (dev->irq == 0) {
- dev->irq = config2irq(inb(ioaddr + AC_CONFIG));
-@@ -210,7 +241,7 @@ static int __init ac_probe1(int ioaddr,
- printk(KERN_CRIT "ac3200.c: or to an address above 0x%lx.\n", virt_to_phys(high_memory));
- printk(KERN_CRIT "ac3200.c: Driver NOT installed.\n");
- retval = -EINVAL;
-- goto out2;
-+ goto out1;
- }
- dev->mem_start = (unsigned long)ioremap(dev->mem_start, AC_STOP_PG*0x100);
- if (dev->mem_start == 0) {
-@@ -218,7 +249,7 @@ static int __init ac_probe1(int ioaddr,
- printk(KERN_ERR "ac3200.c: Try using EISA SCU to set memory below 1MB.\n");
- printk(KERN_ERR "ac3200.c: Driver NOT installed.\n");
- retval = -EINVAL;
-- goto out2;
-+ goto out1;
- }
- ei_status.reg0 = 1; /* Use as remap flag */
- printk("ac3200.c: remapped %dkB card memory to virtual address %#lx\n",
-@@ -247,11 +278,8 @@ static int __init ac_probe1(int ioaddr,
- dev->stop = &ac_close_card;
- NS8390_init(dev, 0);
- return 0;
--out2:
-- free_irq(dev->irq, dev);
- out1:
-- kfree(dev->priv);
-- dev->priv = NULL;
-+ free_irq(dev->irq, dev);
- out:
- release_region(ioaddr, AC_IO_EXTENT);
- return retval;
-@@ -338,7 +366,7 @@ static int ac_close_card(struct net_devi
-
- #ifdef MODULE
- #define MAX_AC32_CARDS 4 /* Max number of AC32 cards per module */
--static struct net_device dev_ac32[MAX_AC32_CARDS];
-+static struct net_device *dev_ac32[MAX_AC32_CARDS];
- static int io[MAX_AC32_CARDS];
- static int irq[MAX_AC32_CARDS];
- static int mem[MAX_AC32_CARDS];
-@@ -354,26 +382,32 @@ MODULE_LICENSE("GPL");
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_AC32_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ac32[this_dev];
-+ if (io[this_dev] == 0 && this_dev != 0)
-+ break;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
- dev->irq = irq[this_dev];
- dev->base_addr = io[this_dev];
- dev->mem_start = mem[this_dev]; /* Currently ignored by driver */
-- dev->init = ac3200_probe;
-- /* Default is to only install one card. */
-- if (io[this_dev] == 0 && this_dev != 0) break;
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "ac3200.c: No ac3200 card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ if (do_ac3200_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_ac32[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-- }
-- return 0;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "ac3200.c: No ac3200 card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
-+ }
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -382,16 +416,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_AC32_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ac32[this_dev];
-- if (dev->priv != NULL) {
-- /* Someday free_irq may be in ac_close_card() */
-- free_irq(dev->irq, dev);
-- release_region(dev->base_addr, AC_IO_EXTENT);
-- if (ei_status.reg0)
-- iounmap((void *)dev->mem_start);
-+ struct net_device *dev = dev_ac32[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(dev->priv);
-- dev->priv = NULL;
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/amd8111e.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/amd8111e.c 2003-12-28 23:21:00.000000000 -0800
-@@ -1153,6 +1153,17 @@ err_no_interrupt:
- return IRQ_RETVAL(handled);
- }
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void amd8111e_poll(struct net_device *dev)
-+{
-+ unsigned long flags;
-+ local_save_flags(flags);
-+ local_irq_disable();
-+ amd8111e_interrupt(0, dev, NULL);
-+ local_irq_restore(flags);
-+}
-+#endif
-+
- /*
- This function closes the network interface and updates the statistics so that most recent statistics will be available after the interface is down.
- */
-@@ -1884,6 +1895,9 @@ static int __devinit amd8111e_probe_one(
- dev->irq =pdev->irq;
- dev->tx_timeout = amd8111e_tx_timeout;
- dev->watchdog_timeo = AMD8111E_TX_TIMEOUT;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = amd8111e_poll;
-+#endif
-
- #if AMD8111E_VLAN_TAG_USED
- dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
---- linux-2.6.0/drivers/net/apne.c 2003-06-14 12:18:51.000000000 -0700
-+++ 25/drivers/net/apne.c 2003-12-28 23:21:00.000000000 -0800
-@@ -72,7 +72,7 @@
- #define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */
-
-
--int apne_probe(struct net_device *dev);
-+struct net_device * __init apne_probe(int unit);
- static int apne_probe1(struct net_device *dev, int ioaddr);
-
- static int apne_open(struct net_device *dev);
-@@ -116,28 +116,37 @@ static const char version[] =
-
- static int apne_owned; /* signal if card already owned */
-
--int __init apne_probe(struct net_device *dev)
-+struct net_device * __init apne_probe(int unit)
- {
-+ struct net_device *dev;
- #ifndef MANUAL_CONFIG
- char tuple[8];
- #endif
-+ int err;
-
- if (apne_owned)
-- return -ENODEV;
--
-- SET_MODULE_OWNER(dev);
-+ return ERR_PTR(-ENODEV);
-
- if ( !(AMIGAHW_PRESENT(PCMCIA)) )
-- return (-ENODEV);
-+ return ERR_PTR(-ENODEV);
-
- printk("Looking for PCMCIA ethernet card : ");
-
- /* check if a card is inserted */
- if (!(PCMCIA_INSERTED)) {
- printk("NO PCMCIA card inserted\n");
-- return (-ENODEV);
-+ return ERR_PTR(-ENODEV);
- }
--
-+
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-+ SET_MODULE_OWNER(dev);
-+
- /* disable pcmcia irq for readtuple */
- pcmcia_disable_irq();
-
-@@ -145,17 +154,41 @@ int __init apne_probe(struct net_device
- if ((pcmcia_copy_tuple(CISTPL_FUNCID, tuple, 8) < 3) ||
- (tuple[2] != CISTPL_FUNCID_NETWORK)) {
- printk("not an ethernet card\n");
-- return (-ENODEV);
-+ /* XXX: shouldn't we re-enable irq here? */
-+ free_netdev(dev);
-+ return ERR_PTR(-ENODEV);
- }
- #endif
-
- printk("ethernet PCMCIA card inserted\n");
-
-- if (init_pcmcia())
-- return apne_probe1(dev, IOBASE);
-- else
-- return (-ENODEV);
-+ if (!init_pcmcia()) {
-+ /* XXX: shouldn't we re-enable irq here? */
-+ free_netdev(dev);
-+ return ERR_PTR(-ENODEV);
-+ }
-
-+ if (!request_region(IOBASE, 0x20, dev->name)) {
-+ free_netdev(dev);
-+ return ERR_PTR(-EBUSY);
-+ }
-+
-+ err = apne_probe1(dev, IOBASE);
-+ if (err) {
-+ release_region(IOBASE, 0x20);
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+ }
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-+
-+ pcmcia_disable_irq();
-+ free_irq(IRQ_AMIGA_PORTS, dev);
-+ pcmcia_reset();
-+ release_region(IOBASE, 0x20);
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int __init apne_probe1(struct net_device *dev, int ioaddr)
-@@ -280,13 +313,6 @@ static int __init apne_probe1(struct net
- i = request_irq(IRQ_AMIGA_PORTS, apne_interrupt, SA_SHIRQ, dev->name, dev);
- if (i) return i;
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (" unable to get memory for dev->priv.\n");
-- free_irq(IRQ_AMIGA_PORTS, dev);
-- return -ENOMEM;
-- }
--
- for(i = 0; i < ETHER_ADDR_LEN; i++) {
- printk(" %2.2x", SA_prom[i]);
- dev->dev_addr[i] = SA_prom[i];
-@@ -534,32 +560,27 @@ static irqreturn_t apne_interrupt(int ir
- }
-
- #ifdef MODULE
--static struct net_device apne_dev;
-+static struct net_device *apne_dev;
-
- int init_module(void)
- {
-- int err;
--
-- apne_dev.init = apne_probe;
-- if ((err = register_netdev(&apne_dev))) {
-- if (err == -EIO)
-- printk("No PCMCIA NEx000 ethernet card found.\n");
-- return (err);
-- }
-- return (0);
-+ apne_dev = apne_probe(-1);
-+ if (IS_ERR(apne_dev))
-+ return PTR_ERR(apne_dev);
-+ return 0;
- }
-
- void cleanup_module(void)
- {
-- unregister_netdev(&apne_dev);
-+ unregister_netdev(apne_dev);
-
- pcmcia_disable_irq();
-
-- free_irq(IRQ_AMIGA_PORTS, &apne_dev);
-+ free_irq(IRQ_AMIGA_PORTS, apne_dev);
-
- pcmcia_reset();
-
-- apne_owned = 0;
-+ free_netdev(apne_dev);
- }
-
- #endif
---- linux-2.6.0/drivers/net/appletalk/ipddp.c 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/net/appletalk/ipddp.c 2003-12-28 23:21:00.000000000 -0800
-@@ -28,6 +28,7 @@
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
- #include <linux/ip.h>
- #include <linux/atalk.h>
- #include <linux/if_arp.h>
-@@ -55,34 +56,24 @@ static struct ipddp_route* ipddp_find_ro
- static int ipddp_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-
-
--static int __init ipddp_init(struct net_device *dev)
-+static struct net_device * __init ipddp_init(void)
- {
- static unsigned version_printed;
-+ struct net_device *dev;
-+ int err;
-+
-+ dev = alloc_etherdev(sizeof(struct net_device_stats));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
- SET_MODULE_OWNER(dev);
-+ strcpy(dev->name, "ipddp%d");
-
- if (version_printed++ == 0)
- printk(version);
-
-- /* Let the user now what mode we are in */
-- if(ipddp_mode == IPDDP_ENCAP)
-- printk("%s: Appletalk-IP Encap. mode by Bradford W. Johnson <johns393@maroon.tc.umn.edu>\n",
-- dev->name);
-- if(ipddp_mode == IPDDP_DECAP)
-- printk("%s: Appletalk-IP Decap. mode by Jay Schulist <jschlst@samba.org>\n",
-- dev->name);
--
-- /* Fill in the device structure with ethernet-generic values. */
-- ether_setup(dev);
--
- /* Initalize the device structure. */
- dev->hard_start_xmit = ipddp_xmit;
--
-- dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL);
-- if(!dev->priv)
-- return -ENOMEM;
-- memset(dev->priv,0,sizeof(struct net_device_stats));
--
- dev->get_stats = ipddp_get_stats;
- dev->do_ioctl = ipddp_ioctl;
-
-@@ -97,7 +88,21 @@ static int __init ipddp_init(struct net_
- */
- dev->hard_header_len = 14+8+sizeof(struct ddpehdr)+1;
-
-- return 0;
-+ err = register_netdev(dev);
-+ if (err) {
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+ }
-+
-+ /* Let the user now what mode we are in */
-+ if(ipddp_mode == IPDDP_ENCAP)
-+ printk("%s: Appletalk-IP Encap. mode by Bradford W. Johnson <johns393@maroon.tc.umn.edu>\n",
-+ dev->name);
-+ if(ipddp_mode == IPDDP_DECAP)
-+ printk("%s: Appletalk-IP Decap. mode by Jay Schulist <jschlst@samba.org>\n",
-+ dev->name);
-+
-+ return dev;
- }
-
- /*
-@@ -281,23 +286,16 @@ static int ipddp_ioctl(struct net_device
- }
- }
-
--static struct net_device dev_ipddp;
-+static struct net_device *dev_ipddp;
-
- MODULE_LICENSE("GPL");
- MODULE_PARM(ipddp_mode, "i");
-
- static int __init ipddp_init_module(void)
- {
-- int err;
--
-- dev_ipddp.init = ipddp_init;
-- err=dev_alloc_name(&dev_ipddp, "ipddp%d");
-- if(err < 0)
-- return err;
--
-- if(register_netdev(&dev_ipddp) != 0)
-- return -EIO;
--
-+ dev_ipddp = ipddp_init();
-+ if (IS_ERR(dev_ipddp))
-+ return PTR_ERR(dev_ipddp);
- return 0;
- }
-
-@@ -305,8 +303,8 @@ static void __exit ipddp_cleanup_module(
- {
- struct ipddp_route *p;
-
-- unregister_netdev(&dev_ipddp);
-- kfree(dev_ipddp.priv);
-+ unregister_netdev(dev_ipddp);
-+ free_netdev(dev_ipddp);
-
- while (ipddp_route_list) {
- p = ipddp_route_list->next;
---- linux-2.6.0/drivers/net/appletalk/ltpc.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/appletalk/ltpc.c 2003-12-28 23:21:00.000000000 -0800
-@@ -1213,7 +1213,7 @@ out3:
- out2:
- release_region(io, 8);
- out1:
-- kfree(dev);
-+ free_netdev(dev);
- out:
- return ERR_PTR(err);
- }
---- linux-2.6.0/drivers/net/arcnet/arcnet.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/arcnet/arcnet.c 2003-12-28 23:21:00.000000000 -0800
-@@ -92,6 +92,7 @@ EXPORT_SYMBOL(arc_proto_null);
- EXPORT_SYMBOL(arcnet_unregister_proto);
- EXPORT_SYMBOL(arcnet_debug);
- EXPORT_SYMBOL(arcdev_setup);
-+EXPORT_SYMBOL(alloc_arcdev);
- EXPORT_SYMBOL(arcnet_interrupt);
-
- /* Internal function prototypes */
-@@ -331,6 +332,11 @@ void arcdev_setup(struct net_device *dev
- dev->rebuild_header = arcnet_rebuild_header;
- }
-
-+struct net_device *alloc_arcdev(char *name)
-+{
-+ return alloc_netdev(sizeof(struct arcnet_local),
-+ name && *name ? name : "arc%d", arcdev_setup);
-+}
-
- /*
- * Open/initialize the board. This is called sometime after booting when
---- linux-2.6.0/drivers/net/arcnet/arc-rimi.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/arcnet/arc-rimi.c 2003-12-28 23:21:00.000000000 -0800
-@@ -26,6 +26,7 @@
- */
- #include <linux/kernel.h>
- #include <linux/module.h>
-+#include <linux/moduleparam.h>
- #include <linux/ioport.h>
- #include <linux/slab.h>
- #include <linux/delay.h>
-@@ -85,8 +86,6 @@ static void arcrimi_copy_from_card(struc
- */
- static int __init arcrimi_probe(struct net_device *dev)
- {
-- int retval;
--
- BUGLVL(D_NORMAL) printk(VERSION);
- BUGLVL(D_NORMAL) printk("E-mail me if you actually test the RIM I driver, please!\n");
-
-@@ -114,11 +113,7 @@ static int __init arcrimi_probe(struct n
- "ID!\n");
- return -ENODEV;
- }
-- retval = arcrimi_found(dev);
-- if (retval < 0) {
-- release_mem_region(dev->mem_start, BUFFER_SIZE);
-- }
-- return retval;
-+ return arcrimi_found(dev);
- }
-
-
-@@ -129,11 +124,13 @@ static int __init arcrimi_probe(struct n
- static int __init arcrimi_found(struct net_device *dev)
- {
- struct arcnet_local *lp;
-- u_long first_mirror, last_mirror, shmem;
-+ unsigned long first_mirror, last_mirror, shmem;
- int mirror_size;
-+ int err;
-
- /* reserve the irq */
- if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev)) {
-+ release_mem_region(dev->mem_start, BUFFER_SIZE);
- BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq);
- return -ENODEV;
- }
-@@ -168,11 +165,7 @@ static int __init arcrimi_found(struct n
-
- /* initialize the rest of the device structure. */
-
-- lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
-- if (!lp) {
-- BUGMSG(D_NORMAL, "Can't allocate device data!\n");
-- goto err_free_irq;
-- }
-+ lp = dev->priv;
- lp->card_name = "RIM I";
- lp->hw.command = arcrimi_command;
- lp->hw.status = arcrimi_status;
-@@ -181,18 +174,6 @@ static int __init arcrimi_found(struct n
- lp->hw.owner = THIS_MODULE;
- lp->hw.copy_to_card = arcrimi_copy_to_card;
- lp->hw.copy_from_card = arcrimi_copy_from_card;
-- lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1);
-- if (!lp->mem_start) {
-- BUGMSG(D_NORMAL, "Can't remap device memory!\n");
-- goto err_free_dev_priv;
-- }
-- /* Fill in the fields of the device structure with generic
-- * values.
-- */
-- arcdev_setup(dev);
--
-- /* get and check the station ID from offset 1 in shmem */
-- dev->dev_addr[0] = readb(lp->mem_start + 1);
-
- /*
- * re-reserve the memory region - arcrimi_probe() alloced this reqion
-@@ -200,25 +181,40 @@ static int __init arcrimi_found(struct n
- * with the correct size. There is a VERY slim chance this could
- * fail.
- */
-- release_mem_region(dev->mem_start, BUFFER_SIZE);
-+ release_mem_region(shmem, BUFFER_SIZE);
- if (!request_mem_region(dev->mem_start,
- dev->mem_end - dev->mem_start + 1,
- "arcnet (90xx)")) {
- BUGMSG(D_NORMAL, "Card memory already allocated\n");
-- goto err_free_dev_priv;
-+ goto err_free_irq;
- }
-
-+ lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1);
-+ if (!lp->mem_start) {
-+ BUGMSG(D_NORMAL, "Can't remap device memory!\n");
-+ goto err_release_mem;
-+ }
-+
-+ /* get and check the station ID from offset 1 in shmem */
-+ dev->dev_addr[0] = readb(lp->mem_start + 1);
-+
- BUGMSG(D_NORMAL, "ARCnet RIM I: station %02Xh found at IRQ %d, "
- "ShMem %lXh (%ld*%d bytes).\n",
- dev->dev_addr[0],
- dev->irq, dev->mem_start,
- (dev->mem_end - dev->mem_start + 1) / mirror_size, mirror_size);
-
-+ err = register_netdev(dev);
-+ if (err)
-+ goto err_unmap;
-+
- return 0;
-
-- err_free_dev_priv:
-- kfree(dev->priv);
-- err_free_irq:
-+err_unmap:
-+ iounmap(lp->mem_start);
-+err_release_mem:
-+ release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
-+err_free_irq:
- free_irq(dev->irq, dev);
- return -EIO;
- }
-@@ -294,94 +290,79 @@ static void arcrimi_copy_from_card(struc
- TIME("memcpy_fromio", count, memcpy_fromio(buf, memaddr, count));
- }
-
--#ifdef MODULE
-+static int node;
-+static int io; /* use the insmod io= irq= node= options */
-+static int irq;
-+static char device[9]; /* use eg. device=arc1 to change name */
-+
-+module_param(node, int, 0);
-+module_param(io, int, 0);
-+module_param(irq, int, 0);
-+module_param_string(device, device, sizeof(device), 0);
-+MODULE_LICENSE("GPL");
-
- static struct net_device *my_dev;
-
--/* Module parameters */
--
--static int node = 0;
--static int io = 0x0; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */
--static int irq = 0; /* or use the insmod io= irq= shmem= options */
--static char *device; /* use eg. device="arc1" to change name */
--
--MODULE_PARM(node, "i");
--MODULE_PARM(io, "i");
--MODULE_PARM(irq, "i");
--MODULE_PARM(device, "s");
--MODULE_LICENSE("GPL");
--
--int init_module(void)
-+static int __init arc_rimi_init(void)
- {
- struct net_device *dev;
-- int err;
-
-- dev = dev_alloc(device ? : "arc%d", &err);
-+ dev = alloc_arcdev(device);
- if (!dev)
-- return err;
-+ return -ENOMEM;
-
- if (node && node != 0xff)
- dev->dev_addr[0] = node;
-
-- dev->base_addr = io;
-+ dev->mem_start = io;
- dev->irq = irq;
- if (dev->irq == 2)
- dev->irq = 9;
-
-- if (arcrimi_probe(dev))
-+ if (arcrimi_probe(dev)) {
-+ free_netdev(dev);
- return -EIO;
-+ }
-
- my_dev = dev;
- return 0;
- }
-
--void cleanup_module(void)
-+static void __exit arc_rimi_exit(void)
- {
- struct net_device *dev = my_dev;
- struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
-
- unregister_netdev(dev);
-- free_irq(dev->irq, dev);
- iounmap(lp->mem_start);
- release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
-- kfree(dev->priv);
-+ free_irq(dev->irq, dev);
- free_netdev(dev);
- }
-
--#else
--
-+#ifndef MODULE
- static int __init arcrimi_setup(char *s)
- {
-- struct net_device *dev;
- int ints[8];
--
- s = get_options(s, 8, ints);
- if (!ints[0])
- return 1;
-- dev = alloc_bootmem(sizeof(struct net_device));
-- memset(dev, 0, sizeof(struct net_device));
-- dev->init = arcrimi_probe;
--
- switch (ints[0]) {
- default: /* ERROR */
- printk("arcrimi: Too many arguments.\n");
- case 3: /* Node ID */
-- dev->dev_addr[0] = ints[3];
-+ node = ints[3];
- case 2: /* IRQ */
-- dev->irq = ints[2];
-+ irq = ints[2];
- case 1: /* IO address */
-- dev->mem_start = ints[1];
-+ io = ints[1];
- }
- if (*s)
-- strncpy(dev->name, s, 9);
-- else
-- strcpy(dev->name, "arc%d");
-- if (register_netdev(dev))
-- printk(KERN_ERR "arc-rimi: Cannot register arcnet device\n");
--
-+ snprintf(device, sizeof(device), "%s", s);
- return 1;
- }
--
- __setup("arcrimi=", arcrimi_setup);
--
- #endif /* MODULE */
-+
-+module_init(arc_rimi_init)
-+module_exit(arc_rimi_exit)
---- linux-2.6.0/drivers/net/arcnet/com20020.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/arcnet/com20020.c 2003-12-28 23:21:00.000000000 -0800
-@@ -172,11 +172,6 @@ int com20020_found(struct net_device *de
-
- dev->set_multicast_list = com20020_set_mc_list;
-
-- /* Fill in the fields of the device structure with generic
-- * values.
-- */
-- arcdev_setup(dev);
--
- if (!dev->dev_addr[0])
- dev->dev_addr[0] = inb(ioaddr + 8); /* FIXME: do this some other way! */
-
-@@ -221,7 +216,7 @@ int com20020_found(struct net_device *de
- lp->setup >> 1,
- clockrates[3 - ((lp->setup2 & 0xF0) >> 4) + ((lp->setup & 0x0F) >> 1)]);
-
-- if (!dev->init && register_netdev(dev)) {
-+ if (register_netdev(dev)) {
- free_irq(dev->irq, dev);
- return -EIO;
- }
-@@ -332,19 +327,10 @@ static void com20020_set_mc_list(struct
- }
- }
-
--void com20020_remove(struct net_device *dev)
--{
-- unregister_netdev(dev);
-- free_irq(dev->irq, dev);
-- kfree(dev->priv);
-- free_netdev(dev);
--}
--
- #ifdef MODULE
-
- EXPORT_SYMBOL(com20020_check);
- EXPORT_SYMBOL(com20020_found);
--EXPORT_SYMBOL(com20020_remove);
-
- MODULE_LICENSE("GPL");
-
---- linux-2.6.0/drivers/net/arcnet/com20020-isa.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/arcnet/com20020-isa.c 2003-12-28 23:21:00.000000000 -0800
-@@ -26,6 +26,7 @@
- * **********************
- */
- #include <linux/module.h>
-+#include <linux/moduleparam.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/ioport.h>
-@@ -117,49 +118,41 @@ out:
- return err;
- }
-
--
--#ifdef MODULE
--
--static struct net_device *my_dev;
--
--/* Module parameters */
--
- static int node = 0;
- static int io = 0x0; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */
- static int irq = 0; /* or use the insmod io= irq= shmem= options */
--static char *device; /* use eg. device="arc1" to change name */
-+static char device[9]; /* use eg. device="arc1" to change name */
- static int timeout = 3;
- static int backplane = 0;
- static int clockp = 0;
- static int clockm = 0;
-
--MODULE_PARM(node, "i");
--MODULE_PARM(io, "i");
--MODULE_PARM(irq, "i");
--MODULE_PARM(device, "s");
--MODULE_PARM(timeout, "i");
--MODULE_PARM(backplane, "i");
--MODULE_PARM(clockp, "i");
--MODULE_PARM(clockm, "i");
-+module_param(node, int, 0);
-+module_param(io, int, 0);
-+module_param(irq, int, 0);
-+module_param_string(device, device, sizeof(device), 0);
-+module_param(timeout, int, 0);
-+module_param(backplane, int, 0);
-+module_param(clockp, int, 0);
-+module_param(clockm, int, 0);
-+
- MODULE_LICENSE("GPL");
-
--int init_module(void)
-+static struct net_device *my_dev;
-+
-+static int __init com20020_init(void)
- {
- struct net_device *dev;
- struct arcnet_local *lp;
-- int err;
-
-- dev = dev_alloc(device ? : "arc%d", &err);
-+ dev = alloc_arcdev(device);
- if (!dev)
-- return err;
-- lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
-- if (!lp)
- return -ENOMEM;
-- memset(lp, 0, sizeof(struct arcnet_local));
-
- if (node && node != 0xff)
- dev->dev_addr[0] = node;
-
-+ lp = dev->priv;
- lp->backplane = backplane;
- lp->clockp = clockp & 7;
- lp->clockm = clockm & 3;
-@@ -172,21 +165,24 @@ int init_module(void)
- if (dev->irq == 2)
- dev->irq = 9;
-
-- if (com20020isa_probe(dev))
-+ if (com20020isa_probe(dev)) {
-+ free_netdev(dev);
- return -EIO;
-+ }
-
- my_dev = dev;
- return 0;
- }
-
--void cleanup_module(void)
-+static void __exit com20020_exit(void)
- {
-- com20020_remove(my_dev);
-+ unregister_netdev(my_dev);
-+ free_irq(my_dev->irq, my_dev);
- release_region(my_dev->base_addr, ARCNET_TOTAL_SIZE);
-+ free_netdev(my_dev);
- }
-
--#else
--
-+#ifndef MODULE
- static int __init com20020isa_setup(char *s)
- {
- struct net_device *dev;
-@@ -196,37 +192,31 @@ static int __init com20020isa_setup(char
- s = get_options(s, 8, ints);
- if (!ints[0])
- return 1;
-- dev = alloc_bootmem(sizeof(struct net_device) + sizeof(struct arcnet_local));
-- memset(dev, 0, sizeof(struct net_device) + sizeof(struct arcnet_local));
-- lp = dev->priv = (struct arcnet_local *) (dev + 1);
-- dev->init = com20020isa_probe;
-
- switch (ints[0]) {
- default: /* ERROR */
- printk("com90xx: Too many arguments.\n");
- case 6: /* Timeout */
-- lp->timeout = ints[6];
-+ timeout = ints[6];
- case 5: /* CKP value */
-- lp->clockp = ints[5];
-+ clockp = ints[5];
- case 4: /* Backplane flag */
-- lp->backplane = ints[4];
-+ backplane = ints[4];
- case 3: /* Node ID */
-- dev->dev_addr[0] = ints[3];
-+ node = ints[3];
- case 2: /* IRQ */
-- dev->irq = ints[2];
-+ irq = ints[2];
- case 1: /* IO address */
-- dev->base_addr = ints[1];
-+ io = ints[1];
- }
- if (*s)
-- strncpy(dev->name, s, 9);
-- else
-- strcpy(dev->name, "arc%d");
-- if (register_netdev(dev))
-- printk(KERN_ERR "com20020: Cannot register arcnet device\n");
--
-+ snprintf(device, sizeof(device), "%s", s);
- return 1;
- }
-
- __setup("com20020=", com20020isa_setup);
-
- #endif /* MODULE */
-+
-+module_init(com20020_init)
-+module_exit(com20020_exit)
---- linux-2.6.0/drivers/net/arcnet/com20020-pci.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/arcnet/com20020-pci.c 2003-12-28 23:21:00.000000000 -0800
-@@ -27,6 +27,7 @@
- * **********************
- */
- #include <linux/module.h>
-+#include <linux/moduleparam.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/ioport.h>
-@@ -46,18 +47,18 @@
- /* Module parameters */
-
- static int node;
--static char *device; /* use eg. device="arc1" to change name */
-+static char device[9]; /* use eg. device="arc1" to change name */
- static int timeout = 3;
- static int backplane;
- static int clockp;
- static int clockm;
-
--MODULE_PARM(node, "i");
--MODULE_PARM(device, "s");
--MODULE_PARM(timeout, "i");
--MODULE_PARM(backplane, "i");
--MODULE_PARM(clockp, "i");
--MODULE_PARM(clockm, "i");
-+module_param(node, int, 0);
-+module_param_string(device, device, sizeof(device), 0);
-+module_param(timeout, int, 0);
-+module_param(backplane, int, 0);
-+module_param(clockp, int, 0);
-+module_param(clockm, int, 0);
- MODULE_LICENSE("GPL");
-
- static int __devinit com20020pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
-@@ -68,15 +69,11 @@ static int __devinit com20020pci_probe(s
-
- if (pci_enable_device(pdev))
- return -EIO;
-- dev = dev_alloc(device ? : "arc%d", &err);
-+ dev = alloc_arcdev(device);
- if (!dev)
-- return err;
-- lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
-- if (!lp) {
-- err = -ENOMEM;
-- goto out_dev;
-- }
-- memset(lp, 0, sizeof(struct arcnet_local));
-+ return -ENOMEM;
-+ lp = dev->priv;
-+
- pci_set_drvdata(pdev, dev);
-
- // SOHARD needs PCI base addr 4
-@@ -89,6 +86,13 @@ static int __devinit com20020pci_probe(s
- ioaddr = pci_resource_start(pdev, 2);
- }
-
-+ if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "com20020-pci")) {
-+ BUGMSG(D_INIT, "IO region %xh-%xh already allocated.\n",
-+ ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1);
-+ err = -EBUSY;
-+ goto out_dev;
-+ }
-+
- // Dummy access after Reset
- // ARCNET controller needs this access to detect bustype
- outb(0x00,ioaddr+1);
-@@ -105,12 +109,6 @@ static int __devinit com20020pci_probe(s
- lp->timeout = timeout;
- lp->hw.owner = THIS_MODULE;
-
-- if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "com20020-pci")) {
-- BUGMSG(D_INIT, "IO region %xh-%xh already allocated.\n",
-- ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1);
-- err = -EBUSY;
-- goto out_priv;
-- }
- if (ASTATUS() == 0xFF) {
- BUGMSG(D_NORMAL, "IO address %Xh was reported by PCI BIOS, "
- "but seems empty!\n", ioaddr);
-@@ -129,18 +127,18 @@ static int __devinit com20020pci_probe(s
-
- out_port:
- release_region(ioaddr, ARCNET_TOTAL_SIZE);
--out_priv:
-- kfree(dev->priv);
- out_dev:
-- kfree(dev);
-+ free_netdev(dev);
- return err;
- }
-
- static void __devexit com20020pci_remove(struct pci_dev *pdev)
- {
- struct net_device *dev = pci_get_drvdata(pdev);
-- com20020_remove(dev);
-+ unregister_netdev(dev);
-+ free_irq(dev->irq, dev);
- release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
-+ free_netdev(dev);
- }
-
- static struct pci_device_id com20020pci_id_table[] = {
---- linux-2.6.0/drivers/net/arcnet/com90io.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/arcnet/com90io.c 2003-12-28 23:21:00.000000000 -0800
-@@ -27,6 +27,7 @@
- */
- #include <linux/kernel.h>
- #include <linux/module.h>
-+#include <linux/moduleparam.h>
- #include <linux/ioport.h>
- #include <linux/slab.h>
- #include <linux/delay.h>
-@@ -234,6 +235,7 @@ static int __init com90io_found(struct n
- {
- struct arcnet_local *lp;
- int ioaddr = dev->base_addr;
-+ int err;
-
- /* Reserve the irq */
- if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (COM90xx-IO)", dev)) {
-@@ -246,15 +248,6 @@ static int __init com90io_found(struct n
- return -EBUSY;
- }
-
-- /* Initialize the rest of the device structure. */
-- dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
-- if (!dev->priv) {
-- free_irq(dev->irq, dev);
-- release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
-- return -ENOMEM;
-- }
-- memset(dev->priv, 0, sizeof(struct arcnet_local));
--
- lp = (struct arcnet_local *) (dev->priv);
- lp->card_name = "COM90xx I/O";
- lp->hw.command = com90io_command;
-@@ -265,12 +258,6 @@ static int __init com90io_found(struct n
- lp->hw.copy_to_card = com90io_copy_to_card;
- lp->hw.copy_from_card = com90io_copy_from_card;
-
-- /*
-- * Fill in the fields of the device structure with generic
-- * values.
-- */
-- arcdev_setup(dev);
--
- lp->config = (0x16 | IOMAPflag) & ~ENABLE16flag;
- SETCONF();
-
-@@ -278,6 +265,14 @@ static int __init com90io_found(struct n
-
- dev->dev_addr[0] = get_buffer_byte(dev, 1);
-
-+ err = register_netdev(dev);
-+ if (err) {
-+ outb((inb(_CONFIG) & ~IOMAPflag), _CONFIG);
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
-+ return err;
-+ }
-+
- BUGMSG(D_NORMAL, "COM90IO: station %02Xh found at %03lXh, IRQ %d.\n",
- dev->dev_addr[0], dev->base_addr, dev->irq);
-
-@@ -361,44 +356,67 @@ static void com90io_copy_from_card(struc
- TIME("get_whole_buffer", count, get_whole_buffer(dev, bufnum * 512 + offset, count, buf));
- }
-
--
--#ifdef MODULE
--
--static struct net_device *my_dev;
--
--/* Module parameters */
--
- static int io; /* use the insmod io= irq= shmem= options */
- static int irq;
--static char *device; /* use eg. device=arc1 to change name */
-+static char device[9]; /* use eg. device=arc1 to change name */
-
--MODULE_PARM(io, "i");
--MODULE_PARM(irq, "i");
--MODULE_PARM(device, "s");
-+module_param(io, int, 0);
-+module_param(irq, int, 0);
-+module_param_string(device, device, sizeof(device), 0);
- MODULE_LICENSE("GPL");
-
--int init_module(void)
-+#ifndef MODULE
-+static int __init com90io_setup(char *s)
-+{
-+ int ints[4];
-+ s = get_options(s, 4, ints);
-+ if (!ints[0])
-+ return 0;
-+ switch (ints[0]) {
-+ default: /* ERROR */
-+ printk("com90io: Too many arguments.\n");
-+ case 2: /* IRQ */
-+ irq = ints[2];
-+ case 1: /* IO address */
-+ io = ints[1];
-+ }
-+ if (*s)
-+ snprintf(device, sizeof(device), "%s", s);
-+ return 1;
-+}
-+__setup("com90io=", com90io_setup);
-+#endif
-+
-+static struct net_device *my_dev;
-+
-+static int __init com90io_init(void)
- {
- struct net_device *dev;
- int err;
-
-- dev = dev_alloc(device ? : "arc%d", &err);
-+ dev = alloc_arcdev(device);
- if (!dev)
-- return err;
-+ return -ENOMEM;
-+
-+ SET_MODULE_OWNER(dev);
-
- dev->base_addr = io;
- dev->irq = irq;
- if (dev->irq == 2)
- dev->irq = 9;
-
-- if (com90io_probe(dev))
-- return -EIO;
-+ err = com90io_probe(dev);
-+
-+ if (err) {
-+ free_netdev(dev);
-+ return err;
-+ }
-
- my_dev = dev;
- return 0;
- }
-
--void cleanup_module(void)
-+static void __exit com90io_exit(void)
- {
- struct net_device *dev = my_dev;
- int ioaddr = dev->base_addr;
-@@ -410,42 +428,8 @@ void cleanup_module(void)
-
- free_irq(dev->irq, dev);
- release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
-- kfree(dev->priv);
- free_netdev(dev);
- }
-
--#else
--
--static int __init com90io_setup(char *s)
--{
-- struct net_device *dev;
-- int ints[4];
--
-- s = get_options(s, 4, ints);
-- if (!ints[0])
-- return 0;
-- dev = alloc_bootmem(sizeof(struct net_device));
-- memset(dev, 0, sizeof(struct net_device));
-- dev->init = com90io_probe;
--
-- switch (ints[0]) {
-- default: /* ERROR */
-- printk("com90io: Too many arguments.\n");
-- case 2: /* IRQ */
-- dev->irq = ints[2];
-- case 1: /* IO address */
-- dev->base_addr = ints[1];
-- }
-- if (*s)
-- strncpy(dev->name, s, 9);
-- else
-- strcpy(dev->name, "arc%d");
-- if (register_netdev(dev))
-- printk(KERN_ERR "com90io: Cannot register arcnet device\n");
--
-- return 1;
--}
--
--__setup("com90io=", com90io_setup);
--
--#endif /* MODULE */
-+module_init(com90io_init)
-+module_exit(com90io_exit)
---- linux-2.6.0/drivers/net/arcnet/com90xx.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/arcnet/com90xx.c 2003-12-28 23:21:00.000000000 -0800
-@@ -25,6 +25,7 @@
- * **********************
- */
- #include <linux/module.h>
-+#include <linux/moduleparam.h>
- #include <linux/init.h>
- #include <linux/ioport.h>
- #include <linux/delay.h>
-@@ -52,8 +53,7 @@
-
-
- /* Internal function declarations */
--static int com90xx_found(struct net_device *dev, int ioaddr, int airq,
-- u_long shmem);
-+static int com90xx_found(int ioaddr, int airq, u_long shmem);
- static void com90xx_command(struct net_device *dev, int command);
- static int com90xx_status(struct net_device *dev);
- static void com90xx_setmask(struct net_device *dev, int mask);
-@@ -98,32 +98,43 @@ static int numcards;
-
- static int com90xx_skip_probe __initdata = 0;
-
--static int __init com90xx_probe(struct net_device *dev)
-+/* Module parameters */
-+
-+static int io; /* use the insmod io= irq= shmem= options */
-+static int irq;
-+static int shmem;
-+static char device[9]; /* use eg. device=arc1 to change name */
-+
-+module_param(io, int, 0);
-+module_param(irq, int, 0);
-+module_param(shmem, int, 0);
-+module_param_string(device, device, sizeof(device), 0);
-+
-+static void __init com90xx_probe(void)
- {
-- int count, status, ioaddr, numprint, airq, retval = -ENODEV,
-- openparen = 0;
-+ int count, status, ioaddr, numprint, airq, openparen = 0;
- unsigned long airqmask;
- int ports[(0x3f0 - 0x200) / 16 + 1] =
- {0};
- u_long shmems[(0xFF800 - 0xA0000) / 2048 + 1] =
- {0};
- int numports, numshmems, *port;
-- u_long *shmem;
-+ u_long *p;
-
-- if (!dev && com90xx_skip_probe)
-- return -ENODEV;
-+ if (!io && !irq && !shmem && !*device && com90xx_skip_probe)
-+ return;
-
- BUGLVL(D_NORMAL) printk(VERSION);
-
- /* set up the arrays where we'll store the possible probe addresses */
- numports = numshmems = 0;
-- if (dev && dev->base_addr)
-- ports[numports++] = dev->base_addr;
-+ if (io)
-+ ports[numports++] = io;
- else
- for (count = 0x200; count <= 0x3f0; count += 16)
- ports[numports++] = count;
-- if (dev && dev->mem_start)
-- shmems[numshmems++] = dev->mem_start;
-+ if (shmem)
-+ shmems[numshmems++] = shmem;
- else
- for (count = 0xA0000; count <= 0xFF800; count += 2048)
- shmems[numshmems++] = count;
-@@ -143,22 +154,19 @@ static int __init com90xx_probe(struct n
-
- ioaddr = *port;
-
-- if (check_region(*port, ARCNET_TOTAL_SIZE)) {
-+ if (!request_region(*port, ARCNET_TOTAL_SIZE, "arcnet (90xx)")) {
- BUGMSG2(D_INIT_REASONS, "(check_region)\n");
- BUGMSG2(D_INIT_REASONS, "S1: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
-- *port = ports[numports - 1];
-- numports--;
-- port--;
-+ *port-- = ports[--numports];
- continue;
- }
- if (ASTATUS() == 0xFF) {
- BUGMSG2(D_INIT_REASONS, "(empty)\n");
- BUGMSG2(D_INIT_REASONS, "S1: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
-- *port = ports[numports - 1];
-- numports--;
-- port--;
-+ release_region(*port, ARCNET_TOTAL_SIZE);
-+ *port-- = ports[--numports];
- continue;
- }
- inb(_RESET); /* begin resetting card */
-@@ -171,14 +179,14 @@ static int __init com90xx_probe(struct n
-
- if (!numports) {
- BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n");
-- return -ENODEV;
-+ return;
- }
- /* Stage 2: we have now reset any possible ARCnet cards, so we can't
- * do anything until they finish. If D_INIT, print the list of
- * cards that are left.
- */
- numprint = -1;
-- for (port = &ports[0]; port - ports < numports; port++) {
-+ for (port = &ports[0]; port < ports + numports; port++) {
- numprint++;
- numprint %= 8;
- if (!numprint) {
-@@ -194,8 +202,8 @@ static int __init com90xx_probe(struct n
- * 0xD1 byte in the right place, or are read-only.
- */
- numprint = -1;
-- for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) {
-- u_long ptr = *shmem;
-+ for (p = &shmems[0]; p < shmems + numshmems; p++) {
-+ u_long ptr = *p;
-
- numprint++;
- numprint %= 8;
-@@ -203,15 +211,13 @@ static int __init com90xx_probe(struct n
- BUGMSG2(D_INIT, "\n");
- BUGMSG2(D_INIT, "S3: ");
- }
-- BUGMSG2(D_INIT, "%lXh ", *shmem);
-+ BUGMSG2(D_INIT, "%lXh ", *p);
-
-- if (check_mem_region(*shmem, BUFFER_SIZE)) {
-+ if (!request_mem_region(*p, BUFFER_SIZE, "arcnet (90xx)")) {
- BUGMSG2(D_INIT_REASONS, "(check_mem_region)\n");
- BUGMSG2(D_INIT_REASONS, "Stage 3: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
-- *shmem = shmems[numshmems - 1];
-- numshmems--;
-- shmem--;
-+ *p-- = shmems[--numshmems];
- continue;
- }
- if (isa_readb(ptr) != TESTvalue) {
-@@ -219,9 +225,8 @@ static int __init com90xx_probe(struct n
- isa_readb(ptr), TESTvalue);
- BUGMSG2(D_INIT_REASONS, "S3: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
-- *shmem = shmems[numshmems - 1];
-- numshmems--;
-- shmem--;
-+ release_mem_region(*p, BUFFER_SIZE);
-+ *p-- = shmems[--numshmems];
- continue;
- }
- /* By writing 0x42 to the TESTvalue location, we also make
-@@ -233,9 +238,8 @@ static int __init com90xx_probe(struct n
- if (isa_readb(ptr) != 0x42) {
- BUGMSG2(D_INIT_REASONS, "(read only)\n");
- BUGMSG2(D_INIT_REASONS, "S3: ");
-- *shmem = shmems[numshmems - 1];
-- numshmems--;
-- shmem--;
-+ release_mem_region(*p, BUFFER_SIZE);
-+ *p-- = shmems[--numshmems];
- continue;
- }
- BUGMSG2(D_INIT_REASONS, "\n");
-@@ -246,20 +250,22 @@ static int __init com90xx_probe(struct n
-
- if (!numshmems) {
- BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n");
-- return -ENODEV;
-+ for (port = &ports[0]; port < ports + numports; port++)
-+ release_region(*port, ARCNET_TOTAL_SIZE);
-+ return;
- }
- /* Stage 4: something of a dummy, to report the shmems that are
- * still possible after stage 3.
- */
- numprint = -1;
-- for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) {
-+ for (p = &shmems[0]; p < shmems + numshmems; p++) {
- numprint++;
- numprint %= 8;
- if (!numprint) {
- BUGMSG2(D_INIT, "\n");
- BUGMSG2(D_INIT, "S4: ");
- }
-- BUGMSG2(D_INIT, "%lXh ", *shmem);
-+ BUGMSG2(D_INIT, "%lXh ", *p);
- }
- BUGMSG2(D_INIT, "\n");
-
-@@ -271,7 +277,8 @@ static int __init com90xx_probe(struct n
- * after the first one is found.
- */
- numprint = -1;
-- for (port = &ports[0]; port - ports < numports; port++) {
-+ for (port = &ports[0]; port < ports + numports; port++) {
-+ int found = 0;
- numprint++;
- numprint %= 8;
- if (!numprint) {
-@@ -288,9 +295,8 @@ static int __init com90xx_probe(struct n
- BUGMSG2(D_INIT_REASONS, "(status=%Xh)\n", status);
- BUGMSG2(D_INIT_REASONS, "S5: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
-- *port = ports[numports - 1];
-- numports--;
-- port--;
-+ release_region(*port, ARCNET_TOTAL_SIZE);
-+ *port-- = ports[--numports];
- continue;
- }
- ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear);
-@@ -300,15 +306,14 @@ static int __init com90xx_probe(struct n
- status);
- BUGMSG2(D_INIT_REASONS, "S5: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
-- *port = ports[numports - 1];
-- numports--;
-- port--;
-+ release_region(*port, ARCNET_TOTAL_SIZE);
-+ *port-- = ports[--numports];
- continue;
- }
- /* skip this completely if an IRQ was given, because maybe
- * we're on a machine that locks during autoirq!
- */
-- if (!dev || !dev->irq) {
-+ if (!irq) {
- /* if we do this, we're sure to get an IRQ since the
- * card has just reset and the NORXflag is on until
- * we tell it to start receiving.
-@@ -323,13 +328,12 @@ static int __init com90xx_probe(struct n
- BUGMSG2(D_INIT_REASONS, "(airq=%d)\n", airq);
- BUGMSG2(D_INIT_REASONS, "S5: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
-- *port = ports[numports - 1];
-- numports--;
-- port--;
-+ release_region(*port, ARCNET_TOTAL_SIZE);
-+ *port-- = ports[--numports];
- continue;
- }
- } else {
-- airq = dev->irq;
-+ airq = irq;
- }
-
- BUGMSG2(D_INIT, "(%d,", airq);
-@@ -354,21 +358,20 @@ static int __init com90xx_probe(struct n
- mdelay(RESETtime);
- #endif
-
-- for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) {
-- u_long ptr = *shmem;
-+ for (p = &shmems[0]; p < shmems + numshmems; p++) {
-+ u_long ptr = *p;
-
- if (isa_readb(ptr) == TESTvalue) { /* found one */
-- BUGMSG2(D_INIT, "%lXh)\n", *shmem);
-+ BUGMSG2(D_INIT, "%lXh)\n", *p);
- openparen = 0;
-
- /* register the card */
-- retval = com90xx_found(dev, *port, airq, *shmem);
-+ if (com90xx_found(*port, airq, *p) == 0)
-+ found = 1;
- numprint = -1;
-
- /* remove shmem from the list */
-- *shmem = shmems[numshmems - 1];
-- numshmems--;
--
-+ *p = shmems[--numshmems];
- break; /* go to the next I/O port */
- } else {
- BUGMSG2(D_INIT_REASONS, "%Xh-", isa_readb(ptr));
-@@ -380,44 +383,39 @@ static int __init com90xx_probe(struct n
- BUGLVL(D_INIT_REASONS) printk("S5: ");
- BUGLVL(D_INIT_REASONS) numprint = 0;
- }
-- *port = ports[numports - 1];
-- numports--;
-- port--;
-+ if (!found)
-+ release_region(*port, ARCNET_TOTAL_SIZE);
-+ *port-- = ports[--numports];
- }
-
- BUGLVL(D_INIT_REASONS) printk("\n");
-
- /* Now put back TESTvalue on all leftover shmems. */
-- for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++)
-- isa_writeb(TESTvalue, *shmem);
--
-- if (retval && dev && !numcards)
-- BUGMSG2(D_NORMAL, "S5: No ARCnet cards found.\n");
-- return retval;
-+ for (p = &shmems[0]; p < shmems + numshmems; p++) {
-+ isa_writeb(TESTvalue, *p);
-+ release_mem_region(*p, BUFFER_SIZE);
-+ }
- }
-
-
- /* Set up the struct net_device associated with this card. Called after
- * probing succeeds.
- */
--static int __init com90xx_found(struct net_device *dev0, int ioaddr, int airq,
-- u_long shmem)
-+static int __init com90xx_found(int ioaddr, int airq, u_long shmem)
- {
-- struct net_device *dev = dev0;
-+ struct net_device *dev = NULL;
- struct arcnet_local *lp;
- u_long first_mirror, last_mirror;
-- int mirror_size, err;
-+ int mirror_size;
-
-- /* allocate struct net_device if we don't have one yet */
-- if (!dev && !(dev = dev_alloc("arc%d", &err))) {
-+ /* allocate struct net_device */
-+ dev = alloc_arcdev(device);
-+ if (!dev) {
- BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n");
-- return err;
-- }
-- lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
-- if (!lp) {
-- BUGMSG(D_NORMAL, "Can't allocate device data!\n");
-- goto err_free_dev;
-+ release_mem_region(shmem, BUFFER_SIZE);
-+ return -ENOMEM;
- }
-+ lp = dev->priv;
- /* find the real shared memory start/end points, including mirrors */
-
- /* guess the actual size of one "memory mirror" - the number of
-@@ -442,8 +440,18 @@ static int __init com90xx_found(struct n
- dev->mem_start = first_mirror;
- dev->mem_end = last_mirror + MIRROR_SIZE - 1;
-
-+ release_mem_region(shmem, BUFFER_SIZE);
-+ if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)"))
-+ goto err_free_dev;
-+
-+ /* reserve the irq */
-+ if (request_irq(airq, &arcnet_interrupt, 0, "arcnet (90xx)", dev)) {
-+ BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", airq);
-+ goto err_release_mem;
-+ }
-+ dev->irq = airq;
-+
- /* Initialize the rest of the device structure. */
-- memset(lp, 0, sizeof(struct arcnet_local));
- lp->card_name = "COM90xx";
- lp->hw.command = com90xx_command;
- lp->hw.status = com90xx_status;
-@@ -455,24 +463,12 @@ static int __init com90xx_found(struct n
- lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1);
- if (!lp->mem_start) {
- BUGMSG(D_NORMAL, "Can't remap device memory!\n");
-- goto err_free_dev_priv;
-+ goto err_free_irq;
- }
-- /* Fill in the fields of the device structure with generic values. */
-- arcdev_setup(dev);
-
- /* get and check the station ID from offset 1 in shmem */
- dev->dev_addr[0] = readb(lp->mem_start + 1);
-
-- /* reserve the irq */
-- if (request_irq(airq, &arcnet_interrupt, 0, "arcnet (90xx)", dev)) {
-- BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", airq);
-- goto err_unmap;
-- }
-- dev->irq = airq;
--
-- /* reserve the I/O and memory regions - guaranteed to work by check_region */
-- request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (90xx)");
-- request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)");
- dev->base_addr = ioaddr;
-
- BUGMSG(D_NORMAL, "COM90xx station %02Xh found at %03lXh, IRQ %d, "
-@@ -481,23 +477,20 @@ static int __init com90xx_found(struct n
- dev->base_addr, dev->irq, dev->mem_start,
- (dev->mem_end - dev->mem_start + 1) / mirror_size, mirror_size);
-
-- if (!dev0 && register_netdev(dev))
-- goto err_release;
-+ if (register_netdev(dev))
-+ goto err_unmap;
-
- cards[numcards++] = dev;
- return 0;
-
-- err_release:
-+err_unmap:
-+ iounmap(lp->mem_start);
-+err_free_irq:
- free_irq(dev->irq, dev);
-- release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
-+err_release_mem:
- release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
-- err_unmap:
-- iounmap(lp->mem_start);
-- err_free_dev_priv:
-- kfree(dev->priv);
-- err_free_dev:
-- if (!dev0)
-- kfree(dev);
-+err_free_dev:
-+ free_netdev(dev);
- return -EIO;
- }
-
-@@ -587,37 +580,13 @@ static void com90xx_copy_from_card(struc
- }
-
-
--/* Module parameters */
--
--static int io; /* use the insmod io= irq= shmem= options */
--static int irq;
--static int shmem;
--static char *device; /* use eg. device=arc1 to change name */
--
--MODULE_PARM(io, "i");
--MODULE_PARM(irq, "i");
--MODULE_PARM(shmem, "i");
--MODULE_PARM(device, "s");
- MODULE_LICENSE("GPL");
-
- static int __init com90xx_init(void)
- {
-- struct net_device *dev;
-- int err;
--
-- if (io || irq || shmem || device) {
-- dev = dev_alloc(device ? : "arc%d", &err);
-- if (!dev)
-- return err;
-- dev->base_addr = io;
-- dev->irq = irq;
-- if (dev->irq == 2)
-- dev->irq = 9;
-- dev->mem_start = shmem;
-- com90xx_probe(dev);
-- } else
-- com90xx_probe(NULL);
--
-+ if (irq == 2)
-+ irq = 9;
-+ com90xx_probe();
- if (!numcards)
- return -EIO;
- return 0;
-@@ -638,7 +607,6 @@ static void __exit com90xx_exit(void)
- iounmap(lp->mem_start);
- release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
- release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
-- kfree(dev->priv);
- free_netdev(dev);
- }
- }
-@@ -669,9 +637,7 @@ static int __init com90xx_setup(char *s)
- }
-
- if (*s)
-- strncpy(device, s, 9);
-- else
-- strcpy(device, "arc%d");
-+ snprintf(device, sizeof(device), "%s", s);
-
- return 1;
- }
---- linux-2.6.0/drivers/net/ariadne.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/ariadne.c 2003-12-28 23:21:00.000000000 -0800
-@@ -168,7 +168,7 @@ static int __init ariadne_probe(void)
- continue;
- }
-
-- dev = init_etherdev(NULL, sizeof(struct ariadne_private));
-+ dev = alloc_etherdev(sizeof(struct ariadne_private));
-
- if (dev == NULL) {
- release_resource(r1);
-@@ -205,11 +205,17 @@ static int __init ariadne_probe(void)
- dev->get_stats = &ariadne_get_stats;
- dev->set_multicast_list = &set_multicast_list;
-
-+ res = register_netdev(dev);
-+ if (res) {
-+ release_resource(r1);
-+ release_resource(r2);
-+ free_netdev(dev);
-+ break;
-+ }
- #ifdef MODULE
- priv->next_module = root_ariadne_dev;
- root_ariadne_dev = priv;
- #endif
-- res = 0;
- }
- return res;
- }
---- linux-2.6.0/drivers/net/arm/am79c961a.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/arm/am79c961a.c 2003-12-28 23:21:00.000000000 -0800
-@@ -722,7 +722,7 @@ static int __init am79c961_init(void)
- release:
- release_region(dev->base_addr, 0x18);
- nodev:
-- kfree(dev);
-+ free_netdev(dev);
- out:
- return ret;
- }
---- linux-2.6.0/drivers/net/arm/ether00.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/arm/ether00.c 2003-12-28 23:21:00.000000000 -0800
-@@ -923,8 +923,6 @@ static int ether00_add_device(struct pld
- result = -ENOMEM;
- goto out_release;
- }
-- memset(dev,0,sizeof(struct net_device));
-- memset(dev->priv, 0, sizeof(struct net_priv));
- priv = dev->priv;
-
- priv->tq_memupdate.routine=ether00_mem_update;
-@@ -966,7 +964,7 @@ static int ether00_add_device(struct pld
- out_unmap:
- iounmap(map_addr);
- out_kfree:
-- kfree(dev);
-+ free_netdev(dev);
- out_release:
- release_mem_region(dev_info->base_addr, MAC_REG_SIZE);
- return result;
---- linux-2.6.0/drivers/net/arm/ether1.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/arm/ether1.c 2003-12-28 23:21:00.000000000 -0800
-@@ -1068,7 +1068,7 @@ ether1_probe(struct expansion_card *ec,
- release:
- release_region(dev->base_addr, 16);
- release_region(dev->base_addr + 0x800, 4096);
-- kfree(dev);
-+ free_netdev(dev);
- out:
- return ret;
- }
---- linux-2.6.0/drivers/net/arm/ether3.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/arm/ether3.c 2003-12-28 23:21:00.000000000 -0800
-@@ -908,7 +908,7 @@ ether3_probe(struct expansion_card *ec,
- failed:
- release_region(dev->base_addr, 128);
- free:
-- kfree(dev);
-+ free_netdev(dev);
- out:
- return ret;
- }
---- linux-2.6.0/drivers/net/arm/etherh.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/arm/etherh.c 2003-12-28 23:21:00.000000000 -0800
-@@ -551,15 +551,12 @@ etherh_probe(struct expansion_card *ec,
-
- etherh_banner();
-
-- dev = alloc_etherdev(sizeof(struct etherh_priv));
-+ dev = alloc_ei_netdev();
- if (!dev) {
- ret = -ENOMEM;
- goto out;
- }
-
-- /*
-- * alloc_etherdev allocs and zeros dev->priv
-- */
- eh = dev->priv;
-
- spin_lock_init(&eh->eidev.page_lock);
-@@ -622,21 +619,12 @@ etherh_probe(struct expansion_card *ec,
- goto free;
- }
-
-- if (ethdev_init(dev)) {
-- ret = -ENODEV;
-- goto release;
-- }
--
- /*
- * If we're in the NIC slot, make sure the IRQ is enabled
- */
- if (dev->irq == 11)
- etherh_set_ctrl(eh, ETHERH_CP_IE);
-
-- /*
-- * Unfortunately, ethdev_init eventually calls
-- * ether_setup, which re-writes dev->flags.
-- */
- switch (ec->cid.product) {
- case PROD_ANT_ETHERM:
- dev_type = "ANT EtherM";
-@@ -705,7 +693,7 @@ etherh_probe(struct expansion_card *ec,
- release:
- release_region(dev->base_addr, 16);
- free:
-- kfree(dev);
-+ free_netdev(dev);
- out:
- return ret;
- }
---- linux-2.6.0/drivers/net/at1700.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/at1700.c 2003-12-28 23:21:00.000000000 -0800
-@@ -81,12 +81,12 @@ static int fmv18x_probe_list[] __initdat
- */
-
- #ifndef CONFIG_X86_PC9800
--static int at1700_probe_list[] __initdata = {
-+static unsigned at1700_probe_list[] __initdata = {
- 0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
- };
-
- #else /* CONFIG_X86_PC9800 */
--static int at1700_probe_list[] __initdata = {
-+static unsigned at1700_probe_list[] __initdata = {
- 0x1d6, 0x1d8, 0x1da, 0x1d4, 0xd4, 0xd2, 0xd8, 0xd0, 0
- };
-
-@@ -196,8 +196,6 @@ struct net_local {
-
- /* Index to functions, as function prototypes. */
-
--extern int at1700_probe(struct net_device *dev);
--
- static int at1700_probe1(struct net_device *dev, int ioaddr);
- static int read_eeprom(long ioaddr, int location);
- static int net_open(struct net_device *dev);
-@@ -232,24 +230,78 @@ static struct at1720_mca_adapters_struct
- (detachable devices only).
- */
-
--int __init at1700_probe(struct net_device *dev)
-+#ifndef CONFIG_X86_PC9800
-+static int io = 0x260;
-+#else
-+static int io = 0xd0;
-+#endif
-+
-+static int irq;
-+
-+static void cleanup_card(struct net_device *dev)
- {
-- int i;
-- int base_addr = dev->base_addr;
-+#ifdef CONFIG_MCA
-+ struct net_local *lp = dev->priv;
-+ if (lp->mca_slot)
-+ mca_mark_as_unused(lp->mca_slot);
-+#endif
-+ free_irq(dev->irq, NULL);
-+#ifndef CONFIG_X86_PC9800
-+ release_region(dev->base_addr, AT1700_IO_EXTENT);
-+#else
-+ {
-+ int i;
-+ for (i = 0; i < 0x2000; i += 0x200)
-+ release_region(dev->base_addr + i, 2);
-+ }
-+#endif
-+}
-+
-+struct net_device * __init at1700_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-+ unsigned *port;
-+ int err = 0;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ } else {
-+ dev->base_addr = io;
-+ dev->irq = irq;
-+ }
-
- SET_MODULE_OWNER(dev);
-
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return at1700_probe1(dev, base_addr);
-- else if (base_addr != 0) /* Don't probe at all. */
-- return -ENXIO;
--
-- for (i = 0; at1700_probe_list[i]; i++) {
-- int ioaddr = at1700_probe_list[i];
-- if (at1700_probe1(dev, ioaddr) == 0)
-- return 0;
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = at1700_probe1(dev, io);
-+ } else if (io != 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (port = at1700_probe_list; *port; port++) {
-+ if (at1700_probe1(dev, *port) == 0)
-+ break;
-+ dev->irq = irq;
-+ }
-+ if (!*port)
-+ err = -ENODEV;
- }
-- return -ENODEV;
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /* The Fujitsu datasheet suggests that the NIC be probed for by checking its
-@@ -267,7 +319,7 @@ static int __init at1700_probe1(struct n
- char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
- unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0;
- int slot, ret = -ENODEV;
-- struct net_local *lp;
-+ struct net_local *lp = dev->priv;
-
- #ifndef CONFIG_X86_PC9800
- if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name))
-@@ -284,9 +336,10 @@ static int __init at1700_probe1(struct n
- }
- #endif
-
-- /* Resetting the chip doesn't reset the ISA interface, so don't bother.
-- That means we have to be careful with the register values we probe for.
-- */
-+ /* Resetting the chip doesn't reset the ISA interface, so don't bother.
-+ That means we have to be careful with the register values we probe
-+ for.
-+ */
- #ifdef notdef
- printk("at1700 probe at %#x, eeprom is %4.4x %4.4x %4.4x ctrl %4.4x.\n",
- ioaddr, read_eeprom(ioaddr, 4), read_eeprom(ioaddr, 5),
-@@ -331,15 +384,13 @@ static int __init at1700_probe1(struct n
- break;
-
- /* probing for a card at a particular IO/IRQ */
-- if (dev &&
-- ((dev->irq && dev->irq != irq) ||
-- (dev->base_addr && dev->base_addr != ioaddr))) {
-+ if ((dev->irq && dev->irq != irq) ||
-+ (dev->base_addr && dev->base_addr != ioaddr)) {
- slot++; /* probing next slot */
- continue;
- }
-
-- if (dev)
-- dev->irq = irq;
-+ dev->irq = irq;
-
- /* claim the slot */
- mca_set_adapter_name( slot, at1720_mca_adapters[j].name );
-@@ -476,13 +527,7 @@ found:
- if (net_debug)
- printk(version);
-
-- /* Initialize the device structure. */
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (dev->priv == NULL) {
-- ret = -ENOMEM;
-- goto err_out;
-- }
-- memset(dev->priv, 0, sizeof(struct net_local));
-+ memset(lp, 0, sizeof(struct net_local));
-
- dev->open = net_open;
- dev->stop = net_close;
-@@ -492,11 +537,7 @@ found:
- dev->tx_timeout = net_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
-
-- lp = (struct net_local *)dev->priv;
-- lp->lock = SPIN_LOCK_UNLOCKED;
--
-- /* Fill in the fields of 'dev' with ethernet-generic values. */
-- ether_setup(dev);
-+ spin_lock_init(&lp->lock);
-
- lp->jumpered = is_fmv18x;
- lp->mca_slot = slot;
-@@ -505,14 +546,11 @@ found:
- if (ret) {
- printk (" AT1700 at %#3x is unusable due to a conflict on"
- "IRQ %d.\n", ioaddr, irq);
-- goto err_out_priv;
-+ goto err_out;
- }
-
- return 0;
-
--err_out_priv:
-- kfree(dev->priv);
-- dev->priv = NULL;
- err_out:
- #ifndef CONFIG_X86_PC9800
- release_region(ioaddr, AT1700_IO_EXTENT);
-@@ -940,14 +978,7 @@ set_rx_mode(struct net_device *dev)
- }
-
- #ifdef MODULE
--static struct net_device dev_at1700;
--#ifndef CONFIG_X86_PC9800
--static int io = 0x260;
--#else
--static int io = 0xd0;
--#endif
--
--static int irq;
-+static struct net_device *dev_at1700;
-
- MODULE_PARM(io, "i");
- MODULE_PARM(irq, "i");
-@@ -960,41 +991,18 @@ int init_module(void)
- {
- if (io == 0)
- printk("at1700: You should not use auto-probing with insmod!\n");
-- dev_at1700.base_addr = io;
-- dev_at1700.irq = irq;
-- dev_at1700.init = at1700_probe;
-- if (register_netdev(&dev_at1700) != 0) {
-- printk("at1700: register_netdev() returned non-zero.\n");
-- return -EIO;
-- }
-+ dev_at1700 = at1700_probe(-1);
-+ if (IS_ERR(dev_at1700))
-+ return PTR_ERR(dev_at1700);
- return 0;
- }
-
- void
- cleanup_module(void)
- {
--#ifdef CONFIG_MCA
-- struct net_local *lp = dev_at1700.priv;
-- if(lp->mca_slot)
-- {
-- mca_mark_as_unused(lp->mca_slot);
-- }
--#endif
-- unregister_netdev(&dev_at1700);
-- kfree(dev_at1700.priv);
-- dev_at1700.priv = NULL;
--
-- /* If we don't do this, we can't re-insmod it later. */
-- free_irq(dev_at1700.irq, NULL);
--#ifndef CONFIG_X86_PC9800
-- release_region(dev_at1700.base_addr, AT1700_IO_EXTENT);
--#else
-- {
-- int i;
-- for (i = 0; i < 0x2000; i += 0x200)
-- release_region(dev_at1700.base_addr + i, 2);
-- }
--#endif
-+ unregister_netdev(dev_at1700);
-+ cleanup_card(dev_at1700);
-+ free_netdev(dev_at1700);
- }
- #endif /* MODULE */
- MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/net/atari_bionet.c 2003-06-14 12:18:23.000000000 -0700
-+++ 25/drivers/net/atari_bionet.c 2003-12-28 23:21:00.000000000 -0800
-@@ -148,8 +148,6 @@ unsigned char *phys_nic_packet;
-
- /* Index to functions, as function prototypes.
- */
--extern int bionet_probe(struct net_device *dev);
--
- static int bionet_open(struct net_device *dev);
- static int bionet_send_packet(struct sk_buff *skb, struct net_device *dev);
- static void bionet_poll_rx(struct net_device *);
-@@ -321,15 +319,26 @@ end:
-
- /* Check for a network adaptor of this type, and return '0' if one exists.
- */
--int __init
--bionet_probe(struct net_device *dev){
-+struct net_device * __init bionet_probe(int unit)
-+{
-+ struct net_device *dev;
- unsigned char station_addr[6];
- static unsigned version_printed;
- static int no_more_found; /* avoid "Probing for..." printed 4 times */
- int i;
-+ int err;
-
- if (!MACH_IS_ATARI || no_more_found)
-- return -ENODEV;
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_etherdev(sizeof(struct net_local));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-+ SET_MODULE_OWNER(dev);
-
- printk("Probing for BioNet 100 Adapter...\n");
-
-@@ -347,11 +356,10 @@ bionet_probe(struct net_device *dev){
- || station_addr[2] != 'O' ) {
- no_more_found = 1;
- printk( "No BioNet 100 found.\n" );
-- return -ENODEV;
-+ free_netdev(dev);
-+ return ERR_PTR(-ENODEV);
- }
-
-- SET_MODULE_OWNER(dev);
--
- if (bionet_debug > 0 && version_printed++ == 0)
- printk(version);
-
-@@ -369,12 +377,6 @@ bionet_probe(struct net_device *dev){
- nic_packet, phys_nic_packet );
- }
-
-- if (dev->priv == NULL)
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (!dev->priv)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct net_local));
--
- dev->open = bionet_open;
- dev->stop = bionet_close;
- dev->hard_start_xmit = bionet_send_packet;
-@@ -390,8 +392,11 @@ bionet_probe(struct net_device *dev){
- #endif
- dev->dev_addr[i] = station_addr[i];
- }
-- ether_setup(dev);
-- return 0;
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /* Open/initialize the board. This is called (in the current kernel)
-@@ -640,25 +645,20 @@ static struct net_device_stats *net_get_
-
- #ifdef MODULE
-
--static struct net_device bio_dev;
--
--int
--init_module(void) {
-- int err;
-+static struct net_device *bio_dev;
-
-- bio_dev.init = bionet_probe;
-- if ((err = register_netdev(&bio_dev))) {
-- if (err == -EEXIST) {
-- printk("BIONET: devices already present. Module not loaded.\n");
-- }
-- return err;
-- }
-+int init_module(void)
-+{
-+ bio_dev = bionet_probe(-1);
-+ if (IS_ERR(bio_dev))
-+ return PTR_ERR(bio_dev);
- return 0;
- }
-
--void
--cleanup_module(void) {
-- unregister_netdev(&bio_dev);
-+void cleanup_module(void)
-+{
-+ unregister_netdev(bio_dev);
-+ free_netdev(bio_dev);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/atarilance.c 2003-06-14 12:18:03.000000000 -0700
-+++ 25/drivers/net/atarilance.c 2003-12-28 23:21:00.000000000 -0800
-@@ -371,26 +371,39 @@ static void *slow_memcpy( void *dst, con
- }
-
-
--int __init atarilance_probe( struct net_device *dev )
--{
-+struct net_device * __init atarilance_probe(int unit)
-+{
- int i;
- static int found;
--
-- SET_MODULE_OWNER(dev);
-+ struct net_device *dev;
-+ int err = -ENODEV;
-
- if (!MACH_IS_ATARI || found)
- /* Assume there's only one board possible... That seems true, since
- * the Riebl/PAM board's address cannot be changed. */
-- return( ENODEV );
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_etherdev(sizeof(struct lance_private));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-+ SET_MODULE_OWNER(dev);
-
- for( i = 0; i < N_LANCE_ADDR; ++i ) {
- if (lance_probe1( dev, &lance_addr_list[i] )) {
- found = 1;
-- return( 0 );
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-+ free_irq(dev->irq, dev);
-+ break;
- }
- }
--
-- return( ENODEV );
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
-
-@@ -511,12 +524,6 @@ static unsigned long __init lance_probe1
- return( 0 );
-
- probe_ok:
-- init_etherdev( dev, sizeof(struct lance_private) );
-- if (!dev->priv) {
-- dev->priv = kmalloc( sizeof(struct lance_private), GFP_KERNEL );
-- if (!dev->priv)
-- return 0;
-- }
- lp = (struct lance_private *)dev->priv;
- MEM = (struct lance_memory *)memaddr;
- IO = lp->iobase = (struct lance_ioreg *)ioaddr;
-@@ -1171,26 +1178,21 @@ static int lance_set_mac_address( struct
-
- \f
- #ifdef MODULE
--static struct net_device atarilance_dev;
-+static struct net_device *atarilance_dev;
-
- int init_module(void)
--
--{ int err;
--
-- atarilance_dev.init = atarilance_probe;
-- if ((err = register_netdev( &atarilance_dev ))) {
-- if (err == -EIO) {
-- printk( "No Atari Lance board found. Module not loaded.\n");
-- }
-- return( err );
-- }
-- return( 0 );
-+{
-+ atarilance_dev = atarilance_probe(-1);
-+ if (IS_ERR(atarilance_dev))
-+ return PTR_ERR(atarilance_dev);
-+ return 0;
- }
-
- void cleanup_module(void)
--
- {
-- unregister_netdev( &atarilance_dev );
-+ unregister_netdev(atarilance_dev);
-+ free_irq(atarilance_dev->irq, atarilance_dev);
-+ free_netdev(atarilance_dev);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/atari_pamsnet.c 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/net/atari_pamsnet.c 2003-12-28 23:21:00.000000000 -0800
-@@ -110,8 +110,6 @@ static char *version =
- #undef READ
- #undef WRITE
-
--extern struct net_device *init_etherdev(struct net_device *dev, int sizeof_private);
--
- /* use 0 for production, 1 for verification, >2 for debug
- */
- #ifndef NET_DEBUG
-@@ -158,8 +156,6 @@ static int send_1_5 (int lun, unsigned c
- static int get_status (void);
- static int calc_received (void *start_address);
-
--extern int pamsnet_probe(struct net_device *dev);
--
- static int pamsnet_open(struct net_device *dev);
- static int pamsnet_send_packet(struct sk_buff *skb, struct net_device *dev);
- static void pamsnet_poll_rx(struct net_device *);
-@@ -562,12 +558,12 @@ bad:
- /* Check for a network adaptor of this type, and return '0' if one exists.
- */
-
--int __init
--pamsnet_probe (dev)
-- struct net_device *dev;
-+struct net_device * __init pamsnet_probe (int unit)
- {
-+ struct net_device *dev;
- int i;
- HADDR *hwaddr;
-+ int err;
-
- unsigned char station_addr[6];
- static unsigned version_printed;
-@@ -575,12 +571,18 @@ pamsnet_probe (dev)
- static int no_more_found;
-
- if (no_more_found)
-- return -ENODEV;
-+ return ERR_PTR(-ENODEV);
-+ no_more_found = 1;
-
-+ dev = alloc_etherdev(sizeof(struct net_local));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
- SET_MODULE_OWNER(dev);
-
-- no_more_found = 1;
--
- printk("Probing for PAM's Net/GK Adapter...\n");
-
- /* Allocate the DMA buffer here since we need it for probing! */
-@@ -618,11 +620,12 @@ pamsnet_probe (dev)
- ENABLE_IRQ();
- stdma_release();
-
-- if (lance_target < 0)
-+ if (lance_target < 0) {
- printk("No PAM's Net/GK found.\n");
-+ free_netdev(dev);
-+ return ERR_PTR(-ENODEV);
-+ }
-
-- if ((dev == NULL) || (lance_target < 0))
-- return -ENODEV;
- if (pamsnet_debug > 0 && version_printed++ == 0)
- printk(version);
-
-@@ -632,12 +635,6 @@ pamsnet_probe (dev)
- station_addr[3], station_addr[4], station_addr[5]);
-
- /* Initialize the device structure. */
-- if (dev->priv == NULL)
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (!dev->priv)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct net_local));
--
- dev->open = pamsnet_open;
- dev->stop = pamsnet_close;
- dev->hard_start_xmit = pamsnet_send_packet;
-@@ -653,9 +650,12 @@ pamsnet_probe (dev)
- #endif
- dev->dev_addr[i] = station_addr[i];
- }
-- ether_setup(dev);
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-
-- return(0);
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /* Open/initialize the board. This is called (in the current kernel)
-@@ -866,25 +866,20 @@ static struct net_device_stats *net_get_
-
- #ifdef MODULE
-
--static struct net_device pam_dev;
--
--int
--init_module(void) {
-- int err;
-+static struct net_device *pam_dev;
-
-- pam_dev.init = pamsnet_probe;
-- if ((err = register_netdev(&pam_dev))) {
-- if (err == -EEXIST) {
-- printk("PAM's Net/GK: devices already present. Module not loaded.\n");
-- }
-- return err;
-- }
-+int init_module(void)
-+{
-+ pam_dev = pamsnet_probe(-1);
-+ if (IS_ERR(pam_dev))
-+ return PTR_ERR(pam_dev);
- return 0;
- }
-
--void
--cleanup_module(void) {
-- unregister_netdev(&pam_dev);
-+void cleanup_module(void)
-+{
-+ unregister_netdev(pam_dev);
-+ free_netdev(pam_dev);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/atp.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/atp.c 2003-12-28 23:21:00.000000000 -0800
-@@ -195,7 +195,7 @@ static void atp_timed_checker(unsigned l
-
- /* Index to functions, as function prototypes. */
-
--static int atp_probe1(struct net_device *dev, long ioaddr);
-+static int atp_probe1(long ioaddr);
- static void get_node_ID(struct net_device *dev);
- static unsigned short eeprom_op(long ioaddr, unsigned int cmd);
- static int net_open(struct net_device *dev);
-@@ -224,13 +224,13 @@ static struct net_device *root_atp_dev;
-
- FIXME: we should use the parport layer for this
- */
--static int __init atp_init(struct net_device *dev)
-+static int __init atp_init(void)
- {
- int *port, ports[] = {0x378, 0x278, 0x3bc, 0};
-- int base_addr = dev ? dev->base_addr : io[0];
-+ int base_addr = io[0];
-
- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return atp_probe1(dev, base_addr);
-+ return atp_probe1(base_addr);
- else if (base_addr == 1) /* Don't probe at all. */
- return -ENXIO;
-
-@@ -239,17 +239,19 @@ static int __init atp_init(struct net_de
- outb(0x57, ioaddr + PAR_DATA);
- if (inb(ioaddr + PAR_DATA) != 0x57)
- continue;
-- if (atp_probe1(dev, ioaddr) == 0)
-+ if (atp_probe1(ioaddr) == 0)
- return 0;
- }
-
- return -ENODEV;
- }
-
--static int __init atp_probe1(struct net_device *dev, long ioaddr)
-+static int __init atp_probe1(long ioaddr)
- {
-+ struct net_device *dev = NULL;
- struct net_local *lp;
- int saved_ctrl_reg, status, i;
-+ int res;
-
- outb(0xff, ioaddr + PAR_DATA);
- /* Save the original value of the Control register, in case we guessed
-@@ -296,7 +298,7 @@ static int __init atp_probe1(struct net_
- return -ENODEV;
- }
-
-- dev = init_etherdev(dev, sizeof(struct net_local));
-+ dev = alloc_etherdev(sizeof(struct net_local));
- if (!dev)
- return -ENOMEM;
- SET_MODULE_OWNER(dev);
-@@ -331,24 +333,13 @@ static int __init atp_probe1(struct net_
- dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-
- /* Reset the ethernet hardware and activate the printer pass-through. */
-- write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX);
--
-- /* Initialize the device structure. */
-- ether_setup(dev);
-- if (dev->priv == NULL)
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (dev->priv == NULL)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct net_local));
-+ write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX);
-
- lp = (struct net_local *)dev->priv;
- lp->chip_type = RTL8002;
- lp->addr_mode = CMR2h_Normal;
- spin_lock_init(&lp->lock);
-
-- lp->next_module = root_atp_dev;
-- root_atp_dev = dev;
--
- /* For the ATP adapter the "if_port" is really the data transfer mode. */
- if (xcvr[0])
- dev->if_port = xcvr[0];
-@@ -366,6 +357,15 @@ static int __init atp_probe1(struct net_
- dev->tx_timeout = tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
-
-+ res = register_netdev(dev);
-+ if (res) {
-+ free_netdev(dev);
-+ return res;
-+ }
-+
-+ lp->next_module = root_atp_dev;
-+ root_atp_dev = dev;
-+
- return 0;
- }
-
-@@ -933,7 +933,7 @@ static void set_rx_mode_8012(struct net_
- static int __init atp_init_module(void) {
- if (debug) /* Emit version even if no cards detected. */
- printk(KERN_INFO "%s" KERN_INFO "%s", versionA, versionB);
-- return atp_init(NULL);
-+ return atp_init();
- }
-
- static void __exit atp_cleanup_module(void) {
---- linux-2.6.0/drivers/net/au1000_eth.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/au1000_eth.c 2003-12-28 23:21:00.000000000 -0800
-@@ -56,7 +56,7 @@ static void *dma_alloc(size_t, dma_addr_
- static void dma_free(void *, size_t);
- static void hard_stop(struct net_device *);
- static void enable_rx_tx(struct net_device *dev);
--static int __init au1000_probe1(struct net_device *, long, int, int);
-+static int __init au1000_probe1(long, int, int);
- static int au1000_init(struct net_device *);
- static int au1000_open(struct net_device *);
- static int au1000_close(struct net_device *);
-@@ -644,17 +644,17 @@ static int __init au1000_init_module(voi
- }
- // check for valid entries, au1100 only has one entry
- if (base_addr && irq) {
-- if (au1000_probe1(NULL, base_addr, irq, i) != 0) {
-+ if (au1000_probe1(base_addr, irq, i) != 0)
- return -ENODEV;
-- }
- }
- }
- return 0;
- }
-
- static int __init
--au1000_probe1(struct net_device *dev, long ioaddr, int irq, int port_num)
-+au1000_probe1(long ioaddr, int irq, int port_num)
- {
-+ struct net_device *dev;
- static unsigned version_printed = 0;
- struct au1000_private *aup = NULL;
- int i, retval = 0;
-@@ -668,15 +668,16 @@ au1000_probe1(struct net_device *dev, lo
- if (version_printed++ == 0)
- printk(version);
-
-- if (!dev)
-- dev = init_etherdev(NULL, sizeof(struct au1000_private));
-+ retval = -ENOMEM;
-
-+ dev = alloc_etherdev(sizeof(struct au1000_private));
- if (!dev) {
-- printk (KERN_ERR "au1000 eth: init_etherdev failed\n");
-- release_region(ioaddr, MAC_IOSIZE);
-- return -ENODEV;
-+ printk (KERN_ERR "au1000 eth: alloc_etherdev failed\n");
-+ goto out;
- }
-
-+ SET_MODULE_OWNER(dev);
-+
- printk("%s: Au1xxx ethernet found at 0x%lx, irq %d\n",
- dev->name, ioaddr, irq);
-
-@@ -685,10 +686,8 @@ au1000_probe1(struct net_device *dev, lo
- /* Allocate the data buffers */
- aup->vaddr = (u32)dma_alloc(MAX_BUF_SIZE *
- (NUM_TX_BUFFS+NUM_RX_BUFFS), &aup->dma_addr);
-- if (!aup->vaddr) {
-- retval = -ENOMEM;
-- goto free_region;
-- }
-+ if (!aup->vaddr)
-+ goto out1;
-
- /* aup->mac is the base address of the MAC's registers */
- aup->mac = (volatile mac_reg_t *)((unsigned long)ioaddr);
-@@ -749,10 +748,11 @@ au1000_probe1(struct net_device *dev, lo
- MAC_EN_RESET2 | MAC_EN_CLOCK_ENABLE;
- au_sync_delay(2);
-
-- if (mii_probe(dev) != 0) {
-- goto free_region;
-- }
-+ retval = mii_probe(dev);
-+ if (retval)
-+ goto out2;
-
-+ retval = -EINVAL;
- pDBfree = NULL;
- /* setup the data buffer descriptors and attach a buffer to each one */
- pDB = aup->db;
-@@ -767,13 +767,13 @@ au1000_probe1(struct net_device *dev, lo
-
- for (i=0; i<NUM_RX_DMA; i++) {
- pDB = GetFreeDB(aup);
-- if (!pDB) goto free_region;
-+ if (!pDB) goto out2;
- aup->rx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr;
- aup->rx_db_inuse[i] = pDB;
- }
- for (i=0; i<NUM_TX_DMA; i++) {
- pDB = GetFreeDB(aup);
-- if (!pDB) goto free_region;
-+ if (!pDB) goto out2;
- aup->tx_dma_ring[i]->buff_stat = (unsigned)pDB->dma_addr;
- aup->tx_dma_ring[i]->len = 0;
- aup->tx_db_inuse[i] = pDB;
-@@ -792,26 +792,25 @@ au1000_probe1(struct net_device *dev, lo
- dev->tx_timeout = au1000_tx_timeout;
- dev->watchdog_timeo = ETH_TX_TIMEOUT;
-
--
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--
- /*
- * The boot code uses the ethernet controller, so reset it to start
- * fresh. au1000_init() expects that the device is in reset state.
- */
- reset_mac(dev);
-+
-+ retval = register_netdev(dev);
-+ if (retval)
-+ goto out2;
- return 0;
-
--free_region:
-+out2:
-+ dma_free(aup->vaddr, MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS));
-+out1:
-+ free_netdev(dev);
-+out:
- release_region(PHYSADDR(ioaddr), MAC_IOSIZE);
-- unregister_netdev(dev);
-- if (aup->vaddr)
-- dma_free((void *)aup->vaddr,
-- MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS));
- printk(KERN_ERR "%s: au1000_probe1 failed. Returns %d\n",
- dev->name, retval);
-- free_netdev(dev);
- return retval;
- }
-
-@@ -933,15 +932,12 @@ static int au1000_open(struct net_device
- int retval;
- struct au1000_private *aup = (struct au1000_private *) dev->priv;
-
-- MOD_INC_USE_COUNT;
--
- if (au1000_debug > 4)
- printk("%s: open: dev=%p\n", dev->name, dev);
-
- if ((retval = au1000_init(dev))) {
- printk(KERN_ERR "%s: error in au1000_init\n", dev->name);
- free_irq(dev->irq, dev);
-- MOD_DEC_USE_COUNT;
- return retval;
- }
- netif_start_queue(dev);
-@@ -950,7 +946,6 @@ static int au1000_open(struct net_device
- dev->name, dev))) {
- printk(KERN_ERR "%s: unable to get IRQ %d\n",
- dev->name, dev->irq);
-- MOD_DEC_USE_COUNT;
- return retval;
- }
-
-@@ -984,8 +979,6 @@ static int au1000_close(struct net_devic
- spin_unlock_irqrestore(&aup->lock, flags);
-
- reset_mac(dev);
-- kfree(dev);
-- MOD_DEC_USE_COUNT;
- return 0;
- }
-
---- linux-2.6.0/drivers/net/bagetlance.c 2003-06-14 12:17:56.000000000 -0700
-+++ 25/drivers/net/bagetlance.c 2003-12-28 23:21:00.000000000 -0800
-@@ -465,30 +465,43 @@ void *slow_memcpy( void *dst, const void
- }
-
-
--int __init bagetlance_probe( struct net_device *dev )
--
--{ int i;
-+struct net_device * __init bagetlance_probe(int unit)
-+{
-+ struct net_device *dev;
-+ int i;
- static int found;
--
-- SET_MODULE_OWNER(dev);
-+ int err = -ENODEV;
-
- if (found)
- /* Assume there's only one board possible... That seems true, since
- * the Riebl/PAM board's address cannot be changed. */
-- return( -ENODEV );
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_etherdev(sizeof(struct lance_private));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ SET_MODULE_OWNER(dev);
-
- for( i = 0; i < N_LANCE_ADDR; ++i ) {
- if (lance_probe1( dev, &lance_addr_list[i] )) {
- found = 1;
-- return( 0 );
-+ break;
- }
- }
--
-- return( -ENODEV );
-+ if (!found)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ free_irq(dev->irq, dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
--
--
- /* Derived from hwreg_present() in vme/config.c: */
-
- static int __init addr_accessible( volatile void *regp,
-@@ -527,6 +540,7 @@ static int __init lance_probe1( struct n
- if (!addr_accessible( memaddr, 1, 1 )) goto probe_fail;
-
- if ((unsigned long)memaddr >= KSEG2) {
-+ /* FIXME: do we need to undo that on cleanup paths? */
- extern int kseg2_alloc_io (unsigned long addr, unsigned long size);
- if (kseg2_alloc_io((unsigned long)memaddr, BAGET_LANCE_MEM_SIZE)) {
- printk("bagetlance: unable map lance memory\n");
-@@ -580,12 +594,6 @@ static int __init lance_probe1( struct n
- return( 0 );
-
- probe_ok:
-- init_etherdev( dev, sizeof(struct lance_private) );
-- if (!dev->priv) {
-- dev->priv = kmalloc( sizeof(struct lance_private), GFP_KERNEL );
-- if (!dev->priv)
-- return 0;
-- }
- lp = (struct lance_private *)dev->priv;
- MEM = (struct lance_memory *)memaddr;
- IO = lp->iobase = (struct lance_ioreg *)ioaddr;
-@@ -617,8 +625,9 @@ static int __init lance_probe1( struct n
- if (lp->cardtype == PAM_CARD ||
- memaddr == (unsigned short *)0xffe00000) {
- /* PAMs card and Riebl on ST use level 5 autovector */
-- request_irq(BAGET_LANCE_IRQ, lance_interrupt, IRQ_TYPE_PRIO,
-- "PAM/Riebl-ST Ethernet", dev);
-+ if (request_irq(BAGET_LANCE_IRQ, lance_interrupt, IRQ_TYPE_PRIO,
-+ "PAM/Riebl-ST Ethernet", dev))
-+ goto probe_fail;
- dev->irq = (unsigned short)BAGET_LANCE_IRQ;
- }
- else {
-@@ -629,10 +638,11 @@ static int __init lance_probe1( struct n
- unsigned long irq = BAGET_LANCE_IRQ;
- if (!irq) {
- printk( "Lance: request for VME interrupt failed\n" );
-- return( 0 );
-+ goto probe_fail;
- }
-- request_irq(irq, lance_interrupt, IRQ_TYPE_PRIO,
-- "Riebl-VME Ethernet", dev);
-+ if (request_irq(irq, lance_interrupt, IRQ_TYPE_PRIO,
-+ "Riebl-VME Ethernet", dev))
-+ goto probe_fail;
- dev->irq = irq;
- }
-
-@@ -1331,26 +1341,21 @@ static int lance_set_mac_address( struct
-
-
- #ifdef MODULE
--static struct net_device bagetlance_dev;
-+static struct net_device *bagetlance_dev;
-
- int init_module(void)
--
--{ int err;
--
-- bagetlance_dev.init = bagetlance_probe;
-- if ((err = register_netdev( &bagetlance_dev ))) {
-- if (err == -EIO) {
-- printk( "No Vme Lance board found. Module not loaded.\n");
-- }
-- return( err );
-- }
-- return( 0 );
-+{
-+ bagetlance_dev = bagetlance_probe(-1);
-+ if (IS_ERR(bagetlance_dev))
-+ return PTR_ERR(bagetlance_dev);
-+ return 0;
- }
-
- void cleanup_module(void)
--
- {
-- unregister_netdev( &bagetlance_dev );
-+ unregister_netdev(bagetlance_dev);
-+ free_irq(bagetlance_dev->irq, bagetlance_dev);
-+ free_netdev(bagetlance_dev);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/bonding/bond_3ad.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/bonding/bond_3ad.c 2003-12-28 23:21:00.000000000 -0800
-@@ -47,8 +47,13 @@
- * - Send LACPDU as highest priority packet to further fix the above
- * problem on very high Tx traffic load where packets may get dropped
- * by the slave.
-+ *
-+ * 2003/09/24 - Shmulik Hen <shmulik.hen at intel dot com>
-+ * - Code cleanup and style changes
- */
-
-+//#define BONDING_DEBUG 1
-+
- #include <linux/skbuff.h>
- #include <linux/if_ether.h>
- #include <linux/netdevice.h>
-@@ -119,6 +124,7 @@
-
- static struct mac_addr null_mac_addr = {{0, 0, 0, 0, 0, 0}};
- static u16 ad_ticks_per_sec;
-+static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000;
-
- // ================= 3AD api to bonding and kernel code ==================
- static u16 __get_link_speed(struct port *port);
-@@ -196,13 +202,11 @@ static inline struct bonding *__get_bond
- */
- static inline struct port *__get_first_port(struct bonding *bond)
- {
-- struct slave *slave = bond->next;
--
-- if (slave == (struct slave *)bond) {
-+ if (bond->slave_cnt == 0) {
- return NULL;
- }
-
-- return &(SLAVE_AD_INFO(slave).port);
-+ return &(SLAVE_AD_INFO(bond->first_slave).port);
- }
-
- /**
-@@ -218,7 +222,7 @@ static inline struct port *__get_next_po
- struct slave *slave = port->slave;
-
- // If there's no bond for this port, or this is the last slave
-- if ((bond == NULL) || (slave->next == bond->next)) {
-+ if ((bond == NULL) || (slave->next == bond->first_slave)) {
- return NULL;
- }
-
-@@ -236,12 +240,12 @@ static inline struct aggregator *__get_f
- {
- struct bonding *bond = __get_bond_by_port(port);
-
-- // If there's no bond for this port, or this is the last slave
-- if ((bond == NULL) || (bond->next == (struct slave *)bond)) {
-+ // If there's no bond for this port, or bond has no slaves
-+ if ((bond == NULL) || (bond->slave_cnt == 0)) {
- return NULL;
- }
-
-- return &(SLAVE_AD_INFO(bond->next).aggregator);
-+ return &(SLAVE_AD_INFO(bond->first_slave).aggregator);
- }
-
- /**
-@@ -257,7 +261,7 @@ static inline struct aggregator *__get_n
- struct bonding *bond = bond_get_bond_by_slave(slave);
-
- // If there's no bond for this aggregator, or this is the last slave
-- if ((bond == NULL) || (slave->next == bond->next)) {
-+ if ((bond == NULL) || (slave->next == bond->first_slave)) {
- return NULL;
- }
-
-@@ -392,7 +396,7 @@ static u16 __get_link_speed(struct port
- }
- }
-
-- BOND_PRINT_DBG(("Port %d Received link speed %d update from adapter", port->actor_port_number, speed));
-+ dprintk("Port %d Received link speed %d update from adapter\n", port->actor_port_number, speed);
- return speed;
- }
-
-@@ -418,12 +422,12 @@ static u8 __get_duplex(struct port *port
- switch (slave->duplex) {
- case DUPLEX_FULL:
- retval=0x1;
-- BOND_PRINT_DBG(("Port %d Received status full duplex update from adapter", port->actor_port_number));
-+ dprintk("Port %d Received status full duplex update from adapter\n", port->actor_port_number);
- break;
- case DUPLEX_HALF:
- default:
- retval=0x0;
-- BOND_PRINT_DBG(("Port %d Received status NOT full duplex update from adapter", port->actor_port_number));
-+ dprintk("Port %d Received status NOT full duplex update from adapter\n", port->actor_port_number);
- break;
- }
- }
-@@ -1059,7 +1063,7 @@ static void ad_mux_machine(struct port *
-
- // check if the state machine was changed
- if (port->sm_mux_state != last_state) {
-- BOND_PRINT_DBG(("Mux Machine: Port=%d, Last State=%d, Curr State=%d", port->actor_port_number, last_state, port->sm_mux_state));
-+ dprintk("Mux Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_mux_state);
- switch (port->sm_mux_state) {
- case AD_MUX_DETACHED:
- __detach_bond_from_agg(port);
-@@ -1158,7 +1162,7 @@ static void ad_rx_machine(struct lacpdu
-
- // check if the State machine was changed or new lacpdu arrived
- if ((port->sm_rx_state != last_state) || (lacpdu)) {
-- BOND_PRINT_DBG(("Rx Machine: Port=%d, Last State=%d, Curr State=%d", port->actor_port_number, last_state, port->sm_rx_state));
-+ dprintk("Rx Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_rx_state);
- switch (port->sm_rx_state) {
- case AD_RX_INITIALIZE:
- if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) {
-@@ -1204,7 +1208,7 @@ static void ad_rx_machine(struct lacpdu
- // detect loopback situation
- if (!MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->actor_system))) {
- // INFO_RECEIVED_LOOPBACK_FRAMES
-- printk(KERN_ERR "bonding: An illegal loopback occurred on adapter (%s)\n",
-+ printk(KERN_ERR DRV_NAME ": An illegal loopback occurred on adapter (%s)\n",
- port->slave->dev->name);
- printk(KERN_ERR "Check the configuration to verify that all Adapters "
- "are connected to 802.3ad compliant switch ports\n");
-@@ -1245,7 +1249,7 @@ static void ad_tx_machine(struct port *p
- __update_lacpdu_from_port(port);
- // send the lacpdu
- if (ad_lacpdu_send(port) >= 0) {
-- BOND_PRINT_DBG(("Sent LACPDU on port %d", port->actor_port_number));
-+ dprintk("Sent LACPDU on port %d\n", port->actor_port_number);
- // mark ntt as false, so it will not be sent again until demanded
- port->ntt = 0;
- }
-@@ -1318,7 +1322,7 @@ static void ad_periodic_machine(struct p
-
- // check if the state machine was changed
- if (port->sm_periodic_state != last_state) {
-- BOND_PRINT_DBG(("Periodic Machine: Port=%d, Last State=%d, Curr State=%d", port->actor_port_number, last_state, port->sm_periodic_state));
-+ dprintk("Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_periodic_state);
- switch (port->sm_periodic_state) {
- case AD_NO_PERIODIC:
- port->sm_periodic_timer_counter = 0; // zero timer
-@@ -1375,7 +1379,7 @@ static void ad_port_selection_logic(stru
- port->next_port_in_aggregator=NULL;
- port->actor_port_aggregator_identifier=0;
-
-- BOND_PRINT_DBG(("Port %d left LAG %d", port->actor_port_number, temp_aggregator->aggregator_identifier));
-+ dprintk("Port %d left LAG %d\n", port->actor_port_number, temp_aggregator->aggregator_identifier);
- // if the aggregator is empty, clear its parameters, and set it ready to be attached
- if (!temp_aggregator->lag_ports) {
- ad_clear_agg(temp_aggregator);
-@@ -1384,7 +1388,7 @@ static void ad_port_selection_logic(stru
- }
- }
- if (!curr_port) { // meaning: the port was related to an aggregator but was not on the aggregator port list
-- printk(KERN_WARNING "bonding: Warning: Port %d (on %s) was "
-+ printk(KERN_WARNING DRV_NAME ": Warning: Port %d (on %s) was "
- "related to aggregator %d but was not on its port list\n",
- port->actor_port_number, port->slave->dev->name,
- port->aggregator->aggregator_identifier);
-@@ -1417,7 +1421,7 @@ static void ad_port_selection_logic(stru
- port->next_port_in_aggregator=aggregator->lag_ports;
- port->aggregator->num_of_ports++;
- aggregator->lag_ports=port;
-- BOND_PRINT_DBG(("Port %d joined LAG %d(existing LAG)", port->actor_port_number, port->aggregator->aggregator_identifier));
-+ dprintk("Port %d joined LAG %d(existing LAG)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
-
- // mark this port as selected
- port->sm_vars |= AD_PORT_SELECTED;
-@@ -1454,9 +1458,9 @@ static void ad_port_selection_logic(stru
- // mark this port as selected
- port->sm_vars |= AD_PORT_SELECTED;
-
-- BOND_PRINT_DBG(("Port %d joined LAG %d(new LAG)", port->actor_port_number, port->aggregator->aggregator_identifier));
-+ dprintk("Port %d joined LAG %d(new LAG)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
- } else {
-- printk(KERN_ERR "bonding: Port %d (on %s) did not find a suitable aggregator\n",
-+ printk(KERN_ERR DRV_NAME ": Port %d (on %s) did not find a suitable aggregator\n",
- port->actor_port_number, port->slave->dev->name);
- }
- }
-@@ -1580,30 +1584,30 @@ static void ad_agg_selection_logic(struc
- aggregator;
- aggregator = __get_next_agg(aggregator)) {
-
-- BOND_PRINT_DBG(("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d",
-+ dprintk("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d\n",
- aggregator->aggregator_identifier, aggregator->num_of_ports,
- aggregator->actor_oper_aggregator_key, aggregator->partner_oper_aggregator_key,
-- aggregator->is_individual, aggregator->is_active));
-+ aggregator->is_individual, aggregator->is_active);
- }
-
- // check if any partner replys
- if (best_aggregator->is_individual) {
-- printk(KERN_WARNING "bonding: Warning: No 802.3ad response from the link partner "
-+ printk(KERN_WARNING DRV_NAME ": Warning: No 802.3ad response from the link partner "
- "for any adapters in the bond\n");
- }
-
- // check if there are more than one aggregator
- if (num_of_aggs > 1) {
-- BOND_PRINT_DBG(("Warning: More than one Link Aggregation Group was "
-- "found in the bond. Only one group will function in the bond"));
-+ dprintk("Warning: More than one Link Aggregation Group was "
-+ "found in the bond. Only one group will function in the bond\n");
- }
-
- best_aggregator->is_active = 1;
-- BOND_PRINT_DBG(("LAG %d choosed as the active LAG", best_aggregator->aggregator_identifier));
-- BOND_PRINT_DBG(("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d",
-+ dprintk("LAG %d choosed as the active LAG\n", best_aggregator->aggregator_identifier);
-+ dprintk("Agg=%d; Ports=%d; a key=%d; p key=%d; Indiv=%d; Active=%d\n",
- best_aggregator->aggregator_identifier, best_aggregator->num_of_ports,
- best_aggregator->actor_oper_aggregator_key, best_aggregator->partner_oper_aggregator_key,
-- best_aggregator->is_individual, best_aggregator->is_active));
-+ best_aggregator->is_individual, best_aggregator->is_active);
-
- // disable the ports that were related to the former active_aggregator
- if (last_active_aggregator) {
-@@ -1644,7 +1648,7 @@ static void ad_clear_agg(struct aggregat
- aggregator->lag_ports = NULL;
- aggregator->is_active = 0;
- aggregator->num_of_ports = 0;
-- BOND_PRINT_DBG(("LAG %d was cleared", aggregator->aggregator_identifier));
-+ dprintk("LAG %d was cleared\n", aggregator->aggregator_identifier);
- }
- }
-
-@@ -1729,7 +1733,7 @@ static void ad_initialize_port(struct po
- static void ad_enable_collecting_distributing(struct port *port)
- {
- if (port->aggregator->is_active) {
-- BOND_PRINT_DBG(("Enabling port %d(LAG %d)", port->actor_port_number, port->aggregator->aggregator_identifier));
-+ dprintk("Enabling port %d(LAG %d)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
- __enable_port(port);
- }
- }
-@@ -1742,7 +1746,7 @@ static void ad_enable_collecting_distrib
- static void ad_disable_collecting_distributing(struct port *port)
- {
- if (port->aggregator && MAC_ADDRESS_COMPARE(&(port->aggregator->partner_system), &(null_mac_addr))) {
-- BOND_PRINT_DBG(("Disabling port %d(LAG %d)", port->actor_port_number, port->aggregator->aggregator_identifier));
-+ dprintk("Disabling port %d(LAG %d)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
- __disable_port(port);
- }
- }
-@@ -1780,7 +1784,7 @@ static void ad_marker_info_send(struct p
-
- // send the marker information
- if (ad_marker_send(port, &marker) >= 0) {
-- BOND_PRINT_DBG(("Sent Marker Information on port %d", port->actor_port_number));
-+ dprintk("Sent Marker Information on port %d\n", port->actor_port_number);
- }
- }
- #endif
-@@ -1803,7 +1807,7 @@ static void ad_marker_info_received(stru
- // send the marker response
-
- if (ad_marker_send(port, &marker) >= 0) {
-- BOND_PRINT_DBG(("Sent Marker Response on port %d", port->actor_port_number));
-+ dprintk("Sent Marker Response on port %d\n", port->actor_port_number);
- }
- }
-
-@@ -1890,13 +1894,13 @@ static u16 aggregator_identifier;
- void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast)
- {
- // check that the bond is not initialized yet
-- if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr), &(bond->device->dev_addr))) {
-+ if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr), &(bond->dev->dev_addr))) {
-
- aggregator_identifier = 0;
-
- BOND_AD_INFO(bond).lacp_fast = lacp_fast;
- BOND_AD_INFO(bond).system.sys_priority = 0xFFFF;
-- BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->device->dev_addr);
-+ BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->dev->dev_addr);
-
- // initialize how many times this module is called in one second(should be about every 100ms)
- ad_ticks_per_sec = tick_resolution;
-@@ -1921,7 +1925,7 @@ int bond_3ad_bind_slave(struct slave *sl
- struct aggregator *aggregator;
-
- if (bond == NULL) {
-- printk(KERN_CRIT "The slave %s is not attached to its bond\n", slave->dev->name);
-+ printk(KERN_ERR "The slave %s is not attached to its bond\n", slave->dev->name);
- return -1;
- }
-
-@@ -1964,7 +1968,7 @@ int bond_3ad_bind_slave(struct slave *sl
-
- ad_initialize_agg(aggregator);
-
-- aggregator->aggregator_mac_address = *((struct mac_addr *)bond->device->dev_addr);
-+ aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr);
- aggregator->aggregator_identifier = (++aggregator_identifier);
- aggregator->slave = slave;
- aggregator->is_active = 0;
-@@ -1996,11 +2000,11 @@ void bond_3ad_unbind_slave(struct slave
-
- // if slave is null, the whole port is not initialized
- if (!port->slave) {
-- printk(KERN_WARNING "bonding: Trying to unbind an uninitialized port on %s\n", slave->dev->name);
-+ printk(KERN_WARNING DRV_NAME ": Trying to unbind an uninitialized port on %s\n", slave->dev->name);
- return;
- }
-
-- BOND_PRINT_DBG(("Unbinding Link Aggregation Group %d", aggregator->aggregator_identifier));
-+ dprintk("Unbinding Link Aggregation Group %d\n", aggregator->aggregator_identifier);
-
- /* Tell the partner that this port is not suitable for aggregation */
- port->actor_oper_port_state &= ~AD_STATE_AGGREGATION;
-@@ -2024,10 +2028,10 @@ void bond_3ad_unbind_slave(struct slave
- // if new aggregator found, copy the aggregator's parameters
- // and connect the related lag_ports to the new aggregator
- if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_aggregator->lag_ports->next_port_in_aggregator))) {
-- BOND_PRINT_DBG(("Some port(s) related to LAG %d - replaceing with LAG %d", aggregator->aggregator_identifier, new_aggregator->aggregator_identifier));
-+ dprintk("Some port(s) related to LAG %d - replaceing with LAG %d\n", aggregator->aggregator_identifier, new_aggregator->aggregator_identifier);
-
- if ((new_aggregator->lag_ports == port) && new_aggregator->is_active) {
-- printk(KERN_INFO "bonding: Removing an active aggregator\n");
-+ printk(KERN_INFO DRV_NAME ": Removing an active aggregator\n");
- // select new active aggregator
- select_new_active_agg = 1;
- }
-@@ -2057,7 +2061,7 @@ void bond_3ad_unbind_slave(struct slave
- ad_agg_selection_logic(__get_first_agg(port));
- }
- } else {
-- printk(KERN_WARNING "bonding: Warning: unbinding aggregator, "
-+ printk(KERN_WARNING DRV_NAME ": Warning: unbinding aggregator, "
- "and could not find a new aggregator for its ports\n");
- }
- } else { // in case that the only port related to this aggregator is the one we want to remove
-@@ -2072,7 +2076,7 @@ void bond_3ad_unbind_slave(struct slave
- }
- }
-
-- BOND_PRINT_DBG(("Unbinding port %d", port->actor_port_number));
-+ dprintk("Unbinding port %d\n", port->actor_port_number);
- // find the aggregator that this port is connected to
- temp_aggregator = __get_first_agg(port);
- for (; temp_aggregator; temp_aggregator = __get_next_agg(temp_aggregator)) {
-@@ -2123,13 +2127,13 @@ void bond_3ad_state_machine_handler(stru
-
- read_lock(&bond->lock);
-
-- //check if there are any slaves
-- if (bond->next == (struct slave *)bond) {
-- goto end;
-+ if (bond->kill_timers) {
-+ goto out;
- }
-
-- if ((bond->device->flags & IFF_UP) != IFF_UP) {
-- goto end;
-+ //check if there are any slaves
-+ if (bond->slave_cnt == 0) {
-+ goto re_arm;
- }
-
- // check if agg_select_timer timer after initialize is timed out
-@@ -2137,8 +2141,8 @@ void bond_3ad_state_machine_handler(stru
- // select the active aggregator for the bond
- if ((port = __get_first_port(bond))) {
- if (!port->slave) {
-- printk(KERN_WARNING "bonding: Warning: bond's first port is uninitialized\n");
-- goto end;
-+ printk(KERN_WARNING DRV_NAME ": Warning: bond's first port is uninitialized\n");
-+ goto re_arm;
- }
-
- aggregator = __get_first_agg(port);
-@@ -2149,8 +2153,8 @@ void bond_3ad_state_machine_handler(stru
- // for each port run the state machines
- for (port = __get_first_port(bond); port; port = __get_next_port(port)) {
- if (!port->slave) {
-- printk(KERN_WARNING "bonding: Warning: Found an uninitialized port\n");
-- goto end;
-+ printk(KERN_WARNING DRV_NAME ": Warning: Found an uninitialized port\n");
-+ goto re_arm;
- }
-
- ad_rx_machine(NULL, port);
-@@ -2165,14 +2169,10 @@ void bond_3ad_state_machine_handler(stru
- }
- }
-
--end:
-+re_arm:
-+ mod_timer(&(BOND_AD_INFO(bond).ad_timer), jiffies + ad_delta_in_ticks);
-+out:
- read_unlock(&bond->lock);
--
--
-- if ((bond->device->flags & IFF_UP) == IFF_UP) {
-- /* re-arm the timer */
-- mod_timer(&(BOND_AD_INFO(bond).ad_timer), jiffies + (AD_TIMER_INTERVAL * HZ / 1000));
-- }
- }
-
- /**
-@@ -2194,14 +2194,14 @@ void bond_3ad_rx_indication(struct lacpd
- port = &(SLAVE_AD_INFO(slave).port);
-
- if (!port->slave) {
-- printk(KERN_WARNING "bonding: Warning: port of slave %s is uninitialized\n", slave->dev->name);
-+ printk(KERN_WARNING DRV_NAME ": Warning: port of slave %s is uninitialized\n", slave->dev->name);
- return;
- }
-
- switch (lacpdu->subtype) {
- case AD_TYPE_LACPDU:
- __ntohs_lacpdu(lacpdu);
-- BOND_PRINT_DBG(("Received LACPDU on port %d", port->actor_port_number));
-+ dprintk("Received LACPDU on port %d\n", port->actor_port_number);
- ad_rx_machine(lacpdu, port);
- break;
-
-@@ -2210,17 +2210,17 @@ void bond_3ad_rx_indication(struct lacpd
-
- switch (((struct marker *)lacpdu)->tlv_type) {
- case AD_MARKER_INFORMATION_SUBTYPE:
-- BOND_PRINT_DBG(("Received Marker Information on port %d", port->actor_port_number));
-+ dprintk("Received Marker Information on port %d\n", port->actor_port_number);
- ad_marker_info_received((struct marker *)lacpdu, port);
- break;
-
- case AD_MARKER_RESPONSE_SUBTYPE:
-- BOND_PRINT_DBG(("Received Marker Response on port %d", port->actor_port_number));
-+ dprintk("Received Marker Response on port %d\n", port->actor_port_number);
- ad_marker_response_received((struct marker *)lacpdu, port);
- break;
-
- default:
-- BOND_PRINT_DBG(("Received an unknown Marker subtype on slot %d", port->actor_port_number));
-+ dprintk("Received an unknown Marker subtype on slot %d\n", port->actor_port_number);
- }
- }
- }
-@@ -2240,14 +2240,14 @@ void bond_3ad_adapter_speed_changed(stru
-
- // if slave is null, the whole port is not initialized
- if (!port->slave) {
-- printk(KERN_WARNING "bonding: Warning: speed changed for uninitialized port on %s\n",
-+ printk(KERN_WARNING DRV_NAME ": Warning: speed changed for uninitialized port on %s\n",
- slave->dev->name);
- return;
- }
-
- port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS;
- port->actor_oper_port_key=port->actor_admin_port_key |= (__get_link_speed(port) << 1);
-- BOND_PRINT_DBG(("Port %d changed speed", port->actor_port_number));
-+ dprintk("Port %d changed speed\n", port->actor_port_number);
- // there is no need to reselect a new aggregator, just signal the
- // state machines to reinitialize
- port->sm_vars |= AD_PORT_BEGIN;
-@@ -2267,14 +2267,14 @@ void bond_3ad_adapter_duplex_changed(str
-
- // if slave is null, the whole port is not initialized
- if (!port->slave) {
-- printk(KERN_WARNING "bonding: Warning: duplex changed for uninitialized port on %s\n",
-+ printk(KERN_WARNING DRV_NAME ": Warning: duplex changed for uninitialized port on %s\n",
- slave->dev->name);
- return;
- }
-
- port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS;
- port->actor_oper_port_key=port->actor_admin_port_key |= __get_duplex(port);
-- BOND_PRINT_DBG(("Port %d changed duplex", port->actor_port_number));
-+ dprintk("Port %d changed duplex\n", port->actor_port_number);
- // there is no need to reselect a new aggregator, just signal the
- // state machines to reinitialize
- port->sm_vars |= AD_PORT_BEGIN;
-@@ -2295,10 +2295,8 @@ void bond_3ad_handle_link_change(struct
-
- // if slave is null, the whole port is not initialized
- if (!port->slave) {
--#ifdef BONDING_DEBUG
-- printk(KERN_WARNING "bonding: Warning: link status changed for uninitialized port on %s\n",
-- slave->dev->name);
--#endif
-+ printk(KERN_WARNING DRV_NAME ": Warning: link status changed for uninitialized port on %s\n",
-+ slave->dev->name);
- return;
- }
-
-@@ -2356,41 +2354,27 @@ int bond_3ad_get_active_agg_info(struct
-
- int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
- {
-- slave_t *slave, *start_at;
-- struct bonding *bond = (struct bonding *) dev->priv;
-+ struct slave *slave, *start_at;
-+ struct bonding *bond = dev->priv;
- struct ethhdr *data = (struct ethhdr *)skb->data;
- int slave_agg_no;
- int slaves_in_agg;
- int agg_id;
-+ int i;
- struct ad_info ad_info;
-
-- if (!IS_UP(dev)) { /* bond down */
-- dev_kfree_skb(skb);
-- return 0;
-- }
--
-- if (bond == NULL) {
-- printk(KERN_CRIT "bonding: Error: bond is NULL on device %s\n", dev->name);
-- dev_kfree_skb(skb);
-- return 0;
-- }
--
-+ /* make sure that the slaves list will
-+ * not change during tx
-+ */
- read_lock(&bond->lock);
-- slave = bond->prev;
-
-- /* check if bond is empty */
-- if ((slave == (struct slave *) bond) || (bond->slave_cnt == 0)) {
-- printk(KERN_DEBUG "ERROR: bond is empty\n");
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-+ if (!BOND_IS_OK(bond)) {
-+ goto free_out;
- }
-
- if (bond_3ad_get_active_agg_info(bond, &ad_info)) {
- printk(KERN_DEBUG "ERROR: bond_3ad_get_active_agg_info failed\n");
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-+ goto free_out;
- }
-
- slaves_in_agg = ad_info.ports;
-@@ -2399,21 +2383,12 @@ int bond_3ad_xmit_xor(struct sk_buff *sk
- if (slaves_in_agg == 0) {
- /*the aggregator is empty*/
- printk(KERN_DEBUG "ERROR: active aggregator is empty\n");
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-+ goto free_out;
- }
-
-- /* we're at the root, get the first slave */
-- if ((slave == NULL) || (slave->dev == NULL)) {
-- /* no suitable interface, frame not sent */
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-- }
-+ slave_agg_no = (data->h_dest[5]^bond->dev->dev_addr[5]) % slaves_in_agg;
-
-- slave_agg_no = (data->h_dest[5]^slave->dev->dev_addr[5]) % slaves_in_agg;
-- while (slave != (slave_t *)bond) {
-+ bond_for_each_slave(bond, slave, i) {
- struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator;
-
- if (agg && (agg->aggregator_identifier == agg_id)) {
-@@ -2422,37 +2397,18 @@ int bond_3ad_xmit_xor(struct sk_buff *sk
- break;
- }
- }
--
-- slave = slave->prev;
-- if (slave == NULL) {
-- printk(KERN_ERR "bonding: Error: slave is NULL\n");
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-- }
- }
-
-- if (slave == (slave_t *)bond) {
-- printk(KERN_ERR "bonding: Error: Couldn't find a slave to tx on for aggregator ID %d\n", agg_id);
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-+ if (slave_agg_no >= 0) {
-+ printk(KERN_ERR DRV_NAME ": Error: Couldn't find a slave to tx on for aggregator ID %d\n", agg_id);
-+ goto free_out;
- }
-
- start_at = slave;
-
-- do {
-+ bond_for_each_slave_from(bond, slave, i, start_at) {
- int slave_agg_id = 0;
-- struct aggregator *agg;
--
-- if (slave == NULL) {
-- printk(KERN_ERR "bonding: Error: slave is NULL\n");
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-- }
--
-- agg = SLAVE_AD_INFO(slave).port.aggregator;
-+ struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator;
-
- if (agg) {
- slave_agg_id = agg->aggregator_identifier;
-@@ -2463,20 +2419,24 @@ int bond_3ad_xmit_xor(struct sk_buff *sk
- skb->dev = slave->dev;
- skb->priority = 1;
- dev_queue_xmit(skb);
-- read_unlock(&bond->lock);
-- return 0;
-+
-+ goto out;
- }
-- } while ((slave = slave->next) != start_at);
-+ }
-
-- /* no suitable interface, frame not sent */
-- dev_kfree_skb(skb);
-+out:
- read_unlock(&bond->lock);
- return 0;
-+
-+free_out:
-+ /* no suitable interface, frame not sent */
-+ dev_kfree_skb(skb);
-+ goto out;
- }
-
- int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype)
- {
-- struct bonding *bond = (struct bonding *)dev->priv;
-+ struct bonding *bond = dev->priv;
- struct slave *slave = NULL;
- int ret = NET_RX_DROP;
-
---- linux-2.6.0/drivers/net/bonding/bond_3ad.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/bonding/bond_3ad.h 2003-12-28 23:21:00.000000000 -0800
-@@ -28,6 +28,9 @@
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- * - Renamed bond_3ad_link_status_changed() to
- * bond_3ad_handle_link_change() for compatibility with TLB.
-+ *
-+ * 2003/09/24 - Shmulik Hen <shmulik.hen at intel dot com>
-+ * - Code cleanup and style changes
- */
-
- #ifndef __BOND_3AD_H__
---- linux-2.6.0/drivers/net/bonding/bond_alb.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/bonding/bond_alb.c 2003-12-28 23:21:00.000000000 -0800
-@@ -28,8 +28,13 @@
- * 2003/08/06 - Amir Noam <amir.noam at intel dot com>
- * - Add support for setting bond's MAC address with special
- * handling required for ALB/TLB.
-+ *
-+ * 2003/09/24 - Shmulik Hen <shmulik.hen at intel dot com>
-+ * - Code cleanup and style changes
- */
-
-+//#define BONDING_DEBUG 1
-+
- #include <linux/skbuff.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
-@@ -50,11 +55,11 @@
-
-
- #define ALB_TIMER_TICKS_PER_SEC 10 /* should be a divisor of HZ */
--#define BOND_TLB_REBALANCE_INTERVAL 10 /* in seconds, periodic re-balancing
-- * used for division - never set
-+#define BOND_TLB_REBALANCE_INTERVAL 10 /* In seconds, periodic re-balancing.
-+ * Used for division - never set
- * to zero !!!
- */
--#define BOND_ALB_LP_INTERVAL 1 /* in seconds periodic send of
-+#define BOND_ALB_LP_INTERVAL 1 /* In seconds, periodic send of
- * learning packets to the switch
- */
-
-@@ -66,7 +71,7 @@
-
- #define TLB_HASH_TABLE_SIZE 256 /* The size of the clients hash table.
- * Note that this value MUST NOT be smaller
-- * because the key hash table BYTE wide !
-+ * because the key hash table is BYTE wide !
- */
-
-
-@@ -86,12 +91,15 @@
- */
- #define RLB_PROMISC_TIMEOUT 10*ALB_TIMER_TICKS_PER_SEC
-
-+static const u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
-+static const int alb_delta_in_ticks = HZ / ALB_TIMER_TICKS_PER_SEC;
-+
- #pragma pack(1)
- struct learning_pkt {
- u8 mac_dst[ETH_ALEN];
- u8 mac_src[ETH_ALEN];
- u16 type;
-- u8 padding[ETH_ZLEN - (2*ETH_ALEN + 2)];
-+ u8 padding[ETH_ZLEN - ETH_HLEN];
- };
-
- struct arp_pkt {
-@@ -110,13 +118,12 @@ struct arp_pkt {
- /* Forward declaration */
- static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]);
-
--static inline u8
--_simple_hash(u8 *hash_start, int hash_size)
-+static inline u8 _simple_hash(u8 *hash_start, int hash_size)
- {
- int i;
- u8 hash = 0;
-
-- for (i=0; i<hash_size; i++) {
-+ for (i = 0; i < hash_size; i++) {
- hash ^= hash_start[i];
- }
-
-@@ -125,193 +132,151 @@ _simple_hash(u8 *hash_start, int hash_si
-
- /*********************** tlb specific functions ***************************/
-
--static inline void
--_lock_tx_hashtbl(struct bonding *bond)
-+static inline void _lock_tx_hashtbl(struct bonding *bond)
- {
- spin_lock(&(BOND_ALB_INFO(bond).tx_hashtbl_lock));
- }
-
--static inline void
--_unlock_tx_hashtbl(struct bonding *bond)
-+static inline void _unlock_tx_hashtbl(struct bonding *bond)
- {
- spin_unlock(&(BOND_ALB_INFO(bond).tx_hashtbl_lock));
- }
-
- /* Caller must hold tx_hashtbl lock */
--static inline void
--tlb_init_table_entry(struct bonding *bond, u8 index, u8 save_load)
-+static inline void tlb_init_table_entry(struct tlb_client_info *entry, int save_load)
- {
-- struct tlb_client_info *entry;
--
-- if (BOND_ALB_INFO(bond).tx_hashtbl == NULL) {
-- return;
-- }
--
-- entry = &(BOND_ALB_INFO(bond).tx_hashtbl[index]);
-- /* at end of cycle, save the load that was transmitted to the client
-- * during the cycle, and set the tx_bytes counter to 0 for counting
-- * the load during the next cycle
-- */
- if (save_load) {
- entry->load_history = 1 + entry->tx_bytes /
-- BOND_TLB_REBALANCE_INTERVAL;
-+ BOND_TLB_REBALANCE_INTERVAL;
- entry->tx_bytes = 0;
- }
-+
- entry->tx_slave = NULL;
- entry->next = TLB_NULL_INDEX;
- entry->prev = TLB_NULL_INDEX;
- }
-
--static inline void
--tlb_init_slave(struct slave *slave)
-+static inline void tlb_init_slave(struct slave *slave)
- {
-- struct tlb_slave_info *slave_info = &(SLAVE_TLB_INFO(slave));
--
-- slave_info->load = 0;
-- slave_info->head = TLB_NULL_INDEX;
-+ SLAVE_TLB_INFO(slave).load = 0;
-+ SLAVE_TLB_INFO(slave).head = TLB_NULL_INDEX;
- }
-
- /* Caller must hold bond lock for read */
--static inline void
--tlb_clear_slave(struct bonding *bond, struct slave *slave, u8 save_load)
-+static void tlb_clear_slave(struct bonding *bond, struct slave *slave, int save_load)
- {
-- struct tlb_client_info *tx_hash_table = NULL;
-- u32 index, next_index;
-+ struct tlb_client_info *tx_hash_table;
-+ u32 index;
-
-- /* clear slave from tx_hashtbl */
- _lock_tx_hashtbl(bond);
-+
-+ /* clear slave from tx_hashtbl */
- tx_hash_table = BOND_ALB_INFO(bond).tx_hashtbl;
-
-- if (tx_hash_table) {
-- index = SLAVE_TLB_INFO(slave).head;
-- while (index != TLB_NULL_INDEX) {
-- next_index = tx_hash_table[index].next;
-- tlb_init_table_entry(bond, index, save_load);
-- index = next_index;
-- }
-+ index = SLAVE_TLB_INFO(slave).head;
-+ while (index != TLB_NULL_INDEX) {
-+ u32 next_index = tx_hash_table[index].next;
-+ tlb_init_table_entry(&tx_hash_table[index], save_load);
-+ index = next_index;
- }
-+
- _unlock_tx_hashtbl(bond);
-
- tlb_init_slave(slave);
- }
-
- /* Must be called before starting the monitor timer */
--static int
--tlb_initialize(struct bonding *bond)
-+static int tlb_initialize(struct bonding *bond)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-+ int size = TLB_HASH_TABLE_SIZE * sizeof(struct tlb_client_info);
- int i;
-- size_t size;
--
--#if(TLB_HASH_TABLE_SIZE != 256)
-- /* Key to the hash table is byte wide. Check the size! */
-- #error Hash Table size is wrong.
--#endif
-
- spin_lock_init(&(bond_info->tx_hashtbl_lock));
-
- _lock_tx_hashtbl(bond);
-- if (bond_info->tx_hashtbl != NULL) {
-- printk (KERN_ERR "%s: TLB hash table is not NULL\n",
-- bond->device->name);
-- _unlock_tx_hashtbl(bond);
-- return -1;
-- }
-
-- size = TLB_HASH_TABLE_SIZE * sizeof(struct tlb_client_info);
- bond_info->tx_hashtbl = kmalloc(size, GFP_KERNEL);
-- if (bond_info->tx_hashtbl == NULL) {
-- printk (KERN_ERR "%s: Failed to allocate TLB hash table\n",
-- bond->device->name);
-+ if (!bond_info->tx_hashtbl) {
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: %s: Failed to allocate TLB hash table\n",
-+ bond->dev->name);
- _unlock_tx_hashtbl(bond);
- return -1;
- }
-
- memset(bond_info->tx_hashtbl, 0, size);
-- for (i=0; i<TLB_HASH_TABLE_SIZE; i++) {
-- tlb_init_table_entry(bond, i, 1);
-+
-+ for (i = 0; i < TLB_HASH_TABLE_SIZE; i++) {
-+ tlb_init_table_entry(&bond_info->tx_hashtbl[i], 1);
- }
-+
- _unlock_tx_hashtbl(bond);
-
- return 0;
- }
-
- /* Must be called only after all slaves have been released */
--static void
--tlb_deinitialize(struct bonding *bond)
-+static void tlb_deinitialize(struct bonding *bond)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-
- _lock_tx_hashtbl(bond);
-- if (bond_info->tx_hashtbl == NULL) {
-- _unlock_tx_hashtbl(bond);
-- return;
-- }
-+
- kfree(bond_info->tx_hashtbl);
- bond_info->tx_hashtbl = NULL;
-+
- _unlock_tx_hashtbl(bond);
- }
-
- /* Caller must hold bond lock for read */
--static struct slave*
--tlb_get_least_loaded_slave(struct bonding *bond)
-+static struct slave *tlb_get_least_loaded_slave(struct bonding *bond)
- {
-- struct slave *slave;
-- struct slave *least_loaded;
-- s64 curr_gap, max_gap;
-+ struct slave *slave, *least_loaded;
-+ s64 max_gap;
-+ int i, found = 0;
-
- /* Find the first enabled slave */
-- slave = bond_get_first_slave(bond);
-- while (slave) {
-+ bond_for_each_slave(bond, slave, i) {
- if (SLAVE_IS_OK(slave)) {
-+ found = 1;
- break;
- }
-- slave = bond_get_next_slave(bond, slave);
- }
-
-- if (!slave) {
-+ if (!found) {
- return NULL;
- }
-
- least_loaded = slave;
-- max_gap = (s64)(slave->speed * 1000000) -
-- (s64)(SLAVE_TLB_INFO(slave).load * 8);
-+ max_gap = (s64)(slave->speed << 20) - /* Convert to Megabit per sec */
-+ (s64)(SLAVE_TLB_INFO(slave).load << 3); /* Bytes to bits */
-
- /* Find the slave with the largest gap */
-- slave = bond_get_next_slave(bond, slave);
-- while (slave) {
-+ bond_for_each_slave_from(bond, slave, i, least_loaded) {
- if (SLAVE_IS_OK(slave)) {
-- curr_gap = (s64)(slave->speed * 1000000) -
-- (s64)(SLAVE_TLB_INFO(slave).load * 8);
-- if (max_gap < curr_gap) {
-+ s64 gap = (s64)(slave->speed << 20) -
-+ (s64)(SLAVE_TLB_INFO(slave).load << 3);
-+ if (max_gap < gap) {
- least_loaded = slave;
-- max_gap = curr_gap;
-+ max_gap = gap;
- }
- }
-- slave = bond_get_next_slave(bond, slave);
- }
-
- return least_loaded;
- }
-
- /* Caller must hold bond lock for read */
--struct slave*
--tlb_choose_channel(struct bonding *bond, u32 hash_index, u32 skb_len)
-+struct slave *tlb_choose_channel(struct bonding *bond, u32 hash_index, u32 skb_len)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-- struct tlb_client_info *hash_table = NULL;
-- struct slave *assigned_slave = NULL;
-+ struct tlb_client_info *hash_table;
-+ struct slave *assigned_slave;
-
- _lock_tx_hashtbl(bond);
-
- hash_table = bond_info->tx_hashtbl;
-- if (hash_table == NULL) {
-- printk (KERN_ERR "%s: TLB hash table is NULL\n",
-- bond->device->name);
-- _unlock_tx_hashtbl(bond);
-- return NULL;
-- }
--
- assigned_slave = hash_table[hash_index].tx_slave;
- if (!assigned_slave) {
- assigned_slave = tlb_get_least_loaded_slave(bond);
-@@ -345,14 +310,12 @@ tlb_choose_channel(struct bonding *bond,
- }
-
- /*********************** rlb specific functions ***************************/
--static inline void
--_lock_rx_hashtbl(struct bonding *bond)
-+static inline void _lock_rx_hashtbl(struct bonding *bond)
- {
- spin_lock(&(BOND_ALB_INFO(bond).rx_hashtbl_lock));
- }
-
--static inline void
--_unlock_rx_hashtbl(struct bonding *bond)
-+static inline void _unlock_rx_hashtbl(struct bonding *bond)
- {
- spin_unlock(&(BOND_ALB_INFO(bond).rx_hashtbl_lock));
- }
-@@ -360,26 +323,20 @@ _unlock_rx_hashtbl(struct bonding *bond)
- /* when an ARP REPLY is received from a client update its info
- * in the rx_hashtbl
- */
--static void
--rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp)
-+static void rlb_update_entry_from_arp(struct bonding *bond, struct arp_pkt *arp)
- {
-- u32 hash_index;
-- struct rlb_client_info *client_info = NULL;
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-+ struct rlb_client_info *client_info;
-+ u32 hash_index;
-
- _lock_rx_hashtbl(bond);
-
-- if (bond_info->rx_hashtbl == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return;
-- }
-- hash_index = _simple_hash((u8*)&(arp->ip_src), 4);
-+ hash_index = _simple_hash((u8*)&(arp->ip_src), sizeof(arp->ip_src));
- client_info = &(bond_info->rx_hashtbl[hash_index]);
-
- if ((client_info->assigned) &&
- (client_info->ip_src == arp->ip_dst) &&
- (client_info->ip_dst == arp->ip_src)) {
--
- /* update the clients MAC address */
- memcpy(client_info->mac_dst, arp->mac_src, ETH_ALEN);
- client_info->ntt = 1;
-@@ -389,66 +346,60 @@ rlb_update_entry_from_arp(struct bonding
- _unlock_rx_hashtbl(bond);
- }
-
--static int
--rlb_arp_recv(struct sk_buff *skb,
-- struct net_device *dev,
-- struct packet_type* ptype)
-+static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct packet_type *ptype)
- {
-- struct bonding *bond = (struct bonding *)dev->priv;
-- int ret = NET_RX_DROP;
-+ struct bonding *bond = bond_dev->priv;
- struct arp_pkt *arp = (struct arp_pkt *)skb->data;
-+ int res = NET_RX_DROP;
-
-- if (!(dev->flags & IFF_MASTER)) {
-+ if (!(bond_dev->flags & IFF_MASTER)) {
- goto out;
- }
-
- if (!arp) {
-- printk(KERN_ERR "Packet has no ARP data\n");
-+ dprintk("Packet has no ARP data\n");
- goto out;
- }
-
- if (skb->len < sizeof(struct arp_pkt)) {
-- printk(KERN_ERR "Packet is too small to be an ARP\n");
-+ dprintk("Packet is too small to be an ARP\n");
- goto out;
- }
-
- if (arp->op_code == htons(ARPOP_REPLY)) {
- /* update rx hash table for this ARP */
- rlb_update_entry_from_arp(bond, arp);
-- BOND_PRINT_DBG(("Server received an ARP Reply from client"));
-+ dprintk("Server received an ARP Reply from client\n");
- }
-
-- ret = NET_RX_SUCCESS;
-+ res = NET_RX_SUCCESS;
-
- out:
- dev_kfree_skb(skb);
-
-- return ret;
-+ return res;
- }
-
- /* Caller must hold bond lock for read */
--static struct slave*
--rlb_next_rx_slave(struct bonding *bond)
-+static struct slave *rlb_next_rx_slave(struct bonding *bond)
- {
-- struct slave *rx_slave = NULL, *slave = NULL;
-- unsigned int i = 0;
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-+ struct slave *rx_slave, *slave, *start_at;
-+ int i = 0;
-
-- slave = bond_info->next_rx_slave;
-- if (slave == NULL) {
-- slave = bond->next;
-+ if (bond_info->next_rx_slave) {
-+ start_at = bond_info->next_rx_slave;
-+ } else {
-+ start_at = bond->first_slave;
- }
-
-- /* this loop uses the circular linked list property of the
-- * slave's list to go through all slaves
-- */
-- for (i = 0; i < bond->slave_cnt; i++, slave = slave->next) {
-+ rx_slave = NULL;
-
-+ bond_for_each_slave_from(bond, slave, i, start_at) {
- if (SLAVE_IS_OK(slave)) {
- if (!rx_slave) {
- rx_slave = slave;
-- }
-- else if (slave->speed > rx_slave->speed) {
-+ } else if (slave->speed > rx_slave->speed) {
- rx_slave = slave;
- }
- }
-@@ -464,48 +415,41 @@ rlb_next_rx_slave(struct bonding *bond)
- /* teach the switch the mac of a disabled slave
- * on the primary for fault tolerance
- *
-- * Caller must hold bond->ptrlock for write or bond lock for write
-+ * Caller must hold bond->curr_slave_lock for write or bond lock for write
- */
--static void
--rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[])
-+static void rlb_teach_disabled_mac_on_primary(struct bonding *bond, u8 addr[])
- {
-- if (!bond->current_slave) {
-+ if (!bond->curr_active_slave) {
- return;
- }
-+
- if (!bond->alb_info.primary_is_promisc) {
- bond->alb_info.primary_is_promisc = 1;
-- dev_set_promiscuity(bond->current_slave->dev, 1);
-+ dev_set_promiscuity(bond->curr_active_slave->dev, 1);
- }
-+
- bond->alb_info.rlb_promisc_timeout_counter = 0;
-
-- alb_send_learning_packets(bond->current_slave, addr);
-+ alb_send_learning_packets(bond->curr_active_slave, addr);
- }
-
- /* slave being removed should not be active at this point
- *
- * Caller must hold bond lock for read
- */
--static void
--rlb_clear_slave(struct bonding *bond, struct slave *slave)
-+static void rlb_clear_slave(struct bonding *bond, struct slave *slave)
- {
-- struct rlb_client_info *rx_hash_table = NULL;
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-- u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
-+ struct rlb_client_info *rx_hash_table;
- u32 index, next_index;
-
- /* clear slave from rx_hashtbl */
- _lock_rx_hashtbl(bond);
-- rx_hash_table = bond_info->rx_hashtbl;
--
-- if (rx_hash_table == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return;
-- }
-
-+ rx_hash_table = bond_info->rx_hashtbl;
- index = bond_info->rx_hashtbl_head;
- for (; index != RLB_NULL_INDEX; index = next_index) {
- next_index = rx_hash_table[index].next;
--
- if (rx_hash_table[index].slave == slave) {
- struct slave *assigned_slave = rlb_next_rx_slave(bond);
-
-@@ -533,23 +477,24 @@ rlb_clear_slave(struct bonding *bond, st
-
- _unlock_rx_hashtbl(bond);
-
-- write_lock(&bond->ptrlock);
-- if (slave != bond->current_slave) {
-+ write_lock(&bond->curr_slave_lock);
-+
-+ if (slave != bond->curr_active_slave) {
- rlb_teach_disabled_mac_on_primary(bond, slave->dev->dev_addr);
- }
-- write_unlock(&bond->ptrlock);
-+
-+ write_unlock(&bond->curr_slave_lock);
- }
-
--static void
--rlb_update_client(struct rlb_client_info *client_info)
-+static void rlb_update_client(struct rlb_client_info *client_info)
- {
-- int i = 0;
-+ int i;
-
-- if (client_info->slave == NULL) {
-+ if (!client_info->slave) {
- return;
- }
-
-- for (i=0; i<RLB_ARP_BURST_SIZE; i++) {
-+ for (i = 0; i < RLB_ARP_BURST_SIZE; i++) {
- arp_send(ARPOP_REPLY, ETH_P_ARP,
- client_info->ip_dst,
- client_info->slave->dev,
-@@ -561,20 +506,14 @@ rlb_update_client(struct rlb_client_info
- }
-
- /* sends ARP REPLIES that update the clients that need updating */
--static void
--rlb_update_rx_clients(struct bonding *bond)
-+static void rlb_update_rx_clients(struct bonding *bond)
- {
-- u32 hash_index;
-- struct rlb_client_info *client_info = NULL;
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-+ struct rlb_client_info *client_info;
-+ u32 hash_index;
-
- _lock_rx_hashtbl(bond);
-
-- if (bond_info->rx_hashtbl == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return;
-- }
--
- hash_index = bond_info->rx_hashtbl_head;
- for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) {
- client_info = &(bond_info->rx_hashtbl[hash_index]);
-@@ -595,22 +534,15 @@ rlb_update_rx_clients(struct bonding *bo
- }
-
- /* The slave was assigned a new mac address - update the clients */
--static void
--rlb_req_update_slave_clients(struct bonding *bond, struct slave *slave)
-+static void rlb_req_update_slave_clients(struct bonding *bond, struct slave *slave)
- {
-- u32 hash_index;
-- u8 ntt = 0;
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-- u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
-- struct rlb_client_info* client_info = NULL;
-+ struct rlb_client_info *client_info;
-+ int ntt = 0;
-+ u32 hash_index;
-
- _lock_rx_hashtbl(bond);
-
-- if (bond_info->rx_hashtbl == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return;
-- }
--
- hash_index = bond_info->rx_hashtbl_head;
- for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) {
- client_info = &(bond_info->rx_hashtbl[hash_index]);
-@@ -633,37 +565,31 @@ rlb_req_update_slave_clients(struct bond
- }
-
- /* mark all clients using src_ip to be updated */
--static void
--rlb_req_update_subnet_clients(struct bonding *bond, u32 src_ip)
-+static void rlb_req_update_subnet_clients(struct bonding *bond, u32 src_ip)
- {
-- u32 hash_index;
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-- u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
-- struct rlb_client_info *client_info = NULL;
-+ struct rlb_client_info *client_info;
-+ u32 hash_index;
-
- _lock_rx_hashtbl(bond);
-
-- if (bond_info->rx_hashtbl == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return;
-- }
--
- hash_index = bond_info->rx_hashtbl_head;
- for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) {
- client_info = &(bond_info->rx_hashtbl[hash_index]);
-
- if (!client_info->slave) {
-- printk(KERN_ERR "Bonding: Error: found a client with no"
-- " channel in the client's hash table\n");
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: found a client with no channel in "
-+ "the client's hash table\n");
- continue;
- }
- /*update all clients using this src_ip, that are not assigned
-- * to the team's address (current_slave) and have a known
-+ * to the team's address (curr_active_slave) and have a known
- * unicast mac address.
- */
- if ((client_info->ip_src == src_ip) &&
- memcmp(client_info->slave->dev->dev_addr,
-- bond->device->dev_addr, ETH_ALEN) &&
-+ bond->dev->dev_addr, ETH_ALEN) &&
- memcmp(client_info->mac_dst, mac_bcast, ETH_ALEN)) {
- client_info->ntt = 1;
- bond_info->rx_ntt = 1;
-@@ -674,30 +600,22 @@ rlb_req_update_subnet_clients(struct bon
- }
-
- /* Caller must hold both bond and ptr locks for read */
--struct slave*
--rlb_choose_channel(struct bonding *bond, struct arp_pkt *arp)
-+struct slave *rlb_choose_channel(struct bonding *bond, struct arp_pkt *arp)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-- struct rlb_client_info *client_info = NULL;
-+ struct slave *assigned_slave;
-+ struct rlb_client_info *client_info;
- u32 hash_index = 0;
-- struct slave *assigned_slave = NULL;
-- u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
-
- _lock_rx_hashtbl(bond);
-
-- if (bond_info->rx_hashtbl == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return NULL;
-- }
--
-- hash_index = _simple_hash((u8 *)&arp->ip_dst, 4);
-+ hash_index = _simple_hash((u8 *)&arp->ip_dst, sizeof(arp->ip_src));
- client_info = &(bond_info->rx_hashtbl[hash_index]);
-
-- if (client_info->assigned == 1) {
-+ if (client_info->assigned) {
- if ((client_info->ip_src == arp->ip_src) &&
- (client_info->ip_dst == arp->ip_dst)) {
- /* the entry is already assigned to this client */
--
- if (memcmp(arp->mac_dst, mac_bcast, ETH_ALEN)) {
- /* update mac address from arp */
- memcpy(client_info->mac_dst, arp->mac_dst, ETH_ALEN);
-@@ -710,12 +628,12 @@ rlb_choose_channel(struct bonding *bond,
- }
- } else {
- /* the entry is already assigned to some other client,
-- * move the old client to primary (current_slave) so
-+ * move the old client to primary (curr_active_slave) so
- * that the new client can be assigned to this entry.
- */
-- if (bond->current_slave &&
-- client_info->slave != bond->current_slave) {
-- client_info->slave = bond->current_slave;
-+ if (bond->curr_active_slave &&
-+ client_info->slave != bond->curr_active_slave) {
-+ client_info->slave = bond->curr_active_slave;
- rlb_update_client(client_info);
- }
- }
-@@ -736,8 +654,7 @@ rlb_choose_channel(struct bonding *bond,
- if (memcmp(client_info->mac_dst, mac_bcast, ETH_ALEN)) {
- client_info->ntt = 1;
- bond->alb_info.rx_ntt = 1;
-- }
-- else {
-+ } else {
- client_info->ntt = 0;
- }
-
-@@ -760,10 +677,9 @@ rlb_choose_channel(struct bonding *bond,
-
- /* chooses (and returns) transmit channel for arp reply
- * does not choose channel for other arp types since they are
-- * sent on the current_slave
-+ * sent on the curr_active_slave
- */
--static struct slave*
--rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond)
-+static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond)
- {
- struct arp_pkt *arp = (struct arp_pkt *)skb->nh.raw;
- struct slave *tx_slave = NULL;
-@@ -776,9 +692,8 @@ rlb_arp_xmit(struct sk_buff *skb, struct
- if (tx_slave) {
- memcpy(arp->mac_src,tx_slave->dev->dev_addr, ETH_ALEN);
- }
-- BOND_PRINT_DBG(("Server sent ARP Reply packet"));
-+ dprintk("Server sent ARP Reply packet\n");
- } else if (arp->op_code == __constant_htons(ARPOP_REQUEST)) {
--
- /* Create an entry in the rx_hashtbl for this client as a
- * place holder.
- * When the arp reply is received the entry will be updated
-@@ -797,34 +712,29 @@ rlb_arp_xmit(struct sk_buff *skb, struct
- * updated with their assigned mac.
- */
- rlb_req_update_subnet_clients(bond, arp->ip_src);
-- BOND_PRINT_DBG(("Server sent ARP Request packet"));
-+ dprintk("Server sent ARP Request packet\n");
- }
-
- return tx_slave;
- }
-
- /* Caller must hold bond lock for read */
--static void
--rlb_rebalance(struct bonding *bond)
-+static void rlb_rebalance(struct bonding *bond)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-- struct slave *assigned_slave = NULL;
-+ struct slave *assigned_slave;
-+ struct rlb_client_info *client_info;
-+ int ntt;
- u32 hash_index;
-- struct rlb_client_info *client_info = NULL;
-- u8 ntt = 0;
-
- _lock_rx_hashtbl(bond);
-
-- if (bond_info->rx_hashtbl == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return;
-- }
--
-+ ntt = 0;
- hash_index = bond_info->rx_hashtbl_head;
- for (; hash_index != RLB_NULL_INDEX; hash_index = client_info->next) {
- client_info = &(bond_info->rx_hashtbl[hash_index]);
- assigned_slave = rlb_next_rx_slave(bond);
-- if (assigned_slave && (client_info->slave != assigned_slave)){
-+ if (assigned_slave && (client_info->slave != assigned_slave)) {
- client_info->slave = assigned_slave;
- client_info->ntt = 1;
- ntt = 1;
-@@ -839,96 +749,83 @@ rlb_rebalance(struct bonding *bond)
- }
-
- /* Caller must hold rx_hashtbl lock */
--static inline void
--rlb_init_table_entry(struct rlb_client_info *entry)
-+static void rlb_init_table_entry(struct rlb_client_info *entry)
- {
-+ memset(entry, 0, sizeof(struct rlb_client_info));
- entry->next = RLB_NULL_INDEX;
- entry->prev = RLB_NULL_INDEX;
-- entry->assigned = 0;
-- entry->ntt = 0;
- }
-
--static int
--rlb_initialize(struct bonding *bond)
-+static int rlb_initialize(struct bonding *bond)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
- struct packet_type *pk_type = &(BOND_ALB_INFO(bond).rlb_pkt_type);
-+ int size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info);
- int i;
-- size_t size;
-
- spin_lock_init(&(bond_info->rx_hashtbl_lock));
-
- _lock_rx_hashtbl(bond);
-- if (bond_info->rx_hashtbl != NULL) {
-- printk (KERN_ERR "%s: RLB hash table is not NULL\n",
-- bond->device->name);
-- _unlock_rx_hashtbl(bond);
-- return -1;
-- }
-
-- size = RLB_HASH_TABLE_SIZE * sizeof(struct rlb_client_info);
- bond_info->rx_hashtbl = kmalloc(size, GFP_KERNEL);
-- if (bond_info->rx_hashtbl == NULL) {
-- printk (KERN_ERR "%s: Failed to allocate"
-- " RLB hash table\n", bond->device->name);
-+ if (!bond_info->rx_hashtbl) {
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: %s: Failed to allocate RLB hash table\n",
-+ bond->dev->name);
- _unlock_rx_hashtbl(bond);
- return -1;
- }
-
- bond_info->rx_hashtbl_head = RLB_NULL_INDEX;
-
-- for (i=0; i<RLB_HASH_TABLE_SIZE; i++) {
-+ for (i = 0; i < RLB_HASH_TABLE_SIZE; i++) {
- rlb_init_table_entry(bond_info->rx_hashtbl + i);
- }
-- _unlock_rx_hashtbl(bond);
-
-- /* register to receive ARPs */
-+ _unlock_rx_hashtbl(bond);
-
- /*initialize packet type*/
- pk_type->type = __constant_htons(ETH_P_ARP);
-- pk_type->dev = bond->device;
-+ pk_type->dev = bond->dev;
- pk_type->func = rlb_arp_recv;
-
-+ /* register to receive ARPs */
- dev_add_pack(pk_type);
-
- return 0;
- }
-
--static void
--rlb_deinitialize(struct bonding *bond)
-+static void rlb_deinitialize(struct bonding *bond)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-
- dev_remove_pack(&(bond_info->rlb_pkt_type));
-
- _lock_rx_hashtbl(bond);
-- if (bond_info->rx_hashtbl == NULL) {
-- _unlock_rx_hashtbl(bond);
-- return;
-- }
-+
- kfree(bond_info->rx_hashtbl);
- bond_info->rx_hashtbl = NULL;
-+
- _unlock_rx_hashtbl(bond);
- }
-
- /*********************** tlb/rlb shared functions *********************/
-
--static void
--alb_send_learning_packets(struct slave *slave, u8 mac_addr[])
-+static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[])
- {
-- struct sk_buff *skb = NULL;
- struct learning_pkt pkt;
-- char *data = NULL;
-+ int size = sizeof(struct learning_pkt);
- int i;
-- unsigned int size = sizeof(struct learning_pkt);
-
- memset(&pkt, 0, size);
- memcpy(pkt.mac_dst, mac_addr, ETH_ALEN);
- memcpy(pkt.mac_src, mac_addr, ETH_ALEN);
- pkt.type = __constant_htons(ETH_P_LOOP);
-
-- for (i=0; i < MAX_LP_RETRY; i++) {
-- skb = NULL;
-+ for (i = 0; i < MAX_LP_RETRY; i++) {
-+ struct sk_buff *skb;
-+ char *data;
-+
- skb = dev_alloc_skb(size);
- if (!skb) {
- return;
-@@ -936,28 +833,26 @@ alb_send_learning_packets(struct slave *
-
- data = skb_put(skb, size);
- memcpy(data, &pkt, size);
-+
- skb->mac.raw = data;
- skb->nh.raw = data + ETH_HLEN;
- skb->protocol = pkt.type;
- skb->priority = TC_PRIO_CONTROL;
- skb->dev = slave->dev;
-+
- dev_queue_xmit(skb);
- }
--
- }
-
- /* hw is a boolean parameter that determines whether we should try and
- * set the hw address of the device as well as the hw address of the
- * net_device
- */
--static int
--alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw)
-+static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw)
- {
-- struct net_device *dev = NULL;
-+ struct net_device *dev = slave->dev;
- struct sockaddr s_addr;
-
-- dev = slave->dev;
--
- if (!hw) {
- memcpy(dev->dev_addr, addr, dev->addr_len);
- return 0;
-@@ -968,26 +863,23 @@ alb_set_slave_mac_addr(struct slave *sla
- memcpy(s_addr.sa_data, addr, dev->addr_len);
- s_addr.sa_family = dev->type;
- if (dev->set_mac_address(dev, &s_addr)) {
-- printk(KERN_DEBUG "bonding: Error: alb_set_slave_mac_addr:"
-- " dev->set_mac_address of dev %s failed!"
-- " ALB mode requires that the base driver"
-- " support setting the hw address also when"
-- " the network device's interface is open\n",
-- dev->name);
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: dev->set_mac_address of dev %s failed! ALB "
-+ "mode requires that the base driver support setting "
-+ "the hw address also when the network device's "
-+ "interface is open\n",
-+ dev->name);
- return -EOPNOTSUPP;
- }
- return 0;
- }
-
--/* Caller must hold bond lock for write or ptrlock for write*/
--static void
--alb_swap_mac_addr(struct bonding *bond,
-- struct slave *slave1,
-- struct slave *slave2)
-+/* Caller must hold bond lock for write or curr_slave_lock for write*/
-+static void alb_swap_mac_addr(struct bonding *bond, struct slave *slave1, struct slave *slave2)
- {
-- u8 tmp_mac_addr[ETH_ALEN];
- struct slave *disabled_slave = NULL;
-- u8 slaves_state_differ;
-+ u8 tmp_mac_addr[ETH_ALEN];
-+ int slaves_state_differ;
-
- slaves_state_differ = (SLAVE_IS_OK(slave1) != SLAVE_IS_OK(slave2));
-
-@@ -1004,8 +896,7 @@ alb_swap_mac_addr(struct bonding *bond,
- */
- rlb_req_update_slave_clients(bond, slave1);
- }
-- }
-- else {
-+ } else {
- disabled_slave = slave1;
- }
-
-@@ -1017,15 +908,14 @@ alb_swap_mac_addr(struct bonding *bond,
- */
- rlb_req_update_slave_clients(bond, slave2);
- }
-- }
-- else {
-+ } else {
- disabled_slave = slave2;
- }
-
- if (bond->alb_info.rlb_enabled && slaves_state_differ) {
-- /* A disabled slave was assigned an active mac addr */
-- rlb_teach_disabled_mac_on_primary(bond,
-- disabled_slave->dev->dev_addr);
-+ /* A disabled slave was assigned an active mac addr */
-+ rlb_teach_disabled_mac_on_primary(bond,
-+ disabled_slave->dev->dev_addr);
- }
- }
-
-@@ -1043,10 +933,8 @@ alb_swap_mac_addr(struct bonding *bond,
- *
- * Caller must hold bond lock
- */
--static void
--alb_change_hw_addr_on_detach(struct bonding *bond, struct slave *slave)
-+static void alb_change_hw_addr_on_detach(struct bonding *bond, struct slave *slave)
- {
-- struct slave *tmp_slave;
- int perm_curr_diff;
- int perm_bond_diff;
-
-@@ -1054,20 +942,23 @@ alb_change_hw_addr_on_detach(struct bond
- slave->dev->dev_addr,
- ETH_ALEN);
- perm_bond_diff = memcmp(slave->perm_hwaddr,
-- bond->device->dev_addr,
-+ bond->dev->dev_addr,
- ETH_ALEN);
-+
- if (perm_curr_diff && perm_bond_diff) {
-- tmp_slave = bond_get_first_slave(bond);
-- while (tmp_slave) {
-+ struct slave *tmp_slave;
-+ int i, found = 0;
-+
-+ bond_for_each_slave(bond, tmp_slave, i) {
- if (!memcmp(slave->perm_hwaddr,
-- tmp_slave->dev->dev_addr,
-- ETH_ALEN)) {
-+ tmp_slave->dev->dev_addr,
-+ ETH_ALEN)) {
-+ found = 1;
- break;
- }
-- tmp_slave = bond_get_next_slave(bond, tmp_slave);
- }
-
-- if (tmp_slave) {
-+ if (found) {
- alb_swap_mac_addr(bond, slave, tmp_slave);
- }
- }
-@@ -1098,10 +989,10 @@ alb_change_hw_addr_on_detach(struct bond
- * caller must hold the bond lock for write since the mac addresses are compared
- * and may be swapped.
- */
--static int
--alb_handle_addr_collision_on_attach(struct bonding *bond, struct slave *slave)
-+static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slave *slave)
- {
-- struct slave *tmp_slave1, *tmp_slave2;
-+ struct slave *tmp_slave1, *tmp_slave2, *free_mac_slave;
-+ int i, j, found = 0;
-
- if (bond->slave_cnt == 0) {
- /* this is the first slave */
-@@ -1112,65 +1003,68 @@ alb_handle_addr_collision_on_attach(stru
- * check uniqueness of slave's mac address against the other
- * slaves in the bond.
- */
-- if (memcmp(slave->perm_hwaddr, bond->device->dev_addr, ETH_ALEN)) {
-- tmp_slave1 = bond_get_first_slave(bond);
-- for (; tmp_slave1; tmp_slave1 = bond_get_next_slave(bond, tmp_slave1)) {
-+ if (memcmp(slave->perm_hwaddr, bond->dev->dev_addr, ETH_ALEN)) {
-+ bond_for_each_slave(bond, tmp_slave1, i) {
- if (!memcmp(tmp_slave1->dev->dev_addr, slave->dev->dev_addr,
- ETH_ALEN)) {
-+ found = 1;
- break;
- }
- }
-- if (tmp_slave1) {
-+
-+ if (found) {
- /* a slave was found that is using the mac address
- * of the new slave
- */
-- printk(KERN_ERR "bonding: Warning: the hw address "
-- "of slave %s is not unique - cannot enslave it!"
-- , slave->dev->name);
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: the hw address of slave %s is not "
-+ "unique - cannot enslave it!",
-+ slave->dev->name);
- return -EINVAL;
- }
-+
- return 0;
- }
-
-- /* the slave's address is equal to the address of the bond
-- * search for a spare address in the bond for this slave.
-+ /* The slave's address is equal to the address of the bond.
-+ * Search for a spare address in the bond for this slave.
- */
-- tmp_slave1 = bond_get_first_slave(bond);
-- for (; tmp_slave1; tmp_slave1 = bond_get_next_slave(bond, tmp_slave1)) {
--
-- tmp_slave2 = bond_get_first_slave(bond);
-- for (; tmp_slave2; tmp_slave2 = bond_get_next_slave(bond, tmp_slave2)) {
-+ free_mac_slave = NULL;
-
-+ bond_for_each_slave(bond, tmp_slave1, i) {
-+ found = 0;
-+ bond_for_each_slave(bond, tmp_slave2, j) {
- if (!memcmp(tmp_slave1->perm_hwaddr,
- tmp_slave2->dev->dev_addr,
- ETH_ALEN)) {
--
-+ found = 1;
- break;
- }
- }
-
-- if (!tmp_slave2) {
-+ if (!found) {
- /* no slave has tmp_slave1's perm addr
- * as its curr addr
- */
-+ free_mac_slave = tmp_slave1;
- break;
- }
- }
-
-- if (tmp_slave1) {
-- alb_set_slave_mac_addr(slave, tmp_slave1->perm_hwaddr,
-+ if (free_mac_slave) {
-+ alb_set_slave_mac_addr(slave, free_mac_slave->perm_hwaddr,
- bond->alb_info.rlb_enabled);
-
-- printk(KERN_WARNING "bonding: Warning: the hw address "
-- "of slave %s is in use by the bond; "
-- "giving it the hw address of %s\n",
-- slave->dev->name, tmp_slave1->dev->name);
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: the hw address of slave %s is in use by "
-+ "the bond; giving it the hw address of %s\n",
-+ slave->dev->name, free_mac_slave->dev->name);
- } else {
-- printk(KERN_CRIT "bonding: Error: the hw address "
-- "of slave %s is in use by the bond; "
-- "couldn't find a slave with a free hw "
-- "address to give it (this should not have "
-- "happened)\n", slave->dev->name);
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: the hw address of slave %s is in use by the "
-+ "bond; couldn't find a slave with a free hw address to "
-+ "give it (this should not have happened)\n",
-+ slave->dev->name);
- return -EFAULT;
- }
-
-@@ -1188,37 +1082,36 @@ alb_handle_addr_collision_on_attach(stru
- *
- * For each slave, this function sets the interface to the new address and then
- * changes its dev_addr field to its previous value.
-- *
-+ *
- * Unwinding assumes bond's mac address has not yet changed.
- */
--static inline int
--alb_set_mac_address(struct bonding *bond, void *addr)
-+static int alb_set_mac_address(struct bonding *bond, void *addr)
- {
- struct sockaddr sa;
-- struct slave *slave;
-+ struct slave *slave, *stop_at;
- char tmp_addr[ETH_ALEN];
-- int error;
-+ int res;
-+ int i;
-
- if (bond->alb_info.rlb_enabled) {
- return 0;
- }
-
-- slave = bond_get_first_slave(bond);
-- for (; slave; slave = bond_get_next_slave(bond, slave)) {
-+ bond_for_each_slave(bond, slave, i) {
- if (slave->dev->set_mac_address == NULL) {
-- error = -EOPNOTSUPP;
-+ res = -EOPNOTSUPP;
- goto unwind;
- }
-
- /* save net_device's current hw address */
- memcpy(tmp_addr, slave->dev->dev_addr, ETH_ALEN);
-
-- error = slave->dev->set_mac_address(slave->dev, addr);
-+ res = slave->dev->set_mac_address(slave->dev, addr);
-
- /* restore net_device's hw address */
- memcpy(slave->dev->dev_addr, tmp_addr, ETH_ALEN);
-
-- if (error) {
-+ if (res) {
- goto unwind;
- }
- }
-@@ -1226,22 +1119,23 @@ alb_set_mac_address(struct bonding *bond
- return 0;
-
- unwind:
-- memcpy(sa.sa_data, bond->device->dev_addr, bond->device->addr_len);
-- sa.sa_family = bond->device->type;
-- slave = bond_get_first_slave(bond);
-- for (; slave; slave = bond_get_next_slave(bond, slave)) {
-+ memcpy(sa.sa_data, bond->dev->dev_addr, bond->dev->addr_len);
-+ sa.sa_family = bond->dev->type;
-+
-+ /* unwind from head to the slave that failed */
-+ stop_at = slave;
-+ bond_for_each_slave_from_to(bond, slave, i, bond->first_slave, stop_at) {
- memcpy(tmp_addr, slave->dev->dev_addr, ETH_ALEN);
- slave->dev->set_mac_address(slave->dev, &sa);
- memcpy(slave->dev->dev_addr, tmp_addr, ETH_ALEN);
- }
-
-- return error;
-+ return res;
- }
-
- /************************ exported alb funcions ************************/
-
--int
--bond_alb_initialize(struct bonding *bond, int rlb_enabled)
-+int bond_alb_initialize(struct bonding *bond, int rlb_enabled)
- {
- int res;
-
-@@ -1263,8 +1157,7 @@ bond_alb_initialize(struct bonding *bond
- return 0;
- }
-
--void
--bond_alb_deinitialize(struct bonding *bond)
-+void bond_alb_deinitialize(struct bonding *bond)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-
-@@ -1275,49 +1168,38 @@ bond_alb_deinitialize(struct bonding *bo
- }
- }
-
--int
--bond_alb_xmit(struct sk_buff *skb, struct net_device *dev)
-+int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
- {
-- struct bonding *bond = (struct bonding *) dev->priv;
-- struct ethhdr *eth_data = (struct ethhdr *)skb->data;
-+ struct bonding *bond = bond_dev->priv;
-+ struct ethhdr *eth_data = (struct ethhdr *)skb->mac.raw = skb->data;
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
- struct slave *tx_slave = NULL;
-- char do_tx_balance = 1;
-+ static u32 ip_bcast = 0xffffffff;
- int hash_size = 0;
-+ int do_tx_balance = 1;
- u32 hash_index = 0;
- u8 *hash_start = NULL;
-- u8 mac_bcast[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};
--
-- if (!IS_UP(dev)) { /* bond down */
-- dev_kfree_skb(skb);
-- return 0;
-- }
-
-- /* make sure that the current_slave and the slaves list do
-+ /* make sure that the curr_active_slave and the slaves list do
- * not change during tx
- */
- read_lock(&bond->lock);
-+ read_lock(&bond->curr_slave_lock);
-
-- if (bond->slave_cnt == 0) {
-- /* no suitable interface, frame not sent */
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-+ if (!BOND_IS_OK(bond)) {
-+ goto free_out;
- }
-
-- read_lock(&bond->ptrlock);
--
- switch (ntohs(skb->protocol)) {
- case ETH_P_IP:
- if ((memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) ||
-- (skb->nh.iph->daddr == 0xffffffff)) {
-+ (skb->nh.iph->daddr == ip_bcast)) {
- do_tx_balance = 0;
- break;
- }
- hash_start = (char*)&(skb->nh.iph->daddr);
-- hash_size = 4;
-+ hash_size = sizeof(skb->nh.iph->daddr);
- break;
--
- case ETH_P_IPV6:
- if (memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) {
- do_tx_balance = 0;
-@@ -1325,9 +1207,8 @@ bond_alb_xmit(struct sk_buff *skb, struc
- }
-
- hash_start = (char*)&(skb->nh.ipv6h->daddr);
-- hash_size = 16;
-+ hash_size = sizeof(skb->nh.ipv6h->daddr);
- break;
--
- case ETH_P_IPX:
- if (ipx_hdr(skb)->ipx_checksum !=
- __constant_htons(IPX_NO_CHECKSUM)) {
-@@ -1349,14 +1230,12 @@ bond_alb_xmit(struct sk_buff *skb, struc
- hash_start = (char*)eth_data->h_dest;
- hash_size = ETH_ALEN;
- break;
--
- case ETH_P_ARP:
- do_tx_balance = 0;
- if (bond_info->rlb_enabled) {
- tx_slave = rlb_arp_xmit(skb, bond);
- }
- break;
--
- default:
- do_tx_balance = 0;
- break;
-@@ -1369,16 +1248,16 @@ bond_alb_xmit(struct sk_buff *skb, struc
-
- if (!tx_slave) {
- /* unbalanced or unassigned, send through primary */
-- tx_slave = bond->current_slave;
-+ tx_slave = bond->curr_active_slave;
- bond_info->unbalanced_load += skb->len;
- }
-
- if (tx_slave && SLAVE_IS_OK(tx_slave)) {
- skb->dev = tx_slave->dev;
-- if (tx_slave != bond->current_slave) {
-+ if (tx_slave != bond->curr_active_slave) {
- memcpy(eth_data->h_source,
-- tx_slave->dev->dev_addr,
-- ETH_ALEN);
-+ tx_slave->dev->dev_addr,
-+ ETH_ALEN);
- }
- dev_queue_xmit(skb);
- } else {
-@@ -1386,26 +1265,35 @@ bond_alb_xmit(struct sk_buff *skb, struc
- if (tx_slave) {
- tlb_clear_slave(bond, tx_slave, 0);
- }
-- dev_kfree_skb(skb);
-+ goto free_out;
- }
-
-- read_unlock(&bond->ptrlock);
-+out:
-+ read_unlock(&bond->curr_slave_lock);
- read_unlock(&bond->lock);
- return 0;
-+
-+free_out:
-+ dev_kfree_skb(skb);
-+ goto out;
- }
-
--void
--bond_alb_monitor(struct bonding *bond)
-+void bond_alb_monitor(struct bonding *bond)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-- struct slave *slave = NULL;
-+ struct slave *slave;
-+ int i;
-
- read_lock(&bond->lock);
-
-- if ((bond->slave_cnt == 0) || !(bond->device->flags & IFF_UP)) {
-+ if (bond->kill_timers) {
-+ goto out;
-+ }
-+
-+ if (bond->slave_cnt == 0) {
- bond_info->tx_rebalance_counter = 0;
- bond_info->lp_counter = 0;
-- goto out;
-+ goto re_arm;
- }
-
- bond_info->tx_rebalance_counter++;
-@@ -1413,51 +1301,53 @@ bond_alb_monitor(struct bonding *bond)
-
- /* send learning packets */
- if (bond_info->lp_counter >= BOND_ALB_LP_TICKS) {
-- /* change of current_slave involves swapping of mac addresses.
-+ /* change of curr_active_slave involves swapping of mac addresses.
- * in order to avoid this swapping from happening while
-- * sending the learning packets, the ptrlock must be held for
-+ * sending the learning packets, the curr_slave_lock must be held for
- * read.
- */
-- read_lock(&bond->ptrlock);
-- slave = bond_get_first_slave(bond);
-- while (slave) {
-+ read_lock(&bond->curr_slave_lock);
-+
-+ bond_for_each_slave(bond, slave, i) {
- alb_send_learning_packets(slave,slave->dev->dev_addr);
-- slave = bond_get_next_slave(bond, slave);
- }
-- read_unlock(&bond->ptrlock);
-+
-+ read_unlock(&bond->curr_slave_lock);
-
- bond_info->lp_counter = 0;
- }
-
- /* rebalance tx traffic */
- if (bond_info->tx_rebalance_counter >= BOND_TLB_REBALANCE_TICKS) {
-- read_lock(&bond->ptrlock);
-- slave = bond_get_first_slave(bond);
-- while (slave) {
-+
-+ read_lock(&bond->curr_slave_lock);
-+
-+ bond_for_each_slave(bond, slave, i) {
- tlb_clear_slave(bond, slave, 1);
-- if (slave == bond->current_slave) {
-+ if (slave == bond->curr_active_slave) {
- SLAVE_TLB_INFO(slave).load =
- bond_info->unbalanced_load /
- BOND_TLB_REBALANCE_INTERVAL;
- bond_info->unbalanced_load = 0;
- }
-- slave = bond_get_next_slave(bond, slave);
- }
-- read_unlock(&bond->ptrlock);
-+
-+ read_unlock(&bond->curr_slave_lock);
-+
- bond_info->tx_rebalance_counter = 0;
- }
-
- /* handle rlb stuff */
- if (bond_info->rlb_enabled) {
- /* the following code changes the promiscuity of the
-- * the current_slave. It needs to be locked with a
-+ * the curr_active_slave. It needs to be locked with a
- * write lock to protect from other code that also
- * sets the promiscuity.
- */
-- write_lock(&bond->ptrlock);
-+ write_lock(&bond->curr_slave_lock);
-+
- if (bond_info->primary_is_promisc &&
-- (++bond_info->rlb_promisc_timeout_counter >=
-- RLB_PROMISC_TIMEOUT)) {
-+ (++bond_info->rlb_promisc_timeout_counter >= RLB_PROMISC_TIMEOUT)) {
-
- bond_info->rlb_promisc_timeout_counter = 0;
-
-@@ -1465,12 +1355,13 @@ bond_alb_monitor(struct bonding *bond)
- * because a slave was disabled then
- * it can now leave promiscuous mode.
- */
-- dev_set_promiscuity(bond->current_slave->dev, -1);
-+ dev_set_promiscuity(bond->curr_active_slave->dev, -1);
- bond_info->primary_is_promisc = 0;
- }
-- write_unlock(&bond->ptrlock);
-
-- if (bond_info->rlb_rebalance == 1) {
-+ write_unlock(&bond->curr_slave_lock);
-+
-+ if (bond_info->rlb_rebalance) {
- bond_info->rlb_rebalance = 0;
- rlb_rebalance(bond);
- }
-@@ -1490,28 +1381,23 @@ bond_alb_monitor(struct bonding *bond)
- }
- }
-
-+re_arm:
-+ mod_timer(&(bond_info->alb_timer), jiffies + alb_delta_in_ticks);
- out:
- read_unlock(&bond->lock);
--
-- if (bond->device->flags & IFF_UP) {
-- /* re-arm the timer */
-- mod_timer(&(bond_info->alb_timer),
-- jiffies + (HZ/ALB_TIMER_TICKS_PER_SEC));
-- }
- }
-
--/* assumption: called before the slave is attched to the bond
-+/* assumption: called before the slave is attached to the bond
- * and not locked by the bond lock
- */
--int
--bond_alb_init_slave(struct bonding *bond, struct slave *slave)
-+int bond_alb_init_slave(struct bonding *bond, struct slave *slave)
- {
-- int err = 0;
-+ int res;
-
-- err = alb_set_slave_mac_addr(slave, slave->perm_hwaddr,
-+ res = alb_set_slave_mac_addr(slave, slave->perm_hwaddr,
- bond->alb_info.rlb_enabled);
-- if (err) {
-- return err;
-+ if (res) {
-+ return res;
- }
-
- /* caller must hold the bond lock for write since the mac addresses
-@@ -1519,12 +1405,12 @@ bond_alb_init_slave(struct bonding *bond
- */
- write_lock_bh(&bond->lock);
-
-- err = alb_handle_addr_collision_on_attach(bond, slave);
-+ res = alb_handle_addr_collision_on_attach(bond, slave);
-
- write_unlock_bh(&bond->lock);
-
-- if (err) {
-- return err;
-+ if (res) {
-+ return res;
- }
-
- tlb_init_slave(slave);
-@@ -1540,8 +1426,7 @@ bond_alb_init_slave(struct bonding *bond
- }
-
- /* Caller must hold bond lock for write */
--void
--bond_alb_deinit_slave(struct bonding *bond, struct slave *slave)
-+void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave)
- {
- if (bond->slave_cnt > 1) {
- alb_change_hw_addr_on_detach(bond, slave);
-@@ -1556,9 +1441,7 @@ bond_alb_deinit_slave(struct bonding *bo
- }
-
- /* Caller must hold bond lock for read */
--void
--bond_alb_handle_link_change(struct bonding *bond, struct slave *slave,
-- char link)
-+void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link)
- {
- struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
-
-@@ -1582,109 +1465,111 @@ bond_alb_handle_link_change(struct bondi
- }
-
- /**
-- * bond_alb_assign_current_slave - assign new current_slave
-+ * bond_alb_handle_active_change - assign new curr_active_slave
- * @bond: our bonding struct
- * @new_slave: new slave to assign
- *
-- * Set the bond->current_slave to @new_slave and handle
-+ * Set the bond->curr_active_slave to @new_slave and handle
- * mac address swapping and promiscuity changes as needed.
- *
-- * Caller must hold bond ptrlock for write (or bond lock for write)
-+ * Caller must hold bond curr_slave_lock for write (or bond lock for write)
- */
--void
--bond_alb_assign_current_slave(struct bonding *bond, struct slave *new_slave)
-+void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave)
- {
-- struct slave *swap_slave = bond->current_slave;
-+ struct slave *swap_slave;
-+ int i;
-
-- if (bond->current_slave == new_slave) {
-+ if (bond->curr_active_slave == new_slave) {
- return;
- }
-
-- if (bond->current_slave && bond->alb_info.primary_is_promisc) {
-- dev_set_promiscuity(bond->current_slave->dev, -1);
-+ if (bond->curr_active_slave && bond->alb_info.primary_is_promisc) {
-+ dev_set_promiscuity(bond->curr_active_slave->dev, -1);
- bond->alb_info.primary_is_promisc = 0;
- bond->alb_info.rlb_promisc_timeout_counter = 0;
- }
-
-- bond->current_slave = new_slave;
-+ swap_slave = bond->curr_active_slave;
-+ bond->curr_active_slave = new_slave;
-
- if (!new_slave || (bond->slave_cnt == 0)) {
- return;
- }
-
-- /* set the new current_slave to the bonds mac address
-- * i.e. swap mac addresses of old current_slave and new current_slave
-+ /* set the new curr_active_slave to the bonds mac address
-+ * i.e. swap mac addresses of old curr_active_slave and new curr_active_slave
- */
- if (!swap_slave) {
-+ struct slave *tmp_slave;
- /* find slave that is holding the bond's mac address */
-- swap_slave = bond_get_first_slave(bond);
-- while (swap_slave) {
-- if (!memcmp(swap_slave->dev->dev_addr,
-- bond->device->dev_addr, ETH_ALEN)) {
-+ bond_for_each_slave(bond, tmp_slave, i) {
-+ if (!memcmp(tmp_slave->dev->dev_addr,
-+ bond->dev->dev_addr, ETH_ALEN)) {
-+ swap_slave = tmp_slave;
- break;
- }
-- swap_slave = bond_get_next_slave(bond, swap_slave);
- }
- }
-
-- /* current_slave must be set before calling alb_swap_mac_addr */
-+ /* curr_active_slave must be set before calling alb_swap_mac_addr */
- if (swap_slave) {
- /* swap mac address */
- alb_swap_mac_addr(bond, swap_slave, new_slave);
- } else {
- /* set the new_slave to the bond mac address */
-- alb_set_slave_mac_addr(new_slave, bond->device->dev_addr,
-+ alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr,
- bond->alb_info.rlb_enabled);
- /* fasten bond mac on new current slave */
-- alb_send_learning_packets(new_slave, bond->device->dev_addr);
-+ alb_send_learning_packets(new_slave, bond->dev->dev_addr);
- }
- }
-
--int
--bond_alb_set_mac_address(struct net_device *dev, void *addr)
-+int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr)
- {
-- struct bonding *bond = dev->priv;
-+ struct bonding *bond = bond_dev->priv;
- struct sockaddr *sa = addr;
-- struct slave *swap_slave = NULL;
-- int error = 0;
-+ struct slave *slave, *swap_slave;
-+ int res;
-+ int i;
-
- if (!is_valid_ether_addr(sa->sa_data)) {
- return -EADDRNOTAVAIL;
- }
-
-- error = alb_set_mac_address(bond, addr);
-- if (error) {
-- return error;
-+ res = alb_set_mac_address(bond, addr);
-+ if (res) {
-+ return res;
- }
-
-- memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
-+ memcpy(bond_dev->dev_addr, sa->sa_data, bond_dev->addr_len);
-
-- /* If there is no current_slave there is nothing else to do.
-+ /* If there is no curr_active_slave there is nothing else to do.
- * Otherwise we'll need to pass the new address to it and handle
- * duplications.
- */
-- if (bond->current_slave == NULL) {
-+ if (!bond->curr_active_slave) {
- return 0;
- }
-
-- swap_slave = bond_get_first_slave(bond);
-- while (swap_slave) {
-- if (!memcmp(swap_slave->dev->dev_addr, dev->dev_addr, ETH_ALEN)) {
-+ swap_slave = NULL;
-+
-+ bond_for_each_slave(bond, slave, i) {
-+ if (!memcmp(slave->dev->dev_addr, bond_dev->dev_addr, ETH_ALEN)) {
-+ swap_slave = slave;
- break;
- }
-- swap_slave = bond_get_next_slave(bond, swap_slave);
- }
-
- if (swap_slave) {
-- alb_swap_mac_addr(bond, swap_slave, bond->current_slave);
-+ alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave);
- } else {
-- alb_set_slave_mac_addr(bond->current_slave, dev->dev_addr,
-+ alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr,
- bond->alb_info.rlb_enabled);
-
-- alb_send_learning_packets(bond->current_slave, dev->dev_addr);
-+ alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr);
- if (bond->alb_info.rlb_enabled) {
- /* inform clients mac address has changed */
-- rlb_req_update_slave_clients(bond, bond->current_slave);
-+ rlb_req_update_slave_clients(bond, bond->curr_active_slave);
- }
- }
-
---- linux-2.6.0/drivers/net/bonding/bond_alb.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/bonding/bond_alb.h 2003-12-28 23:21:00.000000000 -0800
-@@ -24,6 +24,9 @@
- * 2003/08/06 - Amir Noam <amir.noam at intel dot com>
- * - Add support for setting bond's MAC address with special
- * handling required for ALB/TLB.
-+ *
-+ * 2003/09/24 - Shmulik Hen <shmulik.hen at intel dot com>
-+ * - Code cleanup and style changes
- */
-
- #ifndef __BOND_ALB_H__
-@@ -126,10 +129,10 @@ void bond_alb_deinitialize(struct bondin
- int bond_alb_init_slave(struct bonding *bond, struct slave *slave);
- void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave);
- void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link);
--void bond_alb_assign_current_slave(struct bonding *bond, struct slave *new_slave);
--int bond_alb_xmit(struct sk_buff *skb, struct net_device *dev);
-+void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave);
-+int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev);
- void bond_alb_monitor(struct bonding *bond);
--int bond_alb_set_mac_address(struct net_device *dev, void *addr);
-+int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr);
-
- #endif /* __BOND_ALB_H__ */
-
---- linux-2.6.0/drivers/net/bonding/bonding.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/bonding/bonding.h 2003-12-28 23:21:00.000000000 -0800
-@@ -9,7 +9,7 @@
- *
- * This software may be used and distributed according to the terms
- * of the GNU Public License, incorporated herein by reference.
-- *
-+ *
- *
- * 2003/03/18 - Amir Noam <amir.noam at intel dot com>,
- * Tsippy Mendelson <tsippy.mendelson at intel dot com> and
-@@ -22,159 +22,205 @@
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- * - Added support for Transmit load balancing mode.
-+ *
-+ * 2003/09/24 - Shmulik Hen <shmulik.hen at intel dot com>
-+ * - Code cleanup and style changes
- */
--
-+
- #ifndef _LINUX_BONDING_H
- #define _LINUX_BONDING_H
-
- #include <linux/timer.h>
- #include <linux/proc_fs.h>
-+#include <linux/if_bonding.h>
- #include "bond_3ad.h"
- #include "bond_alb.h"
-
--#ifdef BONDING_DEBUG
--
--// use this like so: BOND_PRINT_DBG(("foo = %d, bar = %d", foo, bar));
--#define BOND_PRINT_DBG(X) \
--do { \
-- printk(KERN_DEBUG "%s (%d)", __FUNCTION__, __LINE__); \
-- printk X; \
-- printk("\n"); \
--} while(0)
-+#define DRV_VERSION "2.5.0"
-+#define DRV_RELDATE "December 1, 2003"
-+#define DRV_NAME "bonding"
-+#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
-
-+#ifdef BONDING_DEBUG
-+#define dprintk(fmt, args...) \
-+ printk(KERN_DEBUG \
-+ DRV_NAME ": %s() %d: " fmt, __FUNCTION__, __LINE__ , ## args )
- #else
--#define BOND_PRINT_DBG(X)
-+#define dprintk(fmt, args...)
- #endif /* BONDING_DEBUG */
-
--#define IS_UP(dev) ((((dev)->flags & (IFF_UP)) == (IFF_UP)) && \
-- (netif_running(dev) && netif_carrier_ok(dev)))
-+#define IS_UP(dev) \
-+ ((((dev)->flags & IFF_UP) == IFF_UP) && \
-+ netif_running(dev) && \
-+ netif_carrier_ok(dev))
-
--/* Checks whether the dev is ready for transmit. We do not check netif_running
-- * since a device can be stopped by the driver for short periods of time for
-- * maintainance. dev_queue_xmit() handles this by queing the packet until the
-- * the dev is running again. Keeping packets ordering requires sticking the
-- * same dev as much as possible
-- */
--#define SLAVE_IS_OK(slave) \
-- ((((slave)->dev->flags & (IFF_UP)) == (IFF_UP)) && \
-- netif_carrier_ok((slave)->dev) && \
-+/*
-+ * Checks whether bond is ready for transmit.
-+ *
-+ * Caller must hold bond->lock
-+ */
-+#define BOND_IS_OK(bond) \
-+ (((bond)->dev->flags & IFF_UP) && \
-+ netif_running((bond)->dev) && \
-+ ((bond)->slave_cnt > 0))
-+
-+/*
-+ * Checks whether slave is ready for transmit.
-+ */
-+#define SLAVE_IS_OK(slave) \
-+ (((slave)->dev->flags & IFF_UP) && \
-+ netif_running((slave)->dev) && \
- ((slave)->link == BOND_LINK_UP) && \
- ((slave)->state == BOND_STATE_ACTIVE))
-
-
--typedef struct slave {
-+#define USES_PRIMARY(mode) \
-+ (((mode) == BOND_MODE_ACTIVEBACKUP) || \
-+ ((mode) == BOND_MODE_TLB) || \
-+ ((mode) == BOND_MODE_ALB))
-+
-+/*
-+ * Less bad way to call ioctl from within the kernel; this needs to be
-+ * done some other way to get the call out of interrupt context.
-+ * Needs "ioctl" variable to be supplied by calling context.
-+ */
-+#define IOCTL(dev, arg, cmd) ({ \
-+ int res = 0; \
-+ mm_segment_t fs = get_fs(); \
-+ set_fs(get_ds()); \
-+ res = ioctl(dev, arg, cmd); \
-+ set_fs(fs); \
-+ res; })
-+
-+/**
-+ * bond_for_each_slave_from - iterate the slaves list from a starting point
-+ * @bond: the bond holding this list.
-+ * @pos: current slave.
-+ * @cnt: counter for max number of moves
-+ * @start: starting point.
-+ *
-+ * Caller must hold bond->lock
-+ */
-+#define bond_for_each_slave_from(bond, pos, cnt, start) \
-+ for (cnt = 0, pos = start; \
-+ cnt < (bond)->slave_cnt; \
-+ cnt++, pos = (pos)->next)
-+
-+/**
-+ * bond_for_each_slave_from_to - iterate the slaves list from start point to stop point
-+ * @bond: the bond holding this list.
-+ * @pos: current slave.
-+ * @cnt: counter for number max of moves
-+ * @start: start point.
-+ * @stop: stop point.
-+ *
-+ * Caller must hold bond->lock
-+ */
-+#define bond_for_each_slave_from_to(bond, pos, cnt, start, stop) \
-+ for (cnt = 0, pos = start; \
-+ ((cnt < (bond)->slave_cnt) && (pos != (stop)->next)); \
-+ cnt++, pos = (pos)->next)
-+
-+/**
-+ * bond_for_each_slave - iterate the slaves list from head
-+ * @bond: the bond holding this list.
-+ * @pos: current slave.
-+ * @cnt: counter for max number of moves
-+ *
-+ * Caller must hold bond->lock
-+ */
-+#define bond_for_each_slave(bond, pos, cnt) \
-+ bond_for_each_slave_from(bond, pos, cnt, (bond)->first_slave)
-+
-+
-+struct slave {
-+ struct net_device *dev; /* first - usefull for panic debug */
- struct slave *next;
- struct slave *prev;
-- struct net_device *dev;
-- short delay;
-- unsigned long jiffies;
-- char link; /* one of BOND_LINK_XXXX */
-- char state; /* one of BOND_STATE_XXXX */
-- unsigned short original_flags;
-- u32 link_failure_count;
-+ s16 delay;
-+ u32 jiffies;
-+ s8 link; /* one of BOND_LINK_XXXX */
-+ s8 state; /* one of BOND_STATE_XXXX */
-+ u32 original_flags;
-+ u32 link_failure_count;
- u16 speed;
- u8 duplex;
- u8 perm_hwaddr[ETH_ALEN];
- struct ad_slave_info ad_info; /* HUGE - better to dynamically alloc */
- struct tlb_slave_info tlb_info;
--} slave_t;
-+};
-
- /*
- * Here are the locking policies for the two bonding locks:
- *
- * 1) Get bond->lock when reading/writing slave list.
-- * 2) Get bond->ptrlock when reading/writing bond->current_slave.
-+ * 2) Get bond->curr_slave_lock when reading/writing bond->curr_active_slave.
- * (It is unnecessary when the write-lock is put with bond->lock.)
-- * 3) When we lock with bond->ptrlock, we must lock with bond->lock
-+ * 3) When we lock with bond->curr_slave_lock, we must lock with bond->lock
- * beforehand.
- */
--typedef struct bonding {
-- slave_t *next;
-- slave_t *prev;
-- slave_t *current_slave;
-- slave_t *primary_slave;
-- slave_t *current_arp_slave;
-- __s32 slave_cnt;
-+struct bonding {
-+ struct net_device *dev; /* first - usefull for panic debug */
-+ struct slave *first_slave;
-+ struct slave *curr_active_slave;
-+ struct slave *current_arp_slave;
-+ struct slave *primary_slave;
-+ s32 slave_cnt; /* never change this value outside the attach/detach wrappers */
- rwlock_t lock;
-- rwlock_t ptrlock;
-- struct timer_list mii_timer;
-- struct timer_list arp_timer;
-- struct net_device_stats stats;
-+ rwlock_t curr_slave_lock;
-+ struct timer_list mii_timer;
-+ struct timer_list arp_timer;
-+ s8 kill_timers;
-+ struct net_device_stats stats;
- #ifdef CONFIG_PROC_FS
-- struct proc_dir_entry *bond_proc_file;
-- char procdir_name[IFNAMSIZ];
-+ struct proc_dir_entry *proc_entry;
-+ char proc_file_name[IFNAMSIZ];
- #endif /* CONFIG_PROC_FS */
-- struct list_head bond_list;
-- struct net_device *device;
-- struct dev_mc_list *mc_list;
-- unsigned short flags;
-- struct ad_bond_info ad_info;
-- struct alb_bond_info alb_info;
--} bonding_t;
--
--/* Forward declarations */
--void bond_set_slave_active_flags(slave_t *slave);
--void bond_set_slave_inactive_flags(slave_t *slave);
--
--/**
-- * These functions can be used for iterating the slave list
-- * (which is circular)
-- * Caller must hold bond lock for read
-- */
--extern inline struct slave*
--bond_get_first_slave(struct bonding *bond)
--{
-- /* if there are no slaves return NULL */
-- if (bond->next == (slave_t *)bond) {
-- return NULL;
-- }
-- return bond->next;
--}
--
--/**
-- * Caller must hold bond lock for read
-- */
--extern inline struct slave*
--bond_get_next_slave(struct bonding *bond, struct slave *slave)
--{
-- /* If we have reached the last slave return NULL */
-- if (slave->next == bond->next) {
-- return NULL;
-- }
-- return slave->next;
--}
-+ struct list_head bond_list;
-+ struct dev_mc_list *mc_list;
-+ u16 flags;
-+ struct ad_bond_info ad_info;
-+ struct alb_bond_info alb_info;
-+};
-
- /**
- * Returns NULL if the net_device does not belong to any of the bond's slaves
- *
- * Caller must hold bond lock for read
- */
--extern inline struct slave*
--bond_get_slave_by_dev(struct bonding *bond, struct net_device *slave_dev)
-+extern inline struct slave *bond_get_slave_by_dev(struct bonding *bond, struct net_device *slave_dev)
- {
-- struct slave *our_slave = bond->next;
--
-- /* check if the list of slaves is empty */
-- if (our_slave == (slave_t *)bond) {
-- return NULL;
-- }
-+ struct slave *slave = NULL;
-+ int i;
-
-- for (; our_slave; our_slave = bond_get_next_slave(bond, our_slave)) {
-- if (our_slave->dev == slave_dev) {
-+ bond_for_each_slave(bond, slave, i) {
-+ if (slave->dev == slave_dev) {
- break;
- }
- }
-- return our_slave;
-+
-+ return slave;
- }
-
--extern inline struct bonding*
--bond_get_bond_by_slave(struct slave *slave)
-+extern inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
- {
- if (!slave || !slave->dev->master) {
- return NULL;
- }
-
-- return (struct bonding *)(slave->dev->master->priv);
-+ return (struct bonding *)slave->dev->master->priv;
-+}
-+
-+extern inline void bond_set_slave_inactive_flags(struct slave *slave)
-+{
-+ slave->state = BOND_STATE_BACKUP;
-+ slave->dev->flags |= IFF_NOARP;
-+}
-+
-+extern inline void bond_set_slave_active_flags(struct slave *slave)
-+{
-+ slave->state = BOND_STATE_ACTIVE;
-+ slave->dev->flags &= ~IFF_NOARP;
- }
-
- #endif /* _LINUX_BONDING_H */
---- linux-2.6.0/drivers/net/bonding/bond_main.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/bonding/bond_main.c 2003-12-28 23:21:05.000000000 -0800
-@@ -1,7 +1,7 @@
- /*
- * originally based on the dummy device.
- *
-- * Copyright 1999, Thomas Davis, tadavis@lbl.gov.
-+ * Copyright 1999, Thomas Davis, tadavis@lbl.gov.
- * Licensed under the GPL. Based on dummy.c, and eql.c devices.
- *
- * bonding.c: an Ethernet Bonding driver
-@@ -15,9 +15,9 @@
- *
- * How it works:
- * ifconfig bond0 ipaddress netmask up
-- * will setup a network device, with an ip address. No mac address
-- * will be assigned at this time. The hw mac address will come from
-- * the first slave bonded to the channel. All slaves will then use
-+ * will setup a network device, with an ip address. No mac address
-+ * will be assigned at this time. The hw mac address will come from
-+ * the first slave bonded to the channel. All slaves will then use
- * this hw mac address.
- *
- * ifconfig bond0 down
-@@ -26,7 +26,7 @@
- * ifenslave bond0 eth0
- * will attach eth0 to bond0 as a slave. eth0 hw mac address will either
- * a: be used as initial mac address
-- * b: if a hw mac address already is there, eth0's hw mac address
-+ * b: if a hw mac address already is there, eth0's hw mac address
- * will then be set from bond0.
- *
- * v0.1 - first working version.
-@@ -93,14 +93,14 @@
- *
- * 2001/4/5 - Chad N. Tindel <ctindel at ieee dot org>
- * - Ported to 2.4 Kernel
-- *
-+ *
- * 2001/5/2 - Jeffrey E. Mast <jeff at mastfamily dot com>
- * - When a device is detached from a bond, the slave device is no longer
- * left thinking that is has a master.
- *
- * 2001/5/16 - Jeffrey E. Mast <jeff at mastfamily dot com>
-- * - memset did not appropriately initialized the bond rw_locks. Used
-- * rwlock_init to initialize to unlocked state to prevent deadlock when
-+ * - memset did not appropriately initialized the bond rw_locks. Used
-+ * rwlock_init to initialize to unlocked state to prevent deadlock when
- * first attempting a lock
- * - Called SET_MODULE_OWNER for bond device
- *
-@@ -119,7 +119,7 @@
- *
- * 2001/6/01 - Chad N. Tindel <ctindel at ieee dot org>
- * - Added /proc support for getting bond and slave information.
-- * Information is in /proc/net/<bond device>/info.
-+ * Information is in /proc/net/<bond device>/info.
- * - Changed the locking when calling bond_close to prevent deadlock.
- *
- * 2001/8/05 - Janice Girouard <girouard at us.ibm.com>
-@@ -144,8 +144,8 @@
- * but only for an up link.
- *
- * 2001/9/20 - Chad N. Tindel <ctindel at ieee dot org>
-- * - Add the device field to bonding_t. Previously the net_device
-- * corresponding to a bond wasn't available from the bonding_t
-+ * - Add the device field to bonding_t. Previously the net_device
-+ * corresponding to a bond wasn't available from the bonding_t
- * structure.
- *
- * 2001/9/25 - Janice Girouard <girouard at us.ibm.com>
-@@ -155,10 +155,10 @@
- * - Various memory leak fixes
- *
- * 2001/11/5 - Mark Huth <mark dot huth at mvista dot com>
-- * - Don't take rtnl lock in bond_mii_monitor as it deadlocks under
-- * certain hotswap conditions.
-+ * - Don't take rtnl lock in bond_mii_monitor as it deadlocks under
-+ * certain hotswap conditions.
- * Note: this same change may be required in bond_arp_monitor ???
-- * - Remove possibility of calling bond_sethwaddr with NULL slave_dev ptr
-+ * - Remove possibility of calling bond_sethwaddr with NULL slave_dev ptr
- * - Handle hot swap ethernet interface deregistration events to remove
- * kernel oops following hot swap of enslaved interface
- *
-@@ -222,23 +222,23 @@
- * - fix deletion of multicast groups after unloading module
- *
- * 2002/11/06 - Kameshwara Rayaprolu <kameshwara.rao * wipro_com>
-- * - Changes to prevent panic from closing the device twice; if we close
-- * the device in bond_release, we must set the original_flags to down
-+ * - Changes to prevent panic from closing the device twice; if we close
-+ * the device in bond_release, we must set the original_flags to down
- * so it won't be closed again by the network layer.
- *
- * 2002/11/07 - Tony Cureington <tony.cureington * hp_com>
- * - Fix arp_target_hw_addr memory leak
-- * - Created activebackup_arp_monitor function to handle arp monitoring
-- * in active backup mode - the bond_arp_monitor had several problems...
-- * such as allowing slaves to tx arps sequentially without any delay
-+ * - Created activebackup_arp_monitor function to handle arp monitoring
-+ * in active backup mode - the bond_arp_monitor had several problems...
-+ * such as allowing slaves to tx arps sequentially without any delay
- * for a response
- * - Renamed bond_arp_monitor to loadbalance_arp_monitor and re-wrote
- * this function to just handle arp monitoring in load-balancing mode;
- * it is a lot more compact now
-- * - Changes to ensure one and only one slave transmits in active-backup
-+ * - Changes to ensure one and only one slave transmits in active-backup
- * mode
-- * - Robustesize parameters; warn users about bad combinations of
-- * parameters; also if miimon is specified and a network driver does
-+ * - Robustesize parameters; warn users about bad combinations of
-+ * parameters; also if miimon is specified and a network driver does
- * not support MII or ETHTOOL, inform the user of this
- * - Changes to support link_failure_count when in arp monitoring mode
- * - Fix up/down delay reported in /proc
-@@ -248,7 +248,7 @@
- *
- * 2002/11/16 - Laurent Deniel <laurent.deniel at free.fr>
- * - fix multicast handling in activebackup_arp_monitor
-- * - remove one unnecessary and confusing current_slave == slave test
-+ * - remove one unnecessary and confusing curr_active_slave == slave test
- * in activebackup_arp_monitor
- *
- * 2002/11/17 - Laurent Deniel <laurent.deniel at free.fr>
-@@ -267,7 +267,7 @@
- * One change: an invalid choice will cause module load failure,
- * rather than the previous behavior of just picking one.
- * - Minor cleanups; got rid of dup ctype stuff, atoi function
-- *
-+ *
- * 2003/02/07 - Jay Vosburgh <fubar at us dot ibm dot com>
- * - Added use_carrier module parameter that causes miimon to
- * use netif_carrier_ok() test instead of MII/ETHTOOL ioctls.
-@@ -330,7 +330,7 @@
- * new/old ifenslave and new/old bonding.
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
-- * - Fixed bug in bond_release_all(): save old value of current_slave
-+ * - Fixed bug in bond_release_all(): save old value of curr_active_slave
- * before setting it to NULL.
- * - Changed driver versioning scheme to include version number instead
- * of release date (that is already in another field). There are 3
-@@ -358,7 +358,7 @@
- *
- * 2003/05/01 - Shmulik Hen <shmulik.hen at intel dot com>
- * - Added support for Transmit load balancing mode.
-- * - Concentrate all assignments of current_slave to a single point
-+ * - Concentrate all assignments of curr_active_slave to a single point
- * so specific modes can take actions when the primary adapter is
- * changed.
- * - Take the updelay parameter into consideration during bond_enslave
-@@ -426,8 +426,36 @@
- * - Convert /proc to seq_file interface.
- * Change /proc/net/bondX/info to /proc/net/bonding/bondX.
- * Set version to 2.4.1.
-+ *
-+ * 2003/11/20 - Amir Noam <amir.noam at intel dot com>
-+ * - Fix /proc creation/destruction.
-+ *
-+ * 2003/12/01 - Shmulik Hen <shmulik.hen at intel dot com>
-+ * - Massive cleanup - Set version to 2.5.0
-+ * Code changes:
-+ * o Consolidate format of prints and debug prints.
-+ * o Remove bonding_t/slave_t typedefs and consolidate all casts.
-+ * o Remove dead code and unnecessary checks.
-+ * o Consolidate starting/stopping timers.
-+ * o Consolidate handling of primary module param throughout the code.
-+ * o Removed multicast module param support - all settings are done
-+ * according to mode.
-+ * o Slave list iteration - bond is no longer part of the list,
-+ * added cyclic list iteration macros.
-+ * o Consolidate error handling in all xmit functions.
-+ * Style changes:
-+ * o Consolidate function naming and declarations.
-+ * o Consolidate function params and local variables names.
-+ * o Consolidate return values.
-+ * o Consolidate curly braces.
-+ * o Consolidate conditionals format.
-+ * o Change struct member names and types.
-+ * o Chomp trailing spaces, remove empty lines, fix indentations.
-+ * o Re-organize code according to context.
- */
-
-+//#define BONDING_DEBUG 1
-+
- #include <linux/config.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
-@@ -452,7 +480,6 @@
- #include <asm/dma.h>
- #include <asm/uaccess.h>
- #include <linux/errno.h>
--
- #include <linux/netdevice.h>
- #include <linux/inetdevice.h>
- #include <linux/etherdevice.h>
-@@ -461,58 +488,72 @@
- #include <linux/rtnetlink.h>
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
--
--#include <linux/if_bonding.h>
- #include <linux/smp.h>
- #include <linux/if_ether.h>
- #include <net/arp.h>
- #include <linux/mii.h>
- #include <linux/ethtool.h>
-+#include <linux/if_bonding.h>
- #include "bonding.h"
- #include "bond_3ad.h"
- #include "bond_alb.h"
-
--#define DRV_VERSION "2.4.1"
--#define DRV_RELDATE "September 15, 2003"
--#define DRV_NAME "bonding"
--#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
--
--static const char *version =
--DRV_NAME ".c:v" DRV_VERSION " (" DRV_RELDATE ")\n";
-+/*---------------------------- Module parameters ----------------------------*/
-
- /* monitor all links that often (in milliseconds). <=0 disables monitoring */
--#ifndef BOND_LINK_MON_INTERV
- #define BOND_LINK_MON_INTERV 0
--#endif
--
--#ifndef BOND_LINK_ARP_INTERV
- #define BOND_LINK_ARP_INTERV 0
--#endif
-+#define MAX_ARP_IP_TARGETS 16
-
--#ifndef MAX_ARP_IP_TARGETS
--#define MAX_ARP_IP_TARGETS 16
--#endif
-+static int max_bonds = BOND_DEFAULT_MAX_BONDS;
-+static int miimon = BOND_LINK_MON_INTERV;
-+static int updelay = 0;
-+static int downdelay = 0;
-+static int use_carrier = 1;
-+static char *mode = NULL;
-+static char *primary = NULL;
-+static char *lacp_rate = NULL;
-+static int arp_interval = BOND_LINK_ARP_INTERV;
-+static char *arp_ip_target[MAX_ARP_IP_TARGETS] = { NULL, };
-+
-+MODULE_PARM(max_bonds, "i");
-+MODULE_PARM_DESC(max_bonds, "Max number of bonded devices");
-+MODULE_PARM(miimon, "i");
-+MODULE_PARM_DESC(miimon, "Link check interval in milliseconds");
-+MODULE_PARM(updelay, "i");
-+MODULE_PARM_DESC(updelay, "Delay before considering link up, in milliseconds");
-+MODULE_PARM(downdelay, "i");
-+MODULE_PARM_DESC(downdelay, "Delay before considering link down, in milliseconds");
-+MODULE_PARM(use_carrier, "i");
-+MODULE_PARM_DESC(use_carrier, "Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default)");
-+MODULE_PARM(mode, "s");
-+MODULE_PARM_DESC(mode, "Mode of operation : 0 for round robin, 1 for active-backup, 2 for xor");
-+MODULE_PARM(primary, "s");
-+MODULE_PARM_DESC(primary, "Primary network device to use");
-+MODULE_PARM(lacp_rate, "s");
-+MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner (slow/fast)");
-+MODULE_PARM(arp_interval, "i");
-+MODULE_PARM_DESC(arp_interval, "arp interval in milliseconds");
-+MODULE_PARM(arp_ip_target, "1-" __MODULE_STRING(MAX_ARP_IP_TARGETS) "s");
-+MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form");
-
--#define USES_PRIMARY(mode) \
-- (((mode) == BOND_MODE_ACTIVEBACKUP) || \
-- ((mode) == BOND_MODE_TLB) || \
-- ((mode) == BOND_MODE_ALB))
-+/*----------------------------- Global variables ----------------------------*/
-
--struct bond_parm_tbl {
-- char *modename;
-- int mode;
--};
-+static const char *version =
-+ DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n";
-
--static int arp_interval = BOND_LINK_ARP_INTERV;
--static char *arp_ip_target[MAX_ARP_IP_TARGETS] = { NULL, };
--static u32 arp_target[MAX_ARP_IP_TARGETS] = { 0, } ;
--static int arp_ip_count = 0;
--static u32 my_ip = 0;
--char *arp_target_hw_addr = NULL;
-+static LIST_HEAD(bond_dev_list);
-
--static char *primary= NULL;
-+#ifdef CONFIG_PROC_FS
-+static struct proc_dir_entry *bond_proc_dir = NULL;
-+#endif
-
--static int app_abi_ver = 0;
-+static u32 arp_target[MAX_ARP_IP_TARGETS] = { 0, } ;
-+static int arp_ip_count = 0;
-+static u32 my_ip = 0;
-+static int bond_mode = BOND_MODE_ROUNDROBIN;
-+static int lacp_fast = 0;
-+static int app_abi_ver = 0;
- static int orig_app_abi_ver = -1; /* This is used to save the first ABI version
- * we receive from the application. Once set,
- * it won't be changed, and the module will
-@@ -521,14 +562,16 @@ static int orig_app_abi_ver = -1; /* Thi
- * another ABI version.
- */
-
--static int max_bonds = BOND_DEFAULT_MAX_BONDS;
--static int miimon = BOND_LINK_MON_INTERV;
--static int use_carrier = 1;
--static int bond_mode = BOND_MODE_ROUNDROBIN;
--static int updelay = 0;
--static int downdelay = 0;
-+struct bond_parm_tbl {
-+ char *modename;
-+ int mode;
-+};
-
--static char *mode = NULL;
-+static struct bond_parm_tbl bond_lacp_tbl[] = {
-+{ "slow", AD_LACP_SLOW},
-+{ "fast", AD_LACP_FAST},
-+{ NULL, -1},
-+};
-
- static struct bond_parm_tbl bond_mode_tbl[] = {
- { "balance-rr", BOND_MODE_ROUNDROBIN},
-@@ -541,101 +584,9 @@ static struct bond_parm_tbl bond_mode_tb
- { NULL, -1},
- };
-
--static int multicast_mode = BOND_MULTICAST_ALL;
--static char *multicast = NULL;
--
--static struct bond_parm_tbl bond_mc_tbl[] = {
--{ "disabled", BOND_MULTICAST_DISABLED},
--{ "active", BOND_MULTICAST_ACTIVE},
--{ "all", BOND_MULTICAST_ALL},
--{ NULL, -1},
--};
--
--static int lacp_fast = 0;
--static char *lacp_rate = NULL;
--
--static struct bond_parm_tbl bond_lacp_tbl[] = {
--{ "slow", AD_LACP_SLOW},
--{ "fast", AD_LACP_FAST},
--{ NULL, -1},
--};
--
--static LIST_HEAD(bond_dev_list);
--#ifdef CONFIG_PROC_FS
--static struct proc_dir_entry *bond_proc_dir = NULL;
--#endif
--
--MODULE_PARM(max_bonds, "i");
--MODULE_PARM_DESC(max_bonds, "Max number of bonded devices");
--MODULE_PARM(miimon, "i");
--MODULE_PARM_DESC(miimon, "Link check interval in milliseconds");
--MODULE_PARM(use_carrier, "i");
--MODULE_PARM_DESC(use_carrier, "Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default)");
--MODULE_PARM(mode, "s");
--MODULE_PARM_DESC(mode, "Mode of operation : 0 for round robin, 1 for active-backup, 2 for xor");
--MODULE_PARM(arp_interval, "i");
--MODULE_PARM_DESC(arp_interval, "arp interval in milliseconds");
--MODULE_PARM(arp_ip_target, "1-" __MODULE_STRING(MAX_ARP_IP_TARGETS) "s");
--MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form");
--MODULE_PARM(updelay, "i");
--MODULE_PARM_DESC(updelay, "Delay before considering link up, in milliseconds");
--MODULE_PARM(downdelay, "i");
--MODULE_PARM_DESC(downdelay, "Delay before considering link down, in milliseconds");
--MODULE_PARM(primary, "s");
--MODULE_PARM_DESC(primary, "Primary network device to use");
--MODULE_PARM(multicast, "s");
--MODULE_PARM_DESC(multicast, "Mode for multicast support : 0 for none, 1 for active slave, 2 for all slaves (default)");
--MODULE_PARM(lacp_rate, "s");
--MODULE_PARM_DESC(lacp_rate, "LACPDU tx rate to request from 802.3ad partner (slow/fast)");
--
--static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *dev);
--static int bond_xmit_xor(struct sk_buff *skb, struct net_device *dev);
--static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *dev);
--static struct net_device_stats *bond_get_stats(struct net_device *dev);
--static void bond_mii_monitor(struct net_device *dev);
--static void loadbalance_arp_monitor(struct net_device *dev);
--static void activebackup_arp_monitor(struct net_device *dev);
--static void bond_mc_list_destroy(struct bonding *bond);
--static void bond_mc_add(bonding_t *bond, void *addr, int alen);
--static void bond_mc_delete(bonding_t *bond, void *addr, int alen);
--static int bond_mc_list_copy (struct dev_mc_list *src, struct bonding *dst, int gpf_flag);
--static inline int dmi_same(struct dev_mc_list *dmi1, struct dev_mc_list *dmi2);
--static void bond_set_promiscuity(bonding_t *bond, int inc);
--static void bond_set_allmulti(bonding_t *bond, int inc);
--static struct dev_mc_list* bond_mc_list_find_dmi(struct dev_mc_list *dmi, struct dev_mc_list *mc_list);
--static void bond_mc_update(bonding_t *bond, slave_t *new, slave_t *old);
--static int bond_enslave(struct net_device *master, struct net_device *slave);
--static int bond_release(struct net_device *master, struct net_device *slave);
--static int bond_release_all(struct net_device *master);
--static int bond_sethwaddr(struct net_device *master, struct net_device *slave);
--static void change_active_interface(struct bonding *bond, struct slave *new);
--static void reselect_active_interface(struct bonding *bond);
--static struct slave *find_best_interface(struct bonding *bond);
--
--
--/* #define BONDING_DEBUG 1 */
--#ifdef BONDING_DEBUG
--#define dprintk(x...) printk(x...)
--#else /* BONDING_DEBUG */
--#define dprintk(x...) do {} while (0)
--#endif /* BONDING_DEBUG */
--
--/* several macros */
--
--static void arp_send_all(slave_t *slave)
--{
-- int i;
--
-- for (i = 0; (i<MAX_ARP_IP_TARGETS) && arp_target[i]; i++) {
-- arp_send(ARPOP_REQUEST, ETH_P_ARP, arp_target[i], slave->dev,
-- my_ip, arp_target_hw_addr, slave->dev->dev_addr,
-- arp_target_hw_addr);
-- }
--}
--
-+/*---------------------------- General routines -----------------------------*/
-
--static const char *
--bond_mode_name(void)
-+static const char *bond_mode_name(void)
- {
- switch (bond_mode) {
- case BOND_MODE_ROUNDROBIN :
-@@ -657,149 +608,7 @@ bond_mode_name(void)
- }
- }
-
--static const char *
--multicast_mode_name(void)
--{
-- switch(multicast_mode) {
-- case BOND_MULTICAST_DISABLED :
-- return "disabled";
-- case BOND_MULTICAST_ACTIVE :
-- return "active slave only";
-- case BOND_MULTICAST_ALL :
-- return "all slaves";
-- default :
-- return "unknown";
-- }
--}
--
--void bond_set_slave_inactive_flags(slave_t *slave)
--{
-- slave->state = BOND_STATE_BACKUP;
-- slave->dev->flags |= IFF_NOARP;
--}
--
--void bond_set_slave_active_flags(slave_t *slave)
--{
-- slave->state = BOND_STATE_ACTIVE;
-- slave->dev->flags &= ~IFF_NOARP;
--}
--
--/*
-- * This function counts and verifies the the number of attached
-- * slaves, checking the count against the expected value (given that incr
-- * is either 1 or -1, for add or removal of a slave). Only
-- * bond_xmit_xor() uses the slave_cnt value, but this is still a good
-- * consistency check.
-- */
--static inline void
--update_slave_cnt(bonding_t *bond, int incr)
--{
-- slave_t *slave = NULL;
-- int expect = bond->slave_cnt + incr;
--
-- bond->slave_cnt = 0;
-- for (slave = bond->prev; slave != (slave_t*)bond;
-- slave = slave->prev) {
-- bond->slave_cnt++;
-- }
--
-- if (expect != bond->slave_cnt)
-- BUG();
--}
--
--/*
-- * This function detaches the slave <slave> from the list <bond>.
-- * WARNING: no check is made to verify if the slave effectively
-- * belongs to <bond>. It returns <slave> in case it's needed.
-- * Nothing is freed on return, structures are just unchained.
-- * If the bond->current_slave pointer was pointing to <slave>,
-- * it should be changed by the calling function.
-- *
-- * bond->lock held for writing by caller.
-- */
--static slave_t *
--bond_detach_slave(bonding_t *bond, slave_t *slave)
--{
-- if ((bond == NULL) || (slave == NULL) ||
-- ((void *)bond == (void *)slave)) {
-- printk(KERN_ERR
-- "bond_detach_slave(): trying to detach "
-- "slave %p from bond %p\n", bond, slave);
-- return slave;
-- }
--
-- if (bond->next == slave) { /* is the slave at the head ? */
-- if (bond->prev == slave) { /* is the slave alone ? */
-- bond->prev = bond->next = (slave_t *)bond;
-- } else { /* not alone */
-- bond->next = slave->next;
-- slave->next->prev = (slave_t *)bond;
-- bond->prev->next = slave->next;
-- }
-- } else {
-- slave->prev->next = slave->next;
-- if (bond->prev == slave) { /* is this slave the last one ? */
-- bond->prev = slave->prev;
-- } else {
-- slave->next->prev = slave->prev;
-- }
-- }
--
-- update_slave_cnt(bond, -1);
--
-- return slave;
--}
--
--/*
-- * This function attaches the slave <slave> to the list <bond>.
-- *
-- * bond->lock held for writing by caller.
-- */
--static void
--bond_attach_slave(struct bonding *bond, struct slave *new_slave)
--{
-- /*
-- * queue to the end of the slaves list, make the first element its
-- * successor, the last one its predecessor, and make it the bond's
-- * predecessor.
-- *
-- * Just to clarify, so future bonding driver hackers don't go through
-- * the same confusion stage I did trying to figure this out, the
-- * slaves are stored in a double linked circular list, sortof.
-- * In the ->next direction, the last slave points to the first slave,
-- * bypassing bond; only the slaves are in the ->next direction.
-- * In the ->prev direction, however, the first slave points to bond
-- * and bond points to the last slave.
-- *
-- * It looks like a circle with a little bubble hanging off one side
-- * in the ->prev direction only.
-- *
-- * When going through the list once, its best to start at bond->prev
-- * and go in the ->prev direction, testing for bond. Doing this
-- * in the ->next direction doesn't work. Trust me, I know this now.
-- * :) -mts 2002.03.14
-- */
-- new_slave->prev = bond->prev;
-- new_slave->prev->next = new_slave;
-- bond->prev = new_slave;
-- new_slave->next = bond->next;
--
-- update_slave_cnt(bond, 1);
--}
--
--
--/*
-- * Less bad way to call ioctl from within the kernel; this needs to be
-- * done some other way to get the call out of interrupt context.
-- * Needs "ioctl" variable to be supplied by calling context.
-- */
--#define IOCTL(dev, arg, cmd) ({ \
-- int ret; \
-- mm_segment_t fs = get_fs(); \
-- set_fs(get_ds()); \
-- ret = ioctl(dev, arg, cmd); \
-- set_fs(fs); \
-- ret; })
-+/*------------------------------- Link status -------------------------------*/
-
- /*
- * Get link speed and duplex from the slave's base driver
-@@ -809,16 +618,16 @@ bond_attach_slave(struct bonding *bond,
- */
- static int bond_update_speed_duplex(struct slave *slave)
- {
-- struct net_device *dev = slave->dev;
-+ struct net_device *slave_dev = slave->dev;
- static int (* ioctl)(struct net_device *, struct ifreq *, int);
- struct ifreq ifr;
- struct ethtool_cmd etool;
-
-- ioctl = dev->do_ioctl;
-+ ioctl = slave_dev->do_ioctl;
- if (ioctl) {
- etool.cmd = ETHTOOL_GSET;
- ifr.ifr_data = (char*)&etool;
-- if (IOCTL(dev, &ifr, SIOCETHTOOL) == 0) {
-+ if (IOCTL(slave_dev, &ifr, SIOCETHTOOL) == 0) {
- slave->speed = etool.speed;
- slave->duplex = etool.duplex;
- } else {
-@@ -829,20 +638,20 @@ static int bond_update_speed_duplex(stru
- }
-
- switch (slave->speed) {
-- case SPEED_10:
-- case SPEED_100:
-- case SPEED_1000:
-- break;
-- default:
-- goto err_out;
-+ case SPEED_10:
-+ case SPEED_100:
-+ case SPEED_1000:
-+ break;
-+ default:
-+ goto err_out;
- }
-
- switch (slave->duplex) {
-- case DUPLEX_FULL:
-- case DUPLEX_HALF:
-- break;
-- default:
-- goto err_out;
-+ case DUPLEX_FULL:
-+ case DUPLEX_HALF:
-+ break;
-+ default:
-+ goto err_out;
- }
-
- return 0;
-@@ -854,7 +663,7 @@ err_out:
- return -1;
- }
-
--/*
-+/*
- * if <dev> supports MII link status reporting, check its link status.
- *
- * We either do MII/ETHTOOL ioctls, or check netif_carrier_ok(),
-@@ -870,8 +679,7 @@ err_out:
- * It'd be nice if there was a good way to tell if a driver supports
- * netif_carrier, but there really isn't.
- */
--static int
--bond_check_dev_link(struct net_device *dev, int reporting)
-+static int bond_check_dev_link(struct net_device *slave_dev, int reporting)
- {
- static int (* ioctl)(struct net_device *, struct ifreq *, int);
- struct ifreq ifr;
-@@ -879,10 +687,10 @@ bond_check_dev_link(struct net_device *d
- struct ethtool_value etool;
-
- if (use_carrier) {
-- return netif_carrier_ok(dev) ? BMSR_LSTATUS : 0;
-+ return netif_carrier_ok(slave_dev) ? BMSR_LSTATUS : 0;
- }
-
-- ioctl = dev->do_ioctl;
-+ ioctl = slave_dev->do_ioctl;
- if (ioctl) {
- /* TODO: set pointer to correct ioctl on a per team member */
- /* bases to make this more efficient. that is, once */
-@@ -898,476 +706,495 @@ bond_check_dev_link(struct net_device *d
-
- /* Yes, the mii is overlaid on the ifreq.ifr_ifru */
- mii = (struct mii_ioctl_data *)&ifr.ifr_data;
-- if (IOCTL(dev, &ifr, SIOCGMIIPHY) == 0) {
-+ if (IOCTL(slave_dev, &ifr, SIOCGMIIPHY) == 0) {
- mii->reg_num = MII_BMSR;
-- if (IOCTL(dev, &ifr, SIOCGMIIREG) == 0) {
-- return mii->val_out & BMSR_LSTATUS;
-+ if (IOCTL(slave_dev, &ifr, SIOCGMIIREG) == 0) {
-+ return (mii->val_out & BMSR_LSTATUS);
- }
- }
-
- /* try SIOCETHTOOL ioctl, some drivers cache ETHTOOL_GLINK */
- /* for a period of time so we attempt to get link status */
- /* from it last if the above MII ioctls fail... */
-- etool.cmd = ETHTOOL_GLINK;
-- ifr.ifr_data = (char*)&etool;
-- if (IOCTL(dev, &ifr, SIOCETHTOOL) == 0) {
-+ etool.cmd = ETHTOOL_GLINK;
-+ ifr.ifr_data = (char*)&etool;
-+ if (IOCTL(slave_dev, &ifr, SIOCETHTOOL) == 0) {
- if (etool.data == 1) {
- return BMSR_LSTATUS;
-- } else {
--#ifdef BONDING_DEBUG
-- printk(KERN_INFO
-- ":: SIOCETHTOOL shows link down \n");
--#endif
-+ } else {
-+ dprintk("SIOCETHTOOL shows link down\n");
- return 0;
-- }
-+ }
- }
--
- }
--
-+
- /*
- * If reporting, report that either there's no dev->do_ioctl,
- * or both SIOCGMIIREG and SIOCETHTOOL failed (meaning that we
- * cannot report link status). If not reporting, pretend
- * we're ok.
- */
-- return reporting ? -1 : BMSR_LSTATUS;
-+ return (reporting ? -1 : BMSR_LSTATUS);
- }
-
--static u16 bond_check_mii_link(bonding_t *bond)
--{
-- int has_active_interface = 0;
--
-- read_lock_bh(&bond->lock);
-- read_lock(&bond->ptrlock);
-- has_active_interface = (bond->current_slave != NULL);
-- read_unlock(&bond->ptrlock);
-- read_unlock_bh(&bond->lock);
-+/*----------------------------- Multicast list ------------------------------*/
-
-- return (has_active_interface ? BMSR_LSTATUS : 0);
-+/*
-+ * Returns 0 if dmi1 and dmi2 are the same, non-0 otherwise
-+ */
-+static inline int bond_is_dmi_same(struct dev_mc_list *dmi1, struct dev_mc_list *dmi2)
-+{
-+ return memcmp(dmi1->dmi_addr, dmi2->dmi_addr, dmi1->dmi_addrlen) == 0 &&
-+ dmi1->dmi_addrlen == dmi2->dmi_addrlen;
- }
-
--/* register to receive lacpdus on a bond */
--static void bond_register_lacpdu(struct bonding *bond)
-+/*
-+ * returns dmi entry if found, NULL otherwise
-+ */
-+static struct dev_mc_list *bond_mc_list_find_dmi(struct dev_mc_list *dmi, struct dev_mc_list *mc_list)
- {
-- struct packet_type* pk_type = &(BOND_AD_INFO(bond).ad_pkt_type);
-+ struct dev_mc_list *idmi;
-
-- /* initialize packet type */
-- pk_type->type = PKT_TYPE_LACPDU;
-- pk_type->dev = bond->device;
-- pk_type->func = bond_3ad_lacpdu_recv;
-+ for (idmi = mc_list; idmi; idmi = idmi->next) {
-+ if (bond_is_dmi_same(dmi, idmi)) {
-+ return idmi;
-+ }
-+ }
-
-- dev_add_pack(pk_type);
-+ return NULL;
- }
-
--/* unregister to receive lacpdus on a bond */
--static void bond_unregister_lacpdu(struct bonding *bond)
-+/*
-+ * Push the promiscuity flag down to appropriate slaves
-+ */
-+static void bond_set_promiscuity(struct bonding *bond, int inc)
- {
-- dev_remove_pack(&(BOND_AD_INFO(bond).ad_pkt_type));
-+ if (USES_PRIMARY(bond_mode)) {
-+ /* write lock already acquired */
-+ if (bond->curr_active_slave) {
-+ dev_set_promiscuity(bond->curr_active_slave->dev, inc);
-+ }
-+ } else {
-+ struct slave *slave;
-+ int i;
-+ bond_for_each_slave(bond, slave, i) {
-+ dev_set_promiscuity(slave->dev, inc);
-+ }
-+ }
- }
-
--static int bond_open(struct net_device *dev)
-+/*
-+ * Push the allmulti flag down to all slaves
-+ */
-+static void bond_set_allmulti(struct bonding *bond, int inc)
- {
-- struct bonding *bond = (struct bonding *)(dev->priv);
-- struct timer_list *timer = &((struct bonding *)(dev->priv))->mii_timer;
-- struct timer_list *arp_timer = &((struct bonding *)(dev->priv))->arp_timer;
--
-- if ((bond_mode == BOND_MODE_TLB) ||
-- (bond_mode == BOND_MODE_ALB)) {
-- struct timer_list *alb_timer = &(BOND_ALB_INFO(bond).alb_timer);
--
-- /* bond_alb_initialize must be called before the timer
-- * is started.
-- */
-- if (bond_alb_initialize(bond, (bond_mode == BOND_MODE_ALB))) {
-- /* something went wrong - fail the open operation */
-- return -1;
-+ if (USES_PRIMARY(bond_mode)) {
-+ /* write lock already acquired */
-+ if (bond->curr_active_slave) {
-+ dev_set_allmulti(bond->curr_active_slave->dev, inc);
-+ }
-+ } else {
-+ struct slave *slave;
-+ int i;
-+ bond_for_each_slave(bond, slave, i) {
-+ dev_set_allmulti(slave->dev, inc);
- }
--
-- init_timer(alb_timer);
-- alb_timer->expires = jiffies + 1;
-- alb_timer->data = (unsigned long)bond;
-- alb_timer->function = (void *)&bond_alb_monitor;
-- add_timer(alb_timer);
-- }
--
-- if (miimon > 0) { /* link check interval, in milliseconds. */
-- init_timer(timer);
-- timer->expires = jiffies + (miimon * HZ / 1000);
-- timer->data = (unsigned long)dev;
-- timer->function = (void *)&bond_mii_monitor;
-- add_timer(timer);
- }
-+}
-
-- if (arp_interval> 0) { /* arp interval, in milliseconds. */
-- init_timer(arp_timer);
-- arp_timer->expires = jiffies + (arp_interval * HZ / 1000);
-- arp_timer->data = (unsigned long)dev;
-- if (bond_mode == BOND_MODE_ACTIVEBACKUP) {
-- arp_timer->function = (void *)&activebackup_arp_monitor;
-- } else {
-- arp_timer->function = (void *)&loadbalance_arp_monitor;
-+/*
-+ * Add a Multicast address to slaves
-+ * according to mode
-+ */
-+static void bond_mc_add(struct bonding *bond, void *addr, int alen)
-+{
-+ if (USES_PRIMARY(bond_mode)) {
-+ /* write lock already acquired */
-+ if (bond->curr_active_slave) {
-+ dev_mc_add(bond->curr_active_slave->dev, addr, alen, 0);
-+ }
-+ } else {
-+ struct slave *slave;
-+ int i;
-+ bond_for_each_slave(bond, slave, i) {
-+ dev_mc_add(slave->dev, addr, alen, 0);
- }
-- add_timer(arp_timer);
- }
--
-- if (bond_mode == BOND_MODE_8023AD) {
-- struct timer_list *ad_timer = &(BOND_AD_INFO(bond).ad_timer);
-- init_timer(ad_timer);
-- ad_timer->expires = jiffies + (AD_TIMER_INTERVAL * HZ / 1000);
-- ad_timer->data = (unsigned long)bond;
-- ad_timer->function = (void *)&bond_3ad_state_machine_handler;
-- add_timer(ad_timer);
--
-- /* register to receive LACPDUs */
-- bond_register_lacpdu(bond);
-- }
--
-- return 0;
- }
-
--static int bond_close(struct net_device *master)
-+/*
-+ * Remove a multicast address from slave
-+ * according to mode
-+ */
-+static void bond_mc_delete(struct bonding *bond, void *addr, int alen)
- {
-- bonding_t *bond = (struct bonding *) master->priv;
--
-- write_lock_bh(&bond->lock);
--
-- if (miimon > 0) { /* link check interval, in milliseconds. */
-- del_timer(&bond->mii_timer);
-- }
-- if (arp_interval> 0) { /* arp interval, in milliseconds. */
-- del_timer(&bond->arp_timer);
-- if (arp_target_hw_addr != NULL) {
-- kfree(arp_target_hw_addr);
-- arp_target_hw_addr = NULL;
-+ if (USES_PRIMARY(bond_mode)) {
-+ /* write lock already acquired */
-+ if (bond->curr_active_slave) {
-+ dev_mc_delete(bond->curr_active_slave->dev, addr, alen, 0);
-+ }
-+ } else {
-+ struct slave *slave;
-+ int i;
-+ bond_for_each_slave(bond, slave, i) {
-+ dev_mc_delete(slave->dev, addr, alen, 0);
- }
- }
-+}
-
-- if (bond_mode == BOND_MODE_8023AD) {
-- del_timer_sync(&(BOND_AD_INFO(bond).ad_timer));
-+/*
-+ * Totally destroys the mc_list in bond
-+ */
-+static void bond_mc_list_destroy(struct bonding *bond)
-+{
-+ struct dev_mc_list *dmi;
-
-- /* Unregister the receive of LACPDUs */
-- bond_unregister_lacpdu(bond);
-+ dmi = bond->mc_list;
-+ while (dmi) {
-+ bond->mc_list = dmi->next;
-+ kfree(dmi);
-+ dmi = bond->mc_list;
- }
-+}
-
-- bond_mc_list_destroy (bond);
--
-- write_unlock_bh(&bond->lock);
-+/*
-+ * Copy all the Multicast addresses from src to the bonding device dst
-+ */
-+static int bond_mc_list_copy(struct dev_mc_list *mc_list, struct bonding *bond, int gpf_flag)
-+{
-+ struct dev_mc_list *dmi, *new_dmi;
-
-- /* Release the bonded slaves */
-- bond_release_all(master);
-+ for (dmi = mc_list; dmi; dmi = dmi->next) {
-+ new_dmi = kmalloc(sizeof(struct dev_mc_list), gpf_flag);
-
-- if ((bond_mode == BOND_MODE_TLB) ||
-- (bond_mode == BOND_MODE_ALB)) {
-- del_timer_sync(&(BOND_ALB_INFO(bond).alb_timer));
-+ if (!new_dmi) {
-+ /* FIXME: Potential memory leak !!! */
-+ return -ENOMEM;
-+ }
-
-- bond_alb_deinitialize(bond);
-+ new_dmi->next = bond->mc_list;
-+ bond->mc_list = new_dmi;
-+ new_dmi->dmi_addrlen = dmi->dmi_addrlen;
-+ memcpy(new_dmi->dmi_addr, dmi->dmi_addr, dmi->dmi_addrlen);
-+ new_dmi->dmi_users = dmi->dmi_users;
-+ new_dmi->dmi_gusers = dmi->dmi_gusers;
- }
-
- return 0;
- }
-
--/*
-+/*
- * flush all members of flush->mc_list from device dev->mc_list
- */
--static void bond_mc_list_flush(struct net_device *dev, struct net_device *flush)
--{
-- struct dev_mc_list *dmi;
--
-- for (dmi = flush->mc_list; dmi != NULL; dmi = dmi->next)
-- dev_mc_delete(dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
-+static void bond_mc_list_flush(struct net_device *bond_dev, struct net_device *slave_dev)
-+{
-+ struct dev_mc_list *dmi;
-+
-+ for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) {
-+ dev_mc_delete(slave_dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
-+ }
-
- if (bond_mode == BOND_MODE_8023AD) {
- /* del lacpdu mc addr from mc list */
- u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
-
-- dev_mc_delete(dev, lacpdu_multicast, ETH_ALEN, 0);
-+ dev_mc_delete(slave_dev, lacpdu_multicast, ETH_ALEN, 0);
- }
- }
-
-+/*--------------------------- Active slave change ---------------------------*/
-+
- /*
-- * Totally destroys the mc_list in bond
-+ * Update the mc list and multicast-related flags for the new and
-+ * old active slaves (if any) according to the multicast mode, and
-+ * promiscuous flags unconditionally.
- */
--static void bond_mc_list_destroy(struct bonding *bond)
-+static void bond_mc_swap(struct bonding *bond, struct slave *new_active, struct slave *old_active)
- {
- struct dev_mc_list *dmi;
-
-- dmi = bond->mc_list;
-- while (dmi) {
-- bond->mc_list = dmi->next;
-- kfree(dmi);
-- dmi = bond->mc_list;
-- }
--}
--
--/*
-- * Add a Multicast address to every slave in the bonding group
-- */
--static void bond_mc_add(bonding_t *bond, void *addr, int alen)
--{
-- slave_t *slave;
-- switch (multicast_mode) {
-- case BOND_MULTICAST_ACTIVE :
-- /* write lock already acquired */
-- if (bond->current_slave != NULL)
-- dev_mc_add(bond->current_slave->dev, addr, alen, 0);
-- break;
-- case BOND_MULTICAST_ALL :
-- for (slave = bond->prev; slave != (slave_t*)bond; slave = slave->prev)
-- dev_mc_add(slave->dev, addr, alen, 0);
-- break;
-- case BOND_MULTICAST_DISABLED :
-- break;
-+ if (!USES_PRIMARY(bond_mode)) {
-+ /* nothing to do - mc list is already up-to-date on
-+ * all slaves
-+ */
-+ return;
- }
--}
-
--/*
-- * Remove a multicast address from every slave in the bonding group
-- */
--static void bond_mc_delete(bonding_t *bond, void *addr, int alen)
--{
-- slave_t *slave;
-- switch (multicast_mode) {
-- case BOND_MULTICAST_ACTIVE :
-- /* write lock already acquired */
-- if (bond->current_slave != NULL)
-- dev_mc_delete(bond->current_slave->dev, addr, alen, 0);
-- break;
-- case BOND_MULTICAST_ALL :
-- for (slave = bond->prev; slave != (slave_t*)bond; slave = slave->prev)
-- dev_mc_delete(slave->dev, addr, alen, 0);
-- break;
-- case BOND_MULTICAST_DISABLED :
-- break;
-- }
--}
-+ if (old_active) {
-+ if (bond->dev->flags & IFF_PROMISC) {
-+ dev_set_promiscuity(old_active->dev, -1);
-+ }
-
--/*
-- * Copy all the Multicast addresses from src to the bonding device dst
-- */
--static int bond_mc_list_copy (struct dev_mc_list *src, struct bonding *dst,
-- int gpf_flag)
--{
-- struct dev_mc_list *dmi, *new_dmi;
-+ if (bond->dev->flags & IFF_ALLMULTI) {
-+ dev_set_allmulti(old_active->dev, -1);
-+ }
-
-- for (dmi = src; dmi != NULL; dmi = dmi->next) {
-- new_dmi = kmalloc(sizeof(struct dev_mc_list), gpf_flag);
-+ for (dmi = bond->dev->mc_list; dmi; dmi = dmi->next) {
-+ dev_mc_delete(old_active->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
-+ }
-+ }
-
-- if (new_dmi == NULL) {
-- return -ENOMEM;
-+ if (new_active) {
-+ if (bond->dev->flags & IFF_PROMISC) {
-+ dev_set_promiscuity(new_active->dev, 1);
- }
-
-- new_dmi->next = dst->mc_list;
-- dst->mc_list = new_dmi;
-+ if (bond->dev->flags & IFF_ALLMULTI) {
-+ dev_set_allmulti(new_active->dev, 1);
-+ }
-
-- new_dmi->dmi_addrlen = dmi->dmi_addrlen;
-- memcpy(new_dmi->dmi_addr, dmi->dmi_addr, dmi->dmi_addrlen);
-- new_dmi->dmi_users = dmi->dmi_users;
-- new_dmi->dmi_gusers = dmi->dmi_gusers;
-- }
-- return 0;
-+ for (dmi = bond->dev->mc_list; dmi; dmi = dmi->next) {
-+ dev_mc_add(new_active->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
-+ }
-+ }
- }
-
--/*
-- * Returns 0 if dmi1 and dmi2 are the same, non-0 otherwise
-- */
--static inline int dmi_same(struct dev_mc_list *dmi1, struct dev_mc_list *dmi2)
--{
-- return memcmp(dmi1->dmi_addr, dmi2->dmi_addr, dmi1->dmi_addrlen) == 0 &&
-- dmi1->dmi_addrlen == dmi2->dmi_addrlen;
--}
--
--/*
-- * Push the promiscuity flag down to appropriate slaves
-+/**
-+ * find_best_interface - select the best available slave to be the active one
-+ * @bond: our bonding struct
-+ *
-+ * Warning: Caller must hold curr_slave_lock for writing.
- */
--static void bond_set_promiscuity(bonding_t *bond, int inc)
--{
-- slave_t *slave;
-+static struct slave *bond_find_best_slave(struct bonding *bond)
-+{
-+ struct slave *new_active, *old_active;
-+ struct slave *bestslave = NULL;
-+ int mintime;
-+ int i;
-
-- if (USES_PRIMARY(bond_mode)) {
-- if (bond->current_slave) {
-- dev_set_promiscuity(bond->current_slave->dev, inc);
-- }
-+ new_active = old_active = bond->curr_active_slave;
-
-- } else {
-- for (slave = bond->prev; slave != (slave_t*)bond;
-- slave = slave->prev) {
-- dev_set_promiscuity(slave->dev, inc);
-+ if (!new_active) { /* there were no active slaves left */
-+ if (bond->slave_cnt > 0) { /* found one slave */
-+ new_active = bond->first_slave;
-+ } else {
-+ return NULL; /* still no slave, return NULL */
- }
- }
--}
-
--/*
-- * Push the allmulti flag down to all slaves
-- */
--static void bond_set_allmulti(bonding_t *bond, int inc)
--{
-- slave_t *slave;
-- switch (multicast_mode) {
-- case BOND_MULTICAST_ACTIVE :
-- /* write lock already acquired */
-- if (bond->current_slave != NULL)
-- dev_set_allmulti(bond->current_slave->dev, inc);
-- break;
-- case BOND_MULTICAST_ALL :
-- for (slave = bond->prev; slave != (slave_t*)bond; slave = slave->prev)
-- dev_set_allmulti(slave->dev, inc);
-- break;
-- case BOND_MULTICAST_DISABLED :
-- break;
-+ mintime = updelay;
-+
-+ /* first try the primary link; if arping, a link must tx/rx traffic
-+ * before it can be considered the curr_active_slave - also, we would skip
-+ * slaves between the curr_active_slave and primary_slave that may be up
-+ * and able to arp
-+ */
-+ if ((bond->primary_slave) &&
-+ (!arp_interval) &&
-+ (IS_UP(bond->primary_slave->dev))) {
-+ new_active = bond->primary_slave;
- }
--}
-
--/*
-- * returns dmi entry if found, NULL otherwise
-- */
--static struct dev_mc_list* bond_mc_list_find_dmi(struct dev_mc_list *dmi,
-- struct dev_mc_list *mc_list)
--{
-- struct dev_mc_list *idmi;
-+ /* remember where to stop iterating over the slaves */
-+ old_active = new_active;
-
-- for (idmi = mc_list; idmi != NULL; idmi = idmi->next) {
-- if (dmi_same(dmi, idmi)) {
-- return idmi;
-+ bond_for_each_slave_from(bond, new_active, i, old_active) {
-+ if (IS_UP(new_active->dev)) {
-+ if (new_active->link == BOND_LINK_UP) {
-+ return new_active;
-+ } else if (new_active->link == BOND_LINK_BACK) {
-+ /* link up, but waiting for stabilization */
-+ if (new_active->delay < mintime) {
-+ mintime = new_active->delay;
-+ bestslave = new_active;
-+ }
-+ }
- }
- }
-- return NULL;
--}
-
--static void set_multicast_list(struct net_device *master)
-+ return bestslave;
-+}
-+
-+/**
-+ * change_active_interface - change the active slave into the specified one
-+ * @bond: our bonding struct
-+ * @new: the new slave to make the active one
-+ *
-+ * Set the new slave to the bond's settings and unset them on the old
-+ * curr_active_slave.
-+ * Setting include flags, mc-list, promiscuity, allmulti, etc.
-+ *
-+ * If @new's link state is %BOND_LINK_BACK we'll set it to %BOND_LINK_UP,
-+ * because it is apparently the best available slave we have, even though its
-+ * updelay hasn't timed out yet.
-+ *
-+ * Warning: Caller must hold curr_slave_lock for writing.
-+ */
-+static void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
- {
-- bonding_t *bond = master->priv;
-- struct dev_mc_list *dmi;
-+ struct slave *old_active = bond->curr_active_slave;
-
-- write_lock_bh(&bond->lock);
-+ if (old_active == new_active) {
-+ return;
-+ }
-
-- /*
-- * Do promisc before checking multicast_mode
-- */
-- if ( (master->flags & IFF_PROMISC) && !(bond->flags & IFF_PROMISC) )
-- bond_set_promiscuity(bond, 1);
-+ if (new_active) {
-+ if (new_active->link == BOND_LINK_BACK) {
-+ if (USES_PRIMARY(bond_mode)) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: making interface %s the new "
-+ "active one %d ms earlier.\n",
-+ bond->dev->name, new_active->dev->name,
-+ (updelay - new_active->delay) * miimon);
-+ }
-
-- if ( !(master->flags & IFF_PROMISC) && (bond->flags & IFF_PROMISC) )
-- bond_set_promiscuity(bond, -1);
-+ new_active->delay = 0;
-+ new_active->link = BOND_LINK_UP;
-+ new_active->jiffies = jiffies;
-
-- if (multicast_mode == BOND_MULTICAST_DISABLED) {
-- bond->flags = master->flags;
-- write_unlock_bh(&bond->lock);
-- return;
-+ if (bond_mode == BOND_MODE_8023AD) {
-+ bond_3ad_handle_link_change(new_active, BOND_LINK_UP);
-+ }
-+
-+ if ((bond_mode == BOND_MODE_TLB) ||
-+ (bond_mode == BOND_MODE_ALB)) {
-+ bond_alb_handle_link_change(bond, new_active, BOND_LINK_UP);
-+ }
-+ } else {
-+ if (USES_PRIMARY(bond_mode)) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: making interface %s the new "
-+ "active one.\n",
-+ bond->dev->name, new_active->dev->name);
-+ }
-+ }
- }
-
-- /* set allmulti flag to slaves */
-- if ( (master->flags & IFF_ALLMULTI) && !(bond->flags & IFF_ALLMULTI) )
-- bond_set_allmulti(bond, 1);
-+ if (bond_mode == BOND_MODE_ACTIVEBACKUP) {
-+ if (old_active) {
-+ bond_set_slave_inactive_flags(old_active);
-+ }
-+
-+ if (new_active) {
-+ bond_set_slave_active_flags(new_active);
-+ }
-+ }
-
-- if ( !(master->flags & IFF_ALLMULTI) && (bond->flags & IFF_ALLMULTI) )
-- bond_set_allmulti(bond, -1);
-+ if (USES_PRIMARY(bond_mode)) {
-+ bond_mc_swap(bond, new_active, old_active);
-+ }
-
-- bond->flags = master->flags;
-+ if ((bond_mode == BOND_MODE_TLB) ||
-+ (bond_mode == BOND_MODE_ALB)) {
-+ bond_alb_handle_active_change(bond, new_active);
-+ } else {
-+ bond->curr_active_slave = new_active;
-+ }
-+}
-
-- /* looking for addresses to add to slaves' mc list */
-- for (dmi = master->mc_list; dmi != NULL; dmi = dmi->next) {
-- if (bond_mc_list_find_dmi(dmi, bond->mc_list) == NULL)
-- bond_mc_add(bond, dmi->dmi_addr, dmi->dmi_addrlen);
-- }
-+/**
-+ * bond_select_active_slave - select a new active slave, if needed
-+ * @bond: our bonding struct
-+ *
-+ * This functions shoud be called when one of the following occurs:
-+ * - The old curr_active_slave has been released or lost its link.
-+ * - The primary_slave has got its link back.
-+ * - A slave has got its link back and there's no old curr_active_slave.
-+ *
-+ * Warning: Caller must hold curr_slave_lock for writing.
-+ */
-+static void bond_select_active_slave(struct bonding *bond)
-+{
-+ struct slave *best_slave;
-
-- /* looking for addresses to delete from slaves' list */
-- for (dmi = bond->mc_list; dmi != NULL; dmi = dmi->next) {
-- if (bond_mc_list_find_dmi(dmi, master->mc_list) == NULL)
-- bond_mc_delete(bond, dmi->dmi_addr, dmi->dmi_addrlen);
-+ best_slave = bond_find_best_slave(bond);
-+ if (best_slave != bond->curr_active_slave) {
-+ bond_change_active_slave(bond, best_slave);
- }
-+}
-
-+/*--------------------------- slave list handling ---------------------------*/
-
-- /* save master's multicast list */
-- bond_mc_list_destroy (bond);
-- bond_mc_list_copy (master->mc_list, bond, GFP_ATOMIC);
-+/*
-+ * This function attaches the slave to the end of list.
-+ *
-+ * bond->lock held for writing by caller.
-+ */
-+static void bond_attach_slave(struct bonding *bond, struct slave *new_slave)
-+{
-+ if (bond->first_slave == NULL) { /* attaching the first slave */
-+ new_slave->next = new_slave;
-+ new_slave->prev = new_slave;
-+ bond->first_slave = new_slave;
-+ } else {
-+ new_slave->next = bond->first_slave;
-+ new_slave->prev = bond->first_slave->prev;
-+ new_slave->next->prev = new_slave;
-+ new_slave->prev->next = new_slave;
-+ }
-
-- write_unlock_bh(&bond->lock);
-+ bond->slave_cnt++;
- }
-
- /*
-- * Update the mc list and multicast-related flags for the new and
-- * old active slaves (if any) according to the multicast mode, and
-- * promiscuous flags unconditionally.
-+ * This function detaches the slave from the list.
-+ * WARNING: no check is made to verify if the slave effectively
-+ * belongs to <bond>.
-+ * Nothing is freed on return, structures are just unchained.
-+ * If any slave pointer in bond was pointing to <slave>,
-+ * it should be changed by the calling function.
-+ *
-+ * bond->lock held for writing by caller.
- */
--static void bond_mc_update(bonding_t *bond, slave_t *new, slave_t *old)
-+static void bond_detach_slave(struct bonding *bond, struct slave *slave)
- {
-- struct dev_mc_list *dmi;
-+ if (slave->next) {
-+ slave->next->prev = slave->prev;
-+ }
-
-- if (USES_PRIMARY(bond_mode)) {
-- if (bond->device->flags & IFF_PROMISC) {
-- if (old)
-- dev_set_promiscuity(old->dev, -1);
-- if (new)
-- dev_set_promiscuity(new->dev, 1);
-- }
-+ if (slave->prev) {
-+ slave->prev->next = slave->next;
- }
-
-- switch(multicast_mode) {
-- case BOND_MULTICAST_ACTIVE :
-- if (bond->device->flags & IFF_ALLMULTI) {
-- if (old)
-- dev_set_allmulti(old->dev, -1);
-- if (new)
-- dev_set_allmulti(new->dev, 1);
-- }
-- /* first remove all mc addresses from old slave if any,
-- and _then_ add them to new active slave */
-- if (old) {
-- for (dmi = bond->device->mc_list; dmi != NULL; dmi = dmi->next)
-- dev_mc_delete(old->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
-- }
-- if (new) {
-- for (dmi = bond->device->mc_list; dmi != NULL; dmi = dmi->next)
-- dev_mc_add(new->dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
-+ if (bond->first_slave == slave) { /* slave is the first slave */
-+ if (bond->slave_cnt > 1) { /* there are more slave */
-+ bond->first_slave = slave->next;
-+ } else {
-+ bond->first_slave = NULL; /* slave was the last one */
- }
-- break;
-- case BOND_MULTICAST_ALL :
-- /* nothing to do: mc list is already up-to-date on all slaves */
-- break;
-- case BOND_MULTICAST_DISABLED :
-- break;
- }
-+
-+ slave->next = NULL;
-+ slave->prev = NULL;
-+ bond->slave_cnt--;
-+}
-+
-+/*---------------------------------- IOCTL ----------------------------------*/
-+
-+static int bond_sethwaddr(struct net_device *bond_dev, struct net_device *slave_dev)
-+{
-+ dprintk("bond_dev=%p\n", bond_dev);
-+ dprintk("slave_dev=%p\n", slave_dev);
-+ dprintk("slave_dev->addr_len=%d\n", slave_dev->addr_len);
-+ memcpy(bond_dev->dev_addr, slave_dev->dev_addr, slave_dev->addr_len);
-+ return 0;
- }
-
- /* enslave device <slave> to bond device <master> */
--static int bond_enslave(struct net_device *master_dev,
-- struct net_device *slave_dev)
-+static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
- {
-- bonding_t *bond = NULL;
-- slave_t *new_slave = NULL;
-- unsigned long rflags = 0;
-- int err = 0;
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *new_slave = NULL;
- struct dev_mc_list *dmi;
-- struct in_ifaddr **ifap;
-- struct in_ifaddr *ifa;
-- int link_reporting;
- struct sockaddr addr;
--
-- if (master_dev == NULL || slave_dev == NULL) {
-- return -ENODEV;
-- }
-- bond = (struct bonding *) master_dev->priv;
-+ int link_reporting;
-+ int res = 0;
-
- if (slave_dev->do_ioctl == NULL) {
-- printk(KERN_DEBUG
-- "Warning : no link monitoring support for %s\n",
-- slave_dev->name);
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning : no link monitoring support for %s\n",
-+ slave_dev->name);
- }
-
--
- /* bond must be initialized by bond_open() before enslaving */
-- if (!(master_dev->flags & IFF_UP)) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Error, master_dev is not up\n");
--#endif
-+ if (!(bond_dev->flags & IFF_UP)) {
-+ dprintk("Error, master_dev is not up\n");
- return -EPERM;
- }
-
- /* already enslaved */
-- if (master_dev->flags & IFF_SLAVE || slave_dev->flags & IFF_SLAVE) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Error, Device was already enslaved\n");
--#endif
-+ if (slave_dev->flags & IFF_SLAVE) {
-+ dprintk("Error, Device was already enslaved\n");
- return -EBUSY;
- }
-
-@@ -1376,19 +1203,19 @@ static int bond_enslave(struct net_devic
- * slave interface to be closed.
- */
- if ((slave_dev->flags & IFF_UP)) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Error, slave_dev is up\n");
--#endif
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: %s is up\n",
-+ slave_dev->name);
- return -EPERM;
- }
-
- if (slave_dev->set_mac_address == NULL) {
-- printk(KERN_CRIT
-- "The slave device you specified does not support"
-- " setting the MAC address.\n");
-- printk(KERN_CRIT
-- "Your kernel likely does not support slave"
-- " devices.\n");
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: The slave device you specified does "
-+ "not support setting the MAC address.\n");
-+ printk(KERN_ERR
-+ "Your kernel likely does not support slave "
-+ "devices.\n");
-
- return -EOPNOTSUPP;
- }
-@@ -1397,26 +1224,29 @@ static int bond_enslave(struct net_devic
- * slave interface to be open.
- */
- if (!(slave_dev->flags & IFF_UP)) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Error, slave_dev is not running\n");
--#endif
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: %s is not running\n",
-+ slave_dev->name);
- return -EINVAL;
- }
-
- if ((bond_mode == BOND_MODE_8023AD) ||
-- (bond_mode == BOND_MODE_TLB) ||
-+ (bond_mode == BOND_MODE_TLB) ||
- (bond_mode == BOND_MODE_ALB)) {
-- printk(KERN_ERR
-- "bonding: Error: to use %s mode, you must "
-- "upgrade ifenslave.\n", bond_mode_name());
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: to use %s mode, you must upgrade "
-+ "ifenslave.\n",
-+ bond_mode_name());
- return -EOPNOTSUPP;
- }
- }
-
-- if ((new_slave = kmalloc(sizeof(slave_t), GFP_KERNEL)) == NULL) {
-+ new_slave = kmalloc(sizeof(struct slave), GFP_KERNEL);
-+ if (!new_slave) {
- return -ENOMEM;
- }
-- memset(new_slave, 0, sizeof(slave_t));
-+
-+ memset(new_slave, 0, sizeof(struct slave));
-
- /* save slave's original flags before calling
- * netdev_set_master and dev_open
-@@ -1430,37 +1260,29 @@ static int bond_enslave(struct net_devic
- */
- memcpy(new_slave->perm_hwaddr, slave_dev->dev_addr, ETH_ALEN);
-
-- if (bond->slave_cnt > 0) {
-- /* set slave to master's mac address
-- * The application already set the master's
-- * mac address to that of the first slave
-- */
-- memcpy(addr.sa_data, master_dev->dev_addr, master_dev->addr_len);
-- addr.sa_family = slave_dev->type;
-- err = slave_dev->set_mac_address(slave_dev, &addr);
-- if (err) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Error %d calling set_mac_address\n", err);
--#endif
-- goto err_free;
-- }
-+ /* set slave to master's mac address
-+ * The application already set the master's
-+ * mac address to that of the first slave
-+ */
-+ memcpy(addr.sa_data, bond_dev->dev_addr, bond_dev->addr_len);
-+ addr.sa_family = slave_dev->type;
-+ res = slave_dev->set_mac_address(slave_dev, &addr);
-+ if (res) {
-+ dprintk("Error %d calling set_mac_address\n", res);
-+ goto err_free;
- }
-
- /* open the slave since the application closed it */
-- err = dev_open(slave_dev);
-- if (err) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Openning slave %s failed\n", slave_dev->name);
--#endif
-+ res = dev_open(slave_dev);
-+ if (res) {
-+ dprintk("Openning slave %s failed\n", slave_dev->name);
- goto err_restore_mac;
- }
- }
-
-- err = netdev_set_master(slave_dev, master_dev);
-- if (err) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Error %d calling netdev_set_master\n", err);
--#endif
-+ res = netdev_set_master(slave_dev, bond_dev);
-+ if (res) {
-+ dprintk("Error %d calling netdev_set_master\n", res);
- if (app_abi_ver < 1) {
- goto err_free;
- } else {
-@@ -1475,32 +1297,32 @@ static int bond_enslave(struct net_devic
- /* bond_alb_init_slave() must be called before all other stages since
- * it might fail and we do not want to have to undo everything
- */
-- err = bond_alb_init_slave(bond, new_slave);
-- if (err) {
-+ res = bond_alb_init_slave(bond, new_slave);
-+ if (res) {
- goto err_unset_master;
- }
- }
-
-- /* set promiscuity level to new slave */
-- if (master_dev->flags & IFF_PROMISC) {
-- /* If the mode USES_PRIMARY, then the new slave gets the
-- * master's promisc (and mc) settings only if it becomes the
-- * current_slave, and that is taken care of later when calling
-- * bond_change_active()
-- */
-- if (!USES_PRIMARY(bond_mode)) {
-- dev_set_promiscuity(slave_dev, 1);
-+ /* If the mode USES_PRIMARY, then the new slave gets the
-+ * master's promisc (and mc) settings only if it becomes the
-+ * curr_active_slave, and that is taken care of later when calling
-+ * bond_change_active()
-+ */
-+ if (!USES_PRIMARY(bond_mode)) {
-+ /* set promiscuity level to new slave */
-+ if (bond_dev->flags & IFF_PROMISC) {
-+ dev_set_promiscuity(slave_dev, 1);
- }
-- }
--
-- if (multicast_mode == BOND_MULTICAST_ALL) {
-+
- /* set allmulti level to new slave */
-- if (master_dev->flags & IFF_ALLMULTI)
-- dev_set_allmulti(slave_dev, 1);
--
-- /* upload master's mc_list to new slave */
-- for (dmi = master_dev->mc_list; dmi != NULL; dmi = dmi->next)
-+ if (bond_dev->flags & IFF_ALLMULTI) {
-+ dev_set_allmulti(slave_dev, 1);
-+ }
-+
-+ /* upload master's mc_list to new slave */
-+ for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) {
- dev_mc_add (slave_dev, dmi->dmi_addr, dmi->dmi_addrlen, 0);
-+ }
- }
-
- if (bond_mode == BOND_MODE_8023AD) {
-@@ -1511,15 +1333,16 @@ static int bond_enslave(struct net_devic
- }
-
- write_lock_bh(&bond->lock);
--
-+
- bond_attach_slave(bond, new_slave);
-+
- new_slave->delay = 0;
- new_slave->link_failure_count = 0;
-
-- if (miimon > 0 && !use_carrier) {
-+ if (miimon && !use_carrier) {
- link_reporting = bond_check_dev_link(slave_dev, 1);
-
-- if ((link_reporting == -1) && (arp_interval == 0)) {
-+ if ((link_reporting == -1) && !arp_interval) {
- /*
- * miimon is set but a bonded network driver
- * does not support ETHTOOL/MII and
-@@ -1528,115 +1351,97 @@ static int bond_enslave(struct net_devic
- * here (because netif_carrier is always
- * supported); thus, we don't need to change
- * the messages for netif_carrier.
-- */
-- printk(KERN_ERR
-- "bond_enslave(): MII and ETHTOOL support not "
-- "available for interface %s, and "
-- "arp_interval/arp_ip_target module parameters "
-- "not specified, thus bonding will not detect "
-- "link failures! see bonding.txt for details.\n",
-- slave_dev->name);
-+ */
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: MII and ETHTOOL support not "
-+ "available for interface %s, and "
-+ "arp_interval/arp_ip_target module parameters "
-+ "not specified, thus bonding will not detect "
-+ "link failures! see bonding.txt for details.\n",
-+ slave_dev->name);
- } else if (link_reporting == -1) {
-- /* unable get link status using mii/ethtool */
-- printk(KERN_WARNING
-- "bond_enslave: can't get link status from "
-+ /* unable get link status using mii/ethtool */
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: can't get link status from "
- "interface %s; the network driver associated "
-- "with this interface does not support "
-- "MII or ETHTOOL link status reporting, thus "
-- "miimon has no effect on this interface.\n",
-+ "with this interface does not support MII or "
-+ "ETHTOOL link status reporting, thus miimon "
-+ "has no effect on this interface.\n",
- slave_dev->name);
- }
- }
-
- /* check for initial state */
-- if ((miimon <= 0) ||
-+ if (!miimon ||
- (bond_check_dev_link(slave_dev, 0) == BMSR_LSTATUS)) {
- if (updelay) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Initial state of slave_dev is "
-- "BOND_LINK_BACK\n");
--#endif
-+ dprintk("Initial state of slave_dev is "
-+ "BOND_LINK_BACK\n");
- new_slave->link = BOND_LINK_BACK;
- new_slave->delay = updelay;
-- }
-- else {
--#ifdef BONDING_DEBUG
-- printk(KERN_DEBUG "Initial state of slave_dev is "
-+ } else {
-+ dprintk("Initial state of slave_dev is "
- "BOND_LINK_UP\n");
--#endif
- new_slave->link = BOND_LINK_UP;
- }
- new_slave->jiffies = jiffies;
-- }
-- else {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "Initial state of slave_dev is "
-+ } else {
-+ dprintk("Initial state of slave_dev is "
- "BOND_LINK_DOWN\n");
--#endif
- new_slave->link = BOND_LINK_DOWN;
- }
-
- if (bond_update_speed_duplex(new_slave) &&
- (new_slave->link != BOND_LINK_DOWN)) {
--
-- printk(KERN_WARNING
-- "bond_enslave(): failed to get speed/duplex from %s, "
-- "speed forced to 100Mbps, duplex forced to Full.\n",
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: failed to get speed/duplex from %s, speed "
-+ "forced to 100Mbps, duplex forced to Full.\n",
- new_slave->dev->name);
-+
- if (bond_mode == BOND_MODE_8023AD) {
- printk(KERN_WARNING
-- "Operation of 802.3ad mode requires ETHTOOL support "
-- "in base driver for proper aggregator selection.\n");
-+ "Operation of 802.3ad mode requires ETHTOOL "
-+ "support in base driver for proper aggregator "
-+ "selection.\n");
- }
- }
-
-- /* if we're in active-backup mode, we need one and only one active
-- * interface. The backup interfaces will have their NOARP flag set
-- * because we need them to be completely deaf and not to respond to
-- * any ARP request on the network to avoid fooling a switch. Thus,
-- * since we guarantee that current_slave always point to the last
-- * usable interface, we just have to verify this interface's flag.
-- */
-- if (bond_mode == BOND_MODE_ACTIVEBACKUP) {
-- if (((bond->current_slave == NULL)
-- || (bond->current_slave->dev->flags & IFF_NOARP))
-- && (new_slave->link != BOND_LINK_DOWN)) {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "This is the first active slave\n");
--#endif
-+ if (USES_PRIMARY(bond_mode) && primary) {
-+ /* if there is a primary slave, remember it */
-+ if (strcmp(primary, new_slave->dev->name) == 0) {
-+ bond->primary_slave = new_slave;
-+ }
-+ }
-+
-+ switch (bond_mode) {
-+ case BOND_MODE_ACTIVEBACKUP:
-+ /* if we're in active-backup mode, we need one and only one active
-+ * interface. The backup interfaces will have their NOARP flag set
-+ * because we need them to be completely deaf and not to respond to
-+ * any ARP request on the network to avoid fooling a switch. Thus,
-+ * since we guarantee that curr_active_slave always point to the last
-+ * usable interface, we just have to verify this interface's flag.
-+ */
-+ if (((!bond->curr_active_slave) ||
-+ (bond->curr_active_slave->dev->flags & IFF_NOARP)) &&
-+ (new_slave->link != BOND_LINK_DOWN)) {
-+ dprintk("This is the first active slave\n");
- /* first slave or no active slave yet, and this link
- is OK, so make this interface the active one */
-- change_active_interface(bond, new_slave);
-- }
-- else {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "This is just a backup slave\n");
--#endif
-+ bond_change_active_slave(bond, new_slave);
-+ } else {
-+ dprintk("This is just a backup slave\n");
- bond_set_slave_inactive_flags(new_slave);
- }
-- if (((struct in_device *)slave_dev->ip_ptr) != NULL) {
-- read_lock_irqsave(&(((struct in_device *)slave_dev->ip_ptr)->lock), rflags);
-- ifap= &(((struct in_device *)slave_dev->ip_ptr)->ifa_list);
-- ifa = *ifap;
-- if (ifa != NULL)
-- my_ip = ifa->ifa_address;
-- read_unlock_irqrestore(&(((struct in_device *)slave_dev->ip_ptr)->lock), rflags);
-- }
--
-- /* if there is a primary slave, remember it */
-- if (primary != NULL) {
-- if (strcmp(primary, new_slave->dev->name) == 0) {
-- bond->primary_slave = new_slave;
-- }
-- }
-- } else if (bond_mode == BOND_MODE_8023AD) {
-+ break;
-+ case BOND_MODE_8023AD:
- /* in 802.3ad mode, the internal mechanism
- * will activate the slaves in the selected
- * aggregator
- */
- bond_set_slave_inactive_flags(new_slave);
- /* if this is the first slave */
-- if (new_slave == bond->next) {
-+ if (bond->slave_cnt == 1) {
- SLAVE_AD_INFO(new_slave).id = 1;
- /* Initialize AD with the number of times that the AD timer is called in 1 second
- * can be called only after the mac address of the bond is set
-@@ -1645,40 +1450,37 @@ static int bond_enslave(struct net_devic
- lacp_fast);
- } else {
- SLAVE_AD_INFO(new_slave).id =
-- SLAVE_AD_INFO(new_slave->prev).id + 1;
-+ SLAVE_AD_INFO(new_slave->prev).id + 1;
- }
-
- bond_3ad_bind_slave(new_slave);
-- } else if ((bond_mode == BOND_MODE_TLB) ||
-- (bond_mode == BOND_MODE_ALB)) {
-+ break;
-+ case BOND_MODE_TLB:
-+ case BOND_MODE_ALB:
- new_slave->state = BOND_STATE_ACTIVE;
-- if ((bond->current_slave == NULL) && (new_slave->link != BOND_LINK_DOWN)) {
-+ if ((!bond->curr_active_slave) &&
-+ (new_slave->link != BOND_LINK_DOWN)) {
- /* first slave or no active slave yet, and this link
- * is OK, so make this interface the active one
- */
-- change_active_interface(bond, new_slave);
-+ bond_change_active_slave(bond, new_slave);
- }
-+ break;
-+ default:
-+ dprintk("This slave is always active in trunk mode\n");
-
-- /* if there is a primary slave, remember it */
-- if (primary != NULL) {
-- if (strcmp(primary, new_slave->dev->name) == 0) {
-- bond->primary_slave = new_slave;
-- }
-- }
-- } else {
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "This slave is always active in trunk mode\n");
--#endif
- /* always active in trunk mode */
- new_slave->state = BOND_STATE_ACTIVE;
-
-- /* In trunking mode there is little meaning to current_slave
-+ /* In trunking mode there is little meaning to curr_active_slave
- * anyway (it holds no special properties of the bond device),
- * so we can change it without calling change_active_interface()
- */
-- if (bond->current_slave == NULL)
-- bond->current_slave = new_slave;
-- }
-+ if (!bond->curr_active_slave) {
-+ bond->curr_active_slave = new_slave;
-+ }
-+ break;
-+ } /* switch(bond_mode) */
-
- write_unlock_bh(&bond->lock);
-
-@@ -1692,38 +1494,34 @@ static int bond_enslave(struct net_devic
- */
- int ndx = 0;
-
-- for (ndx = 0; ndx < slave_dev->addr_len; ndx++) {
--#ifdef BONDING_DEBUG
-- printk(KERN_DEBUG
-- "Checking ndx=%d of master_dev->dev_addr\n", ndx);
--#endif
-- if (master_dev->dev_addr[ndx] != 0) {
--#ifdef BONDING_DEBUG
-- printk(KERN_DEBUG
-- "Found non-zero byte at ndx=%d\n", ndx);
--#endif
-+ for (ndx = 0; ndx < bond_dev->addr_len; ndx++) {
-+ dprintk("Checking ndx=%d of bond_dev->dev_addr\n",
-+ ndx);
-+ if (bond_dev->dev_addr[ndx] != 0) {
-+ dprintk("Found non-zero byte at ndx=%d\n",
-+ ndx);
- break;
- }
- }
-- if (ndx == slave_dev->addr_len) {
-+
-+ if (ndx == bond_dev->addr_len) {
- /*
- * We got all the way through the address and it was
- * all 0's.
- */
--#ifdef BONDING_DEBUG
-- printk(KERN_DEBUG "%s doesn't have a MAC address yet. ",
-- master_dev->name);
-- printk(KERN_DEBUG "Going to give assign it from %s.\n",
-- slave_dev->name);
--#endif
-- bond_sethwaddr(master_dev, slave_dev);
-+ dprintk("%s doesn't have a MAC address yet. \n",
-+ bond_dev->name);
-+ dprintk("Going to give assign it from %s.\n",
-+ slave_dev->name);
-+ bond_sethwaddr(bond_dev, slave_dev);
- }
- }
-
-- printk (KERN_INFO "%s: enslaving %s as a%s interface with a%s link.\n",
-- master_dev->name, slave_dev->name,
-- new_slave->state == BOND_STATE_ACTIVE ? "n active" : " backup",
-- new_slave->link != BOND_LINK_DOWN ? "n up" : " down");
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: enslaving %s as a%s interface with a%s link.\n",
-+ bond_dev->name, slave_dev->name,
-+ new_slave->state == BOND_STATE_ACTIVE ? "n active" : " backup",
-+ new_slave->link != BOND_LINK_DOWN ? "n up" : " down");
-
- /* enslave is successful */
- return 0;
-@@ -1742,435 +1540,204 @@ err_restore_mac:
-
- err_free:
- kfree(new_slave);
-- return err;
-+ return res;
- }
-
--/*
-- * This function changes the active slave to slave <slave_dev>.
-- * It returns -EINVAL in the following cases.
-- * - <slave_dev> is not found in the list.
-- * - There is not active slave now.
-- * - <slave_dev> is already active.
-- * - The link state of <slave_dev> is not BOND_LINK_UP.
-- * - <slave_dev> is not running.
-- * In these cases, this fuction does nothing.
-- * In the other cases, currnt_slave pointer is changed and 0 is returned.
-+/*
-+ * Try to release the slave device <slave> from the bond device <master>
-+ * It is legal to access curr_active_slave without a lock because all the function
-+ * is write-locked.
-+ *
-+ * The rules for slave state should be:
-+ * for Active/Backup:
-+ * Active stays on all backups go down
-+ * for Bonded connections:
-+ * The first up interface should be left on and all others downed.
- */
--static int bond_change_active(struct net_device *master_dev, struct net_device *slave_dev)
-+static int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
- {
-- bonding_t *bond;
-- slave_t *slave;
-- slave_t *oldactive = NULL;
-- slave_t *newactive = NULL;
-- int ret = 0;
--
-- if (master_dev == NULL || slave_dev == NULL) {
-- return -ENODEV;
-- }
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave;
-+ struct sockaddr addr;
-+ int mac_addr_differ;
-
-- /* Verify that master_dev is indeed the master of slave_dev */
-+ /* slave is not a slave or master is not master of this slave */
- if (!(slave_dev->flags & IFF_SLAVE) ||
-- (slave_dev->master != master_dev)) {
--
-+ (slave_dev->master != bond_dev)) {
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: %s: cannot release %s.\n",
-+ bond_dev->name, slave_dev->name);
- return -EINVAL;
- }
-
-- bond = (struct bonding *) master_dev->priv;
- write_lock_bh(&bond->lock);
-- slave = (slave_t *)bond;
-- oldactive = bond->current_slave;
--
-- while ((slave = slave->prev) != (slave_t *)bond) {
-- if(slave_dev == slave->dev) {
-- newactive = slave;
-- break;
-- }
-- }
--
-- /*
-- * Changing to the current active: do nothing; return success.
-- */
-- if (newactive && (newactive == oldactive)) {
-- write_unlock_bh(&bond->lock);
-- return 0;
-- }
--
-- if ((newactive != NULL)&&
-- (oldactive != NULL)&&
-- (newactive->link == BOND_LINK_UP)&&
-- IS_UP(newactive->dev)) {
-- change_active_interface(bond, newactive);
-- } else {
-- ret = -EINVAL;
-- }
-- write_unlock_bh(&bond->lock);
-- return ret;
--}
-
--/**
-- * find_best_interface - select the best available slave to be the active one
-- * @bond: our bonding struct
-- *
-- * Warning: Caller must hold ptrlock for writing.
-- */
--static struct slave *find_best_interface(struct bonding *bond)
--{
-- struct slave *newslave, *oldslave;
-- struct slave *bestslave = NULL;
-- int mintime;
--
-- newslave = oldslave = bond->current_slave;
--
-- if (newslave == NULL) { /* there were no active slaves left */
-- if (bond->next != (slave_t *)bond) { /* found one slave */
-- newslave = bond->next;
-- } else {
-- return NULL; /* still no slave, return NULL */
-- }
-+ slave = bond_get_slave_by_dev(bond, slave_dev);
-+ if (!slave) {
-+ /* not a slave of this bond */
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: %s not enslaved\n",
-+ bond_dev->name, slave_dev->name);
-+ return -EINVAL;
- }
-
-- mintime = updelay;
--
-- /* first try the primary link; if arping, a link must tx/rx traffic
-- * before it can be considered the current_slave - also, we would skip
-- * slaves between the current_slave and primary_slave that may be up
-- * and able to arp
-- */
-- if ((bond->primary_slave != NULL) && (arp_interval == 0)) {
-- if (IS_UP(bond->primary_slave->dev))
-- newslave = bond->primary_slave;
-+ mac_addr_differ = memcmp(bond_dev->dev_addr,
-+ slave->perm_hwaddr,
-+ ETH_ALEN);
-+ if (!mac_addr_differ && (bond->slave_cnt > 1)) {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: the permanent HWaddr of %s "
-+ "- %02X:%02X:%02X:%02X:%02X:%02X - is "
-+ "still in use by %s. Set the HWaddr of "
-+ "%s to a different address to avoid "
-+ "conflicts.\n",
-+ slave_dev->name,
-+ slave->perm_hwaddr[0],
-+ slave->perm_hwaddr[1],
-+ slave->perm_hwaddr[2],
-+ slave->perm_hwaddr[3],
-+ slave->perm_hwaddr[4],
-+ slave->perm_hwaddr[5],
-+ bond_dev->name,
-+ slave_dev->name);
- }
-
-- /* remember where to stop iterating over the slaves */
-- oldslave = newslave;
--
-- do {
-- if (IS_UP(newslave->dev)) {
-- if (newslave->link == BOND_LINK_UP) {
-- return newslave;
-- }
-- else if (newslave->link == BOND_LINK_BACK) {
-- /* link up, but waiting for stabilization */
-- if (newslave->delay < mintime) {
-- mintime = newslave->delay;
-- bestslave = newslave;
-- }
-- }
-- }
-- } while ((newslave = newslave->next) != oldslave);
--
-- return bestslave;
--}
--
--/**
-- * change_active_interface - change the active slave into the specified one
-- * @bond: our bonding struct
-- * @new: the new slave to make the active one
-- *
-- * Set the new slave to the bond's settings and unset them on the old
-- * current_slave.
-- * Setting include flags, mc-list, promiscuity, allmulti, etc.
-- *
-- * If @new's link state is %BOND_LINK_BACK we'll set it to %BOND_LINK_UP,
-- * because it is apparently the best available slave we have, even though its
-- * updelay hasn't timed out yet.
-- *
-- * Warning: Caller must hold ptrlock for writing.
-- */
--static void change_active_interface(struct bonding *bond, struct slave *new)
--{
-- struct slave *old = bond->current_slave;
--
-- if (old == new) {
-- return;
-+ /* Inform AD package of unbinding of slave. */
-+ if (bond_mode == BOND_MODE_8023AD) {
-+ /* must be called before the slave is
-+ * detached from the list
-+ */
-+ bond_3ad_unbind_slave(slave);
- }
-
-- if (new) {
-- if (new->link == BOND_LINK_BACK) {
-- if (USES_PRIMARY(bond_mode)) {
-- printk (KERN_INFO
-- "%s: making interface %s the new "
-- "active one %d ms earlier.\n",
-- bond->device->name, new->dev->name,
-- (updelay - new->delay) * miimon);
-- }
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: releasing %s interface %s\n",
-+ bond_dev->name,
-+ (slave->state == BOND_STATE_ACTIVE)
-+ ? "active" : "backup",
-+ slave_dev->name);
-
-- new->delay = 0;
-- new->link = BOND_LINK_UP;
-- new->jiffies = jiffies;
-+ bond->current_arp_slave = NULL;
-
-- if (bond_mode == BOND_MODE_8023AD) {
-- bond_3ad_handle_link_change(new, BOND_LINK_UP);
-- }
-+ /* release the slave from its bond */
-+ bond_detach_slave(bond, slave);
-
-- if ((bond_mode == BOND_MODE_TLB) ||
-- (bond_mode == BOND_MODE_ALB)) {
-- bond_alb_handle_link_change(bond, new, BOND_LINK_UP);
-- }
-- } else {
-- if (USES_PRIMARY(bond_mode)) {
-- printk (KERN_INFO
-- "%s: making interface %s the new active one.\n",
-- bond->device->name, new->dev->name);
-- }
-- }
-+ if (bond->primary_slave == slave) {
-+ bond->primary_slave = NULL;
- }
-
-- if (bond_mode == BOND_MODE_ACTIVEBACKUP) {
-- if (old) {
-- bond_set_slave_inactive_flags(old);
-- }
--
-- if (new) {
-- bond_set_slave_active_flags(new);
-- }
-+ if (bond->curr_active_slave == slave) {
-+ bond_change_active_slave(bond, NULL);
-+ bond_select_active_slave(bond);
- }
-
-- if (USES_PRIMARY(bond_mode)) {
-- bond_mc_update(bond, new, old);
-+ if (!bond->curr_active_slave) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: now running without any active "
-+ "interface !\n",
-+ bond_dev->name);
- }
-
- if ((bond_mode == BOND_MODE_TLB) ||
- (bond_mode == BOND_MODE_ALB)) {
-- bond_alb_assign_current_slave(bond, new);
-- } else {
-- bond->current_slave = new;
-- }
--}
--
--/**
-- * reselect_active_interface - select a new active slave, if needed
-- * @bond: our bonding struct
-- *
-- * This functions shoud be called when one of the following occurs:
-- * - The old current_slave has been released or lost its link.
-- * - The primary_slave has got its link back.
-- * - A slave has got its link back and there's no old current_slave.
-- *
-- * Warning: Caller must hold ptrlock for writing.
-- */
--static void reselect_active_interface(struct bonding *bond)
--{
-- struct slave *best_slave;
--
-- best_slave = find_best_interface(bond);
--
-- if (best_slave != bond->current_slave) {
-- change_active_interface(bond, best_slave);
-- }
--}
--
--/*
-- * Try to release the slave device <slave> from the bond device <master>
-- * It is legal to access current_slave without a lock because all the function
-- * is write-locked.
-- *
-- * The rules for slave state should be:
-- * for Active/Backup:
-- * Active stays on all backups go down
-- * for Bonded connections:
-- * The first up interface should be left on and all others downed.
-- */
--static int bond_release(struct net_device *master, struct net_device *slave)
--{
-- bonding_t *bond;
-- slave_t *our_slave, *old_current;
-- struct sockaddr addr;
--
-- if (master == NULL || slave == NULL) {
-- return -ENODEV;
-- }
--
-- bond = (struct bonding *) master->priv;
--
-- /* master already enslaved, or slave not enslaved,
-- or no slave for this master */
-- if ((master->flags & IFF_SLAVE) || !(slave->flags & IFF_SLAVE)) {
-- printk (KERN_DEBUG "%s: cannot release %s.\n", master->name, slave->name);
-- return -EINVAL;
-+ /* must be called only after the slave has been
-+ * detached from the list and the curr_active_slave
-+ * has been replaced (if our_slave == old_current)
-+ */
-+ bond_alb_deinit_slave(bond, slave);
- }
-
-- write_lock_bh(&bond->lock);
-- bond->current_arp_slave = NULL;
-- our_slave = (slave_t *)bond;
-- old_current = bond->current_slave;
-- while ((our_slave = our_slave->prev) != (slave_t *)bond) {
-- if (our_slave->dev == slave) {
-- int mac_addr_differ = memcmp(bond->device->dev_addr,
-- our_slave->perm_hwaddr,
-- ETH_ALEN);
-- if (!mac_addr_differ && (bond->slave_cnt > 1)) {
-- printk(KERN_WARNING "WARNING: the permanent HWaddr of %s "
-- "- %02X:%02X:%02X:%02X:%02X:%02X - "
-- "is still in use by %s. Set the HWaddr "
-- "of %s to a different address "
-- "to avoid conflicts.\n",
-- slave->name,
-- our_slave->perm_hwaddr[0],
-- our_slave->perm_hwaddr[1],
-- our_slave->perm_hwaddr[2],
-- our_slave->perm_hwaddr[3],
-- our_slave->perm_hwaddr[4],
-- our_slave->perm_hwaddr[5],
-- bond->device->name,
-- slave->name);
-- }
--
-- /* Inform AD package of unbinding of slave. */
-- if (bond_mode == BOND_MODE_8023AD) {
-- /* must be called before the slave is
-- * detached from the list
-- */
-- bond_3ad_unbind_slave(our_slave);
-- }
--
-- printk (KERN_INFO "%s: releasing %s interface %s\n",
-- master->name,
-- (our_slave->state == BOND_STATE_ACTIVE) ? "active" : "backup",
-- slave->name);
--
-- /* release the slave from its bond */
-- bond_detach_slave(bond, our_slave);
--
-- if (bond->primary_slave == our_slave) {
-- bond->primary_slave = NULL;
-- }
--
-- if (bond->current_slave == our_slave) {
-- change_active_interface(bond, NULL);
-- reselect_active_interface(bond);
-- }
--
-- if (bond->current_slave == NULL) {
-- printk(KERN_INFO
-- "%s: now running without any active interface !\n",
-- master->name);
-- }
--
-- if ((bond_mode == BOND_MODE_TLB) ||
-- (bond_mode == BOND_MODE_ALB)) {
-- /* must be called only after the slave has been
-- * detached from the list and the current_slave
-- * has been replaced (if our_slave == old_current)
-- */
-- bond_alb_deinit_slave(bond, our_slave);
-- }
--
-- break;
-- }
--
-- }
- write_unlock_bh(&bond->lock);
--
-- if (our_slave == (slave_t *)bond) {
-- /* if we get here, it's because the device was not found */
-- printk (KERN_INFO "%s: %s not enslaved\n", master->name, slave->name);
-- return -EINVAL;
-- }
-
-- /* unset promiscuity level from slave */
-- if (master->flags & IFF_PROMISC) {
-- /* If the mode USES_PRIMARY, then we should only remove its
-- * promisc settings if it was the current_slave, but that was
-- * already taken care of above when we detached the slave
-- */
-- if (!USES_PRIMARY(bond_mode)) {
-- dev_set_promiscuity(slave, -1);
-+ /* If the mode USES_PRIMARY, then we should only remove its
-+ * promisc and mc settings if it was the curr_active_slave, but that was
-+ * already taken care of above when we detached the slave
-+ */
-+ if (!USES_PRIMARY(bond_mode)) {
-+ /* unset promiscuity level from slave */
-+ if (bond_dev->flags & IFF_PROMISC) {
-+ dev_set_promiscuity(slave_dev, -1);
- }
-- }
-
-- /* undo settings and restore original values */
-- if (multicast_mode == BOND_MULTICAST_ALL) {
-- /* flush master's mc_list from slave */
-- bond_mc_list_flush (slave, master);
-+ /* unset allmulti level from slave */
-+ if (bond_dev->flags & IFF_ALLMULTI) {
-+ dev_set_allmulti(slave_dev, -1);
-+ }
-
-- /* unset allmulti level from slave */
-- if (master->flags & IFF_ALLMULTI)
-- dev_set_allmulti(slave, -1);
-+ /* flush master's mc_list from slave */
-+ bond_mc_list_flush(bond_dev, slave_dev);
- }
-
-- netdev_set_master(slave, NULL);
-+ netdev_set_master(slave_dev, NULL);
-
- /* close slave before restoring its mac address */
-- dev_close(slave);
-+ dev_close(slave_dev);
-
- if (app_abi_ver >= 1) {
- /* restore original ("permanent") mac address */
-- memcpy(addr.sa_data, our_slave->perm_hwaddr, ETH_ALEN);
-- addr.sa_family = slave->type;
-- slave->set_mac_address(slave, &addr);
-+ memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN);
-+ addr.sa_family = slave_dev->type;
-+ slave_dev->set_mac_address(slave_dev, &addr);
- }
-
- /* restore the original state of the
- * IFF_NOARP flag that might have been
- * set by bond_set_slave_inactive_flags()
- */
-- if ((our_slave->original_flags & IFF_NOARP) == 0) {
-- slave->flags &= ~IFF_NOARP;
-+ if ((slave->original_flags & IFF_NOARP) == 0) {
-+ slave_dev->flags &= ~IFF_NOARP;
- }
-
-- kfree(our_slave);
-+ kfree(slave);
-
- /* if the last slave was removed, zero the mac address
- * of the master so it will be set by the application
- * to the mac address of the first slave
- */
-- if (bond->next == (slave_t*)bond) {
-- memset(master->dev_addr, 0, master->addr_len);
-+ if (bond->slave_cnt == 0) {
-+ memset(bond_dev->dev_addr, 0, bond_dev->addr_len);
- }
-
- return 0; /* deletion OK */
- }
-
--/*
-+/*
- * This function releases all slaves.
- */
--static int bond_release_all(struct net_device *master)
-+static int bond_release_all(struct net_device *bond_dev)
- {
-- bonding_t *bond;
-- slave_t *our_slave, *old_current;
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave;
- struct net_device *slave_dev;
- struct sockaddr addr;
-- int err = 0;
--
-- if (master == NULL) {
-- return -ENODEV;
-- }
--
-- if (master->flags & IFF_SLAVE) {
-- return -EINVAL;
-- }
--
-- bond = (struct bonding *) master->priv;
-
- write_lock_bh(&bond->lock);
-- if (bond->next == (struct slave *) bond) {
-- err = -EINVAL;
-+
-+ if (bond->slave_cnt == 0) {
- goto out;
- }
-
-- old_current = bond->current_slave;
-- change_active_interface(bond, NULL);
- bond->current_arp_slave = NULL;
- bond->primary_slave = NULL;
-+ bond_change_active_slave(bond, NULL);
-
-- while ((our_slave = bond->prev) != (slave_t *)bond) {
-+ while ((slave = bond->first_slave) != NULL) {
- /* Inform AD package of unbinding of slave
- * before slave is detached from the list.
- */
- if (bond_mode == BOND_MODE_8023AD) {
-- bond_3ad_unbind_slave(our_slave);
-+ bond_3ad_unbind_slave(slave);
- }
-
-- slave_dev = our_slave->dev;
-- bond_detach_slave(bond, our_slave);
-+ slave_dev = slave->dev;
-+ bond_detach_slave(bond, slave);
-
- if ((bond_mode == BOND_MODE_TLB) ||
- (bond_mode == BOND_MODE_ALB)) {
- /* must be called only after the slave
- * has been detached from the list
- */
-- bond_alb_deinit_slave(bond, our_slave);
-+ bond_alb_deinit_slave(bond, slave);
- }
-
- /* now that the slave is detached, unlock and perform
-@@ -2179,20 +1746,23 @@ static int bond_release_all(struct net_d
- */
- write_unlock_bh(&bond->lock);
-
-- /* unset promiscuity level from slave */
-- if (master->flags & IFF_PROMISC) {
-- if (!USES_PRIMARY(bond_mode)) {
-- dev_set_promiscuity(slave_dev, -1);
-+ /* If the mode USES_PRIMARY, then we should only remove its
-+ * promisc and mc settings if it was the curr_active_slave, but that was
-+ * already taken care of above when we detached the slave
-+ */
-+ if (!USES_PRIMARY(bond_mode)) {
-+ /* unset promiscuity level from slave */
-+ if (bond_dev->flags & IFF_PROMISC) {
-+ dev_set_promiscuity(slave_dev, -1);
-+ }
-+
-+ /* unset allmulti level from slave */
-+ if (bond_dev->flags & IFF_ALLMULTI) {
-+ dev_set_allmulti(slave_dev, -1);
- }
-- }
-
-- if (multicast_mode == BOND_MULTICAST_ALL) {
-- /* flush master's mc_list from slave */
-- bond_mc_list_flush (slave_dev, master);
--
-- /* unset allmulti level from slave */
-- if (master->flags & IFF_ALLMULTI)
-- dev_set_allmulti(slave_dev, -1);
-+ /* flush master's mc_list from slave */
-+ bond_mc_list_flush(bond_dev, slave_dev);
- }
-
- netdev_set_master(slave_dev, NULL);
-@@ -2202,7 +1772,7 @@ static int bond_release_all(struct net_d
-
- if (app_abi_ver >= 1) {
- /* restore original ("permanent") mac address*/
-- memcpy(addr.sa_data, our_slave->perm_hwaddr, ETH_ALEN);
-+ memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN);
- addr.sa_family = slave_dev->type;
- slave_dev->set_mac_address(slave_dev, &addr);
- }
-@@ -2210,11 +1780,11 @@ static int bond_release_all(struct net_d
- /* restore the original state of the IFF_NOARP flag that might have
- * been set by bond_set_slave_inactive_flags()
- */
-- if ((our_slave->original_flags & IFF_NOARP) == 0) {
-+ if ((slave->original_flags & IFF_NOARP) == 0) {
- slave_dev->flags &= ~IFF_NOARP;
- }
-
-- kfree(our_slave);
-+ kfree(slave);
-
- /* re-acquire the lock before getting the next slave */
- write_lock_bh(&bond->lock);
-@@ -2224,72 +1794,234 @@ static int bond_release_all(struct net_d
- * set by the application to the mac address of the
- * first slave
- */
-- memset(master->dev_addr, 0, master->addr_len);
-+ memset(bond_dev->dev_addr, 0, bond_dev->addr_len);
-
-- printk (KERN_INFO "%s: released all slaves\n", master->name);
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: released all slaves\n",
-+ bond_dev->name);
-
- out:
- write_unlock_bh(&bond->lock);
-
-- return err;
-+ return 0;
- }
-
--/* this function is called regularly to monitor each slave's link. */
--static void bond_mii_monitor(struct net_device *master)
--{
-- bonding_t *bond = (struct bonding *) master->priv;
-- slave_t *slave, *oldcurrent;
-- int slave_died = 0;
-- int do_failover = 0;
-+/*
-+ * This function changes the active slave to slave <slave_dev>.
-+ * It returns -EINVAL in the following cases.
-+ * - <slave_dev> is not found in the list.
-+ * - There is not active slave now.
-+ * - <slave_dev> is already active.
-+ * - The link state of <slave_dev> is not BOND_LINK_UP.
-+ * - <slave_dev> is not running.
-+ * In these cases, this fuction does nothing.
-+ * In the other cases, currnt_slave pointer is changed and 0 is returned.
-+ */
-+static int bond_ioctl_change_active(struct net_device *bond_dev, struct net_device *slave_dev)
-+{
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *old_active = NULL;
-+ struct slave *new_active = NULL;
-+ int res = 0;
-+
-+ /* Verify that master_dev is indeed the master of slave_dev */
-+ if (!(slave_dev->flags & IFF_SLAVE) ||
-+ (slave_dev->master != bond_dev)) {
-+ return -EINVAL;
-+ }
-+
-+ write_lock_bh(&bond->lock);
-+
-+ old_active = bond->curr_active_slave;
-+ new_active = bond_get_slave_by_dev(bond, slave_dev);
-+
-+ /*
-+ * Changing to the current active: do nothing; return success.
-+ */
-+ if (new_active && (new_active == old_active)) {
-+ write_unlock_bh(&bond->lock);
-+ return 0;
-+ }
-+
-+ if ((new_active) &&
-+ (old_active) &&
-+ (new_active->link == BOND_LINK_UP) &&
-+ IS_UP(new_active->dev)) {
-+ bond_change_active_slave(bond, new_active);
-+ } else {
-+ res = -EINVAL;
-+ }
-+
-+ write_unlock_bh(&bond->lock);
-+
-+ return res;
-+}
-+
-+static int bond_ethtool_ioctl(struct net_device *bond_dev, struct ifreq *ifr)
-+{
-+ struct ethtool_drvinfo info;
-+ void *addr = ifr->ifr_data;
-+ uint32_t cmd;
-+
-+ if (get_user(cmd, (uint32_t *)addr)) {
-+ return -EFAULT;
-+ }
-+
-+ switch (cmd) {
-+ case ETHTOOL_GDRVINFO:
-+ if (copy_from_user(&info, addr, sizeof(info))) {
-+ return -EFAULT;
-+ }
-+
-+ if (strcmp(info.driver, "ifenslave") == 0) {
-+ int new_abi_ver;
-+ char *endptr;
-+
-+ new_abi_ver = simple_strtoul(info.fw_version,
-+ &endptr, 0);
-+ if (*endptr) {
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: got invalid ABI "
-+ "version from application\n");
-+
-+ return -EINVAL;
-+ }
-+
-+ if (orig_app_abi_ver == -1) {
-+ orig_app_abi_ver = new_abi_ver;
-+ }
-+
-+ app_abi_ver = new_abi_ver;
-+ }
-+
-+ strncpy(info.driver, DRV_NAME, 32);
-+ strncpy(info.version, DRV_VERSION, 32);
-+ snprintf(info.fw_version, 32, "%d", BOND_ABI_VERSION);
-+
-+ if (copy_to_user(addr, &info, sizeof(info))) {
-+ return -EFAULT;
-+ }
-+
-+ return 0;
-+ default:
-+ return -EOPNOTSUPP;
-+ }
-+}
-+
-+static int bond_info_query(struct net_device *bond_dev, struct ifbond *info)
-+{
-+ struct bonding *bond = bond_dev->priv;
-+
-+ info->bond_mode = bond_mode;
-+ info->miimon = miimon;
-+
-+ read_lock_bh(&bond->lock);
-+ info->num_slaves = bond->slave_cnt;
-+ read_unlock_bh(&bond->lock);
-+
-+ return 0;
-+}
-+
-+static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *info)
-+{
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave;
-+ int i, found = 0;
-+
-+ if (info->slave_id < 0) {
-+ return -ENODEV;
-+ }
-+
-+ read_lock_bh(&bond->lock);
-+
-+ bond_for_each_slave(bond, slave, i) {
-+ if (i == (int)info->slave_id) {
-+ found = 1;
-+ break;
-+ }
-+ }
-+
-+ read_unlock_bh(&bond->lock);
-+
-+ if (found) {
-+ strcpy(info->slave_name, slave->dev->name);
-+ info->link = slave->link;
-+ info->state = slave->state;
-+ info->link_failure_count = slave->link_failure_count;
-+ } else {
-+ return -ENODEV;
-+ }
-+
-+ return 0;
-+}
-+
-+/*-------------------------------- Monitoring -------------------------------*/
-+
-+/* this function is called regularly to monitor each slave's link. */
-+static void bond_mii_monitor(struct net_device *bond_dev)
-+{
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave, *oldcurrent;
-+ int do_failover = 0;
-+ int delta_in_ticks = (miimon * HZ) / 1000;
-+ int i;
-
- read_lock(&bond->lock);
-
-+ if (bond->kill_timers) {
-+ goto out;
-+ }
-+
-+ if (bond->slave_cnt == 0) {
-+ goto re_arm;
-+ }
-+
- /* we will try to read the link status of each of our slaves, and
- * set their IFF_RUNNING flag appropriately. For each slave not
- * supporting MII status, we won't do anything so that a user-space
- * program could monitor the link itself if needed.
- */
-
-- slave = (slave_t *)bond;
-+ read_lock(&bond->curr_slave_lock);
-+ oldcurrent = bond->curr_active_slave;
-+ read_unlock(&bond->curr_slave_lock);
-
-- read_lock(&bond->ptrlock);
-- oldcurrent = bond->current_slave;
-- read_unlock(&bond->ptrlock);
--
-- while ((slave = slave->prev) != (slave_t *)bond) {
-- struct net_device *dev = slave->dev;
-+ bond_for_each_slave(bond, slave, i) {
-+ struct net_device *slave_dev = slave->dev;
- int link_state;
- u16 old_speed = slave->speed;
- u8 old_duplex = slave->duplex;
--
-- link_state = bond_check_dev_link(dev, 0);
-+
-+ link_state = bond_check_dev_link(slave_dev, 0);
-
- switch (slave->link) {
- case BOND_LINK_UP: /* the link was up */
- if (link_state == BMSR_LSTATUS) {
- /* link stays up, nothing more to do */
- break;
-- }
-- else { /* link going down */
-+ } else { /* link going down */
- slave->link = BOND_LINK_FAIL;
- slave->delay = downdelay;
-+
- if (slave->link_failure_count < UINT_MAX) {
- slave->link_failure_count++;
- }
-- if (downdelay > 0) {
-- printk (KERN_INFO
-- "%s: link status down for %sinterface "
-- "%s, disabling it in %d ms.\n",
-- master->name,
-- IS_UP(dev)
-- ? ((bond_mode == BOND_MODE_ACTIVEBACKUP)
-- ? ((slave == oldcurrent)
-- ? "active " : "backup ")
-- : "")
-- : "idle ",
-- dev->name,
-- downdelay * miimon);
-- }
-+
-+ if (downdelay) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status down for %s "
-+ "interface %s, disabling it in "
-+ "%d ms.\n",
-+ bond_dev->name,
-+ IS_UP(slave_dev)
-+ ? ((bond_mode == BOND_MODE_ACTIVEBACKUP)
-+ ? ((slave == oldcurrent)
-+ ? "active " : "backup ")
-+ : "")
-+ : "idle ",
-+ slave_dev->name,
-+ downdelay * miimon);
-+ }
- }
- /* no break ! fall through the BOND_LINK_FAIL test to
- ensure proper action to be taken
-@@ -2300,6 +2032,7 @@ static void bond_mii_monitor(struct net_
- if (slave->delay <= 0) {
- /* link down for too long time */
- slave->link = BOND_LINK_DOWN;
-+
- /* in active/backup mode, we must
- * completely disable this interface
- */
-@@ -2308,11 +2041,12 @@ static void bond_mii_monitor(struct net_
- bond_set_slave_inactive_flags(slave);
- }
-
-- printk(KERN_INFO
-- "%s: link status definitely down "
-- "for interface %s, disabling it",
-- master->name,
-- dev->name);
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status definitely "
-+ "down for interface %s, "
-+ "disabling it\n",
-+ bond_dev->name,
-+ slave_dev->name);
-
- /* notify ad that the link status has changed */
- if (bond_mode == BOND_MODE_8023AD) {
-@@ -2327,8 +2061,6 @@ static void bond_mii_monitor(struct net_
- if (slave == oldcurrent) {
- do_failover = 1;
- }
--
-- slave_died = 1;
- } else {
- slave->delay--;
- }
-@@ -2336,12 +2068,12 @@ static void bond_mii_monitor(struct net_
- /* link up again */
- slave->link = BOND_LINK_UP;
- slave->jiffies = jiffies;
-- printk(KERN_INFO
-- "%s: link status up again after %d ms "
-- "for interface %s.\n",
-- master->name,
-- (downdelay - slave->delay) * miimon,
-- dev->name);
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status up again after %d "
-+ "ms for interface %s.\n",
-+ bond_dev->name,
-+ (downdelay - slave->delay) * miimon,
-+ slave_dev->name);
- }
- break;
- case BOND_LINK_DOWN: /* the link was down */
-@@ -2351,16 +2083,17 @@ static void bond_mii_monitor(struct net_
- } else { /* link going up */
- slave->link = BOND_LINK_BACK;
- slave->delay = updelay;
--
-- if (updelay > 0) {
-+
-+ if (updelay) {
- /* if updelay == 0, no need to
- advertise about a 0 ms delay */
-- printk (KERN_INFO
-- "%s: link status up for interface"
-- " %s, enabling it in %d ms.\n",
-- master->name,
-- dev->name,
-- updelay * miimon);
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status up for "
-+ "interface %s, enabling it "
-+ "in %d ms.\n",
-+ bond_dev->name,
-+ slave_dev->name,
-+ updelay * miimon);
- }
- }
- /* no break ! fall through the BOND_LINK_BACK state in
-@@ -2370,12 +2103,13 @@ static void bond_mii_monitor(struct net_
- if (link_state != BMSR_LSTATUS) {
- /* link down again */
- slave->link = BOND_LINK_DOWN;
-- printk(KERN_INFO
-- "%s: link status down again after %d ms "
-- "for interface %s.\n",
-- master->name,
-- (updelay - slave->delay) * miimon,
-- dev->name);
-+
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status down again after %d "
-+ "ms for interface %s.\n",
-+ bond_dev->name,
-+ (updelay - slave->delay) * miimon,
-+ slave_dev->name);
- } else {
- /* link stays up */
- if (slave->delay == 0) {
-@@ -2386,8 +2120,7 @@ static void bond_mii_monitor(struct net_
- if (bond_mode == BOND_MODE_8023AD) {
- /* prevent it from being the active one */
- slave->state = BOND_STATE_BACKUP;
-- }
-- else if (bond_mode != BOND_MODE_ACTIVEBACKUP) {
-+ } else if (bond_mode != BOND_MODE_ACTIVEBACKUP) {
- /* make it immediately active */
- slave->state = BOND_STATE_ACTIVE;
- } else if (slave != bond->primary_slave) {
-@@ -2395,12 +2128,12 @@ static void bond_mii_monitor(struct net_
- slave->state = BOND_STATE_BACKUP;
- }
-
-- printk(KERN_INFO
-- "%s: link status definitely up "
-- "for interface %s.\n",
-- master->name,
-- dev->name);
--
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status definitely "
-+ "up for interface %s.\n",
-+ bond_dev->name,
-+ slave_dev->name);
-+
- /* notify ad that the link status has changed */
- if (bond_mode == BOND_MODE_8023AD) {
- bond_3ad_handle_link_change(slave, BOND_LINK_UP);
-@@ -2411,7 +2144,7 @@ static void bond_mii_monitor(struct net_
- bond_alb_handle_link_change(bond, slave, BOND_LINK_UP);
- }
-
-- if ((oldcurrent == NULL) ||
-+ if ((!oldcurrent) ||
- (slave == bond->primary_slave)) {
- do_failover = 1;
- }
-@@ -2420,7 +2153,12 @@ static void bond_mii_monitor(struct net_
- }
- }
- break;
-- } /* end of switch */
-+ default:
-+ /* Should not happen */
-+ printk(KERN_ERR "bonding: Error: %s Illegal value (link=%d)\n",
-+ slave->dev->name, slave->link);
-+ goto out;
-+ } /* end of switch (slave->link) */
-
- bond_update_speed_duplex(slave);
-
-@@ -2428,112 +2166,110 @@ static void bond_mii_monitor(struct net_
- if (old_speed != slave->speed) {
- bond_3ad_adapter_speed_changed(slave);
- }
-+
- if (old_duplex != slave->duplex) {
- bond_3ad_adapter_duplex_changed(slave);
- }
- }
-
-- } /* end of while */
-+ } /* end of for */
-
- if (do_failover) {
-- write_lock(&bond->ptrlock);
-+ write_lock(&bond->curr_slave_lock);
-+
-+ bond_select_active_slave(bond);
-
-- reselect_active_interface(bond);
-- if (oldcurrent && !bond->current_slave) {
-- printk(KERN_INFO
-- "%s: now running without any active interface !\n",
-- master->name);
-+ if (oldcurrent && !bond->curr_active_slave) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: now running without any active "
-+ "interface !\n",
-+ bond_dev->name);
- }
-
-- write_unlock(&bond->ptrlock);
-+ write_unlock(&bond->curr_slave_lock);
- }
-
-+re_arm:
-+ mod_timer(&bond->mii_timer, jiffies + delta_in_ticks);
-+out:
- read_unlock(&bond->lock);
-- /* re-arm the timer */
-- mod_timer(&bond->mii_timer, jiffies + (miimon * HZ / 1000));
- }
-
--/*
-- * this function is called regularly to monitor each slave's link
-+static void bond_arp_send_all(struct slave *slave)
-+{
-+ int i;
-+
-+ for (i = 0; (i<MAX_ARP_IP_TARGETS) && arp_target[i]; i++) {
-+ arp_send(ARPOP_REQUEST, ETH_P_ARP, arp_target[i], slave->dev,
-+ my_ip, NULL, slave->dev->dev_addr,
-+ NULL);
-+ }
-+}
-+
-+/*
-+ * this function is called regularly to monitor each slave's link
- * ensuring that traffic is being sent and received when arp monitoring
-- * is used in load-balancing mode. if the adapter has been dormant, then an
-- * arp is transmitted to generate traffic. see activebackup_arp_monitor for
-- * arp monitoring in active backup mode.
-+ * is used in load-balancing mode. if the adapter has been dormant, then an
-+ * arp is transmitted to generate traffic. see activebackup_arp_monitor for
-+ * arp monitoring in active backup mode.
- */
--static void loadbalance_arp_monitor(struct net_device *master)
-+static void bond_loadbalance_arp_mon(struct net_device *bond_dev)
- {
-- bonding_t *bond;
-- slave_t *slave, *oldcurrent;
-- int the_delta_in_ticks = arp_interval * HZ / 1000;
-- int next_timer = jiffies + (arp_interval * HZ / 1000);
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave, *oldcurrent;
- int do_failover = 0;
-+ int delta_in_ticks = (arp_interval * HZ) / 1000;
-+ int i;
-
-- bond = (struct bonding *) master->priv;
-- if (master->priv == NULL) {
-- mod_timer(&bond->arp_timer, next_timer);
-- return;
-- }
-+ read_lock(&bond->lock);
-
-- /* TODO: investigate why rtnl_shlock_nowait and rtnl_exlock_nowait
-- * are called below and add comment why they are required...
-- */
-- if ((!IS_UP(master)) || rtnl_shlock_nowait()) {
-- mod_timer(&bond->arp_timer, next_timer);
-- return;
-+ if (bond->kill_timers) {
-+ goto out;
- }
-
-- if (rtnl_exlock_nowait()) {
-- rtnl_shunlock();
-- mod_timer(&bond->arp_timer, next_timer);
-- return;
-+ if (bond->slave_cnt == 0) {
-+ goto re_arm;
- }
-
-- read_lock(&bond->lock);
--
-- read_lock(&bond->ptrlock);
-- oldcurrent = bond->current_slave;
-- read_unlock(&bond->ptrlock);
-+ read_lock(&bond->curr_slave_lock);
-+ oldcurrent = bond->curr_active_slave;
-+ read_unlock(&bond->curr_slave_lock);
-
- /* see if any of the previous devices are up now (i.e. they have
-- * xmt and rcv traffic). the current_slave does not come into
-+ * xmt and rcv traffic). the curr_active_slave does not come into
- * the picture unless it is null. also, slave->jiffies is not needed
- * here because we send an arp on each slave and give a slave as
- * long as it needs to get the tx/rx within the delta.
- * TODO: what about up/down delay in arp mode? it wasn't here before
-- * so it can wait
-+ * so it can wait
- */
-- slave = (slave_t *)bond;
-- while ((slave = slave->prev) != (slave_t *)bond) {
--
-- if (slave->link != BOND_LINK_UP) {
--
-- if (((jiffies - slave->dev->trans_start) <=
-- the_delta_in_ticks) &&
-- ((jiffies - slave->dev->last_rx) <=
-- the_delta_in_ticks)) {
-+ bond_for_each_slave(bond, slave, i) {
-+ if (slave->link != BOND_LINK_UP) {
-+ if (((jiffies - slave->dev->trans_start) <= delta_in_ticks) &&
-+ ((jiffies - slave->dev->last_rx) <= delta_in_ticks)) {
-
- slave->link = BOND_LINK_UP;
- slave->state = BOND_STATE_ACTIVE;
-
- /* primary_slave has no meaning in round-robin
-- * mode. the window of a slave being up and
-- * current_slave being null after enslaving
-+ * mode. the window of a slave being up and
-+ * curr_active_slave being null after enslaving
- * is closed.
- */
-- if (oldcurrent == NULL) {
-- printk(KERN_INFO
-- "%s: link status definitely up "
-- "for interface %s, ",
-- master->name,
-- slave->dev->name);
-+ if (!oldcurrent) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status definitely "
-+ "up for interface %s, ",
-+ bond_dev->name,
-+ slave->dev->name);
- do_failover = 1;
- } else {
-- printk(KERN_INFO
-- "%s: interface %s is now up\n",
-- master->name,
-- slave->dev->name);
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: interface %s is now up\n",
-+ bond_dev->name,
-+ slave->dev->name);
- }
-- }
-+ }
- } else {
- /* slave->link == BOND_LINK_UP */
-
-@@ -2541,224 +2277,233 @@ static void loadbalance_arp_monitor(stru
- * when the source ip is 0, so don't take the link down
- * if we don't know our ip yet
- */
-- if (((jiffies - slave->dev->trans_start) >=
-- (2*the_delta_in_ticks)) ||
-- (((jiffies - slave->dev->last_rx) >=
-- (2*the_delta_in_ticks)) && my_ip !=0)) {
-+ if (((jiffies - slave->dev->trans_start) >= (2*delta_in_ticks)) ||
-+ (((jiffies - slave->dev->last_rx) >= (2*delta_in_ticks)) &&
-+ my_ip)) {
-+
- slave->link = BOND_LINK_DOWN;
- slave->state = BOND_STATE_BACKUP;
-+
- if (slave->link_failure_count < UINT_MAX) {
- slave->link_failure_count++;
- }
-- printk(KERN_INFO
-- "%s: interface %s is now down.\n",
-- master->name,
-+
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: interface %s is now down.\n",
-+ bond_dev->name,
- slave->dev->name);
-
- if (slave == oldcurrent) {
- do_failover = 1;
- }
- }
-- }
-+ }
-
-- /* note: if switch is in round-robin mode, all links
-+ /* note: if switch is in round-robin mode, all links
- * must tx arp to ensure all links rx an arp - otherwise
-- * links may oscillate or not come up at all; if switch is
-- * in something like xor mode, there is nothing we can
-- * do - all replies will be rx'ed on same link causing slaves
-+ * links may oscillate or not come up at all; if switch is
-+ * in something like xor mode, there is nothing we can
-+ * do - all replies will be rx'ed on same link causing slaves
- * to be unstable during low/no traffic periods
- */
- if (IS_UP(slave->dev)) {
-- arp_send_all(slave);
-+ bond_arp_send_all(slave);
- }
- }
-
- if (do_failover) {
-- write_lock(&bond->ptrlock);
-+ write_lock(&bond->curr_slave_lock);
-
-- reselect_active_interface(bond);
-- if (oldcurrent && !bond->current_slave) {
-- printk(KERN_INFO
-- "%s: now running without any active interface !\n",
-- master->name);
-+ bond_select_active_slave(bond);
-+
-+ if (oldcurrent && !bond->curr_active_slave) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: now running without any active "
-+ "interface !\n",
-+ bond_dev->name);
- }
-
-- write_unlock(&bond->ptrlock);
-+ write_unlock(&bond->curr_slave_lock);
- }
-
-+re_arm:
-+ mod_timer(&bond->arp_timer, jiffies + delta_in_ticks);
-+out:
- read_unlock(&bond->lock);
-- rtnl_exunlock();
-- rtnl_shunlock();
--
-- /* re-arm the timer */
-- mod_timer(&bond->arp_timer, next_timer);
- }
-
--/*
-+/*
- * When using arp monitoring in active-backup mode, this function is
- * called to determine if any backup slaves have went down or a new
- * current slave needs to be found.
-- * The backup slaves never generate traffic, they are considered up by merely
-- * receiving traffic. If the current slave goes down, each backup slave will
-- * be given the opportunity to tx/rx an arp before being taken down - this
-- * prevents all slaves from being taken down due to the current slave not
-+ * The backup slaves never generate traffic, they are considered up by merely
-+ * receiving traffic. If the current slave goes down, each backup slave will
-+ * be given the opportunity to tx/rx an arp before being taken down - this
-+ * prevents all slaves from being taken down due to the current slave not
- * sending any traffic for the backups to receive. The arps are not necessarily
-- * necessary, any tx and rx traffic will keep the current slave up. While any
-- * rx traffic will keep the backup slaves up, the current slave is responsible
-- * for generating traffic to keep them up regardless of any other traffic they
-+ * necessary, any tx and rx traffic will keep the current slave up. While any
-+ * rx traffic will keep the backup slaves up, the current slave is responsible
-+ * for generating traffic to keep them up regardless of any other traffic they
- * may have received.
- * see loadbalance_arp_monitor for arp monitoring in load balancing mode
- */
--static void activebackup_arp_monitor(struct net_device *master)
-+static void bond_activebackup_arp_mon(struct net_device *bond_dev)
- {
-- bonding_t *bond;
-- slave_t *slave;
-- int the_delta_in_ticks = arp_interval * HZ / 1000;
-- int next_timer = jiffies + (arp_interval * HZ / 1000);
--
-- bond = (struct bonding *) master->priv;
-- if (master->priv == NULL) {
-- mod_timer(&bond->arp_timer, next_timer);
-- return;
-- }
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave;
-+ int delta_in_ticks = (arp_interval * HZ) / 1000;
-+ int i;
-
-- if (!IS_UP(master)) {
-- mod_timer(&bond->arp_timer, next_timer);
-- return;
-+ read_lock(&bond->lock);
-+
-+ if (bond->kill_timers) {
-+ goto out;
- }
-
-- read_lock(&bond->lock);
-+ if (bond->slave_cnt == 0) {
-+ goto re_arm;
-+ }
-
-- /* determine if any slave has come up or any backup slave has
-- * gone down
-+ /* determine if any slave has come up or any backup slave has
-+ * gone down
- * TODO: what about up/down delay in arp mode? it wasn't here before
-- * so it can wait
-+ * so it can wait
- */
-- slave = (slave_t *)bond;
-- while ((slave = slave->prev) != (slave_t *)bond) {
--
-- if (slave->link != BOND_LINK_UP) {
-- if ((jiffies - slave->dev->last_rx) <=
-- the_delta_in_ticks) {
-+ bond_for_each_slave(bond, slave, i) {
-+ if (slave->link != BOND_LINK_UP) {
-+ if ((jiffies - slave->dev->last_rx) <= delta_in_ticks) {
-
- slave->link = BOND_LINK_UP;
-- write_lock(&bond->ptrlock);
-- if ((bond->current_slave == NULL) &&
-- ((jiffies - slave->dev->trans_start) <=
-- the_delta_in_ticks)) {
-- change_active_interface(bond, slave);
-+
-+ write_lock(&bond->curr_slave_lock);
-+
-+ if ((!bond->curr_active_slave) &&
-+ ((jiffies - slave->dev->trans_start) <= delta_in_ticks)) {
-+ bond_change_active_slave(bond, slave);
- bond->current_arp_slave = NULL;
-- } else if (bond->current_slave != slave) {
-- /* this slave has just come up but we
-+ } else if (bond->curr_active_slave != slave) {
-+ /* this slave has just come up but we
- * already have a current slave; this
- * can also happen if bond_enslave adds
-- * a new slave that is up while we are
-+ * a new slave that is up while we are
- * searching for a new slave
- */
- bond_set_slave_inactive_flags(slave);
- bond->current_arp_slave = NULL;
- }
-
-- if (slave == bond->current_slave) {
-- printk(KERN_INFO
-- "%s: %s is up and now the "
-- "active interface\n",
-- master->name,
-- slave->dev->name);
-+ if (slave == bond->curr_active_slave) {
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: %s is up and now the "
-+ "active interface\n",
-+ bond_dev->name,
-+ slave->dev->name);
- } else {
-- printk(KERN_INFO
-- "%s: backup interface %s is "
-- "now up\n",
-- master->name,
-- slave->dev->name);
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: backup interface %s is "
-+ "now up\n",
-+ bond_dev->name,
-+ slave->dev->name);
- }
-
-- write_unlock(&bond->ptrlock);
-+ write_unlock(&bond->curr_slave_lock);
- }
- } else {
-- read_lock(&bond->ptrlock);
-- if ((slave != bond->current_slave) &&
-- (bond->current_arp_slave == NULL) &&
-- (((jiffies - slave->dev->last_rx) >=
-- 3*the_delta_in_ticks) && (my_ip != 0))) {
-- /* a backup slave has gone down; three times
-- * the delta allows the current slave to be
-+ read_lock(&bond->curr_slave_lock);
-+
-+ if ((slave != bond->curr_active_slave) &&
-+ (!bond->current_arp_slave) &&
-+ (((jiffies - slave->dev->last_rx) >= 3*delta_in_ticks) &&
-+ my_ip)) {
-+ /* a backup slave has gone down; three times
-+ * the delta allows the current slave to be
- * taken out before the backup slave.
- * note: a non-null current_arp_slave indicates
-- * the current_slave went down and we are
-- * searching for a new one; under this
-- * condition we only take the current_slave
-- * down - this gives each slave a chance to
-+ * the curr_active_slave went down and we are
-+ * searching for a new one; under this
-+ * condition we only take the curr_active_slave
-+ * down - this gives each slave a chance to
- * tx/rx traffic before being taken out
- */
-- read_unlock(&bond->ptrlock);
-+
-+ read_unlock(&bond->curr_slave_lock);
-+
- slave->link = BOND_LINK_DOWN;
-+
- if (slave->link_failure_count < UINT_MAX) {
- slave->link_failure_count++;
- }
-+
- bond_set_slave_inactive_flags(slave);
-- printk(KERN_INFO
-- "%s: backup interface %s is now down\n",
-- master->name,
-- slave->dev->name);
-+
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: backup interface %s is now down\n",
-+ bond_dev->name,
-+ slave->dev->name);
- } else {
-- read_unlock(&bond->ptrlock);
-+ read_unlock(&bond->curr_slave_lock);
- }
- }
- }
-
-- read_lock(&bond->ptrlock);
-- slave = bond->current_slave;
-- read_unlock(&bond->ptrlock);
--
-- if (slave != NULL) {
-+ read_lock(&bond->curr_slave_lock);
-+ slave = bond->curr_active_slave;
-+ read_unlock(&bond->curr_slave_lock);
-
-+ if (slave) {
- /* if we have sent traffic in the past 2*arp_intervals but
-- * haven't xmit and rx traffic in that time interval, select
-+ * haven't xmit and rx traffic in that time interval, select
- * a different slave. slave->jiffies is only updated when
-- * a slave first becomes the current_slave - not necessarily
-- * after every arp; this ensures the slave has a full 2*delta
-- * before being taken out. if a primary is being used, check
-- * if it is up and needs to take over as the current_slave
-+ * a slave first becomes the curr_active_slave - not necessarily
-+ * after every arp; this ensures the slave has a full 2*delta
-+ * before being taken out. if a primary is being used, check
-+ * if it is up and needs to take over as the curr_active_slave
- */
-- if ((((jiffies - slave->dev->trans_start) >=
-- (2*the_delta_in_ticks)) ||
-- (((jiffies - slave->dev->last_rx) >=
-- (2*the_delta_in_ticks)) && (my_ip != 0))) &&
-- ((jiffies - slave->jiffies) >= 2*the_delta_in_ticks)) {
-+ if ((((jiffies - slave->dev->trans_start) >= (2*delta_in_ticks)) ||
-+ (((jiffies - slave->dev->last_rx) >= (2*delta_in_ticks)) &&
-+ my_ip)) &&
-+ ((jiffies - slave->jiffies) >= 2*delta_in_ticks)) {
-
- slave->link = BOND_LINK_DOWN;
-+
- if (slave->link_failure_count < UINT_MAX) {
- slave->link_failure_count++;
- }
-- printk(KERN_INFO "%s: link status down for "
-- "active interface %s, disabling it",
-- master->name,
-+
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: link status down for active interface "
-+ "%s, disabling it\n",
-+ bond_dev->name,
- slave->dev->name);
-- write_lock(&bond->ptrlock);
-- reselect_active_interface(bond);
-- slave = bond->current_slave;
-- write_unlock(&bond->ptrlock);
-+
-+ write_lock(&bond->curr_slave_lock);
-+
-+ bond_select_active_slave(bond);
-+ slave = bond->curr_active_slave;
-+
-+ write_unlock(&bond->curr_slave_lock);
-+
- bond->current_arp_slave = slave;
-- if (slave != NULL) {
-+
-+ if (slave) {
- slave->jiffies = jiffies;
- }
--
-- } else if ((bond->primary_slave != NULL) &&
-- (bond->primary_slave != slave) &&
-+ } else if ((bond->primary_slave) &&
-+ (bond->primary_slave != slave) &&
- (bond->primary_slave->link == BOND_LINK_UP)) {
-- /* at this point, slave is the current_slave */
-- printk(KERN_INFO
-- "%s: changing from interface %s to primary "
-+ /* at this point, slave is the curr_active_slave */
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: changing from interface %s to primary "
- "interface %s\n",
-- master->name,
-- slave->dev->name,
-+ bond_dev->name,
-+ slave->dev->name,
- bond->primary_slave->dev->name);
--
-+
- /* primary is up so switch to it */
-- write_lock(&bond->ptrlock);
-- change_active_interface(bond, bond->primary_slave);
-- write_unlock(&bond->ptrlock);
-+ write_lock(&bond->curr_slave_lock);
-+ bond_change_active_slave(bond, bond->primary_slave);
-+ write_unlock(&bond->curr_slave_lock);
-+
- slave = bond->primary_slave;
- slave->jiffies = jiffies;
- } else {
-@@ -2768,567 +2513,606 @@ static void activebackup_arp_monitor(str
- /* the current slave must tx an arp to ensure backup slaves
- * rx traffic
- */
-- if ((slave != NULL) && (my_ip != 0)) {
-- arp_send_all(slave);
-+ if (slave && my_ip) {
-+ bond_arp_send_all(slave);
- }
- }
-
-- /* if we don't have a current_slave, search for the next available
-- * backup slave from the current_arp_slave and make it the candidate
-- * for becoming the current_slave
-+ /* if we don't have a curr_active_slave, search for the next available
-+ * backup slave from the current_arp_slave and make it the candidate
-+ * for becoming the curr_active_slave
- */
-- if (slave == NULL) {
--
-- if ((bond->current_arp_slave == NULL) ||
-- (bond->current_arp_slave == (slave_t *)bond)) {
-- bond->current_arp_slave = bond->prev;
-- }
-+ if (!slave) {
-+ if (!bond->current_arp_slave) {
-+ bond->current_arp_slave = bond->first_slave;
-+ }
-
-- if (bond->current_arp_slave != (slave_t *)bond) {
-+ if (bond->current_arp_slave) {
- bond_set_slave_inactive_flags(bond->current_arp_slave);
-- slave = bond->current_arp_slave->next;
-
- /* search for next candidate */
-- do {
-+ bond_for_each_slave_from(bond, slave, i, bond->current_arp_slave) {
- if (IS_UP(slave->dev)) {
- slave->link = BOND_LINK_BACK;
- bond_set_slave_active_flags(slave);
-- arp_send_all(slave);
-+ bond_arp_send_all(slave);
- slave->jiffies = jiffies;
- bond->current_arp_slave = slave;
- break;
- }
-
-- /* if the link state is up at this point, we
-- * mark it down - this can happen if we have
-- * simultaneous link failures and
-- * reselect_active_interface doesn't make this
-- * one the current slave so it is still marked
-+ /* if the link state is up at this point, we
-+ * mark it down - this can happen if we have
-+ * simultaneous link failures and
-+ * reselect_active_interface doesn't make this
-+ * one the current slave so it is still marked
- * up when it is actually down
- */
- if (slave->link == BOND_LINK_UP) {
- slave->link = BOND_LINK_DOWN;
-- if (slave->link_failure_count <
-- UINT_MAX) {
-+ if (slave->link_failure_count < UINT_MAX) {
- slave->link_failure_count++;
- }
-
- bond_set_slave_inactive_flags(slave);
-- printk(KERN_INFO
-- "%s: backup interface "
-- "%s is now down.\n",
-- master->name,
-- slave->dev->name);
-+
-+ printk(KERN_INFO DRV_NAME
-+ ": %s: backup interface %s is "
-+ "now down.\n",
-+ bond_dev->name,
-+ slave->dev->name);
- }
-- } while ((slave = slave->next) !=
-- bond->current_arp_slave->next);
-+ }
- }
- }
-
-+re_arm:
-+ mod_timer(&bond->arp_timer, jiffies + delta_in_ticks);
-+out:
- read_unlock(&bond->lock);
-- mod_timer(&bond->arp_timer, next_timer);
- }
-
--static int bond_sethwaddr(struct net_device *master, struct net_device *slave)
--{
--#ifdef BONDING_DEBUG
-- printk(KERN_CRIT "bond_sethwaddr: master=%x\n", (unsigned int)master);
-- printk(KERN_CRIT "bond_sethwaddr: slave=%x\n", (unsigned int)slave);
-- printk(KERN_CRIT "bond_sethwaddr: slave->addr_len=%d\n", slave->addr_len);
--#endif
-- memcpy(master->dev_addr, slave->dev_addr, slave->addr_len);
-- return 0;
--}
-+/*------------------------------ proc/seq_file-------------------------------*/
-
--static int bond_info_query(struct net_device *master, struct ifbond *info)
--{
-- bonding_t *bond = (struct bonding *) master->priv;
-- slave_t *slave;
-+#ifdef CONFIG_PROC_FS
-
-- info->bond_mode = bond_mode;
-- info->num_slaves = 0;
-- info->miimon = miimon;
-+#define SEQ_START_TOKEN ((void *)1)
-+
-+static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos)
-+{
-+ struct bonding *bond = seq->private;
-+ loff_t off = 0;
-+ struct slave *slave;
-+ int i;
-
-+ /* make sure the bond won't be taken away */
-+ read_lock(&dev_base_lock);
- read_lock_bh(&bond->lock);
-- for (slave = bond->prev; slave != (slave_t *)bond; slave = slave->prev) {
-- info->num_slaves++;
-+
-+ if (*pos == 0) {
-+ return SEQ_START_TOKEN;
- }
-- read_unlock_bh(&bond->lock);
-
-- return 0;
-+ bond_for_each_slave(bond, slave, i) {
-+ if (++off == *pos) {
-+ return slave;
-+ }
-+ }
-+
-+ return NULL;
- }
-
--static int bond_slave_info_query(struct net_device *master,
-- struct ifslave *info)
-+static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos)
- {
-- bonding_t *bond = (struct bonding *) master->priv;
-- slave_t *slave;
-- int cur_ndx = 0;
--
-- if (info->slave_id < 0) {
-- return -ENODEV;
-- }
-+ struct bonding *bond = seq->private;
-+ struct slave *slave = v;
-
-- read_lock_bh(&bond->lock);
-- for (slave = bond->prev;
-- slave != (slave_t *)bond && cur_ndx < info->slave_id;
-- slave = slave->prev) {
-- cur_ndx++;
-+ ++*pos;
-+ if (v == SEQ_START_TOKEN) {
-+ return bond->first_slave;
- }
-- read_unlock_bh(&bond->lock);
-
-- if (slave != (slave_t *)bond) {
-- strcpy(info->slave_name, slave->dev->name);
-- info->link = slave->link;
-- info->state = slave->state;
-- info->link_failure_count = slave->link_failure_count;
-- } else {
-- return -ENODEV;
-- }
-+ slave = slave->next;
-
-- return 0;
-+ return (slave == bond->first_slave) ? NULL : slave;
- }
-
--static int bond_ethtool_ioctl(struct net_device *master_dev, struct ifreq *ifr)
-+static void bond_info_seq_stop(struct seq_file *seq, void *v)
- {
-- void *addr = ifr->ifr_data;
-- uint32_t cmd;
-+ struct bonding *bond = seq->private;
-
-- if (get_user(cmd, (uint32_t *) addr))
-- return -EFAULT;
-+ read_unlock_bh(&bond->lock);
-+ read_unlock(&dev_base_lock);
-+}
-
-- switch (cmd) {
-+static void bond_info_show_master(struct seq_file *seq, struct bonding *bond)
-+{
-+ struct slave *curr;
-
-- case ETHTOOL_GDRVINFO:
-- {
-- struct ethtool_drvinfo info;
-- char *endptr;
-+ read_lock(&bond->curr_slave_lock);
-+ curr = bond->curr_active_slave;
-+ read_unlock(&bond->curr_slave_lock);
-
-- if (copy_from_user(&info, addr, sizeof(info)))
-- return -EFAULT;
-+ seq_printf(seq, "Bonding Mode: %s\n", bond_mode_name());
-
-- if (strcmp(info.driver, "ifenslave") == 0) {
-- int new_abi_ver;
-+ if (USES_PRIMARY(bond_mode)) {
-+ if (curr) {
-+ seq_printf(seq,
-+ "Currently Active Slave: %s\n",
-+ curr->dev->name);
-+ }
-+ }
-
-- new_abi_ver = simple_strtoul(info.fw_version,
-- &endptr, 0);
-- if (*endptr) {
-- printk(KERN_ERR
-- "bonding: Error: got invalid ABI"
-- " version from application\n");
-+ seq_printf(seq, "MII Status: %s\n", (curr) ? "up" : "down");
-+ seq_printf(seq, "MII Polling Interval (ms): %d\n", miimon);
-+ seq_printf(seq, "Up Delay (ms): %d\n", updelay * miimon);
-+ seq_printf(seq, "Down Delay (ms): %d\n", downdelay * miimon);
-
-- return -EINVAL;
-- }
-+ if (bond_mode == BOND_MODE_8023AD) {
-+ struct ad_info ad_info;
-
-- if (orig_app_abi_ver == -1) {
-- orig_app_abi_ver = new_abi_ver;
-- }
-+ seq_puts(seq, "\n802.3ad info\n");
-
-- app_abi_ver = new_abi_ver;
-- }
-+ if (bond_3ad_get_active_agg_info(bond, &ad_info)) {
-+ seq_printf(seq, "bond %s has no active aggregator\n",
-+ bond->dev->name);
-+ } else {
-+ seq_printf(seq, "Active Aggregator Info:\n");
-
-- strncpy(info.driver, DRV_NAME, 32);
-- strncpy(info.version, DRV_VERSION, 32);
-- snprintf(info.fw_version, 32, "%d", BOND_ABI_VERSION);
-+ seq_printf(seq, "\tAggregator ID: %d\n",
-+ ad_info.aggregator_id);
-+ seq_printf(seq, "\tNumber of ports: %d\n",
-+ ad_info.ports);
-+ seq_printf(seq, "\tActor Key: %d\n",
-+ ad_info.actor_key);
-+ seq_printf(seq, "\tPartner Key: %d\n",
-+ ad_info.partner_key);
-+ seq_printf(seq, "\tPartner Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\n",
-+ ad_info.partner_system[0],
-+ ad_info.partner_system[1],
-+ ad_info.partner_system[2],
-+ ad_info.partner_system[3],
-+ ad_info.partner_system[4],
-+ ad_info.partner_system[5]);
-+ }
-+ }
-+}
-
-- if (copy_to_user(addr, &info, sizeof(info)))
-- return -EFAULT;
-+static void bond_info_show_slave(struct seq_file *seq, const struct slave *slave)
-+{
-+ seq_printf(seq, "\nSlave Interface: %s\n", slave->dev->name);
-+ seq_printf(seq, "MII Status: %s\n",
-+ (slave->link == BOND_LINK_UP) ? "up" : "down");
-+ seq_printf(seq, "Link Failure Count: %d\n",
-+ slave->link_failure_count);
-+
-+ if (app_abi_ver >= 1) {
-+ seq_printf(seq,
-+ "Permanent HW addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
-+ slave->perm_hwaddr[0],
-+ slave->perm_hwaddr[1],
-+ slave->perm_hwaddr[2],
-+ slave->perm_hwaddr[3],
-+ slave->perm_hwaddr[4],
-+ slave->perm_hwaddr[5]);
-+ }
-
-- return 0;
-+ if (bond_mode == BOND_MODE_8023AD) {
-+ const struct aggregator *agg
-+ = SLAVE_AD_INFO(slave).port.aggregator;
-+
-+ if (agg) {
-+ seq_printf(seq, "Aggregator ID: %d\n",
-+ agg->aggregator_identifier);
-+ } else {
-+ seq_puts(seq, "Aggregator ID: N/A\n");
- }
-- break;
-- default:
-- return -EOPNOTSUPP;
- }
- }
-
--static int bond_ioctl(struct net_device *master_dev, struct ifreq *ifr, int cmd)
-+static int bond_info_seq_show(struct seq_file *seq, void *v)
- {
-- struct net_device *slave_dev = NULL;
-- struct ifbond *u_binfo = NULL, k_binfo;
-- struct ifslave *u_sinfo = NULL, k_sinfo;
-- struct mii_ioctl_data *mii = NULL;
-- int prev_abi_ver = orig_app_abi_ver;
-- int ret = 0;
-+ if (v == SEQ_START_TOKEN) {
-+ seq_printf(seq, "%s\n", version);
-+ bond_info_show_master(seq, seq->private);
-+ } else {
-+ bond_info_show_slave(seq, v);
-+ }
-
--#ifdef BONDING_DEBUG
-- printk(KERN_INFO "bond_ioctl: master=%s, cmd=%d\n",
-- master_dev->name, cmd);
--#endif
-+ return 0;
-+}
-
-- switch (cmd) {
-- case SIOCETHTOOL:
-- return bond_ethtool_ioctl(master_dev, ifr);
-+static struct seq_operations bond_info_seq_ops = {
-+ .start = bond_info_seq_start,
-+ .next = bond_info_seq_next,
-+ .stop = bond_info_seq_stop,
-+ .show = bond_info_seq_show,
-+};
-
-- case SIOCGMIIPHY:
-- mii = (struct mii_ioctl_data *)&ifr->ifr_data;
-- if (mii == NULL) {
-- return -EINVAL;
-- }
-- mii->phy_id = 0;
-- /* Fall Through */
-- case SIOCGMIIREG:
-- /*
-- * We do this again just in case we were called by SIOCGMIIREG
-- * instead of SIOCGMIIPHY.
-- */
-- mii = (struct mii_ioctl_data *)&ifr->ifr_data;
-- if (mii == NULL) {
-- return -EINVAL;
-- }
-- if (mii->reg_num == 1) {
-- mii->val_out = bond_check_mii_link(
-- (struct bonding *)master_dev->priv);
-- }
-- return 0;
-- case BOND_INFO_QUERY_OLD:
-- case SIOCBONDINFOQUERY:
-- u_binfo = (struct ifbond *)ifr->ifr_data;
-- if (copy_from_user(&k_binfo, u_binfo, sizeof(ifbond))) {
-- return -EFAULT;
-- }
-- ret = bond_info_query(master_dev, &k_binfo);
-- if (ret == 0) {
-- if (copy_to_user(u_binfo, &k_binfo, sizeof(ifbond))) {
-- return -EFAULT;
-- }
-+static int bond_info_open(struct inode *inode, struct file *file)
-+{
-+ struct seq_file *seq;
-+ struct proc_dir_entry *proc;
-+ int res;
-+
-+ res = seq_open(file, &bond_info_seq_ops);
-+ if (!res) {
-+ /* recover the pointer buried in proc_dir_entry data */
-+ seq = file->private_data;
-+ proc = PDE(inode);
-+ seq->private = proc->data;
-+ }
-+
-+ return res;
-+}
-+
-+static struct file_operations bond_info_fops = {
-+ .owner = THIS_MODULE,
-+ .open = bond_info_open,
-+ .read = seq_read,
-+ .llseek = seq_lseek,
-+ .release = seq_release,
-+};
-+
-+static int bond_create_proc_entry(struct bonding *bond)
-+{
-+ struct net_device *bond_dev = bond->dev;
-+
-+ if (bond_proc_dir) {
-+ bond->proc_entry = create_proc_entry(bond_dev->name,
-+ S_IRUGO,
-+ bond_proc_dir);
-+ if (bond->proc_entry == NULL) {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: Cannot create /proc/net/%s/%s\n",
-+ DRV_NAME, bond_dev->name);
-+ } else {
-+ bond->proc_entry->data = bond;
-+ bond->proc_entry->proc_fops = &bond_info_fops;
-+ bond->proc_entry->owner = THIS_MODULE;
-+ memcpy(bond->proc_file_name, bond_dev->name, IFNAMSIZ);
- }
-- return ret;
-- case BOND_SLAVE_INFO_QUERY_OLD:
-- case SIOCBONDSLAVEINFOQUERY:
-- u_sinfo = (struct ifslave *)ifr->ifr_data;
-- if (copy_from_user(&k_sinfo, u_sinfo, sizeof(ifslave))) {
-- return -EFAULT;
-+ }
-+
-+ return 0;
-+}
-+
-+static void bond_remove_proc_entry(struct bonding *bond)
-+{
-+ if (bond_proc_dir && bond->proc_entry) {
-+ remove_proc_entry(bond->proc_file_name, bond_proc_dir);
-+ memset(bond->proc_file_name, 0, IFNAMSIZ);
-+ bond->proc_entry = NULL;
-+ }
-+}
-+
-+/* Create the bonding directory under /proc/net, if doesn't exist yet.
-+ * Caller must hold rtnl_lock.
-+ */
-+static void bond_create_proc_dir(void)
-+{
-+ int len = strlen(DRV_NAME);
-+
-+ for (bond_proc_dir = proc_net->subdir; bond_proc_dir;
-+ bond_proc_dir = bond_proc_dir->next) {
-+ if ((bond_proc_dir->namelen == len) &&
-+ !memcmp(bond_proc_dir->name, DRV_NAME, len)) {
-+ break;
- }
-- ret = bond_slave_info_query(master_dev, &k_sinfo);
-- if (ret == 0) {
-- if (copy_to_user(u_sinfo, &k_sinfo, sizeof(ifslave))) {
-- return -EFAULT;
-- }
-+ }
-+
-+ if (!bond_proc_dir) {
-+ bond_proc_dir = proc_mkdir(DRV_NAME, proc_net);
-+ if (bond_proc_dir) {
-+ bond_proc_dir->owner = THIS_MODULE;
-+ } else {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: cannot create /proc/net/%s\n",
-+ DRV_NAME);
- }
-- return ret;
- }
-+}
-
-- if (!capable(CAP_NET_ADMIN)) {
-- return -EPERM;
-+/* Destroy the bonding directory under /proc/net, if empty.
-+ * Caller must hold rtnl_lock.
-+ */
-+static void bond_destroy_proc_dir(void)
-+{
-+ struct proc_dir_entry *de;
-+
-+ if (!bond_proc_dir) {
-+ return;
- }
-
-- if (orig_app_abi_ver == -1) {
-- /* no orig_app_abi_ver was provided yet, so we'll use the
-- * current one from now on, even if it's 0
-- */
-- orig_app_abi_ver = app_abi_ver;
-+ /* verify that the /proc dir is empty */
-+ for (de = bond_proc_dir->subdir; de; de = de->next) {
-+ /* ignore . and .. */
-+ if (*(de->name) != '.') {
-+ break;
-+ }
-+ }
-
-- } else if (orig_app_abi_ver != app_abi_ver) {
-- printk(KERN_ERR
-- "bonding: Error: already using ifenslave ABI "
-- "version %d; to upgrade ifenslave to version %d, "
-- "you must first reload bonding.\n",
-- orig_app_abi_ver, app_abi_ver);
-- return -EINVAL;
-+ if (de) {
-+ if (bond_proc_dir->owner == THIS_MODULE) {
-+ bond_proc_dir->owner = NULL;
-+ }
-+ } else {
-+ remove_proc_entry(DRV_NAME, proc_net);
-+ bond_proc_dir = NULL;
- }
-+}
-+#endif /* CONFIG_PROC_FS */
-
-- slave_dev = dev_get_by_name(ifr->ifr_slave);
-+/*-------------------------- netdev event handling --------------------------*/
-
--#ifdef BONDING_DEBUG
-- printk(KERN_INFO "slave_dev=%x: \n", (unsigned int)slave_dev);
-- printk(KERN_INFO "slave_dev->name=%s: \n", slave_dev->name);
-+/*
-+ * Change device name
-+ */
-+static int bond_event_changename(struct bonding *bond)
-+{
-+#ifdef CONFIG_PROC_FS
-+ bond_remove_proc_entry(bond);
-+ bond_create_proc_entry(bond);
- #endif
-
-- if (slave_dev == NULL) {
-- ret = -ENODEV;
-- } else {
-- switch (cmd) {
-- case BOND_ENSLAVE_OLD:
-- case SIOCBONDENSLAVE:
-- ret = bond_enslave(master_dev, slave_dev);
-- break;
-- case BOND_RELEASE_OLD:
-- case SIOCBONDRELEASE:
-- ret = bond_release(master_dev, slave_dev);
-- break;
-- case BOND_SETHWADDR_OLD:
-- case SIOCBONDSETHWADDR:
-- ret = bond_sethwaddr(master_dev, slave_dev);
-- break;
-- case BOND_CHANGE_ACTIVE_OLD:
-- case SIOCBONDCHANGEACTIVE:
-- if (USES_PRIMARY(bond_mode)) {
-- ret = bond_change_active(master_dev, slave_dev);
-- }
-- else {
-- ret = -EINVAL;
-- }
-- break;
-- default:
-- ret = -EOPNOTSUPP;
-- }
-- dev_put(slave_dev);
-+ return NOTIFY_DONE;
-+}
-+
-+static int bond_master_netdev_event(unsigned long event, struct net_device *bond_dev)
-+{
-+ struct bonding *event_bond = bond_dev->priv;
-+
-+ switch (event) {
-+ case NETDEV_CHANGENAME:
-+ return bond_event_changename(event_bond);
-+ case NETDEV_UNREGISTER:
-+ /*
-+ * TODO: remove a bond from the list?
-+ */
-+ break;
-+ default:
-+ break;
- }
-
-- if (ret < 0) {
-- /* The ioctl failed, so there's no point in changing the
-- * orig_app_abi_ver. We'll restore it's value just in case
-- * we've changed it earlier in this function.
-+ return NOTIFY_DONE;
-+}
-+
-+static int bond_slave_netdev_event(unsigned long event, struct net_device *slave_dev)
-+{
-+ struct net_device *bond_dev = slave_dev->master;
-+
-+ switch (event) {
-+ case NETDEV_UNREGISTER:
-+ if (bond_dev) {
-+ bond_release(bond_dev, slave_dev);
-+ }
-+ break;
-+ case NETDEV_CHANGE:
-+ /*
-+ * TODO: is this what we get if somebody
-+ * sets up a hierarchical bond, then rmmod's
-+ * one of the slave bonding devices?
- */
-- orig_app_abi_ver = prev_abi_ver;
-+ break;
-+ case NETDEV_DOWN:
-+ /*
-+ * ... Or is it this?
-+ */
-+ break;
-+ case NETDEV_CHANGEMTU:
-+ /*
-+ * TODO: Should slaves be allowed to
-+ * independently alter their MTU? For
-+ * an active-backup bond, slaves need
-+ * not be the same type of device, so
-+ * MTUs may vary. For other modes,
-+ * slaves arguably should have the
-+ * same MTUs. To do this, we'd need to
-+ * take over the slave's change_mtu
-+ * function for the duration of their
-+ * servitude.
-+ */
-+ break;
-+ case NETDEV_CHANGENAME:
-+ /*
-+ * TODO: handle changing the primary's name
-+ */
-+ break;
-+ default:
-+ break;
- }
-
-- return ret;
--}
--
--#ifdef CONFIG_NET_FASTROUTE
--static int bond_accept_fastpath(struct net_device *dev, struct dst_entry *dst)
--{
-- return -1;
-+ return NOTIFY_DONE;
- }
--#endif
-
--/*
-- * in broadcast mode, we send everything to all usable interfaces.
-+/*
-+ * bond_netdev_event: handle netdev notifier chain events.
-+ *
-+ * This function receives events for the netdev chain. The caller (an
-+ * ioctl handler calling notifier_call_chain) holds the necessary
-+ * locks for us to safely manipulate the slave devices (RTNL lock,
-+ * dev_probe_lock).
- */
--static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *dev)
-+static int bond_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
- {
-- slave_t *slave, *start_at;
-- struct bonding *bond = (struct bonding *) dev->priv;
-- struct net_device *device_we_should_send_to = 0;
-+ struct net_device *event_dev = (struct net_device *)ptr;
-
-- if (!IS_UP(dev)) { /* bond down */
-- dev_kfree_skb(skb);
-- return 0;
-+ dprintk("event_dev: %s, event: %lx\n",
-+ (event_dev ? event_dev->name : "None"),
-+ event);
-+
-+ if (event_dev->flags & IFF_MASTER) {
-+ dprintk("IFF_MASTER\n");
-+ return bond_master_netdev_event(event, event_dev);
- }
-
-- read_lock(&bond->lock);
--
-- read_lock(&bond->ptrlock);
-- slave = start_at = bond->current_slave;
-- read_unlock(&bond->ptrlock);
--
-- if (slave == NULL) { /* we're at the root, get the first slave */
-- /* no suitable interface, frame not sent */
-- read_unlock(&bond->lock);
-- dev_kfree_skb(skb);
-- return 0;
-+ if (event_dev->flags & IFF_SLAVE) {
-+ dprintk("IFF_SLAVE\n");
-+ return bond_slave_netdev_event(event, event_dev);
- }
-
-- do {
-- if (IS_UP(slave->dev)
-- && (slave->link == BOND_LINK_UP)
-- && (slave->state == BOND_STATE_ACTIVE)) {
-- if (device_we_should_send_to) {
-- struct sk_buff *skb2;
-- if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL) {
-- printk(KERN_ERR "bond_xmit_broadcast: skb_clone() failed\n");
-- continue;
-- }
--
-- skb2->dev = device_we_should_send_to;
-- skb2->priority = 1;
-- dev_queue_xmit(skb2);
-- }
-- device_we_should_send_to = slave->dev;
-- }
-- } while ((slave = slave->next) != start_at);
-+ return NOTIFY_DONE;
-+}
-
-- if (device_we_should_send_to) {
-- skb->dev = device_we_should_send_to;
-- skb->priority = 1;
-- dev_queue_xmit(skb);
-- } else
-- dev_kfree_skb(skb);
-+static struct notifier_block bond_netdev_notifier = {
-+ .notifier_call = bond_netdev_event,
-+};
-
-- /* frame sent to all suitable interfaces */
-- read_unlock(&bond->lock);
-- return 0;
--}
-+/*-------------------------- Packet type handling ---------------------------*/
-
--static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *dev)
-+/* register to receive lacpdus on a bond */
-+static void bond_register_lacpdu(struct bonding *bond)
- {
-- slave_t *slave, *start_at;
-- struct bonding *bond = (struct bonding *) dev->priv;
-+ struct packet_type *pk_type = &(BOND_AD_INFO(bond).ad_pkt_type);
-
-- if (!IS_UP(dev)) { /* bond down */
-- dev_kfree_skb(skb);
-- return 0;
-- }
-+ /* initialize packet type */
-+ pk_type->type = PKT_TYPE_LACPDU;
-+ pk_type->dev = bond->dev;
-+ pk_type->func = bond_3ad_lacpdu_recv;
-
-- read_lock(&bond->lock);
-+ dev_add_pack(pk_type);
-+}
-
-- read_lock(&bond->ptrlock);
-- slave = start_at = bond->current_slave;
-- read_unlock(&bond->ptrlock);
--
-- if (slave == NULL) { /* we're at the root, get the first slave */
-- /* no suitable interface, frame not sent */
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-- }
-+/* unregister to receive lacpdus on a bond */
-+static void bond_unregister_lacpdu(struct bonding *bond)
-+{
-+ dev_remove_pack(&(BOND_AD_INFO(bond).ad_pkt_type));
-+}
-
-- do {
-- if (IS_UP(slave->dev)
-- && (slave->link == BOND_LINK_UP)
-- && (slave->state == BOND_STATE_ACTIVE)) {
-+/*-------------------------- Device entry points ----------------------------*/
-
-- skb->dev = slave->dev;
-- skb->priority = 1;
-- dev_queue_xmit(skb);
-+static int bond_open(struct net_device *bond_dev)
-+{
-+ struct bonding *bond = bond_dev->priv;
-+ struct timer_list *mii_timer = &bond->mii_timer;
-+ struct timer_list *arp_timer = &bond->arp_timer;
-
-- write_lock(&bond->ptrlock);
-- bond->current_slave = slave->next;
-- write_unlock(&bond->ptrlock);
-+ bond->kill_timers = 0;
-+
-+ if ((bond_mode == BOND_MODE_TLB) ||
-+ (bond_mode == BOND_MODE_ALB)) {
-+ struct timer_list *alb_timer = &(BOND_ALB_INFO(bond).alb_timer);
-
-- read_unlock(&bond->lock);
-- return 0;
-+ /* bond_alb_initialize must be called before the timer
-+ * is started.
-+ */
-+ if (bond_alb_initialize(bond, (bond_mode == BOND_MODE_ALB))) {
-+ /* something went wrong - fail the open operation */
-+ return -1;
- }
-- } while ((slave = slave->next) != start_at);
-
-- /* no suitable interface, frame not sent */
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
--}
-+ init_timer(alb_timer);
-+ alb_timer->expires = jiffies + 1;
-+ alb_timer->data = (unsigned long)bond;
-+ alb_timer->function = (void *)&bond_alb_monitor;
-+ add_timer(alb_timer);
-+ }
-
--/*
-- * in XOR mode, we determine the output device by performing xor on
-- * the source and destination hw adresses. If this device is not
-- * enabled, find the next slave following this xor slave.
-- */
--static int bond_xmit_xor(struct sk_buff *skb, struct net_device *dev)
--{
-- slave_t *slave, *start_at;
-- struct bonding *bond = (struct bonding *) dev->priv;
-- struct ethhdr *data = (struct ethhdr *)skb->data;
-- int slave_no;
-+ if (miimon) { /* link check interval, in milliseconds. */
-+ init_timer(mii_timer);
-+ mii_timer->expires = jiffies + 1;
-+ mii_timer->data = (unsigned long)bond_dev;
-+ mii_timer->function = (void *)&bond_mii_monitor;
-+ add_timer(mii_timer);
-+ }
-
-- if (!IS_UP(dev)) { /* bond down */
-- dev_kfree_skb(skb);
-- return 0;
-+ if (arp_interval) { /* arp interval, in milliseconds. */
-+ init_timer(arp_timer);
-+ arp_timer->expires = jiffies + 1;
-+ arp_timer->data = (unsigned long)bond_dev;
-+ if (bond_mode == BOND_MODE_ACTIVEBACKUP) {
-+ arp_timer->function = (void *)&bond_activebackup_arp_mon;
-+ } else {
-+ arp_timer->function = (void *)&bond_loadbalance_arp_mon;
-+ }
-+ add_timer(arp_timer);
- }
-
-- read_lock(&bond->lock);
-- slave = bond->prev;
-+ if (bond_mode == BOND_MODE_8023AD) {
-+ struct timer_list *ad_timer = &(BOND_AD_INFO(bond).ad_timer);
-+ init_timer(ad_timer);
-+ ad_timer->expires = jiffies + 1;
-+ ad_timer->data = (unsigned long)bond;
-+ ad_timer->function = (void *)&bond_3ad_state_machine_handler;
-+ add_timer(ad_timer);
-
-- /* we're at the root, get the first slave */
-- if (bond->slave_cnt == 0) {
-- /* no suitable interface, frame not sent */
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
-+ /* register to receive LACPDUs */
-+ bond_register_lacpdu(bond);
- }
-
-- slave_no = (data->h_dest[5]^slave->dev->dev_addr[5]) % bond->slave_cnt;
-+ return 0;
-+}
-
-- while ( (slave_no > 0) && (slave != (slave_t *)bond) ) {
-- slave = slave->prev;
-- slave_no--;
-- }
-- start_at = slave;
-+static int bond_close(struct net_device *bond_dev)
-+{
-+ struct bonding *bond = bond_dev->priv;
-
-- do {
-- if (IS_UP(slave->dev)
-- && (slave->link == BOND_LINK_UP)
-- && (slave->state == BOND_STATE_ACTIVE)) {
-+ write_lock_bh(&bond->lock);
-
-- skb->dev = slave->dev;
-- skb->priority = 1;
-- dev_queue_xmit(skb);
-+ bond_mc_list_destroy(bond);
-
-- read_unlock(&bond->lock);
-- return 0;
-- }
-- } while ((slave = slave->next) != start_at);
-+ if (bond_mode == BOND_MODE_8023AD) {
-+ /* Unregister the receive of LACPDUs */
-+ bond_unregister_lacpdu(bond);
-+ }
-
-- /* no suitable interface, frame not sent */
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
-- return 0;
--}
-+ /* signal timers not to re-arm */
-+ bond->kill_timers = 1;
-
--/*
-- * in active-backup mode, we know that bond->current_slave is always valid if
-- * the bond has a usable interface.
-- */
--static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *dev)
--{
-- struct bonding *bond = (struct bonding *) dev->priv;
-- int ret;
-+ write_unlock_bh(&bond->lock);
-
-- if (!IS_UP(dev)) { /* bond down */
-- dev_kfree_skb(skb);
-- return 0;
-+ /* del_timer_sync must run without holding the bond->lock
-+ * because a running timer might be trying to hold it too
-+ */
-+
-+ if (miimon) { /* link check interval, in milliseconds. */
-+ del_timer_sync(&bond->mii_timer);
- }
-
-- /* if we are sending arp packets, try to at least
-- identify our own ip address */
-- if ( (arp_interval > 0) && (my_ip == 0) &&
-- (skb->protocol == __constant_htons(ETH_P_ARP) ) ) {
-- char *the_ip = (((char *)skb->data))
-- + sizeof(struct ethhdr)
-- + sizeof(struct arphdr) +
-- ETH_ALEN;
-- memcpy(&my_ip, the_ip, 4);
-+ if (arp_interval) { /* arp interval, in milliseconds. */
-+ del_timer_sync(&bond->arp_timer);
- }
-
-- /* if we are sending arp packets and don't know
-- * the target hw address, save it so we don't need
-- * to use a broadcast address.
-- * don't do this if in active backup mode because the slaves must
-- * receive packets to stay up, and the only ones they receive are
-- * broadcasts.
-- */
-- if ( (bond_mode != BOND_MODE_ACTIVEBACKUP) &&
-- (arp_ip_count == 1) &&
-- (arp_interval > 0) && (arp_target_hw_addr == NULL) &&
-- (skb->protocol == __constant_htons(ETH_P_IP) ) ) {
-- struct ethhdr *eth_hdr =
-- (struct ethhdr *) (((char *)skb->data));
-- struct iphdr *ip_hdr = (struct iphdr *)(eth_hdr + 1);
--
-- if (arp_target[0] == ip_hdr->daddr) {
-- arp_target_hw_addr = kmalloc(ETH_ALEN, GFP_KERNEL);
-- if (arp_target_hw_addr != NULL)
-- memcpy(arp_target_hw_addr, eth_hdr->h_dest, ETH_ALEN);
-- }
-+ switch (bond_mode) {
-+ case BOND_MODE_8023AD:
-+ del_timer_sync(&(BOND_AD_INFO(bond).ad_timer));
-+ break;
-+ case BOND_MODE_TLB:
-+ case BOND_MODE_ALB:
-+ del_timer_sync(&(BOND_ALB_INFO(bond).alb_timer));
-+ break;
-+ default:
-+ break;
- }
-
-- read_lock(&bond->lock);
-+ /* Release the bonded slaves */
-+ bond_release_all(bond_dev);
-
-- read_lock(&bond->ptrlock);
-- if (bond->current_slave != NULL) { /* one usable interface */
-- skb->dev = bond->current_slave->dev;
-- read_unlock(&bond->ptrlock);
-- skb->priority = 1;
-- ret = dev_queue_xmit(skb);
-- read_unlock(&bond->lock);
-- return 0;
-- }
-- else {
-- read_unlock(&bond->ptrlock);
-+ if ((bond_mode == BOND_MODE_TLB) ||
-+ (bond_mode == BOND_MODE_ALB)) {
-+ /* Must be called only after all
-+ * slaves have been released
-+ */
-+ bond_alb_deinitialize(bond);
- }
-
-- /* no suitable interface, frame not sent */
--#ifdef BONDING_DEBUG
-- printk(KERN_INFO "There was no suitable interface, so we don't transmit\n");
--#endif
-- dev_kfree_skb(skb);
-- read_unlock(&bond->lock);
- return 0;
- }
-
--static struct net_device_stats *bond_get_stats(struct net_device *dev)
-+static struct net_device_stats *bond_get_stats(struct net_device *bond_dev)
- {
-- bonding_t *bond = dev->priv;
-+ struct bonding *bond = bond_dev->priv;
- struct net_device_stats *stats = &(bond->stats), *sstats;
-- slave_t *slave;
-+ struct slave *slave;
-+ int i;
-
- memset(stats, 0, sizeof(struct net_device_stats));
-
- read_lock_bh(&bond->lock);
-
-- for (slave = bond->prev; slave != (slave_t *)bond; slave = slave->prev) {
-+ bond_for_each_slave(bond, slave, i) {
- sstats = slave->dev->get_stats(slave->dev);
--
-+
- stats->rx_packets += sstats->rx_packets;
- stats->rx_bytes += sstats->rx_bytes;
- stats->rx_errors += sstats->rx_errors;
-@@ -3346,290 +3130,294 @@ static struct net_device_stats *bond_get
- stats->rx_over_errors += sstats->rx_over_errors;
- stats->rx_crc_errors += sstats->rx_crc_errors;
- stats->rx_frame_errors += sstats->rx_frame_errors;
-- stats->rx_fifo_errors += sstats->rx_fifo_errors;
-+ stats->rx_fifo_errors += sstats->rx_fifo_errors;
- stats->rx_missed_errors += sstats->rx_missed_errors;
--
-+
- stats->tx_aborted_errors += sstats->tx_aborted_errors;
- stats->tx_carrier_errors += sstats->tx_carrier_errors;
- stats->tx_fifo_errors += sstats->tx_fifo_errors;
- stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors;
- stats->tx_window_errors += sstats->tx_window_errors;
--
- }
-
- read_unlock_bh(&bond->lock);
-+
- return stats;
- }
-
--#ifdef CONFIG_PROC_FS
--
--#define SEQ_START_TOKEN ((void *)1)
--
--static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos)
-+static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd)
- {
-- struct bonding *bond = seq->private;
-- loff_t off = 0;
-- struct slave *slave;
--
-- /* make sure the bond won't be taken away */
-- read_lock(&dev_base_lock);
-- read_lock_bh(&bond->lock);
--
-- if (*pos == 0) {
-- return SEQ_START_TOKEN;
-- }
-+ struct net_device *slave_dev = NULL;
-+ struct ifbond *u_binfo = NULL, k_binfo;
-+ struct ifslave *u_sinfo = NULL, k_sinfo;
-+ struct mii_ioctl_data *mii = NULL;
-+ int prev_abi_ver = orig_app_abi_ver;
-+ int res = 0;
-
-- for (slave = bond->prev; slave != (slave_t *)bond;
-- slave = slave->prev) {
-+ dprintk("bond_ioctl: master=%s, cmd=%d\n",
-+ bond_dev->name, cmd);
-
-- if (++off == *pos) {
-- return slave;
-+ switch (cmd) {
-+ case SIOCETHTOOL:
-+ return bond_ethtool_ioctl(bond_dev, ifr);
-+ case SIOCGMIIPHY:
-+ mii = (struct mii_ioctl_data *)&ifr->ifr_data;
-+ if (!mii) {
-+ return -EINVAL;
-+ }
-+ mii->phy_id = 0;
-+ /* Fall Through */
-+ case SIOCGMIIREG:
-+ /*
-+ * We do this again just in case we were called by SIOCGMIIREG
-+ * instead of SIOCGMIIPHY.
-+ */
-+ mii = (struct mii_ioctl_data *)&ifr->ifr_data;
-+ if (!mii) {
-+ return -EINVAL;
- }
-- }
--
-- return NULL;
--}
--
--static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos)
--{
-- struct bonding *bond = seq->private;
-- struct slave *slave = v;
--
-- ++*pos;
-- if (v == SEQ_START_TOKEN) {
-- slave = bond->prev;
-- } else {
-- slave = slave->prev;
-- }
--
-- return (slave == (struct slave *) bond) ? NULL : slave;
--}
--
--static void bond_info_seq_stop(struct seq_file *seq, void *v)
--{
-- struct bonding *bond = seq->private;
--
-- read_unlock_bh(&bond->lock);
-- read_unlock(&dev_base_lock);
--}
--
--static void bond_info_show_master(struct seq_file *seq, struct bonding *bond)
--{
-- struct slave *curr;
-
-- read_lock(&bond->ptrlock);
-- curr = bond->current_slave;
-- read_unlock(&bond->ptrlock);
-+ if (mii->reg_num == 1) {
-+ struct bonding *bond = bond_dev->priv;
-+ mii->val_out = 0;
-+ read_lock_bh(&bond->lock);
-+ read_lock(&bond->curr_slave_lock);
-+ if (bond->curr_active_slave) {
-+ mii->val_out = BMSR_LSTATUS;
-+ }
-+ read_unlock(&bond->curr_slave_lock);
-+ read_unlock_bh(&bond->lock);
-+ }
-
-- seq_printf(seq, "Bonding Mode: %s\n", bond_mode_name());
-+ return 0;
-+ case BOND_INFO_QUERY_OLD:
-+ case SIOCBONDINFOQUERY:
-+ u_binfo = (struct ifbond *)ifr->ifr_data;
-
-- if (USES_PRIMARY(bond_mode)) {
-- if (curr) {
-- seq_printf(seq,
-- "Currently Active Slave: %s\n",
-- curr->dev->name);
-+ if (copy_from_user(&k_binfo, u_binfo, sizeof(ifbond))) {
-+ return -EFAULT;
- }
-- }
-
-- seq_printf(seq, "MII Status: %s\n", (curr) ? "up" : "down");
-- seq_printf(seq, "MII Polling Interval (ms): %d\n", miimon);
-- seq_printf(seq, "Up Delay (ms): %d\n", updelay * miimon);
-- seq_printf(seq, "Down Delay (ms): %d\n", downdelay * miimon);
-- seq_printf(seq, "Multicast Mode: %s\n", multicast_mode_name());
--
-- if (bond_mode == BOND_MODE_8023AD) {
-- struct ad_info ad_info;
-+ res = bond_info_query(bond_dev, &k_binfo);
-+ if (res == 0) {
-+ if (copy_to_user(u_binfo, &k_binfo, sizeof(ifbond))) {
-+ return -EFAULT;
-+ }
-+ }
-
-- seq_puts(seq, "\n802.3ad info\n");
-+ return res;
-+ case BOND_SLAVE_INFO_QUERY_OLD:
-+ case SIOCBONDSLAVEINFOQUERY:
-+ u_sinfo = (struct ifslave *)ifr->ifr_data;
-
-- if (bond_3ad_get_active_agg_info(bond, &ad_info)) {
-- seq_printf(seq, "bond %s has no active aggregator\n",
-- bond->device->name);
-- } else {
-- seq_printf(seq, "Active Aggregator Info:\n");
-+ if (copy_from_user(&k_sinfo, u_sinfo, sizeof(ifslave))) {
-+ return -EFAULT;
-+ }
-
-- seq_printf(seq, "\tAggregator ID: %d\n",
-- ad_info.aggregator_id);
-- seq_printf(seq, "\tNumber of ports: %d\n",
-- ad_info.ports);
-- seq_printf(seq, "\tActor Key: %d\n",
-- ad_info.actor_key);
-- seq_printf(seq, "\tPartner Key: %d\n",
-- ad_info.partner_key);
-- seq_printf(seq, "\tPartner Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\n",
-- ad_info.partner_system[0],
-- ad_info.partner_system[1],
-- ad_info.partner_system[2],
-- ad_info.partner_system[3],
-- ad_info.partner_system[4],
-- ad_info.partner_system[5]);
-+ res = bond_slave_info_query(bond_dev, &k_sinfo);
-+ if (res == 0) {
-+ if (copy_to_user(u_sinfo, &k_sinfo, sizeof(ifslave))) {
-+ return -EFAULT;
-+ }
- }
-+
-+ return res;
-+ default:
-+ /* Go on */
-+ break;
- }
--}
-
--static void bond_info_show_slave(struct seq_file *seq, const struct slave *slave)
--{
-- seq_printf(seq, "\nSlave Interface: %s\n", slave->dev->name);
-- seq_printf(seq, "MII Status: %s\n",
-- (slave->link == BOND_LINK_UP) ? "up" : "down");
-- seq_printf(seq, "Link Failure Count: %d\n",
-- slave->link_failure_count);
-+ if (!capable(CAP_NET_ADMIN)) {
-+ return -EPERM;
-+ }
-
-- if (app_abi_ver >= 1) {
-- seq_printf(seq,
-- "Permanent HW addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
-- slave->perm_hwaddr[0],
-- slave->perm_hwaddr[1],
-- slave->perm_hwaddr[2],
-- slave->perm_hwaddr[3],
-- slave->perm_hwaddr[4],
-- slave->perm_hwaddr[5]);
-+ if (orig_app_abi_ver == -1) {
-+ /* no orig_app_abi_ver was provided yet, so we'll use the
-+ * current one from now on, even if it's 0
-+ */
-+ orig_app_abi_ver = app_abi_ver;
-+
-+ } else if (orig_app_abi_ver != app_abi_ver) {
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: already using ifenslave ABI version %d; to "
-+ "upgrade ifenslave to version %d, you must first "
-+ "reload bonding.\n",
-+ orig_app_abi_ver, app_abi_ver);
-+ return -EINVAL;
- }
-
-- if (bond_mode == BOND_MODE_8023AD) {
-- const struct aggregator *agg
-- = SLAVE_AD_INFO(slave).port.aggregator;
-+ slave_dev = dev_get_by_name(ifr->ifr_slave);
-
-- if (agg) {
-- seq_printf(seq, "Aggregator ID: %d\n",
-- agg->aggregator_identifier);
-- } else {
-- seq_puts(seq, "Aggregator ID: N/A\n");
-+ dprintk("slave_dev=%p: \n", slave_dev);
-+
-+ if (!slave_dev) {
-+ res = -ENODEV;
-+ } else {
-+ dprintk("slave_dev->name=%s: \n", slave_dev->name);
-+ switch (cmd) {
-+ case BOND_ENSLAVE_OLD:
-+ case SIOCBONDENSLAVE:
-+ res = bond_enslave(bond_dev, slave_dev);
-+ break;
-+ case BOND_RELEASE_OLD:
-+ case SIOCBONDRELEASE:
-+ res = bond_release(bond_dev, slave_dev);
-+ break;
-+ case BOND_SETHWADDR_OLD:
-+ case SIOCBONDSETHWADDR:
-+ res = bond_sethwaddr(bond_dev, slave_dev);
-+ break;
-+ case BOND_CHANGE_ACTIVE_OLD:
-+ case SIOCBONDCHANGEACTIVE:
-+ if (USES_PRIMARY(bond_mode)) {
-+ res = bond_ioctl_change_active(bond_dev, slave_dev);
-+ } else {
-+ res = -EINVAL;
-+ }
-+ break;
-+ default:
-+ res = -EOPNOTSUPP;
- }
-+
-+ dev_put(slave_dev);
- }
--}
-
--static int bond_info_seq_show(struct seq_file *seq, void *v)
--{
-- if (v == SEQ_START_TOKEN) {
-- seq_printf(seq, "%s\n", version);
-- bond_info_show_master(seq, seq->private);
-- } else {
-- bond_info_show_slave(seq, v);
-+ if (res < 0) {
-+ /* The ioctl failed, so there's no point in changing the
-+ * orig_app_abi_ver. We'll restore it's value just in case
-+ * we've changed it earlier in this function.
-+ */
-+ orig_app_abi_ver = prev_abi_ver;
- }
-
-- return 0;
-+ return res;
- }
-
--static struct seq_operations bond_info_seq_ops = {
-- .start = bond_info_seq_start,
-- .next = bond_info_seq_next,
-- .stop = bond_info_seq_stop,
-- .show = bond_info_seq_show,
--};
--
--static int bond_info_open(struct inode *inode, struct file *file)
-+static void bond_set_multicast_list(struct net_device *bond_dev)
- {
-- struct seq_file *seq;
-- struct proc_dir_entry *proc;
-- int rc;
--
-- rc = seq_open(file, &bond_info_seq_ops);
-- if (!rc) {
-- /* recover the pointer buried in proc_dir_entry data */
-- seq = file->private_data;
-- proc = PDE(inode);
-- seq->private = proc->data;
-- }
-- return rc;
--}
-+ struct bonding *bond = bond_dev->priv;
-+ struct dev_mc_list *dmi;
-
--static struct file_operations bond_info_fops = {
-- .owner = THIS_MODULE,
-- .open = bond_info_open,
-- .read = seq_read,
-- .llseek = seq_lseek,
-- .release = seq_release,
--};
-+ write_lock_bh(&bond->lock);
-
--static int bond_create_proc_info(struct bonding *bond)
--{
-- struct net_device *dev = bond->device;
-+ /*
-+ * Do promisc before checking multicast_mode
-+ */
-+ if ((bond_dev->flags & IFF_PROMISC) && !(bond->flags & IFF_PROMISC)) {
-+ bond_set_promiscuity(bond, 1);
-+ }
-
-- if (bond_proc_dir) {
-- bond->bond_proc_file = create_proc_entry(dev->name,
-- S_IRUGO,
-- bond_proc_dir);
-- if (bond->bond_proc_file == NULL) {
-- printk(KERN_WARNING
-- "%s: Cannot create /proc/net/bonding/%s\n",
-- dev->name, dev->name);
-- } else {
-- bond->bond_proc_file->data = bond;
-- bond->bond_proc_file->proc_fops = &bond_info_fops;
-- bond->bond_proc_file->owner = THIS_MODULE;
-- memcpy(bond->procdir_name, dev->name, IFNAMSIZ);
-- }
-+ if (!(bond_dev->flags & IFF_PROMISC) && (bond->flags & IFF_PROMISC)) {
-+ bond_set_promiscuity(bond, -1);
- }
-
-- return 0;
--}
-+ /* set allmulti flag to slaves */
-+ if ((bond_dev->flags & IFF_ALLMULTI) && !(bond->flags & IFF_ALLMULTI)) {
-+ bond_set_allmulti(bond, 1);
-+ }
-
--static void bond_destroy_proc_info(struct bonding *bond)
--{
-- if (bond_proc_dir && bond->bond_proc_file) {
-- remove_proc_entry(bond->procdir_name, bond_proc_dir);
-- memset(bond->procdir_name, 0, IFNAMSIZ);
-- bond->bond_proc_file = NULL;
-+ if (!(bond_dev->flags & IFF_ALLMULTI) && (bond->flags & IFF_ALLMULTI)) {
-+ bond_set_allmulti(bond, -1);
- }
--}
-
--/* Create the bonding directory under /proc/net, if doesn't exist yet.
-- * Caller must hold rtnl_lock.
-- */
--static void bond_create_proc_dir(void)
--{
-- int len = strlen(DRV_NAME);
-+ bond->flags = bond_dev->flags;
-
-- for (bond_proc_dir = proc_net->subdir; bond_proc_dir;
-- bond_proc_dir = bond_proc_dir->next) {
-- if ((bond_proc_dir->namelen == len) &&
-- !memcmp(bond_proc_dir->name, DRV_NAME, len)) {
-- break;
-+ /* looking for addresses to add to slaves' mc list */
-+ for (dmi = bond_dev->mc_list; dmi; dmi = dmi->next) {
-+ if (!bond_mc_list_find_dmi(dmi, bond->mc_list)) {
-+ bond_mc_add(bond, dmi->dmi_addr, dmi->dmi_addrlen);
- }
- }
-
-- if (!bond_proc_dir) {
-- bond_proc_dir = proc_mkdir(DRV_NAME, proc_net);
-- if (bond_proc_dir) {
-- bond_proc_dir->owner = THIS_MODULE;
-- } else {
-- printk(KERN_WARNING DRV_NAME
-- ": Warning: cannot create /proc/net/%s\n",
-- DRV_NAME);
-+ /* looking for addresses to delete from slaves' list */
-+ for (dmi = bond->mc_list; dmi; dmi = dmi->next) {
-+ if (!bond_mc_list_find_dmi(dmi, bond_dev->mc_list)) {
-+ bond_mc_delete(bond, dmi->dmi_addr, dmi->dmi_addrlen);
- }
- }
-+
-+ /* save master's multicast list */
-+ bond_mc_list_destroy(bond);
-+ bond_mc_list_copy(bond_dev->mc_list, bond, GFP_ATOMIC);
-+
-+ write_unlock_bh(&bond->lock);
- }
-
--/* Destroy the bonding directory under /proc/net, if empty.
-- * Caller must hold rtnl_lock.
-+/*
-+ * Change the MTU of all of a master's slaves to match the master
- */
--static void bond_destroy_proc_dir(void)
-+static int bond_change_mtu(struct net_device *bond_dev, int new_mtu)
- {
-- struct proc_dir_entry *de;
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave, *stop_at;
-+ int res = 0;
-+ int i;
-
-- if (!bond_proc_dir) {
-- return;
-- }
-+ dprintk("bond=%p, name=%s, new_mtu=%d\n", bond,
-+ (bond_dev ? bond_dev->name : "None"), new_mtu);
-
-- /* verify that the /proc dir is empty */
-- for (de = bond_proc_dir->subdir; de; de = de->next) {
-- /* ignore . and .. */
-- if (*(de->name) != '.') {
-- break;
-+ /* Can't hold bond->lock with bh disabled here since
-+ * some base drivers panic. On the other hand we can't
-+ * hold bond->lock without bh disabled because we'll
-+ * deadlock. The only solution is to rely on the fact
-+ * that we're under rtnl_lock here, and the slaves
-+ * list won't change. This doesn't solve the problem
-+ * of setting the slave's MTU while it is
-+ * transmitting, but the assumption is that the base
-+ * driver can handle that.
-+ *
-+ * TODO: figure out a way to safely iterate the slaves
-+ * list, but without holding a lock around the actual
-+ * call to the base driver.
-+ */
-+
-+ bond_for_each_slave(bond, slave, i) {
-+ dprintk("s %p s->p %p c_m %p\n", slave,
-+ slave->prev, slave->dev->change_mtu);
-+ if (slave->dev->change_mtu) {
-+ res = slave->dev->change_mtu(slave->dev, new_mtu);
-+ } else {
-+ slave->dev->mtu = new_mtu;
-+ res = 0;
-+ }
-+
-+ if (res) {
-+ /* If we failed to set the slave's mtu to the new value
-+ * we must abort the operation even in ACTIVE_BACKUP
-+ * mode, because if we allow the backup slaves to have
-+ * different mtu values than the active slave we'll
-+ * need to change their mtu when doing a failover. That
-+ * means changing their mtu from timer context, which
-+ * is probably not a good idea.
-+ */
-+ dprintk("err %d %s\n", res, slave->dev->name);
-+ goto unwind;
- }
- }
-
-- if (de) {
-- if (bond_proc_dir->owner == THIS_MODULE) {
-- bond_proc_dir->owner = NULL;
-+ bond_dev->mtu = new_mtu;
-+
-+ return 0;
-+
-+unwind:
-+ /* unwind from head to the slave that failed */
-+ stop_at = slave;
-+ bond_for_each_slave_from_to(bond, slave, i, bond->first_slave, stop_at) {
-+ int tmp_res;
-+
-+ if (slave->dev->change_mtu) {
-+ tmp_res = slave->dev->change_mtu(slave->dev, bond_dev->mtu);
-+ if (tmp_res) {
-+ dprintk("unwind err %d dev %s\n", tmp_res,
-+ slave->dev->name);
-+ }
-+ } else {
-+ slave->dev->mtu = bond_dev->mtu;
- }
-- } else {
-- remove_proc_entry(DRV_NAME, proc_net);
-- bond_proc_dir = NULL;
- }
-+
-+ return res;
- }
--#endif /* CONFIG_PROC_FS */
-
- /*
- * Change HW address
-@@ -3638,353 +3426,366 @@ static void bond_destroy_proc_dir(void)
- * downing the master releases all slaves. We can make bonds full of
- * bonding devices to test this, however.
- */
--static inline int
--bond_set_mac_address(struct net_device *dev, void *addr)
-+static int bond_set_mac_address(struct net_device *bond_dev, void *addr)
- {
-- struct bonding *bond = dev->priv;
-+ struct bonding *bond = bond_dev->priv;
- struct sockaddr *sa = addr, tmp_sa;
-- struct slave *slave;
-- int error;
-+ struct slave *slave, *stop_at;
-+ int res = 0;
-+ int i;
-
-- dprintk(KERN_INFO "bond_set_mac_address %p %s\n", dev,
-- dev->name);
-+ dprintk("bond=%p, name=%s\n", bond, (bond_dev ? bond_dev->name : "None"));
-
- if (!is_valid_ether_addr(sa->sa_data)) {
- return -EADDRNOTAVAIL;
- }
-
-- for (slave = bond->prev; slave != (struct slave *)bond;
-- slave = slave->prev) {
-- dprintk(KERN_INFO "bond_set_mac: slave %p %s\n", slave,
-- slave->dev->name);
-+ /* Can't hold bond->lock with bh disabled here since
-+ * some base drivers panic. On the other hand we can't
-+ * hold bond->lock without bh disabled because we'll
-+ * deadlock. The only solution is to rely on the fact
-+ * that we're under rtnl_lock here, and the slaves
-+ * list won't change. This doesn't solve the problem
-+ * of setting the slave's hw address while it is
-+ * transmitting, but the assumption is that the base
-+ * driver can handle that.
-+ *
-+ * TODO: figure out a way to safely iterate the slaves
-+ * list, but without holding a lock around the actual
-+ * call to the base driver.
-+ */
-+
-+ bond_for_each_slave(bond, slave, i) {
-+ dprintk("slave %p %s\n", slave, slave->dev->name);
-+
- if (slave->dev->set_mac_address == NULL) {
-- error = -EOPNOTSUPP;
-- dprintk(KERN_INFO "bond_set_mac EOPNOTSUPP %s\n",
-- slave->dev->name);
-+ res = -EOPNOTSUPP;
-+ dprintk("EOPNOTSUPP %s\n", slave->dev->name);
- goto unwind;
- }
-
-- error = slave->dev->set_mac_address(slave->dev, addr);
-- if (error) {
-- /* TODO: consider downing the slave
-+ res = slave->dev->set_mac_address(slave->dev, addr);
-+ if (res) {
-+ /* TODO: consider downing the slave
- * and retry ?
- * User should expect communications
- * breakage anyway until ARP finish
- * updating, so...
- */
-- dprintk(KERN_INFO "bond_set_mac err %d %s\n",
-- error, slave->dev->name);
-+ dprintk("err %d %s\n", res, slave->dev->name);
- goto unwind;
- }
- }
-
- /* success */
-- memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
-+ memcpy(bond_dev->dev_addr, sa->sa_data, bond_dev->addr_len);
- return 0;
-
- unwind:
-- memcpy(tmp_sa.sa_data, dev->dev_addr, dev->addr_len);
-- tmp_sa.sa_family = dev->type;
-+ memcpy(tmp_sa.sa_data, bond_dev->dev_addr, bond_dev->addr_len);
-+ tmp_sa.sa_family = bond_dev->type;
-
-- for (slave = slave->next; slave != bond->next;
-- slave = slave->next) {
-- int tmp_error;
--
-- tmp_error = slave->dev->set_mac_address(slave->dev, &tmp_sa);
-- if (tmp_error) {
-- dprintk(KERN_INFO "bond_set_mac_address: "
-- "unwind err %d dev %s\n",
-- tmp_error, slave->dev->name);
-+ /* unwind from head to the slave that failed */
-+ stop_at = slave;
-+ bond_for_each_slave_from_to(bond, slave, i, bond->first_slave, stop_at) {
-+ int tmp_res;
-+
-+ tmp_res = slave->dev->set_mac_address(slave->dev, &tmp_sa);
-+ if (tmp_res) {
-+ dprintk("unwind err %d dev %s\n", tmp_res,
-+ slave->dev->name);
- }
- }
-
-- return error;
-+ return res;
- }
-
--/*
-- * Change the MTU of all of a master's slaves to match the master
-- */
--static inline int
--bond_change_mtu(struct net_device *dev, int newmtu)
-+static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev)
- {
-- bonding_t *bond = dev->priv;
-- slave_t *slave;
-- int error;
--
-- dprintk(KERN_INFO "CM: b %p nm %d\n", bond, newmtu);
-- for (slave = bond->prev; slave != (slave_t *)bond;
-- slave = slave->prev) {
-- dprintk(KERN_INFO "CM: s %p s->p %p c_m %p\n", slave,
-- slave->prev, slave->dev->change_mtu);
-- if (slave->dev->change_mtu) {
-- error = slave->dev->change_mtu(slave->dev, newmtu);
-- } else {
-- slave->dev->mtu = newmtu;
-- error = 0;
-- }
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave, *start_at;
-+ int i;
-
-- if (error) {
-- /* If we failed to set the slave's mtu to the new value
-- * we must abort the operation even in ACTIVE_BACKUP
-- * mode, because if we allow the backup slaves to have
-- * different mtu values than the active slave we'll
-- * need to change their mtu when doing a failover. That
-- * means changing their mtu from timer context, which
-- * is probably not a good idea.
-- */
-- dprintk(KERN_INFO "bond_change_mtu err %d %s\n",
-- error, slave->dev->name);
-- goto unwind;
-+ read_lock(&bond->lock);
-+
-+ if (!BOND_IS_OK(bond)) {
-+ goto free_out;
-+ }
-+
-+ read_lock(&bond->curr_slave_lock);
-+ slave = start_at = bond->curr_active_slave;
-+ read_unlock(&bond->curr_slave_lock);
-+
-+ if (!slave) {
-+ goto free_out;
-+ }
-+
-+ bond_for_each_slave_from(bond, slave, i, start_at) {
-+ if (IS_UP(slave->dev) &&
-+ (slave->link == BOND_LINK_UP) &&
-+ (slave->state == BOND_STATE_ACTIVE)) {
-+ skb->dev = slave->dev;
-+ skb->priority = 1;
-+ dev_queue_xmit(skb);
-+
-+ write_lock(&bond->curr_slave_lock);
-+ bond->curr_active_slave = slave->next;
-+ write_unlock(&bond->curr_slave_lock);
-+
-+ goto out;
- }
- }
-
-- dev->mtu = newmtu;
-+out:
-+ read_unlock(&bond->lock);
- return 0;
-
-+free_out:
-+ /* no suitable interface, frame not sent */
-+ dev_kfree_skb(skb);
-+ goto out;
-+}
-
--unwind:
-- for (slave = slave->next; slave != bond->next;
-- slave = slave->next) {
-+/*
-+ * in active-backup mode, we know that bond->curr_active_slave is always valid if
-+ * the bond has a usable interface.
-+ */
-+static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *bond_dev)
-+{
-+ struct bonding *bond = bond_dev->priv;
-
-- if (slave->dev->change_mtu) {
-- slave->dev->change_mtu(slave->dev, dev->mtu);
-- } else {
-- slave->dev->mtu = dev->mtu;
-- }
-+ /* if we are sending arp packets, try to at least
-+ identify our own ip address */
-+ if (arp_interval && !my_ip &&
-+ (skb->protocol == __constant_htons(ETH_P_ARP))) {
-+ char *the_ip = (char *)skb->data +
-+ sizeof(struct ethhdr) +
-+ sizeof(struct arphdr) +
-+ ETH_ALEN;
-+ memcpy(&my_ip, the_ip, 4);
- }
-
-- return error;
-+ read_lock(&bond->lock);
-+ read_lock(&bond->curr_slave_lock);
-+
-+ if (!BOND_IS_OK(bond)) {
-+ goto free_out;
-+ }
-+
-+ if (bond->curr_active_slave) { /* one usable interface */
-+ skb->dev = bond->curr_active_slave->dev;
-+ skb->priority = 1;
-+ dev_queue_xmit(skb);
-+ goto out;
-+ } else {
-+ goto free_out;
-+ }
-+out:
-+ read_unlock(&bond->curr_slave_lock);
-+ read_unlock(&bond->lock);
-+ return 0;
-+
-+free_out:
-+ /* no suitable interface, frame not sent */
-+ dev_kfree_skb(skb);
-+ goto out;
- }
-
- /*
-- * Change device name
-+ * in XOR mode, we determine the output device by performing xor on
-+ * the source and destination hw adresses. If this device is not
-+ * enabled, find the next slave following this xor slave.
- */
--static inline int bond_event_changename(struct bonding *bond)
-+static int bond_xmit_xor(struct sk_buff *skb, struct net_device *bond_dev)
- {
--#ifdef CONFIG_PROC_FS
-- bond_destroy_proc_info(bond);
-- bond_create_proc_info(bond);
--#endif
--
-- return NOTIFY_DONE;
--}
-+ struct bonding *bond = bond_dev->priv;
-+ struct ethhdr *data = (struct ethhdr *)skb->data;
-+ struct slave *slave, *start_at;
-+ int slave_no;
-+ int i;
-
--static int bond_master_netdev_event(unsigned long event, struct net_device *event_dev)
--{
-- struct bonding *bond, *event_bond = NULL;
-+ read_lock(&bond->lock);
-
-- list_for_each_entry(bond, &bond_dev_list, bond_list) {
-- if (bond == event_dev->priv) {
-- event_bond = bond;
-- break;
-- }
-+ if (!BOND_IS_OK(bond)) {
-+ goto free_out;
- }
-
-- if (event_bond == NULL) {
-- return NOTIFY_DONE;
-- }
-+ slave_no = (data->h_dest[5]^bond_dev->dev_addr[5]) % bond->slave_cnt;
-
-- switch (event) {
-- case NETDEV_CHANGENAME:
-- return bond_event_changename(event_bond);
-- case NETDEV_UNREGISTER:
-- /*
-- * TODO: remove a bond from the list?
-- */
-- break;
-- default:
-- break;
-+ bond_for_each_slave(bond, slave, i) {
-+ slave_no--;
-+ if (slave_no < 0) {
-+ break;
-+ }
- }
-
-- return NOTIFY_DONE;
--}
-+ start_at = slave;
-
--static int bond_slave_netdev_event(unsigned long event, struct net_device *event_dev)
--{
-- struct net_device *master = event_dev->master;
-+ bond_for_each_slave_from(bond, slave, i, start_at) {
-+ if (IS_UP(slave->dev) &&
-+ (slave->link == BOND_LINK_UP) &&
-+ (slave->state == BOND_STATE_ACTIVE)) {
-+ skb->dev = slave->dev;
-+ skb->priority = 1;
-+ dev_queue_xmit(skb);
-
-- switch (event) {
-- case NETDEV_UNREGISTER:
-- if (master != NULL) {
-- bond_release(master, event_dev);
-+ goto out;
- }
-- break;
-- case NETDEV_CHANGE:
-- /*
-- * TODO: is this what we get if somebody
-- * sets up a hierarchical bond, then rmmod's
-- * one of the slave bonding devices?
-- */
-- break;
-- case NETDEV_DOWN:
-- /*
-- * ... Or is it this?
-- */
-- break;
-- case NETDEV_CHANGEMTU:
-- /*
-- * TODO: Should slaves be allowed to
-- * independently alter their MTU? For
-- * an active-backup bond, slaves need
-- * not be the same type of device, so
-- * MTUs may vary. For other modes,
-- * slaves arguably should have the
-- * same MTUs. To do this, we'd need to
-- * take over the slave's change_mtu
-- * function for the duration of their
-- * servitude.
-- */
-- break;
-- case NETDEV_CHANGENAME:
-- /*
-- * TODO: handle changing the primary's name
-- */
-- break;
-- default:
-- break;
- }
-
-- return NOTIFY_DONE;
-+out:
-+ read_unlock(&bond->lock);
-+ return 0;
-+
-+free_out:
-+ /* no suitable interface, frame not sent */
-+ dev_kfree_skb(skb);
-+ goto out;
- }
-
- /*
-- * bond_netdev_event: handle netdev notifier chain events.
-- *
-- * This function receives events for the netdev chain. The caller (an
-- * ioctl handler calling notifier_call_chain) holds the necessary
-- * locks for us to safely manipulate the slave devices (RTNL lock,
-- * dev_probe_lock).
-+ * in broadcast mode, we send everything to all usable interfaces.
- */
--static int bond_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
-+static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *bond_dev)
- {
-- struct net_device *event_dev = (struct net_device *)ptr;
-- unsigned short flags;
-- int res = NOTIFY_DONE;
-+ struct bonding *bond = bond_dev->priv;
-+ struct slave *slave, *start_at;
-+ struct net_device *tx_dev = NULL;
-+ int i;
-
-- dprintk(KERN_INFO "bond_netdev_event n_b %p ev %lx ptr %p\n",
-- this, event, ptr);
-+ read_lock(&bond->lock);
-
-- flags = event_dev->flags & (IFF_MASTER | IFF_SLAVE);
-- switch (flags) {
-- case IFF_MASTER:
-- res = bond_master_netdev_event(event, event_dev);
-- break;
-- case IFF_SLAVE:
-- res = bond_slave_netdev_event(event, event_dev);
-- break;
-- default:
-- /* A master that is also a slave ? */
-- break;
-+ if (!BOND_IS_OK(bond)) {
-+ goto free_out;
- }
-
-- return res;
--}
-+ read_lock(&bond->curr_slave_lock);
-+ start_at = bond->curr_active_slave;
-+ read_unlock(&bond->curr_slave_lock);
-+
-+ if (!start_at) {
-+ goto free_out;
-+ }
-+
-+ bond_for_each_slave_from(bond, slave, i, start_at) {
-+ if (IS_UP(slave->dev) &&
-+ (slave->link == BOND_LINK_UP) &&
-+ (slave->state == BOND_STATE_ACTIVE)) {
-+ if (tx_dev) {
-+ struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
-+ if (!skb2) {
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: bond_xmit_broadcast(): "
-+ "skb_clone() failed\n");
-+ continue;
-+ }
-
--static struct notifier_block bond_netdev_notifier = {
-- .notifier_call = bond_netdev_event,
--};
-+ skb2->dev = tx_dev;
-+ skb2->priority = 1;
-+ dev_queue_xmit(skb2);
-+ }
-+ tx_dev = slave->dev;
-+ }
-+ }
-
--/* De-initialize device specific data.
-- * Caller must hold rtnl_lock.
-- */
--static inline void bond_deinit(struct net_device *dev)
--{
-- struct bonding *bond = dev->priv;
-+ if (tx_dev) {
-+ skb->dev = tx_dev;
-+ skb->priority = 1;
-+ dev_queue_xmit(skb);
-+ } else {
-+ goto free_out;
-+ }
-
-- list_del(&bond->bond_list);
-+out:
-+ /* frame sent to all suitable interfaces */
-+ read_unlock(&bond->lock);
-+ return 0;
-
--#ifdef CONFIG_PROC_FS
-- bond_destroy_proc_info(bond);
--#endif
-+free_out:
-+ /* no suitable interface, frame not sent */
-+ dev_kfree_skb(skb);
-+ goto out;
- }
-
--/* Unregister and free all bond devices.
-- * Caller must hold rtnl_lock.
-- */
--static void bond_free_all(void)
-+#ifdef CONFIG_NET_FASTROUTE
-+static int bond_accept_fastpath(struct net_device *bond_dev, struct dst_entry *dst)
- {
-- struct bonding *bond, *nxt;
--
-- list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list) {
-- struct net_device *dev = bond->device;
--
-- unregister_netdevice(dev);
-- bond_deinit(dev);
-- free_netdev(dev);
-- }
--
--#ifdef CONFIG_PROC_FS
-- bond_destroy_proc_dir();
--#endif
-+ return -1;
- }
-+#endif
-+
-+/*------------------------- Device initialization ---------------------------*/
-
- /*
- * Does not allocate but creates a /proc entry.
- * Allowed to fail.
- */
--static int __init bond_init(struct net_device *dev)
-+static int __init bond_init(struct net_device *bond_dev)
- {
-- struct bonding *bond;
-+ struct bonding *bond = bond_dev->priv;
- int count;
-
--#ifdef BONDING_DEBUG
-- printk (KERN_INFO "Begin bond_init for %s\n", dev->name);
--#endif
-- bond = dev->priv;
-+ dprintk("Begin bond_init for %s\n", bond_dev->name);
-
- /* initialize rwlocks */
- rwlock_init(&bond->lock);
-- rwlock_init(&bond->ptrlock);
-+ rwlock_init(&bond->curr_slave_lock);
-
- /* Initialize pointers */
-- bond->next = bond->prev = (slave_t *)bond;
-- bond->current_slave = NULL;
-+ bond->first_slave = NULL;
-+ bond->curr_active_slave = NULL;
- bond->current_arp_slave = NULL;
-- bond->device = dev;
-+ bond->primary_slave = NULL;
-+ bond->dev = bond_dev;
-
-- /* Initialize the device structure. */
-- dev->set_mac_address = bond_set_mac_address;
-+ /* Initialize the device entry points */
-+ bond_dev->open = bond_open;
-+ bond_dev->stop = bond_close;
-+ bond_dev->get_stats = bond_get_stats;
-+ bond_dev->do_ioctl = bond_do_ioctl;
-+ bond_dev->set_multicast_list = bond_set_multicast_list;
-+ bond_dev->change_mtu = bond_change_mtu;
-+ bond_dev->set_mac_address = bond_set_mac_address;
-
- switch (bond_mode) {
-- case BOND_MODE_ACTIVEBACKUP:
-- dev->hard_start_xmit = bond_xmit_activebackup;
-- break;
- case BOND_MODE_ROUNDROBIN:
-- dev->hard_start_xmit = bond_xmit_roundrobin;
-+ bond_dev->hard_start_xmit = bond_xmit_roundrobin;
-+ break;
-+ case BOND_MODE_ACTIVEBACKUP:
-+ bond_dev->hard_start_xmit = bond_xmit_activebackup;
- break;
- case BOND_MODE_XOR:
-- dev->hard_start_xmit = bond_xmit_xor;
-+ bond_dev->hard_start_xmit = bond_xmit_xor;
- break;
- case BOND_MODE_BROADCAST:
-- dev->hard_start_xmit = bond_xmit_broadcast;
-+ bond_dev->hard_start_xmit = bond_xmit_broadcast;
- break;
- case BOND_MODE_8023AD:
-- dev->hard_start_xmit = bond_3ad_xmit_xor;
-+ bond_dev->hard_start_xmit = bond_3ad_xmit_xor; /* extern */
- break;
- case BOND_MODE_TLB:
- case BOND_MODE_ALB:
-- dev->hard_start_xmit = bond_alb_xmit;
-- dev->set_mac_address = bond_alb_set_mac_address;
-+ bond_dev->hard_start_xmit = bond_alb_xmit; /* extern */
-+ bond_dev->set_mac_address = bond_alb_set_mac_address; /* extern */
- break;
- default:
-- printk(KERN_ERR "Unknown bonding mode %d\n", bond_mode);
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: Unknown bonding mode %d\n",
-+ bond_mode);
- return -EINVAL;
- }
-
-- dev->get_stats = bond_get_stats;
-- dev->open = bond_open;
-- dev->stop = bond_close;
-- dev->set_multicast_list = set_multicast_list;
-- dev->do_ioctl = bond_ioctl;
-- dev->change_mtu = bond_change_mtu;
-- dev->tx_queue_len = 0;
-- dev->flags |= IFF_MASTER|IFF_MULTICAST;
-+ bond_dev->destructor = free_netdev;
- #ifdef CONFIG_NET_FASTROUTE
-- dev->accept_fastpath = bond_accept_fastpath;
-+ bond_dev->accept_fastpath = bond_accept_fastpath;
- #endif
-
-- printk(KERN_INFO "%s registered with", dev->name);
-- if (miimon > 0) {
-+ /* Initialize the device options */
-+ bond_dev->tx_queue_len = 0;
-+ bond_dev->flags |= IFF_MASTER|IFF_MULTICAST;
-+
-+ printk(KERN_INFO DRV_NAME ": %s registered with", bond_dev->name);
-+ if (miimon) {
- printk(" MII link monitoring set to %d ms", miimon);
- updelay /= miimon;
- downdelay /= miimon;
-@@ -3993,19 +3794,20 @@ static int __init bond_init(struct net_d
- }
- printk(", in %s mode.\n", bond_mode_name());
-
-- printk(KERN_INFO "%s registered with", dev->name);
-+ printk(KERN_INFO DRV_NAME ": %s registered with", bond_dev->name);
- if (arp_interval > 0) {
-- printk(" ARP monitoring set to %d ms with %d target(s):",
-- arp_interval, arp_ip_count);
-- for (count=0 ; count<arp_ip_count ; count++)
-- printk (" %s", arp_ip_target[count]);
-+ printk(" ARP monitoring set to %d ms with %d target(s):",
-+ arp_interval, arp_ip_count);
-+ for (count=0 ; count<arp_ip_count ; count++) {
-+ printk(" %s", arp_ip_target[count]);
-+ }
- printk("\n");
- } else {
- printk("out ARP monitoring\n");
- }
--
-+
- #ifdef CONFIG_PROC_FS
-- bond_create_proc_info(bond);
-+ bond_create_proc_entry(bond);
- #endif
-
- list_add_tail(&bond->bond_list, &bond_dev_list);
-@@ -4013,28 +3815,54 @@ static int __init bond_init(struct net_d
- return 0;
- }
-
--/*
--static int __init bond_probe(struct net_device *dev)
-+/* De-initialize device specific data.
-+ * Caller must hold rtnl_lock.
-+ */
-+static inline void bond_deinit(struct net_device *bond_dev)
- {
-- bond_init(dev);
-- return 0;
-+ struct bonding *bond = bond_dev->priv;
-+
-+ list_del(&bond->bond_list);
-+
-+#ifdef CONFIG_PROC_FS
-+ bond_remove_proc_entry(bond);
-+#endif
- }
-+
-+/* Unregister and free all bond devices.
-+ * Caller must hold rtnl_lock.
- */
-+static void bond_free_all(void)
-+{
-+ struct bonding *bond, *nxt;
-+
-+ list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list) {
-+ struct net_device *bond_dev = bond->dev;
-+
-+ unregister_netdevice(bond_dev);
-+ bond_deinit(bond_dev);
-+ }
-+
-+#ifdef CONFIG_PROC_FS
-+ bond_destroy_proc_dir();
-+#endif
-+}
-+
-+/*------------------------- Module initialization ---------------------------*/
-
- /*
- * Convert string input module parms. Accept either the
- * number of the mode or its string name.
- */
--static inline int
--bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl)
-+static inline int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl)
- {
- int i;
-
-- for (i = 0; tbl[i].modename != NULL; i++) {
-+ for (i = 0; tbl[i].modename; i++) {
- if ((isdigit(*mode_arg) &&
-- tbl[i].mode == simple_strtol(mode_arg, NULL, 0)) ||
-- (0 == strncmp(mode_arg, tbl[i].modename,
-- strlen(tbl[i].modename)))) {
-+ tbl[i].mode == simple_strtol(mode_arg, NULL, 0)) ||
-+ (strncmp(mode_arg, tbl[i].modename,
-+ strlen(tbl[i].modename)) == 0)) {
- return tbl[i].mode;
- }
- }
-@@ -4042,88 +3870,64 @@ bond_parse_parm(char *mode_arg, struct b
- return -1;
- }
-
--
--static int __init bonding_init(void)
-+static int bond_check_params(void)
- {
-- int no;
-- int err;
--
-- printk(KERN_INFO "%s", version);
--
- /*
- * Convert string parameters.
- */
- if (mode) {
- bond_mode = bond_parse_parm(mode, bond_mode_tbl);
- if (bond_mode == -1) {
-- printk(KERN_WARNING
-- "bonding_init(): Invalid bonding mode \"%s\"\n",
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: Invalid bonding mode \"%s\"\n",
- mode == NULL ? "NULL" : mode);
- return -EINVAL;
- }
- }
-
-- if (USES_PRIMARY(bond_mode)) {
-- multicast_mode = BOND_MULTICAST_ACTIVE;
-- } else {
-- multicast_mode = BOND_MULTICAST_ALL;
-- }
--
-- if (multicast) {
-- multicast_mode = bond_parse_parm(multicast, bond_mc_tbl);
-- if (multicast_mode == -1) {
-- printk(KERN_WARNING
-- "bonding_init(): Invalid multicast mode \"%s\"\n",
-- multicast == NULL ? "NULL" : multicast);
-- return -EINVAL;
-- }
-- }
--
- if (lacp_rate) {
- if (bond_mode != BOND_MODE_8023AD) {
-- printk(KERN_WARNING
-- "lacp_rate param is irrelevant in mode %s\n",
-+ printk(KERN_INFO DRV_NAME
-+ ": lacp_rate param is irrelevant in mode %s\n",
- bond_mode_name());
- } else {
- lacp_fast = bond_parse_parm(lacp_rate, bond_lacp_tbl);
- if (lacp_fast == -1) {
-- printk(KERN_WARNING
-- "bonding_init(): Invalid lacp rate "
-- "\"%s\"\n",
-+ printk(KERN_ERR DRV_NAME
-+ ": Error: Invalid lacp rate \"%s\"\n",
- lacp_rate == NULL ? "NULL" : lacp_rate);
--
- return -EINVAL;
- }
- }
- }
-
- if (max_bonds < 1 || max_bonds > INT_MAX) {
-- printk(KERN_WARNING
-- "bonding_init(): max_bonds (%d) not in range %d-%d, "
-- "so it was reset to BOND_DEFAULT_MAX_BONDS (%d)",
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: max_bonds (%d) not in range %d-%d, so it "
-+ "was reset to BOND_DEFAULT_MAX_BONDS (%d)",
- max_bonds, 1, INT_MAX, BOND_DEFAULT_MAX_BONDS);
- max_bonds = BOND_DEFAULT_MAX_BONDS;
- }
-
- if (miimon < 0) {
-- printk(KERN_WARNING
-- "bonding_init(): miimon module parameter (%d), "
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: miimon module parameter (%d), "
- "not in range 0-%d, so it was reset to %d\n",
- miimon, INT_MAX, BOND_LINK_MON_INTERV);
- miimon = BOND_LINK_MON_INTERV;
- }
-
- if (updelay < 0) {
-- printk(KERN_WARNING
-- "bonding_init(): updelay module parameter (%d), "
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: updelay module parameter (%d), "
- "not in range 0-%d, so it was reset to 0\n",
- updelay, INT_MAX);
- updelay = 0;
- }
-
- if (downdelay < 0) {
-- printk(KERN_WARNING
-- "bonding_init(): downdelay module parameter (%d), "
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: downdelay module parameter (%d), "
- "not in range 0-%d, so it was reset to 0\n",
- downdelay, INT_MAX);
- downdelay = 0;
-@@ -4131,82 +3935,69 @@ static int __init bonding_init(void)
-
- /* reset values for 802.3ad */
- if (bond_mode == BOND_MODE_8023AD) {
-- if (arp_interval != 0) {
-- printk(KERN_WARNING "bonding_init(): ARP monitoring"
-- "can't be used simultaneously with 802.3ad, "
-- "disabling ARP monitoring\n");
-+ if (arp_interval) {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: ARP monitoring can't be used "
-+ "simultaneously with 802.3ad, disabling ARP "
-+ "monitoring\n");
- arp_interval = 0;
- }
-
-- if (miimon == 0) {
-- printk(KERN_ERR
-- "bonding_init(): miimon must be specified, "
-- "otherwise bonding will not detect link failure, "
-- "speed and duplex which are essential "
-- "for 802.3ad operation\n");
-- printk(KERN_ERR "Forcing miimon to 100msec\n");
-+ if (miimon) {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: miimon must be specified, "
-+ "otherwise bonding will not detect link "
-+ "failure, speed and duplex which are "
-+ "essential for 802.3ad operation\n");
-+ printk(KERN_WARNING "Forcing miimon to 100msec\n");
- miimon = 100;
- }
--
-- if (multicast_mode != BOND_MULTICAST_ALL) {
-- printk(KERN_ERR
-- "bonding_init(): Multicast mode must "
-- "be set to ALL for 802.3ad\n");
-- printk(KERN_ERR "Forcing Multicast mode to ALL\n");
-- multicast_mode = BOND_MULTICAST_ALL;
-- }
- }
-
- /* reset values for TLB/ALB */
- if ((bond_mode == BOND_MODE_TLB) ||
- (bond_mode == BOND_MODE_ALB)) {
-- if (miimon == 0) {
-- printk(KERN_ERR
-- "bonding_init(): miimon must be specified, "
-- "otherwise bonding will not detect link failure "
-- "and link speed which are essential "
-+ if (!miimon) {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: miimon must be specified, "
-+ "otherwise bonding will not detect link "
-+ "failure and link speed which are essential "
- "for TLB/ALB load balancing\n");
-- printk(KERN_ERR "Forcing miimon to 100msec\n");
-+ printk(KERN_WARNING "Forcing miimon to 100msec\n");
- miimon = 100;
- }
--
-- if (multicast_mode != BOND_MULTICAST_ACTIVE) {
-- printk(KERN_ERR
-- "bonding_init(): Multicast mode must "
-- "be set to ACTIVE for TLB/ALB\n");
-- printk(KERN_ERR "Forcing Multicast mode to ACTIVE\n");
-- multicast_mode = BOND_MULTICAST_ACTIVE;
-- }
- }
-
- if (bond_mode == BOND_MODE_ALB) {
-- printk(KERN_INFO
-- "In ALB mode you might experience client disconnections"
-- " upon reconnection of a link if the bonding module"
-- " updelay parameter (%d msec) is incompatible with the"
-- " forwarding delay time of the switch\n", updelay);
-+ printk(KERN_NOTICE DRV_NAME
-+ ": In ALB mode you might experience client "
-+ "disconnections upon reconnection of a link if the "
-+ "bonding module updelay parameter (%d msec) is "
-+ "incompatible with the forwarding delay time of the "
-+ "switch\n",
-+ updelay);
- }
-
-- if (miimon == 0) {
-- if ((updelay != 0) || (downdelay != 0)) {
-+ if (!miimon) {
-+ if (updelay || downdelay) {
- /* just warn the user the up/down delay will have
- * no effect since miimon is zero...
- */
-- printk(KERN_WARNING
-- "bonding_init(): miimon module parameter not "
-- "set and updelay (%d) or downdelay (%d) module "
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: miimon module parameter not set "
-+ "and updelay (%d) or downdelay (%d) module "
- "parameter is set; updelay and downdelay have "
- "no effect unless miimon is set\n",
-- updelay, downdelay);
-+ updelay, downdelay);
- }
- } else {
- /* don't allow arp monitoring */
-- if (arp_interval != 0) {
-- printk(KERN_WARNING
-- "bonding_init(): miimon (%d) and arp_interval "
-- "(%d) can't be used simultaneously, "
-- "disabling ARP monitoring\n",
-- miimon, arp_interval);
-+ if (arp_interval) {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: miimon (%d) and arp_interval (%d) "
-+ "can't be used simultaneously, disabling ARP "
-+ "monitoring\n",
-+ miimon, arp_interval);
- arp_interval = 0;
- }
-
-@@ -4214,103 +4005,114 @@ static int __init bonding_init(void)
- /* updelay will be rounded in bond_init() when it
- * is divided by miimon, we just inform user here
- */
-- printk(KERN_WARNING
-- "bonding_init(): updelay (%d) is not a multiple "
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: updelay (%d) is not a multiple "
- "of miimon (%d), updelay rounded to %d ms\n",
-- updelay, miimon, (updelay / miimon) * miimon);
-+ updelay, miimon, (updelay / miimon) * miimon);
- }
-
- if ((downdelay % miimon) != 0) {
- /* downdelay will be rounded in bond_init() when it
- * is divided by miimon, we just inform user here
- */
-- printk(KERN_WARNING
-- "bonding_init(): downdelay (%d) is not a "
-- "multiple of miimon (%d), downdelay rounded "
-- "to %d ms\n",
-- downdelay, miimon,
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: downdelay (%d) is not a multiple "
-+ "of miimon (%d), downdelay rounded to %d ms\n",
-+ downdelay, miimon,
- (downdelay / miimon) * miimon);
- }
- }
-
- if (arp_interval < 0) {
-- printk(KERN_WARNING
-- "bonding_init(): arp_interval module parameter (%d), "
-- "not in range 0-%d, so it was reset to %d\n",
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: arp_interval module parameter (%d) "
-+ ", not in range 0-%d, so it was reset to %d\n",
- arp_interval, INT_MAX, BOND_LINK_ARP_INTERV);
- arp_interval = BOND_LINK_ARP_INTERV;
- }
-
-- for (arp_ip_count=0 ;
-- (arp_ip_count < MAX_ARP_IP_TARGETS) && arp_ip_target[arp_ip_count];
-- arp_ip_count++ ) {
-+ for (arp_ip_count = 0;
-+ (arp_ip_count < MAX_ARP_IP_TARGETS) && arp_ip_target[arp_ip_count];
-+ arp_ip_count++) {
- /* not complete check, but should be good enough to
- catch mistakes */
-- if (!isdigit(arp_ip_target[arp_ip_count][0])) {
-- printk(KERN_WARNING
-- "bonding_init(): bad arp_ip_target module "
-- "parameter (%s), ARP monitoring will not be "
-- "performed\n",
-- arp_ip_target[arp_ip_count]);
-- arp_interval = 0;
-- } else {
-- u32 ip = in_aton(arp_ip_target[arp_ip_count]);
-+ if (!isdigit(arp_ip_target[arp_ip_count][0])) {
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: bad arp_ip_target module parameter "
-+ "(%s), ARP monitoring will not be performed\n",
-+ arp_ip_target[arp_ip_count]);
-+ arp_interval = 0;
-+ } else {
-+ u32 ip = in_aton(arp_ip_target[arp_ip_count]);
- arp_target[arp_ip_count] = ip;
- }
-- }
--
-+ }
-
-- if ( (arp_interval > 0) && (arp_ip_count==0)) {
-+ if (arp_interval && !arp_ip_count) {
- /* don't allow arping if no arp_ip_target given... */
-- printk(KERN_WARNING
-- "bonding_init(): arp_interval module parameter "
-- "(%d) specified without providing an arp_ip_target "
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: arp_interval module parameter (%d) "
-+ "specified without providing an arp_ip_target "
- "parameter, arp_interval was reset to 0\n",
- arp_interval);
- arp_interval = 0;
- }
-
-- if ((miimon == 0) && (arp_interval == 0)) {
-+ if (!miimon && !arp_interval) {
- /* miimon and arp_interval not set, we need one so things
- * work as expected, see bonding.txt for details
- */
-- printk(KERN_ERR
-- "bonding_init(): either miimon or "
-- "arp_interval and arp_ip_target module parameters "
-- "must be specified, otherwise bonding will not detect "
-- "link failures! see bonding.txt for details.\n");
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: either miimon or arp_interval and "
-+ "arp_ip_target module parameters must be specified, "
-+ "otherwise bonding will not detect link failures! see "
-+ "bonding.txt for details.\n");
- }
-
-- if ((primary != NULL) && !USES_PRIMARY(bond_mode)) {
-+ if (primary && !USES_PRIMARY(bond_mode)) {
- /* currently, using a primary only makes sense
- * in active backup, TLB or ALB modes
- */
-- printk(KERN_WARNING
-- "bonding_init(): %s primary device specified but has "
-- "no effect in %s mode\n",
-+ printk(KERN_WARNING DRV_NAME
-+ ": Warning: %s primary device specified but has no "
-+ "effect in %s mode\n",
- primary, bond_mode_name());
- primary = NULL;
- }
-
-+ return 0;
-+}
-+
-+static int __init bonding_init(void)
-+{
-+ int i;
-+ int res;
-+
-+ printk(KERN_INFO "%s", version);
-+
-+ res = bond_check_params();
-+ if (res) {
-+ return res;
-+ }
-+
- rtnl_lock();
-
- #ifdef CONFIG_PROC_FS
- bond_create_proc_dir();
- #endif
-
-- err = 0;
-- for (no = 0; no < max_bonds; no++) {
-- struct net_device *dev;
--
-- dev = alloc_netdev(sizeof(struct bonding), "", ether_setup);
-- if (!dev) {
-- err = -ENOMEM;
-+ for (i = 0; i < max_bonds; i++) {
-+ struct net_device *bond_dev;
-+
-+ bond_dev = alloc_netdev(sizeof(struct bonding), "", ether_setup);
-+ if (!bond_dev) {
-+ res = -ENOMEM;
- goto out_err;
- }
-
-- err = dev_alloc_name(dev, "bond%d");
-- if (err < 0) {
-- free_netdev(dev);
-+ res = dev_alloc_name(bond_dev, "bond%d");
-+ if (res < 0) {
-+ free_netdev(bond_dev);
- goto out_err;
- }
-
-@@ -4318,18 +4120,18 @@ static int __init bonding_init(void)
- * /proc files), but before register_netdevice(), because we
- * need to set function pointers.
- */
-- err = bond_init(dev);
-- if (err < 0) {
-- free_netdev(dev);
-+ res = bond_init(bond_dev);
-+ if (res < 0) {
-+ free_netdev(bond_dev);
- goto out_err;
- }
-
-- SET_MODULE_OWNER(dev);
-+ SET_MODULE_OWNER(bond_dev);
-
-- err = register_netdevice(dev);
-- if (err < 0) {
-- bond_deinit(dev);
-- free_netdev(dev);
-+ res = register_netdevice(bond_dev);
-+ if (res < 0) {
-+ bond_deinit(bond_dev);
-+ free_netdev(bond_dev);
- goto out_err;
- }
- }
-@@ -4345,7 +4147,7 @@ out_err:
-
- rtnl_unlock();
-
-- return err;
-+ return res;
- }
-
- static void __exit bonding_exit(void)
-@@ -4361,6 +4163,8 @@ module_init(bonding_init);
- module_exit(bonding_exit);
- MODULE_LICENSE("GPL");
- MODULE_DESCRIPTION(DRV_DESCRIPTION ", v" DRV_VERSION);
-+MODULE_AUTHOR("Thomas Davis, tadavis@lbl.gov and many others");
-+MODULE_SUPPORTED_DEVICE("most ethernet devices");
-
- /*
- * Local variables:
-@@ -4369,3 +4173,4 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION ", v"
- * tab-width: 8
- * End:
- */
-+
---- linux-2.6.0/drivers/net/cs89x0.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/cs89x0.c 2003-12-28 23:23:06.000000000 -0800
-@@ -47,7 +47,7 @@
- : <klee@crystal.cirrus.com>)
- : Don't call netif_wake_queue() in net_send_packet()
- : Fixed an out-of-mem bug in dma_rx()
-- : Updated Documentation/cs89x0.txt
-+ : Updated Documentation/networking/cs89x0.txt
-
- Andrew Morton : andrewm@uow.edu.au / Kernel 2.3.99-pre1
- : Use skb_reserve to longword align IP header (two places)
-@@ -212,9 +212,7 @@ struct net_local {
-
- /* Index to functions, as function prototypes. */
-
--extern int cs89x0_probe(struct net_device *dev);
--
--static int cs89x0_probe1(struct net_device *dev, int ioaddr);
-+static int cs89x0_probe1(struct net_device *dev, int ioaddr, int modular);
- static int net_open(struct net_device *dev);
- static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
- static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-@@ -274,27 +272,51 @@ __setup("cs89x0_media=", media_fn);
- Return 0 on success.
- */
-
--int __init cs89x0_probe(struct net_device *dev)
-+struct net_device * __init cs89x0_probe(int unit)
- {
-- int i;
-- int base_addr = dev ? dev->base_addr : 0;
--
-- SET_MODULE_OWNER(dev);
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-+ unsigned *port;
-+ int err = 0;
-+ int irq;
-+ int io;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-
- if (net_debug)
-- printk("cs89x0:cs89x0_probe(0x%x)\n", base_addr);
-+ printk("cs89x0:cs89x0_probe(0x%x)\n", io);
-
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return cs89x0_probe1(dev, base_addr);
-- else if (base_addr != 0) /* Don't probe at all. */
-- return -ENXIO;
--
-- for (i = 0; netcard_portlist[i]; i++) {
-- if (cs89x0_probe1(dev, netcard_portlist[i]) == 0)
-- return 0;
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = cs89x0_probe1(dev, io, 0);
-+ } else if (io != 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (port = netcard_portlist; *port; port++) {
-+ if (cs89x0_probe1(dev, *port, 0) == 0)
-+ break;
-+ dev->irq = irq;
-+ }
-+ if (!*port)
-+ err = -ENODEV;
- }
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ outw(PP_ChipID, dev->base_addr + ADD_PORT);
-+ release_region(dev->base_addr, NETCARD_IO_EXTENT);
-+out:
-+ free_netdev(dev);
- printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n");
-- return -ENODEV;
-+ return ERR_PTR(err);
- }
-
- static int
-@@ -375,39 +397,34 @@ get_eeprom_cksum(int off, int len, int *
- */
-
- static int __init
--cs89x0_probe1(struct net_device *dev, int ioaddr)
-+cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
- {
-- struct net_local *lp;
-+ struct net_local *lp = (struct net_local *)dev->priv;
- static unsigned version_printed;
- int i;
- unsigned rev_type = 0;
- int eeprom_buff[CHKSUM_LEN];
- int retval;
-
-+ SET_MODULE_OWNER(dev);
- /* Initialize the device structure. */
-- if (dev->priv == NULL) {
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (dev->priv == 0) {
-- retval = -ENOMEM;
-- goto out;
-- }
-- lp = (struct net_local *)dev->priv;
-+ if (!modular) {
- memset(lp, 0, sizeof(*lp));
- spin_lock_init(&lp->lock);
--#if !defined(MODULE) && (ALLOW_DMA != 0)
-+#ifndef MODULE
-+#if ALLOW_DMA
- if (g_cs89x0_dma) {
- lp->use_dma = 1;
- lp->dma = g_cs89x0_dma;
- lp->dmasize = 16; /* Could make this an option... */
- }
- #endif
--#ifndef MODULE
- lp->force = g_cs89x0_media__force;
- #endif
- }
-- lp = (struct net_local *)dev->priv;
-
- /* Grab the region so we can find another board if autoIRQ fails. */
-+ /* WTF is going on here? */
- if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, dev->name)) {
- printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n",
- dev->name, ioaddr, NETCARD_IO_EXTENT);
-@@ -696,9 +713,6 @@ printk("PP_addr=0x%x\n", inw(ioaddr + AD
- dev->set_multicast_list = set_multicast_list;
- dev->set_mac_address = set_mac_address;
-
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--
- printk("\n");
- if (net_debug)
- printk("cs89x0_probe1() successful\n");
-@@ -706,9 +720,6 @@ printk("PP_addr=0x%x\n", inw(ioaddr + AD
- out2:
- release_region(ioaddr & ~3, NETCARD_IO_EXTENT);
- out1:
-- kfree(dev->priv);
-- dev->priv = 0;
--out:
- return retval;
- }
-
-@@ -1655,7 +1666,7 @@ static int set_mac_address(struct net_de
-
- #ifdef MODULE
-
--static struct net_device dev_cs89x0;
-+static struct net_device *dev_cs89x0;
-
- /*
- * Support the 'debug' module parm even if we're compiled for non-debug to
-@@ -1733,6 +1744,7 @@ MODULE_LICENSE("GPL");
- int
- init_module(void)
- {
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
- struct net_local *lp;
- int ret = 0;
-
-@@ -1741,18 +1753,12 @@ init_module(void)
- #else
- debug = 0;
- #endif
--
-- dev_cs89x0.irq = irq;
-- dev_cs89x0.base_addr = io;
--
-- dev_cs89x0.init = cs89x0_probe;
-- dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (dev_cs89x0.priv == 0) {
-- printk(KERN_ERR "cs89x0.c: Out of memory.\n");
-+ if (!dev)
- return -ENOMEM;
-- }
-- memset(dev_cs89x0.priv, 0, sizeof(struct net_local));
-- lp = (struct net_local *)dev_cs89x0.priv;
-+
-+ dev->irq = irq;
-+ dev->base_addr = io;
-+ lp = dev->priv;
-
- #if ALLOW_DMA
- if (use_dma) {
-@@ -1782,7 +1788,10 @@ init_module(void)
- printk(KERN_ERR "cs89x0.c: Append io=0xNNN\n");
- ret = -EPERM;
- goto out;
-- }
-+ } else if (io <= 0x1ff) {
-+ ret = -ENXIO;
-+ goto out;
-+ }
-
- #if ALLOW_DMA
- if (use_dma && dmasize != 16 && dmasize != 64) {
-@@ -1791,30 +1800,31 @@ init_module(void)
- goto out;
- }
- #endif
-+ ret = cs89x0_probe1(dev, io, 1);
-+ if (ret)
-+ goto out;
-
-- if (register_netdev(&dev_cs89x0) != 0) {
-+ if (register_netdev(dev) != 0) {
- printk(KERN_ERR "cs89x0.c: No card found at 0x%x\n", io);
- ret = -ENXIO;
-+ outw(PP_ChipID, dev->base_addr + ADD_PORT);
-+ release_region(dev->base_addr, NETCARD_IO_EXTENT);
- goto out;
- }
-+ dev_cs89x0 = dev;
-+ return 0;
- out:
-- if (ret)
-- kfree(dev_cs89x0.priv);
-+ free_netdev(dev);
- return ret;
- }
-
- void
- cleanup_module(void)
- {
-- if (dev_cs89x0.priv != NULL) {
-- /* Free up the private structure, or leak memory :-) */
-- unregister_netdev(&dev_cs89x0);
-- outw(PP_ChipID, dev_cs89x0.base_addr + ADD_PORT);
-- kfree(dev_cs89x0.priv);
-- dev_cs89x0.priv = NULL; /* gets re-allocated by cs89x0_probe1 */
-- /* If we don't do this, we can't re-insmod it later. */
-- release_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT);
-- }
-+ unregister_netdev(dev_cs89x0);
-+ outw(PP_ChipID, dev_cs89x0->base_addr + ADD_PORT);
-+ release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);
-+ free_netdev(dev_cs89x0);
- }
- #endif /* MODULE */
- \f
---- linux-2.6.0/drivers/net/de600.c 2003-06-14 12:18:35.000000000 -0700
-+++ 25/drivers/net/de600.c 2003-12-28 23:21:01.000000000 -0800
-@@ -99,7 +99,7 @@ static volatile int tx_fifo_in;
- static volatile int tx_fifo_out;
- static volatile int free_tx_pages = TX_PAGES;
- static int was_down;
--static spinlock_t de600_lock;
-+static spinlock_t de600_lock = SPIN_LOCK_UNLOCKED;
-
- static inline u8 de600_read_status(struct net_device *dev)
- {
-@@ -398,20 +398,31 @@ static void de600_rx_intr(struct net_dev
- */
- }
-
--int __init de600_probe(struct net_device *dev)
-+static struct net_device * __init de600_probe(void)
- {
- int i;
-- static struct net_device_stats de600_netstats;
-- /*dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL);*/
-+ struct net_device *dev;
-+ int err;
-+
-+ dev = alloc_etherdev(sizeof(struct net_device_stats));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
- SET_MODULE_OWNER(dev);
-
-+ if (!request_region(DE600_IO, 3, "de600")) {
-+ printk(KERN_WARNING "DE600: port 0x%x busy\n", DE600_IO);
-+ err = -EBUSY;
-+ goto out;
-+ }
-+
- printk(KERN_INFO "%s: D-Link DE-600 pocket adapter", dev->name);
- /* Alpha testers must have the version number to report bugs. */
- if (de600_debug > 1)
- printk(version);
-
- /* probe for adapter */
-+ err = -ENODEV;
- rx_page = 0;
- select_nic();
- (void)de600_read_status(dev);
-@@ -419,7 +430,7 @@ int __init de600_probe(struct net_device
- de600_put_command(STOP_RESET);
- if (de600_read_status(dev) & 0xf0) {
- printk(": not at I/O %#3x.\n", DATA_PORT);
-- return -ENODEV;
-+ goto out1;
- }
-
- /*
-@@ -444,12 +455,7 @@ int __init de600_probe(struct net_device
- dev->dev_addr[3] |= 0x70;
- } else {
- printk(" not identified in the printer port\n");
-- return -ENODEV;
-- }
--
-- if (!request_region(DE600_IO, 3, "de600")) {
-- printk(KERN_WARNING "DE600: port 0x%x busy\n", DE600_IO);
-- return -EBUSY;
-+ goto out1;
- }
-
- printk(", Ethernet Address: %02X", dev->dev_addr[0]);
-@@ -457,22 +463,27 @@ int __init de600_probe(struct net_device
- printk(":%02X",dev->dev_addr[i]);
- printk("\n");
-
-- /* Initialize the device structure. */
-- dev->priv = &de600_netstats;
--
-- memset(dev->priv, 0, sizeof(struct net_device_stats));
- dev->get_stats = get_stats;
-
- dev->open = de600_open;
- dev->stop = de600_close;
- dev->hard_start_xmit = &de600_start_xmit;
-
-- ether_setup(dev);
--
- dev->flags&=~IFF_MULTICAST;
-
- select_prn();
-- return 0;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+
-+ return dev;
-+
-+out1:
-+ release_region(DE600_IO, 3);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int adapter_init(struct net_device *dev)
-@@ -527,21 +538,21 @@ static int adapter_init(struct net_devic
- return 0; /* OK */
- }
-
--static struct net_device de600_dev;
-+static struct net_device *de600_dev;
-
- static int __init de600_init(void)
- {
-- spin_lock_init(&de600_lock);
-- de600_dev.init = de600_probe;
-- if (register_netdev(&de600_dev) != 0)
-- return -EIO;
-+ de600_dev = de600_probe();
-+ if (IS_ERR(de600_dev))
-+ return PTR_ERR(de600_dev);
- return 0;
- }
-
- static void __exit de600_exit(void)
- {
-- unregister_netdev(&de600_dev);
-+ unregister_netdev(de600_dev);
- release_region(DE600_IO, 3);
-+ free_netdev(de600_dev);
- }
-
- module_init(de600_init);
---- linux-2.6.0/drivers/net/de600.h 2003-06-14 12:18:23.000000000 -0700
-+++ 25/drivers/net/de600.h 2003-12-28 23:21:01.000000000 -0800
-@@ -131,7 +131,6 @@ static void de600_rx_intr(struct net_dev
-
- /* Initialization */
- static void trigger_interrupt(struct net_device *dev);
--int de600_probe(struct net_device *dev);
- static int adapter_init(struct net_device *dev);
-
- /*
---- linux-2.6.0/drivers/net/de620.c 2003-06-14 12:18:22.000000000 -0700
-+++ 25/drivers/net/de620.c 2003-12-28 23:21:01.000000000 -0800
-@@ -226,7 +226,6 @@ static int de620_rx_intr(struct net_devi
-
- /* Initialization */
- static int adapter_init(struct net_device *);
--int de620_probe(struct net_device *);
- static int read_eeprom(struct net_device *);
-
-
-@@ -814,11 +813,16 @@ static int adapter_init(struct net_devic
- *
- * Check if there is a DE-620 connected
- */
--int __init de620_probe(struct net_device *dev)
-+struct net_device * __init de620_probe(int unit)
- {
-- static struct net_device_stats de620_netstats;
-- int i;
- byte checkbyte = 0xa5;
-+ struct net_device *dev;
-+ int err = -ENOMEM;
-+ int i;
-+
-+ dev = alloc_etherdev(sizeof(struct net_device_stats));
-+ if (!dev)
-+ goto out;
-
- SET_MODULE_OWNER(dev);
-
-@@ -831,11 +835,23 @@ int __init de620_probe(struct net_device
- dev->base_addr = io;
- dev->irq = irq;
-
-+ /* allow overriding parameters on command line */
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-+
- if (de620_debug)
- printk(version);
-
- printk(KERN_INFO "D-Link DE-620 pocket adapter");
-
-+ if (!request_region(dev->base_addr, 3, "de620")) {
-+ printk(" io 0x%3lX, which is busy.\n", dev->base_addr);
-+ err = -EBUSY;
-+ goto out1;
-+ }
-+
- /* Initially, configure basic nibble mode, so we can read the EEPROM */
- NIC_Cmd = DEF_NIC_CMD;
- de620_set_register(dev, W_EIP, EIPRegister);
-@@ -846,12 +862,8 @@ int __init de620_probe(struct net_device
-
- if ((checkbyte != 0xa5) || (read_eeprom(dev) != 0)) {
- printk(" not identified in the printer port\n");
-- return -ENODEV;
-- }
--
-- if (!request_region(dev->base_addr, 3, "de620")) {
-- printk(KERN_ERR "io 0x%3lX, which is busy.\n", dev->base_addr);
-- return -EBUSY;
-+ err = -ENODEV;
-+ goto out2;
- }
-
- /* else, got it! */
-@@ -870,10 +882,6 @@ int __init de620_probe(struct net_device
- else
- printk(" UTP)\n");
-
-- /* Initialize the device structure. */
-- dev->priv = &de620_netstats;
--
-- memset(dev->priv, 0, sizeof(struct net_device_stats));
- dev->get_stats = get_stats;
- dev->open = de620_open;
- dev->stop = de620_close;
-@@ -884,8 +892,6 @@ int __init de620_probe(struct net_device
-
- /* base_addr and irq are already set, see above! */
-
-- ether_setup(dev);
--
- /* dump eeprom */
- if (de620_debug) {
- printk("\nEEPROM contents:\n");
-@@ -899,7 +905,17 @@ int __init de620_probe(struct net_device
- printk("SCR = 0x%02x\n", nic_data.SCR);
- }
-
-- return 0;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out2;
-+ return dev;
-+
-+out2:
-+ release_region(dev->base_addr, 3);
-+out1:
-+ free_netdev(dev);
-+out:
-+ return ERR_PTR(err);
- }
- \f
- /**********************************
-@@ -994,20 +1010,21 @@ static int __init read_eeprom(struct net
- *
- */
- #ifdef MODULE
--static struct net_device de620_dev;
-+static struct net_device *de620_dev;
-
- int init_module(void)
- {
-- de620_dev.init = de620_probe;
-- if (register_netdev(&de620_dev) != 0)
-- return -EIO;
-+ de620_dev = de620_probe(-1);
-+ if (IS_ERR(de620_dev))
-+ return PTR_ERR(de620_dev);
- return 0;
- }
-
- void cleanup_module(void)
- {
-- unregister_netdev(&de620_dev);
-- release_region(de620_dev.base_addr, 3);
-+ unregister_netdev(de620_dev);
-+ release_region(de620_dev->base_addr, 3);
-+ free_netdev(de620_dev);
- }
- #endif /* MODULE */
- MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/net/declance.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/declance.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1039,13 +1039,13 @@ static int __init dec_lance_init(const i
- if (dec_lance_debug && version_printed++ == 0)
- printk(version);
-
-- dev = init_etherdev(NULL, sizeof(struct lance_private));
-+ dev = alloc_etherdev(sizeof(struct lance_private));
- if (!dev)
- return -ENOMEM;
- SET_MODULE_OWNER(dev);
-
- /*
-- * init_etherdev ensures the data structures used by the LANCE
-+ * alloc_etherdev ensures the data structures used by the LANCE
- * are aligned.
- */
- lp = (struct lance_private *) dev->priv;
-@@ -1188,9 +1188,6 @@ static int __init dec_lance_init(const i
- }
- }
-
-- lp->next = root_lance_dev;
-- root_lance_dev = dev;
--
- /* Copy the ethernet address to the device structure, later to the
- * lance initialization block so the lance gets it every time it's
- * (re)initialized.
-@@ -1239,11 +1236,14 @@ static int __init dec_lance_init(const i
- init_timer(&lp->multicast_timer);
- lp->multicast_timer.data = (unsigned long) dev;
- lp->multicast_timer.function = &lance_set_multicast_retry;
--
-+ ret = register_netdev(dev);
-+ if (ret)
-+ goto err_out;
-+ lp->next = root_lance_dev;
-+ root_lance_dev = dev;
- return 0;
-
- err_out:
-- unregister_netdev(dev);
- free_netdev(dev);
- return ret;
- }
-@@ -1288,13 +1288,12 @@ static void __exit dec_lance_cleanup(voi
- while (root_lance_dev) {
- struct net_device *dev = root_lance_dev;
- struct lance_private *lp = (struct lance_private *)dev->priv;
--
-+ unregister_netdev(dev);
- #ifdef CONFIG_TC
- if (lp->slot >= 0)
- release_tc_card(lp->slot);
- #endif
- root_lance_dev = lp->next;
-- unregister_netdev(dev);
- free_netdev(dev);
- }
- }
---- linux-2.6.0/drivers/net/defxx.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/defxx.c 2003-12-28 23:21:01.000000000 -0800
-@@ -491,7 +491,7 @@ err_out_kfree:
- err_out_region:
- release_region(ioaddr, pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN);
- err_out:
-- kfree(dev);
-+ free_netdev(dev);
- return err;
- }
-
---- linux-2.6.0/drivers/net/depca.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/depca.c 2003-12-28 23:21:01.000000000 -0800
-@@ -681,8 +681,7 @@ static int __init depca_hw_init (struct
- lp->sh_mem = ioremap(mem_start, mem_len);
- if (lp->sh_mem == NULL) {
- printk(KERN_ERR "depca: cannot remap ISA memory, aborting\n");
-- release_mem_region (mem_start, mem_len);
-- goto out_priv;
-+ goto out1;
- }
-
- lp->mem_start = mem_start;
-@@ -771,7 +770,7 @@ static int __init depca_hw_init (struct
- status = -ENXIO;
- if (!irqnum) {
- printk(" and failed to detect IRQ line.\n");
-- goto out_priv;
-+ goto out2;
- } else {
- for (dev->irq = 0, i = 0; (depca_irq[i]) && (!dev->irq); i++)
- if (irqnum == depca_irq[i]) {
-@@ -781,7 +780,7 @@ static int __init depca_hw_init (struct
-
- if (!dev->irq) {
- printk(" but incorrect IRQ line detected.\n");
-- return -ENXIO;
-+ goto out2;
- }
- }
- } else {
-@@ -807,11 +806,14 @@ static int __init depca_hw_init (struct
- device->driver_data = dev;
- SET_NETDEV_DEV (dev, device);
-
-- register_netdev (dev);
-- return 0;
--
-- out_priv:
--
-+ status = register_netdev(dev);
-+ if (status == 0)
-+ return 0;
-+out2:
-+ iounmap(lp->sh_mem);
-+out1:
-+ release_mem_region (mem_start, mem_len);
-+out_priv:
- return status;
- }
- \f
---- linux-2.6.0/drivers/net/dummy.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/dummy.c 2003-12-28 23:21:01.000000000 -0800
-@@ -96,7 +96,7 @@ static int __init dummy_init_module(void
- return -ENOMEM;
-
- if ((err = register_netdev(dev_dummy))) {
-- kfree(dev_dummy);
-+ free_netdev(dev_dummy);
- dev_dummy = NULL;
- }
- return err;
---- linux-2.6.0/drivers/net/e1000/e1000_ethtool.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/e1000/e1000_ethtool.c 2003-12-28 23:21:01.000000000 -0800
-@@ -39,6 +39,10 @@ extern int e1000_up(struct e1000_adapter
- extern void e1000_down(struct e1000_adapter *adapter);
- extern void e1000_reset(struct e1000_adapter *adapter);
- extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx);
-+extern int e1000_setup_rx_resources(struct e1000_adapter *adapter);
-+extern int e1000_setup_tx_resources(struct e1000_adapter *adapter);
-+extern void e1000_free_rx_resources(struct e1000_adapter *adapter);
-+extern void e1000_free_tx_resources(struct e1000_adapter *adapter);
-
- struct e1000_stats {
- char stat_string[ETH_GSTRING_LEN];
-@@ -440,6 +444,71 @@ seeprom_error:
- return ret_val;
- }
-
-+static int
-+e1000_ethtool_gring(struct e1000_adapter *adapter,
-+ struct ethtool_ringparam *ring)
-+{
-+ e1000_mac_type mac_type = adapter->hw.mac_type;
-+ struct e1000_desc_ring *txdr = &adapter->tx_ring;
-+ struct e1000_desc_ring *rxdr = &adapter->rx_ring;
-+
-+ ring->rx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_RXD :
-+ E1000_MAX_82544_RXD;
-+ ring->tx_max_pending = (mac_type < e1000_82544) ? E1000_MAX_TXD :
-+ E1000_MAX_82544_TXD;
-+ ring->rx_mini_max_pending = 0;
-+ ring->rx_jumbo_max_pending = 0;
-+ ring->rx_pending = rxdr->count;
-+ ring->tx_pending = txdr->count;
-+ ring->rx_mini_pending = 0;
-+ ring->rx_jumbo_pending = 0;
-+
-+ return 0;
-+}
-+static int
-+e1000_ethtool_sring(struct e1000_adapter *adapter,
-+ struct ethtool_ringparam *ring)
-+{
-+ int err;
-+ e1000_mac_type mac_type = adapter->hw.mac_type;
-+ struct e1000_desc_ring *txdr = &adapter->tx_ring;
-+ struct e1000_desc_ring *rxdr = &adapter->rx_ring;
-+
-+ if(netif_running(adapter->netdev)) {
-+ e1000_down(adapter);
-+ e1000_free_rx_resources(adapter);
-+ e1000_free_tx_resources(adapter);
-+ }
-+
-+ rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD);
-+ rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ?
-+ E1000_MAX_RXD : E1000_MAX_82544_RXD));
-+ E1000_ROUNDUP(rxdr->count, REQ_RX_DESCRIPTOR_MULTIPLE);
-+
-+ txdr->count = max(ring->tx_pending,(uint32_t)E1000_MIN_TXD);
-+ txdr->count = min(txdr->count,(uint32_t)(mac_type < e1000_82544 ?
-+ E1000_MAX_TXD : E1000_MAX_82544_TXD));
-+ E1000_ROUNDUP(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE);
-+
-+ if(netif_running(adapter->netdev)) {
-+ if((err = e1000_setup_rx_resources(adapter)))
-+ goto err_setup_rx;
-+ if((err = e1000_setup_tx_resources(adapter)))
-+ goto err_setup_tx;
-+ if((err = e1000_up(adapter)))
-+ goto err_up;
-+ }
-+
-+ return 0;
-+err_up:
-+ e1000_free_tx_resources(adapter);
-+err_setup_tx:
-+ e1000_free_rx_resources(adapter);
-+err_setup_rx:
-+ e1000_reset(adapter);
-+ return err;
-+}
-+
- #define REG_PATTERN_TEST(R, M, W) \
- { \
- uint32_t pat, value; \
-@@ -579,8 +648,8 @@ e1000_intr_test(struct e1000_adapter *ad
- *data = 0;
-
- /* Hook up test interrupt handler just for this test */
-- if(request_irq
-- (netdev->irq, &e1000_test_intr, SA_SHIRQ, netdev->name, netdev)) {
-+ if(request_irq(adapter->pdev->irq, &e1000_test_intr, SA_SHIRQ,
-+ netdev->name, netdev)) {
- *data = 1;
- return -1;
- }
-@@ -664,7 +733,7 @@ e1000_intr_test(struct e1000_adapter *ad
- msec_delay(10);
-
- /* Unhook test interrupt handler */
-- free_irq(netdev->irq, netdev);
-+ free_irq(adapter->pdev->irq, netdev);
-
- return *data;
- }
-@@ -770,9 +839,9 @@ e1000_setup_desc_rings(struct e1000_adap
- PCI_DMA_TODEVICE);
- tx_desc->buffer_addr = cpu_to_le64(txdr->buffer_info[i].dma);
- tx_desc->lower.data = cpu_to_le32(skb->len);
-- tx_desc->lower.data |= E1000_TXD_CMD_EOP;
-- tx_desc->lower.data |= E1000_TXD_CMD_IFCS;
-- tx_desc->lower.data |= E1000_TXD_CMD_RPS;
-+ tx_desc->lower.data |= cpu_to_le32(E1000_TXD_CMD_EOP |
-+ E1000_TXD_CMD_IFCS |
-+ E1000_TXD_CMD_RPS);
- tx_desc->upper.data = 0;
- }
-
-@@ -1502,6 +1571,19 @@ err_geeprom_ioctl:
- addr += offsetof(struct ethtool_eeprom, data);
- return e1000_ethtool_seeprom(adapter, &eeprom, addr);
- }
-+ case ETHTOOL_GRINGPARAM: {
-+ struct ethtool_ringparam ering = {ETHTOOL_GRINGPARAM};
-+ e1000_ethtool_gring(adapter, &ering);
-+ if(copy_to_user(addr, &ering, sizeof(ering)))
-+ return -EFAULT;
-+ return 0;
-+ }
-+ case ETHTOOL_SRINGPARAM: {
-+ struct ethtool_ringparam ering;
-+ if(copy_from_user(&ering, addr, sizeof(ering)))
-+ return -EFAULT;
-+ return e1000_ethtool_sring(adapter, &ering);
-+ }
- case ETHTOOL_GPAUSEPARAM: {
- struct ethtool_pauseparam epause = {ETHTOOL_GPAUSEPARAM};
- e1000_ethtool_gpause(adapter, &epause);
---- linux-2.6.0/drivers/net/e1000/e1000.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/e1000/e1000.h 2003-12-28 23:21:01.000000000 -0800
-@@ -92,6 +92,16 @@ struct e1000_adapter;
-
- #define E1000_MAX_INTR 10
-
-+/* How many descriptors for TX and RX ? */
-+#define E1000_DEFAULT_TXD 256
-+#define E1000_MAX_TXD 256
-+#define E1000_MIN_TXD 80
-+#define E1000_MAX_82544_TXD 4096
-+#define E1000_DEFAULT_RXD 256
-+#define E1000_MAX_RXD 256
-+#define E1000_MIN_RXD 80
-+#define E1000_MAX_82544_RXD 4096
-+
- /* Supported Rx Buffer Sizes */
- #define E1000_RXBUFFER_2048 2048
- #define E1000_RXBUFFER_4096 4096
---- linux-2.6.0/drivers/net/e1000/e1000_hw.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/e1000/e1000_hw.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1485,8 +1485,8 @@ e1000_phy_force_speed_duplex(struct e100
- if(mii_status_reg & MII_SR_LINK_STATUS) break;
- msec_delay(100);
- }
-- if(i == 0) { /* We didn't get link */
-- /* Reset the DSP and wait again for link. */
-+ if((i == 0) && (hw->phy_type == e1000_phy_m88)) {
-+ /* We didn't get link. Reset the DSP and wait again for link. */
- if((ret_val = e1000_phy_reset_dsp(hw))) {
- DEBUGOUT("Error Resetting PHY DSP\n");
- return ret_val;
-@@ -2081,6 +2081,25 @@ e1000_check_for_link(struct e1000_hw *hw
- DEBUGOUT("RXing /C/, enable AutoNeg and stop forcing link.\r\n");
- E1000_WRITE_REG(hw, TXCW, hw->txcw);
- E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU));
-+
-+ hw->serdes_link_down = FALSE;
-+ }
-+ /* If we force link for non-auto-negotiation switch, check link status
-+ * based on MAC synchronization for internal serdes media type.
-+ */
-+ else if((hw->media_type == e1000_media_type_internal_serdes) &&
-+ !(E1000_TXCW_ANE & E1000_READ_REG(hw, TXCW))) {
-+ /* SYNCH bit and IV bit are sticky. */
-+ udelay(10);
-+ if(E1000_RXCW_SYNCH & E1000_READ_REG(hw, RXCW)) {
-+ if(!(rxcw & E1000_RXCW_IV)) {
-+ hw->serdes_link_down = FALSE;
-+ DEBUGOUT("SERDES: Link is up.\n");
-+ }
-+ } else {
-+ hw->serdes_link_down = TRUE;
-+ DEBUGOUT("SERDES: Link is down.\n");
-+ }
- }
- return E1000_SUCCESS;
- }
-@@ -2481,8 +2500,8 @@ e1000_write_phy_reg_ex(struct e1000_hw *
- E1000_WRITE_REG(hw, MDIC, mdic);
-
- /* Poll the ready bit to see if the MDI read completed */
-- for(i = 0; i < 64; i++) {
-- udelay(50);
-+ for(i = 0; i < 640; i++) {
-+ udelay(5);
- mdic = E1000_READ_REG(hw, MDIC);
- if(mdic & E1000_MDIC_READY) break;
- }
-@@ -3498,10 +3517,12 @@ e1000_write_eeprom(struct e1000_hw *hw,
- if (e1000_acquire_eeprom(hw) != E1000_SUCCESS)
- return -E1000_ERR_EEPROM;
-
-- if(eeprom->type == e1000_eeprom_microwire)
-+ if(eeprom->type == e1000_eeprom_microwire) {
- status = e1000_write_eeprom_microwire(hw, offset, words, data);
-- else
-+ } else {
- status = e1000_write_eeprom_spi(hw, offset, words, data);
-+ msec_delay(10);
-+ }
-
- /* Done with writing */
- e1000_release_eeprom(hw);
-@@ -3719,12 +3740,9 @@ e1000_read_mac_addr(struct e1000_hw * hw
- hw->perm_mac_addr[i+1] = (uint8_t) (eeprom_data >> 8);
- }
- if(((hw->mac_type == e1000_82546) || (hw->mac_type == e1000_82546_rev_3)) &&
-- (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
-- if(hw->perm_mac_addr[5] & 0x01)
-- hw->perm_mac_addr[5] &= ~(0x01);
-- else
-- hw->perm_mac_addr[5] |= 0x01;
-- }
-+ (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1))
-+ hw->perm_mac_addr[5] ^= 0x01;
-+
- for(i = 0; i < NODE_ADDRESS_SIZE; i++)
- hw->mac_addr[i] = hw->perm_mac_addr[i];
- return E1000_SUCCESS;
-@@ -3743,22 +3761,13 @@ void
- e1000_init_rx_addrs(struct e1000_hw *hw)
- {
- uint32_t i;
-- uint32_t addr_low;
-- uint32_t addr_high;
-
- DEBUGFUNC("e1000_init_rx_addrs");
-
- /* Setup the receive address. */
- DEBUGOUT("Programming MAC Address into RAR[0]\n");
-- addr_low = (hw->mac_addr[0] |
-- (hw->mac_addr[1] << 8) |
-- (hw->mac_addr[2] << 16) | (hw->mac_addr[3] << 24));
--
-- addr_high = (hw->mac_addr[4] |
-- (hw->mac_addr[5] << 8) | E1000_RAH_AV);
-
-- E1000_WRITE_REG_ARRAY(hw, RA, 0, addr_low);
-- E1000_WRITE_REG_ARRAY(hw, RA, 1, addr_high);
-+ e1000_rar_set(hw, hw->mac_addr, 0);
-
- /* Zero out the other 15 receive addresses. */
- DEBUGOUT("Clearing RAR[1-15]\n");
-@@ -3785,11 +3794,11 @@ void
- e1000_mc_addr_list_update(struct e1000_hw *hw,
- uint8_t *mc_addr_list,
- uint32_t mc_addr_count,
-- uint32_t pad)
-+ uint32_t pad,
-+ uint32_t rar_used_count)
- {
- uint32_t hash_value;
- uint32_t i;
-- uint32_t rar_used_count = 1; /* RAR[0] is used for our MAC address */
-
- DEBUGFUNC("e1000_mc_addr_list_update");
-
-@@ -4523,8 +4532,8 @@ uint32_t
- e1000_read_reg_io(struct e1000_hw *hw,
- uint32_t offset)
- {
-- uint32_t io_addr = hw->io_base;
-- uint32_t io_data = hw->io_base + 4;
-+ unsigned long io_addr = hw->io_base;
-+ unsigned long io_data = hw->io_base + 4;
-
- e1000_io_write(hw, io_addr, offset);
- return e1000_io_read(hw, io_data);
-@@ -4543,8 +4552,8 @@ e1000_write_reg_io(struct e1000_hw *hw,
- uint32_t offset,
- uint32_t value)
- {
-- uint32_t io_addr = hw->io_base;
-- uint32_t io_data = hw->io_base + 4;
-+ unsigned long io_addr = hw->io_base;
-+ unsigned long io_data = hw->io_base + 4;
-
- e1000_io_write(hw, io_addr, offset);
- e1000_io_write(hw, io_data, value);
---- linux-2.6.0/drivers/net/e1000/e1000_hw.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/e1000/e1000_hw.h 2003-12-28 23:21:01.000000000 -0800
-@@ -291,7 +291,7 @@ int32_t e1000_read_mac_addr(struct e1000
-
- /* Filters (multicast, vlan, receive) */
- void e1000_init_rx_addrs(struct e1000_hw *hw);
--void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t * mc_addr_list, uint32_t mc_addr_count, uint32_t pad);
-+void e1000_mc_addr_list_update(struct e1000_hw *hw, uint8_t * mc_addr_list, uint32_t mc_addr_count, uint32_t pad, uint32_t rar_used_count);
- uint32_t e1000_hash_mc_addr(struct e1000_hw *hw, uint8_t * mc_addr);
- void e1000_mta_set(struct e1000_hw *hw, uint32_t hash_value);
- void e1000_rar_set(struct e1000_hw *hw, uint8_t * mc_addr, uint32_t rar_index);
-@@ -317,9 +317,9 @@ void e1000_pci_clear_mwi(struct e1000_hw
- void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
- void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
- /* Port I/O is only supported on 82544 and newer */
--uint32_t e1000_io_read(struct e1000_hw *hw, uint32_t port);
-+uint32_t e1000_io_read(struct e1000_hw *hw, unsigned long port);
- uint32_t e1000_read_reg_io(struct e1000_hw *hw, uint32_t offset);
--void e1000_io_write(struct e1000_hw *hw, uint32_t port, uint32_t value);
-+void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value);
- void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, uint32_t value);
- int32_t e1000_config_dsp_after_link_change(struct e1000_hw *hw, boolean_t link_up);
- int32_t e1000_set_d3_lplu_state(struct e1000_hw *hw, boolean_t active);
-@@ -978,7 +978,7 @@ struct e1000_hw {
- e1000_ms_type master_slave;
- e1000_ms_type original_master_slave;
- e1000_ffe_config ffe_config_state;
-- uint32_t io_base;
-+ unsigned long io_base;
- uint32_t phy_id;
- uint32_t phy_revision;
- uint32_t phy_addr;
-@@ -1021,6 +1021,7 @@ struct e1000_hw {
- boolean_t speed_downgraded;
- e1000_dsp_config dsp_config_state;
- boolean_t get_link_status;
-+ boolean_t serdes_link_down;
- boolean_t tbi_compatibility_en;
- boolean_t tbi_compatibility_on;
- boolean_t phy_reset_disable;
---- linux-2.6.0/drivers/net/e1000/e1000_main.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/e1000/e1000_main.c 2003-12-28 23:21:01.000000000 -0800
-@@ -30,10 +30,19 @@
-
- /* Change Log
- *
-- * 5.2.20 9/30/03
-+ * 5.2.26 11/13/03
-+ * o Fixed endianess bug causing ethtool loopback diags to fail on ppc.
-+ * o Use pdev->irq rather than netdev->irq in preparation for MSI support.
-+ * o Report driver message on user override of InterruptThrottleRate
-+ * module parameter.
-+ * o Change I/O address storage from uint32_t to unsigned long.
-+ * o Added ethtool RINGPARAM support.
-+ *
-+ * 5.2.22 10/15/03
- * o Bug fix: SERDES devices might be connected to a back-plane
- * switch that doesn't support auto-neg, so add the capability
-- * to force 1000/Full.
-+ * to force 1000/Full. Also, since forcing 1000/Full, sample
-+ * RxSynchronize bit to detect link state.
- * o Bug fix: Flow control settings for hi/lo watermark didn't
- * consider changes in the Rx FIFO size, which could occur with
- * Jumbo Frames or with the reduced FIFO in 82547.
-@@ -42,29 +51,18 @@
- * o Bug fix: hang under heavy Tx stress when running out of Tx
- * descriptors; wasn't clearing context descriptor when backing
- * out of send because of no-resource condition.
-+ * o Bug fix: check netif_running in dev->poll so we don't have to
-+ * hang in dev->close until all polls are finished. [Robert
-+ * Ollson (robert.olsson@data.slu.se)].
-+ * o Revert TxDescriptor ring size back to 256 since change to 1024
-+ * wasn't accepted into the kernel.
- *
- * 5.2.16 8/8/03
-- * o Added support for new controllers: 82545GM, 82546GB, 82541/7_B1
-- * o Bug fix: reset h/w before first EEPROM read because we don't know
-- * who may have been messing with the device before we got there.
-- * [Dave Johnson (ddj -a-t- cascv.brown.edu)]
-- * o Bug fix: read the correct work from EEPROM to detect programmed
-- * WoL settings.
-- * o Bug fix: TSO would hang if space left in FIFO was being miscalculated
-- * when mss dropped without a correspoding drop in the DMA buffer size.
-- * o ASF for Fiber nics isn't supported.
-- * o Bug fix: Workaround added for potential hang with 82544 running in
-- * PCI-X if send buffer terminates within an evenly-aligned dword.
-- * o Feature: Add support for ethtool flow control setting.
-- * o Feature: Add support for ethtool TSO setting.
-- * o Feature: Increase default Tx Descriptor count to 1024 for >= 82544.
-- *
-- * 5.1.13 5/28/03
- */
-
- char e1000_driver_name[] = "e1000";
- char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
--char e1000_driver_version[] = "5.2.20-k1";
-+char e1000_driver_version[] = "5.2.26-k1";
- char e1000_copyright[] = "Copyright (c) 1999-2003 Intel Corporation.";
-
- /* e1000_pci_tbl - PCI Device ID Table
-@@ -113,12 +111,16 @@ static struct pci_device_id e1000_pci_tb
-
- MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
-
--/* Local Function Prototypes */
--
- int e1000_up(struct e1000_adapter *adapter);
- void e1000_down(struct e1000_adapter *adapter);
- void e1000_reset(struct e1000_adapter *adapter);
- int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx);
-+int e1000_setup_tx_resources(struct e1000_adapter *adapter);
-+int e1000_setup_rx_resources(struct e1000_adapter *adapter);
-+void e1000_free_tx_resources(struct e1000_adapter *adapter);
-+void e1000_free_rx_resources(struct e1000_adapter *adapter);
-+
-+/* Local Function Prototypes */
-
- static int e1000_init_module(void);
- static void e1000_exit_module(void);
-@@ -127,15 +129,11 @@ static void __devexit e1000_remove(struc
- static int e1000_sw_init(struct e1000_adapter *adapter);
- static int e1000_open(struct net_device *netdev);
- static int e1000_close(struct net_device *netdev);
--static int e1000_setup_tx_resources(struct e1000_adapter *adapter);
--static int e1000_setup_rx_resources(struct e1000_adapter *adapter);
- static void e1000_configure_tx(struct e1000_adapter *adapter);
- static void e1000_configure_rx(struct e1000_adapter *adapter);
- static void e1000_setup_rctl(struct e1000_adapter *adapter);
- static void e1000_clean_tx_ring(struct e1000_adapter *adapter);
- static void e1000_clean_rx_ring(struct e1000_adapter *adapter);
--static void e1000_free_tx_resources(struct e1000_adapter *adapter);
--static void e1000_free_rx_resources(struct e1000_adapter *adapter);
- static void e1000_set_multi(struct net_device *netdev);
- static void e1000_update_phy_info(unsigned long data);
- static void e1000_watchdog(unsigned long data);
-@@ -268,7 +266,7 @@ e1000_up(struct e1000_adapter *adapter)
- e1000_configure_rx(adapter);
- e1000_alloc_rx_buffers(adapter);
-
-- if((err = request_irq(netdev->irq, &e1000_intr,
-+ if((err = request_irq(adapter->pdev->irq, &e1000_intr,
- SA_SHIRQ | SA_SAMPLE_RANDOM,
- netdev->name, netdev)))
- return err;
-@@ -285,7 +283,7 @@ e1000_down(struct e1000_adapter *adapter
- struct net_device *netdev = adapter->netdev;
-
- e1000_irq_disable(adapter);
-- free_irq(netdev->irq, netdev);
-+ free_irq(adapter->pdev->irq, netdev);
- del_timer_sync(&adapter->tx_fifo_stall_timer);
- del_timer_sync(&adapter->watchdog_timer);
- del_timer_sync(&adapter->phy_info_timer);
-@@ -435,7 +433,6 @@ e1000_probe(struct pci_dev *pdev,
- netdev->vlan_rx_add_vid = e1000_vlan_rx_add_vid;
- netdev->vlan_rx_kill_vid = e1000_vlan_rx_kill_vid;
-
-- netdev->irq = pdev->irq;
- netdev->mem_start = mmio_start;
- netdev->mem_end = mmio_start + mmio_len;
- netdev->base_addr = adapter->hw.io_base;
-@@ -749,7 +746,7 @@ e1000_close(struct net_device *netdev)
- * Return 0 on success, negative on failure
- **/
-
--static int
-+int
- e1000_setup_tx_resources(struct e1000_adapter *adapter)
- {
- struct e1000_desc_ring *txdr = &adapter->tx_ring;
-@@ -866,7 +863,7 @@ e1000_configure_tx(struct e1000_adapter
- * Returns 0 on success, negative on failure
- **/
-
--static int
-+int
- e1000_setup_rx_resources(struct e1000_adapter *adapter)
- {
- struct e1000_desc_ring *rxdr = &adapter->rx_ring;
-@@ -1005,7 +1002,7 @@ e1000_configure_rx(struct e1000_adapter
- * Free all transmit software resources
- **/
-
--static void
-+void
- e1000_free_tx_resources(struct e1000_adapter *adapter)
- {
- struct pci_dev *pdev = adapter->pdev;
-@@ -1073,7 +1070,7 @@ e1000_clean_tx_ring(struct e1000_adapter
- * Free all receive software resources
- **/
-
--static void
-+void
- e1000_free_rx_resources(struct e1000_adapter *adapter)
- {
- struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
-@@ -1281,41 +1278,6 @@ e1000_set_multi(struct net_device *netde
- e1000_leave_82542_rst(adapter);
- }
-
--static void
--e1000_tx_flush(struct e1000_adapter *adapter)
--{
-- uint32_t ctrl, tctl, txcw, icr;
--
-- e1000_irq_disable(adapter);
--
-- if(adapter->hw.mac_type < e1000_82543) {
-- /* Transmit Unit Reset */
-- tctl = E1000_READ_REG(&adapter->hw, TCTL);
-- E1000_WRITE_REG(&adapter->hw, TCTL, tctl | E1000_TCTL_RST);
-- E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
-- e1000_clean_tx_ring(adapter);
-- e1000_configure_tx(adapter);
-- } else {
-- txcw = E1000_READ_REG(&adapter->hw, TXCW);
-- E1000_WRITE_REG(&adapter->hw, TXCW, txcw & ~E1000_TXCW_ANE);
--
-- ctrl = E1000_READ_REG(&adapter->hw, CTRL);
-- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl | E1000_CTRL_SLU |
-- E1000_CTRL_ILOS);
--
-- mdelay(10);
--
-- e1000_clean_tx_irq(adapter);
-- E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
-- E1000_WRITE_REG(&adapter->hw, TXCW, txcw);
--
-- /* clear the link status change interrupts this caused */
-- icr = E1000_READ_REG(&adapter->hw, ICR);
-- }
--
-- e1000_irq_enable(adapter);
--}
--
- /* need to wait a few seconds after link up to get diagnostic information from the phy */
-
- static void
-@@ -1379,10 +1341,17 @@ e1000_watchdog(unsigned long data)
- struct net_device *netdev = adapter->netdev;
- struct e1000_desc_ring *txdr = &adapter->tx_ring;
- unsigned int i;
-+ uint32_t link;
-
- e1000_check_for_link(&adapter->hw);
-
-- if(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
-+ if((adapter->hw.media_type == e1000_media_type_internal_serdes) &&
-+ !(E1000_READ_REG(&adapter->hw, TXCW) & E1000_TXCW_ANE))
-+ link = !adapter->hw.serdes_link_down;
-+ else
-+ link = E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU;
-+
-+ if(link) {
- if(!netif_carrier_ok(netdev)) {
- e1000_get_speed_and_duplex(&adapter->hw,
- &adapter->link_speed,
-@@ -1419,10 +1388,11 @@ e1000_watchdog(unsigned long data)
-
- if(!netif_carrier_ok(netdev)) {
- if(E1000_DESC_UNUSED(txdr) + 1 < txdr->count) {
-- unsigned long flags;
-- spin_lock_irqsave(&netdev->xmit_lock, flags);
-- e1000_tx_flush(adapter);
-- spin_unlock_irqrestore(&netdev->xmit_lock, flags);
-+ /* We've lost link, so the controller stops DMA,
-+ * but we've got queued Tx work that's never going
-+ * to get done, so reset controller to flush Tx.
-+ * (Do the reset outside of interrupt context). */
-+ schedule_work(&adapter->tx_timeout_task);
- }
- }
-
-@@ -2064,7 +2034,7 @@ e1000_irq_disable(struct e1000_adapter *
- atomic_inc(&adapter->irq_sem);
- E1000_WRITE_REG(&adapter->hw, IMC, ~0);
- E1000_WRITE_FLUSH(&adapter->hw);
-- synchronize_irq(adapter->netdev->irq);
-+ synchronize_irq(adapter->pdev->irq);
- }
-
- /**
-@@ -2093,6 +2063,7 @@ e1000_intr(int irq, void *data, struct p
- {
- struct net_device *netdev = data;
- struct e1000_adapter *adapter = netdev->priv;
-+ struct e1000_hw *hw = &adapter->hw;
- uint32_t icr = E1000_READ_REG(&adapter->hw, ICR);
- #ifndef CONFIG_E1000_NAPI
- unsigned int i;
-@@ -2102,7 +2073,7 @@ e1000_intr(int irq, void *data, struct p
- return IRQ_NONE; /* Not our interrupt */
-
- if(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) {
-- adapter->hw.get_link_status = 1;
-+ hw->get_link_status = 1;
- mod_timer(&adapter->watchdog_timer, jiffies);
- }
-
-@@ -2114,14 +2085,30 @@ e1000_intr(int irq, void *data, struct p
- */
-
- atomic_inc(&adapter->irq_sem);
-- E1000_WRITE_REG(&adapter->hw, IMC, ~0);
-+ E1000_WRITE_REG(hw, IMC, ~0);
- __netif_rx_schedule(netdev);
- }
- #else
-+ /* Writing IMC and IMS is needed for 82547.
-+ Due to Hub Link bus being occupied, an interrupt
-+ de-assertion message is not able to be sent.
-+ When an interrupt assertion message is generated later,
-+ two messages are re-ordered and sent out.
-+ That causes APIC to think 82547 is in de-assertion
-+ state, while 82547 is in assertion state, resulting
-+ in dead lock. Writing IMC forces 82547 into
-+ de-assertion state.
-+ */
-+ if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
-+ e1000_irq_disable(adapter);
-+
- for(i = 0; i < E1000_MAX_INTR; i++)
- if(!e1000_clean_rx_irq(adapter) &
- !e1000_clean_tx_irq(adapter))
- break;
-+
-+ if(hw->mac_type == e1000_82547 || hw->mac_type == e1000_82547_rev_2)
-+ e1000_irq_enable(adapter);
- #endif
-
- return IRQ_HANDLED;
-@@ -2146,7 +2133,7 @@ e1000_clean(struct net_device *netdev, i
- *budget -= work_done;
- netdev->quota -= work_done;
-
-- if(work_done < work_to_do) {
-+ if(work_done < work_to_do || !netif_running(netdev)) {
- netif_rx_complete(netdev);
- e1000_irq_enable(adapter);
- }
-@@ -2642,13 +2629,13 @@ e1000_write_pci_cfg(struct e1000_hw *hw,
- }
-
- uint32_t
--e1000_io_read(struct e1000_hw *hw, uint32_t port)
-+e1000_io_read(struct e1000_hw *hw, unsigned long port)
- {
- return inl(port);
- }
-
- void
--e1000_io_write(struct e1000_hw *hw, uint32_t port, uint32_t value)
-+e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value)
- {
- outl(value, port);
- }
---- linux-2.6.0/drivers/net/e1000/e1000_param.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/e1000/e1000_param.c 2003-12-28 23:21:01.000000000 -0800
-@@ -196,16 +196,6 @@ E1000_PARAM(InterruptThrottleRate, "Inte
- #define AUTONEG_ADV_MASK 0x2F
- #define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
-
--#define DEFAULT_TXD 256
--#define MAX_TXD 256
--#define MIN_TXD 80
--#define MAX_82544_TXD 4096
--
--#define DEFAULT_RXD 256
--#define MAX_RXD 256
--#define MIN_RXD 80
--#define MAX_82544_RXD 4096
--
- #define DEFAULT_RDTR 0
- #define MAX_RXDELAY 0xFFFF
- #define MIN_RXDELAY 0
-@@ -320,14 +310,15 @@ e1000_check_options(struct e1000_adapter
- struct e1000_option opt = {
- .type = range_option,
- .name = "Transmit Descriptors",
-- .err = "using default of " __MODULE_STRING(DEFAULT_TXD),
-- .def = DEFAULT_TXD,
-- .arg = { .r = { .min = MIN_TXD }}
-+ .err = "using default of "
-+ __MODULE_STRING(E1000_DEFAULT_TXD),
-+ .def = E1000_DEFAULT_TXD,
-+ .arg = { .r = { .min = E1000_MIN_TXD }}
- };
- struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
- e1000_mac_type mac_type = adapter->hw.mac_type;
- opt.arg.r.max = mac_type < e1000_82544 ?
-- MAX_TXD : MAX_82544_TXD;
-+ E1000_MAX_TXD : E1000_MAX_82544_TXD;
-
- tx_ring->count = TxDescriptors[bd];
- e1000_validate_option(&tx_ring->count, &opt);
-@@ -337,13 +328,15 @@ e1000_check_options(struct e1000_adapter
- struct e1000_option opt = {
- .type = range_option,
- .name = "Receive Descriptors",
-- .err = "using default of " __MODULE_STRING(DEFAULT_RXD),
-- .def = DEFAULT_RXD,
-- .arg = { .r = { .min = MIN_RXD }}
-+ .err = "using default of "
-+ __MODULE_STRING(E1000_DEFAULT_RXD),
-+ .def = E1000_DEFAULT_RXD,
-+ .arg = { .r = { .min = E1000_MIN_RXD }}
- };
- struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
- e1000_mac_type mac_type = adapter->hw.mac_type;
-- opt.arg.r.max = mac_type < e1000_82544 ? MAX_RXD : MAX_82544_RXD;
-+ opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD :
-+ E1000_MAX_82544_RXD;
-
- rx_ring->count = RxDescriptors[bd];
- e1000_validate_option(&rx_ring->count, &opt);
-@@ -446,13 +439,19 @@ e1000_check_options(struct e1000_adapter
- };
-
- adapter->itr = InterruptThrottleRate[bd];
-- if(adapter->itr == 0) {
-- printk(KERN_INFO "%s turned off\n", opt.name);
-- } else if(adapter->itr == 1 || adapter->itr == -1) {
-- /* Dynamic mode */
-+ switch(adapter->itr) {
-+ case -1:
- adapter->itr = 1;
-- } else {
-+ break;
-+ case 0:
-+ printk(KERN_INFO "%s turned off\n", opt.name);
-+ break;
-+ case 1:
-+ printk(KERN_INFO "%s set to dynamic mode\n", opt.name);
-+ break;
-+ default:
- e1000_validate_option(&adapter->itr, &opt);
-+ break;
- }
- }
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/net/e100.c 2003-12-28 23:21:01.000000000 -0800
-@@ -0,0 +1,2308 @@
-+/*******************************************************************************
-+
-+
-+ Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
-+
-+ This program is free software; you can redistribute it and/or modify it
-+ under the terms of the GNU General Public License as published by the Free
-+ Software Foundation; either version 2 of the License, or (at your option)
-+ any later version.
-+
-+ This program is distributed in the hope that it will be useful, but WITHOUT
-+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-+ more details.
-+
-+ You should have received a copy of the GNU General Public License along with
-+ this program; if not, write to the Free Software Foundation, Inc., 59
-+ Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+
-+ The full GNU General Public License is included in this distribution in the
-+ file called LICENSE.
-+
-+ Contact Information:
-+ Linux NICS <linux.nics@intel.com>
-+ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-+
-+*******************************************************************************/
-+
-+/*
-+ * e100.c: Intel(R) PRO/100 ethernet driver
-+ *
-+ * (Re)written 2003 by scott.feldman@intel.com. Based loosely on
-+ * original e100 driver, but better described as a munging of
-+ * e100, e1000, eepro100, tg3, 8139cp, and other drivers.
-+ *
-+ * References:
-+ * Intel 8255x 10/100 Mbps Ethernet Controller Family,
-+ * Open Source Software Developers Manual,
-+ * http://sourceforge.net/projects/e1000
-+ *
-+ *
-+ * Theory of Operation
-+ *
-+ * I. General
-+ *
-+ * The driver supports Intel(R) 10/100 Mbps PCI Fast Ethernet
-+ * controller family, which includes the 82557, 82558, 82559, 82550,
-+ * 82551, and 82562 devices. 82558 and greater controllers
-+ * integrate the Intel 82555 PHY. The controllers are used in
-+ * server and client network interface cards, as well as in
-+ * LAN-On-Motherboard (LOM), CardBus, MiniPCI, and ICHx
-+ * configurations. 8255x supports a 32-bit linear addressing
-+ * mode and operates at 33Mhz PCI clock rate.
-+ *
-+ * II. Driver Operation
-+ *
-+ * Memory-mapped mode is used exclusively to access the device's
-+ * shared-memory structure, the Control/Status Registers (CSR). All
-+ * setup, configuration, and control of the device, including queuing
-+ * of Tx, Rx, and configuration commands is through the CSR.
-+ * cmd_lock serializes accesses to the CSR command register. cb_lock
-+ * protects the shared Command Block List (CBL).
-+ *
-+ * 8255x is highly MII-compliant and all access to the PHY go
-+ * through the Management Data Interface (MDI). Consequently, the
-+ * driver leverages the mii.c library shared with other MII-compliant
-+ * devices.
-+ *
-+ * Big- and Little-Endian byte order as well as 32- and 64-bit
-+ * archs are supported. Weak-ordered memory and non-cache-coherent
-+ * archs are supported.
-+ *
-+ * III. Transmit
-+ *
-+ * A Tx skb is mapped and hangs off of a TCB. TCBs are linked
-+ * together in a fixed-size ring (CBL) thus forming the flexible mode
-+ * memory structure. A TCB marked with the suspend-bit indicates
-+ * the end of the ring. The last TCB processed suspends the
-+ * controller, and the controller can be restarted by issue a CU
-+ * resume command to continue from the suspend point, or a CU start
-+ * command to start at a given position in the ring.
-+ *
-+ * Non-Tx commands (config, multicast setup, etc) are linked
-+ * into the CBL ring along with Tx commands. The common structure
-+ * used for both Tx and non-Tx commands is the Command Block (CB).
-+ *
-+ * cb_to_use is the next CB to use for queuing a command; cb_to_clean
-+ * is the next CB to check for completion; cb_to_send is the first
-+ * CB to start on in case of a previous failure to resume. CB clean
-+ * up happens in interrupt context in response to a CU interrupt, or
-+ * in dev->poll in the case where NAPI is enabled. cbs_avail keeps
-+ * track of number of free CB resources available.
-+ *
-+ * Hardware padding of short packets to minimum packet size is
-+ * enabled. 82557 pads with 7Eh, while the later controllers pad
-+ * with 00h.
-+ *
-+ * IV. Recieve
-+ *
-+ * The Receive Frame Area (RFA) comprises a ring of Receive Frame
-+ * Descriptors (RFD) + data buffer, thus forming the simplified mode
-+ * memory structure. Rx skbs are allocated to contain both the RFD
-+ * and the data buffer, but the RFD is pulled off before the skb is
-+ * indicated. The data buffer is aligned such that encapsulated
-+ * protocol headers are u32-aligned. Since the RFD is part of the
-+ * mapped shared memory, and completion status is contained within
-+ * the RFD, the RFD must be dma_sync'ed to maintain a consistent
-+ * view from software and hardware.
-+ *
-+ * Under typical operation, the receive unit (RU) is start once,
-+ * and the controller happily fills RFDs as frames arrive. If
-+ * replacement RFDs cannot be allocated, or the RU goes non-active,
-+ * the RU must be restarted. Frame arrival generates an interrupt,
-+ * and Rx indication and re-allocation happen in the same context,
-+ * therefore no locking is required. If NAPI is enabled, this work
-+ * happens in dev->poll. A software-generated interrupt is gen-
-+ * erated from the watchdog to recover from a failed allocation
-+ * senario where all Rx resources have been indicated and none re-
-+ * placed.
-+ *
-+ * V. Miscellaneous
-+ *
-+ * VLAN offloading of tagging, stripping and filtering is not
-+ * supported, but driver will accommodate the extra 4-byte VLAN tag
-+ * for processing by upper layers. Tx/Rx Checksum offloading is not
-+ * supported. Tx Scatter/Gather is not supported. Jumbo Frames is
-+ * not supported (hardware limitation).
-+ *
-+ * NAPI support is enabled with CONFIG_E100_NAPI.
-+ *
-+ * MagicPacket(tm) WoL support is enabled/disabled via ethtool.
-+ *
-+ * Thanks to JC (jchapman@katalix.com) for helping with
-+ * testing/troubleshooting the development driver.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/slab.h>
-+#include <linux/delay.h>
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+#include <linux/list.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/mii.h>
-+#include <linux/if_vlan.h>
-+#include <linux/skbuff.h>
-+#include <linux/ethtool.h>
-+#include <linux/string.h>
-+#include <asm/unaligned.h>
-+
-+
-+#define DRV_NAME "e100"
-+#define DRV_VERSION "3.0.11_dev"
-+#define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver"
-+#define DRV_COPYRIGHT "Copyright(c) 1999-2003 Intel Corporation"
-+#define PFX DRV_NAME ": "
-+
-+#define E100_WATCHDOG_PERIOD 2 * HZ
-+#define E100_NAPI_WEIGHT 16
-+
-+MODULE_DESCRIPTION(DRV_DESCRIPTION);
-+MODULE_AUTHOR(DRV_COPYRIGHT);
-+MODULE_LICENSE("GPL");
-+
-+static int debug = 3;
-+module_param(debug, int, 0);
-+MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
-+#define DPRINTK(nlevel, klevel, fmt, args...) \
-+ (void)((NETIF_MSG_##nlevel & nic->msg_enable) && \
-+ printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \
-+ __FUNCTION__ , ## args))
-+
-+#define INTEL_8255X_ETHERNET_DEVICE(device_id, ich) {\
-+ PCI_VENDOR_ID_INTEL, device_id, PCI_ANY_ID, PCI_ANY_ID, \
-+ PCI_CLASS_NETWORK_ETHERNET << 8, 0xFFFF00, ich }
-+static struct pci_device_id e100_id_table[] = {
-+ INTEL_8255X_ETHERNET_DEVICE(0x1029, 0),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1030, 0),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1031, 3),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1032, 3),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1033, 3),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1034, 3),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1038, 3),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1039, 4),
-+ INTEL_8255X_ETHERNET_DEVICE(0x103A, 4),
-+ INTEL_8255X_ETHERNET_DEVICE(0x103B, 4),
-+ INTEL_8255X_ETHERNET_DEVICE(0x103C, 4),
-+ INTEL_8255X_ETHERNET_DEVICE(0x103D, 4),
-+ INTEL_8255X_ETHERNET_DEVICE(0x103E, 4),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1050, 5),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1051, 5),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1052, 5),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1053, 5),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1054, 5),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1055, 5),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1064, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1065, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1066, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1067, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1068, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1069, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x106A, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x106B, 6),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1059, 0),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1209, 0),
-+ INTEL_8255X_ETHERNET_DEVICE(0x1229, 0),
-+ INTEL_8255X_ETHERNET_DEVICE(0x2449, 2),
-+ INTEL_8255X_ETHERNET_DEVICE(0x2459, 2),
-+ INTEL_8255X_ETHERNET_DEVICE(0x245D, 2),
-+ { 0, }
-+};
-+MODULE_DEVICE_TABLE(pci, e100_id_table);
-+
-+enum mac {
-+ mac_82557_D100_A = 0,
-+ mac_82557_D100_B = 1,
-+ mac_82557_D100_C = 2,
-+ mac_82558_D101_A4 = 4,
-+ mac_82558_D101_B0 = 5,
-+ mac_82559_D101M = 8,
-+ mac_82559_D101S = 9,
-+ mac_82550_D102 = 12,
-+ mac_82550_D102_C = 13,
-+ mac_82551_E = 14,
-+ mac_82551_F = 15,
-+ mac_82551_10 = 16,
-+ mac_unknown = 0xFF,
-+};
-+
-+enum phy {
-+ phy_100a = 0x000003E0,
-+ phy_100c = 0x035002A8,
-+ phy_82555_tx = 0x015002A8,
-+ phy_nsc_tx = 0x5C002000,
-+ phy_82562_et = 0x033002A8,
-+ phy_82562_em = 0x032002A8,
-+ phy_82562_eh = 0x017002A8,
-+ phy_unknown = 0xFFFFFFFF,
-+};
-+
-+/* CSR (Control/Status Registers) */
-+struct csr {
-+ struct {
-+ u8 status;
-+ u8 stat_ack;
-+ u8 cmd_lo;
-+ u8 cmd_hi;
-+ u32 gen_ptr;
-+ } scb;
-+ u32 port;
-+ u16 flash_ctrl;
-+ u8 eeprom_ctrl_lo;
-+ u8 eeprom_ctrl_hi;
-+ u32 mdi_ctrl;
-+ u32 rx_dma_count;
-+};
-+
-+enum scb_status {
-+ rus_idle = 0x00,
-+ rus_suspended = 0x04,
-+ rus_no_resources = 0x08,
-+ rus_ready = 0x10,
-+ rus_mask = 0x3C,
-+ cus_idle = 0x00,
-+ cus_suspended = 0x40,
-+ cus_active = 0x80,
-+ cus_mask = 0xC0,
-+};
-+
-+enum scb_stat_ack {
-+ stat_ack_sw_gen = 0x04,
-+ stat_ack_rnr = 0x10,
-+ stat_ack_cu_idle = 0x20,
-+ stat_ack_frame_rx = 0x40,
-+ stat_ack_cu_cmd_done = 0x80,
-+ stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
-+ stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
-+};
-+
-+enum scb_cmd_hi {
-+ irq_mask_none = 0x00,
-+ irq_mask_all = 0x01,
-+ irq_sw_gen = 0x02,
-+};
-+
-+enum scb_cmd_lo {
-+ ruc_start = 0x01,
-+ ruc_load_base = 0x06,
-+ cuc_start = 0x10,
-+ cuc_resume = 0x20,
-+ cuc_dump_addr = 0x40,
-+ cuc_dump_stats = 0x50,
-+ cuc_load_base = 0x60,
-+ cuc_dump_reset = 0x70,
-+};
-+
-+enum port {
-+ software_reset = 0x0000,
-+ selftest = 0x0001,
-+ selective_reset = 0x0002,
-+};
-+
-+enum eeprom_ctrl_lo {
-+ eesk = 0x01,
-+ eecs = 0x02,
-+ eedi = 0x04,
-+ eedo = 0x08,
-+};
-+
-+enum mdi_ctrl {
-+ mdi_write = 0x04000000,
-+ mdi_read = 0x08000000,
-+ mdi_ready = 0x10000000,
-+};
-+
-+enum eeprom_op {
-+ op_write = 0x05,
-+ op_read = 0x06,
-+ op_ewds = 0x10,
-+ op_ewen = 0x13,
-+};
-+
-+enum eeprom_offsets {
-+ eeprom_id = 0x0A,
-+ eeprom_config_asf = 0x0D,
-+ eeprom_smbus_addr = 0x90,
-+};
-+
-+enum eeprom_id {
-+ eeprom_id_wol = 0x0020,
-+};
-+
-+enum eeprom_config_asf {
-+ eeprom_asf = 0x8000,
-+ eeprom_gcl = 0x4000,
-+};
-+
-+enum cb_status {
-+ cb_complete = 0x8000,
-+ cb_ok = 0x2000,
-+};
-+
-+enum cb_command {
-+ cb_iaaddr = 0x0001,
-+ cb_config = 0x0002,
-+ cb_multi = 0x0003,
-+ cb_tx = 0x0004,
-+ cb_dump = 0x0006,
-+ cb_tx_sf = 0x0008,
-+ cb_cid = 0x1f00,
-+ cb_i = 0x2000,
-+ cb_s = 0x4000,
-+ cb_el = 0x8000,
-+};
-+
-+struct rfd {
-+ u16 status;
-+ u16 command;
-+ u32 link;
-+ u32 rbd;
-+ u16 actual_size;
-+ u16 size;
-+};
-+
-+struct rx_list {
-+ struct list_head list;
-+ struct sk_buff *skb;
-+ dma_addr_t dma_addr;
-+ unsigned int length;
-+};
-+
-+#if defined(__BIG_ENDIAN_BITFIELD)
-+#define X(a,b) b,a
-+#else
-+#define X(a,b) a,b
-+#endif
-+struct config {
-+/*0*/ u8 X(byte_count:6, pad0:2);
-+/*1*/ u8 X(X(rx_fifo_limit:4, tx_fifo_limit:3), pad1:1);
-+/*2*/ u8 adaptive_ifs;
-+/*3*/ u8 X(X(X(X(mwi_enable:1, type_enable:1), read_align_enable:1),
-+ term_write_cache_line:1), pad3:4);
-+/*4*/ u8 X(rx_dma_max_count:7, pad4:1);
-+/*5*/ u8 X(tx_dma_max_count:7, dma_max_count_enable:1);
-+/*6*/ u8 X(X(X(X(X(X(X(late_scb_update:1, direct_rx_dma:1),
-+ tno_intr:1), cna_intr:1), standard_tcb:1), standard_stat_counter:1),
-+ rx_discard_overruns:1), rx_save_bad_frames:1);
-+/*7*/ u8 X(X(X(X(X(rx_discard_short_frames:1, tx_underrun_retry:2),
-+ pad7:2), rx_extended_rfd:1), tx_two_frames_in_fifo:1),
-+ tx_dynamic_tbd:1);
-+/*8*/ u8 X(X(mii_mode:1, pad8:6), csma_disabled:1);
-+/*9*/ u8 X(X(X(X(X(rx_tcpudp_checksum:1, pad9:3), vlan_arp_tco:1),
-+ link_status_wake:1), arp_wake:1), mcmatch_wake:1);
-+/*10*/ u8 X(X(X(pad10:3, no_source_addr_insertion:1), preamble_length:2),
-+ loopback:2);
-+/*11*/ u8 X(linear_priority:3, pad11:5);
-+/*12*/ u8 X(X(linear_priority_mode:1, pad12:3), ifs:4);
-+/*13*/ u8 ip_addr_lo;
-+/*14*/ u8 ip_addr_hi;
-+/*15*/ u8 X(X(X(X(X(X(X(promiscuous_mode:1, broadcast_disabled:1),
-+ wait_after_win:1), pad15_1:1), ignore_ul_bit:1), crc_16_bit:1),
-+ pad15_2:1), crs_or_cdt:1);
-+/*16*/ u8 fc_delay_lo;
-+/*17*/ u8 fc_delay_hi;
-+/*18*/ u8 X(X(X(X(X(rx_stripping:1, tx_padding:1), rx_crc_transfer:1),
-+ rx_long_ok:1), fc_priority_threshold:3), pad18:1);
-+/*19*/ u8 X(X(X(X(X(X(X(addr_wake:1, magic_packet_disable:1),
-+ fc_disable:1), fc_restop:1), fc_restart:1), fc_reject:1),
-+ full_duplex_force:1), full_duplex_pin:1);
-+/*20*/ u8 X(X(X(pad20_1:5, fc_priority_location:1), multi_ia:1), pad20_2:1);
-+/*21*/ u8 X(X(pad21_1:3, multicast_all:1), pad21_2:4);
-+/*22*/ u8 X(X(rx_d102_mode:1, rx_vlan_drop:1), pad22:6);
-+ u8 pad_d102[9];
-+};
-+
-+#define E100_MAX_MULTICAST_ADDRS 64
-+struct multi {
-+ u16 count;
-+ u8 addr[E100_MAX_MULTICAST_ADDRS * ETH_ALEN + 2/*pad*/];
-+};
-+
-+/* Important: keep total struct u32-aligned */
-+struct cb {
-+ u16 status;
-+ u16 command;
-+ u32 link;
-+ union {
-+ u8 iaaddr[ETH_ALEN];
-+ struct config config;
-+ struct multi multi;
-+ struct {
-+ u32 tbd_array;
-+ u16 tcb_byte_count;
-+ u8 threshold;
-+ u8 tbd_count;
-+ struct {
-+ u32 buf_addr;
-+ u16 size;
-+ u16 eol;
-+ } tbd;
-+ } tcb;
-+ u32 dump_buffer_addr;
-+ } u;
-+ struct cb *next, *prev;
-+ dma_addr_t dma_addr;
-+ struct sk_buff *skb;
-+};
-+
-+enum loopback {
-+ lb_none = 0, lb_mac = 1, lb_phy = 3,
-+};
-+
-+struct stats {
-+ u32 tx_good_frames, tx_max_collisions, tx_late_collisions,
-+ tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
-+ tx_multiple_collisions, tx_total_collisions;
-+ u32 rx_good_frames, rx_crc_errors, rx_alignment_errors,
-+ rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
-+ rx_short_frame_errors;
-+ u32 fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
-+ u16 xmt_tco_frames, rcv_tco_frames;
-+ u32 complete;
-+};
-+
-+struct mem {
-+ struct {
-+ u32 signature;
-+ u32 result;
-+ } selftest;
-+ struct stats stats;
-+ u8 dump_buf[596];
-+};
-+
-+struct param_range {
-+ u32 min;
-+ u32 max;
-+ u32 count;
-+};
-+
-+struct params {
-+ struct param_range rfds;
-+ struct param_range cbs;
-+};
-+
-+struct nic {
-+ /* Begin: frequently used values: keep adjacent for cache effect */
-+ u32 msg_enable ____cacheline_aligned;
-+ struct net_device *netdev;
-+ struct pci_dev *pdev;
-+
-+ struct list_head rx_list_head ____cacheline_aligned;
-+ struct rx_list *rx_list;
-+ struct rfd blank_rfd;
-+
-+ spinlock_t cb_lock ____cacheline_aligned;
-+ spinlock_t cmd_lock;
-+ struct csr *csr;
-+ enum scb_cmd_lo cuc_cmd;
-+ unsigned int cbs_avail;
-+ struct cb *cbs;
-+ struct cb *cb_to_use;
-+ struct cb *cb_to_send;
-+ struct cb *cb_to_clean;
-+ u16 tx_command;
-+ /* End: frequently used values: keep adjacent for cache effect */
-+
-+ enum {
-+ ich = (1 << 0),
-+ promiscuous = (1 << 1),
-+ multicast_all = (1 << 2),
-+ wol_magic = (1 << 3),
-+ } flags ____cacheline_aligned;
-+
-+ enum mac mac;
-+ enum phy phy;
-+ struct params params;
-+ struct net_device_stats net_stats;
-+ struct timer_list watchdog;
-+ struct timer_list blink_timer;
-+ struct mii_if_info mii;
-+ enum loopback loopback;
-+
-+ struct mem *mem;
-+ dma_addr_t dma_addr;
-+
-+ dma_addr_t cbs_dma_addr;
-+ u8 adaptive_ifs;
-+ u8 tx_threshold;
-+ u32 tx_frames;
-+ u32 tx_collisions;
-+ u32 tx_deferred;
-+ u32 tx_single_collisions;
-+ u32 tx_multiple_collisions;
-+ u32 tx_fc_pause;
-+ u32 tx_tco_frames;
-+
-+ u32 rx_fc_pause;
-+ u32 rx_fc_unsupported;
-+ u32 rx_tco_frames;
-+
-+ u8 rev_id;
-+ u16 leds;
-+ u16 eeprom_wc;
-+ u16 eeprom[256];
-+ u32 pm_state[16];
-+};
-+
-+static void e100_get_defaults(struct nic *nic)
-+{
-+ struct param_range rfds = { .min = 64, .max = 256, .count = 64 };
-+ struct param_range cbs = { .min = 64, .max = 256, .count = 64 };
-+
-+ pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id);
-+ /* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */
-+ nic->mac = (nic->flags & ich) ? mac_82559_D101M : nic->rev_id;
-+ if(nic->mac == mac_unknown)
-+ nic->mac = mac_82557_D100_A;
-+
-+ nic->params.rfds = rfds;
-+ nic->params.cbs = cbs;
-+
-+ /* Quadwords to DMA into FIFO before starting frame transmit */
-+ nic->tx_threshold = 0xE0;
-+
-+ nic->tx_command = cpu_to_le16(cb_tx | cb_i | cb_tx_sf |
-+ ((nic->mac >= mac_82558_D101_A4) ? cb_cid : 0));
-+
-+ /* Template for a freshly allocated RFD */
-+ nic->blank_rfd.status = 0;
-+ nic->blank_rfd.command = cpu_to_le16(cb_el);
-+ nic->blank_rfd.link = 0;
-+ nic->blank_rfd.rbd = 0xFFFFFFFF;
-+ nic->blank_rfd.actual_size = 0;
-+ nic->blank_rfd.size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
-+}
-+
-+static inline void e100_write_flush(struct nic *nic)
-+{
-+ /* Flush previous PCI writes through intermediate bridges
-+ * by doing a benign read */
-+ (void)readb(&nic->csr->scb.status);
-+}
-+
-+static inline void e100_enable_irq(struct nic *nic)
-+{
-+ writeb(irq_mask_none, &nic->csr->scb.cmd_hi);
-+ e100_write_flush(nic);
-+}
-+
-+static inline void e100_disable_irq(struct nic *nic)
-+{
-+ writeb(irq_mask_all, &nic->csr->scb.cmd_hi);
-+ e100_write_flush(nic);
-+}
-+
-+static void e100_hw_reset(struct nic *nic)
-+{
-+ /* Put CU and RU into idle with a selective reset to get
-+ * device off of PCI bus */
-+ writel(selective_reset, &nic->csr->port);
-+ e100_write_flush(nic); udelay(20);
-+
-+ /* Now fully reset device */
-+ writel(software_reset, &nic->csr->port);
-+ e100_write_flush(nic); udelay(20);
-+
-+ /* TCO workaround - 82559 and greater */
-+ if(nic->mac >= mac_82559_D101M) {
-+ /* Issue a redundant CU load base without setting
-+ * general pointer, and without waiting for scb to
-+ * clear. This gets us into post-driver. Finally,
-+ * wait 20 msec for reset to take effect. */
-+ writeb(cuc_load_base, &nic->csr->scb.cmd_lo);
-+ mdelay(20);
-+ }
-+
-+ /* Mask off our interrupt line - it's unmasked after reset */
-+ e100_disable_irq(nic);
-+}
-+
-+static int e100_self_test(struct nic *nic)
-+{
-+ u32 dma_addr = nic->dma_addr + offsetof(struct mem, selftest);
-+
-+ /* Passing the self-test is a pretty good indication
-+ * that the device can DMA to/from host memory */
-+
-+ nic->mem->selftest.signature = 0;
-+ nic->mem->selftest.result = 0xFFFFFFFF;
-+
-+ writel(selftest | dma_addr, &nic->csr->port);
-+ e100_write_flush(nic);
-+ /* Wait 10 msec for self-test to complete */
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ schedule_timeout(HZ / 100 + 1);
-+
-+ /* Interrupts are enabled after self-test */
-+ e100_disable_irq(nic);
-+
-+ /* Check results of self-test */
-+ if(nic->mem->selftest.result != 0) {
-+ DPRINTK(HW, ERR, "Self-test failed: result=0x%08X\n",
-+ nic->mem->selftest.result);
-+ return -ETIMEDOUT;
-+ }
-+ if(nic->mem->selftest.signature == 0) {
-+ DPRINTK(HW, ERR, "Self-test failed: timed out\n");
-+ return -ETIMEDOUT;
-+ }
-+
-+ return 0;
-+}
-+
-+static void e100_eeprom_write(struct nic *nic, u16 addr_len, u16 addr, u16 data)
-+{
-+ u32 cmd_addr_data[3];
-+ u8 ctrl;
-+ int i, j;
-+
-+ /* Three cmds: write/erase enable, write data, write/erase disable */
-+ cmd_addr_data[0] = op_ewen << (addr_len - 2);
-+ cmd_addr_data[1] = (((op_write << addr_len) | addr) << 16) | data;
-+ cmd_addr_data[2] = op_ewds << (addr_len - 2);
-+
-+ /* Bit-bang cmds to write word to eeprom */
-+ for(j = 0; j < 3; j++) {
-+
-+ /* Chip select */
-+ writeb(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+
-+ for(i = 31; i >= 0; i--) {
-+ ctrl = (cmd_addr_data[j] & (1 << i)) ?
-+ eecs | eedi : eecs;
-+ writeb(ctrl, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+ writeb(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+ }
-+ /* Wait 10 msec for cmd to complete */
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ schedule_timeout(HZ / 100 + 1);
-+
-+ /* Chip deselect */
-+ writeb(0, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+ }
-+
-+};
-+
-+/* General technique stolen from the eepro100 driver - very clever */
-+static u16 e100_eeprom_read(struct nic *nic, u16 *addr_len, u16 addr)
-+{
-+ u32 cmd_addr_data;
-+ u16 data = 0;
-+ u8 ctrl;
-+ int i;
-+
-+ cmd_addr_data = ((op_read << *addr_len) | addr) << 16;
-+
-+ /* Chip select */
-+ writeb(eecs | eesk, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+
-+ /* Bit-bang to read word from eeprom */
-+ for(i = 31; i >= 0; i--) {
-+ ctrl = (cmd_addr_data & (1 << i)) ? eecs | eedi : eecs;
-+ writeb(ctrl, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+ writeb(ctrl | eesk, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+ /* Eeprom drives a dummy zero to EEDO after receiving
-+ * complete address. Use this to adjust addr_len. */
-+ ctrl = readb(&nic->csr->eeprom_ctrl_lo);
-+ if(!(ctrl & eedo) && i > 16) {
-+ *addr_len -= (i - 16);
-+ i = 17;
-+ }
-+ data = (data << 1) | (ctrl & eedo ? 1 : 0);
-+ }
-+
-+ /* Chip deselect */
-+ writeb(0, &nic->csr->eeprom_ctrl_lo);
-+ e100_write_flush(nic); udelay(4);
-+
-+ return data;
-+};
-+
-+/* Load entire EEPROM image into driver cache and validate checksum */
-+static int e100_eeprom_load(struct nic *nic)
-+{
-+ u16 addr, addr_len = 8, checksum = 0;
-+
-+ /* Try reading with an 8-bit addr len to discover actual addr len */
-+ e100_eeprom_read(nic, &addr_len, 0);
-+ nic->eeprom_wc = 1 << addr_len;
-+
-+ for(addr = 0; addr < nic->eeprom_wc; addr++) {
-+ nic->eeprom[addr] = e100_eeprom_read(nic, &addr_len, addr);
-+ if(addr < nic->eeprom_wc - 1)
-+ checksum += nic->eeprom[addr];
-+ }
-+
-+ /* The checksum, stored in the last word, is calculated such that
-+ * the sum of words should be 0xBABA */
-+ checksum = 0xBABA - checksum;
-+ if(checksum != nic->eeprom[nic->eeprom_wc - 1]) {
-+ DPRINTK(PROBE, ERR, "EEPROM corrupted\n");
-+ return -EAGAIN;
-+ }
-+
-+ return 0;
-+}
-+
-+/* Save (portion of) driver EEPROM cache to device and update checksum */
-+static int e100_eeprom_save(struct nic *nic, u16 start, u16 count)
-+{
-+ u16 addr, addr_len = 8, checksum = 0;
-+
-+ /* Try reading with an 8-bit addr len to discover actual addr len */
-+ e100_eeprom_read(nic, &addr_len, 0);
-+ nic->eeprom_wc = 1 << addr_len;
-+
-+ if(start + count >= nic->eeprom_wc)
-+ return -EINVAL;
-+
-+ for(addr = start; addr < start + count; addr++)
-+ e100_eeprom_write(nic, addr_len, addr, nic->eeprom[addr]);
-+
-+ /* The checksum, stored in the last word, is calculated such that
-+ * the sum of words should be 0xBABA */
-+ for(addr = 0; addr < nic->eeprom_wc - 1; addr++)
-+ checksum += nic->eeprom[addr];
-+ nic->eeprom[nic->eeprom_wc - 1] = 0xBABA - checksum;
-+ e100_eeprom_write(nic, addr_len, nic->eeprom_wc - 1, 0xBABA - checksum);
-+
-+ return 0;
-+}
-+
-+#define E100_WAIT_SCB_TIMEOUT 40
-+static inline int e100_exec_cmd(struct nic *nic, u8 cmd, dma_addr_t dma_addr)
-+{
-+ unsigned long flags;
-+ unsigned int i;
-+ int err = 0;
-+
-+ spin_lock_irqsave(&nic->cmd_lock, flags);
-+
-+ /* Previous command is accepted when SCB clears */
-+ for(i = 0; i < E100_WAIT_SCB_TIMEOUT; i++) {
-+ if(likely(!readb(&nic->csr->scb.cmd_lo)))
-+ break;
-+ cpu_relax();
-+ if(unlikely(i > (E100_WAIT_SCB_TIMEOUT >> 1)))
-+ udelay(5);
-+ }
-+ if(unlikely(i == E100_WAIT_SCB_TIMEOUT)) {
-+ err = -EAGAIN;
-+ goto err_unlock;
-+ }
-+
-+ if(unlikely(cmd != cuc_resume))
-+ writel(dma_addr, &nic->csr->scb.gen_ptr);
-+ writeb(cmd, &nic->csr->scb.cmd_lo);
-+
-+err_unlock:
-+ spin_unlock_irqrestore(&nic->cmd_lock, flags);
-+
-+ return err;
-+}
-+
-+static inline int e100_exec_cb(struct nic *nic, struct sk_buff *skb,
-+ void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))
-+{
-+ struct cb *cb;
-+ unsigned long flags;
-+ int err = 0;
-+
-+ spin_lock_irqsave(&nic->cb_lock, flags);
-+
-+ if(unlikely(!nic->cbs_avail)) {
-+ err = -ENOMEM;
-+ goto err_unlock;
-+ }
-+
-+ cb = nic->cb_to_use;
-+ nic->cb_to_use = cb->next;
-+ nic->cbs_avail--;
-+ cb->skb = skb;
-+
-+ if(unlikely(!nic->cbs_avail))
-+ err = -ENOSPC;
-+
-+ cb_prepare(nic, cb, skb);
-+
-+ /* Order is important otherwise we'll be in a race with h/w:
-+ * set S-bit in current first, then clear S-bit in previous. */
-+ cb->command |= cpu_to_le16(cb_s);
-+ cb->prev->command &= cpu_to_le16(~cb_s);
-+
-+ while(nic->cb_to_send != nic->cb_to_use) {
-+ if(unlikely((err = e100_exec_cmd(nic, nic->cuc_cmd,
-+ nic->cb_to_send->dma_addr)))) {
-+ /* Ok, here's where things get sticky. It's
-+ * possible that we can't schedule the command
-+ * because the controller is too busy, so
-+ * let's just queue the command and try again
-+ * when another command is scheduled. */
-+ break;
-+ } else {
-+ nic->cuc_cmd = cuc_resume;
-+ nic->cb_to_send = nic->cb_to_send->next;
-+ }
-+ }
-+
-+err_unlock:
-+ spin_unlock_irqrestore(&nic->cb_lock, flags);
-+
-+ return err;
-+}
-+
-+static u16 mdio_ctrl(struct nic *nic, u32 addr, u32 dir, u32 reg, u16 data)
-+{
-+ u32 data_out = 0;
-+ unsigned int i;
-+
-+ writel((reg << 16) | (addr << 21) | dir | data, &nic->csr->mdi_ctrl);
-+
-+ for(i = 0; i < 100; i++) {
-+ udelay(20);
-+ if((data_out = readl(&nic->csr->mdi_ctrl)) & mdi_ready)
-+ break;
-+ }
-+
-+ DPRINTK(HW, DEBUG,
-+ "%s:addr=%d, reg=%d, data_in=0x%04X, data_out=0x%04X\n",
-+ dir == mdi_read ? "READ" : "WRITE", addr, reg, data, data_out);
-+ return (u16)data_out;
-+}
-+
-+static int mdio_read(struct net_device *netdev, int addr, int reg)
-+{
-+ return mdio_ctrl(netdev->priv, addr, mdi_read, reg, 0);
-+}
-+
-+static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
-+{
-+ mdio_ctrl(netdev->priv, addr, mdi_write, reg, data);
-+}
-+
-+static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
-+{
-+ struct config *config = &cb->u.config;
-+ u8 *c = (u8 *)config;
-+
-+ cb->command = cpu_to_le16(cb_config);
-+
-+ memset(config, 0, sizeof(struct config));
-+
-+ config->byte_count = 0x16; /* bytes in this struct */
-+ config->rx_fifo_limit = 0x8; /* bytes in FIFO before DMA */
-+ config->direct_rx_dma = 0x1; /* reserved */
-+ config->standard_tcb = 0x1; /* 1=standard, 0=extended */
-+ config->standard_stat_counter = 0x1; /* 1=standard, 0=extended */
-+ config->rx_discard_short_frames = 0x1; /* 1=discard, 0=pass */
-+ config->tx_underrun_retry = 0x3; /* # of underrun retries */
-+ config->mii_mode = 0x1; /* 1=MII mode, 0=503 mode */
-+ config->pad10 = 0x6;
-+ config->no_source_addr_insertion = 0x1; /* 1=no, 0=yes */
-+ config->preamble_length = 0x2; /* 0=1, 1=3, 2=7, 3=15 bytes */
-+ config->ifs = 0x6; /* x16 = inter frame spacing */
-+ config->ip_addr_hi = 0xF2; /* ARP IP filter - not used */
-+ config->pad15_1 = 0x1;
-+ config->pad15_2 = 0x1;
-+ config->crs_or_cdt = 0x0; /* 0=CRS only, 1=CRS or CDT */
-+ config->fc_delay_hi = 0x40; /* time delay for fc frame */
-+ config->tx_padding = 0x1; /* 1=pad short frames */
-+ config->fc_priority_threshold = 0x7; /* 7=priority fc disabled */
-+ config->pad18 = 0x1;
-+ config->full_duplex_pin = 0x1; /* 1=examine FDX# pin */
-+ config->pad20_1 = 0x1F;
-+ config->fc_priority_location = 0x1; /* 1=byte#31, 0=byte#19 */
-+ config->pad21_1 = 0x5;
-+
-+ config->adaptive_ifs = nic->adaptive_ifs;
-+ config->loopback = nic->loopback;
-+
-+ if(nic->mii.force_media && nic->mii.full_duplex)
-+ config->full_duplex_force = 0x1; /* 1=force, 0=auto */
-+
-+ if(nic->flags & promiscuous || nic->loopback) {
-+ config->rx_save_bad_frames = 0x1; /* 1=save, 0=discard */
-+ config->rx_discard_short_frames = 0x0; /* 1=discard, 0=save */
-+ config->promiscuous_mode = 0x1; /* 1=on, 0=off */
-+ }
-+
-+ if(nic->flags & multicast_all)
-+ config->multicast_all = 0x1; /* 1=accept, 0=no */
-+
-+ if(!(nic->flags & wol_magic))
-+ config->magic_packet_disable = 0x1; /* 1=off, 0=on */
-+
-+ if(nic->mac >= mac_82558_D101_A4) {
-+ config->fc_disable = 0x1; /* 1=Tx fc off, 0=Tx fc on */
-+ config->mwi_enable = 0x1; /* 1=enable, 0=disable */
-+ config->standard_tcb = 0x0; /* 1=standard, 0=extended */
-+ config->rx_long_ok = 0x1; /* 1=VLANs ok, 0=standard */
-+ if(nic->mac >= mac_82559_D101M)
-+ config->tno_intr = 0x1; /* TCO stats enable */
-+ else
-+ config->standard_stat_counter = 0x0;
-+ }
-+
-+ DPRINTK(HW, DEBUG, "[00-07]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
-+ c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
-+ DPRINTK(HW, DEBUG, "[08-15]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
-+ c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
-+ DPRINTK(HW, DEBUG, "[16-23]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",
-+ c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]);
-+}
-+
-+static void e100_setup_iaaddr(struct nic *nic, struct cb *cb,
-+ struct sk_buff *skb)
-+{
-+ cb->command = cpu_to_le16(cb_iaaddr);
-+ memcpy(cb->u.iaaddr, nic->netdev->dev_addr, ETH_ALEN);
-+}
-+
-+static void e100_dump(struct nic *nic, struct cb *cb, struct sk_buff *skb)
-+{
-+ cb->command = cpu_to_le16(cb_dump);
-+ cb->u.dump_buffer_addr = cpu_to_le32(nic->dma_addr +
-+ offsetof(struct mem, dump_buf));
-+}
-+
-+#define NCONFIG_AUTO_SWITCH 0x0080
-+#define MII_NSC_CONG MII_RESV1
-+#define NSC_CONG_ENABLE 0x0100
-+#define NSC_CONG_TXREADY 0x0400
-+#define ADVERTISE_FC_SUPPORTED 0x0400
-+static int e100_phy_init(struct nic *nic)
-+{
-+ struct net_device *netdev = nic->netdev;
-+ u32 addr;
-+ u16 bmcr, stat, id_lo, id_hi, cong;
-+
-+ nic->mii.phy_id = 0;
-+ nic->mii.advertising = 0;
-+ nic->mii.phy_id_mask = 0x1F;
-+ nic->mii.reg_num_mask = 0x1F;
-+ nic->mii.dev = netdev;
-+ nic->mii.full_duplex = 0;
-+ nic->mii.force_media = 0;
-+ nic->mii.mdio_read = mdio_read;
-+ nic->mii.mdio_write = mdio_write;
-+
-+ /* Discover phy addr by searching addrs in order {1,0,2,..., 31} */
-+ for(addr = 0; addr < 32; addr++) {
-+ nic->mii.phy_id = (addr == 0) ? 1 : (addr == 1) ? 0 : addr;
-+ bmcr = mdio_read(netdev, nic->mii.phy_id, MII_BMCR);
-+ stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
-+ stat = mdio_read(netdev, nic->mii.phy_id, MII_BMSR);
-+ if(!((bmcr == 0xFFFF) || ((stat == 0) && (bmcr == 0))))
-+ break;
-+ }
-+ DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
-+ if(addr == 32)
-+ return -EAGAIN;
-+
-+ /* Selected the phy and isolate the rest */
-+ for(addr = 0; addr < 32; addr++) {
-+ if(addr != nic->mii.phy_id) {
-+ mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
-+ } else {
-+ bmcr = mdio_read(netdev, addr, MII_BMCR);
-+ mdio_write(netdev, addr, MII_BMCR,
-+ bmcr & ~BMCR_ISOLATE);
-+ }
-+ }
-+
-+ /* Get phy ID */
-+ id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
-+ id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
-+ nic->phy = (u32)id_hi << 16 | (u32)id_lo;
-+ DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
-+
-+ /* Handle National tx phy */
-+ if(nic->phy == phy_nsc_tx) {
-+ /* Disable congestion control */
-+ cong = mdio_read(netdev, nic->mii.phy_id, MII_NSC_CONG);
-+ cong |= NSC_CONG_TXREADY;
-+ cong &= ~NSC_CONG_ENABLE;
-+ mdio_write(netdev, nic->mii.phy_id, MII_NSC_CONG, cong);
-+ }
-+
-+ /* enable MDI/MDI-X auto-switching */
-+ if(nic->mac >= mac_82550_D102)
-+ mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
-+ NCONFIG_AUTO_SWITCH);
-+
-+ return 0;
-+}
-+
-+static int e100_hw_init(struct nic *nic)
-+{
-+ int err;
-+
-+ e100_hw_reset(nic);
-+
-+ DPRINTK(HW, ERR, "e100_hw_init\n");
-+ if(!in_interrupt() && (err = e100_self_test(nic)))
-+ return err;
-+
-+ if((err = e100_phy_init(nic)))
-+ return err;
-+ if((err = e100_exec_cmd(nic, cuc_load_base, 0)))
-+ return err;
-+ if((err = e100_exec_cmd(nic, ruc_load_base, 0)))
-+ return err;
-+ if((err = e100_exec_cb(nic, NULL, e100_configure)))
-+ return err;
-+ if((err = e100_exec_cb(nic, NULL, e100_setup_iaaddr)))
-+ return err;
-+ if((err = e100_exec_cmd(nic, cuc_dump_addr,
-+ nic->dma_addr + offsetof(struct mem, stats))))
-+ return err;
-+ if((err = e100_exec_cmd(nic, cuc_dump_reset, 0)))
-+ return err;
-+
-+ e100_disable_irq(nic);
-+
-+ return 0;
-+}
-+
-+static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)
-+{
-+ struct net_device *netdev = nic->netdev;
-+ struct dev_mc_list *list = netdev->mc_list;
-+ u16 i, count = min(netdev->mc_count, E100_MAX_MULTICAST_ADDRS);
-+
-+ cb->command = cpu_to_le16(cb_multi);
-+ cb->u.multi.count = cpu_to_le16(count * ETH_ALEN);
-+ for(i = 0; list && i < count; i++, list = list->next)
-+ memcpy(&cb->u.multi.addr[i*ETH_ALEN], &list->dmi_addr,
-+ ETH_ALEN);
-+}
-+
-+static void e100_set_multicast_list(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+
-+ DPRINTK(HW, DEBUG, "mc_count=%d, flags=0x%04X\n",
-+ netdev->mc_count, netdev->flags);
-+
-+ if(netdev->flags & IFF_PROMISC)
-+ nic->flags |= promiscuous;
-+ else
-+ nic->flags &= ~promiscuous;
-+
-+ if(netdev->flags & IFF_ALLMULTI ||
-+ netdev->mc_count > E100_MAX_MULTICAST_ADDRS)
-+ nic->flags |= multicast_all;
-+ else
-+ nic->flags &= ~multicast_all;
-+
-+ e100_exec_cb(nic, NULL, e100_configure);
-+ e100_exec_cb(nic, NULL, e100_multi);
-+}
-+
-+static void e100_update_stats(struct nic *nic)
-+{
-+ struct net_device_stats *ns = &nic->net_stats;
-+ struct stats *s = &nic->mem->stats;
-+ u32 *complete = (nic->mac < mac_82558_D101_A4) ? &s->fc_xmt_pause :
-+ (nic->mac < mac_82559_D101M) ? (u32 *)&s->xmt_tco_frames :
-+ &s->complete;
-+
-+ /* Device's stats reporting may take several microseconds to
-+ * complete, so where always waiting for results of the
-+ * previous command. */
-+
-+ if(*complete == le32_to_cpu(0x0000A007)) {
-+ *complete = 0;
-+ nic->tx_frames = le32_to_cpu(s->tx_good_frames);
-+ nic->tx_collisions = le32_to_cpu(s->tx_total_collisions);
-+ ns->tx_aborted_errors += le32_to_cpu(s->tx_max_collisions);
-+ ns->tx_window_errors += le32_to_cpu(s->tx_late_collisions);
-+ ns->tx_carrier_errors += le32_to_cpu(s->tx_lost_crs);
-+ ns->tx_fifo_errors += le32_to_cpu(s->tx_underruns);
-+ ns->collisions += nic->tx_collisions;
-+ ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
-+ le32_to_cpu(s->tx_lost_crs);
-+ ns->rx_dropped += le32_to_cpu(s->rx_resource_errors);
-+ ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors);
-+ ns->rx_over_errors += le32_to_cpu(s->rx_resource_errors);
-+ ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
-+ ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
-+ ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors);
-+ ns->rx_errors += le32_to_cpu(s->rx_crc_errors) +
-+ le32_to_cpu(s->rx_alignment_errors) +
-+ le32_to_cpu(s->rx_short_frame_errors) +
-+ le32_to_cpu(s->rx_cdt_errors);
-+ nic->tx_deferred += le32_to_cpu(s->tx_deferred);
-+ nic->tx_single_collisions +=
-+ le32_to_cpu(s->tx_single_collisions);
-+ nic->tx_multiple_collisions +=
-+ le32_to_cpu(s->tx_multiple_collisions);
-+ if(nic->mac >= mac_82558_D101_A4) {
-+ nic->tx_fc_pause += le32_to_cpu(s->fc_xmt_pause);
-+ nic->rx_fc_pause += le32_to_cpu(s->fc_rcv_pause);
-+ nic->rx_fc_unsupported +=
-+ le32_to_cpu(s->fc_rcv_unsupported);
-+ if(nic->mac >= mac_82559_D101M) {
-+ nic->tx_tco_frames +=
-+ le16_to_cpu(s->xmt_tco_frames);
-+ nic->rx_tco_frames +=
-+ le16_to_cpu(s->rcv_tco_frames);
-+ }
-+ }
-+ }
-+
-+ e100_exec_cmd(nic, cuc_dump_reset, 0);
-+}
-+
-+static void e100_adjust_adaptive_ifs(struct nic *nic, int speed, int duplex)
-+{
-+ /* Adjust inter-frame-spacing (IFS) between two transmits if
-+ * we're getting collisions on a half-duplex connection. */
-+
-+ if(duplex == DUPLEX_HALF) {
-+ u32 prev = nic->adaptive_ifs;
-+ u32 min_frames = (speed == SPEED_100) ? 1000 : 100;
-+
-+ if((nic->tx_frames / 32 < nic->tx_collisions) &&
-+ (nic->tx_frames > min_frames)) {
-+ if(nic->adaptive_ifs < 60)
-+ nic->adaptive_ifs += 5;
-+ } else if (nic->tx_frames < min_frames) {
-+ if(nic->adaptive_ifs >= 5)
-+ nic->adaptive_ifs -= 5;
-+ }
-+ if(nic->adaptive_ifs != prev)
-+ e100_exec_cb(nic, NULL, e100_configure);
-+ }
-+}
-+
-+static void e100_watchdog(unsigned long data)
-+{
-+ struct nic *nic = (struct nic *)data;
-+ struct ethtool_cmd cmd;
-+
-+ DPRINTK(TIMER, DEBUG, "right now = %ld\n", jiffies);
-+
-+ /* mii library handles link maintenance tasks */
-+
-+ mii_ethtool_gset(&nic->mii, &cmd);
-+
-+ if(mii_link_ok(&nic->mii) && !netif_carrier_ok(nic->netdev)) {
-+ DPRINTK(LINK, INFO, "link up, %sMbps, %s-duplex\n",
-+ cmd.speed == SPEED_100 ? "100" : "10",
-+ cmd.duplex == DUPLEX_FULL ? "full" : "half");
-+ } else if(!mii_link_ok(&nic->mii) && netif_carrier_ok(nic->netdev)) {
-+ DPRINTK(LINK, INFO, "link down\n");
-+ }
-+
-+ mii_check_link(&nic->mii);
-+
-+ /* Software generated interrupt to recover from (rare) Rx
-+ * allocation failure */
-+ writeb(irq_sw_gen, &nic->csr->scb.cmd_hi);
-+ e100_write_flush(nic);
-+
-+ e100_update_stats(nic);
-+ e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex);
-+
-+ if(nic->mac <= mac_82557_D100_C)
-+ /* Issue a multicast command to workaround a 557 lock up */
-+ e100_set_multicast_list(nic->netdev);
-+
-+ mod_timer(&nic->watchdog, jiffies + E100_WATCHDOG_PERIOD);
-+}
-+
-+static inline void e100_xmit_prepare(struct nic *nic, struct cb *cb,
-+ struct sk_buff *skb)
-+{
-+ cb->command = nic->tx_command;
-+ cb->u.tcb.tbd_array = cb->dma_addr + offsetof(struct cb, u.tcb.tbd);
-+ cb->u.tcb.tcb_byte_count = 0;
-+ cb->u.tcb.threshold = nic->tx_threshold;
-+ cb->u.tcb.tbd_count = 1;
-+ cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev,
-+ skb->data, skb->len, PCI_DMA_TODEVICE));
-+ cb->u.tcb.tbd.size = cpu_to_le16(skb->len);
-+}
-+
-+static int e100_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+ int err = e100_exec_cb(nic, skb, e100_xmit_prepare);
-+
-+ switch(err) {
-+ case -ENOSPC:
-+ /* We queued the skb, but now we're out of space. */
-+ netif_stop_queue(netdev);
-+ break;
-+ case -ENOMEM:
-+ /* This is a hard error - log it. */
-+ DPRINTK(TX_ERR, DEBUG, "Out of Tx resources, returning skb\n");
-+ netif_stop_queue(netdev);
-+ return 1;
-+ }
-+
-+ netdev->trans_start = jiffies;
-+ return 0;
-+}
-+
-+static inline int e100_tx_clean(struct nic *nic)
-+{
-+ struct cb *cb;
-+ int tx_cleaned = 0;
-+
-+ spin_lock(&nic->cb_lock);
-+
-+ DPRINTK(TX_DONE, DEBUG, "cb->status = 0x%04X\n",
-+ nic->cb_to_clean->status);
-+
-+ /* Clean CBs marked complete */
-+ for(cb = nic->cb_to_clean;
-+ cb->status & cpu_to_le16(cb_complete);
-+ cb = nic->cb_to_clean = cb->next) {
-+ if(likely(cb->skb != NULL)) {
-+ nic->net_stats.tx_packets++;
-+ nic->net_stats.tx_bytes += cb->skb->len;
-+
-+ pci_unmap_single(nic->pdev,
-+ le32_to_cpu(cb->u.tcb.tbd.buf_addr),
-+ le16_to_cpu(cb->u.tcb.tbd.size),
-+ PCI_DMA_TODEVICE);
-+ dev_kfree_skb_any(cb->skb);
-+ tx_cleaned = 1;
-+ }
-+ cb->status = 0;
-+ nic->cbs_avail++;
-+ }
-+
-+ spin_unlock(&nic->cb_lock);
-+
-+ /* Recover from running out of Tx resources in xmit_frame */
-+ if(unlikely(tx_cleaned && netif_queue_stopped(nic->netdev)))
-+ netif_wake_queue(nic->netdev);
-+
-+ return tx_cleaned;
-+}
-+
-+static void e100_clean_cbs(struct nic *nic, int free_mem)
-+{
-+ if(nic->cbs) {
-+ while(nic->cb_to_clean != nic->cb_to_use) {
-+ struct cb *cb = nic->cb_to_clean;
-+ if(cb->skb) {
-+ pci_unmap_single(nic->pdev,
-+ le32_to_cpu(cb->u.tcb.tbd.buf_addr),
-+ le16_to_cpu(cb->u.tcb.tbd.size),
-+ PCI_DMA_TODEVICE);
-+ dev_kfree_skb(cb->skb);
-+ }
-+ nic->cb_to_clean = nic->cb_to_clean->next;
-+ }
-+ nic->cbs_avail = nic->params.cbs.count;
-+ if(free_mem) {
-+ pci_free_consistent(nic->pdev,
-+ sizeof(struct cb) * nic->params.cbs.count,
-+ nic->cbs, nic->cbs_dma_addr);
-+ nic->cbs = NULL;
-+ nic->cbs_avail = 0;
-+ }
-+ }
-+ nic->cuc_cmd = cuc_start;
-+ nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean =
-+ nic->cbs;
-+}
-+
-+static int e100_alloc_cbs(struct nic *nic)
-+{
-+ struct cb *cb;
-+ unsigned int i, count = nic->params.cbs.count;
-+
-+ nic->cuc_cmd = cuc_start;
-+ nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL;
-+ nic->cbs_avail = 0;
-+
-+ nic->cbs = pci_alloc_consistent(nic->pdev,
-+ sizeof(struct cb) * count, &nic->cbs_dma_addr);
-+ if(!nic->cbs)
-+ return -ENOMEM;
-+
-+ for(cb = nic->cbs, i = 0; i < count; cb++, i++) {
-+ cb->next = (i + 1 < count) ? cb + 1 : nic->cbs;
-+ cb->prev = (i == 0) ? nic->cbs + count - 1 : cb - 1;
-+
-+ cb->dma_addr = nic->cbs_dma_addr + i * sizeof(struct cb);
-+ cb->link = cpu_to_le32(nic->cbs_dma_addr +
-+ ((i+1) % count) * sizeof(struct cb));
-+ }
-+
-+ nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = nic->cbs;
-+ nic->cbs_avail = count;
-+
-+ return 0;
-+}
-+
-+static inline void e100_start_receiver(struct nic *nic)
-+{
-+ /* (Re)start RU if suspended or idle and RFA is fully allocated */
-+ struct rx_list *curr =
-+ list_entry(nic->rx_list_head.next, struct rx_list, list);
-+ if(curr->skb) {
-+ u8 status = readb(&nic->csr->scb.status);
-+ if(unlikely((status & rus_mask) != rus_ready))
-+ e100_exec_cmd(nic, ruc_start, curr->dma_addr);
-+ }
-+}
-+
-+static inline int e100_rx_alloc_skb(struct nic *nic, struct rx_list *curr)
-+{
-+ unsigned int rx_offset = 2; /* u32 align protocol headers */
-+
-+ curr->dma_addr = 0;
-+ curr->length = sizeof(struct rfd) + VLAN_ETH_FRAME_LEN;
-+
-+ if(!(curr->skb = dev_alloc_skb(curr->length + rx_offset)))
-+ return -ENOMEM;
-+
-+ skb_reserve(curr->skb, rx_offset);
-+ curr->skb->dev = nic->netdev;
-+ curr->dma_addr = pci_map_single(nic->pdev, curr->skb->data,
-+ curr->length, PCI_DMA_FROMDEVICE);
-+
-+ return 0;
-+}
-+
-+static inline void e100_rx_rfa_add_tail(struct nic *nic, struct rx_list *curr)
-+{
-+ memcpy(curr->skb->data, &nic->blank_rfd, sizeof(struct rfd));
-+ pci_dma_sync_single(nic->pdev, curr->dma_addr,
-+ sizeof(struct rfd), PCI_DMA_TODEVICE);
-+
-+ if(likely(curr->list.prev != &nic->rx_list_head)) {
-+ struct rx_list *prev = (struct rx_list *)curr->list.prev;
-+ if(likely(prev->skb != NULL)) {
-+ struct rfd *prev_rfd = (struct rfd *)prev->skb->data;
-+ put_unaligned(cpu_to_le32(curr->dma_addr),
-+ (u32 *)&prev_rfd->link);
-+ prev_rfd->command = 0;
-+ pci_dma_sync_single(nic->pdev, prev->dma_addr,
-+ sizeof(struct rfd), PCI_DMA_TODEVICE);
-+ }
-+ }
-+}
-+
-+static inline int e100_rx_indicate(struct nic *nic, struct rx_list *curr,
-+ unsigned int *work_done, unsigned int work_to_do)
-+{
-+ struct sk_buff *skb = curr->skb;
-+ struct rfd *rfd = (struct rfd *)skb->data;
-+ u16 rfd_status, actual_size;
-+
-+ if(unlikely(work_done && *work_done >= work_to_do))
-+ return -EAGAIN;
-+
-+ /* Need to sync before taking a peek at cb_complete bit */
-+ pci_dma_sync_single(nic->pdev, curr->dma_addr,
-+ sizeof(struct rfd), PCI_DMA_FROMDEVICE);
-+ rfd_status = le16_to_cpu(rfd->status);
-+
-+ DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status);
-+
-+ /* If data isn't ready, nothing to indicate */
-+ if(unlikely(!(rfd_status & cb_complete)))
-+ return -EAGAIN;
-+
-+ /* Get actual data size */
-+ actual_size = le16_to_cpu(rfd->actual_size) & 0x3FFF;
-+ if(unlikely(actual_size > curr->length - sizeof(struct rfd)))
-+ actual_size = curr->length - sizeof(struct rfd);
-+
-+ /* Get data */
-+ pci_dma_sync_single(nic->pdev, curr->dma_addr,
-+ sizeof(struct rfd) + actual_size,
-+ PCI_DMA_FROMDEVICE);
-+ pci_unmap_single(nic->pdev, curr->dma_addr,
-+ curr->length, PCI_DMA_FROMDEVICE);
-+
-+ /* Pull off the RFD and put the actual data (minus eth hdr) */
-+ skb_reserve(skb, sizeof(struct rfd));
-+ skb_put(skb, actual_size);
-+ skb->protocol = eth_type_trans(skb, nic->netdev);
-+
-+ if(unlikely(!(rfd_status & cb_ok)) ||
-+ actual_size > nic->netdev->mtu + VLAN_ETH_HLEN) {
-+ /* Don't indicate if errors */
-+ dev_kfree_skb_any(skb);
-+ } else {
-+ nic->net_stats.rx_packets++;
-+ nic->net_stats.rx_bytes += actual_size;
-+ nic->netdev->last_rx = jiffies;
-+#ifdef CONFIG_E100_NAPI
-+ netif_receive_skb(skb);
-+#else
-+ netif_rx(skb);
-+#endif
-+ if(work_done)
-+ (*work_done)++;
-+ }
-+
-+ curr->length = 0;
-+ curr->dma_addr = 0;
-+ curr->skb = NULL;
-+
-+ return 0;
-+}
-+
-+static inline void e100_rx_clean(struct nic *nic, unsigned int *work_done,
-+ unsigned int work_to_do)
-+{
-+ struct list_head *list, *tmp;
-+ struct rx_list *curr;
-+
-+ /* Indicate newly arrived packets */
-+ list_for_each(list, &nic->rx_list_head) {
-+ curr = list_entry(list, struct rx_list, list);
-+ if(likely(curr->skb != NULL))
-+ if(e100_rx_indicate(nic, curr, work_done, work_to_do))
-+ break;
-+ }
-+
-+ /* Alloc new skbs to refill list */
-+ list_for_each_safe(list, tmp, &nic->rx_list_head) {
-+ curr = list_entry(list, struct rx_list, list);
-+ if(unlikely(curr->skb != NULL))
-+ break; /* List is full, done */
-+ if(unlikely(e100_rx_alloc_skb(nic, curr)))
-+ break; /* Better luck next time (see watchdog) */
-+ list_del(&curr->list);
-+ list_add_tail(&curr->list, &nic->rx_list_head);
-+ e100_rx_rfa_add_tail(nic, curr);
-+ }
-+
-+ e100_start_receiver(nic);
-+}
-+
-+static void e100_rx_clean_list(struct nic *nic)
-+{
-+ struct list_head *list;
-+
-+ if(!nic->rx_list)
-+ return;
-+
-+ list_for_each(list, &nic->rx_list_head) {
-+ struct rx_list *curr = list_entry(list,
-+ struct rx_list, list);
-+ if(curr->skb) {
-+ pci_unmap_single(nic->pdev, curr->dma_addr,
-+ curr->length, PCI_DMA_FROMDEVICE);
-+ dev_kfree_skb(curr->skb);
-+ }
-+ }
-+
-+ kfree(nic->rx_list);
-+ nic->rx_list = NULL;
-+}
-+
-+static int e100_rx_alloc_list(struct nic *nic)
-+{
-+ struct rx_list *curr;
-+ unsigned int i, count = nic->params.rfds.count;
-+
-+ INIT_LIST_HEAD(&nic->rx_list_head);
-+
-+ if(!(nic->rx_list = kmalloc(sizeof(struct rx_list)*count, GFP_ATOMIC)))
-+ return -ENOMEM;
-+
-+ for(curr = nic->rx_list, i = 0; i < count; curr++, i++) {
-+ if(e100_rx_alloc_skb(nic, curr)) {
-+ e100_rx_clean_list(nic);
-+ return -ENOMEM;
-+ }
-+ list_add_tail(&curr->list, &nic->rx_list_head);
-+ e100_rx_rfa_add_tail(nic, curr);
-+ }
-+
-+ return 0;
-+}
-+
-+static irqreturn_t e100_intr(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+ struct net_device *netdev = dev_id;
-+ struct nic *nic = netdev->priv;
-+ u8 stat_ack = readb(&nic->csr->scb.stat_ack);
-+
-+ DPRINTK(INTR, DEBUG, "stat_ack = 0x%02X\n", stat_ack);
-+
-+ if(stat_ack == 0x00 || /* Not our interrupt */
-+ stat_ack == 0xFF) /* Hardware is ejected (cardbus, hotswap) */
-+ return IRQ_NONE;
-+
-+ /* Ack interrupts */
-+ writeb(stat_ack, &nic->csr->scb.stat_ack);
-+ e100_write_flush(nic);
-+
-+#ifdef CONFIG_E100_NAPI
-+ e100_disable_irq(nic);
-+ netif_rx_schedule(netdev);
-+#else
-+ if(stat_ack & stat_ack_rx)
-+ e100_rx_clean(nic, NULL, 0);
-+ if(stat_ack & stat_ack_tx)
-+ e100_tx_clean(nic);
-+#endif
-+
-+ return IRQ_HANDLED;
-+}
-+
-+#ifdef CONFIG_E100_NAPI
-+static int e100_poll(struct net_device *netdev, int *budget)
-+{
-+ struct nic *nic = netdev->priv;
-+ unsigned int work_to_do = min(netdev->quota, *budget);
-+ unsigned int work_done = 0;
-+ int tx_cleaned;
-+
-+ e100_rx_clean(nic, &work_done, work_to_do);
-+ tx_cleaned = e100_tx_clean(nic);
-+
-+ /* If no Rx and Tx cleanup work was done, exit polling mode. */
-+ if((!tx_cleaned && (work_done == 0)) || !netif_running(netdev)) {
-+ netif_rx_complete(netdev);
-+ e100_enable_irq(nic);
-+ return 0;
-+ }
-+
-+ *budget -= work_done;
-+ netdev->quota -= work_done;
-+
-+ return 1;
-+}
-+#endif
-+
-+static struct net_device_stats *e100_get_stats(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+ return &nic->net_stats;
-+}
-+
-+static int e100_set_mac_address(struct net_device *netdev, void *p)
-+{
-+ struct nic *nic = netdev->priv;
-+ struct sockaddr *addr = p;
-+
-+ if (!is_valid_ether_addr(addr->sa_data))
-+ return -EADDRNOTAVAIL;
-+
-+ memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
-+ e100_exec_cb(nic, NULL, e100_setup_iaaddr);
-+
-+ return 0;
-+}
-+
-+static int e100_change_mtu(struct net_device *netdev, int new_mtu)
-+{
-+ if(new_mtu < ETH_ZLEN || new_mtu > ETH_DATA_LEN)
-+ return -EINVAL;
-+ netdev->mtu = new_mtu;
-+ return 0;
-+}
-+
-+static int e100_asf(struct nic *nic)
-+{
-+ /* ASF can be enabled from eeprom */
-+ return((nic->pdev->device >= 0x1050) && (nic->pdev->device <= 0x1055) &&
-+ (nic->eeprom[eeprom_config_asf] & eeprom_asf) &&
-+ !(nic->eeprom[eeprom_config_asf] & eeprom_gcl) &&
-+ ((nic->eeprom[eeprom_smbus_addr] & 0xFF) != 0xFE));
-+}
-+
-+static int e100_up(struct nic *nic)
-+{
-+ int err;
-+
-+ if((err = e100_rx_alloc_list(nic)))
-+ return err;
-+ if((err = e100_alloc_cbs(nic)))
-+ goto err_rx_clean_list;
-+ if((err = e100_hw_init(nic)))
-+ goto err_clean_cbs;
-+ e100_set_multicast_list(nic->netdev);
-+ e100_start_receiver(nic);
-+ netif_start_queue(nic->netdev);
-+ mod_timer(&nic->watchdog, jiffies);
-+ if((err = request_irq(nic->pdev->irq, e100_intr, SA_SHIRQ,
-+ nic->netdev->name, nic->netdev)))
-+ goto err_no_irq;
-+ e100_enable_irq(nic);
-+ return 0;
-+
-+err_no_irq:
-+ del_timer_sync(&nic->watchdog);
-+ netif_stop_queue(nic->netdev);
-+err_clean_cbs:
-+ e100_clean_cbs(nic, 1);
-+err_rx_clean_list:
-+ e100_rx_clean_list(nic);
-+ return err;
-+}
-+
-+static void e100_down(struct nic *nic)
-+{
-+ e100_disable_irq(nic);
-+ free_irq(nic->pdev->irq, nic->netdev);
-+ del_timer_sync(&nic->watchdog);
-+ netif_carrier_off(nic->netdev);
-+ netif_stop_queue(nic->netdev);
-+ e100_clean_cbs(nic, 1);
-+ e100_rx_clean_list(nic);
-+}
-+
-+static void e100_tx_timeout(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+
-+ DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n",
-+ readb(&nic->csr->scb.status));
-+ e100_down(netdev->priv);
-+ e100_up(netdev->priv);
-+}
-+
-+static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
-+{
-+ int err;
-+ struct sk_buff *skb;
-+ struct rx_list *rx;
-+
-+ /* Use driver resources to perform internal MAC or PHY
-+ * loopback test. A single packet is prepared and transmitted
-+ * in loopback mode, and the test passes if the received
-+ * packet compares byte-for-byte to the transmitted packet. */
-+
-+ if((err = e100_rx_alloc_list(nic)))
-+ return err;
-+ if((err = e100_alloc_cbs(nic)))
-+ goto err_clean_rx;
-+
-+ /* ICH PHY loopback is broken so do MAC loopback instead */
-+ if(nic->flags & ich && loopback_mode == lb_phy)
-+ loopback_mode = lb_mac;
-+
-+ nic->loopback = loopback_mode;
-+ if((err = e100_hw_init(nic)))
-+ goto err_loopback_none;
-+
-+ if(loopback_mode == lb_phy)
-+ mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR,
-+ BMCR_LOOPBACK);
-+
-+ e100_start_receiver(nic);
-+
-+ if(!(skb = dev_alloc_skb(ETH_DATA_LEN))) {
-+ err = -ENOMEM;
-+ goto err_loopback_none;
-+ }
-+ skb_put(skb, ETH_DATA_LEN);
-+ memset(skb->data, 0xFF, ETH_DATA_LEN);
-+ e100_xmit_frame(skb, nic->netdev);
-+
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ schedule_timeout(HZ / 100 + 1);
-+
-+ rx = list_entry(nic->rx_list_head.next, struct rx_list, list);
-+ if(memcmp(rx->skb->data + sizeof(struct rfd), skb->data, ETH_DATA_LEN))
-+ err = -EAGAIN;
-+
-+err_loopback_none:
-+ mdio_write(nic->netdev, nic->mii.phy_id, MII_BMCR, 0);
-+ nic->loopback = lb_none;
-+ e100_hw_init(nic);
-+ e100_clean_cbs(nic, 1);
-+err_clean_rx:
-+ e100_rx_clean_list(nic);
-+ return err;
-+}
-+
-+#define MII_LED_CONTROL 0x1B
-+static void e100_blink_led(unsigned long data)
-+{
-+ struct nic *nic = (struct nic *)data;
-+ enum led_state {
-+ led_on = 0x01,
-+ led_off = 0x04,
-+ led_on_559 = 0x05,
-+ led_on_557 = 0x07,
-+ };
-+
-+ nic->leds = (nic->leds & led_on) ? led_off :
-+ (nic->mac < mac_82559_D101M) ? led_on_557 : led_on_559;
-+ mdio_write(nic->netdev, nic->mii.phy_id, MII_LED_CONTROL, nic->leds);
-+ mod_timer(&nic->blink_timer, jiffies + HZ / 4);
-+}
-+
-+static int e100_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
-+{
-+ struct nic *nic = netdev->priv;
-+ return mii_ethtool_gset(&nic->mii, cmd);
-+}
-+
-+static int e100_set_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
-+{
-+ struct nic *nic = netdev->priv;
-+ return mii_ethtool_sset(&nic->mii, cmd);
-+}
-+
-+static void e100_get_drvinfo(struct net_device *netdev,
-+ struct ethtool_drvinfo *info)
-+{
-+ struct nic *nic = netdev->priv;
-+ strcpy(info->driver, DRV_NAME);
-+ strcpy(info->version, DRV_VERSION);
-+ strcpy(info->fw_version, "N/A");
-+ strcpy(info->bus_info, pci_name(nic->pdev));
-+}
-+
-+static int e100_get_regs_len(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+#define E100_PHY_REGS 0x1C
-+#define E100_REGS_LEN 1 + E100_PHY_REGS + \
-+ sizeof(nic->mem->dump_buf) / sizeof(u32)
-+ return E100_REGS_LEN * sizeof(u32);
-+}
-+
-+static void e100_get_regs(struct net_device *netdev,
-+ struct ethtool_regs *regs, void *p)
-+{
-+ struct nic *nic = netdev->priv;
-+ u32 *buff = p;
-+ int i;
-+
-+ regs->version = (1 << 24) | nic->rev_id;
-+ buff[0] = readb(&nic->csr->scb.cmd_hi) << 24 |
-+ readb(&nic->csr->scb.cmd_lo) << 16 |
-+ readw(&nic->csr->scb.status);
-+ for(i = E100_PHY_REGS; i >= 0; i--)
-+ buff[1 + E100_PHY_REGS - i] =
-+ mdio_read(netdev, nic->mii.phy_id, i);
-+ memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));
-+ e100_exec_cb(nic, NULL, e100_dump);
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ schedule_timeout(HZ / 100 + 1);
-+ memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf,
-+ sizeof(nic->mem->dump_buf));
-+}
-+
-+static void e100_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
-+{
-+ struct nic *nic = netdev->priv;
-+ wol->supported = (nic->mac >= mac_82558_D101_A4) ? WAKE_MAGIC : 0;
-+ wol->wolopts = (nic->flags & wol_magic) ? WAKE_MAGIC : 0;
-+}
-+
-+static int e100_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
-+{
-+ struct nic *nic = netdev->priv;
-+
-+ if(wol->wolopts != WAKE_MAGIC && wol->wolopts != 0)
-+ return -EOPNOTSUPP;
-+
-+ if(wol->wolopts)
-+ nic->flags |= wol_magic;
-+ else
-+ nic->flags &= ~wol_magic;
-+
-+ pci_enable_wake(nic->pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
-+ e100_exec_cb(nic, NULL, e100_configure);
-+
-+ return 0;
-+}
-+
-+static u32 e100_get_msglevel(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+ return nic->msg_enable;
-+}
-+
-+static void e100_set_msglevel(struct net_device *netdev, u32 value)
-+{
-+ struct nic *nic = netdev->priv;
-+ nic->msg_enable = value;
-+}
-+
-+static int e100_nway_reset(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+ return mii_nway_restart(&nic->mii);
-+}
-+
-+static u32 e100_get_link(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+ return mii_link_ok(&nic->mii);
-+}
-+
-+static int e100_get_eeprom_len(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+ return nic->eeprom_wc << 1;
-+}
-+
-+#define E100_EEPROM_MAGIC 0x1234
-+static int e100_get_eeprom(struct net_device *netdev,
-+ struct ethtool_eeprom *eeprom, u8 *bytes)
-+{
-+ struct nic *nic = netdev->priv;
-+
-+ eeprom->magic = E100_EEPROM_MAGIC;
-+ memcpy(bytes, &((u8 *)nic->eeprom)[eeprom->offset], eeprom->len);
-+
-+ return 0;
-+}
-+
-+static int e100_set_eeprom(struct net_device *netdev,
-+ struct ethtool_eeprom *eeprom, u8 *bytes)
-+{
-+ struct nic *nic = netdev->priv;
-+
-+ if(eeprom->magic != E100_EEPROM_MAGIC)
-+ return -EINVAL;
-+ memcpy(&((u8 *)nic->eeprom)[eeprom->offset], bytes, eeprom->len);
-+
-+ return e100_eeprom_save(nic, eeprom->offset >> 1,
-+ (eeprom->len >> 1) + 1);
-+}
-+
-+static void e100_get_ringparam(struct net_device *netdev,
-+ struct ethtool_ringparam *ring)
-+{
-+ struct nic *nic = netdev->priv;
-+ struct param_range *rfds = &nic->params.rfds;
-+ struct param_range *cbs = &nic->params.cbs;
-+
-+ ring->rx_max_pending = rfds->max;
-+ ring->tx_max_pending = cbs->max;
-+ ring->rx_mini_max_pending = 0;
-+ ring->rx_jumbo_max_pending = 0;
-+ ring->rx_pending = rfds->count;
-+ ring->tx_pending = cbs->count;
-+ ring->rx_mini_pending = 0;
-+ ring->rx_jumbo_pending = 0;
-+}
-+
-+static int e100_set_ringparam(struct net_device *netdev,
-+ struct ethtool_ringparam *ring)
-+{
-+ struct nic *nic = netdev->priv;
-+ struct param_range *rfds = &nic->params.rfds;
-+ struct param_range *cbs = &nic->params.cbs;
-+
-+ if(netif_running(netdev))
-+ e100_down(nic);
-+ rfds->count = max(ring->rx_pending, rfds->min);
-+ rfds->count = min(rfds->count, rfds->max);
-+ cbs->count = max(ring->tx_pending, cbs->min);
-+ cbs->count = min(cbs->count, cbs->max);
-+ if(netif_running(netdev))
-+ e100_up(nic);
-+
-+ return 0;
-+}
-+
-+static char e100_gstrings_test[][ETH_GSTRING_LEN] = {
-+ "Link test (on/offline)",
-+ "Eeprom test (on/offline)",
-+ "Self test (offline)",
-+ "Mac loopback (offline)",
-+ "Phy loopback (offline)",
-+};
-+#define E100_TEST_LEN sizeof(e100_gstrings_test) / ETH_GSTRING_LEN
-+
-+static int e100_diag_test_count(struct net_device *netdev)
-+{
-+ return E100_TEST_LEN;
-+}
-+
-+static void e100_diag_test(struct net_device *netdev,
-+ struct ethtool_test *test, u64 *data)
-+{
-+ struct nic *nic = netdev->priv;
-+ int i;
-+
-+ memset(data, 0, E100_TEST_LEN * sizeof(u64));
-+ data[0] = !mii_link_ok(&nic->mii);
-+ data[1] = e100_eeprom_load(nic);
-+ if(test->flags & ETH_TEST_FL_OFFLINE) {
-+ if(netif_running(netdev))
-+ e100_down(nic);
-+ data[2] = e100_self_test(nic);
-+ data[3] = e100_loopback_test(nic, lb_mac);
-+ data[4] = e100_loopback_test(nic, lb_phy);
-+ if(netif_running(netdev))
-+ e100_up(nic);
-+ }
-+ for(i = 0; i < E100_TEST_LEN; i++)
-+ test->flags |= data[i] ? ETH_TEST_FL_FAILED : 0;
-+}
-+
-+static int e100_phys_id(struct net_device *netdev, u32 data)
-+{
-+ struct nic *nic = netdev->priv;
-+
-+ if(!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ))
-+ data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
-+ mod_timer(&nic->blink_timer, jiffies);
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ schedule_timeout(data * HZ);
-+ del_timer_sync(&nic->blink_timer);
-+ mdio_write(netdev, nic->mii.phy_id, MII_LED_CONTROL, 0);
-+
-+ return 0;
-+}
-+
-+static char e100_gstrings_stats[][ETH_GSTRING_LEN] = {
-+ "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
-+ "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions",
-+ "rx_length_errors", "rx_over_errors", "rx_crc_errors",
-+ "rx_frame_errors", "rx_fifo_errors", "rx_missed_errors",
-+ "tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors",
-+ "tx_heartbeat_errors", "tx_window_errors",
-+ /* device-specific stats */
-+ "tx_deferred", "tx_single_collisions", "tx_multi_collisions",
-+ "tx_flow_control_pause", "rx_flow_control_pause",
-+ "rx_flow_control_unsupported", "tx_tco_packets", "rx_tco_packets",
-+};
-+#define E100_NET_STATS_LEN 21
-+#define E100_STATS_LEN sizeof(e100_gstrings_stats) / ETH_GSTRING_LEN
-+
-+static int e100_get_stats_count(struct net_device *netdev)
-+{
-+ return E100_STATS_LEN;
-+}
-+
-+static void e100_get_ethtool_stats(struct net_device *netdev,
-+ struct ethtool_stats *stats, u64 *data)
-+{
-+ struct nic *nic = netdev->priv;
-+ int i;
-+
-+ for(i = 0; i < E100_NET_STATS_LEN; i++)
-+ data[i] = ((unsigned long *)&nic->net_stats)[i];
-+
-+ data[i++] = nic->tx_deferred;
-+ data[i++] = nic->tx_single_collisions;
-+ data[i++] = nic->tx_multiple_collisions;
-+ data[i++] = nic->tx_fc_pause;
-+ data[i++] = nic->rx_fc_pause;
-+ data[i++] = nic->rx_fc_unsupported;
-+ data[i++] = nic->tx_tco_frames;
-+ data[i++] = nic->rx_tco_frames;
-+}
-+
-+static void e100_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
-+{
-+ switch(stringset) {
-+ case ETH_SS_TEST:
-+ memcpy(data, *e100_gstrings_test, sizeof(e100_gstrings_test));
-+ break;
-+ case ETH_SS_STATS:
-+ memcpy(data, *e100_gstrings_stats, sizeof(e100_gstrings_stats));
-+ break;
-+ }
-+}
-+
-+static struct ethtool_ops e100_ethtool_ops = {
-+ .get_settings = e100_get_settings,
-+ .set_settings = e100_set_settings,
-+ .get_drvinfo = e100_get_drvinfo,
-+ .get_regs_len = e100_get_regs_len,
-+ .get_regs = e100_get_regs,
-+ .get_wol = e100_get_wol,
-+ .set_wol = e100_set_wol,
-+ .get_msglevel = e100_get_msglevel,
-+ .set_msglevel = e100_set_msglevel,
-+ .nway_reset = e100_nway_reset,
-+ .get_link = e100_get_link,
-+ .get_eeprom_len = e100_get_eeprom_len,
-+ .get_eeprom = e100_get_eeprom,
-+ .set_eeprom = e100_set_eeprom,
-+ .get_ringparam = e100_get_ringparam,
-+ .set_ringparam = e100_set_ringparam,
-+ .self_test_count = e100_diag_test_count,
-+ .self_test = e100_diag_test,
-+ .get_strings = e100_get_strings,
-+ .phys_id = e100_phys_id,
-+ .get_stats_count = e100_get_stats_count,
-+ .get_ethtool_stats = e100_get_ethtool_stats,
-+};
-+
-+static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
-+{
-+ struct nic *nic = netdev->priv;
-+ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr->ifr_data;
-+
-+ return generic_mii_ioctl(&nic->mii, mii, cmd, NULL);
-+}
-+
-+static int e100_alloc(struct nic *nic)
-+{
-+ nic->mem = pci_alloc_consistent(nic->pdev, sizeof(struct mem),
-+ &nic->dma_addr);
-+ return nic->mem ? 0 : -ENOMEM;
-+}
-+
-+static void e100_free(struct nic *nic)
-+{
-+ if(nic->mem) {
-+ pci_free_consistent(nic->pdev, sizeof(struct mem),
-+ nic->mem, nic->dma_addr);
-+ nic->mem = NULL;
-+ }
-+}
-+
-+static int e100_open(struct net_device *netdev)
-+{
-+ struct nic *nic = netdev->priv;
-+ int err = 0;
-+
-+ netif_carrier_off(netdev);
-+ if((err = e100_up(nic)))
-+ DPRINTK(IFUP, ERR, "Cannot open interface, aborting.\n");
-+ return err;
-+}
-+
-+static int e100_close(struct net_device *netdev)
-+{
-+ e100_down(netdev->priv);
-+ return 0;
-+}
-+
-+static int __devinit e100_probe(struct pci_dev *pdev,
-+ const struct pci_device_id *ent)
-+{
-+ struct net_device *netdev;
-+ struct nic *nic;
-+ int err;
-+
-+ if(!(netdev = alloc_etherdev(sizeof(struct nic)))) {
-+ if(((1 << debug) - 1) & NETIF_MSG_PROBE)
-+ printk(KERN_ERR PFX "Etherdev alloc failed, abort.\n");
-+ return -ENOMEM;
-+ }
-+
-+ netdev->open = e100_open;
-+ netdev->stop = e100_close;
-+ netdev->hard_start_xmit = e100_xmit_frame;
-+ netdev->get_stats = e100_get_stats;
-+ netdev->set_multicast_list = e100_set_multicast_list;
-+ netdev->set_mac_address = e100_set_mac_address;
-+ netdev->change_mtu = e100_change_mtu;
-+ netdev->do_ioctl = e100_do_ioctl;
-+ SET_ETHTOOL_OPS(netdev, &e100_ethtool_ops);
-+ netdev->tx_timeout = e100_tx_timeout;
-+ netdev->watchdog_timeo = E100_WATCHDOG_PERIOD;
-+#ifdef CONFIG_E100_NAPI
-+ netdev->poll = e100_poll;
-+ netdev->weight = E100_NAPI_WEIGHT;
-+#endif
-+
-+ nic = netdev->priv;
-+ nic->netdev = netdev;
-+ nic->pdev = pdev;
-+ nic->msg_enable = (1 << debug) - 1;
-+ pci_set_drvdata(pdev, netdev);
-+
-+ if((err = pci_enable_device(pdev))) {
-+ DPRINTK(PROBE, ERR, "Cannot enable PCI device, aborting.\n");
-+ goto err_out_free_dev;
-+ }
-+
-+ if(!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
-+ DPRINTK(PROBE, ERR, "Cannot find proper PCI device "
-+ "base address, aborting.\n");
-+ err = -ENODEV;
-+ goto err_out_disable_pdev;
-+ }
-+
-+ if((err = pci_request_regions(pdev, DRV_NAME))) {
-+ DPRINTK(PROBE, ERR, "Cannot obtain PCI resources, aborting.\n");
-+ goto err_out_disable_pdev;
-+ }
-+
-+ pci_set_master(pdev);
-+
-+ if((err = pci_set_dma_mask(pdev, 0xFFFFFFFFULL))) {
-+ DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n");
-+ goto err_out_free_res;
-+ }
-+
-+ SET_MODULE_OWNER(netdev);
-+ SET_NETDEV_DEV(netdev, &pdev->dev);
-+
-+ nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr));
-+ if(!nic->csr) {
-+ DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n");
-+ err = -ENOMEM;
-+ goto err_out_free_res;
-+ }
-+
-+ if(ent->driver_data)
-+ nic->flags |= ich;
-+ else
-+ nic->flags &= ~ich;
-+
-+ spin_lock_init(&nic->cb_lock);
-+ spin_lock_init(&nic->cmd_lock);
-+
-+ init_timer(&nic->watchdog);
-+ nic->watchdog.function = e100_watchdog;
-+ nic->watchdog.data = (unsigned long)nic;
-+ init_timer(&nic->blink_timer);
-+ nic->blink_timer.function = e100_blink_led;
-+ nic->blink_timer.data = (unsigned long)nic;
-+
-+ if((err = e100_alloc(nic))) {
-+ DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n");
-+ goto err_out_iounmap;
-+ }
-+
-+ e100_get_defaults(nic);
-+ e100_hw_reset(nic);
-+ e100_phy_init(nic);
-+
-+ if((err = e100_eeprom_load(nic)))
-+ goto err_out_free;
-+ ((u16 *)netdev->dev_addr)[0] = le16_to_cpu(nic->eeprom[0]);
-+ ((u16 *)netdev->dev_addr)[1] = le16_to_cpu(nic->eeprom[1]);
-+ ((u16 *)netdev->dev_addr)[2] = le16_to_cpu(nic->eeprom[2]);
-+ if(!is_valid_ether_addr(netdev->dev_addr)) {
-+ DPRINTK(PROBE, ERR, "Invalid MAC address from "
-+ "EEPROM, aborting.\n");
-+ err = -EAGAIN;
-+ goto err_out_free;
-+ }
-+
-+ /* Wol magic packet can be enabled from eeprom */
-+ if((nic->mac >= mac_82558_D101_A4) &&
-+ (nic->eeprom[eeprom_id] & eeprom_id_wol))
-+ nic->flags |= wol_magic;
-+
-+ pci_enable_wake(pdev, 0, nic->flags & (wol_magic | e100_asf(nic)));
-+
-+ if((err = register_netdev(netdev))) {
-+ DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
-+ goto err_out_free;
-+ }
-+
-+ DPRINTK(PROBE, INFO, "addr 0x%lx, irq %d, "
-+ "MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n",
-+ pci_resource_start(pdev, 0), pdev->irq,
-+ netdev->dev_addr[0], netdev->dev_addr[1], netdev->dev_addr[2],
-+ netdev->dev_addr[3], netdev->dev_addr[4], netdev->dev_addr[5]);
-+
-+ return 0;
-+
-+err_out_free:
-+ e100_free(nic);
-+err_out_iounmap:
-+ iounmap(nic->csr);
-+err_out_free_res:
-+ pci_release_regions(pdev);
-+err_out_disable_pdev:
-+ pci_disable_device(pdev);
-+err_out_free_dev:
-+ pci_set_drvdata(pdev, NULL);
-+ free_netdev(netdev);
-+ return err;
-+}
-+
-+static void __devexit e100_remove(struct pci_dev *pdev)
-+{
-+ struct net_device *netdev = pci_get_drvdata(pdev);
-+
-+ if(netdev) {
-+ struct nic *nic = netdev->priv;
-+ unregister_netdev(netdev);
-+ e100_free(nic);
-+ iounmap(nic->csr);
-+ free_netdev(netdev);
-+ pci_release_regions(pdev);
-+ pci_disable_device(pdev);
-+ pci_set_drvdata(pdev, NULL);
-+ }
-+}
-+
-+#ifdef CONFIG_PM
-+static int e100_suspend(struct pci_dev *pdev, u32 state)
-+{
-+ struct net_device *netdev = pci_get_drvdata(pdev);
-+ struct nic *nic = netdev->priv;
-+
-+ if(netif_running(netdev))
-+ e100_down(nic);
-+ e100_hw_reset(nic);
-+ netif_device_detach(netdev);
-+
-+ pci_save_state(pdev, nic->pm_state);
-+ pci_enable_wake(pdev, state, nic->flags & (wol_magic | e100_asf(nic)));
-+ pci_disable_device(pdev);
-+ pci_set_power_state(pdev, state);
-+
-+ return 0;
-+}
-+
-+static int e100_resume(struct pci_dev *pdev)
-+{
-+ struct net_device *netdev = pci_get_drvdata(pdev);
-+ struct nic *nic = netdev->priv;
-+
-+ pci_set_power_state(pdev, 0);
-+ pci_restore_state(pdev, nic->pm_state);
-+ e100_hw_init(nic);
-+
-+ netif_device_attach(netdev);
-+ if(netif_running(netdev))
-+ e100_up(nic);
-+
-+ return 0;
-+}
-+#endif
-+
-+static struct pci_driver e100_driver = {
-+ .name = DRV_NAME,
-+ .id_table = e100_id_table,
-+ .probe = e100_probe,
-+ .remove = __devexit_p(e100_remove),
-+#ifdef CONFIG_PM
-+ .suspend = e100_suspend,
-+ .resume = e100_resume,
-+#endif
-+};
-+
-+static int __init e100_init_module(void)
-+{
-+ if(((1 << debug) - 1) & NETIF_MSG_DRV) {
-+ printk(KERN_INFO PFX "%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
-+ printk(KERN_INFO PFX "%s\n", DRV_COPYRIGHT);
-+ }
-+ return pci_module_init(&e100_driver);
-+}
-+
-+static void __exit e100_cleanup_module(void)
-+{
-+ pci_unregister_driver(&e100_driver);
-+}
-+
-+module_init(e100_init_module);
-+module_exit(e100_cleanup_module);
---- linux-2.6.0/drivers/net/e100/e100_config.c 2003-09-27 18:57:45.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,639 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--/**********************************************************************
--* *
--* INTEL CORPORATION *
--* *
--* This software is supplied under the terms of the license included *
--* above. All use of this driver must be in accordance with the terms *
--* of that license. *
--* *
--* Module Name: e100_config.c *
--* *
--* Abstract: Functions for configuring the network adapter. *
--* *
--* Environment: This file is intended to be specific to the Linux *
--* operating system. *
--* *
--**********************************************************************/
--#include "e100_config.h"
--
--static void e100_config_long_rx(struct e100_private *bdp, unsigned char enable);
--
--static const u8 def_config[] = {
-- CB_CFIG_BYTE_COUNT,
-- 0x08, 0x00, 0x00, 0x00, 0x00, 0x32, 0x07, 0x01,
-- 0x00, 0x2e, 0x00, 0x60, 0x00, 0xf2, 0xc8, 0x00,
-- 0x40, 0xf2, 0x80, 0x3f, 0x05
--};
--
--/**
-- * e100_config_init_82557 - config the 82557 adapter
-- * @bdp: atapter's private data struct
-- *
-- * This routine will initialize the 82557 configure block.
-- * All other init functions will only set values that are
-- * different from the 82557 default.
-- */
--void __devinit
--e100_config_init_82557(struct e100_private *bdp)
--{
-- /* initialize config block */
-- memcpy(bdp->config, def_config, sizeof (def_config));
-- bdp->config[0] = CB_CFIG_BYTE_COUNT; /* just in case */
--
-- e100_config_ifs(bdp);
--
-- /*
-- * Enable extended statistical counters (82558 and up) and TCO counters
-- * (82559 and up) and set the statistical counters' mode in bdp
-- *
-- * stat. mode | TCO stat. bit (2) | Extended stat. bit (5)
-- * ------------------------------------------------------------------
-- * Basic (557) | 0 | 1
-- * ------------------------------------------------------------------
-- * Extended (558) | 0 | 0
-- * ------------------------------------------------------------------
-- * TCO (559) | 1 | 1
-- * ------------------------------------------------------------------
-- * Reserved | 1 | 0
-- * ------------------------------------------------------------------
-- */
-- bdp->config[6] &= ~CB_CFIG_TCO_STAT;
-- bdp->config[6] |= CB_CFIG_EXT_STAT_DIS;
-- bdp->stat_mode = E100_BASIC_STATS;
--
-- /* Setup for MII or 503 operation. The CRS+CDT bit should only be set */
-- /* when operating in 503 mode. */
-- if (bdp->phy_addr == 32) {
-- bdp->config[8] &= ~CB_CFIG_503_MII;
-- bdp->config[15] |= CB_CFIG_CRS_OR_CDT;
-- } else {
-- bdp->config[8] |= CB_CFIG_503_MII;
-- bdp->config[15] &= ~CB_CFIG_CRS_OR_CDT;
-- }
--
-- e100_config_fc(bdp);
-- e100_config_force_dplx(bdp);
-- e100_config_promisc(bdp, false);
-- e100_config_mulcast_enbl(bdp, false);
--}
--
--static void __devinit
--e100_config_init_82558(struct e100_private *bdp)
--{
-- /* MWI enable. This should be turned on only if the adapter is a 82558/9
-- * and if the PCI command reg. has enabled the MWI bit. */
-- bdp->config[3] |= CB_CFIG_MWI_EN;
--
-- bdp->config[6] &= ~CB_CFIG_EXT_TCB_DIS;
--
-- if (bdp->rev_id >= D101MA_REV_ID) {
-- /* this is 82559 and up - enable TCO counters */
-- bdp->config[6] |= CB_CFIG_TCO_STAT;
-- bdp->config[6] |= CB_CFIG_EXT_STAT_DIS;
-- bdp->stat_mode = E100_TCO_STATS;
--
-- if ((bdp->rev_id < D102_REV_ID) &&
-- (bdp->params.b_params & PRM_XSUMRX) &&
-- (bdp->pdev->device != 0x1209)) {
--
-- bdp->flags |= DF_CSUM_OFFLOAD;
-- bdp->config[9] |= 1;
-- }
-- } else {
-- /* this is 82558 */
-- bdp->config[6] &= ~CB_CFIG_TCO_STAT;
-- bdp->config[6] &= ~CB_CFIG_EXT_STAT_DIS;
-- bdp->stat_mode = E100_EXTENDED_STATS;
-- }
--
-- e100_config_long_rx(bdp, true);
--}
--
--static void __devinit
--e100_config_init_82550(struct e100_private *bdp)
--{
-- /* The D102 chip allows for 32 config bytes. This value is
-- * supposed to be in Byte 0. Just add the extra bytes to
-- * what was already setup in the block. */
-- bdp->config[0] += CB_CFIG_D102_BYTE_COUNT;
--
-- /* now we need to enable the extended RFD. When this is
-- * enabled, the immediated receive data buffer starts at offset
-- * 32 from the RFD base address, instead of at offset 16. */
-- bdp->config[7] |= CB_CFIG_EXTENDED_RFD;
--
-- /* put the chip into D102 receive mode. This is necessary
-- * for any parsing and offloading features. */
-- bdp->config[22] = CB_CFIG_RECEIVE_GAMLA_MODE;
--
-- /* set the flag if checksum offloading was enabled */
-- if (bdp->params.b_params & PRM_XSUMRX) {
-- bdp->flags |= DF_CSUM_OFFLOAD;
-- }
--}
--
--/* Initialize the adapter's configure block */
--void __devinit
--e100_config_init(struct e100_private *bdp)
--{
-- e100_config_init_82557(bdp);
--
-- if (bdp->flags & IS_BACHELOR)
-- e100_config_init_82558(bdp);
--
-- if (bdp->rev_id >= D102_REV_ID)
-- e100_config_init_82550(bdp);
--}
--
--/**
-- * e100_force_config - force a configure command
-- * @bdp: atapter's private data struct
-- *
-- * This routine will force a configure command to the adapter.
-- * The command will be executed in polled mode as interrupts
-- * are _disabled_ at this time.
-- *
-- * Returns:
-- * true: if the configure command was successfully issued and completed
-- * false: otherwise
-- */
--unsigned char
--e100_force_config(struct e100_private *bdp)
--{
-- spin_lock_bh(&(bdp->config_lock));
--
-- bdp->config[0] = CB_CFIG_BYTE_COUNT;
-- if (bdp->rev_id >= D102_REV_ID) {
-- /* The D102 chip allows for 32 config bytes. This value is
-- supposed to be in Byte 0. Just add the extra bytes to
-- what was already setup in the block. */
-- bdp->config[0] += CB_CFIG_D102_BYTE_COUNT;
-- }
--
-- spin_unlock_bh(&(bdp->config_lock));
--
-- // although we call config outside the lock, there is no
-- // race condition because config byte count has maximum value
-- return e100_config(bdp);
--}
--
--/**
-- * e100_config - issue a configure command
-- * @bdp: atapter's private data struct
-- *
-- * This routine will issue a configure command to the 82557.
-- * This command will be executed in polled mode as interrupts
-- * are _disabled_ at this time.
-- *
-- * Returns:
-- * true: if the configure command was successfully issued and completed
-- * false: otherwise
-- */
--unsigned char
--e100_config(struct e100_private *bdp)
--{
-- cb_header_t *pntcb_hdr;
-- unsigned char res = true;
-- nxmit_cb_entry_t *cmd;
--
-- if (bdp->config[0] == 0) {
-- goto exit;
-- }
--
-- if ((cmd = e100_alloc_non_tx_cmd(bdp)) == NULL) {
-- res = false;
-- goto exit;
-- }
--
-- pntcb_hdr = (cb_header_t *) cmd->non_tx_cmd;
-- pntcb_hdr->cb_cmd = __constant_cpu_to_le16(CB_CONFIGURE);
--
-- spin_lock_bh(&bdp->config_lock);
--
-- if (bdp->config[0] < CB_CFIG_MIN_PARAMS) {
-- bdp->config[0] = CB_CFIG_MIN_PARAMS;
-- }
--
-- /* Copy the device's config block to the device's memory */
-- memcpy(cmd->non_tx_cmd->ntcb.config.cfg_byte, bdp->config,
-- bdp->config[0]);
-- /* reset number of bytes to config next time */
-- bdp->config[0] = 0;
--
-- spin_unlock_bh(&bdp->config_lock);
--
-- res = e100_exec_non_cu_cmd(bdp, cmd);
--
--exit:
-- if (netif_running(bdp->device))
-- netif_wake_queue(bdp->device);
-- return res;
--}
--
--/**
-- * e100_config_fc - config flow-control state
-- * @bdp: adapter's private data struct
-- *
-- * This routine will enable or disable flow control support in the adapter's
-- * config block. Flow control will be enable only if requested using the command
-- * line option, and if the link is flow-contorl capable (both us and the link
-- * partner). But, if link partner is capable of autoneg, but not capable of
-- * flow control, received PAUSE frames are still honored.
-- */
--void
--e100_config_fc(struct e100_private *bdp)
--{
-- unsigned char enable = false;
-- /* 82557 doesn't support fc. Don't touch this option */
-- if (!(bdp->flags & IS_BACHELOR))
-- return;
--
-- /* Enable fc if requested and if the link supports it */
-- if ((bdp->params.b_params & PRM_FC) && (bdp->flags &
-- (DF_LINK_FC_CAP | DF_LINK_FC_TX_ONLY))) {
-- enable = true;
-- }
--
-- spin_lock_bh(&(bdp->config_lock));
--
-- if (enable) {
-- if (bdp->flags & DF_LINK_FC_TX_ONLY) {
-- /* If link partner is capable of autoneg, but */
-- /* not capable of flow control, Received PAUSE */
-- /* frames are still honored, i.e., */
-- /* transmitted frames would be paused by */
-- /* incoming PAUSE frames */
-- bdp->config[16] = DFLT_NO_FC_DELAY_LSB;
-- bdp->config[17] = DFLT_NO_FC_DELAY_MSB;
-- bdp->config[19] &= ~(CB_CFIG_FC_RESTOP | CB_CFIG_FC_RESTART);
-- bdp->config[19] |= CB_CFIG_FC_REJECT;
-- bdp->config[19] &= ~CB_CFIG_TX_FC_DIS;
-- } else {
-- bdp->config[16] = DFLT_FC_DELAY_LSB;
-- bdp->config[17] = DFLT_FC_DELAY_MSB;
-- bdp->config[19] |= CB_CFIG_FC_OPTS;
-- bdp->config[19] &= ~CB_CFIG_TX_FC_DIS;
-- }
-- } else {
-- bdp->config[16] = DFLT_NO_FC_DELAY_LSB;
-- bdp->config[17] = DFLT_NO_FC_DELAY_MSB;
-- bdp->config[19] &= ~CB_CFIG_FC_OPTS;
-- bdp->config[19] |= CB_CFIG_TX_FC_DIS;
-- }
-- E100_CONFIG(bdp, 19);
-- spin_unlock_bh(&(bdp->config_lock));
--
-- return;
--}
--
--/**
-- * e100_config_promisc - configure promiscuous mode
-- * @bdp: atapter's private data struct
-- * @enable: should we enable this option or not
-- *
-- * This routine will enable or disable promiscuous mode
-- * in the adapter's config block.
-- */
--void
--e100_config_promisc(struct e100_private *bdp, unsigned char enable)
--{
-- spin_lock_bh(&(bdp->config_lock));
--
-- /* if in promiscuous mode, save bad frames */
-- if (enable) {
--
-- if (!(bdp->config[6] & CB_CFIG_SAVE_BAD_FRAMES)) {
-- bdp->config[6] |= CB_CFIG_SAVE_BAD_FRAMES;
-- E100_CONFIG(bdp, 6);
-- }
--
-- if (bdp->config[7] & (u8) BIT_0) {
-- bdp->config[7] &= (u8) (~BIT_0);
-- E100_CONFIG(bdp, 7);
-- }
--
-- if (!(bdp->config[15] & CB_CFIG_PROMISCUOUS)) {
-- bdp->config[15] |= CB_CFIG_PROMISCUOUS;
-- E100_CONFIG(bdp, 15);
-- }
--
-- } else { /* not in promiscuous mode */
--
-- if (bdp->config[6] & CB_CFIG_SAVE_BAD_FRAMES) {
-- bdp->config[6] &= ~CB_CFIG_SAVE_BAD_FRAMES;
-- E100_CONFIG(bdp, 6);
-- }
--
-- if (!(bdp->config[7] & (u8) BIT_0)) {
-- bdp->config[7] |= (u8) (BIT_0);
-- E100_CONFIG(bdp, 7);
-- }
--
-- if (bdp->config[15] & CB_CFIG_PROMISCUOUS) {
-- bdp->config[15] &= ~CB_CFIG_PROMISCUOUS;
-- E100_CONFIG(bdp, 15);
-- }
-- }
--
-- spin_unlock_bh(&(bdp->config_lock));
--}
--
--/**
-- * e100_config_mulcast_enbl - configure allmulti mode
-- * @bdp: atapter's private data struct
-- * @enable: should we enable this option or not
-- *
-- * This routine will enable or disable reception of all multicast packets
-- * in the adapter's config block.
-- */
--void
--e100_config_mulcast_enbl(struct e100_private *bdp, unsigned char enable)
--{
-- spin_lock_bh(&(bdp->config_lock));
--
-- /* this flag is used to enable receiving all multicast packet */
-- if (enable) {
-- if (!(bdp->config[21] & CB_CFIG_MULTICAST_ALL)) {
-- bdp->config[21] |= CB_CFIG_MULTICAST_ALL;
-- E100_CONFIG(bdp, 21);
-- }
--
-- } else {
-- if (bdp->config[21] & CB_CFIG_MULTICAST_ALL) {
-- bdp->config[21] &= ~CB_CFIG_MULTICAST_ALL;
-- E100_CONFIG(bdp, 21);
-- }
-- }
--
-- spin_unlock_bh(&(bdp->config_lock));
--}
--
--/**
-- * e100_config_ifs - configure the IFS parameter
-- * @bdp: atapter's private data struct
-- *
-- * This routine will configure the adaptive IFS value
-- * in the adapter's config block. IFS values are only
-- * relevant in half duplex, so set to 0 in full duplex.
-- */
--void
--e100_config_ifs(struct e100_private *bdp)
--{
-- u8 value = 0;
--
-- spin_lock_bh(&(bdp->config_lock));
--
-- /* IFS value is only needed to be specified at half-duplex mode */
-- if (bdp->cur_dplx_mode == HALF_DUPLEX) {
-- value = (u8) bdp->ifs_value;
-- }
--
-- if (bdp->config[2] != value) {
-- bdp->config[2] = value;
-- E100_CONFIG(bdp, 2);
-- }
--
-- spin_unlock_bh(&(bdp->config_lock));
--}
--
--/**
-- * e100_config_force_dplx - configure the forced full duplex mode
-- * @bdp: atapter's private data struct
-- *
-- * This routine will enable or disable force full duplex
-- * in the adapter's config block. If the PHY is 503, and
-- * the duplex is full, consider the adapter forced.
-- */
--void
--e100_config_force_dplx(struct e100_private *bdp)
--{
-- spin_lock_bh(&(bdp->config_lock));
--
-- /* We must force full duplex on if we are using PHY 0, and we are */
-- /* supposed to run in FDX mode. We do this because the e100 has only */
-- /* one FDX# input pin, and that pin will be connected to PHY 1. */
-- /* Changed the 'if' condition below to fix performance problem * at 10
-- * full. The Phy was getting forced to full duplex while the MAC * was
-- * not, because the cur_dplx_mode was not being set to 2 by SetupPhy. *
-- * This is how the condition was, initially. * This has been changed so
-- * that the MAC gets forced to full duplex * simply if the user has
-- * forced full duplex. * * if (( bdp->phy_addr == 0 ) && (
-- * bdp->cur_dplx_mode == 2 )) */
-- /* The rest of the fix is in the PhyDetect code. */
-- if ((bdp->params.e100_speed_duplex == E100_SPEED_10_FULL) ||
-- (bdp->params.e100_speed_duplex == E100_SPEED_100_FULL) ||
-- ((bdp->phy_addr == 32) && (bdp->cur_dplx_mode == FULL_DUPLEX))) {
-- if (!(bdp->config[19] & (u8) CB_CFIG_FORCE_FDX)) {
-- bdp->config[19] |= (u8) CB_CFIG_FORCE_FDX;
-- E100_CONFIG(bdp, 19);
-- }
--
-- } else {
-- if (bdp->config[19] & (u8) CB_CFIG_FORCE_FDX) {
-- bdp->config[19] &= (u8) (~CB_CFIG_FORCE_FDX);
-- E100_CONFIG(bdp, 19);
-- }
-- }
--
-- spin_unlock_bh(&(bdp->config_lock));
--}
--
--/**
-- * e100_config_long_rx
-- * @bdp: atapter's private data struct
-- * @enable: should we enable this option or not
-- *
-- * This routine will enable or disable reception of larger packets.
-- * This is needed by VLAN implementations.
-- */
--static void
--e100_config_long_rx(struct e100_private *bdp, unsigned char enable)
--{
-- if (enable) {
-- if (!(bdp->config[18] & CB_CFIG_LONG_RX_OK)) {
-- bdp->config[18] |= CB_CFIG_LONG_RX_OK;
-- E100_CONFIG(bdp, 18);
-- }
--
-- } else {
-- if ((bdp->config[18] & CB_CFIG_LONG_RX_OK)) {
-- bdp->config[18] &= ~CB_CFIG_LONG_RX_OK;
-- E100_CONFIG(bdp, 18);
-- }
-- }
--}
--
--/**
-- * e100_config_wol
-- * @bdp: atapter's private data struct
-- *
-- * This sets configuration options for PHY and Magic Packet WoL
-- */
--void
--e100_config_wol(struct e100_private *bdp)
--{
-- spin_lock_bh(&(bdp->config_lock));
--
-- if (bdp->wolopts & WAKE_PHY) {
-- bdp->config[9] |= CB_LINK_STATUS_WOL;
-- }
-- else {
-- /* Disable PHY WoL */
-- bdp->config[9] &= ~CB_LINK_STATUS_WOL;
-- }
--
-- if (bdp->wolopts & WAKE_MAGIC) {
-- bdp->config[19] &= ~CB_DISABLE_MAGPAK_WAKE;
-- }
-- else {
-- /* Disable Magic Packet WoL */
-- bdp->config[19] |= CB_DISABLE_MAGPAK_WAKE;
-- }
--
-- E100_CONFIG(bdp, 19);
-- spin_unlock_bh(&(bdp->config_lock));
--}
--
--void
--e100_config_vlan_drop(struct e100_private *bdp, unsigned char enable)
--{
-- spin_lock_bh(&(bdp->config_lock));
-- if (enable) {
-- if (!(bdp->config[22] & CB_CFIG_VLAN_DROP_ENABLE)) {
-- bdp->config[22] |= CB_CFIG_VLAN_DROP_ENABLE;
-- E100_CONFIG(bdp, 22);
-- }
--
-- } else {
-- if ((bdp->config[22] & CB_CFIG_VLAN_DROP_ENABLE)) {
-- bdp->config[22] &= ~CB_CFIG_VLAN_DROP_ENABLE;
-- E100_CONFIG(bdp, 22);
-- }
-- }
-- spin_unlock_bh(&(bdp->config_lock));
--}
--
--/**
-- * e100_config_loopback_mode
-- * @bdp: atapter's private data struct
-- * @mode: loopback mode(phy/mac/none)
-- *
-- */
--unsigned char
--e100_config_loopback_mode(struct e100_private *bdp, u8 mode)
--{
-- unsigned char bc_changed = false;
-- u8 config_byte;
--
-- spin_lock_bh(&(bdp->config_lock));
--
-- switch (mode) {
-- case NO_LOOPBACK:
-- config_byte = CB_CFIG_LOOPBACK_NORMAL;
-- break;
-- case MAC_LOOPBACK:
-- config_byte = CB_CFIG_LOOPBACK_INTERNAL;
-- break;
-- case PHY_LOOPBACK:
-- config_byte = CB_CFIG_LOOPBACK_EXTERNAL;
-- break;
-- default:
-- printk(KERN_NOTICE "e100: e100_config_loopback_mode: "
-- "Invalid argument 'mode': %d\n", mode);
-- goto exit;
-- }
--
-- if ((bdp->config[10] & CB_CFIG_LOOPBACK_MODE) != config_byte) {
--
-- bdp->config[10] &= (~CB_CFIG_LOOPBACK_MODE);
-- bdp->config[10] |= config_byte;
-- E100_CONFIG(bdp, 10);
-- bc_changed = true;
-- }
--
--exit:
-- spin_unlock_bh(&(bdp->config_lock));
-- return bc_changed;
--}
--unsigned char
--e100_config_tcb_ext_enable(struct e100_private *bdp, unsigned char enable)
--{
-- unsigned char bc_changed = false;
--
-- spin_lock_bh(&(bdp->config_lock));
--
-- if (enable) {
-- if (bdp->config[6] & CB_CFIG_EXT_TCB_DIS) {
--
-- bdp->config[6] &= (~CB_CFIG_EXT_TCB_DIS);
-- E100_CONFIG(bdp, 6);
-- bc_changed = true;
-- }
--
-- } else {
-- if (!(bdp->config[6] & CB_CFIG_EXT_TCB_DIS)) {
--
-- bdp->config[6] |= CB_CFIG_EXT_TCB_DIS;
-- E100_CONFIG(bdp, 6);
-- bc_changed = true;
-- }
-- }
-- spin_unlock_bh(&(bdp->config_lock));
--
-- return bc_changed;
--}
--unsigned char
--e100_config_dynamic_tbd(struct e100_private *bdp, unsigned char enable)
--{
-- unsigned char bc_changed = false;
--
-- spin_lock_bh(&(bdp->config_lock));
--
-- if (enable) {
-- if (!(bdp->config[7] & CB_CFIG_DYNTBD_EN)) {
--
-- bdp->config[7] |= CB_CFIG_DYNTBD_EN;
-- E100_CONFIG(bdp, 7);
-- bc_changed = true;
-- }
--
-- } else {
-- if (bdp->config[7] & CB_CFIG_DYNTBD_EN) {
--
-- bdp->config[7] &= (~CB_CFIG_DYNTBD_EN);
-- E100_CONFIG(bdp, 7);
-- bc_changed = true;
-- }
-- }
-- spin_unlock_bh(&(bdp->config_lock));
--
-- return bc_changed;
--}
--
---- linux-2.6.0/drivers/net/e100/e100_config.h 2003-09-27 18:57:45.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,168 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--#ifndef _E100_CONFIG_INC_
--#define _E100_CONFIG_INC_
--
--#include "e100.h"
--
--#define E100_CONFIG(bdp, X) ((bdp)->config[0] = max_t(u8, (bdp)->config[0], (X)+1))
--
--#define CB_CFIG_MIN_PARAMS 8
--
--/* byte 0 bit definitions*/
--#define CB_CFIG_BYTE_COUNT_MASK BIT_0_5 /* Byte count occupies bit 5-0 */
--
--/* byte 1 bit definitions*/
--#define CB_CFIG_RXFIFO_LIMIT_MASK BIT_0_4 /* RxFifo limit mask */
--#define CB_CFIG_TXFIFO_LIMIT_MASK BIT_4_7 /* TxFifo limit mask */
--
--/* byte 2 bit definitions -- ADAPTIVE_IFS*/
--
--/* word 3 bit definitions -- RESERVED*/
--/* Changed for 82558 enhancements */
--/* byte 3 bit definitions */
--#define CB_CFIG_MWI_EN BIT_0 /* Enable MWI on PCI bus */
--#define CB_CFIG_TYPE_EN BIT_1 /* Type Enable */
--#define CB_CFIG_READAL_EN BIT_2 /* Enable Read Align */
--#define CB_CFIG_TERMCL_EN BIT_3 /* Cache line write */
--
--/* byte 4 bit definitions*/
--#define CB_CFIG_RX_MIN_DMA_MASK BIT_0_6 /* Rx minimum DMA count mask */
--
--/* byte 5 bit definitions*/
--#define CB_CFIG_TX_MIN_DMA_MASK BIT_0_6 /* Tx minimum DMA count mask */
--#define CB_CFIG_DMBC_EN BIT_7 /* Enable Tx/Rx min. DMA counts */
--
--/* Changed for 82558 enhancements */
--/* byte 6 bit definitions*/
--#define CB_CFIG_LATE_SCB BIT_0 /* Update SCB After New Tx Start */
--#define CB_CFIG_DIRECT_DMA_DIS BIT_1 /* Direct DMA mode */
--#define CB_CFIG_TNO_INT BIT_2 /* Tx Not OK Interrupt */
--#define CB_CFIG_TCO_STAT BIT_2 /* TCO statistics in 559 and above */
--#define CB_CFIG_CI_INT BIT_3 /* Command Complete Interrupt */
--#define CB_CFIG_EXT_TCB_DIS BIT_4 /* Extended TCB */
--#define CB_CFIG_EXT_STAT_DIS BIT_5 /* Extended Stats */
--#define CB_CFIG_SAVE_BAD_FRAMES BIT_7 /* Save Bad Frames Enabled */
--
--/* byte 7 bit definitions*/
--#define CB_CFIG_DISC_SHORT_FRAMES BIT_0 /* Discard Short Frames */
--#define CB_CFIG_DYNTBD_EN BIT_7 /* Enable dynamic TBD */
--/* Enable extended RFD's on D102 */
--#define CB_CFIG_EXTENDED_RFD BIT_5
--
--/* byte 8 bit definitions*/
--#define CB_CFIG_503_MII BIT_0 /* 503 vs. MII mode */
--
--/* byte 9 bit definitions -- pre-defined all zeros*/
--#define CB_LINK_STATUS_WOL BIT_5
--
--/* byte 10 bit definitions*/
--#define CB_CFIG_NO_SRCADR BIT_3 /* No Source Address Insertion */
--#define CB_CFIG_PREAMBLE_LEN BIT_4_5 /* Preamble Length */
--#define CB_CFIG_LOOPBACK_MODE BIT_6_7 /* Loopback Mode */
--#define CB_CFIG_LOOPBACK_NORMAL 0
--#define CB_CFIG_LOOPBACK_INTERNAL BIT_6
--#define CB_CFIG_LOOPBACK_EXTERNAL BIT_6_7
--
--/* byte 11 bit definitions*/
--#define CB_CFIG_LINEAR_PRIORITY BIT_0_2 /* Linear Priority */
--
--/* byte 12 bit definitions*/
--#define CB_CFIG_LINEAR_PRI_MODE BIT_0 /* Linear Priority mode */
--#define CB_CFIG_IFS_MASK BIT_4_7 /* Interframe Spacing mask */
--
--/* byte 13 bit definitions -- pre-defined all zeros*/
--
--/* byte 14 bit definitions -- pre-defined 0xf2*/
--
--/* byte 15 bit definitions*/
--#define CB_CFIG_PROMISCUOUS BIT_0 /* Promiscuous Mode Enable */
--#define CB_CFIG_BROADCAST_DIS BIT_1 /* Broadcast Mode Disable */
--#define CB_CFIG_CRS_OR_CDT BIT_7 /* CRS Or CDT */
--
--/* byte 16 bit definitions -- pre-defined all zeros*/
--#define DFLT_FC_DELAY_LSB 0x1f /* Delay for outgoing Pause frames */
--#define DFLT_NO_FC_DELAY_LSB 0x00 /* no flow control default value */
--
--/* byte 17 bit definitions -- pre-defined 0x40*/
--#define DFLT_FC_DELAY_MSB 0x01 /* Delay for outgoing Pause frames */
--#define DFLT_NO_FC_DELAY_MSB 0x40 /* no flow control default value */
--
--/* byte 18 bit definitions*/
--#define CB_CFIG_STRIPPING BIT_0 /* Padding Disabled */
--#define CB_CFIG_PADDING BIT_1 /* Padding Disabled */
--#define CB_CFIG_CRC_IN_MEM BIT_2 /* Transfer CRC To Memory */
--
--/* byte 19 bit definitions*/
--#define CB_CFIG_TX_ADDR_WAKE BIT_0 /* Address Wakeup */
--#define CB_DISABLE_MAGPAK_WAKE BIT_1 /* Magic Packet Wakeup disable */
--/* Changed TX_FC_EN to TX_FC_DIS because 0 enables, 1 disables. Jul 8, 1999 */
--#define CB_CFIG_TX_FC_DIS BIT_2 /* Tx Flow Control Disable */
--#define CB_CFIG_FC_RESTOP BIT_3 /* Rx Flow Control Restop */
--#define CB_CFIG_FC_RESTART BIT_4 /* Rx Flow Control Restart */
--#define CB_CFIG_FC_REJECT BIT_5 /* Rx Flow Control Restart */
--#define CB_CFIG_FC_OPTS (CB_CFIG_FC_RESTOP | CB_CFIG_FC_RESTART | CB_CFIG_FC_REJECT)
--
--/* end 82558/9 specifics */
--
--#define CB_CFIG_FORCE_FDX BIT_6 /* Force Full Duplex */
--#define CB_CFIG_FDX_ENABLE BIT_7 /* Full Duplex Enabled */
--
--/* byte 20 bit definitions*/
--#define CB_CFIG_MULTI_IA BIT_6 /* Multiple IA Addr */
--
--/* byte 21 bit definitions*/
--#define CB_CFIG_MULTICAST_ALL BIT_3 /* Multicast All */
--
--/* byte 22 bit defines */
--#define CB_CFIG_RECEIVE_GAMLA_MODE BIT_0 /* D102 receive mode */
--#define CB_CFIG_VLAN_DROP_ENABLE BIT_1 /* vlan stripping */
--
--#define CB_CFIG_LONG_RX_OK BIT_3
--
--#define NO_LOOPBACK 0
--#define MAC_LOOPBACK 0x01
--#define PHY_LOOPBACK 0x02
--
--/* function prototypes */
--extern void e100_config_init(struct e100_private *bdp);
--extern void e100_config_init_82557(struct e100_private *bdp);
--extern unsigned char e100_force_config(struct e100_private *bdp);
--extern unsigned char e100_config(struct e100_private *bdp);
--extern void e100_config_fc(struct e100_private *bdp);
--extern void e100_config_promisc(struct e100_private *bdp, unsigned char enable);
--extern void e100_config_brdcast_dsbl(struct e100_private *bdp);
--extern void e100_config_mulcast_enbl(struct e100_private *bdp,
-- unsigned char enable);
--extern void e100_config_ifs(struct e100_private *bdp);
--extern void e100_config_force_dplx(struct e100_private *bdp);
--extern u8 e100_config_loopback_mode(struct e100_private *bdp, u8 mode);
--extern u8 e100_config_dynamic_tbd(struct e100_private *bdp, u8 enable);
--extern u8 e100_config_tcb_ext_enable(struct e100_private *bdp, u8 enable);
--extern void e100_config_vlan_drop(struct e100_private *bdp, unsigned char enable);
--#endif /* _E100_CONFIG_INC_ */
---- linux-2.6.0/drivers/net/e100/e100_eeprom.c 2003-06-14 12:18:07.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,565 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--/**********************************************************************
--* *
--* INTEL CORPORATION *
--* *
--* This software is supplied under the terms of the license included *
--* above. All use of this driver must be in accordance with the terms *
--* of that license. *
--* *
--* Module Name: e100_eeprom.c *
--* *
--* Abstract: This module contains routines to read and write to a *
--* serial EEPROM *
--* *
--* Environment: This file is intended to be specific to the Linux *
--* operating system. *
--* *
--**********************************************************************/
--#include "e100.h"
--
--#define CSR_EEPROM_CONTROL_FIELD(bdp) ((bdp)->scb->scb_eprm_cntrl)
--
--#define CSR_GENERAL_CONTROL2_FIELD(bdp) \
-- ((bdp)->scb->scb_ext.d102_scb.scb_gen_ctrl2)
--
--#define EEPROM_STALL_TIME 4
--#define EEPROM_CHECKSUM ((u16) 0xBABA)
--#define EEPROM_MAX_WORD_SIZE 256
--
--void e100_eeprom_cleanup(struct e100_private *adapter);
--u16 e100_eeprom_calculate_chksum(struct e100_private *adapter);
--static void e100_eeprom_write_word(struct e100_private *adapter, u16 reg,
-- u16 data);
--void e100_eeprom_write_block(struct e100_private *adapter, u16 start, u16 *data,
-- u16 size);
--u16 e100_eeprom_size(struct e100_private *adapter);
--u16 e100_eeprom_read(struct e100_private *adapter, u16 reg);
--
--static void shift_out_bits(struct e100_private *adapter, u16 data, u16 count);
--static u16 shift_in_bits(struct e100_private *adapter);
--static void raise_clock(struct e100_private *adapter, u16 *x);
--static void lower_clock(struct e100_private *adapter, u16 *x);
--static u16 eeprom_wait_cmd_done(struct e100_private *adapter);
--static void eeprom_stand_by(struct e100_private *adapter);
--
--//----------------------------------------------------------------------------------------
--// Procedure: eeprom_set_semaphore
--//
--// Description: This function set (write 1) Gamla EEPROM semaphore bit (bit 23 word 0x1C in the CSR).
--//
--// Arguments:
--// Adapter - Adapter context
--//
--// Returns: true if success
--// else return false
--//
--//----------------------------------------------------------------------------------------
--
--inline u8
--eeprom_set_semaphore(struct e100_private *adapter)
--{
-- u16 data = 0;
-- unsigned long expiration_time = jiffies + HZ / 100 + 1;
--
-- do {
-- // Get current value of General Control 2
-- data = readb(&CSR_GENERAL_CONTROL2_FIELD(adapter));
--
-- // Set bit 23 word 0x1C in the CSR.
-- data |= SCB_GCR2_EEPROM_ACCESS_SEMAPHORE;
-- writeb(data, &CSR_GENERAL_CONTROL2_FIELD(adapter));
--
-- // Check to see if this bit set or not.
-- data = readb(&CSR_GENERAL_CONTROL2_FIELD(adapter));
--
-- if (data & SCB_GCR2_EEPROM_ACCESS_SEMAPHORE) {
-- return true;
-- }
--
-- if (time_before(jiffies, expiration_time))
-- yield();
-- else
-- return false;
--
-- } while (true);
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: eeprom_reset_semaphore
--//
--// Description: This function reset (write 0) Gamla EEPROM semaphore bit
--// (bit 23 word 0x1C in the CSR).
--//
--// Arguments: struct e100_private * adapter - Adapter context
--//----------------------------------------------------------------------------------------
--
--inline void
--eeprom_reset_semaphore(struct e100_private *adapter)
--{
-- u16 data = 0;
--
-- data = readb(&CSR_GENERAL_CONTROL2_FIELD(adapter));
-- data &= ~(SCB_GCR2_EEPROM_ACCESS_SEMAPHORE);
-- writeb(data, &CSR_GENERAL_CONTROL2_FIELD(adapter));
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: e100_eeprom_size
--//
--// Description: This routine determines the size of the EEPROM. This value should be
--// checked for validity - ie. is it too big or too small. The size returned
--// is then passed to the read/write functions.
--//
--// Returns:
--// Size of the eeprom, or zero if an error occurred
--//----------------------------------------------------------------------------------------
--u16
--e100_eeprom_size(struct e100_private *adapter)
--{
-- u16 x, size = 1; // must be one to accumulate a product
--
-- // if we've already stored this data, read from memory
-- if (adapter->eeprom_size) {
-- return adapter->eeprom_size;
-- }
-- // otherwise, read from the eeprom
-- // Set EEPROM semaphore.
-- if (adapter->rev_id >= D102_REV_ID) {
-- if (!eeprom_set_semaphore(adapter))
-- return 0;
-- }
-- // enable the eeprom by setting EECS.
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- x &= ~(EEDI | EEDO | EESK);
-- x |= EECS;
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
--
-- // write the read opcode
-- shift_out_bits(adapter, EEPROM_READ_OPCODE, 3);
--
-- // experiment to discover the size of the eeprom. request register zero
-- // and wait for the eeprom to tell us it has accepted the entire address.
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- do {
-- size *= 2; // each bit of address doubles eeprom size
-- x |= EEDO; // set bit to detect "dummy zero"
-- x &= ~EEDI; // address consists of all zeros
--
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
-- readw(&(adapter->scb->scb_status));
-- udelay(EEPROM_STALL_TIME);
-- raise_clock(adapter, &x);
-- lower_clock(adapter, &x);
--
-- // check for "dummy zero"
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- if (size > EEPROM_MAX_WORD_SIZE) {
-- size = 0;
-- break;
-- }
-- } while (x & EEDO);
--
-- // read in the value requested
-- (void) shift_in_bits(adapter);
-- e100_eeprom_cleanup(adapter);
--
-- // Clear EEPROM Semaphore.
-- if (adapter->rev_id >= D102_REV_ID) {
-- eeprom_reset_semaphore(adapter);
-- }
--
-- return size;
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: eeprom_address_size
--//
--// Description: determines the number of bits in an address for the eeprom acceptable
--// values are 64, 128, and 256
--// Arguments: size of the eeprom
--// Returns: bits in an address for that size eeprom
--//----------------------------------------------------------------------------------------
--
--static inline int
--eeprom_address_size(u16 size)
--{
-- int isize = size;
--
-- return (ffs(isize) - 1);
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: e100_eeprom_read
--//
--// Description: This routine serially reads one word out of the EEPROM.
--//
--// Arguments:
--// adapter - our adapter context
--// reg - EEPROM word to read.
--//
--// Returns:
--// Contents of EEPROM word (reg).
--//----------------------------------------------------------------------------------------
--
--u16
--e100_eeprom_read(struct e100_private *adapter, u16 reg)
--{
-- u16 x, data, bits;
--
-- // Set EEPROM semaphore.
-- if (adapter->rev_id >= D102_REV_ID) {
-- if (!eeprom_set_semaphore(adapter))
-- return 0;
-- }
-- // eeprom size is initialized to zero
-- if (!adapter->eeprom_size)
-- adapter->eeprom_size = e100_eeprom_size(adapter);
--
-- bits = eeprom_address_size(adapter->eeprom_size);
--
-- // select EEPROM, reset bits, set EECS
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
--
-- x &= ~(EEDI | EEDO | EESK);
-- x |= EECS;
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
--
-- // write the read opcode and register number in that order
-- // The opcode is 3bits in length, reg is 'bits' bits long
-- shift_out_bits(adapter, EEPROM_READ_OPCODE, 3);
-- shift_out_bits(adapter, reg, bits);
--
-- // Now read the data (16 bits) in from the selected EEPROM word
-- data = shift_in_bits(adapter);
--
-- e100_eeprom_cleanup(adapter);
--
-- // Clear EEPROM Semaphore.
-- if (adapter->rev_id >= D102_REV_ID) {
-- eeprom_reset_semaphore(adapter);
-- }
--
-- return data;
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: shift_out_bits
--//
--// Description: This routine shifts data bits out to the EEPROM.
--//
--// Arguments:
--// data - data to send to the EEPROM.
--// count - number of data bits to shift out.
--//
--// Returns: (none)
--//----------------------------------------------------------------------------------------
--
--static void
--shift_out_bits(struct e100_private *adapter, u16 data, u16 count)
--{
-- u16 x, mask;
--
-- mask = 1 << (count - 1);
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- x &= ~(EEDO | EEDI);
--
-- do {
-- x &= ~EEDI;
-- if (data & mask)
-- x |= EEDI;
--
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
-- readw(&(adapter->scb->scb_status)); /* flush command to card */
-- udelay(EEPROM_STALL_TIME);
-- raise_clock(adapter, &x);
-- lower_clock(adapter, &x);
-- mask = mask >> 1;
-- } while (mask);
--
-- x &= ~EEDI;
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: raise_clock
--//
--// Description: This routine raises the EEPROM's clock input (EESK)
--//
--// Arguments:
--// x - Ptr to the EEPROM control register's current value
--//
--// Returns: (none)
--//----------------------------------------------------------------------------------------
--
--void
--raise_clock(struct e100_private *adapter, u16 *x)
--{
-- *x = *x | EESK;
-- writew(*x, &CSR_EEPROM_CONTROL_FIELD(adapter));
-- readw(&(adapter->scb->scb_status)); /* flush command to card */
-- udelay(EEPROM_STALL_TIME);
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: lower_clock
--//
--// Description: This routine lower's the EEPROM's clock input (EESK)
--//
--// Arguments:
--// x - Ptr to the EEPROM control register's current value
--//
--// Returns: (none)
--//----------------------------------------------------------------------------------------
--
--void
--lower_clock(struct e100_private *adapter, u16 *x)
--{
-- *x = *x & ~EESK;
-- writew(*x, &CSR_EEPROM_CONTROL_FIELD(adapter));
-- readw(&(adapter->scb->scb_status)); /* flush command to card */
-- udelay(EEPROM_STALL_TIME);
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: shift_in_bits
--//
--// Description: This routine shifts data bits in from the EEPROM.
--//
--// Arguments:
--//
--// Returns:
--// The contents of that particular EEPROM word
--//----------------------------------------------------------------------------------------
--
--static u16
--shift_in_bits(struct e100_private *adapter)
--{
-- u16 x, d, i;
--
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- x &= ~(EEDO | EEDI);
-- d = 0;
--
-- for (i = 0; i < 16; i++) {
-- d <<= 1;
-- raise_clock(adapter, &x);
--
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
--
-- x &= ~EEDI;
-- if (x & EEDO)
-- d |= 1;
--
-- lower_clock(adapter, &x);
-- }
--
-- return d;
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: e100_eeprom_cleanup
--//
--// Description: This routine returns the EEPROM to an idle state
--//----------------------------------------------------------------------------------------
--
--void
--e100_eeprom_cleanup(struct e100_private *adapter)
--{
-- u16 x;
--
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
--
-- x &= ~(EECS | EEDI);
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
--
-- raise_clock(adapter, &x);
-- lower_clock(adapter, &x);
--}
--
--//**********************************************************************************
--// Procedure: e100_eeprom_update_chksum
--//
--// Description: Calculates the checksum and writes it to the EEProm.
--// It calculates the checksum accroding to the formula:
--// Checksum = 0xBABA - (sum of first 63 words).
--//
--//-----------------------------------------------------------------------------------
--u16
--e100_eeprom_calculate_chksum(struct e100_private *adapter)
--{
-- u16 idx, xsum_index, checksum = 0;
--
-- // eeprom size is initialized to zero
-- if (!adapter->eeprom_size)
-- adapter->eeprom_size = e100_eeprom_size(adapter);
--
-- xsum_index = adapter->eeprom_size - 1;
-- for (idx = 0; idx < xsum_index; idx++)
-- checksum += e100_eeprom_read(adapter, idx);
--
-- checksum = EEPROM_CHECKSUM - checksum;
-- return checksum;
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: e100_eeprom_write_word
--//
--// Description: This routine writes a word to a specific EEPROM location without.
--// taking EEPROM semaphore and updating checksum.
--// Use e100_eeprom_write_block for the EEPROM update
--// Arguments: reg - The EEPROM word that we are going to write to.
--// data - The data (word) that we are going to write to the EEPROM.
--//----------------------------------------------------------------------------------------
--static void
--e100_eeprom_write_word(struct e100_private *adapter, u16 reg, u16 data)
--{
-- u16 x;
-- u16 bits;
--
-- bits = eeprom_address_size(adapter->eeprom_size);
--
-- /* select EEPROM, mask off ASIC and reset bits, set EECS */
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- x &= ~(EEDI | EEDO | EESK);
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
-- readw(&(adapter->scb->scb_status)); /* flush command to card */
-- udelay(EEPROM_STALL_TIME);
-- x |= EECS;
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
--
-- shift_out_bits(adapter, EEPROM_EWEN_OPCODE, 5);
-- shift_out_bits(adapter, reg, (u16) (bits - 2));
-- if (!eeprom_wait_cmd_done(adapter))
-- return;
--
-- /* write the new word to the EEPROM & send the write opcode the EEPORM */
-- shift_out_bits(adapter, EEPROM_WRITE_OPCODE, 3);
--
-- /* select which word in the EEPROM that we are writing to */
-- shift_out_bits(adapter, reg, bits);
--
-- /* write the data to the selected EEPROM word */
-- shift_out_bits(adapter, data, 16);
-- if (!eeprom_wait_cmd_done(adapter))
-- return;
--
-- shift_out_bits(adapter, EEPROM_EWDS_OPCODE, 5);
-- shift_out_bits(adapter, reg, (u16) (bits - 2));
-- if (!eeprom_wait_cmd_done(adapter))
-- return;
--
-- e100_eeprom_cleanup(adapter);
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: e100_eeprom_write_block
--//
--// Description: This routine writes a block of words starting from specified EEPROM
--// location and updates checksum
--// Arguments: reg - The EEPROM word that we are going to write to.
--// data - The data (word) that we are going to write to the EEPROM.
--//----------------------------------------------------------------------------------------
--void
--e100_eeprom_write_block(struct e100_private *adapter, u16 start, u16 *data,
-- u16 size)
--{
-- u16 checksum;
-- u16 i;
--
-- if (!adapter->eeprom_size)
-- adapter->eeprom_size = e100_eeprom_size(adapter);
--
-- // Set EEPROM semaphore.
-- if (adapter->rev_id >= D102_REV_ID) {
-- if (!eeprom_set_semaphore(adapter))
-- return;
-- }
--
-- for (i = 0; i < size; i++) {
-- e100_eeprom_write_word(adapter, start + i, data[i]);
-- }
-- //Update checksum
-- checksum = e100_eeprom_calculate_chksum(adapter);
-- e100_eeprom_write_word(adapter, (adapter->eeprom_size - 1), checksum);
--
-- // Clear EEPROM Semaphore.
-- if (adapter->rev_id >= D102_REV_ID) {
-- eeprom_reset_semaphore(adapter);
-- }
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: eeprom_wait_cmd_done
--//
--// Description: This routine waits for the the EEPROM to finish its command.
--// Specifically, it waits for EEDO (data out) to go high.
--// Returns: true - If the command finished
--// false - If the command never finished (EEDO stayed low)
--//----------------------------------------------------------------------------------------
--static u16
--eeprom_wait_cmd_done(struct e100_private *adapter)
--{
-- u16 x;
-- unsigned long expiration_time = jiffies + HZ / 100 + 1;
--
-- eeprom_stand_by(adapter);
--
-- do {
-- rmb();
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- if (x & EEDO)
-- return true;
-- if (time_before(jiffies, expiration_time))
-- yield();
-- else
-- return false;
-- } while (true);
--}
--
--//----------------------------------------------------------------------------------------
--// Procedure: eeprom_stand_by
--//
--// Description: This routine lowers the EEPROM chip select (EECS) for a few microseconds.
--//----------------------------------------------------------------------------------------
--static void
--eeprom_stand_by(struct e100_private *adapter)
--{
-- u16 x;
--
-- x = readw(&CSR_EEPROM_CONTROL_FIELD(adapter));
-- x &= ~(EECS | EESK);
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
-- readw(&(adapter->scb->scb_status)); /* flush command to card */
-- udelay(EEPROM_STALL_TIME);
-- x |= EECS;
-- writew(x, &CSR_EEPROM_CONTROL_FIELD(adapter));
-- readw(&(adapter->scb->scb_status)); /* flush command to card */
-- udelay(EEPROM_STALL_TIME);
--}
---- linux-2.6.0/drivers/net/e100/e100.h 2003-09-27 18:57:45.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,999 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--#ifndef _E100_INC_
--#define _E100_INC_
--
--#include <linux/module.h>
--#include <linux/types.h>
--#include <linux/init.h>
--#include <linux/mm.h>
--#include <linux/errno.h>
--#include <linux/ioport.h>
--#include <linux/pci.h>
--#include <linux/kernel.h>
--#include <linux/netdevice.h>
--#include <linux/etherdevice.h>
--#include <linux/skbuff.h>
--#include <linux/delay.h>
--#include <linux/timer.h>
--#include <linux/slab.h>
--#include <linux/interrupt.h>
--#include <linux/string.h>
--#include <linux/wait.h>
--#include <linux/reboot.h>
--#include <asm/io.h>
--#include <asm/unaligned.h>
--#include <asm/processor.h>
--#include <linux/ethtool.h>
--#include <linux/inetdevice.h>
--#include <linux/bitops.h>
--
--#include <linux/if.h>
--#include <asm/uaccess.h>
--#include <linux/ip.h>
--#include <linux/if_vlan.h>
--#include <linux/mii.h>
--
--#define E100_CABLE_UNKNOWN 0
--#define E100_CABLE_OK 1
--#define E100_CABLE_OPEN_NEAR 2 /* Open Circuit Near End */
--#define E100_CABLE_OPEN_FAR 3 /* Open Circuit Far End */
--#define E100_CABLE_SHORT_NEAR 4 /* Short Circuit Near End */
--#define E100_CABLE_SHORT_FAR 5 /* Short Circuit Far End */
--
--#define E100_REGS_LEN 2
--/*
-- * Configure parameters for buffers per controller.
-- * If the machine this is being used on is a faster machine (i.e. > 150MHz)
-- * and running on a 10MBS network then more queueing of data occurs. This
-- * may indicate the some of the numbers below should be adjusted. Here are
-- * some typical numbers:
-- * MAX_TCB 64
-- * MAX_RFD 64
-- * The default numbers give work well on most systems tests so no real
-- * adjustments really need to take place. Also, if the machine is connected
-- * to a 100MBS network the numbers described above can be lowered from the
-- * defaults as considerably less data will be queued.
-- */
--
--#define TX_FRAME_CNT 8 /* consecutive transmit frames per interrupt */
--/* TX_FRAME_CNT must be less than MAX_TCB */
--
--#define E100_DEFAULT_TCB 64
--#define E100_MIN_TCB 2*TX_FRAME_CNT + 3 /* make room for at least 2 interrupts */
--#define E100_MAX_TCB 1024
--
--#define E100_DEFAULT_RFD 64
--#define E100_MIN_RFD 8
--#define E100_MAX_RFD 1024
--
--#define E100_DEFAULT_XSUM true
--#define E100_DEFAULT_BER ZLOCK_MAX_ERRORS
--#define E100_DEFAULT_SPEED_DUPLEX 0
--#define E100_DEFAULT_FC 0
--#define E100_DEFAULT_IFS true
--#define E100_DEFAULT_UCODE true
--
--#define TX_THRSHLD 8
--
--/* IFS parameters */
--#define MIN_NUMBER_OF_TRANSMITS_100 1000
--#define MIN_NUMBER_OF_TRANSMITS_10 100
--
--#define E100_MAX_NIC 16
--
--#define E100_MAX_SCB_WAIT 100 /* Max udelays in wait_scb */
--#define E100_MAX_CU_IDLE_WAIT 50 /* Max udelays in wait_cus_idle */
--
--/* HWI feature related constant */
--#define HWI_REGISTER_GRANULARITY 80 /* register granularity = 80 Cm */
--#define HWI_NEAR_END_BOUNDARY 1000 /* Near end is defined as < 10 meters */
--
--/* CPUSAVER_BUNDLE_MAX: Sets the maximum number of frames that will be bundled.
-- * In some situations, such as the TCP windowing algorithm, it may be
-- * better to limit the growth of the bundle size than let it go as
-- * high as it can, because that could cause too much added latency.
-- * The default is six, because this is the number of packets in the
-- * default TCP window size. A value of 1 would make CPUSaver indicate
-- * an interrupt for every frame received. If you do not want to put
-- * a limit on the bundle size, set this value to xFFFF.
-- */
--#define E100_DEFAULT_CPUSAVER_BUNDLE_MAX 6
--#define E100_DEFAULT_CPUSAVER_INTERRUPT_DELAY 0x600
--#define E100_DEFAULT_BUNDLE_SMALL_FR false
--
--/* end of configurables */
--
--/* ====================================================================== */
--/* hw */
--/* ====================================================================== */
--
--/* timeout for command completion */
--#define E100_CMD_WAIT 100 /* iterations */
--
--struct driver_stats {
-- struct net_device_stats net_stats;
--
-- unsigned long tx_late_col;
-- unsigned long tx_ok_defrd;
-- unsigned long tx_one_retry;
-- unsigned long tx_mt_one_retry;
-- unsigned long rcv_cdt_frames;
-- unsigned long xmt_fc_pkts;
-- unsigned long rcv_fc_pkts;
-- unsigned long rcv_fc_unsupported;
-- unsigned long xmt_tco_pkts;
-- unsigned long rcv_tco_pkts;
-- unsigned long rx_intr_pkts;
--};
--
--/* TODO: kill me when we can do C99 */
--#define false (0)
--#define true (1)
--
--/* Changed for 82558 and 82559 enhancements */
--/* defines for 82558/9 flow control CSR values */
--#define DFLT_FC_THLD 0x00 /* Rx FIFO threshold of 0.5KB free */
--#define DFLT_FC_CMD 0x00 /* FC Command in CSR */
--
--/* ====================================================================== */
--/* equates */
--/* ====================================================================== */
--
--/*
-- * These are general purpose defines
-- */
--
--/* Bit Mask definitions */
--#define BIT_0 0x0001
--#define BIT_1 0x0002
--#define BIT_2 0x0004
--#define BIT_3 0x0008
--#define BIT_4 0x0010
--#define BIT_5 0x0020
--#define BIT_6 0x0040
--#define BIT_7 0x0080
--#define BIT_8 0x0100
--#define BIT_9 0x0200
--#define BIT_10 0x0400
--#define BIT_11 0x0800
--#define BIT_12 0x1000
--#define BIT_13 0x2000
--#define BIT_14 0x4000
--#define BIT_15 0x8000
--#define BIT_28 0x10000000
--
--#define BIT_0_2 0x0007
--#define BIT_0_3 0x000F
--#define BIT_0_4 0x001F
--#define BIT_0_5 0x003F
--#define BIT_0_6 0x007F
--#define BIT_0_7 0x00FF
--#define BIT_0_8 0x01FF
--#define BIT_0_13 0x3FFF
--#define BIT_0_15 0xFFFF
--#define BIT_1_2 0x0006
--#define BIT_1_3 0x000E
--#define BIT_2_5 0x003C
--#define BIT_3_4 0x0018
--#define BIT_4_5 0x0030
--#define BIT_4_6 0x0070
--#define BIT_4_7 0x00F0
--#define BIT_5_7 0x00E0
--#define BIT_5_12 0x1FE0
--#define BIT_5_15 0xFFE0
--#define BIT_6_7 0x00c0
--#define BIT_7_11 0x0F80
--#define BIT_8_10 0x0700
--#define BIT_9_13 0x3E00
--#define BIT_12_15 0xF000
--#define BIT_8_15 0xFF00
--
--#define BIT_16_20 0x001F0000
--#define BIT_21_25 0x03E00000
--#define BIT_26_27 0x0C000000
--
--/* Transmit Threshold related constants */
--#define DEFAULT_TX_PER_UNDERRUN 20000
--
--#define MAX_MULTICAST_ADDRS 64
--#define MAX_FILTER 16
--
--#define FULL_DUPLEX 2
--#define HALF_DUPLEX 1
--
--/*
-- * These defines are specific to the 82557
-- */
--
--/* E100 PORT functions -- lower 4 bits */
--#define PORT_SOFTWARE_RESET 0
--#define PORT_SELFTEST 1
--#define PORT_SELECTIVE_RESET 2
--#define PORT_DUMP 3
--
--/* SCB Status Word bit definitions */
--/* Interrupt status/ack fields */
--/* ER and FCP interrupts for 82558 masks */
--#define SCB_STATUS_ACK_MASK BIT_8_15 /* Status Mask */
--#define SCB_STATUS_ACK_CX BIT_15 /* CU Completed Action Cmd */
--#define SCB_STATUS_ACK_FR BIT_14 /* RU Received A Frame */
--#define SCB_STATUS_ACK_CNA BIT_13 /* CU Became Inactive (IDLE) */
--#define SCB_STATUS_ACK_RNR BIT_12 /* RU Became Not Ready */
--#define SCB_STATUS_ACK_MDI BIT_11 /* MDI read or write done */
--#define SCB_STATUS_ACK_SWI BIT_10 /* S/W generated interrupt */
--#define SCB_STATUS_ACK_ER BIT_9 /* Early Receive */
--#define SCB_STATUS_ACK_FCP BIT_8 /* Flow Control Pause */
--
--/*- CUS Fields */
--#define SCB_CUS_MASK (BIT_6 | BIT_7) /* CUS 2-bit Mask */
--#define SCB_CUS_IDLE 0 /* CU Idle */
--#define SCB_CUS_SUSPEND BIT_6 /* CU Suspended */
--#define SCB_CUS_ACTIVE BIT_7 /* CU Active */
--
--/*- RUS Fields */
--#define SCB_RUS_IDLE 0 /* RU Idle */
--#define SCB_RUS_MASK BIT_2_5 /* RUS 3-bit Mask */
--#define SCB_RUS_SUSPEND BIT_2 /* RU Suspended */
--#define SCB_RUS_NO_RESOURCES BIT_3 /* RU Out Of Resources */
--#define SCB_RUS_READY BIT_4 /* RU Ready */
--#define SCB_RUS_SUSP_NO_RBDS (BIT_2 | BIT_5) /* RU No More RBDs */
--#define SCB_RUS_NO_RBDS (BIT_3 | BIT_5) /* RU No More RBDs */
--#define SCB_RUS_READY_NO_RBDS (BIT_4 | BIT_5) /* RU Ready, No RBDs */
--
--/* SCB Command Word bit definitions */
--/*- CUC fields */
--/* Changing mask to 4 bits */
--#define SCB_CUC_MASK BIT_4_7 /* CUC 4-bit Mask */
--#define SCB_CUC_NOOP 0
--#define SCB_CUC_START BIT_4 /* CU Start */
--#define SCB_CUC_RESUME BIT_5 /* CU Resume */
--#define SCB_CUC_UNKNOWN BIT_7 /* CU unknown command */
--/* Changed for 82558 enhancements */
--#define SCB_CUC_STATIC_RESUME (BIT_5 | BIT_7) /* 82558/9 Static Resume */
--#define SCB_CUC_DUMP_ADDR BIT_6 /* CU Dump Counters Address */
--#define SCB_CUC_DUMP_STAT (BIT_4 | BIT_6) /* CU Dump stat. counters */
--#define SCB_CUC_LOAD_BASE (BIT_5 | BIT_6) /* Load the CU base */
--/* Below was defined as BIT_4_7 */
--#define SCB_CUC_DUMP_RST_STAT BIT_4_6 /* CU Dump & reset statistics cntrs */
--
--/*- RUC fields */
--#define SCB_RUC_MASK BIT_0_2 /* RUC 3-bit Mask */
--#define SCB_RUC_START BIT_0 /* RU Start */
--#define SCB_RUC_RESUME BIT_1 /* RU Resume */
--#define SCB_RUC_ABORT BIT_2 /* RU Abort */
--#define SCB_RUC_LOAD_HDS (BIT_0 | BIT_2) /* Load RFD Header Data Size */
--#define SCB_RUC_LOAD_BASE (BIT_1 | BIT_2) /* Load the RU base */
--#define SCB_RUC_RBD_RESUME BIT_0_2 /* RBD resume */
--
--/* Interrupt fields (assuming byte addressing) */
--#define SCB_INT_MASK BIT_0 /* Mask interrupts */
--#define SCB_SOFT_INT BIT_1 /* Generate a S/W interrupt */
--/* Specific Interrupt Mask Bits (upper byte of SCB Command word) */
--#define SCB_FCP_INT_MASK BIT_2 /* Flow Control Pause */
--#define SCB_ER_INT_MASK BIT_3 /* Early Receive */
--#define SCB_RNR_INT_MASK BIT_4 /* RU Not Ready */
--#define SCB_CNA_INT_MASK BIT_5 /* CU Not Active */
--#define SCB_FR_INT_MASK BIT_6 /* Frame Received */
--#define SCB_CX_INT_MASK BIT_7 /* CU eXecution w/ I-bit done */
--#define SCB_BACHELOR_INT_MASK BIT_2_7 /* 82558 interrupt mask bits */
--
--#define SCB_GCR2_EEPROM_ACCESS_SEMAPHORE BIT_7
--
--/* EEPROM bit definitions */
--/*- EEPROM control register bits */
--#define EEPROM_FLAG_ASF 0x8000
--#define EEPROM_FLAG_GCL 0x4000
--
--#define EN_TRNF 0x10 /* Enable turnoff */
--#define EEDO 0x08 /* EEPROM data out */
--#define EEDI 0x04 /* EEPROM data in (set for writing data) */
--#define EECS 0x02 /* EEPROM chip select (1=hi, 0=lo) */
--#define EESK 0x01 /* EEPROM shift clock (1=hi, 0=lo) */
--
--/*- EEPROM opcodes */
--#define EEPROM_READ_OPCODE 06
--#define EEPROM_WRITE_OPCODE 05
--#define EEPROM_ERASE_OPCODE 07
--#define EEPROM_EWEN_OPCODE 19 /* Erase/write enable */
--#define EEPROM_EWDS_OPCODE 16 /* Erase/write disable */
--
--/*- EEPROM data locations */
--#define EEPROM_NODE_ADDRESS_BYTE_0 0
--#define EEPROM_COMPATIBILITY_WORD 3
--#define EEPROM_PWA_NO 8
--#define EEPROM_ID_WORD 0x0A
--#define EEPROM_CONFIG_ASF 0x0D
--#define EEPROM_SMBUS_ADDR 0x90
--
--#define EEPROM_SUM 0xbaba
--
--// Zero Locking Algorithm definitions:
--#define ZLOCK_ZERO_MASK 0x00F0
--#define ZLOCK_MAX_READS 50
--#define ZLOCK_SET_ZERO 0x2010
--#define ZLOCK_MAX_SLEEP 300 * HZ
--#define ZLOCK_MAX_ERRORS 300
--
--/* E100 Action Commands */
--#define CB_IA_ADDRESS 1
--#define CB_CONFIGURE 2
--#define CB_MULTICAST 3
--#define CB_TRANSMIT 4
--#define CB_LOAD_MICROCODE 5
--#define CB_LOAD_FILTER 8
--#define CB_MAX_NONTX_CMD 9
--#define CB_IPCB_TRANSMIT 9
--
--/* Pre-defined Filter Bits */
--#define CB_FILTER_EL 0x80000000
--#define CB_FILTER_FIX 0x40000000
--#define CB_FILTER_ARP 0x08000000
--#define CB_FILTER_IA_MATCH 0x02000000
--
--/* Command Block (CB) Field Definitions */
--/*- CB Command Word */
--#define CB_EL_BIT BIT_15 /* CB EL Bit */
--#define CB_S_BIT BIT_14 /* CB Suspend Bit */
--#define CB_I_BIT BIT_13 /* CB Interrupt Bit */
--#define CB_TX_SF_BIT BIT_3 /* TX CB Flexible Mode */
--#define CB_CMD_MASK BIT_0_3 /* CB 4-bit CMD Mask */
--#define CB_CID_DEFAULT (0x1f << 8) /* CB 5-bit CID (max value) */
--
--/*- CB Status Word */
--#define CB_STATUS_MASK BIT_12_15 /* CB Status Mask (4-bits) */
--#define CB_STATUS_COMPLETE BIT_15 /* CB Complete Bit */
--#define CB_STATUS_OK BIT_13 /* CB OK Bit */
--#define CB_STATUS_VLAN BIT_12 /* CB Valn detected Bit */
--#define CB_STATUS_FAIL BIT_11 /* CB Fail (F) Bit */
--
--/*misc command bits */
--#define CB_TX_EOF_BIT BIT_15 /* TX CB/TBD EOF Bit */
--
--/* Config params */
--#define CB_CFIG_BYTE_COUNT 22 /* 22 config bytes */
--#define CB_CFIG_D102_BYTE_COUNT 10
--
--/* Receive Frame Descriptor Fields */
--
--/*- RFD Status Bits */
--#define RFD_RECEIVE_COLLISION BIT_0 /* Collision detected on Receive */
--#define RFD_IA_MATCH BIT_1 /* Indv Address Match Bit */
--#define RFD_RX_ERR BIT_4 /* RX_ERR pin on Phy was set */
--#define RFD_FRAME_TOO_SHORT BIT_7 /* Receive Frame Short */
--#define RFD_DMA_OVERRUN BIT_8 /* Receive DMA Overrun */
--#define RFD_NO_RESOURCES BIT_9 /* No Buffer Space */
--#define RFD_ALIGNMENT_ERROR BIT_10 /* Alignment Error */
--#define RFD_CRC_ERROR BIT_11 /* CRC Error */
--#define RFD_STATUS_OK BIT_13 /* RFD OK Bit */
--#define RFD_STATUS_COMPLETE BIT_15 /* RFD Complete Bit */
--
--/*- RFD Command Bits*/
--#define RFD_EL_BIT BIT_15 /* RFD EL Bit */
--#define RFD_S_BIT BIT_14 /* RFD Suspend Bit */
--#define RFD_H_BIT BIT_4 /* Header RFD Bit */
--#define RFD_SF_BIT BIT_3 /* RFD Flexible Mode */
--
--/*- RFD misc bits*/
--#define RFD_EOF_BIT BIT_15 /* RFD End-Of-Frame Bit */
--#define RFD_F_BIT BIT_14 /* RFD Buffer Fetch Bit */
--#define RFD_ACT_COUNT_MASK BIT_0_13 /* RFD Actual Count Mask */
--
--/* Receive Buffer Descriptor Fields*/
--#define RBD_EOF_BIT BIT_15 /* RBD End-Of-Frame Bit */
--#define RBD_F_BIT BIT_14 /* RBD Buffer Fetch Bit */
--#define RBD_ACT_COUNT_MASK BIT_0_13 /* RBD Actual Count Mask */
--
--#define SIZE_FIELD_MASK BIT_0_13 /* Size of the associated buffer */
--#define RBD_EL_BIT BIT_15 /* RBD EL Bit */
--
--/* Self Test Results*/
--#define CB_SELFTEST_FAIL_BIT BIT_12
--#define CB_SELFTEST_DIAG_BIT BIT_5
--#define CB_SELFTEST_REGISTER_BIT BIT_3
--#define CB_SELFTEST_ROM_BIT BIT_2
--
--#define CB_SELFTEST_ERROR_MASK ( \
-- CB_SELFTEST_FAIL_BIT | CB_SELFTEST_DIAG_BIT | \
-- CB_SELFTEST_REGISTER_BIT | CB_SELFTEST_ROM_BIT)
--
--/* adapter vendor & device ids */
--#define PCI_OHIO_BOARD 0x10f0 /* subdevice ID, Ohio dual port nic */
--
--/* Values for PCI_REV_ID_REGISTER values */
--#define D101A4_REV_ID 4 /* 82558 A4 stepping */
--#define D101B0_REV_ID 5 /* 82558 B0 stepping */
--#define D101MA_REV_ID 8 /* 82559 A0 stepping */
--#define D101S_REV_ID 9 /* 82559S A-step */
--#define D102_REV_ID 12
--#define D102C_REV_ID 13 /* 82550 step C */
--#define D102E_REV_ID 15
--
--/* ############Start of 82555 specific defines################## */
--
--#define PHY_82555_LED_SWITCH_CONTROL 0x1b /* 82555 led switch control register */
--
--/* 82555 led switch control reg. opcodes */
--#define PHY_82555_LED_NORMAL_CONTROL 0 // control back to the 8255X
--#define PHY_82555_LED_DRIVER_CONTROL BIT_2 // the driver is in control
--#define PHY_82555_LED_OFF BIT_2 // activity LED is off
--#define PHY_82555_LED_ON_559 (BIT_0 | BIT_2) // activity LED is on for 559 and later
--#define PHY_82555_LED_ON_PRE_559 (BIT_0 | BIT_1 | BIT_2) // activity LED is on for 558 and before
--
--// Describe the state of the phy led.
--// needed for the function : 'e100_blink_timer'
--enum led_state_e {
-- LED_OFF = 0,
-- LED_ON,
--};
--
--/* ############End of 82555 specific defines##################### */
--
--#define RFD_PARSE_BIT BIT_3
--#define RFD_TCP_PACKET 0x00
--#define RFD_UDP_PACKET 0x01
--#define TCPUDP_CHECKSUM_BIT_VALID BIT_4
--#define TCPUDP_CHECKSUM_VALID BIT_5
--#define CHECKSUM_PROTOCOL_MASK 0x03
--
--#define VLAN_SIZE 4
--#define CHKSUM_SIZE 2
--#define RFD_DATA_SIZE (ETH_FRAME_LEN + CHKSUM_SIZE + VLAN_SIZE)
--
--/* Bits for bdp->flags */
--#define DF_LINK_FC_CAP 0x00000001 /* Link is flow control capable */
--#define DF_CSUM_OFFLOAD 0x00000002
--#define DF_UCODE_LOADED 0x00000004
--#define USE_IPCB 0x00000008 /* set if using ipcb for transmits */
--#define IS_BACHELOR 0x00000010 /* set if 82558 or newer board */
--#define IS_ICH 0x00000020
--#define DF_SPEED_FORCED 0x00000040 /* set if speed is forced */
--#define LED_IS_ON 0x00000080 /* LED is turned ON by the driver */
--#define DF_LINK_FC_TX_ONLY 0x00000100 /* Received PAUSE frames are honored*/
--
--typedef struct net_device_stats net_dev_stats_t;
--
--/* needed macros */
--/* These macros use the bdp pointer. If you use them it better be defined */
--#define PREV_TCB_USED(X) ((X).tail ? (X).tail - 1 : bdp->params.TxDescriptors - 1)
--#define NEXT_TCB_TOUSE(X) ((((X) + 1) >= bdp->params.TxDescriptors) ? 0 : (X) + 1)
--#define TCB_TO_USE(X) ((X).tail)
--#define TCBS_AVAIL(X) (NEXT_TCB_TOUSE( NEXT_TCB_TOUSE((X).tail)) != (X).head)
--
--#define RFD_POINTER(skb,bdp) ((rfd_t *) (((unsigned char *)((skb)->data))-((bdp)->rfd_size)))
--#define SKB_RFD_STATUS(skb,bdp) ((RFD_POINTER((skb),(bdp)))->rfd_header.cb_status)
--
--/* ====================================================================== */
--/* 82557 */
--/* ====================================================================== */
--
--/* Changed for 82558 enhancement */
--typedef struct _d101_scb_ext_t {
-- u32 scb_rx_dma_cnt; /* Rx DMA byte count */
-- u8 scb_early_rx_int; /* Early Rx DMA byte count */
-- u8 scb_fc_thld; /* Flow Control threshold */
-- u8 scb_fc_xon_xoff; /* Flow Control XON/XOFF values */
-- u8 scb_pmdr; /* Power Mgmt. Driver Reg */
--} d101_scb_ext __attribute__ ((__packed__));
--
--/* Changed for 82559 enhancement */
--typedef struct _d101m_scb_ext_t {
-- u32 scb_rx_dma_cnt; /* Rx DMA byte count */
-- u8 scb_early_rx_int; /* Early Rx DMA byte count */
-- u8 scb_fc_thld; /* Flow Control threshold */
-- u8 scb_fc_xon_xoff; /* Flow Control XON/XOFF values */
-- u8 scb_pmdr; /* Power Mgmt. Driver Reg */
-- u8 scb_gen_ctrl; /* General Control */
-- u8 scb_gen_stat; /* General Status */
-- u16 scb_reserved; /* Reserved */
-- u32 scb_function_event; /* Cardbus Function Event */
-- u32 scb_function_event_mask; /* Cardbus Function Mask */
-- u32 scb_function_present_state; /* Cardbus Function state */
-- u32 scb_force_event; /* Cardbus Force Event */
--} d101m_scb_ext __attribute__ ((__packed__));
--
--/* Changed for 82550 enhancement */
--typedef struct _d102_scb_ext_t {
-- u32 scb_rx_dma_cnt; /* Rx DMA byte count */
-- u8 scb_early_rx_int; /* Early Rx DMA byte count */
-- u8 scb_fc_thld; /* Flow Control threshold */
-- u8 scb_fc_xon_xoff; /* Flow Control XON/XOFF values */
-- u8 scb_pmdr; /* Power Mgmt. Driver Reg */
-- u8 scb_gen_ctrl; /* General Control */
-- u8 scb_gen_stat; /* General Status */
-- u8 scb_gen_ctrl2;
-- u8 scb_reserved; /* Reserved */
-- u32 scb_scheduling_reg;
-- u32 scb_reserved2;
-- u32 scb_function_event; /* Cardbus Function Event */
-- u32 scb_function_event_mask; /* Cardbus Function Mask */
-- u32 scb_function_present_state; /* Cardbus Function state */
-- u32 scb_force_event; /* Cardbus Force Event */
--} d102_scb_ext __attribute__ ((__packed__));
--
--/*
-- * 82557 status control block. this will be memory mapped & will hang of the
-- * the bdp, which hangs of the bdp. This is the brain of it.
-- */
--typedef struct _scb_t {
-- u16 scb_status; /* SCB Status register */
-- u8 scb_cmd_low; /* SCB Command register (low byte) */
-- u8 scb_cmd_hi; /* SCB Command register (high byte) */
-- u32 scb_gen_ptr; /* SCB General pointer */
-- u32 scb_port; /* PORT register */
-- u16 scb_flsh_cntrl; /* Flash Control register */
-- u16 scb_eprm_cntrl; /* EEPROM control register */
-- u32 scb_mdi_cntrl; /* MDI Control Register */
-- /* Changed for 82558 enhancement */
-- union {
-- u32 scb_rx_dma_cnt; /* Rx DMA byte count */
-- d101_scb_ext d101_scb; /* 82558/9 specific fields */
-- d101m_scb_ext d101m_scb; /* 82559 specific fields */
-- d102_scb_ext d102_scb;
-- } scb_ext;
--} scb_t __attribute__ ((__packed__));
--
--/* Self test
-- * This is used to dump results of the self test
-- */
--typedef struct _self_test_t {
-- u32 st_sign; /* Self Test Signature */
-- u32 st_result; /* Self Test Results */
--} self_test_t __attribute__ ((__packed__));
--
--/*
-- * Statistical Counters
-- */
--/* 82557 counters */
--typedef struct _basic_cntr_t {
-- u32 xmt_gd_frames; /* Good frames transmitted */
-- u32 xmt_max_coll; /* Fatal frames -- had max collisions */
-- u32 xmt_late_coll; /* Fatal frames -- had a late coll. */
-- u32 xmt_uruns; /* Xmit underruns (fatal or re-transmit) */
-- u32 xmt_lost_crs; /* Frames transmitted without CRS */
-- u32 xmt_deferred; /* Deferred transmits */
-- u32 xmt_sngl_coll; /* Transmits that had 1 and only 1 coll. */
-- u32 xmt_mlt_coll; /* Transmits that had multiple coll. */
-- u32 xmt_ttl_coll; /* Transmits that had 1+ collisions. */
-- u32 rcv_gd_frames; /* Good frames received */
-- u32 rcv_crc_errs; /* Aligned frames that had a CRC error */
-- u32 rcv_algn_errs; /* Receives that had alignment errors */
-- u32 rcv_rsrc_err; /* Good frame dropped cuz no resources */
-- u32 rcv_oruns; /* Overrun errors - bus was busy */
-- u32 rcv_err_coll; /* Received frms. that encountered coll. */
-- u32 rcv_shrt_frames; /* Received frames that were to short */
--} basic_cntr_t;
--
--/* 82558 extended statistic counters */
--typedef struct _ext_cntr_t {
-- u32 xmt_fc_frames;
-- u32 rcv_fc_frames;
-- u32 rcv_fc_unsupported;
--} ext_cntr_t;
--
--/* 82559 TCO statistic counters */
--typedef struct _tco_cntr_t {
-- u16 xmt_tco_frames;
-- u16 rcv_tco_frames;
--} tco_cntr_t;
--
--/* Structures to access thet physical dump area */
--/* Use one of these types, according to the statisitcal counters mode,
-- to cast the pointer to the physical dump area and access the cmd_complete
-- DWORD. */
--
--/* 557-mode : only basic counters + cmd_complete */
--typedef struct _err_cntr_557_t {
-- basic_cntr_t basic_stats;
-- u32 cmd_complete;
--} err_cntr_557_t;
--
--/* 558-mode : basic + extended counters + cmd_complete */
--typedef struct _err_cntr_558_t {
-- basic_cntr_t basic_stats;
-- ext_cntr_t extended_stats;
-- u32 cmd_complete;
--} err_cntr_558_t;
--
--/* 559-mode : basic + extended + TCO counters + cmd_complete */
--typedef struct _err_cntr_559_t {
-- basic_cntr_t basic_stats;
-- ext_cntr_t extended_stats;
-- tco_cntr_t tco_stats;
-- u32 cmd_complete;
--} err_cntr_559_t;
--
--/* This typedef defines the struct needed to hold the largest number of counters */
--typedef err_cntr_559_t max_counters_t;
--
--/* Different statistical-counters mode the controller may be in */
--typedef enum _stat_mode_t {
-- E100_BASIC_STATS = 0, /* 82557 stats : 16 counters / 16 dw */
-- E100_EXTENDED_STATS, /* 82558 stats : 19 counters / 19 dw */
-- E100_TCO_STATS /* 82559 stats : 21 counters / 20 dw */
--} stat_mode_t;
--
--/* dump statistical counters complete codes */
--#define DUMP_STAT_COMPLETED 0xA005
--#define DUMP_RST_STAT_COMPLETED 0xA007
--
--/* Command Block (CB) Generic Header Structure*/
--typedef struct _cb_header_t {
-- u16 cb_status; /* Command Block Status */
-- u16 cb_cmd; /* Command Block Command */
-- u32 cb_lnk_ptr; /* Link To Next CB */
--} cb_header_t __attribute__ ((__packed__));
--
--//* Individual Address Command Block (IA_CB)*/
--typedef struct _ia_cb_t {
-- cb_header_t ia_cb_hdr;
-- u8 ia_addr[ETH_ALEN];
--} ia_cb_t __attribute__ ((__packed__));
--
--/* Configure Command Block (CONFIG_CB)*/
--typedef struct _config_cb_t {
-- cb_header_t cfg_cbhdr;
-- u8 cfg_byte[CB_CFIG_BYTE_COUNT + CB_CFIG_D102_BYTE_COUNT];
--} config_cb_t __attribute__ ((__packed__));
--
--/* MultiCast Command Block (MULTICAST_CB)*/
--typedef struct _multicast_cb_t {
-- cb_header_t mc_cbhdr;
-- u16 mc_count; /* Number of multicast addresses */
-- u8 mc_addr[(ETH_ALEN * MAX_MULTICAST_ADDRS)];
--} mltcst_cb_t __attribute__ ((__packed__));
--
--#define UCODE_MAX_DWORDS 134
--/* Load Microcode Command Block (LOAD_UCODE_CB)*/
--typedef struct _load_ucode_cb_t {
-- cb_header_t load_ucode_cbhdr;
-- u32 ucode_dword[UCODE_MAX_DWORDS];
--} load_ucode_cb_t __attribute__ ((__packed__));
--
--/* Load Programmable Filter Data*/
--typedef struct _filter_cb_t {
-- cb_header_t filter_cb_hdr;
-- u32 filter_data[MAX_FILTER];
--} filter_cb_t __attribute__ ((__packed__));
--
--/* NON_TRANSMIT_CB -- Generic Non-Transmit Command Block
-- */
--typedef struct _nxmit_cb_t {
-- union {
-- config_cb_t config;
-- ia_cb_t setup;
-- load_ucode_cb_t load_ucode;
-- mltcst_cb_t multicast;
-- filter_cb_t filter;
-- } ntcb;
--} nxmit_cb_t __attribute__ ((__packed__));
--
--/*Block for queuing for postponed execution of the non-transmit commands*/
--typedef struct _nxmit_cb_entry_t {
-- struct list_head list_elem;
-- nxmit_cb_t *non_tx_cmd;
-- dma_addr_t dma_addr;
-- unsigned long expiration_time;
--} nxmit_cb_entry_t;
--
--/* States for postponed non tx commands execution */
--typedef enum _non_tx_cmd_state_t {
-- E100_NON_TX_IDLE = 0, /* No queued NON-TX commands */
-- E100_WAIT_TX_FINISH, /* Wait for completion of the TX activities */
-- E100_WAIT_NON_TX_FINISH /* Wait for completion of the non TX command */
--} non_tx_cmd_state_t;
--
--/* some defines for the ipcb */
--#define IPCB_IP_CHECKSUM_ENABLE BIT_4
--#define IPCB_TCPUDP_CHECKSUM_ENABLE BIT_5
--#define IPCB_TCP_PACKET BIT_6
--#define IPCB_LARGESEND_ENABLE BIT_7
--#define IPCB_HARDWAREPARSING_ENABLE BIT_0
--#define IPCB_INSERTVLAN_ENABLE BIT_1
--#define IPCB_IP_ACTIVATION_DEFAULT IPCB_HARDWAREPARSING_ENABLE
--
--/* Transmit Buffer Descriptor (TBD)*/
--typedef struct _tbd_t {
-- u32 tbd_buf_addr; /* Physical Transmit Buffer Address */
-- u16 tbd_buf_cnt; /* Actual Count Of Bytes */
-- u16 padd;
--} tbd_t __attribute__ ((__packed__));
--
--/* d102 specific fields */
--typedef struct _tcb_ipcb_t {
-- u16 schedule_low;
-- u8 ip_schedule;
-- u8 ip_activation_high;
-- u16 vlan;
-- u8 ip_header_offset;
-- u8 tcp_header_offset;
-- union {
-- u32 sec_rec_phys_addr;
-- u32 tbd_zero_address;
-- } tbd_sec_addr;
-- union {
-- u16 sec_rec_size;
-- u16 tbd_zero_size;
-- } tbd_sec_size;
-- u16 total_tcp_payload;
--} tcb_ipcb_t __attribute__ ((__packed__));
--
--#define E100_TBD_ARRAY_SIZE (2+MAX_SKB_FRAGS)
--
--/* Transmit Command Block (TCB)*/
--struct _tcb_t {
-- cb_header_t tcb_hdr;
-- u32 tcb_tbd_ptr; /* TBD address */
-- u16 tcb_cnt; /* Data Bytes In TCB past header */
-- u8 tcb_thrshld; /* TX Threshold for FIFO Extender */
-- u8 tcb_tbd_num;
--
-- union {
-- tcb_ipcb_t ipcb; /* d102 ipcb fields */
-- tbd_t tbd_array[E100_TBD_ARRAY_SIZE];
-- } tcbu;
--
-- /* From here onward we can dump anything we want as long as the
-- * size of the total structure is a multiple of a paragraph
-- * boundary ( i.e. -16 bit aligned ).
-- */
-- tbd_t *tbd_ptr;
--
-- u32 tcb_tbd_dflt_ptr; /* TBD address for non-segmented packet */
-- u32 tcb_tbd_expand_ptr; /* TBD address for segmented packet */
--
-- struct sk_buff *tcb_skb; /* the associated socket buffer */
-- dma_addr_t tcb_phys; /* phys addr of the TCB */
--} __attribute__ ((__packed__));
--
--#define _TCB_T_
--typedef struct _tcb_t tcb_t;
--
--/* Receive Frame Descriptor (RFD) - will be using the simple model*/
--struct _rfd_t {
-- /* 8255x */
-- cb_header_t rfd_header;
-- u32 rfd_rbd_ptr; /* Receive Buffer Descriptor Addr */
-- u16 rfd_act_cnt; /* Number Of Bytes Received */
-- u16 rfd_sz; /* Number Of Bytes In RFD */
-- /* D102 aka Gamla */
-- u16 vlanid;
-- u8 rcvparserstatus;
-- u8 reserved;
-- u16 securitystatus;
-- u8 checksumstatus;
-- u8 zerocopystatus;
-- u8 pad[8]; /* data should be 16 byte aligned */
-- u8 data[RFD_DATA_SIZE];
--
--} __attribute__ ((__packed__));
--
--#define _RFD_T_
--typedef struct _rfd_t rfd_t;
--
--/* Receive Buffer Descriptor (RBD)*/
--typedef struct _rbd_t {
-- u16 rbd_act_cnt; /* Number Of Bytes Received */
-- u16 rbd_filler;
-- u32 rbd_lnk_addr; /* Link To Next RBD */
-- u32 rbd_rcb_addr; /* Receive Buffer Address */
-- u16 rbd_sz; /* Receive Buffer Size */
-- u16 rbd_filler1;
--} rbd_t __attribute__ ((__packed__));
--
--/*
-- * This structure is used to maintain a FIFO access to a resource that is
-- * maintained as a circular queue. The resource to be maintained is pointed
-- * to by the "data" field in the structure below. In this driver the TCBs',
-- * TBDs' & RFDs' are maintained as a circular queue & are managed thru this
-- * structure.
-- */
--typedef struct _buf_pool_t {
-- unsigned int head; /* index to first used resource */
-- unsigned int tail; /* index to last used resource */
-- void *data; /* points to resource pool */
--} buf_pool_t;
--
--/*Rx skb holding structure*/
--struct rx_list_elem {
-- struct list_head list_elem;
-- dma_addr_t dma_addr;
-- struct sk_buff *skb;
--};
--
--enum next_cu_cmd_e { RESUME_NO_WAIT = 0, RESUME_WAIT, START_WAIT };
--enum zlock_state_e { ZLOCK_INITIAL, ZLOCK_READING, ZLOCK_SLEEPING };
--enum tx_queue_stop_type { LONG_STOP = 0, SHORT_STOP };
--
--/* 64 bit aligned size */
--#define E100_SIZE_64A(X) ((sizeof(X) + 7) & ~0x7)
--
--typedef struct _bd_dma_able_t {
-- char selftest[E100_SIZE_64A(self_test_t)];
-- char stats_counters[E100_SIZE_64A(max_counters_t)];
--} bd_dma_able_t;
--
--/* bit masks for bool parameters */
--#define PRM_XSUMRX 0x00000001
--#define PRM_UCODE 0x00000002
--#define PRM_FC 0x00000004
--#define PRM_IFS 0x00000008
--#define PRM_BUNDLE_SMALL 0x00000010
--
--struct cfg_params {
-- int e100_speed_duplex;
-- int RxDescriptors;
-- int TxDescriptors;
-- int IntDelay;
-- int BundleMax;
-- int ber;
-- u32 b_params;
--};
--struct ethtool_lpbk_data{
-- dma_addr_t dma_handle;
-- tcb_t *tcb;
-- rfd_t *rfd;
--
--};
--
--struct e100_private {
-- struct vlan_group *vlgrp;
-- u32 flags; /* board management flags */
-- u32 tx_per_underrun; /* number of good tx frames per underrun */
-- unsigned int tx_count; /* count of tx frames, so we can request an interrupt */
-- u8 tx_thld; /* stores transmit threshold */
-- u16 eeprom_size;
-- u32 pwa_no; /* PWA: xxxxxx-0xx */
-- u8 perm_node_address[ETH_ALEN];
-- struct list_head active_rx_list; /* list of rx buffers */
-- struct list_head rx_struct_pool; /* pool of rx buffer struct headers */
-- u16 rfd_size; /* size of the adapter's RFD struct */
-- int skb_req; /* number of skbs neede by the adapter */
-- u8 intr_mask; /* mask for interrupt status */
--
-- void *dma_able; /* dma allocated structs */
-- dma_addr_t dma_able_phys;
-- self_test_t *selftest; /* pointer to self test area */
-- dma_addr_t selftest_phys; /* phys addr of selftest */
-- max_counters_t *stats_counters; /* pointer to stats table */
-- dma_addr_t stat_cnt_phys; /* phys addr of stat counter area */
--
-- stat_mode_t stat_mode; /* statistics mode: extended, TCO, basic */
-- scb_t *scb; /* memory mapped ptr to 82557 scb */
--
-- tcb_t *last_tcb; /* pointer to last tcb sent */
-- buf_pool_t tcb_pool; /* adapter's TCB array */
-- dma_addr_t tcb_phys; /* phys addr of start of TCBs */
--
-- u16 cur_line_speed;
-- u16 cur_dplx_mode;
--
-- struct net_device *device;
-- struct pci_dev *pdev;
-- struct driver_stats drv_stats;
--
-- u8 rev_id; /* adapter PCI revision ID */
--
-- unsigned int phy_addr; /* address of PHY component */
-- unsigned int PhyId; /* ID of PHY component */
-- unsigned int PhyState; /* state for the fix squelch algorithm */
-- unsigned int PhyDelay; /* delay for the fix squelch algorithm */
--
-- /* Lock defintions for the driver */
-- spinlock_t bd_lock; /* board lock */
-- spinlock_t bd_non_tx_lock; /* Non transmit command lock */
-- spinlock_t config_lock; /* config block lock */
-- spinlock_t mdi_access_lock; /* mdi lock */
--
-- struct timer_list watchdog_timer; /* watchdog timer id */
--
-- /* non-tx commands parameters */
-- struct timer_list nontx_timer_id; /* non-tx timer id */
-- struct list_head non_tx_cmd_list;
-- non_tx_cmd_state_t non_tx_command_state;
-- nxmit_cb_entry_t *same_cmd_entry[CB_MAX_NONTX_CMD];
--
-- enum next_cu_cmd_e next_cu_cmd;
--
-- /* Zero Locking Algorithm data members */
-- enum zlock_state_e zlock_state;
-- u8 zlock_read_data[16]; /* number of times each value 0-15 was read */
-- u16 zlock_read_cnt; /* counts number of reads */
-- ulong zlock_sleep_cnt; /* keeps track of "sleep" time */
--
-- u8 config[CB_CFIG_BYTE_COUNT + CB_CFIG_D102_BYTE_COUNT];
--
-- /* IFS params */
-- u8 ifs_state;
-- u8 ifs_value;
--
-- struct cfg_params params; /* adapter's command line parameters */
--
-- u32 speed_duplex_caps; /* adapter's speed/duplex capabilities */
--
-- /* WOL params for ethtool */
-- u32 wolsupported;
-- u32 wolopts;
-- u16 ip_lbytes;
-- struct ethtool_lpbk_data loopback;
-- struct timer_list blink_timer; /* led blink timer id */
--
--#ifdef CONFIG_PM
-- u32 pci_state[16];
--#endif
--#ifdef E100_CU_DEBUG
-- u8 last_cmd;
-- u8 last_sub_cmd;
--#endif
--};
--
--#define E100_AUTONEG 0
--#define E100_SPEED_10_HALF 1
--#define E100_SPEED_10_FULL 2
--#define E100_SPEED_100_HALF 3
--#define E100_SPEED_100_FULL 4
--
--/********* function prototypes *************/
--extern int e100_open(struct net_device *);
--extern int e100_close(struct net_device *);
--extern void e100_isolate_driver(struct e100_private *bdp);
--extern unsigned char e100_hw_init(struct e100_private *);
--extern void e100_sw_reset(struct e100_private *bdp, u32 reset_cmd);
--extern u8 e100_start_cu(struct e100_private *bdp, tcb_t *tcb);
--extern void e100_free_non_tx_cmd(struct e100_private *bdp,
-- nxmit_cb_entry_t *non_tx_cmd);
--extern nxmit_cb_entry_t *e100_alloc_non_tx_cmd(struct e100_private *bdp);
--extern unsigned char e100_exec_non_cu_cmd(struct e100_private *bdp,
-- nxmit_cb_entry_t *cmd);
--extern unsigned char e100_selftest(struct e100_private *bdp, u32 *st_timeout,
-- u32 *st_result);
--extern unsigned char e100_get_link_state(struct e100_private *bdp);
--extern unsigned char e100_wait_scb(struct e100_private *bdp);
--
--extern void e100_deisolate_driver(struct e100_private *bdp, u8 full_reset);
--extern unsigned char e100_configure_device(struct e100_private *bdp);
--#ifdef E100_CU_DEBUG
--extern unsigned char e100_cu_unknown_state(struct e100_private *bdp);
--#endif
--
--#define ROM_TEST_FAIL 0x01
--#define REGISTER_TEST_FAIL 0x02
--#define SELF_TEST_FAIL 0x04
--#define TEST_TIMEOUT 0x08
--
--enum test_offsets {
-- test_link,
-- test_eeprom,
-- test_self_test,
-- test_loopback_mac,
-- test_loopback_phy,
-- cable_diag,
-- max_test_res, /* must be last */
--};
--
--#endif
---- linux-2.6.0/drivers/net/e100/e100_main.c 2003-11-09 16:45:05.000000000 -0800
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,4343 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--/**********************************************************************
--* *
--* INTEL CORPORATION *
--* *
--* This software is supplied under the terms of the license included *
--* above. All use of this driver must be in accordance with the terms *
--* of that license. *
--* *
--* Module Name: e100_main.c *
--* *
--* Abstract: Functions for the driver entry points like load, *
--* unload, open and close. All board specific calls made *
--* by the network interface section of the driver. *
--* *
--* Environment: This file is intended to be specific to the Linux *
--* operating system. *
--* *
--**********************************************************************/
--
--/* Change Log
-- *
-- * 2.3.30 09/21/03
-- * o Bug fix (Bugzilla 97908): Loading e100 was causing crash on Itanium2
-- * with HP chipset
-- * o Bug fix (Bugzilla 101583): e100 can't pass traffic with ipv6
-- * o Bug fix (Bugzilla 101360): PRO/10+ can't pass traffic
-- *
-- * 2.3.27 08/08/03
-- * o Bug fix: read skb->len after freeing skb
-- * [Andrew Morton] akpm@zip.com.au
-- * o Bug fix: 82557 (with National PHY) timeout during init
-- * [Adam Kropelin] akropel1@rochester.rr.com
-- * o Feature add: allow to change Wake On LAN when EEPROM disabled
-- *
-- * 2.3.13 05/08/03
-- */
--
--#include <linux/config.h>
--#include <net/checksum.h>
--#include <linux/tcp.h>
--#include <linux/udp.h>
--#include "e100.h"
--#include "e100_ucode.h"
--#include "e100_config.h"
--#include "e100_phy.h"
--
--extern void e100_force_speed_duplex_to_phy(struct e100_private *bdp);
--
--static char e100_gstrings_stats[][ETH_GSTRING_LEN] = {
-- "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
-- "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions",
-- "rx_length_errors", "rx_over_errors", "rx_crc_errors",
-- "rx_frame_errors", "rx_fifo_errors", "rx_missed_errors",
-- "tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors",
-- "tx_heartbeat_errors", "tx_window_errors",
--};
--#define E100_STATS_LEN sizeof(e100_gstrings_stats) / ETH_GSTRING_LEN
--
--static int e100_do_ethtool_ioctl(struct net_device *, struct ifreq *);
--static void e100_get_speed_duplex_caps(struct e100_private *);
--static int e100_ethtool_get_settings(struct net_device *, struct ifreq *);
--static int e100_ethtool_set_settings(struct net_device *, struct ifreq *);
--
--static int e100_ethtool_get_drvinfo(struct net_device *, struct ifreq *);
--static int e100_ethtool_eeprom(struct net_device *, struct ifreq *);
--
--#define E100_EEPROM_MAGIC 0x1234
--static int e100_ethtool_glink(struct net_device *, struct ifreq *);
--static int e100_ethtool_gregs(struct net_device *, struct ifreq *);
--static int e100_ethtool_nway_rst(struct net_device *, struct ifreq *);
--static int e100_ethtool_wol(struct net_device *, struct ifreq *);
--#ifdef CONFIG_PM
--static unsigned char e100_setup_filter(struct e100_private *bdp);
--static void e100_do_wol(struct pci_dev *pcid, struct e100_private *bdp);
--#endif
--static u16 e100_get_ip_lbytes(struct net_device *dev);
--extern void e100_config_wol(struct e100_private *bdp);
--extern u32 e100_run_diag(struct net_device *dev, u64 *test_info, u32 flags);
--static int e100_ethtool_test(struct net_device *, struct ifreq *);
--static int e100_ethtool_gstrings(struct net_device *, struct ifreq *);
--static char test_strings[][ETH_GSTRING_LEN] = {
-- "Link test (on/offline)",
-- "Eeprom test (on/offline)",
-- "Self test (offline)",
-- "Mac loopback (offline)",
-- "Phy loopback (offline)",
-- "Cable diagnostic (offline)"
--};
--
--static int e100_ethtool_led_blink(struct net_device *, struct ifreq *);
--
--static int e100_mii_ioctl(struct net_device *, struct ifreq *, int);
--
--static unsigned char e100_delayed_exec_non_cu_cmd(struct e100_private *,
-- nxmit_cb_entry_t *);
--static void e100_free_nontx_list(struct e100_private *);
--static void e100_non_tx_background(unsigned long);
--static inline void e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb);
--/* Global Data structures and variables */
--char e100_copyright[] __devinitdata = "Copyright (c) 2003 Intel Corporation";
--char e100_driver_version[]="2.3.30-k1";
--const char *e100_full_driver_name = "Intel(R) PRO/100 Network Driver";
--char e100_short_driver_name[] = "e100";
--static int e100nics = 0;
--static void e100_vlan_rx_register(struct net_device *netdev, struct vlan_group
-- *grp);
--static void e100_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
--static void e100_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
--
--#ifdef CONFIG_PM
--static int e100_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
--static int e100_suspend(struct pci_dev *pcid, u32 state);
--static int e100_resume(struct pci_dev *pcid);
--static unsigned char e100_asf_enabled(struct e100_private *bdp);
--struct notifier_block e100_notifier_reboot = {
-- .notifier_call = e100_notify_reboot,
-- .next = NULL,
-- .priority = 0
--};
--#endif
--
--/*********************************************************************/
--/*! This is a GCC extension to ANSI C.
-- * See the item "Labeled Elements in Initializers" in the section
-- * "Extensions to the C Language Family" of the GCC documentation.
-- *********************************************************************/
--#define E100_PARAM_INIT { [0 ... E100_MAX_NIC] = -1 }
--
--/* All parameters are treated the same, as an integer array of values.
-- * This macro just reduces the need to repeat the same declaration code
-- * over and over (plus this helps to avoid typo bugs).
-- */
--#define E100_PARAM(X, S) \
-- static const int X[E100_MAX_NIC + 1] = E100_PARAM_INIT; \
-- MODULE_PARM(X, "1-" __MODULE_STRING(E100_MAX_NIC) "i"); \
-- MODULE_PARM_DESC(X, S);
--
--/* ====================================================================== */
--static u8 e100_D101M_checksum(struct e100_private *, struct sk_buff *);
--static u8 e100_D102_check_checksum(rfd_t *);
--static int e100_ioctl(struct net_device *, struct ifreq *, int);
--static int e100_change_mtu(struct net_device *, int);
--static int e100_xmit_frame(struct sk_buff *, struct net_device *);
--static unsigned char e100_init(struct e100_private *);
--static int e100_set_mac(struct net_device *, void *);
--struct net_device_stats *e100_get_stats(struct net_device *);
--
--static irqreturn_t e100intr(int, void *, struct pt_regs *);
--static void e100_print_brd_conf(struct e100_private *);
--static void e100_set_multi(struct net_device *);
--
--static u8 e100_pci_setup(struct pci_dev *, struct e100_private *);
--static u8 e100_sw_init(struct e100_private *);
--static void e100_tco_workaround(struct e100_private *);
--static unsigned char e100_alloc_space(struct e100_private *);
--static void e100_dealloc_space(struct e100_private *);
--static int e100_alloc_tcb_pool(struct e100_private *);
--static void e100_setup_tcb_pool(tcb_t *, unsigned int, struct e100_private *);
--static void e100_free_tcb_pool(struct e100_private *);
--static int e100_alloc_rfd_pool(struct e100_private *);
--static void e100_free_rfd_pool(struct e100_private *);
--
--static void e100_rd_eaddr(struct e100_private *);
--static void e100_rd_pwa_no(struct e100_private *);
--extern u16 e100_eeprom_read(struct e100_private *, u16);
--extern void e100_eeprom_write_block(struct e100_private *, u16, u16 *, u16);
--extern u16 e100_eeprom_size(struct e100_private *);
--u16 e100_eeprom_calculate_chksum(struct e100_private *adapter);
--
--static unsigned char e100_clr_cntrs(struct e100_private *);
--static unsigned char e100_load_microcode(struct e100_private *);
--static unsigned char e100_setup_iaaddr(struct e100_private *, u8 *);
--static unsigned char e100_update_stats(struct e100_private *bdp);
--
--static void e100_start_ru(struct e100_private *);
--static void e100_dump_stats_cntrs(struct e100_private *);
--
--static void e100_check_options(int board, struct e100_private *bdp);
--static void e100_set_int_option(int *, int, int, int, int, char *);
--static void e100_set_bool_option(struct e100_private *bdp, int, u32, int,
-- char *);
--unsigned char e100_wait_exec_cmplx(struct e100_private *, u32, u8, u8);
--void e100_exec_cmplx(struct e100_private *, u32, u8);
--
--/**
-- * e100_get_rx_struct - retrieve cell to hold skb buff from the pool
-- * @bdp: atapter's private data struct
-- *
-- * Returns the new cell to hold sk_buff or %NULL.
-- */
--static inline struct rx_list_elem *
--e100_get_rx_struct(struct e100_private *bdp)
--{
-- struct rx_list_elem *rx_struct = NULL;
--
-- if (!list_empty(&(bdp->rx_struct_pool))) {
-- rx_struct = list_entry(bdp->rx_struct_pool.next,
-- struct rx_list_elem, list_elem);
-- list_del(&(rx_struct->list_elem));
-- }
--
-- return rx_struct;
--}
--
--/**
-- * e100_alloc_skb - allocate an skb for the adapter
-- * @bdp: atapter's private data struct
-- *
-- * Allocates skb with enough room for rfd, and data, and reserve non-data space.
-- * Returns the new cell with sk_buff or %NULL.
-- */
--static inline struct rx_list_elem *
--e100_alloc_skb(struct e100_private *bdp)
--{
-- struct sk_buff *new_skb;
-- u32 skb_size = sizeof (rfd_t);
-- struct rx_list_elem *rx_struct;
--
-- new_skb = (struct sk_buff *) dev_alloc_skb(skb_size);
-- if (new_skb) {
-- /* The IP data should be
-- DWORD aligned. since the ethernet header is 14 bytes long,
-- we need to reserve 2 extra bytes so that the TCP/IP headers
-- will be DWORD aligned. */
-- skb_reserve(new_skb, 2);
-- if ((rx_struct = e100_get_rx_struct(bdp)) == NULL)
-- goto err;
-- rx_struct->skb = new_skb;
-- rx_struct->dma_addr = pci_map_single(bdp->pdev, new_skb->data,
-- sizeof (rfd_t),
-- PCI_DMA_FROMDEVICE);
-- if (!rx_struct->dma_addr)
-- goto err;
-- skb_reserve(new_skb, bdp->rfd_size);
-- return rx_struct;
-- } else {
-- return NULL;
-- }
--
--err:
-- dev_kfree_skb_irq(new_skb);
-- return NULL;
--}
--
--/**
-- * e100_add_skb_to_end - add an skb to the end of our rfd list
-- * @bdp: atapter's private data struct
-- * @rx_struct: rx_list_elem with the new skb
-- *
-- * Adds a newly allocated skb to the end of our rfd list.
-- */
--inline void
--e100_add_skb_to_end(struct e100_private *bdp, struct rx_list_elem *rx_struct)
--{
-- rfd_t *rfdn; /* The new rfd */
-- rfd_t *rfd; /* The old rfd */
-- struct rx_list_elem *rx_struct_last;
--
-- (rx_struct->skb)->dev = bdp->device;
-- rfdn = RFD_POINTER(rx_struct->skb, bdp);
-- rfdn->rfd_header.cb_status = 0;
-- rfdn->rfd_header.cb_cmd = __constant_cpu_to_le16(RFD_EL_BIT);
-- rfdn->rfd_act_cnt = 0;
-- rfdn->rfd_sz = __constant_cpu_to_le16(RFD_DATA_SIZE);
--
-- pci_dma_sync_single(bdp->pdev, rx_struct->dma_addr, bdp->rfd_size,
-- PCI_DMA_TODEVICE);
--
-- if (!list_empty(&(bdp->active_rx_list))) {
-- rx_struct_last = list_entry(bdp->active_rx_list.prev,
-- struct rx_list_elem, list_elem);
-- rfd = RFD_POINTER(rx_struct_last->skb, bdp);
-- pci_dma_sync_single(bdp->pdev, rx_struct_last->dma_addr,
-- 4, PCI_DMA_FROMDEVICE);
-- put_unaligned(cpu_to_le32(rx_struct->dma_addr),
-- ((u32 *) (&(rfd->rfd_header.cb_lnk_ptr))));
--
-- pci_dma_sync_single(bdp->pdev, rx_struct_last->dma_addr,
-- 8, PCI_DMA_TODEVICE);
-- rfd->rfd_header.cb_cmd &=
-- __constant_cpu_to_le16((u16) ~RFD_EL_BIT);
--
-- pci_dma_sync_single(bdp->pdev, rx_struct_last->dma_addr,
-- 4, PCI_DMA_TODEVICE);
-- }
--
-- list_add_tail(&(rx_struct->list_elem), &(bdp->active_rx_list));
--}
--
--static inline void
--e100_alloc_skbs(struct e100_private *bdp)
--{
-- for (; bdp->skb_req > 0; bdp->skb_req--) {
-- struct rx_list_elem *rx_struct;
--
-- if ((rx_struct = e100_alloc_skb(bdp)) == NULL)
-- return;
--
-- e100_add_skb_to_end(bdp, rx_struct);
-- }
--}
--
--void e100_tx_srv(struct e100_private *);
--u32 e100_rx_srv(struct e100_private *);
--
--void e100_watchdog(struct net_device *);
--void e100_refresh_txthld(struct e100_private *);
--void e100_manage_adaptive_ifs(struct e100_private *);
--void e100_clear_pools(struct e100_private *);
--static void e100_clear_structs(struct net_device *);
--static inline tcb_t *e100_prepare_xmit_buff(struct e100_private *,
-- struct sk_buff *);
--static void e100_set_multi_exec(struct net_device *dev);
--
--MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
--MODULE_DESCRIPTION("Intel(R) PRO/100 Network Driver");
--MODULE_LICENSE("GPL");
--
--E100_PARAM(TxDescriptors, "Number of transmit descriptors");
--E100_PARAM(RxDescriptors, "Number of receive descriptors");
--E100_PARAM(XsumRX, "Disable or enable Receive Checksum offload");
--E100_PARAM(e100_speed_duplex, "Speed and Duplex settings");
--E100_PARAM(ucode, "Disable or enable microcode loading");
--E100_PARAM(ber, "Value for the BER correction algorithm");
--E100_PARAM(flow_control, "Disable or enable Ethernet PAUSE frames processing");
--E100_PARAM(IntDelay, "Value for CPU saver's interrupt delay");
--E100_PARAM(BundleSmallFr, "Disable or enable interrupt bundling of small frames");
--E100_PARAM(BundleMax, "Maximum number for CPU saver's packet bundling");
--E100_PARAM(IFS, "Disable or enable the adaptive IFS algorithm");
--
--/**
-- * e100_exec_cmd - issue a comand
-- * @bdp: atapter's private data struct
-- * @scb_cmd_low: the command that is to be issued
-- *
-- * This general routine will issue a command to the e100.
-- */
--static inline void
--e100_exec_cmd(struct e100_private *bdp, u8 cmd_low)
--{
-- writeb(cmd_low, &(bdp->scb->scb_cmd_low));
-- readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */
--}
--
--/**
-- * e100_wait_scb - wait for SCB to clear
-- * @bdp: atapter's private data struct
-- *
-- * This routine checks to see if the e100 has accepted a command.
-- * It does so by checking the command field in the SCB, which will
-- * be zeroed by the e100 upon accepting a command. The loop waits
-- * for up to 1 millisecond for command acceptance.
-- *
-- * Returns:
-- * true if the SCB cleared within 1 millisecond.
-- * false if it didn't clear within 1 millisecond
-- */
--unsigned char
--e100_wait_scb(struct e100_private *bdp)
--{
-- int i;
--
-- /* loop on the scb for a few times */
-- for (i = 0; i < 100; i++) {
-- if (!readb(&bdp->scb->scb_cmd_low))
-- return true;
-- cpu_relax();
-- }
--
-- /* it didn't work. do it the slow way using udelay()s */
-- for (i = 0; i < E100_MAX_SCB_WAIT; i++) {
-- if (!readb(&bdp->scb->scb_cmd_low))
-- return true;
-- cpu_relax();
-- udelay(1);
-- }
--
-- return false;
--}
--
--/**
-- * e100_wait_exec_simple - issue a command
-- * @bdp: atapter's private data struct
-- * @scb_cmd_low: the command that is to be issued
-- *
-- * This general routine will issue a command to the e100 after waiting for
-- * the previous command to finish.
-- *
-- * Returns:
-- * true if the command was issued to the chip successfully
-- * false if the command was not issued to the chip
-- */
--inline unsigned char
--e100_wait_exec_simple(struct e100_private *bdp, u8 scb_cmd_low)
--{
-- if (!e100_wait_scb(bdp)) {
-- printk(KERN_DEBUG "e100: %s: e100_wait_exec_simple: failed\n",
-- bdp->device->name);
--#ifdef E100_CU_DEBUG
-- printk(KERN_ERR "e100: %s: Last command (%x/%x) "
-- "timeout\n", bdp->device->name,
-- bdp->last_cmd, bdp->last_sub_cmd);
-- printk(KERN_ERR "e100: %s: Current simple command (%x) "
-- "can't be executed\n",
-- bdp->device->name, scb_cmd_low);
--#endif
-- return false;
-- }
-- e100_exec_cmd(bdp, scb_cmd_low);
--#ifdef E100_CU_DEBUG
-- bdp->last_cmd = scb_cmd_low;
-- bdp->last_sub_cmd = 0;
--#endif
-- return true;
--}
--
--void
--e100_exec_cmplx(struct e100_private *bdp, u32 phys_addr, u8 cmd)
--{
-- writel(phys_addr, &(bdp->scb->scb_gen_ptr));
-- readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */
-- e100_exec_cmd(bdp, cmd);
--}
--
--unsigned char
--e100_wait_exec_cmplx(struct e100_private *bdp, u32 phys_addr, u8 cmd, u8 sub_cmd)
--{
-- if (!e100_wait_scb(bdp)) {
--#ifdef E100_CU_DEBUG
-- printk(KERN_ERR "e100: %s: Last command (%x/%x) "
-- "timeout\n", bdp->device->name,
-- bdp->last_cmd, bdp->last_sub_cmd);
-- printk(KERN_ERR "e100: %s: Current complex command "
-- "(%x/%x) can't be executed\n",
-- bdp->device->name, cmd, sub_cmd);
--#endif
-- return false;
-- }
-- e100_exec_cmplx(bdp, phys_addr, cmd);
--#ifdef E100_CU_DEBUG
-- bdp->last_cmd = cmd;
-- bdp->last_sub_cmd = sub_cmd;
--#endif
-- return true;
--}
--
--inline u8
--e100_wait_cus_idle(struct e100_private *bdp)
--{
-- int i;
--
-- /* loop on the scb for a few times */
-- for (i = 0; i < 100; i++) {
-- if (((readw(&(bdp->scb->scb_status)) & SCB_CUS_MASK) !=
-- SCB_CUS_ACTIVE)) {
-- return true;
-- }
-- cpu_relax();
-- }
--
-- for (i = 0; i < E100_MAX_CU_IDLE_WAIT; i++) {
-- if (((readw(&(bdp->scb->scb_status)) & SCB_CUS_MASK) !=
-- SCB_CUS_ACTIVE)) {
-- return true;
-- }
-- cpu_relax();
-- udelay(1);
-- }
--
-- return false;
--}
--
--/**
-- * e100_disable_clear_intr - disable and clear/ack interrupts
-- * @bdp: atapter's private data struct
-- *
-- * This routine disables interrupts at the hardware, by setting
-- * the M (mask) bit in the adapter's CSR SCB command word.
-- * It also clear/ack interrupts.
-- */
--static inline void
--e100_disable_clear_intr(struct e100_private *bdp)
--{
-- u16 intr_status;
-- /* Disable interrupts on our PCI board by setting the mask bit */
-- writeb(SCB_INT_MASK, &bdp->scb->scb_cmd_hi);
-- intr_status = readw(&bdp->scb->scb_status);
-- /* ack and clear intrs */
-- writew(intr_status, &bdp->scb->scb_status);
-- readw(&bdp->scb->scb_status);
--}
--
--/**
-- * e100_set_intr_mask - set interrupts
-- * @bdp: atapter's private data struct
-- *
-- * This routine sets interrupts at the hardware, by resetting
-- * the M (mask) bit in the adapter's CSR SCB command word
-- */
--static inline void
--e100_set_intr_mask(struct e100_private *bdp)
--{
-- writeb(bdp->intr_mask, &bdp->scb->scb_cmd_hi);
-- readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */
--}
--
--static inline void
--e100_trigger_SWI(struct e100_private *bdp)
--{
-- /* Trigger interrupt on our PCI board by asserting SWI bit */
-- writeb(SCB_SOFT_INT, &bdp->scb->scb_cmd_hi);
-- readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */
--}
--
--static int __devinit
--e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
--{
-- static int first_time = true;
-- struct net_device *dev = NULL;
-- struct e100_private *bdp = NULL;
-- int rc = 0;
-- u16 cal_checksum, read_checksum;
--
-- dev = alloc_etherdev(sizeof (struct e100_private));
-- if (dev == NULL) {
-- printk(KERN_ERR "e100: Not able to alloc etherdev struct\n");
-- rc = -ENODEV;
-- goto out;
-- }
--
-- SET_MODULE_OWNER(dev);
--
-- if (first_time) {
-- first_time = false;
-- printk(KERN_NOTICE "%s - version %s\n",
-- e100_full_driver_name, e100_driver_version);
-- printk(KERN_NOTICE "%s\n", e100_copyright);
-- printk(KERN_NOTICE "\n");
-- }
--
-- bdp = dev->priv;
-- bdp->pdev = pcid;
-- bdp->device = dev;
--
-- pci_set_drvdata(pcid, dev);
-- SET_NETDEV_DEV(dev, &pcid->dev);
--
-- bdp->flags = 0;
-- bdp->ifs_state = 0;
-- bdp->ifs_value = 0;
-- bdp->scb = 0;
--
-- init_timer(&bdp->nontx_timer_id);
-- bdp->nontx_timer_id.data = (unsigned long) bdp;
-- bdp->nontx_timer_id.function = (void *) &e100_non_tx_background;
-- INIT_LIST_HEAD(&(bdp->non_tx_cmd_list));
-- bdp->non_tx_command_state = E100_NON_TX_IDLE;
--
-- init_timer(&bdp->watchdog_timer);
-- bdp->watchdog_timer.data = (unsigned long) dev;
-- bdp->watchdog_timer.function = (void *) &e100_watchdog;
--
-- if ((rc = e100_pci_setup(pcid, bdp)) != 0) {
-- goto err_dev;
-- }
--
-- if ((rc = e100_alloc_space(bdp)) != 0) {
-- goto err_pci;
-- }
--
-- if (((bdp->pdev->device > 0x1030)
-- && (bdp->pdev->device < 0x103F))
-- || ((bdp->pdev->device >= 0x1050)
-- && (bdp->pdev->device <= 0x1057))
-- || (bdp->pdev->device == 0x2449)
-- || (bdp->pdev->device == 0x2459)
-- || (bdp->pdev->device == 0x245D)) {
-- bdp->rev_id = D101MA_REV_ID; /* workaround for ICH3 */
-- bdp->flags |= IS_ICH;
-- }
--
-- if (bdp->rev_id == 0xff)
-- bdp->rev_id = 1;
--
-- if ((u8) bdp->rev_id >= D101A4_REV_ID)
-- bdp->flags |= IS_BACHELOR;
--
-- if ((u8) bdp->rev_id >= D102_REV_ID) {
-- bdp->flags |= USE_IPCB;
-- bdp->rfd_size = 32;
-- } else {
-- bdp->rfd_size = 16;
-- }
--
-- dev->vlan_rx_register = e100_vlan_rx_register;
-- dev->vlan_rx_add_vid = e100_vlan_rx_add_vid;
-- dev->vlan_rx_kill_vid = e100_vlan_rx_kill_vid;
-- dev->irq = pcid->irq;
-- dev->open = &e100_open;
-- dev->hard_start_xmit = &e100_xmit_frame;
-- dev->stop = &e100_close;
-- dev->change_mtu = &e100_change_mtu;
-- dev->get_stats = &e100_get_stats;
-- dev->set_multicast_list = &e100_set_multi;
-- dev->set_mac_address = &e100_set_mac;
-- dev->do_ioctl = &e100_ioctl;
--
-- if (bdp->flags & USE_IPCB)
-- dev->features = NETIF_F_SG | NETIF_F_IP_CSUM |
-- NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
--
-- if ((rc = register_netdev(dev)) != 0) {
-- goto err_dealloc;
-- }
--
-- e100_check_options(e100nics, bdp);
--
-- if (!e100_init(bdp)) {
-- printk(KERN_ERR "e100: Failed to initialize, instance #%d\n",
-- e100nics);
-- rc = -ENODEV;
-- goto err_unregister_netdev;
-- }
--
-- /* Check if checksum is valid */
-- cal_checksum = e100_eeprom_calculate_chksum(bdp);
-- read_checksum = e100_eeprom_read(bdp, (bdp->eeprom_size - 1));
-- if (cal_checksum != read_checksum) {
-- printk(KERN_ERR "e100: Corrupted EEPROM on instance #%d\n",
-- e100nics);
-- rc = -ENODEV;
-- goto err_unregister_netdev;
-- }
--
-- e100nics++;
--
-- e100_get_speed_duplex_caps(bdp);
--
-- printk(KERN_NOTICE
-- "e100: %s: %s\n",
-- bdp->device->name, "Intel(R) PRO/100 Network Connection");
-- e100_print_brd_conf(bdp);
--
-- bdp->wolsupported = 0;
-- bdp->wolopts = 0;
-- if (bdp->rev_id >= D101A4_REV_ID)
-- bdp->wolsupported = WAKE_PHY | WAKE_MAGIC;
-- if (bdp->rev_id >= D101MA_REV_ID)
-- bdp->wolsupported |= WAKE_UCAST | WAKE_ARP;
--
-- /* Check if WoL is enabled on EEPROM */
-- if (e100_eeprom_read(bdp, EEPROM_ID_WORD) & BIT_5) {
-- /* Magic Packet WoL is enabled on device by default */
-- /* if EEPROM WoL bit is TRUE */
-- bdp->wolopts = WAKE_MAGIC;
-- }
--
-- printk(KERN_NOTICE "\n");
--
-- goto out;
--
--err_unregister_netdev:
-- unregister_netdev(dev);
--err_dealloc:
-- e100_dealloc_space(bdp);
--err_pci:
-- iounmap(bdp->scb);
-- pci_release_regions(pcid);
-- pci_disable_device(pcid);
--err_dev:
-- pci_set_drvdata(pcid, NULL);
-- kfree(dev);
--out:
-- return rc;
--}
--
--/**
-- * e100_clear_structs - free resources
-- * @dev: adapter's net_device struct
-- *
-- * Free all device specific structs, unmap i/o address, etc.
-- */
--static void __devexit
--e100_clear_structs(struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
--
-- iounmap(bdp->scb);
-- pci_release_regions(bdp->pdev);
-- pci_disable_device(bdp->pdev);
--
-- e100_dealloc_space(bdp);
-- pci_set_drvdata(bdp->pdev, NULL);
-- free_netdev(dev);
--}
--
--static void __devexit
--e100_remove1(struct pci_dev *pcid)
--{
-- struct net_device *dev;
-- struct e100_private *bdp;
--
-- if (!(dev = (struct net_device *) pci_get_drvdata(pcid)))
-- return;
--
-- bdp = dev->priv;
--
-- unregister_netdev(dev);
--
-- e100_sw_reset(bdp, PORT_SELECTIVE_RESET);
--
-- if (bdp->non_tx_command_state != E100_NON_TX_IDLE) {
-- del_timer_sync(&bdp->nontx_timer_id);
-- e100_free_nontx_list(bdp);
-- bdp->non_tx_command_state = E100_NON_TX_IDLE;
-- }
--
-- e100_clear_structs(dev);
--
-- --e100nics;
--}
--
--static struct pci_device_id e100_id_table[] = {
-- {0x8086, 0x1229, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x2449, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1059, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1209, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1029, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1030, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1031, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1032, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1033, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1034, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1038, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1039, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x103A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x103B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x103C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x103D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x103E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1051, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1052, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1054, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x1055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x2459, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0x8086, 0x245D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-- {0,} /* This has to be the last entry*/
--};
--MODULE_DEVICE_TABLE(pci, e100_id_table);
--
--static struct pci_driver e100_driver = {
-- .name = "e100",
-- .id_table = e100_id_table,
-- .probe = e100_found1,
-- .remove = __devexit_p(e100_remove1),
--#ifdef CONFIG_PM
-- .suspend = e100_suspend,
-- .resume = e100_resume,
--#endif
--};
--
--static int __init
--e100_init_module(void)
--{
-- int ret;
-- ret = pci_module_init(&e100_driver);
--
-- if(ret >= 0) {
--#ifdef CONFIG_PM
-- register_reboot_notifier(&e100_notifier_reboot);
--#endif
-- }
--
-- return ret;
--}
--
--static void __exit
--e100_cleanup_module(void)
--{
--#ifdef CONFIG_PM
-- unregister_reboot_notifier(&e100_notifier_reboot);
--#endif
--
-- pci_unregister_driver(&e100_driver);
--}
--
--module_init(e100_init_module);
--module_exit(e100_cleanup_module);
--
--/**
-- * e100_check_options - check command line options
-- * @board: board number
-- * @bdp: atapter's private data struct
-- *
-- * This routine does range checking on command-line options
-- */
--void __devinit
--e100_check_options(int board, struct e100_private *bdp)
--{
-- if (board >= E100_MAX_NIC) {
-- printk(KERN_NOTICE
-- "e100: No configuration available for board #%d\n",
-- board);
-- printk(KERN_NOTICE "e100: Using defaults for all values\n");
-- board = E100_MAX_NIC;
-- }
--
-- e100_set_int_option(&(bdp->params.TxDescriptors), TxDescriptors[board],
-- E100_MIN_TCB, E100_MAX_TCB, E100_DEFAULT_TCB,
-- "TxDescriptor count");
--
-- e100_set_int_option(&(bdp->params.RxDescriptors), RxDescriptors[board],
-- E100_MIN_RFD, E100_MAX_RFD, E100_DEFAULT_RFD,
-- "RxDescriptor count");
--
-- e100_set_int_option(&(bdp->params.e100_speed_duplex),
-- e100_speed_duplex[board], 0, 4,
-- E100_DEFAULT_SPEED_DUPLEX, "speed/duplex mode");
--
-- e100_set_int_option(&(bdp->params.ber), ber[board], 0, ZLOCK_MAX_ERRORS,
-- E100_DEFAULT_BER, "Bit Error Rate count");
--
-- e100_set_bool_option(bdp, XsumRX[board], PRM_XSUMRX, E100_DEFAULT_XSUM,
-- "XsumRX value");
--
-- /* Default ucode value depended on controller revision */
-- if (bdp->rev_id >= D101MA_REV_ID) {
-- e100_set_bool_option(bdp, ucode[board], PRM_UCODE,
-- E100_DEFAULT_UCODE, "ucode value");
-- } else {
-- e100_set_bool_option(bdp, ucode[board], PRM_UCODE, false,
-- "ucode value");
-- }
--
-- e100_set_bool_option(bdp, flow_control[board], PRM_FC, E100_DEFAULT_FC,
-- "flow control value");
--
-- e100_set_bool_option(bdp, IFS[board], PRM_IFS, E100_DEFAULT_IFS,
-- "IFS value");
--
-- e100_set_bool_option(bdp, BundleSmallFr[board], PRM_BUNDLE_SMALL,
-- E100_DEFAULT_BUNDLE_SMALL_FR,
-- "CPU saver bundle small frames value");
--
-- e100_set_int_option(&(bdp->params.IntDelay), IntDelay[board], 0x0,
-- 0xFFFF, E100_DEFAULT_CPUSAVER_INTERRUPT_DELAY,
-- "CPU saver interrupt delay value");
--
-- e100_set_int_option(&(bdp->params.BundleMax), BundleMax[board], 0x1,
-- 0xFFFF, E100_DEFAULT_CPUSAVER_BUNDLE_MAX,
-- "CPU saver bundle max value");
--
--}
--
--/**
-- * e100_set_int_option - check and set an integer option
-- * @option: a pointer to the relevant option field
-- * @val: the value specified
-- * @min: the minimum valid value
-- * @max: the maximum valid value
-- * @default_val: the default value
-- * @name: the name of the option
-- *
-- * This routine does range checking on a command-line option.
-- * If the option's value is '-1' use the specified default.
-- * Otherwise, if the value is invalid, change it to the default.
-- */
--void __devinit
--e100_set_int_option(int *option, int val, int min, int max, int default_val,
-- char *name)
--{
-- if (val == -1) { /* no value specified. use default */
-- *option = default_val;
--
-- } else if ((val < min) || (val > max)) {
-- printk(KERN_NOTICE
-- "e100: Invalid %s specified (%i). "
-- "Valid range is %i-%i\n",
-- name, val, min, max);
-- printk(KERN_NOTICE "e100: Using default %s of %i\n", name,
-- default_val);
-- *option = default_val;
-- } else {
-- printk(KERN_INFO "e100: Using specified %s of %i\n", name, val);
-- *option = val;
-- }
--}
--
--/**
-- * e100_set_bool_option - check and set a boolean option
-- * @bdp: atapter's private data struct
-- * @val: the value specified
-- * @mask: the mask for the relevant option
-- * @default_val: the default value
-- * @name: the name of the option
-- *
-- * This routine checks a boolean command-line option.
-- * If the option's value is '-1' use the specified default.
-- * Otherwise, if the value is invalid (not 0 or 1),
-- * change it to the default.
-- */
--void __devinit
--e100_set_bool_option(struct e100_private *bdp, int val, u32 mask,
-- int default_val, char *name)
--{
-- if (val == -1) {
-- if (default_val)
-- bdp->params.b_params |= mask;
--
-- } else if ((val != true) && (val != false)) {
-- printk(KERN_NOTICE
-- "e100: Invalid %s specified (%i). "
-- "Valid values are %i/%i\n",
-- name, val, false, true);
-- printk(KERN_NOTICE "e100: Using default %s of %i\n", name,
-- default_val);
--
-- if (default_val)
-- bdp->params.b_params |= mask;
-- } else {
-- printk(KERN_INFO "e100: Using specified %s of %i\n", name, val);
-- if (val)
-- bdp->params.b_params |= mask;
-- }
--}
--
--int
--e100_open(struct net_device *dev)
--{
-- struct e100_private *bdp;
-- int rc = 0;
--
-- bdp = dev->priv;
--
-- /* setup the tcb pool */
-- if (!e100_alloc_tcb_pool(bdp)) {
-- rc = -ENOMEM;
-- goto err_exit;
-- }
-- bdp->last_tcb = NULL;
--
-- bdp->tcb_pool.head = 0;
-- bdp->tcb_pool.tail = 1;
--
-- e100_setup_tcb_pool((tcb_t *) bdp->tcb_pool.data,
-- bdp->params.TxDescriptors, bdp);
--
-- if (!e100_alloc_rfd_pool(bdp)) {
-- rc = -ENOMEM;
-- goto err_exit;
-- }
--
-- if (!e100_wait_exec_cmplx(bdp, 0, SCB_CUC_LOAD_BASE, 0)) {
-- rc = -EAGAIN;
-- goto err_exit;
-- }
--
-- if (!e100_wait_exec_cmplx(bdp, 0, SCB_RUC_LOAD_BASE, 0)) {
-- rc = -EAGAIN;
-- goto err_exit;
-- }
--
-- mod_timer(&(bdp->watchdog_timer), jiffies + (2 * HZ));
--
-- if (dev->flags & IFF_UP)
-- /* Otherwise process may sleep forever */
-- netif_wake_queue(dev);
-- else
-- netif_start_queue(dev);
--
-- e100_start_ru(bdp);
-- if ((rc = request_irq(dev->irq, &e100intr, SA_SHIRQ,
-- dev->name, dev)) != 0) {
-- del_timer_sync(&bdp->watchdog_timer);
-- goto err_exit;
-- }
-- bdp->intr_mask = 0;
-- e100_set_intr_mask(bdp);
--
-- e100_force_config(bdp);
--
-- goto exit;
--
--err_exit:
-- e100_clear_pools(bdp);
--exit:
-- return rc;
--}
--
--int
--e100_close(struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
--
-- e100_disable_clear_intr(bdp);
-- free_irq(dev->irq, dev);
-- bdp->intr_mask = SCB_INT_MASK;
-- e100_isolate_driver(bdp);
--
-- netif_carrier_off(bdp->device);
-- bdp->cur_line_speed = 0;
-- bdp->cur_dplx_mode = 0;
-- e100_clear_pools(bdp);
--
-- return 0;
--}
--
--static int
--e100_change_mtu(struct net_device *dev, int new_mtu)
--{
-- if ((new_mtu < 68) || (new_mtu > (ETH_DATA_LEN + VLAN_SIZE)))
-- return -EINVAL;
--
-- dev->mtu = new_mtu;
-- return 0;
--}
--
--static int
--e100_xmit_frame(struct sk_buff *skb, struct net_device *dev)
--{
-- int rc = 0;
-- int notify_stop = false;
-- struct e100_private *bdp = dev->priv;
--
-- if (!spin_trylock(&bdp->bd_non_tx_lock)) {
-- notify_stop = true;
-- rc = 1;
-- goto exit2;
-- }
--
-- /* tcb list may be empty temporarily during releasing resources */
-- if (!TCBS_AVAIL(bdp->tcb_pool) || (bdp->tcb_phys == 0) ||
-- (bdp->non_tx_command_state != E100_NON_TX_IDLE)) {
-- notify_stop = true;
-- rc = 1;
-- goto exit1;
-- }
--
-- bdp->drv_stats.net_stats.tx_bytes += skb->len;
--
-- e100_prepare_xmit_buff(bdp, skb);
--
-- dev->trans_start = jiffies;
--
--exit1:
-- spin_unlock(&bdp->bd_non_tx_lock);
--exit2:
-- if (notify_stop) {
-- netif_stop_queue(dev);
-- }
--
-- return rc;
--}
--
--/**
-- * e100_get_stats - get driver statistics
-- * @dev: adapter's net_device struct
-- *
-- * This routine is called when the OS wants the adapter's stats returned.
-- * It returns the address of the net_device_stats stucture for the device.
-- * If the statistics are currently being updated, then they might be incorrect
-- * for a short while. However, since this cannot actually cause damage, no
-- * locking is used.
-- */
--struct net_device_stats *
--e100_get_stats(struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
--
-- bdp->drv_stats.net_stats.tx_errors =
-- bdp->drv_stats.net_stats.tx_carrier_errors +
-- bdp->drv_stats.net_stats.tx_aborted_errors;
--
-- bdp->drv_stats.net_stats.rx_errors =
-- bdp->drv_stats.net_stats.rx_crc_errors +
-- bdp->drv_stats.net_stats.rx_frame_errors +
-- bdp->drv_stats.net_stats.rx_length_errors +
-- bdp->drv_stats.rcv_cdt_frames;
--
-- return &(bdp->drv_stats.net_stats);
--}
--
--/**
-- * e100_set_mac - set the MAC address
-- * @dev: adapter's net_device struct
-- * @addr: the new address
-- *
-- * This routine sets the ethernet address of the board
-- * Returns:
-- * 0 - if successful
-- * -1 - otherwise
-- */
--static int
--e100_set_mac(struct net_device *dev, void *addr)
--{
-- struct e100_private *bdp;
-- int rc = -1;
-- struct sockaddr *p_sockaddr = (struct sockaddr *) addr;
--
-- if (!is_valid_ether_addr(p_sockaddr->sa_data))
-- return -EADDRNOTAVAIL;
-- bdp = dev->priv;
--
-- if (e100_setup_iaaddr(bdp, (u8 *) (p_sockaddr->sa_data))) {
-- memcpy(&(dev->dev_addr[0]), p_sockaddr->sa_data, ETH_ALEN);
-- rc = 0;
-- }
--
-- return rc;
--}
--
--static void
--e100_set_multi_exec(struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
-- mltcst_cb_t *mcast_buff;
-- cb_header_t *cb_hdr;
-- struct dev_mc_list *mc_list;
-- unsigned int i;
-- nxmit_cb_entry_t *cmd = e100_alloc_non_tx_cmd(bdp);
--
-- if (cmd != NULL) {
-- mcast_buff = &((cmd->non_tx_cmd)->ntcb.multicast);
-- cb_hdr = &((cmd->non_tx_cmd)->ntcb.multicast.mc_cbhdr);
-- } else {
-- return;
-- }
--
-- /* initialize the multi cast command */
-- cb_hdr->cb_cmd = __constant_cpu_to_le16(CB_MULTICAST);
--
-- /* now fill in the rest of the multicast command */
-- *(u16 *) (&(mcast_buff->mc_count)) = cpu_to_le16(dev->mc_count * 6);
-- for (i = 0, mc_list = dev->mc_list;
-- (i < dev->mc_count) && (i < MAX_MULTICAST_ADDRS);
-- i++, mc_list = mc_list->next) {
-- /* copy into the command */
-- memcpy(&(mcast_buff->mc_addr[i * ETH_ALEN]),
-- (u8 *) &(mc_list->dmi_addr), ETH_ALEN);
-- }
--
-- if (!e100_exec_non_cu_cmd(bdp, cmd)) {
-- printk(KERN_WARNING "e100: %s: Multicast setup failed\n",
-- dev->name);
-- }
--}
--
--/**
-- * e100_set_multi - set multicast status
-- * @dev: adapter's net_device struct
-- *
-- * This routine is called to add or remove multicast addresses, and/or to
-- * change the adapter's promiscuous state.
-- */
--static void
--e100_set_multi(struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
-- unsigned char promisc_enbl;
-- unsigned char mulcast_enbl;
--
-- promisc_enbl = ((dev->flags & IFF_PROMISC) == IFF_PROMISC);
-- mulcast_enbl = ((dev->flags & IFF_ALLMULTI) ||
-- (dev->mc_count > MAX_MULTICAST_ADDRS));
--
-- e100_config_promisc(bdp, promisc_enbl);
-- e100_config_mulcast_enbl(bdp, mulcast_enbl);
--
-- /* reconfigure the chip if something has changed in its config space */
-- e100_config(bdp);
--
-- if (promisc_enbl || mulcast_enbl) {
-- return; /* no need for Multicast Cmd */
-- }
--
-- /* get the multicast CB */
-- e100_set_multi_exec(dev);
--}
--
--static int
--e100_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
--{
--
-- switch (cmd) {
--
-- case SIOCETHTOOL:
-- return e100_do_ethtool_ioctl(dev, ifr);
-- break;
--
-- case SIOCGMIIPHY: /* Get address of MII PHY in use. */
-- case SIOCGMIIREG: /* Read MII PHY register. */
-- case SIOCSMIIREG: /* Write to MII PHY register. */
-- return e100_mii_ioctl(dev, ifr, cmd);
-- break;
--
-- default:
-- return -EOPNOTSUPP;
-- }
-- return 0;
--
--}
--
--/**
-- * e100init - initialize the adapter
-- * @bdp: atapter's private data struct
-- *
-- * This routine is called when this driver is loaded. This is the initialization
-- * routine which allocates memory, configures the adapter and determines the
-- * system resources.
-- *
-- * Returns:
-- * true: if successful
-- * false: otherwise
-- */
--static unsigned char __devinit
--e100_init(struct e100_private *bdp)
--{
-- u32 st_timeout = 0;
-- u32 st_result = 0;
-- e100_sw_init(bdp);
--
-- if (!e100_selftest(bdp, &st_timeout, &st_result)) {
-- if (st_timeout) {
-- printk(KERN_ERR "e100: selftest timeout\n");
-- } else {
-- printk(KERN_ERR "e100: selftest failed. Results: %x\n",
-- st_result);
-- }
-- return false;
-- }
-- else
-- printk(KERN_DEBUG "e100: selftest OK.\n");
--
-- /* read the MAC address from the eprom */
-- e100_rd_eaddr(bdp);
-- if (!is_valid_ether_addr(bdp->device->dev_addr)) {
-- printk(KERN_ERR "e100: Invalid Ethernet address\n");
-- return false;
-- }
-- /* read NIC's part number */
-- e100_rd_pwa_no(bdp);
--
-- if (!e100_hw_init(bdp))
-- return false;
-- /* Interrupts are enabled after device reset */
-- e100_disable_clear_intr(bdp);
--
-- return true;
--}
--
--/**
-- * e100_sw_init - initialize software structs
-- * @bdp: atapter's private data struct
-- *
-- * This routine initializes all software structures. Sets up the
-- * circular structures for the RFD's & TCB's. Allocates the per board
-- * structure for storing adapter information. The CSR is also memory
-- * mapped in this routine.
-- *
-- * Returns :
-- * true: if S/W was successfully initialized
-- * false: otherwise
-- */
--static unsigned char __devinit
--e100_sw_init(struct e100_private *bdp)
--{
-- bdp->next_cu_cmd = START_WAIT; // init the next cu state
--
-- /*
-- * Set the value for # of good xmits per underrun. the value assigned
-- * here is an intelligent suggested default. Nothing magical about it.
-- */
-- bdp->tx_per_underrun = DEFAULT_TX_PER_UNDERRUN;
--
-- /* get the default transmit threshold value */
-- bdp->tx_thld = TX_THRSHLD;
--
-- /* get the EPROM size */
-- bdp->eeprom_size = e100_eeprom_size(bdp);
--
-- /* Initialize our spinlocks */
-- spin_lock_init(&(bdp->bd_lock));
-- spin_lock_init(&(bdp->bd_non_tx_lock));
-- spin_lock_init(&(bdp->config_lock));
-- spin_lock_init(&(bdp->mdi_access_lock));
-- /* Initialize configuration data */
-- e100_config_init(bdp);
--
-- return 1;
--}
--
--static void __devinit
--e100_tco_workaround(struct e100_private *bdp)
--{
-- int i;
--
-- /* Do software reset */
-- e100_sw_reset(bdp, PORT_SOFTWARE_RESET);
--
-- /* Do a dummy LOAD CU BASE command. */
-- /* This gets us out of pre-driver to post-driver. */
-- e100_exec_cmplx(bdp, 0, SCB_CUC_LOAD_BASE);
--
-- /* Wait 20 msec for reset to take effect */
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ / 50 + 1);
--
-- /* disable interrupts since they are enabled */
-- /* after device reset */
-- e100_disable_clear_intr(bdp);
--
-- /* Wait for command to be cleared up to 1 sec */
-- for (i=0; i<100; i++) {
-- if (!readb(&bdp->scb->scb_cmd_low))
-- break;
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ / 100 + 1);
-- }
--
-- /* Wait for TCO request bit in PMDR register to be clear */
-- for (i=0; i<50; i++) {
-- if (!(readb(&bdp->scb->scb_ext.d101m_scb.scb_pmdr) & BIT_1))
-- break;
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ / 100 + 1);
-- }
--}
--
--/**
-- * e100_hw_init - initialized tthe hardware
-- * @bdp: atapter's private data struct
-- *
-- * This routine performs a reset on the adapter, and configures the adapter.
-- * This includes configuring the 82557 LAN controller, validating and setting
-- * the node address, detecting and configuring the Phy chip on the adapter,
-- * and initializing all of the on chip counters.
-- *
-- * Returns:
-- * true - If the adapter was initialized
-- * false - If the adapter failed initialization
-- */
--unsigned char
--e100_hw_init(struct e100_private *bdp)
--{
-- if (!e100_phy_init(bdp))
-- goto err;
--
-- e100_sw_reset(bdp, PORT_SELECTIVE_RESET);
--
-- /* Only 82559 or above needs TCO workaround */
-- if (bdp->rev_id >= D101MA_REV_ID)
-- e100_tco_workaround(bdp);
--
-- /* Load the CU BASE (set to 0, because we use linear mode) */
-- if (!e100_wait_exec_cmplx(bdp, 0, SCB_CUC_LOAD_BASE, 0))
-- goto err;
--
-- if (!e100_wait_exec_cmplx(bdp, 0, SCB_RUC_LOAD_BASE, 0))
-- goto err;
--
-- /* Load interrupt microcode */
-- if (e100_load_microcode(bdp)) {
-- bdp->flags |= DF_UCODE_LOADED;
-- }
--
-- if ((u8) bdp->rev_id < D101A4_REV_ID)
-- e100_config_init_82557(bdp);
--
-- if (!e100_config(bdp))
-- goto err;
--
-- if (!e100_setup_iaaddr(bdp, bdp->device->dev_addr))
-- goto err;
--
-- /* Clear the internal counters */
-- if (!e100_clr_cntrs(bdp))
-- goto err;
--
-- /* Change for 82558 enhancement */
-- /* If 82558/9 and if the user has enabled flow control, set up the
-- * Flow Control Reg. in the CSR */
-- if ((bdp->flags & IS_BACHELOR)
-- && (bdp->params.b_params & PRM_FC)) {
-- writeb(DFLT_FC_THLD, &bdp->scb->scb_ext.d101_scb.scb_fc_thld);
-- writeb(DFLT_FC_CMD,
-- &bdp->scb->scb_ext.d101_scb.scb_fc_xon_xoff);
-- }
--
-- return true;
--err:
-- printk(KERN_ERR "e100: hw init failed\n");
-- return false;
--}
--
--/**
-- * e100_setup_tcb_pool - setup TCB circular list
-- * @head: Pointer to head of the allocated TCBs
-- * @qlen: Number of elements in the queue
-- * @bdp: atapter's private data struct
-- *
-- * This routine arranges the contigiously allocated TCB's in a circular list.
-- * Also does the one time initialization of the TCBs.
-- */
--static void
--e100_setup_tcb_pool(tcb_t *head, unsigned int qlen, struct e100_private *bdp)
--{
-- int ele_no;
-- tcb_t *pcurr_tcb; /* point to current tcb */
-- u32 next_phys; /* the next phys addr */
-- u16 txcommand = CB_S_BIT | CB_TX_SF_BIT;
--
-- bdp->tx_count = 0;
-- if (bdp->flags & USE_IPCB) {
-- txcommand |= CB_IPCB_TRANSMIT | CB_CID_DEFAULT;
-- } else if (bdp->flags & IS_BACHELOR) {
-- txcommand |= CB_TRANSMIT | CB_CID_DEFAULT;
-- } else {
-- txcommand |= CB_TRANSMIT;
-- }
--
-- for (ele_no = 0, next_phys = bdp->tcb_phys, pcurr_tcb = head;
-- ele_no < qlen; ele_no++, pcurr_tcb++) {
--
-- /* set the phys addr for this TCB, next_phys has not incr. yet */
-- pcurr_tcb->tcb_phys = next_phys;
-- next_phys += sizeof (tcb_t);
--
-- /* set the link to next tcb */
-- if (ele_no == (qlen - 1))
-- pcurr_tcb->tcb_hdr.cb_lnk_ptr =
-- cpu_to_le32(bdp->tcb_phys);
-- else
-- pcurr_tcb->tcb_hdr.cb_lnk_ptr = cpu_to_le32(next_phys);
--
-- pcurr_tcb->tcb_hdr.cb_status = 0;
-- pcurr_tcb->tcb_hdr.cb_cmd = cpu_to_le16(txcommand);
-- pcurr_tcb->tcb_cnt = 0;
-- pcurr_tcb->tcb_thrshld = bdp->tx_thld;
-- if (ele_no < 2) {
-- pcurr_tcb->tcb_hdr.cb_status =
-- cpu_to_le16(CB_STATUS_COMPLETE);
-- }
-- pcurr_tcb->tcb_tbd_num = 1;
--
-- if (bdp->flags & IS_BACHELOR) {
-- pcurr_tcb->tcb_tbd_ptr =
-- __constant_cpu_to_le32(0xFFFFFFFF);
-- } else {
-- pcurr_tcb->tcb_tbd_ptr =
-- cpu_to_le32(pcurr_tcb->tcb_phys + 0x10);
-- }
--
-- if (bdp->flags & IS_BACHELOR) {
-- pcurr_tcb->tcb_tbd_expand_ptr =
-- cpu_to_le32(pcurr_tcb->tcb_phys + 0x20);
-- } else {
-- pcurr_tcb->tcb_tbd_expand_ptr =
-- cpu_to_le32(pcurr_tcb->tcb_phys + 0x10);
-- }
-- pcurr_tcb->tcb_tbd_dflt_ptr = pcurr_tcb->tcb_tbd_ptr;
--
-- if (bdp->flags & USE_IPCB) {
-- pcurr_tcb->tbd_ptr = &(pcurr_tcb->tcbu.tbd_array[1]);
-- pcurr_tcb->tcbu.ipcb.ip_activation_high =
-- IPCB_IP_ACTIVATION_DEFAULT;
-- pcurr_tcb->tcbu.ipcb.vlan = 0;
-- } else {
-- pcurr_tcb->tbd_ptr = &(pcurr_tcb->tcbu.tbd_array[0]);
-- }
--
-- pcurr_tcb->tcb_skb = NULL;
-- }
--
-- wmb();
--}
--
--/***************************************************************************/
--/***************************************************************************/
--/* Memory Management Routines */
--/***************************************************************************/
--
--/**
-- * e100_alloc_space - allocate private driver data
-- * @bdp: atapter's private data struct
-- *
-- * This routine allocates memory for the driver. Memory allocated is for the
-- * selftest and statistics structures.
-- *
-- * Returns:
-- * 0: if the operation was successful
-- * %-ENOMEM: if memory allocation failed
-- */
--unsigned char __devinit
--e100_alloc_space(struct e100_private *bdp)
--{
-- unsigned long off;
--
-- /* allocate all the dma-able structures in one call:
-- * selftest results, adapter stats, and non-tx cb commands */
-- if (!(bdp->dma_able =
-- pci_alloc_consistent(bdp->pdev, sizeof (bd_dma_able_t),
-- &(bdp->dma_able_phys)))) {
-- goto err;
-- }
--
-- /* now assign the various pointers into the struct we've just allocated */
-- off = offsetof(bd_dma_able_t, selftest);
--
-- bdp->selftest = (self_test_t *) (bdp->dma_able + off);
-- bdp->selftest_phys = bdp->dma_able_phys + off;
--
-- off = offsetof(bd_dma_able_t, stats_counters);
--
-- bdp->stats_counters = (max_counters_t *) (bdp->dma_able + off);
-- bdp->stat_cnt_phys = bdp->dma_able_phys + off;
--
-- return 0;
--
--err:
-- printk(KERN_ERR
-- "e100: Failed to allocate memory\n");
-- return -ENOMEM;
--}
--
--/**
-- * e100_alloc_tcb_pool - allocate TCB circular list
-- * @bdp: atapter's private data struct
-- *
-- * This routine allocates memory for the circular list of transmit descriptors.
-- *
-- * Returns:
-- * 0: if allocation has failed.
-- * 1: Otherwise.
-- */
--int
--e100_alloc_tcb_pool(struct e100_private *bdp)
--{
-- int stcb = sizeof (tcb_t) * bdp->params.TxDescriptors;
--
-- /* allocate space for the TCBs */
-- if (!(bdp->tcb_pool.data =
-- pci_alloc_consistent(bdp->pdev, stcb, &bdp->tcb_phys)))
-- return 0;
--
-- memset(bdp->tcb_pool.data, 0x00, stcb);
--
-- return 1;
--}
--
--void
--e100_free_tcb_pool(struct e100_private *bdp)
--{
-- tcb_t *tcb;
-- int i;
-- /* Return tx skbs */
-- for (i = 0; i < bdp->params.TxDescriptors; i++) {
-- tcb = bdp->tcb_pool.data;
-- tcb += bdp->tcb_pool.head;
-- e100_tx_skb_free(bdp, tcb);
-- if (NEXT_TCB_TOUSE(bdp->tcb_pool.head) == bdp->tcb_pool.tail)
-- break;
-- bdp->tcb_pool.head = NEXT_TCB_TOUSE(bdp->tcb_pool.head);
-- }
-- pci_free_consistent(bdp->pdev,
-- sizeof (tcb_t) * bdp->params.TxDescriptors,
-- bdp->tcb_pool.data, bdp->tcb_phys);
-- bdp->tcb_pool.head = 0;
-- bdp->tcb_pool.tail = 1;
-- bdp->tcb_phys = 0;
--}
--
--static void
--e100_dealloc_space(struct e100_private *bdp)
--{
-- if (bdp->dma_able) {
-- pci_free_consistent(bdp->pdev, sizeof (bd_dma_able_t),
-- bdp->dma_able, bdp->dma_able_phys);
-- }
--
-- bdp->selftest_phys = 0;
-- bdp->stat_cnt_phys = 0;
-- bdp->dma_able_phys = 0;
-- bdp->dma_able = 0;
--}
--
--static void
--e100_free_rfd_pool(struct e100_private *bdp)
--{
-- struct rx_list_elem *rx_struct;
--
-- while (!list_empty(&(bdp->active_rx_list))) {
--
-- rx_struct = list_entry(bdp->active_rx_list.next,
-- struct rx_list_elem, list_elem);
-- list_del(&(rx_struct->list_elem));
-- pci_unmap_single(bdp->pdev, rx_struct->dma_addr,
-- sizeof (rfd_t), PCI_DMA_TODEVICE);
-- dev_kfree_skb(rx_struct->skb);
-- kfree(rx_struct);
-- }
--
-- while (!list_empty(&(bdp->rx_struct_pool))) {
-- rx_struct = list_entry(bdp->rx_struct_pool.next,
-- struct rx_list_elem, list_elem);
-- list_del(&(rx_struct->list_elem));
-- kfree(rx_struct);
-- }
--}
--
--/**
-- * e100_alloc_rfd_pool - allocate RFDs
-- * @bdp: atapter's private data struct
-- *
-- * Allocates initial pool of skb which holds both rfd and data,
-- * and return a pointer to the head of the list
-- */
--static int
--e100_alloc_rfd_pool(struct e100_private *bdp)
--{
-- struct rx_list_elem *rx_struct;
-- int i;
--
-- INIT_LIST_HEAD(&(bdp->active_rx_list));
-- INIT_LIST_HEAD(&(bdp->rx_struct_pool));
-- bdp->skb_req = bdp->params.RxDescriptors;
-- for (i = 0; i < bdp->skb_req; i++) {
-- rx_struct = kmalloc(sizeof (struct rx_list_elem), GFP_ATOMIC);
-- list_add(&(rx_struct->list_elem), &(bdp->rx_struct_pool));
-- }
-- e100_alloc_skbs(bdp);
-- return !list_empty(&(bdp->active_rx_list));
--
--}
--
--void
--e100_clear_pools(struct e100_private *bdp)
--{
-- bdp->last_tcb = NULL;
-- e100_free_rfd_pool(bdp);
-- e100_free_tcb_pool(bdp);
--}
--
--/*****************************************************************************/
--/*****************************************************************************/
--/* Run Time Functions */
--/*****************************************************************************/
--
--/**
-- * e100_watchdog
-- * @dev: adapter's net_device struct
-- *
-- * This routine runs every 2 seconds and updates our statitics and link state,
-- * and refreshs txthld value.
-- */
--void
--e100_watchdog(struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
--
--#ifdef E100_CU_DEBUG
-- if (e100_cu_unknown_state(bdp)) {
-- printk(KERN_ERR "e100: %s: CU unknown state in e100_watchdog\n",
-- dev->name);
-- }
--#endif
-- if (!netif_running(dev)) {
-- return;
-- }
--
-- /* check if link state has changed */
-- if (e100_phy_check(bdp)) {
-- if (netif_carrier_ok(dev)) {
-- printk(KERN_ERR
-- "e100: %s NIC Link is Up %d Mbps %s duplex\n",
-- bdp->device->name, bdp->cur_line_speed,
-- (bdp->cur_dplx_mode == HALF_DUPLEX) ?
-- "Half" : "Full");
--
-- e100_config_fc(bdp);
-- e100_config(bdp);
--
-- } else {
-- printk(KERN_ERR "e100: %s NIC Link is Down\n",
-- bdp->device->name);
-- }
-- }
--
-- // toggle the tx queue according to link status
-- // this also resolves a race condition between tx & non-cu cmd flows
-- if (netif_carrier_ok(dev)) {
-- if (netif_running(dev))
-- netif_wake_queue(dev);
-- } else {
-- if (netif_running(dev))
-- netif_stop_queue(dev);
-- /* When changing to non-autoneg, device may lose */
-- /* link with some switches. e100 will try to */
-- /* revover link by sending command to PHY layer */
-- if (bdp->params.e100_speed_duplex != E100_AUTONEG)
-- e100_force_speed_duplex_to_phy(bdp);
-- }
--
-- rmb();
--
-- if (e100_update_stats(bdp)) {
--
-- /* Check if a change in the IFS parameter is needed,
-- and configure the device accordingly */
-- if (bdp->params.b_params & PRM_IFS)
-- e100_manage_adaptive_ifs(bdp);
--
-- /* Now adjust our dynamic tx threshold value */
-- e100_refresh_txthld(bdp);
--
-- /* Now if we are on a 557 and we havn't received any frames then we
-- * should issue a multicast command to reset the RU */
-- if (bdp->rev_id < D101A4_REV_ID) {
-- if (!(bdp->stats_counters->basic_stats.rcv_gd_frames)) {
-- e100_set_multi(dev);
-- }
-- }
-- }
-- /* Issue command to dump statistics from device. */
-- /* Check for command completion on next watchdog timer. */
-- e100_dump_stats_cntrs(bdp);
--
-- wmb();
--
-- /* relaunch watchdog timer in 2 sec */
-- mod_timer(&(bdp->watchdog_timer), jiffies + (2 * HZ));
--
-- if (list_empty(&bdp->active_rx_list))
-- e100_trigger_SWI(bdp);
--}
--
--/**
-- * e100_manage_adaptive_ifs
-- * @bdp: atapter's private data struct
-- *
-- * This routine manages the adaptive Inter-Frame Spacing algorithm
-- * using a state machine.
-- */
--void
--e100_manage_adaptive_ifs(struct e100_private *bdp)
--{
-- static u16 state_table[9][4] = { // rows are states
-- {2, 0, 0, 0}, // state0 // column0: next state if increasing
-- {2, 0, 5, 30}, // state1 // column1: next state if decreasing
-- {5, 1, 5, 30}, // state2 // column2: IFS value for 100 mbit
-- {5, 3, 0, 0}, // state3 // column3: IFS value for 10 mbit
-- {5, 3, 10, 60}, // state4
-- {8, 4, 10, 60}, // state5
-- {8, 6, 0, 0}, // state6
-- {8, 6, 20, 60}, // state7
-- {8, 7, 20, 60} // state8
-- };
--
-- u32 transmits =
-- le32_to_cpu(bdp->stats_counters->basic_stats.xmt_gd_frames);
-- u32 collisions =
-- le32_to_cpu(bdp->stats_counters->basic_stats.xmt_ttl_coll);
-- u32 state = bdp->ifs_state;
-- u32 old_value = bdp->ifs_value;
-- int next_col;
-- u32 min_transmits;
--
-- if (bdp->cur_dplx_mode == FULL_DUPLEX) {
-- bdp->ifs_state = 0;
-- bdp->ifs_value = 0;
--
-- } else { /* Half Duplex */
-- /* Set speed specific parameters */
-- if (bdp->cur_line_speed == 100) {
-- next_col = 2;
-- min_transmits = MIN_NUMBER_OF_TRANSMITS_100;
--
-- } else { /* 10 Mbps */
-- next_col = 3;
-- min_transmits = MIN_NUMBER_OF_TRANSMITS_10;
-- }
--
-- if ((transmits / 32 < collisions)
-- && (transmits > min_transmits)) {
-- state = state_table[state][0]; /* increment */
--
-- } else if (transmits < min_transmits) {
-- state = state_table[state][1]; /* decrement */
-- }
--
-- bdp->ifs_value = state_table[state][next_col];
-- bdp->ifs_state = state;
-- }
--
-- /* If the IFS value has changed, configure the device */
-- if (bdp->ifs_value != old_value) {
-- e100_config_ifs(bdp);
-- e100_config(bdp);
-- }
--}
--
--/**
-- * e100intr - interrupt handler
-- * @irq: the IRQ number
-- * @dev_inst: the net_device struct
-- * @regs: registers (unused)
-- *
-- * This routine is the ISR for the e100 board. It services
-- * the RX & TX queues & starts the RU if it has stopped due
-- * to no resources.
-- */
--irqreturn_t
--e100intr(int irq, void *dev_inst, struct pt_regs *regs)
--{
-- struct net_device *dev;
-- struct e100_private *bdp;
-- u16 intr_status;
--
-- dev = dev_inst;
-- bdp = dev->priv;
--
-- intr_status = readw(&bdp->scb->scb_status);
-- /* If not my interrupt, just return */
-- if (!(intr_status & SCB_STATUS_ACK_MASK) || (intr_status == 0xffff)) {
-- return IRQ_NONE;
-- }
--
-- /* disable and ack intr */
-- e100_disable_clear_intr(bdp);
--
-- /* the device is closed, don't continue or else bad things may happen. */
-- if (!netif_running(dev)) {
-- e100_set_intr_mask(bdp);
-- return IRQ_NONE;
-- }
--
-- /* SWI intr (triggered by watchdog) is signal to allocate new skb buffers */
-- if (intr_status & SCB_STATUS_ACK_SWI) {
-- e100_alloc_skbs(bdp);
-- }
--
-- /* do recv work if any */
-- if (intr_status &
-- (SCB_STATUS_ACK_FR | SCB_STATUS_ACK_RNR | SCB_STATUS_ACK_SWI))
-- bdp->drv_stats.rx_intr_pkts += e100_rx_srv(bdp);
--
-- /* clean up after tx'ed packets */
-- if (intr_status & (SCB_STATUS_ACK_CNA | SCB_STATUS_ACK_CX))
-- e100_tx_srv(bdp);
--
-- e100_set_intr_mask(bdp);
-- return IRQ_HANDLED;
--}
--
--/**
-- * e100_tx_skb_free - free TX skbs resources
-- * @bdp: atapter's private data struct
-- * @tcb: associated tcb of the freed skb
-- *
-- * This routine frees resources of TX skbs.
-- */
--static inline void
--e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb)
--{
-- if (tcb->tcb_skb) {
-- int i;
-- tbd_t *tbd_arr = tcb->tbd_ptr;
-- int frags = skb_shinfo(tcb->tcb_skb)->nr_frags;
--
-- for (i = 0; i <= frags; i++, tbd_arr++) {
-- pci_unmap_single(bdp->pdev,
-- le32_to_cpu(tbd_arr->tbd_buf_addr),
-- le16_to_cpu(tbd_arr->tbd_buf_cnt),
-- PCI_DMA_TODEVICE);
-- }
-- dev_kfree_skb_irq(tcb->tcb_skb);
-- tcb->tcb_skb = NULL;
-- }
--}
--
--/**
-- * e100_tx_srv - service TX queues
-- * @bdp: atapter's private data struct
-- *
-- * This routine services the TX queues. It reclaims the TCB's & TBD's & other
-- * resources used during the transmit of this buffer. It is called from the ISR.
-- * We don't need a tx_lock since we always access buffers which were already
-- * prepared.
-- */
--void
--e100_tx_srv(struct e100_private *bdp)
--{
-- tcb_t *tcb;
-- int i;
--
-- /* go over at most TxDescriptors buffers */
-- for (i = 0; i < bdp->params.TxDescriptors; i++) {
-- tcb = bdp->tcb_pool.data;
-- tcb += bdp->tcb_pool.head;
--
-- rmb();
--
-- /* if the buffer at 'head' is not complete, break */
-- if (!(tcb->tcb_hdr.cb_status &
-- __constant_cpu_to_le16(CB_STATUS_COMPLETE)))
-- break;
--
-- /* service next buffer, clear the out of resource condition */
-- e100_tx_skb_free(bdp, tcb);
--
-- if (netif_running(bdp->device))
-- netif_wake_queue(bdp->device);
--
-- /* if we've caught up with 'tail', break */
-- if (NEXT_TCB_TOUSE(bdp->tcb_pool.head) == bdp->tcb_pool.tail) {
-- break;
-- }
--
-- bdp->tcb_pool.head = NEXT_TCB_TOUSE(bdp->tcb_pool.head);
-- }
--}
--
--/**
-- * e100_rx_srv - service RX queue
-- * @bdp: atapter's private data struct
-- * @max_number_of_rfds: max number of RFDs to process
-- * @rx_congestion: flag pointer, to inform the calling function of congestion.
-- *
-- * This routine processes the RX interrupt & services the RX queues.
-- * For each successful RFD, it allocates a new msg block, links that
-- * into the RFD list, and sends the old msg upstream.
-- * The new RFD is then put at the end of the free list of RFD's.
-- * It returns the number of serviced RFDs.
-- */
--u32
--e100_rx_srv(struct e100_private *bdp)
--{
-- rfd_t *rfd; /* new rfd, received rfd */
-- int i;
-- u16 rfd_status;
-- struct sk_buff *skb;
-- struct net_device *dev;
-- unsigned int data_sz;
-- struct rx_list_elem *rx_struct;
-- u32 rfd_cnt = 0;
--
-- dev = bdp->device;
--
-- /* current design of rx is as following:
-- * 1. socket buffer (skb) used to pass network packet to upper layer
-- * 2. all HW host memory structures (like RFDs, RBDs and data buffers)
-- * are placed in a skb's data room
-- * 3. when rx process is complete, we change skb internal pointers to exclude
-- * from data area all unrelated things (RFD, RDB) and to leave
-- * just rx'ed packet netto
-- * 4. for each skb passed to upper layer, new one is allocated instead.
-- * 5. if no skb left, in 2 sec another atempt to allocate skbs will be made
-- * (watchdog trigger SWI intr and isr should allocate new skbs)
-- */
-- for (i = 0; i < bdp->params.RxDescriptors; i++) {
-- if (list_empty(&(bdp->active_rx_list))) {
-- break;
-- }
--
-- rx_struct = list_entry(bdp->active_rx_list.next,
-- struct rx_list_elem, list_elem);
-- skb = rx_struct->skb;
--
-- rfd = RFD_POINTER(skb, bdp); /* locate RFD within skb */
--
-- // sync only the RFD header
-- pci_dma_sync_single(bdp->pdev, rx_struct->dma_addr,
-- bdp->rfd_size, PCI_DMA_FROMDEVICE);
-- rfd_status = le16_to_cpu(rfd->rfd_header.cb_status); /* get RFD's status */
-- if (!(rfd_status & RFD_STATUS_COMPLETE)) /* does not contains data yet - exit */
-- break;
--
-- /* to allow manipulation with current skb we need to unlink it */
-- list_del(&(rx_struct->list_elem));
--
-- /* do not free & unmap badly received packet.
-- * move it to the end of skb list for reuse */
-- if (!(rfd_status & RFD_STATUS_OK)) {
-- e100_add_skb_to_end(bdp, rx_struct);
-- continue;
-- }
--
-- data_sz = min_t(u16, (le16_to_cpu(rfd->rfd_act_cnt) & 0x3fff),
-- (sizeof (rfd_t) - bdp->rfd_size));
--
-- /* now sync all the data */
-- pci_dma_sync_single(bdp->pdev, rx_struct->dma_addr,
-- (data_sz + bdp->rfd_size),
-- PCI_DMA_FROMDEVICE);
--
-- pci_unmap_single(bdp->pdev, rx_struct->dma_addr,
-- sizeof (rfd_t), PCI_DMA_FROMDEVICE);
--
-- list_add(&(rx_struct->list_elem), &(bdp->rx_struct_pool));
--
-- /* end of dma access to rfd */
-- bdp->skb_req++; /* incr number of requested skbs */
-- e100_alloc_skbs(bdp); /* and get them */
--
-- /* set packet size, excluding checksum (2 last bytes) if it is present */
-- if ((bdp->flags & DF_CSUM_OFFLOAD)
-- && (bdp->rev_id < D102_REV_ID))
-- skb_put(skb, (int) data_sz - 2);
-- else
-- skb_put(skb, (int) data_sz);
--
-- /* set the protocol */
-- skb->protocol = eth_type_trans(skb, dev);
--
-- /* set the checksum info */
-- if (bdp->flags & DF_CSUM_OFFLOAD) {
-- if (bdp->rev_id >= D102_REV_ID) {
-- skb->ip_summed = e100_D102_check_checksum(rfd);
-- } else {
-- skb->ip_summed = e100_D101M_checksum(bdp, skb);
-- }
-- } else {
-- skb->ip_summed = CHECKSUM_NONE;
-- }
--
-- bdp->drv_stats.net_stats.rx_bytes += skb->len;
--
-- if(bdp->vlgrp && (rfd_status & CB_STATUS_VLAN)) {
-- vlan_hwaccel_rx(skb, bdp->vlgrp, be16_to_cpu(rfd->vlanid));
-- } else {
-- netif_rx(skb);
-- }
-- dev->last_rx = jiffies;
--
-- rfd_cnt++;
-- } /* end of rfd loop */
--
-- /* restart the RU if it has stopped */
-- if ((readw(&bdp->scb->scb_status) & SCB_RUS_MASK) != SCB_RUS_READY) {
-- e100_start_ru(bdp);
-- }
--
-- return rfd_cnt;
--}
--
--void
--e100_refresh_txthld(struct e100_private *bdp)
--{
-- basic_cntr_t *pstat = &(bdp->stats_counters->basic_stats);
--
-- /* as long as tx_per_underrun is not 0, we can go about dynamically *
-- * adjusting the xmit threshold. we stop doing that & resort to defaults
-- * * once the adjustments become meaningless. the value is adjusted by *
-- * dumping the error counters & checking the # of xmit underrun errors *
-- * we've had. */
-- if (bdp->tx_per_underrun) {
-- /* We are going to last values dumped from the dump statistics
-- * command */
-- if (le32_to_cpu(pstat->xmt_gd_frames)) {
-- if (le32_to_cpu(pstat->xmt_uruns)) {
-- /*
-- * if we have had more than one underrun per "DEFAULT #
-- * OF XMITS ALLOWED PER UNDERRUN" good xmits, raise the
-- * THRESHOLD.
-- */
-- if ((le32_to_cpu(pstat->xmt_gd_frames) /
-- le32_to_cpu(pstat->xmt_uruns)) <
-- bdp->tx_per_underrun) {
-- bdp->tx_thld += 3;
-- }
-- }
--
-- /*
-- * if we've had less than one underrun per the DEFAULT number of
-- * of good xmits allowed, lower the THOLD but not less than 0
-- */
-- if (le32_to_cpu(pstat->xmt_gd_frames) >
-- bdp->tx_per_underrun) {
-- bdp->tx_thld--;
--
-- if (bdp->tx_thld < 6)
-- bdp->tx_thld = 6;
--
-- }
-- }
--
-- /* end good xmits */
-- /*
-- * * if our adjustments are becoming unresonable, stop adjusting &
-- * resort * to defaults & pray. A THOLD value > 190 means that the
-- * adapter will * wait for 190*8=1520 bytes in TX FIFO before it
-- * starts xmit. Since * MTU is 1514, it doesn't make any sense for
-- * further increase. */
-- if (bdp->tx_thld >= 190) {
-- bdp->tx_per_underrun = 0;
-- bdp->tx_thld = 189;
-- }
-- } /* end underrun check */
--}
--
--/**
-- * e100_prepare_xmit_buff - prepare a buffer for transmission
-- * @bdp: atapter's private data struct
-- * @skb: skb to send
-- *
-- * This routine prepare a buffer for transmission. It checks
-- * the message length for the appropiate size. It picks up a
-- * free tcb from the TCB pool and sets up the corresponding
-- * TBD's. If the number of fragments are more than the number
-- * of TBD/TCB it copies all the fragments in a coalesce buffer.
-- * It returns a pointer to the prepared TCB.
-- */
--static inline tcb_t *
--e100_prepare_xmit_buff(struct e100_private *bdp, struct sk_buff *skb)
--{
-- tcb_t *tcb, *prev_tcb;
--
-- tcb = bdp->tcb_pool.data;
-- tcb += TCB_TO_USE(bdp->tcb_pool);
--
-- if (bdp->flags & USE_IPCB) {
-- tcb->tcbu.ipcb.ip_activation_high = IPCB_IP_ACTIVATION_DEFAULT;
-- tcb->tcbu.ipcb.ip_schedule &= ~IPCB_TCP_PACKET;
-- tcb->tcbu.ipcb.ip_schedule &= ~IPCB_TCPUDP_CHECKSUM_ENABLE;
-- }
--
-- if(bdp->vlgrp && vlan_tx_tag_present(skb)) {
-- (tcb->tcbu).ipcb.ip_activation_high |= IPCB_INSERTVLAN_ENABLE;
-- (tcb->tcbu).ipcb.vlan = cpu_to_be16(vlan_tx_tag_get(skb));
-- }
--
-- tcb->tcb_hdr.cb_status = 0;
-- tcb->tcb_thrshld = bdp->tx_thld;
-- tcb->tcb_hdr.cb_cmd |= __constant_cpu_to_le16(CB_S_BIT);
--
-- /* Set I (Interrupt) bit on every (TX_FRAME_CNT)th packet */
-- if (!(++bdp->tx_count % TX_FRAME_CNT))
-- tcb->tcb_hdr.cb_cmd |= __constant_cpu_to_le16(CB_I_BIT);
-- else
-- /* Clear I bit on other packets */
-- tcb->tcb_hdr.cb_cmd &= ~__constant_cpu_to_le16(CB_I_BIT);
--
-- tcb->tcb_skb = skb;
--
-- if (skb->ip_summed == CHECKSUM_HW) {
-- const struct iphdr *ip = skb->nh.iph;
--
-- if ((ip->protocol == IPPROTO_TCP) ||
-- (ip->protocol == IPPROTO_UDP)) {
--
-- tcb->tcbu.ipcb.ip_activation_high |=
-- IPCB_HARDWAREPARSING_ENABLE;
-- tcb->tcbu.ipcb.ip_schedule |=
-- IPCB_TCPUDP_CHECKSUM_ENABLE;
--
-- if (ip->protocol == IPPROTO_TCP)
-- tcb->tcbu.ipcb.ip_schedule |= IPCB_TCP_PACKET;
-- }
-- }
--
-- if (!skb_shinfo(skb)->nr_frags) {
-- (tcb->tbd_ptr)->tbd_buf_addr =
-- cpu_to_le32(pci_map_single(bdp->pdev, skb->data,
-- skb->len, PCI_DMA_TODEVICE));
-- (tcb->tbd_ptr)->tbd_buf_cnt = cpu_to_le16(skb->len);
-- tcb->tcb_tbd_num = 1;
-- tcb->tcb_tbd_ptr = tcb->tcb_tbd_dflt_ptr;
-- } else {
-- int i;
-- void *addr;
-- tbd_t *tbd_arr_ptr = &(tcb->tbd_ptr[1]);
-- skb_frag_t *frag = &skb_shinfo(skb)->frags[0];
--
-- (tcb->tbd_ptr)->tbd_buf_addr =
-- cpu_to_le32(pci_map_single(bdp->pdev, skb->data,
-- skb_headlen(skb),
-- PCI_DMA_TODEVICE));
-- (tcb->tbd_ptr)->tbd_buf_cnt =
-- cpu_to_le16(skb_headlen(skb));
--
-- for (i = 0; i < skb_shinfo(skb)->nr_frags;
-- i++, tbd_arr_ptr++, frag++) {
--
-- addr = ((void *) page_address(frag->page) +
-- frag->page_offset);
--
-- tbd_arr_ptr->tbd_buf_addr =
-- cpu_to_le32(pci_map_single(bdp->pdev,
-- addr, frag->size,
-- PCI_DMA_TODEVICE));
-- tbd_arr_ptr->tbd_buf_cnt = cpu_to_le16(frag->size);
-- }
-- tcb->tcb_tbd_num = skb_shinfo(skb)->nr_frags + 1;
-- tcb->tcb_tbd_ptr = tcb->tcb_tbd_expand_ptr;
-- }
--
-- /* clear the S-BIT on the previous tcb */
-- prev_tcb = bdp->tcb_pool.data;
-- prev_tcb += PREV_TCB_USED(bdp->tcb_pool);
-- prev_tcb->tcb_hdr.cb_cmd &= __constant_cpu_to_le16((u16) ~CB_S_BIT);
--
-- bdp->tcb_pool.tail = NEXT_TCB_TOUSE(bdp->tcb_pool.tail);
--
-- wmb();
--
-- e100_start_cu(bdp, tcb);
--
-- return tcb;
--}
--
--/* Changed for 82558 enhancement */
--/**
-- * e100_start_cu - start the adapter's CU
-- * @bdp: atapter's private data struct
-- * @tcb: TCB to be transmitted
-- *
-- * This routine issues a CU Start or CU Resume command to the 82558/9.
-- * This routine was added because the prepare_ext_xmit_buff takes advantage
-- * of the 82558/9's Dynamic TBD chaining feature and has to start the CU as
-- * soon as the first TBD is ready.
-- *
-- * e100_start_cu must be called while holding the tx_lock !
-- */
--u8
--e100_start_cu(struct e100_private *bdp, tcb_t *tcb)
--{
-- unsigned long lock_flag;
-- u8 ret = true;
--
-- spin_lock_irqsave(&(bdp->bd_lock), lock_flag);
-- switch (bdp->next_cu_cmd) {
-- case RESUME_NO_WAIT:
-- /*last cu command was a CU_RESMUE if this is a 558 or newer we don't need to
-- * wait for command word to clear, we reach here only if we are bachlor
-- */
-- e100_exec_cmd(bdp, SCB_CUC_RESUME);
-- break;
--
-- case RESUME_WAIT:
-- if ((bdp->flags & IS_ICH) &&
-- (bdp->cur_line_speed == 10) &&
-- (bdp->cur_dplx_mode == HALF_DUPLEX)) {
-- e100_wait_exec_simple(bdp, SCB_CUC_NOOP);
-- udelay(1);
-- }
-- if ((e100_wait_exec_simple(bdp, SCB_CUC_RESUME)) &&
-- (bdp->flags & IS_BACHELOR) && (!(bdp->flags & IS_ICH))) {
-- bdp->next_cu_cmd = RESUME_NO_WAIT;
-- }
-- break;
--
-- case START_WAIT:
-- // The last command was a non_tx CU command
-- if (!e100_wait_cus_idle(bdp))
-- printk(KERN_DEBUG
-- "e100: %s: cu_start: timeout waiting for cu\n",
-- bdp->device->name);
-- if (!e100_wait_exec_cmplx(bdp, (u32) (tcb->tcb_phys),
-- SCB_CUC_START, CB_TRANSMIT)) {
-- printk(KERN_DEBUG
-- "e100: %s: cu_start: timeout waiting for scb\n",
-- bdp->device->name);
-- e100_exec_cmplx(bdp, (u32) (tcb->tcb_phys),
-- SCB_CUC_START);
-- ret = false;
-- }
--
-- bdp->next_cu_cmd = RESUME_WAIT;
--
-- break;
-- }
--
-- /* save the last tcb */
-- bdp->last_tcb = tcb;
--
-- spin_unlock_irqrestore(&(bdp->bd_lock), lock_flag);
-- return ret;
--}
--
--/* ====================================================================== */
--/* hw */
--/* ====================================================================== */
--
--/**
-- * e100_selftest - perform H/W self test
-- * @bdp: atapter's private data struct
-- * @st_timeout: address to return timeout value, if fails
-- * @st_result: address to return selftest result, if fails
-- *
-- * This routine will issue PORT Self-test command to test the e100.
-- * The self-test will fail if the adapter's master-enable bit is not
-- * set in the PCI Command Register, or if the adapter is not seated
-- * in a PCI master-enabled slot. we also disable interrupts when the
-- * command is completed.
-- *
-- * Returns:
-- * true: if adapter passes self_test
-- * false: otherwise
-- */
--unsigned char
--e100_selftest(struct e100_private *bdp, u32 *st_timeout, u32 *st_result)
--{
-- u32 selftest_cmd;
--
-- /* initialize the nic state before running test */
-- e100_sw_reset(bdp, PORT_SOFTWARE_RESET);
-- /* Setup the address of the self_test area */
-- selftest_cmd = bdp->selftest_phys;
--
-- /* Setup SELF TEST Command Code in D3 - D0 */
-- selftest_cmd |= PORT_SELFTEST;
--
-- /* Initialize the self-test signature and results DWORDS */
-- bdp->selftest->st_sign = 0;
-- bdp->selftest->st_result = 0xffffffff;
--
-- /* Do the port command */
-- writel(selftest_cmd, &bdp->scb->scb_port);
-- readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */
--
-- /* Wait at least 10 milliseconds for the self-test to complete */
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ / 100 + 1);
--
-- /* disable interrupts since they are enabled */
-- /* after device reset during selftest */
-- e100_disable_clear_intr(bdp);
--
-- /* if The First Self Test DWORD Still Zero, We've timed out. If the
-- * second DWORD is not zero then we have an error. */
-- if ((bdp->selftest->st_sign == 0) || (bdp->selftest->st_result != 0)) {
--
-- if (st_timeout)
-- *st_timeout = !(le32_to_cpu(bdp->selftest->st_sign));
--
-- if (st_result)
-- *st_result = le32_to_cpu(bdp->selftest->st_result);
--
-- return false;
-- }
--
-- return true;
--}
--
--/**
-- * e100_setup_iaaddr - issue IA setup sommand
-- * @bdp: atapter's private data struct
-- * @eaddr: new ethernet address
-- *
-- * This routine will issue the IA setup command. This command
-- * will notify the 82557 (e100) of what its individual (node)
-- * address is. This command will be executed in polled mode.
-- *
-- * Returns:
-- * true: if the IA setup command was successfully issued and completed
-- * false: otherwise
-- */
--unsigned char
--e100_setup_iaaddr(struct e100_private *bdp, u8 *eaddr)
--{
-- unsigned int i;
-- cb_header_t *ntcb_hdr;
-- unsigned char res;
-- nxmit_cb_entry_t *cmd;
--
-- if ((cmd = e100_alloc_non_tx_cmd(bdp)) == NULL) {
-- res = false;
-- goto exit;
-- }
--
-- ntcb_hdr = (cb_header_t *) cmd->non_tx_cmd;
-- ntcb_hdr->cb_cmd = __constant_cpu_to_le16(CB_IA_ADDRESS);
--
-- for (i = 0; i < ETH_ALEN; i++) {
-- (cmd->non_tx_cmd)->ntcb.setup.ia_addr[i] = eaddr[i];
-- }
--
-- res = e100_exec_non_cu_cmd(bdp, cmd);
-- if (!res)
-- printk(KERN_WARNING "e100: %s: IA setup failed\n",
-- bdp->device->name);
--
--exit:
-- return res;
--}
--
--/**
-- * e100_start_ru - start the RU if needed
-- * @bdp: atapter's private data struct
-- *
-- * This routine checks the status of the 82557's receive unit(RU),
-- * and starts the RU if it was not already active. However,
-- * before restarting the RU, the driver gives the RU the buffers
-- * it freed up during the servicing of the ISR. If there are
-- * no free buffers to give to the RU, (i.e. we have reached a
-- * no resource condition) the RU will not be started till the
-- * next ISR.
-- */
--void
--e100_start_ru(struct e100_private *bdp)
--{
-- struct rx_list_elem *rx_struct = NULL;
-- int buffer_found = 0;
-- struct list_head *entry_ptr;
--
-- list_for_each(entry_ptr, &(bdp->active_rx_list)) {
-- rx_struct =
-- list_entry(entry_ptr, struct rx_list_elem, list_elem);
-- pci_dma_sync_single(bdp->pdev, rx_struct->dma_addr,
-- bdp->rfd_size, PCI_DMA_FROMDEVICE);
-- if (!((SKB_RFD_STATUS(rx_struct->skb, bdp) &
-- __constant_cpu_to_le16(RFD_STATUS_COMPLETE)))) {
-- buffer_found = 1;
-- break;
-- }
-- }
--
-- /* No available buffers */
-- if (!buffer_found) {
-- return;
-- }
--
-- spin_lock(&bdp->bd_lock);
--
-- if (!e100_wait_exec_cmplx(bdp, rx_struct->dma_addr, SCB_RUC_START, 0)) {
-- printk(KERN_DEBUG
-- "e100: %s: start_ru: wait_scb failed\n",
-- bdp->device->name);
-- e100_exec_cmplx(bdp, rx_struct->dma_addr, SCB_RUC_START);
-- }
-- if (bdp->next_cu_cmd == RESUME_NO_WAIT) {
-- bdp->next_cu_cmd = RESUME_WAIT;
-- }
-- spin_unlock(&bdp->bd_lock);
--}
--
--/**
-- * e100_cmd_complete_location
-- * @bdp: atapter's private data struct
-- *
-- * This routine returns a pointer to the location of the command-complete
-- * DWord in the dump statistical counters area, according to the statistical
-- * counters mode (557 - basic, 558 - extended, or 559 - TCO mode).
-- * See e100_config_init() for the setting of the statistical counters mode.
-- */
--static u32 *
--e100_cmd_complete_location(struct e100_private *bdp)
--{
-- u32 *cmd_complete;
-- max_counters_t *stats = bdp->stats_counters;
--
-- switch (bdp->stat_mode) {
-- case E100_EXTENDED_STATS:
-- cmd_complete =
-- (u32 *) &(((err_cntr_558_t *) (stats))->cmd_complete);
-- break;
--
-- case E100_TCO_STATS:
-- cmd_complete =
-- (u32 *) &(((err_cntr_559_t *) (stats))->cmd_complete);
-- break;
--
-- case E100_BASIC_STATS:
-- default:
-- cmd_complete =
-- (u32 *) &(((err_cntr_557_t *) (stats))->cmd_complete);
-- break;
-- }
--
-- return cmd_complete;
--}
--
--/**
-- * e100_clr_cntrs - clear statistics counters
-- * @bdp: atapter's private data struct
-- *
-- * This routine will clear the adapter error statistic counters.
-- *
-- * Returns:
-- * true: if successfully cleared stat counters
-- * false: otherwise
-- */
--static unsigned char __devinit
--e100_clr_cntrs(struct e100_private *bdp)
--{
-- volatile u32 *pcmd_complete;
--
-- /* clear the dump counter complete word */
-- pcmd_complete = e100_cmd_complete_location(bdp);
-- *pcmd_complete = 0;
-- wmb();
--
-- if (!e100_wait_exec_cmplx(bdp, bdp->stat_cnt_phys, SCB_CUC_DUMP_ADDR, 0))
-- return false;
--
-- /* wait 10 microseconds for the command to complete */
-- udelay(10);
--
-- if (!e100_wait_exec_simple(bdp, SCB_CUC_DUMP_RST_STAT))
-- return false;
--
-- if (bdp->next_cu_cmd == RESUME_NO_WAIT) {
-- bdp->next_cu_cmd = RESUME_WAIT;
-- }
--
-- return true;
--}
--
--static unsigned char
--e100_update_stats(struct e100_private *bdp)
--{
-- u32 *pcmd_complete;
-- basic_cntr_t *pstat = &(bdp->stats_counters->basic_stats);
--
-- // check if last dump command completed
-- pcmd_complete = e100_cmd_complete_location(bdp);
-- if (*pcmd_complete != le32_to_cpu(DUMP_RST_STAT_COMPLETED) &&
-- *pcmd_complete != le32_to_cpu(DUMP_STAT_COMPLETED)) {
-- *pcmd_complete = 0;
-- return false;
-- }
--
-- /* increment the statistics */
-- bdp->drv_stats.net_stats.rx_packets +=
-- le32_to_cpu(pstat->rcv_gd_frames);
-- bdp->drv_stats.net_stats.tx_packets +=
-- le32_to_cpu(pstat->xmt_gd_frames);
-- bdp->drv_stats.net_stats.rx_dropped += le32_to_cpu(pstat->rcv_rsrc_err);
-- bdp->drv_stats.net_stats.collisions += le32_to_cpu(pstat->xmt_ttl_coll);
-- bdp->drv_stats.net_stats.rx_length_errors +=
-- le32_to_cpu(pstat->rcv_shrt_frames);
-- bdp->drv_stats.net_stats.rx_over_errors +=
-- le32_to_cpu(pstat->rcv_rsrc_err);
-- bdp->drv_stats.net_stats.rx_crc_errors +=
-- le32_to_cpu(pstat->rcv_crc_errs);
-- bdp->drv_stats.net_stats.rx_frame_errors +=
-- le32_to_cpu(pstat->rcv_algn_errs);
-- bdp->drv_stats.net_stats.rx_fifo_errors +=
-- le32_to_cpu(pstat->rcv_oruns);
-- bdp->drv_stats.net_stats.tx_aborted_errors +=
-- le32_to_cpu(pstat->xmt_max_coll);
-- bdp->drv_stats.net_stats.tx_carrier_errors +=
-- le32_to_cpu(pstat->xmt_lost_crs);
-- bdp->drv_stats.net_stats.tx_fifo_errors +=
-- le32_to_cpu(pstat->xmt_uruns);
--
-- bdp->drv_stats.tx_late_col += le32_to_cpu(pstat->xmt_late_coll);
-- bdp->drv_stats.tx_ok_defrd += le32_to_cpu(pstat->xmt_deferred);
-- bdp->drv_stats.tx_one_retry += le32_to_cpu(pstat->xmt_sngl_coll);
-- bdp->drv_stats.tx_mt_one_retry += le32_to_cpu(pstat->xmt_mlt_coll);
-- bdp->drv_stats.rcv_cdt_frames += le32_to_cpu(pstat->rcv_err_coll);
--
-- if (bdp->stat_mode != E100_BASIC_STATS) {
-- ext_cntr_t *pex_stat = &bdp->stats_counters->extended_stats;
--
-- bdp->drv_stats.xmt_fc_pkts +=
-- le32_to_cpu(pex_stat->xmt_fc_frames);
-- bdp->drv_stats.rcv_fc_pkts +=
-- le32_to_cpu(pex_stat->rcv_fc_frames);
-- bdp->drv_stats.rcv_fc_unsupported +=
-- le32_to_cpu(pex_stat->rcv_fc_unsupported);
-- }
--
-- if (bdp->stat_mode == E100_TCO_STATS) {
-- tco_cntr_t *ptco_stat = &bdp->stats_counters->tco_stats;
--
-- bdp->drv_stats.xmt_tco_pkts +=
-- le16_to_cpu(ptco_stat->xmt_tco_frames);
-- bdp->drv_stats.rcv_tco_pkts +=
-- le16_to_cpu(ptco_stat->rcv_tco_frames);
-- }
--
-- *pcmd_complete = 0;
-- return true;
--}
--
--/**
-- * e100_dump_stat_cntrs
-- * @bdp: atapter's private data struct
-- *
-- * This routine will dump the board statistical counters without waiting
-- * for stat_dump to complete. Any access to this stats should verify the completion
-- * of the command
-- */
--void
--e100_dump_stats_cntrs(struct e100_private *bdp)
--{
-- unsigned long lock_flag_bd;
--
-- spin_lock_irqsave(&(bdp->bd_lock), lock_flag_bd);
--
-- /* dump h/w stats counters */
-- if (e100_wait_exec_simple(bdp, SCB_CUC_DUMP_RST_STAT)) {
-- if (bdp->next_cu_cmd == RESUME_NO_WAIT) {
-- bdp->next_cu_cmd = RESUME_WAIT;
-- }
-- }
--
-- spin_unlock_irqrestore(&(bdp->bd_lock), lock_flag_bd);
--}
--
--/**
-- * e100_exec_non_cu_cmd
-- * @bdp: atapter's private data struct
-- * @command: the non-cu command to execute
-- *
-- * This routine will submit a command block to be executed,
-- */
--unsigned char
--e100_exec_non_cu_cmd(struct e100_private *bdp, nxmit_cb_entry_t *command)
--{
-- cb_header_t *ntcb_hdr;
-- unsigned long lock_flag;
-- unsigned long expiration_time;
-- unsigned char rc = true;
-- u8 sub_cmd;
--
-- ntcb_hdr = (cb_header_t *) command->non_tx_cmd; /* get hdr of non tcb cmd */
-- sub_cmd = cpu_to_le16(ntcb_hdr->cb_cmd);
--
-- /* Set the Command Block to be the last command block */
-- ntcb_hdr->cb_cmd |= __constant_cpu_to_le16(CB_EL_BIT);
-- ntcb_hdr->cb_status = 0;
-- ntcb_hdr->cb_lnk_ptr = 0;
--
-- wmb();
-- if (in_interrupt())
-- return e100_delayed_exec_non_cu_cmd(bdp, command);
--
-- if (netif_running(bdp->device) && netif_carrier_ok(bdp->device))
-- return e100_delayed_exec_non_cu_cmd(bdp, command);
--
-- spin_lock_bh(&(bdp->bd_non_tx_lock));
--
-- if (bdp->non_tx_command_state != E100_NON_TX_IDLE) {
-- goto delayed_exec;
-- }
--
-- if (bdp->last_tcb) {
-- rmb();
-- if ((bdp->last_tcb->tcb_hdr.cb_status &
-- __constant_cpu_to_le16(CB_STATUS_COMPLETE)) == 0)
-- goto delayed_exec;
-- }
--
-- if ((readw(&bdp->scb->scb_status) & SCB_CUS_MASK) == SCB_CUS_ACTIVE) {
-- goto delayed_exec;
-- }
--
-- spin_lock_irqsave(&bdp->bd_lock, lock_flag);
--
-- if (!e100_wait_exec_cmplx(bdp, command->dma_addr, SCB_CUC_START, sub_cmd)) {
-- spin_unlock_irqrestore(&(bdp->bd_lock), lock_flag);
-- rc = false;
-- goto exit;
-- }
--
-- bdp->next_cu_cmd = START_WAIT;
-- spin_unlock_irqrestore(&(bdp->bd_lock), lock_flag);
--
-- /* now wait for completion of non-cu CB up to 20 msec */
-- expiration_time = jiffies + HZ / 50 + 1;
-- rmb();
-- while (!(ntcb_hdr->cb_status &
-- __constant_cpu_to_le16(CB_STATUS_COMPLETE))) {
--
-- if (time_before(jiffies, expiration_time)) {
-- spin_unlock_bh(&(bdp->bd_non_tx_lock));
-- yield();
-- spin_lock_bh(&(bdp->bd_non_tx_lock));
-- } else {
--#ifdef E100_CU_DEBUG
-- printk(KERN_ERR "e100: %s: non-TX command (%x) "
-- "timeout\n", bdp->device->name, sub_cmd);
--#endif
-- rc = false;
-- goto exit;
-- }
-- rmb();
-- }
--
--exit:
-- e100_free_non_tx_cmd(bdp, command);
--
-- if (netif_running(bdp->device))
-- netif_wake_queue(bdp->device);
--
-- spin_unlock_bh(&(bdp->bd_non_tx_lock));
-- return rc;
--
--delayed_exec:
-- spin_unlock_bh(&(bdp->bd_non_tx_lock));
-- return e100_delayed_exec_non_cu_cmd(bdp, command);
--}
--
--/**
-- * e100_sw_reset
-- * @bdp: atapter's private data struct
-- * @reset_cmd: s/w reset or selective reset
-- *
-- * This routine will issue a software reset to the adapter. It
-- * will also disable interrupts, as the are enabled after reset.
-- */
--void
--e100_sw_reset(struct e100_private *bdp, u32 reset_cmd)
--{
-- /* Do a selective reset first to avoid a potential PCI hang */
-- writel(PORT_SELECTIVE_RESET, &bdp->scb->scb_port);
-- readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */
--
-- /* wait for the reset to take effect */
-- udelay(20);
-- if (reset_cmd == PORT_SOFTWARE_RESET) {
-- writel(PORT_SOFTWARE_RESET, &bdp->scb->scb_port);
--
-- /* wait 20 micro seconds for the reset to take effect */
-- udelay(20);
-- }
--
-- /* Mask off our interrupt line -- it is unmasked after reset */
-- e100_disable_clear_intr(bdp);
--#ifdef E100_CU_DEBUG
-- bdp->last_cmd = 0;
-- bdp->last_sub_cmd = 0;
--#endif
--}
--
--/**
-- * e100_load_microcode - Download microsocde to controller.
-- * @bdp: atapter's private data struct
-- *
-- * This routine downloads microcode on to the controller. This
-- * microcode is available for the 82558/9, 82550. Currently the
-- * microcode handles interrupt bundling and TCO workaround.
-- *
-- * Returns:
-- * true: if successfull
-- * false: otherwise
-- */
--static unsigned char
--e100_load_microcode(struct e100_private *bdp)
--{
-- static struct {
-- u8 rev_id;
-- u32 ucode[UCODE_MAX_DWORDS + 1];
-- int timer_dword;
-- int bundle_dword;
-- int min_size_dword;
-- } ucode_opts[] = {
-- { D101A4_REV_ID,
-- D101_A_RCVBUNDLE_UCODE,
-- D101_CPUSAVER_TIMER_DWORD,
-- D101_CPUSAVER_BUNDLE_DWORD,
-- D101_CPUSAVER_MIN_SIZE_DWORD },
-- { D101B0_REV_ID,
-- D101_B0_RCVBUNDLE_UCODE,
-- D101_CPUSAVER_TIMER_DWORD,
-- D101_CPUSAVER_BUNDLE_DWORD,
-- D101_CPUSAVER_MIN_SIZE_DWORD },
-- { D101MA_REV_ID,
-- D101M_B_RCVBUNDLE_UCODE,
-- D101M_CPUSAVER_TIMER_DWORD,
-- D101M_CPUSAVER_BUNDLE_DWORD,
-- D101M_CPUSAVER_MIN_SIZE_DWORD },
-- { D101S_REV_ID,
-- D101S_RCVBUNDLE_UCODE,
-- D101S_CPUSAVER_TIMER_DWORD,
-- D101S_CPUSAVER_BUNDLE_DWORD,
-- D101S_CPUSAVER_MIN_SIZE_DWORD },
-- { D102_REV_ID,
-- D102_B_RCVBUNDLE_UCODE,
-- D102_B_CPUSAVER_TIMER_DWORD,
-- D102_B_CPUSAVER_BUNDLE_DWORD,
-- D102_B_CPUSAVER_MIN_SIZE_DWORD },
-- { D102C_REV_ID,
-- D102_C_RCVBUNDLE_UCODE,
-- D102_C_CPUSAVER_TIMER_DWORD,
-- D102_C_CPUSAVER_BUNDLE_DWORD,
-- D102_C_CPUSAVER_MIN_SIZE_DWORD },
-- { D102E_REV_ID,
-- D102_E_RCVBUNDLE_UCODE,
-- D102_E_CPUSAVER_TIMER_DWORD,
-- D102_E_CPUSAVER_BUNDLE_DWORD,
-- D102_E_CPUSAVER_MIN_SIZE_DWORD },
-- { 0, {0}, 0, 0, 0}
-- }, *opts;
--
-- opts = ucode_opts;
--
-- /* User turned ucode loading off */
-- if (!(bdp->params.b_params & PRM_UCODE))
-- return false;
--
-- /* These controllers do not need ucode */
-- if (bdp->flags & IS_ICH)
-- return false;
--
-- /* Search for ucode match against h/w rev_id */
-- while (opts->rev_id) {
-- if (bdp->rev_id == opts->rev_id) {
-- int i;
-- u32 *ucode_dword;
-- load_ucode_cb_t *ucode_cmd_ptr;
-- nxmit_cb_entry_t *cmd = e100_alloc_non_tx_cmd(bdp);
--
-- if (cmd != NULL) {
-- ucode_cmd_ptr =
-- (load_ucode_cb_t *) cmd->non_tx_cmd;
-- ucode_dword = ucode_cmd_ptr->ucode_dword;
-- } else {
-- return false;
-- }
--
-- memcpy(ucode_dword, opts->ucode, sizeof (opts->ucode));
--
-- /* Insert user-tunable settings */
-- ucode_dword[opts->timer_dword] &= 0xFFFF0000;
-- ucode_dword[opts->timer_dword] |=
-- (u16) bdp->params.IntDelay;
-- ucode_dword[opts->bundle_dword] &= 0xFFFF0000;
-- ucode_dword[opts->bundle_dword] |=
-- (u16) bdp->params.BundleMax;
-- ucode_dword[opts->min_size_dword] &= 0xFFFF0000;
-- ucode_dword[opts->min_size_dword] |=
-- (bdp->params.b_params & PRM_BUNDLE_SMALL) ?
-- 0xFFFF : 0xFF80;
--
-- for (i = 0; i < UCODE_MAX_DWORDS; i++)
-- cpu_to_le32s(&(ucode_dword[i]));
--
-- ucode_cmd_ptr->load_ucode_cbhdr.cb_cmd =
-- __constant_cpu_to_le16(CB_LOAD_MICROCODE);
--
-- return e100_exec_non_cu_cmd(bdp, cmd);
-- }
-- opts++;
-- }
--
-- return false;
--}
--
--/***************************************************************************/
--/***************************************************************************/
--/* EEPROM Functions */
--/***************************************************************************/
--
--/* Read PWA (printed wired assembly) number */
--void __devinit
--e100_rd_pwa_no(struct e100_private *bdp)
--{
-- bdp->pwa_no = e100_eeprom_read(bdp, EEPROM_PWA_NO);
-- bdp->pwa_no <<= 16;
-- bdp->pwa_no |= e100_eeprom_read(bdp, EEPROM_PWA_NO + 1);
--}
--
--/* Read the permanent ethernet address from the eprom. */
--void __devinit
--e100_rd_eaddr(struct e100_private *bdp)
--{
-- int i;
-- u16 eeprom_word;
--
-- for (i = 0; i < 6; i += 2) {
-- eeprom_word =
-- e100_eeprom_read(bdp,
-- EEPROM_NODE_ADDRESS_BYTE_0 + (i / 2));
--
-- bdp->device->dev_addr[i] =
-- bdp->perm_node_address[i] = (u8) eeprom_word;
-- bdp->device->dev_addr[i + 1] =
-- bdp->perm_node_address[i + 1] = (u8) (eeprom_word >> 8);
-- }
--}
--
--/* Check the D102 RFD flags to see if the checksum passed */
--static unsigned char
--e100_D102_check_checksum(rfd_t *rfd)
--{
-- if (((le16_to_cpu(rfd->rfd_header.cb_status)) & RFD_PARSE_BIT)
-- && (((rfd->rcvparserstatus & CHECKSUM_PROTOCOL_MASK) ==
-- RFD_TCP_PACKET)
-- || ((rfd->rcvparserstatus & CHECKSUM_PROTOCOL_MASK) ==
-- RFD_UDP_PACKET))
-- && (rfd->checksumstatus & TCPUDP_CHECKSUM_BIT_VALID)
-- && (rfd->checksumstatus & TCPUDP_CHECKSUM_VALID)) {
-- return CHECKSUM_UNNECESSARY;
-- }
-- return CHECKSUM_NONE;
--}
--
--/**
-- * e100_D101M_checksum
-- * @bdp: atapter's private data struct
-- * @skb: skb received
-- *
-- * Sets the skb->csum value from D101 csum found at the end of the Rx frame. The
-- * D101M sums all words in frame excluding the ethernet II header (14 bytes) so
-- * in case the packet is ethernet II and the protocol is IP, all is need is to
-- * assign this value to skb->csum.
-- */
--static unsigned char
--e100_D101M_checksum(struct e100_private *bdp, struct sk_buff *skb)
--{
-- unsigned short proto = (skb->protocol);
--
-- if (proto == __constant_htons(ETH_P_IP)) {
--
-- skb->csum = get_unaligned((u16 *) (skb->tail));
-- return CHECKSUM_HW;
-- }
-- return CHECKSUM_NONE;
--}
--
--/***************************************************************************/
--/***************************************************************************/
--/***************************************************************************/
--/***************************************************************************/
--/* Auxilary Functions */
--/***************************************************************************/
--
--/* Print the board's configuration */
--void __devinit
--e100_print_brd_conf(struct e100_private *bdp)
--{
-- /* Print the string if checksum Offloading was enabled */
-- if (bdp->flags & DF_CSUM_OFFLOAD)
-- printk(KERN_NOTICE " Hardware receive checksums enabled\n");
-- else {
-- if (bdp->rev_id >= D101MA_REV_ID)
-- printk(KERN_NOTICE " Hardware receive checksums disabled\n");
-- }
--
-- if ((bdp->flags & DF_UCODE_LOADED))
-- printk(KERN_NOTICE " cpu cycle saver enabled\n");
--}
--
--/**
-- * e100_pci_setup - setup the adapter's PCI information
-- * @pcid: adapter's pci_dev struct
-- * @bdp: atapter's private data struct
-- *
-- * This routine sets up all PCI information for the adapter. It enables the bus
-- * master bit (some BIOS don't do this), requests memory ans I/O regions, and
-- * calls ioremap() on the adapter's memory region.
-- *
-- * Returns:
-- * true: if successfull
-- * false: otherwise
-- */
--static unsigned char __devinit
--e100_pci_setup(struct pci_dev *pcid, struct e100_private *bdp)
--{
-- struct net_device *dev = bdp->device;
-- int rc = 0;
--
-- if ((rc = pci_enable_device(pcid)) != 0) {
-- goto err;
-- }
--
-- /* dev and ven ID have already been checked so it is our device */
-- pci_read_config_byte(pcid, PCI_REVISION_ID, (u8 *) &(bdp->rev_id));
--
-- /* address #0 is a memory region */
-- dev->mem_start = pci_resource_start(pcid, 0);
-- dev->mem_end = dev->mem_start + sizeof (scb_t);
--
-- /* address #1 is a IO region */
-- dev->base_addr = pci_resource_start(pcid, 1);
--
-- if ((rc = pci_request_regions(pcid, e100_short_driver_name)) != 0) {
-- goto err_disable;
-- }
--
-- pci_enable_wake(pcid, 0, 0);
--
-- /* if Bus Mastering is off, turn it on! */
-- pci_set_master(pcid);
--
-- /* address #0 is a memory mapping */
-- bdp->scb = (scb_t *) ioremap_nocache(dev->mem_start, sizeof (scb_t));
--
-- if (!bdp->scb) {
-- printk(KERN_ERR "e100: %s: Failed to map PCI address 0x%lX\n",
-- dev->name, pci_resource_start(pcid, 0));
-- rc = -ENOMEM;
-- goto err_region;
-- }
--
-- return 0;
--
--err_region:
-- pci_release_regions(pcid);
--err_disable:
-- pci_disable_device(pcid);
--err:
-- return rc;
--}
--
--void
--e100_isolate_driver(struct e100_private *bdp)
--{
--
-- /* Check if interface is up */
-- /* NOTE: Can't use netif_running(bdp->device) because */
-- /* dev_close clears __LINK_STATE_START before calling */
-- /* e100_close (aka dev->stop) */
-- if (bdp->device->flags & IFF_UP) {
-- e100_disable_clear_intr(bdp);
-- del_timer_sync(&bdp->watchdog_timer);
-- netif_carrier_off(bdp->device);
-- netif_stop_queue(bdp->device);
-- bdp->last_tcb = NULL;
-- }
-- e100_sw_reset(bdp, PORT_SELECTIVE_RESET);
--}
--
--static void
--e100_tcb_add_C_bit(struct e100_private *bdp)
--{
-- tcb_t *tcb = (tcb_t *) bdp->tcb_pool.data;
-- int i;
--
-- for (i = 0; i < bdp->params.TxDescriptors; i++, tcb++) {
-- tcb->tcb_hdr.cb_status |= cpu_to_le16(CB_STATUS_COMPLETE);
-- }
--}
--
--/*
-- * Procedure: e100_configure_device
-- *
-- * Description: This routine will configure device
-- *
-- * Arguments:
-- * bdp - Ptr to this card's e100_bdconfig structure
-- *
-- * Returns:
-- * true upon success
-- * false upon failure
-- */
--unsigned char
--e100_configure_device(struct e100_private *bdp)
--{
-- /*load CU & RU base */
-- if (!e100_wait_exec_cmplx(bdp, 0, SCB_CUC_LOAD_BASE, 0))
-- return false;
--
-- if (e100_load_microcode(bdp))
-- bdp->flags |= DF_UCODE_LOADED;
--
-- if (!e100_wait_exec_cmplx(bdp, 0, SCB_RUC_LOAD_BASE, 0))
-- return false;
--
-- /* Issue the load dump counters address command */
-- if (!e100_wait_exec_cmplx(bdp, bdp->stat_cnt_phys, SCB_CUC_DUMP_ADDR, 0))
-- return false;
--
-- if (!e100_setup_iaaddr(bdp, bdp->device->dev_addr)) {
-- printk(KERN_ERR "e100: e100_configure_device: "
-- "setup iaaddr failed\n");
-- return false;
-- }
--
-- e100_set_multi_exec(bdp->device);
--
-- /* Change for 82558 enhancement */
-- /* If 82558/9 and if the user has enabled flow control, set up */
-- /* flow Control Reg. in the CSR */
-- if ((bdp->flags & IS_BACHELOR)
-- && (bdp->params.b_params & PRM_FC)) {
-- writeb(DFLT_FC_THLD,
-- &bdp->scb->scb_ext.d101_scb.scb_fc_thld);
-- writeb(DFLT_FC_CMD,
-- &bdp->scb->scb_ext.d101_scb.scb_fc_xon_xoff);
-- }
--
-- e100_force_config(bdp);
--
-- return true;
--}
--
--void
--e100_deisolate_driver(struct e100_private *bdp, u8 full_reset)
--{
-- u32 cmd = full_reset ? PORT_SOFTWARE_RESET : PORT_SELECTIVE_RESET;
-- e100_sw_reset(bdp, cmd);
-- if (cmd == PORT_SOFTWARE_RESET) {
-- if (!e100_configure_device(bdp))
-- printk(KERN_ERR "e100: e100_deisolate_driver:"
-- " device configuration failed\n");
-- }
--
-- if (netif_running(bdp->device)) {
--
-- bdp->next_cu_cmd = START_WAIT;
-- bdp->last_tcb = NULL;
--
-- e100_start_ru(bdp);
--
-- /* relaunch watchdog timer in 2 sec */
-- mod_timer(&(bdp->watchdog_timer), jiffies + (2 * HZ));
--
-- // we must clear tcbs since we may have lost Tx intrrupt
-- // or have unsent frames on the tcb chain
-- e100_tcb_add_C_bit(bdp);
-- e100_tx_srv(bdp);
-- netif_wake_queue(bdp->device);
-- e100_set_intr_mask(bdp);
-- }
--}
--
--static int
--e100_do_ethtool_ioctl(struct net_device *dev, struct ifreq *ifr)
--{
-- struct ethtool_cmd ecmd;
-- int rc = -EOPNOTSUPP;
--
-- if (copy_from_user(&ecmd, ifr->ifr_data, sizeof (ecmd.cmd)))
-- return -EFAULT;
--
-- switch (ecmd.cmd) {
-- case ETHTOOL_GSET:
-- rc = e100_ethtool_get_settings(dev, ifr);
-- break;
-- case ETHTOOL_SSET:
-- rc = e100_ethtool_set_settings(dev, ifr);
-- break;
-- case ETHTOOL_GDRVINFO:
-- rc = e100_ethtool_get_drvinfo(dev, ifr);
-- break;
-- case ETHTOOL_GREGS:
-- rc = e100_ethtool_gregs(dev, ifr);
-- break;
-- case ETHTOOL_NWAY_RST:
-- rc = e100_ethtool_nway_rst(dev, ifr);
-- break;
-- case ETHTOOL_GLINK:
-- rc = e100_ethtool_glink(dev, ifr);
-- break;
-- case ETHTOOL_GEEPROM:
-- case ETHTOOL_SEEPROM:
-- rc = e100_ethtool_eeprom(dev, ifr);
-- break;
-- case ETHTOOL_GSTATS: {
-- struct {
-- struct ethtool_stats cmd;
-- uint64_t data[E100_STATS_LEN];
-- } stats = { {ETHTOOL_GSTATS, E100_STATS_LEN} };
-- struct e100_private *bdp = dev->priv;
-- void *addr = ifr->ifr_data;
-- int i;
--
-- for(i = 0; i < E100_STATS_LEN; i++)
-- stats.data[i] =
-- ((unsigned long *)&bdp->drv_stats.net_stats)[i];
-- if(copy_to_user(addr, &stats, sizeof(stats)))
-- return -EFAULT;
-- return 0;
-- }
-- case ETHTOOL_GWOL:
-- case ETHTOOL_SWOL:
-- rc = e100_ethtool_wol(dev, ifr);
-- break;
-- case ETHTOOL_TEST:
-- rc = e100_ethtool_test(dev, ifr);
-- break;
-- case ETHTOOL_GSTRINGS:
-- rc = e100_ethtool_gstrings(dev,ifr);
-- break;
-- case ETHTOOL_PHYS_ID:
-- rc = e100_ethtool_led_blink(dev,ifr);
-- break;
--#ifdef ETHTOOL_GRINGPARAM
-- case ETHTOOL_GRINGPARAM: {
-- struct ethtool_ringparam ering;
-- struct e100_private *bdp = dev->priv;
-- memset((void *) &ering, 0, sizeof(ering));
-- ering.rx_max_pending = E100_MAX_RFD;
-- ering.tx_max_pending = E100_MAX_TCB;
-- ering.rx_pending = bdp->params.RxDescriptors;
-- ering.tx_pending = bdp->params.TxDescriptors;
-- rc = copy_to_user(ifr->ifr_data, &ering, sizeof(ering))
-- ? -EFAULT : 0;
-- return rc;
-- }
--#endif
--#ifdef ETHTOOL_SRINGPARAM
-- case ETHTOOL_SRINGPARAM: {
-- struct ethtool_ringparam ering;
-- struct e100_private *bdp = dev->priv;
-- if (copy_from_user(&ering, ifr->ifr_data, sizeof(ering)))
-- return -EFAULT;
-- if (ering.rx_pending > E100_MAX_RFD
-- || ering.rx_pending < E100_MIN_RFD)
-- return -EINVAL;
-- if (ering.tx_pending > E100_MAX_TCB
-- || ering.tx_pending < E100_MIN_TCB)
-- return -EINVAL;
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- /* Use new values to open interface */
-- bdp->params.RxDescriptors = ering.rx_pending;
-- bdp->params.TxDescriptors = ering.tx_pending;
-- e100_hw_init(bdp);
-- e100_open(dev);
-- }
-- else {
-- bdp->params.RxDescriptors = ering.rx_pending;
-- bdp->params.TxDescriptors = ering.tx_pending;
-- }
-- return 0;
-- }
--#endif
--#ifdef ETHTOOL_GPAUSEPARAM
-- case ETHTOOL_GPAUSEPARAM: {
-- struct ethtool_pauseparam epause;
-- struct e100_private *bdp = dev->priv;
-- memset((void *) &epause, 0, sizeof(epause));
-- if ((bdp->flags & IS_BACHELOR)
-- && (bdp->params.b_params & PRM_FC)) {
-- epause.autoneg = 1;
-- if (bdp->flags && DF_LINK_FC_CAP) {
-- epause.rx_pause = 1;
-- epause.tx_pause = 1;
-- }
-- if (bdp->flags && DF_LINK_FC_TX_ONLY)
-- epause.tx_pause = 1;
-- }
-- rc = copy_to_user(ifr->ifr_data, &epause, sizeof(epause))
-- ? -EFAULT : 0;
-- return rc;
-- }
--#endif
--#ifdef ETHTOOL_SPAUSEPARAM
-- case ETHTOOL_SPAUSEPARAM: {
-- struct ethtool_pauseparam epause;
-- struct e100_private *bdp = dev->priv;
-- if (!(bdp->flags & IS_BACHELOR))
-- return -EINVAL;
-- if (copy_from_user(&epause, ifr->ifr_data, sizeof(epause)))
-- return -EFAULT;
-- if (epause.autoneg == 1)
-- bdp->params.b_params |= PRM_FC;
-- else
-- bdp->params.b_params &= ~PRM_FC;
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- e100_hw_init(bdp);
-- e100_open(dev);
-- }
-- return 0;
-- }
--#endif
--#ifdef ETHTOOL_GRXCSUM
-- case ETHTOOL_GRXCSUM:
-- case ETHTOOL_GTXCSUM:
-- case ETHTOOL_GSG:
-- { struct ethtool_value eval;
-- struct e100_private *bdp = dev->priv;
-- memset((void *) &eval, 0, sizeof(eval));
-- if ((ecmd.cmd == ETHTOOL_GRXCSUM)
-- && (bdp->params.b_params & PRM_XSUMRX))
-- eval.data = 1;
-- else
-- eval.data = 0;
-- rc = copy_to_user(ifr->ifr_data, &eval, sizeof(eval))
-- ? -EFAULT : 0;
-- return rc;
-- }
--#endif
--#ifdef ETHTOOL_SRXCSUM
-- case ETHTOOL_SRXCSUM:
-- case ETHTOOL_STXCSUM:
-- case ETHTOOL_SSG:
-- { struct ethtool_value eval;
-- struct e100_private *bdp = dev->priv;
-- if (copy_from_user(&eval, ifr->ifr_data, sizeof(eval)))
-- return -EFAULT;
-- if (ecmd.cmd == ETHTOOL_SRXCSUM) {
-- if (eval.data == 1) {
-- if (bdp->rev_id >= D101MA_REV_ID)
-- bdp->params.b_params |= PRM_XSUMRX;
-- else
-- return -EINVAL;
-- } else {
-- if (bdp->rev_id >= D101MA_REV_ID)
-- bdp->params.b_params &= ~PRM_XSUMRX;
-- else
-- return 0;
-- }
-- } else {
-- if (eval.data == 1)
-- return -EINVAL;
-- else
-- return 0;
-- }
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- e100_hw_init(bdp);
-- e100_open(dev);
-- }
-- return 0;
-- }
--#endif
-- default:
-- break;
-- } //switch
-- return rc;
--}
--
--static int
--e100_ethtool_get_settings(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- struct ethtool_cmd ecmd;
-- u16 advert = 0;
--
-- memset((void *) &ecmd, 0, sizeof (ecmd));
--
-- bdp = dev->priv;
--
-- ecmd.supported = bdp->speed_duplex_caps;
--
-- ecmd.port =
-- (bdp->speed_duplex_caps & SUPPORTED_TP) ? PORT_TP : PORT_FIBRE;
-- ecmd.transceiver = XCVR_INTERNAL;
-- ecmd.phy_address = bdp->phy_addr;
--
-- if (netif_carrier_ok(bdp->device)) {
-- ecmd.speed = bdp->cur_line_speed;
-- ecmd.duplex =
-- (bdp->cur_dplx_mode == HALF_DUPLEX) ? DUPLEX_HALF : DUPLEX_FULL;
-- }
-- else {
-- ecmd.speed = -1;
-- ecmd.duplex = -1;
-- }
--
-- ecmd.advertising = ADVERTISED_TP;
--
-- if (bdp->params.e100_speed_duplex == E100_AUTONEG) {
-- ecmd.autoneg = AUTONEG_ENABLE;
-- ecmd.advertising |= ADVERTISED_Autoneg;
-- } else {
-- ecmd.autoneg = AUTONEG_DISABLE;
-- }
--
-- if (bdp->speed_duplex_caps & SUPPORTED_MII) {
-- e100_mdi_read(bdp, MII_ADVERTISE, bdp->phy_addr, &advert);
--
-- if (advert & ADVERTISE_10HALF)
-- ecmd.advertising |= ADVERTISED_10baseT_Half;
-- if (advert & ADVERTISE_10FULL)
-- ecmd.advertising |= ADVERTISED_10baseT_Full;
-- if (advert & ADVERTISE_100HALF)
-- ecmd.advertising |= ADVERTISED_100baseT_Half;
-- if (advert & ADVERTISE_100FULL)
-- ecmd.advertising |= ADVERTISED_100baseT_Full;
-- } else {
-- ecmd.autoneg = AUTONEG_DISABLE;
-- ecmd.advertising &= ~ADVERTISED_Autoneg;
-- }
--
-- if (copy_to_user(ifr->ifr_data, &ecmd, sizeof (ecmd)))
-- return -EFAULT;
--
-- return 0;
--}
--
--static int
--e100_ethtool_set_settings(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- int e100_new_speed_duplex;
-- int ethtool_new_speed_duplex;
-- struct ethtool_cmd ecmd;
--
-- bdp = dev->priv;
-- if (copy_from_user(&ecmd, ifr->ifr_data, sizeof (ecmd))) {
-- return -EFAULT;
-- }
--
-- if ((ecmd.autoneg == AUTONEG_ENABLE)
-- && (bdp->speed_duplex_caps & SUPPORTED_Autoneg)) {
-- bdp->params.e100_speed_duplex = E100_AUTONEG;
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- e100_hw_init(bdp);
-- e100_open(dev);
-- }
-- } else {
-- if (ecmd.speed == SPEED_10) {
-- if (ecmd.duplex == DUPLEX_HALF) {
-- e100_new_speed_duplex =
-- E100_SPEED_10_HALF;
-- ethtool_new_speed_duplex =
-- SUPPORTED_10baseT_Half;
-- } else {
-- e100_new_speed_duplex =
-- E100_SPEED_10_FULL;
-- ethtool_new_speed_duplex =
-- SUPPORTED_10baseT_Full;
-- }
-- } else {
-- if (ecmd.duplex == DUPLEX_HALF) {
-- e100_new_speed_duplex =
-- E100_SPEED_100_HALF;
-- ethtool_new_speed_duplex =
-- SUPPORTED_100baseT_Half;
-- } else {
-- e100_new_speed_duplex =
-- E100_SPEED_100_FULL;
-- ethtool_new_speed_duplex =
-- SUPPORTED_100baseT_Full;
-- }
-- }
--
-- if (bdp->speed_duplex_caps & ethtool_new_speed_duplex) {
-- bdp->params.e100_speed_duplex =
-- e100_new_speed_duplex;
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- e100_hw_init(bdp);
-- e100_open(dev);
-- }
-- } else {
-- return -EOPNOTSUPP;
-- }
-- }
--
-- return 0;
--}
--
--static int
--e100_ethtool_glink(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- struct ethtool_value info;
--
-- memset((void *) &info, 0, sizeof (info));
--
-- bdp = dev->priv;
-- info.cmd = ETHTOOL_GLINK;
--
-- /* Consider both PHY link and netif_running */
-- info.data = e100_update_link_state(bdp);
--
-- if (copy_to_user(ifr->ifr_data, &info, sizeof (info)))
-- return -EFAULT;
--
-- return 0;
--}
--
--static int
--e100_ethtool_test(struct net_device *dev, struct ifreq *ifr)
--{
-- struct ethtool_test *info;
-- int rc = -EFAULT;
--
-- info = kmalloc(sizeof(*info) + max_test_res * sizeof(u64),
-- GFP_ATOMIC);
--
-- if (!info)
-- return -ENOMEM;
--
-- memset((void *) info, 0, sizeof(*info) +
-- max_test_res * sizeof(u64));
--
-- if (copy_from_user(info, ifr->ifr_data, sizeof(*info)))
-- goto exit;
--
-- info->flags = e100_run_diag(dev, info->data, info->flags);
--
-- if (!copy_to_user(ifr->ifr_data, info,
-- sizeof(*info) + max_test_res * sizeof(u64)))
-- rc = 0;
--exit:
-- kfree(info);
-- return rc;
--}
--
--static int
--e100_ethtool_gregs(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- u32 regs_buff[E100_REGS_LEN];
-- struct ethtool_regs regs = {ETHTOOL_GREGS};
-- void *addr = ifr->ifr_data;
-- u16 mdi_reg;
--
-- bdp = dev->priv;
--
-- if(copy_from_user(®s, addr, sizeof(regs)))
-- return -EFAULT;
--
-- regs.version = (1 << 24) | bdp->rev_id;
-- regs_buff[0] = readb(&(bdp->scb->scb_cmd_hi)) << 24 |
-- readb(&(bdp->scb->scb_cmd_low)) << 16 |
-- readw(&(bdp->scb->scb_status));
-- e100_mdi_read(bdp, MII_NCONFIG, bdp->phy_addr, &mdi_reg);
-- regs_buff[1] = mdi_reg;
--
-- if(copy_to_user(addr, ®s, sizeof(regs)))
-- return -EFAULT;
--
-- addr += offsetof(struct ethtool_regs, data);
-- if(copy_to_user(addr, regs_buff, regs.len))
-- return -EFAULT;
--
-- return 0;
--}
--
--static int
--e100_ethtool_nway_rst(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
--
-- bdp = dev->priv;
--
-- if ((bdp->speed_duplex_caps & SUPPORTED_Autoneg) &&
-- (bdp->params.e100_speed_duplex == E100_AUTONEG)) {
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- e100_hw_init(bdp);
-- e100_open(dev);
-- }
-- } else {
-- return -EFAULT;
-- }
-- return 0;
--}
--
--static int
--e100_ethtool_get_drvinfo(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- struct ethtool_drvinfo info;
--
-- memset((void *) &info, 0, sizeof (info));
--
-- bdp = dev->priv;
--
-- strncpy(info.driver, e100_short_driver_name, sizeof (info.driver) - 1);
-- strncpy(info.version, e100_driver_version, sizeof (info.version) - 1);
-- strncpy(info.fw_version, "N/A",
-- sizeof (info.fw_version) - 1);
-- strncpy(info.bus_info, pci_name(bdp->pdev),
-- sizeof (info.bus_info) - 1);
-- info.n_stats = E100_STATS_LEN;
-- info.regdump_len = E100_REGS_LEN * sizeof(u32);
-- info.eedump_len = (bdp->eeprom_size << 1);
-- info.testinfo_len = max_test_res;
-- if (copy_to_user(ifr->ifr_data, &info, sizeof (info)))
-- return -EFAULT;
--
-- return 0;
--}
--
--static int
--e100_ethtool_eeprom(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- struct ethtool_eeprom ecmd;
-- u16 eeprom_data[256];
-- u16 *usr_eeprom_ptr;
-- u16 first_word, last_word;
-- int i, max_len;
-- void *ptr;
-- u8 *eeprom_data_bytes = (u8 *)eeprom_data;
--
-- bdp = dev->priv;
--
-- if (copy_from_user(&ecmd, ifr->ifr_data, sizeof (ecmd)))
-- return -EFAULT;
--
-- usr_eeprom_ptr =
-- (u16 *) (ifr->ifr_data + offsetof(struct ethtool_eeprom, data));
--
-- max_len = bdp->eeprom_size * 2;
--
-- if (ecmd.offset > ecmd.offset + ecmd.len)
-- return -EINVAL;
--
-- if ((ecmd.offset + ecmd.len) > max_len)
-- ecmd.len = (max_len - ecmd.offset);
--
-- first_word = ecmd.offset >> 1;
-- last_word = (ecmd.offset + ecmd.len - 1) >> 1;
--
-- if (first_word >= bdp->eeprom_size)
-- return -EFAULT;
--
-- if (ecmd.cmd == ETHTOOL_GEEPROM) {
-- for(i = 0; i <= (last_word - first_word); i++)
-- eeprom_data[i] = e100_eeprom_read(bdp, first_word + i);
--
-- ecmd.magic = E100_EEPROM_MAGIC;
--
-- if (copy_to_user(ifr->ifr_data, &ecmd, sizeof (ecmd)))
-- return -EFAULT;
--
-- if(ecmd.offset & 1)
-- eeprom_data_bytes++;
-- if (copy_to_user(usr_eeprom_ptr, eeprom_data_bytes, ecmd.len))
-- return -EFAULT;
-- } else {
-- if (ecmd.magic != E100_EEPROM_MAGIC)
-- return -EFAULT;
--
-- ptr = (void *)eeprom_data;
-- if(ecmd.offset & 1) {
-- /* need modification of first changed EEPROM word */
-- /* only the second byte of the word is being modified */
-- eeprom_data[0] = e100_eeprom_read(bdp, first_word);
-- ptr++;
-- }
-- if((ecmd.offset + ecmd.len) & 1) {
-- /* need modification of last changed EEPROM word */
-- /* only the first byte of the word is being modified */
-- eeprom_data[last_word - first_word] =
-- e100_eeprom_read(bdp, last_word);
-- }
-- if(copy_from_user(ptr, usr_eeprom_ptr, ecmd.len))
-- return -EFAULT;
--
-- e100_eeprom_write_block(bdp, first_word, eeprom_data,
-- last_word - first_word + 1);
--
-- if (copy_to_user(ifr->ifr_data, &ecmd, sizeof (ecmd)))
-- return -EFAULT;
-- }
-- return 0;
--}
--
--#define E100_BLINK_INTERVAL (HZ/4)
--/**
-- * e100_led_control
-- * @bdp: atapter's private data struct
-- * @led_mdi_op: led operation
-- *
-- * Software control over adapter's led. The possible operations are:
-- * TURN LED OFF, TURN LED ON and RETURN LED CONTROL TO HARDWARE.
-- */
--static void
--e100_led_control(struct e100_private *bdp, u16 led_mdi_op)
--{
-- e100_mdi_write(bdp, PHY_82555_LED_SWITCH_CONTROL,
-- bdp->phy_addr, led_mdi_op);
--
--}
--/**
-- * e100_led_blink_callback
-- * @data: pointer to atapter's private data struct
-- *
-- * Blink timer callback function. Toggles ON/OFF led status bit and calls
-- * led hardware access function.
-- */
--static void
--e100_led_blink_callback(unsigned long data)
--{
-- struct e100_private *bdp = (struct e100_private *) data;
--
-- if(bdp->flags & LED_IS_ON) {
-- bdp->flags &= ~LED_IS_ON;
-- e100_led_control(bdp, PHY_82555_LED_OFF);
-- } else {
-- bdp->flags |= LED_IS_ON;
-- if (bdp->rev_id >= D101MA_REV_ID)
-- e100_led_control(bdp, PHY_82555_LED_ON_559);
-- else
-- e100_led_control(bdp, PHY_82555_LED_ON_PRE_559);
-- }
--
-- mod_timer(&bdp->blink_timer, jiffies + E100_BLINK_INTERVAL);
--}
--/**
-- * e100_ethtool_led_blink
-- * @dev: pointer to atapter's net_device struct
-- * @ifr: pointer to ioctl request structure
-- *
-- * Blink led ioctl handler. Initialtes blink timer and sleeps until
-- * blink period expires. Than it kills timer and returns. The led control
-- * is returned back to hardware when blink timer is killed.
-- */
--static int
--e100_ethtool_led_blink(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- struct ethtool_value ecmd;
--
-- bdp = dev->priv;
--
-- if (copy_from_user(&ecmd, ifr->ifr_data, sizeof (ecmd)))
-- return -EFAULT;
--
-- if(!bdp->blink_timer.function) {
-- init_timer(&bdp->blink_timer);
-- bdp->blink_timer.function = e100_led_blink_callback;
-- bdp->blink_timer.data = (unsigned long) bdp;
-- }
--
-- mod_timer(&bdp->blink_timer, jiffies);
--
-- set_current_state(TASK_INTERRUPTIBLE);
--
-- if ((!ecmd.data) || (ecmd.data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ)))
-- ecmd.data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
--
-- schedule_timeout(ecmd.data * HZ);
--
-- del_timer_sync(&bdp->blink_timer);
--
-- e100_led_control(bdp, PHY_82555_LED_NORMAL_CONTROL);
--
-- return 0;
--}
--
--static inline int __devinit
--e100_10BaseT_adapter(struct e100_private *bdp)
--{
-- return ((bdp->pdev->device == 0x1229) &&
-- (bdp->pdev->subsystem_vendor == 0x8086) &&
-- (bdp->pdev->subsystem_device == 0x0003));
--}
--
--static void __devinit
--e100_get_speed_duplex_caps(struct e100_private *bdp)
--{
-- u16 status;
--
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &status);
--
-- bdp->speed_duplex_caps = 0;
--
-- bdp->speed_duplex_caps |=
-- (status & BMSR_ANEGCAPABLE) ? SUPPORTED_Autoneg : 0;
--
-- bdp->speed_duplex_caps |=
-- (status & BMSR_10HALF) ? SUPPORTED_10baseT_Half : 0;
--
-- bdp->speed_duplex_caps |=
-- (status & BMSR_10FULL) ? SUPPORTED_10baseT_Full : 0;
--
-- bdp->speed_duplex_caps |=
-- (status & BMSR_100HALF) ? SUPPORTED_100baseT_Half : 0;
--
-- bdp->speed_duplex_caps |=
-- (status & BMSR_100FULL) ? SUPPORTED_100baseT_Full : 0;
--
-- if (IS_NC3133(bdp))
-- bdp->speed_duplex_caps =
-- (SUPPORTED_FIBRE | SUPPORTED_100baseT_Full);
-- else
-- bdp->speed_duplex_caps |= SUPPORTED_TP;
--
-- if ((status == 0xFFFF) && e100_10BaseT_adapter(bdp)) {
-- bdp->speed_duplex_caps =
-- (SUPPORTED_10baseT_Half | SUPPORTED_TP);
-- } else {
-- bdp->speed_duplex_caps |= SUPPORTED_MII;
-- }
--
--}
--
--#ifdef CONFIG_PM
--static unsigned char
--e100_setup_filter(struct e100_private *bdp)
--{
-- cb_header_t *ntcb_hdr;
-- unsigned char res = false;
-- nxmit_cb_entry_t *cmd;
--
-- if ((cmd = e100_alloc_non_tx_cmd(bdp)) == NULL) {
-- goto exit;
-- }
--
-- ntcb_hdr = (cb_header_t *) cmd->non_tx_cmd;
-- ntcb_hdr->cb_cmd = __constant_cpu_to_le16(CB_LOAD_FILTER);
--
-- /* Set EL and FIX bit */
-- (cmd->non_tx_cmd)->ntcb.filter.filter_data[0] =
-- __constant_cpu_to_le32(CB_FILTER_EL | CB_FILTER_FIX);
--
-- if (bdp->wolopts & WAKE_UCAST) {
-- (cmd->non_tx_cmd)->ntcb.filter.filter_data[0] |=
-- __constant_cpu_to_le32(CB_FILTER_IA_MATCH);
-- }
--
-- if (bdp->wolopts & WAKE_ARP) {
-- /* Setup ARP bit and lower IP parts */
-- /* bdp->ip_lbytes contains 2 lower bytes of IP address in network byte order */
-- (cmd->non_tx_cmd)->ntcb.filter.filter_data[0] |=
-- cpu_to_le32(CB_FILTER_ARP | bdp->ip_lbytes);
-- }
--
-- res = e100_exec_non_cu_cmd(bdp, cmd);
-- if (!res)
-- printk(KERN_WARNING "e100: %s: Filter setup failed\n",
-- bdp->device->name);
--
--exit:
-- return res;
--
--}
--
--static void
--e100_do_wol(struct pci_dev *pcid, struct e100_private *bdp)
--{
-- e100_config_wol(bdp);
--
-- if (e100_config(bdp)) {
-- if (bdp->wolopts & (WAKE_UCAST | WAKE_ARP))
-- if (!e100_setup_filter(bdp))
-- printk(KERN_ERR
-- "e100: WOL options failed\n");
-- } else {
-- printk(KERN_ERR "e100: config WOL failed\n");
-- }
--}
--#endif
--
--static u16
--e100_get_ip_lbytes(struct net_device *dev)
--{
-- struct in_ifaddr *ifa;
-- struct in_device *in_dev;
-- u32 res = 0;
--
-- in_dev = (struct in_device *) dev->ip_ptr;
-- /* Check if any in_device bound to interface */
-- if (in_dev) {
-- /* Check if any IP address is bound to interface */
-- if ((ifa = in_dev->ifa_list) != NULL) {
-- res = __constant_ntohl(ifa->ifa_address);
-- res = __constant_htons(res & 0x0000ffff);
-- }
-- }
-- return res;
--}
--
--static int
--e100_ethtool_wol(struct net_device *dev, struct ifreq *ifr)
--{
-- struct e100_private *bdp;
-- struct ethtool_wolinfo wolinfo;
-- int res = 0;
--
-- bdp = dev->priv;
--
-- if (copy_from_user(&wolinfo, ifr->ifr_data, sizeof (wolinfo))) {
-- return -EFAULT;
-- }
--
-- switch (wolinfo.cmd) {
-- case ETHTOOL_GWOL:
-- wolinfo.supported = bdp->wolsupported;
-- wolinfo.wolopts = bdp->wolopts;
-- if (copy_to_user(ifr->ifr_data, &wolinfo, sizeof (wolinfo)))
-- res = -EFAULT;
-- break;
-- case ETHTOOL_SWOL:
-- /* If ALL requests are supported or request is DISABLE wol */
-- if (((wolinfo.wolopts & bdp->wolsupported) == wolinfo.wolopts)
-- || (wolinfo.wolopts == 0)) {
-- bdp->wolopts = wolinfo.wolopts;
-- } else {
-- res = -EOPNOTSUPP;
-- }
-- if (wolinfo.wolopts & WAKE_ARP)
-- bdp->ip_lbytes = e100_get_ip_lbytes(dev);
-- break;
-- default:
-- break;
-- }
-- return res;
--}
--
--static int e100_ethtool_gstrings(struct net_device *dev, struct ifreq *ifr)
--{
-- struct ethtool_gstrings info;
-- char *strings = NULL;
-- char *usr_strings;
-- int i;
--
-- memset((void *) &info, 0, sizeof(info));
--
-- usr_strings = (u8 *) (ifr->ifr_data +
-- offsetof(struct ethtool_gstrings, data));
--
-- if (copy_from_user(&info, ifr->ifr_data, sizeof (info)))
-- return -EFAULT;
--
-- switch (info.string_set) {
-- case ETH_SS_TEST: {
-- int ret = 0;
-- if (info.len > max_test_res)
-- info.len = max_test_res;
-- strings = kmalloc(info.len * ETH_GSTRING_LEN, GFP_ATOMIC);
-- if (!strings)
-- return -ENOMEM;
-- memset(strings, 0, info.len * ETH_GSTRING_LEN);
--
-- for (i = 0; i < info.len; i++) {
-- sprintf(strings + i * ETH_GSTRING_LEN, "%s",
-- test_strings[i]);
-- }
-- if (copy_to_user(ifr->ifr_data, &info, sizeof (info)))
-- ret = -EFAULT;
-- if (copy_to_user(usr_strings, strings, info.len * ETH_GSTRING_LEN))
-- ret = -EFAULT;
-- kfree(strings);
-- return ret;
-- }
-- case ETH_SS_STATS: {
-- char *strings = NULL;
-- void *addr = ifr->ifr_data;
-- info.len = E100_STATS_LEN;
-- strings = *e100_gstrings_stats;
-- if(copy_to_user(ifr->ifr_data, &info, sizeof(info)))
-- return -EFAULT;
-- addr += offsetof(struct ethtool_gstrings, data);
-- if(copy_to_user(addr, strings,
-- info.len * ETH_GSTRING_LEN))
-- return -EFAULT;
-- return 0;
-- }
-- default:
-- return -EOPNOTSUPP;
-- }
--}
--
--static int
--e100_mii_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
--{
-- struct e100_private *bdp;
-- struct mii_ioctl_data *data_ptr =
-- (struct mii_ioctl_data *) &(ifr->ifr_data);
--
-- bdp = dev->priv;
--
-- switch (cmd) {
-- case SIOCGMIIPHY:
-- data_ptr->phy_id = bdp->phy_addr & 0x1f;
-- break;
--
-- case SIOCGMIIREG:
-- if (!capable(CAP_NET_ADMIN))
-- return -EPERM;
-- e100_mdi_read(bdp, data_ptr->reg_num & 0x1f, bdp->phy_addr,
-- &(data_ptr->val_out));
-- break;
--
-- case SIOCSMIIREG:
-- if (!capable(CAP_NET_ADMIN))
-- return -EPERM;
-- /* If reg = 0 && change speed/duplex */
-- if (data_ptr->reg_num == 0 &&
-- (data_ptr->val_in == (BMCR_ANENABLE | BMCR_ANRESTART) /* restart cmd */
-- || data_ptr->val_in == (BMCR_RESET) /* reset cmd */
-- || data_ptr->val_in & (BMCR_SPEED100 | BMCR_FULLDPLX)
-- || data_ptr->val_in == 0)) {
-- if (data_ptr->val_in == (BMCR_ANENABLE | BMCR_ANRESTART)
-- || data_ptr->val_in == (BMCR_RESET))
-- bdp->params.e100_speed_duplex = E100_AUTONEG;
-- else if (data_ptr->val_in == (BMCR_SPEED100 | BMCR_FULLDPLX))
-- bdp->params.e100_speed_duplex = E100_SPEED_100_FULL;
-- else if (data_ptr->val_in == (BMCR_SPEED100))
-- bdp->params.e100_speed_duplex = E100_SPEED_100_HALF;
-- else if (data_ptr->val_in == (BMCR_FULLDPLX))
-- bdp->params.e100_speed_duplex = E100_SPEED_10_FULL;
-- else
-- bdp->params.e100_speed_duplex = E100_SPEED_10_HALF;
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- e100_hw_init(bdp);
-- e100_open(dev);
-- }
-- }
-- else
-- /* Only allows changing speed/duplex */
-- return -EINVAL;
--
-- break;
--
-- default:
-- return -EOPNOTSUPP;
-- }
-- return 0;
--}
--
--nxmit_cb_entry_t *
--e100_alloc_non_tx_cmd(struct e100_private *bdp)
--{
-- nxmit_cb_entry_t *non_tx_cmd_elem;
--
-- if (!(non_tx_cmd_elem = (nxmit_cb_entry_t *)
-- kmalloc(sizeof (nxmit_cb_entry_t), GFP_ATOMIC))) {
-- return NULL;
-- }
-- non_tx_cmd_elem->non_tx_cmd =
-- pci_alloc_consistent(bdp->pdev, sizeof (nxmit_cb_t),
-- &(non_tx_cmd_elem->dma_addr));
-- if (non_tx_cmd_elem->non_tx_cmd == NULL) {
-- kfree(non_tx_cmd_elem);
-- return NULL;
-- }
-- return non_tx_cmd_elem;
--}
--
--void
--e100_free_non_tx_cmd(struct e100_private *bdp,
-- nxmit_cb_entry_t *non_tx_cmd_elem)
--{
-- pci_free_consistent(bdp->pdev, sizeof (nxmit_cb_t),
-- non_tx_cmd_elem->non_tx_cmd,
-- non_tx_cmd_elem->dma_addr);
-- kfree(non_tx_cmd_elem);
--}
--
--static void
--e100_free_nontx_list(struct e100_private *bdp)
--{
-- nxmit_cb_entry_t *command;
-- int i;
--
-- while (!list_empty(&bdp->non_tx_cmd_list)) {
-- command = list_entry(bdp->non_tx_cmd_list.next,
-- nxmit_cb_entry_t, list_elem);
-- list_del(&(command->list_elem));
-- e100_free_non_tx_cmd(bdp, command);
-- }
--
-- for (i = 0; i < CB_MAX_NONTX_CMD; i++) {
-- bdp->same_cmd_entry[i] = NULL;
-- }
--}
--
--static unsigned char
--e100_delayed_exec_non_cu_cmd(struct e100_private *bdp,
-- nxmit_cb_entry_t *command)
--{
-- nxmit_cb_entry_t *same_command;
-- cb_header_t *ntcb_hdr;
-- u16 cmd;
--
-- ntcb_hdr = (cb_header_t *) command->non_tx_cmd;
--
-- cmd = CB_CMD_MASK & le16_to_cpu(ntcb_hdr->cb_cmd);
--
-- spin_lock_bh(&(bdp->bd_non_tx_lock));
--
-- same_command = bdp->same_cmd_entry[cmd];
--
-- if (same_command != NULL) {
-- memcpy((void *) (same_command->non_tx_cmd),
-- (void *) (command->non_tx_cmd), sizeof (nxmit_cb_t));
-- e100_free_non_tx_cmd(bdp, command);
-- } else {
-- list_add_tail(&(command->list_elem), &(bdp->non_tx_cmd_list));
-- bdp->same_cmd_entry[cmd] = command;
-- }
--
-- if (bdp->non_tx_command_state == E100_NON_TX_IDLE) {
-- bdp->non_tx_command_state = E100_WAIT_TX_FINISH;
-- mod_timer(&(bdp->nontx_timer_id), jiffies + 1);
-- }
--
-- spin_unlock_bh(&(bdp->bd_non_tx_lock));
-- return true;
--}
--
--static void
--e100_non_tx_background(unsigned long ptr)
--{
-- struct e100_private *bdp = (struct e100_private *) ptr;
-- nxmit_cb_entry_t *active_command;
-- int restart = true;
-- cb_header_t *non_tx_cmd;
-- u8 sub_cmd;
--
-- spin_lock_bh(&(bdp->bd_non_tx_lock));
--
-- switch (bdp->non_tx_command_state) {
-- case E100_WAIT_TX_FINISH:
-- if (bdp->last_tcb != NULL) {
-- rmb();
-- if ((bdp->last_tcb->tcb_hdr.cb_status &
-- __constant_cpu_to_le16(CB_STATUS_COMPLETE)) == 0)
-- goto exit;
-- }
-- if ((readw(&bdp->scb->scb_status) & SCB_CUS_MASK) ==
-- SCB_CUS_ACTIVE) {
-- goto exit;
-- }
-- break;
--
-- case E100_WAIT_NON_TX_FINISH:
-- active_command = list_entry(bdp->non_tx_cmd_list.next,
-- nxmit_cb_entry_t, list_elem);
-- rmb();
--
-- if (((((cb_header_t *) (active_command->non_tx_cmd))->cb_status
-- & __constant_cpu_to_le16(CB_STATUS_COMPLETE)) == 0)
-- && time_before(jiffies, active_command->expiration_time)) {
-- goto exit;
-- } else {
-- non_tx_cmd = (cb_header_t *) active_command->non_tx_cmd;
-- sub_cmd = CB_CMD_MASK & le16_to_cpu(non_tx_cmd->cb_cmd);
--#ifdef E100_CU_DEBUG
-- if (!(non_tx_cmd->cb_status
-- & __constant_cpu_to_le16(CB_STATUS_COMPLETE)))
-- printk(KERN_ERR "e100: %s: Queued "
-- "command (%x) timeout\n",
-- bdp->device->name, sub_cmd);
--#endif
-- list_del(&(active_command->list_elem));
-- e100_free_non_tx_cmd(bdp, active_command);
-- }
-- break;
--
-- default:
-- break;
-- } //switch
--
-- if (list_empty(&bdp->non_tx_cmd_list)) {
-- bdp->non_tx_command_state = E100_NON_TX_IDLE;
-- spin_lock_irq(&(bdp->bd_lock));
-- bdp->next_cu_cmd = START_WAIT;
-- spin_unlock_irq(&(bdp->bd_lock));
-- restart = false;
-- goto exit;
-- } else {
-- u16 cmd_type;
--
-- bdp->non_tx_command_state = E100_WAIT_NON_TX_FINISH;
-- active_command = list_entry(bdp->non_tx_cmd_list.next,
-- nxmit_cb_entry_t, list_elem);
-- sub_cmd = ((cb_header_t *) active_command->non_tx_cmd)->cb_cmd;
-- spin_lock_irq(&(bdp->bd_lock));
-- e100_wait_exec_cmplx(bdp, active_command->dma_addr,
-- SCB_CUC_START, sub_cmd);
-- spin_unlock_irq(&(bdp->bd_lock));
-- active_command->expiration_time = jiffies + HZ;
-- cmd_type = CB_CMD_MASK &
-- le16_to_cpu(((cb_header_t *)
-- (active_command->non_tx_cmd))->cb_cmd);
-- bdp->same_cmd_entry[cmd_type] = NULL;
-- }
--
--exit:
-- if (restart) {
-- mod_timer(&(bdp->nontx_timer_id), jiffies + 1);
-- } else {
-- if (netif_running(bdp->device))
-- netif_wake_queue(bdp->device);
-- }
-- spin_unlock_bh(&(bdp->bd_non_tx_lock));
--}
--
--static void
--e100_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
--{
-- struct e100_private *bdp = netdev->priv;
--
-- e100_disable_clear_intr(bdp);
-- bdp->vlgrp = grp;
--
-- if(grp) {
-- /* enable VLAN tag insert/strip */
-- e100_config_vlan_drop(bdp, true);
--
-- } else {
-- /* disable VLAN tag insert/strip */
-- e100_config_vlan_drop(bdp, false);
-- }
--
-- e100_config(bdp);
-- e100_set_intr_mask(bdp);
--}
--
--static void
--e100_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
--{
-- /* We don't do Vlan filtering */
-- return;
--}
--
--static void
--e100_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
--{
-- struct e100_private *bdp = netdev->priv;
--
-- if(bdp->vlgrp)
-- bdp->vlgrp->vlan_devices[vid] = NULL;
-- /* We don't do Vlan filtering */
-- return;
--}
--
--#ifdef CONFIG_PM
--static int
--e100_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
--{
-- struct pci_dev *pdev = NULL;
--
-- switch(event) {
-- case SYS_DOWN:
-- case SYS_HALT:
-- case SYS_POWER_OFF:
-- while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) {
-- if(pci_dev_driver(pdev) == &e100_driver) {
-- /* If net_device struct is allocated? */
-- if (pci_get_drvdata(pdev))
-- e100_suspend(pdev, 3);
--
-- }
-- }
-- }
-- return NOTIFY_DONE;
--}
--
--static int
--e100_suspend(struct pci_dev *pcid, u32 state)
--{
-- struct net_device *netdev = pci_get_drvdata(pcid);
-- struct e100_private *bdp = netdev->priv;
--
-- e100_isolate_driver(bdp);
-- pci_save_state(pcid, bdp->pci_state);
--
-- /* Enable or disable WoL */
-- e100_do_wol(pcid, bdp);
--
-- /* If wol is enabled */
-- if (bdp->wolopts || e100_asf_enabled(bdp)) {
-- pci_enable_wake(pcid, 3, 1); /* Enable PME for power state D3 */
-- pci_set_power_state(pcid, 3); /* Set power state to D3. */
-- } else {
-- /* Disable bus mastering */
-- pci_disable_device(pcid);
-- pci_set_power_state(pcid, state);
-- }
-- return 0;
--}
--
--static int
--e100_resume(struct pci_dev *pcid)
--{
-- struct net_device *netdev = pci_get_drvdata(pcid);
-- struct e100_private *bdp = netdev->priv;
--
-- pci_set_power_state(pcid, 0);
-- pci_enable_wake(pcid, 0, 0); /* Clear PME status and disable PME */
-- pci_restore_state(pcid, bdp->pci_state);
--
-- /* Also do device full reset because device was in D3 state */
-- e100_deisolate_driver(bdp, true);
--
-- return 0;
--}
--
--/**
-- * e100_asf_enabled - checks if ASF is configured on the current adaper
-- * by reading registers 0xD and 0x90 in the EEPROM
-- * @bdp: atapter's private data struct
-- *
-- * Returns: true if ASF is enabled
-- */
--static unsigned char
--e100_asf_enabled(struct e100_private *bdp)
--{
-- u16 asf_reg;
-- u16 smbus_addr_reg;
-- if ((bdp->pdev->device >= 0x1050) && (bdp->pdev->device <= 0x1055)) {
-- asf_reg = e100_eeprom_read(bdp, EEPROM_CONFIG_ASF);
-- if ((asf_reg & EEPROM_FLAG_ASF)
-- && !(asf_reg & EEPROM_FLAG_GCL)) {
-- smbus_addr_reg =
-- e100_eeprom_read(bdp, EEPROM_SMBUS_ADDR);
-- if ((smbus_addr_reg & 0xFF) != 0xFE)
-- return true;
-- }
-- }
-- return false;
--}
--#endif /* CONFIG_PM */
--
--#ifdef E100_CU_DEBUG
--unsigned char
--e100_cu_unknown_state(struct e100_private *bdp)
--{
-- u8 scb_cmd_low;
-- u16 scb_status;
-- scb_cmd_low = bdp->scb->scb_cmd_low;
-- scb_status = le16_to_cpu(bdp->scb->scb_status);
-- /* If CU is active and executing unknown cmd */
-- if (scb_status & SCB_CUS_ACTIVE && scb_cmd_low & SCB_CUC_UNKNOWN)
-- return true;
-- else
-- return false;
--}
--#endif
--
---- linux-2.6.0/drivers/net/e100/e100_phy.c 2003-07-13 21:44:34.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,1163 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--#include "e100_phy.h"
--
--void e100_handle_zlock(struct e100_private *bdp);
--
--/*
-- * Procedure: e100_mdi_write
-- *
-- * Description: This routine will write a value to the specified MII register
-- * of an external MDI compliant device (e.g. PHY 100). The
-- * command will execute in polled mode.
-- *
-- * Arguments:
-- * bdp - Ptr to this card's e100_bdconfig structure
-- * reg_addr - The MII register that we are writing to
-- * phy_addr - The MDI address of the Phy component.
-- * data - The value that we are writing to the MII register.
-- *
-- * Returns:
-- * NOTHING
-- */
--int
--e100_mdi_write(struct e100_private *bdp, u32 reg_addr, u32 phy_addr, u16 data)
--{
-- int e100_retry;
-- u32 temp_val;
-- unsigned int mdi_cntrl;
--
-- spin_lock_bh(&bdp->mdi_access_lock);
-- temp_val = (((u32) data) | (reg_addr << 16) |
-- (phy_addr << 21) | (MDI_WRITE << 26));
-- writel(temp_val, &bdp->scb->scb_mdi_cntrl);
-- readw(&bdp->scb->scb_status);
--
-- /* wait 20usec before checking status */
-- udelay(20);
--
-- /* poll for the mdi write to complete */
-- e100_retry = E100_CMD_WAIT;
-- while ((!((mdi_cntrl = readl(&bdp->scb->scb_mdi_cntrl)) & MDI_PHY_READY)) && (e100_retry)) {
--
-- udelay(20);
-- e100_retry--;
-- }
-- spin_unlock_bh(&bdp->mdi_access_lock);
-- if (mdi_cntrl & MDI_PHY_READY)
-- return 0;
-- else {
-- printk(KERN_ERR "e100: MDI write timeout\n");
-- return 1;
-- }
--}
--
--/*
-- * Procedure: e100_mdi_read
-- *
-- * Description: This routine will read a value from the specified MII register
-- * of an external MDI compliant device (e.g. PHY 100), and return
-- * it to the calling routine. The command will execute in polled
-- * mode.
-- *
-- * Arguments:
-- * bdp - Ptr to this card's e100_bdconfig structure
-- * reg_addr - The MII register that we are reading from
-- * phy_addr - The MDI address of the Phy component.
-- *
-- * Results:
-- * data - The value that we read from the MII register.
-- *
-- * Returns:
-- * NOTHING
-- */
--int
--e100_mdi_read(struct e100_private *bdp, u32 reg_addr, u32 phy_addr, u16 *data)
--{
-- int e100_retry;
-- u32 temp_val;
-- unsigned int mdi_cntrl;
--
-- spin_lock_bh(&bdp->mdi_access_lock);
-- /* Issue the read command to the MDI control register. */
-- temp_val = ((reg_addr << 16) | (phy_addr << 21) | (MDI_READ << 26));
-- writel(temp_val, &bdp->scb->scb_mdi_cntrl);
-- readw(&bdp->scb->scb_status);
--
-- /* wait 20usec before checking status */
-- udelay(20);
--
-- /* poll for the mdi read to complete */
-- e100_retry = E100_CMD_WAIT;
-- while ((!((mdi_cntrl = readl(&bdp->scb->scb_mdi_cntrl)) & MDI_PHY_READY)) && (e100_retry)) {
--
-- udelay(20);
-- e100_retry--;
-- }
--
-- spin_unlock_bh(&bdp->mdi_access_lock);
-- if (mdi_cntrl & MDI_PHY_READY) {
-- /* return the lower word */
-- *data = (u16) mdi_cntrl;
-- return 0;
-- }
-- else {
-- printk(KERN_ERR "e100: MDI read timeout\n");
-- return 1;
-- }
--}
--
--static unsigned char __devinit
--e100_phy_valid(struct e100_private *bdp, unsigned int phy_address)
--{
-- u16 ctrl_reg, stat_reg;
--
-- /* Read the MDI control register */
-- e100_mdi_read(bdp, MII_BMCR, phy_address, &ctrl_reg);
--
-- /* Read the status register twice, bacause of sticky bits */
-- e100_mdi_read(bdp, MII_BMSR, phy_address, &stat_reg);
-- e100_mdi_read(bdp, MII_BMSR, phy_address, &stat_reg);
--
-- if ((ctrl_reg == 0xffff) || ((stat_reg == 0) && (ctrl_reg == 0)))
-- return false;
--
-- return true;
--}
--
--static void __devinit
--e100_phy_address_detect(struct e100_private *bdp)
--{
-- unsigned int addr;
-- unsigned char valid_phy_found = false;
--
-- if (IS_NC3133(bdp)) {
-- bdp->phy_addr = 0;
-- return;
-- }
--
-- if (e100_phy_valid(bdp, PHY_DEFAULT_ADDRESS)) {
-- bdp->phy_addr = PHY_DEFAULT_ADDRESS;
-- valid_phy_found = true;
--
-- } else {
-- for (addr = MIN_PHY_ADDR; addr <= MAX_PHY_ADDR; addr++) {
-- if (e100_phy_valid(bdp, addr)) {
-- bdp->phy_addr = addr;
-- valid_phy_found = true;
-- break;
-- }
-- }
-- }
--
-- if (!valid_phy_found) {
-- bdp->phy_addr = PHY_ADDRESS_503;
-- }
--}
--
--static void __devinit
--e100_phy_id_detect(struct e100_private *bdp)
--{
-- u16 low_id_reg, high_id_reg;
--
-- if (bdp->phy_addr == PHY_ADDRESS_503) {
-- bdp->PhyId = PHY_503;
-- return;
-- }
-- if (!(bdp->flags & IS_ICH)) {
-- if (bdp->rev_id >= D102_REV_ID) {
-- bdp->PhyId = PHY_82562ET;
-- return;
-- }
-- }
--
-- /* Read phy id from the MII register */
-- e100_mdi_read(bdp, MII_PHYSID1, bdp->phy_addr, &low_id_reg);
-- e100_mdi_read(bdp, MII_PHYSID2, bdp->phy_addr, &high_id_reg);
--
-- bdp->PhyId = ((unsigned int) low_id_reg |
-- ((unsigned int) high_id_reg << 16));
--}
--
--static void __devinit
--e100_phy_isolate(struct e100_private *bdp)
--{
-- unsigned int phy_address;
-- u16 ctrl_reg;
--
-- /* Go over all phy addresses. Deisolate the selected one, and isolate
-- * all the rest */
-- for (phy_address = 0; phy_address <= MAX_PHY_ADDR; phy_address++) {
-- if (phy_address != bdp->phy_addr) {
-- e100_mdi_write(bdp, MII_BMCR, phy_address,
-- BMCR_ISOLATE);
--
-- } else {
-- e100_mdi_read(bdp, MII_BMCR, bdp->phy_addr, &ctrl_reg);
-- ctrl_reg &= ~BMCR_ISOLATE;
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, ctrl_reg);
-- }
--
-- udelay(100);
-- }
--}
--
--static unsigned char __devinit
--e100_phy_specific_setup(struct e100_private *bdp)
--{
-- u16 misc_reg;
--
-- if (bdp->phy_addr == PHY_ADDRESS_503) {
-- switch (bdp->params.e100_speed_duplex) {
-- case E100_AUTONEG:
-- /* The adapter can't autoneg. so set to 10/HALF */
-- printk(KERN_INFO
-- "e100: 503 serial component detected which "
-- "cannot autonegotiate\n");
-- printk(KERN_INFO
-- "e100: speed/duplex forced to "
-- "10Mbps / Half duplex\n");
-- bdp->params.e100_speed_duplex = E100_SPEED_10_HALF;
-- break;
--
-- case E100_SPEED_100_HALF:
-- case E100_SPEED_100_FULL:
-- printk(KERN_ERR
-- "e100: 503 serial component detected "
-- "which does not support 100Mbps\n");
-- printk(KERN_ERR
-- "e100: Change the forced speed/duplex "
-- "to a supported setting\n");
-- return false;
-- }
--
-- return true;
-- }
--
-- if (IS_NC3133(bdp)) {
-- u16 int_reg;
--
-- /* enable 100BASE fiber interface */
-- e100_mdi_write(bdp, MDI_NC3133_CONFIG_REG, bdp->phy_addr,
-- MDI_NC3133_100FX_ENABLE);
--
-- if ((bdp->params.e100_speed_duplex != E100_AUTONEG) &&
-- (bdp->params.e100_speed_duplex != E100_SPEED_100_FULL)) {
-- /* just inform user about 100 full */
-- printk(KERN_ERR "e100: NC3133 NIC can only run "
-- "at 100Mbps full duplex\n");
-- }
--
-- bdp->params.e100_speed_duplex = E100_SPEED_100_FULL;
--
-- /* enable interrupts */
-- e100_mdi_read(bdp, MDI_NC3133_INT_ENABLE_REG,
-- bdp->phy_addr, &int_reg);
-- int_reg |= MDI_NC3133_INT_ENABLE;
-- e100_mdi_write(bdp, MDI_NC3133_INT_ENABLE_REG,
-- bdp->phy_addr, int_reg);
-- }
--
-- /* Handle the National TX */
-- if ((bdp->PhyId & PHY_MODEL_REV_ID_MASK) == PHY_NSC_TX) {
-- e100_mdi_read(bdp, NSC_CONG_CONTROL_REG,
-- bdp->phy_addr, &misc_reg);
--
-- misc_reg |= NSC_TX_CONG_TXREADY;
--
-- /* disable the congestion control bit in the National Phy */
-- misc_reg &= ~NSC_TX_CONG_ENABLE;
--
-- e100_mdi_write(bdp, NSC_CONG_CONTROL_REG,
-- bdp->phy_addr, misc_reg);
-- }
--
-- return true;
--}
--
--/*
-- * Procedure: e100_phy_fix_squelch
-- *
-- * Description:
-- * Help find link on certain rare scenarios.
-- * NOTE: This routine must be called once per watchdog,
-- * and *after* setting the current link state.
-- *
-- * Arguments:
-- * bdp - Ptr to this card's e100_bdconfig structure
-- *
-- * Returns:
-- * NOTHING
-- */
--static void
--e100_phy_fix_squelch(struct e100_private *bdp)
--{
-- if ((bdp->PhyId != PHY_82555_TX) || (bdp->flags & DF_SPEED_FORCED))
-- return;
--
-- if (netif_carrier_ok(bdp->device)) {
-- switch (bdp->PhyState) {
-- case 0:
-- break;
-- case 1:
-- e100_mdi_write(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr, 0x0000);
-- break;
-- case 2:
-- e100_mdi_write(bdp, PHY_82555_MDI_EQUALIZER_CSR,
-- bdp->phy_addr, 0x3000);
-- break;
-- }
-- bdp->PhyState = 0;
-- bdp->PhyDelay = 0;
--
-- } else if (!bdp->PhyDelay--) {
-- switch (bdp->PhyState) {
-- case 0:
-- e100_mdi_write(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr, EXTENDED_SQUELCH_BIT);
-- bdp->PhyState = 1;
-- break;
-- case 1:
-- e100_mdi_write(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr, 0x0000);
-- e100_mdi_write(bdp, PHY_82555_MDI_EQUALIZER_CSR,
-- bdp->phy_addr, 0x2010);
-- bdp->PhyState = 2;
-- break;
-- case 2:
-- e100_mdi_write(bdp, PHY_82555_MDI_EQUALIZER_CSR,
-- bdp->phy_addr, 0x3000);
-- bdp->PhyState = 0;
-- break;
-- }
--
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr,
-- BMCR_ANENABLE | BMCR_ANRESTART);
-- bdp->PhyDelay = 3;
-- }
--}
--
--/*
-- * Procedure: e100_fix_polarity
-- *
-- * Description:
-- * Fix for 82555 auto-polarity toggle problem. With a short cable
-- * connecting an 82555 with an 840A link partner, if the medium is noisy,
-- * the 82555 sometime thinks that the polarity might be wrong and so
-- * toggles polarity. This happens repeatedly and results in a high bit
-- * error rate.
-- * NOTE: This happens only at 10 Mbps
-- *
-- * Arguments:
-- * bdp - Ptr to this card's e100_bdconfig structure
-- *
-- * Returns:
-- * NOTHING
-- */
--static void __devinit
--e100_fix_polarity(struct e100_private *bdp)
--{
-- u16 status;
-- u16 errors;
-- u16 misc_reg;
-- int speed;
--
-- if ((bdp->PhyId != PHY_82555_TX) && (bdp->PhyId != PHY_82562ET) &&
-- (bdp->PhyId != PHY_82562EM))
-- return;
--
-- /* If the user wants auto-polarity disabled, do only that and nothing *
-- * else. * e100_autopolarity == 0 means disable --- we do just the
-- * disabling * e100_autopolarity == 1 means enable --- we do nothing at
-- * all * e100_autopolarity >= 2 means we do the workaround code. */
-- /* Change for 82558 enhancement */
-- switch (E100_AUTOPOLARITY) {
-- case 0:
-- e100_mdi_read(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr, &misc_reg);
-- e100_mdi_write(bdp, PHY_82555_SPECIAL_CONTROL, bdp->phy_addr,
-- (u16) (misc_reg | DISABLE_AUTO_POLARITY));
-- break;
--
-- case 1:
-- e100_mdi_read(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr, &misc_reg);
-- e100_mdi_write(bdp, PHY_82555_SPECIAL_CONTROL, bdp->phy_addr,
-- (u16) (misc_reg & ~DISABLE_AUTO_POLARITY));
-- break;
--
-- case 2:
-- /* we do this only if link is up */
-- if (!netif_carrier_ok(bdp->device)) {
-- break;
-- }
--
-- e100_mdi_read(bdp, PHY_82555_CSR, bdp->phy_addr, &status);
-- speed = (status & PHY_82555_SPEED_BIT) ? 100 : 10;
--
-- /* we need to do this only if speed is 10 */
-- if (speed != 10) {
-- break;
-- }
--
-- /* see if we have any end of frame errors */
-- e100_mdi_read(bdp, PHY_82555_EOF_COUNTER,
-- bdp->phy_addr, &errors);
--
-- /* if non-zero, wait for 100 ms before reading again */
-- if (errors) {
-- udelay(200);
-- e100_mdi_read(bdp, PHY_82555_EOF_COUNTER,
-- bdp->phy_addr, &errors);
--
-- /* if non-zero again, we disable polarity */
-- if (errors) {
-- e100_mdi_read(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr, &misc_reg);
-- e100_mdi_write(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr,
-- (u16) (misc_reg |
-- DISABLE_AUTO_POLARITY));
-- }
-- }
--
-- if (!errors) {
-- /* it is safe to read the polarity now */
-- e100_mdi_read(bdp, PHY_82555_CSR,
-- bdp->phy_addr, &status);
--
-- /* if polarity is normal, disable polarity */
-- if (!(status & PHY_82555_POLARITY_BIT)) {
-- e100_mdi_read(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr, &misc_reg);
-- e100_mdi_write(bdp, PHY_82555_SPECIAL_CONTROL,
-- bdp->phy_addr,
-- (u16) (misc_reg |
-- DISABLE_AUTO_POLARITY));
-- }
-- }
-- break;
--
-- default:
-- break;
-- }
--}
--
--/*
-- * Procedure: e100_find_speed_duplex
-- *
-- * Description: This routine will figure out what line speed and duplex mode
-- * the PHY is currently using.
-- *
-- * Arguments:
-- * bdp - Ptr to this card's e100_bdconfig structure
-- *
-- * Returns:
-- * NOTHING
-- */
--static void
--e100_find_speed_duplex(struct e100_private *bdp)
--{
-- unsigned int PhyId;
-- u16 stat_reg, misc_reg;
-- u16 ad_reg, lp_ad_reg;
--
-- PhyId = bdp->PhyId & PHY_MODEL_REV_ID_MASK;
--
-- /* First we should check to see if we have link */
-- /* If we don't have a link no reason to print a speed and duplex */
-- if (!e100_update_link_state(bdp)) {
-- bdp->cur_line_speed = 0;
-- bdp->cur_dplx_mode = 0;
-- return;
-- }
--
-- /* On the 82559 and later controllers, speed/duplex is part of the *
-- * SCB. So, we save an mdi_read and get these from the SCB. * */
-- if (bdp->rev_id >= D101MA_REV_ID) {
-- /* Read speed */
-- if (readb(&bdp->scb->scb_ext.d101m_scb.scb_gen_stat) & BIT_1)
-- bdp->cur_line_speed = 100;
-- else
-- bdp->cur_line_speed = 10;
--
-- /* Read duplex */
-- if (readb(&bdp->scb->scb_ext.d101m_scb.scb_gen_stat) & BIT_2)
-- bdp->cur_dplx_mode = FULL_DUPLEX;
-- else
-- bdp->cur_dplx_mode = HALF_DUPLEX;
--
-- return;
-- }
--
-- /* If this is a Phy 100, then read bits 1 and 0 of extended register 0,
-- * to get the current speed and duplex settings. */
-- if ((PhyId == PHY_100_A) || (PhyId == PHY_100_C) ||
-- (PhyId == PHY_82555_TX)) {
--
-- /* Read Phy 100 extended register 0 */
-- e100_mdi_read(bdp, EXTENDED_REG_0, bdp->phy_addr, &misc_reg);
--
-- /* Get current speed setting */
-- if (misc_reg & PHY_100_ER0_SPEED_INDIC)
-- bdp->cur_line_speed = 100;
-- else
-- bdp->cur_line_speed = 10;
--
-- /* Get current duplex setting -- FDX enabled if bit is set */
-- if (misc_reg & PHY_100_ER0_FDX_INDIC)
-- bdp->cur_dplx_mode = FULL_DUPLEX;
-- else
-- bdp->cur_dplx_mode = HALF_DUPLEX;
--
-- return;
-- }
--
-- /* See if link partner is capable of Auto-Negotiation (bit 0, reg 6) */
-- e100_mdi_read(bdp, MII_EXPANSION, bdp->phy_addr, &misc_reg);
--
-- /* See if Auto-Negotiation was complete (bit 5, reg 1) */
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &stat_reg);
--
-- /* If a True NWAY connection was made, then we can detect speed/dplx
-- * by ANDing our adapter's advertised abilities with our link partner's
-- * advertised ablilities, and then assuming that the highest common
-- * denominator was chosed by NWAY. */
-- if ((misc_reg & EXPANSION_NWAY) && (stat_reg & BMSR_ANEGCOMPLETE)) {
--
-- /* Read our advertisement register */
-- e100_mdi_read(bdp, MII_ADVERTISE, bdp->phy_addr, &ad_reg);
--
-- /* Read our link partner's advertisement register */
-- e100_mdi_read(bdp, MII_LPA, bdp->phy_addr, &lp_ad_reg);
--
-- /* AND the two advertisement registers together, and get rid
-- * of any extraneous bits. */
-- ad_reg &= (lp_ad_reg & NWAY_LP_ABILITY);
--
-- /* Get speed setting */
-- if (ad_reg &
-- (ADVERTISE_100HALF | ADVERTISE_100FULL |
-- ADVERTISE_100BASE4))
--
-- bdp->cur_line_speed = 100;
-- else
-- bdp->cur_line_speed = 10;
--
-- /* Get duplex setting -- use priority resolution algorithm */
-- if (ad_reg & ADVERTISE_100BASE4) {
-- bdp->cur_dplx_mode = HALF_DUPLEX;
-- } else if (ad_reg & ADVERTISE_100FULL) {
-- bdp->cur_dplx_mode = FULL_DUPLEX;
-- } else if (ad_reg & ADVERTISE_100HALF) {
-- bdp->cur_dplx_mode = HALF_DUPLEX;
-- } else if (ad_reg & ADVERTISE_10FULL) {
-- bdp->cur_dplx_mode = FULL_DUPLEX;
-- } else {
-- bdp->cur_dplx_mode = HALF_DUPLEX;
-- }
--
-- return;
-- }
--
-- /* If we are connected to a dumb (non-NWAY) repeater or hub, and the
-- * line speed was determined automatically by parallel detection, then
-- * we have no way of knowing exactly what speed the PHY is set to
-- * unless that PHY has a propietary register which indicates speed in
-- * this situation. The NSC TX PHY does have such a register. Also,
-- * since NWAY didn't establish the connection, the duplex setting
-- * should HALF duplex. */
-- bdp->cur_dplx_mode = HALF_DUPLEX;
--
-- if (PhyId == PHY_NSC_TX) {
-- /* Read register 25 to get the SPEED_10 bit */
-- e100_mdi_read(bdp, NSC_SPEED_IND_REG, bdp->phy_addr, &misc_reg);
--
-- /* If bit 6 was set then we're at 10Mbps */
-- if (misc_reg & NSC_TX_SPD_INDC_SPEED)
-- bdp->cur_line_speed = 10;
-- else
-- bdp->cur_line_speed = 100;
--
-- } else {
-- /* If we don't know the line speed, default to 10Mbps */
-- bdp->cur_line_speed = 10;
-- }
--}
--
--/*
-- * Procedure: e100_force_speed_duplex
-- *
-- * Description: This routine forces line speed and duplex mode of the
-- * adapter based on the values the user has set in e100.c.
-- *
-- * Arguments: bdp - Pointer to the e100_private structure for the board
-- *
-- * Returns: void
-- *
-- */
--void
--e100_force_speed_duplex(struct e100_private *bdp)
--{
-- u16 control;
-- unsigned long expires;
--
-- bdp->flags |= DF_SPEED_FORCED;
--
-- e100_mdi_read(bdp, MII_BMCR, bdp->phy_addr, &control);
-- control &= ~BMCR_ANENABLE;
-- control &= ~BMCR_LOOPBACK;
--
-- switch (bdp->params.e100_speed_duplex) {
-- case E100_SPEED_10_HALF:
-- control &= ~BMCR_SPEED100;
-- control &= ~BMCR_FULLDPLX;
-- bdp->cur_line_speed = 10;
-- bdp->cur_dplx_mode = HALF_DUPLEX;
-- break;
--
-- case E100_SPEED_10_FULL:
-- control &= ~BMCR_SPEED100;
-- control |= BMCR_FULLDPLX;
-- bdp->cur_line_speed = 10;
-- bdp->cur_dplx_mode = FULL_DUPLEX;
-- break;
--
-- case E100_SPEED_100_HALF:
-- control |= BMCR_SPEED100;
-- control &= ~BMCR_FULLDPLX;
-- bdp->cur_line_speed = 100;
-- bdp->cur_dplx_mode = HALF_DUPLEX;
-- break;
--
-- case E100_SPEED_100_FULL:
-- control |= BMCR_SPEED100;
-- control |= BMCR_FULLDPLX;
-- bdp->cur_line_speed = 100;
-- bdp->cur_dplx_mode = FULL_DUPLEX;
-- break;
-- }
--
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, control);
--
-- /* loop must run at least once */
-- expires = jiffies + 2 * HZ;
-- do {
-- if (e100_update_link_state(bdp) ||
-- time_after(jiffies, expires)) {
-- break;
-- } else {
-- yield();
-- }
--
-- } while (true);
--}
--
--void
--e100_force_speed_duplex_to_phy(struct e100_private *bdp)
--{
-- u16 control;
--
-- e100_mdi_read(bdp, MII_BMCR, bdp->phy_addr, &control);
-- control &= ~BMCR_ANENABLE;
-- control &= ~BMCR_LOOPBACK;
--
-- switch (bdp->params.e100_speed_duplex) {
-- case E100_SPEED_10_HALF:
-- control &= ~BMCR_SPEED100;
-- control &= ~BMCR_FULLDPLX;
-- break;
--
-- case E100_SPEED_10_FULL:
-- control &= ~BMCR_SPEED100;
-- control |= BMCR_FULLDPLX;
-- break;
--
-- case E100_SPEED_100_HALF:
-- control |= BMCR_SPEED100;
-- control &= ~BMCR_FULLDPLX;
-- break;
--
-- case E100_SPEED_100_FULL:
-- control |= BMCR_SPEED100;
-- control |= BMCR_FULLDPLX;
-- break;
-- }
--
-- /* Send speed/duplex command to PHY layer. */
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, control);
--}
--
--/*
-- * Procedure: e100_set_fc
-- *
-- * Description: Checks the link's capability for flow control.
-- *
-- * Arguments: bdp - Pointer to the e100_private structure for the board
-- *
-- * Returns: void
-- *
-- */
--static void
--e100_set_fc(struct e100_private *bdp)
--{
-- u16 ad_reg;
-- u16 lp_ad_reg;
-- u16 exp_reg;
--
-- /* no flow control for 82557, forced links or half duplex */
-- if (!netif_carrier_ok(bdp->device) || (bdp->flags & DF_SPEED_FORCED) ||
-- (bdp->cur_dplx_mode == HALF_DUPLEX) ||
-- !(bdp->flags & IS_BACHELOR)) {
--
-- bdp->flags &= ~DF_LINK_FC_CAP;
-- return;
-- }
--
-- /* See if link partner is capable of Auto-Negotiation (bit 0, reg 6) */
-- e100_mdi_read(bdp, MII_EXPANSION, bdp->phy_addr, &exp_reg);
--
-- if (exp_reg & EXPANSION_NWAY) {
-- /* Read our advertisement register */
-- e100_mdi_read(bdp, MII_ADVERTISE, bdp->phy_addr, &ad_reg);
--
-- /* Read our link partner's advertisement register */
-- e100_mdi_read(bdp, MII_LPA, bdp->phy_addr, &lp_ad_reg);
--
-- ad_reg &= lp_ad_reg; /* AND the 2 ad registers */
--
-- if (ad_reg & NWAY_AD_FC_SUPPORTED)
-- bdp->flags |= DF_LINK_FC_CAP;
-- else
-- /* If link partner is capable of autoneg, but */
-- /* not capable of flow control, Received PAUSE */
-- /* frames are still honored, i.e., */
-- /* transmitted frames would be paused */
-- /* by incoming PAUSE frames */
-- bdp->flags |= DF_LINK_FC_TX_ONLY;
--
-- } else {
-- bdp->flags &= ~DF_LINK_FC_CAP;
-- }
--}
--
--/*
-- * Procedure: e100_phy_check
-- *
-- * Arguments: bdp - Pointer to the e100_private structure for the board
-- *
-- * Returns: true if link state was changed
-- * false otherwise
-- *
-- */
--unsigned char
--e100_phy_check(struct e100_private *bdp)
--{
-- unsigned char old_link;
-- unsigned char changed = false;
--
-- old_link = netif_carrier_ok(bdp->device) ? 1 : 0;
-- e100_find_speed_duplex(bdp);
--
-- if (!old_link && netif_carrier_ok(bdp->device)) {
-- e100_set_fc(bdp);
-- changed = true;
-- }
--
-- if (old_link && !netif_carrier_ok(bdp->device)) {
-- /* reset the zero lock state */
-- bdp->zlock_state = ZLOCK_INITIAL;
--
-- // set auto lock for phy auto-negotiation on link up
-- if ((bdp->PhyId & PHY_MODEL_REV_ID_MASK) == PHY_82555_TX)
-- e100_mdi_write(bdp, PHY_82555_MDI_EQUALIZER_CSR,
-- bdp->phy_addr, 0);
-- changed = true;
-- }
--
-- e100_phy_fix_squelch(bdp);
-- e100_handle_zlock(bdp);
--
-- return changed;
--}
--
--/*
-- * Procedure: e100_auto_neg
-- *
-- * Description: This routine will start autonegotiation and wait
-- * for it to complete
-- *
-- * Arguments:
-- * bdp - pointer to this card's e100_bdconfig structure
-- * force_restart - defines if autoneg should be restarted even if it
-- * has been completed before
-- * Returns:
-- * NOTHING
-- */
--static void
--e100_auto_neg(struct e100_private *bdp, unsigned char force_restart)
--{
-- u16 stat_reg;
-- unsigned long expires;
--
-- bdp->flags &= ~DF_SPEED_FORCED;
--
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &stat_reg);
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &stat_reg);
--
-- /* if we are capable of performing autoneg then we restart if needed */
-- if ((stat_reg != 0xFFFF) && (stat_reg & BMSR_ANEGCAPABLE)) {
--
-- if ((!force_restart) &&
-- (stat_reg & BMSR_ANEGCOMPLETE)) {
-- goto exit;
-- }
--
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr,
-- BMCR_ANENABLE | BMCR_ANRESTART);
--
-- /* wait for autoneg to complete (up to 3 seconds) */
-- expires = jiffies + HZ * 3;
-- do {
-- /* now re-read the value. Sticky so read twice */
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &stat_reg);
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &stat_reg);
--
-- if ((stat_reg & BMSR_ANEGCOMPLETE) ||
-- time_after(jiffies, expires) ) {
-- goto exit;
-- } else {
-- yield();
-- }
-- } while (true);
-- }
--
--exit:
-- e100_find_speed_duplex(bdp);
--}
--
--void
--e100_phy_set_speed_duplex(struct e100_private *bdp, unsigned char force_restart)
--{
-- if (bdp->params.e100_speed_duplex == E100_AUTONEG) {
-- if (bdp->rev_id >= D102_REV_ID)
-- /* Enable MDI/MDI-X auto switching */
-- e100_mdi_write(bdp, MII_NCONFIG, bdp->phy_addr,
-- MDI_MDIX_AUTO_SWITCH_ENABLE);
-- e100_auto_neg(bdp, force_restart);
--
-- } else {
-- if (bdp->rev_id >= D102_REV_ID)
-- /* Disable MDI/MDI-X auto switching */
-- e100_mdi_write(bdp, MII_NCONFIG, bdp->phy_addr,
-- MDI_MDIX_RESET_ALL_MASK);
-- e100_force_speed_duplex(bdp);
-- }
--
-- e100_set_fc(bdp);
--}
--
--void
--e100_phy_autoneg(struct e100_private *bdp)
--{
-- u16 ctrl_reg;
--
-- ctrl_reg = BMCR_ANENABLE | BMCR_ANRESTART | BMCR_RESET;
--
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, ctrl_reg);
--
-- udelay(100);
--}
--
--void
--e100_phy_set_loopback(struct e100_private *bdp)
--{
-- u16 ctrl_reg;
-- ctrl_reg = BMCR_LOOPBACK;
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, ctrl_reg);
-- udelay(100);
--}
--
--void
--e100_phy_reset(struct e100_private *bdp)
--{
-- u16 ctrl_reg;
-- ctrl_reg = BMCR_RESET;
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, ctrl_reg);
-- /* ieee 802.3 : The reset process shall be completed */
-- /* within 0.5 seconds from the settting of PHY reset bit. */
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ / 2);
--}
--
--unsigned char __devinit
--e100_phy_init(struct e100_private *bdp)
--{
-- e100_phy_reset(bdp);
-- e100_phy_address_detect(bdp);
-- e100_phy_isolate(bdp);
-- e100_phy_id_detect(bdp);
--
-- if (!e100_phy_specific_setup(bdp))
-- return false;
--
-- bdp->PhyState = 0;
-- bdp->PhyDelay = 0;
-- bdp->zlock_state = ZLOCK_INITIAL;
--
-- e100_phy_set_speed_duplex(bdp, false);
-- e100_fix_polarity(bdp);
--
-- return true;
--}
--
--/*
-- * Procedure: e100_get_link_state
-- *
-- * Description: This routine checks the link status of the adapter
-- *
-- * Arguments: bdp - Pointer to the e100_private structure for the board
-- *
-- *
-- * Returns: true - If a link is found
-- * false - If there is no link
-- *
-- */
--unsigned char
--e100_get_link_state(struct e100_private *bdp)
--{
-- unsigned char link = false;
-- u16 status;
--
-- /* Check link status */
-- /* If the controller is a 82559 or later one, link status is available
-- * from the CSR. This avoids the mdi_read. */
-- if (bdp->rev_id >= D101MA_REV_ID) {
-- if (readb(&bdp->scb->scb_ext.d101m_scb.scb_gen_stat) & BIT_0) {
-- link = true;
-- } else {
-- link = false;
-- }
--
-- } else {
-- /* Read the status register twice because of sticky bits */
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &status);
-- e100_mdi_read(bdp, MII_BMSR, bdp->phy_addr, &status);
--
-- if (status & BMSR_LSTATUS) {
-- link = true;
-- } else {
-- link = false;
-- }
-- }
--
-- return link;
--}
--
--/*
-- * Procedure: e100_update_link_state
-- *
-- * Description: This routine updates the link status of the adapter,
-- * also considering netif_running
-- *
-- * Arguments: bdp - Pointer to the e100_private structure for the board
-- *
-- *
-- * Returns: true - If a link is found
-- * false - If there is no link
-- *
-- */
--unsigned char
--e100_update_link_state(struct e100_private *bdp)
--{
-- unsigned char link;
--
-- /* Logical AND PHY link & netif_running */
-- link = e100_get_link_state(bdp) && netif_running(bdp->device);
--
-- if (link) {
-- if (!netif_carrier_ok(bdp->device))
-- netif_carrier_on(bdp->device);
-- } else {
-- if (netif_carrier_ok(bdp->device))
-- netif_carrier_off(bdp->device);
-- }
--
-- return link;
--}
--
--/**************************************************************************\
-- **
-- ** PROC NAME: e100_handle_zlock
-- ** This function manages a state machine that controls
-- ** the driver's zero locking algorithm.
-- ** This function is called by e100_watchdog() every ~2 second.
-- ** States:
-- ** The current link handling state is stored in
-- ** bdp->zlock_state, and is one of:
-- ** ZLOCK_INITIAL, ZLOCK_READING, ZLOCK_SLEEPING
-- ** Detailed description of the states and the transitions
-- ** between states is found below.
-- ** Note that any time the link is down / there is a reset
-- ** state will be changed outside this function to ZLOCK_INITIAL
-- ** Algorithm:
-- ** 1. If link is up & 100 Mbps continue else stay in #1:
-- ** 2. Set 'auto lock'
-- ** 3. Read & Store 100 times 'Zero' locked in 1 sec interval
-- ** 4. If max zero read >= 0xB continue else goto 1
-- ** 5. Set most popular 'Zero' read in #3
-- ** 6. Sleep 5 minutes
-- ** 7. Read number of errors, if it is > 300 goto 2 else goto 6
-- ** Data Structures (in DRIVER_DATA):
-- ** zlock_state - current state of the algorithm
-- ** zlock_read_cnt - counts number of reads (up to 100)
-- ** zlock_read_data[i] - counts number of times 'Zero' read was i, 0 <= i <= 15
-- ** zlock_sleep_cnt - keeps track of "sleep" time (up to 300 secs = 5 minutes)
-- **
-- ** Parameters: DRIVER_DATA *bdp
-- **
-- ** bdp - Pointer to HSM's adapter data space
-- **
-- ** Return Value: NONE
-- **
-- ** See Also: e100_watchdog()
-- **
-- \**************************************************************************/
--void
--e100_handle_zlock(struct e100_private *bdp)
--{
-- u16 pos;
-- u16 eq_reg;
-- u16 err_cnt;
-- u8 mpz; /* Most Popular Zero */
--
-- switch (bdp->zlock_state) {
-- case ZLOCK_INITIAL:
--
-- if (((u8) bdp->rev_id <= D102_REV_ID) ||
-- !(bdp->cur_line_speed == 100) ||
-- !netif_carrier_ok(bdp->device)) {
-- break;
-- }
--
-- /* initialize hw and sw and start reading */
-- e100_mdi_write(bdp, PHY_82555_MDI_EQUALIZER_CSR,
-- bdp->phy_addr, 0);
-- /* reset read counters: */
-- bdp->zlock_read_cnt = 0;
-- for (pos = 0; pos < 16; pos++)
-- bdp->zlock_read_data[pos] = 0;
-- /* start reading in the next call back: */
-- bdp->zlock_state = ZLOCK_READING;
--
-- /* FALL THROUGH !! */
--
-- case ZLOCK_READING:
-- /* state: reading (100 times) zero locked in 1 sec interval
-- * prev states: ZLOCK_INITIAL
-- * next states: ZLOCK_INITIAL, ZLOCK_SLEEPING */
--
-- e100_mdi_read(bdp, PHY_82555_MDI_EQUALIZER_CSR,
-- bdp->phy_addr, &eq_reg);
-- pos = (eq_reg & ZLOCK_ZERO_MASK) >> 4;
-- bdp->zlock_read_data[pos]++;
-- bdp->zlock_read_cnt++;
--
-- if (bdp->zlock_read_cnt == ZLOCK_MAX_READS) {
-- /* check if we read a 'Zero' value of 0xB or greater */
-- if ((bdp->zlock_read_data[0xB]) ||
-- (bdp->zlock_read_data[0xC]) ||
-- (bdp->zlock_read_data[0xD]) ||
-- (bdp->zlock_read_data[0xE]) ||
-- (bdp->zlock_read_data[0xF])) {
--
-- /* we've read 'Zero' value of 0xB or greater,
-- * find most popular 'Zero' value and lock it */
-- mpz = 0;
-- /* this loop finds the most popular 'Zero': */
-- for (pos = 1; pos < 16; pos++) {
-- if (bdp->zlock_read_data[pos] >
-- bdp->zlock_read_data[mpz])
--
-- mpz = pos;
-- }
-- /* now lock the most popular 'Zero': */
-- eq_reg = (ZLOCK_SET_ZERO | mpz);
-- e100_mdi_write(bdp,
-- PHY_82555_MDI_EQUALIZER_CSR,
-- bdp->phy_addr, eq_reg);
--
-- /* sleep for 5 minutes: */
-- bdp->zlock_sleep_cnt = jiffies;
-- bdp->zlock_state = ZLOCK_SLEEPING;
-- /* we will be reading the # of errors after 5
-- * minutes, so we need to reset the error
-- * counters - these registers are self clearing
-- * on read, so read them */
-- e100_mdi_read(bdp, PHY_82555_SYMBOL_ERR,
-- bdp->phy_addr, &err_cnt);
--
-- } else {
-- /* we did not read a 'Zero' value of 0xB or
-- * above. go back to the start */
-- bdp->zlock_state = ZLOCK_INITIAL;
-- }
--
-- }
-- break;
--
-- case ZLOCK_SLEEPING:
-- /* state: sleeping for 5 minutes
-- * prev states: ZLOCK_READING
-- * next states: ZLOCK_READING, ZLOCK_SLEEPING */
--
-- /* if 5 minutes have passed: */
-- if ((jiffies - bdp->zlock_sleep_cnt) >= ZLOCK_MAX_SLEEP) {
-- /* read and sum up the number of errors: */
-- e100_mdi_read(bdp, PHY_82555_SYMBOL_ERR,
-- bdp->phy_addr, &err_cnt);
-- /* if we've more than 300 errors (this number was
-- * calculated according to the spec max allowed errors
-- * (80 errors per 1 million frames) for 5 minutes in
-- * 100 Mbps (or the user specified max BER number) */
-- if (err_cnt > bdp->params.ber) {
-- /* start again in the next callback: */
-- bdp->zlock_state = ZLOCK_INITIAL;
-- } else {
-- /* we don't have more errors than allowed,
-- * sleep for 5 minutes */
-- bdp->zlock_sleep_cnt = jiffies;
-- }
-- }
-- break;
--
-- default:
-- break;
-- }
--}
---- linux-2.6.0/drivers/net/e100/e100_phy.h 2003-06-14 12:17:59.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,158 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--#ifndef _E100_PHY_INC_
--#define _E100_PHY_INC_
--
--#include "e100.h"
--
--/*
-- * Auto-polarity enable/disable
-- * e100_autopolarity = 0 => disable auto-polarity
-- * e100_autopolarity = 1 => enable auto-polarity
-- * e100_autopolarity = 2 => let software determine
-- */
--#define E100_AUTOPOLARITY 2
--
--#define IS_NC3133(bdp) (((bdp)->pdev->subsystem_vendor == 0x0E11) && \
-- ((bdp)->pdev->subsystem_device == 0xB0E1))
--
--#define PHY_503 0
--#define PHY_100_A 0x000003E0
--#define PHY_100_C 0x035002A8
--#define PHY_NSC_TX 0x5c002000
--#define PHY_82562ET 0x033002A8
--#define PHY_82562EM 0x032002A8
--#define PHY_82562EH 0x017002A8
--#define PHY_82555_TX 0x015002a8 /* added this for 82555 */
--#define PHY_OTHER 0xFFFF
--#define MAX_PHY_ADDR 31
--#define MIN_PHY_ADDR 0
--
--#define PHY_MODEL_REV_ID_MASK 0xFFF0FFFF
--
--#define PHY_DEFAULT_ADDRESS 1
--#define PHY_ADDRESS_503 32
--
--/* MDI Control register bit definitions */
--#define MDI_PHY_READY BIT_28 /* PHY is ready for next MDI cycle */
--
--#define MDI_NC3133_CONFIG_REG 0x19
--#define MDI_NC3133_100FX_ENABLE BIT_2
--#define MDI_NC3133_INT_ENABLE_REG 0x17
--#define MDI_NC3133_INT_ENABLE BIT_1
--
--/* MDI Control register opcode definitions */
--#define MDI_WRITE 1 /* Phy Write */
--#define MDI_READ 2 /* Phy read */
--
--/* MDI register set*/
--#define AUTO_NEG_NEXT_PAGE_REG 0x07 /* Auto-negotiation next page xmit */
--#define EXTENDED_REG_0 0x10 /* Extended reg 0 (Phy 100 modes) */
--#define EXTENDED_REG_1 0x14 /* Extended reg 1 (Phy 100 error indications) */
--#define NSC_CONG_CONTROL_REG 0x17 /* National (TX) congestion control */
--#define NSC_SPEED_IND_REG 0x19 /* National (TX) speed indication */
--
--#define HWI_CONTROL_REG 0x1D /* HWI Control register */
--/* MDI/MDI-X Control Register bit definitions */
--#define MDI_MDIX_RES_TIMER BIT_0_3 /* minimum slot time for resolution timer */
--#define MDI_MDIX_CONFIG_IS_OK BIT_4 /* 1 = resolution algorithm completes OK */
--#define MDI_MDIX_STATUS BIT_5 /* 1 = MDIX (croos over), 0 = MDI (straight through) */
--#define MDI_MDIX_SWITCH BIT_6 /* 1 = Forces to MDIX, 0 = Forces to MDI */
--#define MDI_MDIX_AUTO_SWITCH_ENABLE BIT_7 /* 1 = MDI/MDI-X feature enabled */
--#define MDI_MDIX_CONCT_CONFIG BIT_8 /* Sets the MDI/MDI-X connectivity configuration (test prupose only) */
--#define MDI_MDIX_CONCT_TEST_ENABLE BIT_9 /* 1 = Enables connectivity testing */
--#define MDI_MDIX_RESET_ALL_MASK 0x0000
--
--/* HWI Control Register bit definitions */
--#define HWI_TEST_DISTANCE BIT_0_8 /* distance to cable problem */
--#define HWI_TEST_HIGHZ_PROBLEM BIT_9 /* 1 = Open Circuit */
--#define HWI_TEST_LOWZ_PROBLEM BIT_10 /* 1 = Short Circuit */
--#define HWI_TEST_RESERVED (BIT_11 | BIT_12) /* reserved */
--#define HWI_TEST_EXECUTE BIT_13 /* 1 = Execute the HWI test on the PHY */
--#define HWI_TEST_ABILITY BIT_14 /* 1 = test passed */
--#define HWI_TEST_ENABLE BIT_15 /* 1 = Enables the HWI feature */
--#define HWI_RESET_ALL_MASK 0x0000
--
--/* ############Start of 82555 specific defines################## */
--
--/* Intel 82555 specific registers */
--#define PHY_82555_CSR 0x10 /* 82555 CSR */
--#define PHY_82555_SPECIAL_CONTROL 0x11 /* 82555 special control register */
--
--#define PHY_82555_RCV_ERR 0x15 /* 82555 100BaseTx Receive Error
-- * Frame Counter */
--#define PHY_82555_SYMBOL_ERR 0x16 /* 82555 RCV Symbol Error Counter */
--#define PHY_82555_PREM_EOF_ERR 0x17 /* 82555 100BaseTx RCV Premature End
-- * of Frame Error Counter */
--#define PHY_82555_EOF_COUNTER 0x18 /* 82555 end of frame error counter */
--#define PHY_82555_MDI_EQUALIZER_CSR 0x1a /* 82555 specific equalizer reg. */
--
--/* 82555 CSR bits */
--#define PHY_82555_SPEED_BIT BIT_1
--#define PHY_82555_POLARITY_BIT BIT_8
--
--/* 82555 equalizer reg. opcodes */
--#define ENABLE_ZERO_FORCING 0x2010 /* write to ASD conf. reg. 0 */
--#define DISABLE_ZERO_FORCING 0x2000 /* write to ASD conf. reg. 0 */
--
--/* 82555 special control reg. opcodes */
--#define DISABLE_AUTO_POLARITY 0x0010
--#define EXTENDED_SQUELCH_BIT BIT_2
--
--/* ############End of 82555 specific defines##################### */
--
--/* Auto-Negotiation advertisement register bit definitions*/
--#define NWAY_AD_FC_SUPPORTED 0x0400 /* Flow Control supported */
--
--/* Auto-Negotiation link partner ability register bit definitions*/
--#define NWAY_LP_ABILITY 0x07e0 /* technologies supported */
--
--/* PHY 100 Extended Register 0 bit definitions*/
--#define PHY_100_ER0_FDX_INDIC BIT_0 /* 1 = FDX, 0 = half duplex */
--#define PHY_100_ER0_SPEED_INDIC BIT_1 /* 1 = 100Mbps, 0= 10Mbps */
--
--/* National Semiconductor TX phy congestion control register bit definitions*/
--#define NSC_TX_CONG_TXREADY BIT_10 /* Makes TxReady an input */
--#define NSC_TX_CONG_ENABLE BIT_8 /* Enables congestion control */
--
--/* National Semiconductor TX phy speed indication register bit definitions*/
--#define NSC_TX_SPD_INDC_SPEED BIT_6 /* 0 = 100Mbps, 1=10Mbps */
--
--/************* function prototypes ************/
--extern unsigned char e100_phy_init(struct e100_private *bdp);
--extern unsigned char e100_update_link_state(struct e100_private *bdp);
--extern unsigned char e100_phy_check(struct e100_private *bdp);
--extern void e100_phy_set_speed_duplex(struct e100_private *bdp,
-- unsigned char force_restart);
--extern void e100_phy_autoneg(struct e100_private *bdp);
--extern void e100_phy_reset(struct e100_private *bdp);
--extern void e100_phy_set_loopback(struct e100_private *bdp);
--extern int e100_mdi_write(struct e100_private *, u32, u32, u16);
--extern int e100_mdi_read(struct e100_private *, u32, u32, u16 *);
--
--#endif
---- linux-2.6.0/drivers/net/e100/e100_test.c 2003-06-14 12:18:08.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,500 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--#include "e100_phy.h"
--#include "e100_config.h"
--
--extern u16 e100_eeprom_read(struct e100_private *, u16);
--extern int e100_wait_exec_cmplx(struct e100_private *, u32,u8, u8);
--extern void e100_phy_reset(struct e100_private *bdp);
--extern void e100_phy_autoneg(struct e100_private *bdp);
--extern void e100_phy_set_loopback(struct e100_private *bdp);
--extern void e100_force_speed_duplex(struct e100_private *bdp);
--
--static u8 e100_diag_selftest(struct net_device *);
--static u8 e100_diag_eeprom(struct net_device *);
--static u8 e100_diag_loopback(struct net_device *);
--
--static u8 e100_diag_one_loopback (struct net_device *, u8);
--static u8 e100_diag_rcv_loopback_pkt(struct e100_private *);
--static void e100_diag_config_loopback(struct e100_private *, u8, u8, u8 *,u8 *);
--static u8 e100_diag_loopback_alloc(struct e100_private *);
--static void e100_diag_loopback_cu_ru_exec(struct e100_private *);
--static u8 e100_diag_check_pkt(u8 *);
--static void e100_diag_loopback_free(struct e100_private *);
--static int e100_cable_diag(struct e100_private *bdp);
--
--#define LB_PACKET_SIZE 1500
--
--/**
-- * e100_run_diag - main test execution handler - checks mask of requests and calls the diag routines
-- * @dev: atapter's net device data struct
-- * @test_info: array with test request mask also used to store test results
-- *
-- * RETURNS: updated flags field of struct ethtool_test
-- */
--u32
--e100_run_diag(struct net_device *dev, u64 *test_info, u32 flags)
--{
-- struct e100_private* bdp = dev->priv;
-- u8 test_result = 0;
--
-- if (!e100_get_link_state(bdp)) {
-- test_result = ETH_TEST_FL_FAILED;
-- test_info[test_link] = true;
-- }
-- if (!e100_diag_eeprom(dev)) {
-- test_result = ETH_TEST_FL_FAILED;
-- test_info[test_eeprom] = true;
-- }
-- if (flags & ETH_TEST_FL_OFFLINE) {
-- u8 fail_mask;
-- if (netif_running(dev)) {
-- spin_lock_bh(&dev->xmit_lock);
-- e100_close(dev);
-- spin_unlock_bh(&dev->xmit_lock);
-- }
-- if (e100_diag_selftest(dev)) {
-- test_result = ETH_TEST_FL_FAILED;
-- test_info[test_self_test] = true;
-- }
--
-- fail_mask = e100_diag_loopback(dev);
-- if (fail_mask) {
-- test_result = ETH_TEST_FL_FAILED;
-- if (fail_mask & PHY_LOOPBACK)
-- test_info[test_loopback_phy] = true;
-- if (fail_mask & MAC_LOOPBACK)
-- test_info[test_loopback_mac] = true;
-- }
--
-- test_info[cable_diag] = e100_cable_diag(bdp);
-- /* Need hw init regardless of netif_running */
-- e100_hw_init(bdp);
-- if (netif_running(dev)) {
-- e100_open(dev);
-- }
-- }
-- else {
-- test_info[test_self_test] = false;
-- test_info[test_loopback_phy] = false;
-- test_info[test_loopback_mac] = false;
-- test_info[cable_diag] = false;
-- }
--
-- return flags | test_result;
--}
--
--/**
-- * e100_diag_selftest - run hardware selftest
-- * @dev: atapter's net device data struct
-- */
--static u8
--e100_diag_selftest(struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
-- u32 st_timeout, st_result;
-- u8 retval = 0;
--
-- if (!e100_selftest(bdp, &st_timeout, &st_result)) {
-- if (!st_timeout) {
-- if (st_result & CB_SELFTEST_REGISTER_BIT)
-- retval |= REGISTER_TEST_FAIL;
-- if (st_result & CB_SELFTEST_DIAG_BIT)
-- retval |= SELF_TEST_FAIL;
-- if (st_result & CB_SELFTEST_ROM_BIT)
-- retval |= ROM_TEST_FAIL;
-- } else {
-- retval = TEST_TIMEOUT;
-- }
-- }
--
-- return retval;
--}
--
--/**
-- * e100_diag_eeprom - validate eeprom checksum correctness
-- * @dev: atapter's net device data struct
-- *
-- */
--static u8
--e100_diag_eeprom (struct net_device *dev)
--{
-- struct e100_private *bdp = dev->priv;
-- u16 i, eeprom_sum, eeprom_actual_csm;
--
-- for (i = 0, eeprom_sum = 0; i < (bdp->eeprom_size - 1); i++) {
-- eeprom_sum += e100_eeprom_read(bdp, i);
-- }
--
-- eeprom_actual_csm = e100_eeprom_read(bdp, bdp->eeprom_size - 1);
--
-- if (eeprom_actual_csm == (u16)(EEPROM_SUM - eeprom_sum)) {
-- return true;
-- }
--
-- return false;
--}
--
--/**
-- * e100_diag_loopback - performs loopback test
-- * @dev: atapter's net device data struct
-- */
--static u8
--e100_diag_loopback (struct net_device *dev)
--{
-- u8 rc = 0;
--
-- printk(KERN_DEBUG "%s: PHY loopback test starts\n", dev->name);
-- e100_hw_init(dev->priv);
-- if (!e100_diag_one_loopback(dev, PHY_LOOPBACK)) {
-- rc |= PHY_LOOPBACK;
-- }
-- printk(KERN_DEBUG "%s: PHY loopback test ends\n", dev->name);
--
-- printk(KERN_DEBUG "%s: MAC loopback test starts\n", dev->name);
-- e100_hw_init(dev->priv);
-- if (!e100_diag_one_loopback(dev, MAC_LOOPBACK)) {
-- rc |= MAC_LOOPBACK;
-- }
-- printk(KERN_DEBUG "%s: MAC loopback test ends\n", dev->name);
--
-- return rc;
--}
--
--/**
-- * e100_diag_loopback - performs loopback test
-- * @dev: atapter's net device data struct
-- * @mode: lopback test type
-- */
--static u8
--e100_diag_one_loopback (struct net_device *dev, u8 mode)
--{
-- struct e100_private *bdp = dev->priv;
-- u8 res = false;
-- u8 saved_dynamic_tbd = false;
-- u8 saved_extended_tcb = false;
--
-- if (!e100_diag_loopback_alloc(bdp))
-- return false;
--
-- /* change the config block to standard tcb and the correct loopback */
-- e100_diag_config_loopback(bdp, true, mode,
-- &saved_extended_tcb, &saved_dynamic_tbd);
--
-- e100_diag_loopback_cu_ru_exec(bdp);
--
-- if (e100_diag_rcv_loopback_pkt(bdp)) {
-- res = true;
-- }
--
-- e100_diag_loopback_free(bdp);
--
-- /* change the config block to previous tcb mode and the no loopback */
-- e100_diag_config_loopback(bdp, false, mode,
-- &saved_extended_tcb, &saved_dynamic_tbd);
-- return res;
--}
--
--/**
-- * e100_diag_config_loopback - setup/clear loopback before/after lpbk test
-- * @bdp: atapter's private data struct
-- * @set_loopback: true if the function is called to set lb
-- * @loopback_mode: the loopback mode(MAC or PHY)
-- * @tcb_extended: true if need to set extended tcb mode after clean loopback
-- * @dynamic_tbd: true if needed to set dynamic tbd mode after clean loopback
-- *
-- */
--void
--e100_diag_config_loopback(struct e100_private* bdp,
-- u8 set_loopback,
-- u8 loopback_mode,
-- u8* tcb_extended,
-- u8* dynamic_tbd)
--{
-- /* if set_loopback == true - we want to clear tcb_extended/dynamic_tbd.
-- * the previous values are saved in the params tcb_extended/dynamic_tbd
-- * if set_loopback == false - we want to restore previous value.
-- */
-- if (set_loopback || (*tcb_extended))
-- *tcb_extended = e100_config_tcb_ext_enable(bdp,*tcb_extended);
--
-- if (set_loopback || (*dynamic_tbd))
-- *dynamic_tbd = e100_config_dynamic_tbd(bdp,*dynamic_tbd);
--
-- if (set_loopback) {
-- /* ICH PHY loopback is broken */
-- if (bdp->flags & IS_ICH && loopback_mode == PHY_LOOPBACK)
-- loopback_mode = MAC_LOOPBACK;
-- /* Configure loopback on MAC */
-- e100_config_loopback_mode(bdp,loopback_mode);
-- } else {
-- e100_config_loopback_mode(bdp,NO_LOOPBACK);
-- }
--
-- e100_config(bdp);
--
-- if (loopback_mode == PHY_LOOPBACK) {
-- if (set_loopback)
-- /* Set PHY loopback mode */
-- e100_phy_set_loopback(bdp);
-- else
-- /* Reset PHY loopback mode */
-- e100_phy_reset(bdp);
-- /* Wait for PHY state change */
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ);
-- } else { /* For MAC loopback wait 500 msec to take effect */
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ / 2);
-- }
--}
--
--/**
-- * e100_diag_loopback_alloc - alloc & initate tcb and rfd for the loopback
-- * @bdp: atapter's private data struct
-- *
-- */
--static u8
--e100_diag_loopback_alloc(struct e100_private *bdp)
--{
-- dma_addr_t dma_handle;
-- tcb_t *tcb;
-- rfd_t *rfd;
-- tbd_t *tbd;
--
-- /* tcb, tbd and transmit buffer are allocated */
-- tcb = pci_alloc_consistent(bdp->pdev,
-- (sizeof (tcb_t) + sizeof (tbd_t) +
-- LB_PACKET_SIZE),
-- &dma_handle);
-- if (tcb == NULL)
-- return false;
--
-- memset(tcb, 0x00, sizeof (tcb_t) + sizeof (tbd_t) + LB_PACKET_SIZE);
-- tcb->tcb_phys = dma_handle;
-- tcb->tcb_hdr.cb_status = 0;
-- tcb->tcb_hdr.cb_cmd =
-- cpu_to_le16(CB_EL_BIT | CB_TRANSMIT | CB_TX_SF_BIT);
-- /* Next command is null */
-- tcb->tcb_hdr.cb_lnk_ptr = cpu_to_le32(0xffffffff);
-- tcb->tcb_cnt = 0;
-- tcb->tcb_thrshld = bdp->tx_thld;
-- tcb->tcb_tbd_num = 1;
-- /* Set up tcb tbd pointer */
-- tcb->tcb_tbd_ptr = cpu_to_le32(tcb->tcb_phys + sizeof (tcb_t));
-- tbd = (tbd_t *) ((u8 *) tcb + sizeof (tcb_t));
-- /* Set up tbd transmit buffer */
-- tbd->tbd_buf_addr =
-- cpu_to_le32(le32_to_cpu(tcb->tcb_tbd_ptr) + sizeof (tbd_t));
-- tbd->tbd_buf_cnt = __constant_cpu_to_le16(1024);
-- /* The value of first 512 bytes is FF */
-- memset((void *) ((u8 *) tbd + sizeof (tbd_t)), 0xFF, 512);
-- /* The value of second 512 bytes is BA */
-- memset((void *) ((u8 *) tbd + sizeof (tbd_t) + 512), 0xBA, 512);
-- wmb();
-- rfd = pci_alloc_consistent(bdp->pdev, sizeof (rfd_t), &dma_handle);
--
-- if (rfd == NULL) {
-- pci_free_consistent(bdp->pdev,
-- sizeof (tcb_t) + sizeof (tbd_t) +
-- LB_PACKET_SIZE, tcb, tcb->tcb_phys);
-- return false;
-- }
--
-- memset(rfd, 0x00, sizeof (rfd_t));
--
-- /* init all fields in rfd */
-- rfd->rfd_header.cb_cmd = cpu_to_le16(RFD_EL_BIT);
-- rfd->rfd_sz = cpu_to_le16(ETH_FRAME_LEN + CHKSUM_SIZE);
-- /* dma_handle is physical address of rfd */
-- bdp->loopback.dma_handle = dma_handle;
-- bdp->loopback.tcb = tcb;
-- bdp->loopback.rfd = rfd;
-- wmb();
-- return true;
--}
--
--/**
-- * e100_diag_loopback_cu_ru_exec - activates cu and ru to send & receive the pkt
-- * @bdp: atapter's private data struct
-- *
-- */
--static void
--e100_diag_loopback_cu_ru_exec(struct e100_private *bdp)
--{
-- /*load CU & RU base */
-- if(!e100_wait_exec_cmplx(bdp, bdp->loopback.dma_handle, SCB_RUC_START, 0))
-- printk(KERN_ERR "e100: SCB_RUC_START failed!\n");
--
-- bdp->next_cu_cmd = START_WAIT;
-- e100_start_cu(bdp, bdp->loopback.tcb);
-- bdp->last_tcb = NULL;
-- rmb();
--}
--/**
-- * e100_diag_check_pkt - checks if a given packet is a loopback packet
-- * @bdp: atapter's private data struct
-- *
-- * Returns true if OK false otherwise.
-- */
--static u8
--e100_diag_check_pkt(u8 *datap)
--{
-- int i;
-- for (i = 0; i<512; i++) {
-- if( !((*datap)==0xFF && (*(datap + 512) == 0xBA)) ) {
-- printk (KERN_ERR "e100: check loopback packet failed at: %x\n", i);
-- return false;
-- }
-- }
-- printk (KERN_DEBUG "e100: Check received loopback packet OK\n");
-- return true;
--}
--
--/**
-- * e100_diag_rcv_loopback_pkt - waits for receive and checks lpbk packet
-- * @bdp: atapter's private data struct
-- *
-- * Returns true if OK false otherwise.
-- */
--static u8
--e100_diag_rcv_loopback_pkt(struct e100_private* bdp)
--{
-- rfd_t *rfdp;
-- u16 rfd_status;
-- unsigned long expires = jiffies + HZ * 2;
--
-- rfdp =bdp->loopback.rfd;
--
-- rfd_status = le16_to_cpu(rfdp->rfd_header.cb_status);
--
-- while (!(rfd_status & RFD_STATUS_COMPLETE)) {
-- if (time_before(jiffies, expires)) {
-- yield();
-- rmb();
-- rfd_status = le16_to_cpu(rfdp->rfd_header.cb_status);
-- } else {
-- break;
-- }
-- }
--
-- if (rfd_status & RFD_STATUS_COMPLETE) {
-- printk(KERN_DEBUG "e100: Loopback packet received\n");
-- return e100_diag_check_pkt(((u8 *)rfdp+bdp->rfd_size));
-- }
-- else {
-- printk(KERN_ERR "e100: Loopback packet not received\n");
-- return false;
-- }
--}
--
--/**
-- * e100_diag_loopback_free - free data allocated for loopback pkt send/receive
-- * @bdp: atapter's private data struct
-- *
-- */
--static void
--e100_diag_loopback_free (struct e100_private *bdp)
--{
-- pci_free_consistent(bdp->pdev,
-- sizeof(tcb_t) + sizeof(tbd_t) + LB_PACKET_SIZE,
-- bdp->loopback.tcb, bdp->loopback.tcb->tcb_phys);
--
-- pci_free_consistent(bdp->pdev, sizeof(rfd_t), bdp->loopback.rfd,
-- bdp->loopback.dma_handle);
--}
--
--static int
--e100_cable_diag(struct e100_private *bdp)
--{
-- int saved_open_circut = 0xffff;
-- int saved_short_circut = 0xffff;
-- int saved_distance = 0xffff;
-- int saved_same = 0;
-- int cable_status = E100_CABLE_UNKNOWN;
-- int i;
--
-- /* If we have link, */
-- if (e100_get_link_state(bdp))
-- return E100_CABLE_OK;
--
-- if (bdp->rev_id < D102_REV_ID)
-- return E100_CABLE_UNKNOWN;
--
-- /* Disable MDI/MDI-X auto switching */
-- e100_mdi_write(bdp, MII_NCONFIG, bdp->phy_addr,
-- MDI_MDIX_RESET_ALL_MASK);
-- /* Set to 100 Full as required by cable test */
-- e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr,
-- BMCR_SPEED100 | BMCR_FULLDPLX);
--
-- /* Test up to 100 times */
-- for (i = 0; i < 100; i++) {
-- u16 ctrl_reg;
-- int distance, open_circut, short_circut, near_end;
--
-- /* Enable and execute cable test */
-- e100_mdi_write(bdp, HWI_CONTROL_REG, bdp->phy_addr,
-- (HWI_TEST_ENABLE | HWI_TEST_EXECUTE));
-- /* Wait for cable test finished */
-- set_current_state(TASK_UNINTERRUPTIBLE);
-- schedule_timeout(HZ/100 + 1);
-- /* Read results */
-- e100_mdi_read(bdp, HWI_CONTROL_REG, bdp->phy_addr, &ctrl_reg);
-- distance = ctrl_reg & HWI_TEST_DISTANCE;
-- open_circut = ctrl_reg & HWI_TEST_HIGHZ_PROBLEM;
-- short_circut = ctrl_reg & HWI_TEST_LOWZ_PROBLEM;
--
-- if ((distance == saved_distance) &&
-- (open_circut == saved_open_circut) &&
-- (short_circut == saved_short_circut))
-- saved_same++;
-- else {
-- saved_same = 0;
-- saved_distance = distance;
-- saved_open_circut = open_circut;
-- saved_short_circut = short_circut;
-- }
-- /* If results are the same 3 times */
-- if (saved_same == 3) {
-- near_end = ((distance * HWI_REGISTER_GRANULARITY) <
-- HWI_NEAR_END_BOUNDARY);
-- if (open_circut)
-- cable_status = (near_end) ?
-- E100_CABLE_OPEN_NEAR : E100_CABLE_OPEN_FAR;
-- if (short_circut)
-- cable_status = (near_end) ?
-- E100_CABLE_SHORT_NEAR : E100_CABLE_SHORT_FAR;
-- break;
-- }
-- }
-- /* Reset cable test */
-- e100_mdi_write(bdp, HWI_CONTROL_REG, bdp->phy_addr, HWI_RESET_ALL_MASK);
-- return cable_status;
--}
--
---- linux-2.6.0/drivers/net/e100/e100_ucode.h 2003-06-14 12:18:34.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,365 +0,0 @@
--/*******************************************************************************
--
--
-- Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 2 of the License, or (at your option)
-- any later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-- more details.
--
-- You should have received a copy of the GNU General Public License along with
-- this program; if not, write to the Free Software Foundation, Inc., 59
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
-- The full GNU General Public License is included in this distribution in the
-- file called LICENSE.
--
-- Contact Information:
-- Linux NICS <linux.nics@intel.com>
-- Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
--*******************************************************************************/
--
--#ifndef _E100_UCODE_H_
--#define _E100_UCODE_H_
--
--/*
--e100_ucode.h
--
--This file contains the loadable micro code arrays to implement receive
--bundling on the D101 A-step, D101 B-step, D101M (B-step only), D101S,
--D102 B-step, D102 B-step with TCO work around and D102 C-step.
--
--Each controller has its own specific micro code array. The array for one
--controller is totally incompatible with any other controller, and if used
--will most likely cause the controller to lock up and stop responding to
--the driver. Each micro code array has its own parameter offsets (described
--below), and they each have their own version number.
--*/
--
--/*************************************************************************
--* CPUSaver parameters
--*
--* All CPUSaver parameters are 16-bit literals that are part of a
--* "move immediate value" instruction. By changing the value of
--* the literal in the instruction before the code is loaded, the
--* driver can change algorithm.
--*
--* CPUSAVER_DWORD - This is the location of the instruction that loads
--* the dead-man timer with its inital value. By writing a 16-bit
--* value to the low word of this instruction, the driver can change
--* the timer value. The current default is either x600 or x800;
--* experiments show that the value probably should stay within the
--* range of x200 - x1000.
--*
--* CPUSAVER_BUNDLE_MAX_DWORD - This is the location of the instruction
--* that sets the maximum number of frames that will be bundled. In
--* some situations, such as the TCP windowing algorithm, it may be
--* better to limit the growth of the bundle size than let it go as
--* high as it can, because that could cause too much added latency.
--* The default is six, because this is the number of packets in the
--* default TCP window size. A value of 1 would make CPUSaver indicate
--* an interrupt for every frame received. If you do not want to put
--* a limit on the bundle size, set this value to xFFFF.
--*
--* CPUSAVER_MIN_SIZE_DWORD - This is the location of the instruction
--* that contains a bit-mask describing the minimum size frame that
--* will be bundled. The default masks the lower 7 bits, which means
--* that any frame less than 128 bytes in length will not be bundled,
--* but will instead immediately generate an interrupt. This does
--* not affect the current bundle in any way. Any frame that is 128
--* bytes or large will be bundled normally. This feature is meant
--* to provide immediate indication of ACK frames in a TCP environment.
--* Customers were seeing poor performance when a machine with CPUSaver
--* enabled was sending but not receiving. The delay introduced when
--* the ACKs were received was enough to reduce total throughput, because
--* the sender would sit idle until the ACK was finally seen.
--*
--* The current default is 0xFF80, which masks out the lower 7 bits.
--* This means that any frame which is x7F (127) bytes or smaller
--* will cause an immediate interrupt. Because this value must be a
--* bit mask, there are only a few valid values that can be used. To
--* turn this feature off, the driver can write the value xFFFF to the
--* lower word of this instruction (in the same way that the other
--* parameters are used). Likewise, a value of 0xF800 (2047) would
--* cause an interrupt to be generated for every frame, because all
--* standard Ethernet frames are <= 2047 bytes in length.
--*************************************************************************/
--
--#ifndef UCODE_MAX_DWORDS
--#define UCODE_MAX_DWORDS 134
--#endif
--
--/********************************************************/
--/* CPUSaver micro code for the D101A */
--/********************************************************/
--
--/* Version 2.0 */
--
--/* This value is the same for both A and B step of 558. */
--
--#define D101_CPUSAVER_TIMER_DWORD 72
--#define D101_CPUSAVER_BUNDLE_DWORD UCODE_MAX_DWORDS
--#define D101_CPUSAVER_MIN_SIZE_DWORD UCODE_MAX_DWORDS
--
--#define D101_A_RCVBUNDLE_UCODE \
--{\
--0x03B301BB, 0x0046FFFF, 0xFFFFFFFF, 0x051DFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
--0x000C0001, 0x00101212, 0x000C0008, 0x003801BC, \
--0x00000000, 0x00124818, 0x000C1000, 0x00220809, \
--0x00010200, 0x00124818, 0x000CFFFC, 0x003803B5, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x0010009C, 0x0024B81D, 0x00130836, 0x000C0001, \
--0x0026081C, 0x0020C81B, 0x00130824, 0x00222819, \
--0x00101213, 0x00041000, 0x003A03B3, 0x00010200, \
--0x00101B13, 0x00238081, 0x00213049, 0x0038003B, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x0010009C, 0x0024B83E, 0x00130826, 0x000C0001, \
--0x0026083B, 0x00010200, 0x00134824, 0x000C0001, \
--0x00101213, 0x00041000, 0x0038051E, 0x00101313, \
--0x00010400, 0x00380521, 0x00050600, 0x00100824, \
--0x00101310, 0x00041000, 0x00080600, 0x00101B10, \
--0x0038051E, 0x00000000, 0x00000000, 0x00000000 \
--}
--
--/********************************************************/
--/* CPUSaver micro code for the D101B */
--/********************************************************/
--
--/* Version 2.0 */
--
--#define D101_B0_RCVBUNDLE_UCODE \
--{\
--0x03B401BC, 0x0047FFFF, 0xFFFFFFFF, 0x051EFFFF, 0xFFFFFFFF, 0xFFFFFFFF, \
--0x000C0001, 0x00101B92, 0x000C0008, 0x003801BD, \
--0x00000000, 0x00124818, 0x000C1000, 0x00220809, \
--0x00010200, 0x00124818, 0x000CFFFC, 0x003803B6, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x0010009C, 0x0024B81D, 0x0013082F, 0x000C0001, \
--0x0026081C, 0x0020C81B, 0x00130837, 0x00222819, \
--0x00101B93, 0x00041000, 0x003A03B4, 0x00010200, \
--0x00101793, 0x00238082, 0x0021304A, 0x0038003C, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x0010009C, 0x0024B83E, 0x00130826, 0x000C0001, \
--0x0026083B, 0x00010200, 0x00134837, 0x000C0001, \
--0x00101B93, 0x00041000, 0x0038051F, 0x00101313, \
--0x00010400, 0x00380522, 0x00050600, 0x00100837, \
--0x00101310, 0x00041000, 0x00080600, 0x00101790, \
--0x0038051F, 0x00000000, 0x00000000, 0x00000000 \
--}
--
--/********************************************************/
--/* CPUSaver micro code for the D101M (B-step only) */
--/********************************************************/
--
--/* Version 2.10.1 */
--
--/* Parameter values for the D101M B-step */
--#define D101M_CPUSAVER_TIMER_DWORD 78
--#define D101M_CPUSAVER_BUNDLE_DWORD 65
--#define D101M_CPUSAVER_MIN_SIZE_DWORD 126
--
--#define D101M_B_RCVBUNDLE_UCODE \
--{\
--0x00550215, 0xFFFF0437, 0xFFFFFFFF, 0x06A70789, 0xFFFFFFFF, 0x0558FFFF, \
--0x000C0001, 0x00101312, 0x000C0008, 0x00380216, \
--0x0010009C, 0x00204056, 0x002380CC, 0x00380056, \
--0x0010009C, 0x00244C0B, 0x00000800, 0x00124818, \
--0x00380438, 0x00000000, 0x00140000, 0x00380555, \
--0x00308000, 0x00100662, 0x00100561, 0x000E0408, \
--0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
--0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
--0x000C007E, 0x00222C21, 0x000C0002, 0x00103093, \
--0x00380C7A, 0x00080000, 0x00103090, 0x00380C7A, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x0010009C, 0x00244C2D, 0x00010004, 0x00041000, \
--0x003A0437, 0x00044010, 0x0038078A, 0x00000000, \
--0x00100099, 0x00206C7A, 0x0010009C, 0x00244C48, \
--0x00130824, 0x000C0001, 0x00101213, 0x00260C75, \
--0x00041000, 0x00010004, 0x00130826, 0x000C0006, \
--0x002206A8, 0x0013C926, 0x00101313, 0x003806A8, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
--0x00101210, 0x00380C34, 0x00000000, 0x00000000, \
--0x0021155B, 0x00100099, 0x00206559, 0x0010009C, \
--0x00244559, 0x00130836, 0x000C0000, 0x00220C62, \
--0x000C0001, 0x00101B13, 0x00229C0E, 0x00210C0E, \
--0x00226C0E, 0x00216C0E, 0x0022FC0E, 0x00215C0E, \
--0x00214C0E, 0x00380555, 0x00010004, 0x00041000, \
--0x00278C67, 0x00040800, 0x00018100, 0x003A0437, \
--0x00130826, 0x000C0001, 0x00220559, 0x00101313, \
--0x00380559, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00130831, 0x0010090B, 0x00124813, \
--0x000CFF80, 0x002606AB, 0x00041000, 0x00010004, \
--0x003806A8, 0x00000000, 0x00000000, 0x00000000, \
--}
--
--/********************************************************/
--/* CPUSaver micro code for the D101S */
--/********************************************************/
--
--/* Version 1.20.1 */
--
--/* Parameter values for the D101S */
--#define D101S_CPUSAVER_TIMER_DWORD 78
--#define D101S_CPUSAVER_BUNDLE_DWORD 67
--#define D101S_CPUSAVER_MIN_SIZE_DWORD 128
--
--#define D101S_RCVBUNDLE_UCODE \
--{\
--0x00550242, 0xFFFF047E, 0xFFFFFFFF, 0x06FF0818, 0xFFFFFFFF, 0x05A6FFFF, \
--0x000C0001, 0x00101312, 0x000C0008, 0x00380243, \
--0x0010009C, 0x00204056, 0x002380D0, 0x00380056, \
--0x0010009C, 0x00244F8B, 0x00000800, 0x00124818, \
--0x0038047F, 0x00000000, 0x00140000, 0x003805A3, \
--0x00308000, 0x00100610, 0x00100561, 0x000E0408, \
--0x00134861, 0x000C0002, 0x00103093, 0x00308000, \
--0x00100624, 0x00100561, 0x000E0408, 0x00100861, \
--0x000C007E, 0x00222FA1, 0x000C0002, 0x00103093, \
--0x00380F90, 0x00080000, 0x00103090, 0x00380F90, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x0010009C, 0x00244FAD, 0x00010004, 0x00041000, \
--0x003A047E, 0x00044010, 0x00380819, 0x00000000, \
--0x00100099, 0x00206FFD, 0x0010009A, 0x0020AFFD, \
--0x0010009C, 0x00244FC8, 0x00130824, 0x000C0001, \
--0x00101213, 0x00260FF7, 0x00041000, 0x00010004, \
--0x00130826, 0x000C0006, 0x00220700, 0x0013C926, \
--0x00101313, 0x00380700, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00080600, 0x00101B10, 0x00050004, 0x00100826, \
--0x00101210, 0x00380FB6, 0x00000000, 0x00000000, \
--0x002115A9, 0x00100099, 0x002065A7, 0x0010009A, \
--0x0020A5A7, 0x0010009C, 0x002445A7, 0x00130836, \
--0x000C0000, 0x00220FE4, 0x000C0001, 0x00101B13, \
--0x00229F8E, 0x00210F8E, 0x00226F8E, 0x00216F8E, \
--0x0022FF8E, 0x00215F8E, 0x00214F8E, 0x003805A3, \
--0x00010004, 0x00041000, 0x00278FE9, 0x00040800, \
--0x00018100, 0x003A047E, 0x00130826, 0x000C0001, \
--0x002205A7, 0x00101313, 0x003805A7, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00130831, \
--0x0010090B, 0x00124813, 0x000CFF80, 0x00260703, \
--0x00041000, 0x00010004, 0x00380700 \
--}
--
--/********************************************************/
--/* CPUSaver micro code for the D102 B-step */
--/********************************************************/
--
--/* Version 2.0 */
--/* Parameter values for the D102 B-step */
--#define D102_B_CPUSAVER_TIMER_DWORD 82
--#define D102_B_CPUSAVER_BUNDLE_DWORD 106
--#define D102_B_CPUSAVER_MIN_SIZE_DWORD 70
--
--#define D102_B_RCVBUNDLE_UCODE \
--{\
--0x006F0276, 0x0EF71FFF, 0x0ED30F86, 0x0D250ED9, 0x1FFF1FFF, 0x1FFF04D2, \
--0x00300001, 0x0140D871, 0x00300008, 0x00E00277, \
--0x01406C57, 0x00816073, 0x008700FA, 0x00E00070, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x01406CBA, 0x00807F9A, 0x00901F9A, 0x0024FFFF, \
--0x014B6F6F, 0x0030FFFE, 0x01407172, 0x01496FBA, \
--0x014B6F72, 0x00308000, 0x01406C52, 0x00912EFC, \
--0x00E00EF8, 0x00000000, 0x00000000, 0x00000000, \
--0x00906F8C, 0x00900F8C, 0x00E00F87, 0x00000000, \
--0x00906ED8, 0x01406C55, 0x00E00ED4, 0x00000000, \
--0x01406C51, 0x0080DFC2, 0x01406C52, 0x00815FC2, \
--0x01406C57, 0x00917FCC, 0x00E01FDD, 0x00000000, \
--0x00822D30, 0x01406C51, 0x0080CD26, 0x01406C52, \
--0x00814D26, 0x01406C57, 0x00916D26, 0x014C6FD7, \
--0x00300000, 0x00841FD2, 0x00300001, 0x0140D772, \
--0x00E012B3, 0x014C6F91, 0x0150710B, 0x01496F72, \
--0x0030FF80, 0x00940EDD, 0x00102000, 0x00038400, \
--0x00E00EDA, 0x00000000, 0x00000000, 0x00000000, \
--0x01406C57, 0x00917FE9, 0x00001000, 0x00E01FE9, \
--0x00200600, 0x0140D76F, 0x00138400, 0x01406FD8, \
--0x0140D96F, 0x00E01FDD, 0x00038400, 0x00102000, \
--0x00971FD7, 0x00101000, 0x00050200, 0x00E804D2, \
--0x014C6FD8, 0x00300001, 0x00840D26, 0x0140D872, \
--0x00E00D26, 0x014C6FD9, 0x00300001, 0x0140D972, \
--0x00941FBD, 0x00102000, 0x00038400, 0x014C6FD8, \
--0x00300006, 0x00840EDA, 0x014F71D8, 0x0140D872, \
--0x00E00EDA, 0x01496F50, 0x00E004D3, 0x00000000, \
--}
--
--/********************************************************/
--/* Micro code for the D102 C-step */
--/********************************************************/
--
--/* Parameter values for the D102 C-step */
--#define D102_C_CPUSAVER_TIMER_DWORD 46
--#define D102_C_CPUSAVER_BUNDLE_DWORD 74
--#define D102_C_CPUSAVER_MIN_SIZE_DWORD 54
--
--#define D102_C_RCVBUNDLE_UCODE \
--{ \
--0x00700279, 0x0E6604E2, 0x02BF0CAE, 0x1508150C, 0x15190E5B, 0x0E840F13, \
--0x00E014D8, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014DC, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014F4, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014E0, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014E7, 0x00000000, 0x00000000, 0x00000000, \
--0x00141000, 0x015D6F0D, 0x00E002C0, 0x00000000, \
--0x00200600, 0x00E0150D, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x0030FF80, 0x00940E6A, 0x00038200, 0x00102000, \
--0x00E00E67, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00906E65, 0x00800E60, 0x00E00E5D, 0x00000000, \
--0x00300006, 0x00E0151A, 0x00000000, 0x00000000, \
--0x00906F19, 0x00900F19, 0x00E00F14, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x01406CBA, 0x00807FDA, 0x00901FDA, 0x0024FFFF, \
--0x014B6F6F, 0x0030FFFE, 0x01407172, 0x01496FBA, \
--0x014B6F72, 0x00308000, 0x01406C52, 0x00912E89, \
--0x00E00E85, 0x00000000, 0x00000000, 0x00000000 \
--}
--
--/********************************************************/
--/* Micro code for the D102 E-step */
--/********************************************************/
--
--/* Parameter values for the D102 E-step */
--#define D102_E_CPUSAVER_TIMER_DWORD 42
--#define D102_E_CPUSAVER_BUNDLE_DWORD 54
--#define D102_E_CPUSAVER_MIN_SIZE_DWORD 46
--
--#define D102_E_RCVBUNDLE_UCODE \
--{\
--0x007D028F, 0x0E4204F9, 0x14ED0C85, 0x14FA14E9, 0x1FFF1FFF, 0x1FFF1FFF, \
--0x00E014B9, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014BD, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014D5, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014C1, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00000000, 0x00000000, 0x00000000, 0x00000000, \
--0x00E014C8, 0x00000000, 0x00000000, 0x00000000, \
--0x00200600, 0x00E014EE, 0x00000000, 0x00000000, \
--0x0030FF80, 0x00940E46, 0x00038200, 0x00102000, \
--0x00E00E43, 0x00000000, 0x00000000, 0x00000000, \
--0x00300006, 0x00E014FB, 0x00000000, 0x00000000 \
--}
--
--#endif /* _E100_UCODE_H_ */
---- linux-2.6.0/drivers/net/e100/LICENSE 2003-06-14 12:18:24.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,339 +0,0 @@
--
--"This software program is licensed subject to the GNU General Public License
--(GPL). Version 2, June 1991, available at
--<http://www.fsf.org/copyleft/gpl.html>"
--
--GNU General Public License
--
--Version 2, June 1991
--
--Copyright (C) 1989, 1991 Free Software Foundation, Inc.
--59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
--
--Everyone is permitted to copy and distribute verbatim copies of this license
--document, but changing it is not allowed.
--
--Preamble
--
--The licenses for most software are designed to take away your freedom to
--share and change it. By contrast, the GNU General Public License is intended
--to guarantee your freedom to share and change free software--to make sure
--the software is free for all its users. This General Public License applies
--to most of the Free Software Foundation's software and to any other program
--whose authors commit to using it. (Some other Free Software Foundation
--software is covered by the GNU Library General Public License instead.) You
--can apply it to your programs, too.
--
--When we speak of free software, we are referring to freedom, not price. Our
--General Public Licenses are designed to make sure that you have the freedom
--to distribute copies of free software (and charge for this service if you
--wish), that you receive source code or can get it if you want it, that you
--can change the software or use pieces of it in new free programs; and that
--you know you can do these things.
--
--To protect your rights, we need to make restrictions that forbid anyone to
--deny you these rights or to ask you to surrender the rights. These
--restrictions translate to certain responsibilities for you if you distribute
--copies of the software, or if you modify it.
--
--For example, if you distribute copies of such a program, whether gratis or
--for a fee, you must give the recipients all the rights that you have. You
--must make sure that they, too, receive or can get the source code. And you
--must show them these terms so they know their rights.
--
--We protect your rights with two steps: (1) copyright the software, and (2)
--offer you this license which gives you legal permission to copy, distribute
--and/or modify the software.
--
--Also, for each author's protection and ours, we want to make certain that
--everyone understands that there is no warranty for this free software. If
--the software is modified by someone else and passed on, we want its
--recipients to know that what they have is not the original, so that any
--problems introduced by others will not reflect on the original authors'
--reputations.
--
--Finally, any free program is threatened constantly by software patents. We
--wish to avoid the danger that redistributors of a free program will
--individually obtain patent licenses, in effect making the program
--proprietary. To prevent this, we have made it clear that any patent must be
--licensed for everyone's free use or not licensed at all.
--
--The precise terms and conditions for copying, distribution and modification
--follow.
--
--TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
--
--0. This License applies to any program or other work which contains a notice
-- placed by the copyright holder saying it may be distributed under the
-- terms of this General Public License. The "Program", below, refers to any
-- such program or work, and a "work based on the Program" means either the
-- Program or any derivative work under copyright law: that is to say, a
-- work containing the Program or a portion of it, either verbatim or with
-- modifications and/or translated into another language. (Hereinafter,
-- translation is included without limitation in the term "modification".)
-- Each licensee is addressed as "you".
--
-- Activities other than copying, distribution and modification are not
-- covered by this License; they are outside its scope. The act of running
-- the Program is not restricted, and the output from the Program is covered
-- only if its contents constitute a work based on the Program (independent
-- of having been made by running the Program). Whether that is true depends
-- on what the Program does.
--
--1. You may copy and distribute verbatim copies of the Program's source code
-- as you receive it, in any medium, provided that you conspicuously and
-- appropriately publish on each copy an appropriate copyright notice and
-- disclaimer of warranty; keep intact all the notices that refer to this
-- License and to the absence of any warranty; and give any other recipients
-- of the Program a copy of this License along with the Program.
--
-- You may charge a fee for the physical act of transferring a copy, and you
-- may at your option offer warranty protection in exchange for a fee.
--
--2. You may modify your copy or copies of the Program or any portion of it,
-- thus forming a work based on the Program, and copy and distribute such
-- modifications or work under the terms of Section 1 above, provided that
-- you also meet all of these conditions:
--
-- * a) You must cause the modified files to carry prominent notices stating
-- that you changed the files and the date of any change.
--
-- * b) You must cause any work that you distribute or publish, that in
-- whole or in part contains or is derived from the Program or any part
-- thereof, to be licensed as a whole at no charge to all third parties
-- under the terms of this License.
--
-- * c) If the modified program normally reads commands interactively when
-- run, you must cause it, when started running for such interactive
-- use in the most ordinary way, to print or display an announcement
-- including an appropriate copyright notice and a notice that there is
-- no warranty (or else, saying that you provide a warranty) and that
-- users may redistribute the program under these conditions, and
-- telling the user how to view a copy of this License. (Exception: if
-- the Program itself is interactive but does not normally print such
-- an announcement, your work based on the Program is not required to
-- print an announcement.)
--
-- These requirements apply to the modified work as a whole. If identifiable
-- sections of that work are not derived from the Program, and can be
-- reasonably considered independent and separate works in themselves, then
-- this License, and its terms, do not apply to those sections when you
-- distribute them as separate works. But when you distribute the same
-- sections as part of a whole which is a work based on the Program, the
-- distribution of the whole must be on the terms of this License, whose
-- permissions for other licensees extend to the entire whole, and thus to
-- each and every part regardless of who wrote it.
--
-- Thus, it is not the intent of this section to claim rights or contest
-- your rights to work written entirely by you; rather, the intent is to
-- exercise the right to control the distribution of derivative or
-- collective works based on the Program.
--
-- In addition, mere aggregation of another work not based on the Program
-- with the Program (or with a work based on the Program) on a volume of a
-- storage or distribution medium does not bring the other work under the
-- scope of this License.
--
--3. You may copy and distribute the Program (or a work based on it, under
-- Section 2) in object code or executable form under the terms of Sections
-- 1 and 2 above provided that you also do one of the following:
--
-- * a) Accompany it with the complete corresponding machine-readable source
-- code, which must be distributed under the terms of Sections 1 and 2
-- above on a medium customarily used for software interchange; or,
--
-- * b) Accompany it with a written offer, valid for at least three years,
-- to give any third party, for a charge no more than your cost of
-- physically performing source distribution, a complete machine-
-- readable copy of the corresponding source code, to be distributed
-- under the terms of Sections 1 and 2 above on a medium customarily
-- used for software interchange; or,
--
-- * c) Accompany it with the information you received as to the offer to
-- distribute corresponding source code. (This alternative is allowed
-- only for noncommercial distribution and only if you received the
-- program in object code or executable form with such an offer, in
-- accord with Subsection b above.)
--
-- The source code for a work means the preferred form of the work for
-- making modifications to it. For an executable work, complete source code
-- means all the source code for all modules it contains, plus any
-- associated interface definition files, plus the scripts used to control
-- compilation and installation of the executable. However, as a special
-- exception, the source code distributed need not include anything that is
-- normally distributed (in either source or binary form) with the major
-- components (compiler, kernel, and so on) of the operating system on which
-- the executable runs, unless that component itself accompanies the
-- executable.
--
-- If distribution of executable or object code is made by offering access
-- to copy from a designated place, then offering equivalent access to copy
-- the source code from the same place counts as distribution of the source
-- code, even though third parties are not compelled to copy the source
-- along with the object code.
--
--4. You may not copy, modify, sublicense, or distribute the Program except as
-- expressly provided under this License. Any attempt otherwise to copy,
-- modify, sublicense or distribute the Program is void, and will
-- automatically terminate your rights under this License. However, parties
-- who have received copies, or rights, from you under this License will not
-- have their licenses terminated so long as such parties remain in full
-- compliance.
--
--5. You are not required to accept this License, since you have not signed
-- it. However, nothing else grants you permission to modify or distribute
-- the Program or its derivative works. These actions are prohibited by law
-- if you do not accept this License. Therefore, by modifying or
-- distributing the Program (or any work based on the Program), you
-- indicate your acceptance of this License to do so, and all its terms and
-- conditions for copying, distributing or modifying the Program or works
-- based on it.
--
--6. Each time you redistribute the Program (or any work based on the
-- Program), the recipient automatically receives a license from the
-- original licensor to copy, distribute or modify the Program subject to
-- these terms and conditions. You may not impose any further restrictions
-- on the recipients' exercise of the rights granted herein. You are not
-- responsible for enforcing compliance by third parties to this License.
--
--7. If, as a consequence of a court judgment or allegation of patent
-- infringement or for any other reason (not limited to patent issues),
-- conditions are imposed on you (whether by court order, agreement or
-- otherwise) that contradict the conditions of this License, they do not
-- excuse you from the conditions of this License. If you cannot distribute
-- so as to satisfy simultaneously your obligations under this License and
-- any other pertinent obligations, then as a consequence you may not
-- distribute the Program at all. For example, if a patent license would
-- not permit royalty-free redistribution of the Program by all those who
-- receive copies directly or indirectly through you, then the only way you
-- could satisfy both it and this License would be to refrain entirely from
-- distribution of the Program.
--
-- If any portion of this section is held invalid or unenforceable under any
-- particular circumstance, the balance of the section is intended to apply
-- and the section as a whole is intended to apply in other circumstances.
--
-- It is not the purpose of this section to induce you to infringe any
-- patents or other property right claims or to contest validity of any
-- such claims; this section has the sole purpose of protecting the
-- integrity of the free software distribution system, which is implemented
-- by public license practices. Many people have made generous contributions
-- to the wide range of software distributed through that system in
-- reliance on consistent application of that system; it is up to the
-- author/donor to decide if he or she is willing to distribute software
-- through any other system and a licensee cannot impose that choice.
--
-- This section is intended to make thoroughly clear what is believed to be
-- a consequence of the rest of this License.
--
--8. If the distribution and/or use of the Program is restricted in certain
-- countries either by patents or by copyrighted interfaces, the original
-- copyright holder who places the Program under this License may add an
-- explicit geographical distribution limitation excluding those countries,
-- so that distribution is permitted only in or among countries not thus
-- excluded. In such case, this License incorporates the limitation as if
-- written in the body of this License.
--
--9. The Free Software Foundation may publish revised and/or new versions of
-- the General Public License from time to time. Such new versions will be
-- similar in spirit to the present version, but may differ in detail to
-- address new problems or concerns.
--
-- Each version is given a distinguishing version number. If the Program
-- specifies a version number of this License which applies to it and "any
-- later version", you have the option of following the terms and
-- conditions either of that version or of any later version published by
-- the Free Software Foundation. If the Program does not specify a version
-- number of this License, you may choose any version ever published by the
-- Free Software Foundation.
--
--10. If you wish to incorporate parts of the Program into other free programs
-- whose distribution conditions are different, write to the author to ask
-- for permission. For software which is copyrighted by the Free Software
-- Foundation, write to the Free Software Foundation; we sometimes make
-- exceptions for this. Our decision will be guided by the two goals of
-- preserving the free status of all derivatives of our free software and
-- of promoting the sharing and reuse of software generally.
--
-- NO WARRANTY
--
--11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-- PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
-- EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-- ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
-- YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-- NECESSARY SERVICING, REPAIR OR CORRECTION.
--
--12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-- REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
-- DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
-- DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
-- (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
-- INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
-- THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
-- OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
--
--END OF TERMS AND CONDITIONS
--
--How to Apply These Terms to Your New Programs
--
--If you develop a new program, and you want it to be of the greatest
--possible use to the public, the best way to achieve this is to make it free
--software which everyone can redistribute and change under these terms.
--
--To do so, attach the following notices to the program. It is safest to
--attach them to the start of each source file to most effectively convey the
--exclusion of warranty; and each file should have at least the "copyright"
--line and a pointer to where the full notice is found.
--
--one line to give the program's name and an idea of what it does.
--Copyright (C) yyyy name of author
--
--This program is free software; you can redistribute it and/or modify it
--under the terms of the GNU General Public License as published by the Free
--Software Foundation; either version 2 of the License, or (at your option)
--any later version.
--
--This program is distributed in the hope that it will be useful, but WITHOUT
--ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
--FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
--more details.
--
--You should have received a copy of the GNU General Public License along with
--this program; if not, write to the Free Software Foundation, Inc., 59
--Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--
--Also add information on how to contact you by electronic and paper mail.
--
--If the program is interactive, make it output a short notice like this when
--it starts in an interactive mode:
--
--Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
--with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free
--software, and you are welcome to redistribute it under certain conditions;
--type 'show c' for details.
--
--The hypothetical commands 'show w' and 'show c' should show the appropriate
--parts of the General Public License. Of course, the commands you use may be
--called something other than 'show w' and 'show c'; they could even be
--mouse-clicks or menu items--whatever suits your program.
--
--You should also get your employer (if you work as a programmer) or your
--school, if any, to sign a "copyright disclaimer" for the program, if
--necessary. Here is a sample; alter the names:
--
--Yoyodyne, Inc., hereby disclaims all copyright interest in the program
--'Gnomovision' (which makes passes at compilers) written by James Hacker.
--
--signature of Ty Coon, 1 April 1989
--Ty Coon, President of Vice
--
--This General Public License does not permit incorporating your program into
--proprietary programs. If your program is a subroutine library, you may
--consider it more useful to permit linking proprietary applications with the
--library. If this is what you want to do, use the GNU Library General Public
--License instead of this License.
---- linux-2.6.0/drivers/net/e100/Makefile 2003-06-14 12:18:34.000000000 -0700
-+++ /dev/null 2002-08-30 16:31:37.000000000 -0700
-@@ -1,8 +0,0 @@
--#
--# Makefile for the Intel's E100 ethernet driver
--#
--
--obj-$(CONFIG_E100) += e100.o
--
--e100-objs := e100_main.o e100_config.o e100_phy.o \
-- e100_eeprom.o e100_test.o
---- linux-2.6.0/drivers/net/e2100.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/e2100.c 2003-12-28 23:21:01.000000000 -0800
-@@ -95,7 +95,6 @@ static inline void mem_off(short port)
- #define E21_BIG_RX_STOP_PG 0xF0 /* Last page +1 of RX ring */
- #define E21_TX_START_PG E21_RX_STOP_PG /* First page of TX buffer */
-
--int e2100_probe(struct net_device *dev);
- static int e21_probe1(struct net_device *dev, int ioaddr);
-
- static int e21_open(struct net_device *dev);
-@@ -117,10 +116,11 @@ static int e21_close(struct net_device *
- station address).
- */
-
--int __init e2100_probe(struct net_device *dev)
-+static int __init do_e2100_probe(struct net_device *dev)
- {
- int *port;
- int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-@@ -129,13 +129,46 @@ int __init e2100_probe(struct net_devic
- else if (base_addr != 0) /* Don't probe at all. */
- return -ENXIO;
-
-- for (port = e21_probe_list; *port; port++)
-+ for (port = e21_probe_list; *port; port++) {
-+ dev->irq = irq;
- if (e21_probe1(dev, *port) == 0)
- return 0;
-+ }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ /* NB: e21_close() handles free_irq */
-+ release_region(dev->base_addr, E21_IO_EXTENT);
-+}
-+
-+struct net_device * __init e2100_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_e2100_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init e21_probe1(struct net_device *dev, int ioaddr)
- {
- int i, status, retval;
-@@ -175,13 +208,6 @@ static int __init e21_probe1(struct net_
- for (i = 0; i < 6; i++)
- printk(" %02X", station_addr[i]);
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (" unable to get memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out;
-- }
--
- if (dev->irq < 2) {
- int irqlist[] = {15,11,10,12,5,9,3,4}, i;
- for (i = 0; i < 8; i++)
-@@ -191,8 +217,6 @@ static int __init e21_probe1(struct net_
- }
- if (i >= 8) {
- printk(" unable to get IRQ %d.\n", dev->irq);
-- kfree(dev->priv);
-- dev->priv = NULL;
- retval = -EAGAIN;
- goto out;
- }
-@@ -376,7 +400,7 @@ e21_close(struct net_device *dev)
- \f
- #ifdef MODULE
- #define MAX_E21_CARDS 4 /* Max number of E21 cards per module */
--static struct net_device dev_e21[MAX_E21_CARDS];
-+static struct net_device *dev_e21[MAX_E21_CARDS];
- static int io[MAX_E21_CARDS];
- static int irq[MAX_E21_CARDS];
- static int mem[MAX_E21_CARDS];
-@@ -398,29 +422,35 @@ ISA device autoprobes on a running machi
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
-- struct net_device *dev = &dev_e21[this_dev];
-- dev->irq = irq[this_dev];
-- dev->base_addr = io[this_dev];
-- dev->mem_start = mem[this_dev];
-- dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */
-- dev->init = e2100_probe;
- if (io[this_dev] == 0) {
- if (this_dev != 0) break; /* only autoprobe 1st one */
- printk(KERN_NOTICE "e2100.c: Presently autoprobing (not recommended) for a single card.\n");
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
-+ dev->irq = irq[this_dev];
-+ dev->base_addr = io[this_dev];
-+ dev->mem_start = mem[this_dev];
-+ dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */
-+ if (do_e2100_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_e21[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -429,13 +459,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
-- struct net_device *dev = &dev_e21[this_dev];
-- if (dev->priv != NULL) {
-- void *priv = dev->priv;
-- /* NB: e21_close() handles free_irq */
-- release_region(dev->base_addr, E21_IO_EXTENT);
-+ struct net_device *dev = dev_e21[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/eepro100.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/eepro100.c 2003-12-28 23:21:01.000000000 -0800
-@@ -542,6 +542,7 @@ static int speedo_start_xmit(struct sk_b
- static void speedo_refill_rx_buffers(struct net_device *dev, int force);
- static int speedo_rx(struct net_device *dev);
- static void speedo_tx_buffer_gc(struct net_device *dev);
-+static void poll_speedo (struct net_device *dev);
- static irqreturn_t speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
- static int speedo_close(struct net_device *dev);
- static struct net_device_stats *speedo_get_stats(struct net_device *dev);
-@@ -885,6 +886,9 @@ static int __devinit speedo_found1(struc
- dev->get_stats = &speedo_get_stats;
- dev->set_multicast_list = &set_rx_mode;
- dev->do_ioctl = &speedo_ioctl;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = &poll_speedo;
-+#endif
-
- if (register_netdevice(dev))
- goto err_free_unlock;
-@@ -1675,6 +1679,23 @@ static irqreturn_t speedo_interrupt(int
- return IRQ_RETVAL(handled);
- }
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+/*
-+ * Polling 'interrupt' - used by things like netconsole to send skbs
-+ * without having to re-enable interrupts. It's not called while
-+ * the interrupt routine is executing.
-+ */
-+
-+static void poll_speedo (struct net_device *dev)
-+{
-+ /* disable_irq is not very nice, but with the funny lockless design
-+ we have no other choice. */
-+ disable_irq(dev->irq);
-+ speedo_interrupt (dev->irq, dev, NULL);
-+ enable_irq(dev->irq);
-+}
-+#endif
-+
- static inline struct RxFD *speedo_rx_alloc(struct net_device *dev, int entry)
- {
- struct speedo_private *sp = (struct speedo_private *)dev->priv;
---- linux-2.6.0/drivers/net/eepro.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/eepro.c 2003-12-28 23:21:01.000000000 -0800
-@@ -302,9 +302,7 @@ struct eepro_local {
-
- /* Index to functions, as function prototypes. */
-
--extern int eepro_probe(struct net_device *dev);
--
--static int eepro_probe1(struct net_device *dev, short ioaddr);
-+static int eepro_probe1(struct net_device *dev, int autoprobe);
- static int eepro_open(struct net_device *dev);
- static int eepro_send_packet(struct sk_buff *skb, struct net_device *dev);
- static irqreturn_t eepro_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-@@ -527,10 +525,11 @@ buffer (transmit-buffer = 32K - receive-
- If dev->base_addr == 2, allocate space for the device and return success
- (detachable devices only).
- */
--int __init eepro_probe(struct net_device *dev)
-+static int __init do_eepro_probe(struct net_device *dev)
- {
- int i;
- int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-@@ -563,24 +562,48 @@ int __init eepro_probe(struct net_device
- #endif
-
- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return eepro_probe1(dev, base_addr);
-+ return eepro_probe1(dev, 0);
-
- else if (base_addr != 0) /* Don't probe at all. */
- return -ENXIO;
-
--
- for (i = 0; eepro_portlist[i]; i++) {
-- int ioaddr = eepro_portlist[i];
--
-- if (check_region(ioaddr, EEPRO_IO_EXTENT))
-- continue;
-- if (eepro_probe1(dev, ioaddr) == 0)
-+ dev->base_addr = eepro_portlist[i];
-+ dev->irq = irq;
-+ if (eepro_probe1(dev, 1) == 0)
- return 0;
- }
-
- return -ENODEV;
- }
-
-+struct net_device * __init eepro_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct eepro_local));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ SET_MODULE_OWNER(dev);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_eepro_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ release_region(dev->base_addr, EEPRO_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static void __init printEEPROMInfo(short ioaddr, struct net_device *dev)
- {
- unsigned short Word;
-@@ -713,83 +736,75 @@ static void eepro_print_info (struct net
- probes on the ISA bus. A good device probe avoids doing writes, and
- verifies that the correct device exists and functions. */
-
--static int __init eepro_probe1(struct net_device *dev, short ioaddr)
-+static int __init eepro_probe1(struct net_device *dev, int autoprobe)
- {
- unsigned short station_addr[6], id, counter;
-- int i, j, irqMask, retval = 0;
-+ int i;
- struct eepro_local *lp;
- enum iftype { AUI=0, BNC=1, TPE=2 };
-+ int ioaddr = dev->base_addr;
-+
-+ /* Grab the region so we can find another board if autoIRQ fails. */
-+ if (!request_region(ioaddr, EEPRO_IO_EXTENT, dev->name)) {
-+ if (!autoprobe)
-+ printk(KERN_WARNING "EEPRO: io-port 0x%04x in use \n",
-+ ioaddr);
-+ return -EBUSY;
-+ }
-
- /* Now, we are going to check for the signature of the
- ID_REG (register 2 of bank 0) */
-
-- id=inb(ioaddr + ID_REG);
-+ id = inb(ioaddr + ID_REG);
-
-- if (((id) & ID_REG_MASK) != ID_REG_SIG) {
-- retval = -ENODEV;
-+ if ((id & ID_REG_MASK) != ID_REG_SIG)
- goto exit;
-- }
-
-- /* We seem to have the 82595 signature, let's
-- play with its counter (last 2 bits of
-- register 2 of bank 0) to be sure. */
-+ /* We seem to have the 82595 signature, let's
-+ play with its counter (last 2 bits of
-+ register 2 of bank 0) to be sure. */
-
-- counter = (id & R_ROBIN_BITS);
--
-- if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS)!=(counter + 0x40)) {
-- retval = -ENODEV;
-- goto exit;
-- }
-+ counter = id & R_ROBIN_BITS;
-
-- /* Initialize the device structure */
-- dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL);
-- if (!dev->priv) {
-- retval = -ENOMEM;
-+ if ((inb(ioaddr + ID_REG) & R_ROBIN_BITS) != (counter + 0x40))
- goto exit;
-- }
--
-- memset(dev->priv, 0, sizeof(struct eepro_local));
--
-- lp = (struct eepro_local *)dev->priv;
-
-- /* default values */
-- lp->eepro = 0;
-+ lp = (struct eepro_local *)dev->priv;
-+ memset(lp, 0, sizeof(struct eepro_local));
- lp->xmt_bar = XMT_BAR_PRO;
- lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_PRO;
- lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_PRO;
- lp->eeprom_reg = EEPROM_REG_PRO;
-+ spin_lock_init(&lp->lock);
-
-- /* Now, get the ethernet hardware address from
-- the EEPROM */
-- station_addr[0] = read_eeprom(ioaddr, 2, dev);
--
-- /* FIXME - find another way to know that we've found
-- * an Etherexpress 10
-- */
-- if (station_addr[0] == 0x0000 ||
-- station_addr[0] == 0xffff) {
-- lp->eepro = LAN595FX_10ISA;
-+ /* Now, get the ethernet hardware address from
-+ the EEPROM */
-+ station_addr[0] = read_eeprom(ioaddr, 2, dev);
-+
-+ /* FIXME - find another way to know that we've found
-+ * an Etherexpress 10
-+ */
-+ if (station_addr[0] == 0x0000 || station_addr[0] == 0xffff) {
-+ lp->eepro = LAN595FX_10ISA;
- lp->eeprom_reg = EEPROM_REG_10;
- lp->xmt_lower_limit_reg = XMT_LOWER_LIMIT_REG_10;
- lp->xmt_upper_limit_reg = XMT_UPPER_LIMIT_REG_10;
- lp->xmt_bar = XMT_BAR_10;
-- station_addr[0] = read_eeprom(ioaddr, 2, dev);
-- }
-- station_addr[1] = read_eeprom(ioaddr, 3, dev);
-- station_addr[2] = read_eeprom(ioaddr, 4, dev);
-+ station_addr[0] = read_eeprom(ioaddr, 2, dev);
-+ }
-+ station_addr[1] = read_eeprom(ioaddr, 3, dev);
-+ station_addr[2] = read_eeprom(ioaddr, 4, dev);
-
- if (!lp->eepro) {
- if (read_eeprom(ioaddr,7,dev)== ee_FX_INT2IRQ)
- lp->eepro = 2;
- else if (station_addr[2] == SA_ADDR1)
- lp->eepro = 1;
-- }
--
-- /* Fill in the 'dev' fields. */
-- dev->base_addr = ioaddr;
-+ }
-
-+ /* Fill in the 'dev' fields. */
- for (i=0; i < 6; i++)
-- dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i];
-+ dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i];
-
- /* RX buffer must be more than 3K and less than 29K */
- if (dev->mem_end < 3072 || dev->mem_end > 29696)
-@@ -798,65 +813,49 @@ static int __init eepro_probe1(struct ne
- /* calculate {xmt,rcv}_{lower,upper}_limit */
- eepro_recalc(dev);
-
--
-- if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE))
-- dev->if_port = BNC;
-+ if (GetBit( read_eeprom(ioaddr, 5, dev),ee_BNC_TPE))
-+ dev->if_port = BNC;
- else
- dev->if_port = TPE;
-
-- if ((dev->irq < 2) && (lp->eepro!=0)) {
-- i = read_eeprom(ioaddr, 1, dev);
-- irqMask = read_eeprom(ioaddr, 7, dev);
-- i &= 0x07; /* Mask off INT number */
--
-- for (j=0; ((j<16) && (i>=0)); j++) {
-- if ((irqMask & (1<<j))!=0) {
-- if (i==0) {
-- dev->irq = j;
-- break; /* found bit corresponding to irq */
-- }
-- i--; /* count bits set in irqMask */
-- }
-- }
-- if (dev->irq < 2) {
-- printk(KERN_ERR " Duh! invalid interrupt vector stored in EEPROM.\n");
-- retval = -ENODEV;
-- goto freeall;
-- } else
-- if (dev->irq==2) dev->irq = 9;
-- }
--
-- /* Grab the region so we can find another board if autoIRQ fails. */
-- if (!request_region(ioaddr, EEPRO_IO_EXTENT, dev->name)) {
-- printk(KERN_WARNING "EEPRO: io-port 0x%04x in use \n", ioaddr);
-- goto freeall;
-- }
-- ((struct eepro_local *)dev->priv)->lock = SPIN_LOCK_UNLOCKED;
--
-- dev->open = eepro_open;
-- dev->stop = eepro_close;
-- dev->hard_start_xmit = eepro_send_packet;
-- dev->get_stats = eepro_get_stats;
-- dev->set_multicast_list = &set_multicast_list;
-- dev->tx_timeout = eepro_tx_timeout;
-- dev->watchdog_timeo = TX_TIMEOUT;
--
-- /* Fill in the fields of the device structure with
-- ethernet generic values */
-- ether_setup(dev);
--
-+ if (dev->irq < 2 && lp->eepro != 0) {
-+ /* Mask off INT number */
-+ int count = read_eeprom(ioaddr, 1, dev) & 7;
-+ unsigned irqMask = read_eeprom(ioaddr, 7, dev);
-+
-+ while (count--)
-+ irqMask &= irqMask - 1;
-+
-+ count = ffs(irqMask);
-+
-+ if (count)
-+ dev->irq = count - 1;
-+
-+ if (dev->irq < 2) {
-+ printk(KERN_ERR " Duh! illegal interrupt vector stored in EEPROM.\n");
-+ goto exit;
-+ } else if (dev->irq == 2) {
-+ dev->irq = 9;
-+ }
-+ }
-+
-+ dev->open = eepro_open;
-+ dev->stop = eepro_close;
-+ dev->hard_start_xmit = eepro_send_packet;
-+ dev->get_stats = eepro_get_stats;
-+ dev->set_multicast_list = &set_multicast_list;
-+ dev->tx_timeout = eepro_tx_timeout;
-+ dev->watchdog_timeo = TX_TIMEOUT;
-+
- /* print boot time info */
- eepro_print_info(dev);
-
- /* reset 82595 */
-- eepro_reset(ioaddr);
--
-+ eepro_reset(ioaddr);
-+ return 0;
- exit:
-- return retval;
--freeall:
-- kfree(dev->priv);
-- goto exit;
--
-+ release_region(dev->base_addr, EEPRO_IO_EXTENT);
-+ return -ENODEV;
- }
-
- /* Open/initialize the board. This is called (in the current kernel)
-@@ -1701,7 +1700,7 @@ eepro_transmit_interrupt(struct net_devi
- #ifdef MODULE
-
- #define MAX_EEPRO 8
--static struct net_device dev_eepro[MAX_EEPRO];
-+static struct net_device *dev_eepro[MAX_EEPRO];
-
- static int io[MAX_EEPRO];
- static int irq[MAX_EEPRO];
-@@ -1729,6 +1728,7 @@ MODULE_PARM_DESC(autodetect, "EtherExpre
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int i;
- if (io[0] == 0 && autodetect == 0) {
- printk(KERN_WARNING "eepro_init_module: Probe is very dangerous in ISA boards!\n");
-@@ -1743,17 +1743,24 @@ init_module(void)
- }
-
- for (i = 0; i < MAX_EEPRO; i++) {
-- struct net_device *d = &dev_eepro[n_eepro];
-- d->mem_end = mem[i];
-- d->base_addr = io[i];
-- d->irq = irq[i];
-- d->init = eepro_probe;
--
-- if (register_netdev(d) == 0)
-- n_eepro++;
-- else
-- break;
-+ dev = alloc_etherdev(sizeof(struct eepro_local));
-+ if (!dev)
-+ break;
-+
-+ dev->mem_end = mem[i];
-+ dev->base_addr = io[i];
-+ dev->irq = irq[i];
-+
-+ if (do_eepro_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_eepro[n_eepro++] = dev;
-+ continue;
-+ }
-+ release_region(dev->base_addr, EEPRO_IO_EXTENT);
- }
-+ free_netdev(dev);
-+ break;
-+ }
-
- if (n_eepro)
- printk(KERN_INFO "%s", version);
-@@ -1767,15 +1774,10 @@ cleanup_module(void)
- int i;
-
- for (i=0; i<n_eepro; i++) {
-- struct net_device *d = &dev_eepro[i];
-- unregister_netdev(d);
--
-- kfree(d->priv);
-- d->priv=NULL;
--
-- /* If we don't do this, we can't re-insmod it later. */
-- release_region(d->base_addr, EEPRO_IO_EXTENT);
--
-+ struct net_device *dev = dev_eepro[i];
-+ unregister_netdev(dev);
-+ release_region(dev->base_addr, EEPRO_IO_EXTENT);
-+ free_netdev(dev);
- }
- }
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/eexpress.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/eexpress.c 2003-12-28 23:21:01.000000000 -0800
-@@ -244,7 +244,6 @@ static char mca_irqmap[] = { 12, 9, 3, 4
- * Prototypes for Linux interface
- */
-
--extern int express_probe(struct net_device *dev);
- static int eexp_open(struct net_device *dev);
- static int eexp_close(struct net_device *dev);
- static void eexp_timeout(struct net_device *dev);
-@@ -334,11 +333,13 @@ static inline unsigned short int SHADOW(
- * checks for presence of EtherExpress card
- */
-
--int __init express_probe(struct net_device *dev)
-+static int __init do_express_probe(struct net_device *dev)
- {
- unsigned short *port;
- static unsigned short ports[] = { 0x240,0x300,0x310,0x270,0x320,0x340,0 };
- unsigned short ioaddr = dev->base_addr;
-+ int dev_irq = dev->irq;
-+ int err;
-
- SET_MODULE_OWNER(dev);
-
-@@ -391,27 +392,58 @@ int __init express_probe(struct net_devi
- }
- }
- #endif
-- if (ioaddr&0xfe00)
-- return eexp_hw_probe(dev,ioaddr);
-- else if (ioaddr)
-+ if (ioaddr&0xfe00) {
-+ if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress"))
-+ return -EBUSY;
-+ err = eexp_hw_probe(dev,ioaddr);
-+ release_region(ioaddr, EEXP_IO_EXTENT);
-+ return err;
-+ } else if (ioaddr)
- return -ENXIO;
-
- for (port=&ports[0] ; *port ; port++ )
- {
- unsigned short sum = 0;
- int i;
-+ if (!request_region(*port, EEXP_IO_EXTENT, "EtherExpress"))
-+ continue;
- for ( i=0 ; i<4 ; i++ )
- {
- unsigned short t;
- t = inb(*port + ID_PORT);
- sum |= (t>>4) << ((t & 0x03)<<2);
- }
-- if (sum==0xbaba && !eexp_hw_probe(dev,*port))
-+ if (sum==0xbaba && !eexp_hw_probe(dev,*port)) {
-+ release_region(*port, EEXP_IO_EXTENT);
- return 0;
-+ }
-+ release_region(*port, EEXP_IO_EXTENT);
-+ dev->irq = dev_irq;
- }
- return -ENODEV;
- }
-
-+struct net_device * __init express_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_express_probe(dev);
-+ if (!err) {
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-+ }
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- /*
- * open and initialize the adapter, ready for use
- */
-@@ -1058,7 +1090,7 @@ static int __init eexp_hw_probe(struct n
- unsigned int memory_size;
- int i;
- unsigned short xsum = 0;
-- struct net_local *lp;
-+ struct net_local *lp = dev->priv;
-
- printk("%s: EtherExpress 16 at %#x ",dev->name,ioaddr);
-
-@@ -1108,17 +1140,18 @@ static int __init eexp_hw_probe(struct n
- buswidth = !((setupval & 0x400) >> 10);
- }
-
-- dev->priv = lp = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (!dev->priv)
-- return -ENOMEM;
--
-- memset(dev->priv, 0, sizeof(struct net_local));
-+ memset(lp, 0, sizeof(struct net_local));
- spin_lock_init(&lp->lock);
-
- printk("(IRQ %d, %s connector, %d-bit bus", dev->irq,
- eexp_ifmap[dev->if_port], buswidth?8:16);
-
-+ if (!request_region(dev->base_addr + 0x300e, 1, "EtherExpress"))
-+ return -EBUSY;
-+
- eexp_hw_set_interface(dev);
-+
-+ release_region(dev->base_addr + 0x300e, 1);
-
- /* Find out how much RAM we have on the card */
- outw(0, dev->base_addr + WRITE_PTR);
-@@ -1156,7 +1189,6 @@ static int __init eexp_hw_probe(struct n
- break;
- default:
- printk(") bad memory size (%dk).\n", memory_size);
-- kfree(dev->priv);
- return -ENODEV;
- break;
- }
-@@ -1171,7 +1203,6 @@ static int __init eexp_hw_probe(struct n
- dev->set_multicast_list = &eexp_set_multicast;
- dev->tx_timeout = eexp_timeout;
- dev->watchdog_timeo = 2*HZ;
-- ether_setup(dev);
- return 0;
- }
-
-@@ -1654,7 +1685,7 @@ eexp_set_multicast(struct net_device *de
-
- #define EEXP_MAX_CARDS 4 /* max number of cards to support */
-
--static struct net_device dev_eexp[EEXP_MAX_CARDS];
-+static struct net_device *dev_eexp[EEXP_MAX_CARDS];
- static int irq[EEXP_MAX_CARDS];
- static int io[EEXP_MAX_CARDS];
-
-@@ -1671,25 +1702,30 @@ MODULE_LICENSE("GPL");
- */
- int init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
-- struct net_device *dev = &dev_eexp[this_dev];
-+ dev = alloc_etherdev(sizeof(struct net_local));
- dev->irq = irq[this_dev];
- dev->base_addr = io[this_dev];
-- dev->init = express_probe;
- if (io[this_dev] == 0) {
-- if (this_dev) break;
-+ if (this_dev)
-+ break;
- printk(KERN_NOTICE "eexpress.c: Module autoprobe not recommended, give io=xx.\n");
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "eexpress.c: Failed to register card at 0x%x.\n", io[this_dev]);
-- if (found != 0) return 0;
-- return -ENXIO;
-+ if (do_express_probe(dev) == 0 && register_netdev(dev) == 0) {
-+ dev_eexp[this_dev] = dev;
-+ found++;
-+ continue;
- }
-- found++;
-+ printk(KERN_WARNING "eexpress.c: Failed to register card at 0x%x.\n", io[this_dev]);
-+ free_netdev(dev);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void cleanup_module(void)
-@@ -1697,11 +1733,10 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
-- struct net_device *dev = &dev_eexp[this_dev];
-- if (dev->priv != NULL) {
-+ struct net_device *dev = dev_eexp[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(dev->priv);
-- dev->priv = NULL;
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/eql.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/eql.c 2003-12-28 23:21:01.000000000 -0800
-@@ -600,7 +600,7 @@ static int __init eql_init_module(void)
-
- err = register_netdev(dev_eql);
- if (err)
-- kfree(dev_eql);
-+ free_netdev(dev_eql);
- return err;
- }
-
---- linux-2.6.0/drivers/net/es3210.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/es3210.c 2003-12-28 23:21:01.000000000 -0800
-@@ -62,7 +62,6 @@ static const char version[] =
-
- #include "8390.h"
-
--int es_probe(struct net_device *dev);
- static int es_probe1(struct net_device *dev, int ioaddr);
-
- static int es_open(struct net_device *dev);
-@@ -125,9 +124,11 @@ static unsigned char hi_irq_map[] __init
- * PROM for a match against the Racal-Interlan assigned value.
- */
-
--int __init es_probe(struct net_device *dev)
-+static int __init do_es_probe(struct net_device *dev)
- {
- unsigned short ioaddr = dev->base_addr;
-+ int irq = dev->irq;
-+ int mem_start = dev->mem_start;
-
- SET_MODULE_OWNER(dev);
-
-@@ -144,13 +145,47 @@ int __init es_probe(struct net_device *d
- }
-
- /* EISA spec allows for up to 16 slots, but 8 is typical. */
-- for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000)
-+ for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
- if (es_probe1(dev, ioaddr) == 0)
- return 0;
-+ dev->irq = irq;
-+ dev->mem_start = mem_start;
-+ }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, ES_IO_EXTENT);
-+}
-+
-+struct net_device * __init es_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_es_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init es_probe1(struct net_device *dev, int ioaddr)
- {
- int i, retval;
-@@ -240,13 +275,6 @@ static int __init es_probe1(struct net_d
-
- printk("mem %#lx-%#lx\n", dev->mem_start, dev->mem_end-1);
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (" unable to allocate memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out1;
-- }
--
- #if ES_DEBUG & ES_D_PROBE
- if (inb(ioaddr + ES_CFG5))
- printk("es3210: Warning - DMA channel enabled, but not used here.\n");
-@@ -376,7 +404,7 @@ static int es_close(struct net_device *d
- #ifdef MODULE
- #define MAX_ES_CARDS 4 /* Max number of ES3210 cards per module */
- #define NAMELEN 8 /* # of chars for storing dev->name */
--static struct net_device dev_es3210[MAX_ES_CARDS];
-+static struct net_device *dev_es3210[MAX_ES_CARDS];
- static int io[MAX_ES_CARDS];
- static int irq[MAX_ES_CARDS];
- static int mem[MAX_ES_CARDS];
-@@ -393,26 +421,32 @@ MODULE_LICENSE("GPL");
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) {
-- struct net_device *dev = &dev_es3210[this_dev];
-+ if (io[this_dev] == 0 && this_dev != 0)
-+ break;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
- dev->irq = irq[this_dev];
- dev->base_addr = io[this_dev];
-- dev->mem_start = mem[this_dev]; /* Currently ignored by driver */
-- dev->init = es_probe;
-- /* Default is to only install one card. */
-- if (io[this_dev] == 0 && this_dev != 0) break;
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "es3210.c: No es3210 card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ dev->mem_start = mem[this_dev];
-+ if (do_es_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_es3210[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "es3210.c: No es3210 card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -421,13 +455,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) {
-- struct net_device *dev = &dev_es3210[this_dev];
-- if (dev->priv != NULL) {
-- void *priv = dev->priv;
-- free_irq(dev->irq, dev);
-- release_region(dev->base_addr, ES_IO_EXTENT);
-+ struct net_device *dev = dev_es3210[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/eth16i.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/eth16i.c 2003-12-28 23:21:01.000000000 -0800
-@@ -369,7 +369,6 @@ static unsigned int eth32i_irqmap[] __in
- #define NUM_OF_EISA_IRQS 8
-
- static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 };
--static unsigned int boot = 1;
-
- /* Use 0 for production, 1 for verification, >2 for debug */
- #ifndef ETH16I_DEBUG
-@@ -395,8 +394,6 @@ struct eth16i_local {
-
- /* Function prototypes */
-
--extern int eth16i_probe(struct net_device *dev);
--
- static int eth16i_probe1(struct net_device *dev, int ioaddr);
- static int eth16i_check_signature(int ioaddr);
- static int eth16i_probe_port(int ioaddr);
-@@ -418,7 +415,7 @@ static void eth16i_timeout(struct net
- static void eth16i_skip_packet(struct net_device *dev);
- static void eth16i_multicast(struct net_device *dev);
- static void eth16i_select_regbank(unsigned char regbank, int ioaddr);
--static void eth16i_initialize(struct net_device *dev);
-+static void eth16i_initialize(struct net_device *dev, int boot);
-
- #if 0
- static int eth16i_set_irq(struct net_device *dev);
-@@ -432,7 +429,7 @@ static struct net_device_stats *eth16i_g
-
- static char cardname[] __initdata = "ICL EtherTeam 16i/32";
-
--int __init eth16i_probe(struct net_device *dev)
-+static int __init do_eth16i_probe(struct net_device *dev)
- {
- int i;
- int ioaddr;
-@@ -461,14 +458,38 @@ int __init eth16i_probe(struct net_devic
- return -ENODEV;
- }
-
-+struct net_device * __init eth16i_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct eth16i_local));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_eth16i_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, ETH16I_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init eth16i_probe1(struct net_device *dev, int ioaddr)
- {
-- struct eth16i_local *lp;
-+ struct eth16i_local *lp = dev->priv;
- static unsigned version_printed;
- int retval;
-
-- boot = 1; /* To inform initilization that we are in boot probe */
--
- /* Let's grab the region */
- if (!request_region(ioaddr, ETH16I_IO_EXTENT, dev->name))
- return -EBUSY;
-@@ -531,22 +552,13 @@ static int __init eth16i_probe1(struct n
- eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
- outb(0x38, ioaddr + TRANSCEIVER_MODE_REG);
-
-- eth16i_initialize(dev); /* Initialize rest of the chip's registers */
-+ eth16i_initialize(dev, 1); /* Initialize rest of the chip's registers */
-
- /* Now let's same some energy by shutting down the chip ;) */
- BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
-
- /* Initialize the device structure */
-- if(dev->priv == NULL) {
-- dev->priv = kmalloc(sizeof(struct eth16i_local), GFP_KERNEL);
-- if(dev->priv == NULL) {
-- free_irq(dev->irq, dev);
-- retval = -ENOMEM;
-- goto out;
-- }
-- }
--
-- memset(dev->priv, 0, sizeof(struct eth16i_local));
-+ memset(lp, 0, sizeof(struct eth16i_local));
- dev->open = eth16i_open;
- dev->stop = eth16i_close;
- dev->hard_start_xmit = eth16i_tx;
-@@ -554,15 +566,7 @@ static int __init eth16i_probe1(struct n
- dev->set_multicast_list = eth16i_multicast;
- dev->tx_timeout = eth16i_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
--
-- lp = (struct eth16i_local *)dev->priv;
- spin_lock_init(&lp->lock);
--
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--
-- boot = 0;
--
- return 0;
- out:
- release_region(ioaddr, ETH16I_IO_EXTENT);
-@@ -570,7 +574,7 @@ out:
- }
-
-
--static void eth16i_initialize(struct net_device *dev)
-+static void eth16i_initialize(struct net_device *dev, int boot)
- {
- int ioaddr = dev->base_addr;
- int i, node_w = 0;
-@@ -953,7 +957,7 @@ static int eth16i_open(struct net_device
- outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
-
- /* Initialize the chip */
-- eth16i_initialize(dev);
-+ eth16i_initialize(dev, 0);
-
- /* Set the transmit buffer size */
- lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03];
-@@ -1401,7 +1405,7 @@ static ushort eth16i_parse_mediatype(con
-
- #define MAX_ETH16I_CARDS 4 /* Max number of Eth16i cards per module */
-
--static struct net_device dev_eth16i[MAX_ETH16I_CARDS];
-+static struct net_device *dev_eth16i[MAX_ETH16I_CARDS];
- static int io[MAX_ETH16I_CARDS];
- #if 0
- static int irq[MAX_ETH16I_CARDS];
-@@ -1431,14 +1435,14 @@ MODULE_PARM_DESC(debug, "eth16i debug le
- int init_module(void)
- {
- int this_dev, found = 0;
-+ struct net_device *dev;
-+
-+ for (this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) {
-+ dev = alloc_etherdev(sizeof(struct eth16i_local));
-+ if (!dev)
-+ break;
-
-- for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++)
-- {
-- struct net_device *dev = &dev_eth16i[this_dev];
--
-- dev->irq = 0; /* irq[this_dev]; */
- dev->base_addr = io[this_dev];
-- dev->init = eth16i_probe;
-
- if(debug != -1)
- eth16i_debug = debug;
-@@ -1448,44 +1452,43 @@ int init_module(void)
-
- dev->if_port = eth16i_parse_mediatype(mediatype[this_dev]);
-
-- if(io[this_dev] == 0)
-- {
-- if(this_dev != 0) break; /* Only autoprobe 1st one */
-+ if(io[this_dev] == 0) {
-+ if(this_dev != 0) /* Only autoprobe 1st one */
-+ break;
-
- printk(KERN_NOTICE "eth16i.c: Presently autoprobing (not recommended) for a single card.\n");
- }
-
-- if(register_netdev(dev) != 0)
-- {
-- printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n",
-- io[this_dev]);
--
-- if(found != 0) return 0;
-- return -ENXIO;
-+ if (do_eth16i_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_eth16i[found++] = dev;
-+ continue;
-+ }
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, ETH16I_IO_EXTENT);
- }
--
-- found++;
-+ printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n",
-+ io[this_dev]);
-+ free_netdev(dev);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void cleanup_module(void)
- {
- int this_dev;
-
-- for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++)
-- {
-- struct net_device* dev = &dev_eth16i[this_dev];
-+ for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++) {
-+ struct net_device *dev = dev_eth16i[this_dev];
-
-- if(dev->priv != NULL)
-- {
-+ if(dev->priv) {
- unregister_netdev(dev);
-- kfree(dev->priv);
-- dev->priv = NULL;
--
- free_irq(dev->irq, dev);
- release_region(dev->base_addr, ETH16I_IO_EXTENT);
--
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/ethertap.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/ethertap.c 2003-12-28 23:21:01.000000000 -0800
-@@ -72,8 +72,7 @@ static int __init ethertap_probe(int un
- struct net_device *dev;
- int err = -ENOMEM;
-
-- dev = alloc_netdev(sizeof(struct net_local), "tap%d",
-- ether_setup);
-+ dev = alloc_etherdev(sizeof(struct net_local));
-
- if (!dev)
- goto out;
---- linux-2.6.0/drivers/net/ewrk3.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ewrk3.c 2003-12-28 23:21:01.000000000 -0800
-@@ -324,25 +324,14 @@ static int Read_EEPROM(u_long iobase, u_
- static int Write_EEPROM(short data, u_long iobase, u_char eaddr);
- static u_char get_hw_addr(struct net_device *dev, u_char * eeprom_image, char chipType);
-
--static void isa_probe(struct net_device *dev, u_long iobase);
--static void eisa_probe(struct net_device *dev, u_long iobase);
--static struct net_device *alloc_device(struct net_device *dev, u_long iobase);
--static int ewrk3_dev_index(char *s);
--static struct net_device *insert_device(struct net_device *dev, u_long iobase, int (*init) (struct net_device *));
-+static int ewrk3_probe1(struct net_device *dev, u_long iobase, int irq);
-+static int isa_probe(struct net_device *dev, u_long iobase);
-+static int eisa_probe(struct net_device *dev, u_long iobase);
-
--
--#ifdef MODULE
--static int autoprobed = 1, loading_module = 1;
--
--#else
--static u_char irq[] =
--{5, 0, 10, 3, 11, 9, 15, 12};
--static int autoprobed, loading_module;
--
--#endif /* MODULE */
-+static u_char irq[MAX_NUM_EWRK3S+1] = {5, 0, 10, 3, 11, 9, 15, 12};
-
- static char name[EWRK3_STRLEN + 1];
--static int num_ewrk3s, num_eth;
-+static int num_ewrks3s;
-
- /*
- ** Miscellaneous defines...
-@@ -352,38 +341,50 @@ static int num_ewrk3s, num_eth;
- mdelay(1);\
- }
-
--int __init ewrk3_probe(struct net_device *dev)
-+struct net_device * __init ewrk3_probe(int unit)
- {
-- int tmp = num_ewrk3s, status = -ENODEV;
-- u_long iobase = dev->base_addr;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct ewrk3_private));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
- SET_MODULE_OWNER(dev);
-
-- if ((iobase == 0) && loading_module) {
-- printk("Autoprobing is not supported when loading a module based driver.\n");
-- status = -EIO;
-- } else { /* First probe for the Ethernet */
-- /* Address PROM pattern */
-- isa_probe(dev, iobase);
-- eisa_probe(dev, iobase);
--
-- if ((tmp == num_ewrk3s) && (iobase != 0) && loading_module) {
-- printk("%s: ewrk3_probe() cannot find device at 0x%04lx.\n", dev->name,
-- iobase);
-- }
-- /*
-- ** Walk the device list to check that at least one device
-- ** initialised OK
-- */
-- for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next);
-+ err = ewrk3_probe1(dev, dev->base_addr, dev->irq);
-+ if (err)
-+ goto out;
-+ return dev;
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+
-+}
-
-- if (dev->priv)
-- status = 0;
-- if (iobase == 0)
-- autoprobed = 1;
-- }
-+static int __init ewrk3_probe1(struct net_device *dev, u_long iobase, int irq)
-+{
-+ int err;
-
-- return status;
-+ dev->base_addr = iobase;
-+ dev->irq = irq;
-+
-+ /* Address PROM pattern */
-+ err = isa_probe(dev, iobase);
-+ if (err != 0)
-+ err = eisa_probe(dev, iobase);
-+
-+ if (err)
-+ return err;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ release_region(dev->base_addr, EWRK3_TOTAL_SIZE);
-+
-+ return err;
- }
-
- static int __init
-@@ -396,8 +397,8 @@ ewrk3_hw_init(struct net_device *dev, u_
- u_char eeprom_image[EEPROM_MAX], chksum, eisa_cr = 0;
-
- /*
-- ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot.
-- ** This also disables the EISA_ENABLE bit in the EISA Control Register.
-+ ** Stop the EWRK3. Enable the DBR ROM. Disable interrupts and remote boot.
-+ ** This also disables the EISA_ENABLE bit in the EISA Control Register.
- */
- if (iobase > 0x400)
- eisa_cr = inb(EISA_CR);
-@@ -409,232 +410,210 @@ ewrk3_hw_init(struct net_device *dev, u_
- icr &= 0x70;
- outb(icr, EWRK3_ICR); /* Disable all the IRQs */
-
-- if (nicsr == (CSR_TXD | CSR_RXD)) {
-+ if (nicsr == (CSR_TXD | CSR_RXD))
-+ return -ENXIO;
-
-- /* Check that the EEPROM is alive and well and not living on Pluto... */
-- for (chksum = 0, i = 0; i < EEPROM_MAX; i += 2) {
-- union {
-- short val;
-- char c[2];
-- } tmp;
--
-- tmp.val = (short) Read_EEPROM(iobase, (i >> 1));
-- eeprom_image[i] = tmp.c[0];
-- eeprom_image[i + 1] = tmp.c[1];
-- chksum += eeprom_image[i] + eeprom_image[i + 1];
-- }
--
-- if (chksum != 0) { /* Bad EEPROM Data! */
-- printk("%s: Device has a bad on-board EEPROM.\n", dev->name);
-- status = -ENXIO;
-- } else {
-- EthwrkSignature(name, eeprom_image);
-- if (*name != '\0') { /* found a EWRK3 device */
-- dev->base_addr = iobase;
--
-- if (iobase > 0x400) {
-- outb(eisa_cr, EISA_CR); /* Rewrite the EISA CR */
-- }
-- lemac = eeprom_image[EEPROM_CHIPVER];
-- cmr = inb(EWRK3_CMR);
--
-- if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) ||
-- ((lemac == LeMAC2) && !(cmr & CMR_HS))) {
-- printk("%s: %s at %#4lx", dev->name, name, iobase);
-- hard_strapped = 1;
-- } else if ((iobase & 0x0fff) == EWRK3_EISA_IO_PORTS) {
-- /* EISA slot address */
-- printk("%s: %s at %#4lx (EISA slot %ld)",
-- dev->name, name, iobase, ((iobase >> 12) & 0x0f));
-- } else { /* ISA port address */
-- printk("%s: %s at %#4lx", dev->name, name, iobase);
-- }
--
-- if (!status) {
-- printk(", h/w address ");
-- if (lemac != LeMAC2)
-- DevicePresent(iobase); /* need after EWRK3_INIT */
-- status = get_hw_addr(dev, eeprom_image, lemac);
-- for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet addr. */
-- printk("%2.2x:", dev->dev_addr[i]);
-- }
-- printk("%2.2x,\n", dev->dev_addr[i]);
-
-- if (status) {
-- printk(" which has an EEPROM CRC error.\n");
-- status = -ENXIO;
-- } else {
-- if (lemac == LeMAC2) { /* Special LeMAC2 CMR things */
-- cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS);
-- if (eeprom_image[EEPROM_MISC0] & READ_AHEAD)
-- cmr |= CMR_RA;
-- if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND)
-- cmr |= CMR_WB;
-- if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL)
-- cmr |= CMR_POLARITY;
-- if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK)
-- cmr |= CMR_LINK;
-- if (eeprom_image[EEPROM_MISC0] & _0WS_ENA)
-- cmr |= CMR_0WS;
-- }
-- if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM)
-- cmr |= CMR_DRAM;
-- outb(cmr, EWRK3_CMR);
--
-- cr = inb(EWRK3_CR); /* Set up the Control Register */
-- cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD;
-- if (cr & SETUP_APD)
-- cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS;
-- cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS;
-- cr |= eeprom_image[EEPROM_MISC0] & ENA_16;
-- outb(cr, EWRK3_CR);
-+ /* Check that the EEPROM is alive and well and not living on Pluto... */
-+ for (chksum = 0, i = 0; i < EEPROM_MAX; i += 2) {
-+ union {
-+ short val;
-+ char c[2];
-+ } tmp;
-+
-+ tmp.val = (short) Read_EEPROM(iobase, (i >> 1));
-+ eeprom_image[i] = tmp.c[0];
-+ eeprom_image[i + 1] = tmp.c[1];
-+ chksum += eeprom_image[i] + eeprom_image[i + 1];
-+ }
-+
-+ if (chksum != 0) { /* Bad EEPROM Data! */
-+ printk("%s: Device has a bad on-board EEPROM.\n", dev->name);
-+ return -ENXIO;
-+ }
-+
-+ EthwrkSignature(name, eeprom_image);
-+ if (*name == '\0')
-+ return -ENXIO;
-+
-+ dev->base_addr = iobase;
-+
-+ if (iobase > 0x400) {
-+ outb(eisa_cr, EISA_CR); /* Rewrite the EISA CR */
-+ }
-+ lemac = eeprom_image[EEPROM_CHIPVER];
-+ cmr = inb(EWRK3_CMR);
-+
-+ if (((lemac == LeMAC) && ((cmr & CMR_NO_EEPROM) != CMR_NO_EEPROM)) ||
-+ ((lemac == LeMAC2) && !(cmr & CMR_HS))) {
-+ printk("%s: %s at %#4lx", dev->name, name, iobase);
-+ hard_strapped = 1;
-+ } else if ((iobase & 0x0fff) == EWRK3_EISA_IO_PORTS) {
-+ /* EISA slot address */
-+ printk("%s: %s at %#4lx (EISA slot %ld)",
-+ dev->name, name, iobase, ((iobase >> 12) & 0x0f));
-+ } else { /* ISA port address */
-+ printk("%s: %s at %#4lx", dev->name, name, iobase);
-+ }
-+
-+ printk(", h/w address ");
-+ if (lemac != LeMAC2)
-+ DevicePresent(iobase); /* need after EWRK3_INIT */
-+ status = get_hw_addr(dev, eeprom_image, lemac);
-+ for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet addr. */
-+ printk("%2.2x:", dev->dev_addr[i]);
-+ }
-+ printk("%2.2x,\n", dev->dev_addr[i]);
-+
-+ if (status) {
-+ printk(" which has an EEPROM CRC error.\n");
-+ return -ENXIO;
-+ }
-+
-+ if (lemac == LeMAC2) { /* Special LeMAC2 CMR things */
-+ cmr &= ~(CMR_RA | CMR_WB | CMR_LINK | CMR_POLARITY | CMR_0WS);
-+ if (eeprom_image[EEPROM_MISC0] & READ_AHEAD)
-+ cmr |= CMR_RA;
-+ if (eeprom_image[EEPROM_MISC0] & WRITE_BEHIND)
-+ cmr |= CMR_WB;
-+ if (eeprom_image[EEPROM_NETMAN0] & NETMAN_POL)
-+ cmr |= CMR_POLARITY;
-+ if (eeprom_image[EEPROM_NETMAN0] & NETMAN_LINK)
-+ cmr |= CMR_LINK;
-+ if (eeprom_image[EEPROM_MISC0] & _0WS_ENA)
-+ cmr |= CMR_0WS;
-+ }
-+ if (eeprom_image[EEPROM_SETUP] & SETUP_DRAM)
-+ cmr |= CMR_DRAM;
-+ outb(cmr, EWRK3_CMR);
-+
-+ cr = inb(EWRK3_CR); /* Set up the Control Register */
-+ cr |= eeprom_image[EEPROM_SETUP] & SETUP_APD;
-+ if (cr & SETUP_APD)
-+ cr |= eeprom_image[EEPROM_SETUP] & SETUP_PS;
-+ cr |= eeprom_image[EEPROM_MISC0] & FAST_BUS;
-+ cr |= eeprom_image[EEPROM_MISC0] & ENA_16;
-+ outb(cr, EWRK3_CR);
-
-- /*
-- ** Determine the base address and window length for the EWRK3
-- ** RAM from the memory base register.
-- */
-- mem_start = inb(EWRK3_MBR);
-- shmem_length = 0;
-- if (mem_start != 0) {
-- if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) {
-- mem_start *= SHMEM_64K;
-- shmem_length = SHMEM_64K;
-- } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) {
-- mem_start *= SHMEM_32K;
-- shmem_length = SHMEM_32K;
-- } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) {
-- mem_start = mem_start * SHMEM_2K + 0x80000;
-- shmem_length = SHMEM_2K;
-- } else {
-- status = -ENXIO;
-- }
-- }
-- /*
-- ** See the top of this source code for comments about
-- ** uncommenting this line.
-- */
-+ /*
-+ ** Determine the base address and window length for the EWRK3
-+ ** RAM from the memory base register.
-+ */
-+ mem_start = inb(EWRK3_MBR);
-+ shmem_length = 0;
-+ if (mem_start != 0) {
-+ if ((mem_start >= 0x0a) && (mem_start <= 0x0f)) {
-+ mem_start *= SHMEM_64K;
-+ shmem_length = SHMEM_64K;
-+ } else if ((mem_start >= 0x14) && (mem_start <= 0x1f)) {
-+ mem_start *= SHMEM_32K;
-+ shmem_length = SHMEM_32K;
-+ } else if ((mem_start >= 0x40) && (mem_start <= 0xff)) {
-+ mem_start = mem_start * SHMEM_2K + 0x80000;
-+ shmem_length = SHMEM_2K;
-+ } else {
-+ return -ENXIO;
-+ }
-+ }
-+ /*
-+ ** See the top of this source code for comments about
-+ ** uncommenting this line.
-+ */
- /* FORCE_2K_MODE; */
-+
-+ if (hard_strapped) {
-+ printk(" is hard strapped.\n");
-+ } else if (mem_start) {
-+ printk(" has a %dk RAM window", (int) (shmem_length >> 10));
-+ printk(" at 0x%.5lx", mem_start);
-+ } else {
-+ printk(" is in I/O only mode");
-+ }
-
-- if (!status) {
-- if (hard_strapped) {
-- printk(" is hard strapped.\n");
-- } else if (mem_start) {
-- printk(" has a %dk RAM window", (int) (shmem_length >> 10));
-- printk(" at 0x%.5lx", mem_start);
-- } else {
-- printk(" is in I/O only mode");
-- }
--
-- /* private area & initialise */
-- dev->priv = (void *) kmalloc(sizeof(struct ewrk3_private),
-- GFP_KERNEL);
-- if (dev->priv == NULL) {
-- return -ENOMEM;
-- }
-- lp = (struct ewrk3_private *) dev->priv;
-- memset(dev->priv, 0, sizeof(struct ewrk3_private));
-- lp->shmem_base = mem_start;
-- lp->shmem_length = shmem_length;
-- lp->lemac = lemac;
-- lp->hard_strapped = hard_strapped;
-- lp->led_mask = CR_LED;
-- spin_lock_init(&lp->hw_lock);
--
-- lp->mPage = 64;
-- if (cmr & CMR_DRAM)
-- lp->mPage <<= 1; /* 2 DRAMS on module */
--
-- sprintf(lp->adapter_name, "%s (%s)", name, dev->name);
-- request_region(iobase, EWRK3_TOTAL_SIZE, lp->adapter_name);
--
-- lp->irq_mask = ICR_TNEM | ICR_TXDM | ICR_RNEM | ICR_RXDM;
--
-- if (!hard_strapped) {
-- /*
-- ** Enable EWRK3 board interrupts for autoprobing
-- */
-- icr |= ICR_IE; /* Enable interrupts */
-- outb(icr, EWRK3_ICR);
--
-- /* The DMA channel may be passed in on this parameter. */
-- dev->dma = 0;
--
-- /* To auto-IRQ we enable the initialization-done and DMA err,
-- interrupts. For now we will always get a DMA error. */
-- if (dev->irq < 2) {
-+ lp = (struct ewrk3_private *) dev->priv;
-+ lp->shmem_base = mem_start;
-+ lp->shmem_length = shmem_length;
-+ lp->lemac = lemac;
-+ lp->hard_strapped = hard_strapped;
-+ lp->led_mask = CR_LED;
-+ spin_lock_init(&lp->hw_lock);
-+
-+ lp->mPage = 64;
-+ if (cmr & CMR_DRAM)
-+ lp->mPage <<= 1; /* 2 DRAMS on module */
-+
-+ sprintf(lp->adapter_name, "%s (%s)", name, dev->name);
-+
-+ lp->irq_mask = ICR_TNEM | ICR_TXDM | ICR_RNEM | ICR_RXDM;
-+
-+ if (!hard_strapped) {
-+ /*
-+ ** Enable EWRK3 board interrupts for autoprobing
-+ */
-+ icr |= ICR_IE; /* Enable interrupts */
-+ outb(icr, EWRK3_ICR);
-+
-+ /* The DMA channel may be passed in on this parameter. */
-+ dev->dma = 0;
-+
-+ /* To auto-IRQ we enable the initialization-done and DMA err,
-+ interrupts. For now we will always get a DMA error. */
-+ if (dev->irq < 2) {
- #ifndef MODULE
-- u_char irqnum;
-- unsigned long irq_mask;
-+ u_char irqnum;
-+ unsigned long irq_mask;
-
-
-- irq_mask = probe_irq_on();
--
-- /*
-- ** Trigger a TNE interrupt.
-- */
-- icr |= ICR_TNEM;
-- outb(1, EWRK3_TDQ); /* Write to the TX done queue */
-- outb(icr, EWRK3_ICR); /* Unmask the TXD interrupt */
--
-- irqnum = irq[((icr & IRQ_SEL) >> 4)];
--
-- mdelay(20);
-- dev->irq = probe_irq_off(irq_mask);
-- if ((dev->irq) && (irqnum == dev->irq)) {
-- printk(" and uses IRQ%d.\n", dev->irq);
-- } else {
-- if (!dev->irq) {
-- printk(" and failed to detect IRQ line.\n");
-- } else if ((irqnum == 1) && (lemac == LeMAC2)) {
-- printk(" and an illegal IRQ line detected.\n");
-- } else {
-- printk(", but incorrect IRQ line detected.\n");
-- }
-- status = -ENXIO;
-- }
--
-- DISABLE_IRQs; /* Mask all interrupts */
--
--#endif /* MODULE */
-- } else {
-- printk(" and requires IRQ%d.\n", dev->irq);
-- }
-- }
-- if (status)
-- release_region(iobase, EWRK3_TOTAL_SIZE);
-- } else {
-- status = -ENXIO;
-- }
-- }
-- }
-+ irq_mask = probe_irq_on();
-+
-+ /*
-+ ** Trigger a TNE interrupt.
-+ */
-+ icr |= ICR_TNEM;
-+ outb(1, EWRK3_TDQ); /* Write to the TX done queue */
-+ outb(icr, EWRK3_ICR); /* Unmask the TXD interrupt */
-+
-+ irqnum = irq[((icr & IRQ_SEL) >> 4)];
-+
-+ mdelay(20);
-+ dev->irq = probe_irq_off(irq_mask);
-+ if ((dev->irq) && (irqnum == dev->irq)) {
-+ printk(" and uses IRQ%d.\n", dev->irq);
- } else {
-- status = -ENXIO;
-- }
-- }
--
-- if (!status) {
-- if (ewrk3_debug > 1) {
-- printk(version);
-+ if (!dev->irq) {
-+ printk(" and failed to detect IRQ line.\n");
-+ } else if ((irqnum == 1) && (lemac == LeMAC2)) {
-+ printk(" and an illegal IRQ line detected.\n");
-+ } else {
-+ printk(", but incorrect IRQ line detected.\n");
-+ }
-+ return -ENXIO;
- }
-- /* The EWRK3-specific entries in the device structure. */
-- dev->open = ewrk3_open;
-- dev->hard_start_xmit = ewrk3_queue_pkt;
-- dev->stop = ewrk3_close;
-- dev->get_stats = ewrk3_get_stats;
-- dev->set_multicast_list = set_multicast_list;
-- dev->do_ioctl = ewrk3_ioctl;
-- dev->tx_timeout = ewrk3_timeout;
-- dev->watchdog_timeo = QUEUE_PKT_TIMEOUT;
-
-- dev->mem_start = 0;
-+ DISABLE_IRQs; /* Mask all interrupts */
-
-- /* Fill in the generic field of the device structure. */
-- ether_setup(dev);
-+#endif /* MODULE */
-+ } else {
-+ printk(" and requires IRQ%d.\n", dev->irq);
- }
-- } else {
-- status = -ENXIO;
- }
-- return status;
-+
-+ if (ewrk3_debug > 1) {
-+ printk(version);
-+ }
-+ /* The EWRK3-specific entries in the device structure. */
-+ dev->open = ewrk3_open;
-+ dev->hard_start_xmit = ewrk3_queue_pkt;
-+ dev->stop = ewrk3_close;
-+ dev->get_stats = ewrk3_get_stats;
-+ dev->set_multicast_list = set_multicast_list;
-+ dev->do_ioctl = ewrk3_ioctl;
-+ dev->tx_timeout = ewrk3_timeout;
-+ dev->watchdog_timeo = QUEUE_PKT_TIMEOUT;
-+
-+ dev->mem_start = 0;
-+
-+ return 0;
- }
- \f
-
-@@ -1269,15 +1248,15 @@ static void SetMulticastFilter(struct ne
- /*
- ** ISA bus I/O device probe
- */
--static void __init isa_probe(struct net_device *dev, u_long ioaddr)
-+static int __init isa_probe(struct net_device *dev, u_long ioaddr)
- {
-- int i = num_ewrk3s, maxSlots;
-+ int i = num_ewrks3s, maxSlots;
-+ int ret = -ENODEV;
-+
- u_long iobase;
-
-- if (!ioaddr && autoprobed)
-- return; /* Been here before ! */
- if (ioaddr >= 0x400)
-- return; /* Not ISA */
-+ goto out;
-
- if (ioaddr == 0) { /* Autoprobing */
- iobase = EWRK3_IO_BASE; /* Get the first slot address */
-@@ -1287,38 +1266,37 @@ static void __init isa_probe(struct net_
- maxSlots = i + 1;
- }
-
-- for (; (i < maxSlots) && (dev != NULL); iobase += EWRK3_IOP_INC, i++) {
-- if (!check_region(iobase, EWRK3_TOTAL_SIZE)) {
-+ for (; (i < maxSlots) && (dev != NULL);
-+ iobase += EWRK3_IOP_INC, i++)
-+ {
-+ if (request_region(iobase, EWRK3_TOTAL_SIZE, dev->name)) {
- if (DevicePresent(iobase) == 0) {
-- if ((dev = alloc_device(dev, iobase)) != NULL) {
-- if (ewrk3_hw_init(dev, iobase) == 0) {
-- num_ewrk3s++;
-- }
-- num_eth++;
-- }
-+ int irq = dev->irq;
-+ ret = ewrk3_hw_init(dev, iobase);
-+ if (!ret)
-+ break;
-+ dev->irq = irq;
- }
-- } else if (autoprobed) {
-- printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase);
-+ release_region(iobase, EWRK3_TOTAL_SIZE);
- }
- }
-+ out:
-
-- return;
-+ return ret;
- }
-
- /*
- ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
- ** the motherboard.
- */
--static void __init eisa_probe(struct net_device *dev, u_long ioaddr)
-+static int __init eisa_probe(struct net_device *dev, u_long ioaddr)
- {
- int i, maxSlots;
- u_long iobase;
-- char name[EWRK3_STRLEN];
-+ int ret = -ENODEV;
-
-- if (!ioaddr && autoprobed)
-- return; /* Been here before ! */
- if (ioaddr < 0x1000)
-- return; /* Not EISA */
-+ goto out;
-
- if (ioaddr == 0) { /* Autoprobing */
- iobase = EISA_SLOT_INC; /* Get the first slot address */
-@@ -1332,114 +1310,22 @@ static void __init eisa_probe(struct net
-
- for (i = 1; (i < maxSlots) && (dev != NULL); i++, iobase += EISA_SLOT_INC) {
- if (EISA_signature(name, EISA_ID) == 0) {
-- if (!check_region(iobase, EWRK3_TOTAL_SIZE)) {
-- if (DevicePresent(iobase) == 0) {
-- if ((dev = alloc_device(dev, iobase)) != NULL) {
-- if (ewrk3_hw_init(dev, iobase) == 0) {
-- num_ewrk3s++;
-- }
-- num_eth++;
-- }
-- }
-- } else if (autoprobed) {
-- printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase);
-+ if (request_region(iobase, EWRK3_TOTAL_SIZE, dev->name) &&
-+ DevicePresent(iobase) == 0) {
-+ int irq = dev->irq;
-+ ret = ewrk3_hw_init(dev, iobase);
-+ if (!ret)
-+ break;
-+ dev->irq = irq;
- }
-+ release_region(iobase, EWRK3_TOTAL_SIZE);
- }
- }
-
-- return;
-+ out:
-+ return ret;
- }
-
--/*
-- ** Search the entire 'eth' device list for a fixed probe. If a match isn't
-- ** found then check for an autoprobe or unused device location. If they
-- ** are not available then insert a new device structure at the end of
-- ** the current list.
-- */
--static struct net_device * __init alloc_device(struct net_device *dev, u_long iobase)
--{
-- struct net_device *adev = NULL;
-- int fixed = 0, new_dev = 0;
--
-- num_eth = ewrk3_dev_index(dev->name);
-- if (loading_module)
-- return dev;
--
-- while (1) {
-- if (((dev->base_addr == EWRK3_NDA) || (dev->base_addr == 0)) && !adev) {
-- adev = dev;
-- } else if ((dev->priv == NULL) && (dev->base_addr == iobase)) {
-- fixed = 1;
-- } else {
-- if (dev->next == NULL) {
-- new_dev = 1;
-- } else if (strncmp(dev->next->name, "eth", 3) != 0) {
-- new_dev = 1;
-- }
-- }
-- if ((dev->next == NULL) || new_dev || fixed)
-- break;
-- dev = dev->next;
-- num_eth++;
-- }
-- if (adev && !fixed) {
-- dev = adev;
-- num_eth = ewrk3_dev_index(dev->name);
-- new_dev = 0;
-- }
-- if (((dev->next == NULL) &&
-- ((dev->base_addr != EWRK3_NDA) && (dev->base_addr != 0)) && !fixed) ||
-- new_dev) {
-- num_eth++; /* New device */
-- dev = insert_device(dev, iobase, ewrk3_probe);
-- }
-- return dev;
--}
--
--/*
-- ** If at end of eth device list and can't use current entry, malloc
-- ** one up. If memory could not be allocated, print an error message.
-- */
--static struct net_device * __init
--insert_device(struct net_device *dev, u_long iobase, int (*init) (struct net_device *))
--{
-- struct net_device *new;
--
-- new = (struct net_device *) kmalloc(sizeof(struct net_device) + 8, GFP_KERNEL);
-- if (new == NULL) {
-- printk("eth%d: Device not initialised, insufficient memory\n", num_eth);
-- return NULL;
-- } else {
-- new->next = dev->next;
-- dev->next = new;
-- dev = dev->next; /* point to the new device */
-- if (num_eth > 9999) {
-- sprintf(dev->name, "eth????"); /* New device name */
-- } else {
-- sprintf(dev->name, "eth%d", num_eth); /* New device name */
-- }
-- dev->base_addr = iobase; /* assign the io address */
-- dev->init = init; /* initialisation routine */
-- }
--
-- return dev;
--}
--
--static int __init
--ewrk3_dev_index(char *s)
--{
-- int i = 0, j = 0;
--
-- for (; *s; s++) {
-- if (isdigit(*s)) {
-- j = 1;
-- i = (i * 10) + (*s - '0');
-- } else if (j)
-- break;
-- }
--
-- return i;
--}
-
- /*
- ** Read the EWRK3 EEPROM using this routine
-@@ -2074,8 +1960,7 @@ static int ewrk3_ioctl(struct net_device
- #ifdef MODULE
- static struct net_device *ewrk3_devs[MAX_NUM_EWRK3S];
- static int ndevs;
--static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, }; /* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */
--static int irq[MAX_NUM_EWRK3S+1] = { 5, 0, }; /* or use the insmod io= irq= options */
-+static int io[MAX_NUM_EWRK3S+1] = { 0x300, 0, };
-
- /* '21' below should really be 'MAX_NUM_EWRK3S' */
- MODULE_PARM(io, "0-21i");
-@@ -2083,50 +1968,39 @@ MODULE_PARM(irq, "0-21i");
- MODULE_PARM_DESC(io, "EtherWORKS 3 I/O base address(es)");
- MODULE_PARM_DESC(irq, "EtherWORKS 3 IRQ number(s)");
-
--static void ewrk3_exit_module(void)
-+static __exit void ewrk3_exit_module(void)
- {
- int i;
-
- for( i=0; i<ndevs; i++ ) {
- unregister_netdev(ewrk3_devs[i]);
-- if (ewrk3_devs[i]->priv) {
-- kfree(ewrk3_devs[i]->priv);
-- ewrk3_devs[i]->priv = NULL;
-- }
-- ewrk3_devs[i]->irq = 0;
--
- release_region(ewrk3_devs[i]->base_addr, EWRK3_TOTAL_SIZE);
- free_netdev(ewrk3_devs[i]);
- ewrk3_devs[i] = NULL;
- }
- }
-
--static int ewrk3_init_module(void)
-+static __init int ewrk3_init_module(void)
- {
- int i=0;
-
- while( io[i] && irq[i] ) {
-- ewrk3_devs[ndevs] = kmalloc(sizeof(struct net_device), GFP_KERNEL);
-- if (!ewrk3_devs[ndevs])
-- goto error;
-- memset(ewrk3_devs[ndevs], 0, sizeof(struct net_device));
-- ewrk3_devs[ndevs]->base_addr = io[i];
-- ewrk3_devs[ndevs]->irq = irq[i];
-- ewrk3_devs[ndevs]->init = ewrk3_probe;
--
-- if (register_netdev(ewrk3_devs[ndevs]) == 0)
-- ndevs++;
-- else
-- kfree(ewrk3_devs[ndevs]);
-+ struct net_device *dev
-+ = alloc_etherdev(sizeof(struct ewrk3_private));
-+
-+ if (!dev)
-+ break;
-
-+ if (ewrk3_probe1(dev, io[i], irq[i]) != 0) {
-+ free_netdev(dev);
-+ break;
-+ }
-+
-+ ewrk3_devs[ndevs++] = dev;
- i++;
- }
-
- return ndevs ? 0 : -EIO;
--
--error:
-- ewrk3_exit_module();
-- return -ENOMEM;
- }
-
-
---- linux-2.6.0/drivers/net/fc/iph5526.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/fc/iph5526.c 2003-12-28 23:21:01.000000000 -0800
-@@ -259,6 +259,7 @@ static int __init iph5526_probe_pci(stru
-
- static int __init fcdev_init(struct net_device *dev)
- {
-+ SET_MODULE_OWNER(dev);
- dev->open = iph5526_open;
- dev->stop = iph5526_close;
- dev->hard_start_xmit = iph5526_send_packet;
-@@ -2896,14 +2897,12 @@ static void update_EDB_indx(struct fc_in
- static int iph5526_open(struct net_device *dev)
- {
- netif_start_queue(dev);
-- MOD_INC_USE_COUNT;
- return 0;
- }
-
- static int iph5526_close(struct net_device *dev)
- {
- netif_stop_queue(dev);
-- MOD_DEC_USE_COUNT;
- return 0;
- }
-
---- linux-2.6.0/drivers/net/fc/iph5526_scsi.h 2003-06-14 12:18:22.000000000 -0700
-+++ 25/drivers/net/fc/iph5526_scsi.h 2003-12-28 23:21:01.000000000 -0800
-@@ -25,7 +25,7 @@ int iph5526_queuecommand(Scsi_Cmnd *Cmnd
- int iph5526_release(struct Scsi_Host *host);
- int iph5526_abort(Scsi_Cmnd *Cmnd);
- const char *iph5526_info(struct Scsi_Host *host);
--int iph5526_biosparam(Disk * disk, struct block_device *n, int ip[]);
-+int iph5526_biosparam(struct Scsi_Disk * disk, struct block_device *n, int ip[]);
-
- #endif
-
---- linux-2.6.0/drivers/net/fmv18x.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/fmv18x.c 2003-12-28 23:21:01.000000000 -0800
-@@ -57,7 +57,7 @@ static const char version[] =
- #include <asm/io.h>
- #include <asm/dma.h>
-
--static int fmv18x_probe_list[] __initdata = {
-+static unsigned fmv18x_probe_list[] __initdata = {
- 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
- };
-
-@@ -109,8 +109,6 @@ struct net_local {
-
- /* Index to functions, as function prototypes. */
-
--extern int fmv18x_probe(struct net_device *dev);
--
- static int fmv18x_probe1(struct net_device *dev, short ioaddr);
- static int net_open(struct net_device *dev);
- static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
-@@ -129,23 +127,50 @@ static void set_multicast_list(struct ne
- (detachable devices only).
- */
-
--int __init fmv18x_probe(struct net_device *dev)
-+static int io = 0x220;
-+static int irq;
-+
-+struct net_device * __init fmv18x_probe(int unit)
- {
-- int i;
-- int base_addr = dev->base_addr;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-+ unsigned *port;
-+ int err = 0;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ }
-
- SET_MODULE_OWNER(dev);
-
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return fmv18x_probe1(dev, base_addr);
-- else if (base_addr != 0) /* Don't probe at all. */
-- return -ENXIO;
--
-- for (i = 0; fmv18x_probe_list[i]; i++)
-- if (fmv18x_probe1(dev, fmv18x_probe_list[i]) == 0)
-- return 0;
--
-- return -ENODEV;
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = fmv18x_probe1(dev, io);
-+ } else if (io != 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (port = fmv18x_probe_list; *port; port++)
-+ if (fmv18x_probe1(dev, *port) == 0)
-+ break;
-+ if (!*port)
-+ err = -ENODEV;
-+ }
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, FMV18X_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /* The Fujitsu datasheet suggests that the NIC be probed for by checking its
-@@ -160,7 +185,7 @@ static int __init fmv18x_probe1(struct n
- {
- char irqmap[4] = {3, 7, 10, 15};
- char irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
-- unsigned int i, irq, retval;
-+ unsigned int i, retval;
- struct net_local *lp;
-
- /* Resetting the chip doesn't reset the ISA interface, so don't bother.
-@@ -170,6 +195,9 @@ static int __init fmv18x_probe1(struct n
- if (!request_region(ioaddr, FMV18X_IO_EXTENT, dev->name))
- return -EBUSY;
-
-+ dev->irq = irq;
-+ dev->base_addr = ioaddr;
-+
- /* Check I/O address configuration and Fujitsu vendor code */
- if (inb(ioaddr+FJ_MACADDR ) != 0x00
- || inb(ioaddr+FJ_MACADDR+1) != 0x00
-@@ -181,9 +209,8 @@ static int __init fmv18x_probe1(struct n
- /* Check PnP mode for FMV-183/184/183A/184A. */
- /* This PnP routine is very poor. IO and IRQ should be known. */
- if (inb(ioaddr + FJ_STATUS1) & 0x20) {
-- irq = dev->irq;
- for (i = 0; i < 8; i++) {
-- if (irq == irqmap_pnp[i])
-+ if (dev->irq == irqmap_pnp[i])
- break;
- }
- if (i == 8) {
-@@ -193,22 +220,19 @@ static int __init fmv18x_probe1(struct n
- } else {
- if (fmv18x_probe_list[inb(ioaddr + FJ_CONFIG0) & 0x07] != ioaddr)
- return -ENODEV;
-- irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03];
-+ dev->irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03];
- }
-
- /* Snarf the interrupt vector now. */
-- retval = request_irq(irq, &net_interrupt, 0, dev->name, dev);
-+ retval = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);
- if (retval) {
- printk ("FMV-18x found at %#3x, but it's unusable due to a conflict on"
-- "IRQ %d.\n", ioaddr, irq);
-+ "IRQ %d.\n", ioaddr, dev->irq);
- goto out;
- }
-
- printk("%s: FMV-18x found at %#3x, IRQ %d, address ", dev->name,
-- ioaddr, irq);
--
-- dev->base_addr = ioaddr;
-- dev->irq = irq;
-+ ioaddr, dev->irq);
-
- for(i = 0; i < 6; i++) {
- unsigned char val = inb(ioaddr + FJ_MACADDR + i);
-@@ -279,14 +303,10 @@ static int __init fmv18x_probe1(struct n
- dev->watchdog_timeo = HZ/10;
- dev->get_stats = net_get_stats;
- dev->set_multicast_list = set_multicast_list;
--
-- /* Fill in the fields of 'dev' with ethernet-generic values. */
--
-- ether_setup(dev);
- return 0;
-
- out_irq:
-- free_irq(irq, dev);
-+ free_irq(dev->irq, dev);
- out:
- release_region(ioaddr, FMV18X_IO_EXTENT);
- return retval;
-@@ -413,9 +433,7 @@ static int net_send_packet(struct sk_buf
- lp->tx_queue_len = 0;
- dev->trans_start = jiffies;
- lp->tx_started = 1;
-- } else if (lp->tx_queue_len < 4096 - 1502)
-- /* Yes, there is room for one more packet. */
-- else
-+ } else if (lp->tx_queue_len >= 4096 - 1502) /* No room for a packet */
- netif_stop_queue(dev);
-
- dev_kfree_skb(skb);
-@@ -628,9 +646,7 @@ static void set_multicast_list(struct ne
- }
-
- #ifdef MODULE
--static struct net_device dev_fmv18x;
--static int io = 0x220;
--static int irq;
-+static struct net_device *dev_fmv18x;
-
- MODULE_PARM(io, "i");
- MODULE_PARM(irq, "i");
-@@ -644,26 +660,19 @@ int init_module(void)
- {
- if (io == 0)
- printk("fmv18x: You should not use auto-probing with insmod!\n");
-- dev_fmv18x.base_addr = io;
-- dev_fmv18x.irq = irq;
-- dev_fmv18x.init = fmv18x_probe;
-- if (register_netdev(&dev_fmv18x) != 0) {
-- printk("fmv18x: register_netdev() returned non-zero.\n");
-- return -EIO;
-- }
-+ dev_fmv18x = fmv18x_probe(-1);
-+ if (IS_ERR(dev_fmv18x))
-+ return PTR_ERR(dev_fmv18x);
- return 0;
- }
-
- void
- cleanup_module(void)
- {
-- unregister_netdev(&dev_fmv18x);
-- kfree(dev_fmv18x.priv);
-- dev_fmv18x.priv = NULL;
--
-- /* If we don't do this, we can't re-insmod it later. */
-- free_irq(dev_fmv18x.irq, &dev_fmv18x);
-- release_region(dev_fmv18x.base_addr, FMV18X_IO_EXTENT);
-+ unregister_netdev(dev_fmv18x);
-+ free_irq(dev_fmv18x->irq, dev_fmv18x);
-+ release_region(dev_fmv18x->base_addr, FMV18X_IO_EXTENT);
-+ free_netdev(dev_fmv18x);
- }
- #endif /* MODULE */
- \f
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/net/forcedeth.c 2003-12-28 23:21:01.000000000 -0800
-@@ -0,0 +1,1495 @@
-+/*
-+ * forcedeth: Ethernet driver for NVIDIA nForce media access controllers.
-+ *
-+ * Note: This driver is a cleanroom reimplementation based on reverse
-+ * engineered documentation written by Carl-Daniel Hailfinger
-+ * and Andrew de Quincey. It's neither supported nor endorsed
-+ * by NVIDIA Corp. Use at your own risk.
-+ *
-+ * NVIDIA, nForce and other NVIDIA marks are trademarks or registered
-+ * trademarks of NVIDIA Corporation in the United States and other
-+ * countries.
-+ *
-+ * Copyright (C) 2003 Manfred Spraul
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ *
-+ * Changelog:
-+ * 0.01: 05 Oct 2003: First release that compiles without warnings.
-+ * 0.02: 05 Oct 2003: Fix bug for drain_tx: do not try to free NULL skbs.
-+ * Check all PCI BARs for the register window.
-+ * udelay added to mii_rw.
-+ * 0.03: 06 Oct 2003: Initialize dev->irq.
-+ * 0.04: 07 Oct 2003: Initialize np->lock, reduce handled irqs, add printks.
-+ * 0.05: 09 Oct 2003: printk removed again, irq status print tx_timeout.
-+ * 0.06: 10 Oct 2003: MAC Address read updated, pff flag generation updated,
-+ * irq mask updated
-+ * 0.07: 14 Oct 2003: Further irq mask updates.
-+ * 0.08: 20 Oct 2003: rx_desc.Length initialization added, alloc_rx refill
-+ * added into irq handler, NULL check for drain_ring.
-+ * 0.09: 20 Oct 2003: Basic link speed irq implementation. Only handle the
-+ * requested interrupt sources.
-+ * 0.10: 20 Oct 2003: First cleanup for release.
-+ * 0.11: 21 Oct 2003: hexdump for tx added, rx buffer sizes increased.
-+ * MAC Address init fix, set_multicast cleanup.
-+ * 0.12: 23 Oct 2003: Cleanups for release.
-+ * 0.13: 25 Oct 2003: Limit for concurrent tx packets increased to 10.
-+ * Set link speed correctly. start rx before starting
-+ * tx (start_rx sets the link speed).
-+ * 0.14: 25 Oct 2003: Nic dependant irq mask.
-+ * 0.15: 08 Nov 2003: fix smp deadlock with set_multicast_list during
-+ * open.
-+ * 0.16: 15 Nov 2003: include file cleanup for ppc64, rx buffer size
-+ * increased to 1628 bytes.
-+ * 0.17: 16 Nov 2003: undo rx buffer size increase. Substract 1 from
-+ * the tx length.
-+ * 0.18: 17 Nov 2003: fix oops due to late initialization of dev_stats
-+ * 0.19: 29 Nov 2003: Handle RxNoBuf, detect & handle invalid mac
-+ * addresses, really stop rx if already running
-+ * in start_rx, clean up a bit.
-+ * (C) Carl-Daniel Hailfinger
-+ *
-+ * Known bugs:
-+ * The irq handling is wrong - no tx done interrupts are generated.
-+ * This means recovery from netif_stop_queue only happens in the hw timer
-+ * interrupt (1/2 second on nForce2, 1/100 second on nForce3), or if an
-+ * rx packet arrives by chance.
-+ */
-+#define FORCEDETH_VERSION "0.19"
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/pci.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/ethtool.h>
-+#include <linux/timer.h>
-+#include <linux/skbuff.h>
-+#include <linux/mii.h>
-+#include <linux/random.h>
-+#include <linux/init.h>
-+
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+
-+#if 0
-+#define dprintk printk
-+#else
-+#define dprintk(x...) do { } while (0)
-+#endif
-+
-+
-+/*
-+ * Hardware access:
-+ */
-+
-+#define DEV_NEED_LASTPACKET1 0x0001
-+#define DEV_IRQMASK_1 0x0002
-+#define DEV_IRQMASK_2 0x0004
-+
-+enum {
-+ NvRegIrqStatus = 0x000,
-+#define NVREG_IRQSTAT_MIIEVENT 0x040
-+#define NVREG_IRQSTAT_MASK 0x1ff
-+ NvRegIrqMask = 0x004,
-+#define NVREG_IRQ_RX 0x0002
-+#define NVREG_IRQ_RX_NOBUF 0x0004
-+#define NVREG_IRQ_TX_ERR 0x0008
-+#define NVREG_IRQ_TX2 0x0010
-+#define NVREG_IRQ_TIMER 0x0020
-+#define NVREG_IRQ_LINK 0x0040
-+#define NVREG_IRQ_TX1 0x0100
-+#define NVREG_IRQMASK_WANTED_1 0x005f
-+#define NVREG_IRQMASK_WANTED_2 0x0147
-+#define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR|NVREG_IRQ_TX2|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX1))
-+
-+ NvRegUnknownSetupReg6 = 0x008,
-+#define NVREG_UNKSETUP6_VAL 3
-+
-+ NvRegPollingInterval = 0x00c,
-+ NvRegMisc1 = 0x080,
-+#define NVREG_MISC1_HD 0x02
-+#define NVREG_MISC1_FORCE 0x3b0f3c
-+
-+ NvRegTransmitterControl = 0x084,
-+#define NVREG_XMITCTL_START 0x01
-+ NvRegTransmitterStatus = 0x088,
-+#define NVREG_XMITSTAT_BUSY 0x01
-+
-+ NvRegPacketFilterFlags = 0x8c,
-+#define NVREG_PFF_ALWAYS 0x7F0008
-+#define NVREG_PFF_PROMISC 0x80
-+#define NVREG_PFF_MYADDR 0x20
-+
-+ NvRegOffloadConfig = 0x90,
-+#define NVREG_OFFLOAD_HOMEPHY 0x601
-+#define NVREG_OFFLOAD_NORMAL 0x5ee
-+ NvRegReceiverControl = 0x094,
-+#define NVREG_RCVCTL_START 0x01
-+ NvRegReceiverStatus = 0x98,
-+#define NVREG_RCVSTAT_BUSY 0x01
-+
-+ NvRegRandomSeed = 0x9c,
-+#define NVREG_RNDSEED_MASK 0x00ff
-+#define NVREG_RNDSEED_FORCE 0x7f00
-+
-+ NvRegUnknownSetupReg1 = 0xA0,
-+#define NVREG_UNKSETUP1_VAL 0x16070f
-+ NvRegUnknownSetupReg2 = 0xA4,
-+#define NVREG_UNKSETUP2_VAL 0x16
-+ NvRegMacAddrA = 0xA8,
-+ NvRegMacAddrB = 0xAC,
-+ NvRegMulticastAddrA = 0xB0,
-+#define NVREG_MCASTADDRA_FORCE 0x01
-+ NvRegMulticastAddrB = 0xB4,
-+ NvRegMulticastMaskA = 0xB8,
-+ NvRegMulticastMaskB = 0xBC,
-+
-+ NvRegTxRingPhysAddr = 0x100,
-+ NvRegRxRingPhysAddr = 0x104,
-+ NvRegRingSizes = 0x108,
-+#define NVREG_RINGSZ_TXSHIFT 0
-+#define NVREG_RINGSZ_RXSHIFT 16
-+ NvRegUnknownTransmitterReg = 0x10c,
-+ NvRegLinkSpeed = 0x110,
-+#define NVREG_LINKSPEED_FORCE 0x10000
-+#define NVREG_LINKSPEED_10 10
-+#define NVREG_LINKSPEED_100 100
-+#define NVREG_LINKSPEED_1000 1000
-+ NvRegUnknownSetupReg5 = 0x130,
-+#define NVREG_UNKSETUP5_BIT31 (1<<31)
-+ NvRegUnknownSetupReg3 = 0x134,
-+#define NVREG_UNKSETUP3_VAL1 0x200010
-+ NvRegTxRxControl = 0x144,
-+#define NVREG_TXRXCTL_KICK 0x0001
-+#define NVREG_TXRXCTL_BIT1 0x0002
-+#define NVREG_TXRXCTL_BIT2 0x0004
-+#define NVREG_TXRXCTL_IDLE 0x0008
-+#define NVREG_TXRXCTL_RESET 0x0010
-+ NvRegMIIStatus = 0x180,
-+#define NVREG_MIISTAT_ERROR 0x0001
-+#define NVREG_MIISTAT_LINKCHANGE 0x0008
-+#define NVREG_MIISTAT_MASK 0x000f
-+#define NVREG_MIISTAT_MASK2 0x000f
-+ NvRegUnknownSetupReg4 = 0x184,
-+#define NVREG_UNKSETUP4_VAL 8
-+
-+ NvRegAdapterControl = 0x188,
-+#define NVREG_ADAPTCTL_START 0x02
-+#define NVREG_ADAPTCTL_LINKUP 0x04
-+#define NVREG_ADAPTCTL_PHYVALID 0x4000
-+#define NVREG_ADAPTCTL_RUNNING 0x100000
-+#define NVREG_ADAPTCTL_PHYSHIFT 24
-+ NvRegMIISpeed = 0x18c,
-+#define NVREG_MIISPEED_BIT8 (1<<8)
-+#define NVREG_MIIDELAY 5
-+ NvRegMIIControl = 0x190,
-+#define NVREG_MIICTL_INUSE 0x10000
-+#define NVREG_MIICTL_WRITE 0x08000
-+#define NVREG_MIICTL_ADDRSHIFT 5
-+ NvRegMIIData = 0x194,
-+ NvRegWakeUpFlags = 0x200,
-+#define NVREG_WAKEUPFLAGS_VAL 0x7770
-+#define NVREG_WAKEUPFLAGS_BUSYSHIFT 24
-+#define NVREG_WAKEUPFLAGS_ENABLESHIFT 16
-+#define NVREG_WAKEUPFLAGS_D3SHIFT 12
-+#define NVREG_WAKEUPFLAGS_D2SHIFT 8
-+#define NVREG_WAKEUPFLAGS_D1SHIFT 4
-+#define NVREG_WAKEUPFLAGS_D0SHIFT 0
-+#define NVREG_WAKEUPFLAGS_ACCEPT_MAGPAT 0x01
-+#define NVREG_WAKEUPFLAGS_ACCEPT_WAKEUPPAT 0x02
-+#define NVREG_WAKEUPFLAGS_ACCEPT_LINKCHANGE 0x04
-+
-+ NvRegPatternCRC = 0x204,
-+ NvRegPatternMask = 0x208,
-+ NvRegPowerCap = 0x268,
-+#define NVREG_POWERCAP_D3SUPP (1<<30)
-+#define NVREG_POWERCAP_D2SUPP (1<<26)
-+#define NVREG_POWERCAP_D1SUPP (1<<25)
-+ NvRegPowerState = 0x26c,
-+#define NVREG_POWERSTATE_POWEREDUP 0x8000
-+#define NVREG_POWERSTATE_VALID 0x0100
-+#define NVREG_POWERSTATE_MASK 0x0003
-+#define NVREG_POWERSTATE_D0 0x0000
-+#define NVREG_POWERSTATE_D1 0x0001
-+#define NVREG_POWERSTATE_D2 0x0002
-+#define NVREG_POWERSTATE_D3 0x0003
-+};
-+
-+struct ring_desc {
-+ u32 PacketBuffer;
-+ u16 Length;
-+ u16 Flags;
-+};
-+
-+#define NV_TX_LASTPACKET (1<<0)
-+#define NV_TX_RETRYERROR (1<<3)
-+#define NV_TX_LASTPACKET1 (1<<8)
-+#define NV_TX_DEFERRED (1<<10)
-+#define NV_TX_CARRIERLOST (1<<11)
-+#define NV_TX_LATECOLLISION (1<<12)
-+#define NV_TX_UNDERFLOW (1<<13)
-+#define NV_TX_ERROR (1<<14)
-+#define NV_TX_VALID (1<<15)
-+
-+#define NV_RX_DESCRIPTORVALID (1<<0)
-+#define NV_RX_MISSEDFRAME (1<<1)
-+#define NV_RX_SUBSTRACT1 (1<<3)
-+#define NV_RX_ERROR1 (1<<7)
-+#define NV_RX_ERROR2 (1<<8)
-+#define NV_RX_ERROR3 (1<<9)
-+#define NV_RX_ERROR4 (1<<10)
-+#define NV_RX_CRCERR (1<<11)
-+#define NV_RX_OVERFLOW (1<<12)
-+#define NV_RX_FRAMINGERR (1<<13)
-+#define NV_RX_ERROR (1<<14)
-+#define NV_RX_AVAIL (1<<15)
-+
-+/* Miscelaneous hardware related defines: */
-+#define NV_PCI_REGSZ 0x270
-+
-+/* various timeout delays: all in usec */
-+#define NV_TXRX_RESET_DELAY 4
-+#define NV_TXSTOP_DELAY1 10
-+#define NV_TXSTOP_DELAY1MAX 500000
-+#define NV_TXSTOP_DELAY2 100
-+#define NV_RXSTOP_DELAY1 10
-+#define NV_RXSTOP_DELAY1MAX 500000
-+#define NV_RXSTOP_DELAY2 100
-+#define NV_SETUP5_DELAY 5
-+#define NV_SETUP5_DELAYMAX 50000
-+#define NV_POWERUP_DELAY 5
-+#define NV_POWERUP_DELAYMAX 5000
-+#define NV_MIIBUSY_DELAY 50
-+#define NV_MIIPHY_DELAY 10
-+#define NV_MIIPHY_DELAYMAX 10000
-+
-+#define NV_WAKEUPPATTERNS 5
-+#define NV_WAKEUPMASKENTRIES 4
-+
-+/* General driver defaults */
-+#define NV_WATCHDOG_TIMEO (2*HZ)
-+#define DEFAULT_MTU 1500 /* also maximum supported, at least for now */
-+
-+#define RX_RING 128
-+#define TX_RING 16
-+/* limited to 1 packet until we understand NV_TX_LASTPACKET */
-+#define TX_LIMIT_STOP 10
-+#define TX_LIMIT_START 5
-+
-+/* rx/tx mac addr + type + vlan + align + slack*/
-+#define RX_NIC_BUFSIZE (DEFAULT_MTU + 64)
-+/* even more slack */
-+#define RX_ALLOC_BUFSIZE (DEFAULT_MTU + 128)
-+
-+#define OOM_REFILL (1+HZ/20)
-+#define POLL_WAIT (1+HZ/100)
-+
-+/*
-+ * SMP locking:
-+ * All hardware access under dev->priv->lock, except the performance
-+ * critical parts:
-+ * - rx is (pseudo-) lockless: it relies on the single-threading provided
-+ * by the arch code for interrupts.
-+ * - tx setup is lockless: it relies on dev->xmit_lock. Actual submission
-+ * needs dev->priv->lock :-(
-+ * - set_multicast_list: preparation lockless, relies on dev->xmit_lock.
-+ */
-+
-+/* in dev: base, irq */
-+struct fe_priv {
-+ spinlock_t lock;
-+
-+ /* General data:
-+ * Locking: spin_lock(&np->lock); */
-+ struct net_device_stats stats;
-+ int in_shutdown;
-+ u32 linkspeed;
-+ int duplex;
-+ int phyaddr;
-+
-+ /* General data: RO fields */
-+ dma_addr_t ring_addr;
-+ struct pci_dev *pci_dev;
-+ u32 orig_mac[2];
-+ u32 irqmask;
-+
-+ /* rx specific fields.
-+ * Locking: Within irq hander or disable_irq+spin_lock(&np->lock);
-+ */
-+ struct ring_desc *rx_ring;
-+ unsigned int cur_rx, refill_rx;
-+ struct sk_buff *rx_skbuff[RX_RING];
-+ dma_addr_t rx_dma[RX_RING];
-+ unsigned int rx_buf_sz;
-+ struct timer_list oom_kick;
-+ struct timer_list nic_poll;
-+
-+ /*
-+ * tx specific fields.
-+ */
-+ struct ring_desc *tx_ring;
-+ unsigned int next_tx, nic_tx;
-+ struct sk_buff *tx_skbuff[TX_RING];
-+ dma_addr_t tx_dma[TX_RING];
-+ u16 tx_flags;
-+};
-+
-+/*
-+ * Maximum number of loops until we assume that a bit in the irq mask
-+ * is stuck. Overridable with module param.
-+ */
-+static int max_interrupt_work = 5;
-+
-+static inline struct fe_priv *get_nvpriv(struct net_device *dev)
-+{
-+ return (struct fe_priv *) dev->priv;
-+}
-+
-+static inline u8 *get_hwbase(struct net_device *dev)
-+{
-+ return (u8 *) dev->base_addr;
-+}
-+
-+static inline void pci_push(u8 * base)
-+{
-+ /* force out pending posted writes */
-+ readl(base);
-+}
-+
-+static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target,
-+ int delay, int delaymax, const char *msg)
-+{
-+ u8 *base = get_hwbase(dev);
-+
-+ pci_push(base);
-+ do {
-+ udelay(delay);
-+ delaymax -= delay;
-+ if (delaymax < 0) {
-+ if (msg)
-+ printk(msg);
-+ return 1;
-+ }
-+ } while ((readl(base + offset) & mask) != target);
-+ return 0;
-+}
-+
-+#define MII_READ (-1)
-+/* mii_rw: read/write a register on the PHY.
-+ *
-+ * Caller must guarantee serialization
-+ */
-+static int mii_rw(struct net_device *dev, int addr, int miireg, int value)
-+{
-+ u8 *base = get_hwbase(dev);
-+ int was_running;
-+ u32 reg;
-+ int retval;
-+
-+ writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus);
-+ was_running = 0;
-+ reg = readl(base + NvRegAdapterControl);
-+ if (reg & NVREG_ADAPTCTL_RUNNING) {
-+ was_running = 1;
-+ writel(reg & ~NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl);
-+ }
-+ reg = readl(base + NvRegMIIControl);
-+ if (reg & NVREG_MIICTL_INUSE) {
-+ writel(NVREG_MIICTL_INUSE, base + NvRegMIIControl);
-+ udelay(NV_MIIBUSY_DELAY);
-+ }
-+
-+ reg = NVREG_MIICTL_INUSE | (addr << NVREG_MIICTL_ADDRSHIFT) | miireg;
-+ if (value != MII_READ) {
-+ writel(value, base + NvRegMIIData);
-+ reg |= NVREG_MIICTL_WRITE;
-+ }
-+ writel(reg, base + NvRegMIIControl);
-+
-+ if (reg_delay(dev, NvRegMIIControl, NVREG_MIICTL_INUSE, 0,
-+ NV_MIIPHY_DELAY, NV_MIIPHY_DELAYMAX, NULL)) {
-+ dprintk(KERN_DEBUG "%s: mii_rw of reg %d at PHY %d timed out.\n",
-+ dev->name, miireg, addr);
-+ retval = -1;
-+ } else if (value != MII_READ) {
-+ /* it was a write operation - fewer failures are detectable */
-+ dprintk(KERN_DEBUG "%s: mii_rw wrote 0x%x to reg %d at PHY %d\n",
-+ dev->name, value, miireg, addr);
-+ retval = 0;
-+ } else if (readl(base + NvRegMIIStatus) & NVREG_MIISTAT_ERROR) {
-+ dprintk(KERN_DEBUG "%s: mii_rw of reg %d at PHY %d failed.\n",
-+ dev->name, miireg, addr);
-+ retval = -1;
-+ } else {
-+ /* FIXME: why is that required? */
-+ udelay(50);
-+ retval = readl(base + NvRegMIIData);
-+ dprintk(KERN_DEBUG "%s: mii_rw read from reg %d at PHY %d: 0x%x.\n",
-+ dev->name, miireg, addr, retval);
-+ }
-+ if (was_running) {
-+ reg = readl(base + NvRegAdapterControl);
-+ writel(reg | NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl);
-+ }
-+ return retval;
-+}
-+
-+static void start_rx(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+
-+ dprintk(KERN_DEBUG "%s: start_rx\n", dev->name);
-+ /* Already running? Stop it. */
-+ if (readl(base + NvRegReceiverControl) & NVREG_RCVCTL_START) {
-+ writel(0, base + NvRegReceiverControl);
-+ pci_push(base);
-+ }
-+ writel(np->linkspeed, base + NvRegLinkSpeed);
-+ pci_push(base);
-+ writel(NVREG_RCVCTL_START, base + NvRegReceiverControl);
-+ pci_push(base);
-+}
-+
-+static void stop_rx(struct net_device *dev)
-+{
-+ u8 *base = get_hwbase(dev);
-+
-+ dprintk(KERN_DEBUG "%s: stop_rx\n", dev->name);
-+ writel(0, base + NvRegReceiverControl);
-+ reg_delay(dev, NvRegReceiverStatus, NVREG_RCVSTAT_BUSY, 0,
-+ NV_RXSTOP_DELAY1, NV_RXSTOP_DELAY1MAX,
-+ KERN_INFO "stop_rx: ReceiverStatus remained busy");
-+
-+ udelay(NV_RXSTOP_DELAY2);
-+ writel(0, base + NvRegLinkSpeed);
-+}
-+
-+static void start_tx(struct net_device *dev)
-+{
-+ u8 *base = get_hwbase(dev);
-+
-+ dprintk(KERN_DEBUG "%s: start_tx\n", dev->name);
-+ writel(NVREG_XMITCTL_START, base + NvRegTransmitterControl);
-+ pci_push(base);
-+}
-+
-+static void stop_tx(struct net_device *dev)
-+{
-+ u8 *base = get_hwbase(dev);
-+
-+ dprintk(KERN_DEBUG "%s: stop_tx\n", dev->name);
-+ writel(0, base + NvRegTransmitterControl);
-+ reg_delay(dev, NvRegTransmitterStatus, NVREG_XMITSTAT_BUSY, 0,
-+ NV_TXSTOP_DELAY1, NV_TXSTOP_DELAY1MAX,
-+ KERN_INFO "stop_tx: TransmitterStatus remained busy");
-+
-+ udelay(NV_TXSTOP_DELAY2);
-+ writel(0, base + NvRegUnknownTransmitterReg);
-+}
-+
-+static void txrx_reset(struct net_device *dev)
-+{
-+ u8 *base = get_hwbase(dev);
-+
-+ dprintk(KERN_DEBUG "%s: txrx_reset\n", dev->name);
-+ writel(NVREG_TXRXCTL_BIT2 | NVREG_TXRXCTL_RESET, base + NvRegTxRxControl);
-+ pci_push(base);
-+ udelay(NV_TXRX_RESET_DELAY);
-+ writel(NVREG_TXRXCTL_BIT2, base + NvRegTxRxControl);
-+ pci_push(base);
-+}
-+
-+/*
-+ * get_stats: dev->get_stats function
-+ * Get latest stats value from the nic.
-+ * Called with read_lock(&dev_base_lock) held for read -
-+ * only synchronized against unregister_netdevice.
-+ */
-+static struct net_device_stats *get_stats(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+
-+ /* It seems that the nic always generates interrupts and doesn't
-+ * accumulate errors internally. Thus the current values in np->stats
-+ * are already up to date.
-+ */
-+ return &np->stats;
-+}
-+
-+
-+/*
-+ * nic_ioctl: dev->do_ioctl function
-+ * Called with rtnl_lock held.
-+ */
-+static int nic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-+{
-+ return -EOPNOTSUPP;
-+}
-+
-+/*
-+ * alloc_rx: fill rx ring entries.
-+ * Return 1 if the allocations for the skbs failed and the
-+ * rx engine is without Available descriptors
-+ */
-+static int alloc_rx(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ unsigned int refill_rx = np->refill_rx;
-+
-+ while (np->cur_rx != refill_rx) {
-+ int nr = refill_rx % RX_RING;
-+ struct sk_buff *skb;
-+
-+ if (np->rx_skbuff[nr] == NULL) {
-+
-+ skb = dev_alloc_skb(RX_ALLOC_BUFSIZE);
-+ if (!skb)
-+ break;
-+
-+ skb->dev = dev;
-+ np->rx_skbuff[nr] = skb;
-+ } else {
-+ skb = np->rx_skbuff[nr];
-+ }
-+ np->rx_dma[nr] = pci_map_single(np->pci_dev, skb->data, skb->len,
-+ PCI_DMA_FROMDEVICE);
-+ np->rx_ring[nr].PacketBuffer = cpu_to_le32(np->rx_dma[nr]);
-+ np->rx_ring[nr].Length = cpu_to_le16(RX_NIC_BUFSIZE);
-+ wmb();
-+ np->rx_ring[nr].Flags = cpu_to_le16(NV_RX_AVAIL);
-+ dprintk(KERN_DEBUG "%s: alloc_rx: Packet %d marked as Available\n",
-+ dev->name, refill_rx);
-+ refill_rx++;
-+ }
-+ np->refill_rx = refill_rx;
-+ if (np->cur_rx - refill_rx == RX_RING)
-+ return 1;
-+ return 0;
-+}
-+
-+static void do_rx_refill(unsigned long data)
-+{
-+ struct net_device *dev = (struct net_device *) data;
-+ struct fe_priv *np = get_nvpriv(dev);
-+
-+ disable_irq(dev->irq);
-+ if (alloc_rx(dev)) {
-+ spin_lock(&np->lock);
-+ if (!np->in_shutdown)
-+ mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
-+ spin_unlock(&np->lock);
-+ }
-+ enable_irq(dev->irq);
-+}
-+
-+static int init_ring(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ int i;
-+
-+ np->next_tx = np->nic_tx = 0;
-+ for (i = 0; i < TX_RING; i++) {
-+ np->tx_ring[i].Flags = 0;
-+ }
-+
-+ np->cur_rx = RX_RING;
-+ np->refill_rx = 0;
-+ for (i = 0; i < RX_RING; i++) {
-+ np->rx_ring[i].Flags = 0;
-+ }
-+ return alloc_rx(dev);
-+}
-+
-+static void drain_tx(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ int i;
-+ for (i = 0; i < TX_RING; i++) {
-+ np->tx_ring[i].Flags = 0;
-+ if (np->tx_skbuff[i]) {
-+ pci_unmap_single(np->pci_dev, np->tx_dma[i],
-+ np->tx_skbuff[i]->len,
-+ PCI_DMA_TODEVICE);
-+ dev_kfree_skb(np->tx_skbuff[i]);
-+ np->tx_skbuff[i] = NULL;
-+ np->stats.tx_dropped++;
-+ }
-+ }
-+}
-+
-+static void drain_rx(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ int i;
-+ for (i = 0; i < RX_RING; i++) {
-+ np->rx_ring[i].Flags = 0;
-+ wmb();
-+ if (np->rx_skbuff[i]) {
-+ pci_unmap_single(np->pci_dev, np->rx_dma[i],
-+ np->rx_skbuff[i]->len,
-+ PCI_DMA_FROMDEVICE);
-+ dev_kfree_skb(np->rx_skbuff[i]);
-+ np->rx_skbuff[i] = NULL;
-+ }
-+ }
-+}
-+
-+static void drain_ring(struct net_device *dev)
-+{
-+ drain_tx(dev);
-+ drain_rx(dev);
-+}
-+
-+/*
-+ * start_xmit: dev->hard_start_xmit function
-+ * Called with dev->xmit_lock held.
-+ */
-+static int start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ int nr = np->next_tx % TX_RING;
-+
-+ np->tx_skbuff[nr] = skb;
-+ np->tx_dma[nr] = pci_map_single(np->pci_dev, skb->data,skb->len,
-+ PCI_DMA_TODEVICE);
-+
-+ np->tx_ring[nr].PacketBuffer = cpu_to_le32(np->tx_dma[nr]);
-+ np->tx_ring[nr].Length = cpu_to_le16(skb->len-1);
-+
-+ spin_lock_irq(&np->lock);
-+ wmb();
-+ np->tx_ring[nr].Flags = np->tx_flags;
-+ dprintk(KERN_DEBUG "%s: start_xmit: packet packet %d queued for transmission.\n",
-+ dev->name, np->next_tx);
-+ {
-+ int j;
-+ for (j=0; j<64; j++) {
-+ if ((j%16) == 0)
-+ dprintk("\n%03x:", j);
-+ dprintk(" %02x", ((unsigned char*)skb->data)[j]);
-+ }
-+ dprintk("\n");
-+ }
-+
-+ np->next_tx++;
-+
-+ dev->trans_start = jiffies;
-+ if (np->next_tx - np->nic_tx >= TX_LIMIT_STOP)
-+ netif_stop_queue(dev);
-+ spin_unlock_irq(&np->lock);
-+ writel(NVREG_TXRXCTL_KICK, get_hwbase(dev) + NvRegTxRxControl);
-+ return 0;
-+}
-+
-+/*
-+ * tx_done: check for completed packets, release the skbs.
-+ *
-+ * Caller must own np->lock.
-+ */
-+static void tx_done(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+
-+ while (np->nic_tx < np->next_tx) {
-+ struct ring_desc *prd;
-+ int i = np->nic_tx % TX_RING;
-+
-+ prd = &np->tx_ring[i];
-+
-+ dprintk(KERN_DEBUG "%s: tx_done: looking at packet %d, Flags 0x%x.\n",
-+ dev->name, np->nic_tx, prd->Flags);
-+ if (prd->Flags & cpu_to_le16(NV_TX_VALID))
-+ break;
-+ if (prd->Flags & cpu_to_le16(NV_TX_RETRYERROR|NV_TX_CARRIERLOST|NV_TX_LATECOLLISION|
-+ NV_TX_UNDERFLOW|NV_TX_ERROR)) {
-+ if (prd->Flags & cpu_to_le16(NV_TX_UNDERFLOW))
-+ np->stats.tx_fifo_errors++;
-+ if (prd->Flags & cpu_to_le16(NV_TX_CARRIERLOST))
-+ np->stats.tx_carrier_errors++;
-+ np->stats.tx_errors++;
-+ } else {
-+ np->stats.tx_packets++;
-+ np->stats.tx_bytes += np->tx_skbuff[i]->len;
-+ }
-+ pci_unmap_single(np->pci_dev, np->tx_dma[i],
-+ np->tx_skbuff[i]->len,
-+ PCI_DMA_TODEVICE);
-+ dev_kfree_skb_irq(np->tx_skbuff[i]);
-+ np->tx_skbuff[i] = NULL;
-+ np->nic_tx++;
-+ }
-+ if (np->next_tx - np->nic_tx < TX_LIMIT_START)
-+ netif_wake_queue(dev);
-+}
-+
-+/*
-+ * tx_timeout: dev->tx_timeout function
-+ * Called with dev->xmit_lock held.
-+ */
-+static void tx_timeout(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+
-+ dprintk(KERN_DEBUG "%s: Got tx_timeout. irq: %08x\n", dev->name,
-+ readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK);
-+
-+ spin_lock_irq(&np->lock);
-+
-+ /* 1) stop tx engine */
-+ stop_tx(dev);
-+
-+ /* 2) check that the packets were not sent already: */
-+ tx_done(dev);
-+
-+ /* 3) if there are dead entries: clear everything */
-+ if (np->next_tx != np->nic_tx) {
-+ printk(KERN_DEBUG "%s: tx_timeout: dead entries!\n", dev->name);
-+ drain_tx(dev);
-+ np->next_tx = np->nic_tx = 0;
-+ writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
-+ netif_wake_queue(dev);
-+ }
-+
-+ /* 4) restart tx engine */
-+ start_tx(dev);
-+ spin_unlock_irq(&np->lock);
-+}
-+
-+static void rx_process(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+
-+ for (;;) {
-+ struct ring_desc *prd;
-+ struct sk_buff *skb;
-+ int len;
-+ int i;
-+ if (np->cur_rx - np->refill_rx >= RX_RING)
-+ break; /* we scanned the whole ring - do not continue */
-+
-+ i = np->cur_rx % RX_RING;
-+ prd = &np->rx_ring[i];
-+ dprintk(KERN_DEBUG "%s: rx_process: looking at packet %d, Flags 0x%x.\n",
-+ dev->name, np->cur_rx, prd->Flags);
-+
-+ if (prd->Flags & cpu_to_le16(NV_RX_AVAIL))
-+ break; /* still owned by hardware, */
-+
-+ /*
-+ * the packet is for us - immediately tear down the pci mapping, and
-+ * prefetch the first cacheline of the packet.
-+ */
-+ pci_unmap_single(np->pci_dev, np->rx_dma[i],
-+ np->rx_skbuff[i]->len,
-+ PCI_DMA_FROMDEVICE);
-+ prefetch(np->rx_skbuff[i]->data);
-+
-+ {
-+ int j;
-+ dprintk(KERN_DEBUG "Dumping packet (flags 0x%x).",prd->Flags);
-+ for (j=0; j<64; j++) {
-+ if ((j%16) == 0)
-+ dprintk("\n%03x:", j);
-+ dprintk(" %02x", ((unsigned char*)np->rx_skbuff[i]->data)[j]);
-+ }
-+ dprintk("\n");
-+ }
-+ /* look at what we actually got: */
-+ if (!(prd->Flags & cpu_to_le16(NV_RX_DESCRIPTORVALID)))
-+ goto next_pkt;
-+
-+
-+ len = le16_to_cpu(prd->Length);
-+
-+ if (prd->Flags & cpu_to_le16(NV_RX_MISSEDFRAME)) {
-+ np->stats.rx_missed_errors++;
-+ np->stats.rx_errors++;
-+ goto next_pkt;
-+ }
-+ if (prd->Flags & cpu_to_le16(NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3|NV_RX_ERROR4)) {
-+ np->stats.rx_errors++;
-+ goto next_pkt;
-+ }
-+ if (prd->Flags & cpu_to_le16(NV_RX_CRCERR)) {
-+ np->stats.rx_crc_errors++;
-+ np->stats.rx_errors++;
-+ goto next_pkt;
-+ }
-+ if (prd->Flags & cpu_to_le16(NV_RX_OVERFLOW)) {
-+ np->stats.rx_over_errors++;
-+ np->stats.rx_errors++;
-+ goto next_pkt;
-+ }
-+ if (prd->Flags & cpu_to_le16(NV_RX_ERROR)) {
-+ /* framing errors are soft errors, the rest is fatal. */
-+ if (prd->Flags & cpu_to_le16(NV_RX_FRAMINGERR)) {
-+ if (prd->Flags & cpu_to_le16(NV_RX_SUBSTRACT1)) {
-+ len--;
-+ }
-+ } else {
-+ np->stats.rx_errors++;
-+ goto next_pkt;
-+ }
-+ }
-+ /* got a valid packet - forward it to the network core */
-+ skb = np->rx_skbuff[i];
-+ np->rx_skbuff[i] = NULL;
-+
-+ skb_put(skb, len);
-+ skb->protocol = eth_type_trans(skb, dev);
-+ dprintk(KERN_DEBUG "%s: rx_process: packet %d with %d bytes, proto %d accepted.\n",
-+ dev->name, np->cur_rx, len, skb->protocol);
-+ netif_rx(skb);
-+ dev->last_rx = jiffies;
-+ np->stats.rx_packets++;
-+ np->stats.rx_bytes += len;
-+next_pkt:
-+ np->cur_rx++;
-+ }
-+}
-+
-+/*
-+ * change_mtu: dev->change_mtu function
-+ * Called with dev_base_lock held for read.
-+ */
-+static int change_mtu(struct net_device *dev, int new_mtu)
-+{
-+ if (new_mtu > DEFAULT_MTU)
-+ return -EINVAL;
-+ dev->mtu = new_mtu;
-+ return 0;
-+}
-+
-+/*
-+ * change_mtu: dev->change_mtu function
-+ * Called with dev->xmit_lock held.
-+ */
-+static void set_multicast(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+ u32 addr[2];
-+ u32 mask[2];
-+ u32 pff;
-+
-+ memset(addr, 0, sizeof(addr));
-+ memset(mask, 0, sizeof(mask));
-+
-+ if (dev->flags & IFF_PROMISC) {
-+ printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name);
-+ pff = NVREG_PFF_PROMISC;
-+ } else {
-+ pff = NVREG_PFF_MYADDR;
-+
-+ if (dev->flags & IFF_ALLMULTI || dev->mc_list) {
-+ u32 alwaysOff[2];
-+ u32 alwaysOn[2];
-+
-+ alwaysOn[0] = alwaysOn[1] = alwaysOff[0] = alwaysOff[1] = 0xffffffff;
-+ if (dev->flags & IFF_ALLMULTI) {
-+ alwaysOn[0] = alwaysOn[1] = alwaysOff[0] = alwaysOff[1] = 0;
-+ } else {
-+ struct dev_mc_list *walk;
-+
-+ walk = dev->mc_list;
-+ while (walk != NULL) {
-+ u32 a, b;
-+ a = le32_to_cpu(*(u32 *) walk->dmi_addr);
-+ b = le16_to_cpu(*(u16 *) (&walk->dmi_addr[4]));
-+ alwaysOn[0] &= a;
-+ alwaysOff[0] &= ~a;
-+ alwaysOn[1] &= b;
-+ alwaysOff[1] &= ~b;
-+ walk = walk->next;
-+ }
-+ }
-+ addr[0] = alwaysOn[0];
-+ addr[1] = alwaysOn[1];
-+ mask[0] = alwaysOn[0] | alwaysOff[0];
-+ mask[1] = alwaysOn[1] | alwaysOff[1];
-+ }
-+ }
-+ addr[0] |= NVREG_MCASTADDRA_FORCE;
-+ pff |= NVREG_PFF_ALWAYS;
-+ spin_lock_irq(&np->lock);
-+ stop_rx(dev);
-+ writel(addr[0], base + NvRegMulticastAddrA);
-+ writel(addr[1], base + NvRegMulticastAddrB);
-+ writel(mask[0], base + NvRegMulticastMaskA);
-+ writel(mask[1], base + NvRegMulticastMaskB);
-+ writel(pff, base + NvRegPacketFilterFlags);
-+ start_rx(dev);
-+ spin_unlock_irq(&np->lock);
-+}
-+
-+static int update_linkspeed(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ int adv, lpa, newls, newdup;
-+
-+ adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
-+ lpa = mii_rw(dev, np->phyaddr, MII_LPA, MII_READ);
-+ dprintk(KERN_DEBUG "%s: update_linkspeed: PHY advertises 0x%04x, lpa 0x%04x.\n",
-+ dev->name, adv, lpa);
-+
-+ /* FIXME: handle parallel detection properly, handle gigabit ethernet */
-+ lpa = lpa & adv;
-+ if (lpa & LPA_100FULL) {
-+ newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100;
-+ newdup = 1;
-+ } else if (lpa & LPA_100HALF) {
-+ newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_100;
-+ newdup = 0;
-+ } else if (lpa & LPA_10FULL) {
-+ newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
-+ newdup = 1;
-+ } else if (lpa & LPA_10HALF) {
-+ newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
-+ newdup = 0;
-+ } else {
-+ dprintk(KERN_DEBUG "%s: bad ability %04x - falling back to 10HD.\n", dev->name, lpa);
-+ newls = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
-+ newdup = 0;
-+ }
-+ if (np->duplex != newdup || np->linkspeed != newls) {
-+ np->duplex = newdup;
-+ np->linkspeed = newls;
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+static void link_irq(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+ u32 miistat;
-+ int miival;
-+
-+ miistat = readl(base + NvRegMIIStatus);
-+ writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus);
-+ printk(KERN_DEBUG "%s: link change notification, status 0x%x.\n", dev->name, miistat);
-+
-+ miival = mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ);
-+ if (miival & BMSR_ANEGCOMPLETE) {
-+ update_linkspeed(dev);
-+
-+ if (netif_carrier_ok(dev)) {
-+ stop_rx(dev);
-+ } else {
-+ netif_carrier_on(dev);
-+ printk(KERN_INFO "%s: link up.\n", dev->name);
-+ }
-+ writel(NVREG_MISC1_FORCE | ( np->duplex ? 0 : NVREG_MISC1_HD),
-+ base + NvRegMisc1);
-+ start_rx(dev);
-+ } else {
-+ if (netif_carrier_ok(dev)) {
-+ netif_carrier_off(dev);
-+ printk(KERN_INFO "%s: link down.\n", dev->name);
-+ stop_rx(dev);
-+ }
-+ writel(np->linkspeed, base + NvRegLinkSpeed);
-+ pci_push(base);
-+ }
-+}
-+
-+static irqreturn_t nic_irq(int foo, void *data, struct pt_regs *regs)
-+{
-+ struct net_device *dev = (struct net_device *) data;
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+ u32 events;
-+ int i;
-+
-+ dprintk(KERN_DEBUG "%s: nic_irq\n", dev->name);
-+
-+ for (i=0; ; i++) {
-+ events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
-+ writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
-+ pci_push(base);
-+ dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events);
-+ if (!(events & np->irqmask))
-+ break;
-+
-+ if (events & (NVREG_IRQ_TX1|NVREG_IRQ_TX2|NVREG_IRQ_TX_ERR)) {
-+ spin_lock(&np->lock);
-+ tx_done(dev);
-+ spin_unlock(&np->lock);
-+ }
-+
-+ if (events & (NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF)) {
-+ rx_process(dev);
-+ if (alloc_rx(dev)) {
-+ spin_lock(&np->lock);
-+ if (!np->in_shutdown)
-+ mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
-+ spin_unlock(&np->lock);
-+ }
-+ }
-+
-+ if (events & NVREG_IRQ_LINK) {
-+ spin_lock(&np->lock);
-+ link_irq(dev);
-+ spin_unlock(&np->lock);
-+ }
-+ if (events & (NVREG_IRQ_TX_ERR)) {
-+ dprintk(KERN_DEBUG "%s: received irq with events 0x%x. Probably TX fail.\n",
-+ dev->name, events);
-+ }
-+ if (events & (NVREG_IRQ_UNKNOWN)) {
-+ printk(KERN_DEBUG "%s: received irq with unknown events 0x%x. Please report\n",
-+ dev->name, events);
-+ }
-+ if (i > max_interrupt_work) {
-+ spin_lock(&np->lock);
-+ /* disable interrupts on the nic */
-+ writel(0, base + NvRegIrqMask);
-+ pci_push(base);
-+
-+ if (!np->in_shutdown)
-+ mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
-+ printk(KERN_DEBUG "%s: too many iterations (%d) in nic_irq.\n", dev->name, i);
-+ spin_unlock(&np->lock);
-+ break;
-+ }
-+
-+ }
-+ dprintk(KERN_DEBUG "%s: nic_irq completed\n", dev->name);
-+
-+ return IRQ_RETVAL(i);
-+}
-+
-+static void do_nic_poll(unsigned long data)
-+{
-+ struct net_device *dev = (struct net_device *) data;
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+
-+ disable_irq(dev->irq);
-+ /*
-+ * reenable interrupts on the nic, we have to do this before calling
-+ * nic_irq because that may decide to do otherwise
-+ */
-+ writel(np->irqmask, base + NvRegIrqMask);
-+ pci_push(base);
-+ nic_irq((int) 0, (void *) data, (struct pt_regs *) NULL);
-+ enable_irq(dev->irq);
-+}
-+
-+static int open(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+ int ret, oom, i;
-+
-+ dprintk(KERN_DEBUG "forcedeth: open\n");
-+
-+ /* 1) erase previous misconfiguration */
-+ /* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */
-+ writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
-+ writel(0, base + NvRegMulticastAddrB);
-+ writel(0, base + NvRegMulticastMaskA);
-+ writel(0, base + NvRegMulticastMaskB);
-+ writel(0, base + NvRegPacketFilterFlags);
-+ writel(0, base + NvRegAdapterControl);
-+ writel(0, base + NvRegLinkSpeed);
-+ writel(0, base + NvRegUnknownTransmitterReg);
-+ txrx_reset(dev);
-+ writel(0, base + NvRegUnknownSetupReg6);
-+
-+ /* 2) initialize descriptor rings */
-+ np->in_shutdown = 0;
-+ oom = init_ring(dev);
-+
-+ /* 3) set mac address */
-+ {
-+ u32 mac[2];
-+
-+ mac[0] = (dev->dev_addr[0] << 0) + (dev->dev_addr[1] << 8) +
-+ (dev->dev_addr[2] << 16) + (dev->dev_addr[3] << 24);
-+ mac[1] = (dev->dev_addr[4] << 0) + (dev->dev_addr[5] << 8);
-+
-+ writel(mac[0], base + NvRegMacAddrA);
-+ writel(mac[1], base + NvRegMacAddrB);
-+ }
-+
-+ /* 4) continue setup */
-+ np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10;
-+ np->duplex = 0;
-+ writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3);
-+ writel(0, base + NvRegTxRxControl);
-+ pci_push(base);
-+ writel(NVREG_TXRXCTL_BIT1, base + NvRegTxRxControl);
-+ reg_delay(dev, NvRegUnknownSetupReg5, NVREG_UNKSETUP5_BIT31, NVREG_UNKSETUP5_BIT31,
-+ NV_SETUP5_DELAY, NV_SETUP5_DELAYMAX,
-+ KERN_INFO "open: SetupReg5, Bit 31 remained off\n");
-+ writel(0, base + NvRegUnknownSetupReg4);
-+
-+ /* 5) Find a suitable PHY */
-+ writel(NVREG_MIISPEED_BIT8|NVREG_MIIDELAY, base + NvRegMIISpeed);
-+ for (i = 1; i < 32; i++) {
-+ int id1, id2;
-+
-+ id1 = mii_rw(dev, i, MII_PHYSID1, MII_READ);
-+ if (id1 < 0)
-+ continue;
-+ id2 = mii_rw(dev, i, MII_PHYSID2, MII_READ);
-+ if (id2 < 0)
-+ continue;
-+ dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n",
-+ dev->name, id1, id2, i);
-+ np->phyaddr = i;
-+
-+ update_linkspeed(dev);
-+
-+ break;
-+ }
-+ if (i == 32) {
-+ printk(KERN_INFO "%s: open: failing due to lack of suitable PHY.\n",
-+ dev->name);
-+ ret = -EINVAL;
-+ goto out_drain;
-+ }
-+
-+ /* 6) continue setup */
-+ writel(NVREG_MISC1_FORCE | ( np->duplex ? 0 : NVREG_MISC1_HD),
-+ base + NvRegMisc1);
-+ writel(readl(base + NvRegTransmitterStatus), base + NvRegTransmitterStatus);
-+ writel(NVREG_PFF_ALWAYS, base + NvRegPacketFilterFlags);
-+ writel(NVREG_OFFLOAD_NORMAL, base + NvRegOffloadConfig);
-+
-+ writel(readl(base + NvRegReceiverStatus), base + NvRegReceiverStatus);
-+ get_random_bytes(&i, sizeof(i));
-+ writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed);
-+ writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1);
-+ writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2);
-+ writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6);
-+ writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID,
-+ base + NvRegAdapterControl);
-+ writel(NVREG_UNKSETUP4_VAL, base + NvRegUnknownSetupReg4);
-+ writel(NVREG_WAKEUPFLAGS_VAL, base + NvRegWakeUpFlags);
-+
-+ /* 7) start packet processing */
-+ writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr);
-+ writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
-+ writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT),
-+ base + NvRegRingSizes);
-+
-+ i = readl(base + NvRegPowerState);
-+ if ( (i & NVREG_POWERSTATE_POWEREDUP) == 0) {
-+ writel(NVREG_POWERSTATE_POWEREDUP|i, base + NvRegPowerState);
-+ }
-+ pci_push(base);
-+ udelay(10);
-+ writel(readl(base + NvRegPowerState) | NVREG_POWERSTATE_VALID, base + NvRegPowerState);
-+ writel(NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl);
-+
-+
-+ writel(0, base + NvRegIrqMask);
-+ pci_push(base);
-+ writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
-+ pci_push(base);
-+ writel(NVREG_MIISTAT_MASK2, base + NvRegMIIStatus);
-+ writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
-+ pci_push(base);
-+
-+ ret = request_irq(dev->irq, &nic_irq, SA_SHIRQ, dev->name, dev);
-+ if (ret)
-+ goto out_drain;
-+
-+ writel(np->irqmask, base + NvRegIrqMask);
-+
-+ spin_lock_irq(&np->lock);
-+ writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
-+ writel(0, base + NvRegMulticastAddrB);
-+ writel(0, base + NvRegMulticastMaskA);
-+ writel(0, base + NvRegMulticastMaskB);
-+ writel(NVREG_PFF_ALWAYS|NVREG_PFF_MYADDR, base + NvRegPacketFilterFlags);
-+ start_rx(dev);
-+ start_tx(dev);
-+ netif_start_queue(dev);
-+ if (oom)
-+ mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
-+ if (!(mii_rw(dev, np->phyaddr, MII_BMSR, MII_READ) & BMSR_ANEGCOMPLETE)) {
-+ printk("%s: no link during initialization.\n", dev->name);
-+ netif_carrier_off(dev);
-+ }
-+
-+ spin_unlock_irq(&np->lock);
-+
-+ return 0;
-+out_drain:
-+ drain_ring(dev);
-+ return ret;
-+}
-+
-+static int close(struct net_device *dev)
-+{
-+ struct fe_priv *np = get_nvpriv(dev);
-+
-+ spin_lock_irq(&np->lock);
-+ np->in_shutdown = 1;
-+ spin_unlock_irq(&np->lock);
-+ synchronize_irq(dev->irq);
-+
-+ del_timer_sync(&np->oom_kick);
-+ del_timer_sync(&np->nic_poll);
-+
-+ netif_stop_queue(dev);
-+ spin_lock_irq(&np->lock);
-+ stop_tx(dev);
-+ stop_rx(dev);
-+ spin_unlock_irq(&np->lock);
-+
-+ free_irq(dev->irq, dev);
-+
-+ drain_ring(dev);
-+
-+ /* FIXME: power down nic */
-+
-+ return 0;
-+}
-+
-+static int __devinit probe_nic(struct pci_dev *pci_dev, const struct pci_device_id *id)
-+{
-+ struct net_device *dev;
-+ struct fe_priv *np;
-+ unsigned long addr;
-+ u8 *base;
-+ int err, i;
-+
-+ dev = alloc_etherdev(sizeof(struct fe_priv));
-+ np = get_nvpriv(dev);
-+ err = -ENOMEM;
-+ if (!dev)
-+ goto out;
-+
-+ np->pci_dev = pci_dev;
-+ spin_lock_init(&np->lock);
-+ SET_MODULE_OWNER(dev);
-+ SET_NETDEV_DEV(dev, &pci_dev->dev);
-+
-+ init_timer(&np->oom_kick);
-+ np->oom_kick.data = (unsigned long) dev;
-+ np->oom_kick.function = &do_rx_refill; /* timer handler */
-+ init_timer(&np->nic_poll);
-+ np->nic_poll.data = (unsigned long) dev;
-+ np->nic_poll.function = &do_nic_poll; /* timer handler */
-+
-+ err = pci_enable_device(pci_dev);
-+ if (err) {
-+ printk(KERN_INFO "forcedeth: pci_enable_dev failed: %d\n", err);
-+ goto out_free;
-+ }
-+
-+ pci_set_master(pci_dev);
-+
-+ err = pci_request_regions(pci_dev, dev->name);
-+ if (err < 0)
-+ goto out_disable;
-+
-+ err = -EINVAL;
-+ addr = 0;
-+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-+ dprintk(KERN_DEBUG "forcedeth: resource %d start %p len %ld flags 0x%08lx.\n",
-+ i, (void*)pci_resource_start(pci_dev, i),
-+ pci_resource_len(pci_dev, i),
-+ pci_resource_flags(pci_dev, i));
-+ if (pci_resource_flags(pci_dev, i) & IORESOURCE_MEM &&
-+ pci_resource_len(pci_dev, i) >= NV_PCI_REGSZ) {
-+ addr = pci_resource_start(pci_dev, i);
-+ break;
-+ }
-+ }
-+ if (i == DEVICE_COUNT_RESOURCE) {
-+ printk(KERN_INFO "forcedeth: Couldn't find register window.\n");
-+ goto out_relreg;
-+ }
-+
-+ err = -ENOMEM;
-+ dev->base_addr = (unsigned long) ioremap(addr, NV_PCI_REGSZ);
-+ if (!dev->base_addr)
-+ goto out_disable;
-+ dev->irq = pci_dev->irq;
-+ np->rx_ring = pci_alloc_consistent(pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING),
-+ &np->ring_addr);
-+ if (!np->rx_ring)
-+ goto out_unmap;
-+ np->tx_ring = &np->rx_ring[RX_RING];
-+
-+ dev->open = open;
-+ dev->stop = close;
-+ dev->hard_start_xmit = start_xmit;
-+ dev->get_stats = get_stats;
-+ dev->change_mtu = change_mtu;
-+ dev->set_multicast_list = set_multicast;
-+ dev->do_ioctl = nic_ioctl;
-+ dev->tx_timeout = tx_timeout;
-+ dev->watchdog_timeo = NV_WATCHDOG_TIMEO;
-+
-+ pci_set_drvdata(pci_dev, dev);
-+
-+ err = register_netdev(dev);
-+ if (err) {
-+ printk(KERN_INFO "forcedeth: unable to register netdev: %d\n", err);
-+ goto out_freering;
-+ }
-+
-+ printk(KERN_INFO "%s: forcedeth.c: subsystem: %05x:%04x\n",
-+ dev->name, pci_dev->subsystem_vendor, pci_dev->subsystem_device);
-+
-+
-+ /* read the mac address */
-+ base = get_hwbase(dev);
-+ np->orig_mac[0] = readl(base + NvRegMacAddrA);
-+ np->orig_mac[1] = readl(base + NvRegMacAddrB);
-+
-+ dev->dev_addr[0] = (np->orig_mac[1] >> 8) & 0xff;
-+ dev->dev_addr[1] = (np->orig_mac[1] >> 0) & 0xff;
-+ dev->dev_addr[2] = (np->orig_mac[0] >> 24) & 0xff;
-+ dev->dev_addr[3] = (np->orig_mac[0] >> 16) & 0xff;
-+ dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff;
-+ dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff;
-+
-+ if (!is_valid_ether_addr(dev->dev_addr)) {
-+ /*
-+ * Bad mac address. At least one bios sets the mac address
-+ * to 01:23:45:67:89:ab
-+ */
-+ printk(KERN_ERR "%s: Invalid Mac address detected: %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
-+ dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-+ dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-+ printk(KERN_ERR "Please complain to your hardware vendor. Switching to a random MAC.\n");
-+ dev->dev_addr[0] = 0x00;
-+ dev->dev_addr[1] = 0x00;
-+ dev->dev_addr[2] = 0x6c;
-+ get_random_bytes(&dev->dev_addr[3], 3);
-+ }
-+
-+ dprintk(KERN_DEBUG "%s: MAC Address %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
-+ dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-+ dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-+
-+ np->tx_flags = cpu_to_le16(NV_TX_LASTPACKET|NV_TX_LASTPACKET1|NV_TX_VALID);
-+ if (id->driver_data & DEV_NEED_LASTPACKET1)
-+ np->tx_flags |= cpu_to_le16(NV_TX_LASTPACKET1);
-+ if (id->driver_data & DEV_IRQMASK_1)
-+ np->irqmask = NVREG_IRQMASK_WANTED_1;
-+ if (id->driver_data & DEV_IRQMASK_2)
-+ np->irqmask = NVREG_IRQMASK_WANTED_2;
-+
-+ return 0;
-+
-+out_freering:
-+ pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING),
-+ np->rx_ring, np->ring_addr);
-+out_unmap:
-+ iounmap(get_hwbase(dev));
-+out_relreg:
-+ pci_release_regions(pci_dev);
-+out_disable:
-+ pci_disable_device(pci_dev);
-+out_free:
-+ kfree(dev);
-+ pci_set_drvdata(pci_dev, NULL);
-+out:
-+ return err;
-+}
-+
-+static void __devexit remove_nic(struct pci_dev *pci_dev)
-+{
-+ struct net_device *dev = pci_get_drvdata(pci_dev);
-+ struct fe_priv *np = get_nvpriv(dev);
-+ u8 *base = get_hwbase(dev);
-+
-+ unregister_netdev(dev);
-+
-+ /* special op: write back the misordered MAC address - otherwise
-+ * the next probe_nic would see a wrong address.
-+ */
-+ writel(np->orig_mac[0], base + NvRegMacAddrA);
-+ writel(np->orig_mac[1], base + NvRegMacAddrB);
-+
-+ /* free all structures */
-+ pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (RX_RING + TX_RING), np->rx_ring, np->ring_addr);
-+ iounmap(get_hwbase(dev));
-+ pci_release_regions(pci_dev);
-+ pci_disable_device(pci_dev);
-+ kfree(dev);
-+ pci_set_drvdata(pci_dev, NULL);
-+}
-+
-+static struct pci_device_id pci_tbl[] = {
-+ { /* nForce Ethernet Controller */
-+ .vendor = PCI_VENDOR_ID_NVIDIA,
-+ .device = 0x1C3,
-+ .subvendor = PCI_ANY_ID,
-+ .subdevice = PCI_ANY_ID,
-+ .driver_data = DEV_IRQMASK_1,
-+ },
-+ { /* nForce2 Ethernet Controller */
-+ .vendor = PCI_VENDOR_ID_NVIDIA,
-+ .device = 0x0066,
-+ .subvendor = PCI_ANY_ID,
-+ .subdevice = PCI_ANY_ID,
-+ .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2,
-+ },
-+ { /* nForce3 Ethernet Controller */
-+ .vendor = PCI_VENDOR_ID_NVIDIA,
-+ .device = 0x00D6,
-+ .subvendor = PCI_ANY_ID,
-+ .subdevice = PCI_ANY_ID,
-+ .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2,
-+ },
-+ {0,},
-+};
-+
-+static struct pci_driver driver = {
-+ .name = "forcedeth",
-+ .id_table = pci_tbl,
-+ .probe = probe_nic,
-+ .remove = __devexit_p(remove_nic),
-+};
-+
-+
-+static int __init init_nic(void)
-+{
-+ printk(KERN_INFO "forcedeth.c: Reverse Engineered nForce ethernet driver. Version %s.\n", FORCEDETH_VERSION);
-+ return pci_module_init(&driver);
-+}
-+
-+static void __exit exit_nic(void)
-+{
-+ pci_unregister_driver(&driver);
-+}
-+
-+MODULE_PARM(max_interrupt_work, "i");
-+MODULE_PARM_DESC(max_interrupt_work, "forcedeth maximum events handled per interrupt");
-+
-+MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>");
-+MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver");
-+MODULE_LICENSE("GPL");
-+
-+MODULE_DEVICE_TABLE(pci, pci_tbl);
-+
-+module_init(init_nic);
-+module_exit(exit_nic);
---- linux-2.6.0/drivers/net/gt96100eth.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/gt96100eth.c 2003-12-28 23:21:01.000000000 -0800
-@@ -729,10 +729,12 @@ gt96100_probe1(int port_num)
- return -EBUSY;
- }
-
-- dev = init_etherdev(0, sizeof(struct gt96100_private));
-+ dev = alloc_etherdev(sizeof(struct gt96100_private));
-+ if (!dev)
-+ goto out;
- gtif->dev = dev;
-
-- /* private struct aligned and zeroed by init_etherdev */
-+ /* private struct aligned and zeroed by alloc_etherdev */
- /* Fill in the 'dev' fields. */
- dev->base_addr = gtif->iobase;
- dev->irq = gtif->irq;
-@@ -740,7 +742,7 @@ gt96100_probe1(int port_num)
- if ((retval = parse_mac_addr(dev, gtif->mac_str))) {
- err("%s: MAC address parse failed\n", __FUNCTION__);
- retval = -EINVAL;
-- goto free_region;
-+ goto out1;
- }
-
- gp = dev->priv;
-@@ -768,7 +770,7 @@ gt96100_probe1(int port_num)
- &gp->rx_ring_dma);
- if (gp->rx_ring == NULL) {
- retval = -ENOMEM;
-- goto free_region;
-+ goto out1;
- }
-
- gp->tx_ring = (gt96100_td_t *)(gp->rx_ring + RX_RING_SIZE);
-@@ -781,11 +783,8 @@ gt96100_probe1(int port_num)
- gp->rx_buff = dmaalloc(PKT_BUF_SZ*RX_RING_SIZE,
- &gp->rx_buff_dma);
- if (gp->rx_buff == NULL) {
-- dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE
-- + sizeof(gt96100_td_t) * TX_RING_SIZE,
-- gp->rx_ring);
- retval = -ENOMEM;
-- goto free_region;
-+ goto out2;
- }
- }
-
-@@ -797,12 +796,8 @@ gt96100_probe1(int port_num)
- gp->hash_table = (char*)dmaalloc(RX_HASH_TABLE_SIZE,
- &gp->hash_table_dma);
- if (gp->hash_table == NULL) {
-- dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE
-- + sizeof(gt96100_td_t) * TX_RING_SIZE,
-- gp->rx_ring);
-- dmafree(PKT_BUF_SZ*RX_RING_SIZE, gp->rx_buff);
- retval = -ENOMEM;
-- goto free_region;
-+ goto out3;
- }
- }
-
-@@ -819,14 +814,23 @@ gt96100_probe1(int port_num)
- dev->tx_timeout = gt96100_tx_timeout;
- dev->watchdog_timeo = GT96100ETH_TX_TIMEOUT;
-
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
-+ retval = register_netdev(dev);
-+ if (retval)
-+ goto out4;
- return 0;
-
-- free_region:
-- release_region(gtif->iobase, GT96100_ETH_IO_SIZE);
-- unregister_netdev(dev);
-+out4:
-+ dmafree(RX_HASH_TABLE_SIZE, gp->hash_table_dma);
-+out3:
-+ dmafree(PKT_BUF_SZ*RX_RING_SIZE, gp->rx_buff);
-+out2:
-+ dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE
-+ + sizeof(gt96100_td_t) * TX_RING_SIZE,
-+ gp->rx_ring);
-+out1:
- free_netdev (dev);
-+out:
-+ release_region(gtif->iobase, GT96100_ETH_IO_SIZE);
- err("%s failed. Returns %d\n", __FUNCTION__, retval);
- return retval;
- }
-@@ -1573,9 +1577,14 @@ static void gt96100_cleanup_module(void)
- if (gtif->dev != NULL) {
- struct gt96100_private *gp =
- (struct gt96100_private *)gtif->dev->priv;
-- release_region(gtif->iobase, gp->io_size);
- unregister_netdev(gtif->dev);
-- free_netdev (gtif->dev);
-+ dmafree(RX_HASH_TABLE_SIZE, gp->hash_table_dma);
-+ dmafree(PKT_BUF_SZ*RX_RING_SIZE, gp->rx_buff);
-+ dmafree(sizeof(gt96100_rd_t) * RX_RING_SIZE
-+ + sizeof(gt96100_td_t) * TX_RING_SIZE,
-+ gp->rx_ring);
-+ free_netdev(gtif->dev);
-+ release_region(gtif->iobase, gp->io_size);
- }
- }
- }
---- linux-2.6.0/drivers/net/hamradio/baycom_epp.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/hamradio/baycom_epp.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1275,7 +1275,7 @@ static int baycom_ioctl(struct net_devic
- * If dev->base_addr == 2, allocate space for the device and return success
- * (detachable devices only).
- */
--static int baycom_probe(struct net_device *dev)
-+static void baycom_probe(struct net_device *dev)
- {
- static char ax25_bcast[AX25_ADDR_LEN] = {
- 'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1
-@@ -1288,9 +1288,6 @@ static int baycom_probe(struct net_devic
- };
- struct baycom_state *bc;
-
-- if (!dev)
-- return -ENXIO;
-- baycom_paranoia_check(dev, "baycom_probe", -ENXIO);
- /*
- * not a real probe! only initialize data structures
- */
-@@ -1332,8 +1329,6 @@ static int baycom_probe(struct net_devic
-
- /* New style flags */
- dev->flags = 0;
--
-- return 0;
- }
-
- /* --------------------------------------------------------------------- */
-@@ -1368,7 +1363,7 @@ static void __init baycom_epp_dev_setup(
- /*
- * initialize part of the device struct
- */
-- dev->init = baycom_probe;
-+ baycom_probe(dev);
- }
-
- static int __init init_baycomepp(void)
-@@ -1401,7 +1396,7 @@ static int __init init_baycomepp(void)
-
- if (register_netdev(dev)) {
- printk(KERN_WARNING "%s: cannot register net device %s\n", bc_drvname, dev->name);
-- kfree(dev);
-+ free_netdev(dev);
- break;
- }
- if (set_hw && baycom_setmode(dev->priv, mode[i]))
---- linux-2.6.0/drivers/net/hamradio/bpqether.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/hamradio/bpqether.c 2003-12-28 23:21:01.000000000 -0800
-@@ -547,7 +547,7 @@ static int bpq_new_device(struct net_dev
-
- error:
- dev_put(edev);
-- kfree(ndev);
-+ free_netdev(ndev);
- return err;
-
- }
---- linux-2.6.0/drivers/net/hamradio/dmascc.c 2003-06-14 12:18:08.000000000 -0700
-+++ 25/drivers/net/hamradio/dmascc.c 2003-12-28 23:21:01.000000000 -0800
-@@ -242,7 +242,7 @@ struct scc_priv {
- struct scc_info {
- int irq_used;
- int twin_serial_cfg;
-- struct net_device dev[2];
-+ struct net_device *dev[2];
- struct scc_priv priv[2];
- struct scc_info *next;
- spinlock_t register_lock; /* Per device register lock */
-@@ -310,18 +310,19 @@ static void __exit dmascc_exit(void) {
- info = first;
-
- /* Unregister devices */
-- for (i = 0; i < 2; i++) {
-- if (info->dev[i].name)
-- unregister_netdev(&info->dev[i]);
-- }
-+ for (i = 0; i < 2; i++)
-+ unregister_netdev(info->dev[i]);
-
- /* Reset board */
- if (info->priv[0].type == TYPE_TWIN)
-- outb(0, info->dev[0].base_addr + TWIN_SERIAL_CFG);
-+ outb(0, info->dev[0]->base_addr + TWIN_SERIAL_CFG);
- write_scc(&info->priv[0], R9, FHWRES);
-- release_region(info->dev[0].base_addr,
-+ release_region(info->dev[0]->base_addr,
- hw[info->priv[0].type].io_size);
-
-+ for (i = 0; i < 2; i++)
-+ free_netdev(info->dev[i]);
-+
- /* Free memory */
- first = info->next;
- kfree(info);
-@@ -443,156 +444,193 @@ static int __init dmascc_init(void) {
- module_init(dmascc_init);
- module_exit(dmascc_exit);
-
-+static void dev_setup(struct net_device *dev)
-+{
-+ dev->type = ARPHRD_AX25;
-+ dev->hard_header_len = 73;
-+ dev->mtu = 1500;
-+ dev->addr_len = 7;
-+ dev->tx_queue_len = 64;
-+ memcpy(dev->broadcast, ax25_broadcast, 7);
-+ memcpy(dev->dev_addr, ax25_test, 7);
-+}
-+
-+static int __init setup_adapter(int card_base, int type, int n)
-+{
-+ int i, irq, chip;
-+ struct scc_info *info;
-+ struct net_device *dev;
-+ struct scc_priv *priv;
-+ unsigned long time;
-+ unsigned int irqs;
-+ int tmr_base = card_base + hw[type].tmr_offset;
-+ int scc_base = card_base + hw[type].scc_offset;
-+ char *chipnames[] = CHIPNAMES;
-+
-+ /* Allocate memory */
-+ info = kmalloc(sizeof(struct scc_info), GFP_KERNEL | GFP_DMA);
-+ if (!info) {
-+ printk(KERN_ERR "dmascc: "
-+ "could not allocate memory for %s at %#3x\n",
-+ hw[type].name, card_base);
-+ goto out;
-+ }
-
--int __init setup_adapter(int card_base, int type, int n) {
-- int i, irq, chip;
-- struct scc_info *info;
-- struct net_device *dev;
-- struct scc_priv *priv;
-- unsigned long time;
-- unsigned int irqs;
-- int tmr_base = card_base + hw[type].tmr_offset;
-- int scc_base = card_base + hw[type].scc_offset;
-- char *chipnames[] = CHIPNAMES;
--
-- /* Allocate memory */
-- info = kmalloc(sizeof(struct scc_info), GFP_KERNEL | GFP_DMA);
-- if (!info) {
-- printk(KERN_ERR "dmascc: could not allocate memory for %s at %#3x\n",
-- hw[type].name, card_base);
-- return -1;
-- }
--
-- /* Initialize what is necessary for write_scc and write_scc_data */
-- memset(info, 0, sizeof(struct scc_info));
-- spin_lock_init(&info->register_lock);
--
-- priv = &info->priv[0];
-- priv->type = type;
-- priv->card_base = card_base;
-- priv->scc_cmd = scc_base + SCCA_CMD;
-- priv->scc_data = scc_base + SCCA_DATA;
-- priv->register_lock = &info->register_lock;
--
-- /* Reset SCC */
-- write_scc(priv, R9, FHWRES | MIE | NV);
--
-- /* Determine type of chip by enabling SDLC/HDLC enhancements */
-- write_scc(priv, R15, SHDLCE);
-- if (!read_scc(priv, R15)) {
-- /* WR7' not present. This is an ordinary Z8530 SCC. */
-- chip = Z8530;
-- } else {
-- /* Put one character in TX FIFO */
-- write_scc_data(priv, 0, 0);
-- if (read_scc(priv, R0) & Tx_BUF_EMP) {
-- /* TX FIFO not full. This is a Z85230 ESCC with a 4-byte FIFO. */
-- chip = Z85230;
-- } else {
-- /* TX FIFO full. This is a Z85C30 SCC with a 1-byte FIFO. */
-- chip = Z85C30;
-- }
-- }
-- write_scc(priv, R15, 0);
-+ /* Initialize what is necessary for write_scc and write_scc_data */
-+ memset(info, 0, sizeof(struct scc_info));
-
-- /* Start IRQ auto-detection */
-- irqs = probe_irq_on();
-+ info->dev[0] = alloc_netdev(0, "", dev_setup);
-+ if (!info->dev[0]) {
-+ printk(KERN_ERR "dmascc: "
-+ "could not allocate memory for %s at %#3x\n",
-+ hw[type].name, card_base);
-+ goto out1;
-+ }
-
-- /* Enable interrupts */
-- if (type == TYPE_TWIN) {
-- outb(0, card_base + TWIN_DMA_CFG);
-- inb(card_base + TWIN_CLR_TMR1);
-- inb(card_base + TWIN_CLR_TMR2);
-- outb((info->twin_serial_cfg = TWIN_EI), card_base + TWIN_SERIAL_CFG);
-- } else {
-- write_scc(priv, R15, CTSIE);
-- write_scc(priv, R0, RES_EXT_INT);
-- write_scc(priv, R1, EXT_INT_ENAB);
-- }
--
-- /* Start timer */
-- outb(1, tmr_base + TMR_CNT1);
-- outb(0, tmr_base + TMR_CNT1);
--
-- /* Wait and detect IRQ */
-- time = jiffies; while (jiffies - time < 2 + HZ / TMR_0_HZ);
-- irq = probe_irq_off(irqs);
--
-- /* Clear pending interrupt, disable interrupts */
-- if (type == TYPE_TWIN) {
-- inb(card_base + TWIN_CLR_TMR1);
-- } else {
-- write_scc(priv, R1, 0);
-- write_scc(priv, R15, 0);
-- write_scc(priv, R0, RES_EXT_INT);
-- }
-+ info->dev[1] = alloc_netdev(0, "", dev_setup);
-+ if (!info->dev[1]) {
-+ printk(KERN_ERR "dmascc: "
-+ "could not allocate memory for %s at %#3x\n",
-+ hw[type].name, card_base);
-+ goto out2;
-+ }
-+ spin_lock_init(&info->register_lock);
-
-- if (irq <= 0) {
-- printk(KERN_ERR "dmascc: could not find irq of %s at %#3x (irq=%d)\n",
-- hw[type].name, card_base, irq);
-- kfree(info);
-- return -1;
-- }
-+ priv = &info->priv[0];
-+ priv->type = type;
-+ priv->card_base = card_base;
-+ priv->scc_cmd = scc_base + SCCA_CMD;
-+ priv->scc_data = scc_base + SCCA_DATA;
-+ priv->register_lock = &info->register_lock;
-+
-+ /* Reset SCC */
-+ write_scc(priv, R9, FHWRES | MIE | NV);
-+
-+ /* Determine type of chip by enabling SDLC/HDLC enhancements */
-+ write_scc(priv, R15, SHDLCE);
-+ if (!read_scc(priv, R15)) {
-+ /* WR7' not present. This is an ordinary Z8530 SCC. */
-+ chip = Z8530;
-+ } else {
-+ /* Put one character in TX FIFO */
-+ write_scc_data(priv, 0, 0);
-+ if (read_scc(priv, R0) & Tx_BUF_EMP) {
-+ /* TX FIFO not full. This is a Z85230 ESCC with a 4-byte FIFO. */
-+ chip = Z85230;
-+ } else {
-+ /* TX FIFO full. This is a Z85C30 SCC with a 1-byte FIFO. */
-+ chip = Z85C30;
-+ }
-+ }
-+ write_scc(priv, R15, 0);
-
-- /* Set up data structures */
-- for (i = 0; i < 2; i++) {
-- dev = &info->dev[i];
-- priv = &info->priv[i];
-- priv->type = type;
-- priv->chip = chip;
-- priv->dev = dev;
-- priv->info = info;
-- priv->channel = i;
-- spin_lock_init(&priv->ring_lock);
-- priv->register_lock = &info->register_lock;
-- priv->card_base = card_base;
-- priv->scc_cmd = scc_base + (i ? SCCB_CMD : SCCA_CMD);
-- priv->scc_data = scc_base + (i ? SCCB_DATA : SCCA_DATA);
-- priv->tmr_cnt = tmr_base + (i ? TMR_CNT2 : TMR_CNT1);
-- priv->tmr_ctrl = tmr_base + TMR_CTRL;
-- priv->tmr_mode = i ? 0xb0 : 0x70;
-- priv->param.pclk_hz = hw[type].pclk_hz;
-- priv->param.brg_tc = -1;
-- priv->param.clocks = TCTRxCP | RCRTxCP;
-- priv->param.persist = 256;
-- priv->param.dma = -1;
-- INIT_WORK(&priv->rx_work, rx_bh, priv);
-- dev->priv = priv;
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
-- if (sizeof(dev->name) == sizeof(char *)) dev->name = priv->name;
--#endif
-- sprintf(dev->name, "dmascc%i", 2*n+i);
-- SET_MODULE_OWNER(dev);
-- dev->base_addr = card_base;
-- dev->irq = irq;
-- dev->open = scc_open;
-- dev->stop = scc_close;
-- dev->do_ioctl = scc_ioctl;
-- dev->hard_start_xmit = scc_send_packet;
-- dev->get_stats = scc_get_stats;
-- dev->hard_header = ax25_encapsulate;
-- dev->rebuild_header = ax25_rebuild_header;
-- dev->set_mac_address = scc_set_mac_address;
-- dev->type = ARPHRD_AX25;
-- dev->hard_header_len = 73;
-- dev->mtu = 1500;
-- dev->addr_len = 7;
-- dev->tx_queue_len = 64;
-- memcpy(dev->broadcast, ax25_broadcast, 7);
-- memcpy(dev->dev_addr, ax25_test, 7);
-- rtnl_lock();
-- if (register_netdevice(dev)) {
-- printk(KERN_ERR "dmascc: could not register %s\n", dev->name);
-- }
-- rtnl_unlock();
-- }
-+ /* Start IRQ auto-detection */
-+ irqs = probe_irq_on();
-
-+ /* Enable interrupts */
-+ if (type == TYPE_TWIN) {
-+ outb(0, card_base + TWIN_DMA_CFG);
-+ inb(card_base + TWIN_CLR_TMR1);
-+ inb(card_base + TWIN_CLR_TMR2);
-+ info->twin_serial_cfg = TWIN_EI;
-+ outb(info->twin_serial_cfg, card_base + TWIN_SERIAL_CFG);
-+ } else {
-+ write_scc(priv, R15, CTSIE);
-+ write_scc(priv, R0, RES_EXT_INT);
-+ write_scc(priv, R1, EXT_INT_ENAB);
-+ }
-
-- info->next = first;
-- first = info;
-- printk(KERN_INFO "dmascc: found %s (%s) at %#3x, irq %d\n", hw[type].name,
-- chipnames[chip], card_base, irq);
-- return 0;
-+ /* Start timer */
-+ outb(1, tmr_base + TMR_CNT1);
-+ outb(0, tmr_base + TMR_CNT1);
-+
-+ /* Wait and detect IRQ */
-+ time = jiffies; while (jiffies - time < 2 + HZ / TMR_0_HZ);
-+ irq = probe_irq_off(irqs);
-+
-+ /* Clear pending interrupt, disable interrupts */
-+ if (type == TYPE_TWIN) {
-+ inb(card_base + TWIN_CLR_TMR1);
-+ } else {
-+ write_scc(priv, R1, 0);
-+ write_scc(priv, R15, 0);
-+ write_scc(priv, R0, RES_EXT_INT);
-+ }
-+
-+ if (irq <= 0) {
-+ printk(KERN_ERR "dmascc: could not find irq of %s at %#3x (irq=%d)\n",
-+ hw[type].name, card_base, irq);
-+ goto out3;
-+ }
-+
-+ /* Set up data structures */
-+ for (i = 0; i < 2; i++) {
-+ dev = info->dev[i];
-+ priv = &info->priv[i];
-+ priv->type = type;
-+ priv->chip = chip;
-+ priv->dev = dev;
-+ priv->info = info;
-+ priv->channel = i;
-+ spin_lock_init(&priv->ring_lock);
-+ priv->register_lock = &info->register_lock;
-+ priv->card_base = card_base;
-+ priv->scc_cmd = scc_base + (i ? SCCB_CMD : SCCA_CMD);
-+ priv->scc_data = scc_base + (i ? SCCB_DATA : SCCA_DATA);
-+ priv->tmr_cnt = tmr_base + (i ? TMR_CNT2 : TMR_CNT1);
-+ priv->tmr_ctrl = tmr_base + TMR_CTRL;
-+ priv->tmr_mode = i ? 0xb0 : 0x70;
-+ priv->param.pclk_hz = hw[type].pclk_hz;
-+ priv->param.brg_tc = -1;
-+ priv->param.clocks = TCTRxCP | RCRTxCP;
-+ priv->param.persist = 256;
-+ priv->param.dma = -1;
-+ INIT_WORK(&priv->rx_work, rx_bh, priv);
-+ dev->priv = priv;
-+ sprintf(dev->name, "dmascc%i", 2*n+i);
-+ SET_MODULE_OWNER(dev);
-+ dev->base_addr = card_base;
-+ dev->irq = irq;
-+ dev->open = scc_open;
-+ dev->stop = scc_close;
-+ dev->do_ioctl = scc_ioctl;
-+ dev->hard_start_xmit = scc_send_packet;
-+ dev->get_stats = scc_get_stats;
-+ dev->hard_header = ax25_encapsulate;
-+ dev->rebuild_header = ax25_rebuild_header;
-+ dev->set_mac_address = scc_set_mac_address;
-+ }
-+ if (register_netdev(info->dev[0])) {
-+ printk(KERN_ERR "dmascc: could not register %s\n",
-+ info->dev[0]->name);
-+ goto out3;
-+ }
-+ if (register_netdev(info->dev[1])) {
-+ printk(KERN_ERR "dmascc: could not register %s\n",
-+ info->dev[1]->name);
-+ goto out4;
-+ }
-+
-+
-+ info->next = first;
-+ first = info;
-+ printk(KERN_INFO "dmascc: found %s (%s) at %#3x, irq %d\n", hw[type].name,
-+ chipnames[chip], card_base, irq);
-+ return 0;
-+
-+out4:
-+ unregister_netdev(info->dev[0]);
-+out3:
-+ if (info->priv[0].type == TYPE_TWIN)
-+ outb(0, info->dev[0]->base_addr + TWIN_SERIAL_CFG);
-+ write_scc(&info->priv[0], R9, FHWRES);
-+ free_netdev(info->dev[1]);
-+out2:
-+ free_netdev(info->dev[0]);
-+out1:
-+ kfree(info);
-+out:
-+ return -1;
- }
-
-
---- linux-2.6.0/drivers/net/hamradio/hdlcdrv.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/hamradio/hdlcdrv.c 2003-12-28 23:21:01.000000000 -0800
-@@ -832,7 +832,7 @@ struct net_device *hdlcdrv_register(cons
- if (err < 0) {
- printk(KERN_WARNING "hdlcdrv: cannot register net "
- "device %s\n", dev->name);
-- kfree(dev);
-+ free_netdev(dev);
- dev = ERR_PTR(err);
- }
- return dev;
---- linux-2.6.0/drivers/net/hamradio/scc.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/hamradio/scc.c 2003-12-28 23:22:33.000000000 -0800
-@@ -1196,11 +1196,7 @@ static void t_tail(unsigned long channel
- if (scc->stat.tx_state == TXS_TIMEOUT) /* we had a timeout? */
- {
- scc->stat.tx_state = TXS_WAIT;
--
-- if (scc->kiss.mintime != TIMER_OFF) /* try it again */
-- scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
-- else
-- scc_start_tx_timer(scc, t_dwait, 0);
-+ scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
- return;
- }
-
-@@ -1274,8 +1270,7 @@ static void t_idle(unsigned long channel
- del_timer(&scc->tx_wdog);
-
- scc_key_trx(scc, TX_OFF);
--
-- if (scc->kiss.mintime != TIMER_OFF)
-+ if(scc->kiss.mintime)
- scc_start_tx_timer(scc, t_dwait, scc->kiss.mintime*100);
- scc->stat.tx_state = TXS_WAIT;
- }
---- linux-2.6.0/drivers/net/hamradio/yam.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/hamradio/yam.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1192,7 +1192,7 @@ static void __exit yam_cleanup_driver(vo
- struct net_device *dev = yam_devs[i];
- if (dev) {
- unregister_netdev(dev);
-- kfree(dev);
-+ free_netdev(dev);
- }
- }
-
---- linux-2.6.0/drivers/net/hp100.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/hp100.c 2003-12-28 23:21:01.000000000 -0800
-@@ -118,8 +118,6 @@
- #include <asm/bitops.h>
- #include <asm/io.h>
-
--typedef struct net_device_stats hp100_stats_t;
--
- #include "hp100.h"
-
- /*
-@@ -130,23 +128,8 @@ typedef struct net_device_stats hp100_st
- #define HP100_BUS_EISA 1
- #define HP100_BUS_PCI 2
-
--#ifndef PCI_DEVICE_ID_HP_J2585B
--#define PCI_DEVICE_ID_HP_J2585B 0x1031
--#endif
--#ifndef PCI_VENDOR_ID_COMPEX
--#define PCI_VENDOR_ID_COMPEX 0x11f6
--#endif
--#ifndef PCI_DEVICE_ID_COMPEX_ENET100VG4
--#define PCI_DEVICE_ID_COMPEX_ENET100VG4 0x0112
--#endif
--#ifndef PCI_VENDOR_ID_COMPEX2
--#define PCI_VENDOR_ID_COMPEX2 0x101a
--#endif
--#ifndef PCI_DEVICE_ID_COMPEX2_100VG
--#define PCI_DEVICE_ID_COMPEX2_100VG 0x0005
--#endif
--
- #define HP100_REGION_SIZE 0x20 /* for ioports */
-+#define HP100_SIG_LEN 8 /* same as EISA_SIG_LEN */
-
- #define HP100_MAX_PACKET_SIZE (1536+4)
- #define HP100_MIN_PACKET_SIZE 60
-@@ -165,20 +148,9 @@ typedef struct net_device_stats hp100_st
- * structures
- */
-
--struct hp100_eisa_id {
-- u_int id;
-- const char *name;
-- u_char bus;
--};
--
--struct hp100_pci_id {
-- u_short vendor;
-- u_short device;
--};
--
- struct hp100_private {
-- struct hp100_eisa_id *id;
- spinlock_t lock;
-+ char id[HP100_SIG_LEN];
- u_short chip;
- u_short soft_model;
- u_int memory_size;
-@@ -196,7 +168,7 @@ struct hp100_private {
- u_char mac1_mode;
- u_char mac2_mode;
- u_char hash_bytes[8];
-- hp100_stats_t stats;
-+ struct net_device_stats stats;
-
- /* Rings for busmaster mode: */
- hp100_ring_t *rxrhead; /* Head (oldest) index into rxring */
-@@ -216,83 +188,36 @@ struct hp100_private {
- /*
- * variables
- */
--
--static struct hp100_eisa_id hp100_eisa_ids[] = {
--
-- /* 10/100 EISA card with revision A Cascade chip */
-- {0x80F1F022, "HP J2577 rev A", HP100_BUS_EISA},
--
-- /* 10/100 ISA card with revision A Cascade chip */
-- {0x50F1F022, "HP J2573 rev A", HP100_BUS_ISA},
--
-- /* 10 only EISA card with Cascade chip */
-- {0x2019F022, "HP 27248B", HP100_BUS_EISA},
--
-- /* 10/100 EISA card with Cascade chip */
-- {0x4019F022, "HP J2577", HP100_BUS_EISA},
--
-- /* 10/100 ISA card with Cascade chip */
-- {0x5019F022, "HP J2573", HP100_BUS_ISA},
--
-- /* 10/100 EISA card with AT&T chip */
-- {0x9019f022, "HP J2577", HP100_BUS_EISA },
--
-- /* 10/100 PCI card - old J2585A */
-- {0x1030103c, "HP J2585A", HP100_BUS_PCI},
--
-- /* 10/100 PCI card - new J2585B - master capable */
-- {0x1041103c, "HP J2585B", HP100_BUS_PCI},
--
-- /* 10 Mbit Combo Adapter */
-- {0x1042103c, "HP J2970", HP100_BUS_PCI},
--
-- /* 10 Mbit 10baseT Adapter */
-- {0x1040103c, "HP J2973", HP100_BUS_PCI},
--
-- /* 10/100 EISA card from Compex */
-- {0x0103180e, "ReadyLink ENET100-VG4", HP100_BUS_EISA},
--
-- /* 10/100 EISA card from Compex - FreedomLine (sq5bpf) */
-- /* Note: plhbrod@mbox.vol.cz reported that same ID have ISA */
-- /* version of adapter, too... */
-- {0x0104180e, "FreedomLine 100/VG", HP100_BUS_EISA},
--
-- /* 10/100 PCI card from Compex - FreedomLine
-- *
-- * I think this card doesn't like aic7178 scsi controller, but
-- * I haven't tested this much. It works fine on diskless machines.
-- * Jacek Lipkowski <sq5bpf@acid.ch.pw.edu.pl>
-- */
-- {0x021211f6, "FreedomLine 100/VG", HP100_BUS_PCI},
--
-- /* 10/100 PCI card from Compex (J2585A compatible) */
-- {0x011211f6, "ReadyLink ENET100-VG4", HP100_BUS_PCI},
--
-- /* 10/100 PCI card from KTI */
-- {0x40008e2e, "KTI DP-200", HP100_BUS_PCI }
-+static const char *hp100_isa_tbl[] = {
-+ "HWPF150", /* HP J2573 rev A */
-+ "HWP1950", /* HP J2573 */
- };
-
--#define HP100_EISA_IDS_SIZE (sizeof(hp100_eisa_ids)/sizeof(struct hp100_eisa_id))
--
--#ifdef CONFIG_PCI
--static struct hp100_pci_id hp100_pci_ids[] = {
-- {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585A},
-- {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585B},
-- {PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_ENET100VG4},
-- {PCI_VENDOR_ID_COMPEX2, PCI_DEVICE_ID_COMPEX2_100VG}
-+#ifdef CONFIG_EISA
-+static struct eisa_device_id hp100_eisa_tbl[] = {
-+ { "HWPF180" }, /* HP J2577 rev A */
-+ { "HWP1920" }, /* HP 27248B */
-+ { "HWP1940" }, /* HP J2577 */
-+ { "HWP1990" }, /* HP J2577 */
-+ { "CPX0301" }, /* ReadyLink ENET100-VG4 */
-+ { "CPX0401" }, /* FreedomLine 100/VG */
- };
-+MODULE_DEVICE_TABLE(eisa, hp100_eisa_tbl);
- #endif
-
--#define HP100_PCI_IDS_SIZE (sizeof(hp100_pci_ids)/sizeof(struct hp100_pci_id))
--
-+#ifdef CONFIG_PCI
- static struct pci_device_id hp100_pci_tbl[] = {
- {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585A, PCI_ANY_ID, PCI_ANY_ID,},
- {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585B, PCI_ANY_ID, PCI_ANY_ID,},
-+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2970A, PCI_ANY_ID, PCI_ANY_ID,},
-+ {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2973A, PCI_ANY_ID, PCI_ANY_ID,},
- {PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_ENET100VG4, PCI_ANY_ID, PCI_ANY_ID,},
- {PCI_VENDOR_ID_COMPEX2, PCI_DEVICE_ID_COMPEX2_100VG, PCI_ANY_ID, PCI_ANY_ID,},
-+/* {PCI_VENDOR_ID_KTI, PCI_DEVICE_ID_KTI_DP200, PCI_ANY_ID, PCI_ANY_ID }, */
- {} /* Terminating entry */
- };
- MODULE_DEVICE_TABLE(pci, hp100_pci_tbl);
-+#endif
-
- static int hp100_rx_ratio = HP100_DEFAULT_RX_RATIO;
- static int hp100_priority_tx = HP100_DEFAULT_PRIORITY_TX;
-@@ -316,7 +241,7 @@ static int hp100_start_xmit(struct sk_bu
- static int hp100_start_xmit_bm(struct sk_buff *skb,
- struct net_device *dev);
- static void hp100_rx(struct net_device *dev);
--static hp100_stats_t *hp100_get_stats(struct net_device *dev);
-+static struct net_device_stats *hp100_get_stats(struct net_device *dev);
- static void hp100_misc_interrupt(struct net_device *dev);
- static void hp100_update_stats(struct net_device *dev);
- static void hp100_clear_stats(struct hp100_private *lp, int ioaddr);
-@@ -370,196 +295,180 @@ static void wait(void)
- * since this could cause problems when the card is not installed.
- */
-
--int __init hp100_probe(struct net_device *dev)
-+/*
-+ * Read board id and convert to string.
-+ * Effectively same code as decode_eisa_sig
-+ */
-+static __init const char *hp100_read_id(int ioaddr)
- {
-- int base_addr = dev ? dev->base_addr : 0;
-- int ioaddr = 0;
-- int pci_start_index = 0;
-+ int i;
-+ static char str[HP100_SIG_LEN];
-+ unsigned char sig[4], sum;
-+ unsigned short rev;
-
--#ifdef HP100_DEBUG_B
-- hp100_outw(0x4200, TRACE);
-- printk("hp100: %s: probe\n", dev->name);
--#endif
-+ hp100_page(ID_MAC_ADDR);
-+ sum = 0;
-+ for (i = 0; i < 4; i++) {
-+ sig[i] = hp100_inb(BOARD_ID + i);
-+ sum += sig[i];
-+ }
-
-- if (base_addr > 0xff) { /* Check a single specified location. */
-- if (check_region(base_addr, HP100_REGION_SIZE))
-- return -EINVAL;
-- if (base_addr < 0x400)
-- return hp100_probe1(dev, base_addr, HP100_BUS_ISA,
-- NULL);
-- if (EISA_bus && base_addr >= 0x1c38 && ((base_addr - 0x1c38) & 0x3ff) == 0)
-- return hp100_probe1(dev, base_addr, HP100_BUS_EISA, NULL);
--#ifdef CONFIG_PCI
-- printk("hp100: %s: You must specify card # in i/o address parameter for PCI bus...", dev->name);
--#else
-- return -ENODEV;
--#endif
-- } else
--#ifdef CONFIG_PCI
-- if (base_addr > 0 && base_addr < 8 + 1)
-- pci_start_index = 0x100 | (base_addr - 1);
-- else
--#endif
-- if (base_addr != 0)
-- return -ENXIO;
-+ sum += hp100_inb(BOARD_ID + i);
-+ if (sum != 0xff)
-+ return NULL; /* bad checksum */
-
-- /* First: scan PCI bus(es) */
-+ str[0] = ((sig[0] >> 2) & 0x1f) + ('A' - 1);
-+ str[1] = (((sig[0] & 3) << 3) | (sig[1] >> 5)) + ('A' - 1);
-+ str[2] = (sig[1] & 0x1f) + ('A' - 1);
-+ rev = (sig[2] << 8) | sig[3];
-+ sprintf(str + 3, "%04X", rev);
-
--#ifdef CONFIG_PCI
-- {
-- int pci_index;
-- struct pci_dev *pci_dev = NULL;
-- int pci_id_index;
-- u_short pci_command;
--
--#ifdef HP100_DEBUG_PCI
-- printk("hp100: %s: PCI BIOS is present, checking for devices..\n", dev->name);
--#endif
-- pci_index = 0;
-- for (pci_id_index = 0; pci_id_index < HP100_PCI_IDS_SIZE;
-- pci_id_index++) {
-- while ((pci_dev = pci_find_device(hp100_pci_ids[pci_id_index].vendor,
-- hp100_pci_ids[pci_id_index].device,
-- pci_dev)) != NULL) {
-- if (pci_index < (pci_start_index & 7)) {
-- pci_index++;
-- continue;
-- }
-- if (pci_enable_device(pci_dev))
-- continue;
-- /* found... */
-- ioaddr = pci_resource_start(pci_dev, 0);
-- if (check_region(ioaddr, HP100_REGION_SIZE))
-- continue;
-- pci_read_config_word(pci_dev, PCI_COMMAND, &pci_command);
-- if (!(pci_command & PCI_COMMAND_IO)) {
--#ifdef HP100_DEBUG
-- printk("hp100: %s: PCI I/O Bit has not been set. Setting...\n", dev->name);
--#endif
-- pci_command |= PCI_COMMAND_IO;
-- pci_write_config_word(pci_dev, PCI_COMMAND, pci_command);
-- }
-- if (!(pci_command & PCI_COMMAND_MASTER)) {
--#ifdef HP100_DEBUG
-- printk("hp100: %s: PCI Master Bit has not been set. Setting...\n", dev->name);
--#endif
-- pci_command |= PCI_COMMAND_MASTER;
-- pci_write_config_word(pci_dev, PCI_COMMAND, pci_command);
-- }
--#ifdef HP100_DEBUG
-- printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr);
--#endif
-- if (hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pci_dev) == 0)
-- return 0;
-- }
-- }
-- }
-- if (pci_start_index > 0)
-- return -ENODEV;
--#endif /* CONFIG_PCI */
-+ return str;
-+}
-
-- /* Second: Probe all EISA possible port regions (if EISA bus present) */
-- for (ioaddr = 0x1c38; EISA_bus && ioaddr < 0x10000; ioaddr += 0x400) {
-- if (check_region(ioaddr, HP100_REGION_SIZE))
-- continue;
-- if (hp100_probe1(dev, ioaddr, HP100_BUS_EISA, NULL) == 0)
-- return 0;
-- }
-+static __init int hp100_isa_probe1(struct net_device *dev, int addr)
-+{
-+ const char *sig;
-+ int i;
-+
-+ if (!request_region(addr, HP100_REGION_SIZE, "hp100"))
-+ goto err;
-+
-+ sig = hp100_read_id(addr);
-+ release_region(addr, HP100_REGION_SIZE);
-+
-+ if (sig == NULL)
-+ goto err;
-+
-+ for (i = 0; i < ARRAY_SIZE(hp100_isa_tbl); i++) {
-+ if (!strcmp(hp100_isa_tbl[i], sig))
-+ break;
-
-- /* Third: Probe all ISA possible port regions */
-- for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x20) {
-- if (check_region(ioaddr, HP100_REGION_SIZE))
-- continue;
-- if (hp100_probe1(dev, ioaddr, HP100_BUS_ISA, NULL) == 0)
-- return 0;
- }
-
-+ if (i < ARRAY_SIZE(hp100_isa_tbl))
-+ return hp100_probe1(dev, addr, HP100_BUS_ISA, NULL);
-+ err:
- return -ENODEV;
-+
-+}
-+/*
-+ * Probe for ISA board.
-+ * EISA and PCI are handled by device infrastructure.
-+ */
-+
-+static int __init hp100_isa_probe(struct net_device *dev, int addr)
-+{
-+ int err = -ENODEV;
-+
-+ /* Probe for a specific ISA address */
-+ if (addr > 0xff && addr < 0x400)
-+ err = hp100_isa_probe1(dev, addr);
-+
-+ else if (addr != 0)
-+ err = -ENXIO;
-+
-+ else {
-+ /* Probe all ISA possible port regions */
-+ for (addr = 0x100; addr < 0x400; addr += 0x20) {
-+ err = hp100_isa_probe1(dev, addr);
-+ if (!err)
-+ break;
-+ }
-+ }
-+ return err;
-+}
-+
-+
-+struct net_device * __init hp100_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ SET_MODULE_OWNER(dev);
-+
-+#ifdef HP100_DEBUG_B
-+ hp100_outw(0x4200, TRACE);
-+ printk("hp100: %s: probe\n", dev->name);
-+#endif
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-+
-+ err = hp100_isa_probe(dev, dev->base_addr);
-+ if (err)
-+ goto out;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+ out1:
-+ release_region(dev->base_addr, HP100_REGION_SIZE);
-+ out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int __init hp100_probe1(struct net_device *dev, int ioaddr,
- u_char bus, struct pci_dev *pci_dev)
- {
- int i;
--
-- u_char uc, uc_1;
-- u_int eisa_id;
-+ int err = -ENODEV;
-+ const char *eid;
- u_int chip;
-+ u_char uc;
- u_int memory_size = 0, virt_memory_size = 0;
- u_short local_mode, lsw;
- short mem_mapped;
- unsigned long mem_ptr_phys;
- void **mem_ptr_virt;
- struct hp100_private *lp;
-- struct hp100_eisa_id *eid;
-
- #ifdef HP100_DEBUG_B
- hp100_outw(0x4201, TRACE);
- printk("hp100: %s: probe1\n", dev->name);
- #endif
-
-- if (dev == NULL) {
--#ifdef HP100_DEBUG
-- printk("hp100_probe1: %s: dev == NULL ?\n", dev->name);
--#endif
-- return -EIO;
-- }
-+ /* memory region for programmed i/o */
-+ if (!request_region(ioaddr, HP100_REGION_SIZE, "hp100"))
-+ goto out1;
-
-- if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE) {
-- return -ENODEV;
-- } else {
-- chip = hp100_inw(PAGING) & HP100_CHIPID_MASK;
-+ if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE)
-+ goto out2;
-+
-+ chip = hp100_inw(PAGING) & HP100_CHIPID_MASK;
- #ifdef HP100_DEBUG
-- if (chip == HP100_CHIPID_SHASTA)
-- printk("hp100: %s: Shasta Chip detected. (This is a pre 802.12 chip)\n", dev->name);
-- else if (chip == HP100_CHIPID_RAINIER)
-- printk("hp100: %s: Rainier Chip detected. (This is a pre 802.12 chip)\n", dev->name);
-- else if (chip == HP100_CHIPID_LASSEN)
-- printk("hp100: %s: Lassen Chip detected.\n", dev->name);
-- else
-- printk("hp100: %s: Warning: Unknown CASCADE chip (id=0x%.4x).\n", dev->name, chip);
-+ if (chip == HP100_CHIPID_SHASTA)
-+ printk("hp100: %s: Shasta Chip detected. (This is a pre 802.12 chip)\n", dev->name);
-+ else if (chip == HP100_CHIPID_RAINIER)
-+ printk("hp100: %s: Rainier Chip detected. (This is a pre 802.12 chip)\n", dev->name);
-+ else if (chip == HP100_CHIPID_LASSEN)
-+ printk("hp100: %s: Lassen Chip detected.\n", dev->name);
-+ else
-+ printk("hp100: %s: Warning: Unknown CASCADE chip (id=0x%.4x).\n", dev->name, chip);
- #endif
-- }
-
- dev->base_addr = ioaddr;
-
-- hp100_page(ID_MAC_ADDR);
-- for (i = uc = eisa_id = 0; i < 4; i++) {
-- eisa_id >>= 8;
-- uc_1 = hp100_inb(BOARD_ID + i);
-- eisa_id |= uc_1 << 24;
-- uc += uc_1;
-- }
-- uc += hp100_inb(BOARD_ID + 4);
--
-- if (uc != 0xff) { /* bad checksum? */
-- printk("hp100_probe: %s: bad EISA ID checksum at base port 0x%x\n", dev->name, ioaddr);
-- return -ENODEV;
-- }
--
-- for (i = 0; i < HP100_EISA_IDS_SIZE; i++)
-- if (hp100_eisa_ids[i].id == eisa_id)
-- break;
-- if (i >= HP100_EISA_IDS_SIZE) {
-- for (i = 0; i < HP100_EISA_IDS_SIZE; i++)
-- if ((hp100_eisa_ids[i].id & 0xf0ffffff) == (eisa_id & 0xf0ffffff))
-- break;
-- if (i >= HP100_EISA_IDS_SIZE) {
-- printk ("hp100_probe: %s: card at port 0x%x isn't known (id = 0x%x)\n", dev->name, ioaddr, eisa_id);
-- return -ENODEV;
-- }
-- }
-- eid = &hp100_eisa_ids[i];
-- if ((eid->id & 0x0f000000) < (eisa_id & 0x0f000000)) {
-- printk("hp100_probe: %s: newer version of card %s at port 0x%x - unsupported\n", dev->name, eid->name, ioaddr);
-- return -ENODEV;
-+ eid = hp100_read_id(ioaddr);
-+ if (eid == NULL) { /* bad checksum? */
-+ printk(KERN_WARNING "hp100_probe: bad ID checksum at base port 0x%x\n", ioaddr);
-+ goto out2;
- }
-
-+ hp100_page(ID_MAC_ADDR);
- for (i = uc = 0; i < 7; i++)
- uc += hp100_inb(LAN_ADDR + i);
- if (uc != 0xff) {
-- printk("hp100_probe: %s: bad lan address checksum (card %s at port 0x%x)\n", dev->name, eid->name, ioaddr);
-- return -EIO;
-+ printk(KERN_WARNING "hp100_probe: bad lan address checksum at port 0x%x)\n", ioaddr);
-+ err = -EIO;
-+ goto out2;
- }
-
- /* Make sure, that all registers are correctly updated... */
-@@ -607,17 +516,17 @@ static int __init hp100_probe1(struct ne
- hp100_outw(HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW);
- hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
- hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
-- printk("hp100: %s: IO mapped mode forced.\n", dev->name);
-+ printk("hp100: IO mapped mode forced.\n");
- } else if (local_mode == 2) {
- hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW);
- hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
- hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
-- printk("hp100: %s: Shared memory mode requested.\n", dev->name);
-+ printk("hp100: Shared memory mode requested.\n");
- } else if (local_mode == 4) {
- if (chip == HP100_CHIPID_LASSEN) {
- hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_SET_HB, OPTION_LSW);
- hp100_outw(HP100_IO_EN | HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW);
-- printk("hp100: %s: Busmaster mode requested.\n", dev->name);
-+ printk("hp100: Busmaster mode requested.\n");
- }
- local_mode = 1;
- }
-@@ -643,7 +552,7 @@ static int __init hp100_probe1(struct ne
- /* Gracefully fallback to shared memory */
- goto busmasterfail;
- }
-- printk("hp100: %s: Busmaster mode enabled.\n", dev->name);
-+ printk("hp100: Busmaster mode enabled.\n");
- hp100_outw(HP100_MEM_EN | HP100_IO_EN | HP100_RESET_LB, OPTION_LSW);
- } else {
- busmasterfail:
-@@ -675,7 +584,7 @@ static int __init hp100_probe1(struct ne
- mem_ptr_phys &= ~0x1fff; /* 8k alignment */
-
- if (bus == HP100_BUS_ISA && (mem_ptr_phys & ~0xfffff) != 0) {
-- printk("hp100: %s: Can only use programmed i/o mode.\n", dev->name);
-+ printk("hp100: Can only use programmed i/o mode.\n");
- mem_ptr_phys = 0;
- mem_mapped = 0;
- local_mode = 3; /* Use programmed i/o */
-@@ -699,7 +608,7 @@ static int __init hp100_probe1(struct ne
- }
-
- if (mem_ptr_virt == NULL) { /* all ioremap tries failed */
-- printk("hp100: %s: Failed to ioremap the PCI card memory. Will have to use i/o mapped mode.\n", dev->name);
-+ printk("hp100: Failed to ioremap the PCI card memory. Will have to use i/o mapped mode.\n");
- local_mode = 3;
- virt_memory_size = 0;
- }
-@@ -710,17 +619,14 @@ static int __init hp100_probe1(struct ne
- mem_mapped = 0;
- mem_ptr_phys = 0;
- mem_ptr_virt = NULL;
-- printk("hp100: %s: Using (slow) programmed i/o mode.\n", dev->name);
-+ printk("hp100: Using (slow) programmed i/o mode.\n");
- }
-
- /* Initialise the "private" data structure for this card. */
-- if ((dev->priv = kmalloc(sizeof(struct hp100_private), GFP_KERNEL)) == NULL)
-- return -ENOMEM;
--
- lp = (struct hp100_private *) dev->priv;
-- memset(lp, 0, sizeof(struct hp100_private));
-+
- spin_lock_init(&lp->lock);
-- lp->id = eid;
-+ strlcpy(lp->id, eid, HP100_SIG_LEN);
- lp->chip = chip;
- lp->mode = local_mode;
- lp->bus = bus;
-@@ -741,9 +647,6 @@ static int __init hp100_probe1(struct ne
- lp->virt_memory_size = virt_memory_size;
- lp->rx_ratio = hp100_rx_ratio; /* can be conf'd with insmod */
-
-- /* memory region for programmed i/o */
-- request_region(dev->base_addr, HP100_REGION_SIZE, eid->name);
--
- dev->open = hp100_open;
- dev->stop = hp100_close;
-
-@@ -776,10 +679,6 @@ static int __init hp100_probe1(struct ne
- /* Reset statistics (counters) */
- hp100_clear_stats(lp, ioaddr);
-
-- SET_MODULE_OWNER(dev);
-- SET_NETDEV_DEV(dev, &pci_dev->dev);
-- ether_setup(dev);
--
- /* If busmaster mode is wanted, a dma-capable memory area is needed for
- * the rx and tx PDLs
- * PCI cards can access the whole PC memory. Therefore GFP_DMA is not
-@@ -795,8 +694,10 @@ static int __init hp100_probe1(struct ne
- /* Conversion to new PCI API :
- * Pages are always aligned and zeroed, no need to it ourself.
- * Doc says should be OK for EISA bus as well - Jean II */
-- if ((lp->page_vaddr_algn = pci_alloc_consistent(lp->pci_dev, MAX_RINGSIZE, &page_baddr)) == NULL)
-- return -ENOMEM;
-+ if ((lp->page_vaddr_algn = pci_alloc_consistent(lp->pci_dev, MAX_RINGSIZE, &page_baddr)) == NULL) {
-+ err = -ENOMEM;
-+ goto out2;
-+ }
- lp->whatever_offset = ((u_long) page_baddr) - ((u_long) lp->page_vaddr_algn);
-
- #ifdef HP100_DEBUG_BM
-@@ -818,7 +719,7 @@ static int __init hp100_probe1(struct ne
- lp->lan_type = hp100_sense_lan(dev);
-
- /* Print out a message what about what we think we have probed. */
-- printk("hp100: %s: %s at 0x%x, IRQ %d, ", dev->name, lp->id->name, ioaddr, dev->irq);
-+ printk("hp100: at 0x%x, IRQ %d, ", ioaddr, dev->irq);
- switch (bus) {
- case HP100_BUS_EISA:
- printk("EISA");
-@@ -833,7 +734,7 @@ static int __init hp100_probe1(struct ne
- printk(" bus, %dk SRAM (rx/tx %d%%).\n", lp->memory_size >> 10, lp->rx_ratio);
-
- if (lp->mode == 2) { /* memory mapped */
-- printk("hp100: %s: Memory area at 0x%lx-0x%lx", dev->name, mem_ptr_phys,
-+ printk("hp100: Memory area at 0x%lx-0x%lx", mem_ptr_phys,
- (mem_ptr_phys + (mem_ptr_phys > 0x100000 ? (u_long) lp->memory_size : 16 * 1024)) - 1);
- if (mem_ptr_virt)
- printk(" (virtual base %p)", mem_ptr_virt);
-@@ -843,7 +744,8 @@ static int __init hp100_probe1(struct ne
- dev->mem_start = mem_ptr_phys;
- dev->mem_end = mem_ptr_phys + lp->memory_size;
- }
-- printk("hp100: %s: ", dev->name);
-+
-+ printk("hp100: ");
- if (lp->lan_type != HP100_LAN_ERR)
- printk("Adapter is attached to ");
- switch (lp->lan_type) {
-@@ -861,6 +763,10 @@ static int __init hp100_probe1(struct ne
- }
-
- return 0;
-+out2:
-+ release_region(ioaddr, HP100_REGION_SIZE);
-+out1:
-+ return -ENODEV;
- }
-
- /* This procedure puts the card into a stable init state */
-@@ -950,6 +856,7 @@ static void hp100_hwinit(struct net_devi
- /* Finally try to log in the Hub if there may be a VG connection. */
- if ((lp->lan_type == HP100_LAN_100) || (lp->lan_type == HP100_LAN_ERR))
- hp100_login_to_vg_hub(dev, 0); /* relogin */
-+
- }
- \f
-
-@@ -1152,7 +1059,7 @@ static int hp100_open(struct net_device
- if (request_irq(dev->irq, hp100_interrupt,
- lp->bus == HP100_BUS_PCI || lp->bus ==
- HP100_BUS_EISA ? SA_SHIRQ : SA_INTERRUPT,
-- lp->id->name, dev)) {
-+ "hp100", dev)) {
- printk("hp100: %s: unable to get IRQ %d\n", dev->name, dev->irq);
- return -EAGAIN;
- }
-@@ -2054,7 +1961,7 @@ static void hp100_rx_bm(struct net_devic
- /*
- * statistics
- */
--static hp100_stats_t *hp100_get_stats(struct net_device *dev)
-+static struct net_device_stats *hp100_get_stats(struct net_device *dev)
- {
- unsigned long flags;
- int ioaddr = dev->base_addr;
-@@ -2558,10 +2465,14 @@ static int hp100_sense_lan(struct net_de
- return HP100_LAN_COAX;
- }
-
-- if ((lp->id->id == 0x02019F022) ||
-- (lp->id->id == 0x01042103c) || (lp->id->id == 0x01040103c))
-- return HP100_LAN_ERR; /* Those cards don't have a 100 Mbit connector */
--
-+ /* Those cards don't have a 100 Mbit connector */
-+ if ( !strcmp(lp->id, "HWP1920") ||
-+ (lp->pci_dev &&
-+ lp->pci_dev->vendor == PCI_VENDOR_ID &&
-+ (lp->pci_dev->device == PCI_DEVICE_ID_HP_J2970A ||
-+ lp->pci_dev->device == PCI_DEVICE_ID_HP_J2973A)))
-+ return HP100_LAN_ERR;
-+
- if (val_VG & HP100_LINK_CABLE_ST) /* Can hear the HUBs tone. */
- return HP100_LAN_100;
- return HP100_LAN_ERR;
-@@ -2915,122 +2826,248 @@ void hp100_RegisterDump(struct net_devic
- #endif
-
-
-+static void cleanup_dev(struct net_device *d)
-+{
-+ struct hp100_private *p = (struct hp100_private *) d->priv;
-+
-+ unregister_netdev(d);
-+ release_region(d->base_addr, HP100_REGION_SIZE);
-+
-+ if (p->mode == 1) /* busmaster */
-+ pci_free_consistent(p->pci_dev, MAX_RINGSIZE + 0x0f,
-+ p->page_vaddr_algn,
-+ virt_to_whatever(d, p->page_vaddr_algn));
-+ if (p->mem_ptr_virt)
-+ iounmap(p->mem_ptr_virt);
-+
-+ free_netdev(d);
-+}
-+
-+#ifdef CONFIG_EISA
-+static int __init hp100_eisa_probe (struct device *gendev)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
-+ struct eisa_device *edev = to_eisa_device(gendev);
-+ int err;
-+
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ SET_MODULE_OWNER(dev);
-+ SET_NETDEV_DEV(dev, &edev->dev);
-+
-+ err = hp100_probe1(dev, edev->base_addr, HP100_BUS_EISA, NULL);
-+ if (err)
-+ goto out1;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out2;
-+
-+#ifdef HP100_DEBUG
-+ printk("hp100: %s: EISA adapter found at 0x%x\n", dev->name,
-+ dev->base_addr);
-+#endif
-+ gendev->driver_data = dev;
-+ return 0;
-+ out2:
-+ release_region(dev->base_addr, HP100_REGION_SIZE);
-+ out1:
-+ free_netdev(dev);
-+ return err;
-+}
-+
-+static int __devexit hp100_eisa_remove (struct device *gendev)
-+{
-+ struct net_device *dev = gendev->driver_data;
-+ cleanup_dev(dev);
-+ return 0;
-+}
-+
-+static struct eisa_driver hp100_eisa_driver = {
-+ .id_table = hp100_eisa_tbl,
-+ .driver = {
-+ .name = "hp100",
-+ .probe = hp100_eisa_probe,
-+ .remove = __devexit_p (hp100_eisa_remove),
-+ }
-+};
-+#endif
-+
-+#ifdef CONFIG_PCI
-+static int __devinit hp100_pci_probe (struct pci_dev *pdev,
-+ const struct pci_device_id *ent)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
-+ int ioaddr = pci_resource_start(pdev, 0);
-+ u_short pci_command;
-+ int err;
-+
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ SET_MODULE_OWNER(dev);
-+ SET_NETDEV_DEV(dev, &pdev->dev);
-+
-+ pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
-+ if (!(pci_command & PCI_COMMAND_IO)) {
-+#ifdef HP100_DEBUG
-+ printk("hp100: %s: PCI I/O Bit has not been set. Setting...\n", dev->name);
-+#endif
-+ pci_command |= PCI_COMMAND_IO;
-+ pci_write_config_word(pdev, PCI_COMMAND, pci_command);
-+ }
-+
-+ if (!(pci_command & PCI_COMMAND_MASTER)) {
-+#ifdef HP100_DEBUG
-+ printk("hp100: %s: PCI Master Bit has not been set. Setting...\n", dev->name);
-+#endif
-+ pci_command |= PCI_COMMAND_MASTER;
-+ pci_write_config_word(pdev, PCI_COMMAND, pci_command);
-+ }
-+
-+
-+ err = hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pdev);
-+ if (err)
-+ goto out1;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out2;
-+
-+#ifdef HP100_DEBUG
-+ printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr);
-+#endif
-+ pci_set_drvdata(pdev, dev);
-+ return 0;
-+ out2:
-+ release_region(dev->base_addr, HP100_REGION_SIZE);
-+ out1:
-+ free_netdev(dev);
-+ return err;
-+}
-+
-+static void __devexit hp100_pci_remove (struct pci_dev *pdev)
-+{
-+ struct net_device *dev = pci_get_drvdata(pdev);
-+
-+ cleanup_dev(dev);
-+}
-+
-+
-+static struct pci_driver hp100_pci_driver = {
-+ .name = "hp100",
-+ .id_table = hp100_pci_tbl,
-+ .probe = hp100_pci_probe,
-+ .remove = __devexit_p(hp100_pci_remove),
-+};
-+#endif
-+
- /*
- * module section
- */
-
--#ifdef MODULE
--
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>, "
- "Siegfried \"Frieder\" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>");
- MODULE_DESCRIPTION("HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters");
-
- /*
-- * Note: if you have more than five 100vg cards in your pc, feel free to
-- * increase this value
-- */
--
--#define HP100_DEVICES 5
--
--/*
-- * Note: to register three eisa or pci devices, use:
-+ * Note: to register three isa devices, use:
- * option hp100 hp100_port=0,0,0
- * to register one card at io 0x280 as eth239, use:
-- * option hp100 hp100_port=0x280 hp100_name=eth239
-+ * option hp100 hp100_port=0x280
- */
--
-+#if defined(MODULE) && defined(CONFIG_ISA)
-+#define HP100_DEVICES 5
- /* Parameters set by insmod */
- static int hp100_port[HP100_DEVICES] = { 0, [1 ... (HP100_DEVICES-1)] = -1 };
- MODULE_PARM(hp100_port, "1-" __MODULE_STRING(HP100_DEVICES) "i");
-
--/* Allocate HP100_DEVICES strings of length IFNAMSIZ, one string for each device */
--static char hp100_name[HP100_DEVICES][IFNAMSIZ] = { "", "", "", "", "" };
--/* Allow insmod to write those HP100_DEVICES strings individually */
--MODULE_PARM(hp100_name, "1-" __MODULE_STRING(HP100_DEVICES) "c" __MODULE_STRING(IFNAMSIZ));
--
- /* List of devices */
- static struct net_device *hp100_devlist[HP100_DEVICES];
-
--static void release_dev(int i)
-+static int __init hp100_isa_init(void)
- {
-- struct net_device *d = hp100_devlist[i];
-- struct hp100_private *p = (struct hp100_private *) d->priv;
-+ struct net_device *dev;
-+ int i, err, cards = 0;
-
-- unregister_netdev(d);
-- release_region(d->base_addr, HP100_REGION_SIZE);
-+ /* Don't autoprobe ISA bus */
-+ if (hp100_port[0] == 0)
-+ return -ENODEV;
-
-- if (p->mode == 1) /* busmaster */
-- pci_free_consistent(p->pci_dev, MAX_RINGSIZE + 0x0f, p->page_vaddr_algn, virt_to_whatever(d, p->page_vaddr_algn));
-- if (p->mem_ptr_virt)
-- iounmap(p->mem_ptr_virt);
-- kfree(d->priv);
-- d->priv = NULL;
-- free_netdev(d);
-- hp100_devlist[i] = NULL;
-+ /* Loop on all possible base addresses */
-+ for (i = 0; i < HP100_DEVICES && hp100_port[i] != -1; ++i) {
-+ dev = alloc_etherdev(sizeof(struct hp100_private));
-+ if (!dev) {
-+ printk(KERN_WARNING "hp100: no memory for network device\n");
-+ while (cards > 0)
-+ cleanup_dev(hp100_devlist[--cards]);
-+
-+ return -ENOMEM;
-+ }
-+ SET_MODULE_OWNER(dev);
-+
-+ err = hp100_isa_probe(dev, hp100_port[i]);
-+ if (!err) {
-+ err = register_netdev(dev);
-+ if (!err)
-+ hp100_devlist[cards++] = dev;
-+ else
-+ release_region(dev->base_addr, HP100_REGION_SIZE);
-+ }
-+
-+ if (err)
-+ free_netdev(dev);
-+ }
-+
-+ return cards > 0 ? 0 : -ENODEV;
- }
-
--static int __init hp100_module_init(void)
-+static void __exit hp100_isa_cleanup(void)
- {
-- int i, cards;
-+ int i;
-
--#ifndef CONFIG_PCI
-- if (hp100_port == 0 && !EISA_bus)
-- printk("hp100: You should not use auto-probing with insmod!\n");
-+ for (i = 0; i < HP100_DEVICES; i++) {
-+ struct net_device *dev = hp100_devlist[i];
-+ if (dev)
-+ cleanup_dev(dev);
-+ }
-+}
-+#else
-+#define hp100_isa_init() (0)
-+#define hp100_isa_cleanup() do { } while(0)
- #endif
-
-- /* Loop on all possible base addresses */
-- i = -1;
-- cards = 0;
-- while ((hp100_port[++i] != -1) && (i < HP100_DEVICES)) {
-- /* Create device and set basics args */
-- hp100_devlist[i] = kmalloc(sizeof(struct net_device), GFP_KERNEL);
-- if (!hp100_devlist[i])
-- goto fail;
-- memset(hp100_devlist[i], 0x00, sizeof(struct net_device));
--#if LINUX_VERSION_CODE >= 0x020362 /* 2.3.99-pre7 */
-- memcpy(hp100_devlist[i]->name, hp100_name[i], IFNAMSIZ); /* Copy name */
--#else
-- hp100_devlist[i]->name = hp100_name[i];
--#endif /* LINUX_VERSION_CODE >= 0x020362 */
-- hp100_devlist[i]->base_addr = hp100_port[i];
-- hp100_devlist[i]->init = &hp100_probe;
--
-- /* Try to create the device */
-- if (register_netdev(hp100_devlist[i]) != 0) {
-- /* DeAllocate everything */
-- /* Note: if dev->priv is mallocated, there is no way to fail */
-- kfree(hp100_devlist[i]);
-- hp100_devlist[i] = (struct net_device *) NULL;
-- } else
-- cards++;
-- } /* Loop over all devices */
-+static int __init hp100_module_init(void)
-+{
-+ int err;
-
-- return cards > 0 ? 0 : -ENODEV;
-- fail:
-- while (cards && --i)
-- if (hp100_devlist[i]) {
-- release_dev(i);
-- --cards;
-- }
-- return -ENOMEM;
-+ err = hp100_isa_init();
-+
-+#ifdef CONFIG_EISA
-+ err |= eisa_driver_register(&hp100_eisa_driver);
-+#endif
-+#ifdef CONFIG_PCI
-+ err |= pci_module_init(&hp100_pci_driver);
-+#endif
-+ return err;
- }
-
-+
- static void __exit hp100_module_exit(void)
- {
-- int i;
--
-- /* TODO: Check if all skb's are released/freed. */
-- for (i = 0; i < HP100_DEVICES; i++)
-- if (hp100_devlist[i] != (struct net_device *) NULL)
-- release_dev(i);
-+ hp100_isa_cleanup();
-+#ifdef CONFIG_EISA
-+ eisa_driver_unregister (&hp100_eisa_driver);
-+#endif
-+#ifdef CONFIG_PCI
-+ pci_unregister_driver (&hp100_pci_driver);
-+#endif
- }
-
- module_init(hp100_module_init)
- module_exit(hp100_module_exit)
-
--#endif /* MODULE */
--
-
- /*
- * Local variables:
---- linux-2.6.0/drivers/net/hp.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/hp.c 2003-12-28 23:21:01.000000000 -0800
-@@ -55,7 +55,6 @@ static unsigned int hppclan_portlist[] _
- #define HP_8BSTOP_PG 0x80 /* Last page +1 of RX ring */
- #define HP_16BSTOP_PG 0xFF /* Same, for 16 bit cards. */
-
--int hp_probe(struct net_device *dev);
- static int hp_probe1(struct net_device *dev, int ioaddr);
-
- static int hp_open(struct net_device *dev);
-@@ -79,10 +78,11 @@ static char irqmap[16] __initdata= { 0,
- Also initialize the card and fill in STATION_ADDR with the station
- address. */
-
--int __init hp_probe(struct net_device *dev)
-+static int __init do_hp_probe(struct net_device *dev)
- {
- int i;
- int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-@@ -91,13 +91,46 @@ int __init hp_probe(struct net_device *d
- else if (base_addr != 0) /* Don't probe at all. */
- return -ENXIO;
-
-- for (i = 0; hppclan_portlist[i]; i++)
-+ for (i = 0; hppclan_portlist[i]; i++) {
- if (hp_probe1(dev, hppclan_portlist[i]) == 0)
- return 0;
-+ dev->irq = irq;
-+ }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT);
-+}
-+
-+struct net_device * __init hp_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_hp_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init hp_probe1(struct net_device *dev, int ioaddr)
- {
- int i, retval, board_id, wordmode;
-@@ -131,13 +164,6 @@ static int __init hp_probe1(struct net_d
- if (ei_debug && version_printed++ == 0)
- printk(version);
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (" unable to get memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out;
-- }
--
- printk("%s: %s (ID %02x) at %#3x,", dev->name, name, board_id, ioaddr);
-
- for(i = 0; i < ETHER_ADDR_LEN; i++)
-@@ -166,14 +192,14 @@ static int __init hp_probe1(struct net_d
- if (*irqp == 0) {
- printk(" no free IRQ lines.\n");
- retval = -EBUSY;
-- goto out1;
-+ goto out;
- }
- } else {
- if (dev->irq == 2)
- dev->irq = 9;
- if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
- printk (" unable to get IRQ %d.\n", dev->irq);
-- goto out1;
-+ goto out;
- }
- }
-
-@@ -195,9 +221,6 @@ static int __init hp_probe1(struct net_d
- hp_init_card(dev);
-
- return 0;
--out1:
-- kfree(dev->priv);
-- dev->priv = NULL;
- out:
- release_region(ioaddr, HP_IO_EXTENT);
- return retval;
-@@ -372,7 +395,7 @@ hp_init_card(struct net_device *dev)
-
- #ifdef MODULE
- #define MAX_HP_CARDS 4 /* Max number of HP cards per module */
--static struct net_device dev_hp[MAX_HP_CARDS];
-+static struct net_device *dev_hp[MAX_HP_CARDS];
- static int io[MAX_HP_CARDS];
- static int irq[MAX_HP_CARDS];
-
-@@ -388,27 +411,33 @@ ISA device autoprobes on a running machi
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
-- struct net_device *dev = &dev_hp[this_dev];
-- dev->irq = irq[this_dev];
-- dev->base_addr = io[this_dev];
-- dev->init = hp_probe;
- if (io[this_dev] == 0) {
- if (this_dev != 0) break; /* only autoprobe 1st one */
- printk(KERN_NOTICE "hp.c: Presently autoprobing (not recommended) for a single card.\n");
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
-+ dev->irq = irq[this_dev];
-+ dev->base_addr = io[this_dev];
-+ if (do_hp_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_hp[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -417,14 +446,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
-- struct net_device *dev = &dev_hp[this_dev];
-- if (dev->priv != NULL) {
-- int ioaddr = dev->base_addr - NIC_OFFSET;
-- void *priv = dev->priv;
-- free_irq(dev->irq, dev);
-- release_region(ioaddr, HP_IO_EXTENT);
-+ struct net_device *dev = dev_hp[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/hplance.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/hplance.c 2003-12-28 23:21:01.000000000 -0800
-@@ -50,8 +50,7 @@ struct hplance_private {
- * plus board-specific init, open and close actions.
- * Oh, and we need to tell the generic code how to read and write LANCE registers...
- */
--int hplance_probe(struct net_device *dev);
--static int hplance_init(struct net_device *dev, int scode);
-+static void hplance_init(struct net_device *dev, int scode);
- static int hplance_open(struct net_device *dev);
- static int hplance_close(struct net_device *dev);
- static void hplance_writerap(void *priv, unsigned short value);
-@@ -62,57 +61,61 @@ static unsigned short hplance_readrdp(vo
- static struct hplance_private *root_hplance_dev;
- #endif
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ struct hplance_private *lp = dev->priv;
-+ dio_unconfig_board(lp->scode);
-+}
-+
- /* Find all the HP Lance boards and initialise them... */
--int __init hplance_probe(struct net_device *dev)
-+struct net_device * __init hplance_probe(int unit)
- {
-- int cards = 0, called = 0;
-+ struct net_device *dev;
-+
-+ if (!MACH_IS_HP300)
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_etherdev(sizeof(struct hplance_private));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-
-- if (!MACH_IS_HP300 || called)
-- return(ENODEV);
-- called++;
-+ SET_MODULE_OWNER(dev);
-
- /* Isn't DIO nice? */
- for(;;)
- {
-- int v, scode = dio_find(DIO_ID_LAN);
-+ int scode = dio_find(DIO_ID_LAN);
-
- if (!scode)
- break;
-
-- if(cards)
-- dev = NULL; /* don't trash previous device, make a new one */
-- cards++;
--
-- v = hplance_init(dev, scode);
-- if (v) /* error, abort immediately */
-- return v;
-+ dio_config_board(scode);
-+ hplance_init(dev, scode);
-+ if (!register_netdev(dev)) {
-+ struct hplance_private *lp = dev->priv;
-+ lp->next_module = root_hplance_dev;
-+ root_hplance_dev = lp;
-+ return dev;
-+ }
-+ cleanup_card(dev);
- }
-- /* OK, return success, or ENODEV if we didn't find any cards */
-- if (!cards)
-- return -ENODEV;
-- return 0;
-+ free_netdev(dev);
-+ return ERR_PTR(-ENODEV);
- }
-
- /* Initialise a single lance board at the given select code */
--static int __init hplance_init(struct net_device *dev, int scode)
-+static void __init hplance_init(struct net_device *dev, int scode)
- {
- const char *name = dio_scodetoname(scode);
- void *va = dio_scodetoviraddr(scode);
- struct hplance_private *lp;
- int i;
-
--#ifdef MODULE
-- dev = init_etherdev(0, sizeof(struct hplance_private));
-- if (!dev)
-- return -ENOMEM;
--#else
-- dev->priv = kmalloc(sizeof(struct hplance_private), GFP_KERNEL);
-- if (dev->priv == NULL)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct hplance_private));
--#endif
-- SET_MODULE_OWNER(dev);
--
- printk("%s: %s; select code %d, addr", dev->name, name, scode);
-
- /* reset the board */
-@@ -154,17 +157,7 @@ static int __init hplance_init(struct ne
- lp->lance.tx_ring_mod_mask = TX_RING_MOD_MASK;
- lp->scode = scode;
- lp->base = va;
-- ether_setup(dev);
- printk(", irq %d\n", lp->lance.irq);
--
--#ifdef MODULE
-- dev->ifindex = dev_new_index();
-- lp->next_module = root_hplance_dev;
-- root_hplance_dev = lp;
--#endif /* MODULE */
--
-- dio_config_board(scode); /* tell bus scanning code this one's taken */
-- return 0;
- }
-
- /* This is disgusting. We have to check the DIO status register for ack every
-@@ -227,8 +220,10 @@ static int hplance_close(struct net_devi
- MODULE_LICENSE("GPL");
- int init_module(void)
- {
-- root_lance_dev = NULL;
-- return hplance_probe(NULL);
-+ int found = 0;
-+ while (!IS_ERR(hplance_probe(-1)))
-+ found++;
-+ return found ? 0 : -ENODEV;
- }
-
- void cleanup_module(void)
-@@ -237,8 +232,8 @@ void cleanup_module(void)
- struct hplance_private *lp;
- while (root_hplance_dev) {
- lp = root_hplance_dev->next_module;
-- dio_unconfig_board(lp->scode);
- unregister_netdev(root_lance_dev->dev);
-+ cleanup_card(root_lance_dev->dev);
- free_netdev(root_lance_dev->dev);
- root_lance_dev = lp;
- }
---- linux-2.6.0/drivers/net/hp-plus.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/hp-plus.c 2003-12-28 23:21:01.000000000 -0800
-@@ -92,7 +92,6 @@ enum HP_Option {
- EnableIRQ = 4, FakeIntr = 8, BootROMEnb = 0x10, IOEnb = 0x20,
- MemEnable = 0x40, ZeroWait = 0x80, MemDisable = 0x1000, };
-
--int hp_plus_probe(struct net_device *dev);
- static int hpp_probe1(struct net_device *dev, int ioaddr);
-
- static void hpp_reset_8390(struct net_device *dev);
-@@ -115,10 +114,11 @@ static void hpp_io_get_8390_hdr(struct n
- /* Probe a list of addresses for an HP LAN+ adaptor.
- This routine is almost boilerplate. */
-
--int __init hp_plus_probe(struct net_device *dev)
-+static int __init do_hpp_probe(struct net_device *dev)
- {
- int i;
- int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-@@ -127,13 +127,46 @@ int __init hp_plus_probe(struct net_devi
- else if (base_addr != 0) /* Don't probe at all. */
- return -ENXIO;
-
-- for (i = 0; hpplus_portlist[i]; i++)
-+ for (i = 0; hpplus_portlist[i]; i++) {
- if (hpp_probe1(dev, hpplus_portlist[i]) == 0)
- return 0;
-+ dev->irq = irq;
-+ }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ /* NB: hpp_close() handles free_irq */
-+ release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT);
-+}
-+
-+struct net_device * __init hp_plus_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_hpp_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- /* Do the interesting part of the probe at a single address. */
- static int __init hpp_probe1(struct net_device *dev, int ioaddr)
- {
-@@ -179,13 +212,6 @@ static int __init hpp_probe1(struct net_
- printk(" ID %4.4x", inw(ioaddr + 12));
- }
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk ("hp-plus.c: unable to allocate memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out;
-- }
--
- /* Read the IRQ line. */
- outw(HW_Page, ioaddr + HP_PAGING);
- {
-@@ -400,7 +426,7 @@ hpp_mem_block_output(struct net_device *
- \f
- #ifdef MODULE
- #define MAX_HPP_CARDS 4 /* Max number of HPP cards per module */
--static struct net_device dev_hpp[MAX_HPP_CARDS];
-+static struct net_device *dev_hpp[MAX_HPP_CARDS];
- static int io[MAX_HPP_CARDS];
- static int irq[MAX_HPP_CARDS];
-
-@@ -416,27 +442,33 @@ ISA device autoprobes on a running machi
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) {
-- struct net_device *dev = &dev_hpp[this_dev];
-- dev->irq = irq[this_dev];
-- dev->base_addr = io[this_dev];
-- dev->init = hp_plus_probe;
- if (io[this_dev] == 0) {
- if (this_dev != 0) break; /* only autoprobe 1st one */
- printk(KERN_NOTICE "hp-plus.c: Presently autoprobing (not recommended) for a single card.\n");
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "hp-plus.c: No HP-Plus card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
-+ dev->irq = irq[this_dev];
-+ dev->base_addr = io[this_dev];
-+ if (do_hpp_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_hpp[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "hp-plus.c: No HP-Plus card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -445,14 +477,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) {
-- struct net_device *dev = &dev_hpp[this_dev];
-- if (dev->priv != NULL) {
-- int ioaddr = dev->base_addr - NIC_OFFSET;
-- void *priv = dev->priv;
-- /* NB: hpp_close() handles free_irq */
-- release_region(ioaddr, HP_IO_EXTENT);
-+ struct net_device *dev = dev_hpp[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/hydra.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/hydra.c 2003-12-28 23:21:01.000000000 -0800
-@@ -89,13 +89,14 @@ static int __init hydra_init(unsigned lo
- const char name[] = "NE2000";
- int start_page, stop_page;
- int j;
-+ int err;
-
- static u32 hydra_offsets[16] = {
- 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e,
- 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
- };
-
-- dev = init_etherdev(NULL, 0);
-+ dev = alloc_ei_netdev();
- if (!dev)
- return -ENOMEM;
- SET_MODULE_OWNER(dev);
-@@ -113,13 +114,9 @@ static int __init hydra_init(unsigned lo
-
- /* Install the Interrupt handler */
- if (request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, "Hydra Ethernet",
-- dev))
-+ dev)) {
-+ free_netdev(dev);
- return -EAGAIN;
--
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk("Unable to get memory for dev->priv.\n");
-- return -ENOMEM;
- }
-
- printk("%s: hydra at 0x%08lx, address %02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n", dev->name, ZTWO_PADDR(board),
-@@ -146,7 +143,13 @@ static int __init hydra_init(unsigned lo
- root_hydra_dev = dev;
- #endif
- NS8390_init(dev, 0);
-- return 0;
-+ err = register_netdev(dev);
-+ if (!err)
-+ return 0;
-+
-+ free_irq(IRQ_AMIGA_PORTS, dev);
-+ free_netdev(dev);
-+ return err;
- }
-
- static int hydra_open(struct net_device *dev)
---- linux-2.6.0/drivers/net/ibmlana.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/ibmlana.c 2003-12-28 23:21:01.000000000 -0800
-@@ -906,7 +906,7 @@ static void ibmlana_set_multicast_list(s
-
- static int startslot; /* counts through slots when probing multiple devices */
-
--int ibmlana_probe(struct net_device *dev)
-+static int ibmlana_probe(struct net_device *dev)
- {
- int force_detect = 0;
- int slot, z;
-@@ -924,34 +924,21 @@ int ibmlana_probe(struct net_device *dev
- if (dev->mem_start == 1)
- force_detect = 1;
-
-- /* search through slots */
-- if (dev != NULL) {
-- base = dev->mem_start;
-- irq = dev->irq;
-- }
-- slot = mca_find_adapter(IBM_LANA_ID, startslot);
-+ base = dev->mem_start;
-+ irq = dev->irq;
-
-- while (slot != -1) {
-+ for (slot = startslot; (slot = mca_find_adapter(IBM_LANA_ID, slot)) != -1; slot++) {
- /* deduce card addresses */
- getaddrs(slot, &base, &memlen, &iobase, &irq, &medium);
-
- /* slot already in use ? */
-- if (mca_is_adapter_used(slot)) {
-- slot = mca_find_adapter(IBM_LANA_ID, slot + 1);
-+ if (mca_is_adapter_used(slot))
- continue;
-- }
- /* were we looking for something different ? */
-- if (dev->irq != 0 || dev->mem_start != 0) {
-- if (dev->irq != 0 && dev->irq != irq) {
-- slot = mca_find_adapter(IBM_LANA_ID, slot + 1);
-- continue;
-- }
-- if (dev->mem_start != 0 && dev->mem_start != base)
-- {
-- slot = mca_find_adapter(IBM_LANA_ID, slot + 1);
-- continue;
-- }
-- }
-+ if (dev->irq && dev->irq != irq)
-+ continue;
-+ if (dev->mem_start && dev->mem_start != base)
-+ continue;
- /* found something that matches */
- break;
- }
-@@ -977,16 +964,11 @@ int ibmlana_probe(struct net_device *dev
- mca_mark_as_used(slot);
-
- /* allocate structure */
-- priv = dev->priv = (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL);
-- if (!priv) {
-- release_region(iobase, IBM_LANA_IORANGE);
-- return -ENOMEM;
-- }
-+ priv = dev->priv;
- priv->slot = slot;
- priv->realirq = irq;
- priv->medium = medium;
- spin_lock_init(&priv->lock);
-- memset(&priv->stat, 0, sizeof(struct net_device_stats));
-
- /* set base + irq for this device (irq not allocated so far) */
-
-@@ -1006,10 +988,6 @@ int ibmlana_probe(struct net_device *dev
- dev->set_multicast_list = ibmlana_set_multicast_list;
- dev->flags |= IFF_MULTICAST;
-
-- /* generic setup */
--
-- ether_setup(dev);
--
- /* copy out MAC address */
-
- for (z = 0; z < sizeof(dev->dev_addr); z++)
-@@ -1044,7 +1022,7 @@ int ibmlana_probe(struct net_device *dev
-
- #define DEVMAX 5
-
--static struct net_device moddevs[DEVMAX];
-+static struct net_device *moddevs[DEVMAX];
- static int irq;
- static int io;
-
-@@ -1056,41 +1034,47 @@ MODULE_LICENSE("GPL");
-
- int init_module(void)
- {
-- int z, res;
-+ int z;
-
- startslot = 0;
- for (z = 0; z < DEVMAX; z++) {
-- moddevs[z].init = ibmlana_probe;
-- moddevs[z].irq = irq;
-- moddevs[z].base_addr = io;
-- res = register_netdev(moddevs + z);
-- if (res != 0)
-- return (z > 0) ? 0 : -EIO;
-+ struct net_device *dev = alloc_etherdev(sizeof(ibmlana_priv));
-+ if (!dev)
-+ break;
-+ dev->irq = irq;
-+ dev->base_addr = io;
-+ if (ibmlana_probe(dev)) {
-+ free_netdev(dev);
-+ break;
-+ }
-+ if (register_netdev(dev)) {
-+ ibmlana_priv *priv = dev->priv;
-+ release_region(dev->base_addr, IBM_LANA_IORANGE);
-+ mca_mark_as_unused(priv->slot);
-+ mca_set_adapter_name(priv->slot, "");
-+ mca_set_adapter_procfn(priv->slot, NULL, NULL);
-+ free_netdev(dev);
-+ break;
-+ }
-+ moddevs[z] = dev;
- }
-- return 0;
-+ return (z > 0) ? 0 : -EIO;
- }
-
- void cleanup_module(void)
- {
-- struct net_device *dev;
-- ibmlana_priv *priv;
- int z;
--
- for (z = 0; z < DEVMAX; z++) {
-- dev = moddevs + z;
-- if (dev->priv != NULL) {
-- priv = (ibmlana_priv *) dev->priv;
-+ struct net_device *dev = moddevs[z];
-+ if (dev) {
-+ ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
-+ unregister_netdev(dev);
- /*DeinitBoard(dev); */
-- if (dev->irq != 0)
-- free_irq(dev->irq, dev);
-- dev->irq = 0;
- release_region(dev->base_addr, IBM_LANA_IORANGE);
-- unregister_netdev(dev);
- mca_mark_as_unused(priv->slot);
- mca_set_adapter_name(priv->slot, "");
- mca_set_adapter_procfn(priv->slot, NULL, NULL);
-- kfree(dev->priv);
-- dev->priv = NULL;
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/ibmlana.h 2003-06-14 12:18:31.000000000 -0700
-+++ 25/drivers/net/ibmlana.h 2003-12-28 23:21:01.000000000 -0800
-@@ -275,7 +275,4 @@ typedef struct {
-
- #endif /* _IBM_LANA_DRIVER_ */
-
--extern int ibmlana_probe(struct net_device *);
--
--
- #endif /* _IBM_LANA_INCLUDE_ */
---- linux-2.6.0/drivers/net/irda/ali-ircc.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/irda/ali-ircc.c 2003-12-28 23:23:01.000000000 -0800
-@@ -8,6 +8,8 @@
- * Created at: 2000/10/16 03:46PM
- * Modified at: 2001/1/3 02:55PM
- * Modified by: Benjamin Kong <benjamin_kong@ali.com.tw>
-+ * Modified at: 2003/11/6 and support for ALi south-bridge chipsets M1563
-+ * Modified by: Clear Zhang <clear_zhang@ali.com.tw>
- *
- * Copyright (c) 2000 Benjamin Kong <benjamin_kong@ali.com.tw>
- * All Rights Reserved
-@@ -68,6 +70,7 @@ static ali_chip_t chips[] =
- {
- { "M1543", { 0x3f0, 0x370 }, 0x51, 0x23, 0x20, 0x43, ali_ircc_probe_53, ali_ircc_init_43 },
- { "M1535", { 0x3f0, 0x370 }, 0x51, 0x23, 0x20, 0x53, ali_ircc_probe_53, ali_ircc_init_53 },
-+ { "M1563", { 0x3f0, 0x370 }, 0x51, 0x23, 0x20, 0x63, ali_ircc_probe_53, ali_ircc_init_53 },
- { NULL }
- };
-
-@@ -1331,7 +1334,7 @@ static int ali_ircc_net_open(struct net_
- }
-
- /* Turn on interrups */
-- outb(UART_IER_RLSI | UART_IER_RDI |UART_IER_THRI, iobase+UART_IER);
-+ outb(UART_IER_RDI , iobase+UART_IER);
-
- /* Ready to play! */
- netif_start_queue(dev); //benjamin by irport
---- linux-2.6.0/drivers/net/ixgb/ixgb_main.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/ixgb/ixgb_main.c 2003-12-28 23:21:01.000000000 -0800
-@@ -446,7 +446,7 @@ ixgb_probe(struct pci_dev *pdev, const s
- iounmap(adapter->hw.hw_addr);
- err_ioremap:
- pci_release_regions(pdev);
-- kfree(netdev);
-+ free_netdev(netdev);
- err_alloc_etherdev:
- return -ENOMEM;
- }
---- linux-2.6.0/drivers/net/jazzsonic.c 2003-06-14 12:18:06.000000000 -0700
-+++ 25/drivers/net/jazzsonic.c 2003-12-28 23:21:01.000000000 -0800
-@@ -80,7 +80,6 @@ static unsigned short known_revisions[]
-
- /* Index to functions, as function prototypes. */
-
--extern int sonic_probe(struct net_device *dev);
- static int sonic_probe1(struct net_device *dev, unsigned int base_addr,
- unsigned int irq);
-
-@@ -89,29 +88,57 @@ static int sonic_probe1(struct net_devic
- * Probe for a SONIC ethernet controller on a Mips Jazz board.
- * Actually probing is superfluous but we're paranoid.
- */
--int __init sonic_probe(struct net_device *dev)
-+struct net_device * __init sonic_probe(int unit)
- {
-- unsigned int base_addr = dev ? dev->base_addr : 0;
-+ struct net_device *dev;
-+ struct sonic_local *lp;
-+ unsigned int base_addr;
-+ int err = 0;
- int i;
-
- /*
- * Don't probe if we're not running on a Jazz board.
- */
- if (mips_machgroup != MACH_GROUP_JAZZ)
-- return -ENODEV;
-- if (base_addr >= KSEG0) /* Check a single specified location. */
-- return sonic_probe1(dev, base_addr, dev->irq);
-- else if (base_addr != 0) /* Don't probe at all. */
-- return -ENXIO;
--
-- for (i = 0; sonic_portlist[i].port; i++) {
-- int base_addr = sonic_portlist[i].port;
-- if (check_region(base_addr, 0x100))
-- continue;
-- if (sonic_probe1(dev, base_addr, sonic_portlist[i].irq) == 0)
-- return 0;
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_etherdev(0);
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ base_addr = dev->base_addr;
-+
-+ if (base_addr >= KSEG0) { /* Check a single specified location. */
-+ err = sonic_probe1(dev, base_addr, dev->irq);
-+ } else if (base_addr != 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (i = 0; sonic_portlist[i].port; i++) {
-+ int io = sonic_portlist[i].port;
-+ if (sonic_probe1(dev, io, sonic_portlist[i].irq) == 0)
-+ break;
-+ }
-+ if (!sonic_portlist[i].port)
-+ err = -ENODEV;
- }
-- return -ENODEV;
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ lp = dev->priv;
-+ vdma_free(lp->rba_laddr);
-+ kfree(lp->rba);
-+ vdma_free(lp->cda_laddr);
-+ kfree(lp);
-+ release_region(dev->base_addr, 0x100);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int __init sonic_probe1(struct net_device *dev, unsigned int base_addr,
-@@ -121,8 +148,11 @@ static int __init sonic_probe1(struct ne
- unsigned int silicon_revision;
- unsigned int val;
- struct sonic_local *lp;
-+ int err = -ENODEV;
- int i;
-
-+ if (!request_region(base_addr, 0x100, dev->name))
-+ return -EBUSY;
- /*
- * get the Silicon Revision ID. If this is one of the known
- * one assume that we found a SONIC ethernet controller at
-@@ -140,12 +170,9 @@ static int __init sonic_probe1(struct ne
- if (known_revisions[i] == 0xffff) {
- printk("SONIC ethernet controller not found (0x%4x)\n",
- silicon_revision);
-- return -ENODEV;
-+ goto out;
- }
-
-- if (!request_region(base_addr, 0x100, dev->name))
-- return -EBUSY;
--
- if (sonic_debug && version_printed++ == 0)
- printk(version);
-
-@@ -175,6 +202,8 @@ static int __init sonic_probe1(struct ne
- }
-
- printk(" IRQ %d\n", irq);
-+
-+ err = -ENOMEM;
-
- /* Initialize the device structure. */
- if (dev->priv == NULL) {
-@@ -196,7 +225,7 @@ static int __init sonic_probe1(struct ne
- if (lp == NULL) {
- printk("%s: couldn't allocate memory for descriptors\n",
- dev->name);
-- return -ENOMEM;
-+ goto out;
- }
-
- memset(lp, 0, sizeof(struct sonic_local));
-@@ -206,7 +235,7 @@ static int __init sonic_probe1(struct ne
- if (lp->cda_laddr == ~0UL) {
- printk("%s: couldn't get DMA page entry for "
- "descriptors\n", dev->name);
-- return -ENOMEM;
-+ goto out1;
- }
-
- lp->tda_laddr = lp->cda_laddr + sizeof (lp->cda);
-@@ -219,7 +248,7 @@ static int __init sonic_probe1(struct ne
- if (!lp->rba) {
- printk("%s: couldn't allocate receive buffers\n",
- dev->name);
-- return -ENOMEM;
-+ goto out2;
- }
-
- /* get virtual dma address */
-@@ -228,7 +257,7 @@ static int __init sonic_probe1(struct ne
- if (lp->rba_laddr == ~0UL) {
- printk("%s: couldn't get DMA page entry for receive "
- "buffers\n",dev->name);
-- return -ENOMEM;
-+ goto out3;
- }
-
- /* now convert pointer to KSEG1 pointer */
-@@ -252,9 +281,16 @@ static int __init sonic_probe1(struct ne
- SONIC_WRITE(SONIC_FAET,0xffff);
- SONIC_WRITE(SONIC_MPT,0xffff);
-
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
- return 0;
-+out3:
-+ kfree(lp->rba);
-+out2:
-+ vdma_free(lp->cda_laddr);
-+out1:
-+ kfree(lp);
-+out:
-+ release_region(base_addr, 0x100);
-+ return err;
- }
-
- /*
---- linux-2.6.0/drivers/net/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/Kconfig 2003-12-28 23:21:01.000000000 -0800
-@@ -657,7 +657,7 @@ config ELMC
-
- config ELMC_II
- tristate "3c527 \"EtherLink/MC 32\" support (EXPERIMENTAL)"
-- depends on NET_VENDOR_3COM && MCA && EXPERIMENTAL && BROKEN_ON_SMP
-+ depends on NET_VENDOR_3COM && MCA && MCA_LEGACY
- help
- If you have a network (Ethernet) card of this type, say Y and read
- the Ethernet-HOWTO, available from
-@@ -1283,6 +1283,19 @@ config B44
- <file:Documentation/networking/net-modules.txt>. The module will be
- called b44.
-
-+config FORCEDETH
-+ tristate "Reverse Engineered nForce Ethernet support (EXPERIMENTAL)"
-+ depends on NET_PCI && PCI && EXPERIMENTAL
-+ help
-+ If you have a network (Ethernet) controller of this type, say Y and
-+ read the Ethernet-HOWTO, available from
-+ <http://www.tldp.org/docs.html#howto>.
-+
-+ To compile this driver as a module, choose M here and read
-+ <file:Documentation/networking/net-modules.txt>. The module will be
-+ called forcedeth.
-+
-+
- config CS89x0
- tristate "CS89x0 support"
- depends on NET_PCI && ISA
-@@ -1341,8 +1354,9 @@ config EEPRO100_PIO
- say N.
-
- config E100
-- tristate "EtherExpressPro/100 support (e100, Alternate Intel driver)"
-+ tristate "Intel(R) PRO/100+ support"
- depends on NET_PCI && PCI
-+ select MII
- ---help---
- This driver supports Intel(R) PRO/100 family of adapters, which
- includes:
-@@ -1415,6 +1429,10 @@ config E100
- <file:Documentation/networking/net-modules.txt>. The module
- will be called e100.
-
-+config E100_NAPI
-+ bool "Use Rx Polling (NAPI)"
-+ depends on E100
-+
- config LNE390
- tristate "Mylex EISA LNE390A/B support (EXPERIMENTAL)"
- depends on NET_PCI && EISA && EXPERIMENTAL
-@@ -1564,6 +1582,24 @@ config 8139_OLD_RX_RESET
- experience problems, you can enable this option to restore the
- old RX-reset behavior. If unsure, say N.
-
-+config 8139_RXBUF_IDX
-+ int "Receive ring size (0 => 8K, 1 => 16K, 2 => 32K, 3 => 64K)"
-+ depends on 8139TOO
-+ range 0 3
-+ default 1 if EMBEDDED || SH_DREAMCAST
-+ default 2
-+ help
-+ The 8139too driver has a fixed area of memory for receiving data.
-+ The default value is adequate for most systems. The 64KB
-+ ring size has hardware issues that may cause problems.
-+ Values:
-+ 0 => 8 KB
-+ 1 => 16 KB embedded systems
-+ 2 => 32 KB default for most systems
-+ 3 => 64 KB
-+ If unsure, use the default 2.
-+
-+
- config SIS900
- tristate "SiS 900/7016 PCI Fast Ethernet Adapter support"
- depends on NET_PCI && PCI
-@@ -1957,9 +1993,11 @@ config SK98LIN
- - EG1032 v2 Instant Gigabit Network Adapter
- - EG1064 v2 Instant Gigabit Network Adapter
- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Abit)
-+ - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Albatron)
- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Asus)
- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (ECS)
- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Epox)
-+ - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Foxconn)
- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Gigabyte)
- - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Iwill)
- - Marvell RDK-8001 Adapter
-@@ -2005,8 +2043,10 @@ config SK98LIN
- Questions concerning this driver may be addressed to:
- linux@syskonnect.de
-
-- To compile this driver as a module, choose M here: the module
-- will be called sk98lin. This is recommended.
-+ If you want to compile this 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. This is recommended.
-+ The module will be called sk98lin. This is recommended.
-
- config TIGON3
- tristate "Broadcom Tigon3 support"
-@@ -2441,6 +2481,13 @@ config SHAPER
- To compile this driver as a module, choose M here: the module
- will be called shaper. If unsure, say N.
-
-+config NETCONSOLE
-+ tristate "Network console logging support (EXPERIMENTAL)"
-+ depends on NETDEVICES && EXPERIMENTAL
-+ ---help---
-+ If you want to log kernel messages over the network, enable this.
-+ See Documentation/networking/netconsole.txt for details.
-+
- source "drivers/net/wan/Kconfig"
-
- source "drivers/net/pcmcia/Kconfig"
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/net/kgdb_eth.c 2003-12-28 23:21:09.000000000 -0800
-@@ -0,0 +1,131 @@
-+/*
-+ * Network interface GDB stub
-+ *
-+ * Written by San Mehat (nettwerk@biodome.org)
-+ * Based upon 'gdbserial' by David Grothe (dave@gcom.com)
-+ * and Scott Foehner (sfoehner@engr.sgi.com)
-+ *
-+ * Twiddled for 2.6 by Robert Walsh <rjwalsh@durables.org>
-+ * and wangdi <wangdi@clusterfs.com>.
-+ *
-+ * Refactored for netpoll API by Matt Mackall <mpm@selenic.com>
-+ *
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <linux/config.h>
-+#include <linux/string.h>
-+#include <linux/netpoll.h>
-+
-+#include <asm/system.h>
-+#include <asm/kgdb.h>
-+#include <asm/io.h>
-+#include <asm/bitops.h>
-+#include <asm/system.h>
-+#include <asm/irq.h>
-+#include <asm/atomic.h>
-+
-+#define IN_BUF_SIZE 512 /* power of 2, please */
-+#define OUT_BUF_SIZE 256
-+
-+static char in_buf[IN_BUF_SIZE], out_buf[OUT_BUF_SIZE];
-+static int in_head, in_tail, out_count;
-+static atomic_t in_count;
-+int kgdboe = 0; /* Default to tty mode */
-+
-+extern void set_debug_traps(void);
-+extern void breakpoint(void);
-+static void rx_hook(struct netpoll *np, int port, char *msg, int len);
-+
-+static struct netpoll np = {
-+ .name = "kgdboe",
-+ .dev_name = "eth0",
-+ .rx_hook = rx_hook,
-+ .local_port = 6443,
-+ .remote_port = 6442,
-+ .remote_mac = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-+};
-+
-+int eth_getDebugChar(void)
-+{
-+ int chr;
-+
-+ while (atomic_read(&in_count) == 0)
-+ netpoll_poll(&np);
-+
-+ chr = in_buf[in_tail++];
-+ in_tail &= (IN_BUF_SIZE - 1);
-+ atomic_dec(&in_count);
-+ return chr;
-+}
-+
-+void eth_flushDebugChar(void)
-+{
-+ if(out_count && np.dev) {
-+ netpoll_send_udp(&np, out_buf, out_count);
-+ out_count = 0;
-+ }
-+}
-+
-+void eth_putDebugChar(int chr)
-+{
-+ out_buf[out_count++] = chr;
-+ if(out_count == OUT_BUF_SIZE)
-+ eth_flushDebugChar();
-+}
-+
-+static void rx_hook(struct netpoll *np, int port, char *msg, int len)
-+{
-+ int i;
-+
-+ np->remote_port = port;
-+
-+ /* Is this gdb trying to attach? */
-+ if (!netpoll_trap() && len == 8 && !strncmp(msg, "$Hc-1#09", 8))
-+ kgdb_schedule_breakpoint();
-+
-+ for (i = 0; i < len; i++) {
-+ if (msg[i] == 3)
-+ kgdb_schedule_breakpoint();
-+
-+ if (atomic_read(&in_count) >= IN_BUF_SIZE) {
-+ /* buffer overflow, clear it */
-+ in_head = in_tail = 0;
-+ atomic_set(&in_count, 0);
-+ break;
-+ }
-+ in_buf[in_head++] = msg[i];
-+ in_head &= (IN_BUF_SIZE - 1);
-+ atomic_inc(&in_count);
-+ }
-+}
-+
-+static int option_setup(char *opt)
-+{
-+ return netpoll_parse_options(&np, opt);
-+}
-+
-+__setup("kgdboe=", option_setup);
-+
-+static int init_kgdboe(void)
-+{
-+#ifdef CONFIG_SMP
-+ if (num_online_cpus() > CONFIG_NO_KGDB_CPUS) {
-+ printk("kgdb: too manu cpus. Cannot enable debugger with more than %d cpus\n", CONFIG_NO_KGDB_CPUS);
-+ return -1;
-+ }
-+#endif
-+
-+ set_debug_traps();
-+
-+ if(!np.remote_ip || netpoll_setup(&np))
-+ return 1;
-+
-+ kgdboe = 1;
-+ printk(KERN_INFO "kgdb: debugging over ethernet enabled\n");
-+
-+ return 0;
-+}
-+
-+module_init(init_kgdboe);
---- linux-2.6.0/drivers/net/lance.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/lance.c 2003-12-28 23:21:01.000000000 -0800
-@@ -59,8 +59,8 @@ static const char version[] = "lance.c:v
- #include <asm/dma.h>
-
- static unsigned int lance_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x360, 0};
--int lance_probe(struct net_device *dev);
- static int lance_probe1(struct net_device *dev, int ioaddr, int irq, int options);
-+static int __init do_lance_probe(struct net_device *dev);
-
- #ifdef LANCE_DEBUG
- static int lance_debug = LANCE_DEBUG;
-@@ -274,7 +274,6 @@ enum {OLD_LANCE = 0, PCNET_ISA=1, PCNET_
- static unsigned char lance_need_isa_bounce_buffers = 1;
-
- static int lance_open(struct net_device *dev);
--static int lance_open_fail(struct net_device *dev);
- static void lance_init_ring(struct net_device *dev, int mode);
- static int lance_start_xmit(struct sk_buff *skb, struct net_device *dev);
- static int lance_rx(struct net_device *dev);
-@@ -286,10 +285,21 @@ static void lance_tx_timeout (struct net
-
- \f
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ struct lance_private *lp = dev->priv;
-+ if (dev->dma != 4)
-+ free_dma(dev->dma);
-+ release_region(dev->base_addr, LANCE_TOTAL_SIZE);
-+ kfree(lp->tx_bounce_buffs);
-+ kfree((void*)lp->rx_buffs);
-+ kfree(lp);
-+}
-+
- #ifdef MODULE
- #define MAX_CARDS 8 /* Max number of interfaces (cards) per module */
-
--static struct net_device dev_lance[MAX_CARDS];
-+static struct net_device *dev_lance[MAX_CARDS];
- static int io[MAX_CARDS];
- static int dma[MAX_CARDS];
- static int irq[MAX_CARDS];
-@@ -305,28 +315,35 @@ MODULE_PARM_DESC(lance_debug, "LANCE/PCn
-
- int init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) {
-- struct net_device *dev = &dev_lance[this_dev];
-- dev->irq = irq[this_dev];
-- dev->base_addr = io[this_dev];
-- dev->dma = dma[this_dev];
-- dev->init = lance_probe;
- if (io[this_dev] == 0) {
-- if (this_dev != 0) break; /* only complain once */
-+ if (this_dev != 0) /* only complain once */
-+ break;
- printk(KERN_NOTICE "lance.c: Module autoprobing not allowed. Append \"io=0xNNN\" value(s).\n");
- return -EPERM;
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "lance.c: No PCnet/LANCE card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) return 0; /* Got at least one. */
-- return -ENXIO;
-+ dev = alloc_etherdev(0);
-+ if (!dev)
-+ break;
-+ dev->irq = irq[this_dev];
-+ dev->base_addr = io[this_dev];
-+ dev->dma = dma[this_dev];
-+ if (do_lance_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_lance[found++] = dev;
-+ continue;
-+ }
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ break;
- }
--
-- return 0;
-+ if (found != 0)
-+ return 0;
-+ return -ENXIO;
- }
-
- void cleanup_module(void)
-@@ -334,13 +351,11 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) {
-- struct net_device *dev = &dev_lance[this_dev];
-- if (dev->priv != NULL) {
-+ struct net_device *dev = dev_lance[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- free_dma(dev->dma);
-- release_region(dev->base_addr, LANCE_TOTAL_SIZE);
-- kfree(dev->priv);
-- dev->priv = NULL;
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
-@@ -352,7 +367,7 @@ MODULE_LICENSE("GPL");
- board probes now that kmalloc() can allocate ISA DMA-able regions.
- This also allows the LANCE driver to be used as a module.
- */
--int __init lance_probe(struct net_device *dev)
-+static int __init do_lance_probe(struct net_device *dev)
- {
- int *port, result;
-
-@@ -387,6 +402,31 @@ int __init lance_probe(struct net_device
- return -ENODEV;
- }
-
-+struct net_device * __init lance_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(0);
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_lance_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init lance_probe1(struct net_device *dev, int ioaddr, int irq, int options)
- {
- struct lance_private *lp;
-@@ -398,6 +438,7 @@ static int __init lance_probe1(struct ne
- int hp_builtin = 0; /* HP on-board ethernet. */
- static int did_version; /* Already printed version info. */
- unsigned long flags;
-+ int err = -ENOMEM;
-
- /* First we look for special cases.
- Check for HP's on-board ethernet by looking for 'HP' in the BIOS.
-@@ -432,7 +473,7 @@ static int __init lance_probe1(struct ne
- outw(88, ioaddr+LANCE_ADDR);
- if (inw(ioaddr+LANCE_ADDR) != 88) {
- lance_version = 0;
-- } else { /* Good, it's a newer chip. */
-+ } else { /* Good, it's a newer chip. */
- int chip_version = inw(ioaddr+LANCE_DATA);
- outw(89, ioaddr+LANCE_ADDR);
- chip_version |= inw(ioaddr+LANCE_DATA) << 16;
-@@ -447,13 +488,9 @@ static int __init lance_probe1(struct ne
- }
- }
-
-- /* We can't use init_etherdev() to allocate dev->priv because it must
-+ /* We can't allocate dev->priv from alloc_etherdev() because it must
- a ISA DMA-able region. */
-- dev = init_etherdev(dev, 0);
-- if (!dev)
-- return -ENOMEM;
- SET_MODULE_OWNER(dev);
-- dev->open = lance_open_fail;
- chipname = chip_table[lance_version].name;
- printk("%s: %s at %#3x,", dev->name, chipname, ioaddr);
-
-@@ -465,8 +502,7 @@ static int __init lance_probe1(struct ne
- dev->base_addr = ioaddr;
- /* Make certain the data structures used by the LANCE are aligned and DMAble. */
-
-- lp = (struct lance_private *)(((unsigned long)kmalloc(sizeof(*lp)+7,
-- GFP_DMA | GFP_KERNEL)+7) & ~7);
-+ lp = kmalloc(sizeof(*lp), GFP_DMA | GFP_KERNEL);
- if(lp==NULL)
- return -ENODEV;
- if (lance_debug > 6) printk(" (#0x%05lx)", (unsigned long)lp);
-@@ -486,7 +522,7 @@ static int __init lance_probe1(struct ne
- lp->tx_bounce_buffs = NULL;
-
- lp->chip_version = lance_version;
-- lp->devlock = SPIN_LOCK_UNLOCKED;
-+ spin_lock_init(&lp->devlock);
-
- lp->init_block.mode = 0x0003; /* Disable Rx and Tx. */
- for (i = 0; i < 6; i++)
-@@ -540,6 +576,7 @@ static int __init lance_probe1(struct ne
- dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) |
- (inb(DMA2_STAT_REG) & 0xf0);
- }
-+ err = -ENODEV;
- if (dev->irq >= 2)
- printk(" assigned IRQ %d", dev->irq);
- else if (lance_version != 0) { /* 7990 boards need DMA detection first. */
-@@ -559,7 +596,7 @@ static int __init lance_probe1(struct ne
- printk(", probed IRQ %d", dev->irq);
- else {
- printk(", failed to detect IRQ line.\n");
-- return -ENODEV;
-+ goto out_tx;
- }
-
- /* Check for the initialization done bit, 0x0100, which means
-@@ -573,7 +610,7 @@ static int __init lance_probe1(struct ne
- } else if (dev->dma) {
- if (request_dma(dev->dma, chipname)) {
- printk("DMA %d allocation failed.\n", dev->dma);
-- return -ENODEV;
-+ goto out_tx;
- } else
- printk(", assigned DMA %d.\n", dev->dma);
- } else { /* OK, we have to auto-DMA. */
-@@ -613,7 +650,7 @@ static int __init lance_probe1(struct ne
- }
- if (i == 4) { /* Failure: bail. */
- printk("DMA detection failed.\n");
-- return -ENODEV;
-+ goto out_tx;
- }
- }
-
-@@ -629,7 +666,7 @@ static int __init lance_probe1(struct ne
- dev->irq = probe_irq_off(irq_mask);
- if (dev->irq == 0) {
- printk(" Failed to detect the 7990 IRQ line.\n");
-- return -ENODEV;
-+ goto out_dma;
- }
- printk(" Auto-IRQ detected IRQ%d.\n", dev->irq);
- }
-@@ -655,18 +692,18 @@ static int __init lance_probe1(struct ne
- dev->watchdog_timeo = TX_TIMEOUT;
-
- return 0;
--out_rx: kfree((void*)lp->rx_buffs);
--out_lp: kfree(lp);
-- return -ENOMEM;
--}
--
--static int
--lance_open_fail(struct net_device *dev)
--{
-- return -ENODEV;
-+out_dma:
-+ if (dev->dma != 4)
-+ free_dma(dev->dma);
-+out_tx:
-+ kfree(lp->tx_bounce_buffs);
-+out_rx:
-+ kfree((void*)lp->rx_buffs);
-+out_lp:
-+ kfree(lp);
-+ return err;
- }
-
--
- \f
- static int
- lance_open(struct net_device *dev)
---- linux-2.6.0/drivers/net/lasi_82596.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/lasi_82596.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1149,12 +1149,11 @@ static void print_eth(unsigned char *add
-
- #define LAN_PROM_ADDR 0xF0810000
-
--static int __devinit i82596_probe(struct net_device *dev)
-+static int __devinit i82596_probe(struct net_device *dev,
-+ struct device *gen_dev)
- {
- int i;
- struct i596_private *lp;
-- /* we're going to overwrite dev->priv, so pull the device out */
-- struct device *gen_dev = dev->priv;
- char eth_addr[6];
- dma_addr_t dma_addr;
-
-@@ -1204,7 +1203,6 @@ static int __devinit i82596_probe(struct
- return -ENOMEM;
- }
-
-- ether_setup(dev);
- DEB(DEB_PROBE,printk("%s: 82596 at %#3lx,", dev->name, dev->base_addr));
-
- for (i = 0; i < 6; i++)
-@@ -1537,12 +1535,19 @@ lan_init_chip(struct parisc_device *dev)
-
- netdevice->base_addr = dev->hpa;
- netdevice->irq = dev->irq;
-- netdevice->init = i82596_probe;
-- netdevice->priv = &dev->dev;
-+
-+ retval = i82596_probe(netdevice, &dev->dev);
-+ if (retval) {
-+ free_netdev(netdevice);
-+ return -ENODEV;
-+ }
-
- retval = register_netdev(netdevice);
- if (retval) {
-+ struct i596_private *lp = netdevice->priv;
- printk(KERN_WARNING __FILE__ ": register_netdevice ret'd %d\n", retval);
-+ dma_free_noncoherent(lp->dev, sizeof(struct i596_private),
-+ (void *)netdevice->mem_start, lp->dma_addr);
- free_netdev(netdevice);
- return -ENODEV;
- };
---- linux-2.6.0/drivers/net/lne390.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/lne390.c 2003-12-28 23:21:01.000000000 -0800
-@@ -49,7 +49,6 @@ static const char *version =
-
- #include "8390.h"
-
--int lne390_probe(struct net_device *dev);
- static int lne390_probe1(struct net_device *dev, int ioaddr);
-
- static int lne390_open(struct net_device *dev);
-@@ -103,9 +102,11 @@ static unsigned int shmem_mapB[] __initd
- * PROM for a match against the value assigned to Mylex.
- */
-
--int __init lne390_probe(struct net_device *dev)
-+static int __init do_lne390_probe(struct net_device *dev)
- {
- unsigned short ioaddr = dev->base_addr;
-+ int irq = dev->irq;
-+ int mem_start = dev->mem_start;
- int ret;
-
- SET_MODULE_OWNER(dev);
-@@ -135,11 +136,46 @@ int __init lne390_probe(struct net_devic
- if (lne390_probe1(dev, ioaddr) == 0)
- return 0;
- release_region(ioaddr, LNE390_IO_EXTENT);
-+ dev->irq = irq;
-+ dev->mem_start = mem_start;
- }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, LNE390_IO_EXTENT);
-+ if (ei_status.reg0)
-+ iounmap((void *)dev->mem_start);
-+}
-+
-+struct net_device * __init lne390_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_lne390_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init lne390_probe1(struct net_device *dev, int ioaddr)
- {
- int i, revision, ret;
-@@ -174,11 +210,6 @@ static int __init lne390_probe1(struct n
- return -ENODEV;
- }
- #endif
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk ("lne390.c: unable to allocate memory for dev->priv!\n");
-- return -ENOMEM;
-- }
-
- printk("lne390.c: LNE390%X in EISA slot %d, address", 0xa+revision, ioaddr/0x1000);
- for(i = 0; i < ETHER_ADDR_LEN; i++)
-@@ -199,8 +230,6 @@ static int __init lne390_probe1(struct n
-
- if ((ret = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
- printk (" unable to get IRQ %d.\n", dev->irq);
-- kfree(dev->priv);
-- dev->priv = NULL;
- return ret;
- }
-
-@@ -274,8 +303,6 @@ static int __init lne390_probe1(struct n
- return 0;
- cleanup:
- free_irq(dev->irq, dev);
-- kfree(dev->priv);
-- dev->priv = NULL;
- return ret;
- }
-
-@@ -373,7 +400,7 @@ static int lne390_close(struct net_devic
-
- #ifdef MODULE
- #define MAX_LNE_CARDS 4 /* Max number of LNE390 cards per module */
--static struct net_device dev_lne[MAX_LNE_CARDS];
-+static struct net_device *dev_lne[MAX_LNE_CARDS];
- static int io[MAX_LNE_CARDS];
- static int irq[MAX_LNE_CARDS];
- static int mem[MAX_LNE_CARDS];
-@@ -389,26 +416,32 @@ MODULE_LICENSE("GPL");
-
- int init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_LNE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_lne[this_dev];
-+ if (io[this_dev] == 0 && this_dev != 0)
-+ break;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
- dev->irq = irq[this_dev];
- dev->base_addr = io[this_dev];
- dev->mem_start = mem[this_dev];
-- dev->init = lne390_probe;
-- /* Default is to only install one card. */
-- if (io[this_dev] == 0 && this_dev != 0) break;
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "lne390.c: No LNE390 card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ if (do_lne390_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_lne[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-- }
-- return 0;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "lne390.c: No LNE390 card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
-+ }
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void cleanup_module(void)
-@@ -416,15 +449,11 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_LNE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_lne[this_dev];
-- if (dev->priv != NULL) {
-- void *priv = dev->priv;
-- free_irq(dev->irq, dev);
-- release_region(dev->base_addr, LNE390_IO_EXTENT);
-- if (ei_status.reg0)
-- iounmap((void *)dev->mem_start);
-+ struct net_device *dev = dev_lne[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/lp486e.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/lp486e.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1314,18 +1314,23 @@ static int io = IOADDR;
- static int irq = IRQ;
-
- static int __init lp486e_init_module(void) {
-- struct net_device *dev;
--
-- dev = alloc_etherdev(sizeof(struct i596_private));
-+ int err;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct i596_private));
- if (!dev)
- return -ENOMEM;
-
- dev->irq = irq;
- dev->base_addr = io;
-- dev->init = lp486e_probe;
-- if (register_netdev(dev) != 0) {
-+ err = lp486e_probe(dev);
-+ if (err) {
-+ free_netdev(dev);
-+ return err;
-+ }
-+ err = register_netdev(dev);
-+ if (err) {
-+ release_region(dev->base_addr, LP486E_TOTAL_SIZE);
- free_netdev(dev);
-- return -EIO;
-+ return err;
- }
- dev_lp486e = dev;
- full_duplex = 0;
---- linux-2.6.0/drivers/net/mac8390.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/mac8390.c 2003-12-28 23:21:01.000000000 -0800
-@@ -124,11 +124,10 @@ static int useresources[] = {
- static char version[] __initdata =
- "mac8390.c: v0.4 2001-05-15 David Huggins-Daines <dhd@debian.org> and others\n";
-
--extern int mac8390_probe(struct net_device * dev);
- extern enum mac8390_type mac8390_ident(struct nubus_dev * dev);
- extern int mac8390_memsize(unsigned long membase);
- extern int mac8390_memtest(struct net_device * dev);
--extern int mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev,
-+static int mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev,
- enum mac8390_type type);
-
- static int mac8390_open(struct net_device * dev);
-@@ -223,43 +222,43 @@ int __init mac8390_memsize(unsigned long
- return i * 0x1000;
- }
-
--static int probed __initdata = 0;
--
--int __init mac8390_probe(struct net_device * dev)
-+struct net_device * __init mac8390_probe(int unit)
- {
-+ struct net_device *dev;
- volatile unsigned short *i;
-- int boards_found = 0;
- int version_disp = 0;
- struct nubus_dev * ndev = NULL;
-+ int err = -ENODEV;
-
- struct nubus_dir dir;
- struct nubus_dirent ent;
- int offset;
-+ static unsigned int slots;
-
- enum mac8390_type cardtype;
-
-- if (probed)
-- return -ENODEV;
-- probed++;
--
- /* probably should check for Nubus instead */
-
- if (!MACH_IS_MAC)
-- return -ENODEV;
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0)
-+ sprintf(dev->name, "eth%d", unit);
-+
-+ SET_MODULE_OWNER(dev);
-
- while ((ndev = nubus_find_type(NUBUS_CAT_NETWORK, NUBUS_TYPE_ETHERNET, ndev))) {
--
-- dev = NULL;
--
-- if ((cardtype = mac8390_ident(ndev)) == MAC8390_NONE)
-+ /* Have we seen it already? */
-+ if (slots & (1<<ndev->board->slot))
- continue;
-+ slots |= 1<<ndev->board->slot;
-
-- dev = init_etherdev(dev, 0);
-- if (dev == NULL) {
-- printk(KERN_ERR "Unable to allocate etherdev"
-- "structure!\n");
-- return -ENOMEM;
-- }
-+ if ((cardtype = mac8390_ident(ndev)) == MAC8390_NONE)
-+ continue;
-
- if (version_disp == 0) {
- version_disp = 1;
-@@ -358,21 +357,25 @@ int __init mac8390_probe(struct net_devi
- printk(KERN_ERR "Card type %s is"
- " unsupported, sorry\n",
- cardname[cardtype]);
-- return -ENODEV;
-+ continue;
- }
- }
-
- /* Do the nasty 8390 stuff */
-- if (mac8390_initdev(dev, ndev, cardtype))
-- continue;
-- boards_found++;
-+ if (!mac8390_initdev(dev, ndev, cardtype))
-+ break;
- }
-
-- /* We're outta here */
-- if (boards_found > 0)
-- return 0;
-- else
-- return -ENODEV;
-+ if (!ndev)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out;
-+ return dev;
-+
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- #ifdef MODULE
-@@ -380,26 +383,39 @@ MODULE_AUTHOR("David Huggins-Daines <dhd
- MODULE_DESCRIPTION("Macintosh NS8390-based Nubus Ethernet driver");
- MODULE_LICENSE("GPL");
-
-+/* overkill, of course */
-+static struct net_device *dev_mac8390[15];
- int init_module(void)
- {
-- if (mac8390_probe(NULL)) {
-+ int i;
-+ for (i = 0; i < 15; i++) {
-+ struct net_device *dev = mac8390_probe(-1);
-+ if (IS_ERR(dev))
-+ break;
-+ dev_mac890[i] = dev;
-+ }
-+ if (!i) {
- printk(KERN_NOTICE "mac8390.c: No useable cards found, driver NOT installed.\n");
- return -ENODEV;
- }
-- lock_8390_module();
- return 0;
- }
-
- void cleanup_module(void)
- {
-- /* FIXME: should probably keep track of net_device structs
-- somewhere and unregister them here? */
-- unlock_8390_module();
-+ int i;
-+ for (i = 0; i < 15; i++) {
-+ struct net_device *dev = dev_mac890[i];
-+ if (dev) {
-+ unregister_netdev(dev);
-+ free_netdev(dev);
-+ }
-+ }
- }
-
- #endif /* MODULE */
-
--int __init mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev,
-+static int __init mac8390_initdev(struct net_device * dev, struct nubus_dev * ndev,
- enum mac8390_type type)
- {
- static u32 fwrd4_offsets[16]={
-@@ -423,12 +439,6 @@ int __init mac8390_initdev(struct net_de
-
- int access_bitmode;
-
-- /* 8390 specific init for dev - allocates dev->priv */
-- if (ethdev_init(dev)) {
-- printk(KERN_ERR "%s: Unable to allocate memory for dev->priv!\n", dev->name);
-- return -ENOMEM;
-- }
--
- /* Now fill in our stuff */
- dev->open = &mac8390_open;
- dev->stop = &mac8390_close;
-@@ -529,7 +539,6 @@ static int mac8390_open(struct net_devic
- printk ("%s: unable to get IRQ %d.\n", dev->name, dev->irq);
- return -EAGAIN;
- }
-- MOD_INC_USE_COUNT;
- return 0;
- }
-
-@@ -537,7 +546,6 @@ static int mac8390_close(struct net_devi
- {
- free_irq(dev->irq, dev);
- ei_close(dev);
-- MOD_DEC_USE_COUNT;
- return 0;
- }
-
---- linux-2.6.0/drivers/net/mac89x0.c 2003-06-14 12:18:21.000000000 -0700
-+++ 25/drivers/net/mac89x0.c 2003-12-28 23:21:01.000000000 -0800
-@@ -123,7 +123,6 @@ struct net_local {
-
- /* Index to functions, as function prototypes. */
-
--extern int mac89x0_probe(struct net_device *dev);
- #if 0
- extern void reset_chip(struct net_device *dev);
- #endif
-@@ -170,8 +169,9 @@ writereg(struct net_device *dev, int por
-
- /* Probe for the CS8900 card in slot E. We won't bother looking
- anywhere else until we have a really good reason to do so. */
--int __init mac89x0_probe(struct net_device *dev)
-+struct net_device * __init mac89x0_probe(int unit)
- {
-+ struct net_device *dev;
- static int once_is_enough;
- struct net_local *lp;
- static unsigned version_printed;
-@@ -179,18 +179,28 @@ int __init mac89x0_probe(struct net_devi
- unsigned rev_type = 0;
- unsigned long ioaddr;
- unsigned short sig;
-+ int err = -ENODEV;
-+
-+ dev = alloc_etherdev(sizeof(struct net_local));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-
- SET_MODULE_OWNER(dev);
-
- if (once_is_enough)
-- return -ENODEV;
-+ goto out;
- once_is_enough = 1;
-
- /* We might have to parameterize this later */
- slot = 0xE;
- /* Get out now if there's a real NuBus card in slot E */
- if (nubus_find_slot(slot, NULL) != NULL)
-- return -ENODEV;
-+ goto out;
-
- /* The pseudo-ISA bits always live at offset 0x300 (gee,
- wonder why...) */
-@@ -206,21 +216,15 @@ int __init mac89x0_probe(struct net_devi
- local_irq_restore(flags);
-
- if (!card_present)
-- return -ENODEV;
-+ goto out;
- }
-
- nubus_writew(0, ioaddr + ADD_PORT);
- sig = nubus_readw(ioaddr + DATA_PORT);
- if (sig != swab16(CHIP_EISA_ID_SIG))
-- return -ENODEV;
-+ goto out;
-
- /* Initialize the net_device structure. */
-- if (dev->priv == NULL) {
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (!dev->priv)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct net_local));
-- }
- lp = (struct net_local *)dev->priv;
-
- /* Fill in the 'dev' fields. */
-@@ -258,9 +262,7 @@ int __init mac89x0_probe(struct net_devi
- /* Try to read the MAC address */
- if ((readreg(dev, PP_SelfST) & (EEPROM_PRESENT | EEPROM_OK)) == 0) {
- printk("\nmac89x0: No EEPROM, giving up now.\n");
-- kfree(dev->priv);
-- dev->priv = NULL;
-- return -ENODEV;
-+ goto out1;
- } else {
- for (i = 0; i < ETH_ALEN; i += 2) {
- /* Big-endian (why??!) */
-@@ -277,6 +279,7 @@ int __init mac89x0_probe(struct net_devi
- for (i = 0; i < ETH_ALEN; i++)
- printk("%2.2x%s", dev->dev_addr[i],
- ((i < ETH_ALEN-1) ? ":" : ""));
-+ printk("\n");
-
- dev->open = net_open;
- dev->stop = net_close;
-@@ -285,11 +288,15 @@ int __init mac89x0_probe(struct net_devi
- dev->set_multicast_list = &set_multicast_list;
- dev->set_mac_address = &set_mac_address;
-
-- /* Fill in the fields of the net_device structure with ethernet values. */
-- ether_setup(dev);
--
-- printk("\n");
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
- return 0;
-+out1:
-+ nubus_writew(0, dev->base_addr + ADD_PORT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- #if 0
-@@ -619,7 +626,7 @@ static int set_mac_address(struct net_de
-
- #ifdef MODULE
-
--static struct net_device dev_cs89x0;
-+static struct net_device *dev_cs89x0;
- static int debug;
-
- MODULE_PARM(debug, "i");
-@@ -630,36 +637,20 @@ int
- init_module(void)
- {
- net_debug = debug;
-- dev_cs89x0.init = mac89x0_probe;
-- dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (!dev_cs89x0.priv)
-- return -ENOMEM;
-- memset(dev_cs89x0.priv, 0, sizeof(struct net_local));
--
-- if (register_netdev(&dev_cs89x0) != 0) {
-+ dev_cs89x0 = mac89x0_probe(-1);
-+ if (IS_ERR(dev_cs89x0)) {
- printk(KERN_WARNING "mac89x0.c: No card found\n");
-- kfree(dev_cs89x0.priv);
-- return -ENXIO;
-- }
-+ return PTR_ERR(dev_cs89x0);
-+ }
- return 0;
- }
-
- void
- cleanup_module(void)
- {
--
--#endif
--#ifdef MODULE
-- nubus_writew(0, dev_cs89x0.base_addr + ADD_PORT);
--#endif
--#ifdef MODULE
--
-- if (dev_cs89x0.priv != NULL) {
-- /* Free up the private structure, or leak memory :-) */
-- unregister_netdev(&dev_cs89x0);
-- kfree(dev_cs89x0.priv);
-- dev_cs89x0.priv = NULL; /* gets re-allocated by cs89x0_probe1 */
-- }
-+ unregister_netdev(dev_cs89x0);
-+ nubus_writew(0, dev_cs89x0->base_addr + ADD_PORT);
-+ free_netdev(dev_cs89x0);
- }
- #endif /* MODULE */
- \f
---- linux-2.6.0/drivers/net/mace.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/mace.c 2003-12-28 23:21:01.000000000 -0800
-@@ -142,6 +142,10 @@ static void __init mace_probe1(struct de
- }
- }
-
-+ /*
-+ * lazy allocation - it's a driver-wide thing and it will live until
-+ * the unload, but we don't allocate it until it's needed
-+ */
- if (dummy_buf == NULL) {
- dummy_buf = kmalloc(RX_BUFLEN+2, GFP_KERNEL);
- if (dummy_buf == NULL) {
-@@ -150,7 +154,7 @@ static void __init mace_probe1(struct de
- }
- }
-
-- dev = init_etherdev(0, PRIV_BYTES);
-+ dev = alloc_etherdev(PRIV_BYTES);
- if (!dev)
- return;
- SET_MODULE_OWNER(dev);
-@@ -160,16 +164,16 @@ static void __init mace_probe1(struct de
-
- if (!request_OF_resource(mace, 0, " (mace)")) {
- printk(KERN_ERR "MACE: can't request IO resource !\n");
-- goto err_out;
-+ goto out1;
- }
- if (!request_OF_resource(mace, 1, " (mace tx dma)")) {
- printk(KERN_ERR "MACE: can't request TX DMA resource !\n");
-- goto err_out;
-+ goto out2;
- }
-
- if (!request_OF_resource(mace, 2, " (mace tx dma)")) {
- printk(KERN_ERR "MACE: can't request RX DMA resource !\n");
-- goto err_out;
-+ goto out3;
- }
-
- dev->base_addr = mace->addrs[0].address;
-@@ -229,30 +233,42 @@ static void __init mace_probe1(struct de
- dev->set_multicast_list = mace_set_multicast;
- dev->set_mac_address = mace_set_address;
-
-- ether_setup(dev);
--
- mace_reset(dev);
-
-- if (request_irq(dev->irq, mace_interrupt, 0, "MACE", dev))
-+ if (request_irq(dev->irq, mace_interrupt, 0, "MACE", dev)) {
- printk(KERN_ERR "MACE: can't get irq %d\n", dev->irq);
-+ goto out4;
-+ }
- if (request_irq(mace->intrs[1].line, mace_txdma_intr, 0, "MACE-txdma",
-- dev))
-+ dev)) {
- printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[1].line);
-+ goto out5;
-+ }
- if (request_irq(mace->intrs[2].line, mace_rxdma_intr, 0, "MACE-rxdma",
-- dev))
-+ dev)) {
- printk(KERN_ERR "MACE: can't get irq %d\n", mace->intrs[2].line);
-+ goto out6;
-+ }
-+ if (register_netdev(dev) != 0)
-+ goto out7;
-
- mp->next_mace = mace_devs;
- mace_devs = dev;
- return;
-
--err_out:
-- unregister_netdev(dev);
-- if (mp->of_node) {
-- release_OF_resource(mp->of_node, 0);
-- release_OF_resource(mp->of_node, 1);
-- release_OF_resource(mp->of_node, 2);
-- }
-+out7:
-+ free_irq(mp->rx_dma_intr, dev);
-+out6:
-+ free_irq(mp->tx_dma_intr, dev);
-+out5:
-+ free_irq(dev->irq, dev);
-+out4:
-+ release_OF_resource(mp->of_node, 2);
-+out3:
-+ release_OF_resource(mp->of_node, 1);
-+out2:
-+ release_OF_resource(mp->of_node, 0);
-+out1:
- free_netdev(dev);
- }
-
-@@ -975,7 +991,7 @@ static void __exit mace_cleanup (void)
- release_OF_resource(mp->of_node, 1);
- release_OF_resource(mp->of_node, 2);
-
-- kfree(dev);
-+ free_netdev(dev);
- }
- if (dummy_buf != NULL) {
- kfree(dummy_buf);
---- linux-2.6.0/drivers/net/macmace.c 2003-06-14 12:18:07.000000000 -0700
-+++ 25/drivers/net/macmace.c 2003-12-28 23:21:01.000000000 -0800
-@@ -180,7 +180,7 @@ static void mace_dma_off(struct net_devi
- * model of Macintrash has a MACE (AV macintoshes)
- */
-
--int mace_probe(struct net_device *unused)
-+struct net_device *mace_probe(int unit)
- {
- int j;
- struct mace_data *mp;
-@@ -188,13 +188,19 @@ int mace_probe(struct net_device *unused
- struct net_device *dev;
- unsigned char checksum = 0;
- static int found = 0;
-+ int err;
-
-- if (found || macintosh_config->ether_type != MAC_ETHER_MACE) return -ENODEV;
-+ if (found || macintosh_config->ether_type != MAC_ETHER_MACE)
-+ return ERR_PTR(-ENODEV);
-
- found = 1; /* prevent 'finding' one on every device probe */
-
-- dev = init_etherdev(0, PRIV_BYTES);
-- if (!dev) return -ENOMEM;
-+ dev = alloc_etherdev(PRIV_BYTES);
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0)
-+ sprintf(dev->name, "eth%d", unit);
-
- mp = (struct mace_data *) dev->priv;
- dev->base_addr = (u32)MACE_BASE;
-@@ -221,7 +227,10 @@ int mace_probe(struct net_device *unused
- checksum ^= bitrev(addr[j<<4]);
- }
-
-- if (checksum != 0xFF) return -ENODEV;
-+ if (checksum != 0xFF) {
-+ free_netdev(dev);
-+ return ERR_PTR(-ENODEV);
-+ }
-
- memset(&mp->stats, 0, sizeof(mp->stats));
-
-@@ -234,13 +243,16 @@ int mace_probe(struct net_device *unused
- dev->set_multicast_list = mace_set_multicast;
- dev->set_mac_address = mace_set_address;
-
-- ether_setup(dev);
--
- printk(KERN_INFO "%s: 68K MACE, hardware address %.2X", dev->name, dev->dev_addr[0]);
- for (j = 1 ; j < 6 ; j++) printk(":%.2X", dev->dev_addr[j]);
- printk("\n");
-
-- return 0;
-+ err = register_netdev(dev);
-+ if (!err)
-+ return dev;
-+
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /*
---- linux-2.6.0/drivers/net/macsonic.c 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/net/macsonic.c 2003-12-28 23:21:01.000000000 -0800
-@@ -74,7 +74,6 @@ static int sonic_version_printed;
-
- static int reg_offset;
-
--extern int macsonic_probe(struct net_device* dev);
- extern int mac_onboard_sonic_probe(struct net_device* dev);
- extern int mac_nubus_sonic_probe(struct net_device* dev);
-
-@@ -110,14 +109,38 @@ enum macsonic_type {
-
- #define SONIC_READ_PROM(addr) nubus_readb(prom_addr+addr)
-
--int __init macsonic_probe(struct net_device* dev)
-+struct net_device * __init macsonic_probe(int unit)
- {
-- int rv;
-+ struct net_device *dev = alloc_etherdev(0);
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0)
-+ sprintf(dev->name, "eth%d", unit);
-+
-+ SET_MODULE_OWNER(dev);
-
- /* This will catch fatal stuff like -ENOMEM as well as success */
-- if ((rv = mac_onboard_sonic_probe(dev)) != -ENODEV)
-- return rv;
-- return mac_nubus_sonic_probe(dev);
-+ err = mac_onboard_sonic_probe(dev);
-+ if (err == 0)
-+ goto found;
-+ if (err != -ENODEV)
-+ goto out;
-+ err = mac_nubus_sonic_probe(dev);
-+ if (err)
-+ goto out;
-+found:
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ kfree(dev->priv);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /*
-@@ -195,6 +218,7 @@ int __init macsonic_init(struct net_devi
- if ((lp->rba = (char *)
- kmalloc(SONIC_NUM_RRS * SONIC_RBSIZE, GFP_KERNEL | GFP_DMA)) == NULL) {
- printk(KERN_ERR "%s: couldn't allocate receive buffers\n", dev->name);
-+ dev->priv = NULL;
- kfree(lp);
- return -ENOMEM;
- }
-@@ -229,8 +253,6 @@ int __init macsonic_init(struct net_devi
- sonic_write(dev, SONIC_FAET, 0xffff);
- sonic_write(dev, SONIC_MPT, 0xffff);
-
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
- return 0;
- }
-
-@@ -344,30 +366,6 @@ int __init mac_onboard_sonic_probe(struc
-
- printk("yes\n");
-
-- if (dev) {
-- dev = init_etherdev(dev, sizeof(struct sonic_local));
-- if (!dev)
-- return -ENOMEM;
-- /* methinks this will always be true but better safe than sorry */
-- if (dev->priv == NULL) {
-- dev->priv = kmalloc(sizeof(struct sonic_local), GFP_KERNEL);
-- if (!dev->priv)
-- return -ENOMEM;
-- }
-- } else {
-- dev = init_etherdev(NULL, sizeof(struct sonic_local));
-- }
--
-- if (dev == NULL)
-- return -ENOMEM;
--
-- if(dev->priv) {
-- printk("%s: warning! sonic entering with priv already allocated!\n",
-- dev->name);
-- printk("%s: discarding, will attempt to reallocate\n", dev->name);
-- dev->priv = NULL;
-- }
--
- /* Danger! My arms are flailing wildly! You *must* set this
- before using sonic_read() */
-
-@@ -497,7 +495,6 @@ int __init mac_nubus_sonic_probe(struct
- {
- static int slots;
- struct nubus_dev* ndev = NULL;
-- struct sonic_local* lp;
- unsigned long base_addr, prom_addr;
- u16 sonic_dcr;
- int id;
-@@ -567,25 +564,6 @@ int __init mac_nubus_sonic_probe(struct
- return -ENODEV;
- }
-
-- if (dev) {
-- dev = init_etherdev(dev, sizeof(struct sonic_local));
-- if (!dev)
-- return -ENOMEM;
-- /* methinks this will always be true but better safe than sorry */
-- if (dev->priv == NULL) {
-- dev->priv = kmalloc(sizeof(struct sonic_local), GFP_KERNEL);
-- if (!dev->priv) /* FIXME: kfree dev if necessary */
-- return -ENOMEM;
-- }
-- } else {
-- dev = init_etherdev(NULL, sizeof(struct sonic_local));
-- }
--
-- if (dev == NULL)
-- return -ENOMEM;
--
-- lp = (struct sonic_local*) dev->priv;
-- memset(lp, 0, sizeof(struct sonic_local));
- /* Danger! My arms are flailing wildly! You *must* set this
- before using sonic_read() */
- dev->base_addr = base_addr;
-@@ -631,8 +609,7 @@ int __init mac_nubus_sonic_probe(struct
- }
-
- #ifdef MODULE
--static char namespace[16] = "";
--static struct net_device dev_macsonic;
-+static struct net_device *dev_macsonic;
-
- MODULE_PARM(sonic_debug, "i");
- MODULE_PARM_DESC(sonic_debug, "macsonic debug level (1-4)");
-@@ -641,24 +618,20 @@ MODULE_LICENSE("GPL");
- int
- init_module(void)
- {
-- dev_macsonic.name = namespace;
-- dev_macsonic.init = macsonic_probe;
--
-- if (register_netdev(&dev_macsonic) != 0) {
-+ dev_macsonic = macsonic_probe(-1);
-+ if (IS_ERR(dev_macsonic)) {
- printk(KERN_WARNING "macsonic.c: No card found\n");
-- return -ENXIO;
-- }
-+ return PTR_ERR(dev_macsonic);
-+ }
- return 0;
- }
-
- void
- cleanup_module(void)
- {
-- if (dev_macsonic.priv != NULL) {
-- unregister_netdev(&dev_macsonic);
-- kfree(dev_macsonic.priv);
-- dev_macsonic.priv = NULL;
-- }
-+ unregister_netdev(dev_macsonic);
-+ kfree(dev_macsonic->priv);
-+ free_netdev(dev_macsonic);
- }
- #endif /* MODULE */
-
---- linux-2.6.0/drivers/net/Makefile 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/Makefile 2003-12-28 23:21:09.000000000 -0800
-@@ -8,7 +8,6 @@ ifeq ($(CONFIG_ISDN_PPP),y)
- obj-$(CONFIG_ISDN) += slhc.o
- endif
-
--obj-$(CONFIG_E100) += e100/
- obj-$(CONFIG_E1000) += e1000/
- obj-$(CONFIG_IXGB) += ixgb/
- obj-$(CONFIG_BONDING) += bonding/
-@@ -39,6 +38,7 @@ obj-$(CONFIG_TYPHOON) += typhoon.o
- obj-$(CONFIG_NE2K_PCI) += ne2k-pci.o 8390.o
- obj-$(CONFIG_PCNET32) += pcnet32.o
- obj-$(CONFIG_EEPRO100) += eepro100.o
-+obj-$(CONFIG_E100) += e100.o
- obj-$(CONFIG_TLAN) += tlan.o
- obj-$(CONFIG_EPIC100) += epic100.o
- obj-$(CONFIG_SIS190) += sis190.o
-@@ -95,6 +95,7 @@ obj-$(CONFIG_LNE390) += lne390.o 8390.o
- obj-$(CONFIG_NE3210) += ne3210.o 8390.o
- obj-$(CONFIG_NET_SB1250_MAC) += sb1250-mac.o
- obj-$(CONFIG_B44) += b44.o
-+obj-$(CONFIG_FORCEDETH) += forcedeth.o
-
- obj-$(CONFIG_PPP) += ppp_generic.o slhc.o
- obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
-@@ -111,7 +112,6 @@ endif
- obj-$(CONFIG_DUMMY) += dummy.o
- obj-$(CONFIG_DE600) += de600.o
- obj-$(CONFIG_DE620) += de620.o
--obj-$(CONFIG_AT1500) += lance.o
- obj-$(CONFIG_LANCE) += lance.o
- obj-$(CONFIG_SUN3_82586) += sun3_82586.o
- obj-$(CONFIG_SUN3LANCE) += sun3lance.o
-@@ -188,3 +188,6 @@ obj-$(CONFIG_NET_TULIP) += tulip/
- obj-$(CONFIG_HAMRADIO) += hamradio/
- obj-$(CONFIG_IRDA) += irda/
-
-+# Must come after all NICs that might use them
-+obj-$(CONFIG_NETCONSOLE) += netconsole.o
-+obj-$(CONFIG_KGDB) += kgdb_eth.o
---- linux-2.6.0/drivers/net/meth.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/meth.c 2003-12-28 23:21:01.000000000 -0800
-@@ -95,7 +95,6 @@ typedef struct meth_private {
- spinlock_t meth_lock;
- } meth_private;
-
--extern struct net_device meth_devs[];
- void meth_tx_timeout (struct net_device *dev);
- void meth_interrupt(int irq, void *dev_id, struct pt_regs *pregs);
-
-@@ -762,17 +761,16 @@ struct net_device_stats *meth_stats(stru
-
- /*
- * The init function (sometimes called probe).
-- * It is invoked by register_netdev()
- */
--int meth_init(struct net_device *dev)
-+static struct net_device *meth_init(struct net_device *dev)
- {
-+ struct net_device *dev;
- meth_private *priv;
- int ret;
-- /*
-- * Then, assign other fields in dev, using ether_setup() and some
-- * hand assignments
-- */
-- ether_setup(dev); /* assign some of the fields */
-+
-+ dev = alloc_etherdev(sizeof(struct meth_private));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
- dev->open = meth_open;
- dev->stop = meth_release;
-@@ -787,16 +785,8 @@ int meth_init(struct net_device *dev)
- dev->irq = MACE_ETHERNET_IRQ;
- SET_MODULE_OWNER(dev);
-
-- /*
-- * Then, allocate the priv field. This encloses the statistics
-- * and a few private fields.
-- */
-- priv = kmalloc(sizeof(struct meth_private), GFP_KERNEL);
-- if (priv == NULL)
-- return -ENOMEM;
-- dev->priv=priv;
-- memset(priv, 0, sizeof(struct meth_private));
-- spin_lock_init(&((struct meth_private *) dev->priv)->meth_lock);
-+ priv = dev->priv;
-+ spin_lock_init(&priv->meth_lock);
- /*
- * Make the usual checks: check_region(), probe irq, ... -ENODEV
- * should be returned if no device found. No resource should be
-@@ -807,28 +797,41 @@ int meth_init(struct net_device *dev)
- priv->phy_addr = -1; /* No phy is known yet... */
-
- /* Initialize the hardware */
-- if((ret=meth_reset(dev)) < 0)
-- return ret;
-+ ret = meth_reset(dev);
-+ if (ret < 0)
-+ goto out;
-
- /* Allocate the ring buffers */
-- if((ret=meth_init_tx_ring(priv))<0||(ret=meth_init_rx_ring(priv))<0){
-- meth_free_tx_ring(priv);
-- meth_free_rx_ring(priv);
-- return ret;
-- }
-+ ret = meth_init_tx_ring(priv);
-+ if (ret < 0)
-+ goto out;
-+
-+ ret = meth_init_rx_ring(priv);
-+ if (ret < 0)
-+ goto out1;
-+
-+ ret = register_netdev(dev);
-+ if (ret)
-+ goto out2;
-
- printk("SGI O2 Fast Ethernet rev. %ld\n", priv->regs->mac_ctrl >> 29);
-
-- return 0;
-+ return ret;
-+
-+out2:
-+ meth_free_rx_ring(priv);
-+out1:
-+ meth_free_tx_ring(priv);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(ret);
- }
-
- /*
- * The devices
- */
-
--struct net_device meth_devs[1] = {
-- { init: meth_init, } /* init, nothing more */
--};
-+struct net_device *meth_dev;
-
- /*
- * Finally, the module stuff
-@@ -836,23 +839,19 @@ struct net_device meth_devs[1] = {
-
- int meth_init_module(void)
- {
-- int result, device_present = 0;
--
-- strcpy(meth_devs[0].name, "eth%d");
--
-- if ( (result = register_netdev(meth_devs)) )
-- printk("meth: error %i registering device \"%s\"\n",
-- result, meth_devs->name);
-- else device_present++;
--
-- return device_present ? 0 : -ENODEV;
-+ meth_dev = meth_init();
-+ if (IS_ERR(meth_dev))
-+ return PTR_ERR(meth_dev);
-+ return 0;
- }
-
- void meth_cleanup(void)
- {
-- kfree(meth_devs->priv);
-- unregister_netdev(meth_devs);
-- return;
-+ meth_private *priv = meth_dev->priv;
-+ unregister_netdev(meth_dev);
-+ meth_free_rx_ring(priv);
-+ meth_free_tx_ring(priv);
-+ free_netdev(meth_dev);
- }
-
- module_init(meth_init_module);
---- linux-2.6.0/drivers/net/mvme147.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/mvme147.c 2003-12-28 23:21:01.000000000 -0800
-@@ -41,7 +41,7 @@
- struct m147lance_private {
- struct lance_private lance;
- void *base;
-- void *ram;
-+ unsigned long ram;
- };
-
- /* function prototypes... This is easy because all the grot is in the
-@@ -49,7 +49,6 @@ struct m147lance_private {
- * plus board-specific init, open and close actions.
- * Oh, and we need to tell the generic code how to read and write LANCE registers...
- */
--int mvme147lance_probe(struct net_device *dev);
- static int m147lance_open(struct net_device *dev);
- static int m147lance_close(struct net_device *dev);
- static void m147lance_writerap(struct m147lance_private *lp, unsigned short value);
-@@ -60,29 +59,29 @@ typedef void (*writerap_t)(void *, unsig
- typedef void (*writerdp_t)(void *, unsigned short);
- typedef unsigned short (*readrdp_t)(void *);
-
--#ifdef MODULE
--static struct m147lance_private *root_m147lance_dev;
--#endif
--
- /* Initialise the one and only on-board 7990 */
--int __init mvme147lance_probe(struct net_device *dev)
-+struct net_device * __init mvme147lance_probe(int unit)
- {
-+ struct net_device *dev;
- static int called;
- static const char name[] = "MVME147 LANCE";
- struct m147lance_private *lp;
- u_long *addr;
- u_long address;
-+ int err;
-
- if (!MACH_IS_MVME147 || called)
-- return -ENODEV;
-+ return ERR_PTR(-ENODEV);
- called++;
-
-- SET_MODULE_OWNER(dev);
-+ dev = alloc_etherdev(sizeof(struct m147lance_private));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-- dev->priv = kmalloc(sizeof(struct m147lance_private), GFP_KERNEL);
-- if (dev->priv == NULL)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct m147lance_private));
-+ if (unit >= 0)
-+ sprintf(dev->name, "eth%d", unit);
-+
-+ SET_MODULE_OWNER(dev);
-
- /* Fill the dev fields */
- dev->base_addr = (unsigned long)MVME147_LANCE_BASE;
-@@ -114,11 +113,12 @@ int __init mvme147lance_probe(struct net
- dev->dev_addr[5]);
-
- lp = (struct m147lance_private *)dev->priv;
-- lp->ram = (void *)__get_dma_pages(GFP_ATOMIC, 3); /* 16K */
-+ lp->ram = __get_dma_pages(GFP_ATOMIC, 3); /* 16K */
- if (!lp->ram)
- {
- printk("%s: No memory for LANCE buffers\n", dev->name);
-- return -ENODEV;
-+ free_netdev(dev);
-+ return ERR_PTR(-ENOMEM);
- }
-
- lp->lance.name = (char*)name; /* discards const, shut up gcc */
-@@ -134,15 +134,15 @@ int __init mvme147lance_probe(struct net
- lp->lance.lance_log_tx_bufs = LANCE_LOG_TX_BUFFERS;
- lp->lance.rx_ring_mod_mask = RX_RING_MOD_MASK;
- lp->lance.tx_ring_mod_mask = TX_RING_MOD_MASK;
-- ether_setup(dev);
-
--#ifdef MODULE
-- dev->ifindex = dev_new_index();
-- lp->next_module = root_m147lance_dev;
-- root_m147lance_dev = lp;
--#endif /* MODULE */
-+ err = register_netdev(dev);
-+ if (err) {
-+ free_pages(lp->ram, 3);
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+ }
-
-- return 0;
-+ return dev;
- }
-
- static void m147lance_writerap(struct m147lance_private *lp, unsigned short value)
-@@ -185,23 +185,21 @@ static int m147lance_close(struct net_de
- #ifdef MODULE
- MODULE_LICENSE("GPL");
-
-+static struct net_device *dev_mvme147_lance;
- int init_module(void)
- {
-- root_lance_dev = NULL;
-- return mvme147lance_probe(NULL);
-+ dev_mvme147_lance = mvme147lance_probe(-1);
-+ if (IS_ERR(dev_mvme147_lance))
-+ return PTR_ERR(dev_mvme147_lance);
-+ return 0;
- }
-
- void cleanup_module(void)
- {
-- /* Walk the chain of devices, unregistering them */
-- struct m147lance_private *lp;
-- while (root_m147lance_dev) {
-- lp = root_m147lance_dev->next_module;
-- unregister_netdev(root_lance_dev->dev);
-- free_pages(lp->ram, 3);
-- free_netdev(root_lance_dev->dev);
-- root_lance_dev = lp;
-- }
-+ struct m147lance_private *lp = dev_mvme147_lance->priv;
-+ unregister_netdev(dev_mvme147_lance);
-+ free_pages(lp->ram, 3);
-+ free_netdev(dev_mvme147_lance);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/natsemi.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/natsemi.c 2003-12-28 23:21:01.000000000 -0800
-@@ -765,19 +765,13 @@ static int __devinit natsemi_probe1 (str
- SET_NETDEV_DEV(dev, &pdev->dev);
-
- i = pci_request_regions(pdev, dev->name);
-- if (i) {
-- free_netdev(dev);
-- return i;
-- }
-+ if (i)
-+ goto err_pci_request_regions;
-
-- {
-- void *mmio = ioremap (ioaddr, iosize);
-- if (!mmio) {
-- pci_release_regions(pdev);
-- free_netdev(dev);
-- return -ENOMEM;
-- }
-- ioaddr = (unsigned long) mmio;
-+ ioaddr = (unsigned long) ioremap (ioaddr, iosize);
-+ if (!ioaddr) {
-+ i = -ENOMEM;
-+ goto err_ioremap;
- }
-
- /* Work around the dropped serial bit. */
-@@ -835,13 +829,9 @@ static int __devinit natsemi_probe1 (str
- dev->mtu = mtu;
-
- i = register_netdev(dev);
-- if (i) {
-- pci_release_regions(pdev);
-- unregister_netdev(dev);
-- free_netdev(dev);
-- pci_set_drvdata(pdev, NULL);
-- return i;
-- }
-+ if (i)
-+ goto err_register_netdev;
-+
- netif_carrier_off(dev);
-
- if (netif_msg_drv(np)) {
-@@ -878,6 +868,17 @@ static int __devinit natsemi_probe1 (str
-
-
- return 0;
-+
-+ err_register_netdev:
-+ iounmap ((void *) dev->base_addr);
-+
-+ err_ioremap:
-+ pci_release_regions(pdev);
-+ pci_set_drvdata(pdev, NULL);
-+
-+ err_pci_request_regions:
-+ free_netdev(dev);
-+ return i;
- }
-
-
---- linux-2.6.0/drivers/net/ne2.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/ne2.c 2003-12-28 23:21:01.000000000 -0800
-@@ -242,7 +242,7 @@ static unsigned int __init dlink_get_eep
- * Note that at boot, this probe only picks up one card at a time.
- */
-
--int __init ne2_probe(struct net_device *dev)
-+static int __init do_ne2_probe(struct net_device *dev)
- {
- static int current_mca_slot = -1;
- int i;
-@@ -262,16 +262,52 @@ int __init ne2_probe(struct net_device *
- mca_find_unused_adapter(ne2_adapters[i].id, 0);
-
- if((current_mca_slot != MCA_NOTFOUND) && !adapter_found) {
-+ int res;
- mca_set_adapter_name(current_mca_slot,
- ne2_adapters[i].name);
- mca_mark_as_used(current_mca_slot);
-
-- return ne2_probe1(dev, current_mca_slot);
-+ res = ne2_probe1(dev, current_mca_slot);
-+ if (res)
-+ mca_mark_as_unused(current_mca_slot);
-+ return res;
- }
- }
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ mca_mark_as_unused(ei_status.priv);
-+ mca_set_adapter_procfn( ei_status.priv, NULL, NULL);
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, NE_IO_EXTENT);
-+}
-+
-+struct net_device * __init ne2_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_ne2_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-
- static int ne2_procinfo(char *buf, int slot, struct net_device *dev)
- {
-@@ -443,14 +479,6 @@ static int __init ne2_probe1(struct net_
-
- dev->base_addr = base_addr;
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (" unable to get memory for dev->priv.\n");
-- free_irq(dev->irq, dev);
-- retval = -ENOMEM;
-- goto out;
-- }
--
- for(i = 0; i < ETHER_ADDR_LEN; i++) {
- printk(" %2.2x", SA_prom[i]);
- dev->dev_addr[i] = SA_prom[i];
-@@ -735,7 +763,7 @@ retry:
-
- #ifdef MODULE
- #define MAX_NE_CARDS 4 /* Max number of NE cards per module */
--static struct net_device dev_ne[MAX_NE_CARDS];
-+static struct net_device *dev_ne[MAX_NE_CARDS];
- static int io[MAX_NE_CARDS];
- static int irq[MAX_NE_CARDS];
- static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */
-@@ -754,23 +782,30 @@ MODULE_PARM_DESC(bad, "(ignored)");
-
- int init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ne[this_dev];
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
- dev->irq = irq[this_dev];
- dev->mem_end = bad[this_dev];
- dev->base_addr = io[this_dev];
-- dev->init = ne2_probe;
-- if (register_netdev(dev) != 0) {
-- if (found != 0) return 0; /* Got at least one. */
--
-- printk(KERN_WARNING "ne2.c: No NE/2 card found.\n");
-- return -ENXIO;
-+ if (do_ne2_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_ne[found++] = dev;
-+ continue;
-+ }
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ break;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ printk(KERN_WARNING "ne2.c: No NE/2 card found\n");
-+ return -ENXIO;
- }
-
- void cleanup_module(void)
-@@ -778,14 +813,11 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ne[this_dev];
-- if (dev->priv != NULL) {
-- mca_mark_as_unused(ei_status.priv);
-- mca_set_adapter_procfn( ei_status.priv, NULL, NULL);
-- kfree(dev->priv);
-- free_irq(dev->irq, dev);
-- release_region(dev->base_addr, NE_IO_EXTENT);
-+ struct net_device *dev = dev_ne[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/ne2k_cbus.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ne2k_cbus.c 2003-12-28 23:21:01.000000000 -0800
-@@ -78,7 +78,6 @@ bad_clone_list[] __initdata = {
-
- #include "ne2k_cbus.h"
-
--int ne_probe(struct net_device *dev);
- static int ne_probe1(struct net_device *dev, int ioaddr);
- static int ne_open(struct net_device *dev);
- static int ne_close(struct net_device *dev);
-@@ -113,9 +112,10 @@ static void ne_block_output(struct net_d
- E2010 starts at 0x100 and ends at 0x4000.
- E2010-x starts at 0x100 and ends at 0xffff. */
-
--int __init ne_probe(struct net_device *dev)
-+static int __init do_ne_probe(struct net_device *dev)
- {
- unsigned int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-@@ -135,7 +135,7 @@ int __init ne_probe(struct net_device *d
- if (ei_debug > 2)
- printk(KERN_DEBUG "ne_probe(): call ne_probe_cbus(base_addr=0x%x)\n", base_addr);
-
-- result = ne_probe_cbus(dev, hw, base_addr);
-+ result = ne_probe_cbus(dev, hw, base_addr, irq);
- if (result != 0)
- ne2k_cbus_destroy(dev);
-
-@@ -156,13 +156,13 @@ int __init ne_probe(struct net_device *d
- if (hw && hw->hwtype) {
- const unsigned short *plist;
- for (plist = hw->portlist; *plist; plist++)
-- if (ne_probe_cbus(dev, hw, *plist) == 0)
-+ if (ne_probe_cbus(dev, hw, *plist, irq) == 0)
- return 0;
- } else {
- for (hw = &ne2k_cbus_hwinfo_list[0]; hw->hwtype; hw++) {
- const unsigned short *plist;
- for (plist = hw->portlist; *plist; plist++)
-- if (ne_probe_cbus(dev, hw, *plist) == 0)
-+ if (ne_probe_cbus(dev, hw, *plist, irq) == 0)
- return 0;
- }
- }
-@@ -174,7 +174,45 @@ int __init ne_probe(struct net_device *d
- return -ENODEV;
- }
-
--static int __init ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr)
-+static void cleanup_card(struct net_device *dev)
-+{
-+ const struct ne2k_cbus_region *rlist;
-+ const struct ne2k_cbus_hwinfo *hw = ne2k_cbus_get_hwinfo((int)(dev->mem_start & NE2K_CBUS_HARDWARE_TYPE_MASK));
-+
-+ free_irq(dev->irq, dev);
-+ for (rlist = hw->regionlist; rlist->range; rlist++) {
-+ release_region(dev->base_addr + rlist->start,
-+ rlist->range);
-+ }
-+ ne2k_cbus_destroy(dev);
-+}
-+
-+struct net_device * __init ne_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_ne_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
-+static int __init ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr, int irq)
- {
- if (ei_debug > 2)
- printk(KERN_DEBUG "ne_probe_cbus(): entered. (called from %p)\n",
-@@ -182,6 +220,7 @@ static int __init ne_probe_cbus(struct n
-
- if (hw && hw->hwtype) {
- ne2k_cbus_set_hwtype(dev, hw, ioaddr);
-+ dev->irq = irq;
- return ne_probe1(dev, ioaddr);
- } else {
- /* auto detect */
-@@ -189,6 +228,7 @@ static int __init ne_probe_cbus(struct n
- printk(KERN_DEBUG "ne_probe_cbus(): try to determine hardware types.\n");
- for (hw = &ne2k_cbus_hwinfo_list[0]; hw->hwtype; hw++) {
- ne2k_cbus_set_hwtype(dev, hw, ioaddr);
-+ dev->irq = irq;
- if (ne_probe1(dev, ioaddr) == 0)
- return 0;
- }
-@@ -301,11 +341,12 @@ static int __init ne_probe1(struct net_d
- if (ei_debug > 2)
- printk(" [CNET98EL-specific initialize...");
- outb_p(E8390_NODMA | E8390_STOP, ioaddr + E8390_CMD); /* 0x20|0x1 */
-+ ret = -ENODEV;
- i = inb(ioaddr);
- if ((i & ~0x2) != (0x20 | 0x01))
-- return -ENODEV;
-+ goto err_out;
- if ((inb(ioaddr + 0x7) & 0x80) != 0x80)
-- return -ENODEV;
-+ goto err_out;
- outb_p(E8390_RXOFF, ioaddr + EN0_RXCR); /* out(ioaddr+0xc, 0x20) */
- /* outb_p(ENDCFG_WTS|ENDCFG_FT1|ENDCFG_LS, ioaddr+EN0_DCFG); */
- outb_p(ENDCFG_WTS | 0x48, ioaddr + EN0_DCFG); /* 0x49 */
-@@ -330,7 +371,7 @@ static int __init ne_probe1(struct net_d
- if (ei_debug > 2)
- printk("] ");
- printk("memory failure at %x\n", i);
-- return -ENODEV;
-+ goto err_out;
- }
- if (ei_debug > 2)
- printk(" good...");
-@@ -338,7 +379,7 @@ static int __init ne_probe1(struct net_d
- if (ei_debug > 2)
- printk("] ");
- printk("IRQ must be specified for C-NET(98)E/L. probe failed.\n");
-- return -ENODEV;
-+ goto err_out;
- }
- outb((dev->irq > 5) ? (dev->irq & 4):(dev->irq >> 1), ioaddr + (0x2 | 0x400));
- outb(0x7e, ioaddr + (0x4 | 0x400));
-@@ -457,14 +498,6 @@ static int __init ne_probe1(struct net_d
- goto err_out;
- }
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev))
-- {
-- printk (" unable to get memory for dev->priv.\n");
-- ret = -ENOMEM;
-- goto err_out;
-- }
--
- /* Snarf the interrupt now. There's no point in waiting since we cannot
- share and the board will usually be enabled. */
- ret = request_irq(dev->irq, ei_interrupt, 0, name, dev);
-@@ -779,7 +812,7 @@ retry:
- \f
- #ifdef MODULE
- #define MAX_NE_CARDS 4 /* Max number of NE cards per module */
--static struct net_device dev_ne[MAX_NE_CARDS];
-+static struct net_device *dev_ne[MAX_NE_CARDS];
- static int io[MAX_NE_CARDS];
- static int irq[MAX_NE_CARDS];
- static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */
-@@ -806,26 +839,32 @@ int init_module(void)
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ne[this_dev];
-+ struct net_device *dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
- dev->irq = irq[this_dev];
- dev->mem_end = bad[this_dev];
- dev->base_addr = io[this_dev];
- dev->mem_start = hwtype[this_dev];
-- dev->init = ne_probe;
-- if (register_netdev(dev) == 0) {
-- found++;
-- continue;
-- }
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ if (do_ne_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_ne[found++] = dev;
-+ continue;
-+ }
-+ cleanup_card(dev);
- }
-+ free_netdev(dev);
-+ if (found)
-+ break;
- if (io[this_dev] != 0)
- printk(KERN_WARNING "ne2k_cbus: No NE*000 card found at i/o = %#x\n", io[this_dev]);
- else
-- printk(KERN_NOTICE "ne2k_cbus: You must supply \"io=0xNNN\" value(s) for C-Bus cards.\n");
-+ printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");
- return -ENXIO;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENODEV;
- }
-
- void cleanup_module(void)
-@@ -833,18 +872,11 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ne[this_dev];
-- if (dev->priv != NULL) {
-- const struct ne2k_cbus_region *rlist;
-- const struct ne2k_cbus_hwinfo *hw = ne2k_cbus_get_hwinfo((int)(dev->mem_start & NE2K_CBUS_HARDWARE_TYPE_MASK));
--
-- free_irq(dev->irq, dev);
-- for (rlist = hw->regionlist; rlist->range; rlist++) {
-- release_region(dev->base_addr + rlist->start,
-- rlist->range);
-- }
-+ struct net_device *dev = dev_ne[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- ne2k_cbus_destroy(dev);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/ne2k_cbus.h 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/net/ne2k_cbus.h 2003-12-28 23:21:01.000000000 -0800
-@@ -477,5 +477,5 @@ static void __init ne2k_cbus_writemem(st
- }
- #endif
-
--static int ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr);
-+static int ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr, int irq);
- /* End of ne2k_cbus.h */
---- linux-2.6.0/drivers/net/ne2k-pci.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ne2k-pci.c 2003-12-28 23:21:01.000000000 -0800
-@@ -115,6 +115,7 @@ enum ne2k_pci_chipsets {
- CH_Winbond_W89C940F,
- CH_Holtek_HT80232,
- CH_Holtek_HT80229,
-+ CH_Winbond_89C940_8c4a,
- };
-
-
-@@ -132,6 +133,7 @@ static struct {
- {"Winbond W89C940F", 0},
- {"Holtek HT80232", ONLY_16BIT_IO | HOLTEK_FDX},
- {"Holtek HT80229", ONLY_32BIT_IO | HOLTEK_FDX | STOP_PG_0x60 },
-+ {"Winbond W89C940(misprogrammed)", 0},
- {0,}
- };
-
-@@ -147,6 +149,7 @@ static struct pci_device_id ne2k_pci_tbl
- { 0x1050, 0x5a5a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_W89C940F },
- { 0x12c3, 0x0058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Holtek_HT80232 },
- { 0x12c3, 0x5598, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Holtek_HT80229 },
-+ { 0x8c4a, 0x1980, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_89C940_8c4a },
- { 0, }
- };
- MODULE_DEVICE_TABLE(pci, ne2k_pci_tbl);
---- linux-2.6.0/drivers/net/ne3210.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/ne3210.c 2003-12-28 23:21:01.000000000 -0800
-@@ -111,12 +111,6 @@ static int __init ne3210_eisa_probe (str
- device->driver_data = dev;
- ioaddr = edev->base_addr;
-
-- if (ethdev_init (dev)) {
-- printk ("ne3210.c: unable to allocate memory for dev->priv!\n");
-- retval = -ENOMEM;
-- goto out;
-- }
--
- if (!request_region(ioaddr, NE3210_IO_EXTENT, dev->name)) {
- retval = -EBUSY;
- goto out;
-@@ -357,24 +351,6 @@ static struct eisa_driver ne3210_eisa_dr
- },
- };
-
--#ifdef MODULE
--#if 0
--#define MAX_NE3210_CARDS 4 /* Max number of NE3210 cards per module */
--static struct net_device dev_ne3210[MAX_NE3210_CARDS];
--static int io[MAX_NE3210_CARDS];
--static int irq[MAX_NE3210_CARDS];
--static int mem[MAX_NE3210_CARDS];
--
--MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NE3210_CARDS) "i");
--MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_NE3210_CARDS) "i");
--MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_NE3210_CARDS) "i");
--MODULE_PARM_DESC(io, "I/O base address(es)");
--MODULE_PARM_DESC(irq, "IRQ number(s)");
--MODULE_PARM_DESC(mem, "memory base address(es)");
--#endif
--#endif /* MODULE */
--
--
- MODULE_DESCRIPTION("NE3210 EISA Ethernet driver");
- MODULE_LICENSE("GPL");
-
---- linux-2.6.0/drivers/net/ne.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ne.c 2003-12-28 23:21:01.000000000 -0800
-@@ -126,7 +126,6 @@ bad_clone_list[] __initdata = {
- #define NESM_START_PG 0x40 /* First page of TX buffer */
- #define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */
-
--int ne_probe(struct net_device *dev);
- static int ne_probe1(struct net_device *dev, int ioaddr);
- static int ne_probe_isapnp(struct net_device *dev);
-
-@@ -163,9 +162,10 @@ static void ne_block_output(struct net_d
- E2010 starts at 0x100 and ends at 0x4000.
- E2010-x starts at 0x100 and ends at 0xffff. */
-
--int __init ne_probe(struct net_device *dev)
-+static int __init do_ne_probe(struct net_device *dev)
- {
- unsigned int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-@@ -183,6 +183,7 @@ int __init ne_probe(struct net_device *d
- /* Last resort. The semi-risky ISA auto-probe. */
- for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
- int ioaddr = netcard_portlist[base_addr];
-+ dev->irq = irq;
- if (ne_probe1(dev, ioaddr) == 0)
- return 0;
- }
-@@ -191,6 +192,40 @@ int __init ne_probe(struct net_device *d
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
-+ if (idev)
-+ pnp_device_detach(idev);
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, NE_IO_EXTENT);
-+}
-+
-+struct net_device * __init ne_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_ne_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init ne_probe_isapnp(struct net_device *dev)
- {
- int i;
-@@ -425,20 +460,12 @@ static int __init ne_probe1(struct net_d
- goto err_out;
- }
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev))
-- {
-- printk (" unable to get memory for dev->priv.\n");
-- ret = -ENOMEM;
-- goto err_out;
-- }
--
- /* Snarf the interrupt now. There's no point in waiting since we cannot
- share and the board will usually be enabled. */
- ret = request_irq(dev->irq, ei_interrupt, 0, name, dev);
- if (ret) {
- printk (" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);
-- goto err_out_kfree;
-+ goto err_out;
- }
-
- dev->base_addr = ioaddr;
-@@ -472,9 +499,6 @@ static int __init ne_probe1(struct net_d
- NS8390_init(dev, 0);
- return 0;
-
--err_out_kfree:
-- kfree(dev->priv);
-- dev->priv = NULL;
- err_out:
- release_region(ioaddr, NE_IO_EXTENT);
- return ret;
-@@ -734,7 +758,7 @@ retry:
- \f
- #ifdef MODULE
- #define MAX_NE_CARDS 4 /* Max number of NE cards per module */
--static struct net_device dev_ne[MAX_NE_CARDS];
-+static struct net_device *dev_ne[MAX_NE_CARDS];
- static int io[MAX_NE_CARDS];
- static int irq[MAX_NE_CARDS];
- static int bad[MAX_NE_CARDS]; /* 0xbad = bad sig or no reset ack */
-@@ -758,25 +782,31 @@ int init_module(void)
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ne[this_dev];
-+ struct net_device *dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
- dev->irq = irq[this_dev];
- dev->mem_end = bad[this_dev];
- dev->base_addr = io[this_dev];
-- dev->init = ne_probe;
-- if (register_netdev(dev) == 0) {
-- found++;
-- continue;
-- }
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ if (do_ne_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_ne[found++] = dev;
-+ continue;
-+ }
-+ cleanup_card(dev);
- }
-+ free_netdev(dev);
-+ if (found)
-+ break;
- if (io[this_dev] != 0)
- printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[this_dev]);
- else
- printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");
- return -ENXIO;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENODEV;
- }
-
- void cleanup_module(void)
-@@ -784,16 +814,11 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ne[this_dev];
-- if (dev->priv != NULL) {
-- void *priv = dev->priv;
-- struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
-- if (idev)
-- pnp_device_detach(idev);
-- free_irq(dev->irq, dev);
-- release_region(dev->base_addr, NE_IO_EXTENT);
-+ struct net_device *dev = dev_ne[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/net/netconsole.c 2003-12-28 23:21:01.000000000 -0800
-@@ -0,0 +1,120 @@
-+/*
-+ * linux/drivers/net/netconsole.c
-+ *
-+ * Copyright (C) 2001 Ingo Molnar <mingo@redhat.com>
-+ *
-+ * This file contains the implementation of an IRQ-safe, crash-safe
-+ * kernel console implementation that outputs kernel messages to the
-+ * network.
-+ *
-+ * Modification history:
-+ *
-+ * 2001-09-17 started by Ingo Molnar.
-+ * 2003-08-11 2.6 port by Matt Mackall
-+ * simplified options
-+ * generic card hooks
-+ * works non-modular
-+ * 2003-09-07 rewritten with netpoll api
-+ */
-+
-+/****************************************************************
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ ****************************************************************/
-+
-+#include <linux/mm.h>
-+#include <linux/tty.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/console.h>
-+#include <linux/tty_driver.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/string.h>
-+#include <linux/sysrq.h>
-+#include <linux/smp.h>
-+#include <linux/netpoll.h>
-+
-+MODULE_AUTHOR("Maintainer: Matt Mackall <mpm@selenic.com>");
-+MODULE_DESCRIPTION("Console driver for network interfaces");
-+MODULE_LICENSE("GPL");
-+
-+static char config[256];
-+module_param_string(netconsole, config, 256, 0);
-+MODULE_PARM_DESC(netconsole, " netconsole=[src-port]@[src-ip]/[dev],[tgt-port]@<tgt-ip>/[tgt-macaddr]\n");
-+
-+static struct netpoll np = {
-+ .name = "netconsole",
-+ .dev_name = "eth0",
-+ .local_port = 6665,
-+ .remote_port = 6666,
-+ .remote_mac = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-+};
-+
-+#define MAX_PRINT_CHUNK 1000
-+
-+static void write_msg(struct console *con, const char *msg, unsigned int len)
-+{
-+ int frag, left;
-+ unsigned long flags;
-+
-+ if (!np.dev)
-+ return;
-+
-+ local_irq_save(flags);
-+
-+ for(left = len; left; ) {
-+ frag = min(left, MAX_PRINT_CHUNK);
-+ netpoll_send_udp(&np, msg, frag);
-+ msg += frag;
-+ left -= frag;
-+ }
-+
-+ local_irq_restore(flags);
-+}
-+
-+static struct console netconsole = {
-+ .flags = CON_ENABLED | CON_PRINTBUFFER,
-+ .write = write_msg
-+};
-+
-+static int option_setup(char *opt)
-+{
-+ return netpoll_parse_options(&np, opt);
-+}
-+
-+__setup("netconsole=", option_setup);
-+
-+static int init_netconsole(void)
-+{
-+ if(strlen(config) && option_setup(config))
-+ return 1;
-+
-+ if(!np.remote_ip || netpoll_setup(&np))
-+ return 1;
-+
-+ register_console(&netconsole);
-+ printk(KERN_INFO "netconsole: network logging started\n");
-+ return 0;
-+}
-+
-+static void cleanup_netconsole(void)
-+{
-+ unregister_console(&netconsole);
-+ netpoll_cleanup(&np);
-+}
-+
-+module_init(init_netconsole);
-+module_exit(cleanup_netconsole);
---- linux-2.6.0/drivers/net/net_init.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/net_init.c 2003-12-28 23:21:01.000000000 -0800
-@@ -73,23 +73,28 @@
- struct net_device *alloc_netdev(int sizeof_priv, const char *mask,
- void (*setup)(struct net_device *))
- {
-+ void *p;
- struct net_device *dev;
- int alloc_size;
-
-- /* ensure 32-byte alignment of the private area */
-- alloc_size = sizeof (*dev) + sizeof_priv + 31;
-+ /* ensure 32-byte alignment of both the device and private area */
-
-- dev = (struct net_device *) kmalloc (alloc_size, GFP_KERNEL);
-- if (dev == NULL)
-- {
-- printk(KERN_ERR "alloc_dev: Unable to allocate device memory.\n");
-+ alloc_size = (sizeof(struct net_device) + 31) & ~31;
-+ alloc_size += sizeof_priv + 31;
-+
-+ p = kmalloc (alloc_size, GFP_KERNEL);
-+ if (!p) {
-+ printk(KERN_ERR "alloc_dev: Unable to allocate device.\n");
- return NULL;
- }
-
-- memset(dev, 0, alloc_size);
-+ memset(p, 0, alloc_size);
-+
-+ dev = (struct net_device *)(((long)p + 31) & ~31);
-+ dev->padded = (char *)dev - (char *)p;
-
- if (sizeof_priv)
-- dev->priv = (void *) (((long)(dev + 1) + 31) & ~31);
-+ dev->priv = netdev_priv(dev);
-
- setup(dev);
- strcpy(dev->name, mask);
---- linux-2.6.0/drivers/net/ni5010.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ni5010.c 2003-12-28 23:21:01.000000000 -0800
-@@ -82,7 +82,7 @@ static unsigned int bufsize_rcv;
-
- #ifndef FULL_IODETECT
- /* A zero-terminated list of I/O addresses to be probed. */
--static unsigned int ni5010_portlist[] __initdata =
-+static unsigned int ports[] __initdata =
- { 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0 };
- #endif
-
-@@ -95,13 +95,11 @@ static unsigned int ni5010_portlist[] __
- struct ni5010_local {
- struct net_device_stats stats;
- int o_pkt_size;
-- int i_pkt_size;
- spinlock_t lock;
- };
-
- /* Index to functions, as function prototypes. */
-
--extern int ni5010_probe(struct net_device *dev);
- static int ni5010_probe1(struct net_device *dev, int ioaddr);
- static int ni5010_open(struct net_device *dev);
- static int ni5010_send_packet(struct sk_buff *skb, struct net_device *dev);
-@@ -120,38 +118,58 @@ static void chipset_init(struct net_dev
- static void dump_packet(void *buf, int len);
- static void ni5010_show_registers(struct net_device *dev);
-
-+static int io;
-+static int irq;
-
--int __init ni5010_probe(struct net_device *dev)
-+struct net_device * __init ni5010_probe(int unit)
- {
-+ struct net_device *dev = alloc_etherdev(sizeof(struct ni5010_local));
- int *port;
-- int base_addr = dev->base_addr;
-+ int err = 0;
-
-- PRINTK2((KERN_DEBUG "%s: Entering ni5010_probe\n", dev->name));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-- SET_MODULE_OWNER(dev);
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ }
-
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return ni5010_probe1(dev, base_addr);
-- else if (base_addr != 0) /* Don't probe at all. */
-- return -ENXIO;
-+ PRINTK2((KERN_DEBUG "%s: Entering ni5010_probe\n", dev->name));
-
-+ SET_MODULE_OWNER(dev);
-+
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = ni5010_probe1(dev, io);
-+ } else if (io != 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
- #ifdef FULL_IODETECT
-- for (int ioaddr=0x200; ioaddr<0x400; ioaddr+=0x20) {
-- if (check_region(ioaddr, NI5010_IO_EXTENT))
-- continue;
-- if (ni5010_probe1(dev, ioaddr) == 0)
-- return 0;
-- }
-+ for (io=0x200; io<0x400 && ni5010_probe1(dev, io) ; io+=0x20)
-+ ;
-+ if (io == 0x400)
-+ err = -ENODEV;
-+
- #else
-- for (port = ni5010_portlist; *port; port++) {
-- int ioaddr = *port;
-- if (check_region(ioaddr, NI5010_IO_EXTENT))
-- continue;
-- if (ni5010_probe1(dev, ioaddr) == 0)
-- return 0;
-- }
-+ for (port = ports; *port && ni5010_probe1(dev, *port); port++)
-+ ;
-+ if (!*port)
-+ err = -ENODEV;
- #endif /* FULL_IODETECT */
-- return -ENODEV;
-+ }
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ release_region(dev->base_addr, NI5010_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static inline int rd_port(int ioaddr)
-@@ -188,9 +206,17 @@ static void __init trigger_irq(int ioadd
- static int __init ni5010_probe1(struct net_device *dev, int ioaddr)
- {
- static unsigned version_printed;
-+ struct ni5010_local *lp;
- int i;
- unsigned int data = 0;
- int boguscount = 40;
-+ int err = -ENODEV;
-+
-+ dev->base_addr = ioaddr;
-+ dev->irq = irq;
-+
-+ if (!request_region(ioaddr, NI5010_IO_EXTENT, boardname))
-+ return -EBUSY;
-
- /*
- * This is no "official" probe method, I've rather tested which
-@@ -205,36 +231,40 @@ static int __init ni5010_probe1(struct n
- *
- * - Andreas
- */
--
-+
- PRINTK2((KERN_DEBUG "%s: entering ni5010_probe1(%#3x)\n",
- dev->name, ioaddr));
-
-- if (inb(ioaddr+0) == 0xff) return -ENODEV;
-+ if (inb(ioaddr+0) == 0xff)
-+ goto out;
-
- while ( (rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) &
- rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr)) != 0xff)
- {
-- if (boguscount-- == 0) return -ENODEV;
-+ if (boguscount-- == 0)
-+ goto out;
- }
-
- PRINTK2((KERN_DEBUG "%s: I/O #1 passed!\n", dev->name));
-
- for (i=0; i<32; i++)
- if ( (data = rd_port(ioaddr)) != 0xff) break;
-- if (data==0xff) return -ENODEV;
-+ if (data==0xff)
-+ goto out;
-
- PRINTK2((KERN_DEBUG "%s: I/O #2 passed!\n", dev->name));
-
-- if ( (data == SA_ADDR0) &&
-- (rd_port(ioaddr) == SA_ADDR1) &&
-- (rd_port(ioaddr) == SA_ADDR2) ) {
-- for (i=0; i<4; i++) rd_port(ioaddr);
-- if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) ||
-- (rd_port(ioaddr) != NI5010_MAGICVAL2) ) {
-- return -ENODEV;
-- }
-- } else return -ENODEV;
--
-+ if ((data != SA_ADDR0) || (rd_port(ioaddr) != SA_ADDR1) ||
-+ (rd_port(ioaddr) != SA_ADDR2))
-+ goto out;
-+
-+ for (i=0; i<4; i++)
-+ rd_port(ioaddr);
-+
-+ if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) ||
-+ (rd_port(ioaddr) != NI5010_MAGICVAL2) )
-+ goto out;
-+
- PRINTK2((KERN_DEBUG "%s: I/O #3 passed!\n", dev->name));
-
- if (NI5010_DEBUG && version_printed++ == 0)
-@@ -267,8 +297,9 @@ static int __init ni5010_probe1(struct n
- PRINTK2((KERN_DEBUG "%s: I/O #6 passed!\n", dev->name));
-
- if (dev->irq == 0) {
-+ err = -EAGAIN;
- printk(KERN_WARNING "%s: no IRQ found!\n", dev->name);
-- return -EAGAIN;
-+ goto out;
- }
- PRINTK2((KERN_DEBUG "%s: I/O #7 passed!\n", dev->name));
- } else if (dev->irq == 2) {
-@@ -278,19 +309,9 @@ static int __init ni5010_probe1(struct n
- PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name));
-
- /* DMA is not supported (yet?), so no use detecting it */
-+ lp = (struct ni5010_local*)dev->priv;
-
-- if (dev->priv == NULL) {
-- struct ni5010_local* lp;
--
-- dev->priv = kmalloc(sizeof(struct ni5010_local), GFP_KERNEL|GFP_DMA);
-- if (dev->priv == NULL) {
-- printk(KERN_WARNING "%s: Failed to allocate private memory\n", dev->name);
-- return -ENOMEM;
-- }
--
-- lp = (struct ni5010_local*)dev->priv;
-- spin_lock_init(&lp->lock);
-- }
-+ spin_lock_init(&lp->lock);
-
- PRINTK2((KERN_DEBUG "%s: I/O #10 passed!\n", dev->name));
-
-@@ -315,9 +336,6 @@ static int __init ni5010_probe1(struct n
- }
- printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE);
- memset(dev->priv, 0, sizeof(struct ni5010_local));
--
-- /* Grab the region so we can find another board if autoIRQ fails. */
-- request_region(ioaddr, NI5010_IO_EXTENT, boardname);
-
- dev->open = ni5010_open;
- dev->stop = ni5010_close;
-@@ -327,9 +345,6 @@ static int __init ni5010_probe1(struct n
- dev->tx_timeout = ni5010_timeout;
- dev->watchdog_timeo = HZ/20;
-
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--
- dev->flags &= ~IFF_MULTICAST; /* Multicast doesn't work */
-
- /* Shut up the ni5010 */
-@@ -345,6 +360,9 @@ static int __init ni5010_probe1(struct n
- printk(KERN_INFO "Join the NI5010 driver development team!\n");
- printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nl\n");
- return 0;
-+out:
-+ release_region(dev->base_addr, NI5010_IO_EXTENT);
-+ return err;
- }
-
- /*
-@@ -513,6 +531,7 @@ static void ni5010_rx(struct net_device
- int ioaddr = dev->base_addr;
- unsigned char rcv_stat;
- struct sk_buff *skb;
-+ int i_pkt_size;
-
- PRINTK2((KERN_DEBUG "%s: entering ni5010_rx()\n", dev->name));
-
-@@ -532,17 +551,17 @@ static void ni5010_rx(struct net_device
-
- outb(0xff, EDLC_RCLR); /* Clear the interrupt */
-
-- lp->i_pkt_size = inw(IE_RCNT);
-- if (lp->i_pkt_size > ETH_FRAME_LEN || lp->i_pkt_size < 10 ) {
-+ i_pkt_size = inw(IE_RCNT);
-+ if (i_pkt_size > ETH_FRAME_LEN || i_pkt_size < 10 ) {
- PRINTK((KERN_DEBUG "%s: Packet size error, packet size = %#4.4x\n",
-- dev->name, lp->i_pkt_size));
-+ dev->name, i_pkt_size));
- lp->stats.rx_errors++;
- lp->stats.rx_length_errors++;
- return;
- }
-
- /* Malloc up new buffer. */
-- skb = dev_alloc_skb(lp->i_pkt_size + 3);
-+ skb = dev_alloc_skb(i_pkt_size + 3);
- if (skb == NULL) {
- printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
- lp->stats.rx_dropped++;
-@@ -555,7 +574,7 @@ static void ni5010_rx(struct net_device
- /* Read packet into buffer */
- outb(MM_MUX, IE_MMODE); /* Rcv buffer to system bus */
- outw(0, IE_GP); /* Seek to beginning of packet */
-- insb(IE_RBUF, skb_put(skb, lp->i_pkt_size), lp->i_pkt_size);
-+ insb(IE_RBUF, skb_put(skb, i_pkt_size), i_pkt_size);
-
- if (NI5010_DEBUG >= 4)
- dump_packet(skb->data, skb->len);
-@@ -564,10 +583,10 @@ static void ni5010_rx(struct net_device
- netif_rx(skb);
- dev->last_rx = jiffies;
- lp->stats.rx_packets++;
-- lp->stats.rx_bytes += lp->i_pkt_size;
-+ lp->stats.rx_bytes += i_pkt_size;
-
- PRINTK2((KERN_DEBUG "%s: Received packet, size=%#4.4x\n",
-- dev->name, lp->i_pkt_size));
-+ dev->name, i_pkt_size));
-
- }
-
-@@ -697,10 +716,10 @@ static void hardware_send_packet(struct
-
- if (NI5010_DEBUG > 3) dump_packet(buf, length);
-
-- buf_offs = NI5010_BUFSIZE - length - pad;
-- lp->o_pkt_size = length + pad;
-+ buf_offs = NI5010_BUFSIZE - length - pad;
-
- spin_lock_irqsave(&lp->lock, flags);
-+ lp->o_pkt_size = length + pad;
-
- outb(0, EDLC_RMASK); /* Mask all receive interrupts */
- outb(0, IE_MMODE); /* Put Xmit buffer on system bus */
-@@ -745,9 +764,7 @@ static void ni5010_show_registers(struct
- }
-
- #ifdef MODULE
--static struct net_device dev_ni5010;
--static int io;
--static int irq;
-+static struct net_device *dev_ni5010;
-
- MODULE_PARM(io, "i");
- MODULE_PARM(irq, "i");
-@@ -756,8 +773,6 @@ MODULE_PARM_DESC(irq, "ni5010 IRQ number
-
- int init_module(void)
- {
-- int result;
--
- PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname));
- /*
- if(io <= 0 || irq == 0){
-@@ -771,29 +786,18 @@ int init_module(void)
- }
-
- PRINTK2((KERN_DEBUG "%s: init_module irq=%#2x, io=%#3x\n", boardname, irq, io));
-- dev_ni5010.irq=irq;
-- dev_ni5010.base_addr=io;
-- dev_ni5010.init=ni5010_probe;
-- if ((result = register_netdev(&dev_ni5010)) != 0) {
-- PRINTK((KERN_WARNING "%s: register_netdev returned %d.\n",
-- boardname, result));
-- return -EIO;
-- }
-+ dev_ni5010 = ni5010_probe(-1);
-+ if (IS_ERR(dev_ni5010))
-+ return PTR_ERR(dev_ni5010);
- return 0;
- }
-
--void
--cleanup_module(void)
-+void cleanup_module(void)
- {
- PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname));
--
-- unregister_netdev(&dev_ni5010);
--
-- release_region(dev_ni5010.base_addr, NI5010_IO_EXTENT);
-- if (dev_ni5010.priv != NULL){
-- kfree(dev_ni5010.priv);
-- dev_ni5010.priv = NULL;
-- }
-+ unregister_netdev(dev_ni5010);
-+ release_region(dev_ni5010->base_addr, NI5010_IO_EXTENT);
-+ free_netdev(dev_ni5010);
- }
- #endif /* MODULE */
- MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/net/ni52.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ni52.c 2003-12-28 23:21:01.000000000 -0800
-@@ -354,50 +354,76 @@ static void alloc586(struct net_device *
- memset((char *)p->scb,0,sizeof(struct scb_struct));
- }
-
-+/* set: io,irq,memstart,memend or set it when calling insmod */
-+static int irq=9;
-+static int io=0x300;
-+static long memstart; /* e.g 0xd0000 */
-+static long memend; /* e.g 0xd4000 */
-+
- /**********************************************
- * probe the ni5210-card
- */
--int __init ni52_probe(struct net_device *dev)
-+struct net_device * __init ni52_probe(int unit)
- {
--#ifndef MODULE
-- int *port;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct priv));
- static int ports[] = {0x300, 0x280, 0x360 , 0x320 , 0x340, 0};
--#endif
-- int base_addr = dev->base_addr;
--
-- SET_MODULE_OWNER(dev);
-+ int *port;
-+ int err = 0;
-
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return ni52_probe1(dev, base_addr);
-- else if (base_addr > 0) /* Don't probe at all. */
-- return -ENXIO;
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
--#ifdef MODULE
-- printk("%s: no autoprobing allowed for modules.\n",dev->name);
--#else
-- for (port = ports; *port; port++) {
-- int ioaddr = *port;
-- dev->base_addr = ioaddr;
-- if (ni52_probe1(dev, ioaddr) == 0)
-- return 0;
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ memstart = dev->mem_start;
-+ memend = dev->mem_end;
- }
-
--#ifdef FULL_IO_PROBE
-- for(dev->base_addr=0x200; dev->base_addr<0x400; dev->base_addr+=8)
-- if (ni52_probe1(dev, dev->base_addr) == 0)
-- return 0;
--#endif
-+ SET_MODULE_OWNER(dev);
-
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = ni52_probe1(dev, io);
-+ } else if (io > 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (port = ports; *port && ni52_probe1(dev, *port) ; port++)
-+ ;
-+ if (*port)
-+ goto got_it;
-+#ifdef FULL_IO_PROBE
-+ for (io = 0x200; io < 0x400 && ni52_probe1(dev, io); io += 8)
-+ ;
-+ if (io < 0x400)
-+ goto got_it;
- #endif
--
-- dev->base_addr = base_addr;
-- return -ENODEV;
-+ err = -ENODEV;
-+ }
-+ if (err)
-+ goto out;
-+got_it:
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ release_region(dev->base_addr, NI52_TOTAL_SIZE);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int __init ni52_probe1(struct net_device *dev,int ioaddr)
- {
- int i, size, retval;
-
-+ dev->base_addr = ioaddr;
-+ dev->irq = irq;
-+ dev->mem_start = memstart;
-+ dev->mem_end = memend;
-+
- if (!request_region(ioaddr, NI52_TOTAL_SIZE, dev->name))
- return -EBUSY;
-
-@@ -416,7 +442,7 @@ static int __init ni52_probe1(struct net
- goto out;
- }
-
-- printk("%s: NI5210 found at %#3lx, ",dev->name,dev->base_addr);
-+ printk(KERN_INFO "%s: NI5210 found at %#3lx, ",dev->name,dev->base_addr);
-
- /*
- * check (or search) IO-Memory, 8K and 16K
-@@ -469,13 +495,6 @@ static int __init ni52_probe1(struct net
- dev->mem_end = dev->mem_start + size; /* set mem_end showed by 'ifconfig' */
- #endif
-
-- dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL);
-- if(dev->priv == NULL) {
-- printk("%s: Ooops .. can't allocate private driver memory.\n",dev->name);
-- retval = -ENOMEM;
-- goto out;
-- }
-- /* warning: we don't free it on errors */
- memset((char *) dev->priv,0,sizeof(struct priv));
-
- ((struct priv *) (dev->priv))->memtop = isa_bus_to_virt(dev->mem_start) + size;
-@@ -503,8 +522,6 @@ static int __init ni52_probe1(struct net
- if(!dev->irq)
- {
- printk("?autoirq, Failed to detect IRQ line!\n");
-- kfree(dev->priv);
-- dev->priv = NULL;
- retval = -EAGAIN;
- goto out;
- }
-@@ -526,8 +543,6 @@ static int __init ni52_probe1(struct net
-
- dev->if_port = 0;
-
-- ether_setup(dev);
--
- return 0;
- out:
- release_region(ioaddr, NI52_TOTAL_SIZE);
-@@ -1295,13 +1310,7 @@ static void set_multicast_list(struct ne
- }
-
- #ifdef MODULE
--static struct net_device dev_ni52;
--
--/* set: io,irq,memstart,memend or set it when calling insmod */
--static int irq=9;
--static int io=0x300;
--static long memstart; /* e.g 0xd0000 */
--static long memend; /* e.g 0xd4000 */
-+static struct net_device *dev_ni52;
-
- MODULE_PARM(io, "i");
- MODULE_PARM(irq, "i");
-@@ -1318,22 +1327,17 @@ int init_module(void)
- printk("ni52: Autoprobing not allowed for modules.\nni52: Set symbols 'io' 'irq' 'memstart' and 'memend'\n");
- return -ENODEV;
- }
-- dev_ni52.init = ni52_probe;
-- dev_ni52.irq = irq;
-- dev_ni52.base_addr = io;
-- dev_ni52.mem_end = memend;
-- dev_ni52.mem_start = memstart;
-- if (register_netdev(&dev_ni52) != 0)
-- return -EIO;
-+ dev_ni52 = ni52_probe(-1);
-+ if (IS_ERR(dev_ni52))
-+ return PTR_ERR(dev_ni52);
- return 0;
- }
-
- void cleanup_module(void)
- {
-- release_region(dev_ni52.base_addr, NI52_TOTAL_SIZE);
-- unregister_netdev(&dev_ni52);
-- kfree(dev_ni52.priv);
-- dev_ni52.priv = NULL;
-+ unregister_netdev(dev_ni52);
-+ release_region(dev_ni52->base_addr, NI52_TOTAL_SIZE);
-+ free_netdev(dev_ni52);
- }
- #endif /* MODULE */
-
---- linux-2.6.0/drivers/net/ni65.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ni65.c 2003-12-28 23:21:01.000000000 -0800
-@@ -343,29 +343,64 @@ static int ni65_close(struct net_device
- return 0;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ struct priv *p = (struct priv *) dev->priv;
-+ disable_dma(dev->dma);
-+ free_dma(dev->dma);
-+ release_region(dev->base_addr, cards[p->cardno].total_size);
-+ ni65_free_buffer(p);
-+}
-+
-+/* set: io,irq,dma or set it when calling insmod */
-+static int irq;
-+static int io;
-+static int dma;
-+
- /*
- * Probe The Card (not the lance-chip)
- */
--#ifdef MODULE
--static
--#endif
--int __init ni65_probe(struct net_device *dev)
-+struct net_device * __init ni65_probe(int unit)
- {
-- int *port;
-+ struct net_device *dev = alloc_etherdev(0);
- static int ports[] = {0x360,0x300,0x320,0x340, 0};
-+ int *port;
-+ int err = 0;
-
-- if (dev->base_addr > 0x1ff) /* Check a single specified location. */
-- return ni65_probe1(dev, dev->base_addr);
-- else if (dev->base_addr > 0) /* Don't probe at all. */
-- return -ENXIO;
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-- for (port = ports; *port; port++)
-- {
-- if (ni65_probe1(dev, *port) == 0)
-- return 0;
-- }
--
-- return -ENODEV;
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ irq = dev->irq;
-+ dma = dev->dma;
-+ } else {
-+ dev->base_addr = io;
-+ }
-+
-+ if (dev->base_addr > 0x1ff) { /* Check a single specified location. */
-+ err = ni65_probe1(dev, dev->base_addr);
-+ } else if (dev->base_addr > 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (port = ports; *port && ni65_probe1(dev, *port); port++)
-+ ;
-+ if (!*port)
-+ err = -ENODEV;
-+ }
-+ if (err)
-+ goto out;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /*
-@@ -377,6 +412,9 @@ static int __init ni65_probe1(struct net
- struct priv *p;
- unsigned long flags;
-
-+ dev->irq = irq;
-+ dev->dma = dma;
-+
- for(i=0;i<NUM_CARDS;i++) {
- if(!request_region(ioaddr, cards[i].total_size, cards[i].cardname))
- continue;
-@@ -521,9 +559,6 @@ static int __init ni65_probe1(struct net
- dev->watchdog_timeo = HZ/2;
- dev->get_stats = ni65_get_stats;
- dev->set_multicast_list = set_multicast_list;
--
-- ether_setup(dev);
--
- return 0; /* everything is OK */
- }
-
-@@ -1213,12 +1248,7 @@ static void set_multicast_list(struct ne
- }
-
- #ifdef MODULE
--static struct net_device dev_ni65 = { .base_addr = 0x360, .irq = 9, .init = ni65_probe };
--
--/* set: io,irq,dma or set it when calling insmod */
--static int irq;
--static int io;
--static int dma;
-+static struct net_device *dev_ni65;
-
- MODULE_PARM(irq, "i");
- MODULE_PARM(io, "i");
-@@ -1229,26 +1259,15 @@ MODULE_PARM_DESC(dma, "ni6510 ISA DMA ch
-
- int init_module(void)
- {
-- dev_ni65.irq = irq;
-- dev_ni65.dma = dma;
-- dev_ni65.base_addr = io;
-- if (register_netdev(&dev_ni65) != 0)
-- return -EIO;
-- return 0;
-+ dev_ni65 = ni65_probe(-1);
-+ return IS_ERR(dev_ni65) ? PTR_ERR(dev_ni65) : 0;
- }
-
- void cleanup_module(void)
- {
-- struct priv *p;
-- p = (struct priv *) dev_ni65.priv;
-- if(!p)
-- BUG();
-- disable_dma(dev_ni65.dma);
-- free_dma(dev_ni65.dma);
-- unregister_netdev(&dev_ni65);
-- release_region(dev_ni65.base_addr,cards[p->cardno].total_size);
-- ni65_free_buffer(p);
-- dev_ni65.priv = NULL;
-+ unregister_netdev(dev_ni65);
-+ cleanup_card(dev_ni65);
-+ free_netdev(dev_ni65);
- }
- #endif /* MODULE */
-
---- linux-2.6.0/drivers/net/ns83820.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ns83820.c 2003-12-28 23:21:01.000000000 -0800
-@@ -374,19 +374,6 @@ static int lnksts = 0; /* CFG_LNKSTS bi
- #define LINK_DOWN 0x02
- #define LINK_UP 0x04
-
--#define __kick_rx(dev) writel(CR_RXE, dev->base + CR)
--
--#define kick_rx(dev) do { \
-- dprintk("kick_rx: maybe kicking\n"); \
-- if (test_and_clear_bit(0, &dev->rx_info.idle)) { \
-- dprintk("actually kicking\n"); \
-- writel(dev->rx_info.phy_descs + (4 * DESC_SIZE * dev->rx_info.next_rx), dev->base + RXDP); \
-- if (dev->rx_info.next_rx == dev->rx_info.next_empty) \
-- printk(KERN_DEBUG "%s: uh-oh: next_rx == next_empty???\n", dev->net_dev.name);\
-- __kick_rx(dev); \
-- } \
--} while(0)
--
- #ifdef USE_64BIT_ADDR
- #define HW_ADDR_LEN 8
- #define desc_addr_set(desc, addr) \
-@@ -438,7 +425,6 @@ struct rx_info {
-
-
- struct ns83820 {
-- struct net_device net_dev; /* must be first */
- struct net_device_stats stats;
- u8 *base;
-
-@@ -478,6 +464,29 @@ struct ns83820 {
- struct timer_list tx_watchdog;
- };
-
-+static inline struct ns83820 *PRIV(struct net_device *dev)
-+{
-+ return netdev_priv(dev);
-+}
-+
-+#define __kick_rx(dev) writel(CR_RXE, dev->base + CR)
-+
-+static inline void kick_rx(struct net_device *ndev)
-+{
-+ struct ns83820 *dev = PRIV(ndev);
-+ dprintk("kick_rx: maybe kicking\n");
-+ if (test_and_clear_bit(0, &dev->rx_info.idle)) {
-+ dprintk("actually kicking\n");
-+ writel(dev->rx_info.phy_descs +
-+ (4 * DESC_SIZE * dev->rx_info.next_rx),
-+ dev->base + RXDP);
-+ if (dev->rx_info.next_rx == dev->rx_info.next_empty)
-+ printk(KERN_DEBUG "%s: uh-oh: next_rx == next_empty???\n",
-+ ndev->name);
-+ __kick_rx(dev);
-+ }
-+}
-+
- //free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC
- #define start_tx_okay(dev) \
- (((NR_TX_DESC-2 + dev->tx_done_idx - dev->tx_free_idx) % NR_TX_DESC) > MIN_TX_DESC_FREE)
-@@ -546,15 +555,16 @@ static inline int ns83820_add_rx_skb(str
- return 0;
- }
-
--static inline int rx_refill(struct ns83820 *dev, int gfp)
-+static inline int rx_refill(struct net_device *ndev, int gfp)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- unsigned i;
- unsigned long flags = 0;
-
- if (unlikely(nr_rx_empty(dev) <= 2))
- return 0;
-
-- dprintk("rx_refill(%p)\n", dev);
-+ dprintk("rx_refill(%p)\n", ndev);
- if (gfp == GFP_ATOMIC)
- spin_lock_irqsave(&dev->rx_info.lock, flags);
- for (i=0; i<NR_RX_DESC; i++) {
-@@ -570,7 +580,7 @@ static inline int rx_refill(struct ns838
- res &= 0xf;
- skb_reserve(skb, res);
-
-- skb->dev = &dev->net_dev;
-+ skb->dev = ndev;
- if (gfp != GFP_ATOMIC)
- spin_lock_irqsave(&dev->rx_info.lock, flags);
- res = ns83820_add_rx_skb(dev, skb);
-@@ -587,20 +597,21 @@ static inline int rx_refill(struct ns838
- return i ? 0 : -ENOMEM;
- }
-
--static void FASTCALL(rx_refill_atomic(struct ns83820 *dev));
--static void rx_refill_atomic(struct ns83820 *dev)
-+static void FASTCALL(rx_refill_atomic(struct net_device *ndev));
-+static void rx_refill_atomic(struct net_device *ndev)
- {
-- rx_refill(dev, GFP_ATOMIC);
-+ rx_refill(ndev, GFP_ATOMIC);
- }
-
- /* REFILL */
- static inline void queue_refill(void *_dev)
- {
-- struct ns83820 *dev = _dev;
-+ struct net_device *ndev = _dev;
-+ struct ns83820 *dev = PRIV(ndev);
-
-- rx_refill(dev, GFP_KERNEL);
-+ rx_refill(ndev, GFP_KERNEL);
- if (dev->rx_info.up)
-- kick_rx(dev);
-+ kick_rx(ndev);
- }
-
- static inline void clear_rx_desc(struct ns83820 *dev, unsigned i)
-@@ -608,9 +619,10 @@ static inline void clear_rx_desc(struct
- build_rx_desc(dev, dev->rx_info.descs + (DESC_SIZE * i), 0, 0, CMDSTS_OWN, 0);
- }
-
--static void FASTCALL(phy_intr(struct ns83820 *dev));
--static void phy_intr(struct ns83820 *dev)
-+static void FASTCALL(phy_intr(struct net_device *ndev));
-+static void phy_intr(struct net_device *ndev)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
- u32 cfg, new_cfg;
- u32 tbisr, tanar, tanlpar;
-@@ -688,27 +700,28 @@ static void phy_intr(struct ns83820 *dev
-
- if (newlinkstate & LINK_UP
- && dev->linkstate != newlinkstate) {
-- netif_start_queue(&dev->net_dev);
-- netif_wake_queue(&dev->net_dev);
-+ netif_start_queue(ndev);
-+ netif_wake_queue(ndev);
- printk(KERN_INFO "%s: link now %s mbps, %s duplex and up.\n",
-- dev->net_dev.name,
-+ ndev->name,
- speeds[speed],
- fullduplex ? "full" : "half");
- } else if (newlinkstate & LINK_DOWN
- && dev->linkstate != newlinkstate) {
-- netif_stop_queue(&dev->net_dev);
-- printk(KERN_INFO "%s: link now down.\n", dev->net_dev.name);
-+ netif_stop_queue(ndev);
-+ printk(KERN_INFO "%s: link now down.\n", ndev->name);
- }
-
- dev->linkstate = newlinkstate;
- }
-
--static int ns83820_setup_rx(struct ns83820 *dev)
-+static int ns83820_setup_rx(struct net_device *ndev)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- unsigned i;
- int ret;
-
-- dprintk("ns83820_setup_rx(%p)\n", dev);
-+ dprintk("ns83820_setup_rx(%p)\n", ndev);
-
- dev->rx_info.idle = 1;
- dev->rx_info.next_rx = 0;
-@@ -721,7 +734,7 @@ static int ns83820_setup_rx(struct ns838
- writel(0, dev->base + RXDP_HI);
- writel(dev->rx_info.phy_descs, dev->base + RXDP);
-
-- ret = rx_refill(dev, GFP_KERNEL);
-+ ret = rx_refill(ndev, GFP_KERNEL);
- if (!ret) {
- dprintk("starting receiver\n");
- /* prevent the interrupt handler from stomping on us */
-@@ -734,7 +747,7 @@ static int ns83820_setup_rx(struct ns838
-
- dev->rx_info.up = 1;
-
-- phy_intr(dev);
-+ phy_intr(ndev);
-
- /* Okay, let it rip */
- spin_lock_irq(&dev->misc_lock);
-@@ -753,7 +766,7 @@ static int ns83820_setup_rx(struct ns838
- writel(1, dev->base + IER);
- spin_unlock_irq(&dev->misc_lock);
-
-- kick_rx(dev);
-+ kick_rx(ndev);
-
- spin_unlock_irq(&dev->rx_info.lock);
- }
-@@ -793,37 +806,39 @@ static void ns83820_cleanup_rx(struct ns
- }
- }
-
--static void FASTCALL(ns83820_rx_kick(struct ns83820 *dev));
--static void ns83820_rx_kick(struct ns83820 *dev)
-+static void FASTCALL(ns83820_rx_kick(struct net_device *ndev));
-+static void ns83820_rx_kick(struct net_device *ndev)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- /*if (nr_rx_empty(dev) >= NR_RX_DESC/4)*/ {
- if (dev->rx_info.up) {
-- rx_refill_atomic(dev);
-- kick_rx(dev);
-+ rx_refill_atomic(ndev);
-+ kick_rx(ndev);
- }
- }
-
- if (dev->rx_info.up && nr_rx_empty(dev) > NR_RX_DESC*3/4)
- schedule_work(&dev->tq_refill);
- else
-- kick_rx(dev);
-+ kick_rx(ndev);
- if (dev->rx_info.idle)
-- printk(KERN_DEBUG "%s: BAD\n", dev->net_dev.name);
-+ printk(KERN_DEBUG "%s: BAD\n", ndev->name);
- }
-
- /* rx_irq
- *
- */
--static void FASTCALL(rx_irq(struct ns83820 *dev));
--static void rx_irq(struct ns83820 *dev)
-+static void FASTCALL(rx_irq(struct net_device *ndev));
-+static void rx_irq(struct net_device *ndev)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- struct rx_info *info = &dev->rx_info;
- unsigned next_rx;
- u32 cmdsts, *desc;
- unsigned long flags;
- int nr = 0;
-
-- dprintk("rx_irq(%p)\n", dev);
-+ dprintk("rx_irq(%p)\n", ndev);
- dprintk("rxdp: %08x, descs: %08lx next_rx[%d]: %p next_empty[%d]: %p\n",
- readl(dev->base + RXDP),
- (long)(dev->rx_info.phy_descs),
-@@ -873,7 +888,7 @@ static void rx_irq(struct ns83820 *dev)
- } else {
- skb->ip_summed = CHECKSUM_NONE;
- }
-- skb->protocol = eth_type_trans(skb, &dev->net_dev);
-+ skb->protocol = eth_type_trans(skb, ndev);
- if (NET_RX_DROP == netif_rx(skb)) {
- netdev_mangle_me_harder_failed:
- dev->stats.rx_dropped ++;
-@@ -899,8 +914,9 @@ out:
-
- static void rx_action(unsigned long _dev)
- {
-- struct ns83820 *dev = (void *)_dev;
-- rx_irq(dev);
-+ struct net_device *ndev = (void *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
-+ rx_irq(ndev);
- writel(ihr, dev->base + IHR);
-
- spin_lock_irq(&dev->misc_lock);
-@@ -908,8 +924,8 @@ static void rx_action(unsigned long _dev
- writel(dev->IMR_cache, dev->base + IMR);
- spin_unlock_irq(&dev->misc_lock);
-
-- rx_irq(dev);
-- ns83820_rx_kick(dev);
-+ rx_irq(ndev);
-+ ns83820_rx_kick(ndev);
- }
-
- /* Packet Transmit code
-@@ -924,13 +940,14 @@ static inline void kick_tx(struct ns8382
- /* No spinlock needed on the transmit irq path as the interrupt handler is
- * serialized.
- */
--static void do_tx_done(struct ns83820 *dev)
-+static void do_tx_done(struct net_device *ndev)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- u32 cmdsts, tx_done_idx, *desc;
-
- spin_lock_irq(&dev->tx_lock);
-
-- dprintk("do_tx_done(%p)\n", dev);
-+ dprintk("do_tx_done(%p)\n", ndev);
- tx_done_idx = dev->tx_done_idx;
- desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
-
-@@ -980,10 +997,10 @@ static void do_tx_done(struct ns83820 *d
- /* Allow network stack to resume queueing packets after we've
- * finished transmitting at least 1/4 of the packets in the queue.
- */
-- if (netif_queue_stopped(&dev->net_dev) && start_tx_okay(dev)) {
-- dprintk("start_queue(%p)\n", dev);
-- netif_start_queue(&dev->net_dev);
-- netif_wake_queue(&dev->net_dev);
-+ if (netif_queue_stopped(ndev) && start_tx_okay(dev)) {
-+ dprintk("start_queue(%p)\n", ndev);
-+ netif_start_queue(ndev);
-+ netif_wake_queue(ndev);
- }
- spin_unlock_irq(&dev->tx_lock);
- }
-@@ -1015,9 +1032,9 @@ static void ns83820_cleanup_tx(struct ns
- * while trying to track down a bug in either the zero copy code or
- * the tx fifo (hence the MAX_FRAG_LEN).
- */
--static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *_dev)
-+static int ns83820_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev)
- {
-- struct ns83820 *dev = (struct ns83820 *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
- u32 free_idx, cmdsts, extsts;
- int nr_free, nr_frags;
- unsigned tx_done_idx, last_idx;
-@@ -1033,10 +1050,10 @@ static int ns83820_hard_start_xmit(struc
- nr_frags = skb_shinfo(skb)->nr_frags;
- again:
- if (unlikely(dev->CFG_cache & CFG_LNKSTS)) {
-- netif_stop_queue(&dev->net_dev);
-+ netif_stop_queue(ndev);
- if (unlikely(dev->CFG_cache & CFG_LNKSTS))
- return 1;
-- netif_start_queue(&dev->net_dev);
-+ netif_start_queue(ndev);
- }
-
- last_idx = free_idx = dev->tx_free_idx;
-@@ -1044,13 +1061,13 @@ again:
- nr_free = (tx_done_idx + NR_TX_DESC-2 - free_idx) % NR_TX_DESC;
- nr_free -= 1;
- if (nr_free <= nr_frags) {
-- dprintk("stop_queue - not enough(%p)\n", dev);
-- netif_stop_queue(&dev->net_dev);
-+ dprintk("stop_queue - not enough(%p)\n", ndev);
-+ netif_stop_queue(ndev);
-
- /* Check again: we may have raced with a tx done irq */
- if (dev->tx_done_idx != tx_done_idx) {
-- dprintk("restart queue(%p)\n", dev);
-- netif_start_queue(&dev->net_dev);
-+ dprintk("restart queue(%p)\n", ndev);
-+ netif_start_queue(ndev);
- goto again;
- }
- return 1;
-@@ -1063,8 +1080,8 @@ again:
-
- nr_free -= nr_frags;
- if (nr_free < MIN_TX_DESC_FREE) {
-- dprintk("stop_queue - last entry(%p)\n", dev);
-- netif_stop_queue(&dev->net_dev);
-+ dprintk("stop_queue - last entry(%p)\n", ndev);
-+ netif_stop_queue(ndev);
- stopped = 1;
- }
-
-@@ -1136,10 +1153,10 @@ again:
-
- /* Check again: we may have raced with a tx done irq */
- if (stopped && (dev->tx_done_idx != tx_done_idx) && start_tx_okay(dev))
-- netif_start_queue(&dev->net_dev);
-+ netif_start_queue(ndev);
-
- /* set the transmit start time to catch transmit timeouts */
-- dev->net_dev.trans_start = jiffies;
-+ ndev->trans_start = jiffies;
- return 0;
- }
-
-@@ -1161,9 +1178,9 @@ static void ns83820_update_stats(struct
- dev->stats.tx_carrier_errors += readl(base + 0x88) & 0xff;
- }
-
--static struct net_device_stats *ns83820_get_stats(struct net_device *_dev)
-+static struct net_device_stats *ns83820_get_stats(struct net_device *ndev)
- {
-- struct ns83820 *dev = (void *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
-
- /* somewhat overkill */
- spin_lock_irq(&dev->misc_lock);
-@@ -1213,9 +1230,9 @@ static int ns83820_ethtool_ioctl (struct
- return -EOPNOTSUPP;
- }
-
--static int ns83820_ioctl(struct net_device *_dev, struct ifreq *rq, int cmd)
-+static int ns83820_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
- {
-- struct ns83820 *dev = (struct ns83820 *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
-
- switch(cmd) {
- case SIOCETHTOOL:
-@@ -1233,23 +1250,25 @@ static void ns83820_mib_isr(struct ns838
- spin_unlock(&dev->misc_lock);
- }
-
--static void ns83820_do_isr(struct ns83820 *dev, u32 isr);
-+static void ns83820_do_isr(struct net_device *ndev, u32 isr);
- static irqreturn_t ns83820_irq(int foo, void *data, struct pt_regs *regs)
- {
-- struct ns83820 *dev = data;
-+ struct net_device *ndev = data;
-+ struct ns83820 *dev = PRIV(ndev);
- u32 isr;
-- dprintk("ns83820_irq(%p)\n", dev);
-+ dprintk("ns83820_irq(%p)\n", ndev);
-
- dev->ihr = 0;
-
- isr = readl(dev->base + ISR);
- dprintk("irq: %08x\n", isr);
-- ns83820_do_isr(dev, isr);
-+ ns83820_do_isr(ndev, isr);
- return IRQ_HANDLED;
- }
-
--static void ns83820_do_isr(struct ns83820 *dev, u32 isr)
-+static void ns83820_do_isr(struct net_device *ndev, u32 isr)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- #ifdef DEBUG
- if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
- Dprintk("odd isr? 0x%08x\n", isr);
-@@ -1258,7 +1277,7 @@ static void ns83820_do_isr(struct ns8382
- if (ISR_RXIDLE & isr) {
- dev->rx_info.idle = 1;
- Dprintk("oh dear, we are idle\n");
-- ns83820_rx_kick(dev);
-+ ns83820_rx_kick(ndev);
- }
-
- if ((ISR_RXDESC | ISR_RXOK) & isr) {
-@@ -1270,12 +1289,12 @@ static void ns83820_do_isr(struct ns8382
- spin_unlock_irq(&dev->misc_lock);
-
- tasklet_schedule(&dev->rx_tasklet);
-- //rx_irq(dev);
-+ //rx_irq(ndev);
- //writel(4, dev->base + IHR);
- }
-
- if ((ISR_RXIDLE | ISR_RXORN | ISR_RXDESC | ISR_RXOK | ISR_RXERR) & isr)
-- ns83820_rx_kick(dev);
-+ ns83820_rx_kick(ndev);
-
- if (unlikely(ISR_RXSOVR & isr)) {
- //printk("overrun: rxsovr\n");
-@@ -1297,7 +1316,7 @@ static void ns83820_do_isr(struct ns8382
- txdp -= dev->tx_phy_descs;
- dev->tx_idx = txdp / (DESC_SIZE * 4);
- if (dev->tx_idx >= NR_TX_DESC) {
-- printk(KERN_ALERT "%s: BUG -- txdp out of range\n", dev->net_dev.name);
-+ printk(KERN_ALERT "%s: BUG -- txdp out of range\n", ndev->name);
- dev->tx_idx = 0;
- }
- /* The may have been a race between a pci originated read
-@@ -1313,7 +1332,7 @@ static void ns83820_do_isr(struct ns8382
- * work has accumulated
- */
- if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) {
-- do_tx_done(dev);
-+ do_tx_done(ndev);
-
- /* Disable TxOk if there are no outstanding tx packets.
- */
-@@ -1345,7 +1364,7 @@ static void ns83820_do_isr(struct ns8382
-
- /* PHY: Link up/down/negotiation state change */
- if (unlikely(ISR_PHY & isr))
-- phy_intr(dev);
-+ phy_intr(ndev);
-
- #if 0 /* Still working on the interrupt mitigation strategy */
- if (dev->ihr)
-@@ -1363,9 +1382,9 @@ static void ns83820_do_reset(struct ns83
- Dprintk("okay!\n");
- }
-
--static int ns83820_stop(struct net_device *_dev)
-+static int ns83820_stop(struct net_device *ndev)
- {
-- struct ns83820 *dev = (struct ns83820 *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
-
- /* FIXME: protect against interrupt handler? */
- del_timer_sync(&dev->tx_watchdog);
-@@ -1392,10 +1411,9 @@ static int ns83820_stop(struct net_devic
- return 0;
- }
-
--static void ns83820_do_isr(struct ns83820 *dev, u32 isr);
--static void ns83820_tx_timeout(struct net_device *_dev)
-+static void ns83820_tx_timeout(struct net_device *ndev)
- {
-- struct ns83820 *dev = (struct ns83820 *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
- u32 tx_done_idx, *desc;
- unsigned long flags;
-
-@@ -1405,7 +1423,7 @@ static void ns83820_tx_timeout(struct ne
- desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
-
- printk(KERN_INFO "%s: tx_timeout: tx_done_idx=%d free_idx=%d cmdsts=%08x\n",
-- dev->net_dev.name,
-+ ndev->name,
- tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS]));
-
- #if defined(DEBUG)
-@@ -1413,17 +1431,17 @@ static void ns83820_tx_timeout(struct ne
- u32 isr;
- isr = readl(dev->base + ISR);
- printk("irq: %08x imr: %08x\n", isr, dev->IMR_cache);
-- ns83820_do_isr(dev, isr);
-+ ns83820_do_isr(ndev, isr);
- }
- #endif
-
-- do_tx_done(dev);
-+ do_tx_done(ndev);
-
- tx_done_idx = dev->tx_done_idx;
- desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
-
- printk(KERN_INFO "%s: after: tx_done_idx=%d free_idx=%d cmdsts=%08x\n",
-- dev->net_dev.name,
-+ ndev->name,
- tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS]));
-
- local_irq_restore(flags);
-@@ -1431,7 +1449,8 @@ static void ns83820_tx_timeout(struct ne
-
- static void ns83820_tx_watch(unsigned long data)
- {
-- struct ns83820 *dev = (void *)data;
-+ struct net_device *ndev = (void *)data;
-+ struct ns83820 *dev = PRIV(ndev);
-
- #if defined(DEBUG)
- printk("ns83820_tx_watch: %u %u %d\n",
-@@ -1439,21 +1458,21 @@ static void ns83820_tx_watch(unsigned lo
- );
- #endif
-
-- if (time_after(jiffies, dev->net_dev.trans_start + 1*HZ) &&
-+ if (time_after(jiffies, ndev->trans_start + 1*HZ) &&
- dev->tx_done_idx != dev->tx_free_idx) {
- printk(KERN_DEBUG "%s: ns83820_tx_watch: %u %u %d\n",
-- dev->net_dev.name,
-+ ndev->name,
- dev->tx_done_idx, dev->tx_free_idx,
- atomic_read(&dev->nr_tx_skbs));
-- ns83820_tx_timeout(&dev->net_dev);
-+ ns83820_tx_timeout(ndev);
- }
-
- mod_timer(&dev->tx_watchdog, jiffies + 2*HZ);
- }
-
--static int ns83820_open(struct net_device *_dev)
-+static int ns83820_open(struct net_device *ndev)
- {
-- struct ns83820 *dev = (struct ns83820 *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
- unsigned i;
- u32 desc;
- int ret;
-@@ -1462,7 +1481,7 @@ static int ns83820_open(struct net_devic
-
- writel(0, dev->base + PQCR);
-
-- ret = ns83820_setup_rx(dev);
-+ ret = ns83820_setup_rx(ndev);
- if (ret)
- goto failed;
-
-@@ -1481,16 +1500,16 @@ static int ns83820_open(struct net_devic
- writel(desc, dev->base + TXDP);
-
- init_timer(&dev->tx_watchdog);
-- dev->tx_watchdog.data = (unsigned long)dev;
-+ dev->tx_watchdog.data = (unsigned long)ndev;
- dev->tx_watchdog.function = ns83820_tx_watch;
- mod_timer(&dev->tx_watchdog, jiffies + 2*HZ);
-
-- netif_start_queue(&dev->net_dev); /* FIXME: wait for phy to come up */
-+ netif_start_queue(ndev); /* FIXME: wait for phy to come up */
-
- return 0;
-
- failed:
-- ns83820_stop(_dev);
-+ ns83820_stop(ndev);
- return ret;
- }
-
-@@ -1513,28 +1532,28 @@ static void ns83820_getmac(struct ns8382
- }
- }
-
--static int ns83820_change_mtu(struct net_device *_dev, int new_mtu)
-+static int ns83820_change_mtu(struct net_device *ndev, int new_mtu)
- {
- if (new_mtu > RX_BUF_SIZE)
- return -EINVAL;
-- _dev->mtu = new_mtu;
-+ ndev->mtu = new_mtu;
- return 0;
- }
-
--static void ns83820_set_multicast(struct net_device *_dev)
-+static void ns83820_set_multicast(struct net_device *ndev)
- {
-- struct ns83820 *dev = (void *)_dev;
-+ struct ns83820 *dev = PRIV(ndev);
- u8 *rfcr = dev->base + RFCR;
- u32 and_mask = 0xffffffff;
- u32 or_mask = 0;
- u32 val;
-
-- if (dev->net_dev.flags & IFF_PROMISC)
-+ if (ndev->flags & IFF_PROMISC)
- or_mask |= RFCR_AAU | RFCR_AAM;
- else
- and_mask &= ~(RFCR_AAU | RFCR_AAM);
-
-- if (dev->net_dev.flags & IFF_ALLMULTI)
-+ if (ndev->flags & IFF_ALLMULTI)
- or_mask |= RFCR_AAM;
- else
- and_mask &= ~RFCR_AAM;
-@@ -1547,14 +1566,15 @@ static void ns83820_set_multicast(struct
- spin_unlock_irq(&dev->misc_lock);
- }
-
--static void ns83820_run_bist(struct ns83820 *dev, const char *name, u32 enable, u32 done, u32 fail)
-+static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enable, u32 done, u32 fail)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- int timed_out = 0;
- long start;
- u32 status;
- int loops = 0;
-
-- dprintk("%s: start %s\n", dev->net_dev.name, name);
-+ dprintk("%s: start %s\n", ndev->name, name);
-
- start = jiffies;
-
-@@ -1578,12 +1598,12 @@ static void ns83820_run_bist(struct ns83
-
- if (status & fail)
- printk(KERN_INFO "%s: %s failed! (0x%08x & 0x%08x)\n",
-- dev->net_dev.name, name, status, fail);
-+ ndev->name, name, status, fail);
- else if (timed_out)
- printk(KERN_INFO "%s: run_bist %s timed out! (%08x)\n",
-- dev->net_dev.name, name, status);
-+ ndev->name, name, status);
-
-- dprintk("%s: done %s in %d loops\n", dev->net_dev.name, name, loops);
-+ dprintk("%s: done %s in %d loops\n", ndev->name, name, loops);
- }
-
- #ifdef PHY_CODE_IS_FINISHED
-@@ -1706,8 +1726,9 @@ static unsigned ns83820_mii_write_reg(st
- return data;
- }
-
--static void ns83820_probe_phy(struct ns83820 *dev)
-+static void ns83820_probe_phy(struct net_device *ndev)
- {
-+ struct ns83820 *dev = PRIV(ndev);
- static int first;
- int i;
- #define MII_PHYIDR1 0x02
-@@ -1734,11 +1755,11 @@ static void ns83820_probe_phy(struct ns8
- b = ns83820_mii_read_reg(dev, i, MII_PHYIDR2);
-
- //printk("%s: phy %d: 0x%04x 0x%04x\n",
-- // dev->net_dev.name, i, a, b);
-+ // ndev->name, i, a, b);
-
- for (j=0; j<0x16; j+=4) {
- dprintk("%s: [0x%02x] %04x %04x %04x %04x\n",
-- dev->net_dev.name, j,
-+ ndev->name, j,
- ns83820_mii_read_reg(dev, i, 0 + j),
- ns83820_mii_read_reg(dev, i, 1 + j),
- ns83820_mii_read_reg(dev, i, 2 + j),
-@@ -1763,6 +1784,7 @@ static void ns83820_probe_phy(struct ns8
-
- static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_device_id *id)
- {
-+ struct net_device *ndev;
- struct ns83820 *dev;
- long addr;
- int err;
-@@ -1778,7 +1800,8 @@ static int __devinit ns83820_init_one(st
- return -ENODEV;
- }
-
-- dev = (struct ns83820 *)alloc_etherdev((sizeof *dev) - (sizeof dev->net_dev));
-+ ndev = alloc_etherdev(sizeof(struct ns83820));
-+ dev = PRIV(ndev);
- err = -ENOMEM;
- if (!dev)
- goto out;
-@@ -1790,12 +1813,11 @@ static int __devinit ns83820_init_one(st
-
- dev->ee.cache = &dev->MEAR_cache;
- dev->ee.lock = &dev->misc_lock;
-- SET_MODULE_OWNER(dev->net_dev);
-- SET_NETDEV_DEV(&dev->net_dev, &pci_dev->dev);
-- dev->net_dev.priv = dev;
-+ SET_MODULE_OWNER(ndev);
-+ SET_NETDEV_DEV(ndev, &pci_dev->dev);
-
-- INIT_WORK(&dev->tq_refill, queue_refill, dev);
-- tasklet_init(&dev->rx_tasklet, rx_action, (unsigned long)dev);
-+ INIT_WORK(&dev->tq_refill, queue_refill, ndev);
-+ tasklet_init(&dev->rx_tasklet, rx_action, (unsigned long)ndev);
-
- err = pci_enable_device(pci_dev);
- if (err) {
-@@ -1829,55 +1851,63 @@ static int __devinit ns83820_init_one(st
- 0);
-
- err = request_irq(pci_dev->irq, ns83820_irq, SA_SHIRQ,
-- dev->net_dev.name, dev);
-+ ndev->name, ndev);
- if (err) {
- printk(KERN_INFO "ns83820: unable to register irq %d\n",
- pci_dev->irq);
- goto out_disable;
- }
-
-- err = register_netdev(&dev->net_dev);
-- if (err) {
-- printk(KERN_INFO "ns83820: unable to register netdev: %d\n", err);
-+ /*
-+ * FIXME: we are holding rtnl_lock() over obscenely long area only
-+ * because some of the setup code uses dev->name. It's Wrong(tm) -
-+ * we should be using driver-specific names for all that stuff.
-+ * For now that will do, but we really need to come back and kill
-+ * most of the dev_alloc_name() users later.
-+ */
-+ rtnl_lock();
-+ err = dev_alloc_name(ndev, ndev->name);
-+ if (err < 0) {
-+ printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err);
- goto out_free_irq;
- }
-
- printk("%s: ns83820.c: 0x22c: %08x, subsystem: %04x:%04x\n",
-- dev->net_dev.name, le32_to_cpu(readl(dev->base + 0x22c)),
-+ ndev->name, le32_to_cpu(readl(dev->base + 0x22c)),
- pci_dev->subsystem_vendor, pci_dev->subsystem_device);
-
-- dev->net_dev.open = ns83820_open;
-- dev->net_dev.stop = ns83820_stop;
-- dev->net_dev.hard_start_xmit = ns83820_hard_start_xmit;
-- dev->net_dev.get_stats = ns83820_get_stats;
-- dev->net_dev.change_mtu = ns83820_change_mtu;
-- dev->net_dev.set_multicast_list = ns83820_set_multicast;
-- dev->net_dev.do_ioctl = ns83820_ioctl;
-- dev->net_dev.tx_timeout = ns83820_tx_timeout;
-- dev->net_dev.watchdog_timeo = 5 * HZ;
-+ ndev->open = ns83820_open;
-+ ndev->stop = ns83820_stop;
-+ ndev->hard_start_xmit = ns83820_hard_start_xmit;
-+ ndev->get_stats = ns83820_get_stats;
-+ ndev->change_mtu = ns83820_change_mtu;
-+ ndev->set_multicast_list = ns83820_set_multicast;
-+ ndev->do_ioctl = ns83820_ioctl;
-+ ndev->tx_timeout = ns83820_tx_timeout;
-+ ndev->watchdog_timeo = 5 * HZ;
-
-- pci_set_drvdata(pci_dev, dev);
-+ pci_set_drvdata(pci_dev, ndev);
-
- ns83820_do_reset(dev, CR_RST);
-
- /* Must reset the ram bist before running it */
- writel(PTSCR_RBIST_RST, dev->base + PTSCR);
-- ns83820_run_bist(dev, "sram bist", PTSCR_RBIST_EN,
-+ ns83820_run_bist(ndev, "sram bist", PTSCR_RBIST_EN,
- PTSCR_RBIST_DONE, PTSCR_RBIST_FAIL);
-- ns83820_run_bist(dev, "eeprom bist", PTSCR_EEBIST_EN, 0,
-+ ns83820_run_bist(ndev, "eeprom bist", PTSCR_EEBIST_EN, 0,
- PTSCR_EEBIST_FAIL);
-- ns83820_run_bist(dev, "eeprom load", PTSCR_EELOAD_EN, 0, 0);
-+ ns83820_run_bist(ndev, "eeprom load", PTSCR_EELOAD_EN, 0, 0);
-
- /* I love config registers */
- dev->CFG_cache = readl(dev->base + CFG);
-
- if ((dev->CFG_cache & CFG_PCI64_DET)) {
- printk(KERN_INFO "%s: detected 64 bit PCI data bus.\n",
-- dev->net_dev.name);
-+ ndev->name);
- /*dev->CFG_cache |= CFG_DATA64_EN;*/
- if (!(dev->CFG_cache & CFG_DATA64_EN))
- printk(KERN_INFO "%s: EEPROM did not enable 64 bit bus. Disabled.\n",
-- dev->net_dev.name);
-+ ndev->name);
- } else
- dev->CFG_cache &= ~(CFG_DATA64_EN);
-
-@@ -1905,7 +1935,7 @@ static int __devinit ns83820_init_one(st
- /* setup optical transceiver if we have one */
- if (dev->CFG_cache & CFG_TBI_EN) {
- printk(KERN_INFO "%s: enabling optical transceiver\n",
-- dev->net_dev.name);
-+ ndev->name);
- writel(readl(dev->base + GPIOR) | 0x3e8, dev->base + GPIOR);
-
- /* setup auto negotiation feature advertisement */
-@@ -1926,7 +1956,7 @@ static int __devinit ns83820_init_one(st
- dprintk("CFG: %08x\n", dev->CFG_cache);
-
- if (reset_phy) {
-- printk(KERN_INFO "%s: resetting phy\n", dev->net_dev.name);
-+ printk(KERN_INFO "%s: resetting phy\n", ndev->name);
- writel(dev->CFG_cache | CFG_PHY_RST, dev->base + CFG);
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout((HZ+99)/100);
-@@ -1996,37 +2026,49 @@ static int __devinit ns83820_init_one(st
- /* Disable Wake On Lan */
- writel(0, dev->base + WCSR);
-
-- ns83820_getmac(dev, dev->net_dev.dev_addr);
-+ ns83820_getmac(dev, ndev->dev_addr);
-
- /* Yes, we support dumb IP checksum on transmit */
-- dev->net_dev.features |= NETIF_F_SG;
-- dev->net_dev.features |= NETIF_F_IP_CSUM;
-+ ndev->features |= NETIF_F_SG;
-+ ndev->features |= NETIF_F_IP_CSUM;
-
- if (using_dac) {
- printk(KERN_INFO "%s: using 64 bit addressing.\n",
-- dev->net_dev.name);
-- dev->net_dev.features |= NETIF_F_HIGHDMA;
-+ ndev->name);
-+ ndev->features |= NETIF_F_HIGHDMA;
- }
-
- printk(KERN_INFO "%s: ns83820 v" VERSION ": DP83820 v%u.%u: %02x:%02x:%02x:%02x:%02x:%02x io=0x%08lx irq=%d f=%s\n",
-- dev->net_dev.name,
-+ ndev->name,
- (unsigned)readl(dev->base + SRR) >> 8,
- (unsigned)readl(dev->base + SRR) & 0xff,
-- dev->net_dev.dev_addr[0], dev->net_dev.dev_addr[1],
-- dev->net_dev.dev_addr[2], dev->net_dev.dev_addr[3],
-- dev->net_dev.dev_addr[4], dev->net_dev.dev_addr[5],
-+ ndev->dev_addr[0], ndev->dev_addr[1],
-+ ndev->dev_addr[2], ndev->dev_addr[3],
-+ ndev->dev_addr[4], ndev->dev_addr[5],
- addr, pci_dev->irq,
-- (dev->net_dev.features & NETIF_F_HIGHDMA) ? "h,sg" : "sg"
-+ (ndev->features & NETIF_F_HIGHDMA) ? "h,sg" : "sg"
- );
-
- #ifdef PHY_CODE_IS_FINISHED
-- ns83820_probe_phy(dev);
-+ ns83820_probe_phy(ndev);
- #endif
-
-+ err = register_netdevice(ndev);
-+ if (err) {
-+ printk(KERN_INFO "ns83820: unable to register netdev: %d\n", err);
-+ goto out_cleanup;
-+ }
-+ rtnl_unlock();
-+
- return 0;
-
-+out_cleanup:
-+ writel(0, dev->base + IMR); /* paranoia */
-+ writel(0, dev->base + IER);
-+ readl(dev->base + IER);
- out_free_irq:
-- free_irq(pci_dev->irq, dev);
-+ rtnl_unlock();
-+ free_irq(pci_dev->irq, ndev);
- out_disable:
- if (dev->base)
- iounmap(dev->base);
-@@ -2034,7 +2076,7 @@ out_disable:
- pci_free_consistent(pci_dev, 4 * DESC_SIZE * NR_RX_DESC, dev->rx_info.descs, dev->rx_info.phy_descs);
- pci_disable_device(pci_dev);
- out_free:
-- kfree(dev);
-+ free_netdev(ndev);
- pci_set_drvdata(pci_dev, NULL);
- out:
- return err;
-@@ -2042,24 +2084,25 @@ out:
-
- static void __devexit ns83820_remove_one(struct pci_dev *pci_dev)
- {
-- struct ns83820 *dev = pci_get_drvdata(pci_dev);
-+ struct net_device *ndev = pci_get_drvdata(pci_dev);
-+ struct ns83820 *dev = PRIV(ndev); /* ok even if NULL */
-
-- if (!dev) /* paranoia */
-+ if (!ndev) /* paranoia */
- return;
-
- writel(0, dev->base + IMR); /* paranoia */
- writel(0, dev->base + IER);
- readl(dev->base + IER);
-
-- unregister_netdev(&dev->net_dev);
-- free_irq(dev->pci_dev->irq, dev);
-+ unregister_netdev(ndev);
-+ free_irq(dev->pci_dev->irq, ndev);
- iounmap(dev->base);
- pci_free_consistent(dev->pci_dev, 4 * DESC_SIZE * NR_TX_DESC,
- dev->tx_descs, dev->tx_phy_descs);
- pci_free_consistent(dev->pci_dev, 4 * DESC_SIZE * NR_RX_DESC,
- dev->rx_info.descs, dev->rx_info.phy_descs);
- pci_disable_device(dev->pci_dev);
-- free_netdev(&dev->net_dev);
-+ free_netdev(ndev);
- pci_set_drvdata(pci_dev, NULL);
- }
-
---- linux-2.6.0/drivers/net/oaknet.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/oaknet.c 2003-12-28 23:21:01.000000000 -0800
-@@ -94,8 +94,8 @@ static int __init oaknet_init(void)
- {
- register int i;
- int reg0, regd;
-- int ret;
-- struct net_device tmp, *dev = NULL;
-+ int ret = -ENOMEM;
-+ struct net_device *dev;
- #if 0
- unsigned long ioaddr = OAKNET_IO_BASE;
- #else
-@@ -105,17 +105,14 @@ static int __init oaknet_init(void)
-
- if (!ioaddr)
- return -ENOMEM;
-- /*
-- * This MUST happen here because of the nic_* macros
-- * which have an implicit dependency on dev->base_addr.
-- */
-
-- tmp.base_addr = ioaddr;
-- dev = &tmp;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ goto out_unmap;
-
- ret = -EBUSY;
- if (!request_region(OAKNET_IO_BASE, OAKNET_IO_SIZE, name))
-- goto out_unmap;
-+ goto out_dev;
-
- /* Quick register check to see if the device is really there. */
-
-@@ -144,17 +141,7 @@ static int __init oaknet_init(void)
- goto out_region;
- }
-
-- /*
-- * We're not using the old-style probing API, so we have to allocate
-- * our own device structure.
-- */
--
-- dev = init_etherdev(NULL, 0);
-- ret = -ENOMEM;
-- if (!dev)
-- goto out_region;
- SET_MODULE_OWNER(dev);
-- oaknet_devs = dev;
-
- /*
- * This controller is on an embedded board, so the base address
-@@ -164,14 +151,6 @@ static int __init oaknet_init(void)
- dev->base_addr = ioaddr;
- dev->irq = OAKNET_INT;
-
-- /* Allocate 8390-specific device-private area and fields. */
--
-- ret = -ENOMEM;
-- if (ethdev_init(dev)) {
-- printk(" unable to get memory for dev->priv.\n");
-- goto out_dev;
-- }
--
- /*
- * Disable all chip interrupts for now and ACK all pending
- * interrupts.
-@@ -186,7 +165,7 @@ static int __init oaknet_init(void)
- if (request_irq(dev->irq, ei_interrupt, 0, name, dev)) {
- printk("%s: unable to request interrupt %d.\n",
- dev->name, dev->irq);
-- goto out_priv;
-+ goto out_region;
- }
-
- /* Tell the world about what and where we've found. */
-@@ -215,15 +194,19 @@ static int __init oaknet_init(void)
- dev->stop = oaknet_close;
-
- NS8390_init(dev, FALSE);
-+ ret = register_netdev(dev);
-+ if (ret)
-+ goto out_irq;
-+
-+ oaknet_devs = dev;
-+ return 0;
-
-- return (0);
--out_priv:
-- kfree(dev->priv);
--out_dev:
-- unregister_netdev(dev);
-- kfree(dev);
-+out_irq;
-+ free_irq(dev->irq, dev);
- out_region:
- release_region(OAKNET_IO_BASE, OAKNET_IO_SIZE);
-+out_dev:
-+ free_netdev(dev);
- out_unmap:
- iounmap(ioaddr);
- return ret;
-@@ -662,38 +645,18 @@ oaknet_dma_error(struct net_device *dev,
- }
-
- /*
-- * Oak Ethernet module load interface.
-- */
--static int __init oaknet_init_module (void)
--{
-- if (oaknet_devs != NULL)
-- return (-EBUSY);
--
-- return (oaknet_init());
--}
--
--/*
- * Oak Ethernet module unload interface.
- */
- static void __exit oaknet_cleanup_module (void)
- {
-- if (oaknet_devs == NULL)
-- return;
--
-- if (oaknet_devs->priv != NULL) {
-- int ioaddr = oaknet_devs->base_addr;
-- void *priv = oaknet_devs->priv;
-- free_irq(oaknet_devs->irq, oaknet_devs);
-- release_region(ioaddr, OAKNET_IO_SIZE);
-- iounmap(ioaddr);
-- unregister_netdev(oaknet_dev);
-- free_netdev(priv);
-- }
--
- /* Convert to loop once driver supports multiple devices. */
-- kfree(oaknet_devs);
-+ unregister_netdev(oaknet_dev);
-+ free_irq(oaknet_devs->irq, oaknet_devs);
-+ release_region(oaknet_devs->base_addr, OAKNET_IO_SIZE);
-+ iounmap(ioaddr);
-+ free_netdev(oaknet_devs);
- }
-
--module_init(oaknet_init_module);
-+module_init(oaknet_init);
- module_exit(oaknet_cleanup_module);
- MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/net/pci-skeleton.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/net/pci-skeleton.c 2003-12-28 23:21:01.000000000 -0800
-@@ -730,7 +730,7 @@ err_out_free_res:
- #endif
- pci_release_regions (pdev);
- err_out:
-- kfree (dev);
-+ free_netdev (dev);
- DPRINTK ("EXIT, returning %d\n", rc);
- return rc;
- }
---- linux-2.6.0/drivers/net/pcmcia/3c574_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/pcmcia/3c574_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -330,7 +330,7 @@ static dev_link_t *tc574_attach(void)
- client_reg.event_handler = &tc574_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- tc574_detach(link);
-@@ -362,23 +362,17 @@ static void tc574_detach(dev_link_t *lin
- if (*linkp == NULL)
- return;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- tc574_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-- if (link->dev) {
-+ if (link->dev)
- unregister_netdev(dev);
-- free_netdev(dev);
-- } else
-- kfree(dev);
--
-+ free_netdev(dev);
- } /* tc574_detach */
-
- /*
-@@ -387,8 +381,8 @@ static void tc574_detach(dev_link_t *lin
- ethernet device available to the system.
- */
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void tc574_config(dev_link_t *link)
- {
-@@ -409,12 +403,12 @@ static void tc574_config(dev_link_t *lin
-
- tuple.Attributes = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- tuple.TupleData = (cisdata_t *)buf;
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -424,15 +418,15 @@ static void tc574_config(dev_link_t *lin
- link->io.IOAddrLines = 16;
- for (i = j = 0; j < 0x400; j += 0x20) {
- link->io.BasePort1 = j ^ 0x300;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIO, i);
- goto failed;
- }
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- dev->irq = link->irq.AssignedIRQ;
- dev->base_addr = link->io.BasePort1;
-@@ -451,8 +445,8 @@ static void tc574_config(dev_link_t *lin
- the hardware address. The future products may include a modem chip
- and put the address in the CIS. */
- tuple.DesiredTuple = 0x88;
-- if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
-- CardServices(GetTupleData, handle, &tuple);
-+ if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) {
-+ pcmcia_get_tuple_data(handle, &tuple);
- for (i = 0; i < 3; i++)
- phys_addr[i] = htons(buf[i]);
- } else {
-@@ -466,9 +460,9 @@ static void tc574_config(dev_link_t *lin
- }
- }
- tuple.DesiredTuple = CISTPL_VERS_1;
-- if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS &&
-- CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS &&
-- CardServices(ParseTuple, handle, &tuple, &parse) == CS_SUCCESS) {
-+ if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS &&
-+ pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS &&
-+ pcmcia_parse_tuple(handle, &tuple, &parse) == CS_SUCCESS) {
- cardname = parse.version_1.str + parse.version_1.ofs[1];
- } else
- cardname = "3Com 3c574";
-@@ -557,21 +551,11 @@ static void tc574_release(dev_link_t *li
- {
- DEBUG(0, "3c574_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1, "3c574_cs: release postponed, '%s' still open\n",
-- link->dev->dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- tc574_detach(link);
- }
-
- /*
-@@ -608,7 +592,7 @@ static int tc574_event(event_t event, in
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -616,7 +600,7 @@ static int tc574_event(event_t event, in
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- tc574_reset(dev);
- netif_device_attach(dev);
-@@ -1092,8 +1076,12 @@ static struct net_device_stats *el3_get_
- {
- struct el3_private *lp = (struct el3_private *)dev->priv;
-
-- if (netif_device_present(dev))
-+ if (netif_device_present(dev)) {
-+ unsigned long flags;
-+ spin_lock_irqsave(&lp->window_lock, flags);
- update_stats(dev);
-+ spin_unlock_irqrestore(&lp->window_lock, flags);
-+ }
- return &lp->stats;
- }
-
-@@ -1105,7 +1093,6 @@ static void update_stats(struct net_devi
- {
- struct el3_private *lp = (struct el3_private *)dev->priv;
- ioaddr_t ioaddr = dev->base_addr;
-- unsigned long flags;
- u8 rx, tx, up;
-
- DEBUG(2, "%s: updating the statistics.\n", dev->name);
-@@ -1113,8 +1100,6 @@ static void update_stats(struct net_devi
- if (inw(ioaddr+EL3_STATUS) == 0xffff) /* No card. */
- return;
-
-- spin_lock_irqsave(&lp->window_lock, flags);
--
- /* Unlike the 3c509 we need not turn off stats updates while reading. */
- /* Switch to the stats window, and read everything. */
- EL3WINDOW(6);
-@@ -1139,7 +1124,6 @@ static void update_stats(struct net_devi
- lp->stats.tx_bytes += tx + ((up & 0xf0) << 12);
-
- EL3WINDOW(1);
-- spin_unlock_irqrestore(&lp->window_lock, flags);
- }
-
- static int el3_rx(struct net_device *dev, int worklimit)
-@@ -1281,6 +1265,8 @@ static int el3_close(struct net_device *
- DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
-
- if (DEV_OK(link)) {
-+ unsigned long flags;
-+
- /* Turn off statistics ASAP. We update lp->stats below. */
- outw(StatsDisable, ioaddr + EL3_CMD);
-
-@@ -1290,15 +1276,15 @@ static int el3_close(struct net_device *
-
- /* Note: Switching to window 0 may disable the IRQ. */
- EL3WINDOW(0);
--
-+ spin_lock_irqsave(&lp->window_lock, flags);
- update_stats(dev);
-+ spin_unlock_irqrestore(&lp->window_lock, flags);
- }
-
- link->open--;
- netif_stop_queue(dev);
- del_timer_sync(&lp->media);
-- if (link->state & DEV_STALE_CONFIG)
-- tc574_release(link);
-+
- return 0;
- }
-
---- linux-2.6.0/drivers/net/pcmcia/3c589_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/pcmcia/3c589_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -244,7 +244,7 @@ static dev_link_t *tc589_attach(void)
- client_reg.event_handler = &tc589_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- tc589_detach(link);
-@@ -276,23 +276,17 @@ static void tc589_detach(dev_link_t *lin
- if (*linkp == NULL)
- return;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- tc589_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-- if (link->dev) {
-+ if (link->dev)
- unregister_netdev(dev);
-- free_netdev(dev);
-- } else
-- kfree(dev);
--
-+ free_netdev(dev);
- } /* tc589_detach */
-
- /*======================================================================
-@@ -303,8 +297,8 @@ static void tc589_detach(dev_link_t *lin
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void tc589_config(dev_link_t *link)
- {
-@@ -323,20 +317,20 @@ static void tc589_config(dev_link_t *lin
- phys_addr = (u16 *)dev->dev_addr;
- tuple.Attributes = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- tuple.TupleData = (cisdata_t *)buf;
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
- /* Is this a 3c562? */
- tuple.DesiredTuple = CISTPL_MANFID;
- tuple.Attributes = TUPLE_RETURN_COMMON;
-- if ((CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) &&
-- (CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS)) {
-+ if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) &&
-+ (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) {
- if (le16_to_cpu(buf[0]) != MANFID_3COM)
- printk(KERN_INFO "3c589_cs: hmmm, is this really a "
- "3Com card??\n");
-@@ -351,15 +345,15 @@ static void tc589_config(dev_link_t *lin
- for (i = j = 0; j < 0x400; j += 0x10) {
- if (multi && (j & 0x80)) continue;
- link->io.BasePort1 = j ^ 0x300;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIO, i);
- goto failed;
- }
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- dev->irq = link->irq.AssignedIRQ;
- dev->base_addr = link->io.BasePort1;
-@@ -374,8 +368,8 @@ static void tc589_config(dev_link_t *lin
- /* The 3c589 has an extra EEPROM for configuration info, including
- the hardware address. The 3c562 puts the address in the CIS. */
- tuple.DesiredTuple = 0x88;
-- if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
-- CardServices(GetTupleData, handle, &tuple);
-+ if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) {
-+ pcmcia_get_tuple_data(handle, &tuple);
- for (i = 0; i < 3; i++)
- phys_addr[i] = htons(buf[i]);
- } else {
-@@ -433,21 +427,11 @@ static void tc589_release(dev_link_t *li
- {
- DEBUG(0, "3c589_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1, "3c589_cs: release postponed, '%s' still open\n",
-- link->dev->dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- tc589_detach(link);
- }
-
- /*======================================================================
-@@ -486,7 +470,7 @@ static int tc589_event(event_t event, in
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -494,7 +478,7 @@ static int tc589_event(event_t event, in
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- tc589_reset(dev);
- netif_device_attach(dev);
-@@ -1076,8 +1060,6 @@ static int el3_close(struct net_device *
- link->open--;
- netif_stop_queue(dev);
- del_timer_sync(&lp->media);
-- if (link->state & DEV_STALE_CONFIG)
-- tc589_release(link);
-
- return 0;
- }
---- linux-2.6.0/drivers/net/pcmcia/axnet_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/pcmcia/axnet_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -119,7 +119,7 @@ static void axnet_detach(dev_link_t *);
- static dev_info_t dev_info = "axnet_cs";
- static dev_link_t *dev_list;
-
--static int axdev_init(struct net_device *dev);
-+static void axdev_setup(struct net_device *dev);
- static void AX88190_init(struct net_device *dev, int startp);
- static int ax_open(struct net_device *dev);
- static int ax_close(struct net_device *dev);
-@@ -128,7 +128,6 @@ static irqreturn_t ax_interrupt(int irq,
- /*====================================================================*/
-
- typedef struct axnet_dev_t {
-- struct net_device dev; /* so &dev == &axnet_dev_t */
- dev_link_t link;
- dev_node_t node;
- caddr_t base;
-@@ -140,16 +139,10 @@ typedef struct axnet_dev_t {
- int flags;
- } axnet_dev_t;
-
--/*======================================================================
--
-- We never need to do anything when a axnet device is "initialized"
-- by the net software, because we only register already-found cards.
--
--======================================================================*/
--
--static int axnet_init(struct net_device *dev)
-+static inline axnet_dev_t *PRIV(struct net_device *dev)
- {
-- return 0;
-+ void *p = (char *)netdev_priv(dev) + sizeof(struct ei_device);
-+ return p;
- }
-
- /*======================================================================
-@@ -170,12 +163,15 @@ static dev_link_t *axnet_attach(void)
-
- DEBUG(0, "axnet_attach()\n");
-
-- /* Create new ethernet device */
-- info = kmalloc(sizeof(*info), GFP_KERNEL);
-- if (!info) return NULL;
-- memset(info, 0, sizeof(*info));
-- link = &info->link; dev = &info->dev;
-- link->priv = info;
-+ dev = alloc_netdev(sizeof(struct ei_device) + sizeof(axnet_dev_t),
-+ "eth%d", axdev_setup);
-+
-+ if (!dev)
-+ return NULL;
-+
-+ info = PRIV(dev);
-+ link = &info->link;
-+ link->priv = dev;
- link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
- link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
- if (irq_list[0] == -1)
-@@ -186,8 +182,6 @@ static dev_link_t *axnet_attach(void)
- link->conf.Attributes = CONF_ENABLE_IRQ;
- link->conf.IntType = INT_MEMORY_AND_IO;
-
-- axdev_init(dev);
-- dev->init = &axnet_init;
- dev->open = &axnet_open;
- dev->stop = &axnet_close;
- dev->do_ioctl = &axnet_ioctl;
-@@ -205,7 +199,7 @@ static dev_link_t *axnet_attach(void)
- client_reg.event_handler = &axnet_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- axnet_detach(link);
-@@ -226,7 +220,7 @@ static dev_link_t *axnet_attach(void)
-
- static void axnet_detach(dev_link_t *link)
- {
-- axnet_dev_t *info = link->priv;
-+ struct net_device *dev = link->priv;
- dev_link_t **linkp;
-
- DEBUG(0, "axnet_detach(0x%p)\n", link);
-@@ -237,23 +231,17 @@ static void axnet_detach(dev_link_t *lin
- if (*linkp == NULL)
- return;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- axnet_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-- if (link->dev) {
-- unregister_netdev(&info->dev);
-- free_netdev(&info->dev);
-- } else
-- kfree(info);
--
-+ if (link->dev)
-+ unregister_netdev(dev);
-+ free_netdev(dev);
- } /* axnet_detach */
-
- /*======================================================================
-@@ -313,11 +301,8 @@ static int get_prom(dev_link_t *link)
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static int try_io_port(dev_link_t *link)
- {
-@@ -340,20 +325,20 @@ static int try_io_port(dev_link_t *link)
- for (j = 0; j < 0x400; j += 0x20) {
- link->io.BasePort1 = j ^ 0x300;
- link->io.BasePort2 = (j ^ 0x300) + 0x10;
-- ret = CardServices(RequestIO, link->handle, &link->io);
-+ ret = pcmcia_request_io(link->handle, &link->io);
- if (ret == CS_SUCCESS) return ret;
- }
- return ret;
- } else {
-- return CardServices(RequestIO, link->handle, &link->io);
-+ return pcmcia_request_io(link->handle, &link->io);
- }
- }
-
- static void axnet_config(dev_link_t *link)
- {
- client_handle_t handle = link->handle;
-- axnet_dev_t *info = link->priv;
-- struct net_device *dev = &info->dev;
-+ struct net_device *dev = link->priv;
-+ axnet_dev_t *info = PRIV(dev);
- tuple_t tuple;
- cisparse_t parse;
- int i, j, last_ret, last_fn;
-@@ -367,9 +352,9 @@ static void axnet_config(dev_link_t *lin
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- /* don't trust the CIS on this; Linksys got it wrong */
- link->conf.Present = 0x63;
-@@ -378,19 +363,19 @@ static void axnet_config(dev_link_t *lin
- link->state |= DEV_CONFIG;
-
- /* Look up current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
- tuple.Attributes = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (last_ret == CS_SUCCESS) {
- cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
- cistpl_io_t *io = &(parse.cftable_entry.io);
-
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-- if ((cfg->index == 0) || (cfg->io.nwin == 0))
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0 ||
-+ cfg->index == 0 || cfg->io.nwin == 0)
- goto next_entry;
-
- link->conf.ConfigIndex = 0x05;
-@@ -411,32 +396,27 @@ static void axnet_config(dev_link_t *lin
- if (last_ret == CS_SUCCESS) break;
- }
- next_entry:
-- last_ret = CardServices(GetNextTuple, handle, &tuple);
-+ last_ret = pcmcia_get_next_tuple(handle, &tuple);
- }
- if (last_ret != CS_SUCCESS) {
- cs_error(handle, RequestIO, last_ret);
- goto failed;
- }
-
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-
- if (link->io.NumPorts2 == 8) {
- link->conf.Attributes |= CONF_ENABLE_SPKR;
- link->conf.Status = CCSR_AUDIO_ENA;
- }
-
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
- dev->irq = link->irq.AssignedIRQ;
- dev->base_addr = link->io.BasePort1;
-- if (register_netdev(dev) != 0) {
-- printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
-- goto failed;
-- }
-
- if (!get_prom(link)) {
- printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
- printk(KERN_NOTICE "axnet_cs: use pcnet_cs instead.\n");
-- unregister_netdev(dev);
- goto failed;
- }
-
-@@ -451,7 +431,6 @@ static void axnet_config(dev_link_t *lin
- ei_status.block_output = &block_output;
-
- strcpy(info->node.dev_name, dev->name);
-- link->dev = &info->node;
-
- if (inb(dev->base_addr + AXNET_TEST) != 0)
- info->flags |= IS_AX88790;
-@@ -476,7 +455,7 @@ static void axnet_config(dev_link_t *lin
- Bit 2 of CCSR is active low. */
- if (i == 32) {
- conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 };
-- CardServices(AccessConfigurationRegister, link->handle, ®);
-+ pcmcia_access_configuration_register(link->handle, ®);
- for (i = 0; i < 32; i++) {
- j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
- if ((j != 0) && (j != 0xffff)) break;
-@@ -490,6 +469,12 @@ static void axnet_config(dev_link_t *lin
- printk(KERN_NOTICE " No MII transceivers found!\n");
- }
-
-+ if (register_netdev(dev) != 0) {
-+ printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
-+ goto failed;
-+ }
-+
-+ link->dev = &info->node;
- link->state &= ~DEV_CONFIG_PENDING;
- return;
-
-@@ -513,21 +498,11 @@ static void axnet_release(dev_link_t *li
- {
- DEBUG(0, "axnet_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1, "axnet_cs: release postponed, '%s' still open\n",
-- ((axnet_dev_t *)(link->priv))->node.dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- axnet_detach(link);
- }
-
- /*======================================================================
-@@ -543,7 +518,7 @@ static int axnet_event(event_t event, in
- event_callback_args_t *args)
- {
- dev_link_t *link = args->client_data;
-- axnet_dev_t *info = link->priv;
-+ struct net_device *dev = link->priv;
-
- DEBUG(2, "axnet_event(0x%06x)\n", event);
-
-@@ -551,7 +526,7 @@ static int axnet_event(event_t event, in
- case CS_EVENT_CARD_REMOVAL:
- link->state &= ~DEV_PRESENT;
- if (link->state & DEV_CONFIG) {
-- netif_device_detach(&info->dev);
-+ netif_device_detach(dev);
- axnet_release(link);
- }
- break;
-@@ -565,7 +540,7 @@ static int axnet_event(event_t event, in
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG) {
- if (link->open)
-- netif_device_detach(&info->dev);
-+ netif_device_detach(dev);
- CardServices(ReleaseConfiguration, link->handle);
- }
- break;
-@@ -574,11 +549,11 @@ static int axnet_event(event_t event, in
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
-- axnet_reset_8390(&info->dev);
-- AX88190_init(&info->dev, 1);
-- netif_device_attach(&info->dev);
-+ axnet_reset_8390(dev);
-+ AX88190_init(dev, 1);
-+ netif_device_attach(dev);
- }
- }
- break;
-@@ -648,7 +623,7 @@ static void mdio_write(ioaddr_t addr, in
-
- static int axnet_open(struct net_device *dev)
- {
-- axnet_dev_t *info = (axnet_dev_t *)dev;
-+ axnet_dev_t *info = PRIV(dev);
- dev_link_t *link = &info->link;
-
- DEBUG(2, "axnet_open('%s')\n", dev->name);
-@@ -663,7 +638,7 @@ static int axnet_open(struct net_device
- info->link_status = 0x00;
- init_timer(&info->watchdog);
- info->watchdog.function = &ei_watchdog;
-- info->watchdog.data = (u_long)info;
-+ info->watchdog.data = (u_long)dev;
- info->watchdog.expires = jiffies + HZ;
- add_timer(&info->watchdog);
-
-@@ -674,7 +649,7 @@ static int axnet_open(struct net_device
-
- static int axnet_close(struct net_device *dev)
- {
-- axnet_dev_t *info = (axnet_dev_t *)dev;
-+ axnet_dev_t *info = PRIV(dev);
- dev_link_t *link = &info->link;
-
- DEBUG(2, "axnet_close('%s')\n", dev->name);
-@@ -685,8 +660,6 @@ static int axnet_close(struct net_device
- link->open--;
- netif_stop_queue(dev);
- del_timer_sync(&info->watchdog);
-- if (link->state & DEV_STALE_CONFIG)
-- axnet_release(link);
-
- return 0;
- } /* axnet_close */
-@@ -726,15 +699,15 @@ static void axnet_reset_8390(struct net_
-
- static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs)
- {
-- axnet_dev_t *info = dev_id;
-- info->stale = 0;
-+ struct net_device *dev = dev_id;
-+ PRIV(dev)->stale = 0;
- return ax_interrupt(irq, dev_id, regs);
- }
-
- static void ei_watchdog(u_long arg)
- {
-- axnet_dev_t *info = (axnet_dev_t *)(arg);
-- struct net_device *dev = &info->dev;
-+ struct net_device *dev = (struct net_device *)(arg);
-+ axnet_dev_t *info = PRIV(dev);
- ioaddr_t nic_base = dev->base_addr;
- ioaddr_t mii_addr = nic_base + AXNET_MII_EEP;
- u_short link;
-@@ -804,7 +777,7 @@ static struct ethtool_ops netdev_ethtool
-
- static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
- {
-- axnet_dev_t *info = (axnet_dev_t *)dev;
-+ axnet_dev_t *info = PRIV(dev);
- u16 *data = (u16 *)&rq->ifr_data;
- ioaddr_t mii_addr = dev->base_addr + AXNET_MII_EEP;
- switch (cmd) {
-@@ -1053,14 +1026,7 @@ static void do_set_multicast_list(struct
- static int ax_open(struct net_device *dev)
- {
- unsigned long flags;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
--
-- /* This can't happen unless somebody forgot to call axdev_init(). */
-- if (ei_local == NULL)
-- {
-- printk(KERN_EMERG "%s: ax_open passed a non-existent device!\n", dev->name);
-- return -ENXIO;
-- }
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
-
- #ifdef HAVE_TX_TIMEOUT
- /* The card I/O part of the driver (e.g. 3c503) can hook a Tx timeout
-@@ -1086,7 +1052,7 @@ static int ax_open(struct net_device *de
- return 0;
- }
-
--#define dev_lock(dev) (((struct ei_device *)(dev)->priv)->page_lock)
-+#define dev_lock(dev) (((struct ei_device *)netdev_priv(dev))->page_lock)
-
- /**
- * ax_close - shut down network device
-@@ -1120,7 +1086,7 @@ int ax_close(struct net_device *dev)
- void ei_tx_timeout(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int txsr, isr, tickssofar = jiffies - dev->trans_start;
- unsigned long flags;
-
-@@ -1166,7 +1132,7 @@ void ei_tx_timeout(struct net_device *de
- static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int length, send_length, output_page;
- unsigned long flags;
- u8 packet[ETH_ZLEN];
-@@ -1312,7 +1278,7 @@ static irqreturn_t ax_interrupt(int irq,
- }
-
- e8390_base = dev->base_addr;
-- ei_local = (struct ei_device *) dev->priv;
-+ ei_local = (struct ei_device *) netdev_priv(dev);
-
- /*
- * Protect the irq test too.
-@@ -1424,7 +1390,7 @@ static irqreturn_t ax_interrupt(int irq,
- static void ei_tx_err(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- unsigned char txsr = inb_p(e8390_base+EN0_TSR);
- unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
-
-@@ -1465,7 +1431,7 @@ static void ei_tx_err(struct net_device
- static void ei_tx_intr(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int status = inb(e8390_base + EN0_TSR);
-
- /*
-@@ -1546,7 +1512,7 @@ static void ei_tx_intr(struct net_device
- static void ei_receive(struct net_device *dev)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- unsigned char rxing_page, this_frame, next_frame;
- unsigned short current_offset;
- int rx_pkt_count = 0;
-@@ -1666,7 +1632,7 @@ static void ei_rx_overrun(struct net_dev
- axnet_dev_t *info = (axnet_dev_t *)dev;
- long e8390_base = dev->base_addr;
- unsigned char was_txing, must_resend = 0;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
-
- /*
- * Record whether a Tx was in progress and then issue the
-@@ -1733,7 +1699,7 @@ static void ei_rx_overrun(struct net_dev
- static struct net_device_stats *get_stats(struct net_device *dev)
- {
- long ioaddr = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- unsigned long flags;
-
- /* If the card is stopped, just return the present stats. */
-@@ -1786,39 +1752,30 @@ static void set_multicast_list(struct ne
- }
-
- /**
-- * axdev_init - init rest of 8390 device struct
-+ * axdev_setup - init rest of 8390 device struct
- * @dev: network device structure to init
- *
- * Initialize the rest of the 8390 device structure. Do NOT __init
- * this, as it is used by 8390 based modular drivers too.
- */
-
--static int axdev_init(struct net_device *dev)
-+static void axdev_setup(struct net_device *dev)
- {
-+ struct ei_device *ei_local;
- if (ei_debug > 1)
- printk(version_8390);
-
- SET_MODULE_OWNER(dev);
-
-- if (dev->priv == NULL)
-- {
-- struct ei_device *ei_local;
-
-- dev->priv = kmalloc(sizeof(struct ei_device), GFP_KERNEL);
-- if (dev->priv == NULL)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct ei_device));
-- ei_local = (struct ei_device *)dev->priv;
-- spin_lock_init(&ei_local->page_lock);
-- }
-+ ei_local = (struct ei_device *)netdev_priv(dev);
-+ spin_lock_init(&ei_local->page_lock);
-
- dev->hard_start_xmit = &ei_start_xmit;
- dev->get_stats = get_stats;
- dev->set_multicast_list = &set_multicast_list;
-
- ether_setup(dev);
--
-- return 0;
- }
-
- /* This page of functions should be 8390 generic */
-@@ -1834,9 +1791,9 @@ static int axdev_init(struct net_device
-
- static void AX88190_init(struct net_device *dev, int startp)
- {
-- axnet_dev_t *info = (axnet_dev_t *)dev;
-+ axnet_dev_t *info = PRIV(dev);
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
- int i;
- int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
-
-@@ -1905,7 +1862,7 @@ static void NS8390_trigger_send(struct n
- int start_page)
- {
- long e8390_base = dev->base_addr;
-- struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) dev->priv;
-+ struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev);
-
- if (inb_p(e8390_base) & E8390_TRANS)
- {
---- linux-2.6.0/drivers/net/pcmcia/com20020_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/pcmcia/com20020_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -145,20 +145,6 @@ typedef struct com20020_dev_t {
- dev_node_t node;
- } com20020_dev_t;
-
--static void com20020_setup(struct net_device *dev)
--{
-- struct arcnet_local *lp = dev->priv;
--
-- lp->timeout = timeout;
-- lp->backplane = backplane;
-- lp->clockp = clockp;
-- lp->clockm = clockm & 3;
-- lp->hw.owner = THIS_MODULE;
--
-- /* fill in our module parameters as defaults */
-- dev->dev_addr[0] = node;
--}
--
- /*======================================================================
-
- com20020_attach() creates an "instance" of the driver, allocating
-@@ -187,14 +173,21 @@ static dev_link_t *com20020_attach(void)
- if (!info)
- goto fail_alloc_info;
-
-- dev = alloc_netdev(sizeof(struct arcnet_local), "arc%d",
-- com20020_setup);
-+ dev = alloc_arcdev("");
- if (!dev)
- goto fail_alloc_dev;
-
- memset(info, 0, sizeof(struct com20020_dev_t));
- memset(link, 0, sizeof(struct dev_link_t));
- lp = dev->priv;
-+ lp->timeout = timeout;
-+ lp->backplane = backplane;
-+ lp->clockp = clockp;
-+ lp->clockm = clockm & 3;
-+ lp->hw.owner = THIS_MODULE;
-+
-+ /* fill in our module parameters as defaults */
-+ dev->dev_addr[0] = node;
-
- link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
- link->io.NumPorts1 = 16;
-@@ -227,7 +220,7 @@ static dev_link_t *com20020_attach(void)
- client_reg.event_handler = &com20020_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- com20020_detach(link);
-@@ -270,14 +263,11 @@ static void com20020_detach(dev_link_t *
-
- dev = info->dev;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- com20020_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- DEBUG(1,"unlinking...\n");
-@@ -293,6 +283,8 @@ static void com20020_detach(dev_link_t *
-
- if (netif_running(dev))
- dev->stop(dev);
-+
-+ unregister_netdev(dev);
-
- /*
- * this is necessary because we register our IRQ separately
-@@ -300,10 +292,7 @@ static void com20020_detach(dev_link_t *
- */
- if (dev->irq)
- free_irq(dev->irq, dev);
--
- /* ...but I/O ports are done automatically by card services */
--
-- unregister_netdev(dev);
- }
-
- DEBUG(1,"kfree...\n");
-@@ -325,8 +314,8 @@ static void com20020_detach(dev_link_t *
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void com20020_config(dev_link_t *link)
- {
-@@ -353,9 +342,9 @@ static void com20020_config(dev_link_t *
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
-
- /* Configure card */
-@@ -368,13 +357,13 @@ static void com20020_config(dev_link_t *
- for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10)
- {
- link->io.BasePort1 = ioaddr;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- break;
- }
- }
- else
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
-
- if (i != CS_SUCCESS)
- {
-@@ -388,7 +377,7 @@ static void com20020_config(dev_link_t *
- DEBUG(1,"arcnet: request IRQ %d (%Xh/%Xh)\n",
- link->irq.AssignedIRQ,
- link->irq.IRQInfo1, link->irq.IRQInfo2);
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS)
- {
- DEBUG(1,"arcnet: requestIRQ failed totally!\n");
-@@ -397,7 +386,7 @@ static void com20020_config(dev_link_t *
-
- dev->irq = link->irq.AssignedIRQ;
-
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- if (com20020_check(dev))
- {
-@@ -447,21 +436,11 @@ static void com20020_release(dev_link_t
-
- DEBUG(0, "com20020_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1,"postpone...\n");
-- DEBUG(1, "com20020_cs: release postponed, device stll open\n");
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~(DEV_CONFIG | DEV_RELEASE_PENDING);
--
-- if (link->state & DEV_STALE_CONFIG)
-- com20020_detach(link);
- }
-
- /*======================================================================
-@@ -502,7 +481,7 @@ static int com20020_event(event_t event,
- if (link->open) {
- netif_device_detach(dev);
- }
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -510,7 +489,7 @@ static int com20020_event(event_t event,
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- int ioaddr = dev->base_addr;
- struct arcnet_local *lp = (struct arcnet_local *)dev->priv;
---- linux-2.6.0/drivers/net/pcmcia/fmvj18x_cs.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/pcmcia/fmvj18x_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -307,7 +307,7 @@ static dev_link_t *fmvj18x_attach(void)
- client_reg.event_handler = &fmvj18x_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- fmvj18x_detach(link);
-@@ -332,30 +332,24 @@ static void fmvj18x_detach(dev_link_t *l
- if (*linkp == NULL)
- return;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- fmvj18x_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free pieces */
- *linkp = link->next;
-- if (link->dev) {
-+ if (link->dev)
- unregister_netdev(dev);
-- free_netdev(dev);
-- } else
-- kfree(dev);
--
-+ free_netdev(dev);
- } /* fmvj18x_detach */
-
- /*====================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static int mfc_try_io_port(dev_link_t *link)
- {
-@@ -369,7 +363,7 @@ static int mfc_try_io_port(dev_link_t *l
- link->io.NumPorts2 = 0;
- printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
- }
-- ret = CardServices(RequestIO, link->handle, &link->io);
-+ ret = pcmcia_request_io(link->handle, &link->io);
- if (ret == CS_SUCCESS) return ret;
- }
- return ret;
-@@ -385,7 +379,7 @@ static int ungermann_try_io_port(dev_lin
- */
- for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
- link->io.BasePort1 = ioaddr;
-- ret = CardServices(RequestIO, link->handle, &link->io);
-+ ret = pcmcia_request_io(link->handle, &link->io);
- if (ret == CS_SUCCESS) {
- /* calculate ConfigIndex value */
- link->conf.ConfigIndex =
-@@ -417,12 +411,12 @@ static void fmvj18x_config(dev_link_t *l
- registers.
- */
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- tuple.TupleData = (u_char *)buf;
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-@@ -432,16 +426,16 @@ static void fmvj18x_config(dev_link_t *l
-
- tuple.DesiredTuple = CISTPL_FUNCE;
- tuple.TupleOffset = 0;
-- if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) {
-+ if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) {
- /* Yes, I have CISTPL_FUNCE. Let's check CISTPL_MANFID */
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigIndex = parse.cftable_entry.index;
- tuple.DesiredTuple = CISTPL_MANFID;
-- if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS)
-- CS_CHECK(GetTupleData, handle, &tuple);
-+ if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS)
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
- else
- buf[0] = 0xffff;
- switch (le16_to_cpu(buf[0])) {
-@@ -449,7 +443,7 @@ static void fmvj18x_config(dev_link_t *l
- cardtype = TDK;
- if (le16_to_cpu(buf[1]) == PRODID_TDK_CF010) {
- cs_status_t status;
-- CardServices(GetStatus, handle, &status);
-+ pcmcia_get_status(handle, &status);
- if (status.CardState & CS_EVENT_3VCARD)
- link->conf.Vcc = 33; /* inserted in 3.3V slot */
- } else if (le16_to_cpu(buf[1]) == PRODID_TDK_GN3410) {
-@@ -478,8 +472,8 @@ static void fmvj18x_config(dev_link_t *l
- } else {
- /* old type card */
- tuple.DesiredTuple = CISTPL_MANFID;
-- if (CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS)
-- CS_CHECK(GetTupleData, handle, &tuple);
-+ if (pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS)
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
- else
- buf[0] = 0xffff;
- switch (le16_to_cpu(buf[0])) {
-@@ -510,10 +504,10 @@ static void fmvj18x_config(dev_link_t *l
- ret = ungermann_try_io_port(link);
- if (ret != CS_SUCCESS) goto cs_failed;
- } else {
-- CS_CHECK(RequestIO, link->handle, &link->io);
-+ CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
- }
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
- dev->irq = link->irq.AssignedIRQ;
- dev->base_addr = link->io.BasePort1;
- if (register_netdev(dev) != 0) {
-@@ -546,17 +540,17 @@ static void fmvj18x_config(dev_link_t *l
- case CONTEC:
- tuple.DesiredTuple = CISTPL_FUNCE;
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- tuple.TupleOffset = 0;
-- CS_CHECK(GetTupleData, handle, &tuple);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
- if (cardtype == MBH10304) {
- /* MBH10304's CIS_FUNCE is corrupted */
- node_id = &(tuple.TupleData[5]);
- card_name = "FMV-J182";
- } else {
- while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) {
-- CS_CHECK(GetNextTuple, handle, &tuple) ;
-- CS_CHECK(GetTupleData, handle, &tuple) ;
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
- }
- node_id = &(tuple.TupleData[2]);
- if( cardtype == TDK ) {
-@@ -633,8 +627,7 @@ static int fmvj18x_get_hwinfo(dev_link_t
- req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
- req.Base = 0; req.Size = 0;
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- i = CardServices(RequestWindow, &link->win, &req);
-+ i = pcmcia_request_window(&link->handle, &req, &link->win);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestWindow, i);
- return -1;
-@@ -643,7 +636,7 @@ static int fmvj18x_get_hwinfo(dev_link_t
- base = ioremap(req.Base, req.Size);
- mem.Page = 0;
- mem.CardOffset = 0;
-- CardServices(MapMemPage, link->win, &mem);
-+ pcmcia_map_mem_page(link->win, &mem);
-
- /*
- * MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
-@@ -668,7 +661,7 @@ static int fmvj18x_get_hwinfo(dev_link_t
- }
-
- iounmap(base);
-- j = CardServices(ReleaseWindow, link->win);
-+ j = pcmcia_release_window(link->win);
- if (j != CS_SUCCESS)
- cs_error(link->handle, ReleaseWindow, j);
- return (i != 0x200) ? 0 : -1;
-@@ -689,8 +682,7 @@ static int fmvj18x_setup_mfc(dev_link_t
- req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
- req.Base = 0; req.Size = 0;
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- i = CardServices(RequestWindow, &link->win, &req);
-+ i = pcmcia_request_window(&link->handle, &req, &link->win);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestWindow, i);
- return -1;
-@@ -699,7 +691,7 @@ static int fmvj18x_setup_mfc(dev_link_t
- base = ioremap(req.Base, req.Size);
- mem.Page = 0;
- mem.CardOffset = 0;
-- CardServices(MapMemPage, link->win, &mem);
-+ pcmcia_map_mem_page(link->win, &mem);
-
- ioaddr = dev->base_addr;
- writeb(0x47, base+0x800); /* Config Option Register of LAN */
-@@ -712,7 +704,7 @@ static int fmvj18x_setup_mfc(dev_link_t
- writeb(0x8, base+0x822); /* Config and Status Register */
-
- iounmap(base);
-- j = CardServices(ReleaseWindow, link->win);
-+ j = pcmcia_release_window(link->win);
- if (j != CS_SUCCESS)
- cs_error(link->handle, ReleaseWindow, j);
- return 0;
-@@ -725,27 +717,13 @@ static void fmvj18x_release(dev_link_t *
-
- DEBUG(0, "fmvj18x_release(0x%p)\n", link);
-
-- /*
-- If the device is currently in use, we won't release until it
-- is actually closed.
-- */
-- if (link->open) {
-- DEBUG(1, "fmvj18x_cs: release postponed, '%s' "
-- "still open\n", link->dev->dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
- /* Don't bother checking to see if these succeed or not */
-- CardServices(ReleaseWindow, link->win);
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_window(link->win);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- fmvj18x_detach(link);
- }
-
- /*====================================================================*/
-@@ -777,7 +755,7 @@ static int fmvj18x_event(event_t event,
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -785,7 +763,7 @@ static int fmvj18x_event(event_t event,
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- fjn_reset(dev);
- netif_device_attach(dev);
-@@ -1253,8 +1231,6 @@ static int fjn_close(struct net_device *
- outb(INTR_OFF, ioaddr + LAN_CTRL);
-
- link->open--;
-- if (link->state & DEV_STALE_CONFIG)
-- fmvj18x_release(link);
-
- return 0;
- } /* fjn_close */
---- linux-2.6.0/drivers/net/pcmcia/ibmtr_cs.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/pcmcia/ibmtr_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -125,8 +125,7 @@ static void ibmtr_detach(dev_link_t *);
-
- static dev_link_t *dev_list;
-
--extern int ibmtr_probe(struct net_device *dev);
--extern int trdev_init(struct net_device *dev);
-+extern int ibmtr_probe_card(struct net_device *dev);
- extern irqreturn_t tok_interrupt (int irq, void *dev_id, struct pt_regs *regs);
-
- /*====================================================================*/
-@@ -199,7 +198,6 @@ static dev_link_t *ibmtr_attach(void)
-
- link->irq.Instance = info->dev = dev;
-
-- dev->init = &ibmtr_probe;
- SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
-
- /* Register with Card Services */
-@@ -214,7 +212,7 @@ static dev_link_t *ibmtr_attach(void)
- client_reg.event_handler = &ibmtr_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- goto out_detach;
-@@ -253,22 +251,22 @@ static void ibmtr_detach(dev_link_t *lin
- return;
-
- dev = info->dev;
-+
-+ if (link->dev)
-+ unregister_netdev(dev);
-+
- {
- struct tok_info *ti = (struct tok_info *)dev->priv;
- del_timer_sync(&(ti->tr_timer));
- }
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- ibmtr_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-- unregister_netdev(dev);
- free_netdev(dev);
- kfree(info);
- } /* ibmtr_detach */
-@@ -281,8 +279,8 @@ static void ibmtr_detach(dev_link_t *lin
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void ibmtr_config(dev_link_t *link)
- {
-@@ -304,9 +302,9 @@ static void ibmtr_config(dev_link_t *lin
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
-
- /* Configure card */
-@@ -318,18 +316,18 @@ static void ibmtr_config(dev_link_t *lin
-
- /* Try PRIMARY card at 0xA20-0xA23 */
- link->io.BasePort1 = 0xA20;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) {
- memcpy(info->node.dev_name, "tr0\0", 4);
- } else {
- /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */
- link->io.BasePort1 = 0xA24;
-- CS_CHECK(RequestIO, link->handle, &link->io);
-+ CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
- memcpy(info->node.dev_name, "tr1\0", 4);
- }
- dev->base_addr = link->io.BasePort1;
-
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
- dev->irq = link->irq.AssignedIRQ;
- ti->irq = link->irq.AssignedIRQ;
- ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
-@@ -340,12 +338,11 @@ static void ibmtr_config(dev_link_t *lin
- req.Base = 0;
- req.Size = 0x2000;
- req.AccessSpeed = 250;
-- link->win = (window_handle_t)link->handle;
-- CS_CHECK(RequestWindow, &link->win, &req);
-+ CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
-
- mem.CardOffset = mmiobase;
- mem.Page = 0;
-- CS_CHECK(MapMemPage, link->win, &mem);
-+ CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
- ti->mmio = ioremap(req.Base, req.Size);
-
- /* Allocate the SRAM memory window */
-@@ -354,24 +351,23 @@ static void ibmtr_config(dev_link_t *lin
- req.Base = 0;
- req.Size = sramsize * 1024;
- req.AccessSpeed = 250;
-- info->sram_win_handle = (window_handle_t)link->handle;
-- CS_CHECK(RequestWindow, &info->sram_win_handle, &req);
-+ CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &info->sram_win_handle));
-
- mem.CardOffset = srambase;
- mem.Page = 0;
-- CS_CHECK(MapMemPage, info->sram_win_handle, &mem);
-+ CS_CHECK(MapMemPage, pcmcia_map_mem_page(info->sram_win_handle, &mem));
-
- ti->sram_base = mem.CardOffset >> 12;
- ti->sram_virt = (u_long)ioremap(req.Base, req.Size);
-
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- /* Set up the Token-Ring Controller Configuration Register and
- turn on the card. Check the "Local Area Network Credit Card
- Adapters Technical Reference" SC30-3585 for this info. */
- ibmtr_hw_setup(dev, mmiobase);
-
-- i = register_netdev(dev);
-+ i = ibmtr_probe_card(dev);
-
- if (i != 0) {
- printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n");
-@@ -412,27 +408,17 @@ static void ibmtr_release(dev_link_t *li
-
- DEBUG(0, "ibmtr_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1, "ibmtr_cs: release postponed, '%s' "
-- "still open\n", info->node.dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- if (link->win) {
- struct tok_info *ti = dev->priv;
- iounmap((void *)ti->mmio);
-- CardServices(ReleaseWindow, link->win);
-- CardServices(ReleaseWindow, info->sram_win_handle);
-+ pcmcia_release_window(link->win);
-+ pcmcia_release_window(info->sram_win_handle);
- }
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- ibmtr_detach(link);
- }
-
- /*======================================================================
-@@ -474,7 +460,7 @@ static int ibmtr_event(event_t event, in
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -482,9 +468,9 @@ static int ibmtr_event(event_t event, in
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
-- (dev->init)(dev);
-+ ibmtr_probe(dev); /* really? */
- netif_device_attach(dev);
- }
- }
---- linux-2.6.0/drivers/net/pcmcia/nmclan_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/pcmcia/nmclan_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -520,7 +520,7 @@ static dev_link_t *nmclan_attach(void)
- client_reg.event_handler = &nmclan_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- nmclan_detach(link);
-@@ -551,23 +551,17 @@ static void nmclan_detach(dev_link_t *li
- if (*linkp == NULL)
- return;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- nmclan_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-- if (link->dev) {
-+ if (link->dev)
- unregister_netdev(dev);
-- free_netdev(dev);
-- } else
-- kfree(dev);
--
-+ free_netdev(dev);
- } /* nmclan_detach */
-
- /* ----------------------------------------------------------------------------
-@@ -706,8 +700,8 @@ nmclan_config
- ethernet device available to the system.
- ---------------------------------------------------------------------------- */
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void nmclan_config(dev_link_t *link)
- {
-@@ -727,17 +721,17 @@ static void nmclan_config(dev_link_t *li
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-
-- CS_CHECK(RequestIO, handle, &link->io);
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io));
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
- dev->irq = link->irq.AssignedIRQ;
- dev->base_addr = link->io.BasePort1;
- i = register_netdev(dev);
-@@ -753,8 +747,8 @@ static void nmclan_config(dev_link_t *li
- tuple.TupleData = buf;
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
- memcpy(dev->dev_addr, tuple.TupleData, ETHER_ADDR_LEN);
-
- /* Verify configuration by reading the MACE ID. */
-@@ -812,21 +806,11 @@ static void nmclan_release(dev_link_t *l
-
- DEBUG(0, "nmclan_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1, "nmclan_cs: release postponed, '%s' "
-- "still open\n", link->dev->dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- nmclan_detach(link);
- }
-
- /* ----------------------------------------------------------------------------
-@@ -863,7 +847,7 @@ static int nmclan_event(event_t event, i
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -871,7 +855,7 @@ static int nmclan_event(event_t event, i
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- nmclan_reset(dev);
- netif_device_attach(dev);
-@@ -903,7 +887,7 @@ static void nmclan_reset(struct net_devi
- reg.Action = CS_READ;
- reg.Offset = CISREG_COR;
- reg.Value = 0;
-- CardServices(AccessConfigurationRegister, link->handle, ®);
-+ pcmcia_access_configuration_register(link->handle, ®);
- OrigCorValue = reg.Value;
-
- /* Reset Xilinx */
-@@ -912,12 +896,12 @@ static void nmclan_reset(struct net_devi
- DEBUG(1, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n",
- OrigCorValue);
- reg.Value = COR_SOFT_RESET;
-- CardServices(AccessConfigurationRegister, link->handle, ®);
-+ pcmcia_access_configuration_register(link->handle, ®);
- /* Need to wait for 20 ms for PCMCIA to finish reset. */
-
- /* Restore original COR configuration index */
- reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK);
-- CardServices(AccessConfigurationRegister, link->handle, ®);
-+ pcmcia_access_configuration_register(link->handle, ®);
- /* Xilinx is now completely reset along with the MACE chip. */
- lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
-
-@@ -993,8 +977,6 @@ static int mace_close(struct net_device
-
- link->open--;
- netif_stop_queue(dev);
-- if (link->state & DEV_STALE_CONFIG)
-- nmclan_release(link);
-
- return 0;
- } /* mace_close */
-@@ -1046,7 +1028,7 @@ static void mace_tx_timeout(struct net_d
- printk(KERN_NOTICE "%s: transmit timed out -- ", dev->name);
- #if RESET_ON_TIMEOUT
- printk("resetting card\n");
-- CardServices(ResetCard, link->handle);
-+ pcmcia_reset_card(link->handle, NULL);
- #else /* #if RESET_ON_TIMEOUT */
- printk("NOT resetting card\n");
- #endif /* #if RESET_ON_TIMEOUT */
---- linux-2.6.0/drivers/net/pcmcia/pcnet_cs.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/pcmcia/pcnet_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -11,7 +11,7 @@
-
- Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
-
-- pcnet_cs.c 1.149 2002/06/29 06:27:37
-+ pcnet_cs.c 1.153 2003/11/09 18:53:09
-
- The network driver code is based on Donald Becker's NE2000 code:
-
-@@ -74,7 +74,7 @@ static int pc_debug = PCMCIA_DEBUG;
- MODULE_PARM(pc_debug, "i");
- #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
- static char *version =
--"pcnet_cs.c 1.149 2002/06/29 06:27:37 (David Hinds)";
-+"pcnet_cs.c 1.153 2003/11/09 18:53:09 (David Hinds)";
- #else
- #define DEBUG(n, args...)
- #endif
-@@ -224,7 +224,6 @@ static hw_info_t dl10019_info = { 0, 0,
- static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII };
-
- typedef struct pcnet_dev_t {
-- struct net_device dev; /* so &dev == &pcnet_dev_t */
- dev_link_t link;
- dev_node_t node;
- u_int flags;
-@@ -237,16 +236,10 @@ typedef struct pcnet_dev_t {
- u_long mii_reset;
- } pcnet_dev_t;
-
--/*======================================================================
--
-- We never need to do anything when a pcnet device is "initialized"
-- by the net software, because we only register already-found cards.
--
--======================================================================*/
--
--static int pcnet_init(struct net_device *dev)
-+static inline pcnet_dev_t *PRIV(struct net_device *dev)
- {
-- return 0;
-+ char *p = netdev_priv(dev);
-+ return (pcnet_dev_t *)(p + sizeof(struct ei_device));
- }
-
- /*======================================================================
-@@ -268,11 +261,11 @@ static dev_link_t *pcnet_attach(void)
- DEBUG(0, "pcnet_attach()\n");
-
- /* Create new ethernet device */
-- info = kmalloc(sizeof(*info), GFP_KERNEL);
-- if (!info) return NULL;
-- memset(info, 0, sizeof(*info));
-- link = &info->link; dev = &info->dev;
-- link->priv = info;
-+ dev = __alloc_ei_netdev(sizeof(pcnet_dev_t));
-+ if (!dev) return NULL;
-+ info = PRIV(dev);
-+ link = &info->link;
-+ link->priv = dev;
-
- link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
- link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
-@@ -284,9 +277,7 @@ static dev_link_t *pcnet_attach(void)
- link->conf.Attributes = CONF_ENABLE_IRQ;
- link->conf.IntType = INT_MEMORY_AND_IO;
-
-- ethdev_init(dev);
- SET_MODULE_OWNER(dev);
-- dev->init = &pcnet_init;
- dev->open = &pcnet_open;
- dev->stop = &pcnet_close;
- dev->set_config = &set_config;
-@@ -303,7 +294,7 @@ static dev_link_t *pcnet_attach(void)
- client_reg.event_handler = &pcnet_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- pcnet_detach(link);
-@@ -324,7 +315,7 @@ static dev_link_t *pcnet_attach(void)
-
- static void pcnet_detach(dev_link_t *link)
- {
-- pcnet_dev_t *info = link->priv;
-+ struct net_device *dev = link->priv;
- dev_link_t **linkp;
-
- DEBUG(0, "pcnet_detach(0x%p)\n", link);
-@@ -335,23 +326,17 @@ static void pcnet_detach(dev_link_t *lin
- if (*linkp == NULL)
- return;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- pcnet_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-- if (link->dev) {
-- unregister_netdev(&info->dev);
-- free_netdev(&info->dev);
-- } else
-- kfree(info);
--
-+ if (link->dev)
-+ unregister_netdev(dev);
-+ free_netdev(dev);
- } /* pcnet_detach */
-
- /*======================================================================
-@@ -373,8 +358,7 @@ static hw_info_t *get_hwinfo(dev_link_t
- req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
- req.Base = 0; req.Size = 0;
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- i = CardServices(RequestWindow, &link->win, &req);
-+ i = pcmcia_request_window(&link->handle, &req, &link->win);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestWindow, i);
- return NULL;
-@@ -384,7 +368,7 @@ static hw_info_t *get_hwinfo(dev_link_t
- mem.Page = 0;
- for (i = 0; i < NR_INFO; i++) {
- mem.CardOffset = hw_info[i].offset & ~(req.Size-1);
-- CardServices(MapMemPage, link->win, &mem);
-+ pcmcia_map_mem_page(link->win, &mem);
- base = &virt[hw_info[i].offset & (req.Size-1)];
- if ((readb(base+0) == hw_info[i].a0) &&
- (readb(base+2) == hw_info[i].a1) &&
-@@ -397,7 +381,7 @@ static hw_info_t *get_hwinfo(dev_link_t
- }
-
- iounmap(virt);
-- j = CardServices(ReleaseWindow, link->win);
-+ j = pcmcia_release_window(link->win);
- if (j != CS_SUCCESS)
- cs_error(link->handle, ReleaseWindow, j);
- return (i < NR_INFO) ? hw_info+i : NULL;
-@@ -544,11 +528,8 @@ static hw_info_t *get_hwired(dev_link_t
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static int try_io_port(dev_link_t *link)
- {
-@@ -571,20 +552,20 @@ static int try_io_port(dev_link_t *link)
- for (j = 0; j < 0x400; j += 0x20) {
- link->io.BasePort1 = j ^ 0x300;
- link->io.BasePort2 = (j ^ 0x300) + 0x10;
-- ret = CardServices(RequestIO, link->handle, &link->io);
-+ ret = pcmcia_request_io(link->handle, &link->io);
- if (ret == CS_SUCCESS) return ret;
- }
- return ret;
- } else {
-- return CardServices(RequestIO, link->handle, &link->io);
-+ return pcmcia_request_io(link->handle, &link->io);
- }
- }
-
- static void pcnet_config(dev_link_t *link)
- {
- client_handle_t handle = link->handle;
-- pcnet_dev_t *info = link->priv;
-- struct net_device *dev = &info->dev;
-+ struct net_device *dev = link->priv;
-+ pcnet_dev_t *info = PRIV(dev);
- tuple_t tuple;
- cisparse_t parse;
- int i, last_ret, last_fn, start_pg, stop_pg, cm_offset;
-@@ -600,9 +581,9 @@ static void pcnet_config(dev_link_t *lin
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -610,28 +591,28 @@ static void pcnet_config(dev_link_t *lin
- link->state |= DEV_CONFIG;
-
- /* Look up current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- tuple.DesiredTuple = CISTPL_MANFID;
- tuple.Attributes = TUPLE_RETURN_COMMON;
-- if ((CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) &&
-- (CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS)) {
-+ if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) &&
-+ (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS)) {
- manfid = le16_to_cpu(buf[0]);
- prodid = le16_to_cpu(buf[1]);
- }
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
- tuple.Attributes = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (last_ret == CS_SUCCESS) {
- cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
- cistpl_io_t *io = &(parse.cftable_entry.io);
-
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-- if ((cfg->index == 0) || (cfg->io.nwin == 0))
-- goto next_entry;
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0 ||
-+ cfg->index == 0 || cfg->io.nwin == 0)
-+ goto next_entry;
-
- link->conf.ConfigIndex = cfg->index;
- /* For multifunction cards, by convention, we configure the
-@@ -653,14 +634,14 @@ static void pcnet_config(dev_link_t *lin
- if (last_ret == CS_SUCCESS) break;
- }
- next_entry:
-- last_ret = CardServices(GetNextTuple, handle, &tuple);
-+ last_ret = pcmcia_get_next_tuple(handle, &tuple);
- }
- if (last_ret != CS_SUCCESS) {
- cs_error(handle, RequestIO, last_ret);
- goto failed;
- }
-
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-
- if (link->io.NumPorts2 == 8) {
- link->conf.Attributes |= CONF_ENABLE_SPKR;
-@@ -670,7 +651,7 @@ static void pcnet_config(dev_link_t *lin
- (prodid == PRODID_IBM_HOME_AND_AWAY))
- link->conf.ConfigIndex |= 0x10;
-
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
- dev->irq = link->irq.AssignedIRQ;
- dev->base_addr = link->io.BasePort1;
- if (info->flags & HAS_MISC_REG) {
-@@ -786,29 +767,19 @@ failed:
-
- static void pcnet_release(dev_link_t *link)
- {
-- pcnet_dev_t *info = link->priv;
-+ pcnet_dev_t *info = PRIV(link->priv);
-
- DEBUG(0, "pcnet_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1, "pcnet_cs: release postponed, '%s' still open\n",
-- info->node.dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
- if (info->flags & USE_SHMEM) {
- iounmap(info->base);
-- CardServices(ReleaseWindow, link->win);
-+ pcmcia_release_window(link->win);
- }
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- pcnet_detach(link);
- }
-
- /*======================================================================
-@@ -824,7 +795,7 @@ static int pcnet_event(event_t event, in
- event_callback_args_t *args)
- {
- dev_link_t *link = args->client_data;
-- pcnet_dev_t *info = link->priv;
-+ struct net_device *dev = link->priv;
-
- DEBUG(2, "pcnet_event(0x%06x)\n", event);
-
-@@ -832,7 +803,7 @@ static int pcnet_event(event_t event, in
- case CS_EVENT_CARD_REMOVAL:
- link->state &= ~DEV_PRESENT;
- if (link->state & DEV_CONFIG) {
-- netif_device_detach(&info->dev);
-+ netif_device_detach(dev);
- pcnet_release(link);
- }
- break;
-@@ -846,8 +817,8 @@ static int pcnet_event(event_t event, in
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG) {
- if (link->open)
-- netif_device_detach(&info->dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ netif_device_detach(dev);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -855,11 +826,11 @@ static int pcnet_event(event_t event, in
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
-- pcnet_reset_8390(&info->dev);
-- NS8390_init(&info->dev, 1);
-- netif_device_attach(&info->dev);
-+ pcnet_reset_8390(dev);
-+ NS8390_init(dev, 1);
-+ netif_device_attach(dev);
- }
- }
- break;
-@@ -871,13 +842,15 @@ static int pcnet_event(event_t event, in
-
- MII interface support for DL10019 and DL10022 based cards
-
-- On the DL10019, the MII IO direction bit is 0x10; on the DL10022
-+ On the DL10019, the MII IO direction bit is 0x10; on the DL10022
- it is 0x20. Setting both bits seems to work on both card types.
-
- ======================================================================*/
-
- #define DLINK_GPIO 0x1c
- #define DLINK_DIAG 0x1d
-+#define DLINK_EEPROM 0x1e
-+
- #define MDIO_SHIFT_CLK 0x80
- #define MDIO_DATA_OUT 0x40
- #define MDIO_DIR_WRITE 0x30
-@@ -940,12 +913,104 @@ static void mdio_reset(ioaddr_t addr, in
- outb_p(0x00, addr);
- }
-
-+/*======================================================================
-+
-+ EEPROM access routines for DL10019 and DL10022 based cards
-+
-+======================================================================*/
-+
-+#define EE_EEP 0x40
-+#define EE_ASIC 0x10
-+#define EE_CS 0x08
-+#define EE_CK 0x04
-+#define EE_DO 0x02
-+#define EE_DI 0x01
-+#define EE_ADOT 0x01 /* DataOut for ASIC */
-+#define EE_READ_CMD 0x06
-+
-+#define DL19FDUPLX 0x0400 /* DL10019 Full duplex mode */
-+
-+static int read_eeprom(ioaddr_t ioaddr, int location)
-+{
-+ int i, retval = 0;
-+ ioaddr_t ee_addr = ioaddr + DLINK_EEPROM;
-+ int read_cmd = location | (EE_READ_CMD << 8);
-+
-+ outb(0, ee_addr);
-+ outb(EE_EEP|EE_CS, ee_addr);
-+
-+ /* Shift the read command bits out. */
-+ for (i = 10; i >= 0; i--) {
-+ short dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
-+ outb_p(EE_EEP|EE_CS|dataval, ee_addr);
-+ outb_p(EE_EEP|EE_CS|dataval|EE_CK, ee_addr);
-+ }
-+ outb(EE_EEP|EE_CS, ee_addr);
-+
-+ for (i = 16; i > 0; i--) {
-+ outb_p(EE_EEP|EE_CS | EE_CK, ee_addr);
-+ retval = (retval << 1) | ((inb(ee_addr) & EE_DI) ? 1 : 0);
-+ outb_p(EE_EEP|EE_CS, ee_addr);
-+ }
-+
-+ /* Terminate the EEPROM access. */
-+ outb(0, ee_addr);
-+ return retval;
-+}
-+
-+/*
-+ The internal ASIC registers can be changed by EEPROM READ access
-+ with EE_ASIC bit set.
-+ In ASIC mode, EE_ADOT is used to output the data to the ASIC.
-+*/
-+
-+static void write_asic(ioaddr_t ioaddr, int location, short asic_data)
-+{
-+ int i;
-+ ioaddr_t ee_addr = ioaddr + DLINK_EEPROM;
-+ short dataval;
-+ int read_cmd = location | (EE_READ_CMD << 8);
-+
-+ asic_data |= read_eeprom(ioaddr, location);
-+
-+ outb(0, ee_addr);
-+ outb(EE_ASIC|EE_CS|EE_DI, ee_addr);
-+
-+ read_cmd = read_cmd >> 1;
-+
-+ /* Shift the read command bits out. */
-+ for (i = 9; i >= 0; i--) {
-+ dataval = (read_cmd & (1 << i)) ? EE_DO : 0;
-+ outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
-+ outb_p(EE_ASIC|EE_CS|EE_DI|dataval|EE_CK, ee_addr);
-+ outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr);
-+ }
-+ // sync
-+ outb(EE_ASIC|EE_CS, ee_addr);
-+ outb(EE_ASIC|EE_CS|EE_CK, ee_addr);
-+ outb(EE_ASIC|EE_CS, ee_addr);
-+
-+ for (i = 15; i >= 0; i--) {
-+ dataval = (asic_data & (1 << i)) ? EE_ADOT : 0;
-+ outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
-+ outb_p(EE_ASIC|EE_CS|dataval|EE_CK, ee_addr);
-+ outb_p(EE_ASIC|EE_CS|dataval, ee_addr);
-+ }
-+
-+ /* Terminate the ASIC access. */
-+ outb(EE_ASIC|EE_DI, ee_addr);
-+ outb(EE_ASIC|EE_DI| EE_CK, ee_addr);
-+ outb(EE_ASIC|EE_DI, ee_addr);
-+
-+ outb(0, ee_addr);
-+}
-+
- /*====================================================================*/
-
- static void set_misc_reg(struct net_device *dev)
- {
- ioaddr_t nic_base = dev->base_addr;
-- pcnet_dev_t *info = (pcnet_dev_t *)dev;
-+ pcnet_dev_t *info = PRIV(dev);
- u_char tmp;
-
- if (info->flags & HAS_MISC_REG) {
-@@ -975,7 +1040,7 @@ static void set_misc_reg(struct net_devi
-
- static void mii_phy_probe(struct net_device *dev)
- {
-- pcnet_dev_t *info = (pcnet_dev_t *)dev;
-+ pcnet_dev_t *info = PRIV(dev);
- ioaddr_t mii_addr = dev->base_addr + DLINK_GPIO;
- int i;
- u_int tmp, phyid;
-@@ -999,7 +1064,7 @@ static void mii_phy_probe(struct net_dev
-
- static int pcnet_open(struct net_device *dev)
- {
-- pcnet_dev_t *info = (pcnet_dev_t *)dev;
-+ pcnet_dev_t *info = PRIV(dev);
- dev_link_t *link = &info->link;
-
- DEBUG(2, "pcnet_open('%s')\n", dev->name);
-@@ -1016,7 +1081,7 @@ static int pcnet_open(struct net_device
- info->link_status = 0x00;
- init_timer(&info->watchdog);
- info->watchdog.function = &ei_watchdog;
-- info->watchdog.data = (u_long)info;
-+ info->watchdog.data = (u_long)dev;
- info->watchdog.expires = jiffies + HZ;
- add_timer(&info->watchdog);
-
-@@ -1027,7 +1092,7 @@ static int pcnet_open(struct net_device
-
- static int pcnet_close(struct net_device *dev)
- {
-- pcnet_dev_t *info = (pcnet_dev_t *)dev;
-+ pcnet_dev_t *info = PRIV(dev);
- dev_link_t *link = &info->link;
-
- DEBUG(2, "pcnet_close('%s')\n", dev->name);
-@@ -1038,8 +1103,6 @@ static int pcnet_close(struct net_device
- link->open--;
- netif_stop_queue(dev);
- del_timer_sync(&info->watchdog);
-- if (link->state & DEV_STALE_CONFIG)
-- pcnet_release(link);
-
- return 0;
- } /* pcnet_close */
-@@ -1080,7 +1143,7 @@ static void pcnet_reset_8390(struct net_
-
- static int set_config(struct net_device *dev, struct ifmap *map)
- {
-- pcnet_dev_t *info = (pcnet_dev_t *)dev;
-+ pcnet_dev_t *info = PRIV(dev);
- if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
- if (!(info->flags & HAS_MISC_REG))
- return -EOPNOTSUPP;
-@@ -1098,7 +1161,8 @@ static int set_config(struct net_device
-
- static irqreturn_t ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs)
- {
-- pcnet_dev_t *info = dev_id;
-+ struct net_device *dev = dev_id;
-+ pcnet_dev_t *info = PRIV(dev);
- info->stale = 0;
- ei_interrupt(irq, dev_id, regs);
- /* FIXME! Was it really ours? */
-@@ -1107,8 +1171,8 @@ static irqreturn_t ei_irq_wrapper(int ir
-
- static void ei_watchdog(u_long arg)
- {
-- pcnet_dev_t *info = (pcnet_dev_t *)(arg);
-- struct net_device *dev = &info->dev;
-+ struct net_device *dev = (struct net_device *)arg;
-+ pcnet_dev_t *info = PRIV(dev);
- ioaddr_t nic_base = dev->base_addr;
- ioaddr_t mii_addr = nic_base + DLINK_GPIO;
- u_short link;
-@@ -1154,6 +1218,9 @@ static void ei_watchdog(u_long arg)
- if (link && (info->flags & IS_DL10022)) {
- /* Disable collision detection on full duplex links */
- outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG);
-+ } else if (link && (info->flags & IS_DL10019)) {
-+ /* Disable collision detection on full duplex links */
-+ write_asic(dev->base_addr, 4, (p & 0x140) ? DL19FDUPLX : 0);
- }
- if (link) {
- if (info->phy_id == info->eth_phy) {
-@@ -1208,7 +1275,7 @@ static struct ethtool_ops netdev_ethtool
-
- static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
- {
-- pcnet_dev_t *info = (pcnet_dev_t *)dev;
-+ pcnet_dev_t *info = PRIV(dev);
- u16 *data = (u16 *)&rq->ifr_data;
- ioaddr_t mii_addr = dev->base_addr + DLINK_GPIO;
- switch (cmd) {
-@@ -1319,7 +1386,7 @@ static void dma_block_output(struct net_
- const u_char *buf, const int start_page)
- {
- ioaddr_t nic_base = dev->base_addr;
-- pcnet_dev_t *info = (pcnet_dev_t *)dev;
-+ pcnet_dev_t *info = PRIV(dev);
- #ifdef PCMCIA_DEBUG
- int retries = 0;
- #endif
-@@ -1505,7 +1572,7 @@ static int setup_shmem_window(dev_link_t
- int stop_pg, int cm_offset)
- {
- struct net_device *dev = link->priv;
-- pcnet_dev_t *info = link->priv;
-+ pcnet_dev_t *info = PRIV(dev);
- win_req_t req;
- memreq_t mem;
- int i, window_size, offset, last_ret, last_fn;
-@@ -1523,14 +1590,13 @@ static int setup_shmem_window(dev_link_t
- req.Attributes |= WIN_USE_WAIT;
- req.Base = 0; req.Size = window_size;
- req.AccessSpeed = mem_speed;
-- link->win = (window_handle_t)link->handle;
-- CS_CHECK(RequestWindow, &link->win, &req);
-+ CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
-
- mem.CardOffset = (start_pg << 8) + cm_offset;
- offset = mem.CardOffset % window_size;
- mem.CardOffset -= offset;
- mem.Page = 0;
-- CS_CHECK(MapMemPage, link->win, &mem);
-+ CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
-
- /* Try scribbling on the buffer */
- info->base = ioremap(req.Base, window_size);
-@@ -1542,7 +1608,7 @@ static int setup_shmem_window(dev_link_t
- pcnet_reset_8390(dev);
- if (i != (TX_PAGES<<8)) {
- iounmap(info->base);
-- CardServices(ReleaseWindow, link->win);
-+ pcmcia_release_window(link->win);
- info->base = NULL; link->win = NULL;
- goto failed;
- }
---- linux-2.6.0/drivers/net/pcmcia/smc91c92_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/pcmcia/smc91c92_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -379,7 +379,7 @@ static dev_link_t *smc91c92_attach(void)
- client_reg.event_handler = &smc91c92_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- smc91c92_detach(link);
-@@ -411,23 +411,17 @@ static void smc91c92_detach(dev_link_t *
- if (*linkp == NULL)
- return;
-
-- if (link->state & DEV_CONFIG) {
-+ if (link->state & DEV_CONFIG)
- smc91c92_release(link);
-- if (link->state & DEV_STALE_CONFIG)
-- return;
-- }
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-- if (link->dev) {
-+ if (link->dev)
- unregister_netdev(dev);
-- free_netdev(dev);
-- } else
-- kfree(dev);
--
-+ free_netdev(dev);
- } /* smc91c92_detach */
-
- /*====================================================================*/
-@@ -453,19 +447,27 @@ static int cvt_ascii_address(struct net_
-
- /*====================================================================*/
-
--static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple,
-- cisparse_t *parse)
-+static int first_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
- {
-- int i;
-- i = CardServices(fn, handle, tuple);
-- if (i != CS_SUCCESS) return i;
-- i = CardServices(GetTupleData, handle, tuple);
-- if (i != CS_SUCCESS) return i;
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ int i;
-+
-+ if ((i = pcmcia_get_first_tuple(handle, tuple)) != CS_SUCCESS ||
-+ (i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
-+ return i;
-+ return pcmcia_parse_tuple(handle, tuple, parse);
- }
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int next_tuple(client_handle_t handle, tuple_t *tuple,
-+ cisparse_t *parse)
-+{
-+ int i;
-+
-+ if ((i = pcmcia_get_next_tuple(handle, tuple)) != CS_SUCCESS ||
-+ (i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
-+ return i;
-+ return pcmcia_parse_tuple(handle, tuple, parse);
-+}
-
- /*======================================================================
-
-@@ -534,7 +536,7 @@ static int mhz_mfc_config(dev_link_t *li
- for (k = 0; k < 0x400; k += 0x10) {
- if (k & 0x80) continue;
- link->io.BasePort1 = k ^ 0x300;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- if (i == CS_SUCCESS) break;
-@@ -548,15 +550,14 @@ static int mhz_mfc_config(dev_link_t *li
- req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
- req.Base = req.Size = 0;
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- i = CardServices(RequestWindow, &link->win, &req);
-+ i = pcmcia_request_window(&link->handle, &req, &link->win);
- if (i != CS_SUCCESS)
- return i;
- smc->base = ioremap(req.Base, req.Size);
- mem.CardOffset = mem.Page = 0;
- if (smc->manfid == MANFID_MOTOROLA)
- mem.CardOffset = link->conf.ConfigBase;
-- i = CardServices(MapMemPage, link->win, &mem);
-+ i = pcmcia_map_mem_page(link->win, &mem);
-
- if ((i == CS_SUCCESS)
- && (smc->manfid == MANFID_MEGAHERTZ)
-@@ -594,9 +595,9 @@ static int mhz_setup(dev_link_t *link)
-
- /* Another possibility: for the EM3288, in a special tuple */
- tuple.DesiredTuple = 0x81;
-- if (CardServices(GetFirstTuple, handle, &tuple) != CS_SUCCESS)
-+ if (pcmcia_get_first_tuple(handle, &tuple) != CS_SUCCESS)
- return -1;
-- if (CardServices(GetTupleData, handle, &tuple) != CS_SUCCESS)
-+ if (pcmcia_get_tuple_data(handle, &tuple) != CS_SUCCESS)
- return -1;
- buf[12] = '\0';
- if (cvt_ascii_address(dev, buf) == 0)
-@@ -690,7 +691,7 @@ static int smc_config(dev_link_t *link)
- link->conf.ConfigIndex = cf->index;
- link->io.BasePort1 = cf->io.win[0].base;
- link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- i = next_tuple(link->handle, &tuple, &parse);
-@@ -763,14 +764,14 @@ static int osi_config(dev_link_t *link)
-
- for (i = j = 0; j < 4; j++) {
- link->io.BasePort2 = com[j];
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- if (i != CS_SUCCESS) {
- /* Fallback: turn off hard decode */
- link->conf.ConfigIndex = 0x03;
- link->io.NumPorts2 = 0;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- }
- dev->base_addr = link->io.BasePort1 + 0x10;
- return i;
-@@ -791,12 +792,12 @@ static int osi_setup(dev_link_t *link, u
-
- /* Read the station address from tuple 0x90, subtuple 0x04 */
- tuple.DesiredTuple = 0x90;
-- i = CardServices(GetFirstTuple, handle, &tuple);
-+ i = pcmcia_get_first_tuple(handle, &tuple);
- while (i == CS_SUCCESS) {
-- i = CardServices(GetTupleData, handle, &tuple);
-+ i = pcmcia_get_tuple_data(handle, &tuple);
- if ((i != CS_SUCCESS) || (buf[0] == 0x04))
- break;
-- i = CardServices(GetNextTuple, handle, &tuple);
-+ i = pcmcia_get_next_tuple(handle, &tuple);
- }
- if (i != CS_SUCCESS)
- return -1;
-@@ -869,9 +870,9 @@ static int check_sig(dev_link_t *link)
- printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
- args.client_data = link;
- smc91c92_event(CS_EVENT_RESET_PHYSICAL, 0, &args);
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-- CardServices(RequestIO, link->handle, &link->io);
-+ pcmcia_request_io(link->handle, &link->io);
- smc91c92_event(CS_EVENT_CARD_RESET, 0, &args);
- return check_sig(link);
- }
-@@ -936,9 +937,9 @@ static void smc91c92_config(dev_link_t *
- }
- CS_EXIT_TEST(i, RequestIO, config_failed);
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- CS_EXIT_TEST(i, RequestIRQ, config_failed);
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- CS_EXIT_TEST(i, RequestConfiguration, config_failed);
-
- if (smc->manfid == MANFID_MOTOROLA)
-@@ -1063,27 +1064,17 @@ static void smc91c92_release(dev_link_t
-
- DEBUG(0, "smc91c92_release(0x%p)\n", link);
-
-- if (link->open) {
-- DEBUG(1, "smc91c92_cs: release postponed, '%s' still open\n",
-- link->dev->dev_name);
-- link->state |= DEV_STALE_CONFIG;
-- return;
-- }
--
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- if (link->win) {
- struct net_device *dev = link->priv;
- struct smc_private *smc = dev->priv;
- iounmap(smc->base);
-- CardServices(ReleaseWindow, link->win);
-+ pcmcia_release_window(link->win);
- }
-
- link->state &= ~DEV_CONFIG;
--
-- if (link->state & DEV_STALE_CONFIG)
-- smc91c92_detach(link);
- }
-
- /*======================================================================
-@@ -1124,7 +1115,7 @@ static int smc91c92_event(event_t event,
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -1135,7 +1126,7 @@ static int smc91c92_event(event_t event,
- if ((smc->manfid == MANFID_MEGAHERTZ) &&
- (smc->cardid == PRODID_MEGAHERTZ_EM3288))
- mhz_3288_power(link);
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (smc->manfid == MANFID_MOTOROLA)
- mot_config(link);
- if ((smc->manfid == MANFID_OSITECH) &&
-@@ -1309,8 +1300,6 @@ static int smc_close(struct net_device *
-
- link->open--;
- del_timer_sync(&smc->media);
-- if (link->state & DEV_STALE_CONFIG)
-- smc91c92_release(link);
-
- return 0;
- } /* smc_close */
---- linux-2.6.0/drivers/net/pcmcia/xirc2ps_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/pcmcia/xirc2ps_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -391,28 +391,27 @@ static int do_stop(struct net_device *de
-
- /*=============== Helper functions =========================*/
- static int
--get_tuple_data(int fn, client_handle_t handle, tuple_t *tuple)
-+first_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
- {
-- int err;
-+ int err;
-
-- if ((err=CardServices(fn, handle, tuple)))
-+ if ((err = pcmcia_get_first_tuple(handle, tuple)) == 0 &&
-+ (err = pcmcia_get_tuple_data(handle, tuple)) == 0)
-+ err = pcmcia_parse_tuple(handle, tuple, parse);
- return err;
-- return CardServices(GetTupleData, handle, tuple);
- }
-
- static int
--get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
-+next_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
- {
-- int err;
-+ int err;
-
-- if ((err=get_tuple_data(fn, handle, tuple)))
-+ if ((err = pcmcia_get_next_tuple(handle, tuple)) == 0 &&
-+ (err = pcmcia_get_tuple_data(handle, tuple)) == 0)
-+ err = pcmcia_parse_tuple(handle, tuple, parse);
- return err;
-- return CardServices(ParseTuple, handle, tuple, parse);
- }
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
--
- #define SelectPage(pgnr) outb((pgnr), ioaddr + XIRCREG_PR)
- #define GetByte(reg) ((unsigned)inb(ioaddr + (reg)))
- #define GetWord(reg) ((unsigned)inw(ioaddr + (reg)))
-@@ -636,7 +635,7 @@ xirc2ps_attach(void)
- client_reg.event_handler = &xirc2ps_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- if ((err = CardServices(RegisterClient, &link->handle, &client_reg))) {
-+ if ((err = pcmcia_register_client(&link->handle, &client_reg))) {
- cs_error(link->handle, RegisterClient, err);
- xirc2ps_detach(link);
- return NULL;
-@@ -680,16 +679,13 @@ xirc2ps_detach(dev_link_t * link)
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free it */
- *linkp = link->next;
-- if (link->dev) {
-+ if (link->dev)
- unregister_netdev(dev);
-- free_netdev(dev);
-- } else
-- kfree(dev);
--
-+ free_netdev(dev);
- } /* xirc2ps_detach */
-
- /****************
-@@ -887,7 +883,8 @@ xirc2ps_config(dev_link_t * link)
- }
- if (err) { /* not found: try to get the node-id from tuple 0x89 */
- tuple.DesiredTuple = 0x89; /* data layout looks like tuple 0x22 */
-- if (!(err = get_tuple_data(GetFirstTuple, handle, &tuple))) {
-+ if ((err = pcmcia_get_first_tuple(handle, &tuple)) == 0 &&
-+ (err = pcmcia_get_tuple_data(handle, &tuple)) == 0) {
- if (tuple.TupleDataLen == 8 && *buf == CISTPL_FUNCE_LAN_NODE_ID)
- memcpy(&parse, buf, 8);
- else
-@@ -953,8 +950,7 @@ xirc2ps_config(dev_link_t * link)
- link->conf.ConfigIndex = cf->index ;
- link->io.BasePort2 = cf->io.win[0].base;
- link->io.BasePort1 = ioaddr;
-- if (!(err=CardServices(RequestIO, link->handle,
-- &link->io)))
-+ if (!(err=pcmcia_request_io(link->handle, &link->io)))
- goto port_found;
- }
- }
-@@ -976,8 +972,7 @@ xirc2ps_config(dev_link_t * link)
- link->io.BasePort1 = link->io.BasePort2
- + (pass ? (cf->index & 0x20 ? -24:8)
- : (cf->index & 0x20 ? 8:-24));
-- if (!(err=CardServices(RequestIO, link->handle,
-- &link->io)))
-+ if (!(err=pcmcia_request_io(link->handle, &link->io)))
- goto port_found;
- }
- }
-@@ -992,11 +987,11 @@ xirc2ps_config(dev_link_t * link)
- link->io.NumPorts1 = 16;
- for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
- link->io.BasePort1 = ioaddr;
-- if (!(err=CardServices(RequestIO, link->handle, &link->io)))
-+ if (!(err=pcmcia_request_io(link->handle, &link->io)))
- goto port_found;
- }
- link->io.BasePort1 = 0; /* let CS decide */
-- if ((err=CardServices(RequestIO, link->handle, &link->io))) {
-+ if ((err=pcmcia_request_io(link->handle, &link->io))) {
- cs_error(link->handle, RequestIO, err);
- goto config_error;
- }
-@@ -1009,7 +1004,7 @@ xirc2ps_config(dev_link_t * link)
- * Now allocate an interrupt line. Note that this does not
- * actually assign a handler to the interrupt.
- */
-- if ((err=CardServices(RequestIRQ, link->handle, &link->irq))) {
-+ if ((err=pcmcia_request_irq(link->handle, &link->irq))) {
- cs_error(link->handle, RequestIRQ, err);
- goto config_error;
- }
-@@ -1018,8 +1013,7 @@ xirc2ps_config(dev_link_t * link)
- * This actually configures the PCMCIA socket -- setting up
- * the I/O windows and the interrupt mapping.
- */
-- if ((err=CardServices(RequestConfiguration,
-- link->handle, &link->conf))) {
-+ if ((err=pcmcia_request_configuration(link->handle, &link->conf))) {
- cs_error(link->handle, RequestConfiguration, err);
- goto config_error;
- }
-@@ -1037,16 +1031,14 @@ xirc2ps_config(dev_link_t * link)
- reg.Action = CS_WRITE;
- reg.Offset = CISREG_IOBASE_0;
- reg.Value = link->io.BasePort2 & 0xff;
-- if ((err = CardServices(AccessConfigurationRegister, link->handle,
-- ®))) {
-+ if ((err = pcmcia_access_configuration_register(link->handle, ®))) {
- cs_error(link->handle, AccessConfigurationRegister, err);
- goto config_error;
- }
- reg.Action = CS_WRITE;
- reg.Offset = CISREG_IOBASE_1;
- reg.Value = (link->io.BasePort2 >> 8) & 0xff;
-- if ((err = CardServices(AccessConfigurationRegister, link->handle,
-- ®))) {
-+ if ((err = pcmcia_access_configuration_register(link->handle, ®))) {
- cs_error(link->handle, AccessConfigurationRegister, err);
- goto config_error;
- }
-@@ -1058,15 +1050,14 @@ xirc2ps_config(dev_link_t * link)
- req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
- req.Base = req.Size = 0;
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- if ((err = CardServices(RequestWindow, &link->win, &req))) {
-+ if ((err = pcmcia_request_window(&link->handle, &req, &link->win))) {
- cs_error(link->handle, RequestWindow, err);
- goto config_error;
- }
- local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800;
- mem.CardOffset = 0x0;
- mem.Page = 0;
-- if ((err = CardServices(MapMemPage, link->win, &mem))) {
-+ if ((err = pcmcia_map_mem_page(link->win, &mem))) {
- cs_error(link->handle, MapMemPage, err);
- goto config_error;
- }
-@@ -1171,11 +1162,11 @@ xirc2ps_release(dev_link_t *link)
- local_info_t *local = dev->priv;
- if (local->dingo)
- iounmap(local->dingo_ccr - 0x0800);
-- CardServices(ReleaseWindow, link->win);
-+ pcmcia_release_window(link->win);
- }
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
-
- } /* xirc2ps_release */
-@@ -1227,7 +1218,7 @@ xirc2ps_event(event_t event, int priorit
- netif_device_detach(dev);
- do_powerdown(dev);
- }
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -1235,7 +1226,7 @@ xirc2ps_event(event_t event, int priorit
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- do_reset(dev,1);
- netif_device_attach(dev);
---- linux-2.6.0/drivers/net/pcnet32.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/net/pcnet32.c 2003-12-28 23:21:01.000000000 -0800
-@@ -456,6 +456,14 @@ static struct pcnet32_access pcnet32_dwi
- .reset = pcnet32_dwio_reset
- };
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void pcnet32_poll_controller(struct net_device *dev)
-+{
-+ disable_irq(dev->irq);
-+ pcnet32_interrupt(0, dev, NULL);
-+ enable_irq(dev->irq);
-+}
-+#endif
-
-
- /* only probes for non-PCI devices, the rest are handled by
-@@ -805,12 +813,16 @@ pcnet32_probe1(unsigned long ioaddr, uns
- dev->do_ioctl = &pcnet32_ioctl;
- dev->tx_timeout = pcnet32_tx_timeout;
- dev->watchdog_timeo = (5*HZ);
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = pcnet32_poll_controller;
-+#endif
-+
-+ /* Fill in the generic fields of the device structure. */
-+ if (register_netdev(dev))
-+ goto err_free_consistent;
-
- lp->next = pcnet32_dev;
- pcnet32_dev = dev;
--
-- /* Fill in the generic fields of the device structure. */
-- register_netdev(dev);
- printk(KERN_INFO "%s: registered as %s\n",dev->name, lp->name);
- cards_found++;
- return 0;
---- linux-2.6.0/drivers/net/plip.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/plip.c 2003-12-28 23:21:01.000000000 -0800
-@@ -277,19 +277,11 @@ inline static unsigned char read_status
- then calls us here.
-
- */
--static int
-+static void
- plip_init_netdev(struct net_device *dev)
- {
- struct net_local *nl = dev->priv;
-
-- printk(KERN_INFO "%s", version);
-- if (dev->irq != -1)
-- printk(KERN_INFO "%s: Parallel port at %#3lx, using IRQ %d.\n",
-- dev->name, dev->base_addr, dev->irq);
-- else
-- printk(KERN_INFO "%s: Parallel port at %#3lx, not using IRQ.\n",
-- dev->name, dev->base_addr);
--
- /* Then, override parts of it */
- dev->hard_start_xmit = plip_tx_packet;
- dev->open = plip_open;
-@@ -323,8 +315,6 @@ plip_init_netdev(struct net_device *dev)
- INIT_WORK(&nl->timer, (void (*)(void *))plip_timer_bh, dev);
-
- spin_lock_init(&nl->lock);
--
-- return 0;
- }
- \f
- /* Bottom half handler for the delayed request.
-@@ -1282,14 +1272,13 @@ static void plip_attach (struct parport
- }
-
- sprintf(name, "plip%d", unit);
-- dev = alloc_netdev(sizeof(struct net_local), name,
-- ether_setup);
-+ dev = alloc_etherdev(sizeof(struct net_local));
- if (!dev) {
- printk(KERN_ERR "plip: memory squeeze\n");
- return;
- }
-
-- dev->init = plip_init_netdev;
-+ strcpy(dev->name, name);
-
- SET_MODULE_OWNER(dev);
- dev->irq = port->irq;
-@@ -1306,17 +1295,35 @@ static void plip_attach (struct parport
-
- if (!nl->pardev) {
- printk(KERN_ERR "%s: parport_register failed\n", name);
-- kfree(dev);
-+ goto err_free_dev;
- return;
- }
-
-+ plip_init_netdev(dev);
-+
- if (register_netdev(dev)) {
- printk(KERN_ERR "%s: network register failed\n", name);
-- kfree(dev);
-- } else {
-- dev_plip[unit++] = dev;
-+ goto err_parport_unregister;
- }
-+
-+ printk(KERN_INFO "%s", version);
-+ if (dev->irq != -1)
-+ printk(KERN_INFO "%s: Parallel port at %#3lx, "
-+ "using IRQ %d.\n",
-+ dev->name, dev->base_addr, dev->irq);
-+ else
-+ printk(KERN_INFO "%s: Parallel port at %#3lx, "
-+ "not using IRQ.\n",
-+ dev->name, dev->base_addr);
-+ dev_plip[unit++] = dev;
- }
-+ return;
-+
-+err_parport_unregister:
-+ parport_unregister_device(nl->pardev);
-+err_free_dev:
-+ free_netdev(dev);
-+ return;
- }
-
- /* plip_detach() is called (by the parport code) when a port is
---- linux-2.6.0/drivers/net/ppp_async.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/ppp_async.c 2003-12-28 23:22:46.000000000 -0800
-@@ -16,8 +16,6 @@
- * Part of the code in this driver was inspired by the old async-only
- * PPP driver, written by Michael Callahan and Al Longyear, and
- * subsequently hacked by Paul Mackerras.
-- *
-- * ==FILEVERSION 20020125==
- */
-
- #include <linux/module.h>
-@@ -61,6 +59,9 @@ struct asyncppp {
-
- struct sk_buff *rpkt;
- int lcp_fcs;
-+ struct sk_buff_head rqueue;
-+
-+ struct tasklet_struct tsk;
-
- atomic_t refcnt;
- struct semaphore dead_sem;
-@@ -74,8 +75,9 @@ struct asyncppp {
- #define XMIT_BUSY 2
-
- /* State bits */
--#define SC_TOSS 0x20000000
--#define SC_ESCAPE 0x40000000
-+#define SC_TOSS 1
-+#define SC_ESCAPE 2
-+#define SC_PREV_ERROR 4
-
- /* Bits in rbits */
- #define SC_RCV_BITS (SC_RCV_B7_1|SC_RCV_B7_0|SC_RCV_ODDP|SC_RCV_EVNP)
-@@ -97,6 +99,8 @@ static void ppp_async_input(struct async
- char *flags, int count);
- static int ppp_async_ioctl(struct ppp_channel *chan, unsigned int cmd,
- unsigned long arg);
-+static void ppp_async_process(unsigned long arg);
-+
- static void async_lcp_peek(struct asyncppp *ap, unsigned char *data,
- int len, int inbound);
-
-@@ -165,6 +169,9 @@ ppp_asynctty_open(struct tty_struct *tty
- ap->olim = ap->obuf;
- ap->lcp_fcs = -1;
-
-+ skb_queue_head_init(&ap->rqueue);
-+ tasklet_init(&ap->tsk, ppp_async_process, (unsigned long) ap);
-+
- atomic_set(&ap->refcnt, 1);
- init_MUTEX_LOCKED(&ap->dead_sem);
-
-@@ -214,10 +221,12 @@ ppp_asynctty_close(struct tty_struct *tt
- */
- if (!atomic_dec_and_test(&ap->refcnt))
- down(&ap->dead_sem);
-+ tasklet_kill(&ap->tsk);
-
- ppp_unregister_channel(&ap->chan);
- if (ap->rpkt != 0)
- kfree_skb(ap->rpkt);
-+ skb_queue_purge(&ap->rqueue);
- if (ap->tpkt != 0)
- kfree_skb(ap->tpkt);
- kfree(ap);
-@@ -316,17 +325,24 @@ ppp_asynctty_room(struct tty_struct *tty
- return 65535;
- }
-
-+/*
-+ * This can now be called from hard interrupt level as well
-+ * as soft interrupt level or mainline.
-+ */
- static void
- ppp_asynctty_receive(struct tty_struct *tty, const unsigned char *buf,
-- char *flags, int count)
-+ char *cflags, int count)
- {
- struct asyncppp *ap = ap_get(tty);
-+ unsigned long flags;
-
- if (ap == 0)
- return;
-- spin_lock_bh(&ap->recv_lock);
-- ppp_async_input(ap, buf, flags, count);
-- spin_unlock_bh(&ap->recv_lock);
-+ spin_lock_irqsave(&ap->recv_lock, flags);
-+ ppp_async_input(ap, buf, cflags, count);
-+ spin_unlock_irqrestore(&ap->recv_lock, flags);
-+ if (skb_queue_len(&ap->rqueue))
-+ tasklet_schedule(&ap->tsk);
- ap_put(ap);
- if (test_and_clear_bit(TTY_THROTTLED, &tty->flags)
- && tty->driver->unthrottle)
-@@ -341,8 +357,8 @@ ppp_asynctty_wakeup(struct tty_struct *t
- clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
- if (ap == 0)
- return;
-- if (ppp_async_push(ap))
-- ppp_output_wakeup(&ap->chan);
-+ set_bit(XMIT_WAKEUP, &ap->xmit_flags);
-+ tasklet_schedule(&ap->tsk);
- ap_put(ap);
- }
-
-@@ -396,9 +412,9 @@ ppp_async_ioctl(struct ppp_channel *chan
- if (get_user(val, (int *) arg))
- break;
- ap->flags = val & ~SC_RCV_BITS;
-- spin_lock_bh(&ap->recv_lock);
-+ spin_lock_irq(&ap->recv_lock);
- ap->rbits = val & SC_RCV_BITS;
-- spin_unlock_bh(&ap->recv_lock);
-+ spin_unlock_irq(&ap->recv_lock);
- err = 0;
- break;
-
-@@ -460,6 +476,28 @@ ppp_async_ioctl(struct ppp_channel *chan
- }
-
- /*
-+ * This is called at softirq level to deliver received packets
-+ * to the ppp_generic code, and to tell the ppp_generic code
-+ * if we can accept more output now.
-+ */
-+static void ppp_async_process(unsigned long arg)
-+{
-+ struct asyncppp *ap = (struct asyncppp *) arg;
-+ struct sk_buff *skb;
-+
-+ /* process received packets */
-+ while ((skb = skb_dequeue(&ap->rqueue)) != NULL) {
-+ if (skb->cb[0])
-+ ppp_input_error(&ap->chan, 0);
-+ ppp_input(&ap->chan, skb);
-+ }
-+
-+ /* try to push more stuff out */
-+ if (test_bit(XMIT_WAKEUP, &ap->xmit_flags) && ppp_async_push(ap))
-+ ppp_output_wakeup(&ap->chan);
-+}
-+
-+/*
- * Procedures for encapsulation and framing.
- */
-
-@@ -641,7 +679,6 @@ ppp_async_push(struct asyncppp *ap)
- struct tty_struct *tty = ap->tty;
- int tty_stuffed = 0;
-
-- set_bit(XMIT_WAKEUP, &ap->xmit_flags);
- /*
- * We can get called recursively here if the tty write
- * function calls our wakeup function. This can happen
-@@ -752,22 +789,19 @@ scan_ordinary(struct asyncppp *ap, const
- }
-
- /* called when a flag is seen - do end-of-packet processing */
--static inline void
-+static void
- process_input_packet(struct asyncppp *ap)
- {
- struct sk_buff *skb;
- unsigned char *p;
- unsigned int len, fcs, proto;
-- int code = 0;
-
- skb = ap->rpkt;
-- ap->rpkt = 0;
-- if ((ap->state & (SC_TOSS | SC_ESCAPE)) || skb == 0) {
-- ap->state &= ~(SC_TOSS | SC_ESCAPE);
-- if (skb != 0)
-- kfree_skb(skb);
-- return;
-- }
-+ if (ap->state & (SC_TOSS | SC_ESCAPE))
-+ goto err;
-+
-+ if (skb == NULL)
-+ return; /* 0-length packet */
-
- /* check the FCS */
- p = skb->data;
-@@ -801,20 +835,18 @@ process_input_packet(struct asyncppp *ap
- async_lcp_peek(ap, p, skb->len, 1);
- }
-
-- /* all OK, give it to the generic layer */
-- ppp_input(&ap->chan, skb);
-+ /* queue the frame to be processed */
-+ skb->cb[0] = ap->state;
-+ skb_queue_tail(&ap->rqueue, skb);
-+ ap->rpkt = 0;
-+ ap->state = 0;
- return;
-
- err:
-- kfree_skb(skb);
-- ppp_input_error(&ap->chan, code);
--}
--
--static inline void
--input_error(struct asyncppp *ap, int code)
--{
-- ap->state |= SC_TOSS;
-- ppp_input_error(&ap->chan, code);
-+ /* frame had an error, remember that, reset SC_TOSS & SC_ESCAPE */
-+ ap->state = SC_PREV_ERROR;
-+ if (skb)
-+ skb_trim(skb, 0);
- }
-
- /* called when the tty driver has data for us. */
-@@ -856,7 +888,7 @@ ppp_async_input(struct asyncppp *ap, con
- }
- if (f != 0) {
- /* start tossing */
-- input_error(ap, f);
-+ ap->state |= SC_TOSS;
-
- } else if (n > 0 && (ap->state & SC_TOSS) == 0) {
- /* stuff the chars in the skb */
-@@ -872,7 +904,7 @@ ppp_async_input(struct asyncppp *ap, con
- }
- if (n > skb_tailroom(skb)) {
- /* packet overflowed MRU */
-- input_error(ap, 1);
-+ ap->state |= SC_TOSS;
- } else {
- sp = skb_put(skb, n);
- memcpy(sp, buf, n);
-@@ -909,7 +941,7 @@ ppp_async_input(struct asyncppp *ap, con
-
- nomem:
- printk(KERN_ERR "PPPasync: no memory (input pkt)\n");
-- input_error(ap, 0);
-+ ap->state |= SC_TOSS;
- }
-
- /*
---- linux-2.6.0/drivers/net/ppp_generic.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/ppp_generic.c 2003-12-28 23:21:01.000000000 -0800
-@@ -917,19 +917,14 @@ ppp_net_ioctl(struct net_device *dev, st
- return err;
- }
-
--static int
--ppp_net_init(struct net_device *dev)
-+static void ppp_setup(struct net_device *dev)
- {
- dev->hard_header_len = PPP_HDRLEN;
- dev->mtu = PPP_MTU;
-- dev->hard_start_xmit = ppp_start_xmit;
-- dev->get_stats = ppp_net_stats;
-- dev->do_ioctl = ppp_net_ioctl;
- dev->addr_len = 0;
- dev->tx_queue_len = 3;
- dev->type = ARPHRD_PPP;
- dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
-- return 0;
- }
-
- /*
-@@ -2272,23 +2267,13 @@ ppp_create_interface(int unit, int *retp
- int i;
-
- ppp = kmalloc(sizeof(struct ppp), GFP_KERNEL);
-- if (ppp == 0)
-- goto err;
-- dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
-- if (dev == 0)
-- goto err;
-+ if (!ppp)
-+ goto out;
-+ dev = alloc_netdev(0, "", ppp_setup);
-+ if (!dev)
-+ goto out1;
- memset(ppp, 0, sizeof(struct ppp));
-- memset(dev, 0, sizeof(struct net_device));
-
-- ret = -EEXIST;
-- down(&all_ppp_sem);
-- if (unit < 0)
-- unit = cardmap_find_first_free(all_ppp_units);
-- else if (cardmap_get(all_ppp_units, unit) != NULL)
-- goto err_unlock; /* unit already exists */
--
-- /* Initialize the new ppp unit */
-- ppp->file.index = unit;
- ppp->mru = PPP_MRU;
- init_ppp_file(&ppp->file, INTERFACE);
- ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */
-@@ -2301,20 +2286,29 @@ ppp_create_interface(int unit, int *retp
- ppp->minseq = -1;
- skb_queue_head_init(&ppp->mrq);
- #endif /* CONFIG_PPP_MULTILINK */
--
- ppp->dev = dev;
-- dev->init = ppp_net_init;
-- sprintf(dev->name, "ppp%d", unit);
- dev->priv = ppp;
-- dev->destructor = free_netdev;
-
-- rtnl_lock();
-- ret = register_netdevice(dev);
-- rtnl_unlock();
-+ dev->hard_start_xmit = ppp_start_xmit;
-+ dev->get_stats = ppp_net_stats;
-+ dev->do_ioctl = ppp_net_ioctl;
-+
-+ ret = -EEXIST;
-+ down(&all_ppp_sem);
-+ if (unit < 0)
-+ unit = cardmap_find_first_free(all_ppp_units);
-+ else if (cardmap_get(all_ppp_units, unit) != NULL)
-+ goto out2; /* unit already exists */
-+
-+ /* Initialize the new ppp unit */
-+ ppp->file.index = unit;
-+ sprintf(dev->name, "ppp%d", unit);
-+
-+ ret = register_netdev(dev);
- if (ret != 0) {
- printk(KERN_ERR "PPP: couldn't register device %s (%d)\n",
- dev->name, ret);
-- goto err_unlock;
-+ goto out2;
- }
-
- atomic_inc(&ppp_unit_count);
-@@ -2323,14 +2317,13 @@ ppp_create_interface(int unit, int *retp
- *retp = 0;
- return ppp;
-
-- err_unlock:
-+out2:
- up(&all_ppp_sem);
-- err:
-+ free_netdev(dev);
-+out1:
-+ kfree(ppp);
-+out:
- *retp = ret;
-- if (ppp)
-- kfree(ppp);
-- if (dev)
-- kfree(dev);
- return NULL;
- }
-
-@@ -2361,8 +2354,10 @@ static void ppp_shutdown_interface(struc
- ppp->dev = 0;
- ppp_unlock(ppp);
- /* This will call dev_close() for us. */
-- if (dev)
-+ if (dev) {
- unregister_netdev(dev);
-+ free_netdev(dev);
-+ }
- cardmap_set(&all_ppp_units, ppp->file.index, NULL);
- ppp->file.dead = 1;
- ppp->owner = NULL;
---- linux-2.6.0/drivers/net/pppoe.c 2003-11-26 13:53:35.000000000 -0800
-+++ 25/drivers/net/pppoe.c 2003-12-28 23:22:25.000000000 -0800
-@@ -1151,3 +1151,4 @@ module_exit(pppoe_exit);
- MODULE_AUTHOR("Michal Ostrowski <mostrows@speakeasy.net>");
- MODULE_DESCRIPTION("PPP over Ethernet driver");
- MODULE_LICENSE("GPL");
-+MODULE_ALIAS_NETPROTO(PF_PPPOX);
---- linux-2.6.0/drivers/net/r8169.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/net/r8169.c 2003-12-28 23:21:01.000000000 -0800
-@@ -56,9 +56,11 @@ VERSION 1.2 <2002/11/30>
- printk( "Assertion failed! %s,%s,%s,line=%d\n", \
- #expr,__FILE__,__FUNCTION__,__LINE__); \
- }
-+#define dprintk(fmt, args...) do { printk(PFX fmt, ## args) } while (0)
- #else
- #define assert(expr) do {} while (0)
--#endif
-+#define dprintk(fmt, args...) do {} while (0)
-+#endif /* RTL8169_DEBUG */
-
- /* media options */
- #define MAX_UNITS 8
-@@ -89,9 +91,12 @@ static int multicast_filter_limit = 32;
- #define NUM_TX_DESC 64 /* Number of Tx descriptor registers */
- #define NUM_RX_DESC 64 /* Number of Rx descriptor registers */
- #define RX_BUF_SIZE 1536 /* Rx Buffer size */
-+#define R8169_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc))
-+#define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc))
-
- #define RTL_MIN_IO_SIZE 0x80
--#define TX_TIMEOUT (6*HZ)
-+#define RTL8169_TX_TIMEOUT (6*HZ)
-+#define RTL8169_PHY_TIMEOUT (HZ)
-
- /* write/read MMIO register */
- #define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg))
-@@ -101,11 +106,35 @@ static int multicast_filter_limit = 32;
- #define RTL_R16(reg) readw (ioaddr + (reg))
- #define RTL_R32(reg) ((unsigned long) readl (ioaddr + (reg)))
-
--static struct {
-+enum mac_version {
-+ RTL_GIGA_MAC_VER_B = 0x00,
-+ /* RTL_GIGA_MAC_VER_C = 0x03, */
-+ RTL_GIGA_MAC_VER_D = 0x01,
-+ RTL_GIGA_MAC_VER_E = 0x02
-+};
-+
-+enum phy_version {
-+ RTL_GIGA_PHY_VER_C = 0x03, /* PHY Reg 0x03 bit0-3 == 0x0000 */
-+ RTL_GIGA_PHY_VER_D = 0x04, /* PHY Reg 0x03 bit0-3 == 0x0000 */
-+ RTL_GIGA_PHY_VER_E = 0x05, /* PHY Reg 0x03 bit0-3 == 0x0000 */
-+ RTL_GIGA_PHY_VER_F = 0x06, /* PHY Reg 0x03 bit0-3 == 0x0001 */
-+ RTL_GIGA_PHY_VER_G = 0x07, /* PHY Reg 0x03 bit0-3 == 0x0002 */
-+};
-+
-+
-+#define _R(NAME,MAC,MASK) \
-+ { .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
-+
-+const static struct {
- const char *name;
--} board_info[] __devinitdata = {
-- {
--"RealTek RTL8169 Gigabit Ethernet"},};
-+ u8 mac_version;
-+ u32 RxConfigMask; /* Clears the bits supported by this chip */
-+} rtl_chip_info[] __devinitdata = {
-+ _R("RTL8169", RTL_GIGA_MAC_VER_B, 0xff7e1880),
-+ _R("RTL8169s/8110s", RTL_GIGA_MAC_VER_D, 0xff7e1880),
-+ _R("RTL8169s/8110s", RTL_GIGA_MAC_VER_E, 0xff7e1880)
-+};
-+#undef _R
-
- static struct pci_device_id rtl8169_pci_tbl[] = {
- {0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-@@ -114,6 +143,8 @@ static struct pci_device_id rtl8169_pci_
-
- MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
-
-+static int rx_copybreak = 200;
-+
- enum RTL8169_registers {
- MAC0 = 0, /* Ethernet hardware address. */
- MAR0 = 8, /* Multicast filter. */
-@@ -242,14 +273,6 @@ enum RTL8169_register_content {
- TBILinkOK = 0x02000000,
- };
-
--const static struct {
-- const char *name;
-- u8 version; /* depend on RTL8169 docs */
-- u32 RxConfigMask; /* should clear the bits supported by this chip */
--} rtl_chip_info[] = {
-- {
--"RTL-8169", 0x00, 0xff7e1880,},};
--
- enum _DescStatusBit {
- OWNbit = 0x80000000,
- EORbit = 0x40000000,
-@@ -257,6 +280,8 @@ enum _DescStatusBit {
- LSbit = 0x10000000,
- };
-
-+#define RsvdMask 0x3fffc000
-+
- struct TxDesc {
- u32 status;
- u32 vlan_tag;
-@@ -277,28 +302,33 @@ struct rtl8169_private {
- struct net_device_stats stats; /* statistics of net device */
- spinlock_t lock; /* spin lock flag */
- int chipset;
-- unsigned long cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
-- unsigned long cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
-- unsigned long dirty_tx;
-- unsigned char *TxDescArrays; /* Index of Tx Descriptor buffer */
-- unsigned char *RxDescArrays; /* Index of Rx Descriptor buffer */
-+ int mac_version;
-+ int phy_version;
-+ u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
-+ u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
-+ u32 dirty_rx;
-+ u32 dirty_tx;
- struct TxDesc *TxDescArray; /* Index of 256-alignment Tx Descriptor buffer */
- struct RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */
-- unsigned char *RxBufferRings; /* Index of Rx Buffer */
-- unsigned char *RxBufferRing[NUM_RX_DESC]; /* Index of Rx Buffer array */
-+ dma_addr_t TxPhyAddr;
-+ dma_addr_t RxPhyAddr;
-+ struct sk_buff *Rx_skbuff[NUM_RX_DESC]; /* Rx data buffers */
- struct sk_buff *Tx_skbuff[NUM_TX_DESC]; /* Index of Transmit data buffer */
-+ struct timer_list timer;
-+ unsigned long phy_link_down_cnt;
- };
-
- MODULE_AUTHOR("Realtek");
- MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
- MODULE_PARM(media, "1-" __MODULE_STRING(MAX_UNITS) "i");
-+MODULE_PARM(rx_copybreak, "i");
- MODULE_LICENSE("GPL");
-
- static int rtl8169_open(struct net_device *dev);
- static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
- static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance,
- struct pt_regs *regs);
--static void rtl8169_init_ring(struct net_device *dev);
-+static int rtl8169_init_ring(struct net_device *dev);
- static void rtl8169_hw_start(struct net_device *dev);
- static int rtl8169_close(struct net_device *dev);
- static void rtl8169_set_rx_mode(struct net_device *dev);
-@@ -306,11 +336,15 @@ static void rtl8169_tx_timeout(struct ne
- static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev);
-
- static const u16 rtl8169_intr_mask =
-- SYSErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK |
-- RxErr | RxOK;
-+ RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK;
- static const unsigned int rtl8169_rx_config =
- (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
-
-+#define PHY_Cap_10_Half_Or_Less PHY_Cap_10_Half
-+#define PHY_Cap_10_Full_Or_Less PHY_Cap_10_Full | PHY_Cap_10_Half_Or_Less
-+#define PHY_Cap_100_Half_Or_Less PHY_Cap_100_Half | PHY_Cap_10_Full_Or_Less
-+#define PHY_Cap_100_Full_Or_Less PHY_Cap_100_Full | PHY_Cap_100_Half_Or_Less
-+
- void
- mdio_write(void *ioaddr, int RegAddr, int value)
- {
-@@ -342,13 +376,258 @@ mdio_read(void *ioaddr, int RegAddr)
- if (RTL_R32(PHYAR) & 0x80000000) {
- value = (int) (RTL_R32(PHYAR) & 0xFFFF);
- break;
-- } else {
-- udelay(100);
- }
-+ udelay(100);
- }
- return value;
- }
-
-+static void rtl8169_write_gmii_reg_bit(void *ioaddr, int reg, int bitnum,
-+ int bitval)
-+{
-+ int val;
-+
-+ val = mdio_read(ioaddr, reg);
-+ val = (bitval == 1) ?
-+ val | (bitval << bitnum) : val & ~(0x0001 << bitnum);
-+ mdio_write(ioaddr, reg, val & 0xffff);
-+}
-+
-+static void rtl8169_get_mac_version(struct rtl8169_private *tp, void *ioaddr)
-+{
-+ const struct {
-+ u32 mask;
-+ int mac_version;
-+ } mac_info[] = {
-+ { 0x1 << 26, RTL_GIGA_MAC_VER_E },
-+ { 0x1 << 23, RTL_GIGA_MAC_VER_D },
-+ { 0x00000000, RTL_GIGA_MAC_VER_B } /* Catch-all */
-+ }, *p = mac_info;
-+ u32 reg;
-+
-+ reg = RTL_R32(TxConfig) & 0x7c800000;
-+ while ((reg & p->mask) != p->mask)
-+ p++;
-+ tp->mac_version = p->mac_version;
-+}
-+
-+static void rtl8169_print_mac_version(struct rtl8169_private *tp)
-+{
-+ struct {
-+ int version;
-+ char *msg;
-+ } mac_print[] = {
-+ { RTL_GIGA_MAC_VER_E, "RTL_GIGA_MAC_VER_E" },
-+ { RTL_GIGA_MAC_VER_D, "RTL_GIGA_MAC_VER_D" },
-+ { RTL_GIGA_MAC_VER_B, "RTL_GIGA_MAC_VER_B" },
-+ { 0, NULL }
-+ }, *p;
-+
-+ for (p = mac_print; p->msg; p++) {
-+ if (tp->mac_version == p->version) {
-+ dprintk("mac_version == %s (%04d)\n", p->msg,
-+ p->version);
-+ return;
-+ }
-+ }
-+ dprintk("mac_version == Unknown\n");
-+}
-+
-+static void rtl8169_get_phy_version(struct rtl8169_private *tp, void *ioaddr)
-+{
-+ const struct {
-+ u16 mask;
-+ u16 set;
-+ int phy_version;
-+ } phy_info[] = {
-+ { 0x000f, 0x0002, RTL_GIGA_PHY_VER_G },
-+ { 0x000f, 0x0001, RTL_GIGA_PHY_VER_F },
-+ { 0x000f, 0x0000, RTL_GIGA_PHY_VER_E },
-+ { 0x0000, 0x0000, RTL_GIGA_PHY_VER_D } /* Catch-all */
-+ }, *p = phy_info;
-+ u16 reg;
-+
-+ reg = mdio_read(ioaddr, 3) & 0xffff;
-+ while ((reg & p->mask) != p->set)
-+ p++;
-+ tp->phy_version = p->phy_version;
-+}
-+
-+static void rtl8169_print_phy_version(struct rtl8169_private *tp)
-+{
-+ struct {
-+ int version;
-+ char *msg;
-+ u32 reg;
-+ } phy_print[] = {
-+ { RTL_GIGA_PHY_VER_G, "RTL_GIGA_PHY_VER_G", 0x0002 },
-+ { RTL_GIGA_PHY_VER_F, "RTL_GIGA_PHY_VER_F", 0x0001 },
-+ { RTL_GIGA_PHY_VER_E, "RTL_GIGA_PHY_VER_E", 0x0000 },
-+ { RTL_GIGA_PHY_VER_D, "RTL_GIGA_PHY_VER_D", 0x0000 },
-+ { 0, NULL, 0x0000 }
-+ }, *p;
-+
-+ for (p = phy_print; p->msg; p++) {
-+ if (tp->phy_version == p->version) {
-+ dprintk("phy_version == %s (%04x)\n", p->msg, p->reg);
-+ return;
-+ }
-+ }
-+ dprintk("phy_version == Unknown\n");
-+}
-+
-+static void rtl8169_hw_phy_config(struct net_device *dev)
-+{
-+ struct rtl8169_private *tp = dev->priv;
-+ void *ioaddr = tp->mmio_addr;
-+ struct {
-+ u16 regs[5]; /* Beware of bit-sign propagation */
-+ } phy_magic[5] = { {
-+ { 0x0000, //w 4 15 12 0
-+ 0x00a1, //w 3 15 0 00a1
-+ 0x0008, //w 2 15 0 0008
-+ 0x1020, //w 1 15 0 1020
-+ 0x1000 } },{ //w 0 15 0 1000
-+ { 0x7000, //w 4 15 12 7
-+ 0xff41, //w 3 15 0 ff41
-+ 0xde60, //w 2 15 0 de60
-+ 0x0140, //w 1 15 0 0140
-+ 0x0077 } },{ //w 0 15 0 0077
-+ { 0xa000, //w 4 15 12 a
-+ 0xdf01, //w 3 15 0 df01
-+ 0xdf20, //w 2 15 0 df20
-+ 0xff95, //w 1 15 0 ff95
-+ 0xfa00 } },{ //w 0 15 0 fa00
-+ { 0xb000, //w 4 15 12 b
-+ 0xff41, //w 3 15 0 ff41
-+ 0xde20, //w 2 15 0 de20
-+ 0x0140, //w 1 15 0 0140
-+ 0x00bb } },{ //w 0 15 0 00bb
-+ { 0xf000, //w 4 15 12 f
-+ 0xdf01, //w 3 15 0 df01
-+ 0xdf20, //w 2 15 0 df20
-+ 0xff95, //w 1 15 0 ff95
-+ 0xbf00 } //w 0 15 0 bf00
-+ }
-+ }, *p = phy_magic;
-+ int i;
-+
-+ rtl8169_print_mac_version(tp);
-+ rtl8169_print_phy_version(tp);
-+
-+ if (tp->mac_version <= RTL_GIGA_MAC_VER_B)
-+ return;
-+ if (tp->phy_version >= RTL_GIGA_PHY_VER_F)
-+ return;
-+
-+ dprintk("MAC version != 0 && PHY version == 0 or 1\n");
-+ dprintk("Do final_reg2.cfg\n");
-+
-+ /* Shazam ! */
-+
-+ // phy config for RTL8169s mac_version C chip
-+ mdio_write(ioaddr, 31, 0x0001); //w 31 2 0 1
-+ mdio_write(ioaddr, 21, 0x1000); //w 21 15 0 1000
-+ mdio_write(ioaddr, 24, 0x65c7); //w 24 15 0 65c7
-+ rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
-+
-+ for (i = ARRAY_SIZE(phy_magic); i > 0; i++, p++) {
-+ int val, pos = 4;
-+
-+ val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
-+ mdio_write(ioaddr, pos, val);
-+ while (--pos >= 0)
-+ mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
-+ rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
-+ rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
-+ }
-+ mdio_write(ioaddr, 31, 0x0000); //w 31 2 0 0
-+}
-+
-+static void rtl8169_hw_phy_reset(struct net_device *dev)
-+{
-+ struct rtl8169_private *tp = dev->priv;
-+ void *ioaddr = tp->mmio_addr;
-+ int i, val;
-+
-+ printk(KERN_WARNING PFX "%s: Reset RTL8169s PHY\n", dev->name);
-+
-+ val = (mdio_read(ioaddr, 0) | 0x8000) & 0xffff;
-+ mdio_write(ioaddr, 0, val);
-+
-+ for (i = 50; i >= 0; i--) {
-+ if (!(mdio_read(ioaddr, 0) & 0x8000))
-+ break;
-+ udelay(100); /* Gross */
-+ }
-+
-+ if (i < 0) {
-+ printk(KERN_WARNING PFX "%s: no PHY Reset ack. Giving up.\n",
-+ dev->name);
-+ }
-+}
-+
-+static void rtl8169_phy_timer(unsigned long __opaque)
-+{
-+ struct net_device *dev = (struct net_device *)__opaque;
-+ struct rtl8169_private *tp = dev->priv;
-+ struct timer_list *timer = &tp->timer;
-+ void *ioaddr = tp->mmio_addr;
-+
-+ assert(tp->mac_version > RTL_GIGA_MAC_VER_B);
-+ assert(tp->phy_version < RTL_GIGA_PHY_VER_G);
-+
-+ if (RTL_R8(PHYstatus) & LinkStatus)
-+ tp->phy_link_down_cnt = 0;
-+ else {
-+ tp->phy_link_down_cnt++;
-+ if (tp->phy_link_down_cnt >= 12) {
-+ int reg;
-+
-+ // If link on 1000, perform phy reset.
-+ reg = mdio_read(ioaddr, PHY_1000_CTRL_REG);
-+ if (reg & PHY_Cap_1000_Full)
-+ rtl8169_hw_phy_reset(dev);
-+
-+ tp->phy_link_down_cnt = 0;
-+ }
-+ }
-+
-+ mod_timer(timer, RTL8169_PHY_TIMEOUT);
-+}
-+
-+static inline void rtl8169_delete_timer(struct net_device *dev)
-+{
-+ struct rtl8169_private *tp = dev->priv;
-+ struct timer_list *timer = &tp->timer;
-+
-+ if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
-+ (tp->phy_version >= RTL_GIGA_PHY_VER_G))
-+ return;
-+
-+ del_timer_sync(timer);
-+
-+ tp->phy_link_down_cnt = 0;
-+}
-+
-+static inline void rtl8169_request_timer(struct net_device *dev)
-+{
-+ struct rtl8169_private *tp = dev->priv;
-+ struct timer_list *timer = &tp->timer;
-+
-+ if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
-+ (tp->phy_version >= RTL_GIGA_PHY_VER_G))
-+ return;
-+
-+ tp->phy_link_down_cnt = 0;
-+
-+ init_timer(timer);
-+ timer->expires = jiffies + RTL8169_PHY_TIMEOUT;
-+ timer->data = (unsigned long)(dev);
-+ timer->function = rtl8169_phy_timer;
-+ add_timer(timer);
-+}
-+
- static int __devinit
- rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
- void **ioaddr_out)
-@@ -356,9 +635,9 @@ rtl8169_init_board(struct pci_dev *pdev,
- void *ioaddr = NULL;
- struct net_device *dev;
- struct rtl8169_private *tp;
-- int rc, i;
- unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
-- u32 tmp;
-+ int rc, i, acpi_idle_state = 0, pm_cap;
-+
-
- assert(pdev != NULL);
- assert(ioaddr_out != NULL);
-@@ -379,8 +658,22 @@ rtl8169_init_board(struct pci_dev *pdev,
-
- // enable device (incl. PCI PM wakeup and hotplug setup)
- rc = pci_enable_device(pdev);
-- if (rc)
-+ if (rc) {
-+ printk(KERN_ERR PFX "%s: unable to enable device\n", pdev->slot_name);
- goto err_out;
-+ }
-+
-+ /* save power state before pci_enable_device overwrites it */
-+ pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
-+ if (pm_cap) {
-+ u16 pwr_command;
-+
-+ pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command);
-+ acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK;
-+ } else {
-+ printk(KERN_ERR PFX "Cannot find PowerManagement capability, aborting.\n");
-+ goto err_out_free_res;
-+ }
-
- mmio_start = pci_resource_start(pdev, 1);
- mmio_end = pci_resource_end(pdev, 1);
-@@ -402,8 +695,10 @@ rtl8169_init_board(struct pci_dev *pdev,
- }
-
- rc = pci_request_regions(pdev, dev->name);
-- if (rc)
-+ if (rc) {
-+ printk(KERN_ERR PFX "%s: Could not request regions.\n", pdev->slot_name);
- goto err_out_disable;
-+ }
-
- // enable PCI bus-mastering
- pci_set_master(pdev);
-@@ -420,30 +715,32 @@ rtl8169_init_board(struct pci_dev *pdev,
- RTL_W8(ChipCmd, CmdReset);
-
- // Check that the chip has finished the reset.
-- for (i = 1000; i > 0; i--)
-+ for (i = 1000; i > 0; i--) {
- if ((RTL_R8(ChipCmd) & CmdReset) == 0)
- break;
-- else
-- udelay(10);
-+ udelay(10);
-+ }
-
-- // identify chip attached to board
-- tmp = RTL_R32(TxConfig);
-- tmp = ((tmp & 0x7c000000) + ((tmp & 0x00800000) << 2)) >> 24;
--
-- for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--)
-- if (tmp == rtl_chip_info[i].version) {
-- tp->chipset = i;
-- goto match;
-- }
-- //if unknown chip, assume array element #0, original RTL-8169 in this case
-- printk(KERN_DEBUG PFX
-- "PCI device %s: unknown chip version, assuming RTL-8169\n",
-- pci_name(pdev));
-- printk(KERN_DEBUG PFX "PCI device %s: TxConfig = 0x%lx\n",
-- pci_name(pdev), (unsigned long) RTL_R32(TxConfig));
-- tp->chipset = 0;
-+ // Identify chip attached to board
-+ rtl8169_get_mac_version(tp, ioaddr);
-+ rtl8169_get_phy_version(tp, ioaddr);
-+
-+ rtl8169_print_mac_version(tp);
-+ rtl8169_print_phy_version(tp);
-+
-+ for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) {
-+ if (tp->mac_version == rtl_chip_info[i].mac_version)
-+ break;
-+ }
-+ if (i < 0) {
-+ /* Unknown chip: assume array element #0, original RTL-8169 */
-+ printk(KERN_DEBUG PFX
-+ "PCI device %s: unknown chip version, assuming %s\n",
-+ pci_name(pdev), rtl_chip_info[0].name);
-+ i++;
-+ }
-+ tp->chipset = i;
-
--match:
- *ioaddr_out = ioaddr;
- *dev_out = dev;
- return 0;
-@@ -499,7 +796,7 @@ rtl8169_init_one(struct pci_dev *pdev, c
- dev->stop = rtl8169_close;
- dev->tx_timeout = rtl8169_tx_timeout;
- dev->set_multicast_list = rtl8169_set_rx_mode;
-- dev->watchdog_timeo = TX_TIMEOUT;
-+ dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
- dev->irq = pdev->irq;
- dev->base_addr = (unsigned long) ioaddr;
- // dev->do_ioctl = mii_ioctl;
-@@ -528,12 +825,29 @@ rtl8169_init_one(struct pci_dev *pdev, c
- "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
- "IRQ %d\n",
- dev->name,
-- board_info[ent->driver_data].name,
-+ rtl_chip_info[ent->driver_data].name,
- dev->base_addr,
- dev->dev_addr[0], dev->dev_addr[1],
- dev->dev_addr[2], dev->dev_addr[3],
- dev->dev_addr[4], dev->dev_addr[5], dev->irq);
-
-+ rtl8169_hw_phy_config(dev);
-+
-+ dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
-+ RTL_W8(0x82, 0x01);
-+
-+ if (tp->mac_version < RTL_GIGA_MAC_VER_E) {
-+ dprintk("Set PCI Latency=0x40\n");
-+ pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40);
-+ }
-+
-+ if (tp->mac_version == RTL_GIGA_MAC_VER_D) {
-+ dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
-+ RTL_W8(0x82, 0x01);
-+ dprintk("Set PHY Reg 0x0bh = 0x00h\n");
-+ mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
-+ }
-+
- // if TBI is not endbled
- if (!(RTL_R8(PHYstatus) & TBI_Enable)) {
- int val = mdio_read(ioaddr, PHY_AUTO_NEGO_REG);
-@@ -546,23 +860,23 @@ rtl8169_init_one(struct pci_dev *pdev, c
- Cap10_100 = 0, Cap1000 = 0;
- switch (option) {
- case _10_Half:
-- Cap10_100 = PHY_Cap_10_Half;
-+ Cap10_100 = PHY_Cap_10_Half_Or_Less;
- Cap1000 = PHY_Cap_Null;
- break;
- case _10_Full:
-- Cap10_100 = PHY_Cap_10_Full;
-+ Cap10_100 = PHY_Cap_10_Full_Or_Less;
- Cap1000 = PHY_Cap_Null;
- break;
- case _100_Half:
-- Cap10_100 = PHY_Cap_100_Half;
-+ Cap10_100 = PHY_Cap_100_Half_Or_Less;
- Cap1000 = PHY_Cap_Null;
- break;
- case _100_Full:
-- Cap10_100 = PHY_Cap_100_Full;
-+ Cap10_100 = PHY_Cap_100_Full_Or_Less;
- Cap1000 = PHY_Cap_Null;
- break;
- case _1000_Full:
-- Cap10_100 = PHY_Cap_Null;
-+ Cap10_100 = PHY_Cap_100_Full_Or_Less;
- Cap1000 = PHY_Cap_1000_Full;
- break;
- default:
-@@ -576,9 +890,7 @@ rtl8169_init_one(struct pci_dev *pdev, c
-
- // enable 10/100 Full/Half Mode, leave PHY_AUTO_NEGO_REG bit4:0 unchanged
- mdio_write(ioaddr, PHY_AUTO_NEGO_REG,
-- PHY_Cap_10_Half | PHY_Cap_10_Full |
-- PHY_Cap_100_Half | PHY_Cap_100_Full | (val &
-- 0x1F));
-+ PHY_Cap_100_Full_Or_Less | (val & 0x1f));
-
- // enable 1000 Full Mode
- mdio_write(ioaddr, PHY_1000_CTRL_REG,
-@@ -647,56 +959,96 @@ rtl8169_remove_one(struct pci_dev *pdev)
- pci_set_drvdata(pdev, NULL);
- }
-
-+#ifdef CONFIG_PM
-+
-+static int rtl8169_suspend(struct pci_dev *pdev, u32 state)
-+{
-+ struct net_device *dev = pci_get_drvdata(pdev);
-+ struct rtl8169_private *tp = dev->priv;
-+ void *ioaddr = tp->mmio_addr;
-+ unsigned long flags;
-+
-+ if (!netif_running(dev))
-+ return 0;
-+
-+ netif_device_detach(dev);
-+ netif_stop_queue(dev);
-+ spin_lock_irqsave(&tp->lock, flags);
-+
-+ /* Disable interrupts, stop Rx and Tx */
-+ RTL_W16(IntrMask, 0);
-+ RTL_W8(ChipCmd, 0);
-+
-+ /* Update the error counts. */
-+ tp->stats.rx_missed_errors += RTL_R32(RxMissed);
-+ RTL_W32(RxMissed, 0);
-+ spin_unlock_irqrestore(&tp->lock, flags);
-+
-+ return 0;
-+}
-+
-+static int rtl8169_resume(struct pci_dev *pdev)
-+{
-+ struct net_device *dev = pci_get_drvdata(pdev);
-+
-+ if (!netif_running(dev))
-+ return 0;
-+
-+ netif_device_attach(dev);
-+ rtl8169_hw_start(dev);
-+
-+ return 0;
-+}
-+
-+#endif /* CONFIG_PM */
-+
- static int
- rtl8169_open(struct net_device *dev)
- {
- struct rtl8169_private *tp = dev->priv;
-+ struct pci_dev *pdev = tp->pci_dev;
- int retval;
-- u8 diff;
-- u32 TxPhyAddr, RxPhyAddr;
-
- retval =
- request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev);
-- if (retval) {
-- return retval;
-- }
-+ if (retval < 0)
-+ goto out;
-
-- tp->TxDescArrays =
-- kmalloc(NUM_TX_DESC * sizeof (struct TxDesc) + 256, GFP_KERNEL);
-- // Tx Desscriptor needs 256 bytes alignment;
-- TxPhyAddr = virt_to_bus(tp->TxDescArrays);
-- diff = 256 - (TxPhyAddr - ((TxPhyAddr >> 8) << 8));
-- TxPhyAddr += diff;
-- tp->TxDescArray = (struct TxDesc *) (tp->TxDescArrays + diff);
--
-- tp->RxDescArrays =
-- kmalloc(NUM_RX_DESC * sizeof (struct RxDesc) + 256, GFP_KERNEL);
-- // Rx Desscriptor needs 256 bytes alignment;
-- RxPhyAddr = virt_to_bus(tp->RxDescArrays);
-- diff = 256 - (RxPhyAddr - ((RxPhyAddr >> 8) << 8));
-- RxPhyAddr += diff;
-- tp->RxDescArray = (struct RxDesc *) (tp->RxDescArrays + diff);
-+ retval = -ENOMEM;
-
-- if (tp->TxDescArrays == NULL || tp->RxDescArrays == NULL) {
-- printk(KERN_INFO
-- "Allocate RxDescArray or TxDescArray failed\n");
-- free_irq(dev->irq, dev);
-- if (tp->TxDescArrays)
-- kfree(tp->TxDescArrays);
-- if (tp->RxDescArrays)
-- kfree(tp->RxDescArrays);
-- return -ENOMEM;
-- }
-- tp->RxBufferRings = kmalloc(RX_BUF_SIZE * NUM_RX_DESC, GFP_KERNEL);
-- if (tp->RxBufferRings == NULL) {
-- printk(KERN_INFO "Allocate RxBufferRing failed\n");
-- }
-+ /*
-+ * Rx and Tx desscriptors needs 256 bytes alignment.
-+ * pci_alloc_consistent provides more.
-+ */
-+ tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
-+ &tp->TxPhyAddr);
-+ if (!tp->TxDescArray)
-+ goto err_free_irq;
-+
-+ tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
-+ &tp->RxPhyAddr);
-+ if (!tp->RxDescArray)
-+ goto err_free_tx;
-+
-+ retval = rtl8169_init_ring(dev);
-+ if (retval < 0)
-+ goto err_free_rx;
-
-- rtl8169_init_ring(dev);
- rtl8169_hw_start(dev);
-
-- return 0;
--
-+ rtl8169_request_timer(dev);
-+out:
-+ return retval;
-+
-+err_free_rx:
-+ pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
-+ tp->RxPhyAddr);
-+err_free_tx:
-+ pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
-+ tp->TxPhyAddr);
-+err_free_irq:
-+ free_irq(dev->irq, dev);
-+ goto out;
- }
-
- static void
-@@ -733,11 +1085,17 @@ rtl8169_hw_start(struct net_device *dev)
- RTL_W32(TxConfig,
- (TX_DMA_BURST << TxDMAShift) | (InterFrameGap <<
- TxInterFrameGapShift));
-+ RTL_W16(CPlusCmd, RTL_R16(CPlusCmd));
-+
-+ if (tp->mac_version == RTL_GIGA_MAC_VER_D) {
-+ dprintk(KERN_INFO PFX "Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14 MUST be 1\n");
-+ RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | (1 << 14) | (1 << 3));
-+ }
-
- tp->cur_rx = 0;
-
-- RTL_W32(TxDescStartAddr, virt_to_bus(tp->TxDescArray));
-- RTL_W32(RxDescStartAddr, virt_to_bus(tp->RxDescArray));
-+ RTL_W32(TxDescStartAddr, tp->TxPhyAddr);
-+ RTL_W32(RxDescStartAddr, tp->RxPhyAddr);
- RTL_W8(Cfg9346, Cfg9346_Lock);
- udelay(10);
-
-@@ -755,31 +1113,131 @@ rtl8169_hw_start(struct net_device *dev)
-
- }
-
--static void
--rtl8169_init_ring(struct net_device *dev)
-+static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
-+{
-+ desc->buf_addr = 0xdeadbeef;
-+ desc->status &= ~cpu_to_le32(OWNbit | RsvdMask);
-+}
-+
-+static void rtl8169_free_rx_skb(struct pci_dev *pdev, struct sk_buff **sk_buff,
-+ struct RxDesc *desc)
-+{
-+ pci_unmap_single(pdev, le32_to_cpu(desc->buf_addr), RX_BUF_SIZE,
-+ PCI_DMA_FROMDEVICE);
-+ dev_kfree_skb(*sk_buff);
-+ *sk_buff = NULL;
-+ rtl8169_make_unusable_by_asic(desc);
-+}
-+
-+static inline void rtl8169_return_to_asic(struct RxDesc *desc)
-+{
-+ desc->status |= cpu_to_le32(OWNbit + RX_BUF_SIZE);
-+}
-+
-+static inline void rtl8169_give_to_asic(struct RxDesc *desc, dma_addr_t mapping)
-+{
-+ desc->buf_addr = cpu_to_le32(mapping);
-+ desc->status |= cpu_to_le32(OWNbit + RX_BUF_SIZE);
-+}
-+
-+static int rtl8169_alloc_rx_skb(struct pci_dev *pdev, struct net_device *dev,
-+ struct sk_buff **sk_buff, struct RxDesc *desc)
-+{
-+ struct sk_buff *skb;
-+ dma_addr_t mapping;
-+ int ret = 0;
-+
-+ skb = dev_alloc_skb(RX_BUF_SIZE);
-+ if (!skb)
-+ goto err_out;
-+
-+ skb->dev = dev;
-+ skb_reserve(skb, 2);
-+ *sk_buff = skb;
-+
-+ mapping = pci_map_single(pdev, skb->tail, RX_BUF_SIZE,
-+ PCI_DMA_FROMDEVICE);
-+
-+ rtl8169_give_to_asic(desc, mapping);
-+
-+out:
-+ return ret;
-+
-+err_out:
-+ ret = -ENOMEM;
-+ rtl8169_make_unusable_by_asic(desc);
-+ goto out;
-+}
-+
-+static void rtl8169_rx_clear(struct rtl8169_private *tp)
- {
-- struct rtl8169_private *tp = dev->priv;
- int i;
-
-- tp->cur_rx = 0;
-- tp->cur_tx = 0;
-- tp->dirty_tx = 0;
-+ for (i = 0; i < NUM_RX_DESC; i++) {
-+ if (tp->Rx_skbuff[i]) {
-+ rtl8169_free_rx_skb(tp->pci_dev, tp->Rx_skbuff + i,
-+ tp->RxDescArray + i);
-+ }
-+ }
-+}
-+
-+static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
-+ u32 start, u32 end)
-+{
-+ u32 cur;
-+
-+ for (cur = start; end - start > 0; cur++) {
-+ int ret, i = cur % NUM_RX_DESC;
-+
-+ if (tp->Rx_skbuff[i])
-+ continue;
-+
-+ ret = rtl8169_alloc_rx_skb(tp->pci_dev, dev, tp->Rx_skbuff + i,
-+ tp->RxDescArray + i);
-+ if (ret < 0)
-+ break;
-+ }
-+ return cur - start;
-+}
-+
-+static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
-+{
-+ desc->status |= cpu_to_le32(EORbit);
-+}
-+
-+static int rtl8169_init_ring(struct net_device *dev)
-+{
-+ struct rtl8169_private *tp = dev->priv;
-+
-+ tp->cur_rx = tp->dirty_rx = 0;
-+ tp->cur_tx = tp->dirty_tx = 0;
- memset(tp->TxDescArray, 0x0, NUM_TX_DESC * sizeof (struct TxDesc));
- memset(tp->RxDescArray, 0x0, NUM_RX_DESC * sizeof (struct RxDesc));
-
-- for (i = 0; i < NUM_TX_DESC; i++) {
-- tp->Tx_skbuff[i] = NULL;
-- }
-- for (i = 0; i < NUM_RX_DESC; i++) {
-- if (i == (NUM_RX_DESC - 1))
-- tp->RxDescArray[i].status =
-- (OWNbit | EORbit) + RX_BUF_SIZE;
-- else
-- tp->RxDescArray[i].status = OWNbit + RX_BUF_SIZE;
-+ memset(tp->Tx_skbuff, 0x0, NUM_TX_DESC * sizeof(struct sk_buff *));
-+ memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
-
-- tp->RxBufferRing[i] = &(tp->RxBufferRings[i * RX_BUF_SIZE]);
-- tp->RxDescArray[i].buf_addr = virt_to_bus(tp->RxBufferRing[i]);
-- }
-+ if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
-+ goto err_out;
-+
-+ rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
-+
-+ return 0;
-+
-+err_out:
-+ rtl8169_rx_clear(tp);
-+ return -ENOMEM;
-+}
-+
-+static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct sk_buff **sk_buff,
-+ struct TxDesc *desc)
-+{
-+ u32 len = sk_buff[0]->len;
-+
-+ pci_unmap_single(pdev, le32_to_cpu(desc->buf_addr),
-+ len < ETH_ZLEN ? ETH_ZLEN : len, PCI_DMA_TODEVICE);
-+ desc->buf_addr = 0x00;
-+ *sk_buff = NULL;
- }
-
- static void
-@@ -789,9 +1247,12 @@ rtl8169_tx_clear(struct rtl8169_private
-
- tp->cur_tx = 0;
- for (i = 0; i < NUM_TX_DESC; i++) {
-- if (tp->Tx_skbuff[i] != NULL) {
-- dev_kfree_skb(tp->Tx_skbuff[i]);
-- tp->Tx_skbuff[i] = NULL;
-+ struct sk_buff *skb = tp->Tx_skbuff[i];
-+
-+ if (skb) {
-+ rtl8169_unmap_tx_skb(tp->pci_dev, tp->Tx_skbuff + i,
-+ tp->TxDescArray + i);
-+ dev_kfree_skb(skb);
- tp->stats.tx_dropped++;
- }
- }
-@@ -829,41 +1290,51 @@ rtl8169_start_xmit(struct sk_buff *skb,
- struct rtl8169_private *tp = dev->priv;
- void *ioaddr = tp->mmio_addr;
- int entry = tp->cur_tx % NUM_TX_DESC;
-+ u32 len = skb->len;
-
-- if (skb->len < ETH_ZLEN) {
-+ if (unlikely(skb->len < ETH_ZLEN)) {
- skb = skb_padto(skb, ETH_ZLEN);
-- if (skb == NULL)
-- return 0;
-+ if (!skb)
-+ goto err_update_stats;
-+ len = ETH_ZLEN;
- }
-
- spin_lock_irq(&tp->lock);
-
-- if ((tp->TxDescArray[entry].status & OWNbit) == 0) {
-+ if (!(le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit)) {
-+ dma_addr_t mapping;
-+
-+ mapping = pci_map_single(tp->pci_dev, skb->data, len,
-+ PCI_DMA_TODEVICE);
-+
- tp->Tx_skbuff[entry] = skb;
-- tp->TxDescArray[entry].buf_addr = virt_to_bus(skb->data);
-- if (entry != (NUM_TX_DESC - 1))
-- tp->TxDescArray[entry].status =
-- (OWNbit | FSbit | LSbit) | ((skb->len > ETH_ZLEN) ?
-- skb->len : ETH_ZLEN);
-- else
-- tp->TxDescArray[entry].status =
-- (OWNbit | EORbit | FSbit | LSbit) |
-- ((skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN);
-+ tp->TxDescArray[entry].buf_addr = cpu_to_le32(mapping);
-
-+ tp->TxDescArray[entry].status = cpu_to_le32(OWNbit | FSbit |
-+ LSbit | len | (EORbit * !((entry + 1) % NUM_TX_DESC)));
-+
- RTL_W8(TxPoll, 0x40); //set polling bit
-
- dev->trans_start = jiffies;
-
- tp->cur_tx++;
-- }
-+ } else
-+ goto err_drop;
-
-- spin_unlock_irq(&tp->lock);
-
- if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx) {
- netif_stop_queue(dev);
- }
-+out:
-+ spin_unlock_irq(&tp->lock);
-
- return 0;
-+
-+err_drop:
-+ dev_kfree_skb(skb);
-+err_update_stats:
-+ tp->stats.tx_dropped++;
-+ goto out;
- }
-
- static void
-@@ -881,11 +1352,17 @@ rtl8169_tx_interrupt(struct net_device *
- tx_left = tp->cur_tx - dirty_tx;
-
- while (tx_left > 0) {
-- if ((tp->TxDescArray[entry].status & OWNbit) == 0) {
-- dev_kfree_skb_irq(tp->
-- Tx_skbuff[dirty_tx % NUM_TX_DESC]);
-- tp->Tx_skbuff[dirty_tx % NUM_TX_DESC] = NULL;
-+ if (!(le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit)) {
-+ int cur = dirty_tx % NUM_TX_DESC;
-+ struct sk_buff *skb = tp->Tx_skbuff[cur];
-+
-+ /* FIXME: is it really accurate for TxErr ? */
-+ tp->stats.tx_bytes += skb->len >= ETH_ZLEN ?
-+ skb->len : ETH_ZLEN;
- tp->stats.tx_packets++;
-+ rtl8169_unmap_tx_skb(tp->pci_dev, tp->Tx_skbuff + cur,
-+ tp->TxDescArray + cur);
-+ dev_kfree_skb_irq(skb);
- dirty_tx++;
- tx_left--;
- entry++;
-@@ -899,70 +1376,95 @@ rtl8169_tx_interrupt(struct net_device *
- }
- }
-
-+static inline int rtl8169_try_rx_copy(struct sk_buff **sk_buff, int pkt_size,
-+ struct RxDesc *desc,
-+ struct net_device *dev)
-+{
-+ int ret = -1;
-+
-+ if (pkt_size < rx_copybreak) {
-+ struct sk_buff *skb;
-+
-+ skb = dev_alloc_skb(pkt_size + 2);
-+ if (skb) {
-+ skb->dev = dev;
-+ skb_reserve(skb, 2);
-+ eth_copy_and_sum(skb, sk_buff[0]->tail, pkt_size, 0);
-+ *sk_buff = skb;
-+ rtl8169_return_to_asic(desc);
-+ ret = 0;
-+ }
-+ }
-+ return ret;
-+}
-+
- static void
- rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
- void *ioaddr)
- {
-- int cur_rx;
-- struct sk_buff *skb;
-- int pkt_size = 0;
-+ int cur_rx, delta;
-
- assert(dev != NULL);
- assert(tp != NULL);
- assert(ioaddr != NULL);
-
-- cur_rx = tp->cur_rx;
-+ cur_rx = tp->cur_rx % RX_BUF_SIZE;
-
-- while ((tp->RxDescArray[cur_rx].status & OWNbit) == 0) {
-+ while (!(le32_to_cpu(tp->RxDescArray[cur_rx].status) & OWNbit)) {
-+ u32 status = le32_to_cpu(tp->RxDescArray[cur_rx].status);
-
-- if (tp->RxDescArray[cur_rx].status & RxRES) {
-+ if (status & RxRES) {
- printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
- tp->stats.rx_errors++;
-- if (tp->RxDescArray[cur_rx].status & (RxRWT | RxRUNT))
-+ if (status & (RxRWT | RxRUNT))
- tp->stats.rx_length_errors++;
-- if (tp->RxDescArray[cur_rx].status & RxCRC)
-+ if (status & RxCRC)
- tp->stats.rx_crc_errors++;
- } else {
-- pkt_size =
-- (int) (tp->RxDescArray[cur_rx].
-- status & 0x00001FFF) - 4;
-- skb = dev_alloc_skb(pkt_size + 2);
-- if (skb != NULL) {
-- skb->dev = dev;
-- skb_reserve(skb, 2); // 16 byte align the IP fields. //
-- eth_copy_and_sum(skb, tp->RxBufferRing[cur_rx],
-- pkt_size, 0);
-- skb_put(skb, pkt_size);
-- skb->protocol = eth_type_trans(skb, dev);
-- netif_rx(skb);
--
-- if (cur_rx == (NUM_RX_DESC - 1))
-- tp->RxDescArray[cur_rx].status =
-- (OWNbit | EORbit) + RX_BUF_SIZE;
-- else
-- tp->RxDescArray[cur_rx].status =
-- OWNbit + RX_BUF_SIZE;
--
-- tp->RxDescArray[cur_rx].buf_addr =
-- virt_to_bus(tp->RxBufferRing[cur_rx]);
-- dev->last_rx = jiffies;
-- tp->stats.rx_bytes += pkt_size;
-- tp->stats.rx_packets++;
-- } else {
-- printk(KERN_WARNING
-- "%s: Memory squeeze, deferring packet.\n",
-- dev->name);
-- /* We should check that some rx space is free.
-- If not, free one and mark stats->rx_dropped++. */
-- tp->stats.rx_dropped++;
-+ struct RxDesc *desc = tp->RxDescArray + cur_rx;
-+ struct sk_buff *skb = tp->Rx_skbuff[cur_rx];
-+ int pkt_size = (status & 0x00001FFF) - 4;
-+
-+ pci_dma_sync_single(tp->pci_dev,
-+ le32_to_cpu(desc->buf_addr),
-+ RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
-+
-+ if (rtl8169_try_rx_copy(&skb, pkt_size, desc, dev)) {
-+ pci_unmap_single(tp->pci_dev,
-+ le32_to_cpu(desc->buf_addr),
-+ RX_BUF_SIZE,
-+ PCI_DMA_FROMDEVICE);
-+ tp->Rx_skbuff[cur_rx] = NULL;
- }
-- }
--
-- cur_rx = (cur_rx + 1) % NUM_RX_DESC;
--
-- }
-
-- tp->cur_rx = cur_rx;
-+ skb_put(skb, pkt_size);
-+ skb->protocol = eth_type_trans(skb, dev);
-+ netif_rx(skb);
-+
-+ dev->last_rx = jiffies;
-+ tp->stats.rx_bytes += pkt_size;
-+ tp->stats.rx_packets++;
-+ }
-+
-+ tp->cur_rx++;
-+ cur_rx = tp->cur_rx % NUM_RX_DESC;
-+ }
-+
-+ delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
-+ if (delta > 0)
-+ tp->dirty_rx += delta;
-+ else if (delta < 0)
-+ printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
-+
-+ /*
-+ * FIXME: until there is periodic timer to try and refill the ring,
-+ * a temporary shortage may definitely kill the Rx process.
-+ * - disable the asic to try and avoid an overflow and kick it again
-+ * after refill ?
-+ * - how do others driver handle this condition (Uh oh...).
-+ */
-+ if (tp->dirty_rx + NUM_RX_DESC == tp->cur_rx)
-+ printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
- }
-
- /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */
-@@ -991,9 +1493,7 @@ rtl8169_interrupt(int irq, void *dev_ins
- RTL_W16(IntrStatus,
- (status & RxFIFOOver) ? (status | RxOverflow) : status);
-
-- if ((status &
-- (SYSErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver
-- | TxErr | TxOK | RxErr | RxOK)) == 0)
-+ if (!(status & rtl8169_intr_mask))
- break;
-
- // Rx interrupt
-@@ -1023,11 +1523,13 @@ static int
- rtl8169_close(struct net_device *dev)
- {
- struct rtl8169_private *tp = dev->priv;
-+ struct pci_dev *pdev = tp->pci_dev;
- void *ioaddr = tp->mmio_addr;
-- int i;
-
- netif_stop_queue(dev);
-
-+ rtl8169_delete_timer(dev);
-+
- spin_lock_irq(&tp->lock);
-
- /* Stop the chip's Tx and Rx DMA processes. */
-@@ -1046,16 +1548,15 @@ rtl8169_close(struct net_device *dev)
- free_irq(dev->irq, dev);
-
- rtl8169_tx_clear(tp);
-- kfree(tp->TxDescArrays);
-- kfree(tp->RxDescArrays);
-- tp->TxDescArrays = NULL;
-- tp->RxDescArrays = NULL;
-+
-+ rtl8169_rx_clear(tp);
-+
-+ pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
-+ tp->RxPhyAddr);
-+ pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
-+ tp->TxPhyAddr);
- tp->TxDescArray = NULL;
- tp->RxDescArray = NULL;
-- kfree(tp->RxBufferRings);
-- for (i = 0; i < NUM_RX_DESC; i++) {
-- tp->RxBufferRing[i] = NULL;
-- }
-
- return 0;
- }
-@@ -1109,11 +1610,26 @@ rtl8169_set_rx_mode(struct net_device *d
- spin_unlock_irqrestore(&tp->lock, flags);
- }
-
-+/**
-+ * rtl8169_get_stats - Get rtl8169 read/write statistics
-+ * @dev: The Ethernet Device to get statistics for
-+ *
-+ * Get TX/RX statistics for rtl8169
-+ */
- struct net_device_stats *
- rtl8169_get_stats(struct net_device *dev)
- {
- struct rtl8169_private *tp = dev->priv;
-+ void *ioaddr = tp->mmio_addr;
-+ unsigned long flags;
-
-+ if (netif_running(dev)) {
-+ spin_lock_irqsave(&tp->lock, flags);
-+ tp->stats.rx_missed_errors += RTL_R32(RxMissed);
-+ RTL_W32(RxMissed, 0);
-+ spin_unlock_irqrestore(&tp->lock, flags);
-+ }
-+
- return &tp->stats;
- }
-
-@@ -1122,8 +1638,10 @@ static struct pci_driver rtl8169_pci_dri
- .id_table = rtl8169_pci_tbl,
- .probe = rtl8169_init_one,
- .remove = __devexit_p(rtl8169_remove_one),
-- .suspend = NULL,
-- .resume = NULL,
-+#ifdef CONFIG_PM
-+ .suspend = rtl8169_suspend,
-+ .resume = rtl8169_resume,
-+#endif
- };
-
- static int __init
---- linux-2.6.0/drivers/net/saa9730.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/saa9730.c 2003-12-28 23:21:01.000000000 -0800
-@@ -996,11 +996,11 @@ static void __devexit saa9730_remove_one
- struct net_device *dev = pci_get_drvdata(pdev);
-
- if (dev) {
--
-+ unregister_netdev(dev);
-+
- if (dev->priv)
- kfree(dev->priv);
-
-- unregister_netdev(dev);
- free_netdev(dev);
- pci_release_regions(pdev);
- pci_disable_device(pdev);
-@@ -1015,17 +1015,10 @@ static int lan_saa9730_init(struct net_d
- unsigned char ethernet_addr[6];
- int ret = 0;
-
-- dev = init_etherdev(dev, 0);
--
-- if (!dev)
-- return -ENOMEM;
--
- dev->open = lan_saa9730_open_fail;
-
-- if (get_ethernet_addr(ethernet_addr)) {
-- ret = -ENODEV;
-- goto out;
-- }
-+ if (get_ethernet_addr(ethernet_addr))
-+ return -ENODEV;
-
- memcpy(dev->dev_addr, ethernet_addr, 6);
- dev->base_addr = ioaddr;
-@@ -1040,10 +1033,8 @@ static int lan_saa9730_init(struct net_d
- GFP_DMA | GFP_KERNEL)
- + 7) & ~7);
-
-- if (!lp) {
-- ret = -ENOMEM;
-- goto out;
-- }
-+ if (!lp)
-+ return -ENOMEM;
-
- dev->priv = lp;
- memset(lp, 0, sizeof(*lp));
-@@ -1057,6 +1048,7 @@ static int lan_saa9730_init(struct net_d
- SAA9730_EVM_REGS_ADDR);
-
- /* Allocate LAN RX/TX frame buffer space. */
-+ /* FIXME: a leak */
- if ((ret = lan_saa9730_allocate_buffers(lp)))
- goto out;
-
-@@ -1095,63 +1087,70 @@ static int lan_saa9730_init(struct net_d
- dev->watchdog_timeo = (HZ >> 1);
- dev->dma = 0;
-
-+ ret = register_netdev(dev);
-+ if (ret)
-+ goto out;
- return 0;
-
- out:
-- if (dev) {
-- if (dev->priv)
-- kfree(dev->priv);
-- unregister_netdevice(dev);
-- free_netdev(dev);
-- }
--
-+ if (dev->priv)
-+ kfree(dev->priv);
-+ free_netdev(dev);
- return ret;
- }
-
-
- static int __devinit saa9730_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
- {
-- struct net_device *dev = NULL;
-+ struct net_device *dev;
- unsigned int pci_ioaddr;
- int err;
-
- if (lan_saa9730_debug > 1)
- printk("saa9730.c: PCI bios is present, checking for devices...\n");
-
-+ err = -ENOMEM;
-+ dev = alloc_etherdev(0);
-+ if (!dev)
-+ goto out;
-+
-+ SET_MODULE_OWNER(dev);
-+
- err = pci_enable_device(pdev);
- if (err) {
- printk(KERN_ERR "Cannot enable PCI device, aborting.\n");
-- goto out;
-+ goto out1;
- }
-
- err = pci_request_regions(pdev, DRV_MODULE_NAME);
- if (err) {
- printk(KERN_ERR "Cannot obtain PCI resources, aborting.\n");
-- goto out_disable_pdev;
-+ goto out2;
- }
-
- pci_irq_line = pdev->irq;
- /* LAN base address in located at BAR 1. */
--
-+
- pci_ioaddr = pci_resource_start(pdev, 1);
- pci_set_master(pdev);
--
-+
- printk("Found SAA9730 (PCI) at %#x, irq %d.\n",
- pci_ioaddr, pci_irq_line);
-
- err = lan_saa9730_init(dev, pci_ioaddr, pci_irq_line);
- if (err) {
- printk("Lan init failed");
-- goto out_disable_pdev;
-+ goto out2;
- }
--
-+
- pci_set_drvdata(pdev, dev);
- return 0;
-
-- out_disable_pdev:
-+out2:
- pci_disable_device(pdev);
-- out:
-- pci_set_drvdata(pdev, NULL);
-+out1:
-+ free_netdev(dev);
-+out:
- return err;
- }
-
---- linux-2.6.0/drivers/net/sb1250-mac.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/sb1250-mac.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2372,6 +2372,7 @@ static int sbmac_init(struct net_device
- unsigned char *eaddr;
- uint64_t ea_reg;
- int i;
-+ int err;
-
- sc = (struct sbmac_softc *)dev->priv;
-
-@@ -2430,7 +2431,6 @@ static int sbmac_init(struct net_device
-
- spin_lock_init(&(sc->sbm_lock));
-
-- ether_setup(dev);
- dev->open = sbmac_open;
- dev->hard_start_xmit = sbmac_start_tx;
- dev->stop = sbmac_close;
-@@ -2444,8 +2444,11 @@ static int sbmac_init(struct net_device
-
- /* This is needed for PASS2 for Rx H/W checksum feature */
- sbmac_set_iphdr_offset(sc);
--
-- return 0;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ sbmac_uninitctx(sc);
-+ return err;
- }
-
-
-@@ -2811,13 +2814,12 @@ sbmac_setup_hwaddr(int chan,char *addr)
- }
- #endif
-
--static struct net_device *dev_sbmac[MAX_UNITS] = {0,0,0};
-+static struct net_device *dev_sbmac[MAX_UNITS];
-
- static int __init
- sbmac_init_module(void)
- {
- int idx;
-- int macidx = 0;
- struct net_device *dev;
- sbmac_port_t port;
- int chip_max_units;
-@@ -2884,26 +2886,24 @@ sbmac_init_module(void)
- * Okay, cool. Initialize this MAC.
- */
-
-- dev = init_etherdev(NULL,sizeof(struct sbmac_softc));
-+ dev = alloc_etherdev(sizeof(struct sbmac_softc));
- if (!dev)
-- return -ENOMEM; /* return ENOMEM */
-+ return -ENOMEM; /* return ENOMEM */
-
- printk(KERN_DEBUG "sbmac: configuring MAC at %lx\n", port);
-
- dev->irq = K_INT_MAC_0 + idx;
- dev->base_addr = port;
- dev->mem_end = 0;
-- /*dev->init = sbmac_init;*/
-- sbmac_init(dev, macidx);
--
-- dev_sbmac[macidx] = dev;
-- macidx++;
-+ if (sbmac_init(dev, idx)) {
-+ port = A_MAC_CHANNEL_BASE(idx);
-+ SBMAC_WRITECSR(KSEG1ADDR(port+R_MAC_ETHERNET_ADDR),
-+ sbmac_orig_hwaddr[idx] );
-+ free_netdev(dev);
-+ continue;
-+ }
-+ dev_sbmac[idx++] = dev;
- }
--
-- /*
-- * Should we care, 'macidx' is the total number of enabled MACs.
-- */
--
- return 0;
- }
-
-@@ -2916,21 +2916,12 @@ sbmac_cleanup_module(void)
- sbmac_port_t port;
- for (idx = 0; idx < MAX_UNITS; idx++) {
- dev = dev_sbmac[idx];
-- if (dev == NULL)
-- continue;
-- if (dev->priv != NULL) {
-- struct sbmac_softc *sc = (struct sbmac_softc *) dev->priv;
--
-+ if (!dev) {
-+ struct sbmac_softc *sc = dev->priv;
- unregister_netdev(dev);
--
- sbmac_uninitctx(sc);
--
-+ free_netdev(dev);
- }
--
-- port = A_MAC_CHANNEL_BASE(idx);
-- SBMAC_WRITECSR(KSEG1ADDR(port+R_MAC_ETHERNET_ADDR), sbmac_orig_hwaddr[idx] );
-- free_netdev(dev);
-- dev_sbmac[idx] = NULL;
- }
- }
-
---- linux-2.6.0/drivers/net/seeq8005.c 2003-09-08 13:58:57.000000000 -0700
-+++ 25/drivers/net/seeq8005.c 2003-12-28 23:21:01.000000000 -0800
-@@ -78,8 +78,6 @@ struct net_local {
-
- /* Index to functions, as function prototypes. */
-
--extern int seeq8005_probe(struct net_device *dev);
--
- static int seeq8005_probe1(struct net_device *dev, int ioaddr);
- static int seeq8005_open(struct net_device *dev);
- static void seeq8005_timeout(struct net_device *dev);
-@@ -102,22 +100,48 @@ static inline void wait_for_buffer(struc
- If dev->base_addr == 1, always return failure.
- */
-
--int __init
--seeq8005_probe(struct net_device *dev)
--{
-- int i;
-- int base_addr = dev ? dev->base_addr : 0;
--
-- if (base_addr > 0x1ff) /* Check a single specified location. */
-- return seeq8005_probe1(dev, base_addr);
-- else if (base_addr != 0) /* Don't probe at all. */
-- return -ENXIO;
--
-- for (i = 0; seeq8005_portlist[i]; i++)
-- if (seeq8005_probe1(dev, seeq8005_portlist[i]) == 0)
-- return 0;
-+static int io = 0x320;
-+static int irq = 10;
-
-- return -ENODEV;
-+struct net_device * __init seeq8005_probe(int unit)
-+{
-+ struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-+ unsigned *port;
-+ int err = 0;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ }
-+
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = seeq8005_probe1(dev, io);
-+ } else if (io != 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (port = seeq8005_portlist; *port; port++) {
-+ if (seeq8005_probe1(dev, *port) == 0)
-+ break;
-+ }
-+ if (!*port)
-+ err = -ENODEV;
-+ }
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ release_region(dev->base_addr, SEEQ8005_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /* This is the real probe routine. Linux has a history of friendly device
-@@ -274,6 +298,7 @@ static int __init seeq8005_probe1(struct
-
- /* Fill in the 'dev' fields. */
- dev->base_addr = ioaddr;
-+ dev->irq = irq;
-
- /* Retrieve and print the ethernet address. */
- for (i = 0; i < 6; i++)
-@@ -307,13 +332,6 @@ static int __init seeq8005_probe1(struct
- }
- }
- #endif
--
-- /* Initialize the device structure. */
-- dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
-- if (dev->priv == NULL)
-- return -ENOMEM;
-- memset(dev->priv, 0, sizeof(struct net_local));
--
- dev->open = seeq8005_open;
- dev->stop = seeq8005_close;
- dev->hard_start_xmit = seeq8005_send_packet;
-@@ -321,10 +339,6 @@ static int __init seeq8005_probe1(struct
- dev->watchdog_timeo = HZ/20;
- dev->get_stats = seeq8005_get_stats;
- dev->set_multicast_list = set_multicast_list;
--
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--
- dev->flags &= ~IFF_MULTICAST;
-
- return 0;
-@@ -721,9 +735,7 @@ inline void wait_for_buffer(struct net_d
-
- #ifdef MODULE
-
--static struct net_device dev_seeq = { .init = seeq8005_probe };
--static int io = 0x320;
--static int irq = 10;
-+static struct net_device *dev_seeq;
- MODULE_LICENSE("GPL");
- MODULE_PARM(io, "i");
- MODULE_PARM(irq, "i");
-@@ -732,28 +744,17 @@ MODULE_PARM_DESC(irq, "SEEQ 8005 IRQ num
-
- int init_module(void)
- {
-- dev_seeq.irq=irq;
-- dev_seeq.base_addr=io;
-- if (register_netdev(&dev_seeq) != 0)
-- return -EIO;
-+ dev_seeq = seeq8005_probe(-1);
-+ if (IS_ERR(dev_seeq))
-+ return PTR_ERR(dev_seeq);
- return 0;
- }
-
- void cleanup_module(void)
- {
-- unregister_netdev(&dev_seeq);
--
-- /*
-- * Free up the private structure, or leak memory :-)
-- */
--
-- kfree(dev_seeq.priv);
-- dev_seeq.priv = NULL; /* gets re-allocated by el1_probe1 */
--
-- /*
-- * If we don't do this, we can't re-insmod it later.
-- */
-- release_region(dev_seeq.base_addr, SEEQ8005_IO_EXTENT);
-+ unregister_netdev(dev_seeq);
-+ release_region(dev_seeq->base_addr, SEEQ8005_IO_EXTENT);
-+ free_netdev(dev_seeq);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/sgiseeq.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/sgiseeq.c 2003-12-28 23:21:01.000000000 -0800
-@@ -600,6 +600,7 @@ int sgiseeq_init(struct hpc3_regs* regs,
- {
- struct net_device *dev;
- struct sgiseeq_private *sp;
-+ int err = -ENOMEM;
- int i;
-
- sp = (struct sgiseeq_private *) get_zeroed_page(GFP_KERNEL);
-@@ -609,19 +610,17 @@ int sgiseeq_init(struct hpc3_regs* regs,
- return -ENOMEM;
- }
-
-- dev = init_etherdev(NULL, 0);
-+ dev = alloc_etherdev(0);
- if (!dev) {
- printk (KERN_ERR
- "Seeq8003: Could not allocate memory for device.\n");
-- free_page((unsigned long) sp);
-- return -ENOMEM;
-+ goto out;
- }
-
- if (request_irq(irq, sgiseeq_interrupt, 0, sgiseeqstr, dev)) {
-- printk(KERN_ERR "Seeq8003: Can't get irq %d\n", dev->irq);
-- free_page((unsigned long) sp);
-- unregister_netdev(dev);
-- return -EAGAIN;
-+ printk(KERN_ERR "Seeq8003: Can't get irq %d\n", irq);
-+ err = -EAGAIN;
-+ goto out1;
- }
-
- printk(KERN_INFO "%s: SGI Seeq8003 ", dev->name);
-@@ -637,6 +636,8 @@ int sgiseeq_init(struct hpc3_regs* regs,
- }
- printk("\n");
-
-+ SET_MODULE_OWNER(dev);
-+
- dev->priv = sp;
- #ifdef DEBUG
- gpriv = sp;
-@@ -677,12 +678,22 @@ int sgiseeq_init(struct hpc3_regs* regs,
- dev->set_multicast_list = sgiseeq_set_multicast;
- dev->irq = irq;
- dev->dma = 0;
-- ether_setup(dev);
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out2;
-
- sp->next_module = root_sgiseeq_dev;
- root_sgiseeq_dev = dev;
-
- return 0;
-+out2:
-+ free_irq(dev->irq, dev);
-+out1:
-+ free_netdev(dev);
-+out:
-+ free_page((unsigned long) sp);
-+ return err;
- }
-
- static int __init sgiseeq_probe(void)
-@@ -701,9 +712,9 @@ static void __exit sgiseeq_exit(void)
- while (dev) {
- sp = (struct sgiseeq_private *) dev->priv;
- next = sp->next_module;
-+ unregister_netdev(dev);
- free_irq(dev->irq, dev);
- free_page((unsigned long) sp);
-- unregister_netdev(dev);
- free_netdev(dev);
- dev = next;
- }
---- linux-2.6.0/drivers/net/shaper.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/shaper.c 2003-12-28 23:21:01.000000000 -0800
-@@ -718,8 +718,10 @@ static int __init shaper_init(void)
- if (!dev)
- break;
-
-- if (register_netdev(dev))
-+ if (register_netdev(dev)) {
-+ free_netdev(dev);
- break;
-+ }
-
- devs[i] = dev;
- shapers_registered++;
-@@ -737,9 +739,12 @@ static void __exit shaper_exit (void)
- {
- int i;
-
-- for (i = 0; i < shapers_registered; i++)
-- if (devs[i])
-+ for (i = 0; i < shapers_registered; i++) {
-+ if (devs[i]) {
- unregister_netdev(devs[i]);
-+ free_netdev(devs[i]);
-+ }
-+ }
-
- kfree(devs);
- devs = NULL;
---- linux-2.6.0/drivers/net/sis900.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/sis900.c 2003-12-28 23:22:01.000000000 -0800
-@@ -18,10 +18,11 @@
- preliminary Rev. 1.0 Jan. 18, 1998
- http://www.sis.com.tw/support/databook.htm
-
-+ Rev 1.08.07 Nov. 2 2003 Daniele Venzano <webvenza@libero.it> add suspend/resume support
- Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support
-- Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary
-+ Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary
- Rev 1.08.04 Apr. 25 2002 Mufasa Yang <mufasa@sis.com.tw> added SiS962 support
-- Rev 1.08.03 Feb. 1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function
-+ Rev 1.08.03 Feb. 1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function
- Rev 1.08.02 Nov. 30 2001 Hui-Fen Hsu workaround for EDB & bug fix for dhcp problem
- Rev 1.08.01 Aug. 25 2001 Hui-Fen Hsu update for 630ET & workaround for ICS1893 PHY
- Rev 1.08.00 Jun. 11 2001 Hui-Fen Hsu workaround for RTL8201 PHY and some bug fix
-@@ -72,7 +73,7 @@
- #include "sis900.h"
-
- #define SIS900_MODULE_NAME "sis900"
--#define SIS900_DRV_VERSION "v1.08.06 9/24/2002"
-+#define SIS900_DRV_VERSION "v1.08.07 11/02/2003"
-
- static char version[] __devinitdata =
- KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n";
-@@ -169,6 +170,7 @@ struct sis900_private {
-
- unsigned int tx_full; /* The Tx queue is full. */
- u8 host_bridge_rev;
-+ u32 pci_state[16];
- };
-
- MODULE_AUTHOR("Jim Huang <cmhuang@sis.com.tw>, Ollie Lho <ollie@sis.com.tw>");
-@@ -305,7 +307,7 @@ static int __devinit sis635_get_mac_addr
- *( ((u16 *)net_dev->dev_addr) + i) = inw(ioaddr + rfdr);
- }
-
-- /* enable packet filitering */
-+ /* enable packet filtering */
- outl(rfcrSave | RFEN, rfcr + ioaddr);
-
- return 1;
-@@ -994,7 +996,7 @@ sis900_init_rxfilter (struct net_device
- }
- }
-
-- /* enable packet filitering */
-+ /* enable packet filtering */
- outl(rfcrSave | RFEN, rfcr + ioaddr);
- }
-
-@@ -1466,7 +1468,7 @@ static void sis900_tx_timeout(struct net
- * @net_dev: the net device to transmit with
- *
- * Set the transmit buffer descriptor,
-- * and write TxENA to enable transimt state machine.
-+ * and write TxENA to enable transmit state machine.
- * tell upper layer if the buffer is full
- */
-
-@@ -2184,11 +2186,72 @@ static void __devexit sis900_remove(stru
- pci_set_drvdata(pci_dev, NULL);
- }
-
-+#ifdef CONFIG_PM
-+
-+static int sis900_suspend(struct pci_dev *pci_dev, u32 state)
-+{
-+ struct net_device *net_dev = pci_get_drvdata(pci_dev);
-+ struct sis900_private *sis_priv = net_dev->priv;
-+ long ioaddr = net_dev->base_addr;
-+
-+ if(!netif_running(net_dev))
-+ return 0;
-+
-+ netif_stop_queue(net_dev);
-+
-+ /* Stop the chip's Tx and Rx Status Machine */
-+ outl(RxDIS | TxDIS | inl(ioaddr + cr), ioaddr + cr);
-+
-+ pci_set_power_state(pci_dev, 3);
-+ pci_save_state(pci_dev, sis_priv->pci_state);
-+
-+ return 0;
-+}
-+
-+static int sis900_resume(struct pci_dev *pci_dev)
-+{
-+ struct net_device *net_dev = pci_get_drvdata(pci_dev);
-+ struct sis900_private *sis_priv = net_dev->priv;
-+ long ioaddr = net_dev->base_addr;
-+
-+ if(!netif_running(net_dev))
-+ return 0;
-+ pci_restore_state(pci_dev, sis_priv->pci_state);
-+ pci_set_power_state(pci_dev, 0);
-+
-+ sis900_init_rxfilter(net_dev);
-+
-+ sis900_init_tx_ring(net_dev);
-+ sis900_init_rx_ring(net_dev);
-+
-+ set_rx_mode(net_dev);
-+
-+ netif_device_attach(net_dev);
-+ netif_start_queue(net_dev);
-+
-+ /* Workaround for EDB */
-+ sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
-+
-+ /* Enable all known interrupts by setting the interrupt mask. */
-+ outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr);
-+ outl(RxENA | inl(ioaddr + cr), ioaddr + cr);
-+ outl(IE, ioaddr + ier);
-+
-+ sis900_check_mode(net_dev, sis_priv->mii);
-+
-+ return 0;
-+}
-+#endif /* CONFIG_PM */
-+
- static struct pci_driver sis900_pci_driver = {
- .name = SIS900_MODULE_NAME,
- .id_table = sis900_pci_tbl,
- .probe = sis900_probe,
- .remove = __devexit_p(sis900_remove),
-+#ifdef CONFIG_PM
-+ .suspend = sis900_suspend,
-+ .resume = sis900_resume,
-+#endif /* CONFIG_PM */
- };
-
- static int __init sis900_init_module(void)
---- linux-2.6.0/drivers/net/sk98lin/h/skcsum.h 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skcsum.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skcsum.h
- * Project: GEnesis - SysKonnect SK-NET Gigabit Ethernet (SK-98xx)
-- * Version: $Revision: 1.9 $
-- * Date: $Date: 2001/02/06 11:21:39 $
-+ * Version: $Revision: 1.10 $
-+ * Date: $Date: 2003/08/20 13:59:57 $
- * Purpose: Store/verify Internet checksum in send/receive packets.
- *
- ******************************************************************************/
-@@ -26,6 +26,10 @@
- * History:
- *
- * $Log: skcsum.h,v $
-+ * Revision 1.10 2003/08/20 13:59:57 mschmid
-+ * Changed notation of #ifndef SkCsCalculateChecksum to
-+ * #ifndef SK_CS_CALCULATE_CHECKSUM
-+ *
- * Revision 1.9 2001/02/06 11:21:39 rassmann
- * Editorial changes.
- *
-@@ -226,11 +230,11 @@ typedef struct s_CsPacketInfo {
-
- /* function prototypes ********************************************************/
-
--#ifndef SkCsCalculateChecksum
-+#ifndef SK_CS_CALCULATE_CHECKSUM
- extern unsigned SkCsCalculateChecksum(
- void *pData,
- unsigned Length);
--#endif
-+#endif /* SK_CS_CALCULATE_CHECKSUM */
-
- extern int SkCsEvent(
- SK_AC *pAc,
---- linux-2.6.0/drivers/net/sk98lin/h/skdrv1st.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skdrv1st.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,15 +2,16 @@
- *
- * Name: skdrv1st.h
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.1 $
-- * Date: $Date: 2003/07/21 07:22:43 $
-+ * Version: $Revision: 1.4 $
-+ * Date: $Date: 2003/11/12 14:28:14 $
- * Purpose: First header file for driver and all other modules
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,6 +27,15 @@
- * History:
- *
- * $Log: skdrv1st.h,v $
-+ * Revision 1.4 2003/11/12 14:28:14 rroesler
-+ * Fix: use dedicated ip_fast_csum() on X86_64 systems
-+ *
-+ * Revision 1.3 2003/10/07 08:16:52 mlindner
-+ * Fix: Copyright changes
-+ *
-+ * Revision 1.2 2003/09/29 12:05:59 mlindner
-+ * Fix: Added define SK_CS_CALCULSTE_CHECKSUM
-+ *
- * Revision 1.1 2003/07/21 07:22:43 rroesler
- * Fix: Re-Enter after CVS crash
- *
-@@ -110,6 +120,9 @@
- #ifndef __INC_SKDRV1ST_H
- #define __INC_SKDRV1ST_H
-
-+/* Check kernel version */
-+#include <linux/version.h>
-+
- typedef struct s_AC SK_AC;
-
- /* Set card versions */
-@@ -124,17 +137,15 @@ typedef struct s_AC SK_AC;
- #define SK_PNMI_READ_U32(p,v) memcpy((char*)&(v),(char*)(p),4)
- #define SK_PNMI_READ_U64(p,v) memcpy((char*)&(v),(char*)(p),8)
-
--#define SkCsCalculateChecksum(p,l) ((~ip_compute_csum(p, l)) & 0xffff)
--
- #define SK_ADDR_EQUAL(a1,a2) (!memcmp(a1,a2,6))
-
--
- #if !defined(__OPTIMIZE__) || !defined(__KERNEL__)
- #warning You must compile this file with the correct options!
- #warning See the last lines of the source file.
- #error You must compile this driver with "-O".
- #endif
-
-+#include <linux/version.h>
- #include <linux/types.h>
- #include <linux/kernel.h>
- #include <linux/string.h>
-@@ -154,6 +165,13 @@ typedef struct s_AC SK_AC;
- #include <asm/uaccess.h>
- #include <net/checksum.h>
-
-+#define SK_CS_CALCULATE_CHECKSUM
-+#ifndef CONFIG_X86_64
-+#define SkCsCalculateChecksum(p,l) ((~ip_compute_csum(p, l)) & 0xffff)
-+#else
-+#define SkCsCalculateChecksum(p,l) ((~ip_fast_csum(p, l)) & 0xffff)
-+#endif
-+
- #include "h/sktypes.h"
- #include "h/skerror.h"
- #include "h/skdebug.h"
---- linux-2.6.0/drivers/net/sk98lin/h/skdrv2nd.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skdrv2nd.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,15 +2,16 @@
- *
- * Name: skdrv2nd.h
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.3 $
-- * Date: $Date: 2003/08/12 16:51:18 $
-+ * Version: $Revision: 1.10 $
-+ * Date: $Date: 2003/12/11 16:04:45 $
- * Purpose: Second header file for driver and all other modules
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,6 +27,27 @@
- * History:
- *
- * $Log: skdrv2nd.h,v $
-+ * Revision 1.10 2003/12/11 16:04:45 mlindner
-+ * Add: New pnmi data backup structure
-+ *
-+ * Revision 1.9 2003/11/10 09:31:37 rroesler
-+ * Add: pnmiBackup structure for DIAG backup restore
-+ *
-+ * Revision 1.8 2003/10/22 14:18:32 rroesler
-+ * Fix: DIAG handling for DualNet cards
-+ *
-+ * Revision 1.7 2003/10/07 09:34:59 mlindner
-+ * Add: New defines for lower and upper range values (interrupt moderation)
-+ *
-+ * Revision 1.6 2003/10/07 08:16:51 mlindner
-+ * Fix: Copyright changes
-+ *
-+ * Revision 1.5 2003/09/01 13:10:39 rroesler
-+ * Add: Prototypes for DIAG Attach/Detach functions
-+ *
-+ * Revision 1.4 2003/09/01 12:33:38 rroesler
-+ * Add: Defines for optimized DIAG interaction
-+ *
- * Revision 1.3 2003/08/12 16:51:18 mlindner
- * Fix: UDP and TCP Proto checks
- * Fix: UDP header offset
-@@ -206,6 +228,11 @@ extern int SkPciWriteCfgWord(SK_AC*, in
- extern int SkPciWriteCfgByte(SK_AC*, int, SK_U8);
- extern int SkDrvEvent(SK_AC*, SK_IOC IoC, SK_U32, SK_EVPARA);
-
-+#ifdef SK_DIAG_SUPPORT
-+extern int SkDrvEnterDiagMode(SK_AC *pAc);
-+extern int SkDrvLeaveDiagMode(SK_AC *pAc);
-+#endif
-+
- struct s_DrvRlmtMbuf {
- SK_MBUF *pNext; /* Pointer to next RLMT Mbuf. */
- SK_U8 *pData; /* Data buffer (virtually contig.). */
-@@ -247,6 +274,7 @@ struct s_DrvRlmtMbuf {
- #define SK_IOCTL_SETMIB (SK_IOCTL_BASE + 1)
- #define SK_IOCTL_PRESETMIB (SK_IOCTL_BASE + 2)
- #define SK_IOCTL_GEN (SK_IOCTL_BASE + 3)
-+#define SK_IOCTL_DIAG (SK_IOCTL_BASE + 4)
-
- typedef struct s_IOCTL SK_GE_IOCTL;
-
-@@ -462,6 +490,9 @@ struct s_RxPort {
- #define C_INTS_PER_SEC_DEFAULT 2000
- #define C_INT_MOD_ENABLE_PERCENTAGE 50 /* if higher 50% enable */
- #define C_INT_MOD_DISABLE_PERCENTAGE 50 /* if lower 50% disable */
-+#define C_INT_MOD_IPS_LOWER_RANGE 30
-+#define C_INT_MOD_IPS_UPPER_RANGE 40000
-+
-
- typedef struct s_DynIrqModInfo DIM_INFO;
- struct s_DynIrqModInfo {
-@@ -493,6 +524,11 @@ typedef struct s_PerStrm PER_STRM;
-
- #define SK_ALLOC_IRQ 0x00000001
-
-+#ifdef SK_DIAG_SUPPORT
-+#define DIAG_ACTIVE 1
-+#define DIAG_NOTACTIVE 0
-+#endif
-+
- /****************************************************************************
- * Per board structure / Adapter Context structure:
- * Allocated within attach(9e) and freed within detach(9e).
-@@ -563,9 +599,18 @@ struct s_AC {
- int PortUp;
- int PortDown;
- int ChipsetType; /* Chipset family type
-- * 0 == Genesis family support
-- * 1 == Yukon family support
-- */
-+ * 0 == Genesis family support
-+ * 1 == Yukon family support
-+ */
-+#ifdef SK_DIAG_SUPPORT
-+ SK_U32 DiagModeActive; /* is diag active? */
-+ SK_BOOL DiagFlowCtrl; /* for control purposes */
-+ SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for all Pnmi-Data */
-+ SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while
-+ * DIAG is busy with NIC
-+ */
-+#endif
-+
- };
-
-
---- linux-2.6.0/drivers/net/sk98lin/h/skgehw.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skgehw.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skgehw.h
- * Project: Gigabit Ethernet Adapters, Common Modules
-- * Version: $Revision: 1.53 $
-- * Date: $Date: 2003/07/04 12:39:01 $
-+ * Version: $Revision: 1.56 $
-+ * Date: $Date: 2003/09/23 09:01:00 $
- * Purpose: Defines and Macros for the Gigabit Ethernet Adapter Product Family
- *
- ******************************************************************************/
-@@ -26,6 +26,17 @@
- *
- * History:
- * $Log: skgehw.h,v $
-+ * Revision 1.56 2003/09/23 09:01:00 malthoff
-+ * Minor change: Define I2C device size constants as long.
-+ *
-+ * Revision 1.55 2003/09/16 14:03:34 rschmidt
-+ * Added define for YUKON-Lite Rev. A1,A2 Chip Revision
-+ * Moved defines for PHY power down modes to skgeinit.h
-+ * Editorial changes
-+ *
-+ * Revision 1.54 2003/09/16 07:37:58 mschmid
-+ * Added defines for Marvell PHY low power modes
-+ *
- * Revision 1.53 2003/07/04 12:39:01 rschmidt
- * Added SK_FAR to pointers in XM_IN32() and GM_IN32() macros (for PXE)
- * Editorial changes
-@@ -84,7 +95,7 @@
- * Editorial changes
- *
- * Revision 1.39 2002/06/10 09:37:07 rschmidt
-- * Added macros for the ADDR-Modul
-+ * Added macros for the ADDR-Module
- *
- * Revision 1.38 2002/06/05 08:15:19 rschmidt
- * Added defines for WOL Registers
-@@ -628,12 +639,12 @@ extern "C" {
- #define B2_FAR 0x0120 /* 32 bit Flash-Prom Addr Reg/Cnt */
- #define B2_FDP 0x0124 /* 8 bit Flash-Prom Data Port */
- /* 0x0125 - 0x0127: reserved */
--#define B2_LD_CRTL 0x0128 /* 8 bit EPROM loader control register */
-+#define B2_LD_CTRL 0x0128 /* 8 bit EPROM loader control register */
- #define B2_LD_TEST 0x0129 /* 8 bit EPROM loader test register */
- /* 0x012a - 0x012f: reserved */
- #define B2_TI_INI 0x0130 /* 32 bit Timer Init Value */
- #define B2_TI_VAL 0x0134 /* 32 bit Timer Value */
--#define B2_TI_CRTL 0x0138 /* 8 bit Timer Control */
-+#define B2_TI_CTRL 0x0138 /* 8 bit Timer Control */
- #define B2_TI_TEST 0x0139 /* 8 Bit Timer Test */
- /* 0x013a - 0x013f: reserved */
- #define B2_IRQM_INI 0x0140 /* 32 bit IRQ Moderation Timer Init Reg.*/
-@@ -1021,7 +1032,7 @@ extern "C" {
- /* Bit 7: reserved */
- #define RAP_RAP 0x3f /* Bit 6..0: 0 = block 0,..,6f = block 6f */
-
--/* B0_CTST 16 bit Control/Status register */
-+/* B0_CTST 16 bit Control/Status register */
- /* Bit 15..14: reserved */
- #define CS_CLK_RUN_HOT BIT_13S /* CLK_RUN hot m. (YUKON-Lite only) */
- #define CS_CLK_RUN_RST BIT_12S /* CLK_RUN reset (YUKON-Lite only) */
-@@ -1038,7 +1049,7 @@ extern "C" {
- #define CS_RST_CLR BIT_1S /* Clear Software reset */
- #define CS_RST_SET BIT_0S /* Set Software reset */
-
--/* B0_LED 8 Bit LED register */
-+/* B0_LED 8 Bit LED register */
- /* Bit 7.. 2: reserved */
- #define LED_STAT_ON BIT_1S /* Status LED on */
- #define LED_STAT_OFF BIT_0S /* Status LED off */
-@@ -1053,9 +1064,9 @@ extern "C" {
- #define PC_VCC_ON BIT_1 /* Switch VCC On */
- #define PC_VCC_OFF BIT_0 /* Switch VCC Off */
-
--/* B0_ISRC 32 bit Interrupt Source Register */
--/* B0_IMSK 32 bit Interrupt Mask Register */
--/* B0_SP_ISRC 32 bit Special Interrupt Source Reg */
-+/* B0_ISRC 32 bit Interrupt Source Register */
-+/* B0_IMSK 32 bit Interrupt Mask Register */
-+/* B0_SP_ISRC 32 bit Special Interrupt Source Reg */
- /* B2_IRQM_MSK 32 bit IRQ Moderation Mask */
- #define IS_ALL_MSK 0xbfffffffUL /* All Interrupt bits */
- #define IS_HW_ERR BIT_31 /* Interrupt HW Error */
-@@ -1099,9 +1110,9 @@ extern "C" {
- #define IS_XA2_C BIT_0 /* Q_XA2 Encoding Error */
-
-
--/* B0_HWE_ISRC 32 bit HW Error Interrupt Src Reg */
--/* B0_HWE_IMSK 32 bit HW Error Interrupt Mask Reg */
--/* B2_IRQM_HWE_MSK 32 bit IRQ Moderation HW Error Mask */
-+/* B0_HWE_ISRC 32 bit HW Error Interrupt Src Reg */
-+/* B0_HWE_IMSK 32 bit HW Error Interrupt Mask Reg */
-+/* B2_IRQM_HWE_MSK 32 bit IRQ Moderation HW Error Mask */
- #define IS_ERR_MSK 0x00000fffL /* All Error bits */
- /* Bit 31..14: reserved */
- #define IS_IRQ_TIST_OV BIT_13 /* Time Stamp Timer Overflow (YUKON only) */
-@@ -1119,29 +1130,32 @@ extern "C" {
- #define IS_R1_PAR_ERR BIT_1 /* Queue R1 Parity Error */
- #define IS_R2_PAR_ERR BIT_0 /* Queue R2 Parity Error */
-
--/* B2_CONN_TYP 8 bit Connector type */
--/* B2_PMD_TYP 8 bit PMD type */
-+/* B2_CONN_TYP 8 bit Connector type */
-+/* B2_PMD_TYP 8 bit PMD type */
- /* Values of connector and PMD type comply to SysKonnect internal std */
-
--/* B2_MAC_CFG 8 bit MAC Configuration / Chip Revision */
-+/* B2_MAC_CFG 8 bit MAC Configuration / Chip Revision */
- #define CFG_CHIP_R_MSK (0xf<<4) /* Bit 7.. 4: Chip Revision */
- /* Bit 3.. 2: reserved */
- #define CFG_DIS_M2_CLK BIT_1S /* Disable Clock for 2nd MAC */
- #define CFG_SNG_MAC BIT_0S /* MAC Config: 0=2 MACs / 1=1 MAC*/
-
--/* B2_CHIP_ID 8 bit Chip Identification Number */
-+/* B2_CHIP_ID 8 bit Chip Identification Number */
- #define CHIP_ID_GENESIS 0x0a /* Chip ID for GENESIS */
- #define CHIP_ID_YUKON 0xb0 /* Chip ID for YUKON */
--#define CHIP_ID_YUKON_LITE 0xb1 /* Chip ID for YUKON-Lite (Rev. A1) */
-+#define CHIP_ID_YUKON_LITE 0xb1 /* Chip ID for YUKON-Lite (Rev. A1-A3) */
- #define CHIP_ID_YUKON_LP 0xb2 /* Chip ID for YUKON-LP */
-
--/* B2_FAR 32 bit Flash-Prom Addr Reg/Cnt */
-+#define CHIP_REV_YU_LITE_A1 3 /* Chip Rev. for YUKON-Lite A1,A2 */
-+#define CHIP_REV_YU_LITE_A3 7 /* Chip Rev. for YUKON-Lite A3 */
-+
-+/* B2_FAR 32 bit Flash-Prom Addr Reg/Cnt */
- #define FAR_ADDR 0x1ffffL /* Bit 16.. 0: FPROM Address mask */
-
--/* B2_LD_CRTL 8 bit EPROM loader control register */
-+/* B2_LD_CTRL 8 bit EPROM loader control register */
- /* Bits are currently reserved */
-
--/* B2_LD_TEST 8 bit EPROM loader test register */
-+/* B2_LD_TEST 8 bit EPROM loader test register */
- /* Bit 7.. 4: reserved */
- #define LD_T_ON BIT_3S /* Loader Test mode on */
- #define LD_T_OFF BIT_2S /* Loader Test mode off */
-@@ -1151,16 +1165,16 @@ extern "C" {
- /*
- * Timer Section
- */
--/* B2_TI_CRTL 8 bit Timer control */
-+/* B2_TI_CTRL 8 bit Timer control */
- /* B2_IRQM_CTRL 8 bit IRQ Moderation Timer Control */
- /* Bit 7.. 3: reserved */
- #define TIM_START BIT_2S /* Start Timer */
- #define TIM_STOP BIT_1S /* Stop Timer */
- #define TIM_CLR_IRQ BIT_0S /* Clear Timer IRQ (!IRQM) */
-
--/* B2_TI_TEST 8 Bit Timer Test */
-+/* B2_TI_TEST 8 Bit Timer Test */
- /* B2_IRQM_TEST 8 bit IRQ Moderation Timer Test */
--/* B28_DPT_TST 8 bit Descriptor Poll Timer Test Reg */
-+/* B28_DPT_TST 8 bit Descriptor Poll Timer Test Reg */
- /* Bit 7.. 3: reserved */
- #define TIM_T_ON BIT_2S /* Test mode on */
- #define TIM_T_OFF BIT_1S /* Test mode off */
-@@ -1197,7 +1211,7 @@ extern "C" {
- #define TST_FRC_APERR_1M64 BIT_1S /* AddrPERR on 1. phase */
- #define TST_FRC_APERR_2M64 BIT_0S /* AddrPERR on 2. phase */
-
--/* B2_GP_IO 32 bit General Purpose I/O Register */
-+/* B2_GP_IO 32 bit General Purpose I/O Register */
- /* Bit 31..26: reserved */
- #define GP_DIR_9 BIT_25 /* IO_9 direct, 0=In/1=Out */
- #define GP_DIR_8 BIT_24 /* IO_8 direct, 0=In/1=Out */
-@@ -1221,28 +1235,28 @@ extern "C" {
- #define GP_IO_1 BIT_1 /* IO_1 pin */
- #define GP_IO_0 BIT_0 /* IO_0 pin */
-
--/* B2_I2C_CTRL 32 bit I2C HW Control Register */
-+/* B2_I2C_CTRL 32 bit I2C HW Control Register */
- #define I2C_FLAG BIT_31 /* Start read/write if WR */
- #define I2C_ADDR (0x7fffL<<16) /* Bit 30..16: Addr to be RD/WR */
- #define I2C_DEV_SEL (0x7fL<<9) /* Bit 15.. 9: I2C Device Select */
- /* Bit 8.. 5: reserved */
- #define I2C_BURST_LEN BIT_4 /* Burst Len, 1/4 bytes */
--#define I2C_DEV_SIZE (7L<<1) /* Bit 3.. 1: I2C Device Size */
--#define I2C_025K_DEV (0L<<1) /* 0: 256 Bytes or smal. */
--#define I2C_05K_DEV (1L<<1) /* 1: 512 Bytes */
--#define I2C_1K_DEV (2L<<1) /* 2: 1024 Bytes */
--#define I2C_2K_DEV (3L<<1) /* 3: 2048 Bytes */
--#define I2C_4K_DEV (4L<<1) /* 4: 4096 Bytes */
--#define I2C_8K_DEV (5L<<1) /* 5: 8192 Bytes */
--#define I2C_16K_DEV (6L<<1) /* 6: 16384 Bytes */
--#define I2C_32K_DEV (7L<<1) /* 7: 32768 Bytes */
-+#define I2C_DEV_SIZE (7<<1) /* Bit 3.. 1: I2C Device Size */
-+#define I2C_025K_DEV (0<<1) /* 0: 256 Bytes or smal. */
-+#define I2C_05K_DEV (1<<1) /* 1: 512 Bytes */
-+#define I2C_1K_DEV (2<<1) /* 2: 1024 Bytes */
-+#define I2C_2K_DEV (3<<1) /* 3: 2048 Bytes */
-+#define I2C_4K_DEV (4<<1) /* 4: 4096 Bytes */
-+#define I2C_8K_DEV (5<<1) /* 5: 8192 Bytes */
-+#define I2C_16K_DEV (6<<1) /* 6: 16384 Bytes */
-+#define I2C_32K_DEV (7<<1) /* 7: 32768 Bytes */
- #define I2C_STOP BIT_0 /* Interrupt I2C transfer */
-
--/* B2_I2C_IRQ 32 bit I2C HW IRQ Register */
-+/* B2_I2C_IRQ 32 bit I2C HW IRQ Register */
- /* Bit 31.. 1 reserved */
- #define I2C_CLR_IRQ BIT_0 /* Clear I2C IRQ */
-
--/* B2_I2C_SW 32 bit (8 bit access) I2C HW SW Port Register */
-+/* B2_I2C_SW 32 bit (8 bit access) I2C HW SW Port Register */
- /* Bit 7.. 3: reserved */
- #define I2C_DATA_DIR BIT_2S /* direction of I2C_DATA */
- #define I2C_DATA BIT_1S /* I2C Data Port */
-@@ -1254,27 +1268,27 @@ extern "C" {
- #define I2C_SENS_ADDR LM80_ADDR /* I2C Sensor Address, (Volt and Temp)*/
-
-
--/* B2_BSC_CTRL 8 bit Blink Source Counter Control */
-+/* B2_BSC_CTRL 8 bit Blink Source Counter Control */
- /* Bit 7.. 2: reserved */
- #define BSC_START BIT_1S /* Start Blink Source Counter */
- #define BSC_STOP BIT_0S /* Stop Blink Source Counter */
-
--/* B2_BSC_STAT 8 bit Blink Source Counter Status */
-+/* B2_BSC_STAT 8 bit Blink Source Counter Status */
- /* Bit 7.. 1: reserved */
- #define BSC_SRC BIT_0S /* Blink Source, 0=Off / 1=On */
-
--/* B2_BSC_TST 16 bit Blink Source Counter Test Reg */
-+/* B2_BSC_TST 16 bit Blink Source Counter Test Reg */
- #define BSC_T_ON BIT_2S /* Test mode on */
- #define BSC_T_OFF BIT_1S /* Test mode off */
- #define BSC_T_STEP BIT_0S /* Test step */
-
-
--/* B3_RAM_ADDR 32 bit RAM Address, to read or write */
-+/* B3_RAM_ADDR 32 bit RAM Address, to read or write */
- /* Bit 31..19: reserved */
- #define RAM_ADR_RAN 0x0007ffffL /* Bit 18.. 0: RAM Address Range */
-
- /* RAM Interface Registers */
--/* B3_RI_CTRL 16 bit RAM Iface Control Register */
-+/* B3_RI_CTRL 16 bit RAM Iface Control Register */
- /* Bit 15..10: reserved */
- #define RI_CLR_RD_PERR BIT_9S /* Clear IRQ RAM Read Parity Err */
- #define RI_CLR_WR_PERR BIT_8S /* Clear IRQ RAM Write Parity Err*/
-@@ -1282,7 +1296,7 @@ extern "C" {
- #define RI_RST_CLR BIT_1S /* Clear RAM Interface Reset */
- #define RI_RST_SET BIT_0S /* Set RAM Interface Reset */
-
--/* B3_RI_TEST 8 bit RAM Iface Test Register */
-+/* B3_RI_TEST 8 bit RAM Iface Test Register */
- /* Bit 15.. 4: reserved */
- #define RI_T_EV BIT_3S /* Timeout Event occured */
- #define RI_T_ON BIT_2S /* Timeout Timer Test On */
-@@ -1309,7 +1323,7 @@ extern "C" {
- #define MA_DIS_REC_RX1 BIT_0S /* Disable Recovery Timer RX1 */
-
- /* Packet Arbiter Registers */
--/* B3_PA_CTRL 16 bit Packet Arbiter Ctrl Register */
-+/* B3_PA_CTRL 16 bit Packet Arbiter Ctrl Register */
- /* Bit 15..14: reserved */
- #define PA_CLR_TO_TX2 BIT_13S /* Clear IRQ Packet Timeout TX2 */
- #define PA_CLR_TO_TX1 BIT_12S /* Clear IRQ Packet Timeout TX1 */
-@@ -1332,7 +1346,7 @@ extern "C" {
- /* Rx/Tx Path related Arbiter Test Registers */
- /* B3_MA_TO_TEST 16 bit MAC Arbiter Timeout Test Reg */
- /* B3_MA_RC_TEST 16 bit MAC Arbiter Recovery Test Reg */
--/* B3_PA_TEST 16 bit Packet Arbiter Test Register */
-+/* B3_PA_TEST 16 bit Packet Arbiter Test Register */
- /* Bit 15, 11, 7, and 3 are reserved in B3_PA_TEST */
- #define TX2_T_EV BIT_15S /* TX2 Timeout/Recv Event occured */
- #define TX2_T_ON BIT_14S /* TX2 Timeout/Recv Timer Test On */
-@@ -1353,14 +1367,14 @@ extern "C" {
-
-
- /* Transmit Arbiter Registers MAC 1 and 2, use MR_ADDR() to access */
--/* TXA_ITI_INI 32 bit Tx Arb Interval Timer Init Val */
--/* TXA_ITI_VAL 32 bit Tx Arb Interval Timer Value */
--/* TXA_LIM_INI 32 bit Tx Arb Limit Counter Init Val */
--/* TXA_LIM_VAL 32 bit Tx Arb Limit Counter Value */
-+/* TXA_ITI_INI 32 bit Tx Arb Interval Timer Init Val */
-+/* TXA_ITI_VAL 32 bit Tx Arb Interval Timer Value */
-+/* TXA_LIM_INI 32 bit Tx Arb Limit Counter Init Val */
-+/* TXA_LIM_VAL 32 bit Tx Arb Limit Counter Value */
- /* Bit 31..24: reserved */
- #define TXA_MAX_VAL 0x00ffffffUL/* Bit 23.. 0: Max TXA Timer/Cnt Val */
-
--/* TXA_CTRL 8 bit Tx Arbiter Control Register */
-+/* TXA_CTRL 8 bit Tx Arbiter Control Register */
- #define TXA_ENA_FSYNC BIT_7S /* Enable force of sync Tx queue */
- #define TXA_DIS_FSYNC BIT_6S /* Disable force of sync Tx queue */
- #define TXA_ENA_ALLOC BIT_5S /* Enable alloc of free bandwidth */
-@@ -1370,7 +1384,7 @@ extern "C" {
- #define TXA_ENA_ARB BIT_1S /* Enable Tx Arbiter */
- #define TXA_DIS_ARB BIT_0S /* Disable Tx Arbiter */
-
--/* TXA_TEST 8 bit Tx Arbiter Test Register */
-+/* TXA_TEST 8 bit Tx Arbiter Test Register */
- /* Bit 7.. 6: reserved */
- #define TXA_INT_T_ON BIT_5S /* Tx Arb Interval Timer Test On */
- #define TXA_INT_T_OFF BIT_4S /* Tx Arb Interval Timer Test Off */
-@@ -1379,22 +1393,22 @@ extern "C" {
- #define TXA_LIM_T_OFF BIT_1S /* Tx Arb Limit Timer Test Off */
- #define TXA_LIM_T_STEP BIT_0S /* Tx Arb Limit Timer Step */
-
--/* TXA_STAT 8 bit Tx Arbiter Status Register */
-+/* TXA_STAT 8 bit Tx Arbiter Status Register */
- /* Bit 7.. 1: reserved */
- #define TXA_PRIO_XS BIT_0S /* sync queue has prio to send */
-
--/* Q_BC 32 bit Current Byte Counter */
-+/* Q_BC 32 bit Current Byte Counter */
- /* Bit 31..16: reserved */
- #define BC_MAX 0xffff /* Bit 15.. 0: Byte counter */
-
- /* BMU Control Status Registers */
--/* B0_R1_CSR 32 bit BMU Ctrl/Stat Rx Queue 1 */
--/* B0_R2_CSR 32 bit BMU Ctrl/Stat Rx Queue 2 */
--/* B0_XA1_CSR 32 bit BMU Ctrl/Stat Sync Tx Queue 1 */
--/* B0_XS1_CSR 32 bit BMU Ctrl/Stat Async Tx Queue 1 */
--/* B0_XA2_CSR 32 bit BMU Ctrl/Stat Sync Tx Queue 2 */
--/* B0_XS2_CSR 32 bit BMU Ctrl/Stat Async Tx Queue 2 */
--/* Q_CSR 32 bit BMU Control/Status Register */
-+/* B0_R1_CSR 32 bit BMU Ctrl/Stat Rx Queue 1 */
-+/* B0_R2_CSR 32 bit BMU Ctrl/Stat Rx Queue 2 */
-+/* B0_XA1_CSR 32 bit BMU Ctrl/Stat Sync Tx Queue 1 */
-+/* B0_XS1_CSR 32 bit BMU Ctrl/Stat Async Tx Queue 1 */
-+/* B0_XA2_CSR 32 bit BMU Ctrl/Stat Sync Tx Queue 2 */
-+/* B0_XS2_CSR 32 bit BMU Ctrl/Stat Async Tx Queue 2 */
-+/* Q_CSR 32 bit BMU Control/Status Register */
- /* Bit 31..25: reserved */
- #define CSR_SV_IDLE BIT_24 /* BMU SM Idle */
- /* Bit 23..22: reserved */
-@@ -1428,7 +1442,7 @@ extern "C" {
- CSR_SV_RUN | CSR_DREAD_RUN | CSR_DWRITE_RUN |\
- CSR_TRANS_RUN)
-
--/* Q_F 32 bit Flag Register */
-+/* Q_F 32 bit Flag Register */
- /* Bit 31..28: reserved */
- #define F_ALM_FULL BIT_27 /* Rx FIFO: almost full */
- #define F_EMPTY BIT_27 /* Tx FIFO: empty flag */
-@@ -1439,17 +1453,17 @@ extern "C" {
- /* Bit 15..11: reserved */
- #define F_WATER_MARK 0x0007ffL /* Bit 10.. 0: Watermark */
-
--/* Q_T1 32 bit Test Register 1 */
-+/* Q_T1 32 bit Test Register 1 */
- /* Holds four State Machine control Bytes */
--#define SM_CRTL_SV_MSK (0xffL<<24) /* Bit 31..24: Control Supervisor SM */
--#define SM_CRTL_RD_MSK (0xffL<<16) /* Bit 23..16: Control Read Desc SM */
--#define SM_CRTL_WR_MSK (0xffL<<8) /* Bit 15.. 8: Control Write Desc SM */
--#define SM_CRTL_TR_MSK 0xffL /* Bit 7.. 0: Control Transfer SM */
--
--/* Q_T1_TR 8 bit Test Register 1 Transfer SM */
--/* Q_T1_WR 8 bit Test Register 1 Write Descriptor SM */
--/* Q_T1_RD 8 bit Test Register 1 Read Descriptor SM */
--/* Q_T1_SV 8 bit Test Register 1 Supervisor SM */
-+#define SM_CTRL_SV_MSK (0xffL<<24) /* Bit 31..24: Control Supervisor SM */
-+#define SM_CTRL_RD_MSK (0xffL<<16) /* Bit 23..16: Control Read Desc SM */
-+#define SM_CTRL_WR_MSK (0xffL<<8) /* Bit 15.. 8: Control Write Desc SM */
-+#define SM_CTRL_TR_MSK 0xffL /* Bit 7.. 0: Control Transfer SM */
-+
-+/* Q_T1_TR 8 bit Test Register 1 Transfer SM */
-+/* Q_T1_WR 8 bit Test Register 1 Write Descriptor SM */
-+/* Q_T1_RD 8 bit Test Register 1 Read Descriptor SM */
-+/* Q_T1_SV 8 bit Test Register 1 Supervisor SM */
-
- /* The control status byte of each machine looks like ... */
- #define SM_STATE 0xf0 /* Bit 7.. 4: State which shall be loaded */
-@@ -1459,7 +1473,7 @@ extern "C" {
- #define SM_STEP BIT_0S /* Step the State Machine */
- /* The encoding of the states is not supported by the Diagnostics Tool */
-
--/* Q_T2 32 bit Test Register 2 */
-+/* Q_T2 32 bit Test Register 2 */
- /* Bit 31.. 8: reserved */
- #define T2_AC_T_ON BIT_7 /* Address Counter Test Mode on */
- #define T2_AC_T_OFF BIT_6 /* Address Counter Test Mode off */
-@@ -1470,23 +1484,23 @@ extern "C" {
- #define T2_STEP02 BIT_1 /* Inc AC/Dec BC by 2 */
- #define T2_STEP01 BIT_0 /* Inc AC/Dec BC by 1 */
-
--/* Q_T3 32 bit Test Register 3 */
-+/* Q_T3 32 bit Test Register 3 */
- /* Bit 31.. 7: reserved */
- #define T3_MUX_MSK (7<<4) /* Bit 6.. 4: Mux Position */
- /* Bit 3: reserved */
- #define T3_VRAM_MSK 7 /* Bit 2.. 0: Virtual RAM Buffer Address */
-
- /* RAM Buffer Register Offsets, use RB_ADDR(Queue, Offs) to access */
--/* RB_START 32 bit RAM Buffer Start Address */
--/* RB_END 32 bit RAM Buffer End Address */
--/* RB_WP 32 bit RAM Buffer Write Pointer */
--/* RB_RP 32 bit RAM Buffer Read Pointer */
--/* RB_RX_UTPP 32 bit Rx Upper Threshold, Pause Pack */
--/* RB_RX_LTPP 32 bit Rx Lower Threshold, Pause Pack */
--/* RB_RX_UTHP 32 bit Rx Upper Threshold, High Prio */
--/* RB_RX_LTHP 32 bit Rx Lower Threshold, High Prio */
--/* RB_PC 32 bit RAM Buffer Packet Counter */
--/* RB_LEV 32 bit RAM Buffer Level Register */
-+/* RB_START 32 bit RAM Buffer Start Address */
-+/* RB_END 32 bit RAM Buffer End Address */
-+/* RB_WP 32 bit RAM Buffer Write Pointer */
-+/* RB_RP 32 bit RAM Buffer Read Pointer */
-+/* RB_RX_UTPP 32 bit Rx Upper Threshold, Pause Pack */
-+/* RB_RX_LTPP 32 bit Rx Lower Threshold, Pause Pack */
-+/* RB_RX_UTHP 32 bit Rx Upper Threshold, High Prio */
-+/* RB_RX_LTHP 32 bit Rx Lower Threshold, High Prio */
-+/* RB_PC 32 bit RAM Buffer Packet Counter */
-+/* RB_LEV 32 bit RAM Buffer Level Register */
- /* Bit 31..19: reserved */
- #define RB_MSK 0x0007ffff /* Bit 18.. 0: RAM Buffer Pointer Bits */
-
-@@ -1519,17 +1533,17 @@ extern "C" {
-
- /* Receive and Transmit MAC FIFO Registers (GENESIS only) */
-
--/* RX_MFF_EA 32 bit Receive MAC FIFO End Address */
--/* RX_MFF_WP 32 bit Receive MAC FIFO Write Pointer */
--/* RX_MFF_RP 32 bit Receive MAC FIFO Read Pointer */
--/* RX_MFF_PC 32 bit Receive MAC FIFO Packet Counter */
--/* RX_MFF_LEV 32 bit Receive MAC FIFO Level */
--/* TX_MFF_EA 32 bit Transmit MAC FIFO End Address */
--/* TX_MFF_WP 32 bit Transmit MAC FIFO Write Pointer */
--/* TX_MFF_WSP 32 bit Transmit MAC FIFO WR Shadow Pointer */
--/* TX_MFF_RP 32 bit Transmit MAC FIFO Read Pointer */
--/* TX_MFF_PC 32 bit Transmit MAC FIFO Packet Cnt */
--/* TX_MFF_LEV 32 bit Transmit MAC FIFO Level */
-+/* RX_MFF_EA 32 bit Receive MAC FIFO End Address */
-+/* RX_MFF_WP 32 bit Receive MAC FIFO Write Pointer */
-+/* RX_MFF_RP 32 bit Receive MAC FIFO Read Pointer */
-+/* RX_MFF_PC 32 bit Receive MAC FIFO Packet Counter */
-+/* RX_MFF_LEV 32 bit Receive MAC FIFO Level */
-+/* TX_MFF_EA 32 bit Transmit MAC FIFO End Address */
-+/* TX_MFF_WP 32 bit Transmit MAC FIFO Write Pointer */
-+/* TX_MFF_WSP 32 bit Transmit MAC FIFO WR Shadow Pointer */
-+/* TX_MFF_RP 32 bit Transmit MAC FIFO Read Pointer */
-+/* TX_MFF_PC 32 bit Transmit MAC FIFO Packet Cnt */
-+/* TX_MFF_LEV 32 bit Transmit MAC FIFO Level */
- /* Bit 31.. 6: reserved */
- #define MFF_MSK 0x007fL /* Bit 5.. 0: MAC FIFO Address/Ptr Bits */
-
-@@ -1682,7 +1696,7 @@ extern "C" {
-
- #define RX_GMF_FL_THR_DEF 0x0a /* Rx GMAC FIFO Flush Threshold default */
-
--/* GMAC_TI_ST_CTRL 8 bit Time Stamp Timer Ctrl Reg (YUKON only) */
-+/* GMAC_TI_ST_CTRL 8 bit Time Stamp Timer Ctrl Reg (YUKON only) */
- /* Bit 7.. 3: reserved */
- #define GMT_ST_START BIT_2S /* Start Time Stamp Timer */
- #define GMT_ST_STOP BIT_1S /* Stop Time Stamp Timer */
-@@ -1766,13 +1780,13 @@ extern "C" {
- #define GMAC_DEF_MSK (GM_IS_TX_CO_OV | GM_IS_RX_CO_OV | \
- GM_IS_TX_FF_UR)
-
--/* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */
-+/* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */
- /* Bits 15.. 2: reserved */
- #define GMLC_RST_CLR BIT_1S /* Clear GMAC Link Reset */
- #define GMLC_RST_SET BIT_0S /* Set GMAC Link Reset */
-
-
--/* WOL_CTRL_STAT 16 bit WOL Control/Status Reg */
-+/* WOL_CTRL_STAT 16 bit WOL Control/Status Reg */
- #define WOL_CTL_LINK_CHG_OCC BIT_15S
- #define WOL_CTL_MAGIC_PKT_OCC BIT_14S
- #define WOL_CTL_PATTERN_OCC BIT_13S
-@@ -1801,7 +1815,7 @@ extern "C" {
- WOL_CTL_DIS_PATTERN_UNIT | \
- WOL_CTL_DIS_MAGIC_PKT_UNIT)
-
--/* WOL_MATCH_CTL 8 bit WOL Match Control Reg */
-+/* WOL_MATCH_CTL 8 bit WOL Match Control Reg */
- #define WOL_CTL_PATT_ENA(x) (BIT_0 << (x))
-
- #define SK_NUM_WOL_PATTERN 7
---- linux-2.6.0/drivers/net/sk98lin/h/skgehwt.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skgehwt.h 2003-12-28 23:21:01.000000000 -0800
-@@ -1,9 +1,9 @@
- /******************************************************************************
- *
- * Name: skhwt.h
-- * Project: Gigabit Ethernet Adapters, Schedule-Modul
-- * Version: $Revision: 1.6 $
-- * Date: $Date: 2003/05/13 17:57:48 $
-+ * Project: Gigabit Ethernet Adapters, Event Scheduler Module
-+ * Version: $Revision: 1.7 $
-+ * Date: $Date: 2003/09/16 12:55:08 $
- * Purpose: Defines for the hardware timer functions
- *
- ******************************************************************************/
-@@ -27,6 +27,9 @@
- * History:
- *
- * $Log: skgehwt.h,v $
-+ * Revision 1.7 2003/09/16 12:55:08 rschmidt
-+ * Editorial changes
-+ *
- * Revision 1.6 2003/05/13 17:57:48 mkarl
- * Editorial changes.
- *
-@@ -34,7 +37,7 @@
- * Changed license header to GPL.
- *
- * Revision 1.4 1998/08/19 09:50:58 gklug
-- * fix: remove struct keyword from c-code (see CCC) add typedefs
-+ * fix: remove struct keyword from C-code (see CCC) add typedefs
- *
- * Revision 1.3 1998/08/14 07:09:29 gklug
- * fix: chg pAc -> pAC
-@@ -44,10 +47,6 @@
- *
- * Revision 1.1 1998/08/07 09:32:58 gklug
- * first version
-- *
-- *
-- *
-- *
- *
- ******************************************************************************/
-
-@@ -64,14 +63,14 @@
- * - use in Adapters context name pAC->Hwt
- */
- typedef struct s_Hwt {
-- SK_U32 TStart ; /* HWT start */
-- SK_U32 TStop ; /* HWT stop */
-- int TActive ; /* HWT: flag : active/inactive */
-+ SK_U32 TStart; /* HWT start */
-+ SK_U32 TStop; /* HWT stop */
-+ int TActive; /* HWT: flag : active/inactive */
- } SK_HWT;
-
- extern void SkHwtInit(SK_AC *pAC, SK_IOC Ioc);
- extern void SkHwtStart(SK_AC *pAC, SK_IOC Ioc, SK_U32 Time);
- extern void SkHwtStop(SK_AC *pAC, SK_IOC Ioc);
--extern SK_U32 SkHwtRead(SK_AC *pAC,SK_IOC Ioc);
-+extern SK_U32 SkHwtRead(SK_AC *pAC, SK_IOC Ioc);
- extern void SkHwtIsr(SK_AC *pAC, SK_IOC Ioc);
- #endif /* _SKGEHWT_H_ */
---- linux-2.6.0/drivers/net/sk98lin/h/skgei2c.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skgei2c.h 2003-12-28 23:21:01.000000000 -0800
-@@ -1,16 +1,17 @@
- /******************************************************************************
- *
- * Name: skgei2c.h
-- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.23 $
-- * Date: $Date: 2002/12/19 14:34:27 $
-- * Purpose: Special GEnesis defines for TWSI
-+ * Project: Gigabit Ethernet Adapters, TWSI-Module
-+ * Version: $Revision: 1.25 $
-+ * Date: $Date: 2003/10/20 09:06:05 $
-+ * Purpose: Special defines for TWSI
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,6 +27,12 @@
- * History:
- *
- * $Log: skgei2c.h,v $
-+ * Revision 1.25 2003/10/20 09:06:05 rschmidt
-+ * Editorial changes.
-+ *
-+ * Revision 1.24 2003/09/23 09:31:15 malthoff
-+ * Parameter dev_size added to macro definition of SK_I2C_CTL.
-+ *
- * Revision 1.23 2002/12/19 14:34:27 rschmidt
- * Added cast in macros SK_I2C_SET_BIT() and SK_I2C_CLR_BIT()
- * Editorial changes (TWSI)
-@@ -107,8 +114,6 @@
- * Revision 1.1 1998/07/17 11:27:56 gklug
- * Created.
- *
-- *
-- *
- ******************************************************************************/
-
- /*
-@@ -121,12 +126,13 @@
- /*
- * Macros to access the B2_I2C_CTRL
- */
--#define SK_I2C_CTL(IoC, flag, dev, reg, burst) \
-+#define SK_I2C_CTL(IoC, flag, dev, dev_size, reg, burst) \
- SK_OUT32(IoC, B2_I2C_CTRL,\
- (flag ? 0x80000000UL : 0x0L) | \
-- (((SK_U32) reg << 16) & I2C_ADDR) | \
-- (((SK_U32) dev << 9) & I2C_DEV_SEL) | \
-- (( burst << 4) & I2C_BURST_LEN))
-+ (((SK_U32)reg << 16) & I2C_ADDR) | \
-+ (((SK_U32)dev << 9) & I2C_DEV_SEL) | \
-+ (dev_size & I2C_DEV_SIZE) | \
-+ ((burst << 4) & I2C_BURST_LEN))
-
- #define SK_I2C_STOP(IoC) { \
- SK_U32 I2cCtrl; \
-@@ -166,42 +172,42 @@
- */
- #define SK_LM80_VT_LSB 22 /* 22mV LSB resolution */
- #define SK_LM80_TEMP_LSB 10 /* 1 degree LSB resolution */
--#define SK_LM80_TEMPEXT_LSB 5 /* 0.5 degree LSB resolution for the
-- * extension value
-- */
--#define SK_LM80_FAN_FAKTOR ((22500L*60)/(1*2))
--/* formula: counter = (22500*60)/(rpm * divisor * pulses/2)
-+#define SK_LM80_TEMPEXT_LSB 5 /* 0.5 degree LSB resolution for ext. val. */
-+
-+/*
-+ * formula: counter = (22500*60)/(rpm * divisor * pulses/2)
- * assuming: 6500rpm, 4 pulses, divisor 1
- */
-+#define SK_LM80_FAN_FAKTOR ((22500L*60)/(1*2))
-
- /*
- * Define sensor management data
-- * Maximum is reached on copperfield with dual Broadcom.
-+ * Maximum is reached on Genesis copper dual port and Yukon-64
- * Board specific maximum is in pAC->I2c.MaxSens
- */
- #define SK_MAX_SENSORS 8 /* maximal no. of installed sensors */
- #define SK_MIN_SENSORS 5 /* minimal no. of installed sensors */
-
- /*
-- * To watch the statemachine (JS) use the timer in two ways instead of one as hitherto
-+ * To watch the state machine (SM) use the timer in two ways
-+ * instead of one as hitherto
- */
--#define SK_TIMER_WATCH_STATEMACHINE 0 /* Watch the statemachine to finish in a specific time */
--#define SK_TIMER_NEW_GAUGING 1 /* Start a new gauging when timer expires */
--
-+#define SK_TIMER_WATCH_SM 0 /* Watch the SM to finish in a spec. time */
-+#define SK_TIMER_NEW_GAUGING 1 /* Start a new gauging when timer expires */
-
- /*
-- * Defines for the individual Thresholds
-+ * Defines for the individual thresholds
- */
-
- /* Temperature sensor */
--#define SK_SEN_TEMP_HIGH_ERR 800 /* Temperature High Err Threshold */
-+#define SK_SEN_TEMP_HIGH_ERR 800 /* Temperature High Err Threshold */
- #define SK_SEN_TEMP_HIGH_WARN 700 /* Temperature High Warn Threshold */
- #define SK_SEN_TEMP_LOW_WARN 100 /* Temperature Low Warn Threshold */
--#define SK_SEN_TEMP_LOW_ERR 0 /* Temperature Low Err Threshold */
-+#define SK_SEN_TEMP_LOW_ERR 0 /* Temperature Low Err Threshold */
-
- /* VCC which should be 5 V */
--#define SK_SEN_PCI_5V_HIGH_ERR 5588 /* Voltage PCI High Err Threshold */
--#define SK_SEN_PCI_5V_HIGH_WARN 5346 /* Voltage PCI High Warn Threshold */
-+#define SK_SEN_PCI_5V_HIGH_ERR 5588 /* Voltage PCI High Err Threshold */
-+#define SK_SEN_PCI_5V_HIGH_WARN 5346 /* Voltage PCI High Warn Threshold */
- #define SK_SEN_PCI_5V_LOW_WARN 4664 /* Voltage PCI Low Warn Threshold */
- #define SK_SEN_PCI_5V_LOW_ERR 4422 /* Voltage PCI Low Err Threshold */
-
-@@ -229,17 +235,16 @@
- #define SK_SEN_PCI_IO_3V3_HIGH_ERR 3850 /* + 15% V PCI-IO High Err Threshold */
- #define SK_SEN_PCI_IO_3V3_HIGH_WARN 3674 /* + 10% V PCI-IO High Warn Threshold */
- /* 3300 mVolt */
--#define SK_SEN_PCI_IO_3V3_LOW_WARN 2926 /* - 10% V PCI-IO Low Warn Threshold */
--#define SK_SEN_PCI_IO_3V3_LOW_ERR 2772 /* - 15% V PCI-IO Low Err Threshold */
--
-+#define SK_SEN_PCI_IO_3V3_LOW_WARN 2926 /* - 10% V PCI-IO Low Warn Threshold */
-+#define SK_SEN_PCI_IO_3V3_LOW_ERR 2772 /* - 15% V PCI-IO Low Err Threshold */
-
- /*
- * VDD voltage
- */
--#define SK_SEN_VDD_HIGH_ERR 3630 /* Voltage ASIC High Err Threshold */
--#define SK_SEN_VDD_HIGH_WARN 3476 /* Voltage ASIC High Warn Threshold */
--#define SK_SEN_VDD_LOW_WARN 3146 /* Voltage ASIC Low Warn Threshold */
--#define SK_SEN_VDD_LOW_ERR 2970 /* Voltage ASIC Low Err Threshold */
-+#define SK_SEN_VDD_HIGH_ERR 3630 /* Voltage ASIC High Err Threshold */
-+#define SK_SEN_VDD_HIGH_WARN 3476 /* Voltage ASIC High Warn Threshold */
-+#define SK_SEN_VDD_LOW_WARN 3146 /* Voltage ASIC Low Warn Threshold */
-+#define SK_SEN_VDD_LOW_ERR 2970 /* Voltage ASIC Low Err Threshold */
-
- /*
- * PHY PLL 3V3 voltage
-@@ -255,8 +260,8 @@
- #define SK_SEN_VAUX_3V3_HIGH_ERR 3630 /* Voltage VAUX High Err Threshold */
- #define SK_SEN_VAUX_3V3_HIGH_WARN 3476 /* Voltage VAUX High Warn Threshold */
- #define SK_SEN_VAUX_3V3_LOW_WARN 3146 /* Voltage VAUX Low Warn Threshold */
--#define SK_SEN_VAUX_3V3_LOW_ERR 2970 /* Voltage VAUX Low Err Threshold */
--#define SK_SEN_VAUX_0V_WARN_ERR 0 /* if VAUX not present */
-+#define SK_SEN_VAUX_3V3_LOW_ERR 2970 /* Voltage VAUX Low Err Threshold */
-+#define SK_SEN_VAUX_0V_WARN_ERR 0 /* if VAUX not present */
- #define SK_SEN_VAUX_RANGE_LIMITER 1000 /* 1000 mV range delimiter */
-
- /*
-@@ -270,7 +275,7 @@
- /*
- * ASIC Core 1V5 voltage (YUKON only)
- */
--#define SK_SEN_CORE_1V5_HIGH_ERR 1650 /* Voltage ASIC Core High Err Threshold */
-+#define SK_SEN_CORE_1V5_HIGH_ERR 1650 /* Voltage ASIC Core High Err Threshold */
- #define SK_SEN_CORE_1V5_HIGH_WARN 1575 /* Voltage ASIC Core High Warn Threshold */
- #define SK_SEN_CORE_1V5_LOW_WARN 1425 /* Voltage ASIC Core Low Warn Threshold */
- #define SK_SEN_CORE_1V5_LOW_ERR 1350 /* Voltage ASIC Core Low Err Threshold */
-@@ -285,8 +290,8 @@
- */
- #define SK_SEN_FAN_HIGH_ERR 20000 /* FAN Speed High Err Threshold */
- #define SK_SEN_FAN_HIGH_WARN 20000 /* FAN Speed High Warn Threshold */
--#define SK_SEN_FAN_LOW_WARN 5200 /* FAN Speed Low Warn Threshold */
--#define SK_SEN_FAN_LOW_ERR 4550 /* FAN Speed Low Err Threshold */
-+#define SK_SEN_FAN_LOW_WARN 5200 /* FAN Speed Low Warn Threshold */
-+#define SK_SEN_FAN_LOW_ERR 4550 /* FAN Speed Low Err Threshold */
-
- /*
- * Some Voltages need dynamic thresholds
---- linux-2.6.0/drivers/net/sk98lin/h/skgeinit.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skgeinit.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skgeinit.h
- * Project: Gigabit Ethernet Adapters, Common Modules
-- * Version: $Revision: 1.81 $
-- * Date: $Date: 2003/07/04 12:30:38 $
-+ * Version: $Revision: 1.83 $
-+ * Date: $Date: 2003/09/16 14:07:37 $
- * Purpose: Structures and prototypes for the GE Init Module
- *
- ******************************************************************************/
-@@ -27,6 +27,23 @@
- * History:
- *
- * $Log: skgeinit.h,v $
-+ * Revision 1.83 2003/09/16 14:07:37 rschmidt
-+ * Moved defines for PHY power down modes from skgehw.h
-+ * Added prototypes for SkMacClearRst()
-+ * Editorial changes
-+ *
-+ * Revision 1.82 2003/09/16 07:18:36 mschmid
-+ * Added members to port structure for MAC control
-+ * - PMacColThres
-+ * - PMacJamLen
-+ * - PMacJamIpgVal
-+ * - PMacJamIpgData
-+ * - PMacIpgData
-+ * - PMacLimit4
-+ * Added PHY power state to port structure
-+ * - PPhyPowerState
-+ * Added function prototypes to enter and leave low power modes
-+ *
- * Revision 1.81 2003/07/04 12:30:38 rschmidt
- * Added SK_FAR to pointers in MAC statistic functions (for PXE)
- * Editorial changes
-@@ -594,6 +611,13 @@ extern "C" {
- #define SK_PRT_INIT 2 /* the port is initialized */
- #define SK_PRT_RUN 3 /* the port has an active link */
-
-+/* PHY power down modes */
-+#define PHY_PM_OPERATIONAL_MODE 0 /* PHY operational mode */
-+#define PHY_PM_DEEP_SLEEP 1 /* coma mode --> minimal power */
-+#define PHY_PM_IEEE_POWER_DOWN 2 /* IEEE 22.2.4.1.5 compl. power down */
-+#define PHY_PM_ENERGY_DETECT 3 /* energy detect */
-+#define PHY_PM_ENERGY_DETECT_PLUS 4 /* energy detect plus */
-+
- /* Default receive frame limit for Workaround of XMAC Errata */
- #define SK_DEF_RX_WA_LIM SK_CONSTU64(100)
-
-@@ -685,6 +709,13 @@ typedef struct s_GePort {
- SK_U8 PCableLen; /* Cable Length */
- SK_U8 PMdiPairLen[4]; /* MDI[0..3] Pair Length */
- SK_U8 PMdiPairSts[4]; /* MDI[0..3] Pair Diagnostic Status */
-+ SK_U8 PPhyPowerState; /* PHY current power state */
-+ int PMacColThres; /* MAC Collision Threshold */
-+ int PMacJamLen; /* MAC Jam length */
-+ int PMacJamIpgVal; /* MAC Jam IPG */
-+ int PMacJamIpgData; /* MAC IPG Jam to Data */
-+ int PMacIpgData; /* MAC Data IPG */
-+ SK_BOOL PMacLimit4; /* reset collision counter and backoff algorithm */
- } SK_GEPORT;
-
- /*
-@@ -865,6 +896,11 @@ extern void SkMacHardRst(
- SK_IOC IoC,
- int Port);
-
-+extern void SkMacClearRst(
-+ SK_AC *pAC,
-+ SK_IOC IoC,
-+ int Port);
-+
- extern void SkXmInitMac(
- SK_AC *pAC,
- SK_IOC IoC,
-@@ -1040,6 +1076,17 @@ extern int SkGmCableDiagStatus(
- int Port,
- SK_BOOL StartTest);
-
-+extern int SkGmEnterLowPowerMode(
-+ SK_AC *pAC,
-+ SK_IOC IoC,
-+ int Port,
-+ SK_U8 Mode);
-+
-+extern int SkGmLeaveLowPowerMode(
-+ SK_AC *pAC,
-+ SK_IOC IoC,
-+ int Port);
-+
- #ifdef SK_DIAG
- extern void SkGePhyRead(
- SK_AC *pAC,
-@@ -1101,6 +1148,7 @@ extern int SkGeInitAssignRamToQueues();
- extern void SkMacRxTxDisable();
- extern void SkMacSoftRst();
- extern void SkMacHardRst();
-+extern void SkMacClearRst();
- extern void SkMacInitPhy();
- extern int SkMacRxTxEnable();
- extern void SkMacPromiscMode();
-@@ -1131,6 +1179,8 @@ extern int SkGmResetCounter();
- extern int SkXmOverflowStatus();
- extern int SkGmOverflowStatus();
- extern int SkGmCableDiagStatus();
-+extern int SkGmEnterLowPowerMode();
-+extern int SkGmLeaveLowPowerMode();
-
- #ifdef SK_DIAG
- extern void SkGePhyRead();
---- linux-2.6.0/drivers/net/sk98lin/h/skgepnmi.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skgepnmi.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skgepnmi.h
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.61 $
-- * Date: $Date: 2003/05/23 12:53:52 $
-+ * Version: $Revision: 1.62 $
-+ * Date: $Date: 2003/08/15 12:31:52 $
- * Purpose: Defines for Private Network Management Interface
- *
- ****************************************************************************/
-@@ -27,6 +27,18 @@
- * History:
- *
- * $Log: skgepnmi.h,v $
-+ * Revision 1.62 2003/08/15 12:31:52 tschilli
-+ * Added new OIDs:
-+ * OID_SKGE_DRIVER_RELDATE
-+ * OID_SKGE_DRIVER_FILENAME
-+ * OID_SKGE_CHIPID
-+ * OID_SKGE_RAMSIZE
-+ * OID_SKGE_VAUXAVAIL
-+ * OID_SKGE_PHY_TYPE
-+ * OID_SKGE_PHY_LP_MODE
-+ *
-+ * Added new define SK_DIAG_ATTACHED for OID_SKGE_DIAG_MODE handling.
-+ *
- * Revision 1.61 2003/05/23 12:53:52 tschilli
- * Generic PNMI IOCTL subcommands added.
- * Function prototype SkPnmiGenIoctl() added.
-@@ -568,15 +580,23 @@
- #define OID_SKGE_ALL_DATA 0xFF020190
-
- /* Defines for VCT. */
--#define OID_SKGE_VCT_GET 0xFF020200
--#define OID_SKGE_VCT_SET 0xFF020201
--#define OID_SKGE_VCT_STATUS 0xFF020202
-+#define OID_SKGE_VCT_GET 0xFF020200
-+#define OID_SKGE_VCT_SET 0xFF020201
-+#define OID_SKGE_VCT_STATUS 0xFF020202
-
- #ifdef SK_DIAG_SUPPORT
- /* Defines for driver DIAG mode. */
--#define OID_SKGE_DIAG_MODE 0xFF020204
-+#define OID_SKGE_DIAG_MODE 0xFF020204
- #endif /* SK_DIAG_SUPPORT */
-
-+/* New OIDs */
-+#define OID_SKGE_DRIVER_RELDATE 0xFF020210
-+#define OID_SKGE_DRIVER_FILENAME 0xFF020211
-+#define OID_SKGE_CHIPID 0xFF020212
-+#define OID_SKGE_RAMSIZE 0xFF020213
-+#define OID_SKGE_VAUXAVAIL 0xFF020214
-+#define OID_SKGE_PHY_TYPE 0xFF020215
-+#define OID_SKGE_PHY_LP_MODE 0xFF020216
-
- /* VCT struct to store a backup copy of VCT data after a port reset. */
- typedef struct s_PnmiVct {
-@@ -613,6 +633,12 @@ typedef struct s_PnmiVct {
- #define OID_SKGE_TRAP_RLMT_PORT_UP 523
- #define OID_SKGE_TRAP_RLMT_SEGMENTATION 524
-
-+#ifdef SK_DIAG_SUPPORT
-+/* Defines for driver DIAG mode. */
-+#define SK_DIAG_ATTACHED 2
-+#define SK_DIAG_RUNNING 1
-+#define SK_DIAG_IDLE 0
-+#endif /* SK_DIAG_SUPPORT */
-
- /*
- * Generic PNMI IOCTL subcommand definitions.
-@@ -730,6 +756,14 @@ typedef struct s_PnmiVct {
- #define SK_PNMI_ERR051MSG "SkPnmiEvent: Port switch suspicious"
- #define SK_PNMI_ERR052 (SK_ERRBASE_PNMI + 52)
- #define SK_PNMI_ERR052MSG ""
-+#define SK_PNMI_ERR053 (SK_ERRBASE_PNMI + 53)
-+#define SK_PNMI_ERR053MSG "General: Driver release date not initialized"
-+#define SK_PNMI_ERR054 (SK_ERRBASE_PNMI + 54)
-+#define SK_PNMI_ERR054MSG "General: Driver release date string too long"
-+#define SK_PNMI_ERR055 (SK_ERRBASE_PNMI + 55)
-+#define SK_PNMI_ERR055MSG "General: Driver file name not initialized"
-+#define SK_PNMI_ERR056 (SK_ERRBASE_PNMI + 56)
-+#define SK_PNMI_ERR056MSG "General: Driver file name string too long"
-
- /*
- * Management counter macros called by the driver
-@@ -740,6 +774,11 @@ typedef struct s_PnmiVct {
- #define SK_PNMI_SET_DRIVER_VER(pAC,v) ((pAC)->Pnmi.pDriverVersion = \
- (char *)(v))
-
-+#define SK_PNMI_SET_DRIVER_RELDATE(pAC,v) ((pAC)->Pnmi.pDriverReleaseDate = \
-+ (char *)(v))
-+
-+#define SK_PNMI_SET_DRIVER_FILENAME(pAC,v) ((pAC)->Pnmi.pDriverFileName = \
-+ (char *)(v))
-
- #define SK_PNMI_CNT_TX_QUEUE_LEN(pAC,v,p) \
- { \
-@@ -916,6 +955,8 @@ typedef struct s_PnmiConf {
- char ConfMacFactoryAddr[6];
- SK_U8 ConfPMD;
- SK_U8 ConfConnector;
-+ SK_U32 ConfPhyType;
-+ SK_U32 ConfPhyMode;
- SK_U8 ConfLinkCapability;
- SK_U8 ConfLinkMode;
- SK_U8 ConfLinkModeStatus;
-@@ -964,9 +1005,14 @@ typedef struct s_PnmiStrucData {
- SK_U32 DeviceType;
- char DriverDescr[SK_PNMI_STRINGLEN1];
- char DriverVersion[SK_PNMI_STRINGLEN2];
-+ char DriverReleaseDate[SK_PNMI_STRINGLEN1];
-+ char DriverFileName[SK_PNMI_STRINGLEN1];
- char HwDescr[SK_PNMI_STRINGLEN1];
- char HwVersion[SK_PNMI_STRINGLEN2];
- SK_U16 Chipset;
-+ SK_U32 ChipId;
-+ SK_U8 VauxAvail;
-+ SK_U32 RamSize;
- SK_U32 MtuSize;
- SK_U32 Action;
- SK_U32 TestResult;
-@@ -1090,6 +1136,8 @@ typedef struct s_PnmiData {
-
- char *pDriverDescription;
- char *pDriverVersion;
-+ char *pDriverReleaseDate;
-+ char *pDriverFileName;
-
- int MacUpdatedFlag;
- int RlmtUpdatedFlag;
-@@ -1119,6 +1167,9 @@ typedef struct s_PnmiData {
- SK_U8 VctStatus[SK_MAX_MACS];
- SK_PNMI_VCT VctBackup[SK_MAX_MACS];
- SK_PNMI_VCT_TIMER VctTimeout[SK_MAX_MACS];
-+#ifdef SK_DIAG_SUPPORT
-+ SK_U32 DiagAttached;
-+#endif /* SK_DIAG_SUPPORT */
- } SK_PNMI;
-
-
---- linux-2.6.0/drivers/net/sk98lin/h/ski2c.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/ski2c.h 2003-12-28 23:21:01.000000000 -0800
-@@ -1,16 +1,17 @@
- /******************************************************************************
- *
- * Name: ski2c.h
-- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.34 $
-- * Date: $Date: 2003/01/28 09:11:21 $
-+ * Project: Gigabit Ethernet Adapters, TWSI-Module
-+ * Version: $Revision: 1.35 $
-+ * Date: $Date: 2003/10/20 09:06:30 $
- * Purpose: Defines to access Voltage and Temperature Sensor
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,6 +27,10 @@
- * History:
- *
- * $Log: ski2c.h,v $
-+ * Revision 1.35 2003/10/20 09:06:30 rschmidt
-+ * Added prototypes for SkI2cRead() and SkI2cWrite().
-+ * Editorial changes.
-+ *
- * Revision 1.34 2003/01/28 09:11:21 rschmidt
- * Editorial changes
- *
-@@ -137,7 +142,6 @@
- * Revision 1.1 1998/06/19 14:30:10 malthoff
- * Created. Sources taken from ML Project.
- *
-- *
- ******************************************************************************/
-
- /*
-@@ -252,7 +256,7 @@ struct s_Sensor {
- SK_I32 SenThreWarnLow; /* Lower warning Threshold of the sensor */
- int SenErrFlag; /* Sensor indicated an error */
- SK_BOOL SenInit; /* Is sensor initialized ? */
-- SK_U64 SenErrCts; /* Error trap counter */
-+ SK_U64 SenErrCts; /* Error trap counter */
- SK_U64 SenWarnCts; /* Warning trap counter */
- SK_U64 SenBegErrTS; /* Begin error timestamp */
- SK_U64 SenBegWarnTS; /* Begin warning timestamp */
-@@ -279,13 +283,17 @@ typedef struct s_I2c {
- #endif /* !SK_DIAG */
- } SK_I2C;
-
-+extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level);
-+extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size,
-+ int Reg, int Burst);
- extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen);
--#ifndef SK_DIAG
-+#ifdef SK_DIAG
-+extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg,
-+ int Burst);
-+#else /* !SK_DIAG */
- extern int SkI2cEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para);
--extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level);
- extern void SkI2cWaitIrq(SK_AC *pAC, SK_IOC IoC);
- extern void SkI2cIsr(SK_AC *pAC, SK_IOC IoC);
--
--#endif
-+#endif /* !SK_DIAG */
- #endif /* n_SKI2C_H */
-
---- linux-2.6.0/drivers/net/sk98lin/h/skqueue.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skqueue.h 2003-12-28 23:21:01.000000000 -0800
-@@ -1,9 +1,9 @@
- /******************************************************************************
- *
- * Name: skqueue.h
-- * Project: Gigabit Ethernet Adapters, Schedule-Modul
-- * Version: $Revision: 1.15 $
-- * Date: $Date: 2003/05/13 17:54:57 $
-+ * Project: Gigabit Ethernet Adapters, Event Scheduler Module
-+ * Version: $Revision: 1.16 $
-+ * Date: $Date: 2003/09/16 12:50:32 $
- * Purpose: Defines for the Event queue
- *
- ******************************************************************************/
-@@ -27,6 +27,9 @@
- * History:
- *
- * $Log: skqueue.h,v $
-+ * Revision 1.16 2003/09/16 12:50:32 rschmidt
-+ * Editorial changes
-+ *
- * Revision 1.15 2003/05/13 17:54:57 mkarl
- * Editorial changes.
- *
-@@ -47,7 +50,7 @@
- * add: typedef SK_QUEUE
- *
- * Revision 1.9 1998/08/19 09:50:59 gklug
-- * fix: remove struct keyword from c-code (see CCC) add typedefs
-+ * fix: remove struct keyword from C-code (see CCC) add typedefs
- *
- * Revision 1.8 1998/08/18 07:00:01 gklug
- * fix: SK_PTR not defined use void * instead.
-@@ -74,8 +77,6 @@
- * Revision 1.1 1998/07/30 14:52:12 gklug
- * Initial version.
- * Defines Event Classes, Event structs and queue management variables.
-- *
-- *
- *
- ******************************************************************************/
-
-@@ -92,7 +93,7 @@
- */
- #define SKGE_DRV 1 /* Driver Event Class */
- #define SKGE_RLMT 2 /* RLMT Event Class */
--#define SKGE_I2C 3 /* i2C Event Class */
-+#define SKGE_I2C 3 /* I2C Event Class */
- #define SKGE_PNMI 4 /* PNMI Event Class */
- #define SKGE_CSUM 5 /* Checksum Event Class */
- #define SKGE_HWAC 6 /* Hardware Access Event Class */
-@@ -121,25 +122,25 @@ typedef union u_EvPara {
- * Event Queue
- * skqueue.c
- * events are class/value pairs
-- * class is addressee, e.g. RMT, PCM etc.
-+ * class is addressee, e.g. RLMT, PNMI etc.
- * value is command, e.g. line state change, ring op change etc.
- */
- typedef struct s_EventElem {
-- SK_U32 Class ; /* Event class */
-- SK_U32 Event ; /* Event value */
-- SK_EVPARA Para ; /* Event parameter */
-+ SK_U32 Class; /* Event class */
-+ SK_U32 Event; /* Event value */
-+ SK_EVPARA Para; /* Event parameter */
- } SK_EVENTELEM;
-
- typedef struct s_Queue {
- SK_EVENTELEM EvQueue[SK_MAX_EVENT];
-- SK_EVENTELEM *EvPut ;
-- SK_EVENTELEM *EvGet ;
-+ SK_EVENTELEM *EvPut;
-+ SK_EVENTELEM *EvGet;
- } SK_QUEUE;
-
- extern void SkEventInit(SK_AC *pAC, SK_IOC Ioc, int Level);
- extern void SkEventQueue(SK_AC *pAC, SK_U32 Class, SK_U32 Event,
- SK_EVPARA Para);
--extern int SkEventDispatcher(SK_AC *pAC,SK_IOC Ioc);
-+extern int SkEventDispatcher(SK_AC *pAC, SK_IOC Ioc);
-
-
- /* Define Error Numbers and messages */
---- linux-2.6.0/drivers/net/sk98lin/h/sktimer.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/sktimer.h 2003-12-28 23:21:01.000000000 -0800
-@@ -1,9 +1,9 @@
- /******************************************************************************
- *
- * Name: sktimer.h
-- * Project: Gigabit Ethernet Adapters, Schedule-Modul
-- * Version: $Revision: 1.10 $
-- * Date: $Date: 2003/05/13 17:56:44 $
-+ * Project: Gigabit Ethernet Adapters, Event Scheduler Module
-+ * Version: $Revision: 1.11 $
-+ * Date: $Date: 2003/09/16 12:58:18 $
- * Purpose: Defines for the timer functions
- *
- ******************************************************************************/
-@@ -27,6 +27,9 @@
- * History:
- *
- * $Log: sktimer.h,v $
-+ * Revision 1.11 2003/09/16 12:58:18 rschmidt
-+ * Editorial changes
-+ *
- * Revision 1.10 2003/05/13 17:56:44 mkarl
- * Editorial changes.
- *
-@@ -40,7 +43,7 @@
- * fix: SK_TIMCTRL needs to be defined
- *
- * Revision 1.6 1998/08/19 09:51:00 gklug
-- * fix: remove struct keyword from c-code (see CCC) add typedefs
-+ * fix: remove struct keyword from C-code (see CCC) add typedefs
- *
- * Revision 1.5 1998/08/17 13:43:21 gklug
- * chg: Parameter will be union of 64bit para, 2 times SK_U32 or SK_PTR
-@@ -78,25 +81,25 @@
- typedef struct s_Timer SK_TIMER;
-
- struct s_Timer {
-- SK_TIMER *TmNext ; /* linked list */
-- SK_U32 TmClass ; /* Timer Event class */
-- SK_U32 TmEvent ; /* Timer Event value */
-- SK_EVPARA TmPara ; /* Timer Event parameter */
-- SK_U32 TmDelta ; /* delta time */
-- int TmActive ; /* flag : active/inactive */
--} ;
-+ SK_TIMER *TmNext; /* linked list */
-+ SK_U32 TmClass; /* Timer Event class */
-+ SK_U32 TmEvent; /* Timer Event value */
-+ SK_EVPARA TmPara; /* Timer Event parameter */
-+ SK_U32 TmDelta; /* delta time */
-+ int TmActive; /* flag: active/inactive */
-+};
-
- /*
- * Timer control struct.
- * - use in Adapters context name pAC->Tim
- */
- typedef struct s_TimCtrl {
-- SK_TIMER *StQueue ; /* Head of Timer queue */
--} SK_TIMCTRL ;
-+ SK_TIMER *StQueue; /* Head of Timer queue */
-+} SK_TIMCTRL;
-
--extern void SkTimerInit(SK_AC *pAC,SK_IOC Ioc, int Level);
--extern void SkTimerStop(SK_AC *pAC,SK_IOC Ioc,SK_TIMER *pTimer);
--extern void SkTimerStart(SK_AC *pAC,SK_IOC Ioc,SK_TIMER *pTimer,
-- SK_U32 Time,SK_U32 Class,SK_U32 Event,SK_EVPARA Para);
--extern void SkTimerDone(SK_AC *pAC,SK_IOC Ioc);
-+extern void SkTimerInit(SK_AC *pAC, SK_IOC Ioc, int Level);
-+extern void SkTimerStop(SK_AC *pAC, SK_IOC Ioc, SK_TIMER *pTimer);
-+extern void SkTimerStart(SK_AC *pAC, SK_IOC Ioc, SK_TIMER *pTimer,
-+ SK_U32 Time, SK_U32 Class, SK_U32 Event, SK_EVPARA Para);
-+extern void SkTimerDone(SK_AC *pAC, SK_IOC Ioc);
- #endif /* _SKTIMER_H_ */
---- linux-2.6.0/drivers/net/sk98lin/h/sktypes.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/sktypes.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,15 +2,16 @@
- *
- * Name: sktypes.h
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.1 $
-- * Date: $Date: 2003/07/21 07:26:01 $
-+ * Version: $Revision: 1.2 $
-+ * Date: $Date: 2003/10/07 08:16:51 $
- * Purpose: Define data types for Linux
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,6 +27,9 @@
- * History:
- *
- * $Log: sktypes.h,v $
-+ * Revision 1.2 2003/10/07 08:16:51 mlindner
-+ * Fix: Copyright changes
-+ *
- * Revision 1.1 2003/07/21 07:26:01 rroesler
- * Fix: Re-Enter after CVS crash
- *
---- linux-2.6.0/drivers/net/sk98lin/h/skversion.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/skversion.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,15 +2,16 @@
- *
- * Name: version.h
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.3 $
-- * Date: $Date: 2003/08/25 13:34:48 $
-+ * Version: $Revision: 1.5 $
-+ * Date: $Date: 2003/10/07 08:16:51 $
- * Purpose: SK specific Error log support
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -25,6 +26,12 @@
- *
- * History:
- * $Log: skversion.h,v $
-+ * Revision 1.5 2003/10/07 08:16:51 mlindner
-+ * Fix: Copyright changes
-+ *
-+ * Revision 1.4 2003/09/22 08:40:10 mlindner
-+ * Add: Added DRIVER_FILE_NAME and DRIVER_REL_DATE
-+ *
- * Revision 1.3 2003/08/25 13:34:48 mlindner
- * Fix: Lint changes
- *
-@@ -54,12 +61,14 @@
- #ifdef lint
- static const char SysKonnectFileId[] = "@(#) (C) SysKonnect GmbH.";
- static const char SysKonnectBuildNumber[] =
-- "@(#)SK-BUILD: 6.18 PL: 01";
-+ "@(#)SK-BUILD: 6.21 PL: 01";
- #endif /* !defined(lint) */
-
--#define BOOT_STRING "sk98lin: Network Device Driver v6.18\n" \
-+#define BOOT_STRING "sk98lin: Network Device Driver v6.21\n" \
- "(C)Copyright 1999-2003 Marvell(R)."
-
--#define VER_STRING "6.18"
-+#define VER_STRING "6.21"
-+#define DRIVER_FILE_NAME "sk98lin"
-+#define DRIVER_REL_DATE "Dec-15-2003"
-
-
---- linux-2.6.0/drivers/net/sk98lin/h/xmac_ii.h 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/h/xmac_ii.h 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: xmac_ii.h
- * Project: Gigabit Ethernet Adapters, Common Modules
-- * Version: $Revision: 1.48 $
-- * Date: $Date: 2003/05/13 17:17:55 $
-+ * Version: $Revision: 1.52 $
-+ * Date: $Date: 2003/10/02 16:35:50 $
- * Purpose: Defines and Macros for Gigabit Ethernet Controller
- *
- ******************************************************************************/
-@@ -27,6 +27,22 @@
- * History:
- *
- * $Log: xmac_ii.h,v $
-+ * Revision 1.52 2003/10/02 16:35:50 rschmidt
-+ * Added defines for default values of GMAC parameters
-+ * Changed defines for setting GMAC parameters
-+ * Editorial changes
-+ *
-+ * Revision 1.51 2003/09/23 09:04:27 malthoff
-+ * Add bit definitions for PHY_MARV_EXT_P_STAT.
-+ *
-+ * Revision 1.50 2003/09/16 14:15:07 rschmidt
-+ * Added defines for Extended PHY Specific Control
-+ * Editorial changes
-+ *
-+ * Revision 1.49 2003/09/16 07:22:46 mschmid
-+ * Added defines for Marvell PHY energy detect modes
-+ * Added macros for MAC parameter setting in port structure
-+ *
- * Revision 1.48 2003/05/13 17:17:55 mkarl
- * Editorial changes.
- *
-@@ -676,7 +692,7 @@ extern "C" {
- #define PHY_XMAC_AUNE_LP 0x05 /* 16 bit r/o Link Partner Abi Reg */
- #define PHY_XMAC_AUNE_EXP 0x06 /* 16 bit r/o Auto-Neg. Expansion Reg */
- #define PHY_XMAC_NEPG 0x07 /* 16 bit r/w Next Page Register */
--#define PHY_XMAC_NEPG_LP 0x08 /* 16 bit r/o Next Page Link P Reg */
-+#define PHY_XMAC_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
- /* 0x09 - 0x0e: reserved */
- #define PHY_XMAC_EXT_STAT 0x0f /* 16 bit r/o Ext Status Register */
- #define PHY_XMAC_RES_ABI 0x10 /* 16 bit r/o PHY Resolved Ability */
-@@ -693,7 +709,7 @@ extern "C" {
- #define PHY_BCOM_AUNE_LP 0x05 /* 16 bit r/o Link Part Ability Reg */
- #define PHY_BCOM_AUNE_EXP 0x06 /* 16 bit r/o Auto-Neg. Expansion Reg */
- #define PHY_BCOM_NEPG 0x07 /* 16 bit r/w Next Page Register */
--#define PHY_BCOM_NEPG_LP 0x08 /* 16 bit r/o Next Page Link P Reg */
-+#define PHY_BCOM_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
- /* Broadcom-specific registers */
- #define PHY_BCOM_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Ctrl Reg */
- #define PHY_BCOM_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */
-@@ -702,7 +718,7 @@ extern "C" {
- #define PHY_BCOM_P_EXT_CTRL 0x10 /* 16 bit r/w PHY Extended Ctrl Reg */
- #define PHY_BCOM_P_EXT_STAT 0x11 /* 16 bit r/o PHY Extended Stat Reg */
- #define PHY_BCOM_RE_CTR 0x12 /* 16 bit r/w Receive Error Counter */
--#define PHY_BCOM_FC_CTR 0x13 /* 16 bit r/w False Carr Sense Cnt */
-+#define PHY_BCOM_FC_CTR 0x13 /* 16 bit r/w False Carrier Sense Cnt */
- #define PHY_BCOM_RNO_CTR 0x14 /* 16 bit r/w Receiver NOT_OK Cnt */
- /* 0x15 - 0x17: reserved */
- #define PHY_BCOM_AUX_CTRL 0x18 /* 16 bit r/w Auxiliary Control Reg */
-@@ -724,7 +740,7 @@ extern "C" {
- #define PHY_MARV_AUNE_LP 0x05 /* 16 bit r/o Link Part Ability Reg */
- #define PHY_MARV_AUNE_EXP 0x06 /* 16 bit r/o Auto-Neg. Expansion Reg */
- #define PHY_MARV_NEPG 0x07 /* 16 bit r/w Next Page Register */
--#define PHY_MARV_NEPG_LP 0x08 /* 16 bit r/o Next Page Link P Reg */
-+#define PHY_MARV_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
- /* Marvel-specific registers */
- #define PHY_MARV_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Ctrl Reg */
- #define PHY_MARV_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */
-@@ -757,7 +773,7 @@ extern "C" {
- #define PHY_LONE_AUNE_LP 0x05 /* 16 bit r/o Link Part Ability Reg */
- #define PHY_LONE_AUNE_EXP 0x06 /* 16 bit r/o Auto-Neg. Expansion Reg */
- #define PHY_LONE_NEPG 0x07 /* 16 bit r/w Next Page Register */
--#define PHY_LONE_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner*/
-+#define PHY_LONE_NEPG_LP 0x08 /* 16 bit r/o Next Page Link Partner */
- /* Level One-specific registers */
- #define PHY_LONE_1000T_CTRL 0x09 /* 16 bit r/w 1000Base-T Control Reg*/
- #define PHY_LONE_1000T_STAT 0x0a /* 16 bit r/o 1000Base-T Status Reg */
-@@ -804,12 +820,13 @@ extern "C" {
- /*
- * PHY bit definitions
- * Bits defined as PHY_X_..., PHY_B_..., PHY_L_... or PHY_N_... are
-- * Xmac/Broadcom/LevelOne/National-specific.
-+ * XMAC/Broadcom/LevelOne/National/Marvell-specific.
- * All other are general.
- */
-
- /***** PHY_XMAC_CTRL 16 bit r/w PHY Control Register *****/
- /***** PHY_BCOM_CTRL 16 bit r/w PHY Control Register *****/
-+/***** PHY_MARV_CTRL 16 bit r/w PHY Status Register *****/
- /***** PHY_LONE_CTRL 16 bit r/w PHY Control Register *****/
- #define PHY_CT_RESET (1<<15) /* Bit 15: (sc) clear all PHY related regs */
- #define PHY_CT_LOOP (1<<14) /* Bit 14: enable Loopback over PHY */
-@@ -909,27 +926,20 @@ extern "C" {
-
- /***** PHY_XMAC_AUNE_EXP 16 bit r/o Auto-Negotiation Expansion Reg *****/
- /* Bit 15..4: reserved */
--#define PHY_AN_LP_NP (1<<3) /* Bit 3: Link Partner can Next Page */
--#define PHY_AN_LOC_NP (1<<2) /* Bit 2: Local PHY can Next Page */
--#define PHY_AN_RX_PG (1<<1) /* Bit 1: Page Received */
-+#define PHY_ANE_LP_NP (1<<3) /* Bit 3: Link Partner can Next Page */
-+#define PHY_ANE_LOC_NP (1<<2) /* Bit 2: Local PHY can Next Page */
-+#define PHY_ANE_RX_PG (1<<1) /* Bit 1: Page Received */
- /* Bit 0: reserved */
-
- /***** PHY_BCOM_AUNE_EXP 16 bit r/o Auto-Negotiation Expansion Reg *****/
-- /* Bit 15..5: reserved */
--#define PHY_B_AN_PDF (1<<4) /* Bit 4: Parallel Detection Fault */
--/* PHY_AN_LP_NP (see XMAC) Bit 3: Link Partner can Next Page */
--/* PHY_AN_LOC_NP (see XMAC) Bit 2: Local PHY can Next Page */
--/* PHY_AN_RX_PG (see XMAC) Bit 1: Page Received */
--#define PHY_B_AN_LP_CAP (1<<0) /* Bit 0: Link Partner Auto-Neg. Cap. */
--
- /***** PHY_LONE_AUNE_EXP 16 bit r/o Auto-Negotiation Expansion Reg *****/
--#define PHY_L_AN_BP (1<<5) /* Bit 5: Base Page Indication */
--#define PHY_L_AN_PDF (1<<4) /* Bit 4: Parallel Detection Fault */
--/* PHY_AN_LP_NP (see XMAC) Bit 3: Link Partner can Next Page */
--/* PHY_AN_LOC_NP (see XMAC) Bit 2: Local PHY can Next Page */
--/* PHY_AN_RX_PG (see XMAC) Bit 1: Page Received */
--#define PHY_B_AN_LP_CAP (1<<0) /* Bit 0: Link Partner Auto-Neg. Cap. */
--
-+/***** PHY_MARV_AUNE_EXP 16 bit r/o Auto-Negotiation Expansion Reg *****/
-+ /* Bit 15..5: reserved */
-+#define PHY_ANE_PAR_DF (1<<4) /* Bit 4: Parallel Detection Fault */
-+/* PHY_ANE_LP_NP (see XMAC) Bit 3: Link Partner can Next Page */
-+/* PHY_ANE_LOC_NP (see XMAC) Bit 2: Local PHY can Next Page */
-+/* PHY_ANE_RX_PG (see XMAC) Bit 1: Page Received */
-+#define PHY_ANE_LP_CAP (1<<0) /* Bit 0: Link Partner Auto-Neg. Cap. */
-
- /***** PHY_XMAC_NEPG 16 bit r/w Next Page Register *****/
- /***** PHY_BCOM_NEPG 16 bit r/w Next Page Register *****/
-@@ -958,7 +968,7 @@ extern "C" {
- #define PHY_X_RS_HD (1<<6) /* Bit 6: Half Duplex Mode selected */
- #define PHY_X_RS_FD (1<<5) /* Bit 5: Full Duplex Mode selected */
- #define PHY_X_RS_ABLMIS (1<<4) /* Bit 4: duplex or pause cap mismatch */
--#define PHY_X_RS_PAUMIS (1<<3) /* Bit 3: pause capability missmatch */
-+#define PHY_X_RS_PAUMIS (1<<3) /* Bit 3: pause capability mismatch */
- /* Bit 2..0: reserved */
- /*
- * Remote Fault Bits (PHY_X_AN_RFB) encoding
-@@ -990,6 +1000,7 @@ extern "C" {
- /* Bit 7..0: reserved */
-
- /***** PHY_BCOM_1000T_STAT 16 bit r/o 1000Base-T Status Reg *****/
-+/***** PHY_MARV_1000T_STAT 16 bit r/o 1000Base-T Status Reg *****/
- #define PHY_B_1000S_MSF (1<<15) /* Bit 15: Master/Slave Fault */
- #define PHY_B_1000S_MSR (1<<14) /* Bit 14: Master/Slave Result */
- #define PHY_B_1000S_LRS (1<<13) /* Bit 13: Local Receiver Status */
-@@ -1309,7 +1320,6 @@ extern "C" {
- /* Bit 7..0: reserved */
-
- /***** PHY_MARV_PHY_CTRL 16 bit r/w PHY Specific Ctrl Reg *****/
--
- #define PHY_M_PC_TX_FFD_MSK (3<<14) /* Bit 15..14: Tx FIFO Depth Mask */
- #define PHY_M_PC_RX_FFD_MSK (3<<12) /* Bit 13..12: Rx FIFO Depth Mask */
- #define PHY_M_PC_ASS_CRS_TX (1<<11) /* Bit 11: Assert CRS on Transmit */
-@@ -1323,6 +1333,9 @@ extern "C" {
- #define PHY_M_PC_POL_R_DIS (1<<1) /* Bit 1: Polarity Reversal Disabled */
- #define PHY_M_PC_DIS_JABBER (1<<0) /* Bit 0: Disable Jabber */
-
-+#define PHY_M_PC_EN_DET SHIFT8(2) /* Energy Detect (Mode 1) */
-+#define PHY_M_PC_EN_DET_PLUS SHIFT8(3) /* Energy Detect Plus (Mode 2) */
-+
- #define PHY_M_PC_MDI_XMODE(x) SHIFT5(x)
- #define PHY_M_PC_MAN_MDI 0 /* 00 = Manual MDI configuration */
- #define PHY_M_PC_MAN_MDIX 1 /* 01 = Manual MDIX configuration */
-@@ -1373,6 +1386,7 @@ extern "C" {
- #define PHY_M_EC_M_DSC_MSK (3<<10) /* Bit 11..10: Master downshift counter */
- #define PHY_M_EC_S_DSC_MSK (3<<8) /* Bit 9.. 8: Slave downshift counter */
- #define PHY_M_EC_MAC_S_MSK (7<<4) /* Bit 6.. 4: Def. MAC interface speed */
-+#define PHY_M_EC_FIB_AN_ENA (1<<3) /* Bit 3: Fiber Auto-Neg. Enable */
-
- #define PHY_M_EC_M_DSC(x) SHIFT10(x) /* 00=1x; 01=2x; 10=3x; 11=4x */
- #define PHY_M_EC_S_DSC(x) SHIFT8(x) /* 00=dis; 01=1x; 10=2x; 11=3x */
-@@ -1434,6 +1448,18 @@ extern "C" {
- #define PHY_M_EC2_FO_BOOST (1<<3) /* Bit 3: Fiber Output Boost */
- #define PHY_M_EC2_FO_AM_MSK 7 /* Bit 2.. 0: Fiber Output Amplitude */
-
-+/***** PHY_MARV_EXT_P_STAT 16 bit r/w Ext. PHY Specific Status *****/
-+#define PHY_M_FC_AUTO_SEL (1<<15) /* Bit 15: Fiber/Copper Auto Sel. dis. */
-+#define PHY_M_FC_AN_REG_ACC (1<<14) /* Bit 14: Fiber/Copper Autoneg. reg acc */
-+#define PHY_M_FC_RESULUTION (1<<13) /* Bit 13: Fiber/Copper Resulution */
-+#define PHY_M_SER_IF_AN_BP (1<<12) /* Bit 12: Ser IF autoneg. bypass enable */
-+#define PHY_M_SER_IF_BP_ST (1<<11) /* Bit 11: Ser IF autoneg. bypass status */
-+#define PHY_M_IRQ_POLARITY (1<<10) /* Bit 10: IRQ polarity */
-+ /* Bit 9..4: reserved */
-+#define PHY_M_UNDOC1 (1<< 7) /* undocumented bit !! */
-+#define PHY_M_MODE_MASK (0xf<<0)/* Bit 3..0: copy of HWCFG MODE[3:0] */
-+
-+
- /***** PHY_MARV_CABLE_DIAG 16 bit r/o Cable Diagnostic Reg *****/
- #define PHY_M_CABD_ENA_TEST (1<<15) /* Bit 15: Enable Test */
- #define PHY_M_CABD_STAT_MSK (3<<13) /* Bit 14..13: Status */
-@@ -1531,7 +1557,7 @@ extern "C" {
- #define GM_RXF_SHT \
- (GM_MIB_CNT_BASE + 80) /* Frames <64 Byte Received OK */
- #define GM_RXE_FRAG \
-- (GM_MIB_CNT_BASE + 88) /* Frames <64 Byte Receeived with FCS Err */
-+ (GM_MIB_CNT_BASE + 88) /* Frames <64 Byte Received with FCS Err */
- #define GM_RXF_64B \
- (GM_MIB_CNT_BASE + 96) /* 64 Byte Rx Frame */
- #define GM_RXF_127B \
-@@ -1606,7 +1632,6 @@ extern "C" {
- */
-
- /* GM_GP_STAT 16 bit r/o General Purpose Status Register */
--
- #define GM_GPSR_SPEED (1<<15) /* Bit 15: Port Speed (1 = 100 Mbps) */
- #define GM_GPSR_DUPLEX (1<<14) /* Bit 14: Duplex Mode (1 = Full) */
- #define GM_GPSR_FC_TX_DIS (1<<13) /* Bit 13: Tx Flow-Control Mode Disabled */
-@@ -1646,11 +1671,14 @@ extern "C" {
- GM_GPCR_AU_SPD_DIS)
-
- /* GM_TX_CTRL 16 bit r/w Transmit Control Register */
--
- #define GM_TXCR_FORCE_JAM (1<<15) /* Bit 15: Force Jam / Flow-Control */
- #define GM_TXCR_CRC_DIS (1<<14) /* Bit 14: Disable insertion of CRC */
- #define GM_TXCR_PAD_DIS (1<<13) /* Bit 13: Disable padding of packets */
--#define GM_TXCR_COL_THR (4<<10) /* Bit 12..10: Collision Threshold */
-+#define GM_TXCR_COL_THR_MSK (1<<10) /* Bit 12..10: Collision Threshold */
-+
-+#define TX_COL_THR(x) (SHIFT10(x) & GM_TXCR_COL_THR_MSK)
-+
-+#define TX_COL_DEF 0x04
-
- /* GM_RX_CTRL 16 bit r/w Receive Control Register */
- #define GM_RXCR_UCF_ENA (1<<15) /* Bit 15: Enable Unicast filtering */
-@@ -1663,35 +1691,41 @@ extern "C" {
- #define GM_TXPA_JAMIPG_MSK (0x1f<<9) /* Bit 13..9: Jam IPG */
- #define GM_TXPA_JAMDAT_MSK (0x1f<<4) /* Bit 8..4: IPG Jam to Data */
- /* Bit 3..0: reserved */
--#define JAM_LEN_VAL(x) SHIFT14(x)
--#define JAM_IPG_VAL(x) SHIFT9(x)
--#define IPG_JAM_DATA(x) SHIFT4(x)
-+
-+#define TX_JAM_LEN_VAL(x) (SHIFT14(x) & GM_TXPA_JAMLEN_MSK)
-+#define TX_JAM_IPG_VAL(x) (SHIFT9(x) & GM_TXPA_JAMIPG_MSK)
-+#define TX_IPG_JAM_DATA(x) (SHIFT4(x) & GM_TXPA_JAMDAT_MSK)
-+
-+#define TX_JAM_LEN_DEF 0x03
-+#define TX_JAM_IPG_DEF 0x0b
-+#define TX_IPG_JAM_DEF 0x1c
-
- /* GM_SERIAL_MODE 16 bit r/w Serial Mode Register */
--#define GM_SMOD_DATABL_MSK (0x1f<<11) /* Bit 15..11: Data Blinder */
-+#define GM_SMOD_DATABL_MSK (0x1f<<11) /* Bit 15..11: Data Blinder (r/o) */
- #define GM_SMOD_LIMIT_4 (1<<10) /* Bit 10: 4 consecutive Tx trials */
- #define GM_SMOD_VLAN_ENA (1<<9) /* Bit 9: Enable VLAN (Max. Frame Len) */
- #define GM_SMOD_JUMBO_ENA (1<<8) /* Bit 8: Enable Jumbo (Max. Frame Len) */
- /* Bit 7..5: reserved */
- #define GM_SMOD_IPG_MSK 0x1f /* Bit 4..0: Inter-Packet Gap (IPG) */
-
--#define DATA_BLIND_VAL(x) SHIFT11(x)
--#define DATA_BLIND_FAST_ETH 0x1c
--#define DATA_BLIND_GIGABIT 4
-+#define DATA_BLIND_VAL(x) (SHIFT11(x) & GM_SMOD_DATABL_MSK)
-+#define DATA_BLIND_DEF 0x04
-
--#define IPG_VAL_FAST_ETH 0x1e
--#define IPG_VAL_GIGABIT 6
-+#define IPG_DATA_VAL(x) (x & GM_SMOD_IPG_MSK)
-+#define IPG_DATA_DEF 0x1e
-
- /* GM_SMI_CTRL 16 bit r/w SMI Control Register */
--
--#define GM_SMI_CT_PHY_AD(x) SHIFT11(x)
--#define GM_SMI_CT_REG_AD(x) SHIFT6(x)
-+#define GM_SMI_CT_PHY_A_MSK (0x1f<<11) /* Bit 15..11: PHY Device Address */
-+#define GM_SMI_CT_REG_A_MSK (0x1f<<6) /* Bit 10.. 6: PHY Register Address */
- #define GM_SMI_CT_OP_RD (1<<5) /* Bit 5: OpCode Read (0=Write)*/
- #define GM_SMI_CT_RD_VAL (1<<4) /* Bit 4: Read Valid (Read completed) */
- #define GM_SMI_CT_BUSY (1<<3) /* Bit 3: Busy (Operation in progress) */
- /* Bit 2..0: reserved */
-
--/* GM_PHY_ADDR 16 bit r/w GPHY Address Register */
-+#define GM_SMI_CT_PHY_AD(x) (SHIFT11(x) & GM_SMI_CT_PHY_A_MSK)
-+#define GM_SMI_CT_REG_AD(x) (SHIFT6(x) & GM_SMI_CT_REG_A_MSK)
-+
-+ /* GM_PHY_ADDR 16 bit r/w GPHY Address Register */
- /* Bit 15..6: reserved */
- #define GM_PAR_MIB_CLR (1<<5) /* Bit 5: Set MIB Clear Counter Mode */
- #define GM_PAR_MIB_TST (1<<4) /* Bit 4: MIB Load Counter (Test Mode) */
---- linux-2.6.0/drivers/net/sk98lin/Makefile 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/Makefile 2003-12-28 23:21:01.000000000 -0800
-@@ -76,7 +76,7 @@ endif
- # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources
- # SK_DBGCAT_DRV_EVENT 0x08000000 driver events
-
--EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM)
-+EXTRA_CFLAGS += -Idrivers/net/sk98lin -DSK_DIAG_SUPPORT -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM)
-
- clean:
- rm -f core *.o *.a *.s
---- linux-2.6.0/drivers/net/sk98lin/skcsum.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skcsum.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skcsum.c
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.11 $
-- * Date: $Date: 2003/03/11 14:05:55 $
-+ * Version: $Revision: 1.12 $
-+ * Date: $Date: 2003/08/20 13:55:53 $
- * Purpose: Store/verify Internet checksum in send/receive packets.
- *
- ******************************************************************************/
-@@ -26,6 +26,10 @@
- * History:
- *
- * $Log: skcsum.c,v $
-+ * Revision 1.12 2003/08/20 13:55:53 mschmid
-+ * Changed notation of #ifndef SkCsCalculateChecksum to
-+ * #ifndef SK_CS_CALCULATE_CHECKSUM
-+ *
- * Revision 1.11 2003/03/11 14:05:55 rschmidt
- * Replaced memset() by macro SK_MEMSET()
- * Editorial changes
-@@ -78,7 +82,7 @@
-
- #ifndef lint
- static const char SysKonnectFileId[] =
-- "@(#) $Id: skcsum.c,v 1.11 2003/03/11 14:05:55 rschmidt Exp $ (C) SysKonnect.";
-+ "@(#) $Id: skcsum.c,v 1.12 2003/08/20 13:55:53 mschmid Exp $ (C) SysKonnect.";
- #endif /* !lint */
-
- /******************************************************************************
-@@ -791,7 +795,7 @@ int NetNumber)
- *pChecksum2Offset = SKCS_MAC_HEADER_SIZE + SKCS_IP_HEADER_SIZE;
- } /* SkCsSetReceiveFlags */
-
--#ifndef SkCsCalculateChecksum
-+#ifndef SK_CS_CALCULATE_CHECKSUM
-
- /******************************************************************************
- *
-@@ -856,7 +860,7 @@ unsigned Length) /* Length of data. */
- return ((unsigned) Checksum);
- } /* SkCsCalculateChecksum */
-
--#endif /* SkCsCalculateChecksum */
-+#endif /* SK_CS_CALCULATE_CHECKSUM */
-
- /******************************************************************************
- *
---- linux-2.6.0/drivers/net/sk98lin/skdim.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/sk98lin/skdim.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skdim.c
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.2 $
-- * Date: $Date: 2003/08/21 12:35:05 $
-+ * Version: $Revision: 1.5 $
-+ * Date: $Date: 2003/11/28 12:55:40 $
- * Purpose: All functions to maintain interrupt moderation
- *
- ******************************************************************************/
-@@ -11,6 +11,7 @@
- /******************************************************************************
- *
- * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,6 +27,15 @@
- * History:
- *
- * $Log: skdim.c,v $
-+ * Revision 1.5 2003/11/28 12:55:40 rroesler
-+ * Fix: support for new process timing interface added
-+ *
-+ * Revision 1.4 2003/10/10 10:58:56 mlindner
-+ * Fix: CPU detection under the kernel 2.6
-+ *
-+ * Revision 1.3 2003/10/07 08:17:08 mlindner
-+ * Fix: Copyright changes
-+ *
- * Revision 1.2 2003/08/21 12:35:05 mlindner
- * Fix: Corrected CPU detection and compile errors on single CPU machines
- *
-@@ -62,7 +72,7 @@
-
- #ifndef lint
- static const char SysKonnectFileId[] =
-- "@(#) $Id: skdim.c,v 1.2 2003/08/21 12:35:05 mlindner Exp $ (C) SysKonnect.";
-+ "@(#) $Id: skdim.c,v 1.5 2003/11/28 12:55:40 rroesler Exp $ (C) SysKonnect.";
- #endif
-
- #define __SKADDR_C
-@@ -327,7 +337,9 @@ GetCurrentSystemLoad(SK_AC *pAC) {
- **
- ** struct kernel_stat kstat
- **
-- ** is not marked as an exported symbol
-+ ** is not marked as an exported symbol in the file
-+ **
-+ ** kernel/ksyms.c
- **
- ** As a consequence, using this driver as KLM is not possible
- ** and any access of the structure kernel_stat via the
---- linux-2.6.0/drivers/net/sk98lin/skge.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/sk98lin/skge.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1,35 +1,20 @@
- /******************************************************************************
- *
-- * Name: skge.c
-+ * Name: skge.c
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.11 $
-- * Date: $Date: 2003/08/26 16:05:19 $
-+ * Version: $Revision: 1.42 $
-+ * Date: $Date: 2003/12/12 10:05:43 $
- * Purpose: The main driver source module
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 2002-2003 Marvell.
- *
-- * Driver for SysKonnect Gigabit Ethernet Server Adapters:
-- *
-- * SK-9871 (single link 1000Base-ZX)
-- * SK-9872 (dual link 1000Base-ZX)
-- * SK-9861 (single link 1000Base-SX, VF45 Volition Plug)
-- * SK-9862 (dual link 1000Base-SX, VF45 Volition Plug)
-- * SK-9841 (single link 1000Base-LX)
-- * SK-9842 (dual link 1000Base-LX)
-- * SK-9843 (single link 1000Base-SX)
-- * SK-9844 (dual link 1000Base-SX)
-- * SK-9821 (single link 1000Base-T)
-- * SK-9822 (dual link 1000Base-T)
-- * SK-9881 (single link 1000Base-SX V2 LC)
-- * SK-9871 (single link 1000Base-ZX V2)
-- * SK-9861 (single link 1000Base-SX V2, VF45 Volition Plug)
-- * SK-9841 (single link 1000Base-LX V2)
-- * SK-9843 (single link 1000Base-SX V2)
-- * SK-9821 (single link 1000Base-T V2)
-+ * Driver for Marvell Yukon chipset and SysKonnect Gigabit Ethernet
-+ * Server Adapters.
- *
- * Created 10-Feb-1999, based on Linux' acenic.c, 3c59x.c and
- * SysKonnects GEnesis Solaris driver
-@@ -56,6 +41,87 @@
- * History:
- *
- * $Log: skge.c,v $
-+ * Revision 1.42 2003/12/12 10:05:43 mlindner
-+ * Fix: Format of error message corrected
-+ *
-+ * Revision 1.41 2003/12/11 16:03:57 mlindner
-+ * Fix: Create backup from pnmi data structure
-+ *
-+ * Revision 1.40 2003/12/11 12:14:48 mlindner
-+ * Fix: Initalize Board before network configuration
-+ * Fix: Change device names to driver name
-+ *
-+ * Revision 1.39 2003/12/10 08:57:38 rroesler
-+ * Fix: Modifications regarding try_module_get() and capable()
-+ *
-+ * Revision 1.38 2003/12/01 17:16:50 mlindner
-+ * Fix: Remove useless register_netdev
-+ *
-+ * Revision 1.37 2003/12/01 17:11:30 mlindner
-+ * Fix: Register net device before SkGeBoardInit
-+ *
-+ * Revision 1.36 2003/11/28 13:04:27 rroesler
-+ * Fix: do not print interface status in case DIAG is used
-+ *
-+ * Revision 1.35 2003/11/17 14:41:06 mlindner
-+ * Fix: Endif command
-+ *
-+ * Revision 1.34 2003/11/17 13:29:05 mlindner
-+ * Fix: Editorial changes
-+ *
-+ * Revision 1.33 2003/11/14 14:56:54 rroesler
-+ * Fix: corrected compilation warnings kernel 2.2
-+ *
-+ * Revision 1.32 2003/11/13 14:18:47 rroesler
-+ * Fix: added latest changes regarding the use of the proc system
-+ *
-+ * Revision 1.31 2003/11/13 09:28:35 rroesler
-+ * Fix: removed kernel warning 'driver changed get_stats after register'
-+ *
-+ * Revision 1.30 2003/11/11 13:15:27 rroesler
-+ * Fix: use suitables kernel usage count macros when using the diag
-+ *
-+ * Revision 1.29 2003/11/10 09:38:26 rroesler
-+ * Fix: restore PNMI structure backup for DIAG actions
-+ *
-+ * Revision 1.28 2003/11/07 17:28:45 rroesler
-+ * Fix: Additions for the LeaveDiagMode
-+ *
-+ * Revision 1.27 2003/11/03 13:21:14 mlindner
-+ * Add: SkGeBuffPad function for padding to ensure the trailing bytes exist
-+ *
-+ * Revision 1.26 2003/10/30 09:20:40 mlindner
-+ * Fix: Control bit check
-+ *
-+ * Revision 1.25 2003/10/29 07:43:37 rroesler
-+ * Fix: Implemented full None values handling for parameter Moderation
-+ *
-+ * Revision 1.24 2003/10/22 14:18:12 rroesler
-+ * Fix: DIAG handling for DualNet cards
-+ *
-+ * Revision 1.23 2003/10/17 10:05:13 mlindner
-+ * Add: New blinkmode for Morvell cards
-+ *
-+ * Revision 1.22 2003/10/15 12:31:25 rroesler
-+ * Fix: Corrected bugreport #10954 (Linux System crash when using vlans)
-+ *
-+ * Revision 1.21 2003/10/07 12:32:28 mlindner
-+ * Fix: Editorial changes
-+ *
-+ * Revision 1.20 2003/10/07 12:22:40 mlindner
-+ * Fix: Compiler warnings
-+ *
-+ * Revision 1.19 2003/10/07 09:33:40 mlindner
-+ * Fix: No warnings for illegal values of Mod and IntsPerSec
-+ * Fix: Speed 100 in Half Duplex not allowed for Yukon
-+ * Fix: PrefPort=B not allowed on single NICs
-+ *
-+ * Revision 1.18 2003/10/07 08:17:08 mlindner
-+ * Fix: Copyright changes
-+ *
-+ * Revision 1.17 2003/09/29 12:06:59 mlindner
-+ * *** empty log message ***
-+ *
- * Revision 1.16 2003/09/23 11:07:35 mlindner
- * Fix: IO-control return race condition
- * Fix: Interrupt moderation value check
-@@ -68,6 +134,12 @@
- * Add: Yukon Plus changes (ChipID, PCI...)
- * Fix: TCP and UDP Checksum calculation
- *
-+ * Revision 1.13 2003/09/01 13:30:08 rroesler
-+ * Fix: Corrected missing defines
-+ *
-+ * Revision 1.12 2003/09/01 13:12:02 rroesler
-+ * Add: Code for improved DIAG Attach/Detach interface
-+ *
- * Revision 1.11 2003/08/26 16:05:19 mlindner
- * Fix: Compiler warnings (void *)
- *
-@@ -406,7 +478,6 @@
- * <linux/module.h>
- *
- * "h/skdrv1st.h"
-- * <linux/version.h>
- * <linux/types.h>
- * <linux/kernel.h>
- * <linux/string.h>
-@@ -568,6 +639,12 @@ static void StartDrvCleanupTimer(SK_AC *
- static void StopDrvCleanupTimer(SK_AC *pAC);
- static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*);
-
-+#ifdef SK_DIAG_SUPPORT
-+static SK_U32 ParseDeviceNbrFromSlotName(const char *SlotName);
-+static int SkDrvInitAdapter(SK_AC *pAC, int devNbr);
-+static int SkDrvDeInitAdapter(SK_AC *pAC, int devNbr);
-+#endif
-+
- /*******************************************************************************
- *
- * Extern Function Prototypes
-@@ -576,8 +653,8 @@ static int XmitFrameSG(SK_AC*, TX_PORT*,
-
- #ifdef CONFIG_PROC_FS
- static const char SK_Root_Dir_entry[] = "sk98lin";
--static struct proc_dir_entry *pSkRootDir;
--extern struct file_operations sk_proc_fops;
-+static struct proc_dir_entry *pSkRootDir = NULL;
-+extern struct file_operations sk_proc_fops;
- #endif
-
- extern void SkDimEnableModerationIfNeeded(SK_AC *pAC);
-@@ -595,12 +672,19 @@ static void DumpLong(char*, int);
- static const char *BootString = BOOT_STRING;
- struct SK_NET_DEVICE *SkGeRootDev = NULL;
- static int probed __initdata = 0;
-+static SK_BOOL DoPrintInterfaceChange = SK_TRUE;
-
- /* local variables **********************************************************/
- static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}};
- static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480};
-
-
-+#ifdef CONFIG_PROC_FS
-+static struct proc_dir_entry *pSkRootDir;
-+#endif
-+
-+
-+
- /*****************************************************************************
- *
- * skge_probe - find all SK-98xx adapters
-@@ -626,6 +710,7 @@ static int __init skge_probe (void)
- SK_BOOL BootStringCount = SK_FALSE;
- int retval;
- #ifdef CONFIG_PROC_FS
-+ int proc_root_initialized = 0;
- struct proc_dir_entry *pProcFile;
- #endif
-
-@@ -700,6 +785,7 @@ static int __init skge_probe (void)
- dev->stop = &SkGeClose;
- dev->hard_start_xmit = &SkGeXmit;
- dev->get_stats = &SkGeStats;
-+ dev->last_stats = &SkGeStats;
- dev->set_multicast_list = &SkGeSetRxMode;
- dev->set_mac_address = &SkGeSetMacAddr;
- dev->do_ioctl = &SkGeIoctl;
-@@ -718,15 +804,13 @@ static int __init skge_probe (void)
- #endif
-
- pAC->Index = boards_found;
-+
- if (SkGeBoardInit(dev, pAC)) {
-- FreeResources(dev);
- free_netdev(dev);
- continue;
- }
-
-- memcpy((caddr_t) &dev->dev_addr,
-- (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6);
--
-+ /* Register net device */
- if (register_netdev(dev)) {
- printk(KERN_ERR "SKGE: Could not register device.\n");
- FreeResources(dev);
-@@ -734,6 +818,25 @@ static int __init skge_probe (void)
- continue;
- }
-
-+ /* Print adapter specific string from vpd */
-+ ProductStr(pAC);
-+ printk("%s: %s\n", dev->name, pAC->DeviceStr);
-+
-+ /* Print configuration settings */
-+ printk(" PrefPort:%c RlmtMode:%s\n",
-+ 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber,
-+ (pAC->RlmtMode==0) ? "Check Link State" :
-+ ((pAC->RlmtMode==1) ? "Check Link State" :
-+ ((pAC->RlmtMode==3) ? "Check Local Port" :
-+ ((pAC->RlmtMode==7) ? "Check Segmentation" :
-+ ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error")))));
-+
-+ SkGeYellowLED(pAC, pAC->IoBase, 1);
-+
-+
-+ memcpy((caddr_t) &dev->dev_addr,
-+ (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6);
-+
- /* First adapter... Create proc and print message */
- #ifdef CONFIG_PROC_FS
- if (!DeviceFound) {
-@@ -744,25 +847,27 @@ static int __init skge_probe (void)
- /*Create proc (directory)*/
- if(!pSkRootDir) {
- pSkRootDir = proc_mkdir(SK_Root_Dir_entry, proc_net);
-- if (!pSkRootDir)
-+ if (!pSkRootDir) {
- printk(KERN_WARNING "%s: Unable to create /proc/net/%s",
-- dev->name, SK_Root_Dir_entry);
-- else
-+ dev->name, SK_Root_Dir_entry);
-+ } else {
- pSkRootDir->owner = THIS_MODULE;
-+ }
- }
- }
--
-+
- /* Create proc file */
-- if (pSkRootDir
-- && (pProcFile = create_proc_entry(dev->name, S_IRUGO,
-- pSkRootDir))) {
-+ if (pSkRootDir &&
-+ (pProcFile = create_proc_entry(dev->name, S_IRUGO,
-+ pSkRootDir))) {
- pProcFile->proc_fops = &sk_proc_fops;
-- pProcFile->data = dev;
-+ pProcFile->data = dev;
- }
-+
- #endif
-
- pNet->PortNr = 0;
-- pNet->NetNr = 0;
-+ pNet->NetNr = 0;
-
- boards_found++;
-
-@@ -774,23 +879,24 @@ static int __init skge_probe (void)
- break;
- }
-
-- pAC->dev[1] = dev;
-- pNet = dev->priv;
-- pNet->PortNr = 1;
-- pNet->NetNr = 1;
-- pNet->pAC = pAC;
-- pNet->Mtu = 1500;
-- pNet->Up = 0;
--
-- dev->open = &SkGeOpen;
-- dev->stop = &SkGeClose;
-- dev->hard_start_xmit = &SkGeXmit;
-- dev->get_stats = &SkGeStats;
-+ pAC->dev[1] = dev;
-+ pNet = dev->priv;
-+ pNet->PortNr = 1;
-+ pNet->NetNr = 1;
-+ pNet->pAC = pAC;
-+ pNet->Mtu = 1500;
-+ pNet->Up = 0;
-+
-+ dev->open = &SkGeOpen;
-+ dev->stop = &SkGeClose;
-+ dev->hard_start_xmit = &SkGeXmit;
-+ dev->get_stats = &SkGeStats;
-+ dev->last_stats = &SkGeStats;
- dev->set_multicast_list = &SkGeSetRxMode;
-- dev->set_mac_address = &SkGeSetMacAddr;
-- dev->do_ioctl = &SkGeIoctl;
-- dev->change_mtu = &SkGeChangeMtu;
-- dev->flags &= ~IFF_RUNNING;
-+ dev->set_mac_address = &SkGeSetMacAddr;
-+ dev->do_ioctl = &SkGeIoctl;
-+ dev->change_mtu = &SkGeChangeMtu;
-+ dev->flags &= ~IFF_RUNNING;
-
- #ifdef SK_ZEROCOPY
- #ifdef USE_SK_TX_CHECKSUM
-@@ -802,34 +908,39 @@ static int __init skge_probe (void)
- #endif
-
- if (register_netdev(dev)) {
-- printk(KERN_ERR "SKGE: Could not register "
-- "second port.\n");
-+ printk(KERN_ERR "SKGE: Could not register device.\n");
- free_netdev(dev);
- pAC->dev[1] = pAC->dev[0];
- } else {
- #ifdef CONFIG_PROC_FS
- if (pSkRootDir
- && (pProcFile = create_proc_entry(dev->name,
-- S_IRUGO,
-- pSkRootDir))) {
-+ S_IRUGO, pSkRootDir))) {
- pProcFile->proc_fops = &sk_proc_fops;
-- pProcFile->data = dev;
-+ pProcFile->data = dev;
- }
- #endif
-
-- memcpy((caddr_t) &dev->dev_addr,
-- (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6);
-+ memcpy((caddr_t) &dev->dev_addr,
-+ (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6);
-
-- printk("%s: %s\n", dev->name, pAC->DeviceStr);
-- printk(" PrefPort:B RlmtMode:Dual Check Link State\n");
-+ printk("%s: %s\n", dev->name, pAC->DeviceStr);
-+ printk(" PrefPort:B RlmtMode:Dual Check Link State\n");
- }
- }
-
--
- /* Save the hardware revision */
- pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) +
- (pAC->GIni.GIPciHwRev & 0x0F);
-
-+ /* Set driver globals */
-+ pAC->Pnmi.pDriverFileName = DRIVER_FILE_NAME;
-+ pAC->Pnmi.pDriverReleaseDate = DRIVER_REL_DATE;
-+
-+ SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA));
-+ SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct),
-+ sizeof(SK_PNMI_STRUCT_DATA));
-+
- /*
- * This is bollocks, but we need to tell the net-init
- * code that it shall go for the next device.
-@@ -849,7 +960,6 @@ static int __init skge_probe (void)
- } /* skge_probe */
-
-
--
- /*****************************************************************************
- *
- * SkGeInitPCI - Init the PCI resources
-@@ -1143,7 +1253,7 @@ SK_EVPARA EvPara;
-
- if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){
- unregister_netdev(pAC->dev[1]);
-- kfree(pAC->dev[1]);
-+ free_netdev(pAC->dev[1]);
- }
-
- FreeResources(SkGeRootDev);
-@@ -1161,8 +1271,7 @@ SK_EVPARA EvPara;
-
- #ifdef CONFIG_PROC_FS
- /* clear proc-dir */
-- if (pSkRootDir)
-- remove_proc_entry(pSkRootDir->name, proc_net);
-+ remove_proc_entry(pSkRootDir->name, proc_net);
- #endif
-
- } /* skge_cleanup_module */
-@@ -1224,7 +1333,7 @@ SK_BOOL DualNet;
- SkAddrInit( pAC, pAC->IoBase, SK_INIT_DATA);
- SkRlmtInit( pAC, pAC->IoBase, SK_INIT_DATA);
- SkTimerInit(pAC, pAC->IoBase, SK_INIT_DATA);
--
-+
- pAC->BoardLevel = SK_INIT_DATA;
- pAC->RxBufSize = ETH_BUF_SIZE;
-
-@@ -1236,7 +1345,7 @@ SK_BOOL DualNet;
- /* level 1 init common modules here (HW init) */
- spin_lock_irqsave(&pAC->SlowPathLock, Flags);
- if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) {
-- printk("HWInit (1) failed.\n");
-+ printk("sk98lin: HWInit (1) failed.\n");
- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
- return(-EAGAIN);
- }
-@@ -1268,14 +1377,14 @@ SK_BOOL DualNet;
- Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ,
- pAC->Name, dev);
- } else {
-- printk(KERN_WARNING "%s: Illegal number of ports: %d\n",
-- dev->name, pAC->GIni.GIMacsFound);
-+ printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n",
-+ pAC->GIni.GIMacsFound);
- return -EAGAIN;
- }
-
- if (Ret) {
-- printk(KERN_WARNING "%s: Requested IRQ %d is busy.\n",
-- dev->name, dev->irq);
-+ printk(KERN_WARNING "sk98lin: Requested IRQ %d is busy.\n",
-+ dev->irq);
- return -EAGAIN;
- }
- pAC->AllocFlag |= SK_ALLOC_IRQ;
-@@ -1303,25 +1412,10 @@ SK_BOOL DualNet;
- pAC->ActivePort,
- DualNet)) {
- BoardFreeMem(pAC);
-- printk("SkGeInitAssignRamToQueues failed.\n");
-+ printk("sk98lin: SkGeInitAssignRamToQueues failed.\n");
- return(-EAGAIN);
- }
-
-- /* Print adapter specific string from vpd */
-- ProductStr(pAC);
-- printk("%s: %s\n", dev->name, pAC->DeviceStr);
--
-- /* Print configuration settings */
-- printk(" PrefPort:%c RlmtMode:%s\n",
-- 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber,
-- (pAC->RlmtMode==0) ? "Check Link State" :
-- ((pAC->RlmtMode==1) ? "Check Link State" :
-- ((pAC->RlmtMode==3) ? "Check Local Port" :
-- ((pAC->RlmtMode==7) ? "Check Segmentation" :
-- ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error")))));
--
-- SkGeYellowLED(pAC, pAC->IoBase, 1);
--
- /*
- * Register the device here
- */
-@@ -1879,14 +1973,26 @@ struct SK_NET_DEVICE *dev)
- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
- ("SkGeOpen: pAC=0x%lX:\n", (unsigned long)pAC));
-
-+#ifdef SK_DIAG_SUPPORT
-+ if (pAC->DiagModeActive == DIAG_ACTIVE) {
-+ if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {
-+ return (-1); /* still in use by diag; deny actions */
-+ }
-+ }
-+#endif
-+
-+ if (!try_module_get(THIS_MODULE)) {
-+ return (-1); /* increase of usage count not possible */
-+ }
-
- /* Set blink mode */
-- if (pAC->PciDev->vendor == 0x1186)
-+ if ((pAC->PciDev->vendor == 0x1186) || (pAC->PciDev->vendor == 0x11ab ))
- pAC->GIni.GILedBlinkCtrl = OEM_CONFIG_VALUE;
-
- if (pAC->BoardLevel == SK_INIT_DATA) {
- /* level 1 init common modules here */
- if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) {
-+ module_put(THIS_MODULE); /* decrease usage count */
- printk("%s: HWInit (1) failed.\n", pAC->dev[pNet->PortNr]->name);
- return (-1);
- }
-@@ -1902,6 +2008,7 @@ struct SK_NET_DEVICE *dev)
- if (pAC->BoardLevel != SK_INIT_RUN) {
- /* tschilling: Level 2 init modules here, check return value. */
- if (SkGeInit(pAC, pAC->IoBase, SK_INIT_RUN) != 0) {
-+ module_put(THIS_MODULE); /* decrease usage count */
- printk("%s: HWInit (2) failed.\n", pAC->dev[pNet->PortNr]->name);
- return (-1);
- }
-@@ -1953,7 +2060,6 @@ struct SK_NET_DEVICE *dev)
- pAC->MaxPorts++;
- pNet->Up = 1;
-
-- try_module_get(THIS_MODULE);
-
- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
- ("SkGeOpen suceeded\n"));
-@@ -1976,26 +2082,50 @@ struct SK_NET_DEVICE *dev)
- static int SkGeClose(
- struct SK_NET_DEVICE *dev)
- {
-- DEV_NET *pNet;
-- SK_AC *pAC;
-+ DEV_NET *pNet;
-+ DEV_NET *newPtrNet;
-+ SK_AC *pAC;
-
- unsigned long Flags; /* for spin lock */
-- int i;
-- int PortIdx;
-- SK_EVPARA EvPara;
-+ int i;
-+ int PortIdx;
-+ SK_EVPARA EvPara;
-+
-+ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
-+ ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC));
-
-- netif_stop_queue(dev);
- pNet = (DEV_NET*) dev->priv;
- pAC = pNet->pAC;
-
-+#ifdef SK_DIAG_SUPPORT
-+ if (pAC->DiagModeActive == DIAG_ACTIVE) {
-+ if (pAC->DiagFlowCtrl == SK_FALSE) {
-+ module_put(THIS_MODULE);
-+ /*
-+ ** notify that the interface which has been closed
-+ ** by operator interaction must not be started up
-+ ** again when the DIAG has finished.
-+ */
-+ newPtrNet = (DEV_NET *) pAC->dev[0]->priv;
-+ if (newPtrNet == pNet) {
-+ pAC->WasIfUp[0] = SK_FALSE;
-+ } else {
-+ pAC->WasIfUp[1] = SK_FALSE;
-+ }
-+ return 0; /* return to system everything is fine... */
-+ } else {
-+ pAC->DiagFlowCtrl = SK_FALSE;
-+ }
-+ }
-+#endif
-+
-+ netif_stop_queue(dev);
-+
- if (pAC->RlmtNets == 1)
- PortIdx = pAC->ActivePort;
- else
- PortIdx = pNet->NetNr;
-
-- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
-- ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC));
--
- StopDrvCleanupTimer(pAC);
-
- /*
-@@ -2053,6 +2183,10 @@ struct SK_NET_DEVICE *dev)
- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
- ("SkGeClose: done "));
-
-+ SK_MEMSET(&(pAC->PnmiBackup), 0, sizeof(SK_PNMI_STRUCT_DATA));
-+ SK_MEMCPY(&(pAC->PnmiBackup), &(pAC->PnmiStruct),
-+ sizeof(SK_PNMI_STRUCT_DATA));
-+
- pAC->MaxPorts--;
- pNet->Up = 0;
-
-@@ -2199,9 +2333,10 @@ struct sk_buff *pMessage) /* pointer to
- ** This is to resolve faulty padding by the HW with 0xaa bytes.
- */
- if (BytesSend < C_LEN_ETHERNET_MINSIZE) {
-- skb_put(pMessage, (C_LEN_ETHERNET_MINSIZE-BytesSend));
-- SK_MEMSET( ((char *)(pMessage->data))+BytesSend,
-- 0, C_LEN_ETHERNET_MINSIZE-BytesSend);
-+ if ((pMessage = skb_padto(pMessage, C_LEN_ETHERNET_MINSIZE)) == NULL) {
-+ return 0;
-+ }
-+ pMessage->len = C_LEN_ETHERNET_MINSIZE;
- }
-
- /*
-@@ -3318,6 +3453,16 @@ SK_EVPARA EvPara;
- return -EINVAL;
- }
-
-+#ifdef SK_DIAG_SUPPORT
-+ if (pAC->DiagModeActive == DIAG_ACTIVE) {
-+ if (pAC->DiagFlowCtrl == SK_FALSE) {
-+ return -1; /* still in use, deny any actions of MTU */
-+ } else {
-+ pAC->DiagFlowCtrl = SK_FALSE;
-+ }
-+ }
-+#endif
-+
- pNet->Mtu = NewMtu;
- pOtherNet = (DEV_NET*)pAC->dev[1 - pNet->NetNr]->priv;
- if ((pOtherNet->Mtu>1500) && (NewMtu<=1500) && (pOtherNet->Up==1)) {
-@@ -3537,11 +3682,20 @@ unsigned long Flags; /* for spin lock
- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
- ("SkGeStats starts now...\n"));
- pPnmiStruct = &pAC->PnmiStruct;
-- memset(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA));
-+
-+#ifdef SK_DIAG_SUPPORT
-+ if ((pAC->DiagModeActive == DIAG_NOTACTIVE) &&
-+ (pAC->BoardLevel == SK_INIT_RUN)) {
-+#endif
-+ SK_MEMSET(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA));
- spin_lock_irqsave(&pAC->SlowPathLock, Flags);
- Size = SK_PNMI_STRUCT_SIZE;
- SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr);
- spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
-+#ifdef SK_DIAG_SUPPORT
-+ }
-+#endif
-+
- pPnmiStat = &pPnmiStruct->Stat[0];
- pPnmiConf = &pPnmiStruct->Conf[0];
-
-@@ -3604,7 +3758,7 @@ static int SkGeIoctl(struct SK_NET_DEVIC
- DEV_NET *pNet;
- SK_AC *pAC;
- void *pMemBuf;
--
-+struct pci_dev *pdev = NULL;
- SK_GE_IOCTL Ioctl;
- unsigned int Err = 0;
- int Size = 0;
-@@ -3671,6 +3825,45 @@ int HeaderLength = sizeof(SK_U32) + siz
- fault_gen:
- kfree(pMemBuf); /* cleanup everything */
- break;
-+#ifdef SK_DIAG_SUPPORT
-+ case SK_IOCTL_DIAG:
-+ if (!capable(CAP_NET_ADMIN)) return -EPERM;
-+ if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) {
-+ Length = Ioctl.Len;
-+ } else {
-+ Length = sizeof(pAC->PnmiStruct) + HeaderLength;
-+ }
-+ if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) {
-+ return -ENOMEM;
-+ }
-+ if(copy_from_user(pMemBuf, Ioctl.pData, Length)) {
-+ Err = -EFAULT;
-+ goto fault_diag;
-+ }
-+ pdev = pAC->PciDev;
-+ Length = 3 * sizeof(SK_U32); /* Error, Bus and Device */
-+ /*
-+ ** While coding this new IOCTL interface, only a few lines of code
-+ ** are to to be added. Therefore no dedicated function has been
-+ ** added. If more functionality is added, a separate function
-+ ** should be used...
-+ */
-+ * ((SK_U32 *)pMemBuf) = 0;
-+ * ((SK_U32 *)pMemBuf + 1) = pdev->bus->number;
-+ * ((SK_U32 *)pMemBuf + 2) = ParseDeviceNbrFromSlotName(pdev->slot_name);
-+ if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) {
-+ Err = -EFAULT;
-+ goto fault_diag;
-+ }
-+ Ioctl.Len = Length;
-+ if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) {
-+ Err = -EFAULT;
-+ goto fault_diag;
-+ }
-+fault_diag:
-+ kfree(pMemBuf); /* cleanup everything */
-+ break;
-+#endif
- default:
- Err = -EOPNOTSUPP;
- }
-@@ -3826,10 +4019,9 @@ int Capabilities[3][3] =
- (strcmp(ConType[pAC->Index],"Auto")!=0) &&
- (strcmp(ConType[pAC->Index],"")!=0)) {
- /* Set the speed parameter back */
-- printk("%s: Illegal value \"%s\" "
-+ printk("sk98lin: Illegal value \"%s\" "
- "for ConType."
- " Using Auto.\n",
-- pAC->dev[0]->name,
- ConType[pAC->Index]);
-
- sprintf(ConType[pAC->Index], "Auto");
-@@ -3873,8 +4065,8 @@ int Capabilities[3][3] =
- M_CurrPort.PLinkSpeed = SK_LSPEED_10MBPS;
- }
- } else {
-- printk("%s: Illegal value \"%s\" for ConType\n",
-- pAC->dev[0]->name, ConType[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for ConType\n",
-+ ConType[pAC->Index]);
- IsConTypeDefined = SK_FALSE; /* Wrong ConType defined */
- }
- } else {
-@@ -3898,8 +4090,8 @@ int Capabilities[3][3] =
- } else if (strcmp(Speed_A[pAC->Index],"1000")==0) {
- LinkSpeed = SK_LSPEED_1000MBPS;
- } else {
-- printk("%s: Illegal value \"%s\" for Speed_A\n",
-- pAC->dev[0]->name, Speed_A[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for Speed_A\n",
-+ Speed_A[pAC->Index]);
- IsLinkSpeedDefined = SK_FALSE;
- }
- } else {
-@@ -3913,9 +4105,9 @@ int Capabilities[3][3] =
- if (((!pAC->ChipsetType) || (pAC->GIni.GICopperType != SK_TRUE)) &&
- ((LinkSpeed != SK_LSPEED_AUTO) &&
- (LinkSpeed != SK_LSPEED_1000MBPS))) {
-- printk("%s: Illegal value for Speed_A. "
-+ printk("sk98lin: Illegal value for Speed_A. "
- "Not a copper card or GE V2 card\n Using "
-- "speed 1000\n", pAC->dev[0]->name);
-+ "speed 1000\n");
- LinkSpeed = SK_LSPEED_1000MBPS;
- }
-
-@@ -3945,8 +4137,8 @@ int Capabilities[3][3] =
- } else if (strcmp(AutoNeg_A[pAC->Index],"Sense")==0) {
- AutoNeg = AN_SENS;
- } else {
-- printk("%s: Illegal value \"%s\" for AutoNeg_A\n",
-- pAC->dev[0]->name, AutoNeg_A[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for AutoNeg_A\n",
-+ AutoNeg_A[pAC->Index]);
- }
- }
-
-@@ -3964,33 +4156,32 @@ int Capabilities[3][3] =
- } else if (strcmp(DupCap_A[pAC->Index],"Half")==0) {
- DuplexCap = DC_HALF;
- } else {
-- printk("%s: Illegal value \"%s\" for DupCap_A\n",
-- pAC->dev[0]->name, DupCap_A[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for DupCap_A\n",
-+ DupCap_A[pAC->Index]);
- }
- }
--
-+
- /*
- ** Check for illegal combinations
- */
-- if ((LinkSpeed = SK_LSPEED_1000MBPS) &&
-+ if ((LinkSpeed == SK_LSPEED_1000MBPS) &&
- ((DuplexCap == SK_LMODE_STAT_AUTOHALF) ||
- (DuplexCap == SK_LMODE_STAT_HALF)) &&
- (pAC->ChipsetType)) {
-- printk("%s: Half Duplex not possible with Gigabit speed!\n"
-- " Using Full Duplex.\n",
-- pAC->dev[0]->name);
-+ printk("sk98lin: Half Duplex not possible with Gigabit speed!\n"
-+ " Using Full Duplex.\n");
- DuplexCap = DC_FULL;
- }
-
- if ( AutoSet && AutoNeg==AN_SENS && DupSet) {
-- printk("%s, Port A: DuplexCapabilities"
-- " ignored using Sense mode\n", pAC->dev[0]->name);
-+ printk("sk98lin, Port A: DuplexCapabilities"
-+ " ignored using Sense mode\n");
- }
-
- if (AutoSet && AutoNeg==AN_OFF && DupSet && DuplexCap==DC_BOTH){
-- printk("%s, Port A: Illegal combination"
-+ printk("sk98lin: Port A: Illegal combination"
- " of values AutoNeg. and DuplexCap.\n Using "
-- "Full Duplex\n", pAC->dev[0]->name);
-+ "Full Duplex\n");
- DuplexCap = DC_FULL;
- }
-
-@@ -3999,10 +4190,9 @@ int Capabilities[3][3] =
- }
-
- if (!AutoSet && DupSet) {
-- printk("%s, Port A: Duplex setting not"
-+ printk("sk98lin: Port A: Duplex setting not"
- " possible in\n default AutoNegotiation mode"
-- " (Sense).\n Using AutoNegotiation On\n",
-- pAC->dev[0]->name);
-+ " (Sense).\n Using AutoNegotiation On\n");
- AutoNeg = AN_ON;
- }
-
-@@ -4029,8 +4219,8 @@ int Capabilities[3][3] =
- } else if (strcmp(FlowCtrl_A[pAC->Index],"None")==0) {
- FlowCtrl = SK_FLOW_MODE_NONE;
- } else {
-- printk("%s: Illegal value \"%s\" for FlowCtrl_A\n",
-- pAC->dev[0]->name, FlowCtrl_A[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for FlowCtrl_A\n",
-+ FlowCtrl_A[pAC->Index]);
- IsFlowCtrlDefined = SK_FALSE;
- }
- } else {
-@@ -4039,9 +4229,9 @@ int Capabilities[3][3] =
-
- if (IsFlowCtrlDefined) {
- if ((AutoNeg == AN_OFF) && (FlowCtrl != SK_FLOW_MODE_NONE)) {
-- printk("%s, Port A: FlowControl"
-+ printk("sk98lin: Port A: FlowControl"
- " impossible without AutoNegotiation,"
-- " disabled\n", pAC->dev[0]->name);
-+ " disabled\n");
- FlowCtrl = SK_FLOW_MODE_NONE;
- }
- pAC->GIni.GP[0].PFlowCtrlMode = FlowCtrl;
-@@ -4061,8 +4251,8 @@ int Capabilities[3][3] =
- } else if (strcmp(Role_A[pAC->Index],"Slave")==0) {
- MSMode = SK_MS_MODE_SLAVE;
- } else {
-- printk("%s: Illegal value \"%s\" for Role_A\n",
-- pAC->dev[0]->name, Role_A[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for Role_A\n",
-+ Role_A[pAC->Index]);
- IsRoleDefined = SK_FALSE;
- }
- } else {
-@@ -4097,8 +4287,8 @@ int Capabilities[3][3] =
- } else if (strcmp(Speed_B[pAC->Index],"1000")==0) {
- LinkSpeed = SK_LSPEED_1000MBPS;
- } else {
-- printk("%s: Illegal value \"%s\" for Speed_B\n",
-- pAC->dev[1]->name, Speed_B[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for Speed_B\n",
-+ Speed_B[pAC->Index]);
- IsLinkSpeedDefined = SK_FALSE;
- }
- } else {
-@@ -4112,9 +4302,9 @@ int Capabilities[3][3] =
- if (((!pAC->ChipsetType) || (pAC->GIni.GICopperType != SK_TRUE)) &&
- ((LinkSpeed != SK_LSPEED_AUTO) &&
- (LinkSpeed != SK_LSPEED_1000MBPS))) {
-- printk("%s: Illegal value for Speed_B. "
-+ printk("sk98lin: Illegal value for Speed_B. "
- "Not a copper card or GE V2 card\n Using "
-- "speed 1000\n", pAC->dev[1]->name);
-+ "speed 1000\n");
- LinkSpeed = SK_LSPEED_1000MBPS;
- }
-
-@@ -4144,8 +4334,8 @@ int Capabilities[3][3] =
- } else if (strcmp(AutoNeg_B[pAC->Index],"Sense")==0) {
- AutoNeg = AN_SENS;
- } else {
-- printk("%s: Illegal value \"%s\" for AutoNeg_B\n",
-- pAC->dev[0]->name, AutoNeg_B[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for AutoNeg_B\n",
-+ AutoNeg_B[pAC->Index]);
- }
- }
-
-@@ -4163,8 +4353,8 @@ int Capabilities[3][3] =
- } else if (strcmp(DupCap_B[pAC->Index],"Half")==0) {
- DuplexCap = DC_HALF;
- } else {
-- printk("%s: Illegal value \"%s\" for DupCap_B\n",
-- pAC->dev[0]->name, DupCap_B[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for DupCap_B\n",
-+ DupCap_B[pAC->Index]);
- }
- }
-
-@@ -4172,25 +4362,24 @@ int Capabilities[3][3] =
- /*
- ** Check for illegal combinations
- */
-- if ((LinkSpeed = SK_LSPEED_1000MBPS) &&
-+ if ((LinkSpeed == SK_LSPEED_1000MBPS) &&
- ((DuplexCap == SK_LMODE_STAT_AUTOHALF) ||
- (DuplexCap == SK_LMODE_STAT_HALF)) &&
- (pAC->ChipsetType)) {
-- printk("%s: Half Duplex not possible with Gigabit speed!\n"
-- " Using Full Duplex.\n",
-- pAC->dev[1]->name);
-+ printk("sk98lin: Half Duplex not possible with Gigabit speed!\n"
-+ " Using Full Duplex.\n");
- DuplexCap = DC_FULL;
- }
-
- if (AutoSet && AutoNeg==AN_SENS && DupSet) {
-- printk("%s, Port B: DuplexCapabilities"
-- " ignored using Sense mode\n", pAC->dev[1]->name);
-+ printk("sk98lin, Port B: DuplexCapabilities"
-+ " ignored using Sense mode\n");
- }
-
- if (AutoSet && AutoNeg==AN_OFF && DupSet && DuplexCap==DC_BOTH){
-- printk("%s, Port B: Illegal combination"
-+ printk("sk98lin: Port B: Illegal combination"
- " of values AutoNeg. and DuplexCap.\n Using "
-- "Full Duplex\n", pAC->dev[1]->name);
-+ "Full Duplex\n");
- DuplexCap = DC_FULL;
- }
-
-@@ -4199,10 +4388,9 @@ int Capabilities[3][3] =
- }
-
- if (!AutoSet && DupSet) {
-- printk("%s, Port B: Duplex setting not"
-+ printk("sk98lin: Port B: Duplex setting not"
- " possible in\n default AutoNegotiation mode"
-- " (Sense).\n Using AutoNegotiation On\n",
-- pAC->dev[1]->name);
-+ " (Sense).\n Using AutoNegotiation On\n");
- AutoNeg = AN_ON;
- }
-
-@@ -4229,8 +4417,8 @@ int Capabilities[3][3] =
- } else if (strcmp(FlowCtrl_B[pAC->Index],"None")==0) {
- FlowCtrl = SK_FLOW_MODE_NONE;
- } else {
-- printk("%s: Illegal value \"%s\" for FlowCtrl_B\n",
-- pAC->dev[0]->name, FlowCtrl_B[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for FlowCtrl_B\n",
-+ FlowCtrl_B[pAC->Index]);
- IsFlowCtrlDefined = SK_FALSE;
- }
- } else {
-@@ -4239,9 +4427,9 @@ int Capabilities[3][3] =
-
- if (IsFlowCtrlDefined) {
- if ((AutoNeg == AN_OFF) && (FlowCtrl != SK_FLOW_MODE_NONE)) {
-- printk("%s, Port B: FlowControl"
-+ printk("sk98lin: Port B: FlowControl"
- " impossible without AutoNegotiation,"
-- " disabled\n", pAC->dev[1]->name);
-+ " disabled\n");
- FlowCtrl = SK_FLOW_MODE_NONE;
- }
- pAC->GIni.GP[1].PFlowCtrlMode = FlowCtrl;
-@@ -4261,8 +4449,8 @@ int Capabilities[3][3] =
- } else if (strcmp(Role_B[pAC->Index],"Slave")==0) {
- MSMode = SK_MS_MODE_SLAVE;
- } else {
-- printk("%s: Illegal value \"%s\" for Role_B\n",
-- pAC->dev[1]->name, Role_B[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for Role_B\n",
-+ Role_B[pAC->Index]);
- IsRoleDefined = SK_FALSE;
- }
- } else {
-@@ -4280,28 +4468,37 @@ int Capabilities[3][3] =
- if (PrefPort != NULL && pAC->Index<SK_MAX_CARD_PARAM &&
- PrefPort[pAC->Index] != NULL) {
- if (strcmp(PrefPort[pAC->Index],"") == 0) { /* Auto */
-- pAC->ActivePort = 0;
-- pAC->Rlmt.Net[0].Preference = -1; /* auto */
-- pAC->Rlmt.Net[0].PrefPort = 0;
-+ pAC->ActivePort = 0;
-+ pAC->Rlmt.Net[0].Preference = -1; /* auto */
-+ pAC->Rlmt.Net[0].PrefPort = 0;
- } else if (strcmp(PrefPort[pAC->Index],"A") == 0) {
-- /*
-- ** do not set ActivePort here, thus a port
-- ** switch is issued after net up.
-- */
-- Port = 0;
-- pAC->Rlmt.Net[0].Preference = Port;
-- pAC->Rlmt.Net[0].PrefPort = Port;
-+ /*
-+ ** do not set ActivePort here, thus a port
-+ ** switch is issued after net up.
-+ */
-+ Port = 0;
-+ pAC->Rlmt.Net[0].Preference = Port;
-+ pAC->Rlmt.Net[0].PrefPort = Port;
- } else if (strcmp(PrefPort[pAC->Index],"B") == 0) {
-- /*
-- ** do not set ActivePort here, thus a port
-- ** switch is issued after net up.
-- */
-- Port = 1;
-- pAC->Rlmt.Net[0].Preference = Port;
-- pAC->Rlmt.Net[0].PrefPort = Port;
-+ /*
-+ ** do not set ActivePort here, thus a port
-+ ** switch is issued after net up.
-+ */
-+ if (pAC->GIni.GIMacsFound == 1) {
-+ printk("sk98lin: Illegal value \"B\" for PrefPort.\n"
-+ " Port B not available on single port adapters.\n");
-+
-+ pAC->ActivePort = 0;
-+ pAC->Rlmt.Net[0].Preference = -1; /* auto */
-+ pAC->Rlmt.Net[0].PrefPort = 0;
-+ } else {
-+ Port = 1;
-+ pAC->Rlmt.Net[0].Preference = Port;
-+ pAC->Rlmt.Net[0].PrefPort = Port;
-+ }
- } else {
-- printk("%s: Illegal value \"%s\" for PrefPort\n",
-- pAC->dev[0]->name, PrefPort[pAC->Index]);
-+ printk("sk98lin: Illegal value \"%s\" for PrefPort\n",
-+ PrefPort[pAC->Index]);
- }
- }
-
-@@ -4325,9 +4522,9 @@ int Capabilities[3][3] =
- pAC->RlmtMode = SK_RLMT_CHECK_LINK;
- pAC->RlmtNets = 2;
- } else {
-- printk("%s: Illegal value \"%s\" for"
-+ printk("sk98lin: Illegal value \"%s\" for"
- " RlmtMode, using default\n",
-- pAC->dev[0]->name, RlmtMode[pAC->Index]);
-+ RlmtMode[pAC->Index]);
- pAC->RlmtMode = 0;
- }
- } else {
-@@ -4338,97 +4535,111 @@ int Capabilities[3][3] =
- ** Check the interrupt moderation parameters
- */
- if (Moderation[pAC->Index] != NULL) {
-- if (strcmp(Moderation[pAC->Index], "Static") == 0) {
-- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_STATIC;
-- } else if (strcmp(Moderation[pAC->Index], "Dynamic") == 0) {
-- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_DYNAMIC;
-- } else {
-- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
-- }
-+ if (strcmp(Moderation[pAC->Index], "") == 0) {
-+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
-+ } else if (strcmp(Moderation[pAC->Index], "Static") == 0) {
-+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_STATIC;
-+ } else if (strcmp(Moderation[pAC->Index], "Dynamic") == 0) {
-+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_DYNAMIC;
-+ } else if (strcmp(Moderation[pAC->Index], "None") == 0) {
-+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
-+ } else {
-+ printk("sk98lin: Illegal value \"%s\" for Moderation.\n"
-+ " Disable interrupt moderation.\n",
-+ Moderation[pAC->Index]);
-+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
-+ }
- } else {
-- pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
-+ pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE;
- }
-
- if (Stats[pAC->Index] != NULL) {
-- if (strcmp(Stats[pAC->Index], "Yes") == 0) {
-- pAC->DynIrqModInfo.DisplayStats = SK_TRUE;
-- } else {
-- pAC->DynIrqModInfo.DisplayStats = SK_FALSE;
-- }
-+ if (strcmp(Stats[pAC->Index], "Yes") == 0) {
-+ pAC->DynIrqModInfo.DisplayStats = SK_TRUE;
-+ } else {
-+ pAC->DynIrqModInfo.DisplayStats = SK_FALSE;
-+ }
- } else {
-- pAC->DynIrqModInfo.DisplayStats = SK_FALSE;
-+ pAC->DynIrqModInfo.DisplayStats = SK_FALSE;
- }
-
-- if (ModerationMask[pAC->Index] != NULL) {
-- if (strcmp(ModerationMask[pAC->Index], "Rx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY;
-- } else if (strcmp(ModerationMask[pAC->Index], "Tx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_ONLY;
-- } else if (strcmp(ModerationMask[pAC->Index], "Sp") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_ONLY;
-- } else if (strcmp(ModerationMask[pAC->Index], "RxSp") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX;
-- } else if (strcmp(ModerationMask[pAC->Index], "SpRx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX;
-- } else if (strcmp(ModerationMask[pAC->Index], "RxTx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
-- } else if (strcmp(ModerationMask[pAC->Index], "TxRx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
-- } else if (strcmp(ModerationMask[pAC->Index], "TxSp") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX;
-- } else if (strcmp(ModerationMask[pAC->Index], "SpTx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX;
-- } else if (strcmp(ModerationMask[pAC->Index], "RxTxSp") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-- } else if (strcmp(ModerationMask[pAC->Index], "RxSpTx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-- } else if (strcmp(ModerationMask[pAC->Index], "TxRxSp") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-- } else if (strcmp(ModerationMask[pAC->Index], "TxSpRx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-- } else if (strcmp(ModerationMask[pAC->Index], "SpTxRx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-- } else if (strcmp(ModerationMask[pAC->Index], "SpRxTx") == 0) {
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-- } else { /* some rubbish */
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY;
-- }
-- } else { /* operator has stated nothing */
-- pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
-- }
--
-- if (AutoSizing[pAC->Index] != NULL) {
-- if (strcmp(AutoSizing[pAC->Index], "On") == 0) {
-- pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
-- } else {
-- pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
-- }
-- } else { /* operator has stated nothing */
-- pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
-- }
-+ if (ModerationMask[pAC->Index] != NULL) {
-+ if (strcmp(ModerationMask[pAC->Index], "Rx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY;
-+ } else if (strcmp(ModerationMask[pAC->Index], "Tx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_ONLY;
-+ } else if (strcmp(ModerationMask[pAC->Index], "Sp") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_ONLY;
-+ } else if (strcmp(ModerationMask[pAC->Index], "RxSp") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX;
-+ } else if (strcmp(ModerationMask[pAC->Index], "SpRx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX;
-+ } else if (strcmp(ModerationMask[pAC->Index], "RxTx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
-+ } else if (strcmp(ModerationMask[pAC->Index], "TxRx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
-+ } else if (strcmp(ModerationMask[pAC->Index], "TxSp") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX;
-+ } else if (strcmp(ModerationMask[pAC->Index], "SpTx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX;
-+ } else if (strcmp(ModerationMask[pAC->Index], "RxTxSp") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-+ } else if (strcmp(ModerationMask[pAC->Index], "RxSpTx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-+ } else if (strcmp(ModerationMask[pAC->Index], "TxRxSp") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-+ } else if (strcmp(ModerationMask[pAC->Index], "TxSpRx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-+ } else if (strcmp(ModerationMask[pAC->Index], "SpTxRx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-+ } else if (strcmp(ModerationMask[pAC->Index], "SpRxTx") == 0) {
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP;
-+ } else { /* some rubbish */
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY;
-+ }
-+ } else { /* operator has stated nothing */
-+ pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX;
-+ }
-+
-+ if (AutoSizing[pAC->Index] != NULL) {
-+ if (strcmp(AutoSizing[pAC->Index], "On") == 0) {
-+ pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
-+ } else {
-+ pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
-+ }
-+ } else { /* operator has stated nothing */
-+ pAC->DynIrqModInfo.AutoSizing = SK_FALSE;
-+ }
-
-- if (IntsPerSec[pAC->Index] != 0) {
-- if ((IntsPerSec[pAC->Index]< 30) || (IntsPerSec[pAC->Index]> 40000)) {
-- pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT;
-- } else {
-- pAC->DynIrqModInfo.MaxModIntsPerSec = IntsPerSec[pAC->Index];
-- }
-- } else {
-- pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT;
-- }
-+ if (IntsPerSec[pAC->Index] != 0) {
-+ if ((IntsPerSec[pAC->Index]< C_INT_MOD_IPS_LOWER_RANGE) ||
-+ (IntsPerSec[pAC->Index] > C_INT_MOD_IPS_UPPER_RANGE)) {
-+ printk("sk98lin: Illegal value \"%d\" for IntsPerSec. (Range: %d - %d)\n"
-+ " Using default value of %i.\n",
-+ IntsPerSec[pAC->Index],
-+ C_INT_MOD_IPS_LOWER_RANGE,
-+ C_INT_MOD_IPS_UPPER_RANGE,
-+ C_INTS_PER_SEC_DEFAULT);
-+ pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT;
-+ } else {
-+ pAC->DynIrqModInfo.MaxModIntsPerSec = IntsPerSec[pAC->Index];
-+ }
-+ } else {
-+ pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT;
-+ }
-
-- /*
-+ /*
- ** Evaluate upper and lower moderation threshold
- */
-- pAC->DynIrqModInfo.MaxModIntsPerSecUpperLimit =
-- pAC->DynIrqModInfo.MaxModIntsPerSec +
-- (pAC->DynIrqModInfo.MaxModIntsPerSec / 2);
--
-- pAC->DynIrqModInfo.MaxModIntsPerSecLowerLimit =
-- pAC->DynIrqModInfo.MaxModIntsPerSec -
-- (pAC->DynIrqModInfo.MaxModIntsPerSec / 2);
-+ pAC->DynIrqModInfo.MaxModIntsPerSecUpperLimit =
-+ pAC->DynIrqModInfo.MaxModIntsPerSec +
-+ (pAC->DynIrqModInfo.MaxModIntsPerSec / 2);
-+
-+ pAC->DynIrqModInfo.MaxModIntsPerSecLowerLimit =
-+ pAC->DynIrqModInfo.MaxModIntsPerSec -
-+ (pAC->DynIrqModInfo.MaxModIntsPerSec / 2);
-
-- pAC->DynIrqModInfo.PrevTimeVal = jiffies; /* initial value */
-+ pAC->DynIrqModInfo.PrevTimeVal = jiffies; /* initial value */
-
-
- } /* GetConfiguration */
-@@ -4826,6 +5037,10 @@ SK_BOOL DualNet;
- FromPort = Param.Para32[0];
- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
- ("NET UP EVENT, Port: %d ", Param.Para32[0]));
-+ /* Mac update */
-+ SkAddrMcUpdate(pAC,IoC, FromPort);
-+
-+ if (DoPrintInterfaceChange) {
- printk("%s: network connection up using"
- " port %c\n", pAC->dev[Param.Para32[0]]->name, 'A'+Param.Para32[0]);
-
-@@ -4841,8 +5056,6 @@ SK_BOOL DualNet;
- printk(" speed: unknown\n");
- }
-
-- /* Mac update */
-- SkAddrMcUpdate(pAC,IoC, FromPort);
-
- Stat = pAC->GIni.GP[FromPort].PLinkModeStatus;
- if (Stat == SK_LMODE_STAT_AUTOHALF ||
-@@ -4920,6 +5133,9 @@ SK_BOOL DualNet;
- printk(" rx-checksum: disabled\n");
- #endif
-
-+ } else {
-+ DoPrintInterfaceChange = SK_TRUE;
-+ }
-
- if ((Param.Para32[0] != pAC->ActivePort) &&
- (pAC->RlmtNets == 1)) {
-@@ -4937,7 +5153,12 @@ SK_BOOL DualNet;
- /* action list 7 */
- SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_EVENT,
- ("NET DOWN EVENT "));
-- printk("%s: network connection down\n", pAC->dev[Param.Para32[1]]->name);
-+ if (DoPrintInterfaceChange) {
-+ printk("%s: network connection down\n",
-+ pAC->dev[Param.Para32[1]]->name);
-+ } else {
-+ DoPrintInterfaceChange = SK_TRUE;
-+ }
- pAC->dev[Param.Para32[1]]->flags &= ~IFF_RUNNING;
- break;
- case SK_DRV_SWITCH_HARD: /* SK_U32 FromPortIdx SK_U32 ToPortIdx */
-@@ -5122,6 +5343,231 @@ char ClassStr[80];
-
- } /* SkErrorLog */
-
-+#ifdef SK_DIAG_SUPPORT
-+
-+/*****************************************************************************
-+ *
-+ * SkDrvEnterDiagMode - handles DIAG attach request
-+ *
-+ * Description:
-+ * Notify the kernel to NOT access the card any longer due to DIAG
-+ * Deinitialize the Card
-+ *
-+ * Returns:
-+ * int
-+ */
-+int SkDrvEnterDiagMode(
-+SK_AC *pAc) /* pointer to adapter context */
-+{
-+ SK_AC *pAC = NULL;
-+ DEV_NET *pNet = NULL;
-+
-+ pNet = (DEV_NET *) pAc->dev[0]->priv;
-+ pAC = pNet->pAC;
-+
-+ SK_MEMCPY(&(pAc->PnmiBackup), &(pAc->PnmiStruct),
-+ sizeof(SK_PNMI_STRUCT_DATA));
-+
-+ pAC->DiagModeActive = DIAG_ACTIVE;
-+ if (pAC->BoardLevel > SK_INIT_DATA) {
-+ if (pNet->Up) {
-+ pAC->WasIfUp[0] = SK_TRUE;
-+ pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
-+ DoPrintInterfaceChange = SK_FALSE;
-+ SkDrvDeInitAdapter(pAC, 0); /* performs SkGeClose */
-+ } else {
-+ pAC->WasIfUp[0] = SK_FALSE;
-+ }
-+ if (pNet != (DEV_NET *) pAc->dev[1]->priv) {
-+ pNet = (DEV_NET *) pAc->dev[1]->priv;
-+ if (pNet->Up) {
-+ pAC->WasIfUp[1] = SK_TRUE;
-+ pAC->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
-+ DoPrintInterfaceChange = SK_FALSE;
-+ SkDrvDeInitAdapter(pAC, 1); /* do SkGeClose */
-+ } else {
-+ pAC->WasIfUp[1] = SK_FALSE;
-+ }
-+ }
-+ pAC->BoardLevel = SK_INIT_DATA;
-+ }
-+ return(0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * SkDrvLeaveDiagMode - handles DIAG detach request
-+ *
-+ * Description:
-+ * Notify the kernel to may access the card again after use by DIAG
-+ * Initialize the Card
-+ *
-+ * Returns:
-+ * int
-+ */
-+int SkDrvLeaveDiagMode(
-+SK_AC *pAc) /* pointer to adapter control context */
-+{
-+ SK_MEMCPY(&(pAc->PnmiStruct), &(pAc->PnmiBackup),
-+ sizeof(SK_PNMI_STRUCT_DATA));
-+ pAc->DiagModeActive = DIAG_NOTACTIVE;
-+ pAc->Pnmi.DiagAttached = SK_DIAG_IDLE;
-+ if (pAc->WasIfUp[0] == SK_TRUE) {
-+ pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
-+ DoPrintInterfaceChange = SK_FALSE;
-+ SkDrvInitAdapter(pAc, 0); /* first device */
-+ }
-+ if (pAc->WasIfUp[1] == SK_TRUE) {
-+ pAc->DiagFlowCtrl = SK_TRUE; /* for SkGeClose */
-+ DoPrintInterfaceChange = SK_FALSE;
-+ SkDrvInitAdapter(pAc, 1); /* second device */
-+ }
-+ return(0);
-+}
-+
-+/*****************************************************************************
-+ *
-+ * ParseDeviceNbrFromSlotName - Evaluate PCI device number
-+ *
-+ * Description:
-+ * This function parses the PCI slot name information string and will
-+ * retrieve the devcie number out of it. The slot_name maintianed by
-+ * linux is in the form of '02:0a.0', whereas the first two characters
-+ * represent the bus number in hex (in the sample above this is
-+ * pci bus 0x02) and the next two characters the device number (0x0a).
-+ *
-+ * Returns:
-+ * SK_U32: The device number from the PCI slot name
-+ */
-+
-+static SK_U32 ParseDeviceNbrFromSlotName(
-+const char *SlotName) /* pointer to pci slot name eg. '02:0a.0' */
-+{
-+ char *CurrCharPos = (char *) SlotName;
-+ int FirstNibble = -1;
-+ int SecondNibble = -1;
-+ SK_U32 Result = 0;
-+
-+ while (*CurrCharPos != '\0') {
-+ if (*CurrCharPos == ':') {
-+ while (*CurrCharPos != '.') {
-+ CurrCharPos++;
-+ if ( (*CurrCharPos >= '0') &&
-+ (*CurrCharPos <= '9')) {
-+ if (FirstNibble == -1) {
-+ /* dec. value for '0' */
-+ FirstNibble = *CurrCharPos - 48;
-+ } else {
-+ SecondNibble = *CurrCharPos - 48;
-+ }
-+ } else if ( (*CurrCharPos >= 'a') &&
-+ (*CurrCharPos <= 'f') ) {
-+ if (FirstNibble == -1) {
-+ FirstNibble = *CurrCharPos - 87;
-+ } else {
-+ SecondNibble = *CurrCharPos - 87;
-+ }
-+ } else {
-+ Result = 0;
-+ }
-+ }
-+
-+ Result = FirstNibble;
-+ Result = Result << 4; /* first nibble is higher one */
-+ Result = Result | SecondNibble;
-+ }
-+ CurrCharPos++; /* next character */
-+ }
-+ return (Result);
-+}
-+
-+/****************************************************************************
-+ *
-+ * SkDrvDeInitAdapter - deinitialize adapter (this function is only
-+ * called if Diag attaches to that card)
-+ *
-+ * Description:
-+ * Close initialized adapter.
-+ *
-+ * Returns:
-+ * 0 - on success
-+ * error code - on error
-+ */
-+static int SkDrvDeInitAdapter(
-+SK_AC *pAC, /* pointer to adapter context */
-+int devNbr) /* what device is to be handled */
-+{
-+ struct SK_NET_DEVICE *dev;
-+
-+ dev = pAC->dev[devNbr];
-+
-+ /*
-+ ** Function SkGeClose() uses MOD_DEC_USE_COUNT (2.2/2.4)
-+ ** or module_put() (2.6) to decrease the number of users for
-+ ** a device, but if a device is to be put under control of
-+ ** the DIAG, that count is OK already and does not need to
-+ ** be adapted! Hence the opposite MOD_INC_USE_COUNT or
-+ ** try_module_get() needs to be used again to correct that.
-+ */
-+ if (!try_module_get(THIS_MODULE)) {
-+ return (-1);
-+ }
-+
-+ if (SkGeClose(dev) != 0) {
-+ module_put(THIS_MODULE);
-+ return (-1);
-+ }
-+ return (0);
-+
-+} /* SkDrvDeInitAdapter() */
-+
-+/****************************************************************************
-+ *
-+ * SkDrvInitAdapter - Initialize adapter (this function is only
-+ * called if Diag deattaches from that card)
-+ *
-+ * Description:
-+ * Close initialized adapter.
-+ *
-+ * Returns:
-+ * 0 - on success
-+ * error code - on error
-+ */
-+static int SkDrvInitAdapter(
-+SK_AC *pAC, /* pointer to adapter context */
-+int devNbr) /* what device is to be handled */
-+{
-+ struct SK_NET_DEVICE *dev;
-+
-+ dev = pAC->dev[devNbr];
-+
-+ if (SkGeOpen(dev) != 0) {
-+ return (-1);
-+ } else {
-+ /*
-+ ** Function SkGeOpen() uses MOD_INC_USE_COUNT (2.2/2.4)
-+ ** or try_module_get() (2.6) to increase the number of
-+ ** users for a device, but if a device was just under
-+ ** control of the DIAG, that count is OK already and
-+ ** does not need to be adapted! Hence the opposite
-+ ** MOD_DEC_USE_COUNT or module_put() needs to be used
-+ ** again to correct that.
-+ */
-+ module_put(THIS_MODULE);
-+ }
-+
-+ /*
-+ ** Use correct MTU size and indicate to kernel TX queue can be started
-+ */
-+ if (SkGeChangeMtu(dev, dev->mtu) != 0) {
-+ return (-1);
-+ }
-+ return (0);
-+
-+} /* SkDrvInitAdapter */
-+
-+#endif
-+
- #ifdef DEBUG
- /****************************************************************************/
- /* "debug only" section *****************************************************/
---- linux-2.6.0/drivers/net/sk98lin/skgehwt.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skgehwt.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1,10 +1,10 @@
- /******************************************************************************
- *
- * Name: skgehwt.c
-- * Project: Gigabit Ethernet Adapters, Common Modules
-- * Version: $Revision: 1.14 $
-- * Date: $Date: 2003/05/13 18:01:58 $
-- * Purpose: Hardware Timer.
-+ * Project: Gigabit Ethernet Adapters, Event Scheduler Module
-+ * Version: $Revision: 1.15 $
-+ * Date: $Date: 2003/09/16 13:41:23 $
-+ * Purpose: Hardware Timer
- *
- ******************************************************************************/
-
-@@ -27,6 +27,10 @@
- * History:
- *
- * $Log: skgehwt.c,v $
-+ * Revision 1.15 2003/09/16 13:41:23 rschmidt
-+ * Added (C) Marvell to SysKonnectFileId
-+ * Editorial changes
-+ *
- * Revision 1.14 2003/05/13 18:01:58 mkarl
- * Editorial changes.
- *
-@@ -69,19 +73,15 @@
- *
- * Revision 1.1 1998/08/05 11:28:36 gklug
- * first version: adapted from SMT/FDDI
-- *
-- *
-- *
- *
- ******************************************************************************/
-
--
- /*
-- Event queue and dispatcher
--*/
-+ * Event queue and dispatcher
-+ */
- #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "$Header: /usr56/projects/ge/schedule/skgehwt.c,v 1.14 2003/05/13 18:01:58 mkarl Exp $" ;
-+ "@(#) $Id: skgehwt.c,v 1.15 2003/09/16 13:41:23 rschmidt Exp $ (C) Marvell.";
- #endif
-
- #include "h/skdrv1st.h" /* Driver Specific Definitions */
-@@ -89,10 +89,7 @@ static const char SysKonnectFileId[] =
-
- #ifdef __C2MAN__
- /*
-- Hardware Timer function queue management.
--
-- General Description:
--
-+ * Hardware Timer function queue management.
- */
- intro()
- {}
-@@ -117,9 +114,9 @@ SK_IOC Ioc) /* IoContext */
- {
- pAC->Hwt.TStart = 0 ;
- pAC->Hwt.TStop = 0 ;
-- pAC->Hwt.TActive = SK_FALSE ;
-+ pAC->Hwt.TActive = SK_FALSE;
-
-- SkHwtStop(pAC,Ioc) ;
-+ SkHwtStop(pAC, Ioc);
- }
-
- /*
-@@ -132,28 +129,29 @@ SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc, /* IoContext */
- SK_U32 Time) /* Time in units of 16us to load the timer with. */
- {
-- SK_U32 Cnt ;
-+ SK_U32 Cnt;
-
- if (Time > SK_HWT_MAX)
-- Time = SK_HWT_MAX ;
-+ Time = SK_HWT_MAX;
-
-- pAC->Hwt.TStart = Time ;
-- pAC->Hwt.TStop = 0L ;
-+ pAC->Hwt.TStart = Time;
-+ pAC->Hwt.TStop = 0L;
-
-- Cnt = Time ;
-+ Cnt = Time;
-
- /*
- * if time < 16 us
- * time = 16 us
- */
- if (!Cnt) {
-- Cnt++ ;
-+ Cnt++;
- }
-
-- SK_OUT32(Ioc, B2_TI_INI, Cnt * SK_HWT_FAC) ;
-- SK_OUT16(Ioc, B2_TI_CRTL, TIM_START) ; /* Start timer. */
-+ SK_OUT32(Ioc, B2_TI_INI, Cnt * SK_HWT_FAC);
-+
-+ SK_OUT16(Ioc, B2_TI_CTRL, TIM_START); /* Start timer. */
-
-- pAC->Hwt.TActive = SK_TRUE ;
-+ pAC->Hwt.TActive = SK_TRUE;
- }
-
- /*
-@@ -164,10 +162,11 @@ void SkHwtStop(
- SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc) /* IoContext */
- {
-- SK_OUT16(Ioc, B2_TI_CRTL, TIM_STOP) ;
-- SK_OUT16(Ioc, B2_TI_CRTL, TIM_CLR_IRQ) ;
-+ SK_OUT16(Ioc, B2_TI_CTRL, TIM_STOP);
-+
-+ SK_OUT16(Ioc, B2_TI_CTRL, TIM_CLR_IRQ);
-
-- pAC->Hwt.TActive = SK_FALSE ;
-+ pAC->Hwt.TActive = SK_FALSE;
- }
-
-
-@@ -182,26 +181,31 @@ SK_U32 SkHwtRead(
- SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc) /* IoContext */
- {
-- SK_U32 TRead ;
-- SK_U32 IStatus ;
-+ SK_U32 TRead;
-+ SK_U32 IStatus;
-
- if (pAC->Hwt.TActive) {
-- SkHwtStop(pAC,Ioc) ;
-+
-+ SkHwtStop(pAC, Ioc);
-
- SK_IN32(Ioc, B2_TI_VAL, &TRead);
- TRead /= SK_HWT_FAC;
-
- SK_IN32(Ioc, B0_ISRC, &IStatus);
-
-- /* Check if timer expired (or wraparound). */
-+ /* Check if timer expired (or wraped around) */
- if ((TRead > pAC->Hwt.TStart) || (IStatus & IS_TIMINT)) {
-- SkHwtStop(pAC,Ioc) ;
-- pAC->Hwt.TStop = pAC->Hwt.TStart ;
-- } else {
-- pAC->Hwt.TStop = pAC->Hwt.TStart - TRead ;
-+
-+ SkHwtStop(pAC, Ioc);
-+
-+ pAC->Hwt.TStop = pAC->Hwt.TStart;
-+ }
-+ else {
-+
-+ pAC->Hwt.TStop = pAC->Hwt.TStart - TRead;
- }
- }
-- return (pAC->Hwt.TStop) ;
-+ return(pAC->Hwt.TStop);
- }
-
- /*
-@@ -211,9 +215,11 @@ void SkHwtIsr(
- SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc) /* IoContext */
- {
-- SkHwtStop(pAC,Ioc);
-+ SkHwtStop(pAC, Ioc);
-+
- pAC->Hwt.TStop = pAC->Hwt.TStart;
-- SkTimerDone(pAC,Ioc) ;
-+
-+ SkTimerDone(pAC, Ioc);
- }
-
- /* End of file */
---- linux-2.6.0/drivers/net/sk98lin/skgeinit.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skgeinit.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skgeinit.c
- * Project: Gigabit Ethernet Adapters, Common Modules
-- * Version: $Revision: 1.93 $
-- * Date: $Date: 2003/05/28 15:44:43 $
-+ * Version: $Revision: 1.97 $
-+ * Date: $Date: 2003/10/02 16:45:31 $
- * Purpose: Contains functions to initialize the adapter
- *
- ******************************************************************************/
-@@ -27,6 +27,32 @@
- * History:
- *
- * $Log: skgeinit.c,v $
-+ * Revision 1.97 2003/10/02 16:45:31 rschmidt
-+ * Replaced default values of GMAC parameters with defines.
-+ * Removed hard reset of MACs in SkGeDeInit().
-+ * Added define SK_PHY_LP_MODE around power saving mode in SkGeDeInit().
-+ * Added check for VAUX available before switch power to VAUX.
-+ *
-+ * Revision 1.96 2003/09/18 14:02:41 rroesler
-+ * Add: Perform a hardreset of MACs in GeDeInit()
-+ *
-+ * Revision 1.95 2003/09/16 14:26:59 rschmidt
-+ * Added switch power to VCC (WA for VAUX problem) in SkGeInit1().
-+ * Fixed setting PHY to coma mode and D3 power state in SkGeDeInit().
-+ * Editorial changes.
-+ *
-+ * Revision 1.94 2003/09/16 07:17:10 mschmid
-+ * Added init for new members in port structure for MAC control
-+ * - PMacColThres
-+ * - PMacJamLen
-+ * - PMacJamIpgVal
-+ * - PMacJamIpgData
-+ * - PMacIpgData
-+ * - PMacLimit4
-+ * Added init for PHY power state in port structure
-+ * - PPhyPowerState
-+ * Added shutdown handling for Yukon Plus in SkGeDeInit()
-+ *
- * Revision 1.93 2003/05/28 15:44:43 rschmidt
- * Added check for chip Id on WOL WA for chip Rev. A.
- * Added setting of GILevel in SkGeDeInit().
-@@ -446,7 +472,7 @@
-
- #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "@(#) $Id: skgeinit.c,v 1.93 2003/05/28 15:44:43 rschmidt Exp $ (C) Marvell.";
-+ "@(#) $Id: skgeinit.c,v 1.97 2003/10/02 16:45:31 rschmidt Exp $ (C) Marvell.";
- #endif
-
- struct s_QOffTab {
-@@ -1013,8 +1039,6 @@ int Port) /* Port Index (MAC_1 + n) */
- * - enable the FIFO
- */
-
-- Word = (SK_U16)GMF_RX_CTRL_DEF;
--
- #ifdef GENESIS
- if (pAC->GIni.GIGenesis) {
- /* Configure Rx MAC FIFO */
-@@ -1039,6 +1063,8 @@ int Port) /* Port Index (MAC_1 + n) */
- /* set Rx GMAC FIFO Flush Mask */
- SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), (SK_U16)RX_FF_FL_DEF_MSK);
-
-+ Word = (SK_U16)GMF_RX_CTRL_DEF;
-+
- /* disable Rx GMAC FIFO Flush for YUKON-Lite Rev. A0 only */
- if (pAC->GIni.GIYukonLite && pAC->GIni.GIChipId == CHIP_ID_YUKON) {
-
-@@ -1809,6 +1835,13 @@ SK_IOC IoC) /* IO context */
- pPrt->PAutoNegFail = SK_FALSE;
- pPrt->PHWLinkUp = SK_FALSE;
- pPrt->PLinkBroken = SK_TRUE; /* See WA code */
-+ pPrt->PPhyPowerState = PHY_PM_OPERATIONAL_MODE;
-+ pPrt->PMacColThres = TX_COL_DEF;
-+ pPrt->PMacJamLen = TX_JAM_LEN_DEF;
-+ pPrt->PMacJamIpgVal = TX_JAM_IPG_DEF;
-+ pPrt->PMacJamIpgData = TX_IPG_JAM_DEF;
-+ pPrt->PMacIpgData = IPG_DATA_DEF;
-+ pPrt->PMacLimit4 = SK_FALSE;
- }
-
- pAC->GIni.GIPortUsage = SK_RED_LINK;
-@@ -1963,7 +1996,7 @@ SK_IOC IoC) /* IO context */
- /* restore CLK_RUN bits */
- SK_OUT16(IoC, B0_CTST, (SK_U16)(CtrlStat &
- (CS_CLK_RUN_HOT | CS_CLK_RUN_RST | CS_CLK_RUN_ENA)));
--
-+
- /* read Chip Identification Number */
- SK_IN8(IoC, B2_CHIP_ID, &Byte);
- pAC->GIni.GIChipId = Byte;
-@@ -2053,6 +2086,10 @@ SK_IOC IoC) /* IO context */
- }
- }
-
-+ /* switch power to VCC (WA for VAUX problem) */
-+ SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA |
-+ PC_VAUX_OFF | PC_VCC_ON));
-+
- /* read the Interrupt source */
- SK_IN32(IoC, B0_ISRC, &DWord);
-
-@@ -2395,6 +2432,11 @@ SK_IOC IoC) /* IO context */
- int i;
- SK_U16 Word;
-
-+#ifdef SK_PHY_LP_MODE
-+ SK_U8 Byte;
-+ SK_U16 PmCtlSts;
-+#endif /* SK_PHY_LP_MODE */
-+
- #if (!defined(SK_SLIM) && !defined(VCPU))
- /* ensure I2C is ready */
- SkI2cWaitIrq(pAC, IoC);
-@@ -2409,6 +2451,38 @@ SK_IOC IoC) /* IO context */
- }
- }
-
-+#ifdef SK_PHY_LP_MODE
-+ /*
-+ * for power saving purposes within mobile environments
-+ * we set the PHY to coma mode and switch to D3 power state.
-+ */
-+ if (pAC->GIni.GIYukonLite &&
-+ pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) {
-+
-+ /* for all ports switch PHY to coma mode */
-+ for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
-+
-+ SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP);
-+ }
-+
-+ if (pAC->GIni.GIVauxAvail) {
-+ /* switch power to VAUX */
-+ Byte = PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF;
-+
-+ SK_OUT8(IoC, B0_POWER_CTRL, Byte);
-+ }
-+
-+ /* switch to D3 state */
-+ SK_IN16(IoC, PCI_C(PCI_PM_CTL_STS), &PmCtlSts);
-+
-+ PmCtlSts |= PCI_PM_STATE_D3;
-+
-+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
-+
-+ SK_OUT16(IoC, PCI_C(PCI_PM_CTL_STS), PmCtlSts);
-+ }
-+#endif /* SK_PHY_LP_MODE */
-+
- /* Reset all bits in the PCI STATUS register */
- /*
- * Note: PCI Cfg cycles cannot be used, because they are not
---- linux-2.6.0/drivers/net/sk98lin/skgemib.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skgemib.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skgemib.c
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.9 $
-- * Date: $Date: 2003/05/23 12:55:20 $
-+ * Version: $Revision: 1.11 $
-+ * Date: $Date: 2003/09/15 13:38:12 $
- * Purpose: Private Network Management Interface Management Database
- *
- ****************************************************************************/
-@@ -27,6 +27,19 @@
- * History:
- *
- * $Log: skgemib.c,v $
-+ * Revision 1.11 2003/09/15 13:38:12 tschilli
-+ * OID_SKGE_PHY_LP_MODE included only after using #define SK_PHY_LP_MODE.
-+ *
-+ * Revision 1.10 2003/08/15 12:28:59 tschilli
-+ * Added new OIDs:
-+ * OID_SKGE_DRIVER_RELDATE
-+ * OID_SKGE_DRIVER_FILENAME
-+ * OID_SKGE_CHIPID
-+ * OID_SKGE_RAMSIZE
-+ * OID_SKGE_VAUXAVAIL
-+ * OID_SKGE_PHY_TYPE
-+ * OID_SKGE_PHY_LP_MODE
-+ *
- * Revision 1.9 2003/05/23 12:55:20 tschilli
- * OID_SKGE_BOARDLEVEL added.
- *
-@@ -356,6 +369,16 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTa
- 0,
- SK_PNMI_MAI_OFF(DriverVersion),
- SK_PNMI_RO, General, 0},
-+ {OID_SKGE_DRIVER_RELDATE,
-+ 1,
-+ 0,
-+ SK_PNMI_MAI_OFF(DriverReleaseDate),
-+ SK_PNMI_RO, General, 0},
-+ {OID_SKGE_DRIVER_FILENAME,
-+ 1,
-+ 0,
-+ SK_PNMI_MAI_OFF(DriverFileName),
-+ SK_PNMI_RO, General, 0},
- {OID_SKGE_HW_DESCR,
- 1,
- 0,
-@@ -371,6 +394,21 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTa
- 0,
- SK_PNMI_MAI_OFF(Chipset),
- SK_PNMI_RO, General, 0},
-+ {OID_SKGE_CHIPID,
-+ 1,
-+ 0,
-+ SK_PNMI_MAI_OFF(ChipId),
-+ SK_PNMI_RO, General, 0},
-+ {OID_SKGE_RAMSIZE,
-+ 1,
-+ 0,
-+ SK_PNMI_MAI_OFF(RamSize),
-+ SK_PNMI_RO, General, 0},
-+ {OID_SKGE_VAUXAVAIL,
-+ 1,
-+ 0,
-+ SK_PNMI_MAI_OFF(VauxAvail),
-+ SK_PNMI_RO, General, 0},
- {OID_SKGE_ACTION,
- 1,
- 0,
-@@ -876,6 +914,18 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTa
- sizeof(SK_PNMI_CONF),
- SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfConnector),
- SK_PNMI_RO, MacPrivateConf, 0},
-+ {OID_SKGE_PHY_TYPE,
-+ SK_PNMI_MAC_ENTRIES,
-+ sizeof(SK_PNMI_CONF),
-+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType),
-+ SK_PNMI_RO, MacPrivateConf, 0},
-+#ifdef SK_PHY_LP_MODE
-+ {OID_SKGE_PHY_LP_MODE,
-+ SK_PNMI_MAC_ENTRIES,
-+ sizeof(SK_PNMI_CONF),
-+ SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyMode),
-+ SK_PNMI_RW, MacPrivateConf, 0},
-+#endif
- {OID_SKGE_LINK_CAP,
- SK_PNMI_MAC_ENTRIES,
- sizeof(SK_PNMI_CONF),
---- linux-2.6.0/drivers/net/sk98lin/skgepnmi.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skgepnmi.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skgepnmi.c
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.109 $
-- * Date: $Date: 2003/07/17 14:15:24 $
-+ * Version: $Revision: 1.111 $
-+ * Date: $Date: 2003/09/15 13:35:35 $
- * Purpose: Private Network Management Interface
- *
- ****************************************************************************/
-@@ -27,6 +27,22 @@
- * History:
- *
- * $Log: skgepnmi.c,v $
-+ * Revision 1.111 2003/09/15 13:35:35 tschilli
-+ * Code for OID_SKGE_PHY_LP_MODE completed (using #define SK_PHY_LP_MODE).
-+ * SK_DIAG_ATTACHED handling for OID_SKGE_DIAG_MODE in DiagActions() changed.
-+ *
-+ * Revision 1.110 2003/08/15 12:28:04 tschilli
-+ * Added new OIDs:
-+ * OID_SKGE_DRIVER_RELDATE
-+ * OID_SKGE_DRIVER_FILENAME
-+ * OID_SKGE_CHIPID
-+ * OID_SKGE_RAMSIZE
-+ * OID_SKGE_VAUXAVAIL
-+ * OID_SKGE_PHY_TYPE
-+ * OID_SKGE_PHY_LP_MODE
-+ *
-+ * Added SK_DIAG_ATTACHED handling for OID_SKGE_DIAG_MODE in DiagActions().
-+ *
- * Revision 1.109 2003/07/17 14:15:24 tschilli
- * Bug in SkPnmiGenIoctl() fixed.
- *
-@@ -471,7 +487,7 @@
-
- #ifndef _lint
- static const char SysKonnectFileId[] =
-- "@(#) $Id: skgepnmi.c,v 1.109 2003/07/17 14:15:24 tschilli Exp $ (C) Marvell.";
-+ "@(#) $Id: skgepnmi.c,v 1.111 2003/09/15 13:35:35 tschilli Exp $ (C) Marvell.";
- #endif /* !_lint */
-
- #include "h/skdrv1st.h"
-@@ -4008,14 +4024,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- #endif /* SK_NDIS_64BIT_CTR */
- break;
-
-- case OID_SKGE_BOARDLEVEL:
-- if (*pLen < sizeof(SK_U32)) {
--
-- *pLen = sizeof(SK_U32);
-- return (SK_PNMI_ERR_TOO_SHORT);
-- }
-- break;
--
- case OID_SKGE_PORT_NUMBER:
- case OID_SKGE_DEVICE_TYPE:
- case OID_SKGE_RESULT:
-@@ -4023,6 +4031,9 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- case OID_GEN_TRANSMIT_QUEUE_LENGTH:
- case OID_SKGE_TRAP_NUMBER:
- case OID_SKGE_MDB_VERSION:
-+ case OID_SKGE_BOARDLEVEL:
-+ case OID_SKGE_CHIPID:
-+ case OID_SKGE_RAMSIZE:
- if (*pLen < sizeof(SK_U32)) {
-
- *pLen = sizeof(SK_U32);
-@@ -4043,6 +4054,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- case OID_SKGE_BUS_WIDTH:
- case OID_SKGE_SENSOR_NUMBER:
- case OID_SKGE_CHKSM_NUMBER:
-+ case OID_SKGE_VAUXAVAIL:
- if (*pLen < sizeof(SK_U8)) {
-
- *pLen = sizeof(SK_U8);
-@@ -4234,6 +4246,66 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- *pLen = Len;
- break;
-
-+ case OID_SKGE_DRIVER_RELDATE:
-+ if (pAC->Pnmi.pDriverReleaseDate == NULL) {
-+
-+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030,
-+ SK_PNMI_ERR053MSG);
-+
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+
-+ Len = SK_STRLEN(pAC->Pnmi.pDriverReleaseDate) + 1;
-+ if (Len > SK_PNMI_STRINGLEN1) {
-+
-+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031,
-+ SK_PNMI_ERR054MSG);
-+
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+
-+ if (*pLen < Len) {
-+
-+ *pLen = Len;
-+ return (SK_PNMI_ERR_TOO_SHORT);
-+ }
-+ *pBuf = (char)(Len - 1);
-+ SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverReleaseDate, Len - 1);
-+ *pLen = Len;
-+ break;
-+
-+ case OID_SKGE_DRIVER_FILENAME:
-+ if (pAC->Pnmi.pDriverFileName == NULL) {
-+
-+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR030,
-+ SK_PNMI_ERR055MSG);
-+
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+
-+ Len = SK_STRLEN(pAC->Pnmi.pDriverFileName) + 1;
-+ if (Len > SK_PNMI_STRINGLEN1) {
-+
-+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR031,
-+ SK_PNMI_ERR056MSG);
-+
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+
-+ if (*pLen < Len) {
-+
-+ *pLen = Len;
-+ return (SK_PNMI_ERR_TOO_SHORT);
-+ }
-+ *pBuf = (char)(Len - 1);
-+ SK_MEMCPY(pBuf + 1, pAC->Pnmi.pDriverFileName, Len - 1);
-+ *pLen = Len;
-+ break;
-+
- case OID_SKGE_HW_DESCR:
- /*
- * The hardware description is located in the VPD. This
-@@ -4291,8 +4363,25 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- *pLen = sizeof(SK_U16);
- break;
-
-+ case OID_SKGE_CHIPID:
-+ Val32 = pAC->GIni.GIChipId;
-+ SK_PNMI_STORE_U32(pBuf, Val32);
-+ *pLen = sizeof(SK_U32);
-+ break;
-+
-+ case OID_SKGE_RAMSIZE:
-+ Val32 = pAC->GIni.GIRamSize;
-+ SK_PNMI_STORE_U32(pBuf, Val32);
-+ *pLen = sizeof(SK_U32);
-+ break;
-+
-+ case OID_SKGE_VAUXAVAIL:
-+ *pBuf = (char) pAC->GIni.GIVauxAvail;
-+ *pLen = sizeof(char);
-+ break;
-+
- case OID_SKGE_BUS_TYPE:
-- *pBuf = (char)SK_PNMI_BUS_PCI;
-+ *pBuf = (char) SK_PNMI_BUS_PCI;
- *pLen = sizeof(char);
- break;
-
-@@ -5435,6 +5524,9 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- case OID_SKGE_SPEED_CAP:
- case OID_SKGE_SPEED_MODE:
- case OID_SKGE_SPEED_STATUS:
-+#ifdef SK_PHY_LP_MODE
-+ case OID_SKGE_PHY_LP_MODE:
-+#endif
- if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U8)) {
-
- *pLen = (Limit - LogPortIndex) * sizeof(SK_U8);
-@@ -5443,6 +5535,7 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- break;
-
- case OID_SKGE_MTU:
-+ case OID_SKGE_PHY_TYPE:
- if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U32)) {
-
- *pLen = (Limit - LogPortIndex) * sizeof(SK_U32);
-@@ -5488,6 +5581,49 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- Offset += sizeof(char);
- break;
-
-+ case OID_SKGE_PHY_TYPE:
-+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
-+ if (LogPortIndex == 0) {
-+ continue;
-+ }
-+ else {
-+ /* Get value for physical ports */
-+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(
-+ pAC, LogPortIndex);
-+ Val32 = pAC->GIni.GP[PhysPortIndex].PhyType;
-+ SK_PNMI_STORE_U32(pBufPtr, Val32);
-+ }
-+ }
-+ else { /* DualNetMode */
-+
-+ Val32 = pAC->GIni.GP[NetIndex].PhyType;
-+ SK_PNMI_STORE_U32(pBufPtr, Val32);
-+ }
-+ Offset += sizeof(SK_U32);
-+ break;
-+
-+#ifdef SK_PHY_LP_MODE
-+ case OID_SKGE_PHY_LP_MODE:
-+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
-+ if (LogPortIndex == 0) {
-+ continue;
-+ }
-+ else {
-+ /* Get value for physical ports */
-+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
-+ Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState;
-+ *pBufPtr = Val8;
-+ }
-+ }
-+ else { /* DualNetMode */
-+
-+ Val8 = (SK_U8) pAC->GIni.GP[PhysPortIndex].PPhyPowerState;
-+ *pBufPtr = Val8;
-+ }
-+ Offset += sizeof(SK_U8);
-+ break;
-+#endif
-+
- case OID_SKGE_LINK_CAP:
- if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
- if (LogPortIndex == 0) {
-@@ -5804,6 +5940,16 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- }
- break;
-
-+#ifdef SK_PHY_LP_MODE
-+ case OID_SKGE_PHY_LP_MODE:
-+ if (*pLen < Limit - LogPortIndex) {
-+
-+ *pLen = Limit - LogPortIndex;
-+ return (SK_PNMI_ERR_TOO_SHORT);
-+ }
-+ break;
-+#endif
-+
- case OID_SKGE_MTU:
- if (*pLen < sizeof(SK_U32)) {
-
-@@ -6160,6 +6306,116 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
-
- Offset += sizeof(SK_U32);
- break;
-+
-+#ifdef SK_PHY_LP_MODE
-+ case OID_SKGE_PHY_LP_MODE:
-+ /* The preset ends here */
-+ if (Action == SK_PNMI_PRESET) {
-+
-+ return (SK_PNMI_ERR_OK);
-+ }
-+
-+ if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */
-+ if (LogPortIndex == 0) {
-+ Offset = 0;
-+ continue;
-+ }
-+ else {
-+ /* Set value for physical ports */
-+ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex);
-+
-+ switch (*(pBuf + Offset)) {
-+ case 0:
-+ /* If LowPowerMode is active, we can leave it. */
-+ if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
-+
-+ Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex);
-+
-+ if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) {
-+
-+ SkDrvInitAdapter(pAC);
-+ }
-+ break;
-+ }
-+ else {
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+ case 1:
-+ case 2:
-+ case 3:
-+ case 4:
-+ /* If no LowPowerMode is active, we can enter it. */
-+ if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
-+
-+ if ((*(pBuf + Offset)) < 3) {
-+
-+ SkDrvDeInitAdapter(pAC);
-+ }
-+
-+ Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf);
-+ break;
-+ }
-+ else {
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+ default:
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_BAD_VALUE);
-+ }
-+ }
-+ }
-+ else { /* DualNetMode */
-+
-+ switch (*(pBuf + Offset)) {
-+ case 0:
-+ /* If we are in a LowPowerMode, we can leave it. */
-+ if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
-+
-+ Val32 = SkGmLeaveLowPowerMode(pAC, IoC, PhysPortIndex);
-+
-+ if (pAC->GIni.GP[PhysPortIndex].PPhyPowerState < 3) {
-+
-+ SkDrvInitAdapter(pAC);
-+ }
-+ break;
-+ }
-+ else {
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+
-+ case 1:
-+ case 2:
-+ case 3:
-+ case 4:
-+ /* If we are not already in LowPowerMode, we can enter it. */
-+ if (!pAC->GIni.GP[PhysPortIndex].PPhyPowerState) {
-+
-+ if ((*(pBuf + Offset)) < 3) {
-+
-+ SkDrvDeInitAdapter(pAC);
-+ }
-+ else {
-+
-+ Val32 = SkGmEnterLowPowerMode(pAC, IoC, PhysPortIndex, *pBuf);
-+ }
-+ break;
-+ }
-+ else {
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_GENERAL);
-+ }
-+
-+ default:
-+ *pLen = 0;
-+ return (SK_PNMI_ERR_BAD_VALUE);
-+ }
-+ }
-+ Offset += sizeof(SK_U8);
-+ break;
-+#endif
-
- default:
- SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_ERR,
-@@ -6318,6 +6574,7 @@ char *pBuf) /* Buffer used for the mana
- unsigned int PhysPortMax;
- unsigned int PhysPortIndex;
- SK_U8 Val8;
-+ SK_U32 Val32;
- SK_BOOL PortActiveFlag;
- SK_GEPORT *pPrt;
-
-@@ -6340,6 +6597,14 @@ char *pBuf) /* Buffer used for the mana
-
- switch (Id) {
-
-+ case OID_SKGE_PHY_TYPE:
-+ /* Check if it is the first active port */
-+ if (*pBuf == 0) {
-+ Val32 = pPrt->PhyType;
-+ SK_PNMI_STORE_U32(pBuf, Val32);
-+ continue;
-+ }
-+
- case OID_SKGE_LINK_CAP:
-
- /*
-@@ -7974,6 +8239,7 @@ unsigned int TableIndex, /* Index to the
- SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */
- {
-
-+ SK_U32 DiagStatus;
- SK_U32 RetCode = SK_PNMI_ERR_GENERAL;
-
- /*
-@@ -8012,7 +8278,8 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- switch (Id) {
-
- case OID_SKGE_DIAG_MODE:
-- SK_PNMI_STORE_U32(pBuf, pAC->DiagModeActive);
-+ DiagStatus = pAC->Pnmi.DiagAttached;
-+ SK_PNMI_STORE_U32(pBuf, DiagStatus);
- *pLen = sizeof(SK_U32);
- RetCode = SK_PNMI_ERR_OK;
- break;
-@@ -8022,7 +8289,6 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
- RetCode = SK_PNMI_ERR_GENERAL;
- break;
- }
--
- return (RetCode);
- }
-
-@@ -8039,23 +8305,84 @@ SK_U32 NetIndex) /* NetIndex (0..n), in
-
- /* Handle the SET. */
- switch (*pBuf) {
--
-+
-+ /* Attach the DIAG to this adapter. */
-+ case SK_DIAG_ATTACHED:
-+ /* Check if we come from running */
-+ if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {
-+
-+ RetCode = SkDrvLeaveDiagMode(pAC);
-+
-+ }
-+ else if (pAC->Pnmi.DiagAttached == SK_DIAG_IDLE) {
-+
-+ RetCode = SK_PNMI_ERR_OK;
-+ }
-+
-+ else {
-+
-+ RetCode = SK_PNMI_ERR_GENERAL;
-+
-+ }
-+
-+ if (RetCode == SK_PNMI_ERR_OK) {
-+
-+ pAC->Pnmi.DiagAttached = SK_DIAG_ATTACHED;
-+ }
-+ break;
-+
- /* Enter the DIAG mode in the driver. */
-- case 1:
-- /* If DiagMode is not active, we can enter it. */
-- if (!pAC->DiagModeActive) {
-+ case SK_DIAG_RUNNING:
-+ RetCode = SK_PNMI_ERR_OK;
-+
-+ /*
-+ * If DiagAttached is set, we can tell the driver
-+ * to enter the DIAG mode.
-+ */
-+ if (pAC->Pnmi.DiagAttached == SK_DIAG_ATTACHED) {
-+ /* If DiagMode is not active, we can enter it. */
-+ if (!pAC->DiagModeActive) {
-
-- RetCode = SkDrvEnterDiagMode(pAC);
-+ RetCode = SkDrvEnterDiagMode(pAC);
-+ }
-+ else {
-+
-+ RetCode = SK_PNMI_ERR_GENERAL;
-+ }
- }
- else {
-
- RetCode = SK_PNMI_ERR_GENERAL;
- }
-+
-+ if (RetCode == SK_PNMI_ERR_OK) {
-+
-+ pAC->Pnmi.DiagAttached = SK_DIAG_RUNNING;
-+ }
- break;
-
-- /* Leave the DIAG mode in the driver. */
-- case 0:
-- RetCode = SkDrvLeaveDiagMode(pAC);
-+ case SK_DIAG_IDLE:
-+ /* Check if we come from running */
-+ if (pAC->Pnmi.DiagAttached == SK_DIAG_RUNNING) {
-+
-+ RetCode = SkDrvLeaveDiagMode(pAC);
-+
-+ }
-+ else if (pAC->Pnmi.DiagAttached == SK_DIAG_ATTACHED) {
-+
-+ RetCode = SK_PNMI_ERR_OK;
-+ }
-+
-+ else {
-+
-+ RetCode = SK_PNMI_ERR_GENERAL;
-+
-+ }
-+
-+ if (RetCode == SK_PNMI_ERR_OK) {
-+
-+ pAC->Pnmi.DiagAttached = SK_DIAG_IDLE;
-+ }
- break;
-
- default:
---- linux-2.6.0/drivers/net/sk98lin/skgesirq.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skgesirq.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skgesirq.c
- * Project: Gigabit Ethernet Adapters, Common Modules
-- * Version: $Revision: 1.91 $
-- * Date: $Date: 2003/07/04 12:46:22 $
-+ * Version: $Revision: 1.92 $
-+ * Date: $Date: 2003/09/16 14:37:07 $
- * Purpose: Special IRQ module
- *
- ******************************************************************************/
-@@ -27,6 +27,12 @@
- * History:
- *
- * $Log: skgesirq.c,v $
-+ * Revision 1.92 2003/09/16 14:37:07 rschmidt
-+ * Added debug messages in some SkGePortCheckUp...() routines.
-+ * Fixed compiler warnings for different types.
-+ * Avoided port check up in reset state (eg. coma mode).
-+ * Editorial changes.
-+ *
- * Revision 1.91 2003/07/04 12:46:22 rschmidt
- * Added debug messages in SkGePortCheckUpGmac().
- * Added error log message and new driver event SK_DRV_DOWNSHIFT_DET
-@@ -410,7 +416,7 @@
-
- #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "@(#) $Id: skgesirq.c,v 1.91 2003/07/04 12:46:22 rschmidt Exp $ (C) Marvell.";
-+ "@(#) $Id: skgesirq.c,v 1.92 2003/09/16 14:37:07 rschmidt Exp $ (C) Marvell.";
- #endif
-
- #include "h/skdrv1st.h" /* Driver Specific Definitions */
-@@ -490,7 +496,7 @@ int Port) /* Port Index (MAC_1 + n) */
- ("AutoSensing: First mode %d on Port %d\n",
- (int)SK_LMODE_AUTOFULL, Port));
-
-- pPrt->PLinkMode = SK_LMODE_AUTOFULL;
-+ pPrt->PLinkMode = (SK_U8)SK_LMODE_AUTOFULL;
-
- return;
- } /* SkHWInitDefSense */
-@@ -606,7 +612,7 @@ int Port) /* Port Index (MAC_1 + n) */
- /* Reset Port stati */
- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
- pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE;
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_INDETERMINATED;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_INDETERMINATED;
-
- /* Re-init Phy especially when the AutoSense default is set now */
- SkMacInitPhy(pAC, IoC, Port, SK_FALSE);
-@@ -655,19 +661,19 @@ int Port) /* Port Index (MAC_1 + n) */
- case SK_LSPEED_AUTO:
- /* default is 1000 Mbps */
- case SK_LSPEED_1000MBPS:
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_1000MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
- break;
- case SK_LSPEED_100MBPS:
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_100MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS;
- break;
- case SK_LSPEED_10MBPS:
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_10MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_10MBPS;
- break;
- }
-
- /* Set Link Mode Status */
- if (pPrt->PLinkMode == SK_LMODE_FULL) {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_FULL;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_FULL;
- }
- else {
- pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_HALF;
-@@ -1598,8 +1604,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- * (clear Page Received bit if set)
- */
- SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_EXP, &ExtStat);
-- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("AutoNeg done Port %d\n", Port));
-+
- return(SK_HW_PS_LINK);
- }
-
-@@ -1870,7 +1875,7 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat);
-
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("AutoNeg: %d, PhyStat: 0x%04X\n", AutoNeg, PhyStat));
-+ ("CheckUp Port %d, PhyStat: 0x%04X\n", Port, PhyStat));
-
- SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ResAb);
-
-@@ -1897,8 +1902,11 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
-
- if (AutoNeg) {
- if ((PhyStat & PHY_ST_AN_OVER) != 0) {
-+
- SkHWLinkUp(pAC, IoC, Port);
-+
- Done = SkMacAutoNegDone(pAC, IoC, Port);
-+
- if (Done != SK_AND_OK) {
- #ifdef DEBUG
- /* Get PHY parameters, for debugging only */
-@@ -1924,9 +1932,6 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- (void *)NULL);
- }
- #endif /* DEBUG */
--
-- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("AutoNeg done Port %d\n", Port));
- return(SK_HW_PS_LINK);
- }
- }
-@@ -1989,9 +1994,22 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- SK_U16 PhySpecStat;/* PHY Specific Status */
- SK_U16 ResAb; /* Master/Slave resolution */
- SK_EVPARA Para;
-+#ifdef DEBUG
-+ SK_U16 Word; /* I/O helper */
-+#endif /* DEBUG */
-
- pPrt = &pAC->GIni.GP[Port];
-
-+ if (pPrt->PHWLinkUp) {
-+ return(SK_HW_PS_NONE);
-+ }
-+
-+ /* Read PHY Status */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat);
-+
-+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-+ ("CheckUp Port %d, PhyStat: 0x%04X\n", Port, PhyStat));
-+
- /* Read PHY Interrupt Status */
- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyIsrc);
-
-@@ -2005,16 +2023,6 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- ("Link Speed Changed, PhyIsrc: 0x%04X\n", PhyIsrc));
- }
-
-- if (pPrt->PHWLinkUp) {
-- return(SK_HW_PS_NONE);
-- }
--
-- /* Read PHY Status */
-- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat);
--
-- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("AutoNeg: %d, PhyStat: 0x%04X\n", AutoNeg, PhyStat));
--
- SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat);
-
- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_1000T_STAT, &ResAb);
-@@ -2034,7 +2042,20 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpecStat);
-
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("AutoNeg: %d, PhySpecStat: 0x%04X\n", AutoNeg, PhySpecStat));
-+ ("Phy1000BT: 0x%04X, PhySpecStat: 0x%04X\n", ResAb, PhySpecStat));
-+
-+#ifdef DEBUG
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_EXP, &Word);
-+
-+ if ((PhyIsrc & PHY_M_IS_AN_PR) != 0 || (Word & PHY_ANE_RX_PG) != 0 ||
-+ (PhySpecStat & PHY_M_PS_PAGE_REC) != 0) {
-+ /* Read PHY Next Page Link Partner */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_NEPG_LP, &Word);
-+
-+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-+ ("Page Received, NextPage: 0x%04X\n", Word));
-+ }
-+#endif /* DEBUG */
-
- if ((PhySpecStat & PHY_M_PS_LINK_UP) == 0) {
- return(SK_HW_PS_NONE);
-@@ -2069,8 +2090,6 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- return(SK_HW_PS_RESTART);
- }
-
-- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("AutoNeg done Port %d\n", Port));
- return(SK_HW_PS_LINK);
- }
- }
-@@ -2179,8 +2198,6 @@ SK_BOOL AutoNeg) /* Is Auto-negotiation
- * extra link down/ups
- */
- SkXmPhyRead(pAC, IoC, Port, PHY_LONE_INT_STAT, &ExtStat);
-- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("AutoNeg done Port %d\n", Port));
- return(SK_HW_PS_LINK);
- }
- }
-@@ -2278,8 +2295,14 @@ SK_EVPARA Para) /* Event specific Param
-
- switch (Event) {
- case SK_HWEV_WATIM:
-- /* Check whether port came up */
-- PortStat = SkGePortCheckUp(pAC, IoC, (int)Port);
-+ if (pPrt->PState == SK_PRT_RESET) {
-+
-+ PortStat = SK_HW_PS_NONE;
-+ }
-+ else {
-+ /* Check whether port came up */
-+ PortStat = SkGePortCheckUp(pAC, IoC, (int)Port);
-+ }
-
- switch (PortStat) {
- case SK_HW_PS_RESTART:
---- linux-2.6.0/drivers/net/sk98lin/ski2c.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/ski2c.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1,16 +1,17 @@
- /******************************************************************************
- *
- * Name: ski2c.c
-- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.57 $
-- * Date: $Date: 2003/01/28 09:17:38 $
-+ * Project: Gigabit Ethernet Adapters, TWSI-Module
-+ * Version: $Revision: 1.59 $
-+ * Date: $Date: 2003/10/20 09:07:25 $
- * Purpose: Functions to access Voltage and Temperature Sensor
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,6 +27,14 @@
- * History:
- *
- * $Log: ski2c.c,v $
-+ * Revision 1.59 2003/10/20 09:07:25 rschmidt
-+ * Added cast SK_U32 in SkI2cWrite() to avoid compiler warning.
-+ * Editorial changes.
-+ *
-+ * Revision 1.58 2003/09/23 09:22:53 malthoff
-+ * Parameter I2cDevSize added in SkI2cRead and SkI2cWrite to
-+ * support larger devices on the TWSI bus.
-+ *
- * Revision 1.57 2003/01/28 09:17:38 rschmidt
- * Fixed handling for sensors on YUKON Fiber.
- * Editorial changes.
-@@ -224,15 +233,15 @@
- * Created. Sources taken from ML Projekt.
- * Sources have to be reworked for GE.
- *
-- *
- ******************************************************************************/
-
--
- /*
- * I2C Protocol
- */
-+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "$Id: ski2c.c,v 1.57 2003/01/28 09:17:38 rschmidt Exp $";
-+ "@(#) $Id: ski2c.c,v 1.59 2003/10/20 09:07:25 rschmidt Exp $ (C) Marvell. ";
-+#endif
-
- #include "h/skdrv1st.h" /* Driver Specific Definitions */
- #include "h/lm80.h"
-@@ -312,7 +321,7 @@ intro()
- {}
- #endif
-
--#ifdef SK_DIAG
-+#ifdef SK_DIAG
- /*
- * I2C Fast Mode timing values used by the LM80.
- * If new devices are added to the I2C bus the timing values have to be checked.
-@@ -516,7 +525,6 @@ SK_IOC IoC) /* I/O Context */
- {
- /*
- * Received bit must be zero.
-- *
- */
- SkI2cSndBit(IoC, 0);
- } /* SkI2cSndAck */
-@@ -590,7 +598,7 @@ int Rw) /* Read / Write Flag */
- return(SkI2cSndByte(IoC, (Addr<<1) | Rw));
- } /* SkI2cSndDev */
-
--#endif /* SK_DIAG */
-+#endif /* SK_DIAG */
-
- /*----------------- I2C CTRL Register Functions ----------*/
-
-@@ -620,7 +628,7 @@ int Event) /* complete event to wait fo
- SK_I2C_STOP(IoC);
- #ifndef SK_DIAG
- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG);
--#endif /* !SK_DIAG */
-+#endif /* !SK_DIAG */
- return(1);
- }
-
-@@ -661,15 +669,19 @@ SK_IOC IoC) /* I/O Context */
- }
-
- StartTime = SkOsGetTime(pAC);
-+
- do {
- if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) {
-+
- SK_I2C_STOP(IoC);
- #ifndef SK_DIAG
- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E016, SKERR_I2C_E016MSG);
--#endif /* !SK_DIAG */
-+#endif /* !SK_DIAG */
- return;
- }
-+
- SK_IN32(IoC, B0_ISRC, &IrqSrc);
-+
- } while ((IrqSrc & IS_I2C_READY) == 0);
-
- pSen->SenState = SK_SEN_IDLE;
-@@ -687,18 +699,19 @@ SK_AC *pAC, /* Adapter Context */
- SK_IOC IoC, /* I/O Context */
- SK_U32 I2cData, /* I2C Data to write */
- int I2cDev, /* I2C Device Address */
-+int I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */
- int I2cReg, /* I2C Device Register Address */
- int I2cBurst) /* I2C Burst Flag */
- {
- SK_OUT32(IoC, B2_I2C_DATA, I2cData);
-- SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cReg, I2cBurst);
-+
-+ SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cDevSize, I2cReg, I2cBurst);
-
- return(SkI2cWait(pAC, IoC, I2C_WRITE));
- } /* SkI2cWrite*/
-
-
- #ifdef SK_DIAG
--
- /*
- * reads a single byte or 4 bytes from the I2C device
- *
-@@ -708,23 +721,24 @@ SK_U32 SkI2cRead(
- SK_AC *pAC, /* Adapter Context */
- SK_IOC IoC, /* I/O Context */
- int I2cDev, /* I2C Device Address */
-+int I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */
- int I2cReg, /* I2C Device Register Address */
- int I2cBurst) /* I2C Burst Flag */
- {
- SK_U32 Data;
-
- SK_OUT32(IoC, B2_I2C_DATA, 0);
-- SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cReg, I2cBurst);
-+ SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cDevSize, I2cReg, I2cBurst);
-
- if (SkI2cWait(pAC, IoC, I2C_READ) != 0) {
- w_print("%s\n", SKERR_I2C_E002MSG);
- }
-
- SK_IN32(IoC, B2_I2C_DATA, &Data);
-+
- return(Data);
- } /* SkI2cRead */
--
--#endif /* SK_DIAG */
-+#endif /* SK_DIAG */
-
-
- /*
-@@ -745,9 +759,10 @@ SK_SENSOR *pSen) /* Sensor to be read */
- if (pSen->SenRead != NULL) {
- return((*pSen->SenRead)(pAC, IoC, pSen));
- }
-- else
-+ else {
- return(0); /* no success */
--} /* SkI2cReadSensor*/
-+ }
-+} /* SkI2cReadSensor */
-
- /*
- * Do the Init state 0 initialization
-@@ -761,12 +776,12 @@ SK_AC *pAC) /* Adapter Context */
- pAC->I2c.CurrSens = 0;
-
- /* Begin with timeout control for state machine */
-- pAC->I2c.TimerMode = SK_TIMER_WATCH_STATEMACHINE;
-+ pAC->I2c.TimerMode = SK_TIMER_WATCH_SM;
-
- /* Set sensor number to zero */
- pAC->I2c.MaxSens = 0;
-
--#ifndef SK_DIAG
-+#ifndef SK_DIAG
- /* Initialize Number of Dummy Reads */
- pAC->I2c.DummyReads = SK_MAX_SENSORS;
- #endif
-@@ -840,19 +855,20 @@ SK_IOC IoC) /* I/O Context */
- }
-
- /* Check for 64 Bit Yukon without sensors */
-- if (SkI2cWrite(pAC, IoC, 0, LM80_ADDR, LM80_CFG, 0) != 0) {
-+ if (SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_CFG, 0) != 0) {
- return(0);
- }
-
-- (void)SkI2cWrite(pAC, IoC, 0xff, LM80_ADDR, LM80_IMSK_1, 0);
-+ (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_1, 0);
-
-- (void)SkI2cWrite(pAC, IoC, 0xff, LM80_ADDR, LM80_IMSK_2, 0);
-+ (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_2, 0);
-
-- (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, LM80_FAN_CTRL, 0);
-+ (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_FAN_CTRL, 0);
-
-- (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, LM80_TEMP_CTRL, 0);
-+ (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_TEMP_CTRL, 0);
-
-- (void)SkI2cWrite(pAC, IoC, LM80_CFG_START, LM80_ADDR, LM80_CFG, 0);
-+ (void)SkI2cWrite(pAC, IoC, (SK_U32)LM80_CFG_START, LM80_ADDR, I2C_025K_DEV,
-+ LM80_CFG, 0);
-
- /*
- * MaxSens has to be updated here, because PhyType is not
-@@ -957,7 +973,7 @@ SK_IOC IoC) /* I/O Context */
- pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR;
- }
- else {
-- pAC->I2c.SenTable[i].SenDesc = "Voltage ASIC-Co 1V5";
-+ pAC->I2c.SenTable[i].SenDesc = "Voltage Core 1V5";
- pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR;
- pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN;
- pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN;
-@@ -1015,9 +1031,9 @@ SK_IOC IoC) /* I/O Context */
- pAC->I2c.SenTable[i].SenDev = LM80_ADDR;
- }
-
--#ifndef SK_DIAG
-+#ifndef SK_DIAG
- pAC->I2c.DummyReads = pAC->I2c.MaxSens;
--#endif /* !SK_DIAG */
-+#endif /* !SK_DIAG */
-
- /* Clear I2C IRQ */
- SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
-@@ -1208,15 +1224,13 @@ SK_SENSOR *pSen)
- pSen->SenLastErrLogTS = CurrTime;
-
- if (pSen->SenType == SK_SEN_TEMP) {
-- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E011,
-- SKERR_I2C_E011MSG);
-- } else if (pSen->SenType == SK_SEN_VOLT) {
-- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E012,
-- SKERR_I2C_E012MSG);
-- } else
-- {
-- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E015,
-- SKERR_I2C_E015MSG);
-+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E011, SKERR_I2C_E011MSG);
-+ }
-+ else if (pSen->SenType == SK_SEN_VOLT) {
-+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E012, SKERR_I2C_E012MSG);
-+ }
-+ else {
-+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E015, SKERR_I2C_E015MSG);
- }
- }
- }
-@@ -1235,8 +1249,7 @@ SK_SENSOR *pSen)
- /* This state is the former one */
-
- /* So check first whether we have to send a trap */
-- if (pSen->SenLastWarnTrapTS + SK_SEN_WARN_TR_HOLD >
-- CurrTime) {
-+ if (pSen->SenLastWarnTrapTS + SK_SEN_WARN_TR_HOLD > CurrTime) {
- /*
- * Do NOT send the Trap. The hold back time
- * has to run out first.
-@@ -1245,8 +1258,7 @@ SK_SENSOR *pSen)
- }
-
- /* Check now whether we have to log an Error */
-- if (pSen->SenLastWarnLogTS + SK_SEN_WARN_LOG_HOLD >
-- CurrTime) {
-+ if (pSen->SenLastWarnLogTS + SK_SEN_WARN_LOG_HOLD > CurrTime) {
- /*
- * Do NOT log the error. The hold back time
- * has to run out first.
-@@ -1277,15 +1289,13 @@ SK_SENSOR *pSen)
- pSen->SenLastWarnLogTS = CurrTime;
-
- if (pSen->SenType == SK_SEN_TEMP) {
-- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E009,
-- SKERR_I2C_E009MSG);
-- } else if (pSen->SenType == SK_SEN_VOLT) {
-- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E010,
-- SKERR_I2C_E010MSG);
-- } else
-- {
-- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E014,
-- SKERR_I2C_E014MSG);
-+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E009, SKERR_I2C_E009MSG);
-+ }
-+ else if (pSen->SenType == SK_SEN_VOLT) {
-+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E010, SKERR_I2C_E010MSG);
-+ }
-+ else {
-+ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E014, SKERR_I2C_E014MSG);
- }
- }
- }
-@@ -1317,7 +1327,7 @@ SK_SENSOR *pSen)
- }
- }
-
--#if 0
-+#ifdef TEST_ONLY
- /* Dynamic thresholds also for VAUX of LM80 sensor */
- if (pSen->SenInit == SK_SEN_DYN_INIT_VAUX) {
-
-@@ -1359,7 +1369,7 @@ SK_SENSOR *pSen)
- if (pSen->SenInit != SK_SEN_DYN_INIT_NONE) {
- SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E013, SKERR_I2C_E013MSG);
- }
--} /* SkI2cCheckSensor*/
-+} /* SkI2cCheckSensor */
-
-
- /*
-@@ -1390,7 +1400,7 @@ SK_EVPARA Para) /* Event specific Parame
-
- if (ReadComplete) {
- /* Check sensor against defined thresholds */
-- SkI2cCheckSensor (pAC, pSen);
-+ SkI2cCheckSensor(pAC, pSen);
-
- /* Increment Current sensor and set appropriate Timeout */
- pAC->I2c.CurrSens++;
-@@ -1414,7 +1424,7 @@ SK_EVPARA Para) /* Event specific Parame
- /* Start Timer */
- ParaLocal.Para64 = (SK_U64)0;
-
-- pAC->I2c.TimerMode = SK_TIMER_WATCH_STATEMACHINE;
-+ pAC->I2c.TimerMode = SK_TIMER_WATCH_SM;
-
- SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, SK_I2C_TIM_WATCH,
- SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
-@@ -1431,7 +1441,7 @@ SK_EVPARA Para) /* Event specific Parame
-
- if (ReadComplete) {
- /* Check sensor against defined thresholds */
-- SkI2cCheckSensor (pAC, pSen);
-+ SkI2cCheckSensor(pAC, pSen);
-
- /* Increment Current sensor and set appropriate Timeout */
- pAC->I2c.CurrSens++;
-@@ -1496,4 +1506,4 @@ SK_EVPARA Para) /* Event specific Parame
- return(0);
- } /* SkI2cEvent*/
-
--#endif /* !SK_DIAG */
-+#endif /* !SK_DIAG */
---- linux-2.6.0/drivers/net/sk98lin/sklm80.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/sklm80.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1,16 +1,17 @@
- /******************************************************************************
- *
- * Name: sklm80.c
-- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.20 $
-- * Date: $Date: 2002/08/13 09:16:27 $
-- * Purpose: Funktions to access Voltage and Temperature Sensor (LM80)
-+ * Project: Gigabit Ethernet Adapters, TWSI-Module
-+ * Version: $Revision: 1.22 $
-+ * Date: $Date: 2003/10/20 09:08:21 $
-+ * Purpose: Functions to access Voltage and Temperature Sensor (LM80)
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -26,15 +27,21 @@
- * History:
- *
- * $Log: sklm80.c,v $
-+ * Revision 1.22 2003/10/20 09:08:21 rschmidt
-+ * Editorial changes.
-+ *
-+ * Revision 1.21 2003/09/23 09:29:04 malthoff
-+ * Parameter Dev_Size added to macro SK_I2C_CTL.
-+ *
- * Revision 1.20 2002/08/13 09:16:27 rschmidt
- * Changed return value for SkLm80ReadSensor() back to 'int'
-- * Editorial changes
-+ * Editorial changes.
- *
- * Revision 1.19 2002/08/06 09:43:31 jschmalz
-- * Extensions and changes for Yukon
-+ * Extensions and changes for Yukon.
- *
- * Revision 1.18 2002/08/02 12:26:57 rschmidt
-- * Editorial changes
-+ * Editorial changes.
- *
- * Revision 1.17 1999/11/22 13:35:51 cgoos
- * Changed license header to GPL.
-@@ -93,16 +100,15 @@
- * Revision 1.1 1998/07/17 09:57:12 gklug
- * initial version
- *
-- *
-- *
- ******************************************************************************/
-
--
- /*
- LM80 functions
- */
-+#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "$Id: sklm80.c,v 1.20 2002/08/13 09:16:27 rschmidt Exp $" ;
-+ "@(#) $Id: sklm80.c,v 1.22 2003/10/20 09:08:21 rschmidt Exp $ (C) Marvell. ";
-+#endif
-
- #include "h/skdrv1st.h" /* Driver Specific Definitions */
- #include "h/lm80.h"
-@@ -202,7 +208,7 @@ SK_SENSOR *pSen) /* Sensor to be read */
- switch (pSen->SenState) {
- case SK_SEN_IDLE:
- /* Send address to ADDR register */
-- SK_I2C_CTL(IoC, I2C_READ, pSen->SenDev, pSen->SenReg, 0);
-+ SK_I2C_CTL(IoC, I2C_READ, pSen->SenDev, I2C_025K_DEV, pSen->SenReg, 0);
-
- pSen->SenState = SK_SEN_VALUE ;
- BREAK_OR_WAIT(pAC, IoC, I2C_READ);
-@@ -250,7 +256,7 @@ SK_SENSOR *pSen) /* Sensor to be read */
- (pSen->SenValue % SK_LM80_TEMP_LSB);
-
- /* Send address to ADDR register */
-- SK_I2C_CTL(IoC, I2C_READ, pSen->SenDev, LM80_TEMP_CTRL, 0);
-+ SK_I2C_CTL(IoC, I2C_READ, pSen->SenDev, I2C_025K_DEV, LM80_TEMP_CTRL, 0);
-
- pSen->SenState = SK_SEN_VALEXT ;
- BREAK_OR_WAIT(pAC, IoC, I2C_READ);
-@@ -284,3 +290,4 @@ SK_SENSOR *pSen) /* Sensor to be read */
- /* Not completed */
- return(0);
- }
-+
---- linux-2.6.0/drivers/net/sk98lin/skproc.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/sk98lin/skproc.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1,16 +1,17 @@
- /******************************************************************************
- *
-- * Name: skproc.c
-+ * Name: skproc.c
- * Project: GEnesis, PCI Gigabit Ethernet Adapter
-- * Version: $Revision: 1.2 $
-- * Date: $Date: 2003/08/12 16:45:29 $
-+ * Version: $Revision: 1.11 $
-+ * Date: $Date: 2003/12/11 16:03:57 $
- * Purpose: Funktions to display statictic data
- *
- ******************************************************************************/
-
- /******************************************************************************
- *
-- * (C)Copyright 1998-2003 SysKonnect GmbH.
-+ * (C)Copyright 1998-2002 SysKonnect GmbH.
-+ * (C)Copyright 2002-2003 Marvell.
- *
- * 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
-@@ -28,6 +29,33 @@
- * History:
- *
- * $Log: skproc.c,v $
-+ * Revision 1.11 2003/12/11 16:03:57 mlindner
-+ * Fix: Create backup from pnmi data structure
-+ *
-+ * Revision 1.10 2003/11/19 16:25:36 mlindner
-+ * Fix: Print output as 64-bit digit
-+ *
-+ * Revision 1.9 2003/11/17 13:29:05 mlindner
-+ * Fix: Editorial changes
-+ *
-+ * Revision 1.8 2003/11/13 14:18:48 rroesler
-+ * Fix: added latest changes regarding the use of the proc system
-+ *
-+ * Revision 1.7 2003/11/10 09:35:07 rroesler
-+ * Fix: diag backup restore of PNMI structure
-+ *
-+ * Revision 1.6 2003/11/07 17:31:39 rroesler
-+ * Add: security counter for the proc file system
-+ *
-+ * Revision 1.5 2003/10/07 08:17:08 mlindner
-+ * Fix: Copyright changes
-+ *
-+ * Revision 1.4 2003/09/01 15:29:24 mlindner
-+ * Fix: Editorial changes
-+ *
-+ * Revision 1.3 2003/08/29 12:30:58 mlindner
-+ * Add: Version entry in the proc file system
-+ *
- * Revision 1.2 2003/08/12 16:45:29 mlindner
- * Add: Removed SkNumber and SkDoDiv
- * Add: Counter output as (unsigned long long)
-@@ -94,223 +122,350 @@
-
- #include "h/skdrv1st.h"
- #include "h/skdrv2nd.h"
-+#include "h/skversion.h"
-
--#ifdef CONFIG_PROC_FS
-+extern struct SK_NET_DEVICE *SkGeRootDev;
-+static int sk_proc_print(void *writePtr, char *format, ...);
-+static void sk_gen_browse(void *buffer);
-+int len;
-
--extern struct net_device *SkGeRootDev;
-+static int sk_seq_show(struct seq_file *seq, void *v);
-+static int sk_proc_open(struct inode *inode, struct file *file);
-+struct file_operations sk_proc_fops = {
-+ .owner = THIS_MODULE,
-+ .open = sk_proc_open,
-+ .read = seq_read,
-+ .llseek = seq_lseek,
-+ .release = single_release,
-+};
-+struct net_device *currDev = NULL;
-
--static int sk_seq_show(struct seq_file *seq, void *v)
-+/*****************************************************************************
-+ *
-+ * sk_gen_browse -generic print "summaries" entry
-+ *
-+ * Description:
-+ * This function fills the proc entry with statistic data about
-+ * the ethernet device.
-+ *
-+ * Returns: -
-+ *
-+ */
-+static void sk_gen_browse(void *buffer)
- {
-- struct net_device *dev = seq->private;
-- DEV_NET *pNet = dev->priv;
-- SK_AC *pAC = pNet->pAC;
-- SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct;
-- SK_PNMI_STAT *pPnmiStat = &pPnmiStruct->Stat[0];
-- int unit = !(pAC->dev[0] == dev);
-- int i;
-- char sens_msg[50];
--
-- seq_printf(seq,
-- "\nDetailed statistic for device %s\n",
-- dev->name);
-- seq_printf(seq,
-- "=======================================\n");
--
-- /* Board statistics */
-- seq_printf(seq,
-- "\nBoard statistics\n\n");
-- seq_printf(seq,
-- "Active Port %c\n",
-- 'A' + pAC->Rlmt.Net[unit].Port[pAC->Rlmt.
-- Net[unit].PrefPort]->PortNumber);
-- seq_printf(seq,
-- "Preferred Port %c\n",
-- 'A' + pAC->Rlmt.Net[unit].Port[pAC->Rlmt.
-- Net[unit].PrefPort]->PortNumber);
--
-- seq_printf(seq,
-- "Bus speed (MHz) %d\n",
-- pPnmiStruct->BusSpeed);
--
-- seq_printf(seq,
-- "Bus width (Bit) %d\n",
-- pPnmiStruct->BusWidth);
-- seq_printf(seq,
-- "Hardware revision v%d.%d\n",
-- (pAC->GIni.GIPciHwRev >> 4) & 0x0F,
-- pAC->GIni.GIPciHwRev & 0x0F);
--
-- /* Print sensor informations */
-- for (i=0; i < pAC->I2c.MaxSens; i ++) {
-- /* Check type */
-- switch (pAC->I2c.SenTable[i].SenType) {
-- case 1:
-- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-- strcat(sens_msg, " (C)");
-- seq_printf(seq,
-- "%-25s %d.%02d\n",
-- sens_msg,
-- pAC->I2c.SenTable[i].SenValue / 10,
-- pAC->I2c.SenTable[i].SenValue % 10);
--
-- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-- strcat(sens_msg, " (F)");
-- seq_printf(seq,
-- "%-25s %d.%02d\n",
-- sens_msg,
-- ((((pAC->I2c.SenTable[i].SenValue)
-- *10)*9)/5 + 3200)/100,
-- ((((pAC->I2c.SenTable[i].SenValue)
-- *10)*9)/5 + 3200) % 10);
-- break;
-- case 2:
-- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-- strcat(sens_msg, " (V)");
-- seq_printf(seq,
-- "%-25s %d.%03d\n",
-- sens_msg,
-- pAC->I2c.SenTable[i].SenValue / 1000,
-- pAC->I2c.SenTable[i].SenValue % 1000);
-- break;
-- case 3:
-- strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-- strcat(sens_msg, " (rpm)");
-- seq_printf(seq,
-- "%-25s %d\n",
-- sens_msg,
-- pAC->I2c.SenTable[i].SenValue);
-- break;
-- default:
-- break;
-+ struct SK_NET_DEVICE *SkgeProcDev = SkGeRootDev;
-+ struct SK_NET_DEVICE *next;
-+ SK_PNMI_STRUCT_DATA *pPnmiStruct;
-+ SK_PNMI_STAT *pPnmiStat;
-+ unsigned long Flags;
-+ unsigned int Size;
-+ DEV_NET *pNet;
-+ SK_AC *pAC;
-+ char sens_msg[50];
-+ int MaxSecurityCount = 0;
-+ int t;
-+ int i;
-+
-+ while (SkgeProcDev) {
-+ MaxSecurityCount++;
-+ if (MaxSecurityCount > 100) {
-+ printk("Max limit for sk_proc_read security counter!\n");
-+ return;
- }
-- }
-+ pNet = (DEV_NET*) SkgeProcDev->priv;
-+ pAC = pNet->pAC;
-+ next = pAC->Next;
-+ pPnmiStruct = &pAC->PnmiStruct;
-+ /* NetIndex in GetStruct is now required, zero is only dummy */
-+
-+ for (t=pAC->GIni.GIMacsFound; t > 0; t--) {
-+ if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 1)
-+ t--;
-+
-+ spin_lock_irqsave(&pAC->SlowPathLock, Flags);
-+ Size = SK_PNMI_STRUCT_SIZE;
-+#ifdef SK_DIAG_SUPPORT
-+ if (pAC->BoardLevel == SK_INIT_DATA) {
-+ SK_MEMCPY(&(pAC->PnmiStruct), &(pAC->PnmiBackup), sizeof(SK_PNMI_STRUCT_DATA));
-+ if (pAC->DiagModeActive == DIAG_NOTACTIVE) {
-+ pAC->Pnmi.DiagAttached = SK_DIAG_IDLE;
-+ }
-+ } else {
-+ SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1);
-+ }
-+#else
-+ SkPnmiGetStruct(pAC, pAC->IoBase,
-+ pPnmiStruct, &Size, t-1);
-+#endif
-+ spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);
-+
-+ if (strcmp(pAC->dev[t-1]->name, currDev->name) == 0) {
-+ pPnmiStat = &pPnmiStruct->Stat[0];
-+ len = sk_proc_print(buffer,
-+ "\nDetailed statistic for device %s\n",
-+ pAC->dev[t-1]->name);
-+ len += sk_proc_print(buffer,
-+ "=======================================\n");
-+
-+ /* Board statistics */
-+ len += sk_proc_print(buffer,
-+ "\nBoard statistics\n\n");
-+ len += sk_proc_print(buffer,
-+ "Active Port %c\n",
-+ 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
-+ Net[t-1].PrefPort]->PortNumber);
-+ len += sk_proc_print(buffer,
-+ "Preferred Port %c\n",
-+ 'A' + pAC->Rlmt.Net[t-1].Port[pAC->Rlmt.
-+ Net[t-1].PrefPort]->PortNumber);
-+
-+ len += sk_proc_print(buffer,
-+ "Bus speed (MHz) %d\n",
-+ pPnmiStruct->BusSpeed);
-+
-+ len += sk_proc_print(buffer,
-+ "Bus width (Bit) %d\n",
-+ pPnmiStruct->BusWidth);
-+ len += sk_proc_print(buffer,
-+ "Driver version %s\n",
-+ VER_STRING);
-+ len += sk_proc_print(buffer,
-+ "Hardware revision v%d.%d\n",
-+ (pAC->GIni.GIPciHwRev >> 4) & 0x0F,
-+ pAC->GIni.GIPciHwRev & 0x0F);
-+
-+ /* Print sensor informations */
-+ for (i=0; i < pAC->I2c.MaxSens; i ++) {
-+ /* Check type */
-+ switch (pAC->I2c.SenTable[i].SenType) {
-+ case 1:
-+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-+ strcat(sens_msg, " (C)");
-+ len += sk_proc_print(buffer,
-+ "%-25s %d.%02d\n",
-+ sens_msg,
-+ pAC->I2c.SenTable[i].SenValue / 10,
-+ pAC->I2c.SenTable[i].SenValue % 10);
-+
-+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-+ strcat(sens_msg, " (F)");
-+ len += sk_proc_print(buffer,
-+ "%-25s %d.%02d\n",
-+ sens_msg,
-+ ((((pAC->I2c.SenTable[i].SenValue)
-+ *10)*9)/5 + 3200)/100,
-+ ((((pAC->I2c.SenTable[i].SenValue)
-+ *10)*9)/5 + 3200) % 10);
-+ break;
-+ case 2:
-+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-+ strcat(sens_msg, " (V)");
-+ len += sk_proc_print(buffer,
-+ "%-25s %d.%03d\n",
-+ sens_msg,
-+ pAC->I2c.SenTable[i].SenValue / 1000,
-+ pAC->I2c.SenTable[i].SenValue % 1000);
-+ break;
-+ case 3:
-+ strcpy(sens_msg, pAC->I2c.SenTable[i].SenDesc);
-+ strcat(sens_msg, " (rpm)");
-+ len += sk_proc_print(buffer,
-+ "%-25s %d\n",
-+ sens_msg,
-+ pAC->I2c.SenTable[i].SenValue);
-+ break;
-+ default:
-+ break;
-+ }
-+ }
-
-- /*Receive statistics */
-- seq_printf(seq,
-- "\nReceive statistics\n\n");
--
-- seq_printf(seq,
-- "Received bytes %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxOctetsOkCts);
-- seq_printf(seq,
-- "Received packets %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxOkCts);
-+ /*Receive statistics */
-+ len += sk_proc_print(buffer,
-+ "\nReceive statistics\n\n");
-+
-+ len += sk_proc_print(buffer,
-+ "Received bytes %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxOctetsOkCts);
-+ len += sk_proc_print(buffer,
-+ "Received packets %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxOkCts);
- #if 0
-- if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC &&
-- pAC->HWRevision < 12) {
-- pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
-- pPnmiStat->StatRxShortsCts;
-- pPnmiStat->StatRxShortsCts = 0;
-- }
-+ if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC &&
-+ pAC->HWRevision < 12) {
-+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
-+ pPnmiStat->StatRxShortsCts;
-+ pPnmiStat->StatRxShortsCts = 0;
-+ }
- #endif
-- if (pNet->Mtu > 1500)
-- pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
-- pPnmiStat->StatRxTooLongCts;
--
-- seq_printf(seq,
-- "Receive errors %Ld\n",
-- (unsigned long long) pPnmiStruct->InErrorsCts);
-- seq_printf(seq,
-- "Receive dropped %Ld\n",
-- (unsigned long long) pPnmiStruct->RxNoBufCts);
-- seq_printf(seq,
-- "Received multicast %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxMulticastOkCts);
-- seq_printf(seq,
-- "Receive error types\n");
-- seq_printf(seq,
-- " length %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxRuntCts);
-- seq_printf(seq,
-- " buffer overflow %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxFifoOverflowCts);
-- seq_printf(seq,
-- " bad crc %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxFcsCts);
-- seq_printf(seq,
-- " framing %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxFramingCts);
-- seq_printf(seq,
-- " missed frames %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxMissedCts);
--
-- if (pNet->Mtu > 1500)
-- pPnmiStat->StatRxTooLongCts = 0;
--
-- seq_printf(seq,
-- " too long %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxTooLongCts);
-- seq_printf(seq,
-- " carrier extension %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxCextCts);
-- seq_printf(seq,
-- " too short %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxShortsCts);
-- seq_printf(seq,
-- " symbol %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxSymbolCts);
-- seq_printf(seq,
-- " LLC MAC size %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxIRLengthCts);
-- seq_printf(seq,
-- " carrier event %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxCarrierCts);
-- seq_printf(seq,
-- " jabber %Ld\n",
-- (unsigned long long) pPnmiStat->StatRxJabberCts);
--
--
-- /*Transmit statistics */
-- seq_printf(seq,
-- "\nTransmit statistics\n\n");
-+ if (pNet->Mtu > 1500)
-+ pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
-+ pPnmiStat->StatRxTooLongCts;
-+
-+ len += sk_proc_print(buffer,
-+ "Receive errors %Lu\n",
-+ (unsigned long long) pPnmiStruct->InErrorsCts);
-+ len += sk_proc_print(buffer,
-+ "Receive dropped %Lu\n",
-+ (unsigned long long) pPnmiStruct->RxNoBufCts);
-+ len += sk_proc_print(buffer,
-+ "Received multicast %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxMulticastOkCts);
-+ len += sk_proc_print(buffer,
-+ "Receive error types\n");
-+ len += sk_proc_print(buffer,
-+ " length %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxRuntCts);
-+ len += sk_proc_print(buffer,
-+ " buffer overflow %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxFifoOverflowCts);
-+ len += sk_proc_print(buffer,
-+ " bad crc %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxFcsCts);
-+ len += sk_proc_print(buffer,
-+ " framing %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxFramingCts);
-+ len += sk_proc_print(buffer,
-+ " missed frames %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxMissedCts);
-+
-+ if (pNet->Mtu > 1500)
-+ pPnmiStat->StatRxTooLongCts = 0;
-+
-+ len += sk_proc_print(buffer,
-+ " too long %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxTooLongCts);
-+ len += sk_proc_print(buffer,
-+ " carrier extension %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxCextCts);
-+ len += sk_proc_print(buffer,
-+ " too short %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxShortsCts);
-+ len += sk_proc_print(buffer,
-+ " symbol %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxSymbolCts);
-+ len += sk_proc_print(buffer,
-+ " LLC MAC size %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxIRLengthCts);
-+ len += sk_proc_print(buffer,
-+ " carrier event %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxCarrierCts);
-+ len += sk_proc_print(buffer,
-+ " jabber %Lu\n",
-+ (unsigned long long) pPnmiStat->StatRxJabberCts);
-+
-+
-+ /*Transmit statistics */
-+ len += sk_proc_print(buffer,
-+ "\nTransmit statistics\n\n");
-
-- seq_printf(seq,
-- "Transmited bytes %Ld\n",
-- (unsigned long long) pPnmiStat->StatTxOctetsOkCts);
-- seq_printf(seq,
-- "Transmited packets %Ld\n",
-- (unsigned long long) pPnmiStat->StatTxOkCts);
-- seq_printf(seq,
-- "Transmit errors %Ld\n",
-- (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
-- seq_printf(seq,
-- "Transmit dropped %Ld\n",
-- (unsigned long long) pPnmiStruct->TxNoBufCts);
-- seq_printf(seq,
-- "Transmit collisions %Ld\n",
-- (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
-- seq_printf(seq,
-- "Transmit error types\n");
-- seq_printf(seq,
-- " excessive collision %ld\n",
-- pAC->stats.tx_aborted_errors);
-- seq_printf(seq,
-- " carrier %Ld\n",
-- (unsigned long long) pPnmiStat->StatTxCarrierCts);
-- seq_printf(seq,
-- " fifo underrun %Ld\n",
-- (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts);
-- seq_printf(seq,
-- " heartbeat %Ld\n",
-- (unsigned long long) pPnmiStat->StatTxCarrierCts);
-- seq_printf(seq,
-- " window %ld\n",
-- pAC->stats.tx_window_errors);
-+ len += sk_proc_print(buffer,
-+ "Transmited bytes %Lu\n",
-+ (unsigned long long) pPnmiStat->StatTxOctetsOkCts);
-+ len += sk_proc_print(buffer,
-+ "Transmited packets %Lu\n",
-+ (unsigned long long) pPnmiStat->StatTxOkCts);
-+ len += sk_proc_print(buffer,
-+ "Transmit errors %Lu\n",
-+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
-+ len += sk_proc_print(buffer,
-+ "Transmit dropped %Lu\n",
-+ (unsigned long long) pPnmiStruct->TxNoBufCts);
-+ len += sk_proc_print(buffer,
-+ "Transmit collisions %Lu\n",
-+ (unsigned long long) pPnmiStat->StatTxSingleCollisionCts);
-+ len += sk_proc_print(buffer,
-+ "Transmit error types\n");
-+ len += sk_proc_print(buffer,
-+ " excessive collision %ld\n",
-+ pAC->stats.tx_aborted_errors);
-+ len += sk_proc_print(buffer,
-+ " carrier %Lu\n",
-+ (unsigned long long) pPnmiStat->StatTxCarrierCts);
-+ len += sk_proc_print(buffer,
-+ " fifo underrun %Lu\n",
-+ (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts);
-+ len += sk_proc_print(buffer,
-+ " heartbeat %Lu\n",
-+ (unsigned long long) pPnmiStat->StatTxCarrierCts);
-+ len += sk_proc_print(buffer,
-+ " window %ld\n",
-+ pAC->stats.tx_window_errors);
-
-- return 0;
-+ } /* if (strcmp(pACname, currDeviceName) == 0) */
-+ }
-+ SkgeProcDev = next;
-+ }
- }
-
-+/*****************************************************************************
-+ *
-+ * sk_proc_print -generic line print
-+ *
-+ * Description:
-+ * This function fills the proc entry with statistic data about
-+ * the ethernet device.
-+ *
-+ * Returns: number of bytes written
-+ *
-+ */
-+static int sk_proc_print(void *writePtr, char *format, ...)
-+{
-+#define MAX_LEN_SINGLE_LINE 256
-+ char str[MAX_LEN_SINGLE_LINE];
-+ va_list a_start;
-+ int lenght = 0;
-+
-+ struct seq_file *seq = (struct seq_file *) writePtr;
-+
-+ SK_MEMSET(str, 0, MAX_LEN_SINGLE_LINE);
-+
-+ va_start(a_start, format);
-+ vsprintf(str, format, a_start);
-+ va_end(a_start);
-+
-+ lenght = strlen(str);
-
-+ seq_printf(seq, str);
-+ return lenght;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * sk_seq_show - show proc information of a particular adapter
-+ *
-+ * Description:
-+ * This function fills the proc entry with statistic data about
-+ * the ethernet device. It invokes the generic sk_gen_browse() to
-+ * print out all items one per one.
-+ *
-+ * Returns: number of bytes written
-+ *
-+ */
-+static int sk_seq_show(struct seq_file *seq, void *v)
-+{
-+ void *castedBuffer = (void *) seq;
-+ currDev = seq->private;
-+ sk_gen_browse(castedBuffer);
-+ return 0;
-+}
-+
-+/*****************************************************************************
-+ *
-+ * sk_proc_open - register the show function when proc is open'ed
-+ *
-+ * Description:
-+ * This function is called whenever a sk98lin proc file is queried.
-+ *
-+ * Returns: the return value of single_open()
-+ *
-+ */
- static int sk_proc_open(struct inode *inode, struct file *file)
- {
-- return single_open(file, sk_seq_show, PDE(inode)->data);
-+ return single_open(file, sk_seq_show, PDE(inode)->data);
- }
-
--struct file_operations sk_proc_fops = {
-- .owner = THIS_MODULE,
-- .open = sk_proc_open,
-- .read = seq_read,
-- .llseek = seq_lseek,
-- .release = single_release,
--};
--#endif
-+/*******************************************************************************
-+ *
-+ * End of file
-+ *
-+ ******************************************************************************/
---- linux-2.6.0/drivers/net/sk98lin/skqueue.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skqueue.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1,9 +1,9 @@
- /******************************************************************************
- *
- * Name: skqueue.c
-- * Project: Gigabit Ethernet Adapters, Schedule-Modul
-- * Version: $Revision: 1.19 $
-- * Date: $Date: 2003/05/13 18:00:07 $
-+ * Project: Gigabit Ethernet Adapters, Event Scheduler Module
-+ * Version: $Revision: 1.20 $
-+ * Date: $Date: 2003/09/16 13:44:00 $
- * Purpose: Management of an event queue.
- *
- ******************************************************************************/
-@@ -27,6 +27,10 @@
- * History:
- *
- * $Log: skqueue.c,v $
-+ * Revision 1.20 2003/09/16 13:44:00 rschmidt
-+ * Added (C) Marvell to SysKonnectFileId
-+ * Editorial changes
-+ *
- * Revision 1.19 2003/05/13 18:00:07 mkarl
- * Removed calls to RLMT, TWSI, and PNMI for SLIM driver (SK_SLIM).
- * Editorial changes.
-@@ -85,18 +89,16 @@
- *
- * Revision 1.1 1998/07/30 15:14:01 gklug
- * Initial version. Adapted from SMT
-- *
-- *
- *
- ******************************************************************************/
-
-
- /*
-- Event queue and dispatcher
--*/
-+ * Event queue and dispatcher
-+ */
- #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "$Header: /usr56/projects/ge/schedule/skqueue.c,v 1.19 2003/05/13 18:00:07 mkarl Exp $" ;
-+ "@(#) $Id: skqueue.c,v 1.20 2003/09/16 13:44:00 rschmidt Exp $ (C) Marvell.";
- #endif
-
- #include "h/skdrv1st.h" /* Driver Specific Definitions */
-@@ -124,11 +126,11 @@ intro()
- void SkEventInit(
- SK_AC *pAC, /* Adapter context */
- SK_IOC Ioc, /* IO context */
--int Level) /* Init level */
-+int Level) /* Init level */
- {
- switch (Level) {
- case SK_INIT_DATA:
-- pAC->Event.EvPut = pAC->Event.EvGet = pAC->Event.EvQueue ;
-+ pAC->Event.EvPut = pAC->Event.EvGet = pAC->Event.EvQueue;
- break;
- default:
- break;
-@@ -144,14 +146,15 @@ SK_U32 Class, /* Event Class */
- SK_U32 Event, /* Event to be queued */
- SK_EVPARA Para) /* Event parameter */
- {
-- pAC->Event.EvPut->Class = Class ;
-- pAC->Event.EvPut->Event = Event ;
-- pAC->Event.EvPut->Para = Para ;
-+ pAC->Event.EvPut->Class = Class;
-+ pAC->Event.EvPut->Event = Event;
-+ pAC->Event.EvPut->Para = Para;
-+
- if (++pAC->Event.EvPut == &pAC->Event.EvQueue[SK_MAX_EVENT])
-- pAC->Event.EvPut = pAC->Event.EvQueue ;
-+ pAC->Event.EvPut = pAC->Event.EvQueue;
-
- if (pAC->Event.EvPut == pAC->Event.EvGet) {
-- SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E001, SKERR_Q_E001MSG) ;
-+ SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E001, SKERR_Q_E001MSG);
- }
- }
-
-@@ -168,77 +171,79 @@ int SkEventDispatcher(
- SK_AC *pAC, /* Adapters Context */
- SK_IOC Ioc) /* Io context */
- {
-- SK_EVENTELEM *pEv ; /* pointer into queue */
-- SK_U32 Class ;
-- int Rtv ;
--
-- pEv = pAC->Event.EvGet ;
-- PRINTF("dispatch get %x put %x\n",pEv,pAC->Event.ev_put) ;
-+ SK_EVENTELEM *pEv; /* pointer into queue */
-+ SK_U32 Class;
-+ int Rtv;
-+
-+ pEv = pAC->Event.EvGet;
-+
-+ PRINTF("dispatch get %x put %x\n", pEv, pAC->Event.ev_put);
-+
- while (pEv != pAC->Event.EvPut) {
-- PRINTF("dispatch Class %d Event %d\n",pEv->Class,pEv->Event) ;
-- switch(Class = pEv->Class) {
-+ PRINTF("dispatch Class %d Event %d\n", pEv->Class, pEv->Event);
-+
-+ switch (Class = pEv->Class) {
- #ifndef SK_USE_LAC_EV
- #ifndef SK_SLIM
-- case SKGE_RLMT : /* RLMT Event */
-- Rtv = SkRlmtEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-- case SKGE_I2C : /* I2C Event */
-- Rtv = SkI2cEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-- case SKGE_PNMI :
-- Rtv = SkPnmiEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ case SKGE_RLMT: /* RLMT Event */
-+ Rtv = SkRlmtEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
-+ case SKGE_I2C: /* I2C Event */
-+ Rtv = SkI2cEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
-+ case SKGE_PNMI: /* PNMI Event */
-+ Rtv = SkPnmiEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- #endif /* not SK_SLIM */
- #endif /* not SK_USE_LAC_EV */
-- case SKGE_DRV : /* Driver Event */
-- Rtv = SkDrvEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
--#ifndef SK_USE_SW_TIMER
-- case SKGE_HWAC :
-- Rtv = SkGeSirqEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ case SKGE_DRV: /* Driver Event */
-+ Rtv = SkDrvEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
-+#ifndef SK_USE_SW_TIMER
-+ case SKGE_HWAC:
-+ Rtv = SkGeSirqEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- #else /* !SK_USE_SW_TIMER */
-- case SKGE_SWT :
-- Rtv = SkSwtEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ case SKGE_SWT :
-+ Rtv = SkSwtEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- #endif /* !SK_USE_SW_TIMER */
--#ifdef SK_USE_LAC_EV
-+#ifdef SK_USE_LAC_EV
- case SKGE_LACP :
-- Rtv = SkLacpEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ Rtv = SkLacpEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- case SKGE_RSF :
-- Rtv = SkRsfEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ Rtv = SkRsfEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- case SKGE_MARKER :
-- Rtv = SkMarkerEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ Rtv = SkMarkerEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- case SKGE_FD :
-- Rtv = SkFdEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ Rtv = SkFdEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- #endif /* SK_USE_LAC_EV */
- #ifdef SK_USE_CSUM
- case SKGE_CSUM :
-- Rtv = SkCsEvent(pAC,Ioc,pEv->Event,pEv->Para);
-- break ;
-+ Rtv = SkCsEvent(pAC, Ioc, pEv->Event, pEv->Para);
-+ break;
- #endif /* SK_USE_CSUM */
- default :
-- SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_Q_E002,
-- SKERR_Q_E002MSG) ;
-+ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_Q_E002, SKERR_Q_E002MSG);
- Rtv = 0;
- }
-
- if (Rtv != 0) {
-- return(Rtv) ;
-+ return(Rtv);
- }
-
- if (++pEv == &pAC->Event.EvQueue[SK_MAX_EVENT])
-- pEv = pAC->Event.EvQueue ;
-+ pEv = pAC->Event.EvQueue;
-
- /* Renew get: it is used in queue_events to detect overruns */
- pAC->Event.EvGet = pEv;
- }
-
-- return(0) ;
-+ return(0);
- }
-
- /* End of file */
---- linux-2.6.0/drivers/net/sk98lin/sktimer.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/sktimer.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1,9 +1,9 @@
- /******************************************************************************
- *
- * Name: sktimer.c
-- * Project: Gigabit Ethernet Adapters, Schedule-Modul
-- * Version: $Revision: 1.13 $
-- * Date: $Date: 2003/05/13 18:01:01 $
-+ * Project: Gigabit Ethernet Adapters, Event Scheduler Module
-+ * Version: $Revision: 1.14 $
-+ * Date: $Date: 2003/09/16 13:46:51 $
- * Purpose: High level timer functions.
- *
- ******************************************************************************/
-@@ -27,6 +27,10 @@
- * History:
- *
- * $Log: sktimer.c,v $
-+ * Revision 1.14 2003/09/16 13:46:51 rschmidt
-+ * Added (C) Marvell to SysKonnectFileId
-+ * Editorial changes
-+ *
- * Revision 1.13 2003/05/13 18:01:01 mkarl
- * Editorial changes.
- *
-@@ -68,19 +72,16 @@
- *
- * Revision 1.1 1998/08/05 11:27:55 gklug
- * first version: adapted from SMT
-- *
-- *
-- *
- *
- ******************************************************************************/
-
-
- /*
-- Event queue and dispatcher
--*/
-+ * Event queue and dispatcher
-+ */
- #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "$Header: /usr56/projects/ge/schedule/sktimer.c,v 1.13 2003/05/13 18:01:01 mkarl Exp $" ;
-+ "@(#) $Id: sktimer.c,v 1.14 2003/09/16 13:46:51 rschmidt Exp $ (C) Marvell.";
- #endif
-
- #include "h/skdrv1st.h" /* Driver Specific Definitions */
-@@ -110,14 +111,14 @@ static void timer_done(SK_AC *pAC,SK_IOC
- void SkTimerInit(
- SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc, /* IoContext */
--int Level) /* Init Level */
-+int Level) /* Init Level */
- {
- switch (Level) {
- case SK_INIT_DATA:
-- pAC->Tim.StQueue = 0 ;
-+ pAC->Tim.StQueue = 0;
- break;
- case SK_INIT_IO:
-- SkHwtInit(pAC,Ioc) ;
-+ SkHwtInit(pAC, Ioc);
- SkTimerDone(pAC, Ioc);
- break;
- default:
-@@ -134,31 +135,34 @@ SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc, /* IoContext */
- SK_TIMER *pTimer) /* Timer Pointer to be started */
- {
-- SK_TIMER **ppTimPrev ;
-- SK_TIMER *pTm ;
-+ SK_TIMER **ppTimPrev;
-+ SK_TIMER *pTm;
-
- /*
- * remove timer from queue
- */
-- pTimer->TmActive = SK_FALSE ;
-+ pTimer->TmActive = SK_FALSE;
-+
- if (pAC->Tim.StQueue == pTimer && !pTimer->TmNext) {
-- SkHwtStop(pAC,Ioc) ;
-+ SkHwtStop(pAC, Ioc);
- }
-- for (ppTimPrev = &pAC->Tim.StQueue ; (pTm = *ppTimPrev) ;
-+
-+ for (ppTimPrev = &pAC->Tim.StQueue; (pTm = *ppTimPrev);
- ppTimPrev = &pTm->TmNext ) {
-+
- if (pTm == pTimer) {
- /*
- * Timer found in queue
- * - dequeue it and
- * - correct delta of the next timer
- */
-- *ppTimPrev = pTm->TmNext ;
-+ *ppTimPrev = pTm->TmNext;
-
- if (pTm->TmNext) {
- /* correct delta of next timer in queue */
-- pTm->TmNext->TmDelta += pTm->TmDelta ;
-+ pTm->TmNext->TmDelta += pTm->TmDelta;
- }
-- return ;
-+ return;
- }
- }
- }
-@@ -175,65 +179,67 @@ SK_U32 Class, /* Event Class for this
- SK_U32 Event, /* Event Value for this timer */
- SK_EVPARA Para) /* Event Parameter for this timer */
- {
-- SK_TIMER **ppTimPrev ;
-- SK_TIMER *pTm ;
-- SK_U32 Delta ;
-+ SK_TIMER **ppTimPrev;
-+ SK_TIMER *pTm;
-+ SK_U32 Delta;
-
-- Time /= 16 ; /* input is uS, clock ticks are 16uS */
-+ Time /= 16; /* input is uS, clock ticks are 16uS */
-+
- if (!Time)
-- Time = 1 ;
-+ Time = 1;
-
-- SkTimerStop(pAC,Ioc,pTimer) ;
-+ SkTimerStop(pAC, Ioc, pTimer);
-
-- pTimer->TmClass = Class ;
-- pTimer->TmEvent = Event ;
-- pTimer->TmPara = Para ;
-- pTimer->TmActive = SK_TRUE ;
-+ pTimer->TmClass = Class;
-+ pTimer->TmEvent = Event;
-+ pTimer->TmPara = Para;
-+ pTimer->TmActive = SK_TRUE;
-
- if (!pAC->Tim.StQueue) {
- /* First Timer to be started */
-- pAC->Tim.StQueue = pTimer ;
-- pTimer->TmNext = 0 ;
-- pTimer->TmDelta = Time ;
-- SkHwtStart(pAC,Ioc,Time) ;
-- return ;
-+ pAC->Tim.StQueue = pTimer;
-+ pTimer->TmNext = 0;
-+ pTimer->TmDelta = Time;
-+
-+ SkHwtStart(pAC, Ioc, Time);
-+
-+ return;
- }
-
- /*
- * timer correction
- */
-- timer_done(pAC,Ioc,0) ;
-+ timer_done(pAC, Ioc, 0);
-
- /*
- * find position in queue
- */
-- Delta = 0 ;
-- for (ppTimPrev = &pAC->Tim.StQueue ; (pTm = *ppTimPrev) ;
-+ Delta = 0;
-+ for (ppTimPrev = &pAC->Tim.StQueue; (pTm = *ppTimPrev);
- ppTimPrev = &pTm->TmNext ) {
-+
- if (Delta + pTm->TmDelta > Time) {
- /* Position found */
- /* Here the timer needs to be inserted. */
-- break ;
-+ break;
- }
-- Delta += pTm->TmDelta ;
-+ Delta += pTm->TmDelta;
- }
-
- /* insert in queue */
-- *ppTimPrev = pTimer ;
-- pTimer->TmNext = pTm ;
-- pTimer->TmDelta = Time - Delta ;
-+ *ppTimPrev = pTimer;
-+ pTimer->TmNext = pTm;
-+ pTimer->TmDelta = Time - Delta;
-
- if (pTm) {
- /* There is a next timer
- * -> correct its Delta value.
- */
-- pTm->TmDelta -= pTimer->TmDelta ;
-+ pTm->TmDelta -= pTimer->TmDelta;
- }
-
-- /*
-- * start new with first
-- */
-- SkHwtStart(pAC,Ioc,pAC->Tim.StQueue->TmDelta) ;
-+ /* restart with first */
-+ SkHwtStart(pAC, Ioc, pAC->Tim.StQueue->TmDelta);
- }
-
-
-@@ -241,55 +247,56 @@ void SkTimerDone(
- SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc) /* IoContext */
- {
-- timer_done(pAC,Ioc,1) ;
-+ timer_done(pAC, Ioc, 1);
- }
-
-
- static void timer_done(
- SK_AC *pAC, /* Adapters context */
- SK_IOC Ioc, /* IoContext */
--int Restart) /* Do we need to restart the Hardware timer ? */
-+int Restart) /* Do we need to restart the Hardware timer ? */
- {
-- SK_U32 Delta ;
-- SK_TIMER *pTm ;
-- SK_TIMER *pTComp ; /* Timer completed now now */
-- SK_TIMER **ppLast ; /* Next field of Last timer to be deq */
-- int Done = 0 ;
--
-- Delta = SkHwtRead(pAC,Ioc) ;
-- ppLast = &pAC->Tim.StQueue ;
-- pTm = pAC->Tim.StQueue ;
-+ SK_U32 Delta;
-+ SK_TIMER *pTm;
-+ SK_TIMER *pTComp; /* Timer completed now now */
-+ SK_TIMER **ppLast; /* Next field of Last timer to be deq */
-+ int Done = 0;
-+
-+ Delta = SkHwtRead(pAC, Ioc);
-+
-+ ppLast = &pAC->Tim.StQueue;
-+ pTm = pAC->Tim.StQueue;
- while (pTm && !Done) {
- if (Delta >= pTm->TmDelta) {
- /* Timer ran out */
-- pTm->TmActive = SK_FALSE ;
-- Delta -= pTm->TmDelta ;
-- ppLast = &pTm->TmNext ;
-- pTm = pTm->TmNext ;
-- } else {
-+ pTm->TmActive = SK_FALSE;
-+ Delta -= pTm->TmDelta;
-+ ppLast = &pTm->TmNext;
-+ pTm = pTm->TmNext;
-+ }
-+ else {
- /* We found the first timer that did not run out */
-- pTm->TmDelta -= Delta ;
-- Delta = 0 ;
-- Done = 1 ;
-+ pTm->TmDelta -= Delta;
-+ Delta = 0;
-+ Done = 1;
- }
- }
-- *ppLast = 0 ;
-+ *ppLast = 0;
- /*
- * pTm points to the first Timer that did not run out.
- * StQueue points to the first Timer that run out.
- */
-
-- for ( pTComp = pAC->Tim.StQueue ; pTComp ; pTComp = pTComp->TmNext) {
-- SkEventQueue(pAC,pTComp->TmClass, pTComp->TmEvent,
-- pTComp->TmPara) ;
-+ for ( pTComp = pAC->Tim.StQueue; pTComp; pTComp = pTComp->TmNext) {
-+ SkEventQueue(pAC,pTComp->TmClass, pTComp->TmEvent, pTComp->TmPara);
- }
-
- /* Set head of timer queue to the first timer that did not run out */
-- pAC->Tim.StQueue = pTm ;
-+ pAC->Tim.StQueue = pTm;
-
- if (Restart && pAC->Tim.StQueue) {
- /* Restart HW timer */
-- SkHwtStart(pAC,Ioc,pAC->Tim.StQueue->TmDelta) ;
-+ SkHwtStart(pAC, Ioc, pAC->Tim.StQueue->TmDelta);
- }
- }
-
---- linux-2.6.0/drivers/net/sk98lin/skxmac2.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/net/sk98lin/skxmac2.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2,8 +2,8 @@
- *
- * Name: skxmac2.c
- * Project: Gigabit Ethernet Adapters, Common Modules
-- * Version: $Revision: 1.99 $
-- * Date: $Date: 2003/07/11 12:19:33 $
-+ * Version: $Revision: 1.102 $
-+ * Date: $Date: 2003/10/02 16:53:58 $
- * Purpose: Contains functions to initialize the MACs and PHYs
- *
- ******************************************************************************/
-@@ -27,6 +27,23 @@
- * History:
- *
- * $Log: skxmac2.c,v $
-+ * Revision 1.102 2003/10/02 16:53:58 rschmidt
-+ * Changed setting of GMAC parameters with new macros.
-+ * Added define SLIM around SkGm...LowPowerMode().
-+ * Editorial changes.
-+ *
-+ * Revision 1.101 2003/09/16 14:49:07 rschmidt
-+ * Added routines SkGmClearRst(), SkXmClearRst, SkMacClearRst().
-+ * Added WA code for Yukon-Lite's COMA mode in SkGmHardRst().
-+ * Replaced PCI-Config R/W through internal access.
-+ * Fixed return from coma mode in SkGmLeaveLowPowerMode().
-+ * Fixed compiler warnings for different types.
-+ * Editorial changes.
-+ *
-+ * Revision 1.100 2003/09/16 07:09:11 mschmid
-+ * Added functions SkGmEnterLowPowerMode() and
-+ * SkGmLeaveLowPowerMode()
-+ *
- * Revision 1.99 2003/07/11 12:19:33 rschmidt
- * Reduced init values for Master & Slave downshift counters to
- * minimum values.
-@@ -164,7 +181,7 @@
- * Revision 1.74 2002/08/12 14:00:17 rschmidt
- * Replaced usage of Broadcom PHY Ids with defines.
- * Corrected error messages in SkGmMacStatistic().
-- * Made SkMacPromiscMode() public for ADDR-Modul.
-+ * Made SkMacPromiscMode() public for ADDR-Module.
- * Editorial changes.
- *
- * Revision 1.73 2002/08/08 16:26:24 rschmidt
-@@ -475,7 +492,7 @@ typedef struct s_PhyHack {
-
- #if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
- static const char SysKonnectFileId[] =
-- "@(#) $Id: skxmac2.c,v 1.99 2003/07/11 12:19:33 rschmidt Exp $ (C) Marvell.";
-+ "@(#) $Id: skxmac2.c,v 1.102 2003/10/02 16:53:58 rschmidt Exp $ (C) Marvell.";
- #endif
-
- #ifdef GENESIS
-@@ -1343,7 +1360,7 @@ int Port) /* Port Index (MAC_1 + n) */
- * Description:
- * The XMAC of the specified 'Port' and all connected devices
- * (PHY and SERDES) will receive a reset signal on its *Reset pins.
-- * External PHYs must be reset be clearing a bit in the GPIO register
-+ * External PHYs must be reset by clearing a bit in the GPIO register
- * (Timing requirements: Broadcom: 400ns, Level One: none, National: 80ns).
- *
- * ATTENTION:
-@@ -1386,23 +1403,62 @@ int Port) /* Port Index (MAC_1 + n) */
-
- /* For external PHYs there must be special handling */
- if (pAC->GIni.GP[Port].PhyType != SK_PHY_XMAC) {
-- /* reset external PHY */
-+
- SK_IN32(IoC, B2_GP_IO, &Reg);
-+
- if (Port == 0) {
-- Reg |= GP_DIR_0; /* set to output */
-- Reg &= ~GP_IO_0;
-+ Reg |= GP_DIR_0; /* set to output */
-+ Reg &= ~GP_IO_0; /* set PHY reset (active low) */
- }
- else {
-- Reg |= GP_DIR_2; /* set to output */
-- Reg &= ~GP_IO_2;
-+ Reg |= GP_DIR_2; /* set to output */
-+ Reg &= ~GP_IO_2; /* set PHY reset (active low) */
- }
-+ /* reset external PHY */
- SK_OUT32(IoC, B2_GP_IO, Reg);
-
- /* short delay */
- SK_IN32(IoC, B2_GP_IO, &Reg);
- }
--
- } /* SkXmHardRst */
-+
-+
-+/******************************************************************************
-+ *
-+ * SkXmClearRst() - Release the PHY & XMAC reset
-+ *
-+ * Description:
-+ *
-+ * Returns:
-+ * nothing
-+ */
-+static void SkXmClearRst(
-+SK_AC *pAC, /* adapter context */
-+SK_IOC IoC, /* IO context */
-+int Port) /* Port Index (MAC_1 + n) */
-+{
-+ SK_U32 DWord;
-+
-+ /* clear HW reset */
-+ SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_CLR_MAC_RST);
-+
-+ if (pAC->GIni.GP[Port].PhyType != SK_PHY_XMAC) {
-+
-+ SK_IN32(IoC, B2_GP_IO, &DWord);
-+
-+ if (Port == 0) {
-+ DWord |= (GP_DIR_0 | GP_IO_0); /* set to output */
-+ }
-+ else {
-+ DWord |= (GP_DIR_2 | GP_IO_2); /* set to output */
-+ }
-+ /* Clear PHY reset */
-+ SK_OUT32(IoC, B2_GP_IO, DWord);
-+
-+ /* Enable GMII interface */
-+ XM_OUT16(IoC, Port, XM_HW_CFG, XM_HW_GMII_MD);
-+ }
-+} /* SkXmClearRst */
- #endif /* GENESIS */
-
-
-@@ -1452,10 +1508,6 @@ int Port) /* Port Index (MAC_1 + n) */
- *
- * Description:
- *
-- * ATTENTION:
-- * It is absolutely necessary to reset the SW_RST Bit first
-- * before calling this function.
-- *
- * Returns:
- * nothing
- */
-@@ -1464,6 +1516,20 @@ SK_AC *pAC, /* adapter context */
- SK_IOC IoC, /* IO context */
- int Port) /* Port Index (MAC_1 + n) */
- {
-+ SK_U32 DWord;
-+
-+ /* WA code for COMA mode */
-+ if (pAC->GIni.GIYukonLite &&
-+ pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) {
-+
-+ SK_IN32(IoC, B2_GP_IO, &DWord);
-+
-+ DWord |= (GP_DIR_9 | GP_IO_9);
-+
-+ /* set PHY reset */
-+ SK_OUT32(IoC, B2_GP_IO, DWord);
-+ }
-+
- /* set GPHY Control reset */
- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), GPC_RST_SET);
-
-@@ -1471,6 +1537,73 @@ int Port) /* Port Index (MAC_1 + n) */
- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET);
-
- } /* SkGmHardRst */
-+
-+
-+/******************************************************************************
-+ *
-+ * SkGmClearRst() - Release the GPHY & GMAC reset
-+ *
-+ * Description:
-+ *
-+ * Returns:
-+ * nothing
-+ */
-+static void SkGmClearRst(
-+SK_AC *pAC, /* adapter context */
-+SK_IOC IoC, /* IO context */
-+int Port) /* Port Index (MAC_1 + n) */
-+{
-+ SK_U32 DWord;
-+
-+#ifdef XXX
-+ /* clear GMAC Control reset */
-+ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_CLR);
-+
-+ /* set GMAC Control reset */
-+ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET);
-+#endif /* XXX */
-+
-+ /* WA code for COMA mode */
-+ if (pAC->GIni.GIYukonLite &&
-+ pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) {
-+
-+ SK_IN32(IoC, B2_GP_IO, &DWord);
-+
-+ DWord |= GP_DIR_9; /* set to output */
-+ DWord &= ~GP_IO_9; /* clear PHY reset (active high) */
-+
-+ /* clear PHY reset */
-+ SK_OUT32(IoC, B2_GP_IO, DWord);
-+ }
-+
-+ /* set HWCFG_MODE */
-+ DWord = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP |
-+ GPC_ENA_XC | GPC_ANEG_ADV_ALL_M | GPC_ENA_PAUSE |
-+ (pAC->GIni.GICopperType ? GPC_HWCFG_GMII_COP :
-+ GPC_HWCFG_GMII_FIB);
-+
-+ /* set GPHY Control reset */
-+ SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_SET);
-+
-+ /* release GPHY Control reset */
-+ SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_CLR);
-+
-+#ifdef VCPU
-+ VCpuWait(9000);
-+#endif /* VCPU */
-+
-+ /* clear GMAC Control reset */
-+ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_ON | GMC_RST_CLR);
-+
-+#ifdef VCPU
-+ VCpuWait(2000);
-+
-+ SK_IN32(IoC, MR_ADDR(Port, GPHY_CTRL), &DWord);
-+
-+ SK_IN32(IoC, B0_ISRC, &DWord);
-+#endif /* VCPU */
-+
-+} /* SkGmClearRst */
- #endif /* YUKON */
-
-
-@@ -1553,6 +1686,38 @@ int Port) /* Port Index (MAC_1 + n) */
- } /* SkMacHardRst */
-
-
-+/******************************************************************************
-+ *
-+ * SkMacClearRst() - Clear the MAC reset
-+ *
-+ * Description: calls a clear MAC reset routine dep. on board type
-+ *
-+ * Returns:
-+ * nothing
-+ */
-+void SkMacClearRst(
-+SK_AC *pAC, /* adapter context */
-+SK_IOC IoC, /* IO context */
-+int Port) /* Port Index (MAC_1 + n) */
-+{
-+
-+#ifdef GENESIS
-+ if (pAC->GIni.GIGenesis) {
-+
-+ SkXmClearRst(pAC, IoC, Port);
-+ }
-+#endif /* GENESIS */
-+
-+#ifdef YUKON
-+ if (pAC->GIni.GIYukon) {
-+
-+ SkGmClearRst(pAC, IoC, Port);
-+ }
-+#endif /* YUKON */
-+
-+} /* SkMacClearRst */
-+
-+
- #ifdef GENESIS
- /******************************************************************************
- *
-@@ -1574,7 +1739,6 @@ SK_IOC IoC, /* IO context */
- int Port) /* Port Index (MAC_1 + n) */
- {
- SK_GEPORT *pPrt;
-- SK_U32 Reg;
- int i;
- SK_U16 SWord;
-
-@@ -1594,32 +1758,10 @@ int Port) /* Port Index (MAC_1 + n) */
- }
-
- if (pPrt->PState == SK_PRT_RESET) {
-- /*
-- * clear HW reset
-- * Note: The SW reset is self clearing, therefore there is
-- * nothing to do here.
-- */
-- SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_CLR_MAC_RST);
-
-- /* Ensure that XMAC reset release is done (errata from LReinbold?) */
-- SK_IN16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), &SWord);
-+ SkXmClearRst(pAC, IoC, Port);
-
-- /* Clear PHY reset */
- if (pPrt->PhyType != SK_PHY_XMAC) {
--
-- SK_IN32(IoC, B2_GP_IO, &Reg);
--
-- if (Port == 0) {
-- Reg |= (GP_DIR_0 | GP_IO_0); /* set to output */
-- }
-- else {
-- Reg |= (GP_DIR_2 | GP_IO_2); /* set to output */
-- }
-- SK_OUT32(IoC, B2_GP_IO, Reg);
--
-- /* Enable GMII interface */
-- XM_OUT16(IoC, Port, XM_HW_CFG, XM_HW_GMII_MD);
--
- /* read Id from external PHY (all have the same address) */
- SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_ID1, &pPrt->PhyId1);
-
-@@ -1831,43 +1973,11 @@ int Port) /* Port Index (MAC_1 + n) */
- }
-
- if (pPrt->PState == SK_PRT_RESET) {
-- /* set GPHY Control reset */
-- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), GPC_RST_SET);
--
-- /* set GMAC Control reset */
-- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET);
--
--#ifdef XXX
-- /* clear GMAC Control reset */
-- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_CLR);
--
-- /* set GMAC Control reset */
-- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET);
--#endif /* XXX */
--
-- /* set HWCFG_MODE */
-- DWord = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP |
-- GPC_ENA_XC | GPC_ANEG_ADV_ALL_M | GPC_ENA_PAUSE |
-- (pAC->GIni.GICopperType ? GPC_HWCFG_GMII_COP :
-- GPC_HWCFG_GMII_FIB);
--
-- /* set GPHY Control reset */
-- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_SET);
--
-- /* release GPHY Control reset */
-- SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_CLR);
--
--#ifdef VCPU
-- VCpuWait(9000);
--#endif /* VCPU */
--
-- /* clear GMAC Control reset */
-- SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_ON | GMC_RST_CLR);
--
--#ifdef VCPU
-- VCpuWait(2000);
--#endif /* VCPU */
-+
-+ SkGmHardRst(pAC, IoC, Port);
-
-+ SkGmClearRst(pAC, IoC, Port);
-+
- /* Auto-negotiation ? */
- if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {
- /* Auto-negotiation disabled */
-@@ -1906,6 +2016,7 @@ int Port) /* Port Index (MAC_1 + n) */
- SWord |= GM_GPCR_DUP_FULL;
- }
-
-+ /* flow-control settings */
- switch (pPrt->PFlowCtrlMode) {
- case SK_FLOW_MODE_NONE:
- /* set Pause Off */
-@@ -1940,7 +2051,7 @@ int Port) /* Port Index (MAC_1 + n) */
- (void)SkGmResetCounter(pAC, IoC, Port);
-
- /* setup Transmit Control Register */
-- GM_OUT16(IoC, Port, GM_TX_CTRL, GM_TXCR_COL_THR);
-+ GM_OUT16(IoC, Port, GM_TX_CTRL, TX_COL_THR(pPrt->PMacColThres));
-
- /* setup Receive Control Register */
- GM_OUT16(IoC, Port, GM_RX_CTRL, GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA |
-@@ -1954,7 +2065,9 @@ int Port) /* Port Index (MAC_1 + n) */
- GM_IN16(IoC, Port, GM_TX_PARAM, &SWord);
- #endif /* VCPU */
-
-- SWord = (SK_U16)(JAM_LEN_VAL(3) | JAM_IPG_VAL(11) | IPG_JAM_DATA(26));
-+ SWord = TX_JAM_LEN_VAL(pPrt->PMacJamLen) |
-+ TX_JAM_IPG_VAL(pPrt->PMacJamIpgVal) |
-+ TX_IPG_JAM_DATA(pPrt->PMacJamIpgData);
-
- GM_OUT16(IoC, Port, GM_TX_PARAM, SWord);
-
-@@ -1963,7 +2076,12 @@ int Port) /* Port Index (MAC_1 + n) */
- GM_IN16(IoC, Port, GM_SERIAL_MODE, &SWord);
- #endif /* VCPU */
-
-- SWord = GM_SMOD_VLAN_ENA | IPG_VAL_FAST_ETH;
-+ SWord = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(pPrt->PMacIpgData);
-+
-+ if (pPrt->PMacLimit4) {
-+ /* reset of collision counter after 4 consecutive collisions */
-+ SWord |= GM_SMOD_LIMIT_4;
-+ }
-
- if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
- /* enable jumbo mode (Max. Frame Length = 9018) */
-@@ -2021,11 +2139,13 @@ int Port) /* Port Index (MAC_1 + n) */
- GM_OUT16(IoC, Port, GM_RX_IRQ_MSK, 0);
- GM_OUT16(IoC, Port, GM_TR_IRQ_MSK, 0);
-
-+#if defined(SK_DIAG) || defined(DEBUG)
- /* read General Purpose Status */
- GM_IN16(IoC, Port, GM_GP_STAT, &SWord);
-
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("MAC Stat Reg=0x%04X\n", SWord));
-+ ("MAC Stat Reg.=0x%04X\n", SWord));
-+#endif /* SK_DIAG || DEBUG */
-
- #ifdef SK_DIAG
- c_print("MAC Stat Reg=0x%04X\n", SWord);
-@@ -2226,6 +2346,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- SKERR_HWI_E015MSG);
- }
-
-+ /* Set Flow-control capabilities */
- switch (pPrt->PFlowCtrlMode) {
- case SK_FLOW_MODE_NONE:
- Ctrl |= PHY_X_P_NO_PAUSE;
-@@ -2306,7 +2427,9 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
- ("InitPhyBcom: no auto-negotiation Port %d\n", Port));
- /* Set DuplexMode in Config register */
-- Ctrl1 |= (pPrt->PLinkMode == SK_LMODE_FULL ? PHY_CT_DUP_MD : 0);
-+ if (pPrt->PLinkMode == SK_LMODE_FULL) {
-+ Ctrl1 |= PHY_CT_DUP_MD;
-+ }
-
- /* Determine Master/Slave manually if not already done */
- if (pPrt->PMSMode == SK_MS_MODE_AUTO) {
-@@ -2346,6 +2469,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- SKERR_HWI_E015MSG);
- }
-
-+ /* Set Flow-control capabilities */
- switch (pPrt->PFlowCtrlMode) {
- case SK_FLOW_MODE_NONE:
- Ctrl3 |= PHY_B_P_NO_PAUSE;
-@@ -2375,12 +2499,12 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- /* Write 1000Base-T Control Register */
- SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, Ctrl2);
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("1000B-T Ctrl Reg=0x%04X\n", Ctrl2));
-+ ("Set 1000B-T Ctrl Reg=0x%04X\n", Ctrl2));
-
- /* Write AutoNeg Advertisement Register */
- SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, Ctrl3);
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3));
-+ ("Set Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3));
-
- if (DoLoop) {
- /* Set the Phy Loopback bit, too */
-@@ -2409,6 +2533,281 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
-
-
- #ifdef YUKON
-+#ifndef SK_SLIM
-+/******************************************************************************
-+ *
-+ * SkGmEnterLowPowerMode()
-+ *
-+ * Description:
-+ * This function sets the Marvell Alaska PHY to the low power mode
-+ * given by parameter mode.
-+ * The following low power modes are available:
-+ *
-+ * - Coma Mode (Deep Sleep):
-+ * Power consumption: ~15 - 30 mW
-+ * The PHY cannot wake up on its own.
-+ *
-+ * - IEEE 22.2.4.1.5 compatible power down mode
-+ * Power consumption: ~240 mW
-+ * The PHY cannot wake up on its own.
-+ *
-+ * - energy detect mode
-+ * Power consumption: ~160 mW
-+ * The PHY can wake up on its own by detecting activity
-+ * on the CAT 5 cable.
-+ *
-+ * - energy detect plus mode
-+ * Power consumption: ~150 mW
-+ * The PHY can wake up on its own by detecting activity
-+ * on the CAT 5 cable.
-+ * Connected devices can be woken up by sending normal link
-+ * pulses every one second.
-+ *
-+ * Note:
-+ *
-+ * Returns:
-+ * 0: ok
-+ * 1: error
-+ */
-+int SkGmEnterLowPowerMode(
-+SK_AC *pAC, /* adapter context */
-+SK_IOC IoC, /* IO context */
-+int Port, /* Port Index (e.g. MAC_1) */
-+SK_U8 Mode) /* low power mode */
-+{
-+ SK_U16 Word;
-+ SK_U32 DWord;
-+ SK_U8 LastMode;
-+ int Ret = 0;
-+
-+ if (pAC->GIni.GIYukonLite &&
-+ pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) {
-+
-+ /* save current power mode */
-+ LastMode = pAC->GIni.GP[Port].PPhyPowerState;
-+ pAC->GIni.GP[Port].PPhyPowerState = Mode;
-+
-+ switch (Mode) {
-+ /* coma mode (deep sleep) */
-+ case PHY_PM_DEEP_SLEEP:
-+ /* setup General Purpose Control Register */
-+ GM_OUT16(IoC, 0, GM_GP_CTRL, GM_GPCR_FL_PASS |
-+ GM_GPCR_SPEED_100 | GM_GPCR_AU_ALL_DIS);
-+
-+ /* apply COMA mode workaround */
-+ SkGmPhyWrite(pAC, IoC, Port, 29, 0x001f);
-+ SkGmPhyWrite(pAC, IoC, Port, 30, 0xfff3);
-+
-+ SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord);
-+
-+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
-+
-+ /* Set PHY to Coma Mode */
-+ SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord | PCI_PHY_COMA);
-+
-+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
-+
-+ break;
-+
-+ /* IEEE 22.2.4.1.5 compatible power down mode */
-+ case PHY_PM_IEEE_POWER_DOWN:
-+ /*
-+ * - disable MAC 125 MHz clock
-+ * - allow MAC power down
-+ */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
-+ Word |= PHY_M_PC_DIS_125CLK;
-+ Word &= ~PHY_M_PC_MAC_POW_UP;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
-+
-+ /*
-+ * register changes must be followed by a software
-+ * reset to take effect
-+ */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
-+ Word |= PHY_CT_RESET;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
-+
-+ /* switch IEEE compatible power down mode on */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
-+ Word |= PHY_CT_PDOWN;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
-+ break;
-+
-+ /* energy detect and energy detect plus mode */
-+ case PHY_PM_ENERGY_DETECT:
-+ case PHY_PM_ENERGY_DETECT_PLUS:
-+ /*
-+ * - disable MAC 125 MHz clock
-+ */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
-+ Word |= PHY_M_PC_DIS_125CLK;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
-+
-+ /* activate energy detect mode 1 */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
-+
-+ /* energy detect mode */
-+ if (Mode == PHY_PM_ENERGY_DETECT) {
-+ Word |= PHY_M_PC_EN_DET;
-+ }
-+ /* energy detect plus mode */
-+ else {
-+ Word |= PHY_M_PC_EN_DET_PLUS;
-+ }
-+
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
-+
-+ /*
-+ * reinitialize the PHY to force a software reset
-+ * which is necessary after the register settings
-+ * for the energy detect modes.
-+ * Furthermore reinitialisation prevents that the
-+ * PHY is running out of a stable state.
-+ */
-+ SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE);
-+ break;
-+
-+ /* don't change current power mode */
-+ default:
-+ pAC->GIni.GP[Port].PPhyPowerState = LastMode;
-+ Ret = 1;
-+ break;
-+ }
-+ }
-+ /* low power modes are not supported by this chip */
-+ else {
-+ Ret = 1;
-+ }
-+
-+ return(Ret);
-+
-+} /* SkGmEnterLowPowerMode */
-+
-+/******************************************************************************
-+ *
-+ * SkGmLeaveLowPowerMode()
-+ *
-+ * Description:
-+ * Leave the current low power mode and switch to normal mode
-+ *
-+ * Note:
-+ *
-+ * Returns:
-+ * 0: ok
-+ * 1: error
-+ */
-+int SkGmLeaveLowPowerMode(
-+SK_AC *pAC, /* adapter context */
-+SK_IOC IoC, /* IO context */
-+int Port) /* Port Index (e.g. MAC_1) */
-+{
-+ SK_U32 DWord;
-+ SK_U16 Word;
-+ SK_U8 LastMode;
-+ int Ret = 0;
-+
-+ if (pAC->GIni.GIYukonLite &&
-+ pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) {
-+
-+ /* save current power mode */
-+ LastMode = pAC->GIni.GP[Port].PPhyPowerState;
-+ pAC->GIni.GP[Port].PPhyPowerState = PHY_PM_OPERATIONAL_MODE;
-+
-+ switch (LastMode) {
-+ /* coma mode (deep sleep) */
-+ case PHY_PM_DEEP_SLEEP:
-+ SK_IN32(IoC, PCI_C(PCI_OUR_REG_1), &DWord);
-+
-+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
-+
-+ /* Release PHY from Coma Mode */
-+ SK_OUT32(IoC, PCI_C(PCI_OUR_REG_1), DWord & ~PCI_PHY_COMA);
-+
-+ SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
-+
-+ SK_IN32(IoC, B2_GP_IO, &DWord);
-+
-+ /* set to output */
-+ DWord |= (GP_DIR_9 | GP_IO_9);
-+
-+ /* set PHY reset */
-+ SK_OUT32(IoC, B2_GP_IO, DWord);
-+
-+ DWord &= ~GP_IO_9; /* clear PHY reset (active high) */
-+
-+ /* clear PHY reset */
-+ SK_OUT32(IoC, B2_GP_IO, DWord);
-+ break;
-+
-+ /* IEEE 22.2.4.1.5 compatible power down mode */
-+ case PHY_PM_IEEE_POWER_DOWN:
-+ /*
-+ * - enable MAC 125 MHz clock
-+ * - set MAC power up
-+ */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
-+ Word &= ~PHY_M_PC_DIS_125CLK;
-+ Word |= PHY_M_PC_MAC_POW_UP;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
-+
-+ /*
-+ * register changes must be followed by a software
-+ * reset to take effect
-+ */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
-+ Word |= PHY_CT_RESET;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
-+
-+ /* switch IEEE compatible power down mode off */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &Word);
-+ Word &= ~PHY_CT_PDOWN;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, Word);
-+ break;
-+
-+ /* energy detect and energy detect plus mode */
-+ case PHY_PM_ENERGY_DETECT:
-+ case PHY_PM_ENERGY_DETECT_PLUS:
-+ /*
-+ * - enable MAC 125 MHz clock
-+ */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
-+ Word &= ~PHY_M_PC_DIS_125CLK;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
-+
-+ /* disable energy detect mode */
-+ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_CTRL, &Word);
-+ Word &= ~PHY_M_PC_EN_DET_MSK;
-+ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, Word);
-+
-+ /*
-+ * reinitialize the PHY to force a software reset
-+ * which is necessary after the register settings
-+ * for the energy detect modes.
-+ * Furthermore reinitialisation prevents that the
-+ * PHY is running out of a stable state.
-+ */
-+ SkGmInitPhyMarv(pAC, IoC, Port, SK_FALSE);
-+ break;
-+
-+ /* don't change current power mode */
-+ default:
-+ pAC->GIni.GP[Port].PPhyPowerState = LastMode;
-+ Ret = 1;
-+ break;
-+ }
-+ }
-+ /* low power modes are not supported by this chip */
-+ else {
-+ Ret = 1;
-+ }
-+
-+ return(Ret);
-+
-+} /* SkGmLeaveLowPowerMode */
-+#endif /* !SK_SLIM */
-+
-+
- /******************************************************************************
- *
- * SkGmInitPhyMarv() - Initialize the Marvell Phy registers
-@@ -2457,7 +2856,6 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- VCPUprintf(0, "SkGmInitPhyMarv(), Port=%u, DoLoop=%u\n",
- Port, DoLoop);
- #else /* VCPU */
--
- if (DoLoop) {
- /* Set 'MAC Power up'-bit, set Manual MDI configuration */
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL,
-@@ -2475,16 +2873,20 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
-
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, ExtPhyCtrl);
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl));
-+ ("Set Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl));
- }
-
- /* Read PHY Control */
- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl);
-
-+ if (!AutoNeg) {
-+ /* Disable Auto-negotiation */
-+ PhyCtrl &= ~PHY_CT_ANE;
-+ }
-+
- PhyCtrl |= PHY_CT_RESET;
- /* Assert software reset */
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl);
--
- #endif /* VCPU */
-
- PhyCtrl = 0 /* PHY_CT_COL_TST */;
-@@ -2533,13 +2935,9 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- if (!DoLoop) {
- PhyCtrl |= PHY_CT_RESET;
- }
-- /*
-- * Do NOT enable Auto-negotiation here. This would hold
-- * the link down because no IDLES are transmitted
-- */
- }
- else {
-- PhyCtrl |= PHY_CT_ANE;
-+ /* Set Auto-negotiation advertisement */
-
- if (pAC->GIni.GICopperType) {
- /* Set Speed capabilities */
-@@ -2554,6 +2952,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- break;
- case SK_LSPEED_100MBPS:
- AutoNegAdv |= PHY_M_AN_100_FD | PHY_M_AN_100_HD |
-+ /* advertise 10Base-T also */
- PHY_M_AN_10_FD | PHY_M_AN_10_HD;
- break;
- case SK_LSPEED_10MBPS:
-@@ -2581,7 +2980,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- SKERR_HWI_E015MSG);
- }
-
-- /* Set Auto-negotiation advertisement */
-+ /* Set Flow-control capabilities */
- switch (pPrt->PFlowCtrlMode) {
- case SK_FLOW_MODE_NONE:
- AutoNegAdv |= PHY_B_P_NO_PAUSE;
-@@ -2618,7 +3017,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- SKERR_HWI_E015MSG);
- }
-
-- /* Set Auto-negotiation advertisement */
-+ /* Set Flow-control capabilities */
- switch (pPrt->PFlowCtrlMode) {
- case SK_FLOW_MODE_NONE:
- AutoNegAdv |= PHY_M_P_NO_PAUSE_X;
-@@ -2640,7 +3039,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
-
- if (!DoLoop) {
- /* Restart Auto-negotiation */
-- PhyCtrl |= PHY_CT_RE_CFG;
-+ PhyCtrl |= PHY_CT_ANE | PHY_CT_RE_CFG;
- }
- }
-
-@@ -2659,12 +3058,12 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- /* Write 1000Base-T Control Register */
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_1000T_CTRL, C1000BaseT);
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("1000B-T Ctrl=0x%04X\n", C1000BaseT));
-+ ("Set 1000B-T Ctrl =0x%04X\n", C1000BaseT));
-
- /* Write AutoNeg Advertisement Register */
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV, AutoNegAdv);
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("Auto-Neg.Ad.=0x%04X\n", AutoNegAdv));
-+ ("Set Auto-Neg.Adv.=0x%04X\n", AutoNegAdv));
- #endif /* VCPU */
-
- if (DoLoop) {
-@@ -2694,6 +3093,8 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
-
- /* Write to the PHY Control register */
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl);
-+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-+ ("Set PHY Ctrl Reg.=0x%04X\n", PhyCtrl));
-
- #ifdef VCPU
- VCpuWait(2000);
-@@ -2712,7 +3113,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_CTRL, LedCtrl);
-
- if ((pAC->GIni.GILedBlinkCtrl & SK_LED_LINK100_ON) != 0) {
-- /* only in forced 100Mbps mode */
-+ /* only in forced 100 Mbps mode */
- if (!AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_100MBPS) {
-
- SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_OVER,
-@@ -2741,7 +3142,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- /* Read AutoNeg Advertisement Register */
- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &AutoNegAdv);
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-- ("Auto-Neg. Ad.=0x%04X\n", AutoNegAdv));
-+ ("Auto-Neg.Adv.=0x%04X\n", AutoNegAdv));
-
- /* Read Ext. PHY Specific Control */
- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl);
-@@ -2818,13 +3219,15 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- /* Auto-negotiation ? */
- if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {
- /*
-- * level one spec say: "1000Mbps: manual mode not allowed"
-+ * level one spec say: "1000 Mbps: manual mode not allowed"
- * but lets see what happens...
- */
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
- ("InitPhyLone: no auto-negotiation Port %d\n", Port));
- /* Set DuplexMode in Config register */
-- Ctrl1 = (pPrt->PLinkMode == SK_LMODE_FULL ? PHY_CT_DUP_MD : 0);
-+ if (pPrt->PLinkMode == SK_LMODE_FULL) {
-+ Ctrl1 |= PHY_CT_DUP_MD;
-+ }
-
- /* Determine Master/Slave manually if not already done */
- if (pPrt->PMSMode == SK_MS_MODE_AUTO) {
-@@ -2857,6 +3260,7 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
- SKERR_HWI_E015MSG);
- }
-
-+ /* Set Flow-control capabilities */
- switch (pPrt->PFlowCtrlMode) {
- case SK_FLOW_MODE_NONE:
- Ctrl3 |= PHY_L_P_NO_PAUSE;
-@@ -2877,7 +3281,6 @@ SK_BOOL DoLoop) /* Should a Phy LoopBac
-
- /* Restart Auto-negotiation */
- Ctrl1 = PHY_CT_ANE | PHY_CT_RE_CFG;
--
- }
-
- /* Write 1000Base-T Control Register */
-@@ -3019,10 +3422,10 @@ int Port) /* Port Index (MAC_1 + n) */
-
- /* Check Duplex mismatch */
- if ((ResAb & (PHY_X_RS_HD | PHY_X_RS_FD)) == PHY_X_RS_FD) {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOFULL;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOFULL;
- }
- else if ((ResAb & (PHY_X_RS_HD | PHY_X_RS_FD)) == PHY_X_RS_HD) {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOHALF;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF;
- }
- else {
- /* Error */
-@@ -3055,7 +3458,7 @@ int Port) /* Port Index (MAC_1 + n) */
- /* PAUSE mismatch -> no PAUSE */
- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE;
- }
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_1000MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
-
- return(SK_AND_OK);
- } /* SkXmAutoNegDoneXmac */
-@@ -3110,10 +3513,10 @@ int Port) /* Port Index (MAC_1 + n) */
-
- /* Check Duplex mismatch */
- if ((AuxStat & PHY_B_AS_AN_RES_MSK) == PHY_B_RES_1000FD) {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOFULL;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOFULL;
- }
- else if ((AuxStat & PHY_B_AS_AN_RES_MSK) == PHY_B_RES_1000HD) {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOHALF;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF;
- }
- else {
- /* Error */
-@@ -3156,7 +3559,7 @@ int Port) /* Port Index (MAC_1 + n) */
- /* PAUSE mismatch -> no PAUSE */
- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE;
- }
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_1000MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
-
- return(SK_AND_OK);
- } /* SkXmAutoNegDoneBcom */
-@@ -3192,6 +3595,8 @@ int Port) /* Port Index (MAC_1 + n) */
-
- /* Get PHY parameters */
- SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_LP, &LPAb);
-+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-+ ("Link P.Abil.=0x%04X\n", LPAb));
-
- if ((LPAb & PHY_M_AN_RF) != 0) {
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-@@ -3222,15 +3627,15 @@ int Port) /* Port Index (MAC_1 + n) */
- SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
- ("AutoNegFail: Speed & Duplex not resolved, Port %d\n", Port));
- pPrt->PAutoNegFail = SK_TRUE;
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_UNKNOWN;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
- return(SK_AND_DUP_CAP);
- }
-
- if ((AuxStat & PHY_M_PS_FULL_DUP) != 0) {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOFULL;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOFULL;
- }
- else {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOHALF;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF;
- }
-
- /* Check PAUSE mismatch ??? */
-@@ -3255,13 +3660,13 @@ int Port) /* Port Index (MAC_1 + n) */
- /* set used link speed */
- switch ((unsigned)(AuxStat & PHY_M_PS_SPEED_MSK)) {
- case (unsigned)PHY_M_PS_SPEED_1000:
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_1000MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_1000MBPS;
- break;
- case PHY_M_PS_SPEED_100:
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_100MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_100MBPS;
- break;
- default:
-- pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_10MBPS;
-+ pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_10MBPS;
- }
-
- return(SK_AND_OK);
-@@ -3312,10 +3717,10 @@ int Port) /* Port Index (MAC_1 + n) */
-
- /* Check Duplex mismatch */
- if ((QuickStat & PHY_L_QS_DUP_MOD) != 0) {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOFULL;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOFULL;
- }
- else {
-- pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOHALF;
-+ pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_AUTOHALF;
- }
-
- /* Check Master/Slave resolution */
-@@ -3338,6 +3743,7 @@ int Port) /* Port Index (MAC_1 + n) */
- /* We are using IEEE 802.3z/D5.0 Table 37-4 */
- /* we must manually resolve the abilities here */
- pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE;
-+
- switch (pPrt->PFlowCtrlMode) {
- case SK_FLOW_MODE_NONE:
- /* default */
-@@ -3457,6 +3863,9 @@ int Port) /* Port Index (MAC_1 + n) */
- return(Rtv);
- }
-
-+ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,
-+ ("AutoNeg done Port %d\n", Port));
-+
- /* We checked everything and may now enable the link */
- pPrt->PAutoNegFail = SK_FALSE;
-
---- linux-2.6.0/drivers/net/skfp/skfddi.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/skfp/skfddi.c 2003-12-28 23:21:01.000000000 -0800
-@@ -39,12 +39,6 @@
- * are skfddi.c, h/types.h, h/osdef1st.h, h/targetos.h.
- * The others belong to the SysKonnect FDDI Hardware Module and
- * should better not be changed.
-- * NOTE:
-- * Compiling this driver produces some warnings, but I did not fix
-- * this, because the Hardware Module source is used for different
-- * drivers, and fixing it for Linux might bring problems on other
-- * projects. To keep the source common for all those drivers (and
-- * thus simplify fixes to it), please do not clean it up!
- *
- * Modification History:
- * Date Name Description
-@@ -58,6 +52,7 @@
- * 07-May-00 DM 64 bit fixes, new dma interface
- * 31-Jul-03 DB Audit copy_*_user in skfp_ioctl
- * Daniele Bellucci <bellucda@tiscali.it>
-+ * 03-Dec-03 SH Convert to PCI device model
- *
- * Compilation options (-Dxxx):
- * DRIVERDEBUG print lots of messages to log file
-@@ -70,7 +65,7 @@
-
- /* Version information string - should be updated prior to */
- /* each new release!!! */
--#define VERSION "2.06"
-+#define VERSION "2.07"
-
- static const char *boot_msg =
- "SysKonnect FDDI PCI Adapter driver v" VERSION " for\n"
-@@ -80,15 +75,11 @@ static const char *boot_msg =
-
- #include <linux/module.h>
- #include <linux/kernel.h>
--#include <linux/string.h>
--#include <linux/ptrace.h>
- #include <linux/errno.h>
- #include <linux/ioport.h>
- #include <linux/slab.h>
- #include <linux/interrupt.h>
- #include <linux/pci.h>
--#include <linux/delay.h>
--#include <linux/ctype.h> // isdigit
- #include <linux/netdevice.h>
- #include <linux/fddidevice.h>
- #include <linux/skbuff.h>
-@@ -106,17 +97,7 @@ static const char *boot_msg =
- #include "h/smtstate.h"
-
-
--// Define global routines
--int skfp_probe(struct net_device *dev);
--
--
- // Define module-wide (static) routines
--static struct net_device *alloc_device(struct net_device *dev, u_long iobase);
--static struct net_device *insert_device(struct net_device *dev,
-- int (*init) (struct net_device *));
--static int fddi_dev_index(unsigned char *s);
--static void init_dev(struct net_device *dev, u_long iobase);
--static void link_modules(struct net_device *dev, struct net_device *tmp);
- static int skfp_driver_init(struct net_device *dev);
- static int skfp_open(struct net_device *dev);
- static int skfp_close(struct net_device *dev);
-@@ -193,15 +174,6 @@ MODULE_AUTHOR("Mirko Lindner <mlindner@s
- // Define module-wide (static) variables
-
- static int num_boards; /* total number of adapters configured */
--static int num_fddi;
--static int autoprobed;
--
--#ifdef MODULE
--static struct net_device *unlink_modules(struct net_device *p);
--static int loading_module = 1;
--#else
--static int loading_module;
--#endif // MODULE
-
- #ifdef DRIVERDEBUG
- #define PRINTK(s, args...) printk(s, ## args)
-@@ -212,9 +184,9 @@ static int loading_module;
- #define PRIV(dev) (&(((struct s_smc *)dev->priv)->os))
-
- /*
-- * ==============
-- * = skfp_probe =
-- * ==============
-+ * =================
-+ * = skfp_init_one =
-+ * =================
- *
- * Overview:
- * Probes for supported FDDI PCI controllers
-@@ -223,30 +195,11 @@ static int loading_module;
- * Condition code
- *
- * Arguments:
-- * dev - pointer to device information
-+ * pdev - pointer to PCI device information
- *
- * Functional Description:
-- * This routine is called by the OS for each FDDI device name (fddi0,
-- * fddi1,...,fddi6, fddi7) specified in drivers/net/Space.c.
-- * If loaded as a module, it will detect and initialize all
-- * adapters the first time it is called.
-- *
-- * Let's say that skfp_probe() is getting called to initialize fddi0.
-- * Furthermore, let's say there are three supported controllers in the
-- * system. Before skfp_probe() leaves, devices fddi0, fddi1, and fddi2
-- * will be initialized and a global flag will be set to indicate that
-- * skfp_probe() has already been called.
-- *
-- * However...the OS doesn't know that we've already initialized
-- * devices fddi1 and fddi2 so skfp_probe() gets called again and again
-- * until it reaches the end of the device list for FDDI (presently,
-- * fddi7). It's important that the driver "pretend" to probe for
-- * devices fddi1 and fddi2 and return success. Devices fddi3
-- * through fddi7 will return failure since they weren't initialized.
-- *
-- * This algorithm seems to work for the time being. As other FDDI
-- * drivers are written for Linux, a more generic approach (perhaps
-- * similar to the Ethernet card approach) may need to be implemented.
-+ * This is now called by PCI driver registration process
-+ * for each board found.
- *
- * Return Codes:
- * 0 - This device (fddi0, fddi1, etc) configured successfully
-@@ -259,374 +212,176 @@ static int loading_module;
- * initialized and the board resources are read and stored in
- * the device structure.
- */
--int skfp_probe(struct net_device *dev)
-+static int skfp_init_one(struct pci_dev *pdev,
-+ const struct pci_device_id *ent)
- {
-- int i; /* used in for loops */
-- struct pci_dev *pdev = NULL; /* PCI device structure */
--#ifndef MEM_MAPPED_IO
-- u16 port; /* temporary I/O (port) address */
-- int port_len; /* length of port address range (in bytes) */
--#else
-- unsigned long port;
--#endif
-- u16 command; /* PCI Configuration space Command register val */
-+ struct net_device *dev;
- struct s_smc *smc; /* board pointer */
-- struct net_device *tmp = dev;
-- u8 first_dev_used = 0;
-- u16 SubSysId;
-+ u32 port, len;
-+ int err;
-
-- PRINTK(KERN_INFO "entering skfp_probe\n");
--
-- /*
-- * Verify whether we're going through skfp_probe() again
-- *
-- * If so, see if we're going through for a subsequent fddi device that
-- * we've already initialized. If we are, return success (0). If not,
-- * return failure (-ENODEV).
-- */
--
-- if (autoprobed) {
-- PRINTK(KERN_INFO "Already entered skfp_probe\n");
-- if (dev != NULL) {
-- if ((strncmp(dev->name, "fddi", 4) == 0) &&
-- (dev->base_addr != 0)) {
-- return (0);
-- }
-- return (-ENODEV);
-- }
-- }
-- autoprobed = 1; /* set global flag */
-+ PRINTK(KERN_INFO "entering skfp_init_one\n");
-
-- printk("%s\n", boot_msg);
-+ if (num_boards == 0)
-+ printk("%s\n", boot_msg);
-
-- /* Scan for Syskonnect FDDI PCI controllers */
-- for (i = 0; i < SKFP_MAX_NUM_BOARDS; i++) { // scan for PCI cards
-- PRINTK(KERN_INFO "Check device %d\n", i);
-- if ((pdev=pci_find_device(PCI_VENDOR_ID_SK, PCI_DEVICE_ID_SK_FP,
-- pdev)) == 0) {
-- break;
-- }
-- if (pci_enable_device(pdev))
-- continue;
-+ err = pci_enable_device(pdev);
-+ if (err)
-+ goto err_out1;
-
--#ifndef MEM_MAPPED_IO
-- /* Verify that I/O enable bit is set (PCI slot is enabled) */
-- pci_read_config_word(pdev, PCI_COMMAND, &command);
-- if ((command & PCI_COMMAND_IO) == 0) {
-- PRINTK("I/O enable bit not set!");
-- PRINTK(" Verify that slot is enabled\n");
-- continue;
-- }
-
-- /* Turn off memory mapped space and enable mastering */
-+#ifdef MEM_MAPPED_IO
-+ if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
-+ printk(KERN_ERR "skfp: region is not an MMIO resource\n");
-+ err = -EIO;
-+ goto err_out1;
-+ }
-+ port = pci_resource_start(pdev, 0);
-+ len = pci_resource_len(pdev, 0);
-
-- PRINTK(KERN_INFO "Command Reg: %04x\n", command);
-- command |= PCI_COMMAND_MASTER;
-- command &= ~PCI_COMMAND_MEMORY;
-- pci_write_config_word(pdev, PCI_COMMAND, command);
--
-- /* Read I/O base address from PCI Configuration Space */
--
-- pci_read_config_word(pdev, PCI_BASE_ADDRESS_1, &port);
-- port &= PCI_BASE_ADDRESS_IO_MASK; // clear I/O bit (bit 0)
--
-- /* Verify port address range is not already being used */
--
-- port_len = FP_IO_LEN;
-- if (check_region(port, port_len) != 0) {
-- printk("I/O range allocated to adapter");
-- printk(" (0x%X-0x%X) is already being used!\n", port,
-- (port + port_len - 1));
-- continue;
-- }
-+ if (len < 0x4000) {
-+ printk(KERN_ERR "skfp: Invalid PCI region size: %d\n", len);
-+ err = -EIO;
-+ goto err_out1;
-+ }
- #else
-- /* Verify that MEM enable bit is set (PCI slot is enabled) */
-- pci_read_config_word(pdev, PCI_COMMAND, &command);
-- if ((command & PCI_COMMAND_MEMORY) == 0) {
-- PRINTK("MEMORY-I/O enable bit not set!");
-- PRINTK(" Verify that slot is enabled\n");
-- continue;
-- }
--
-- /* Turn off IO mapped space and enable mastering */
--
-- PRINTK(KERN_INFO "Command Reg: %04x\n", command);
-- command |= PCI_COMMAND_MASTER;
-- command &= ~PCI_COMMAND_IO;
-- pci_write_config_word(pdev, PCI_COMMAND, command);
--
-- port = pci_resource_start(pdev, 0);
--
-- port = (unsigned long)ioremap(port, 0x4000);
-- if (!port){
-- printk("skfp: Unable to map MEMORY register, "
-- "FDDI adapter will be disabled.\n");
-- break;
-- }
--#endif
--
-- if ((!loading_module) || first_dev_used) {
-- /* Allocate a device structure for this adapter */
-- tmp = alloc_device(dev, port);
-- }
-- first_dev_used = 1; // only significant first time
--
-- pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &SubSysId);
--
-- if (tmp != NULL) {
-- if (loading_module)
-- link_modules(dev, tmp);
-- dev = tmp;
-- init_dev(dev, port);
-- dev->irq = pdev->irq;
--
-- /* Initialize board structure with bus-specific info */
--
-- smc = (struct s_smc *) dev->priv;
-- smc->os.dev = dev;
-- smc->os.bus_type = SK_BUS_TYPE_PCI;
-- smc->os.pdev = *pdev;
-- smc->os.QueueSkb = MAX_TX_QUEUE_LEN;
-- smc->os.MaxFrameSize = MAX_FRAME_SIZE;
-- smc->os.dev = dev;
-- smc->hw.slot = -1;
-- smc->os.ResetRequested = FALSE;
-- skb_queue_head_init(&smc->os.SendSkbQueue);
--
-- if (skfp_driver_init(dev) == 0) {
-- // only increment global board
-- // count on success
-- num_boards++;
-- request_region(dev->base_addr,
-- FP_IO_LEN, dev->name);
-- if ((SubSysId & 0xff00) == 0x5500 ||
-- (SubSysId & 0xff00) == 0x5800) {
-- printk("%s: SysKonnect FDDI PCI adapter"
-- " found (SK-%04X)\n", dev->name,
-- SubSysId);
-- } else {
-- printk("%s: FDDI PCI adapter found\n",
-- dev->name);
-- }
-- } else {
-- kfree(dev);
-- i = SKFP_MAX_NUM_BOARDS; // stop search
--
-- }
--
-- } // if (dev != NULL)
--
-- } // for SKFP_MAX_NUM_BOARDS
--
-- /*
-- * If we're at this point we're going through skfp_probe() for the
-- * first time. Return success (0) if we've initialized 1 or more
-- * boards. Otherwise, return failure (-ENODEV).
-- */
--
-- if (num_boards > 0)
-- return (0);
-- else {
-- printk("no SysKonnect FDDI adapter found\n");
-- return (-ENODEV);
-+ if (!(pci_resource_flags(pdev, 1) & IO_RESOURCE_IO)) {
-+ printk(KERN_ERR "skfp: region is not PIO resource\n");
-+ err = -EIO;
-+ goto err_out1;
- }
--} // skfp_probe
--
--
--/************************
-- *
-- * Search the entire 'fddi' device list for a fixed probe. If a match isn't
-- * found then check for an autoprobe or unused device location. If they
-- * are not available then insert a new device structure at the end of
-- * the current list.
-- *
-- ************************/
--static struct net_device *alloc_device(struct net_device *dev, u_long iobase)
--{
-- struct net_device *adev = NULL;
-- int fixed = 0, new_dev = 0;
--
-- PRINTK(KERN_INFO "entering alloc_device\n");
-- if (!dev)
-- return dev;
-
-- num_fddi = fddi_dev_index(dev->name);
-- if (loading_module) {
-- num_fddi++;
-- dev = insert_device(dev, skfp_probe);
-- return dev;
-+ port = pci_resource_start(pdev, 1);
-+ len = pci_resource_len(pdev, 1);
-+ if (len < FP_IO_LEN) {
-+ printk(KERN_ERR "skfp: Invalid PCI region size: %d\n",
-+ io_len);
-+ err = -EIO;
-+ goto err_out1;
- }
-- while (1) {
-- if (((dev->base_addr == NO_ADDRESS) ||
-- (dev->base_addr == 0)) && !adev) {
-- adev = dev;
-- } else if ((dev->priv == NULL) && (dev->base_addr == iobase)) {
-- fixed = 1;
-- } else {
-- if (dev->next == NULL) {
-- new_dev = 1;
-- } else if (strncmp(dev->next->name, "fddi", 4) != 0) {
-- new_dev = 1;
-- }
-- }
-- if ((dev->next == NULL) || new_dev || fixed)
-- break;
-- dev = dev->next;
-- num_fddi++;
-- } // while (1)
--
-- if (adev && !fixed) {
-- dev = adev;
-- num_fddi = fddi_dev_index(dev->name);
-- new_dev = 0;
-- }
-- if (((dev->next == NULL) && ((dev->base_addr != NO_ADDRESS) &&
-- (dev->base_addr != 0)) && !fixed) ||
-- new_dev) {
-- num_fddi++; /* New device */
-- dev = insert_device(dev, skfp_probe);
-- }
-- if (dev) {
-- if (!dev->priv) {
-- /* Allocate space for private board structure */
-- dev->priv = (void *) kmalloc(sizeof(struct s_smc),
-- GFP_KERNEL);
-- if (dev->priv == NULL) {
-- printk("%s: Could not allocate memory for",
-- dev->name);
-- printk(" private board structure!\n");
-- return (NULL);
-- }
-- /* clear structure */
-- memset(dev->priv, 0, sizeof(struct s_smc));
-- }
-+#endif
-+ err = pci_request_regions(pdev, "skfddi");
-+ if (err)
-+ goto err_out1;
-+
-+ pci_set_master(pdev);
-+
-+ dev = alloc_fddidev(sizeof(struct s_smc));
-+ if (!dev) {
-+ printk(KERN_ERR "skfp: Unable to allocate fddi device, "
-+ "FDDI adapter will be disabled.\n");
-+ err = -ENOMEM;
-+ goto err_out2;
-+ }
-+
-+#ifdef MEM_MAPPED_IO
-+ dev->base_addr = (unsigned long) ioremap(port, len);
-+ if (!dev->base_addr) {
-+ printk(KERN_ERR "skfp: Unable to map MEMORY register, "
-+ "FDDI adapter will be disabled.\n");
-+ err = -EIO;
-+ goto err_out3;
- }
-- return dev;
--} // alloc_device
--
--
--
--/************************
-- *
-- * Initialize device structure
-- *
-- ************************/
--static void init_dev(struct net_device *dev, u_long iobase)
--{
-- /* Initialize new device structure */
--
-- dev->mem_end = 0; /* shared memory isn't used */
-- dev->mem_start = 0; /* shared memory isn't used */
-- dev->base_addr = iobase; /* save port (I/O) base address */
-- dev->if_port = 0; /* not applicable to FDDI adapters */
-- dev->dma = 0; /* Bus Master DMA doesn't require channel */
-- dev->irq = 0;
--
-- netif_start_queue(dev);
-+#else
-+ dev->base_addr = port;
-+#endif
-
-+ dev->irq = pdev->irq;
- dev->get_stats = &skfp_ctl_get_stats;
- dev->open = &skfp_open;
- dev->stop = &skfp_close;
- dev->hard_start_xmit = &skfp_send_pkt;
-- dev->hard_header = NULL; /* set in fddi_setup() */
-- dev->rebuild_header = NULL; /* set in fddi_setup() */
- dev->set_multicast_list = &skfp_ctl_set_multicast_list;
- dev->set_mac_address = &skfp_ctl_set_mac_address;
- dev->do_ioctl = &skfp_ioctl;
-- dev->set_config = NULL; /* not supported for now &&& */
- dev->header_cache_update = NULL; /* not supported */
-- dev->change_mtu = NULL; /* set in fddi_setup() */
-
- SET_MODULE_OWNER(dev);
-+ SET_NETDEV_DEV(dev, &pdev->dev);
-
-- /* Initialize remaining device structure information */
-- fddi_setup(dev);
--} // init_device
--
--
--/************************
-- *
-- * If at end of fddi device list and can't use current entry, malloc
-- * one up. If memory could not be allocated, print an error message.
-- *
--************************/
--static struct net_device *insert_device(struct net_device *dev,
-- int (*init) (struct net_device *))
--{
-- struct net_device *new;
-- int len;
--
-- PRINTK(KERN_INFO "entering insert_device\n");
-- len = sizeof(struct net_device) + sizeof(struct s_smc);
-- new = (struct net_device *) kmalloc(len, GFP_KERNEL);
-- if (new == NULL) {
-- printk("fddi%d: Device not initialised, insufficient memory\n",
-- num_fddi);
-- return NULL;
-- } else {
-- memset((char *) new, 0, len);
-- new->priv = (struct s_smc *) (new + 1);
-- new->init = init; /* initialisation routine */
-- if (!loading_module) {
-- new->next = dev->next;
-- dev->next = new;
-- }
-- /* create new device name */
-- if (num_fddi > 999) {
-- sprintf(new->name, "fddi????");
-- } else {
-- sprintf(new->name, "fddi%d", num_fddi);
-- }
-- }
-- return new;
--} // insert_device
--
--
--/************************
-- *
-- * Get the number of a "fddiX" string
-- *
-- ************************/
--static int fddi_dev_index(unsigned char *s)
--{
-- int i = 0, j = 0;
--
-- for (; *s; s++) {
-- if (isdigit(*s)) {
-- j = 1;
-- i = (i * 10) + (*s - '0');
-- } else if (j)
-- break;
-- }
-- return i;
--} // fddi_dev_index
-+ /* Initialize board structure with bus-specific info */
-+ smc = (struct s_smc *) dev->priv;
-+ smc->os.dev = dev;
-+ smc->os.bus_type = SK_BUS_TYPE_PCI;
-+ smc->os.pdev = *pdev;
-+ smc->os.QueueSkb = MAX_TX_QUEUE_LEN;
-+ smc->os.MaxFrameSize = MAX_FRAME_SIZE;
-+ smc->os.dev = dev;
-+ smc->hw.slot = -1;
-+ smc->os.ResetRequested = FALSE;
-+ skb_queue_head_init(&smc->os.SendSkbQueue);
-+
-+ err = skfp_driver_init(dev);
-+ if (err)
-+ goto err_out4;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto err_out5;
-+
-+ ++num_boards;
-+ pci_set_drvdata(pdev, dev);
-+
-+ if ((pdev->subsystem_device & 0xff00) == 0x5500 ||
-+ (pdev->subsystem_device & 0xff00) == 0x5800)
-+ printk("%s: SysKonnect FDDI PCI adapter"
-+ " found (SK-%04X)\n", dev->name,
-+ pdev->subsystem_device);
-+ else
-+ printk("%s: FDDI PCI adapter found\n", dev->name);
-
-+ return 0;
-+err_out5:
-+ if (smc->os.SharedMemAddr)
-+ pci_free_consistent(pdev, smc->os.SharedMemSize,
-+ smc->os.SharedMemAddr,
-+ smc->os.SharedMemDMA);
-+ pci_free_consistent(pdev, MAX_FRAME_SIZE,
-+ smc->os.LocalRxBuffer, smc->os.LocalRxBufferDMA);
-+err_out4:
-+#ifdef MEM_MAPPED_IO
-+ iounmap((void *) dev->base_addr);
-+#endif
-+err_out3:
-+ free_netdev(dev);
-+err_out2:
-+ pci_release_regions(pdev);
-+err_out1:
-+ return err;
-+}
-
--/************************
-- *
-- * Used if loaded as module only. Link the device structures
-- * together. Needed to release them all at unload.
-- *
--************************/
--static void link_modules(struct net_device *dev, struct net_device *tmp)
-+/*
-+ * Called for each adapter board from pci_unregister_driver
-+ */
-+static void __devexit skfp_remove_one(struct pci_dev *pdev)
- {
-- struct net_device *p = dev;
-+ struct net_device *p = pci_get_drvdata(pdev);
-+ struct s_smc *lp = p->priv;
-
-- if (p) {
-- while (((struct s_smc *) (p->priv))->os.next_module) {
-- p = ((struct s_smc *) (p->priv))->os.next_module;
-- }
-+ unregister_netdev(p);
-
-- if (dev != tmp) {
-- ((struct s_smc *) (p->priv))->os.next_module = tmp;
-- } else {
-- ((struct s_smc *) (p->priv))->os.next_module = NULL;
-- }
-+ if (lp->os.SharedMemAddr) {
-+ pci_free_consistent(&lp->os.pdev,
-+ lp->os.SharedMemSize,
-+ lp->os.SharedMemAddr,
-+ lp->os.SharedMemDMA);
-+ lp->os.SharedMemAddr = NULL;
-+ }
-+ if (lp->os.LocalRxBuffer) {
-+ pci_free_consistent(&lp->os.pdev,
-+ MAX_FRAME_SIZE,
-+ lp->os.LocalRxBuffer,
-+ lp->os.LocalRxBufferDMA);
-+ lp->os.LocalRxBuffer = NULL;
- }
-- return;
--} // link_modules
--
-+#ifdef MEM_MAPPED_IO
-+ iounmap((void *) p->base_addr);
-+#endif
-+ pci_release_regions(pdev);
-+ free_netdev(p);
-
-+ pci_set_drvdata(pdev, NULL);
-+}
-
- /*
- * ====================
-@@ -653,11 +408,11 @@ static void link_modules(struct net_devi
- * 0 - initialization succeeded
- * -1 - initialization failed
- */
--static int skfp_driver_init(struct net_device *dev)
-+static int skfp_driver_init(struct net_device *dev)
- {
- struct s_smc *smc = (struct s_smc *) dev->priv;
- skfddi_priv *bp = PRIV(dev);
-- u8 val; /* used for I/O read/writes */
-+ int err = -EIO;
-
- PRINTK(KERN_INFO "entering skfp_driver_init\n");
-
-@@ -666,9 +421,7 @@ static int skfp_driver_init(struct net_d
- smc->hw.iop = dev->base_addr;
-
- // Get the interrupt level from the PCI Configuration Table
-- val = dev->irq;
--
-- smc->hw.irq = val;
-+ smc->hw.irq = dev->irq;
-
- spin_lock_init(&bp->DriverLock);
-
-@@ -738,7 +491,7 @@ fail:
- bp->LocalRxBuffer, bp->LocalRxBufferDMA);
- bp->LocalRxBuffer = NULL;
- }
-- return (-1);
-+ return err;
- } // skfp_driver_init
-
-
-@@ -766,14 +519,15 @@ fail:
- static int skfp_open(struct net_device *dev)
- {
- struct s_smc *smc = (struct s_smc *) dev->priv;
-+ int err;
-
- PRINTK(KERN_INFO "entering skfp_open\n");
- /* Register IRQ - support shared interrupts by passing device ptr */
-- if (request_irq(dev->irq, (void *) skfp_interrupt, SA_SHIRQ,
-- dev->name, dev)) {
-- printk("%s: Requested IRQ %d is busy\n", dev->name, dev->irq);
-- return (-EAGAIN);
-- }
-+ err = request_irq(dev->irq, (void *) skfp_interrupt, SA_SHIRQ,
-+ dev->name, dev);
-+ if (err)
-+ return err;
-+
- /*
- * Set current address to factory MAC address
- *
-@@ -797,6 +551,7 @@ static int skfp_open(struct net_device *
- /* Disable promiscuous filter settings */
- mac_drv_rx_mode(smc, RX_DISABLE_PROMISC);
-
-+ netif_start_queue(dev);
- return (0);
- } // skfp_open
-
-@@ -831,7 +586,6 @@ static int skfp_open(struct net_device *
- static int skfp_close(struct net_device *dev)
- {
- struct s_smc *smc = (struct s_smc *) dev->priv;
-- struct sk_buff *skb;
- skfddi_priv *bp = PRIV(dev);
-
- CLI_FBI();
-@@ -844,13 +598,8 @@ static int skfp_close(struct net_device
- /* Deregister (free) IRQ */
- free_irq(dev->irq, dev);
-
-- for (;;) {
-- skb = skb_dequeue(&bp->SendSkbQueue);
-- if (skb == NULL)
-- break;
-- bp->QueueSkb++;
-- dev_kfree_skb(skb);
-- }
-+ skb_queue_purge(&bp->SendSkbQueue);
-+ bp->QueueSkb = MAX_TX_QUEUE_LEN;
-
- return (0);
- } // skfp_close
-@@ -1285,6 +1034,8 @@ static int skfp_ioctl(struct net_device
- break;
- default:
- printk("ioctl for %s: unknow cmd: %04x\n", dev->name, ioc.cmd);
-+ status = -EOPNOTSUPP;
-+
- } // switch
-
- return status;
-@@ -2538,63 +2289,21 @@ void drv_reset_indication(struct s_smc *
-
- } // drv_reset_indication
-
--
--static struct net_device *mdev;
-+static struct pci_driver skfddi_pci_driver = {
-+ .name = "skfddi",
-+ .id_table = skfddi_pci_tbl,
-+ .probe = skfp_init_one,
-+ .remove = __devexit_p(skfp_remove_one),
-+};
-
- static int __init skfd_init(void)
- {
-- struct net_device *p;
--
-- if ((mdev = insert_device(NULL, skfp_probe)) == NULL)
-- return -ENOMEM;
--
-- for (p = mdev; p != NULL; p = ((struct s_smc *)p->priv)->os.next_module) {
-- if (register_netdev(p) != 0) {
-- printk("skfddi init_module failed\n");
-- return -EIO;
-- }
-- }
--
-- return 0;
-+ return pci_module_init(&skfddi_pci_driver);
- }
-
--static struct net_device *unlink_modules(struct net_device *p)
--{
-- struct net_device *next = NULL;
--
-- if (p->priv) { /* Private areas allocated? */
-- struct s_smc *lp = (struct s_smc *) p->priv;
--
-- next = lp->os.next_module;
--
-- if (lp->os.SharedMemAddr) {
-- pci_free_consistent(&lp->os.pdev,
-- lp->os.SharedMemSize,
-- lp->os.SharedMemAddr,
-- lp->os.SharedMemDMA);
-- lp->os.SharedMemAddr = NULL;
-- }
-- if (lp->os.LocalRxBuffer) {
-- pci_free_consistent(&lp->os.pdev,
-- MAX_FRAME_SIZE,
-- lp->os.LocalRxBuffer,
-- lp->os.LocalRxBufferDMA);
-- lp->os.LocalRxBuffer = NULL;
-- }
-- release_region(p->base_addr,
-- (lp->os.bus_type == SK_BUS_TYPE_PCI ? FP_IO_LEN : 0));
-- }
-- unregister_netdev(p);
-- printk("%s: unloaded\n", p->name);
-- free_netdev(p); /* Free the device structure */
--
-- return next;
--} // unlink_modules
--
- static void __exit skfd_exit(void)
- {
-- while (mdev)
-- mdev = unlink_modules(mdev);
-+ pci_unregister_driver(&skfddi_pci_driver);
- }
-
- module_init(skfd_init);
---- linux-2.6.0/drivers/net/sk_g16.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/sk_g16.c 2003-12-28 23:21:01.000000000 -0800
-@@ -457,8 +457,6 @@ struct priv
- /* static variables */
-
- static SK_RAM *board; /* pointer to our memory mapped board components */
--static struct net_device *SK_dev;
--unsigned long SK_ioaddr;
- static spinlock_t SK_lock = SPIN_LOCK_UNLOCKED;
-
- /* Macros */
-@@ -472,7 +470,6 @@ static spinlock_t SK_lock = SPIN_LOCK_UN
- * See for short explanation of each function its definitions header.
- */
-
--int SK_init(struct net_device *dev);
- static int SK_probe(struct net_device *dev, short ioaddr);
-
- static void SK_timeout(struct net_device *dev);
-@@ -530,84 +527,71 @@ void SK_print_ram(struct net_device *dev
- * YY/MM/DD uid Description
- -*/
-
-+static int io; /* 0 == probe */
-+
- /*
- * Check for a network adaptor of this type, and return '0' if one exists.
- * If dev->base_addr == 0, probe all likely locations.
- * If dev->base_addr == 1, always return failure.
- */
-
--int __init SK_init(struct net_device *dev)
-+struct net_device * __init SK_init(int unit)
- {
-- int ioaddr; /* I/O port address used for POS regs */
- int *port, ports[] = SK_IO_PORTS; /* SK_G16 supported ports */
- static unsigned version_printed;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct priv));
-+ int err = -ENODEV;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-- /* get preconfigured base_addr from dev which is done in Space.c */
-- int base_addr = dev->base_addr;
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ }
-
- if (version_printed++ == 0)
- PRINTK(("%s: %s", SK_NAME, rcsid));
-
-- if (base_addr > 0x0ff) /* Check a single specified address */
-- {
-- int rc = -ENODEV;
--
-- ioaddr = base_addr;
--
-- /* Check if on specified address is a SK_G16 */
-- if (!request_region(ioaddr, ETHERCARD_TOTAL_SIZE, "sk_g16"))
-- return -EBUSY;
--
-- if ( (inb(SK_POS0) == SK_IDLOW) ||
-- (inb(SK_POS1) == SK_IDHIGH) )
-- {
-- rc = SK_probe(dev, ioaddr);
-- }
-+ if (io > 0xff) { /* Check a single specified address */
-+ err = -EBUSY;
-+ /* Check if on specified address is a SK_G16 */
-+ if (request_region(io, ETHERCARD_TOTAL_SIZE, "sk_g16")) {
-+ err = SK_probe(dev, io);
-+ if (!err)
-+ goto got_it;
-+ release_region(io, ETHERCARD_TOTAL_SIZE);
-+ }
-+ } else if (io > 0) { /* Don't probe at all */
-+ err = -ENXIO;
-+ } else {
-+ /* Autoprobe base_addr */
-+ for (port = &ports[0]; *port; port++) {
-+ io = *port;
-+
-+ /* Check if I/O Port region is used by another board */
-+ if (!request_region(io, ETHERCARD_TOTAL_SIZE, "sk_g16"))
-+ continue; /* Try next Port address */
-+
-+ /* Check if at ioaddr is a SK_G16 */
-+ if (SK_probe(dev, io) == 0)
-+ goto got_it;
-
-- if (rc)
-- release_region(ioaddr, ETHERCARD_TOTAL_SIZE);
-- return rc;
-+ release_region(io, ETHERCARD_TOTAL_SIZE);
-+ }
- }
-- else if (base_addr > 0) /* Don't probe at all */
-- {
-- return -ENXIO;
-+err_out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+
-+got_it:
-+ err = register_netdev(dev);
-+ if (err) {
-+ release_region(dev->base_addr, ETHERCARD_TOTAL_SIZE);
-+ goto err_out;
- }
--
-- /* Autoprobe base_addr */
--
-- for (port = &ports[0]; *port; port++)
-- {
-- ioaddr = *port; /* we need ioaddr for accessing POS regs */
--
-- /* Check if I/O Port region is used by another board */
--
-- if (!request_region(ioaddr, ETHERCARD_TOTAL_SIZE, "sk_g16"))
-- {
-- continue; /* Try next Port address */
-- }
--
-- /* Check if at ioaddr is a SK_G16 */
--
-- if ( !(inb(SK_POS0) == SK_IDLOW) ||
-- !(inb(SK_POS1) == SK_IDHIGH) )
-- {
-- release_region(ioaddr, ETHERCARD_TOTAL_SIZE);
-- continue; /* Try next Port address */
-- }
--
-- dev->base_addr = ioaddr; /* Set I/O Port Address */
--
-- if (SK_probe(dev, ioaddr) == 0)
-- {
-- return 0; /* Card found and initialized */
-- }
--
-- release_region(ioaddr, ETHERCARD_TOTAL_SIZE);
-- }
--
-- dev->base_addr = base_addr; /* Write back original base_addr */
--
-- return -ENODEV; /* Failed to find or init driver */
-+ return dev;
-
- } /* End of SK_init */
-
-@@ -620,54 +604,25 @@ MODULE_PARM_DESC(io, "0 to probe common
-
-
- #ifdef MODULE
--static int io; /* 0 == probe */
-+
-+static struct net_device *SK_dev;
-
- static int __init SK_init_module (void)
- {
-- int rc;
--
-- SK_dev = init_etherdev (NULL, 0);
-- if (!SK_dev)
-- return -ENOMEM;
--
-- SK_dev->base_addr = io;
--
-- rc = SK_init (SK_dev);
-- if (rc) {
-- unregister_netdev (SK_dev);
-- kfree (SK_dev);
-- SK_dev = NULL;
-- }
--
-- return rc;
-+ SK_dev = SK_init(-1);
-+ return IS_ERR(SK_dev) ? PTR_ERR(SK_dev) : 0;
- }
--#endif /* MODULE */
--
-
- static void __exit SK_cleanup_module (void)
- {
-- if (SK_dev) {
-- if (SK_dev->priv) {
-- kfree(SK_dev->priv);
-- SK_dev->priv = NULL;
-- }
-- unregister_netdev(SK_dev);
-- free_netdev(SK_dev);
-- SK_dev = NULL;
-- }
-- if (SK_ioaddr) {
-- release_region(SK_ioaddr, ETHERCARD_TOTAL_SIZE);
-- SK_ioaddr = 0;
-- }
--
-+ unregister_netdev(SK_dev);
-+ release_region(SK_dev->base_addr, ETHERCARD_TOTAL_SIZE);
-+ free_netdev(SK_dev);
- }
-
--
--#ifdef MODULE
- module_init(SK_init_module);
--#endif
- module_exit(SK_cleanup_module);
--
-+#endif
-
- \f
- /*-
-@@ -695,7 +650,11 @@ int __init SK_probe(struct net_device *d
- int sk_addr_flag = 0; /* SK ADDR correct? 1 - no, 0 - yes */
- unsigned int rom_addr; /* used to store RAM address used for POS_ADDR */
-
-- struct priv *p; /* SK_G16 private structure */
-+ struct priv *p = dev->priv; /* SK_G16 private structure */
-+
-+ if (inb(SK_POS0) != SK_IDLOW || inb(SK_POS1) != SK_IDHIGH)
-+ return -ENODEV;
-+ dev->base_addr = ioaddr;
-
- if (SK_ADDR & 0x3fff || SK_ADDR < 0xa0000)
- {
-@@ -837,12 +796,6 @@ int __init SK_probe(struct net_device *d
- dev->dev_addr[4],
- dev->dev_addr[5]);
-
-- /* Allocate memory for private structure */
-- p = dev->priv = (void *) kmalloc(sizeof(struct priv), GFP_KERNEL);
-- if (p == NULL) {
-- printk("%s: ERROR - no memory for driver data!\n", dev->name);
-- return -ENOMEM;
-- }
- memset((char *) dev->priv, 0, sizeof(struct priv)); /* clear memory */
-
- /* Assign our Device Driver functions */
-@@ -856,10 +809,6 @@ int __init SK_probe(struct net_device *d
- dev->watchdog_timeo = HZ/7;
-
-
-- /* Set the generic fields of the device structure */
--
-- ether_setup(dev);
--
- dev->flags &= ~IFF_MULTICAST;
-
- /* Initialize private structure */
-@@ -884,12 +833,7 @@ int __init SK_probe(struct net_device *d
- SK_print_pos(dev, "End of SK_probe");
- SK_print_ram(dev);
- #endif
--
-- SK_dev = dev;
-- SK_ioaddr = ioaddr;
--
- return 0; /* Initialization done */
--
- } /* End of SK_probe() */
-
- \f
-@@ -1280,7 +1224,7 @@ static int SK_send_packet(struct sk_buff
-
- memcpy_toio((tmdp->u.buffer & 0x00ffffff), skb->data, skb->len);
- if (len != skb->len)
-- memcpy_toio((tmdp->u.buffer & 0x00ffffff) + sb->len, pad, len-skb->len);
-+ memcpy_toio((tmdp->u.buffer & 0x00ffffff) + skb->len, pad, len-skb->len);
-
- writew(-len, &tmdp->blen); /* set length to transmit */
-
---- linux-2.6.0/drivers/net/sk_mca.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/sk_mca.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1022,18 +1022,39 @@ static void skmca_set_multicast_list(str
-
- static int startslot; /* counts through slots when probing multiple devices */
-
--int __init skmca_probe(struct net_device *dev)
-+static void cleanup_card(struct net_device *dev)
- {
-+ skmca_priv *priv = dev->priv;
-+ DeinitBoard(dev);
-+ if (dev->irq != 0)
-+ free_irq(dev->irq, dev);
-+ mca_mark_as_unused(priv->slot);
-+ mca_set_adapter_procfn(priv->slot, NULL, NULL);
-+}
-+
-+struct net_device * __init skmca_probe(int unit)
-+{
-+ struct net_device *dev;
- int force_detect = 0;
- int junior, slot, i;
- int base = 0, irq = 0;
- skmca_priv *priv;
- skmca_medium medium;
-+ int err;
-
- /* can't work without an MCA bus ;-) */
-
- if (MCA_bus == 0)
-- return -ENODEV;
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_etherdev(sizeof(skmca_priv));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-
- SET_MODULE_OWNER(dev);
-
-@@ -1044,37 +1065,24 @@ int __init skmca_probe(struct net_device
-
- /* search through slots */
-
-- if (dev != NULL) {
-- base = dev->mem_start;
-- irq = dev->irq;
-- }
-- slot = dofind(&junior, startslot);
--
-- while (slot != -1) {
-+ base = dev->mem_start;
-+ irq = dev->base_addr;
-+ for (slot = startslot; (slot = dofind(&junior, slot)) != -1; slot++) {
- /* deduce card addresses */
-
- getaddrs(slot, junior, &base, &irq, &medium);
-
- /* slot already in use ? */
-
-- if (mca_is_adapter_used(slot)) {
-- slot = dofind(&junior, slot + 1);
-+ if (mca_is_adapter_used(slot))
- continue;
-- }
-
- /* were we looking for something different ? */
-
-- if ((dev->irq != 0) || (dev->mem_start != 0)) {
-- if ((dev->irq != 0) && (dev->irq != irq)) {
-- slot = dofind(&junior, slot + 1);
-- continue;
-- }
-- if ((dev->mem_start != 0)
-- && (dev->mem_start != base)) {
-- slot = dofind(&junior, slot + 1);
-- continue;
-- }
-- }
-+ if (dev->irq && dev->irq != irq)
-+ continue;
-+ if (dev->mem_start && dev->mem_start != base)
-+ continue;
-
- /* found something that matches */
-
-@@ -1083,8 +1091,10 @@ int __init skmca_probe(struct net_device
-
- /* nothing found ? */
-
-- if (slot == -1)
-- return ((base != 0) || (irq != 0)) ? ENXIO : ENODEV;
-+ if (slot == -1) {
-+ free_netdev(dev);
-+ return (base || irq) ? ERR_PTR(-ENXIO) : ERR_PTR(-ENODEV);
-+ }
-
- /* make procfs entries */
-
-@@ -1102,17 +1112,14 @@ int __init skmca_probe(struct net_device
- junior ? "Junior MC2" : "MC2+", slot + 1);
-
- /* allocate structure */
-- priv = dev->priv =
-- (skmca_priv *) kmalloc(sizeof(skmca_priv), GFP_KERNEL);
-- if (!priv)
-- return -ENOMEM;
-+ priv = dev->priv;
- priv->slot = slot;
- priv->macbase = base + 0x3fc0;
- priv->ioregaddr = base + 0x3ff0;
- priv->ctrladdr = base + 0x3ff2;
- priv->cmdaddr = base + 0x3ff3;
- priv->medium = medium;
-- memset(&(priv->stat), 0, sizeof(struct net_device_stats));
-+ memset(&priv->stat, 0, sizeof(struct net_device_stats));
- spin_lock_init(&priv->lock);
-
- /* set base + irq for this device (irq not allocated so far) */
-@@ -1146,9 +1153,6 @@ int __init skmca_probe(struct net_device
- dev->set_multicast_list = skmca_set_multicast_list;
- dev->flags |= IFF_MULTICAST;
-
-- /* generic setup */
-- ether_setup(dev);
--
- /* copy out MAC address */
- for (i = 0; i < 6; i++)
- dev->dev_addr[i] = SKMCA_READB(priv->macbase + (i << 1));
-@@ -1167,7 +1171,13 @@ int __init skmca_probe(struct net_device
-
- startslot = slot + 1;
-
-- return 0;
-+ err = register_netdev(dev);
-+ if (err) {
-+ cleanup_card(dev);
-+ free_netdev(dev);
-+ dev = ERR_PTR(err);
-+ }
-+ return dev;
- }
-
- /* ------------------------------------------------------------------------
-@@ -1179,51 +1189,34 @@ MODULE_LICENSE("GPL");
-
- #define DEVMAX 5
-
--static struct net_device moddevs[DEVMAX] = {
-- { .name = " ", .init = skmca_probe },
-- { .name = " ", .init = skmca_probe },
-- { .name = " ", .init = skmca_probe },
-- { .name = " ", .init = skmca_probe },
-- { .name = " ", .init = skmca_probe }
--};
--
--int irq;
--int io;
-+static struct net_device *moddevs[DEVMAX];
-
- int init_module(void)
- {
-- int z, res;
-+ int z;
-
- startslot = 0;
- for (z = 0; z < DEVMAX; z++) {
-- strcpy(moddevs[z].name, " ");
-- res = register_netdev(moddevs + z);
-- if (res != 0)
-- return (z > 0) ? 0 : -EIO;
-+ struct net_device *dev = skmca_probe(-1);
-+ if (IS_ERR(dev))
-+ break;
-+ moddevs[z] = dev;
- }
--
-+ if (!z)
-+ return -EIO;
- return 0;
- }
-
- void cleanup_module(void)
- {
-- struct net_device *dev;
-- skmca_priv *priv;
- int z;
-
- for (z = 0; z < DEVMAX; z++) {
-- dev = moddevs + z;
-- if (dev->priv != NULL) {
-- priv = (skmca_priv *) dev->priv;
-- DeinitBoard(dev);
-- if (dev->irq != 0)
-- free_irq(dev->irq, dev);
-- dev->irq = 0;
-+ struct net_device *dev = moddevs[z];
-+ if (dev) {
- unregister_netdev(dev);
-- mca_mark_as_unused(priv->slot);
-- mca_set_adapter_procfn(priv->slot, NULL, NULL);
-- kfree(dev->priv);
-- dev->priv = NULL;
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/sk_mca.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/sk_mca.h 2003-12-28 23:21:01.000000000 -0800
-@@ -178,7 +178,4 @@ typedef struct { /* LANCE Rx descriptor
-
- #endif /* _SK_MCA_DRIVER_ */
-
--extern int skmca_probe(struct net_device *);
--
--
- #endif /* _SK_MCA_INCLUDE_ */
---- linux-2.6.0/drivers/net/smc9194.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/smc9194.c 2003-12-28 23:21:01.000000000 -0800
-@@ -191,7 +191,7 @@ struct smc_local {
- .
- . NB:This shouldn't be static since it is referred to externally.
- */
--int smc_init(struct net_device *dev);
-+struct net_device *smc_init(int unit);
-
- /*
- . The kernel calls this function when someone wants to use the device,
-@@ -672,7 +672,7 @@ static void smc_hardware_send_packet( st
-
- /*-------------------------------------------------------------------------
- |
-- | smc_init( struct net_device * dev )
-+ | smc_init(int unit)
- | Input parameters:
- | dev->base_addr == 0, try to find all possible locations
- | dev->base_addr == 1, return failure code
-@@ -680,31 +680,56 @@ static void smc_hardware_send_packet( st
- | dev->base_addr == <anything else> this is the address to check
- |
- | Output:
-- | 0 --> there is a device
-- | anything else, error
-+ | pointer to net_device or ERR_PTR(error)
- |
- ---------------------------------------------------------------------------
- */
--int __init smc_init(struct net_device *dev)
-+static int io;
-+static int irq;
-+static int ifport;
-+
-+struct net_device * __init smc_init(int unit)
- {
-- int i;
-- int base_addr = dev->base_addr;
-+ struct net_device *dev = alloc_etherdev(sizeof(struct smc_local));
-+ unsigned *port;
-+ int err = 0;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ io = dev->base_addr;
-+ irq = dev->irq;
-+ }
-
- SET_MODULE_OWNER(dev);
-
-- /* try a specific location */
-- if (base_addr > 0x1ff)
-- return smc_probe(dev, base_addr);
-- else if (base_addr != 0)
-- return -ENXIO;
--
-- /* check every ethernet address */
-- for (i = 0; smc_portlist[i]; i++)
-- if (smc_probe(dev, smc_portlist[i]) == 0)
-- return 0;
--
-- /* couldn't find anything */
-- return -ENODEV;
-+ if (io > 0x1ff) { /* Check a single specified location. */
-+ err = smc_probe(dev, io);
-+ } else if (io != 0) { /* Don't probe at all. */
-+ err = -ENXIO;
-+ } else {
-+ for (port = smc_portlist; *port; port++) {
-+ if (smc_probe(dev, *port) == 0)
-+ break;
-+ }
-+ if (!*port)
-+ err = -ENODEV;
-+ }
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, SMC_IO_EXTENT);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /*----------------------------------------------------------------------
-@@ -821,6 +846,9 @@ static int __init smc_probe(struct net_d
- if (!request_region(ioaddr, SMC_IO_EXTENT, dev->name))
- return -EBUSY;
-
-+ dev->irq = irq;
-+ dev->if_port = ifport;
-+
- /* First, see if the high byte is 0x33 */
- bank = inw( ioaddr + BANK_SELECT );
- if ( (bank & 0xFF00) != 0x3300 ) {
-@@ -969,28 +997,14 @@ static int __init smc_probe(struct net_d
- printk("%2.2x:", dev->dev_addr[i] );
- printk("%2.2x \n", dev->dev_addr[5] );
-
--
-- /* Initialize the private structure. */
-- if (dev->priv == NULL) {
-- dev->priv = kmalloc(sizeof(struct smc_local), GFP_KERNEL);
-- if (dev->priv == NULL) {
-- retval = -ENOMEM;
-- goto err_out;
-- }
-- }
- /* set the private data to zero by default */
- memset(dev->priv, 0, sizeof(struct smc_local));
-
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--
- /* Grab the IRQ */
- retval = request_irq(dev->irq, &smc_interrupt, 0, dev->name, dev);
- if (retval) {
- printk("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
- dev->irq, retval);
-- kfree(dev->priv);
-- dev->priv = NULL;
- goto err_out;
- }
-
-@@ -1524,10 +1538,7 @@ static void smc_set_multicast_list(struc
-
- #ifdef MODULE
-
--static struct net_device devSMC9194;
--static int io;
--static int irq;
--static int ifport;
-+static struct net_device *devSMC9194;
- MODULE_LICENSE("GPL");
-
- MODULE_PARM(io, "i");
-@@ -1539,32 +1550,23 @@ MODULE_PARM_DESC(ifport, "SMC 99194 inte
-
- int init_module(void)
- {
-- int result;
--
- if (io == 0)
- printk(KERN_WARNING
- CARDNAME": You shouldn't use auto-probing with insmod!\n" );
-
- /* copy the parameters from insmod into the device structure */
-- devSMC9194.base_addr = io;
-- devSMC9194.irq = irq;
-- devSMC9194.if_port = ifport;
-- devSMC9194.init = smc_init;
-- if ((result = register_netdev(&devSMC9194)) != 0)
-- return result;
--
-+ devSMC9194 = smc_init(-1);
-+ if (IS_ERR(devSMC9194))
-+ return PTR_ERR(devSMC9194);
- return 0;
- }
-
- void cleanup_module(void)
- {
-- unregister_netdev(&devSMC9194);
--
-- free_irq(devSMC9194.irq, &devSMC9194);
-- release_region(devSMC9194.base_addr, SMC_IO_EXTENT);
--
-- if (devSMC9194.priv)
-- kfree(devSMC9194.priv);
-+ unregister_netdev(devSMC9194);
-+ free_irq(devSMC9194->irq, devSMC9194);
-+ release_region(devSMC9194->base_addr, SMC_IO_EXTENT);
-+ free_netdev(devSMC9194);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/smc-mca.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/smc-mca.c 2003-12-28 23:21:01.000000000 -0800
-@@ -202,22 +202,18 @@ int __init ultramca_probe(struct device
- return -ENXIO;
-
- /* Adapter found. */
-- dev = alloc_etherdev(0);
-+ dev = alloc_ei_netdev();
- if(!dev)
- return -ENODEV;
-
- SET_MODULE_OWNER(dev);
- SET_NETDEV_DEV(dev, gen_dev);
--
-- rc = register_netdev(dev);
-- if (rc)
-- goto err_free_netdev;
--
-- printk(KERN_INFO "%s: %s found in slot %d\n",
-- dev->name, smc_mca_adapter_names[adapter], slot + 1);
--
- mca_device_set_name(mca_dev, smc_mca_adapter_names[adapter]);
- mca_device_set_claim(mca_dev, 1);
-+
-+ printk(KERN_INFO "smc_mca: %s found in slot %d\n",
-+ smc_mca_adapter_names[adapter], slot + 1);
-+
- ultra_found++;
-
- dev->base_addr = ioaddr = mca_device_transform_ioport(mca_dev, tbase);
-@@ -266,18 +262,18 @@ int __init ultramca_probe(struct device
- /* sanity check, shouldn't happen */
- if (dev->mem_start == 0) {
- rc = -ENODEV;
-- goto err_unregister_netdev;
-+ goto err_unclaim;
- }
-
- if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name)) {
- rc = -ENODEV;
-- goto err_unregister_netdev;
-+ goto err_unclaim;
- }
-
- reg4 = inb(ioaddr + 4) & 0x7f;
- outb(reg4, ioaddr + 4);
-
-- printk(KERN_INFO "%s: Parameters: %#3x,", dev->name, ioaddr);
-+ printk(KERN_INFO "smc_mca[%d]: Parameters: %#3x,", slot + 1, ioaddr);
-
- for (i = 0; i < 6; i++)
- printk(" %2.2X", dev->dev_addr[i] = inb(ioaddr + 8 + i));
-@@ -299,14 +295,6 @@ int __init ultramca_probe(struct device
-
- outb(reg4, ioaddr + 4);
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields.
-- */
--
-- rc = ethdev_init(dev);
-- if (rc) {
-- printk (", no memory for dev->priv.\n");
-- goto err_release_region;
-- }
- gen_dev->driver_data = dev;
-
- /* The 8390 isn't at the base address, so fake the offset
-@@ -339,13 +327,16 @@ int __init ultramca_probe(struct device
-
- NS8390_init(dev, 0);
-
-+ rc = register_netdev(dev);
-+ if (rc)
-+ goto err_release_region;
-+
- return 0;
-
- err_release_region:
- release_region(ioaddr, ULTRA_IO_EXTENT);
--err_unregister_netdev:
-- unregister_netdev(dev);
--err_free_netdev:
-+err_unclaim:
-+ mca_device_set_claim(mca_dev, 0);
- free_netdev(dev);
- return rc;
- }
-@@ -463,14 +454,14 @@ static int ultramca_remove(struct device
- struct mca_device *mca_dev = to_mca_device(gen_dev);
- struct net_device *dev = (struct net_device *)gen_dev->driver_data;
-
-- if(dev && dev->priv) {
-+ if (dev) {
- /* NB: ultra_close_card() does free_irq */
- int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
-
-+ unregister_netdev(dev);
- mca_device_set_claim(mca_dev, 0);
- release_region(ioaddr, ULTRA_IO_EXTENT);
-- unregister_netdev(dev);
-- kfree(dev->priv);
-+ free_netdev(dev);
- }
- return 0;
- }
---- linux-2.6.0/drivers/net/smc-ultra32.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/smc-ultra32.c 2003-12-28 23:21:01.000000000 -0800
-@@ -61,7 +61,6 @@ static const char *version = "smc-ultra3
-
- #include "8390.h"
-
--int ultra32_probe(struct net_device *dev);
- static int ultra32_probe1(struct net_device *dev, int ioaddr);
- static int ultra32_open(struct net_device *dev);
- static void ultra32_reset_8390(struct net_device *dev);
-@@ -98,26 +97,59 @@ static int ultra32_close(struct net_devi
- #define ULTRA32_CFG6 (-0x15) /* 0xc8b */
- #define ULTRA32_CFG7 0x0d /* 0xcad */
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET;
-+ /* NB: ultra32_close_card() does free_irq */
-+ release_region(ioaddr, ULTRA32_IO_EXTENT);
-+}
-
- /* Probe for the Ultra32. This looks like a 8013 with the station
- address PROM at I/O ports <base>+8 to <base>+13, with a checksum
- following.
- */
-
--int __init ultra32_probe(struct net_device *dev)
-+struct net_device * __init ultra32_probe(int unit)
- {
-- int ioaddr;
--
-- if (!EISA_bus) return -ENODEV;
-+ struct net_device *dev;
-+ int base;
-+ int irq;
-+ int err = -ENODEV;
-+
-+ if (!EISA_bus)
-+ return ERR_PTR(-ENODEV);
-+
-+ dev = alloc_ei_netdev();
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-
- SET_MODULE_OWNER(dev);
-
-- /* EISA spec allows for up to 16 slots, but 8 is typical. */
-- for (ioaddr = 0x1000 + ULTRA32_BASE; ioaddr < 0x9000; ioaddr += 0x1000)
-- if (ultra32_probe1(dev, ioaddr) == 0)
-- return 0;
-+ irq = dev->irq;
-
-- return -ENODEV;
-+ /* EISA spec allows for up to 16 slots, but 8 is typical. */
-+ for (base = 0x1000 + ULTRA32_BASE; base < 0x9000; base += 0x1000) {
-+ if (ultra32_probe1(dev, base) == 0)
-+ break;
-+ dev->irq = irq;
-+ }
-+ if (base >= 0x9000)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int __init ultra32_probe1(struct net_device *dev, int ioaddr)
-@@ -210,13 +242,6 @@ static int __init ultra32_probe1(struct
- dev->irq = irq;
- }
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (", no memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out;
-- }
--
- /* The 8390 isn't at the base address, so fake the offset */
- dev->base_addr = ioaddr + ULTRA32_NIC_OFFSET;
-
-@@ -380,7 +405,7 @@ static void ultra32_block_output(struct
- \f
- #ifdef MODULE
- #define MAX_ULTRA32_CARDS 4 /* Max number of Ultra cards per module */
--static struct net_device dev_ultra[MAX_ULTRA32_CARDS];
-+static struct net_device *dev_ultra[MAX_ULTRA32_CARDS];
-
- MODULE_DESCRIPTION("SMC Ultra32 EISA ethernet driver");
- MODULE_LICENSE("GPL");
-@@ -390,18 +415,15 @@ int init_module(void)
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_ULTRA32_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ultra[this_dev];
-- dev->init = ultra32_probe;
-- if (register_netdev(dev) != 0) {
-- if (found > 0) { /* Got at least one. */
-- return 0;
-- }
-- printk(KERN_WARNING "smc-ultra32.c: No SMC Ultra32 found.\n");
-- return -ENXIO;
-- }
-- found++;
-+ struct net_device *dev = ultra32_probe(-1);
-+ if (IS_ERR(dev))
-+ break;
-+ dev_ultra[found++] = dev;
- }
-- return 0;
-+ if (found)
-+ return 0;
-+ printk(KERN_WARNING "smc-ultra32.c: No SMC Ultra32 found.\n");
-+ return -ENXIO;
- }
-
- void cleanup_module(void)
-@@ -409,14 +431,11 @@ void cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_ULTRA32_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ultra[this_dev];
-- if (dev->priv != NULL) {
-- int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET;
-- void *priv = dev->priv;
-- /* NB: ultra32_close_card() does free_irq */
-- release_region(ioaddr, ULTRA32_IO_EXTENT);
-+ struct net_device *dev = dev_ultra[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/smc-ultra.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/smc-ultra.c 2003-12-28 23:21:01.000000000 -0800
-@@ -76,7 +76,6 @@ static const char version[] =
- static unsigned int ultra_portlist[] __initdata =
- {0x200, 0x220, 0x240, 0x280, 0x300, 0x340, 0x380, 0};
-
--int ultra_probe(struct net_device *dev);
- static int ultra_probe1(struct net_device *dev, int ioaddr);
-
- #ifdef __ISAPNP__
-@@ -122,18 +121,30 @@ MODULE_DEVICE_TABLE(isapnp, ultra_device
- #define ULTRA_IO_EXTENT 32
- #define EN0_ERWCNT 0x08 /* Early receive warning count. */
- \f
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void ultra_poll(struct net_device *dev)
-+{
-+ disable_irq(dev->irq);
-+ ei_interrupt(dev->irq, dev, NULL);
-+ enable_irq(dev->irq);
-+}
-+#endif
- /* Probe for the Ultra. This looks like a 8013 with the station
- address PROM at I/O ports <base>+8 to <base>+13, with a checksum
- following.
- */
-
--int __init ultra_probe(struct net_device *dev)
-+static int __init do_ultra_probe(struct net_device *dev)
- {
- int i;
- int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-
- SET_MODULE_OWNER(dev);
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = &ultra_poll;
-+#endif
- if (base_addr > 0x1ff) /* Check a single specified location. */
- return ultra_probe1(dev, base_addr);
- else if (base_addr != 0) /* Don't probe at all. */
-@@ -147,13 +158,51 @@ int __init ultra_probe(struct net_device
- printk(KERN_NOTICE "smc-ultra.c: No ISAPnP cards found, trying standard ones...\n");
- #endif
-
-- for (i = 0; ultra_portlist[i]; i++)
-+ for (i = 0; ultra_portlist[i]; i++) {
-+ dev->irq = irq;
- if (ultra_probe1(dev, ultra_portlist[i]) == 0)
- return 0;
-+ }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ /* NB: ultra_close_card() does free_irq */
-+#ifdef __ISAPNP__
-+ struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
-+ if (idev)
-+ pnp_device_detach(idev);
-+#endif
-+ release_region(dev->base_addr - ULTRA_NIC_OFFSET, ULTRA_IO_EXTENT);
-+}
-+
-+struct net_device * __init ultra_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_ultra_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init ultra_probe1(struct net_device *dev, int ioaddr)
- {
- int i, retval;
-@@ -226,13 +275,6 @@ static int __init ultra_probe1(struct ne
- eeprom_irq = 1;
- }
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (", no memory for dev->priv.\n");
-- retval = -ENOMEM;
-- goto out;
-- }
--
- /* The 8390 isn't at the base address, so fake the offset */
- dev->base_addr = ioaddr+ULTRA_NIC_OFFSET;
-
-@@ -500,7 +542,7 @@ ultra_close_card(struct net_device *dev)
- \f
- #ifdef MODULE
- #define MAX_ULTRA_CARDS 4 /* Max number of Ultra cards per module */
--static struct net_device dev_ultra[MAX_ULTRA_CARDS];
-+static struct net_device *dev_ultra[MAX_ULTRA_CARDS];
- static int io[MAX_ULTRA_CARDS];
- static int irq[MAX_ULTRA_CARDS];
-
-@@ -516,26 +558,33 @@ ISA device autoprobes on a running machi
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ultra[this_dev];
-- dev->irq = irq[this_dev];
-- dev->base_addr = io[this_dev];
-- dev->init = ultra_probe;
- if (io[this_dev] == 0) {
- if (this_dev != 0) break; /* only autoprobe 1st one */
- printk(KERN_NOTICE "smc-ultra.c: Presently autoprobing (not recommended) for a single card.\n");
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) return 0; /* Got at least one. */
-- return -ENXIO;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
-+ dev->irq = irq[this_dev];
-+ dev->base_addr = io[this_dev];
-+ if (do_ultra_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_ultra[found++] = dev;
-+ continue;
-+ }
-+ cleanup_card(dev);
- }
-- found++;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
- }
--
-- return 0;
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -544,20 +593,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) {
-- struct net_device *dev = &dev_ultra[this_dev];
-- if (dev->priv != NULL) {
-- /* NB: ultra_close_card() does free_irq */
-- int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
--
--#ifdef __ISAPNP__
-- struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
-- if (idev)
-- pnp_device_detach(idev);
--#endif
--
-+ struct net_device *dev = dev_ultra[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- release_region(ioaddr, ULTRA_IO_EXTENT);
-- kfree(dev->priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/Space.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/Space.c 2003-12-28 23:21:06.000000000 -0800
-@@ -40,63 +40,62 @@
- ethernet adaptor have the name "eth[0123...]".
- */
-
--extern int ne2_probe(struct net_device *dev);
--extern int hp100_probe(struct net_device *dev);
--extern int ultra_probe(struct net_device *dev);
--extern int ultra32_probe(struct net_device *dev);
--extern int wd_probe(struct net_device *dev);
--extern int el2_probe(struct net_device *dev);
--extern int ne_probe(struct net_device *dev);
--extern int hp_probe(struct net_device *dev);
--extern int hp_plus_probe(struct net_device *dev);
--extern int express_probe(struct net_device *);
--extern int eepro_probe(struct net_device *);
--extern int at1500_probe(struct net_device *);
--extern int at1700_probe(struct net_device *);
--extern int fmv18x_probe(struct net_device *);
--extern int eth16i_probe(struct net_device *);
--extern int i82596_probe(struct net_device *);
--extern int ewrk3_probe(struct net_device *);
--extern int el1_probe(struct net_device *);
--extern int wavelan_probe(struct net_device *);
--extern int arlan_probe(struct net_device *);
--extern int el16_probe(struct net_device *);
--extern int elmc_probe(struct net_device *);
--extern int skmca_probe(struct net_device *);
--extern int elplus_probe(struct net_device *);
--extern int ac3200_probe(struct net_device *);
--extern int es_probe(struct net_device *);
--extern int lne390_probe(struct net_device *);
--extern int e2100_probe(struct net_device *);
--extern int ni5010_probe(struct net_device *);
--extern int ni52_probe(struct net_device *);
--extern int ni65_probe(struct net_device *);
--extern int sonic_probe(struct net_device *);
--extern int SK_init(struct net_device *);
--extern int seeq8005_probe(struct net_device *);
--extern int smc_init( struct net_device * );
--extern int atarilance_probe(struct net_device *);
--extern int sun3lance_probe(struct net_device *);
--extern int sun3_82586_probe(struct net_device *);
--extern int apne_probe(struct net_device *);
--extern int bionet_probe(struct net_device *);
--extern int pamsnet_probe(struct net_device *);
--extern int cs89x0_probe(struct net_device *dev);
--extern int hplance_probe(struct net_device *dev);
--extern int bagetlance_probe(struct net_device *);
--extern int mvme147lance_probe(struct net_device *dev);
--extern int tc515_probe(struct net_device *dev);
--extern int lance_probe(struct net_device *dev);
--extern int mace_probe(struct net_device *dev);
--extern int macsonic_probe(struct net_device *dev);
--extern int mac8390_probe(struct net_device *dev);
--extern int mac89x0_probe(struct net_device *dev);
--extern int mc32_probe(struct net_device *dev);
-+extern struct net_device *ne2_probe(int unit);
-+extern struct net_device *hp100_probe(int unit);
-+extern struct net_device *ultra_probe(int unit);
-+extern struct net_device *ultra32_probe(int unit);
-+extern struct net_device *wd_probe(int unit);
-+extern struct net_device *el2_probe(int unit);
-+extern struct net_device *ne_probe(int unit);
-+extern struct net_device *hp_probe(int unit);
-+extern struct net_device *hp_plus_probe(int unit);
-+extern struct net_device *express_probe(int unit);
-+extern struct net_device *eepro_probe(int unit);
-+extern struct net_device *at1700_probe(int unit);
-+extern struct net_device *fmv18x_probe(int unit);
-+extern struct net_device *eth16i_probe(int unit);
-+extern struct net_device *i82596_probe(int unit);
-+extern struct net_device *ewrk3_probe(int unit);
-+extern struct net_device *el1_probe(int unit);
-+extern struct net_device *wavelan_probe(int unit);
-+extern struct net_device *arlan_probe(int unit);
-+extern struct net_device *el16_probe(int unit);
-+extern struct net_device *elmc_probe(int unit);
-+extern struct net_device *skmca_probe(int unit);
-+extern struct net_device *elplus_probe(int unit);
-+extern struct net_device *ac3200_probe(int unit);
-+extern struct net_device *es_probe(int unit);
-+extern struct net_device *lne390_probe(int unit);
-+extern struct net_device *e2100_probe(int unit);
-+extern struct net_device *ni5010_probe(int unit);
-+extern struct net_device *ni52_probe(int unit);
-+extern struct net_device *ni65_probe(int unit);
-+extern struct net_device *sonic_probe(int unit);
-+extern struct net_device *SK_init(int unit);
-+extern struct net_device *seeq8005_probe(int unit);
-+extern struct net_device *smc_init(int unit);
-+extern struct net_device *atarilance_probe(int unit);
-+extern struct net_device *sun3lance_probe(int unit);
-+extern struct net_device *sun3_82586_probe(int unit);
-+extern struct net_device *apne_probe(int unit);
-+extern struct net_device *bionet_probe(int unit);
-+extern struct net_device *pamsnet_probe(int unit);
-+extern struct net_device *cs89x0_probe(int unit);
-+extern struct net_device *hplance_probe(int unit);
-+extern struct net_device *bagetlance_probe(int unit);
-+extern struct net_device *mvme147lance_probe(int unit);
-+extern struct net_device *tc515_probe(int unit);
-+extern struct net_device *lance_probe(int unit);
-+extern struct net_device *mace_probe(int unit);
-+extern struct net_device *macsonic_probe(int unit);
-+extern struct net_device *mac8390_probe(int unit);
-+extern struct net_device *mac89x0_probe(int unit);
-+extern struct net_device *mc32_probe(int unit);
- extern struct net_device *cops_probe(int unit);
- extern struct net_device *ltpc_probe(void);
-
- /* Detachable devices ("pocket adaptors") */
--extern int de620_probe(struct net_device *);
-+extern struct net_device *de620_probe(int unit);
-
- /* Fibre Channel adapters */
- extern int iph5526_probe(struct net_device *dev);
-@@ -104,33 +103,22 @@ extern int iph5526_probe(struct net_devi
- /* SBNI adapters */
- extern int sbni_probe(int unit);
-
--struct devprobe
--{
-- int (*probe)(struct net_device *dev);
-+struct devprobe2 {
-+ struct net_device *(*probe)(int unit);
- int status; /* non-zero if autoprobe has failed */
- };
-
--/*
-- * probe_list walks a list of probe functions and calls each so long
-- * as a non-zero ioaddr is given, or as long as it hasn't already failed
-- * to find a card in the past (as recorded by "status") when asked to
-- * autoprobe (i.e. a probe that fails to find a card when autoprobing
-- * will not be asked to autoprobe again). It exits when a card is found.
-- */
--static int __init probe_list(struct net_device *dev, struct devprobe *plist)
-+static int __init probe_list2(int unit, struct devprobe2 *p, int autoprobe)
- {
-- struct devprobe *p = plist;
-- unsigned long base_addr = dev->base_addr;
--
-- while (p->probe != NULL) {
-- if (base_addr && p->probe(dev) == 0) /* probe given addr */
-+ struct net_device *dev;
-+ for (; p->probe; p++) {
-+ if (autoprobe && p->status)
-+ continue;
-+ dev = p->probe(unit);
-+ if (!IS_ERR(dev))
- return 0;
-- else if (p->status == 0) { /* has autoprobe failed yet? */
-- p->status = p->probe(dev); /* no, try autoprobe */
-- if (p->status == 0)
-- return 0;
-- }
-- p++;
-+ if (autoprobe)
-+ p->status = PTR_ERR(dev);
- }
- return -ENODEV;
- }
-@@ -141,7 +129,8 @@ static int __init probe_list(struct net_
- * drivers that probe for EISA cards (in the ISA group). These are the
- * legacy EISA only driver probes, and also the legacy PCI probes
- */
--static struct devprobe eisa_probes[] __initdata = {
-+
-+static struct devprobe2 eisa_probes[] __initdata = {
- #ifdef CONFIG_ULTRA32
- {ultra32_probe, 0},
- #endif
-@@ -157,8 +146,7 @@ static struct devprobe eisa_probes[] __i
- {NULL, 0},
- };
-
--
--static struct devprobe mca_probes[] __initdata = {
-+static struct devprobe2 mca_probes[] __initdata = {
- #ifdef CONFIG_NE2_MCA
- {ne2_probe, 0},
- #endif
-@@ -178,7 +166,7 @@ static struct devprobe mca_probes[] __in
- * ISA probes that touch addresses < 0x400 (including those that also
- * look for EISA/PCI/MCA cards in addition to ISA cards).
- */
--static struct devprobe isa_probes[] __initdata = {
-+static struct devprobe2 isa_probes[] __initdata = {
- #ifdef CONFIG_HP100 /* ISA, EISA & PCI */
- {hp100_probe, 0},
- #endif
-@@ -215,9 +203,6 @@ static struct devprobe isa_probes[] __in
- #ifdef CONFIG_SEEQ8005
- {seeq8005_probe, 0},
- #endif
--#ifdef CONFIG_AT1500
-- {at1500_probe, 0},
--#endif
- #ifdef CONFIG_CS89x0
- {cs89x0_probe, 0},
- #endif
-@@ -272,14 +257,14 @@ static struct devprobe isa_probes[] __in
- {NULL, 0},
- };
-
--static struct devprobe parport_probes[] __initdata = {
-+static struct devprobe2 parport_probes[] __initdata = {
- #ifdef CONFIG_DE620 /* D-Link DE-620 adapter */
- {de620_probe, 0},
- #endif
- {NULL, 0},
- };
-
--static struct devprobe m68k_probes[] __initdata = {
-+static struct devprobe2 m68k_probes[] __initdata = {
- #ifdef CONFIG_ATARILANCE /* Lance-based Atari ethernet boards */
- {atarilance_probe, 0},
- #endif
-@@ -319,7 +304,7 @@ static struct devprobe m68k_probes[] __i
- {NULL, 0},
- };
-
--static struct devprobe mips_probes[] __initdata = {
-+static struct devprobe2 mips_probes[] __initdata = {
- #ifdef CONFIG_MIPS_JAZZ_SONIC
- {sonic_probe, 0},
- #endif
-@@ -334,83 +319,65 @@ static struct devprobe mips_probes[] __i
- * per bus interface. This drives the legacy devices only for now.
- */
-
--static int __init ethif_probe(int unit)
-+static void __init ethif_probe2(int unit)
- {
-- struct net_device *dev;
-- int err = -ENODEV;
-+ unsigned long base_addr = netdev_boot_base("eth", unit);
-
-- dev = alloc_etherdev(0);
-- if (!dev)
-- return -ENOMEM;
--
-- sprintf(dev->name, "eth%d", unit);
-- netdev_boot_setup_check(dev);
--
-- /*
-- * Backwards compatibility - historically an I/O base of 1 was
-- * used to indicate not to probe for this ethN interface
-- */
-- if (dev->base_addr == 1) {
-- free_netdev(dev);
-- return -ENXIO;
-- }
--
-- /*
-- * The arch specific probes are 1st so that any on-board ethernet
-- * will be probed before other ISA/EISA/MCA/PCI bus cards.
-- */
-- if (probe_list(dev, m68k_probes) == 0 ||
-- probe_list(dev, mips_probes) == 0 ||
-- probe_list(dev, eisa_probes) == 0 ||
-- probe_list(dev, mca_probes) == 0 ||
-- probe_list(dev, isa_probes) == 0 ||
-- probe_list(dev, parport_probes) == 0)
-- err = register_netdev(dev);
--
-- if (err)
-- free_netdev(dev);
-- return err;
-+ if (base_addr == 1)
-+ return;
-
-+ (void)( probe_list2(unit, m68k_probes, base_addr == 0) &&
-+ probe_list2(unit, mips_probes, base_addr == 0) &&
-+ probe_list2(unit, eisa_probes, base_addr == 0) &&
-+ probe_list2(unit, mca_probes, base_addr == 0) &&
-+ probe_list2(unit, isa_probes, base_addr == 0) &&
-+ probe_list2(unit, parport_probes, base_addr == 0));
- }
-
- #ifdef CONFIG_TR
- /* Token-ring device probe */
--extern int ibmtr_probe(struct net_device *);
--extern int sk_isa_probe(struct net_device *);
--extern int proteon_probe(struct net_device *);
--extern int smctr_probe(struct net_device *);
-+extern int ibmtr_probe_card(struct net_device *);
-+extern struct net_device *sk_isa_probe(int unit);
-+extern struct net_device *proteon_probe(int unit);
-+extern struct net_device *smctr_probe(int unit);
-+
-+static struct devprobe2 tr_probes2[] __initdata = {
-+#ifdef CONFIG_SKISA
-+ {sk_isa_probe, 0},
-+#endif
-+#ifdef CONFIG_PROTEON
-+ {proteon_probe, 0},
-+#endif
-+#ifdef CONFIG_SMCTR
-+ {smctr_probe, 0},
-+#endif
-+ {NULL, 0},
-+};
-
- static __init int trif_probe(int unit)
- {
-- struct net_device *dev;
- int err = -ENODEV;
--
-- dev = alloc_trdev(0);
-+#ifdef CONFIG_IBMTR
-+ struct net_device *dev = alloc_trdev(0);
- if (!dev)
- return -ENOMEM;
-
- sprintf(dev->name, "tr%d", unit);
- netdev_boot_setup_check(dev);
-- if (
--#ifdef CONFIG_IBMTR
-- ibmtr_probe(dev) == 0 ||
--#endif
--#ifdef CONFIG_SKISA
-- sk_isa_probe(dev) == 0 ||
--#endif
--#ifdef CONFIG_PROTEON
-- proteon_probe(dev) == 0 ||
--#endif
--#ifdef CONFIG_SMCTR
-- smctr_probe(dev) == 0 ||
--#endif
-- 0 )
-- err = register_netdev(dev);
--
-+ err = ibmtr_probe_card(dev);
- if (err)
- free_netdev(dev);
-+#endif
- return err;
-+}
-+
-+static void __init trif_probe2(int unit)
-+{
-+ unsigned long base_addr = netdev_boot_base("tr", unit);
-
-+ if (base_addr == 1)
-+ return;
-+ probe_list2(unit, tr_probes2, base_addr == 0);
- }
- #endif
-
-@@ -437,10 +404,11 @@ static int __init net_olddevs_init(void)
- #endif
- #ifdef CONFIG_TR
- for (num = 0; num < 8; ++num)
-- trif_probe(num);
-+ if (!trif_probe(num))
-+ trif_probe2(num);
- #endif
- for (num = 0; num < 8; ++num)
-- ethif_probe(num);
-+ ethif_probe2(num);
-
- #ifdef CONFIG_COPS
- cops_probe(0);
---- linux-2.6.0/drivers/net/starfire.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/starfire.c 2003-12-28 23:21:01.000000000 -0800
-@@ -139,7 +139,6 @@ TODO: bugfixes (no bugs known as of righ
- #include <linux/config.h>
- #include <linux/version.h>
- #include <linux/module.h>
--#include <asm/io.h>
- #include <linux/kernel.h>
- #include <linux/pci.h>
- #include <linux/netdevice.h>
---- linux-2.6.0/drivers/net/stnic.c 2003-06-14 12:18:25.000000000 -0700
-+++ 25/drivers/net/stnic.c 2003-12-28 23:21:01.000000000 -0800
-@@ -98,28 +98,20 @@ STNIC_WRITE (int reg, byte val)
- STNIC_DELAY ();
- }
- \f
--int __init stnic_probe(void)
-+static int __init stnic_probe(void)
- {
- struct net_device *dev;
-- int i;
-+ int i, err;
-
- /* If we are not running on a SolutionEngine, give up now */
- if (! MACH_SE)
- return -ENODEV;
-
- /* New style probing API */
-- dev = init_etherdev (NULL, 0);
-+ dev = alloc_ei_netdev();
- if (!dev)
- return -ENOMEM;
- SET_MODULE_OWNER(dev);
-- stnic_dev = dev;
--
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init (dev))
-- {
-- printk (KERN_EMERG "Unable to get memory for dev->priv.\n");
-- return -ENOMEM;
-- }
-
- #ifdef CONFIG_SH_STANDARD_BIOS
- sh_bios_get_node_addr (stnic_eadr);
-@@ -135,13 +127,11 @@ int __init stnic_probe(void)
-
- /* Snarf the interrupt now. There's no point in waiting since we cannot
- share and the board will usually be enabled. */
-- i = request_irq (dev->irq, ei_interrupt, 0, dev->name, dev);
-- if (i) {
-+ err = request_irq (dev->irq, ei_interrupt, 0, dev->name, dev);
-+ if (err) {
- printk (KERN_EMERG " unable to get IRQ %d.\n", dev->irq);
-- unregister_netdev(dev);
-- kfree(dev->priv);
-- kfree(dev);
-- return i;
-+ free_netdev(dev);
-+ return err;
- }
-
- ei_status.name = dev->name;
-@@ -162,6 +152,14 @@ int __init stnic_probe(void)
-
- stnic_init (dev);
-
-+ err = register_netdev(dev);
-+ if (err) {
-+ free_irq(dev->irq, dev);
-+ free_netdev(dev);
-+ return err;
-+ }
-+ stnic_dev = dev;
-+
- printk (KERN_INFO "NS ST-NIC 83902A\n");
-
- return 0;
-@@ -305,15 +303,13 @@ stnic_init (struct net_device *dev)
- return;
- }
-
--/* Hardware interrupt handler. */
--extern void ei_interrupt (int irq, void *dev_id, struct pt_regs *regs);
--
--void
--do_stnic_intr (int irq, void *dev_id, struct pt_regs *regs)
-+static void __exit stnic_cleanup(void)
- {
-- ei_interrupt (0, stnic_dev, regs);
-+ unregister_netdev(stnic_dev);
-+ free_irq(stnic_dev->irq, stnic_dev);
-+ free_netdev(stnic_dev);
- }
-
- module_init(stnic_probe);
--/* No cleanup routine. */
-+module_exit(stnic_cleanup);
- MODULE_LICENSE("GPL");
---- linux-2.6.0/drivers/net/sun3_82586.c 2003-06-14 12:18:22.000000000 -0700
-+++ 25/drivers/net/sun3_82586.c 2003-12-28 23:21:01.000000000 -0800
-@@ -55,6 +55,7 @@ static int fifo=0x8; /* don't change */
-
- #define DEBUG /* debug on */
- #define SYSBUSVAL 0 /* 16 Bit */
-+#define SUN3_82586_TOTAL_SIZE PAGE_SIZE
-
- #define sun3_attn586() {*(volatile unsigned char *)(dev->base_addr) |= IEOB_ATTEN; *(volatile unsigned char *)(dev->base_addr) &= ~IEOB_ATTEN;}
- #define sun3_reset586() {*(volatile unsigned char *)(dev->base_addr) = 0; udelay(100); *(volatile unsigned char *)(dev->base_addr) = IEOB_NORSET;}
-@@ -277,10 +278,12 @@ static void alloc586(struct net_device *
- memset((char *)p->scb,0,sizeof(struct scb_struct));
- }
-
--int __init sun3_82586_probe(struct net_device *dev)
-+struct net_device * __init sun3_82586_probe(int unit)
- {
-+ struct net_device *dev;
- unsigned long ioaddr;
- static int found = 0;
-+ int err = -ENOMEM;
-
- /* check that this machine has an onboard 82586 */
- switch(idprom->id_machtype) {
-@@ -290,31 +293,51 @@ int __init sun3_82586_probe(struct net_d
- break;
-
- default:
-- return(-ENODEV);
-+ return ERR_PTR(-ENODEV);
- }
-
-- if(found)
-- return -ENODEV;
-+ if (found)
-+ return ERR_PTR(-ENODEV);
-
-- ioaddr = (unsigned long)ioremap(IE_OBIO, PAGE_SIZE);
-+ ioaddr = (unsigned long)ioremap(IE_OBIO, SUN3_82586_TOTAL_SIZE);
-+ if (!ioaddr)
-+ return ERR_PTR(-ENOMEM);
- found = 1;
-
-+ dev = alloc_etherdev(sizeof(struct priv));
-+ if (!dev)
-+ goto out;
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
- SET_MODULE_OWNER(dev);
-
- dev->irq = IE_IRQ;
- dev->base_addr = ioaddr;
-- if(sun3_82586_probe1(dev, ioaddr) == 0)
-- return 0;
--
-- return -ENODEV;
-+ err = sun3_82586_probe1(dev, ioaddr);
-+ if (err)
-+ goto out1;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out2;
-+ return dev;
-+
-+out2:
-+ release_region(ioaddr, SUN3_82586_TOTAL_SIZE);
-+out1:
-+ free_netdev(dev);
-+out:
-+ iounmap((void *)ioaddr);
-+ return ERR_PTR(err);
- }
-
- static int __init sun3_82586_probe1(struct net_device *dev,int ioaddr)
- {
- int i, size, retval;
-
--// if (!request_region(ioaddr, SUN3_82586_TOTAL_SIZE, dev->name))
--// return -EBUSY;
-+ if (!request_region(ioaddr, SUN3_82586_TOTAL_SIZE, dev->name))
-+ return -EBUSY;
-
- /* copy in the ethernet address from the prom */
- for(i = 0; i < 6 ; i++)
-@@ -341,16 +364,6 @@ static int __init sun3_82586_probe1(stru
- goto out;
- }
-
-- dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL);
-- if(dev->priv == NULL) {
-- printk("%s: Ooops .. can't allocate private driver memory.\n",dev->name);
-- retval = -ENOMEM;
-- goto out;
-- }
--
-- /* warning: we don't free it on errors */
-- memset((char *) dev->priv,0,sizeof(struct priv));
--
- ((struct priv *) (dev->priv))->memtop = (char *)dvma_btov(dev->mem_start);
- ((struct priv *) (dev->priv))->base = (unsigned long) dvma_btov(0);
- alloc586(dev);
-@@ -374,11 +387,9 @@ static int __init sun3_82586_probe1(stru
- dev->set_multicast_list = set_multicast_list;
-
- dev->if_port = 0;
--
-- ether_setup(dev);
--
- return 0;
- out:
-+ release_region(ioaddr, SUN3_82586_TOTAL_SIZE);
- return retval;
- }
-
-@@ -1138,21 +1149,23 @@ static void set_multicast_list(struct ne
-
- #ifdef MODULE
- #error This code is not currently supported as a module
--static struct net_device dev_sun3_82586;
-+static struct net_device *dev_sun3_82586;
-
- int init_module(void)
- {
-- dev_sun3_82586.init = sun3_82586_probe;
-- if (register_netdev(&dev_sun3_82586) != 0)
-- return -EIO;
-+ dev_sun3_82586 = sun3_82586_probe(-1);
-+ if (IS_ERR(dev_sun3_82586))
-+ return PTR_ERR(dev_sun3_82586);
- return 0;
- }
-
- void cleanup_module(void)
- {
-- unregister_netdev(&dev_sun3_82586);
-- kfree(dev_sun3_82586.priv);
-- dev_sun3_82586.priv = NULL;
-+ unsigned long ioaddr = dev_sun3_82586->base_addr;
-+ unregister_netdev(dev_sun3_82586);
-+ release_region(ioaddr, SUN3_82586_TOTAL_SIZE);
-+ iounmap((void *)ioaddr);
-+ free_netdev(dev_sun3_82586);
- }
- #endif /* MODULE */
-
---- linux-2.6.0/drivers/net/sun3lance.c 2003-06-14 12:18:32.000000000 -0700
-+++ 25/drivers/net/sun3lance.c 2003-12-28 23:21:01.000000000 -0800
-@@ -246,9 +246,11 @@ static void set_multicast_list( struct n
-
- /************************* End of Prototypes **************************/
-
--int __init sun3lance_probe( struct net_device *dev )
--{
-+struct net_device * __init sun3lance_probe(int unit)
-+{
-+ struct net_device *dev;
- static int found;
-+ int err = -ENODEV;
-
- /* check that this machine has an onboard lance */
- switch(idprom->id_machtype) {
-@@ -259,18 +261,37 @@ int __init sun3lance_probe( struct net_d
- break;
-
- default:
-- return(-ENODEV);
-+ return ERR_PTR(-ENODEV);
- }
-
-- if(found)
-- return(-ENODEV);
-+ if (found)
-+ return ERR_PTR(-ENODEV);
-
-- if (lance_probe(dev)) {
-- found = 1;
-- return( 0 );
-+ dev = alloc_etherdev(sizeof(struct lance_private));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
- }
-+ SET_MODULE_OWNER(dev);
-+
-+ if (!lance_probe(dev))
-+ goto out;
-
-- return( -ENODEV );
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ found = 1;
-+ return dev;
-+
-+out1:
-+#ifdef CONFIG_SUN3
-+ iounmap((void *)dev->base_addr);
-+#endif
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- static int __init lance_probe( struct net_device *dev)
-@@ -285,6 +306,8 @@ static int __init lance_probe( struct ne
-
- #ifdef CONFIG_SUN3
- ioaddr = (unsigned long)ioremap(LANCE_OBIO, PAGE_SIZE);
-+ if (!ioaddr)
-+ return 0;
- #else
- ioaddr = SUN3X_LANCE;
- #endif
-@@ -303,17 +326,15 @@ static int __init lance_probe( struct ne
- ioaddr_probe[0] = tmp1;
- ioaddr_probe[1] = tmp2;
-
-+#ifdef CONFIG_SUN3
-+ iounmap((void *)ioaddr);
-+#endif
- return 0;
- }
-
-- init_etherdev( dev, sizeof(struct lance_private) );
-- if (!dev->priv) {
-- dev->priv = kmalloc( sizeof(struct lance_private), GFP_KERNEL );
-- if (!dev->priv)
-- return 0;
-- }
- lp = (struct lance_private *)dev->priv;
-
-+ /* XXX - leak? */
- MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000);
-
- lp->iobase = (volatile unsigned short *)ioaddr;
-@@ -921,32 +942,24 @@ static void set_multicast_list( struct n
-
-
- #ifdef MODULE
--static char devicename[9];
-
--static struct net_device sun3lance_dev =
--{
-- devicename, /* filled in by register_netdev() */
-- 0, 0, 0, 0, /* memory */
-- 0, 0, /* base, irq */
-- 0, 0, 0, NULL, sun3lance_probe,
--};
-+static struct net_device *sun3lance_dev;
-
- int init_module(void)
- {
-- int err;
--
-- if ((err = register_netdev( &sun3lance_dev ))) {
-- if (err == -EIO) {
-- printk( "SUN3 Lance not detected. Module not loaded.\n");
-- }
-- return( err );
-- }
-- return( 0 );
-+ sun3lance_dev = sun3lance_probe(-1);
-+ if (IS_ERR(sun3lance_dev))
-+ return PTR_ERR(sun3lance_dev);
-+ return 0;
- }
-
- void cleanup_module(void)
- {
-- unregister_netdev( &sun3lance_dev );
-+ unregister_netdev(sun3lance_dev);
-+#ifdef CONFIG_SUN3
-+ iounmap((void *)sun3lance_dev->base_addr);
-+#endif
-+ free_netdev(sun3lance_dev);
- }
-
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/tc35815.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tc35815.c 2003-12-28 23:21:01.000000000 -0800
-@@ -463,7 +463,6 @@ static void tc35815_set_multicast_list(s
- static void tc35815_chip_reset(struct net_device *dev);
- static void tc35815_chip_init(struct net_device *dev);
- static void tc35815_phy_chip_init(struct net_device *dev);
--static int tc35815_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data);
-
- /* A list of all installed tc35815 devices. */
- static struct net_device *root_tc35815_dev = NULL;
-@@ -482,78 +481,76 @@ int
- tc35815_probe(struct pci_dev *pdev,
- const struct pci_device_id *ent)
- {
-- static int called = 0;
- int err = 0;
- int ret;
-+ unsigned long pci_memaddr;
-+ unsigned int pci_irq_line;
-
-- if (called)
-- return -ENODEV;
-- called++;
-+ printk(KERN_INFO "tc35815_probe: found device %#08x.%#08x\n", ent->vendor, ent->device);
-
-- if (pdev) {
-- unsigned int pci_memaddr;
-- unsigned int pci_irq_line;
-+ err = pci_enable_device(pdev);
-+ if (err)
-+ return err;
-
-- printk(KERN_INFO "tc35815_probe: found device %#08x.%#08x\n", ent->vendor, ent->device);
-+ pci_memaddr = pci_resource_start (pdev, 1);
-
-- pci_memaddr = pci_resource_start (pdev, 1);
-+ printk(KERN_INFO " pci_memaddr=%#08lx resource_flags=%#08lx\n", pci_memaddr, pci_resource_flags (pdev, 0));
-
-- printk(KERN_INFO " pci_memaddr=%#08lx resource_flags=%#08lx\n", pci_memaddr, pci_resource_flags (pdev, 0));
-+ if (!pci_memaddr) {
-+ printk(KERN_WARNING "no PCI MEM resources, aborting\n");
-+ ret = -ENODEV;
-+ goto err_out;
-+ }
-+ pci_irq_line = pdev->irq;
-+ /* irq disabled. */
-+ if (pci_irq_line == 0) {
-+ printk(KERN_WARNING "no PCI irq, aborting\n");
-+ ret = -ENODEV;
-+ goto err_out;
-+ }
-
-- if (!pci_memaddr) {
-- printk(KERN_WARNING "no PCI MEM resources, aborting\n");
-- return -ENODEV;
-- }
-- pci_irq_line = pdev->irq;
-- /* irq disabled. */
-- if (pci_irq_line == 0) {
-- printk(KERN_WARNING "no PCI irq, aborting\n");
-- return -ENODEV;
-- }
-+ ret = tc35815_probe1(pdev, pci_memaddr, pci_irq_line);
-+ if (ret)
-+ goto err_out;
-
-- ret = tc35815_probe1(pdev, pci_memaddr, pci_irq_line);
-+ pci_set_master(pdev);
-
-- if (!ret) {
-- if ((err = pci_enable_device(pdev)) < 0) {
-- printk(KERN_ERR "tc35815_probe: failed to enable device -- err=%d\n", err);
-- return err;
-- }
-- pci_set_master(pdev);
-- }
-+ return 0;
-
-- return ret;
-- }
-- return -ENODEV;
-+err_out:
-+ pci_disable_device(pdev);
-+ return ret;
- }
-
- static int __devinit tc35815_probe1(struct pci_dev *pdev, unsigned int base_addr, unsigned int irq)
- {
- static unsigned version_printed = 0;
-- int i;
-+ int i, ret;
- struct tc35815_local *lp;
- struct tc35815_regs *tr;
- struct net_device *dev;
-
- /* Allocate a new 'dev' if needed. */
-- dev = init_etherdev(NULL, sizeof(struct tc35815_local));
-+ dev = alloc_etherdev(sizeof(struct tc35815_local));
- if (dev == NULL)
- return -ENOMEM;
-
- /*
-- * init_etherdev allocs and zeros dev->priv
-+ * alloc_etherdev allocs and zeros dev->priv
- */
- lp = dev->priv;
-
- if (tc35815_debug && version_printed++ == 0)
- printk(KERN_DEBUG "%s", version);
-
-- printk(KERN_INFO "%s: %s found at %#x, irq %d\n",
-- dev->name, cardname, base_addr, irq);
--
- /* Fill in the 'dev' fields. */
- dev->irq = irq;
- dev->base_addr = (unsigned long)ioremap(base_addr,
- sizeof(struct tc35815_regs));
-+ if (!dev->base_addr) {
-+ ret = -ENOMEM;
-+ goto err_out;
-+ }
- tr = (struct tc35815_regs*)dev->base_addr;
-
- tc35815_chip_reset(dev);
-@@ -570,9 +567,6 @@ static int __devinit tc35815_probe1(stru
- dev->dev_addr[i] = data & 0xff;
- dev->dev_addr[i+1] = data >> 8;
- }
-- for (i = 0; i < 6; i++)
-- printk(" %2.2x", dev->dev_addr[i]);
-- printk("\n");
-
- /* Initialize the device structure. */
- lp->pdev = pdev;
-@@ -594,8 +588,6 @@ static int __devinit tc35815_probe1(stru
-
- /* do auto negotiation */
- tc35815_phy_chip_init(dev);
-- printk(KERN_INFO "%s: linkspeed %dMbps, %s Duplex\n",
-- dev->name, lp->linkspeed, lp->fullduplex ? "Full" : "Half");
-
- dev->open = tc35815_open;
- dev->stop = tc35815_close;
-@@ -604,20 +596,34 @@ static int __devinit tc35815_probe1(stru
- dev->hard_start_xmit = tc35815_send_packet;
- dev->get_stats = tc35815_get_stats;
- dev->set_multicast_list = tc35815_set_multicast_list;
-+ SET_MODULE_OWNER(dev);
-
--#if 0 /* XXX called in init_etherdev */
-- /* Fill in the fields of the device structure with ethernet values. */
-- ether_setup(dev);
--#endif
-+ ret = register_netdev(dev);
-+ if (ret)
-+ goto err_out_iounmap;
-+
-+ printk(KERN_INFO "%s: %s found at %#x, irq %d, MAC",
-+ dev->name, cardname, base_addr, irq);
-+ for (i = 0; i < 6; i++)
-+ printk(" %2.2x", dev->dev_addr[i]);
-+ printk("\n");
-+ printk(KERN_INFO "%s: linkspeed %dMbps, %s Duplex\n",
-+ dev->name, lp->linkspeed, lp->fullduplex ? "Full" : "Half");
-
- return 0;
-+
-+err_out_iounmap:
-+ iounmap((void *) dev->base_addr);
-+err_out:
-+ free_netdev(dev);
-+ return ret;
- }
-
-
- static int
- tc35815_init_queues(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- int i;
- unsigned long fd_addr;
-
-@@ -702,7 +708,7 @@ tc35815_init_queues(struct net_device *d
- static void
- tc35815_clear_queues(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- int i;
-
- for (i = 0; i < TX_FD_NUM; i++) {
-@@ -719,7 +725,7 @@ tc35815_clear_queues(struct net_device *
- static void
- tc35815_free_queues(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- int i;
-
- if (lp->tfd_base) {
-@@ -805,7 +811,7 @@ dump_frfd(struct FrFD *fd)
- static void
- panic_queues(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- int i;
-
- printk("TxFD base %p, start %d, end %d\n",
-@@ -823,6 +829,7 @@ panic_queues(struct net_device *dev)
- panic("%s: Illegal queue state.", dev->name);
- }
-
-+#if 0
- static void print_buf(char *add, int length)
- {
- int i;
-@@ -839,6 +846,7 @@ static void print_buf(char *add, int len
- }
- printk("\n");
- }
-+#endif
-
- static void print_eth(char *add)
- {
-@@ -864,7 +872,7 @@ static void print_eth(char *add)
- static int
- tc35815_open(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- /*
- * This is used if the interrupt line can turned off (shared).
- * See 3c503.c for an example of selecting the IRQ at config-time.
-@@ -888,19 +896,17 @@ tc35815_open(struct net_device *dev)
- lp->tbusy = 0;
- netif_start_queue(dev);
-
-- MOD_INC_USE_COUNT;
--
- return 0;
- }
-
- static void tc35815_tx_timeout(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- struct tc35815_regs *tr = (struct tc35815_regs *)dev->base_addr;
-- int flags;
-+ unsigned long flags;
-
- spin_lock_irqsave(&lp->lock, flags);
-- printk(KERN_WARNING "%s: transmit timed out, status %#x\n",
-+ printk(KERN_WARNING "%s: transmit timed out, status %#lx\n",
- dev->name, tc_readl(&tr->Tx_Stat));
- /* Try to restart the adaptor. */
- tc35815_chip_reset(dev);
-@@ -914,7 +920,7 @@ static void tc35815_tx_timeout(struct ne
-
- static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- struct tc35815_regs *tr = (struct tc35815_regs *)dev->base_addr;
-
- if (netif_queue_stopped(dev)) {
-@@ -925,7 +931,7 @@ static int tc35815_send_packet(struct sk
- int tickssofar = jiffies - dev->trans_start;
- if (tickssofar < 5)
- return 1;
-- printk(KERN_WARNING "%s: transmit timed out, status %#x\n",
-+ printk(KERN_WARNING "%s: transmit timed out, status %#lx\n",
- dev->name, tc_readl(&tr->Tx_Stat));
- /* Try to restart the adaptor. */
- tc35815_chip_reset(dev);
-@@ -947,7 +953,7 @@ static int tc35815_send_packet(struct sk
- short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
- unsigned char *buf = skb->data;
- struct TxFD *txfd = &lp->tfd_base[lp->tfd_start];
-- int flags;
-+ unsigned long flags;
- lp->stats.tx_bytes += skb->len;
-
-
-@@ -1051,7 +1057,7 @@ static irqreturn_t tc35815_interrupt(int
- }
-
- tr = (struct tc35815_regs*)dev->base_addr;
-- lp = (struct tc35815_local *)dev->priv;
-+ lp = dev->priv;
-
- do {
- status = tc_readl(&tr->Int_Src);
-@@ -1107,7 +1113,7 @@ static irqreturn_t tc35815_interrupt(int
- static void
- tc35815_rx(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
- unsigned int fdctl;
- int i;
-@@ -1157,7 +1163,9 @@ tc35815_rx(struct net_device *dev)
- offset += len;
- cur_bd++;
- }
-- // print_buf(data,pkt_len);
-+#if 0
-+ print_buf(data,pkt_len);
-+#endif
- if (tc35815_debug > 3)
- print_eth(data);
- skb->protocol = eth_type_trans(skb, dev);
-@@ -1247,7 +1255,7 @@ tc35815_rx(struct net_device *dev)
- static void
- tc35815_check_tx_stat(struct net_device *dev, int status)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- const char *msg = NULL;
-
- /* count collisions */
-@@ -1304,7 +1312,7 @@ tc35815_check_tx_stat(struct net_device
- static void
- tc35815_txdone(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
- struct TxFD *txfd;
- unsigned int fdctl;
-@@ -1379,7 +1387,7 @@ tc35815_txdone(struct net_device *dev)
- static int
- tc35815_close(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
-
- lp->tbusy = 1;
- netif_stop_queue(dev);
-@@ -1391,8 +1399,6 @@ tc35815_close(struct net_device *dev)
-
- tc35815_free_queues(dev);
-
-- MOD_DEC_USE_COUNT;
--
- return 0;
- }
-
-@@ -1402,7 +1408,7 @@ tc35815_close(struct net_device *dev)
- */
- static struct net_device_stats *tc35815_get_stats(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
- unsigned long flags;
-
-@@ -1456,7 +1462,7 @@ static void tc35815_set_cam_entry(struct
- int i;
- for (i = cam_index / 4; i < cam_index / 4 + 2; i++) {
- tc_writel(i * 4, &tr->CAM_Adr);
-- printk("CAM 0x%x: %08x",
-+ printk("CAM 0x%x: %08lx",
- i * 4, tc_readl(&tr->CAM_Data));
- }
- }
-@@ -1513,9 +1519,9 @@ tc35815_set_multicast_list(struct net_de
-
- static unsigned long tc_phy_read(struct net_device *dev, struct tc35815_regs *tr, int phy, int phy_reg)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- unsigned long data;
-- int flags;
-+ unsigned long flags;
-
- spin_lock_irqsave(&lp->lock, flags);
-
-@@ -1529,8 +1535,8 @@ static unsigned long tc_phy_read(struct
-
- static void tc_phy_write(struct net_device *dev, unsigned long d, struct tc35815_regs *tr, int phy, int phy_reg)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-- int flags;
-+ struct tc35815_local *lp = dev->priv;
-+ unsigned long flags;
-
- spin_lock_irqsave(&lp->lock, flags);
-
-@@ -1543,7 +1549,7 @@ static void tc_phy_write(struct net_devi
-
- static void tc35815_phy_chip_init(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
- static int first = 1;
- unsigned short ctl;
-@@ -1648,9 +1654,9 @@ static void tc35815_chip_reset(struct ne
-
- static void tc35815_chip_init(struct net_device *dev)
- {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-+ struct tc35815_local *lp = dev->priv;
- struct tc35815_regs *tr = (struct tc35815_regs*)dev->base_addr;
-- int flags;
-+ unsigned long flags;
- unsigned long txctl = TX_CTL_CMD;
-
- tc35815_phy_chip_init(dev);
-@@ -1696,40 +1702,6 @@ static void tc35815_chip_init(struct net
- spin_unlock_irqrestore(&lp->lock, flags);
- }
-
--static int tc35815_proc_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data)
--{
-- int len = 0;
-- off_t pos = 0;
-- off_t begin = 0;
-- struct net_device *dev;
--
-- len += sprintf(buffer, "TC35815 statistics:\n");
-- for (dev = root_tc35815_dev; dev; dev = ((struct tc35815_local *)dev->priv)->next_module) {
-- struct tc35815_local *lp = (struct tc35815_local *)dev->priv;
-- len += sprintf(buffer + len,
-- "%s: tx_ints %d, rx_ints %d, max_tx_qlen %d\n",
-- dev->name,
-- lp->lstats.tx_ints,
-- lp->lstats.rx_ints,
-- lp->lstats.max_tx_qlen);
-- pos = begin + len;
--
-- if (pos < offset) {
-- len = 0;
-- begin = pos;
-- }
--
-- if (pos > offset+length) break;
-- }
--
-- *start = buffer + (offset - begin);
-- len -= (offset - begin);
--
-- if (len > length) len = length;
--
-- return len;
--}
--
- /* XXX */
- void
- tc35815_killall(void)
---- linux-2.6.0/drivers/net/tg3.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/tg3.c 2003-12-28 23:21:01.000000000 -0800
-@@ -56,8 +56,8 @@
-
- #define DRV_MODULE_NAME "tg3"
- #define PFX DRV_MODULE_NAME ": "
--#define DRV_MODULE_VERSION "2.3"
--#define DRV_MODULE_RELDATE "November 5, 2003"
-+#define DRV_MODULE_VERSION "2.4"
-+#define DRV_MODULE_RELDATE "December 2, 2003"
-
- #define TG3_DEF_MAC_MODE 0
- #define TG3_DEF_RX_MODE 0
-@@ -176,6 +176,10 @@ static struct pci_device_id tg3_pci_tbl[
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
- { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-+ { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5704S_2,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-+ { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705F,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
- { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
- { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX,
-@@ -2475,6 +2479,13 @@ static irqreturn_t tg3_interrupt(int irq
- static int tg3_init_hw(struct tg3 *);
- static int tg3_halt(struct tg3 *);
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void tg3_poll_controller(struct net_device *dev)
-+{
-+ tg3_interrupt(dev->irq, dev, NULL);
-+}
-+#endif
-+
- static void tg3_reset_task(void *_data)
- {
- struct tg3 *tp = _data;
-@@ -2688,7 +2699,13 @@ static int tg3_start_xmit_4gbug(struct s
- mss |= (tsflags << 11);
- }
- } else {
-- mss += tcp_opt_len;
-+ if (tcp_opt_len || skb->nh.iph->ihl > 5) {
-+ int tsflags;
-+
-+ tsflags = ((skb->nh.iph->ihl - 5) +
-+ (tcp_opt_len >> 2));
-+ base_flags |= tsflags << 12;
-+ }
- }
- }
- #else
-@@ -2895,7 +2912,13 @@ static int tg3_start_xmit(struct sk_buff
- mss |= (tsflags << 11);
- }
- } else {
-- mss += tcp_opt_len;
-+ if (tcp_opt_len || skb->nh.iph->ihl > 5) {
-+ int tsflags;
-+
-+ tsflags = ((skb->nh.iph->ihl - 5) +
-+ (tcp_opt_len >> 2));
-+ base_flags |= tsflags << 12;
-+ }
- }
- }
- #else
-@@ -3860,180 +3883,181 @@ static int tg3_load_5701_a0_firmware_fix
- #if TG3_TSO_SUPPORT != 0
-
- #define TG3_TSO_FW_RELEASE_MAJOR 0x1
--#define TG3_TSO_FW_RELASE_MINOR 0x3
-+#define TG3_TSO_FW_RELASE_MINOR 0x4
- #define TG3_TSO_FW_RELEASE_FIX 0x0
- #define TG3_TSO_FW_START_ADDR 0x08000000
- #define TG3_TSO_FW_TEXT_ADDR 0x08000000
--#define TG3_TSO_FW_TEXT_LEN 0x1ac0
--#define TG3_TSO_FW_RODATA_ADDR 0x08001650
-+#define TG3_TSO_FW_TEXT_LEN 0x1a90
-+#define TG3_TSO_FW_RODATA_ADDR 0x08001a900
- #define TG3_TSO_FW_RODATA_LEN 0x60
--#define TG3_TSO_FW_DATA_ADDR 0x080016a0
-+#define TG3_TSO_FW_DATA_ADDR 0x08001b20
- #define TG3_TSO_FW_DATA_LEN 0x20
--#define TG3_TSO_FW_SBSS_ADDR 0x080016c0
-+#define TG3_TSO_FW_SBSS_ADDR 0x08001b40
- #define TG3_TSO_FW_SBSS_LEN 0x2c
--#define TG3_TSO_FW_BSS_ADDR 0x080016e0
--#define TG3_TSO_FW_BSS_LEN 0x890
-+#define TG3_TSO_FW_BSS_ADDR 0x08001b70
-+#define TG3_TSO_FW_BSS_LEN 0x894
-
- static u32 tg3TsoFwText[] = {
- 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c1d0800,
- 0x37bd4000, 0x03a0f021, 0x3c100800, 0x26100000, 0x0e000010, 0x00000000,
- 0x0000000d, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0x3c04fefe,
-- 0xafbf0018, 0x0e0005e0, 0x34840002, 0x0e000670, 0x00000000, 0x3c030800,
-- 0x90631b78, 0x24020002, 0x3c040800, 0x24841acc, 0x14620003, 0x24050001,
-- 0x3c040800, 0x24841ac0, 0x24060002, 0x00003821, 0xafa00010, 0x0e000684,
-+ 0xafbf0018, 0x0e0005d4, 0x34840002, 0x0e000664, 0x00000000, 0x3c030800,
-+ 0x90631b58, 0x24020002, 0x3c040800, 0x24841a9c, 0x14620003, 0x24050001,
-+ 0x3c040800, 0x24841a90, 0x24060003, 0x00003821, 0xafa00010, 0x0e000678,
- 0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001,
- 0xaf625c90, 0x2402ffff, 0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008,
-- 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf0018,
-- 0xafb10014, 0x0e000052, 0xafb00010, 0x24110001, 0x8f706820, 0x32020100,
-- 0x10400003, 0x00000000, 0x0e0000b2, 0x00000000, 0x8f706820, 0x32022000,
-- 0x10400004, 0x32020001, 0x0e0001e3, 0x24040001, 0x32020001, 0x10400003,
-- 0x00000000, 0x0e00009a, 0x00000000, 0x0a00003a, 0xaf715028, 0x8fbf0018,
-- 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800,
-- 0x24841ae0, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
-- 0x0e000684, 0xafa00014, 0x3c040800, 0x248423e8, 0xa4800000, 0x3c010800,
-- 0xa0201ba8, 0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb0, 0x3c010800,
-- 0xac201bb4, 0x3c010800, 0xac201bbc, 0x3c010800, 0xac201bc8, 0x3c010800,
-- 0xac201bcc, 0x8f624434, 0x3c010800, 0xac221b98, 0x8f624438, 0x3c010800,
-- 0xac221b9c, 0x8f624410, 0xac80f7a8, 0x3c010800, 0xac201b94, 0x3c010800,
-- 0xac2023f0, 0x3c010800, 0xac2023d8, 0x3c010800, 0xac2023dc, 0x3c010800,
-- 0xac202410, 0x3c010800, 0xac221ba0, 0x8f620068, 0x24030007, 0x00021702,
-- 0x10430005, 0x00000000, 0x8f620068, 0x00021702, 0x14400004, 0x24020001,
-- 0x3c010800, 0x0a00008e, 0xac20241c, 0xac820034, 0x3c040800, 0x24841aec,
-- 0x3c050800, 0x8ca5241c, 0x00003021, 0x00003821, 0xafa00010, 0x0e000684,
-- 0xafa00014, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800,
-- 0x24841af8, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
-- 0x0e000684, 0xafa00014, 0x0e000052, 0x00000000, 0x0e0000ab, 0x00002021,
-- 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001, 0x8f636820, 0x00821004,
-- 0x00021027, 0x00621824, 0x03e00008, 0xaf636820, 0x27bdffd0, 0xafbf002c,
-- 0xafb60028, 0xafb50024, 0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014,
-- 0xafb00010, 0x8f665c5c, 0x3c030800, 0x24631bcc, 0x8c620000, 0x14460005,
-- 0x3c0200ff, 0x3c020800, 0x90421ba8, 0x14400115, 0x3c0200ff, 0x3442fff8,
-- 0x00c28824, 0xac660000, 0x00111902, 0x306300ff, 0x30c20003, 0x000211c0,
-- 0x00623825, 0x00e02821, 0x00061602, 0x3c030800, 0x90631ba8, 0x3044000f,
-- 0x1460002b, 0x00804021, 0x24020001, 0x3c010800, 0xa0221ba8, 0x00071100,
-- 0x00821025, 0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb0, 0x3c010800,
-- 0xac201bb4, 0x3c010800, 0xac201bbc, 0x3c010800, 0xac201bc8, 0x3c010800,
-- 0xac201bc0, 0x3c010800, 0xac201bc4, 0x3c010800, 0xa42223e8, 0x9623000c,
-- 0x30628000, 0x10400008, 0x30627fff, 0x2442003e, 0x3c010800, 0xa4221ba6,
-- 0x24020001, 0x3c010800, 0x0a0000f9, 0xac222404, 0x24620036, 0x3c010800,
-- 0xa4221ba6, 0x3c010800, 0xac202404, 0x3c010800, 0xac202400, 0x3c010800,
-- 0x0a000101, 0xac202408, 0x9622000c, 0x3c010800, 0xa42223fc, 0x3c040800,
-- 0x24841bac, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac311bd8,
-- 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac261bdc, 0x8c820000,
-- 0x24a30001, 0x306701ff, 0x00021100, 0x3c010800, 0x00220821, 0xac271be0,
-- 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac281be4, 0x96230008,
-- 0x3c020800, 0x8c421bbc, 0x00432821, 0x3c010800, 0xac251bbc, 0x9622000a,
-- 0x30420004, 0x14400018, 0x00071100, 0x8f630c14, 0x3063000f, 0x2c620002,
-- 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800, 0x8c421b50, 0x3063000f,
-- 0x24420001, 0x3c010800, 0xac221b50, 0x2c620002, 0x1040fff7, 0x3c02c000,
-- 0x00c21825, 0xaf635c5c, 0x8f625c50, 0x30420002, 0x10400014, 0x00000000,
-- 0x0a000133, 0x00000000, 0x3c030800, 0x8c631b90, 0x3c040800, 0x94841ba4,
-- 0x01021025, 0x3c010800, 0xa42223ea, 0x24020001, 0x3c010800, 0xac221bc8,
-- 0x24630001, 0x0085202a, 0x3c010800, 0x10800003, 0xac231b90, 0x3c010800,
-- 0xa4251ba4, 0x3c060800, 0x24c61bac, 0x8cc20000, 0x24420001, 0xacc20000,
-- 0x28420080, 0x14400005, 0x00000000, 0x0e00065e, 0x24040002, 0x0a0001d9,
-- 0x00000000, 0x3c020800, 0x8c421bc8, 0x1040007f, 0x24020001, 0x3c040800,
-- 0x90841ba8, 0x14820077, 0x24020003, 0x3c150800, 0x96b51ba6, 0x3c050800,
-- 0x8ca51bbc, 0x32a3ffff, 0x00a3102a, 0x14400073, 0x00000000, 0x14a30003,
-- 0x00000000, 0x3c010800, 0xac242400, 0x10600061, 0x00009021, 0x24d60004,
-- 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100, 0x3c110800, 0x02308821,
-- 0x0e00062d, 0x8e311bd8, 0x00403021, 0x10c00059, 0x00000000, 0x9628000a,
-- 0x31020040, 0x10400004, 0x2407180c, 0x8e22000c, 0x2407188c, 0xacc20018,
-- 0x31021000, 0x10400004, 0x34e32000, 0x00081040, 0x3042c000, 0x00623825,
-- 0x3c030800, 0x00701821, 0x8c631be0, 0x3c020800, 0x00501021, 0x8c421be4,
-- 0x00031d00, 0x00021400, 0x00621825, 0xacc30014, 0x8ec30004, 0x96220008,
-- 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021, 0x0282102a, 0x14400002,
-- 0x02b22823, 0x00802821, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000,
-- 0x8e220000, 0xacc20000, 0x8e220004, 0x8e63fff4, 0x00431021, 0xacc20004,
-- 0xa4c5000e, 0x8e62fff4, 0x00441021, 0xae62fff4, 0x96230008, 0x0043102a,
-- 0x14400005, 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0xae62fff0,
-- 0xacc00008, 0x3242ffff, 0x14540008, 0x24020305, 0x31020080, 0x54400001,
-- 0x34e70010, 0x24020905, 0xa4c2000c, 0x0a0001bc, 0x34e70020, 0xa4c2000c,
-- 0x3c020800, 0x8c422400, 0x10400003, 0x3c024b65, 0x0a0001c4, 0x34427654,
-- 0x3c02b49a, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005aa,
-- 0x00c02021, 0x3242ffff, 0x0054102b, 0x1440ffa4, 0x00000000, 0x24020002,
-- 0x3c010800, 0x0a0001d9, 0xa0221ba8, 0x8ec2083c, 0x24420001, 0x0a0001d9,
-- 0xaec2083c, 0x14820003, 0x00000000, 0x0e0004b9, 0x00000000, 0x8fbf002c,
-+ 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c,
-+ 0xafb20018, 0xafb10014, 0x0e00005b, 0xafb00010, 0x24120002, 0x24110001,
-+ 0x8f706820, 0x32020100, 0x10400003, 0x00000000, 0x0e0000bb, 0x00000000,
-+ 0x8f706820, 0x32022000, 0x10400004, 0x32020001, 0x0e0001ef, 0x24040001,
-+ 0x32020001, 0x10400003, 0x00000000, 0x0e0000a3, 0x00000000, 0x3c020800,
-+ 0x90421b88, 0x14520003, 0x00000000, 0x0e0004bf, 0x00000000, 0x0a00003c,
-+ 0xaf715028, 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008,
-+ 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ab0, 0x00002821, 0x00003021,
-+ 0x00003821, 0xafbf0018, 0xafa00010, 0x0e000678, 0xafa00014, 0x3c040800,
-+ 0x248423c8, 0xa4800000, 0x3c010800, 0xa0201b88, 0x3c010800, 0xac201b8c,
-+ 0x3c010800, 0xac201b90, 0x3c010800, 0xac201b94, 0x3c010800, 0xac201b9c,
-+ 0x3c010800, 0xac201ba8, 0x3c010800, 0xac201bac, 0x8f624434, 0x3c010800,
-+ 0xac221b78, 0x8f624438, 0x3c010800, 0xac221b7c, 0x8f624410, 0xac80f7a8,
-+ 0x3c010800, 0xac201b74, 0x3c010800, 0xac2023d0, 0x3c010800, 0xac2023b8,
-+ 0x3c010800, 0xac2023bc, 0x3c010800, 0xac2023f0, 0x3c010800, 0xac221b80,
-+ 0x8f620068, 0x24030007, 0x00021702, 0x10430005, 0x00000000, 0x8f620068,
-+ 0x00021702, 0x14400004, 0x24020001, 0x3c010800, 0x0a000097, 0xac2023fc,
-+ 0xac820034, 0x3c040800, 0x24841abc, 0x3c050800, 0x8ca523fc, 0x00003021,
-+ 0x00003821, 0xafa00010, 0x0e000678, 0xafa00014, 0x8fbf0018, 0x03e00008,
-+ 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841ac8, 0x00002821, 0x00003021,
-+ 0x00003821, 0xafbf0018, 0xafa00010, 0x0e000678, 0xafa00014, 0x0e00005b,
-+ 0x00000000, 0x0e0000b4, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020,
-+ 0x24020001, 0x8f636820, 0x00821004, 0x00021027, 0x00621824, 0x03e00008,
-+ 0xaf636820, 0x27bdffd0, 0xafbf002c, 0xafb60028, 0xafb50024, 0xafb40020,
-+ 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f675c5c, 0x3c030800,
-+ 0x24631bac, 0x8c620000, 0x14470005, 0x3c0200ff, 0x3c020800, 0x90421b88,
-+ 0x14400118, 0x3c0200ff, 0x3442fff8, 0x00e28824, 0xac670000, 0x00111902,
-+ 0x306300ff, 0x30e20003, 0x000211c0, 0x00622825, 0x00a04021, 0x00071602,
-+ 0x3c030800, 0x90631b88, 0x3044000f, 0x14600036, 0x00804821, 0x24020001,
-+ 0x3c010800, 0xa0221b88, 0x00051100, 0x00821025, 0x3c010800, 0xac201b8c,
-+ 0x3c010800, 0xac201b90, 0x3c010800, 0xac201b94, 0x3c010800, 0xac201b9c,
-+ 0x3c010800, 0xac201ba8, 0x3c010800, 0xac201ba0, 0x3c010800, 0xac201ba4,
-+ 0x3c010800, 0xa42223c8, 0x9622000c, 0x30437fff, 0x3c010800, 0xa4222400,
-+ 0x30428000, 0x3c010800, 0xa4231bb6, 0x10400005, 0x24020001, 0x3c010800,
-+ 0xac2223e4, 0x0a000102, 0x2406003e, 0x24060036, 0x3c010800, 0xac2023e4,
-+ 0x9622000a, 0x3c030800, 0x94631bb6, 0x3c010800, 0xac2023e0, 0x3c010800,
-+ 0xac2023e8, 0x00021302, 0x00021080, 0x00c21021, 0x00621821, 0x3c010800,
-+ 0xa42223c0, 0x3c010800, 0x0a000115, 0xa4231b86, 0x9622000c, 0x3c010800,
-+ 0xa42223dc, 0x3c040800, 0x24841b8c, 0x8c820000, 0x00021100, 0x3c010800,
-+ 0x00220821, 0xac311bb8, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
-+ 0xac271bbc, 0x8c820000, 0x25030001, 0x306601ff, 0x00021100, 0x3c010800,
-+ 0x00220821, 0xac261bc0, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821,
-+ 0xac291bc4, 0x96230008, 0x3c020800, 0x8c421b9c, 0x00432821, 0x3c010800,
-+ 0xac251b9c, 0x9622000a, 0x30420004, 0x14400018, 0x00061100, 0x8f630c14,
-+ 0x3063000f, 0x2c620002, 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800,
-+ 0x8c421b30, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b30, 0x2c620002,
-+ 0x1040fff7, 0x3c02c000, 0x00e21825, 0xaf635c5c, 0x8f625c50, 0x30420002,
-+ 0x10400014, 0x00000000, 0x0a000147, 0x00000000, 0x3c030800, 0x8c631b70,
-+ 0x3c040800, 0x94841b84, 0x01221025, 0x3c010800, 0xa42223ca, 0x24020001,
-+ 0x3c010800, 0xac221ba8, 0x24630001, 0x0085202a, 0x3c010800, 0x10800003,
-+ 0xac231b70, 0x3c010800, 0xa4251b84, 0x3c060800, 0x24c61b8c, 0x8cc20000,
-+ 0x24420001, 0xacc20000, 0x28420080, 0x14400005, 0x00000000, 0x0e000652,
-+ 0x24040002, 0x0a0001e5, 0x00000000, 0x3c020800, 0x8c421ba8, 0x10400077,
-+ 0x24020001, 0x3c050800, 0x90a51b88, 0x14a20071, 0x00000000, 0x3c150800,
-+ 0x96b51b86, 0x3c040800, 0x8c841b9c, 0x32a3ffff, 0x0083102a, 0x1440006b,
-+ 0x00000000, 0x14830003, 0x00000000, 0x3c010800, 0xac2523e0, 0x1060005b,
-+ 0x00009021, 0x24d60004, 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100,
-+ 0x3c110800, 0x02308821, 0x0e000621, 0x8e311bb8, 0x00402821, 0x10a00053,
-+ 0x00000000, 0x9628000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e22000c,
-+ 0x2407188c, 0xaca20018, 0x3c030800, 0x00701821, 0x8c631bc0, 0x3c020800,
-+ 0x00501021, 0x8c421bc4, 0x00031d00, 0x00021400, 0x00621825, 0xaca30014,
-+ 0x8ec30004, 0x96220008, 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021,
-+ 0x0282102a, 0x14400002, 0x02b23023, 0x00803021, 0x8e620000, 0x30c4ffff,
-+ 0x00441021, 0xae620000, 0x8e220000, 0xaca20000, 0x8e220004, 0x8e63fff4,
-+ 0x00431021, 0xaca20004, 0xa4a6000e, 0x8e62fff4, 0x00441021, 0xae62fff4,
-+ 0x96230008, 0x0043102a, 0x14400005, 0x02469021, 0x8e62fff0, 0xae60fff4,
-+ 0x24420001, 0xae62fff0, 0xaca00008, 0x3242ffff, 0x14540008, 0x24020305,
-+ 0x31020080, 0x54400001, 0x34e70010, 0x24020905, 0xa4a2000c, 0x0a0001ca,
-+ 0x34e70020, 0xa4a2000c, 0x3c020800, 0x8c4223e0, 0x10400003, 0x3c024b65,
-+ 0x0a0001d2, 0x34427654, 0x3c02b49a, 0x344289ab, 0xaca2001c, 0x30e2ffff,
-+ 0xaca20010, 0x0e00059f, 0x00a02021, 0x3242ffff, 0x0054102b, 0x1440ffaa,
-+ 0x00000000, 0x24020002, 0x3c010800, 0x0a0001e5, 0xa0221b88, 0x8ec2083c,
-+ 0x24420001, 0x0a0001e5, 0xaec2083c, 0x0e0004bf, 0x00000000, 0x8fbf002c,
- 0x8fb60028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014,
- 0x8fb00010, 0x03e00008, 0x27bd0030, 0x27bdffd0, 0xafbf0028, 0xafb30024,
- 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff, 0x3442fff8,
-- 0x3c060800, 0x24c61bc4, 0x02428824, 0x9623000e, 0x8cc20000, 0x00431021,
-- 0xacc20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821, 0x0e000643,
-+ 0x3c060800, 0x24c61ba4, 0x02428824, 0x9623000e, 0x8cc20000, 0x00431021,
-+ 0xacc20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821, 0x0e000637,
- 0x02202021, 0x3c02c000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002,
- 0x10400121, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1040011c,
-- 0x00000000, 0x0a000200, 0x00000000, 0x8e240008, 0x8e230014, 0x00041402,
-+ 0x00000000, 0x0a00020c, 0x00000000, 0x8e240008, 0x8e230014, 0x00041402,
- 0x000241c0, 0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f, 0x00031942,
- 0x30637800, 0x00021100, 0x24424000, 0x00625021, 0x9542000a, 0x3084ffff,
-- 0x30420008, 0x104000b3, 0x000429c0, 0x3c020800, 0x8c422410, 0x1440002d,
-- 0x25050008, 0x95020014, 0x3c010800, 0xa42223e0, 0x8d070010, 0x00071402,
-- 0x3c010800, 0xa42223e2, 0x3c010800, 0xa42723e4, 0x9502000e, 0x30e3ffff,
-- 0x00431023, 0x3c010800, 0xac222418, 0x8f626800, 0x3c030010, 0x00431024,
-- 0x10400005, 0x00000000, 0x9503001a, 0x9502001c, 0x0a000235, 0x00431021,
-- 0x9502001a, 0x3c010800, 0xac22240c, 0x3c02c000, 0x02421825, 0x3c010800,
-- 0xac282410, 0x3c010800, 0xac322414, 0xaf635c9c, 0x8f625c90, 0x30420002,
-+ 0x30420008, 0x104000b3, 0x000429c0, 0x3c020800, 0x8c4223f0, 0x1440002d,
-+ 0x25050008, 0x95020014, 0x3c010800, 0xa42223c0, 0x8d070010, 0x00071402,
-+ 0x3c010800, 0xa42223c2, 0x3c010800, 0xa42723c4, 0x9502000e, 0x30e3ffff,
-+ 0x00431023, 0x3c010800, 0xac2223f8, 0x8f626800, 0x3c030010, 0x00431024,
-+ 0x10400005, 0x00000000, 0x9503001a, 0x9502001c, 0x0a000241, 0x00431021,
-+ 0x9502001a, 0x3c010800, 0xac2223ec, 0x3c02c000, 0x02421825, 0x3c010800,
-+ 0xac2823f0, 0x3c010800, 0xac3223f4, 0xaf635c9c, 0x8f625c90, 0x30420002,
- 0x104000df, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000da,
-- 0x00000000, 0x0a000242, 0x00000000, 0x9502000e, 0x3c030800, 0x946323e4,
-+ 0x00000000, 0x0a00024e, 0x00000000, 0x9502000e, 0x3c030800, 0x946323c4,
- 0x00434823, 0x3123ffff, 0x2c620008, 0x1040001c, 0x00000000, 0x95020014,
- 0x24420028, 0x00a22821, 0x00031042, 0x1840000b, 0x00002021, 0x24c60848,
- 0x00403821, 0x94a30000, 0x8cc20000, 0x24840001, 0x00431021, 0xacc20000,
- 0x0087102a, 0x1440fff9, 0x24a50002, 0x31220001, 0x1040001f, 0x3c024000,
-- 0x3c040800, 0x2484240c, 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021,
-- 0x0a000281, 0xac820000, 0x8f626800, 0x3c030010, 0x00431024, 0x10400009,
-- 0x00000000, 0x9502001a, 0x3c030800, 0x8c63240c, 0x00431021, 0x3c010800,
-- 0xac22240c, 0x0a000282, 0x3c024000, 0x9502001a, 0x9504001c, 0x3c030800,
-- 0x8c63240c, 0x00441023, 0x00621821, 0x3c010800, 0xac23240c, 0x3c024000,
-+ 0x3c040800, 0x248423ec, 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021,
-+ 0x0a00028d, 0xac820000, 0x8f626800, 0x3c030010, 0x00431024, 0x10400009,
-+ 0x00000000, 0x9502001a, 0x3c030800, 0x8c6323ec, 0x00431021, 0x3c010800,
-+ 0xac2223ec, 0x0a00028e, 0x3c024000, 0x9502001a, 0x9504001c, 0x3c030800,
-+ 0x8c6323ec, 0x00441023, 0x00621821, 0x3c010800, 0xac2323ec, 0x3c024000,
- 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000,
-- 0x9542000a, 0x30420010, 0x10400095, 0x00000000, 0x3c060800, 0x24c62410,
-- 0x3c020800, 0x944223e4, 0x8cc50000, 0x3c040800, 0x8c842418, 0x24420030,
-- 0x00a22821, 0x94a20004, 0x3c030800, 0x8c63240c, 0x00441023, 0x00621821,
-+ 0x9542000a, 0x30420010, 0x10400095, 0x00000000, 0x3c060800, 0x24c623f0,
-+ 0x3c020800, 0x944223c4, 0x8cc50000, 0x3c040800, 0x8c8423f8, 0x24420030,
-+ 0x00a22821, 0x94a20004, 0x3c030800, 0x8c6323ec, 0x00441023, 0x00621821,
- 0x00603821, 0x00032402, 0x30e2ffff, 0x00823821, 0x00071402, 0x00e23821,
-- 0x00071027, 0x3c010800, 0xac23240c, 0xa4a20006, 0x3c030800, 0x8c632414,
-+ 0x00071027, 0x3c010800, 0xac2323ec, 0xa4a20006, 0x3c030800, 0x8c6323f4,
- 0x3c0200ff, 0x3442fff8, 0x00628824, 0x96220008, 0x24040001, 0x24034000,
- 0x000241c0, 0x00e01021, 0xa502001a, 0xa500001c, 0xacc00000, 0x3c010800,
-- 0xac241b70, 0xaf635cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000,
-- 0x3c010800, 0xac201b70, 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002,
-- 0x10400003, 0x00000000, 0x3c010800, 0xac201b70, 0x3c020800, 0x8c421b70,
-- 0x1040ffec, 0x00000000, 0x3c040800, 0x0e000643, 0x8c842414, 0x0a000320,
-- 0x00000000, 0x3c030800, 0x90631ba8, 0x24020002, 0x14620003, 0x3c034b65,
-- 0x0a0002d7, 0x00008021, 0x8e22001c, 0x34637654, 0x10430002, 0x24100002,
-- 0x24100001, 0x01002021, 0x0e000346, 0x02003021, 0x24020003, 0x3c010800,
-- 0xa0221ba8, 0x24020002, 0x1202000a, 0x24020001, 0x3c030800, 0x8c632400,
-- 0x10620006, 0x00000000, 0x3c020800, 0x944223e8, 0x00021400, 0x0a000315,
-- 0xae220014, 0x3c040800, 0x248423ea, 0x94820000, 0x00021400, 0xae220014,
-- 0x3c020800, 0x8c421bcc, 0x3c03c000, 0x3c010800, 0xa0201ba8, 0x00431025,
-+ 0xac241b50, 0xaf635cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000,
-+ 0x3c010800, 0xac201b50, 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002,
-+ 0x10400003, 0x00000000, 0x3c010800, 0xac201b50, 0x3c020800, 0x8c421b50,
-+ 0x1040ffec, 0x00000000, 0x3c040800, 0x0e000637, 0x8c8423f4, 0x0a00032c,
-+ 0x00000000, 0x3c030800, 0x90631b88, 0x24020002, 0x14620003, 0x3c034b65,
-+ 0x0a0002e3, 0x00008021, 0x8e22001c, 0x34637654, 0x10430002, 0x24100002,
-+ 0x24100001, 0x01002021, 0x0e000352, 0x02003021, 0x24020003, 0x3c010800,
-+ 0xa0221b88, 0x24020002, 0x1202000a, 0x24020001, 0x3c030800, 0x8c6323e0,
-+ 0x10620006, 0x00000000, 0x3c020800, 0x944223c8, 0x00021400, 0x0a000321,
-+ 0xae220014, 0x3c040800, 0x248423ca, 0x94820000, 0x00021400, 0xae220014,
-+ 0x3c020800, 0x8c421bac, 0x3c03c000, 0x3c010800, 0xa0201b88, 0x00431025,
- 0xaf625c5c, 0x8f625c50, 0x30420002, 0x10400009, 0x00000000, 0x2484f7e2,
- 0x8c820000, 0x00431025, 0xaf625c5c, 0x8f625c50, 0x30420002, 0x1440fffa,
-- 0x00000000, 0x3c020800, 0x24421b94, 0x8c430000, 0x24630001, 0xac430000,
-+ 0x00000000, 0x3c020800, 0x24421b74, 0x8c430000, 0x24630001, 0xac430000,
- 0x8f630c14, 0x3063000f, 0x2c620002, 0x1440000c, 0x3c024000, 0x8f630c14,
-- 0x3c020800, 0x8c421b50, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b50,
-+ 0x3c020800, 0x8c421b30, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b30,
- 0x2c620002, 0x1040fff7, 0x00000000, 0x3c024000, 0x02421825, 0xaf635c9c,
- 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, 0x12600003, 0x00000000,
-- 0x0e0004b9, 0x00000000, 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c,
-- 0x8fb00018, 0x03e00008, 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b98,
-+ 0x0e0004bf, 0x00000000, 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c,
-+ 0x8fb00018, 0x03e00008, 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b78,
- 0x8c820000, 0x00031c02, 0x0043102b, 0x14400007, 0x3c038000, 0x8c840004,
- 0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444,
- 0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008,
- 0x3042ffff, 0x3c024000, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002,
- 0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, 0x27bdffe0, 0x00805821,
-- 0x14c00017, 0x256e0008, 0x3c020800, 0x8c422404, 0x1040000a, 0x2402003e,
-- 0x3c010800, 0xa42223e0, 0x24020016, 0x3c010800, 0xa42223e2, 0x2402002a,
-- 0x3c010800, 0x0a000360, 0xa42223e4, 0x95620014, 0x3c010800, 0xa42223e0,
-- 0x8d670010, 0x00071402, 0x3c010800, 0xa42223e2, 0x3c010800, 0xa42723e4,
-- 0x3c040800, 0x948423e4, 0x3c030800, 0x946323e2, 0x95cf0006, 0x3c020800,
-- 0x944223e0, 0x00832023, 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821,
-+ 0x14c00011, 0x256e0008, 0x3c020800, 0x8c4223e4, 0x10400007, 0x24020016,
-+ 0x3c010800, 0xa42223c2, 0x2402002a, 0x3c010800, 0x0a000366, 0xa42223c4,
-+ 0x8d670010, 0x00071402, 0x3c010800, 0xa42223c2, 0x3c010800, 0xa42723c4,
-+ 0x3c040800, 0x948423c4, 0x3c030800, 0x946323c2, 0x95cf0006, 0x3c020800,
-+ 0x944223c0, 0x00832023, 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821,
- 0x3082ffff, 0x14c0001a, 0x01226021, 0x9582000c, 0x3042003f, 0x3c010800,
-- 0xa42223e6, 0x95820004, 0x95830006, 0x3c010800, 0xac2023f4, 0x3c010800,
-- 0xac2023f8, 0x00021400, 0x00431025, 0x3c010800, 0xac221bd0, 0x95220004,
-- 0x3c010800, 0xa4221bd4, 0x95230002, 0x01e51023, 0x0043102a, 0x10400010,
-- 0x24020001, 0x3c010800, 0x0a000394, 0xac222408, 0x3c030800, 0x8c6323f8,
-- 0x3c020800, 0x94421bd4, 0x00431021, 0xa5220004, 0x3c020800, 0x94421bd0,
-- 0xa5820004, 0x3c020800, 0x8c421bd0, 0xa5820006, 0x3c020800, 0x8c422400,
-- 0x3c0d0800, 0x8dad23f4, 0x3c0a0800, 0x144000e5, 0x8d4a23f8, 0x3c020800,
-- 0x94421bd4, 0x004a1821, 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d,
-- 0x01435023, 0x3c020800, 0x944223e6, 0x30420009, 0x10400008, 0x00000000,
-- 0x9582000c, 0x3042fff6, 0xa582000c, 0x3c020800, 0x944223e6, 0x30420009,
-- 0x01a26823, 0x3c020800, 0x8c422408, 0x1040004a, 0x01203821, 0x3c020800,
-- 0x944223e2, 0x00004021, 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff,
-+ 0xa42223c6, 0x95820004, 0x95830006, 0x3c010800, 0xac2023d4, 0x3c010800,
-+ 0xac2023d8, 0x00021400, 0x00431025, 0x3c010800, 0xac221bb0, 0x95220004,
-+ 0x3c010800, 0xa4221bb4, 0x95230002, 0x01e51023, 0x0043102a, 0x10400010,
-+ 0x24020001, 0x3c010800, 0x0a00039a, 0xac2223e8, 0x3c030800, 0x8c6323d8,
-+ 0x3c020800, 0x94421bb4, 0x00431021, 0xa5220004, 0x3c020800, 0x94421bb0,
-+ 0xa5820004, 0x3c020800, 0x8c421bb0, 0xa5820006, 0x3c020800, 0x8c4223e0,
-+ 0x3c0d0800, 0x8dad23d4, 0x3c0a0800, 0x144000e5, 0x8d4a23d8, 0x3c020800,
-+ 0x94421bb4, 0x004a1821, 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d,
-+ 0x01435023, 0x3c020800, 0x944223c6, 0x30420009, 0x10400008, 0x00000000,
-+ 0x9582000c, 0x3042fff6, 0xa582000c, 0x3c020800, 0x944223c6, 0x30420009,
-+ 0x01a26823, 0x3c020800, 0x8c4223e8, 0x1040004a, 0x01203821, 0x3c020800,
-+ 0x944223c2, 0x00004021, 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff,
- 0x00021042, 0x18400008, 0x00003021, 0x00401821, 0x94e20000, 0x25080001,
- 0x00c23021, 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff,
- 0x00623021, 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a,
-@@ -4044,131 +4068,127 @@ static u32 tg3TsoFwText[] = {
- 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80,
- 0x00625824, 0x25670008, 0x0109102a, 0x1440fff3, 0x00000000, 0x30820001,
- 0x10400005, 0x00061c02, 0xa0e00001, 0x94e20000, 0x00c23021, 0x00061c02,
-- 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x0a000479, 0x30c6ffff,
-- 0x24020002, 0x14c20081, 0x00000000, 0x3c020800, 0x8c42241c, 0x14400007,
-- 0x00000000, 0x3c020800, 0x944223e2, 0x95230002, 0x01e21023, 0x10620077,
-- 0x00000000, 0x3c020800, 0x944223e2, 0x01e21023, 0xa5220002, 0x3c020800,
-- 0x8c42241c, 0x1040001a, 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421ba6,
-+ 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x0a00047f, 0x30c6ffff,
-+ 0x24020002, 0x14c20081, 0x00000000, 0x3c020800, 0x8c4223fc, 0x14400007,
-+ 0x00000000, 0x3c020800, 0x944223c2, 0x95230002, 0x01e21023, 0x10620077,
-+ 0x00000000, 0x3c020800, 0x944223c2, 0x01e21023, 0xa5220002, 0x3c020800,
-+ 0x8c4223fc, 0x1040001a, 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421b86,
- 0x00e04021, 0x00072c02, 0x00aa2021, 0x00431023, 0x00823823, 0x00072402,
- 0x30e2ffff, 0x00823821, 0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800,
-- 0x948423e4, 0x00453023, 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021,
-- 0x00061c02, 0x30c2ffff, 0x0a000479, 0x00623021, 0x01203821, 0x00004021,
-+ 0x948423c4, 0x00453023, 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021,
-+ 0x00061c02, 0x30c2ffff, 0x0a00047f, 0x00623021, 0x01203821, 0x00004021,
- 0x3082ffff, 0x00021042, 0x18400008, 0x00003021, 0x00401821, 0x94e20000,
- 0x25080001, 0x00c23021, 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02,
- 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c02821, 0x00061027,
- 0xa522000a, 0x00003021, 0x2527000c, 0x00004021, 0x94e20000, 0x25080001,
- 0x00c23021, 0x2d020004, 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021,
- 0x91230009, 0x00442023, 0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800,
-- 0x948423e4, 0x00621821, 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021,
-- 0x00061c02, 0x3c020800, 0x944223e0, 0x00c34821, 0x00441023, 0x00021fc2,
-+ 0x948423c4, 0x00621821, 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021,
-+ 0x00061c02, 0x3c020800, 0x944223c0, 0x00c34821, 0x00441023, 0x00021fc2,
- 0x00431021, 0x00021043, 0x18400010, 0x00003021, 0x00402021, 0x94e20000,
- 0x24e70002, 0x00c23021, 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000,
- 0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008, 0x0104102a, 0x1440fff3,
-- 0x00000000, 0x3c020800, 0x944223fc, 0x00c23021, 0x3122ffff, 0x00c23021,
-+ 0x00000000, 0x3c020800, 0x944223dc, 0x00c23021, 0x3122ffff, 0x00c23021,
- 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c04021,
-- 0x00061027, 0xa5820010, 0xadc00014, 0x0a000499, 0xadc00000, 0x8dc70010,
-+ 0x00061027, 0xa5820010, 0xadc00014, 0x0a00049f, 0xadc00000, 0x8dc70010,
- 0x00e04021, 0x11400007, 0x00072c02, 0x00aa3021, 0x00061402, 0x30c3ffff,
- 0x00433021, 0x00061402, 0x00c22821, 0x00051027, 0xa522000a, 0x3c030800,
-- 0x946323e4, 0x3102ffff, 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02,
-+ 0x946323c4, 0x3102ffff, 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02,
- 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, 0x00061027,
- 0xa5820010, 0x3102ffff, 0x00051c00, 0x00431025, 0xadc20010, 0x3c020800,
-- 0x8c422404, 0x10400002, 0x25e2fff2, 0xa5c20034, 0x3c020800, 0x8c4223f8,
-- 0x3c040800, 0x8c8423f4, 0x24420001, 0x3c010800, 0xac2223f8, 0x3c020800,
-- 0x8c421bd0, 0x3303ffff, 0x00832021, 0x3c010800, 0xac2423f4, 0x00431821,
-- 0x0062102b, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223f4, 0x3c010800,
-- 0xac231bd0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800, 0x24a51ba8,
-+ 0x8c4223e4, 0x10400002, 0x25e2fff2, 0xa5c20034, 0x3c020800, 0x8c4223d8,
-+ 0x3c040800, 0x8c8423d4, 0x24420001, 0x3c010800, 0xac2223d8, 0x3c020800,
-+ 0x8c421bb0, 0x3303ffff, 0x00832021, 0x3c010800, 0xac2423d4, 0x00431821,
-+ 0x0062102b, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223d4, 0x3c010800,
-+ 0xac231bb0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800, 0x24a51b86,
- 0xafbf0044, 0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034, 0xafb40030,
-- 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x90a30000, 0x24020003,
-- 0x146200d5, 0x00000000, 0x3c090800, 0x95291ba6, 0x3c020800, 0x944223e0,
-- 0x3c030800, 0x8c631bc0, 0x3c040800, 0x8c841bbc, 0x01221023, 0x0064182a,
-- 0xa7a9001e, 0x106000c8, 0xa7a20016, 0x24be0020, 0x97b6001e, 0x24b30018,
-- 0x24b70014, 0x8fc20000, 0x14400008, 0x00000000, 0x8fc2fff8, 0x97a30016,
-- 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000ba, 0x00000000, 0x97d50818,
-- 0x32a2ffff, 0x104000ad, 0x00009021, 0x0040a021, 0x00008821, 0x0e00062d,
-- 0x00000000, 0x00403021, 0x14c00007, 0x00000000, 0x3c020800, 0x8c4223ec,
-- 0x24420001, 0x3c010800, 0x0a00059e, 0xac2223ec, 0x3c100800, 0x02118021,
-- 0x8e101bd8, 0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c,
-- 0x2407188c, 0xacc20018, 0x31021000, 0x10400004, 0x34e32000, 0x00081040,
-- 0x3042c000, 0x00623825, 0x31020080, 0x54400001, 0x34e70010, 0x3c020800,
-- 0x00511021, 0x8c421be0, 0x3c030800, 0x00711821, 0x8c631be4, 0x00021500,
-- 0x00031c00, 0x00431025, 0xacc20014, 0x96040008, 0x3242ffff, 0x00821021,
-- 0x0282102a, 0x14400002, 0x02b22823, 0x00802821, 0x8e020000, 0x02459021,
-- 0xacc20000, 0x8e020004, 0x00c02021, 0x26310010, 0xac820004, 0x30e2ffff,
-- 0xac800008, 0xa485000e, 0xac820010, 0x24020305, 0x0e0005aa, 0xa482000c,
-- 0x3242ffff, 0x0054102b, 0x1440ffc0, 0x3242ffff, 0x0a000596, 0x00000000,
-- 0x8e620000, 0x8e63fffc, 0x0043102a, 0x1040006c, 0x00000000, 0x8e62fff0,
-- 0x00028900, 0x3c100800, 0x02118021, 0x0e00062d, 0x8e101bd8, 0x00403021,
-- 0x14c00005, 0x00000000, 0x8e62082c, 0x24420001, 0x0a00059e, 0xae62082c,
-- 0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c, 0x2407188c,
-- 0xacc20018, 0x31021000, 0x10400004, 0x34e32000, 0x00081040, 0x3042c000,
-- 0x00623825, 0x3c020800, 0x00511021, 0x8c421be0, 0x3c030800, 0x00711821,
-- 0x8c631be4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4,
-- 0x96020008, 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021, 0x02c2102a,
-- 0x10400003, 0x00802821, 0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff,
-- 0x00441021, 0xae620000, 0xa4c5000e, 0x8e020000, 0xacc20000, 0x8e020004,
-- 0x8e63fff4, 0x00431021, 0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821,
-- 0x0062102a, 0x14400006, 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001,
-- 0x0a000579, 0xae62fff0, 0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003,
-- 0x31020004, 0x10400006, 0x24020305, 0x31020080, 0x54400001, 0x34e70010,
-- 0x34e70020, 0x24020905, 0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007,
-- 0x3c02b49a, 0x8ee20860, 0x54400001, 0x34e70400, 0x3c024b65, 0x0a000590,
-- 0x34427654, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005aa,
-- 0x00c02021, 0x3242ffff, 0x0056102b, 0x1440ff96, 0x00000000, 0x8e620000,
-- 0x8e63fffc, 0x0043102a, 0x1440ff3e, 0x00000000, 0x8fbf0044, 0x8fbe0040,
-- 0x8fb7003c, 0x8fb60038, 0x8fb50034, 0x8fb40030, 0x8fb3002c, 0x8fb20028,
-- 0x8fb10024, 0x8fb00020, 0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014,
-- 0xafb00010, 0x8f624450, 0x8f634410, 0x0a0005b9, 0x00808021, 0x8f626820,
-- 0x30422000, 0x10400003, 0x00000000, 0x0e0001e3, 0x00002021, 0x8f624450,
-- 0x8f634410, 0x3042ffff, 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14,
-- 0x3063000f, 0x2c620002, 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800,
-- 0x8c421b50, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b50, 0x2c620002,
-- 0x1040fff7, 0x00000000, 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009,
-- 0x00000000, 0x8f626820, 0x30422000, 0x1040fff8, 0x00000000, 0x0e0001e3,
-- 0x00002021, 0x0a0005cc, 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008,
-- 0x27bd0018, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000,
-+ 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x94a90000, 0x3c020800,
-+ 0x944223c0, 0x3c030800, 0x8c631ba0, 0x3c040800, 0x8c841b9c, 0x01221023,
-+ 0x0064182a, 0xa7a9001e, 0x106000bc, 0xa7a20016, 0x24be0022, 0x97b6001e,
-+ 0x24b3001a, 0x24b70016, 0x8fc20000, 0x14400008, 0x00000000, 0x8fc2fff8,
-+ 0x97a30016, 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000ae, 0x00000000,
-+ 0x97d50818, 0x32a2ffff, 0x104000a1, 0x00009021, 0x0040a021, 0x00008821,
-+ 0x0e000621, 0x00000000, 0x00403021, 0x14c00007, 0x00000000, 0x3c020800,
-+ 0x8c4223cc, 0x24420001, 0x3c010800, 0x0a000593, 0xac2223cc, 0x3c100800,
-+ 0x02118021, 0x8e101bb8, 0x9608000a, 0x31020040, 0x10400004, 0x2407180c,
-+ 0x8e02000c, 0x2407188c, 0xacc20018, 0x31020080, 0x54400001, 0x34e70010,
-+ 0x3c020800, 0x00511021, 0x8c421bc0, 0x3c030800, 0x00711821, 0x8c631bc4,
-+ 0x00021500, 0x00031c00, 0x00431025, 0xacc20014, 0x96040008, 0x3242ffff,
-+ 0x00821021, 0x0282102a, 0x14400002, 0x02b22823, 0x00802821, 0x8e020000,
-+ 0x02459021, 0xacc20000, 0x8e020004, 0x00c02021, 0x26310010, 0xac820004,
-+ 0x30e2ffff, 0xac800008, 0xa485000e, 0xac820010, 0x24020305, 0x0e00059f,
-+ 0xa482000c, 0x3242ffff, 0x0054102b, 0x1440ffc6, 0x3242ffff, 0x0a00058b,
-+ 0x00000000, 0x8e620000, 0x8e63fffc, 0x0043102a, 0x10400066, 0x00000000,
-+ 0x8e62fff0, 0x00028900, 0x3c100800, 0x02118021, 0x0e000621, 0x8e101bb8,
-+ 0x00403021, 0x14c00005, 0x00000000, 0x8e62082c, 0x24420001, 0x0a000593,
-+ 0xae62082c, 0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c,
-+ 0x2407188c, 0xacc20018, 0x3c020800, 0x00511021, 0x8c421bc0, 0x3c030800,
-+ 0x00711821, 0x8c631bc4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014,
-+ 0x8e63fff4, 0x96020008, 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021,
-+ 0x02c2102a, 0x10400003, 0x00802821, 0x97a9001e, 0x01322823, 0x8e620000,
-+ 0x30a4ffff, 0x00441021, 0xae620000, 0xa4c5000e, 0x8e020000, 0xacc20000,
-+ 0x8e020004, 0x8e63fff4, 0x00431021, 0xacc20004, 0x8e63fff4, 0x96020008,
-+ 0x00641821, 0x0062102a, 0x14400006, 0x02459021, 0x8e62fff0, 0xae60fff4,
-+ 0x24420001, 0x0a00056e, 0xae62fff0, 0xae63fff4, 0xacc00008, 0x3242ffff,
-+ 0x10560003, 0x31020004, 0x10400006, 0x24020305, 0x31020080, 0x54400001,
-+ 0x34e70010, 0x34e70020, 0x24020905, 0xa4c2000c, 0x8ee30000, 0x8ee20004,
-+ 0x14620007, 0x3c02b49a, 0x8ee20860, 0x54400001, 0x34e70400, 0x3c024b65,
-+ 0x0a000585, 0x34427654, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010,
-+ 0x0e00059f, 0x00c02021, 0x3242ffff, 0x0056102b, 0x1440ff9c, 0x00000000,
-+ 0x8e620000, 0x8e63fffc, 0x0043102a, 0x1440ff4a, 0x00000000, 0x8fbf0044,
-+ 0x8fbe0040, 0x8fb7003c, 0x8fb60038, 0x8fb50034, 0x8fb40030, 0x8fb3002c,
-+ 0x8fb20028, 0x8fb10024, 0x8fb00020, 0x03e00008, 0x27bd0048, 0x27bdffe8,
-+ 0xafbf0014, 0xafb00010, 0x8f624450, 0x8f634410, 0x0a0005ae, 0x00808021,
-+ 0x8f626820, 0x30422000, 0x10400003, 0x00000000, 0x0e0001ef, 0x00002021,
-+ 0x8f624450, 0x8f634410, 0x3042ffff, 0x0043102b, 0x1440fff5, 0x00000000,
-+ 0x8f630c14, 0x3063000f, 0x2c620002, 0x1440000b, 0x00000000, 0x8f630c14,
-+ 0x3c020800, 0x8c421b30, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b30,
-+ 0x2c620002, 0x1040fff7, 0x00000000, 0xaf705c18, 0x8f625c10, 0x30420002,
-+ 0x10400009, 0x00000000, 0x8f626820, 0x30422000, 0x1040fff8, 0x00000000,
-+ 0x0e0001ef, 0x00002021, 0x0a0005c1, 0x00000000, 0x8fbf0014, 0x8fb00010,
-+ 0x03e00008, 0x27bd0018, 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000,
- 0xafbf0014, 0xafb00010, 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804,
-- 0x8f634000, 0x24020b50, 0x3c010800, 0xac221b64, 0x24020b78, 0x3c010800,
-- 0xac221b74, 0x34630002, 0xaf634000, 0x0e00060d, 0x00808021, 0x3c010800,
-- 0xa0221b78, 0x304200ff, 0x24030002, 0x14430005, 0x00000000, 0x3c020800,
-- 0x8c421b64, 0x0a000600, 0xac5000c0, 0x3c020800, 0x8c421b64, 0xac5000bc,
-- 0x8f624434, 0x8f634438, 0x8f644410, 0x3c010800, 0xac221b6c, 0x3c010800,
-- 0xac231b7c, 0x3c010800, 0xac241b68, 0x8fbf0014, 0x8fb00010, 0x03e00008,
-+ 0x8f634000, 0x24020b50, 0x3c010800, 0xac221b44, 0x24020b78, 0x3c010800,
-+ 0xac221b54, 0x34630002, 0xaf634000, 0x0e000601, 0x00808021, 0x3c010800,
-+ 0xa0221b58, 0x304200ff, 0x24030002, 0x14430005, 0x00000000, 0x3c020800,
-+ 0x8c421b44, 0x0a0005f4, 0xac5000c0, 0x3c020800, 0x8c421b44, 0xac5000bc,
-+ 0x8f624434, 0x8f634438, 0x8f644410, 0x3c010800, 0xac221b4c, 0x3c010800,
-+ 0xac231b5c, 0x3c010800, 0xac241b48, 0x8fbf0014, 0x8fb00010, 0x03e00008,
- 0x27bd0018, 0x3c040800, 0x8c870000, 0x3c03aa55, 0x3463aa55, 0x3c06c003,
- 0xac830000, 0x8cc20000, 0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa,
- 0xac830000, 0x8cc20000, 0x50430001, 0x24050001, 0x3c020800, 0xac470000,
- 0x03e00008, 0x00a01021, 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c,
- 0x8f62680c, 0x1043fffe, 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9,
-- 0x00000000, 0x03e00008, 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b6c,
-- 0x00031c02, 0x0043102b, 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b7c,
-+ 0x00000000, 0x03e00008, 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b4c,
-+ 0x00031c02, 0x0043102b, 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b5c,
- 0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444,
- 0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008,
- 0x3042ffff, 0x3082ffff, 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000,
-- 0x0a000650, 0x2402ffff, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002,
-+ 0x0a000644, 0x2402ffff, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002,
- 0x1440fffc, 0x00001021, 0x03e00008, 0x00000000, 0x8f624450, 0x3c030800,
-- 0x8c631b68, 0x0a000659, 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b,
-+ 0x8c631b48, 0x0a00064d, 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b,
- 0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821,
-- 0x3c040800, 0x24841b10, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
-- 0x0e000684, 0xafa00014, 0x0a000668, 0x00000000, 0x8fbf0018, 0x03e00008,
-+ 0x3c040800, 0x24841ae0, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010,
-+ 0x0e000678, 0xafa00014, 0x0a00065c, 0x00000000, 0x8fbf0018, 0x03e00008,
- 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x3c020800, 0x34423000,
-- 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b84,
-- 0x24020040, 0x3c010800, 0xac221b88, 0x3c010800, 0xac201b80, 0xac600000,
-+ 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b64,
-+ 0x24020040, 0x3c010800, 0xac221b68, 0x3c010800, 0xac201b60, 0xac600000,
- 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000,
-- 0x00804821, 0x8faa0010, 0x3c020800, 0x8c421b80, 0x3c040800, 0x8c841b88,
-- 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac231b80, 0x14400003,
-- 0x00004021, 0x3c010800, 0xac201b80, 0x3c020800, 0x8c421b80, 0x3c030800,
-- 0x8c631b84, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
-- 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b80,
-- 0x3c030800, 0x8c631b84, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008,
-+ 0x00804821, 0x8faa0010, 0x3c020800, 0x8c421b60, 0x3c040800, 0x8c841b68,
-+ 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac231b60, 0x14400003,
-+ 0x00004021, 0x3c010800, 0xac201b60, 0x3c020800, 0x8c421b60, 0x3c030800,
-+ 0x8c631b64, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001,
-+ 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b60,
-+ 0x3c030800, 0x8c631b64, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008,
- 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c,
- 0x00000000, 0x00000000,
- };
-
- u32 tg3TsoFwRodata[] = {
-- 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541,
-- 0x00000000, 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64,
-- 0x496e0000, 0x73746b6f, 0x66662a2a, 0x00000000, 0x53774576,
-- 0x656e7430, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-- 0x66617461, 0x6c457272, 0x00000000, 0x00000000, 0x00000000
-+ 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000,
-+ 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x496e0000, 0x73746b6f,
-+ 0x66662a2a, 0x00000000, 0x53774576, 0x656e7430, 0x00000000, 0x00000000,
-+ 0x00000000, 0x00000000, 0x66617461, 0x6c457272, 0x00000000, 0x00000000,
- };
-
- #if 0 /* All zeros, don't eat up space with it. */
-@@ -4541,7 +4561,10 @@ static int tg3_reset_hw(struct tg3 *tp)
-
- tg3_chip_reset(tp);
-
-- tw32(GRC_MODE, tp->grc_mode);
-+ val = tr32(GRC_MODE);
-+ val &= GRC_MODE_HOST_STACKUP;
-+ tw32(GRC_MODE, val | tp->grc_mode);
-+
- tg3_write_mem(tp,
- NIC_SRAM_FIRMWARE_MBOX,
- NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
-@@ -4597,17 +4620,6 @@ static int tg3_reset_hw(struct tg3 *tp)
- */
- tg3_init_rings(tp);
-
-- /* Clear statistics/status block in chip, and status block in ram. */
-- if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
-- for (i = NIC_SRAM_STATS_BLK;
-- i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
-- i += sizeof(u32)) {
-- tg3_write_mem(tp, i, 0);
-- udelay(40);
-- }
-- }
-- memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
--
- /* This value is determined during the probe time DMA
- * engine test, tg3_test_dma.
- */
-@@ -4706,6 +4718,17 @@ static int tg3_reset_hw(struct tg3 *tp)
- return -ENODEV;
- }
-
-+ /* Clear statistics/status block in chip, and status block in ram. */
-+ if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
-+ for (i = NIC_SRAM_STATS_BLK;
-+ i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
-+ i += sizeof(u32)) {
-+ tg3_write_mem(tp, i, 0);
-+ udelay(40);
-+ }
-+ }
-+ memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
-+
- /* Setup replenish threshold. */
- tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8);
-
-@@ -5760,14 +5783,20 @@ static void __tg3_set_rx_mode(struct net
-
- rx_mode = tp->rx_mode & ~(RX_MODE_PROMISC |
- RX_MODE_KEEP_VLAN_TAG);
-+
-+ /* When ASF is in use, we always keep the RX_MODE_KEEP_VLAN_TAG
-+ * flag clear.
-+ */
- #if TG3_VLAN_TAG_USED
-- if (!tp->vlgrp)
-+ if (!tp->vlgrp &&
-+ !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
- rx_mode |= RX_MODE_KEEP_VLAN_TAG;
- #else
- /* By definition, VLAN is disabled always in this
- * case.
- */
-- rx_mode |= RX_MODE_KEEP_VLAN_TAG;
-+ if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF))
-+ rx_mode |= RX_MODE_KEEP_VLAN_TAG;
- #endif
-
- if (dev->flags & IFF_PROMISC) {
-@@ -6402,25 +6431,22 @@ struct subsys_tbl_ent {
-
- static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
- /* Broadcom boards. */
-- { 0x14e4, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
-- { 0x14e4, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
-- { 0x14e4, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
-- { 0x14e4, 0x0003, PHY_ID_SERDES }, /* BCM95700A9 */
-- { 0x14e4, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
-- { 0x14e4, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
-- { 0x14e4, 0x0007, PHY_ID_SERDES }, /* BCM95701A7 */
-- { 0x14e4, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
-- { 0x14e4, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
-- { 0x14e4, 0x0009, PHY_ID_BCM5701 }, /* BCM95703Ax1 */
-- { 0x14e4, 0x8009, PHY_ID_BCM5701 }, /* BCM95703Ax2 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0003, PHY_ID_SERDES }, /* BCM95700A9 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0007, PHY_ID_SERDES }, /* BCM95701A7 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x0009, PHY_ID_BCM5701 }, /* BCM95703Ax1 */
-+ { PCI_VENDOR_ID_BROADCOM, 0x8009, PHY_ID_BCM5701 }, /* BCM95703Ax2 */
-
- /* 3com boards. */
- { PCI_VENDOR_ID_3COM, 0x1000, PHY_ID_BCM5401 }, /* 3C996T */
- { PCI_VENDOR_ID_3COM, 0x1006, PHY_ID_BCM5701 }, /* 3C996BT */
-- /* { PCI_VENDOR_ID_3COM, 0x1002, PHY_ID_XXX }, 3C996CT */
-- /* { PCI_VENDOR_ID_3COM, 0x1003, PHY_ID_XXX }, 3C997T */
- { PCI_VENDOR_ID_3COM, 0x1004, PHY_ID_SERDES }, /* 3C996SX */
-- /* { PCI_VENDOR_ID_3COM, 0x1005, PHY_ID_XXX }, 3C997SZ */
- { PCI_VENDOR_ID_3COM, 0x1007, PHY_ID_BCM5701 }, /* 3C1000T */
- { PCI_VENDOR_ID_3COM, 0x1008, PHY_ID_BCM5701 }, /* 3C940BR01 */
-
-@@ -6435,7 +6461,10 @@ static struct subsys_tbl_ent subsys_id_t
- { PCI_VENDOR_ID_COMPAQ, 0x009a, PHY_ID_BCM5701 }, /* BANSHEE_2 */
- { PCI_VENDOR_ID_COMPAQ, 0x007d, PHY_ID_SERDES }, /* CHANGELING */
- { PCI_VENDOR_ID_COMPAQ, 0x0085, PHY_ID_BCM5701 }, /* NC7780 */
-- { PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 } /* NC7780_2 */
-+ { PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 }, /* NC7780_2 */
-+
-+ /* IBM boards. */
-+ { PCI_VENDOR_ID_IBM, 0x0281, PHY_ID_SERDES } /* IBM??? */
- };
-
- static int __devinit tg3_phy_probe(struct tg3 *tp)
-@@ -6716,6 +6745,7 @@ static int __devinit tg3_get_invariants(
- u32 misc_ctrl_reg;
- u32 cacheline_sz_reg;
- u32 pci_state_reg, grc_misc_cfg;
-+ u32 val;
- u16 pci_cmd;
- int err;
-
-@@ -6912,7 +6942,9 @@ static int __devinit tg3_get_invariants(
- udelay(40);
-
- /* Initialize data/descriptor byte/word swapping. */
-- tw32(GRC_MODE, tp->grc_mode);
-+ val = tr32(GRC_MODE);
-+ val &= GRC_MODE_HOST_STACKUP;
-+ tw32(GRC_MODE, val | tp->grc_mode);
-
- tg3_switch_clocks(tp);
-
-@@ -6975,7 +7007,8 @@ static int __devinit tg3_get_invariants(
- (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
- tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
- (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901 ||
-- tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2)))
-+ tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2 ||
-+ tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)))
- tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
-
- err = tg3_phy_probe(tp);
-@@ -7636,6 +7669,9 @@ static int __devinit tg3_init_one(struct
- dev->watchdog_timeo = TG3_TX_TIMEOUT;
- dev->change_mtu = tg3_change_mtu;
- dev->irq = pdev->irq;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = tg3_poll_controller;
-+#endif
-
- err = tg3_get_invariants(tp);
- if (err) {
---- linux-2.6.0/drivers/net/tlan.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/tlan.c 2003-12-28 23:21:01.000000000 -0800
-@@ -814,6 +814,14 @@ static void __init TLan_EisaProbe (void
-
- } /* TLan_EisaProbe */
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void TLan_Poll(struct net_device *dev)
-+{
-+ disable_irq(dev->irq);
-+ TLan_HandleInterrupt(dev->irq, dev, NULL);
-+ enable_irq(dev->irq);
-+}
-+#endif
-
-
-
-@@ -893,6 +901,9 @@ static int TLan_Init( struct net_device
- dev->get_stats = &TLan_GetStats;
- dev->set_multicast_list = &TLan_SetMulticastList;
- dev->do_ioctl = &TLan_ioctl;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = &TLan_Poll;
-+#endif
- dev->tx_timeout = &TLan_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
-
---- linux-2.6.0/drivers/net/tokenring/3c359.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/tokenring/3c359.c 2003-12-28 23:21:01.000000000 -0800
-@@ -314,7 +314,6 @@ int __devinit xl_probe(struct pci_dev *p
-
- dev->irq=pdev->irq;
- dev->base_addr=pci_resource_start(pdev,0) ;
-- dev->init=NULL ; /* Must be null with new api, otherwise get called twice */
- xl_priv->xl_card_name = pci_name(pdev);
- xl_priv->xl_mmio=ioremap(pci_resource_start(pdev,1), XL_IO_SPACE);
- xl_priv->pdev = pdev ;
-@@ -332,7 +331,7 @@ int __devinit xl_probe(struct pci_dev *p
-
- if((i = xl_init(dev))) {
- iounmap(xl_priv->xl_mmio) ;
-- kfree(dev) ;
-+ free_netdev(dev) ;
- pci_release_regions(pdev) ;
- return i ;
- }
-@@ -352,7 +351,7 @@ int __devinit xl_probe(struct pci_dev *p
- printk(KERN_ERR "3C359, register netdev failed\n") ;
- pci_set_drvdata(pdev,NULL) ;
- iounmap(xl_priv->xl_mmio) ;
-- kfree(dev) ;
-+ free_netdev(dev) ;
- pci_release_regions(pdev) ;
- return i ;
- }
---- linux-2.6.0/drivers/net/tokenring/abyss.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tokenring/abyss.c 2003-12-28 23:21:01.000000000 -0800
-@@ -181,7 +181,7 @@ err_out_irq:
- err_out_region:
- release_region(pci_ioaddr, ABYSS_IO_EXTENT);
- err_out_trdev:
-- kfree(dev);
-+ free_netdev(dev);
- return ret;
- }
-
---- linux-2.6.0/drivers/net/tokenring/ibmtr.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/tokenring/ibmtr.c 2003-12-28 23:21:01.000000000 -0800
-@@ -187,7 +187,7 @@ char __devinit *adapter_def(char type)
- #define TRC_INITV 0x02 /* verbose init trace points */
- unsigned char ibmtr_debug_trace = 0;
-
--int ibmtr_probe(struct net_device *dev);
-+static int ibmtr_probe(struct net_device *dev);
- static int ibmtr_probe1(struct net_device *dev, int ioaddr);
- static unsigned char get_sram_size(struct tok_info *adapt_info);
- static int trdev_init(struct net_device *dev);
-@@ -313,6 +313,39 @@ static void __devinit find_turbo_adapter
- }
- }
-
-+static void ibmtr_cleanup_card(struct net_device *dev)
-+{
-+ if (dev->base_addr) {
-+ outb(0,dev->base_addr+ADAPTRESET);
-+
-+ schedule_timeout(TR_RST_TIME); /* wait 50ms */
-+
-+ outb(0,dev->base_addr+ADAPTRESETREL);
-+ }
-+
-+#ifndef PCMCIA
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr, IBMTR_IO_EXTENT);
-+
-+ {
-+ struct tok_info *ti = (struct tok_info *) dev->priv;
-+ iounmap((u32 *)ti->mmio);
-+ iounmap((u32 *)ti->sram_virt);
-+ }
-+#endif
-+}
-+
-+int ibmtr_probe_card(struct net_device *dev)
-+{
-+ int err = ibmtr_probe(dev);
-+ if (!err) {
-+ err = register_netdev(dev);
-+ if (err)
-+ ibmtr_cleanup_card(dev);
-+ }
-+ return err;
-+}
-+
- /****************************************************************************
- * ibmtr_probe(): Routine specified in the network device structure
- * to probe for an IBM Token Ring Adapter. Routine outline:
-@@ -325,7 +358,7 @@ static void __devinit find_turbo_adapter
- * which references it.
- ****************************************************************************/
-
--int __devinit ibmtr_probe(struct net_device *dev)
-+static int ibmtr_probe(struct net_device *dev)
- {
- int i;
- int base_addr = dev->base_addr;
-@@ -1925,23 +1958,24 @@ static int __init ibmtr_init(void)
- find_turbo_adapters(io);
-
- for (i = 0; io[i] && (i < IBMTR_MAX_ADAPTERS); i++) {
-+ struct net_device *dev;
- irq[i] = 0;
- mem[i] = 0;
-- dev_ibmtr[i] = alloc_trdev(sizeof(struct tok_info));
-- if (dev_ibmtr[i] == NULL) {
-+ dev = alloc_trdev(sizeof(struct tok_info));
-+ if (dev == NULL) {
- if (i == 0)
- return -ENOMEM;
- break;
- }
-- dev_ibmtr[i]->base_addr = io[i];
-- dev_ibmtr[i]->irq = irq[i];
-- dev_ibmtr[i]->mem_start = mem[i];
-- dev_ibmtr[i]->init = &ibmtr_probe;
-- if (register_netdev(dev_ibmtr[i]) != 0) {
-- kfree(dev_ibmtr[i]);
-- dev_ibmtr[i] = NULL;
-+ dev->base_addr = io[i];
-+ dev->irq = irq[i];
-+ dev->mem_start = mem[i];
-+
-+ if (ibmtr_probe_card(dev)) {
-+ free_netdev(dev);
- continue;
- }
-+ dev_ibmtr[i] = dev;
- count++;
- }
- if (count) return 0;
-@@ -1957,27 +1991,9 @@ static void __exit ibmtr_cleanup(void)
- for (i = 0; i < IBMTR_MAX_ADAPTERS; i++){
- if (!dev_ibmtr[i])
- continue;
-- if (dev_ibmtr[i]->base_addr) {
-- outb(0,dev_ibmtr[i]->base_addr+ADAPTRESET);
--
-- schedule_timeout(TR_RST_TIME); /* wait 50ms */
--
-- outb(0,dev_ibmtr[i]->base_addr+ADAPTRESETREL);
-- }
--
- unregister_netdev(dev_ibmtr[i]);
-- free_irq(dev_ibmtr[i]->irq, dev_ibmtr[i]);
-- release_region(dev_ibmtr[i]->base_addr, IBMTR_IO_EXTENT);
--#ifndef PCMCIA
-- {
-- struct tok_info *ti = (struct tok_info *)
-- dev_ibmtr[i]->priv;
-- iounmap((u32 *)ti->mmio);
-- iounmap((u32 *)ti->sram_virt);
-- }
--#endif
-+ ibmtr_cleanup_card(dev_ibmtr[i]);
- free_netdev(dev_ibmtr[i]);
-- dev_ibmtr[i] = NULL;
- }
- }
- module_exit(ibmtr_cleanup);
---- linux-2.6.0/drivers/net/tokenring/madgemc.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/tokenring/madgemc.c 2003-12-28 23:21:01.000000000 -0800
-@@ -197,7 +197,7 @@ static int __init madgemc_probe(void)
- card = kmalloc(sizeof(struct madgemc_card), GFP_KERNEL);
- if (card==NULL) {
- printk("madgemc: unable to allocate card struct\n");
-- kfree(dev);
-+ free_netdev(dev);
- if (madgemc_card_list)
- return 0;
- return -1;
-@@ -360,7 +360,7 @@ static int __init madgemc_probe(void)
-
- kfree(card);
- tmsdev_term(dev);
-- kfree(dev);
-+ free_netdev(dev);
- if (madgemc_card_list)
- return 0;
- return -1;
-@@ -399,7 +399,7 @@ static int __init madgemc_probe(void)
- MADGEMC_IO_EXTENT);
- getout1:
- kfree(card);
-- kfree(dev);
-+ free_netdev(dev);
- slot++;
- }
-
---- linux-2.6.0/drivers/net/tokenring/olympic.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tokenring/olympic.c 2003-12-28 23:21:01.000000000 -0800
-@@ -228,7 +228,6 @@ static int __devinit olympic_probe(struc
- #endif
- dev->irq=pdev->irq;
- dev->base_addr=pci_resource_start(pdev, 0);
-- dev->init=NULL; /* Must be NULL otherwise we get called twice */
- olympic_priv->olympic_card_name = pci_name(pdev);
- olympic_priv->pdev = pdev;
- olympic_priv->olympic_mmio = ioremap(pci_resource_start(pdev,1),256);
---- linux-2.6.0/drivers/net/tokenring/proteon.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tokenring/proteon.c 2003-12-28 23:21:01.000000000 -0800
-@@ -63,7 +63,7 @@ static int dmalist[] __initdata = {
-
- static char cardname[] = "Proteon 1392\0";
-
--int proteon_probe(struct net_device *dev);
-+struct net_device *proteon_probe(int unit);
- static int proteon_open(struct net_device *dev);
- static int proteon_close(struct net_device *dev);
- static void proteon_read_eeprom(struct net_device *dev);
-@@ -89,80 +89,69 @@ static void proteon_sifwritew(struct net
- outw(val, dev->base_addr + reg);
- }
-
--struct proteon_card {
-- struct net_device *dev;
-- struct proteon_card *next;
--};
--
--static struct proteon_card *proteon_card_list;
--
--static int __init proteon_probe1(int ioaddr)
-+static int __init proteon_probe1(struct net_device *dev, int ioaddr)
- {
- unsigned char chk1, chk2;
- int i;
-
-+ if (!request_region(ioaddr, PROTEON_IO_EXTENT, cardname))
-+ return -ENODEV;
-+
-+
- chk1 = inb(ioaddr + 0x1f); /* Get Proteon ID reg 1 */
-- if (chk1 != 0x1f)
-- return (-1);
-+ if (chk1 != 0x1f)
-+ goto nodev;
-+
- chk1 = inb(ioaddr + 0x1e) & 0x07; /* Get Proteon ID reg 0 */
- for (i=0; i<16; i++) {
- chk2 = inb(ioaddr + 0x1e) & 0x07;
- if (((chk1 + 1) & 0x07) != chk2)
-- return (-1);
-+ goto nodev;
- chk1 = chk2;
- }
-+
-+ dev->base_addr = ioaddr;
- return (0);
-+nodev:
-+ release_region(ioaddr, PROTEON_IO_EXTENT);
-+ return -ENODEV;
- }
-
--int __init proteon_probe(struct net_device *dev)
-+struct net_device * __init proteon_probe(int unit)
- {
-- static int versionprinted;
-+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
- struct net_local *tp;
-- int i,j;
-- struct proteon_card *card;
--
--#ifndef MODULE
-- netdev_boot_setup_check(dev);
-- tr_setup(dev);
--#endif
-+ static int versionprinted;
-+ const unsigned *port;
-+ int j,err = 0;
-
-- SET_MODULE_OWNER(dev);
-- if (!dev->base_addr)
-- {
-- for(i = 0; portlist[i]; i++)
-- {
-- if (!request_region(portlist[i], PROTEON_IO_EXTENT, cardname))
-- continue;
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-- if(proteon_probe1(portlist[i]))
-- {
-- release_region(dev->base_addr, PROTEON_IO_EXTENT);
-- continue;
-- }
-+ if (unit >= 0) {
-+ sprintf(dev->name, "tr%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-
-- dev->base_addr = portlist[i];
-- break;
-+ SET_MODULE_OWNER(dev);
-+ if (dev->base_addr) /* probe specific location */
-+ err = proteon_probe1(dev, dev->base_addr);
-+ else {
-+ for (port = portlist; *port; port++) {
-+ err = proteon_probe1(dev, *port);
-+ if (!err)
-+ break;
- }
-- if(!dev->base_addr)
-- return -1;
- }
-- else
-- {
-- if (!request_region(dev->base_addr, PROTEON_IO_EXTENT, cardname))
-- return -1;
--
-- if(proteon_probe1(dev->base_addr))
-- {
-- release_region(dev->base_addr, PROTEON_IO_EXTENT);
-- return -1;
-- }
-- }
-+ if (err)
-+ goto out4;
-
- /* At this point we have found a valid card. */
-
- if (versionprinted++ == 0)
- printk(KERN_DEBUG "%s", version);
-
-+ err = -EIO;
- if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL))
- goto out4;
-
-@@ -264,14 +253,11 @@ int __init proteon_probe(struct net_devi
- printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n",
- dev->name, dev->base_addr, dev->irq, dev->dma);
-
-- /* Enlist in the card list */
-- card = kmalloc(sizeof(struct proteon_card), GFP_KERNEL);
-- if (!card)
-+ err = register_netdev(dev);
-+ if (err)
- goto out;
-- card->next = proteon_card_list;
-- proteon_card_list = card;
-- card->dev = dev;
-- return 0;
-+
-+ return dev;
- out:
- free_dma(dev->dma);
- out2:
-@@ -280,7 +266,8 @@ out3:
- tmsdev_term(dev);
- out4:
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
-- return -1;
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /*
-@@ -370,50 +357,50 @@ MODULE_PARM(io, "1-" __MODULE_STRING(ISA
- MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
- MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
-
--static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
-+static struct net_device *proteon_dev[ISATR_MAX_ADAPTERS];
-+
-+static struct net_device * __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
- {
-- int res = -ENOMEM;
-- struct proteon_card *this_card;
-- struct net_device *dev = alloc_trdev(0);
--
-- if (dev) {
-- dev->base_addr = io;
-- dev->irq = irq;
-- dev->dma = dma;
-- res = -ENODEV;
-- if (proteon_probe(dev) == 0) {
-- res = register_netdev(dev);
-- if (!res)
-- return 0;
-- release_region(dev->base_addr, PROTEON_IO_EXTENT);
-- free_irq(dev->irq, dev);
-- free_dma(dev->dma);
-- tmsdev_term(dev);
-- this_card = proteon_card_list;
-- proteon_card_list = this_card->next;
-- kfree(this_card);
-- }
-- kfree(dev);
-- }
-- return res;
-+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ dev->irq = irq;
-+ dev->dma = dma;
-+ err = proteon_probe1(dev, io);
-+ if (err)
-+ goto out;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+ out1:
-+ release_region(dev->base_addr, PROTEON_IO_EXTENT);
-+ free_irq(dev->irq, dev);
-+ free_dma(dev->dma);
-+ tmsdev_term(dev);
-+ out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- int init_module(void)
- {
-- int i, num;
-+ struct net_device *dev;
-+ int i, num = 0;
-
-- num = 0;
-- if (io[0]) { /* Only probe addresses from command line */
-- for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-- if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0)
-- num++;
-- }
-- } else {
-- for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) {
-- if (setup_card(portlist[i], irq[num], dma[num]) == 0)
-- num++;
-+ for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-+ dev = io[0] ? setup_card(io[i], irq[i], dma[i])
-+ : proteon_probe(-1);
-+ if (!IS_ERR(dev)) {
-+ proteon_dev[i] = dev;
-+ ++num;
- }
- }
-+
- printk(KERN_NOTICE "proteon.c: %d cards found.\n", num);
- /* Probe for cards. */
- if (num == 0) {
-@@ -425,11 +412,13 @@ int init_module(void)
-
- void cleanup_module(void)
- {
-- struct net_device *dev;
-- struct proteon_card *this_card;
-+ int i;
-
-- while (proteon_card_list) {
-- dev = proteon_card_list->dev;
-+ for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-+ struct net_device *dev = proteon_dev[i];
-+
-+ if (!dev)
-+ continue;
-
- unregister_netdev(dev);
- release_region(dev->base_addr, PROTEON_IO_EXTENT);
-@@ -437,9 +426,6 @@ void cleanup_module(void)
- free_dma(dev->dma);
- tmsdev_term(dev);
- free_netdev(dev);
-- this_card = proteon_card_list;
-- proteon_card_list = this_card->next;
-- kfree(this_card);
- }
- }
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/tokenring/skisa.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tokenring/skisa.c 2003-12-28 23:21:01.000000000 -0800
-@@ -56,7 +56,7 @@ static unsigned int portlist[] __initdat
- /* A zero-terminated list of IRQs to be probed.
- * Used again after initial probe for sktr_chipset_init, called from sktr_open.
- */
--static unsigned short irqlist[] = {
-+static const unsigned short irqlist[] = {
- 3, 5, 9, 10, 11, 12, 15,
- 0
- };
-@@ -69,7 +69,6 @@ static int dmalist[] __initdata = {
-
- static char isa_cardname[] = "SK NET TR 4/16 ISA\0";
-
--int sk_isa_probe(struct net_device *dev);
- static int sk_isa_open(struct net_device *dev);
- static int sk_isa_close(struct net_device *dev);
- static void sk_isa_read_eeprom(struct net_device *dev);
-@@ -95,17 +94,14 @@ static void sk_isa_sifwritew(struct net_
- outw(val, dev->base_addr + reg);
- }
-
--struct sk_isa_card {
-- struct net_device *dev;
-- struct sk_isa_card *next;
--};
--
--static struct sk_isa_card *sk_isa_card_list;
-
--static int __init sk_isa_probe1(int ioaddr)
-+static int __init sk_isa_probe1(struct net_device *dev, int ioaddr)
- {
- unsigned char old, chk1, chk2;
-
-+ if (!request_region(ioaddr, SK_ISA_IO_EXTENT, isa_cardname))
-+ return -ENODEV;
-+
- old = inb(ioaddr + SIFADR); /* Get the old SIFADR value */
-
- chk1 = 0; /* Begin with check value 0 */
-@@ -122,8 +118,10 @@ static int __init sk_isa_probe1(int ioad
- chk2 = inb(ioaddr + SIFADD);
- chk2 ^= 0x0FE;
-
-- if(chk1 != chk2)
-- return (-1); /* No adapter */
-+ if(chk1 != chk2) {
-+ release_region(ioaddr, SK_ISA_IO_EXTENT);
-+ return -ENODEV;
-+ }
-
- chk1 -= 2;
- } while(chk1 != 0); /* Repeat 128 times (all byte values) */
-@@ -131,58 +129,45 @@ static int __init sk_isa_probe1(int ioad
- /* Restore the SIFADR value */
- outb(old, ioaddr + SIFADR);
-
-- return (0);
-+ dev->base_addr = ioaddr;
-+ return 0;
- }
-
--int __init sk_isa_probe(struct net_device *dev)
-+struct net_device * __init sk_isa_probe(int unit)
- {
-- static int versionprinted;
-+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
- struct net_local *tp;
-- int i,j;
-- struct sk_isa_card *card;
-+ static int versionprinted;
-+ const unsigned *port;
-+ int j, err = 0;
-
--#ifndef MODULE
-- netdev_boot_setup_check(dev);
-- tr_setup(dev);
--#endif
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-- SET_MODULE_OWNER(dev);
-- if (!dev->base_addr)
-- {
-- for(i = 0; portlist[i]; i++)
-- {
-- if (!request_region(portlist[i], SK_ISA_IO_EXTENT, isa_cardname))
-- continue;
--
-- if(sk_isa_probe1(portlist[i]))
-- {
-- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-- continue;
-- }
-+ if (unit >= 0) {
-+ sprintf(dev->name, "tr%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-
-- dev->base_addr = portlist[i];
-- break;
-+ SET_MODULE_OWNER(dev);
-+ if (dev->base_addr) /* probe specific location */
-+ err = sk_isa_probe1(dev, dev->base_addr);
-+ else {
-+ for (port = portlist; *port; port++) {
-+ err = sk_isa_probe1(dev, *port);
-+ if (!err)
-+ break;
- }
-- if(!dev->base_addr)
-- return -1;
- }
-- else
-- {
-- if (!request_region(dev->base_addr, SK_ISA_IO_EXTENT, isa_cardname))
-- return -1;
--
-- if(sk_isa_probe1(dev->base_addr))
-- {
-- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-- return -1;
-- }
-- }
-+ if (err)
-+ goto out4;
-
- /* At this point we have found a valid card. */
-
- if (versionprinted++ == 0)
- printk(KERN_DEBUG "%s", version);
-
-+ err = -EIO;
- if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL))
- goto out4;
-
-@@ -284,14 +269,11 @@ int __init sk_isa_probe(struct net_devic
- printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n",
- dev->name, dev->base_addr, dev->irq, dev->dma);
-
-- /* Enlist in the card list */
-- card = kmalloc(sizeof(struct sk_isa_card), GFP_KERNEL);
-- if (!card)
-+ err = register_netdev(dev);
-+ if (err)
- goto out;
-- card->next = sk_isa_card_list;
-- sk_isa_card_list = card;
-- card->dev = dev;
-- return 0;
-+
-+ return dev;
- out:
- free_dma(dev->dma);
- out2:
-@@ -300,7 +282,8 @@ out3:
- tmsdev_term(dev);
- out4:
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-- return -1;
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- /*
-@@ -373,6 +356,8 @@ static int sk_isa_close(struct net_devic
-
- #define ISATR_MAX_ADAPTERS 3
-
-+static struct net_device *sk_isa_dev[ISATR_MAX_ADAPTERS];
-+
- static int io[ISATR_MAX_ADAPTERS];
- static int irq[ISATR_MAX_ADAPTERS];
- static int dma[ISATR_MAX_ADAPTERS];
-@@ -383,50 +368,54 @@ MODULE_PARM(io, "1-" __MODULE_STRING(ISA
- MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
- MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i");
-
--static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
-+static struct net_device * __init setup_card(unsigned long io, unsigned irq, unsigned char dma)
- {
-- int res = -ENOMEM;
-- struct sk_isa_card *this_card;
-- struct net_device *dev = alloc_trdev(0);
--
-- if (dev) {
-- dev->base_addr = io;
-- dev->irq = irq;
-- dev->dma = dma;
-- res = -ENODEV;
-- if (sk_isa_probe(dev) == 0) {
-- res = register_netdev(dev);
-- if (!res)
-- return 0;
-- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-- free_irq(dev->irq, dev);
-- free_dma(dev->dma);
-- tmsdev_term(dev);
-- this_card = sk_isa_card_list;
-- sk_isa_card_list = this_card->next;
-- kfree(this_card);
-- }
-- kfree(dev);
-- }
-- return res;
-+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ dev->base_addr = io;
-+ dev->irq = irq;
-+ dev->dma = dma;
-+
-+ err = sk_isa_probe1(dev, io);
-+ if (err)
-+ goto out;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+
-+ out1:
-+ release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-+ free_irq(dev->irq, dev);
-+ free_dma(dev->dma);
-+ tmsdev_term(dev);
-+ out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
- int init_module(void)
- {
-+ struct net_device *dev;
- int i, num;
-
- num = 0;
-- if (io[0]) { /* Only probe addresses from command line */
-- for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-- if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0)
-- num++;
-- }
-- } else {
-- for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) {
-- if (setup_card(portlist[i], irq[num], dma[num]) == 0)
-- num++;
-+ for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-+ if (io[0]) /* Only probe addresses from command line */
-+ dev = setup_card(io[i], irq[i], dma[i]);
-+ else
-+ dev = sk_isa_probe(-1);
-+ if (!IS_ERR(dev)) {
-+ sk_isa_dev[i] = dev;
-+ ++num;
- }
- }
-+
- printk(KERN_NOTICE "skisa.c: %d cards found.\n", num);
- /* Probe for cards. */
- if (num == 0) {
-@@ -438,11 +427,13 @@ int init_module(void)
-
- void cleanup_module(void)
- {
-- struct net_device *dev;
-- struct sk_isa_card *this_card;
-+ int i;
-+
-+ for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) {
-+ struct net_device *dev = sk_isa_dev[i];
-
-- while (sk_isa_card_list) {
-- dev = sk_isa_card_list->dev;
-+ if (!dev)
-+ continue;
-
- unregister_netdev(dev);
- release_region(dev->base_addr, SK_ISA_IO_EXTENT);
-@@ -450,9 +441,6 @@ void cleanup_module(void)
- free_dma(dev->dma);
- tmsdev_term(dev);
- free_netdev(dev);
-- this_card = sk_isa_card_list;
-- sk_isa_card_list = this_card->next;
-- kfree(this_card);
- }
- }
- #endif /* MODULE */
---- linux-2.6.0/drivers/net/tokenring/smctr.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/tokenring/smctr.c 2003-12-28 23:21:01.000000000 -0800
-@@ -69,13 +69,6 @@ static const char cardname[] = "smctr";
-
- #define SMCTR_IO_EXTENT 20
-
--/* A zero-terminated list of I/O addresses to be probed. */
--static unsigned int smctr_portlist[] __initdata = {
-- 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300,
-- 0x320, 0x340, 0x360, 0x380,
-- 0
--};
--
- #ifdef CONFIG_MCA
- static unsigned int smctr_posid = 0x6ec6;
- #endif
-@@ -219,7 +212,7 @@ static int smctr_open(struct net_device
- static int smctr_open_tr(struct net_device *dev);
-
- /* P */
--int __init smctr_probe (struct net_device *dev);
-+struct net_device *smctr_probe(int unit);
- static int __init smctr_probe1(struct net_device *dev, int ioaddr);
- static int smctr_process_rx_packet(MAC_HEADER *rmf, __u16 size,
- struct net_device *dev, __u16 rx_status);
-@@ -729,10 +722,6 @@ static int smctr_close(struct net_device
-
- netif_stop_queue(dev);
-
--#ifdef MODULE
-- MOD_DEC_USE_COUNT;
--#endif
--
- tp->cleanup = 1;
-
- /* Check to see if adapter is already in a closed state. */
-@@ -3490,10 +3479,6 @@ static int smctr_open(struct net_device
- if(err < 0)
- return (err);
-
--#ifdef MODULE
-- MOD_INC_USE_COUNT;
--#endif
--
- return (err);
- }
-
-@@ -3591,71 +3576,72 @@ out:
- return (err);
- }
-
--/* Check for a network adapter of this type, and return '0 if one exists.
-- * If dev->base_addr == 0, probe all likely locations.
-- * If dev->base_addr == 1, always return failure.
-+/* Check for a network adapter of this type,
-+ * and return device structure if one exists.
- */
--int __init smctr_probe (struct net_device *dev)
-+struct net_device __init *smctr_probe(int unit)
- {
-- int i;
-- int base_addr;
--
--#ifndef MODULE
-- netdev_boot_setup_check(dev);
-- tr_setup(dev);
--#endif
-+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
-+ static const unsigned ports[] = {
-+ 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300,
-+ 0x320, 0x340, 0x360, 0x380, 0
-+ };
-+ const unsigned *port;
-+ int err = 0;
-
-- base_addr = dev->base_addr;
-- if(base_addr > 0x1ff) /* Check a single specified location. */
-- return (smctr_probe1(dev, base_addr));
-- else if(base_addr != 0) /* Don't probe at all. */
-- return (-ENXIO);
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
-- for(i = 0; smctr_portlist[i]; i++)
-- {
-- int ioaddr = smctr_portlist[i];
-- if (!smctr_probe1(dev, ioaddr))
-- return (0);
-- }
-+ SET_MODULE_OWNER(dev);
-
-- return (-ENODEV);
--}
-+ if (unit >= 0) {
-+ sprintf(dev->name, "tr%d", unit);
-+ netdev_boot_setup_check(dev);
-+ }
-
--static void cleanup_card(struct net_device *dev)
--{
-+ if (dev->base_addr > 0x1ff) /* Check a single specified location. */
-+ err = smctr_probe1(dev, dev->base_addr);
-+ else if(dev->base_addr != 0) /* Don't probe at all. */
-+ err =-ENXIO;
-+ else {
-+ for (port = ports; *port; port++) {
-+ err = smctr_probe1(dev, *port);
-+ if (!err)
-+ break;
-+ }
-+ }
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
- #ifdef CONFIG_MCA
-- struct net_local *tp = (struct net_local *)dev->priv;
-- if (tp->slot_num)
-+ { struct net_local *tp = (struct net_local *)dev->priv;
-+ if (tp->slot_num)
- mca_mark_as_unused(tp->slot_num);
-+ }
- #endif
- release_region(dev->base_addr, SMCTR_IO_EXTENT);
-- if (dev->irq)
-- free_irq(dev->irq, dev);
-- if (dev->priv)
-- kfree(dev->priv);
-+ free_irq(dev->irq, dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
- }
-
-+
- static int __init smctr_probe1(struct net_device *dev, int ioaddr)
- {
- static unsigned version_printed;
-- struct net_local *tp;
-+ struct net_local *tp = dev->priv;
- int err;
- __u32 *ram;
-
- if(smctr_debug && version_printed++ == 0)
- printk(version);
-
-- /* Setup this devices private information structure */
-- tp = (struct net_local *)kmalloc(sizeof(struct net_local),
-- GFP_KERNEL);
-- if(tp == NULL) {
-- err = -ENOMEM;
-- goto out;
-- }
-- memset(tp, 0, sizeof(struct net_local));
- spin_lock_init(&tp->lock);
--
-- dev->priv = tp;
- dev->base_addr = ioaddr;
-
- /* Actually detect an adapter now. */
-@@ -3664,7 +3650,7 @@ static int __init smctr_probe1(struct ne
- {
- if ((err = smctr_chk_mca(dev)) < 0) {
- err = -ENODEV;
-- goto out_tp;
-+ goto out;
- }
- }
-
-@@ -3679,7 +3665,6 @@ static int __init smctr_probe1(struct ne
- if(err != UCODE_PRESENT && err != SUCCESS)
- {
- printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err);
-- cleanup_card(dev);
- err = -EIO;
- goto out;
- }
-@@ -3704,8 +3689,6 @@ static int __init smctr_probe1(struct ne
- dev->set_multicast_list = &smctr_set_multicast_list;
- return (0);
-
--out_tp:
-- kfree(tp);
- out:
- return err;
- }
-@@ -5677,47 +5660,59 @@ static int smctr_wait_while_cbusy(struct
- static struct net_device* dev_smctr[SMCTR_MAX_ADAPTERS];
- static int io[SMCTR_MAX_ADAPTERS];
- static int irq[SMCTR_MAX_ADAPTERS];
--static int mem[SMCTR_MAX_ADAPTERS];
-
- MODULE_LICENSE("GPL");
-
--MODULE_PARM(io, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i");
-+MODULE_PARM(io, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i");
- MODULE_PARM(irq, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i");
--MODULE_PARM(mem, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i");
--MODULE_PARM(ringspeed, "1-" __MODULE_STRING(SMCTR_MAX_ADAPTERS) "i");
-+MODULE_PARM(ringspeed, "i");
-+
-+static struct net_device *setup_card(int n)
-+{
-+ struct net_device *dev = alloc_trdev(sizeof(struct net_local));
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ dev->irq = irq[n];
-+ err = smctr_probe1(dev, io[n]);
-+ if (err)
-+ goto out;
-+
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+ out1:
-+#ifdef CONFIG_MCA
-+ { struct net_local *tp = (struct net_local *)dev->priv;
-+ if (tp->slot_num)
-+ mca_mark_as_unused(tp->slot_num);
-+ }
-+#endif
-+ release_region(dev->base_addr, SMCTR_IO_EXTENT);
-+ free_irq(dev->irq, dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
-
- int init_module(void)
- {
-- int i;
-+ int i, found = 0;
-+ struct net_device *dev;
-
- for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
-- struct net_device *dev = alloc_trdev(0);
-- irq[i] = 0;
-- mem[i] = 0;
-- if (!dev)
-- return -ENOMEM;
-- dev->base_addr = io[i];
-- dev->irq = irq[i];
-- dev->mem_start = mem[i];
--
-- if (smctr_probe(dev) != 0) {
-- kfree(dev);
-- if (i == 0) {
-- printk(KERN_ERR "%s: smctr_probe failed.\n",
-- cardname);
-- return -EIO;
-- }
-- return 0;
-- }
-- if (register_netdev(dev) != 0) {
-- cleanup_card(dev);
-- kfree(dev);
-- continue;
-- }
-- dev_smctr[i] = dev;
-+ dev = io[0]? setup_card(i) : smctr_probe(-1);
-+ if (!IS_ERR(dev)) {
-+ ++found;
-+ dev_smctr[i] = dev;
-+ }
- }
-
-- return (0);
-+ return found ? 0 : -ENODEV;
- }
-
- void cleanup_module(void)
-@@ -5726,9 +5721,20 @@ void cleanup_module(void)
-
- for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) {
- struct net_device *dev = dev_smctr[i];
-+
- if (dev) {
-+
- unregister_netdev(dev);
-- cleanup_card(dev);
-+#ifdef CONFIG_MCA
-+ { struct net_local *tp = dev->priv;
-+ if (tp->slot_num)
-+ mca_mark_as_unused(tp->slot_num);
-+ }
-+#endif
-+ release_region(dev->base_addr, SMCTR_IO_EXTENT);
-+ if (dev->irq)
-+ free_irq(dev->irq, dev);
-+
- free_netdev(dev);
- }
- }
---- linux-2.6.0/drivers/net/tokenring/tms380tr.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tokenring/tms380tr.c 2003-12-28 23:21:01.000000000 -0800
-@@ -147,7 +147,6 @@ static void tms380tr_hardware_send_pack
- struct net_local* tp);
- /* "I" */
- static int tms380tr_init_adapter(struct net_device *dev);
--static int tms380tr_init_card(struct net_device *dev);
- static void tms380tr_init_ipb(struct net_local *tp);
- static void tms380tr_init_net_local(struct net_device *dev);
- static void tms380tr_init_opb(struct net_device *dev);
-@@ -232,15 +231,6 @@ static int madgemc_sifprobe(struct net_d
- }
- #endif
-
--/* Dummy function */
--static int tms380tr_init_card(struct net_device *dev)
--{
-- if(tms380tr_debug > 3)
-- printk(KERN_DEBUG "%s: tms380tr_init_card\n", dev->name);
--
-- return (0);
--}
--
- /*
- * Open/initialize the board. This is called sometime after
- * booting when the 'ifconfig' program is run.
-@@ -2386,7 +2376,6 @@ int tmsdev_init(struct net_device *dev,
- }
-
- /* These can be overridden by the card driver if needed */
-- dev->init = tms380tr_init_card;
- dev->open = tms380tr_open;
- dev->stop = tms380tr_close;
- dev->do_ioctl = NULL;
---- linux-2.6.0/drivers/net/tokenring/tmspci.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tokenring/tmspci.c 2003-12-28 23:21:01.000000000 -0800
-@@ -179,7 +179,7 @@ err_out_irq:
- err_out_region:
- release_region(pci_ioaddr, TMS_PCI_IO_EXTENT);
- err_out_trdev:
-- kfree(dev);
-+ free_netdev(dev);
- return ret;
- }
-
---- linux-2.6.0/drivers/net/tulip/de2104x.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/tulip/de2104x.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2084,7 +2084,7 @@ err_out_res:
- err_out_disable:
- pci_disable_device(pdev);
- err_out_free:
-- kfree(dev);
-+ free_netdev(dev);
- return rc;
- }
-
---- linux-2.6.0/drivers/net/tulip/dmfe.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/net/tulip/dmfe.c 2003-12-28 23:21:01.000000000 -0800
-@@ -457,7 +457,7 @@ err_out_disable:
- pci_disable_device(pdev);
- err_out_free:
- pci_set_drvdata(pdev, NULL);
-- kfree(dev);
-+ free_netdev(dev);
-
- return err;
- }
---- linux-2.6.0/drivers/net/tulip/interrupt.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/tulip/interrupt.c 2003-12-28 23:21:01.000000000 -0800
-@@ -19,13 +19,13 @@
- #include <linux/etherdevice.h>
- #include <linux/pci.h>
-
--
- int tulip_rx_copybreak;
- unsigned int tulip_max_interrupt_work;
-
--#ifdef CONFIG_NET_HW_FLOWCONTROL
--
-+#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
- #define MIT_SIZE 15
-+#define MIT_TABLE 15 /* We use 0 or max */
-+
- unsigned int mit_table[MIT_SIZE+1] =
- {
- /* CRS11 21143 hardware Mitigation Control Interrupt
-@@ -99,16 +99,28 @@ int tulip_refill_rx(struct net_device *d
- return refilled;
- }
-
-+#ifdef CONFIG_TULIP_NAPI
-
--static int tulip_rx(struct net_device *dev)
-+void oom_timer(unsigned long data)
-+{
-+ struct net_device *dev = (struct net_device *)data;
-+ netif_rx_schedule(dev);
-+}
-+
-+int tulip_poll(struct net_device *dev, int *budget)
- {
- struct tulip_private *tp = (struct tulip_private *)dev->priv;
- int entry = tp->cur_rx % RX_RING_SIZE;
-- int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx;
-+ int rx_work_limit = *budget;
- int received = 0;
-
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- int drop = 0, mit_sel = 0;
-+ if (!netif_running(dev))
-+ goto done;
-+
-+ if (rx_work_limit > dev->quota)
-+ rx_work_limit = dev->quota;
-+
-+#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
-
- /* that one buffer is needed for mit activation; or might be a
- bug in the ring buffer code; check later -- JHS*/
-@@ -119,6 +131,237 @@ static int tulip_rx(struct net_device *d
- if (tulip_debug > 4)
- printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry,
- tp->rx_ring[entry].status);
-+
-+ do {
-+ /* Acknowledge current RX interrupt sources. */
-+ outl((RxIntr | RxNoBuf), dev->base_addr + CSR5);
-+
-+
-+ /* If we own the next entry, it is a new packet. Send it up. */
-+ while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
-+ s32 status = le32_to_cpu(tp->rx_ring[entry].status);
-+
-+
-+ if (tp->dirty_rx + RX_RING_SIZE == tp->cur_rx)
-+ break;
-+
-+ if (tulip_debug > 5)
-+ printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n",
-+ dev->name, entry, status);
-+ if (--rx_work_limit < 0)
-+ goto not_done;
-+
-+ if ((status & 0x38008300) != 0x0300) {
-+ if ((status & 0x38000300) != 0x0300) {
-+ /* Ingore earlier buffers. */
-+ if ((status & 0xffff) != 0x7fff) {
-+ if (tulip_debug > 1)
-+ printk(KERN_WARNING "%s: Oversized Ethernet frame "
-+ "spanned multiple buffers, status %8.8x!\n",
-+ dev->name, status);
-+ tp->stats.rx_length_errors++;
-+ }
-+ } else if (status & RxDescFatalErr) {
-+ /* There was a fatal error. */
-+ if (tulip_debug > 2)
-+ printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",
-+ dev->name, status);
-+ tp->stats.rx_errors++; /* end of a packet.*/
-+ if (status & 0x0890) tp->stats.rx_length_errors++;
-+ if (status & 0x0004) tp->stats.rx_frame_errors++;
-+ if (status & 0x0002) tp->stats.rx_crc_errors++;
-+ if (status & 0x0001) tp->stats.rx_fifo_errors++;
-+ }
-+ } else {
-+ /* Omit the four octet CRC from the length. */
-+ short pkt_len = ((status >> 16) & 0x7ff) - 4;
-+ struct sk_buff *skb;
-+
-+#ifndef final_version
-+ if (pkt_len > 1518) {
-+ printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n",
-+ dev->name, pkt_len, pkt_len);
-+ pkt_len = 1518;
-+ tp->stats.rx_length_errors++;
-+ }
-+#endif
-+ /* Check if the packet is long enough to accept without copying
-+ to a minimally-sized skbuff. */
-+ if (pkt_len < tulip_rx_copybreak
-+ && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
-+ skb->dev = dev;
-+ skb_reserve(skb, 2); /* 16 byte align the IP header */
-+ pci_dma_sync_single(tp->pdev,
-+ tp->rx_buffers[entry].mapping,
-+ pkt_len, PCI_DMA_FROMDEVICE);
-+#if ! defined(__alpha__)
-+ eth_copy_and_sum(skb, tp->rx_buffers[entry].skb->tail,
-+ pkt_len, 0);
-+ skb_put(skb, pkt_len);
-+#else
-+ memcpy(skb_put(skb, pkt_len),
-+ tp->rx_buffers[entry].skb->tail,
-+ pkt_len);
-+#endif
-+ } else { /* Pass up the skb already on the Rx ring. */
-+ char *temp = skb_put(skb = tp->rx_buffers[entry].skb,
-+ pkt_len);
-+
-+#ifndef final_version
-+ if (tp->rx_buffers[entry].mapping !=
-+ le32_to_cpu(tp->rx_ring[entry].buffer1)) {
-+ printk(KERN_ERR "%s: Internal fault: The skbuff addresses "
-+ "do not match in tulip_rx: %08x vs. %08x %p / %p.\n",
-+ dev->name,
-+ le32_to_cpu(tp->rx_ring[entry].buffer1),
-+ tp->rx_buffers[entry].mapping,
-+ skb->head, temp);
-+ }
-+#endif
-+
-+ pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping,
-+ PKT_BUF_SZ, PCI_DMA_FROMDEVICE);
-+
-+ tp->rx_buffers[entry].skb = NULL;
-+ tp->rx_buffers[entry].mapping = 0;
-+ }
-+ skb->protocol = eth_type_trans(skb, dev);
-+
-+ netif_receive_skb(skb);
-+
-+ dev->last_rx = jiffies;
-+ tp->stats.rx_packets++;
-+ tp->stats.rx_bytes += pkt_len;
-+ }
-+ received++;
-+
-+ entry = (++tp->cur_rx) % RX_RING_SIZE;
-+ if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/4)
-+ tulip_refill_rx(dev);
-+
-+ }
-+
-+ /* New ack strategy... irq does not ack Rx any longer
-+ hopefully this helps */
-+
-+ /* Really bad things can happen here... If new packet arrives
-+ * and an irq arrives (tx or just due to occasionally unset
-+ * mask), it will be acked by irq handler, but new thread
-+ * is not scheduled. It is major hole in design.
-+ * No idea how to fix this if "playing with fire" will fail
-+ * tomorrow (night 011029). If it will not fail, we won
-+ * finally: amount of IO did not increase at all. */
-+ } while ((inl(dev->base_addr + CSR5) & RxIntr));
-+
-+done:
-+
-+ #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
-+
-+ /* We use this simplistic scheme for IM. It's proven by
-+ real life installations. We can have IM enabled
-+ continuesly but this would cause unnecessary latency.
-+ Unfortunely we can't use all the NET_RX_* feedback here.
-+ This would turn on IM for devices that is not contributing
-+ to backlog congestion with unnecessary latency.
-+
-+ We monitor the the device RX-ring and have:
-+
-+ HW Interrupt Mitigation either ON or OFF.
-+
-+ ON: More then 1 pkt received (per intr.) OR we are dropping
-+ OFF: Only 1 pkt received
-+
-+ Note. We only use min and max (0, 15) settings from mit_table */
-+
-+
-+ if( tp->flags & HAS_INTR_MITIGATION) {
-+ if( received > 1 ) {
-+ if( ! tp->mit_on ) {
-+ tp->mit_on = 1;
-+ outl(mit_table[MIT_TABLE], dev->base_addr + CSR11);
-+ }
-+ }
-+ else {
-+ if( tp->mit_on ) {
-+ tp->mit_on = 0;
-+ outl(0, dev->base_addr + CSR11);
-+ }
-+ }
-+ }
-+
-+#endif /* CONFIG_TULIP_NAPI_HW_MITIGATION */
-+
-+ dev->quota -= received;
-+ *budget -= received;
-+
-+ tulip_refill_rx(dev);
-+
-+ /* If RX ring is not full we are out of memory. */
-+ if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom;
-+
-+ /* Remove us from polling list and enable RX intr. */
-+
-+ netif_rx_complete(dev);
-+ outl(tulip_tbl[tp->chip_id].valid_intrs, dev->base_addr+CSR7);
-+
-+ /* The last op happens after poll completion. Which means the following:
-+ * 1. it can race with disabling irqs in irq handler
-+ * 2. it can race with dise/enabling irqs in other poll threads
-+ * 3. if an irq raised after beginning loop, it will be immediately
-+ * triggered here.
-+ *
-+ * Summarizing: the logic results in some redundant irqs both
-+ * due to races in masking and due to too late acking of already
-+ * processed irqs. But it must not result in losing events.
-+ */
-+
-+ return 0;
-+
-+ not_done:
-+ if (!received) {
-+
-+ received = dev->quota; /* Not to happen */
-+ }
-+ dev->quota -= received;
-+ *budget -= received;
-+
-+ if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/2 ||
-+ tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
-+ tulip_refill_rx(dev);
-+
-+ if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL) goto oom;
-+
-+ return 1;
-+
-+
-+ oom: /* Executed with RX ints disabled */
-+
-+
-+ /* Start timer, stop polling, but do not enable rx interrupts. */
-+ mod_timer(&tp->oom_timer, jiffies+1);
-+
-+ /* Think: timer_pending() was an explicit signature of bug.
-+ * Timer can be pending now but fired and completed
-+ * before we did netif_rx_complete(). See? We would lose it. */
-+
-+ /* remove ourselves from the polling list */
-+ netif_rx_complete(dev);
-+
-+ return 0;
-+}
-+
-+#else /* CONFIG_TULIP_NAPI */
-+
-+static int tulip_rx(struct net_device *dev)
-+{
-+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
-+ int entry = tp->cur_rx % RX_RING_SIZE;
-+ int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx;
-+ int received = 0;
-+
-+ if (tulip_debug > 4)
-+ printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry,
-+ tp->rx_ring[entry].status);
- /* If we own the next entry, it is a new packet. Send it up. */
- while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
- s32 status = le32_to_cpu(tp->rx_ring[entry].status);
-@@ -163,11 +406,6 @@ static int tulip_rx(struct net_device *d
- }
- #endif
-
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- drop = atomic_read(&netdev_dropping);
-- if (drop)
-- goto throttle;
--#endif
- /* Check if the packet is long enough to accept without copying
- to a minimally-sized skbuff. */
- if (pkt_len < tulip_rx_copybreak
-@@ -209,44 +447,9 @@ static int tulip_rx(struct net_device *d
- tp->rx_buffers[entry].mapping = 0;
- }
- skb->protocol = eth_type_trans(skb, dev);
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- mit_sel =
--#endif
-- netif_rx(skb);
-
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- switch (mit_sel) {
-- case NET_RX_SUCCESS:
-- case NET_RX_CN_LOW:
-- case NET_RX_CN_MOD:
-- break;
--
-- case NET_RX_CN_HIGH:
-- rx_work_limit -= NET_RX_CN_HIGH; /* additional*/
-- break;
-- case NET_RX_DROP:
-- rx_work_limit = -1;
-- break;
-- default:
-- printk("unknown feedback return code %d\n", mit_sel);
-- break;
-- }
-+ netif_rx(skb);
-
-- drop = atomic_read(&netdev_dropping);
-- if (drop) {
--throttle:
-- rx_work_limit = -1;
-- mit_sel = NET_RX_DROP;
--
-- if (tp->fc_bit) {
-- long ioaddr = dev->base_addr;
--
-- /* disable Rx & RxNoBuf ints. */
-- outl(tulip_tbl[tp->chip_id].valid_intrs&RX_A_NBF_STOP, ioaddr + CSR7);
-- set_bit(tp->fc_bit, &netdev_fc_xoff);
-- }
-- }
--#endif
- dev->last_rx = jiffies;
- tp->stats.rx_packets++;
- tp->stats.rx_bytes += pkt_len;
-@@ -254,42 +457,9 @@ throttle:
- received++;
- entry = (++tp->cur_rx) % RX_RING_SIZE;
- }
--#ifdef CONFIG_NET_HW_FLOWCONTROL
--
-- /* We use this simplistic scheme for IM. It's proven by
-- real life installations. We can have IM enabled
-- continuesly but this would cause unnecessary latency.
-- Unfortunely we can't use all the NET_RX_* feedback here.
-- This would turn on IM for devices that is not contributing
-- to backlog congestion with unnecessary latency.
--
-- We monitor the device RX-ring and have:
--
-- HW Interrupt Mitigation either ON or OFF.
--
-- ON: More then 1 pkt received (per intr.) OR we are dropping
-- OFF: Only 1 pkt received
--
-- Note. We only use min and max (0, 15) settings from mit_table */
--
--
-- if( tp->flags & HAS_INTR_MITIGATION) {
-- if((received > 1 || mit_sel == NET_RX_DROP)
-- && tp->mit_sel != 15 ) {
-- tp->mit_sel = 15;
-- tp->mit_change = 1; /* Force IM change */
-- }
-- if((received <= 1 && mit_sel != NET_RX_DROP) && tp->mit_sel != 0 ) {
-- tp->mit_sel = 0;
-- tp->mit_change = 1; /* Force IM change */
-- }
-- }
--
-- return RX_RING_SIZE+1; /* maxrx+1 */
--#else
- return received;
--#endif
- }
-+#endif /* CONFIG_TULIP_NAPI */
-
- static inline unsigned int phy_interrupt (struct net_device *dev)
- {
-@@ -323,7 +493,6 @@ irqreturn_t tulip_interrupt(int irq, voi
- struct tulip_private *tp = (struct tulip_private *)dev->priv;
- long ioaddr = dev->base_addr;
- int csr5;
-- int entry;
- int missed;
- int rx = 0;
- int tx = 0;
-@@ -331,6 +500,11 @@ irqreturn_t tulip_interrupt(int irq, voi
- int maxrx = RX_RING_SIZE;
- int maxtx = TX_RING_SIZE;
- int maxoi = TX_RING_SIZE;
-+#ifdef CONFIG_TULIP_NAPI
-+ int rxd = 0;
-+#else
-+ int entry;
-+#endif
- unsigned int work_count = tulip_max_interrupt_work;
- unsigned int handled = 0;
-
-@@ -346,22 +520,41 @@ irqreturn_t tulip_interrupt(int irq, voi
- tp->nir++;
-
- do {
-+
-+#ifdef CONFIG_TULIP_NAPI
-+
-+ if (!rxd && (csr5 & (RxIntr | RxNoBuf))) {
-+ rxd++;
-+ /* Mask RX intrs and add the device to poll list. */
-+ outl(tulip_tbl[tp->chip_id].valid_intrs&~RxPollInt, ioaddr + CSR7);
-+ netif_rx_schedule(dev);
-+
-+ if (!(csr5&~(AbnormalIntr|NormalIntr|RxPollInt|TPLnkPass)))
-+ break;
-+ }
-+
-+ /* Acknowledge the interrupt sources we handle here ASAP
-+ the poll function does Rx and RxNoBuf acking */
-+
-+ outl(csr5 & 0x0001ff3f, ioaddr + CSR5);
-+
-+#else
- /* Acknowledge all of the current interrupt sources ASAP. */
- outl(csr5 & 0x0001ffff, ioaddr + CSR5);
-
-- if (tulip_debug > 4)
-- printk(KERN_DEBUG "%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n",
-- dev->name, csr5, inl(dev->base_addr + CSR5));
-
- if (csr5 & (RxIntr | RxNoBuf)) {
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- if ((!tp->fc_bit) ||
-- (!test_bit(tp->fc_bit, &netdev_fc_xoff)))
--#endif
- rx += tulip_rx(dev);
- tulip_refill_rx(dev);
- }
-
-+#endif /* CONFIG_TULIP_NAPI */
-+
-+ if (tulip_debug > 4)
-+ printk(KERN_DEBUG "%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n",
-+ dev->name, csr5, inl(dev->base_addr + CSR5));
-+
-+
- if (csr5 & (TxNoBuf | TxDied | TxIntr | TimerInt)) {
- unsigned int dirty_tx;
-
-@@ -462,15 +655,8 @@ irqreturn_t tulip_interrupt(int irq, voi
- }
- if (csr5 & RxDied) { /* Missed a Rx frame. */
- tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- if (tp->fc_bit && !test_bit(tp->fc_bit, &netdev_fc_xoff)) {
-- tp->stats.rx_errors++;
-- tulip_start_rxtx(tp);
-- }
--#else
- tp->stats.rx_errors++;
- tulip_start_rxtx(tp);
--#endif
- }
- /*
- * NB: t21142_lnk_change() does a del_timer_sync(), so be careful if this
-@@ -504,10 +690,6 @@ irqreturn_t tulip_interrupt(int irq, voi
- if (tulip_debug > 2)
- printk(KERN_ERR "%s: Re-enabling interrupts, %8.8x.\n",
- dev->name, csr5);
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- if (tp->fc_bit && (test_bit(tp->fc_bit, &netdev_fc_xoff)))
-- if (net_ratelimit()) printk("BUG!! enabling interrupt when FC off (timerintr.) \n");
--#endif
- outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR7);
- tp->ttimer = 0;
- oi++;
-@@ -520,16 +702,9 @@ irqreturn_t tulip_interrupt(int irq, voi
- /* Acknowledge all interrupt sources. */
- outl(0x8001ffff, ioaddr + CSR5);
- if (tp->flags & HAS_INTR_MITIGATION) {
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- if(tp->mit_change) {
-- outl(mit_table[tp->mit_sel], ioaddr + CSR11);
-- tp->mit_change = 0;
-- }
--#else
- /* Josip Loncaric at ICASE did extensive experimentation
- to develop a good interrupt mitigation setting.*/
- outl(0x8b240000, ioaddr + CSR11);
--#endif
- } else if (tp->chip_id == LC82C168) {
- /* the LC82C168 doesn't have a hw timer.*/
- outl(0x00, ioaddr + CSR7);
-@@ -537,10 +712,8 @@ irqreturn_t tulip_interrupt(int irq, voi
- } else {
- /* Mask all interrupting sources, set timer to
- re-enable. */
--#ifndef CONFIG_NET_HW_FLOWCONTROL
- outl(((~csr5) & 0x0001ebef) | AbnormalIntr | TimerInt, ioaddr + CSR7);
- outl(0x0012, ioaddr + CSR11);
--#endif
- }
- break;
- }
-@@ -550,6 +723,21 @@ irqreturn_t tulip_interrupt(int irq, voi
- break;
-
- csr5 = inl(ioaddr + CSR5);
-+
-+#ifdef CONFIG_TULIP_NAPI
-+ if (rxd)
-+ csr5 &= ~RxPollInt;
-+ } while ((csr5 & (TxNoBuf |
-+ TxDied |
-+ TxIntr |
-+ TimerInt |
-+ /* Abnormal intr. */
-+ RxDied |
-+ TxFIFOUnderflow |
-+ TxJabber |
-+ TPLnkFail |
-+ SytemError )) != 0);
-+#else
- } while ((csr5 & (NormalIntr|AbnormalIntr)) != 0);
-
- tulip_refill_rx(dev);
-@@ -574,6 +762,7 @@ irqreturn_t tulip_interrupt(int irq, voi
- }
- }
- }
-+#endif /* CONFIG_TULIP_NAPI */
-
- if ((missed = inl(ioaddr + CSR8) & 0x1ffff)) {
- tp->stats.rx_dropped += missed & 0x10000 ? 0x10000 : missed;
---- linux-2.6.0/drivers/net/tulip/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/tulip/Kconfig 2003-12-28 23:21:01.000000000 -0800
-@@ -68,6 +68,26 @@ config TULIP_MMIO
- obscure bugs if your mainboard has memory controller timing issues.
- If in doubt, say N.
-
-+config TULIP_NAPI
-+ bool "Use NAPI RX polling "
-+ depends on TULIP
-+ ---help---
-+ This is of useful for servers and routers dealing with high network loads.
-+
-+ See <file:Documentation/networking/NAPI_HOWTO.txt>.
-+
-+ If in doubt, say N.
-+
-+config TULIP_NAPI_HW_MITIGATION
-+ bool "Use Interrupt Mitigation "
-+ depends on TULIP_NAPI
-+ ---help---
-+ Use HW to reduce RX interrupts. Not strict necessary since NAPI reduces
-+ RX interrupts but itself. Although this reduces RX interrupts even at
-+ low levels traffic at the cost of a small latency.
-+
-+ If in doubt, say Y.
-+
- config DE4X5
- tristate "Generic DECchip & DIGITAL EtherWORKS PCI/EISA"
- depends on NET_TULIP && (PCI || EISA)
---- linux-2.6.0/drivers/net/tulip/tulip_core.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/net/tulip/tulip_core.c 2003-12-28 23:21:01.000000000 -0800
-@@ -14,11 +14,17 @@
-
- */
-
-+#include <linux/config.h>
-+
- #define DRV_NAME "tulip"
-+#ifdef CONFIG_TULIP_NAPI
-+#define DRV_VERSION "1.1.13-NAPI" /* Keep at least for test */
-+#else
- #define DRV_VERSION "1.1.13"
-+#endif
- #define DRV_RELDATE "May 11, 2002"
-
--#include <linux/config.h>
-+
- #include <linux/module.h>
- #include "tulip.h"
- #include <linux/pci.h>
-@@ -247,7 +253,7 @@ static void tulip_down(struct net_device
- static struct net_device_stats *tulip_get_stats(struct net_device *dev);
- static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
- static void set_rx_mode(struct net_device *dev);
--
-+static void poll_tulip(struct net_device *dev);
-
-
- static void tulip_set_power_state (struct tulip_private *tp,
-@@ -466,29 +472,16 @@ media_picked:
- to an alternate media type. */
- tp->timer.expires = RUN_AT(next_tick);
- add_timer(&tp->timer);
--}
--
--#ifdef CONFIG_NET_HW_FLOWCONTROL
--/* Enable receiver */
--void tulip_xon(struct net_device *dev)
--{
-- struct tulip_private *tp = (struct tulip_private *)dev->priv;
--
-- clear_bit(tp->fc_bit, &netdev_fc_xoff);
-- if (netif_running(dev)){
--
-- tulip_refill_rx(dev);
-- outl(tulip_tbl[tp->chip_id].valid_intrs, dev->base_addr+CSR7);
-- }
--}
-+#ifdef CONFIG_TULIP_NAPI
-+ init_timer(&tp->oom_timer);
-+ tp->oom_timer.data = (unsigned long)dev;
-+ tp->oom_timer.function = oom_timer;
- #endif
-+}
-
- static int
- tulip_open(struct net_device *dev)
- {
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- struct tulip_private *tp = (struct tulip_private *)dev->priv;
--#endif
- int retval;
-
- if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev)))
-@@ -498,10 +491,6 @@ tulip_open(struct net_device *dev)
-
- tulip_up (dev);
-
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- tp->fc_bit = netdev_register_fc(dev, tulip_xon);
--#endif
--
- netif_start_queue (dev);
-
- return 0;
-@@ -582,10 +571,7 @@ static void tulip_tx_timeout(struct net_
- #endif
-
- /* Stop and restart the chip's Tx processes . */
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- if (tp->fc_bit && test_bit(tp->fc_bit,&netdev_fc_xoff))
-- printk("BUG tx_timeout restarting rx when fc on\n");
--#endif
-+
- tulip_restart_rxtx(tp);
- /* Trigger an immediate transmit demand. */
- outl(0, ioaddr + CSR1);
-@@ -742,7 +728,9 @@ static void tulip_down (struct net_devic
- unsigned long flags;
-
- del_timer_sync (&tp->timer);
--
-+#ifdef CONFIG_TULIP_NAPI
-+ del_timer_sync (&tp->oom_timer);
-+#endif
- spin_lock_irqsave (&tp->lock, flags);
-
- /* Disable interrupts by clearing the interrupt mask. */
-@@ -781,13 +769,6 @@ static int tulip_close (struct net_devic
-
- netif_stop_queue (dev);
-
--#ifdef CONFIG_NET_HW_FLOWCONTROL
-- if (tp->fc_bit) {
-- int bit = tp->fc_bit;
-- tp->fc_bit = 0;
-- netdev_unregister_fc(bit);
-- }
--#endif
- tulip_down (dev);
-
- if (tulip_debug > 1)
-@@ -1629,10 +1610,17 @@ static int __devinit tulip_init_one (str
- dev->hard_start_xmit = tulip_start_xmit;
- dev->tx_timeout = tulip_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
-+#ifdef CONFIG_TULIP_NAPI
-+ dev->poll = tulip_poll;
-+ dev->weight = 16;
-+#endif
- dev->stop = tulip_close;
- dev->get_stats = tulip_get_stats;
- dev->do_ioctl = private_ioctl;
- dev->set_multicast_list = set_rx_mode;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = &poll_tulip;
-+#endif
-
- if (register_netdev(dev))
- goto err_out_free_ring;
-@@ -1725,7 +1713,7 @@ err_out_free_res:
- pci_release_regions (pdev);
-
- err_out_free_netdev:
-- kfree (dev);
-+ free_netdev (dev);
- return -ENODEV;
- }
-
-@@ -1789,6 +1777,22 @@ static void __devexit tulip_remove_one (
- /* pci_power_off (pdev, -1); */
- }
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+/*
-+ * Polling 'interrupt' - used by things like netconsole to send skbs
-+ * without having to re-enable interrupts. It's not called while
-+ * the interrupt routine is executing.
-+ */
-+
-+static void poll_tulip (struct net_device *dev)
-+{
-+ /* disable_irq here is not very nice, but with the lockless
-+ interrupt handler we have no other choice. */
-+ disable_irq(dev->irq);
-+ tulip_interrupt (dev->irq, dev, NULL);
-+ enable_irq(dev->irq);
-+}
-+#endif
-
- static struct pci_driver tulip_driver = {
- .name = DRV_NAME,
---- linux-2.6.0/drivers/net/tulip/tulip.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/net/tulip/tulip.h 2003-12-28 23:21:01.000000000 -0800
-@@ -126,6 +126,7 @@ enum pci_cfg_driver_reg {
- CFDD_Snooze = (1 << 30),
- };
-
-+#define RxPollInt (RxIntr|RxNoBuf|RxDied|RxJabber)
-
- /* The bits in the CSR5 status registers, mostly interrupt sources. */
- enum status_bits {
-@@ -251,9 +252,9 @@ enum t21143_csr6_bits {
- Making the Tx ring too large decreases the effectiveness of channel
- bonding and packet priority.
- There are no ill effects from too-large receive rings. */
--#define TX_RING_SIZE 16
--#define RX_RING_SIZE 32
-
-+#define TX_RING_SIZE 32
-+#define RX_RING_SIZE 128
- #define MEDIA_MASK 31
-
- #define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */
-@@ -343,17 +344,15 @@ struct tulip_private {
- int flags;
- struct net_device_stats stats;
- struct timer_list timer; /* Media selection timer. */
-+ struct timer_list oom_timer; /* Out of memory timer. */
- u32 mc_filter[2];
- spinlock_t lock;
- spinlock_t mii_lock;
- unsigned int cur_rx, cur_tx; /* The next free ring entry */
- unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
-
--#ifdef CONFIG_NET_HW_FLOWCONTROL
--#define RX_A_NBF_STOP 0xffffff3f /* To disable RX and RX-NOBUF ints. */
-- int fc_bit;
-- int mit_sel;
-- int mit_change; /* Signal for Interrupt Mitigtion */
-+#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
-+ int mit_on;
- #endif
- unsigned int full_duplex:1; /* Full-duplex operation requested. */
- unsigned int full_duplex_lock:1;
-@@ -415,6 +414,10 @@ extern unsigned int tulip_max_interrupt_
- extern int tulip_rx_copybreak;
- irqreturn_t tulip_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
- int tulip_refill_rx(struct net_device *dev);
-+#ifdef CONFIG_TULIP_NAPI
-+int tulip_poll(struct net_device *dev, int *budget);
-+#endif
-+
-
- /* media.c */
- int tulip_mdio_read(struct net_device *dev, int phy_id, int location);
-@@ -438,6 +441,7 @@ extern int tulip_debug;
- extern const char * const medianame[];
- extern const char tulip_media_cap[];
- extern struct tulip_chip_table tulip_tbl[];
-+void oom_timer(unsigned long data);
- extern u8 t21040_csr13[];
-
- #ifndef USE_IO_OPS
---- linux-2.6.0/drivers/net/tulip/winbond-840.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/net/tulip/winbond-840.c 2003-12-28 23:21:01.000000000 -0800
-@@ -530,7 +530,7 @@ err_out_free_res:
- #endif
- pci_release_regions(pdev);
- err_out_netdev:
-- kfree (dev);
-+ free_netdev (dev);
- return -ENODEV;
- }
-
---- linux-2.6.0/drivers/net/tulip/xircom_tulip_cb.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/tulip/xircom_tulip_cb.c 2003-12-28 23:21:01.000000000 -0800
-@@ -648,8 +648,7 @@ err_out_cleardev:
- pci_set_drvdata(pdev, NULL);
- pci_release_regions(pdev);
- err_out_free_netdev:
-- unregister_netdev(dev);
-- kfree(dev);
-+ free_netdev(dev);
- return -ENODEV;
- }
-
---- linux-2.6.0/drivers/net/tun.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/net/tun.c 2003-12-28 23:21:01.000000000 -0800
-@@ -377,6 +377,7 @@ static struct tun_struct *tun_get_by_nam
- static int tun_set_iff(struct file *file, struct ifreq *ifr)
- {
- struct tun_struct *tun;
-+ struct net_device *dev;
- int err;
-
- tun = tun_get_by_name(ifr->ifr_name);
-@@ -394,7 +395,6 @@ static int tun_set_iff(struct file *file
- else {
- char *name;
- unsigned long flags = 0;
-- struct net_device *dev;
-
- err = -EINVAL;
-
-@@ -424,16 +424,13 @@ static int tun_set_iff(struct file *file
-
- if (strchr(dev->name, '%')) {
- err = dev_alloc_name(dev, dev->name);
-- if (err < 0) {
-- kfree(dev);
-- goto failed;
-- }
-+ if (err < 0)
-+ goto err_free_dev;
- }
-
-- if ((err = register_netdevice(tun->dev))) {
-- kfree(dev);
-- goto failed;
-- }
-+ err = register_netdevice(tun->dev);
-+ if (err < 0)
-+ goto err_free_dev;
-
- list_add(&tun->list, &tun_dev_list);
- }
-@@ -451,6 +448,9 @@ static int tun_set_iff(struct file *file
-
- strcpy(ifr->ifr_name, tun->dev->name);
- return 0;
-+
-+ err_free_dev:
-+ free_netdev(dev);
- failed:
- return err;
- }
---- linux-2.6.0/drivers/net/typhoon.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/net/typhoon.c 2003-12-28 23:21:01.000000000 -0800
-@@ -85,8 +85,8 @@ static const int multicast_filter_limit
- #define PKT_BUF_SZ 1536
-
- #define DRV_MODULE_NAME "typhoon"
--#define DRV_MODULE_VERSION "1.5.1"
--#define DRV_MODULE_RELDATE "03/06/26"
-+#define DRV_MODULE_VERSION "1.5.2"
-+#define DRV_MODULE_RELDATE "03/11/25"
- #define PFX DRV_MODULE_NAME ": "
- #define ERR_PFX KERN_ERR PFX
-
-@@ -127,7 +127,7 @@ static const int multicast_filter_limit
- static char version[] __devinitdata =
- "typhoon.c: version " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
-
--MODULE_AUTHOR("David Dillow <dillowd@y12.doe.gov>");
-+MODULE_AUTHOR("David Dillow <dave@thedillows.org>");
- MODULE_LICENSE("GPL");
- MODULE_DESCRIPTION("3Com Typhoon Family (3C990, 3CR990, and variants)");
- MODULE_PARM(rx_copybreak, "i");
-@@ -146,11 +146,12 @@ struct typhoon_card_info {
- int capabilities;
- };
-
--#define TYPHOON_CRYPTO_NONE 0
--#define TYPHOON_CRYPTO_DES 1
--#define TYPHOON_CRYPTO_3DES 2
--#define TYPHOON_CRYPTO_VARIABLE 4
--#define TYPHOON_FIBER 8
-+#define TYPHOON_CRYPTO_NONE 0x00
-+#define TYPHOON_CRYPTO_DES 0x01
-+#define TYPHOON_CRYPTO_3DES 0x02
-+#define TYPHOON_CRYPTO_VARIABLE 0x04
-+#define TYPHOON_FIBER 0x08
-+#define TYPHOON_WAKEUP_NEEDS_RESET 0x10
-
- enum typhoon_cards {
- TYPHOON_TX = 0, TYPHOON_TX95, TYPHOON_TX97, TYPHOON_SVR,
-@@ -307,7 +308,8 @@ enum state_values {
- /* We'll wait up to six seconds for a reset, and half a second normally.
- */
- #define TYPHOON_UDELAY 50
--#define TYPHOON_RESET_TIMEOUT (6 * HZ)
-+#define TYPHOON_RESET_TIMEOUT_SLEEP (6 * HZ)
-+#define TYPHOON_RESET_TIMEOUT_NOSLEEP ((6 * 1000000) / TYPHOON_UDELAY)
- #define TYPHOON_WAIT_TIMEOUT ((1000000 / 2) / TYPHOON_UDELAY)
-
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 28)
-@@ -375,10 +377,12 @@ static int
- typhoon_reset(unsigned long ioaddr, int wait_type)
- {
- int i, err = 0;
-- int timeout = TYPHOON_RESET_TIMEOUT;
-+ int timeout;
-
- if(wait_type == WaitNoSleep)
-- timeout = (timeout * 1000000) / (HZ * TYPHOON_UDELAY);
-+ timeout = TYPHOON_RESET_TIMEOUT_NOSLEEP;
-+ else
-+ timeout = TYPHOON_RESET_TIMEOUT_SLEEP;
-
- writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_MASK);
- writel(TYPHOON_INTR_ALL, ioaddr + TYPHOON_REG_INTR_STATUS);
-@@ -1858,6 +1862,11 @@ typhoon_sleep(struct typhoon *tp, int st
- if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_SLEEPING) < 0)
- return -ETIMEDOUT;
-
-+ /* Since we cannot monitor the status of the link while sleeping,
-+ * tell the world it went away.
-+ */
-+ netif_carrier_off(tp->dev);
-+
- pci_enable_wake(tp->pdev, state, 1);
- pci_disable_device(pdev);
- return pci_set_power_state(pdev, state);
-@@ -1872,8 +1881,13 @@ typhoon_wakeup(struct typhoon *tp, int w
- pci_set_power_state(pdev, 0);
- pci_restore_state(pdev, tp->pci_state);
-
-+ /* Post 2.x.x versions of the Sleep Image require a reset before
-+ * we can download the Runtime Image. But let's not make users of
-+ * the old firmware pay for the reset.
-+ */
- writel(TYPHOON_BOOTCMD_WAKEUP, ioaddr + TYPHOON_REG_COMMAND);
-- if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_WAITING_FOR_HOST) < 0)
-+ if(typhoon_wait_status(ioaddr, TYPHOON_STATUS_WAITING_FOR_HOST) < 0 ||
-+ (tp->capabilities & TYPHOON_WAKEUP_NEEDS_RESET))
- return typhoon_reset(ioaddr, wait_type);
-
- return 0;
-@@ -2251,7 +2265,7 @@ typhoon_init_one(struct pci_dev *pdev, c
- void *shared;
- dma_addr_t shared_dma;
- struct cmd_desc xp_cmd;
-- struct resp_desc xp_resp;
-+ struct resp_desc xp_resp[3];
- int i;
- int err = 0;
-
-@@ -2380,15 +2394,15 @@ typhoon_init_one(struct pci_dev *pdev, c
- }
-
- INIT_COMMAND_WITH_RESPONSE(&xp_cmd, TYPHOON_CMD_READ_MAC_ADDRESS);
-- if(typhoon_issue_command(tp, 1, &xp_cmd, 1, &xp_resp) < 0) {
-+ if(typhoon_issue_command(tp, 1, &xp_cmd, 1, xp_resp) < 0) {
- printk(ERR_PFX "%s: cannot read MAC address\n",
- pci_name(pdev));
- err = -EIO;
- goto error_out_reset;
- }
-
-- *(u16 *)&dev->dev_addr[0] = htons(le16_to_cpu(xp_resp.parm1));
-- *(u32 *)&dev->dev_addr[2] = htonl(le32_to_cpu(xp_resp.parm2));
-+ *(u16 *)&dev->dev_addr[0] = htons(le16_to_cpu(xp_resp[0].parm1));
-+ *(u32 *)&dev->dev_addr[2] = htonl(le32_to_cpu(xp_resp[0].parm2));
-
- if(!is_valid_ether_addr(dev->dev_addr)) {
- printk(ERR_PFX "%s: Could not obtain valid ethernet address, "
-@@ -2396,6 +2410,28 @@ typhoon_init_one(struct pci_dev *pdev, c
- goto error_out_reset;
- }
-
-+ /* Read the Sleep Image version last, so the response is valid
-+ * later when we print out the version reported.
-+ */
-+ INIT_COMMAND_WITH_RESPONSE(&xp_cmd, TYPHOON_CMD_READ_VERSIONS);
-+ if(typhoon_issue_command(tp, 1, &xp_cmd, 3, xp_resp) < 0) {
-+ printk(ERR_PFX "%s: Could not get Sleep Image version\n",
-+ pdev->slot_name);
-+ goto error_out_reset;
-+ }
-+
-+ tp->capabilities = typhoon_card_info[card_id].capabilities;
-+ tp->xcvr_select = TYPHOON_XCVR_AUTONEG;
-+
-+ /* Typhoon 1.0 Sleep Images return one response descriptor to the
-+ * READ_VERSIONS command. Those versions are OK after waking up
-+ * from sleep without needing a reset. Typhoon 1.1+ Sleep Images
-+ * seem to need a little extra help to get started. Since we don't
-+ * know how to nudge it along, just kick it.
-+ */
-+ if(xp_resp[0].numDesc != 0)
-+ tp->capabilities |= TYPHOON_WAKEUP_NEEDS_RESET;
-+
- if(typhoon_sleep(tp, 3, 0) < 0) {
- printk(ERR_PFX "%s: cannot put adapter to sleep\n",
- pci_name(pdev));
-@@ -2403,9 +2439,6 @@ typhoon_init_one(struct pci_dev *pdev, c
- goto error_out_reset;
- }
-
-- tp->capabilities = typhoon_card_info[card_id].capabilities;
-- tp->xcvr_select = TYPHOON_XCVR_AUTONEG;
--
- /* The chip-specific entries in the device structure. */
- dev->open = typhoon_open;
- dev->hard_start_xmit = typhoon_start_tx;
-@@ -2442,6 +2475,32 @@ typhoon_init_one(struct pci_dev *pdev, c
- printk("%2.2x:", dev->dev_addr[i]);
- printk("%2.2x\n", dev->dev_addr[i]);
-
-+ /* xp_resp still contains the response to the READ_VERSIONS command.
-+ * For debugging, let the user know what version he has.
-+ */
-+ if(xp_resp[0].numDesc == 0) {
-+ /* This is the Typhoon 1.0 type Sleep Image, last 16 bits
-+ * of version is Month/Day of build.
-+ */
-+ u16 monthday = le32_to_cpu(xp_resp[0].parm2) & 0xffff;
-+ printk(KERN_INFO "%s: Typhoon 1.0 Sleep Image built "
-+ "%02u/%02u/2000\n", dev->name, monthday >> 8,
-+ monthday & 0xff);
-+ } else if(xp_resp[0].numDesc == 2) {
-+ /* This is the Typhoon 1.1+ type Sleep Image
-+ */
-+ u32 sleep_ver = le32_to_cpu(xp_resp[0].parm2);
-+ u8 *ver_string = (u8 *) &xp_resp[1];
-+ ver_string[25] = 0;
-+ printk(KERN_INFO "%s: Typhoon 1.1+ Sleep Image version "
-+ "%u.%u.%u.%u %s\n", dev->name, HIPQUAD(sleep_ver),
-+ ver_string);
-+ } else {
-+ printk(KERN_WARNING "%s: Unknown Sleep Image version "
-+ "(%u:%04x)\n", dev->name, xp_resp[0].numDesc,
-+ le32_to_cpu(xp_resp[0].parm2));
-+ }
-+
- return 0;
-
- error_out_reset:
---- linux-2.6.0/drivers/net/via-rhine.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/net/via-rhine.c 2003-12-28 23:21:06.000000000 -0800
-@@ -615,6 +615,15 @@ static void __devinit reload_eeprom(long
- break;
- }
-
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+static void via_rhine_poll(struct net_device *dev)
-+{
-+ disable_irq(dev->irq);
-+ via_rhine_interrupt(dev->irq, (void *)dev, NULL);
-+ enable_irq(dev->irq);
-+}
-+#endif
-+
- static int __devinit via_rhine_init_one (struct pci_dev *pdev,
- const struct pci_device_id *ent)
- {
-@@ -784,6 +793,9 @@ static int __devinit via_rhine_init_one
- dev->ethtool_ops = &netdev_ethtool_ops;
- dev->tx_timeout = via_rhine_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ dev->poll_controller = via_rhine_poll;
-+#endif
- if (np->drv_flags & ReqTxAlign)
- dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM;
-
---- linux-2.6.0/drivers/net/wan/cosa.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/wan/cosa.c 2003-12-28 23:21:01.000000000 -0800
-@@ -594,40 +594,47 @@ err_out:
- \f
- /*---------- SPPP/HDLC netdevice ---------- */
-
-+static void cosa_setup(struct net_device *d)
-+{
-+ d->open = cosa_sppp_open;
-+ d->stop = cosa_sppp_close;
-+ d->hard_start_xmit = cosa_sppp_tx;
-+ d->do_ioctl = cosa_sppp_ioctl;
-+ d->get_stats = cosa_net_stats;
-+ d->tx_timeout = cosa_sppp_timeout;
-+ d->watchdog_timeo = TX_TIMEOUT;
-+}
-+
- static void sppp_channel_init(struct channel_data *chan)
- {
- struct net_device *d;
- chan->if_ptr = &chan->pppdev;
-- chan->pppdev.dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
-- memset(chan->pppdev.dev, 0, sizeof(struct net_device));
-+ d = alloc_netdev(0, chan->name, cosa_setup);
-+ if (!d) {
-+ printk(KERN_WARNING "%s: alloc_netdev failed.\n", chan->name);
-+ return;
-+ }
-+ chan->pppdev.dev = d;
- sppp_attach(&chan->pppdev);
-- d=chan->pppdev.dev;
-- strcpy(d->name, chan->name);
- d->base_addr = chan->cosa->datareg;
- d->irq = chan->cosa->irq;
- d->dma = chan->cosa->dma;
- d->priv = chan;
-- d->init = NULL;
-- d->open = cosa_sppp_open;
-- d->stop = cosa_sppp_close;
-- d->hard_start_xmit = cosa_sppp_tx;
-- d->do_ioctl = cosa_sppp_ioctl;
-- d->get_stats = cosa_net_stats;
-- d->tx_timeout = cosa_sppp_timeout;
-- d->watchdog_timeo = TX_TIMEOUT;
- if (register_netdev(d)) {
- printk(KERN_WARNING "%s: register_netdev failed.\n", d->name);
-- sppp_detach(chan->pppdev.dev);
-- free_netdev(chan->pppdev.dev);
-+ sppp_detach(d);
-+ free_netdev(d);
-+ chan->pppdev.dev = NULL;
- return;
- }
- }
-
- static void sppp_channel_delete(struct channel_data *chan)
- {
-- sppp_detach(chan->pppdev.dev);
- unregister_netdev(chan->pppdev.dev);
-+ sppp_detach(chan->pppdev.dev);
- free_netdev(chan->pppdev.dev);
-+ chan->pppdev.dev = NULL;
- }
-
- static int cosa_sppp_open(struct net_device *d)
---- linux-2.6.0/drivers/net/wan/cycx_drv.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/net/wan/cycx_drv.c 2003-12-28 23:22:33.000000000 -0800
-@@ -425,8 +425,8 @@ static int load_cyc2x(struct cycx_hw *hw
- if (cksum != cfm->checksum) {
- printk(KERN_ERR "%s:%s: firmware corrupted!\n",
- modname, __FUNCTION__);
-- printk(KERN_ERR " cdsize = 0x%lx (expected 0x%lx)\n",
-- len - sizeof(struct cycx_firmware) - 1,
-+ printk(KERN_ERR " cdsize = 0x%x (expected 0x%x)\n",
-+ len - (int)sizeof(struct cycx_firmware) - 1,
- cfm->info.codesize);
- printk(KERN_ERR " chksum = 0x%x (expected 0x%x)\n",
- cksum, cfm->checksum);
---- linux-2.6.0/drivers/net/wan/farsync.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/wan/farsync.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1313,8 +1313,6 @@ fst_open ( struct net_device *dev )
- if ( err )
- return err;
-
-- MOD_INC_USE_COUNT;
--
- fst_openport ( dev_to_port ( dev ));
- netif_wake_queue ( dev );
- return 0;
-@@ -1326,7 +1324,6 @@ fst_close ( struct net_device *dev )
- netif_stop_queue ( dev );
- fst_closeport ( dev_to_port ( dev ));
- hdlc_close ( dev_to_hdlc ( dev ));
-- MOD_DEC_USE_COUNT;
- return 0;
- }
-
---- linux-2.6.0/drivers/net/wan/hd64572.h 2003-06-14 12:18:28.000000000 -0700
-+++ 25/drivers/net/wan/hd64572.h 2003-12-28 23:21:01.000000000 -0800
-@@ -23,8 +23,8 @@
- *
- */
-
--#ifndef _HD64572_H
--#define _HD64572_H
-+#ifndef __HD64572_H
-+#define __HD64572_H
-
- /* Illegal Access Register */
- #define ILAR 0x00
-@@ -59,6 +59,9 @@
- #define IR0_M(val, chan) ((val)<<(8*(chan))) /* Int MSCI */
-
- /* MSCI Channel Registers */
-+#define MSCI0_OFFSET 0x00
-+#define MSCI1_OFFSET 0x80
-+
- #define MD0 0x138 /* Mode reg 0 */
- #define MD1 0x139 /* Mode reg 1 */
- #define MD2 0x13a /* Mode reg 2 */
-@@ -107,6 +110,11 @@
- #define RCR 0x156 /* Rx DMA Critical Request Reg */
-
- /* Timer Registers */
-+#define TIMER0RX_OFFSET 0x00
-+#define TIMER0TX_OFFSET 0x10
-+#define TIMER1RX_OFFSET 0x20
-+#define TIMER1TX_OFFSET 0x30
-+
- #define TCNTL 0x200 /* Timer Upcounter L */
- #define TCNTH 0x201 /* Timer Upcounter H */
- #define TCONRL 0x204 /* Timer Constant Register L */
-@@ -132,6 +140,11 @@
- #define DCR_TX(chan) (0x59 + 2*chan) /* DMA Command Reg (Tx) */
-
- /* DMA Channel Registers */
-+#define DMAC0RX_OFFSET 0x00
-+#define DMAC0TX_OFFSET 0x20
-+#define DMAC1RX_OFFSET 0x40
-+#define DMAC1TX_OFFSET 0x60
-+
- #define DARL 0x80 /* Dest Addr Register L (single-block, RX only) */
- #define DARH 0x81 /* Dest Addr Register H (single-block, RX only) */
- #define DARB 0x82 /* Dest Addr Register B (single-block, RX only) */
-@@ -166,7 +179,17 @@ typedef struct {
- unsigned char filler[5]; /* alignment filler (16 bytes) */
- } pcsca_bd_t;
-
--/*
-+/* Block Descriptor Structure */
-+typedef struct {
-+ u32 cp; /* pointer to next block descriptor */
-+ u32 bp; /* buffer pointer */
-+ u16 len; /* data length */
-+ u8 stat; /* status */
-+ u8 unused; /* pads to 4-byte boundary */
-+}pkt_desc;
-+
-+
-+/*
- Descriptor Status definitions:
-
- Bit Transmission Reception
-@@ -190,6 +213,23 @@ typedef struct {
- #define DST_SHRT 0x40 /* Short Frame */
- #define DST_EOM 0x80 /* End of Message */
-
-+/* Packet Descriptor Status bits */
-+
-+#define ST_TX_EOM 0x80 /* End of frame */
-+#define ST_TX_UNDRRUN 0x08
-+#define ST_TX_OWNRSHP 0x02
-+#define ST_TX_EOT 0x01 /* End of transmition */
-+
-+#define ST_RX_EOM 0x80 /* End of frame */
-+#define ST_RX_SHORT 0x40 /* Short frame */
-+#define ST_RX_ABORT 0x20 /* Abort */
-+#define ST_RX_RESBIT 0x10 /* Residual bit */
-+#define ST_RX_OVERRUN 0x08 /* Overrun */
-+#define ST_RX_CRC 0x04 /* CRC */
-+#define ST_RX_OWNRSHP 0x02
-+
-+#define ST_ERROR_MASK 0x7C
-+
- /* Status Counter Registers */
- #define CMCR 0x158 /* Counter Master Ctl Reg */
- #define TECNTL 0x160 /* Tx EOM Counter L */
-@@ -246,11 +286,25 @@ typedef struct {
- #define MD0_BIT_SYNC 0x80
- #define MD0_TRANSP 0xc0
-
-+#define MD0_HDLC 0x80 /* Bit-sync HDLC mode */
-+
-+#define MD0_CRC_NONE 0x00
-+#define MD0_CRC_16_0 0x04
-+#define MD0_CRC_16 0x05
-+#define MD0_CRC_ITU32 0x06
-+#define MD0_CRC_ITU 0x07
-+
- #define MD1_NOADDR 0x00
- #define MD1_SADDR1 0x40
- #define MD1_SADDR2 0x80
- #define MD1_DADDR 0xc0
-
-+#define MD2_NRZI_IEEE 0x40
-+#define MD2_MANCHESTER 0x80
-+#define MD2_FM_MARK 0xA0
-+#define MD2_FM_SPACE 0xC0
-+#define MD2_LOOPBACK 0x03 /* Local data Loopback */
-+
- #define MD2_F_DUPLEX 0x00
- #define MD2_AUTO_ECHO 0x01
- #define MD2_LOOP_HI_Z 0x02
-@@ -274,6 +328,10 @@ typedef struct {
- #define CTL_URSKP 0x40
- #define CTL_URCT 0x80
-
-+#define CTL_NORTS 0x01
-+#define CTL_NODTR 0x02
-+#define CTL_IDLE 0x10
-+
- #define RXS_BR0 0x01
- #define RXS_BR1 0x02
- #define RXS_BR2 0x04
-@@ -302,6 +360,12 @@ typedef struct {
- #define EXS_TES1 0x20
- #define EXS_TES2 0x40
-
-+#define CLK_BRG_MASK 0x0F
-+#define CLK_PIN_OUT 0x80
-+#define CLK_LINE 0x00 /* clock line input */
-+#define CLK_BRG 0x40 /* internal baud rate generator */
-+#define CLK_TX_RXCLK 0x60 /* TX clock from RX clock */
-+
- #define CMD_RX_RST 0x11
- #define CMD_RX_ENA 0x12
- #define CMD_RX_DIS 0x13
-@@ -324,6 +388,10 @@ typedef struct {
- #define CMD_SRCH_MODE 0x31
- #define CMD_NOP 0x00
-
-+#define CMD_RESET 0x21
-+#define CMD_TX_ENABLE 0x02
-+#define CMD_RX_ENABLE 0x12
-+
- #define ST0_RXRDY 0x01
- #define ST0_TXRDY 0x02
- #define ST0_RXINTB 0x20
-@@ -374,6 +442,8 @@ typedef struct {
- #define IE0_RXINTB 0x20
- #define IE0_RXINTA 0x40
- #define IE0_TXINT 0x80
-+#define IE0_UDRN 0x00008000 /* TX underrun MSCI interrupt enable */
-+#define IE0_CDCD 0x00000400 /* CD level change interrupt enable */
-
- #define IE1_IDLD 0x01
- #define IE1_ABTD 0x02
-@@ -424,14 +494,28 @@ typedef struct {
- #define DIR_EOM 0x40
- #define DIR_EOT 0x80
-
-+#define DIR_REFE 0x04
-+#define DIR_UDRFE 0x04
-+#define DIR_COAE 0x08
-+#define DIR_COFE 0x10
-+#define DIR_BOFE 0x20
-+#define DIR_EOME 0x40
-+#define DIR_EOTE 0x80
-+
- #define DMR_CNTE 0x02
- #define DMR_NF 0x04
- #define DMR_SEOME 0x08
- #define DMR_TMOD 0x10
-
-+#define DMER_DME 0x80 /* DMA Master Enable */
-+
- #define DCR_SW_ABT 0x01
- #define DCR_FCT_CLR 0x02
-
-+#define DCR_ABORT 0x01
-+#define DCR_CLEAR_EOF 0x02
-+
-+#define PCR_COTE 0x80
- #define PCR_PR0 0x01
- #define PCR_PR1 0x02
- #define PCR_PR2 0x04
-@@ -440,4 +524,4 @@ typedef struct {
- #define PCR_OSB 0x40
- #define PCR_BURST 0x80
-
--#endif /* (_HD64572_H) */
-+#endif /* (__HD64572_H) */
---- linux-2.6.0/drivers/net/wan/Kconfig 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wan/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -325,6 +325,21 @@ config HDLC_X25
- comment "X.25/LAPB support is disabled"
- depends on WAN && HDLC && (LAPB!=m || HDLC!=m) && LAPB!=y
-
-+config PCI200SYN
-+ tristate "Goramo PCI200SYN support"
-+ depends on HDLC && PCI
-+ help
-+ This driver is for PCI200SYN cards made by Goramo sp. j.
-+ If you have such a card, say Y here and see
-+ <http://hq.pm.waw.pl/pub/hdlc/>
-+
-+ 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 <file:Documentation/modules.txt>. The module
-+ will be called pci200syn.
-+
-+ If unsure, say N here.
-+
- config WANXL
- tristate "SBE Inc. wanXL support"
- depends on HDLC && PCI
-@@ -334,7 +349,7 @@ config WANXL
-
- 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 <file:Documentation/modules.txt>. The module
-+ say M here and read <file:Documentation/kbuild/modules.txt>. The module
- will be called wanxl.
-
- If unsure, say N here.
-@@ -467,7 +482,7 @@ config SDLA
- Say Y here if you need a driver for the Sangoma S502A, S502E, and
- S508 Frame Relay Access Devices. These are multi-protocol cards, but
- only frame relay is supported by the driver at this time. Please
-- read <file:Documentation/framerelay.txt>.
-+ read <file:Documentation/networking/framerelay.txt>.
-
- To compile this driver as a module, choose M here: the module will be
- called sdla.
---- linux-2.6.0/drivers/net/wan/lmc/lmc_main.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/wan/lmc/lmc_main.c 2003-12-28 23:21:01.000000000 -0800
-@@ -78,30 +78,22 @@
- #include "lmc_debug.h"
- #include "lmc_proto.h"
-
--
--static int Lmc_Count = 0;
--static struct net_device *Lmc_root_dev = NULL;
--static u8 cards_found = 0;
--
- static int lmc_first_load = 0;
-
--int LMC_PKT_BUF_SZ = 1542;
-+static int LMC_PKT_BUF_SZ = 1542;
-
--#ifdef MODULE
- static struct pci_device_id lmc_pci_tbl[] = {
-- { 0x1011, 0x009, 0x1379, PCI_ANY_ID, 0, 0, 0},
-- { 0, }
-+ { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST,
-+ PCI_VENDOR_ID_LMC, PCI_ANY_ID },
-+ { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST,
-+ PCI_ANY_ID, PCI_VENDOR_ID_LMC },
-+ { 0 }
- };
-
- MODULE_DEVICE_TABLE(pci, lmc_pci_tbl);
--
- MODULE_LICENSE("GPL");
--#endif
-
-
--int lmc_probe_fake(struct net_device *dev);
--static struct net_device *lmc_probe1(struct net_device *dev, unsigned long ioaddr, unsigned int irq,
-- int chip_id, int subdevice, int board_idx);
- static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev);
- static int lmc_start_xmit(struct sk_buff *skb, struct net_device *dev);
- static int lmc_rx (struct net_device *dev);
-@@ -115,12 +107,9 @@ static void lmc_softreset(lmc_softc_t *
- static void lmc_running_reset(struct net_device *dev);
- static int lmc_ifdown(struct net_device * const);
- static void lmc_watchdog(unsigned long data);
--static int lmc_init(struct net_device * const);
- static void lmc_reset(lmc_softc_t * const sc);
- static void lmc_dec_reset(lmc_softc_t * const sc);
- static void lmc_driver_timeout(struct net_device *dev);
--int lmc_setup(void);
--
-
- /*
- * linux reserves 16 device specific IOCTLs. We call them
-@@ -815,67 +804,77 @@ kick_timer:
-
- }
-
--static int lmc_init(struct net_device * const dev) /*fold00*/
-+static void lmc_setup(struct net_device * const dev) /*fold00*/
- {
-- lmc_trace(dev, "lmc_init in");
-- lmc_trace(dev, "lmc_init out");
--
-- return 0;
-+ lmc_trace(dev, "lmc_setup in");
-+
-+ dev->type = ARPHRD_HDLC;
-+ dev->hard_start_xmit = lmc_start_xmit;
-+ dev->open = lmc_open;
-+ dev->stop = lmc_close;
-+ dev->get_stats = lmc_get_stats;
-+ dev->do_ioctl = lmc_ioctl;
-+ dev->set_config = lmc_set_config;
-+ dev->tx_timeout = lmc_driver_timeout;
-+ dev->watchdog_timeo = (HZ); /* 1 second */
-+
-+ lmc_trace(dev, "lmc_setup out");
- }
-
--/* This initializes each card from lmc_probe() */
--static struct net_device *lmc_probe1 (struct net_device *dev, unsigned long ioaddr, unsigned int irq, /*fold00*/
-- int chip_id, int subdevice, int board_idx)
-+
-+static int __devinit lmc_init_one(struct pci_dev *pdev,
-+ const struct pci_device_id *ent)
- {
-- lmc_softc_t *sc = NULL;
-+ struct net_device *dev;
-+ lmc_softc_t *sc;
-+ u16 subdevice;
- u_int16_t AdapModelNum;
--
-- /*
-- * Allocate our own device structure
-- */
--
-- dev = kmalloc (sizeof (struct net_device)+8, GFP_KERNEL);
-- if (dev == NULL){
-- printk (KERN_ERR "lmc: kmalloc for device failed\n");
-- return NULL;
-- }
-- memset (dev, 0, sizeof (struct net_device));
--
-+ int err = -ENOMEM;
-+ static int cards_found;
- #ifndef GCOM
-- /*
-- * Switch to common hdlc%d naming. We name by type not by vendor
-- */
--
-- dev_alloc_name(dev, "hdlc%d");
-+ /* We name by type not by vendor */
-+ static const char lmcname[] = "hdlc%d";
- #else
-- /*
-+ /*
- * GCOM uses LMC vendor name so that clients can know which card
- * to attach to.
- */
-- dev_alloc_name(dev, "lmc%d");
-+ static const char lmcname[] = "lmc%d";
- #endif
-
-- lmc_trace(dev, "lmc_probe1 in");
-+
-+ /*
-+ * Allocate our own device structure
-+ */
-+ dev = alloc_netdev(sizeof(lmc_softc_t), lmcname, lmc_setup);
-+ if (!dev) {
-+ printk (KERN_ERR "lmc:alloc_netdev for device failed\n");
-+ goto out1;
-+ }
-+
-+ lmc_trace(dev, "lmc_init_one in");
-+
-+ err = pci_enable_device(pdev);
-+ if (err) {
-+ printk(KERN_ERR "lmc: pci enable failed:%d\n", err);
-+ goto out2;
-+ }
-
-- Lmc_Count++;
-+ if (pci_request_regions(pdev, "lmc")) {
-+ printk(KERN_ERR "lmc: pci_request_region failed\n");
-+ err = -EIO;
-+ goto out3;
-+ }
-+
-+ pci_set_drvdata(pdev, dev);
-
- if(lmc_first_load == 0){
-- printk(KERN_INFO "Lan Media Corporation WAN Driver Version %d.%d.%d\n",DRIVER_MAJOR_VERSION, DRIVER_MINOR_VERSION,DRIVER_SUB_VERSION);
-+ printk(KERN_INFO "Lan Media Corporation WAN Driver Version %d.%d.%d\n",
-+ DRIVER_MAJOR_VERSION, DRIVER_MINOR_VERSION,DRIVER_SUB_VERSION);
- lmc_first_load = 1;
- }
-
-- /*
-- * Allocate space for the private data structure
-- */
--
-- sc = kmalloc (sizeof (lmc_softc_t), GFP_KERNEL);
-- if (sc == NULL) {
-- printk (KERN_WARNING "%s: Cannot allocate memory for device state\n",
-- dev->name);
-- return (NULL);
-- }
-- memset (sc, 0, sizeof (lmc_softc_t));
-- dev->priv = sc;
-+ sc = dev->priv;
- sc->lmc_device = dev;
- sc->name = dev->name;
-
-@@ -883,8 +882,12 @@ static struct net_device *lmc_probe1 (st
- /* An ioctl can cause a subsequent detach for raw frame interface */
- sc->if_type = LMC_PPP;
- sc->check = 0xBEAFCAFE;
-- dev->base_addr = ioaddr;
-- dev->irq = irq;
-+ dev->base_addr = pci_resource_start(pdev, 0);
-+ dev->irq = pdev->irq;
-+
-+ SET_MODULE_OWNER(dev);
-+ SET_NETDEV_DEV(dev, &pdev->dev);
-+
- /*
- * This will get the protocol layer ready and do any 1 time init's
- * Must have a valid sc and dev structure
-@@ -893,19 +896,6 @@ static struct net_device *lmc_probe1 (st
-
- lmc_proto_attach(sc);
-
-- /* Just fill in the entries for the device */
--
-- dev->init = lmc_init;
-- dev->type = ARPHRD_HDLC;
-- dev->hard_start_xmit = lmc_start_xmit;
-- dev->open = lmc_open;
-- dev->stop = lmc_close;
-- dev->get_stats = lmc_get_stats;
-- dev->do_ioctl = lmc_ioctl;
-- dev->set_config = lmc_set_config;
-- dev->tx_timeout = lmc_driver_timeout;
-- dev->watchdog_timeo = (HZ); /* 1 second */
--
- /*
- * Why were we changing this???
- dev->tx_queue_len = 100;
-@@ -914,44 +904,45 @@ static struct net_device *lmc_probe1 (st
- /* Init the spin lock so can call it latter */
-
- spin_lock_init(&sc->lmc_lock);
-+ pci_set_master(pdev);
-
-- printk ("%s: detected at %lx, irq %d\n", dev->name, ioaddr, dev->irq);
-+ printk ("%s: detected at %lx, irq %d\n", dev->name,
-+ dev->base_addr, dev->irq);
-
- if (register_netdev (dev) != 0) {
- printk (KERN_ERR "%s: register_netdev failed.\n", dev->name);
-- lmc_proto_detach(sc);
-- kfree (dev->priv);
-- kfree (dev);
-- return NULL;
-+ goto out4;
- }
-
-- /*
-- * Request the region of registers we need, so that
-- * later on, no one else will take our card away from
-- * us.
-- */
-- request_region (ioaddr, LMC_REG_RANGE, dev->name);
--
- sc->lmc_cardtype = LMC_CARDTYPE_UNKNOWN;
- sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
-
-+ /*
-+ *
-+ * Check either the subvendor or the subdevice, some systems reverse
-+ * the setting in the bois, seems to be version and arch dependent?
-+ * Fix the error, exchange the two values
-+ */
-+ if ((subdevice = pdev->subsystem_device) == PCI_VENDOR_ID_LMC)
-+ subdevice = pdev->subsystem_vendor;
-+
- switch (subdevice) {
-- case PCI_PRODUCT_LMC_HSSI:
-+ case PCI_DEVICE_ID_LMC_HSSI:
- printk ("%s: LMC HSSI\n", dev->name);
- sc->lmc_cardtype = LMC_CARDTYPE_HSSI;
- sc->lmc_media = &lmc_hssi_media;
- break;
-- case PCI_PRODUCT_LMC_DS3:
-+ case PCI_DEVICE_ID_LMC_DS3:
- printk ("%s: LMC DS3\n", dev->name);
- sc->lmc_cardtype = LMC_CARDTYPE_DS3;
- sc->lmc_media = &lmc_ds3_media;
- break;
-- case PCI_PRODUCT_LMC_SSI:
-+ case PCI_DEVICE_ID_LMC_SSI:
- printk ("%s: LMC SSI\n", dev->name);
- sc->lmc_cardtype = LMC_CARDTYPE_SSI;
- sc->lmc_media = &lmc_ssi_media;
- break;
-- case PCI_PRODUCT_LMC_T1:
-+ case PCI_DEVICE_ID_LMC_T1:
- printk ("%s: LMC T1\n", dev->name);
- sc->lmc_cardtype = LMC_CARDTYPE_T1;
- sc->lmc_media = &lmc_t1_media;
-@@ -976,13 +967,13 @@ static struct net_device *lmc_probe1 (st
- AdapModelNum = (lmc_mii_readreg (sc, 0, 3) & 0x3f0) >> 4;
-
- if ((AdapModelNum == LMC_ADAP_T1
-- && subdevice == PCI_PRODUCT_LMC_T1) || /* detect LMC1200 */
-+ && subdevice == PCI_DEVICE_ID_LMC_T1) || /* detect LMC1200 */
- (AdapModelNum == LMC_ADAP_SSI
-- && subdevice == PCI_PRODUCT_LMC_SSI) || /* detect LMC1000 */
-+ && subdevice == PCI_DEVICE_ID_LMC_SSI) || /* detect LMC1000 */
- (AdapModelNum == LMC_ADAP_DS3
-- && subdevice == PCI_PRODUCT_LMC_DS3) || /* detect LMC5245 */
-+ && subdevice == PCI_DEVICE_ID_LMC_DS3) || /* detect LMC5245 */
- (AdapModelNum == LMC_ADAP_HSSI
-- && subdevice == PCI_PRODUCT_LMC_HSSI))
-+ && subdevice == PCI_DEVICE_ID_LMC_HSSI))
- { /* detect LMC5200 */
-
- }
-@@ -996,10 +987,7 @@ static struct net_device *lmc_probe1 (st
- */
- LMC_CSR_WRITE (sc, csr_gp_timer, 0xFFFFFFFFUL);
-
-- sc->board_idx = board_idx;
--
-- memset (&sc->stats, 0, sizeof (struct lmc_statistics));
--
-+ sc->board_idx = cards_found++;
- sc->stats.check = STATCHECK;
- sc->stats.version_size = (DRIVER_VERSION << 16) +
- sizeof (struct lmc_statistics);
-@@ -1008,105 +996,40 @@ static struct net_device *lmc_probe1 (st
- sc->lmc_ok = 0;
- sc->last_link_status = 0;
-
-- lmc_trace(dev, "lmc_probe1 out");
--
-- return dev;
--}
--
--
--/* This is the entry point. This is what is called immediately. */
--/* This goes out and finds the card */
-+ lmc_trace(dev, "lmc_init_one out");
-+ return 0;
-
--int lmc_probe_fake(struct net_device *dev) /*fold00*/
--{
-- lmc_probe(NULL);
-- /* Return 1 to unloaded bogus device */
-- return 1;
-+ out4:
-+ lmc_proto_detach(sc);
-+ out3:
-+ if (pdev) {
-+ pci_release_regions(pdev);
-+ pci_set_drvdata(pdev, NULL);
-+ }
-+ out2:
-+ free_netdev(dev);
-+ out1:
-+ return err;
- }
-
--int lmc_probe (struct net_device *dev) /*fold00*/
-+/*
-+ * Called from pci when removing module.
-+ */
-+static void __devexit lmc_remove_one (struct pci_dev *pdev)
- {
-- int pci_index = 0;
-- unsigned long pci_ioaddr;
-- unsigned int pci_irq_line;
-- u16 vendor, subvendor, device, subdevice;
-- u32 foundaddr = 0;
-- u8 intcf = 0;
-- struct pci_dev *pdev = NULL;
--
-- /* Loop basically until we don't find anymore. */
-- while ((pdev = pci_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, pdev))) {
-- if (pci_enable_device(pdev))
-- break;
--
-- vendor = pdev->vendor;
-- device = pdev->device;
-- pci_irq_line = pdev->irq;
-- pci_ioaddr = pci_resource_start (pdev, 0);
-- subvendor = pdev->subsystem_vendor;
-- subdevice = pdev->subsystem_device;
--
-- pci_set_master (pdev);
--
-- /*
-- * Make sure it's the correct card. CHECK SUBVENDOR ID!
-- * There are lots of tulip's out there.
-- * Also check the region of registers we will soon be
-- * poking, to make sure no one else has reserved them.
-- * This prevents taking someone else's device.
-- *
-- * Check either the subvendor or the subdevice, some systems reverse
-- * the setting in the bois, seems to be version and arch dependent?
-- * Fix the two variables
-- *
-- */
-- if (!(check_region (pci_ioaddr, LMC_REG_RANGE)) &&
-- (vendor == CORRECT_VENDOR_ID) &&
-- (device == CORRECT_DEV_ID) &&
-- ((subvendor == PCI_VENDOR_LMC) || (subdevice == PCI_VENDOR_LMC))){
-- struct net_device *cur, *prev = NULL;
--
-- /* Fix the error, exchange the two values */
-- if(subdevice == PCI_VENDOR_LMC){
-- subdevice = subvendor;
-- subvendor = PCI_VENDOR_LMC ;
-- }
--
-- /* Make the call to actually setup this card */
-- dev = lmc_probe1 (dev, pci_ioaddr, pci_irq_line,
-- device, subdevice, cards_found);
-- if (dev == NULL) {
-- printk ("lmc_probe: lmc_probe1 failed\n");
-- goto lmc_probe_next_card;
-- }
-- /* insert the device into the chain of lmc devices */
-- for (cur = Lmc_root_dev;
-- cur != NULL;
-- cur = ((lmc_softc_t *) cur->priv)->next_module) {
-- prev = cur;
-- }
--
-- if (prev == NULL)
-- Lmc_root_dev = dev;
-- else
-- ((lmc_softc_t *) prev->priv)->next_module = dev;
--
-- ((lmc_softc_t *) dev->priv)->next_module = NULL;
-- /* end insert */
--
-- foundaddr = dev->base_addr;
--
-- cards_found++;
-- intcf++;
-- }
-- lmc_probe_next_card:
-- pci_index++;
-+ struct net_device *dev = pci_get_drvdata(pdev);
-+
-+ if (dev) {
-+ lmc_softc_t *sc = dev->priv;
-+
-+ printk("%s: removing...\n", dev->name);
-+ lmc_proto_detach(sc);
-+ unregister_netdev(dev);
-+ free_netdev(dev);
-+ pci_release_regions(pdev);
-+ pci_disable_device(pdev);
-+ pci_set_drvdata(pdev, NULL);
- }
--
-- if (cards_found < 1)
-- return -1;
--
-- return foundaddr;
- }
-
- /* After this is called, packets can be sent.
-@@ -1181,8 +1104,6 @@ static int lmc_open (struct net_device *
-
- sc->stats.tx_tbusy0++ ;
-
-- MOD_INC_USE_COUNT;
--
- /*
- * select what interrupts we want to get
- */
-@@ -1352,7 +1273,6 @@ static int lmc_ifdown (struct net_device
-
- lmc_trace(dev, "lmc_ifdown out");
-
-- MOD_DEC_USE_COUNT;
- return 0;
- }
-
-@@ -1850,12 +1770,11 @@ skip_out_of_mem:
-
- static struct net_device_stats *lmc_get_stats (struct net_device *dev) /*fold00*/
- {
-- lmc_softc_t *sc;
-+ lmc_softc_t *sc = dev->priv;
- unsigned long flags;
-
- lmc_trace(dev, "lmc_get_stats in");
-
-- sc = dev->priv;
-
- spin_lock_irqsave(&sc->lmc_lock, flags);
-
-@@ -1868,58 +1787,21 @@ static struct net_device_stats *lmc_get_
- return (struct net_device_stats *) &sc->stats;
- }
-
-+static struct pci_driver lmc_driver = {
-+ .name = "lmc",
-+ .id_table = lmc_pci_tbl,
-+ .probe = lmc_init_one,
-+ .remove = __devexit_p(lmc_remove_one),
-+};
-+
- static int __init init_lmc(void)
- {
-- printk ("lmc: module loaded\n");
--
-- /* Have lmc_probe search for all the cards, and allocate devices */
-- if (lmc_probe (NULL) < 0)
-- return -EIO;
--
-- return 0;
-+ return pci_module_init(&lmc_driver);
- }
-
- static void __exit exit_lmc(void)
- {
-- struct net_device *dev, *next;
-- lmc_softc_t *sc;
--
-- /* we have no pointer to our devices, since they are all dynamically
-- * allocated. So, here we loop through all the network devices
-- * looking for ours. When found, dispose of them properly.
-- */
--
-- for (dev = Lmc_root_dev;
-- dev != NULL;
-- dev = next )
-- {
--
-- next = ((lmc_softc_t *) dev->priv)->next_module; /* get it now before we deallocate it */
-- printk ("%s: removing...\n", dev->name);
--
-- /* close the syncppp stuff, and release irq. Close is run on unreg net */
-- lmc_close (dev);
-- sc = dev->priv;
-- if (sc != NULL)
-- lmc_proto_detach(sc);
--
-- /* Remove the device from the linked list */
-- unregister_netdev (dev);
--
-- /* Let go of the io region */;
-- release_region (dev->base_addr, LMC_REG_RANGE);
--
-- /* free our allocated structures. */
-- kfree (dev->priv);
-- dev->priv = NULL;
--
-- free_netdev (dev);
-- dev = NULL;
-- }
--
--
-- Lmc_root_dev = NULL;
-- printk ("lmc module unloaded\n");
-+ pci_unregister_driver(&lmc_driver);
- }
-
- module_init(init_lmc);
-@@ -2326,8 +2208,3 @@ bug_out:
-
-
- }
--
--int lmc_setup(void) { /*FOLD00*/
-- return lmc_probe(NULL);
--}
--
---- linux-2.6.0/drivers/net/wan/lmc/lmc_var.h 2003-06-14 12:18:09.000000000 -0700
-+++ 25/drivers/net/wan/lmc/lmc_var.h 2003-12-28 23:21:01.000000000 -0800
-@@ -390,7 +390,7 @@ struct lmc___softc {
- struct timer_list timer;
- lmc_ctl_t ictl;
- u_int32_t TxDescriptControlInit;
-- struct net_device *next_module; /* Link to the next module */
-+
- int tx_TimeoutInd; /* additional driver state */
- int tx_TimeoutDisplay;
- unsigned int lastlmc_taint_tx;
-@@ -519,18 +519,7 @@ struct lmc___softc {
- #define TULIP_CMD_RECEIVEALL 0x40000000L
- #endif
-
--
--/* PCI register values */
--#define CORRECT_VENDOR_ID 0x1011
--#define CORRECT_DEV_ID 9
--
--#define PCI_VENDOR_LMC 0x1376
--#define PCI_PRODUCT_LMC_HSSI 0x0003
--#define PCI_PRODUCT_LMC_DS3 0x0004
--#define PCI_PRODUCT_LMC_SSI 0x0005
--#define PCI_PRODUCT_LMC_T1 0x0006
--
--/* Adapcter module number */
-+/* Adapter module number */
- #define LMC_ADAP_HSSI 2
- #define LMC_ADAP_DS3 3
- #define LMC_ADAP_SSI 4
---- linux-2.6.0/drivers/net/wan/Makefile 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wan/Makefile 2003-12-28 23:21:01.000000000 -0800
-@@ -67,6 +67,7 @@ endif
- obj-$(CONFIG_N2) += n2.o
- obj-$(CONFIG_C101) += c101.o
- obj-$(CONFIG_WANXL) += wanxl.o
-+obj-$(CONFIG_PCI200SYN) += pci200syn.o
-
- ifeq ($(CONFIG_WANXL_BUILD_FIRMWARE),y)
- ifeq ($(ARCH),m68k)
---- linux-2.6.0/drivers/net/wan/pc300_drv.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wan/pc300_drv.c 2003-12-28 23:21:01.000000000 -0800
-@@ -3165,7 +3165,6 @@ int cpc_open(struct net_device *dev)
- return result;
- }
-
-- MOD_INC_USE_COUNT;
- sprintf(ifr.ifr_name, "%s", dev->name);
- cpc_opench(d);
- netif_start_queue(dev);
-@@ -3201,7 +3200,6 @@ int cpc_close(struct net_device *dev)
- }
- #endif
-
-- MOD_DEC_USE_COUNT;
- return 0;
- }
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/net/wan/pci200syn.c 2003-12-28 23:21:01.000000000 -0800
-@@ -0,0 +1,475 @@
-+/*
-+ * Goramo PCI200SYN synchronous serial card driver for Linux
-+ *
-+ * Copyright (C) 2002-2003 Krzysztof Halasa <khc@pm.waw.pl>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of version 2 of the GNU General Public License
-+ * as published by the Free Software Foundation.
-+ *
-+ * For information see http://hq.pm.waw.pl/hdlc/
-+ *
-+ * Sources of information:
-+ * Hitachi HD64572 SCA-II User's Manual
-+ * PLX Technology Inc. PCI9052 Data Book
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
-+#include <linux/fcntl.h>
-+#include <linux/in.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/moduleparam.h>
-+#include <linux/netdevice.h>
-+#include <linux/hdlc.h>
-+#include <linux/pci.h>
-+#include <asm/delay.h>
-+#include <asm/io.h>
-+
-+#include "hd64572.h"
-+
-+static const char* version = "Goramo PCI200SYN driver version: 1.16";
-+static const char* devname = "PCI200SYN";
-+
-+#undef DEBUG_PKT
-+#define DEBUG_RINGS
-+
-+#define PCI200SYN_PLX_SIZE 0x80 /* PLX control window size (128b) */
-+#define PCI200SYN_SCA_SIZE 0x400 /* SCA window size (1Kb) */
-+#define ALL_PAGES_ALWAYS_MAPPED
-+#define NEED_DETECT_RAM
-+#define NEED_SCA_MSCI_INTR
-+#define MAX_TX_BUFFERS 10
-+
-+static int pci_clock_freq = 33000000;
-+#define CLOCK_BASE pci_clock_freq
-+
-+#define PCI_VENDOR_ID_GORAMO 0x10B5 /* uses PLX:9050 ID - this card */
-+#define PCI_DEVICE_ID_PCI200SYN 0x9050 /* doesn't have its own ID */
-+
-+
-+/*
-+ * PLX PCI9052 local configuration and shared runtime registers.
-+ * This structure can be used to access 9052 registers (memory mapped).
-+ */
-+typedef struct {
-+ u32 loc_addr_range[4]; /* 00-0Ch : Local Address Ranges */
-+ u32 loc_rom_range; /* 10h : Local ROM Range */
-+ u32 loc_addr_base[4]; /* 14-20h : Local Address Base Addrs */
-+ u32 loc_rom_base; /* 24h : Local ROM Base */
-+ u32 loc_bus_descr[4]; /* 28-34h : Local Bus Descriptors */
-+ u32 rom_bus_descr; /* 38h : ROM Bus Descriptor */
-+ u32 cs_base[4]; /* 3C-48h : Chip Select Base Addrs */
-+ u32 intr_ctrl_stat; /* 4Ch : Interrupt Control/Status */
-+ u32 init_ctrl; /* 50h : EEPROM ctrl, Init Ctrl, etc */
-+}plx9052;
-+
-+
-+
-+typedef struct port_s {
-+ hdlc_device hdlc; /* HDLC device struct - must be first */
-+ struct card_s *card;
-+ spinlock_t lock; /* TX lock */
-+ sync_serial_settings settings;
-+ int rxpart; /* partial frame received, next frame invalid*/
-+ unsigned short encoding;
-+ unsigned short parity;
-+ u16 rxin; /* rx ring buffer 'in' pointer */
-+ u16 txin; /* tx ring buffer 'in' and 'last' pointers */
-+ u16 txlast;
-+ u8 rxs, txs, tmc; /* SCA registers */
-+ u8 phy_node; /* physical port # - 0 or 1 */
-+}port_t;
-+
-+
-+
-+typedef struct card_s {
-+ u8* rambase; /* buffer memory base (virtual) */
-+ u8* scabase; /* SCA memory base (virtual) */
-+ plx9052* plxbase; /* PLX registers memory base (virtual) */
-+ u16 rx_ring_buffers; /* number of buffers in a ring */
-+ u16 tx_ring_buffers;
-+ u16 buff_offset; /* offset of first buffer of first channel */
-+ u8 irq; /* interrupt request level */
-+
-+ port_t ports[2];
-+}card_t;
-+
-+
-+#define sca_in(reg, card) readb(card->scabase + (reg))
-+#define sca_out(value, reg, card) writeb(value, card->scabase + (reg))
-+#define sca_inw(reg, card) readw(card->scabase + (reg))
-+#define sca_outw(value, reg, card) writew(value, card->scabase + (reg))
-+#define sca_inl(reg, card) readl(card->scabase + (reg))
-+#define sca_outl(value, reg, card) writel(value, card->scabase + (reg))
-+
-+#define port_to_card(port) (port->card)
-+#define log_node(port) (port->phy_node)
-+#define phy_node(port) (port->phy_node)
-+#define winbase(card) (card->rambase)
-+#define get_port(card, port) (&card->ports[port])
-+#define sca_flush(card) (sca_in(IER0, card));
-+
-+static inline void new_memcpy_toio(char *dest, char *src, int length)
-+{
-+ int len;
-+ do {
-+ len = length > 256 ? 256 : length;
-+ memcpy_toio(dest, src, len);
-+ dest += len;
-+ src += len;
-+ length -= len;
-+ readb(dest);
-+ } while (len);
-+}
-+
-+#undef memcpy_toio
-+#define memcpy_toio new_memcpy_toio
-+
-+#include "hd6457x.c"
-+
-+
-+static void pci200_set_iface(port_t *port)
-+{
-+ card_t *card = port->card;
-+ u16 msci = get_msci(port);
-+ u8 rxs = port->rxs & CLK_BRG_MASK;
-+ u8 txs = port->txs & CLK_BRG_MASK;
-+
-+ sca_out(EXS_TES1, (phy_node(port) ? MSCI1_OFFSET : MSCI0_OFFSET) + EXS,
-+ port_to_card(port));
-+ switch(port->settings.clock_type) {
-+ case CLOCK_INT:
-+ rxs |= CLK_BRG; /* BRG output */
-+ txs |= CLK_PIN_OUT | CLK_TX_RXCLK; /* RX clock */
-+ break;
-+
-+ case CLOCK_TXINT:
-+ rxs |= CLK_LINE; /* RXC input */
-+ txs |= CLK_PIN_OUT | CLK_BRG; /* BRG output */
-+ break;
-+
-+ case CLOCK_TXFROMRX:
-+ rxs |= CLK_LINE; /* RXC input */
-+ txs |= CLK_PIN_OUT | CLK_TX_RXCLK; /* RX clock */
-+ break;
-+
-+ default: /* EXTernal clock */
-+ rxs |= CLK_LINE; /* RXC input */
-+ txs |= CLK_PIN_OUT | CLK_LINE; /* TXC input */
-+ break;
-+ }
-+
-+ port->rxs = rxs;
-+ port->txs = txs;
-+ sca_out(rxs, msci + RXS, card);
-+ sca_out(txs, msci + TXS, card);
-+ sca_set_port(port);
-+}
-+
-+
-+
-+static int pci200_open(struct net_device *dev)
-+{
-+ hdlc_device *hdlc = dev_to_hdlc(dev);
-+ port_t *port = hdlc_to_port(hdlc);
-+
-+ int result = hdlc_open(hdlc);
-+ if (result)
-+ return result;
-+
-+ sca_open(hdlc);
-+ pci200_set_iface(port);
-+ sca_flush(port_to_card(port));
-+ return 0;
-+}
-+
-+
-+
-+static int pci200_close(struct net_device *dev)
-+{
-+ hdlc_device *hdlc = dev_to_hdlc(dev);
-+ sca_close(hdlc);
-+ sca_flush(port_to_card(dev_to_port(dev)));
-+ hdlc_close(hdlc);
-+ return 0;
-+}
-+
-+
-+
-+static int pci200_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-+{
-+ const size_t size = sizeof(sync_serial_settings);
-+ sync_serial_settings new_line, *line = ifr->ifr_settings.ifs_ifsu.sync;
-+ hdlc_device *hdlc = dev_to_hdlc(dev);
-+ port_t *port = hdlc_to_port(hdlc);
-+
-+#ifdef DEBUG_RINGS
-+ if (cmd == SIOCDEVPRIVATE) {
-+ sca_dump_rings(hdlc);
-+ return 0;
-+ }
-+#endif
-+ if (cmd != SIOCWANDEV)
-+ return hdlc_ioctl(dev, ifr, cmd);
-+
-+ switch(ifr->ifr_settings.type) {
-+ case IF_GET_IFACE:
-+ ifr->ifr_settings.type = IF_IFACE_V35;
-+ if (ifr->ifr_settings.size < size) {
-+ ifr->ifr_settings.size = size; /* data size wanted */
-+ return -ENOBUFS;
-+ }
-+ if (copy_to_user(line, &port->settings, size))
-+ return -EFAULT;
-+ return 0;
-+
-+ case IF_IFACE_V35:
-+ case IF_IFACE_SYNC_SERIAL:
-+ if (!capable(CAP_NET_ADMIN))
-+ return -EPERM;
-+
-+ if (copy_from_user(&new_line, line, size))
-+ return -EFAULT;
-+
-+ if (new_line.clock_type != CLOCK_EXT &&
-+ new_line.clock_type != CLOCK_TXFROMRX &&
-+ new_line.clock_type != CLOCK_INT &&
-+ new_line.clock_type != CLOCK_TXINT)
-+ return -EINVAL; /* No such clock setting */
-+
-+ if (new_line.loopback != 0 && new_line.loopback != 1)
-+ return -EINVAL;
-+
-+ memcpy(&port->settings, &new_line, size); /* Update settings */
-+ pci200_set_iface(port);
-+ sca_flush(port_to_card(port));
-+ return 0;
-+
-+ default:
-+ return hdlc_ioctl(dev, ifr, cmd);
-+ }
-+}
-+
-+
-+
-+static void pci200_pci_remove_one(struct pci_dev *pdev)
-+{
-+ int i;
-+ card_t *card = pci_get_drvdata(pdev);
-+
-+ for(i = 0; i < 2; i++)
-+ if (card->ports[i].card)
-+ unregister_hdlc_device(&card->ports[i].hdlc);
-+
-+ if (card->irq)
-+ free_irq(card->irq, card);
-+
-+ if (card->rambase)
-+ iounmap(card->rambase);
-+ if (card->scabase)
-+ iounmap(card->scabase);
-+ if (card->plxbase)
-+ iounmap(card->plxbase);
-+
-+ pci_release_regions(pdev);
-+ pci_disable_device(pdev);
-+ pci_set_drvdata(pdev, NULL);
-+ kfree(card);
-+}
-+
-+
-+
-+static int __devinit pci200_pci_init_one(struct pci_dev *pdev,
-+ const struct pci_device_id *ent)
-+{
-+ card_t *card;
-+ u8 rev_id;
-+ u32 *p;
-+ int i;
-+ u32 ramsize;
-+ u32 ramphys; /* buffer memory base */
-+ u32 scaphys; /* SCA memory base */
-+ u32 plxphys; /* PLX registers memory base */
-+
-+#ifndef MODULE
-+ static int printed_version;
-+ if (!printed_version++)
-+ printk(KERN_INFO "%s\n", version);
-+#endif
-+
-+ i = pci_enable_device(pdev);
-+ if (i)
-+ return i;
-+
-+ i = pci_request_regions(pdev, "PCI200SYN");
-+ if (i) {
-+ pci_disable_device(pdev);
-+ return i;
-+ }
-+
-+ card = kmalloc(sizeof(card_t), GFP_KERNEL);
-+ if (card == NULL) {
-+ printk(KERN_ERR "pci200syn: unable to allocate memory\n");
-+ pci_release_regions(pdev);
-+ pci_disable_device(pdev);
-+ return -ENOBUFS;
-+ }
-+ memset(card, 0, sizeof(card_t));
-+ pci_set_drvdata(pdev, card);
-+
-+ pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id);
-+ if (pci_resource_len(pdev, 0) != PCI200SYN_PLX_SIZE ||
-+ pci_resource_len(pdev, 2) != PCI200SYN_SCA_SIZE ||
-+ pci_resource_len(pdev, 3) < 16384) {
-+ printk(KERN_ERR "pci200syn: invalid card EEPROM parameters\n");
-+ pci200_pci_remove_one(pdev);
-+ return -EFAULT;
-+ }
-+
-+ plxphys = pci_resource_start(pdev,0) & PCI_BASE_ADDRESS_MEM_MASK;
-+ card->plxbase = ioremap(plxphys, PCI200SYN_PLX_SIZE);
-+
-+ scaphys = pci_resource_start(pdev,2) & PCI_BASE_ADDRESS_MEM_MASK;
-+ card->scabase = ioremap(scaphys, PCI200SYN_SCA_SIZE);
-+
-+ ramphys = pci_resource_start(pdev,3) & PCI_BASE_ADDRESS_MEM_MASK;
-+ card->rambase = ioremap(ramphys, pci_resource_len(pdev,3));
-+
-+ if (card->plxbase == NULL ||
-+ card->scabase == NULL ||
-+ card->rambase == NULL) {
-+ printk(KERN_ERR "pci200syn: ioremap() failed\n");
-+ pci200_pci_remove_one(pdev);
-+ }
-+
-+ /* Reset PLX */
-+ p = &card->plxbase->init_ctrl;
-+ writel(readl(p) | 0x40000000, p);
-+ readl(p); /* Flush the write - do not use sca_flush */
-+ udelay(1);
-+
-+ writel(readl(p) & ~0x40000000, p);
-+ readl(p); /* Flush the write - do not use sca_flush */
-+ udelay(1);
-+
-+ ramsize = sca_detect_ram(card, card->rambase,
-+ pci_resource_len(pdev, 3));
-+
-+ /* number of TX + RX buffers for one port - this is dual port card */
-+ i = ramsize / (2 * (sizeof(pkt_desc) + HDLC_MAX_MRU));
-+ card->tx_ring_buffers = min(i / 2, MAX_TX_BUFFERS);
-+ card->rx_ring_buffers = i - card->tx_ring_buffers;
-+
-+ card->buff_offset = 2 * sizeof(pkt_desc) * (card->tx_ring_buffers +
-+ card->rx_ring_buffers);
-+
-+ printk(KERN_INFO "pci200syn: %u KB RAM at 0x%x, IRQ%u, using %u TX +"
-+ " %u RX packets rings\n", ramsize / 1024, ramphys,
-+ pdev->irq, card->tx_ring_buffers, card->rx_ring_buffers);
-+
-+ if (card->tx_ring_buffers < 1) {
-+ printk(KERN_ERR "pci200syn: RAM test failed\n");
-+ pci200_pci_remove_one(pdev);
-+ return -EFAULT;
-+ }
-+
-+ /* Enable interrupts on the PCI bridge */
-+ p = &card->plxbase->intr_ctrl_stat;
-+ writew(readw(p) | 0x0040, p);
-+
-+ /* Allocate IRQ */
-+ if(request_irq(pdev->irq, sca_intr, SA_SHIRQ, devname, card)) {
-+ printk(KERN_WARNING "pci200syn: could not allocate IRQ%d.\n",
-+ pdev->irq);
-+ pci200_pci_remove_one(pdev);
-+ return -EBUSY;
-+ }
-+ card->irq = pdev->irq;
-+
-+ sca_init(card, 0);
-+
-+ for(i = 0; i < 2; i++) {
-+ port_t *port = &card->ports[i];
-+ struct net_device *dev = hdlc_to_dev(&port->hdlc);
-+ port->phy_node = i;
-+
-+ spin_lock_init(&port->lock);
-+ SET_MODULE_OWNER(dev);
-+ dev->irq = card->irq;
-+ dev->mem_start = ramphys;
-+ dev->mem_end = ramphys + ramsize - 1;
-+ dev->tx_queue_len = 50;
-+ dev->do_ioctl = pci200_ioctl;
-+ dev->open = pci200_open;
-+ dev->stop = pci200_close;
-+ port->hdlc.attach = sca_attach;
-+ port->hdlc.xmit = sca_xmit;
-+ port->settings.clock_type = CLOCK_EXT;
-+ if(register_hdlc_device(&port->hdlc)) {
-+ printk(KERN_ERR "pci200syn: unable to register hdlc "
-+ "device\n");
-+ pci200_pci_remove_one(pdev);
-+ return -ENOBUFS;
-+ }
-+ port->card = card;
-+ sca_init_sync_port(port); /* Set up SCA memory */
-+
-+ printk(KERN_INFO "%s: PCI200SYN node %d\n",
-+ hdlc_to_name(&port->hdlc), port->phy_node);
-+ }
-+
-+ sca_flush(card);
-+ return 0;
-+}
-+
-+
-+
-+static struct pci_device_id pci200_pci_tbl[] __devinitdata = {
-+ { PCI_VENDOR_ID_GORAMO, PCI_DEVICE_ID_PCI200SYN, PCI_ANY_ID,
-+ PCI_ANY_ID, 0, 0, 0 },
-+ { 0, }
-+};
-+
-+
-+static struct pci_driver pci200_pci_driver = {
-+ name: "PCI200SYN",
-+ id_table: pci200_pci_tbl,
-+ probe: pci200_pci_init_one,
-+ remove: pci200_pci_remove_one,
-+};
-+
-+
-+static int __init pci200_init_module(void)
-+{
-+#ifdef MODULE
-+ printk(KERN_INFO "%s\n", version);
-+#endif
-+ if (pci_clock_freq < 1000000 || pci_clock_freq > 80000000) {
-+ printk(KERN_ERR "pci200syn: Invalid PCI clock frequency\n");
-+ return -EINVAL;
-+ }
-+ return pci_module_init(&pci200_pci_driver);
-+}
-+
-+
-+
-+static void __exit pci200_cleanup_module(void)
-+{
-+ pci_unregister_driver(&pci200_pci_driver);
-+}
-+
-+MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
-+MODULE_DESCRIPTION("Goramo PCI200SYN serial port driver");
-+MODULE_LICENSE("GPL v2");
-+MODULE_DEVICE_TABLE(pci, pci200_pci_tbl);
-+module_param(pci_clock_freq, int, 0444);
-+MODULE_PARM_DESC(pci_clock_freq, "System PCI clock frequency in Hz");
-+module_init(pci200_init_module);
-+module_exit(pci200_cleanup_module);
---- linux-2.6.0/drivers/net/wan/x25_asy.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/wan/x25_asy.c 2003-12-28 23:21:01.000000000 -0800
-@@ -94,7 +94,7 @@ static struct x25_asy *x25_asy_alloc(voi
- return sl;
- } else {
- printk("x25_asy_alloc() - register_netdev() failure.\n");
-- kfree(dev);
-+ free_netdev(dev);
- }
- }
- return NULL;
---- linux-2.6.0/drivers/net/wd.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wd.c 2003-12-28 23:21:01.000000000 -0800
-@@ -47,7 +47,6 @@ static const char version[] =
- static unsigned int wd_portlist[] __initdata =
- {0x300, 0x280, 0x380, 0x240, 0};
-
--int wd_probe(struct net_device *dev);
- static int wd_probe1(struct net_device *dev, int ioaddr);
-
- static int wd_open(struct net_device *dev);
-@@ -83,11 +82,14 @@ static int wd_close(struct net_device *d
- The wd_probe1() routine initializes the card and fills the
- station address field. */
-
--int __init wd_probe(struct net_device *dev)
-+static int __init do_wd_probe(struct net_device *dev)
- {
- int i;
- struct resource *r;
- int base_addr = dev->base_addr;
-+ int irq = dev->irq;
-+ int mem_start = dev->mem_start;
-+ int mem_end = dev->mem_end;
-
- SET_MODULE_OWNER(dev);
-
-@@ -115,11 +117,45 @@ int __init wd_probe(struct net_device *d
- return 0;
- }
- release_region(ioaddr, WD_IO_EXTENT);
-+ dev->irq = irq;
-+ dev->mem_start = mem_start;
-+ dev->mem_end = mem_end;
- }
-
- return -ENODEV;
- }
-
-+static void cleanup_card(struct net_device *dev)
-+{
-+ free_irq(dev->irq, dev);
-+ release_region(dev->base_addr - WD_NIC_OFFSET, WD_IO_EXTENT);
-+}
-+
-+struct net_device * __init wd_probe(int unit)
-+{
-+ struct net_device *dev = alloc_ei_netdev();
-+ int err;
-+
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ err = do_wd_probe(dev);
-+ if (err)
-+ goto out;
-+ err = register_netdev(dev);
-+ if (err)
-+ goto out1;
-+ return dev;
-+out1:
-+ cleanup_card(dev);
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(err);
-+}
-+
- static int __init wd_probe1(struct net_device *dev, int ioaddr)
- {
- int i;
-@@ -262,19 +298,11 @@ static int __init wd_probe1(struct net_d
- } else if (dev->irq == 2) /* Fixup bogosity: IRQ2 is really IRQ9 */
- dev->irq = 9;
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk (" unable to get memory for dev->priv.\n");
-- return -ENOMEM;
-- }
--
- /* Snarf the interrupt now. There's no point in waiting since we cannot
- share and the board will usually be enabled. */
- i = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev);
- if (i) {
- printk (" unable to get IRQ %d.\n", dev->irq);
-- kfree(dev->priv);
-- dev->priv = NULL;
- return i;
- }
-
-@@ -446,7 +474,7 @@ wd_close(struct net_device *dev)
- \f
- #ifdef MODULE
- #define MAX_WD_CARDS 4 /* Max number of wd cards per module */
--static struct net_device dev_wd[MAX_WD_CARDS];
-+static struct net_device *dev_wd[MAX_WD_CARDS];
- static int io[MAX_WD_CARDS];
- static int irq[MAX_WD_CARDS];
- static int mem[MAX_WD_CARDS];
-@@ -468,29 +496,35 @@ ISA device autoprobes on a running machi
- int
- init_module(void)
- {
-+ struct net_device *dev;
- int this_dev, found = 0;
-
- for (this_dev = 0; this_dev < MAX_WD_CARDS; this_dev++) {
-- struct net_device *dev = &dev_wd[this_dev];
-- dev->irq = irq[this_dev];
-- dev->base_addr = io[this_dev];
-- dev->mem_start = mem[this_dev];
-- dev->mem_end = mem_end[this_dev];
-- dev->init = wd_probe;
- if (io[this_dev] == 0) {
- if (this_dev != 0) break; /* only autoprobe 1st one */
- printk(KERN_NOTICE "wd.c: Presently autoprobing (not recommended) for a single card.\n");
- }
-- if (register_netdev(dev) != 0) {
-- printk(KERN_WARNING "wd.c: No wd80x3 card found (i/o = 0x%x).\n", io[this_dev]);
-- if (found != 0) { /* Got at least one. */
-- return 0;
-+ dev = alloc_ei_netdev();
-+ if (!dev)
-+ break;
-+ dev->irq = irq[this_dev];
-+ dev->base_addr = io[this_dev];
-+ dev->mem_start = mem[this_dev];
-+ dev->mem_end = mem_end[this_dev];
-+ if (do_wd_probe(dev) == 0) {
-+ if (register_netdev(dev) == 0) {
-+ dev_wd[found++] = dev;
-+ continue;
- }
-- return -ENXIO;
-+ cleanup_card(dev);
- }
-- found++;
-- }
-- return 0;
-+ free_netdev(dev);
-+ printk(KERN_WARNING "wd.c: No wd80x3 card found (i/o = 0x%x).\n", io[this_dev]);
-+ break;
-+ }
-+ if (found)
-+ return 0;
-+ return -ENXIO;
- }
-
- void
-@@ -499,14 +533,11 @@ cleanup_module(void)
- int this_dev;
-
- for (this_dev = 0; this_dev < MAX_WD_CARDS; this_dev++) {
-- struct net_device *dev = &dev_wd[this_dev];
-- if (dev->priv != NULL) {
-- void *priv = dev->priv;
-- int ioaddr = dev->base_addr - WD_NIC_OFFSET;
-- free_irq(dev->irq, dev);
-- release_region(ioaddr, WD_IO_EXTENT);
-+ struct net_device *dev = dev_wd[this_dev];
-+ if (dev) {
- unregister_netdev(dev);
-- kfree(priv);
-+ cleanup_card(dev);
-+ free_netdev(dev);
- }
- }
- }
---- linux-2.6.0/drivers/net/wireless/airo.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/net/wireless/airo.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1027,7 +1027,6 @@ struct airo_info {
- #define FLAG_802_11 7
- #define FLAG_PENDING_XMIT 9
- #define FLAG_PENDING_XMIT11 10
--#define FLAG_PCI 11
- #define JOB_MASK 0x1ff0000
- #define JOB_DIE 16
- #define JOB_XMIT 17
-@@ -4623,7 +4622,6 @@ static int __devinit airo_pci_probe(stru
- return -ENODEV;
-
- pci_set_drvdata(pdev, dev);
-- set_bit (FLAG_PCI, &((struct airo_info *)dev->priv)->flags);
- return 0;
- }
-
-@@ -4653,7 +4651,7 @@ static int __init airo_init_module( void
-
- #ifdef CONFIG_PCI
- printk( KERN_INFO "airo: Probing for PCI adapters\n" );
-- pci_module_init(&airo_driver);
-+ pci_register_driver(&airo_driver);
- printk( KERN_INFO "airo: Finished probing for PCI adapters\n" );
- #endif
-
-@@ -4665,22 +4663,15 @@ static int __init airo_init_module( void
-
- static void __exit airo_cleanup_module( void )
- {
-- int is_pci = 0;
- while( airo_devices ) {
- printk( KERN_INFO "airo: Unregistering %s\n", airo_devices->dev->name );
--#ifdef CONFIG_PCI
-- if (test_bit(FLAG_PCI, &((struct airo_info *)airo_devices->dev->priv)->flags))
-- is_pci = 1;
--#endif
- stop_airo_card( airo_devices->dev, 1 );
- }
- remove_proc_entry("aironet", proc_root_driver);
-
-- if (is_pci) {
- #ifdef CONFIG_PCI
-- pci_unregister_driver(&airo_driver);
-+ pci_unregister_driver(&airo_driver);
- #endif
-- }
- }
-
- #ifdef WIRELESS_EXT
---- linux-2.6.0/drivers/net/wireless/airo_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/airo_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -233,7 +233,7 @@ static dev_link_t *airo_attach(void)
- client_reg.event_handler = &airo_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- airo_detach(link);
-@@ -277,7 +277,7 @@ static void airo_detach(dev_link_t *link
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
-
-
-@@ -298,11 +298,8 @@ static void airo_detach(dev_link_t *link
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn),args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void airo_config(dev_link_t *link)
- {
-@@ -329,9 +326,9 @@ static void airo_config(dev_link_t *link
- tuple.TupleData = buf;
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -351,12 +348,13 @@ static void airo_config(dev_link_t *link
- will only use the CIS to fill in implementation-defined details.
- */
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
- cistpl_cftable_entry_t dflt = { 0 };
- cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
-
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
- if (cfg->index == 0) goto next_entry;
-@@ -405,7 +403,8 @@ static void airo_config(dev_link_t *link
- }
-
- /* This reserves IO space but doesn't actually enable it */
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
-
- /*
- Now set up a common memory window, if needed. There is room
-@@ -425,16 +424,17 @@ static void airo_config(dev_link_t *link
- req.Base = mem->win[0].host_addr;
- req.Size = mem->win[0].len;
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- CFG_CHECK(RequestWindow, &link->win, &req);
-+ if (pcmcia_request_window(&link->handle, &req, &link->win) != 0)
-+ goto next_entry;
- map.Page = 0; map.CardOffset = mem->win[0].card_addr;
-- CFG_CHECK(MapMemPage, link->win, &map);
-+ if (pcmcia_map_mem_page(link->win, &map) != 0)
-+ goto next_entry;
- }
- /* If we got this far, we're cool! */
- break;
-
- next_entry:
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
- /*
-@@ -443,14 +443,14 @@ static void airo_config(dev_link_t *link
- irq structure is initialized.
- */
- if (link->conf.Attributes & CONF_ENABLE_IRQ)
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-
- /*
- This actually configures the PCMCIA socket -- setting up
- the I/O windows and the interrupt mapping, and putting the
- card and host interface into "Memory and IO" mode.
- */
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
- ((local_info_t*)link->priv)->eth_dev =
- init_airo_card( link->irq.AssignedIRQ,
- link->io.BasePort1, 1 );
-@@ -526,12 +526,12 @@ static void airo_release(dev_link_t *lin
-
- /* Don't bother checking to see if these succeed or not */
- if (link->win)
-- CardServices(ReleaseWindow, link->win);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_window(link->win);
-+ pcmcia_release_configuration(link->handle);
- if (link->io.NumPorts1)
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- if (link->irq.AssignedIRQ)
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
-
- if (link->state & DEV_STALE_CONFIG)
-@@ -576,7 +576,7 @@ static int airo_event(event_t event, int
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG) {
- netif_device_detach(local->eth_dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -584,7 +584,7 @@ static int airo_event(event_t event, int
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- reset_airo_card(local->eth_dev);
- netif_device_attach(local->eth_dev);
- }
---- linux-2.6.0/drivers/net/wireless/airport.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/net/wireless/airport.c 2003-12-28 23:21:01.000000000 -0800
-@@ -216,7 +216,7 @@ airport_attach(struct macio_dev *mdev, c
-
- if (! request_OF_resource(of_node, 0, " (airport)")) {
- printk(KERN_ERR "airport: can't request IO resource !\n");
-- kfree(dev);
-+ free_netdev(dev);
- return -ENODEV;
- }
-
---- linux-2.6.0/drivers/net/wireless/arlan.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/arlan.h 2003-12-28 23:21:01.000000000 -0800
-@@ -57,12 +57,8 @@ extern int arlan_command(struct net_
-
- #define SIDUNKNOWN -1
- #define radioNodeIdUNKNOWN -1
--#define encryptionKeyUNKNOWN '\0';
- #define irqUNKNOWN 0
--#define memUNKNOWN 0
- #define debugUNKNOWN 0
--#define probeUNKNOWN 1
--#define numDevicesUNKNOWN 1
- #define testMemoryUNKNOWN 1
- #define spreadingCodeUNKNOWN 0
- #define channelNumberUNKNOWN 0
-@@ -82,6 +78,8 @@ extern int arlan_command(struct net_
- #define ARLAN_DEBUG(a,b)
- #endif
-
-+#define ARLAN_SHMEM_SIZE 0x2000
-+
- struct arlan_shmem
- {
- /* Header Signature */
---- linux-2.6.0/drivers/net/wireless/arlan-main.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/net/wireless/arlan-main.c 2003-12-28 23:21:01.000000000 -0800
-@@ -19,9 +19,7 @@ struct net_device *arlan_device[MAX_ARLA
- static int SID = SIDUNKNOWN;
- static int radioNodeId = radioNodeIdUNKNOWN;
- static char encryptionKey[12] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
--static int mem = memUNKNOWN;
- int arlan_debug = debugUNKNOWN;
--static int numDevices = numDevicesUNKNOWN;
- static int spreadingCode = spreadingCodeUNKNOWN;
- static int channelNumber = channelNumberUNKNOWN;
- static int channelSet = channelSetUNKNOWN;
-@@ -45,9 +43,7 @@ static int mdebug;
-
- MODULE_PARM(irq, "i");
- MODULE_PARM(mem, "i");
--MODULE_PARM(probe, "i");
- MODULE_PARM(arlan_debug, "i");
--MODULE_PARM(numDevices, "i");
- MODULE_PARM(testMemory, "i");
- MODULE_PARM(spreadingCode, "i");
- MODULE_PARM(channelNumber, "i");
-@@ -69,9 +65,7 @@ MODULE_PARM(arlan_entry_and_exit_debug,
- MODULE_PARM(arlan_EEPROM_bad, "i");
- MODULE_PARM_DESC(irq, "(unused)");
- MODULE_PARM_DESC(mem, "Arlan memory address for single device probing");
--MODULE_PARM_DESC(probe, "Arlan probe at initialization (0-1)");
- MODULE_PARM_DESC(arlan_debug, "Arlan debug enable (0-1)");
--MODULE_PARM_DESC(numDevices, "Number of Arlan devices; ignored if >1");
- MODULE_PARM_DESC(testMemory, "(unused)");
- MODULE_PARM_DESC(mdebug, "Arlan multicast debugging (0-1)");
- MODULE_PARM_DESC(retries, "Arlan maximum packet retransmisions");
-@@ -88,7 +82,6 @@ MODULE_PARM_DESC(arlan_entry_and_exit_de
- struct arlan_conf_stru arlan_conf[MAX_ARLANS];
- static int arlans_found;
-
--static int arlan_probe_here(struct net_device *dev, int ioaddr);
- static int arlan_open(struct net_device *dev);
- static int arlan_tx(struct sk_buff *skb, struct net_device *dev);
- static irqreturn_t arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-@@ -975,24 +968,27 @@ static int lastFoundAt = 0xbe000;
- * probes on the ISA bus. A good device probes avoids doing writes, and
- * verifies that the correct device exists and functions.
- */
--
--static int __init arlan_check_fingerprint(int memaddr)
-+#define ARLAN_SHMEM_SIZE 0x2000
-+static int __init arlan_check_fingerprint(unsigned long memaddr)
- {
-- static char probeText[] = "TELESYSTEM SLW INC. ARLAN \0";
-- char tempBuf[49];
-+ static const char probeText[] = "TELESYSTEM SLW INC. ARLAN \0";
- volatile struct arlan_shmem *arlan = (struct arlan_shmem *) memaddr;
-+ unsigned long paddr = virt_to_phys((void *) memaddr);
-+ char tempBuf[49];
-
- ARLAN_DEBUG_ENTRY("arlan_check_fingerprint");
-- if (check_mem_region(virt_to_phys((void *)memaddr),0x2000 )){
-- // printk(KERN_WARNING "arlan: memory region %lx excluded from probing \n",virt_to_phys((void*)memaddr));
-+
-+ if (!request_mem_region(paddr, ARLAN_SHMEM_SIZE, "arlan")) {
-+ // printk(KERN_WARNING "arlan: memory region %lx excluded from probing \n",paddr);
- return -ENODEV;
- }
-+
- memcpy_fromio(tempBuf, arlan->textRegion, 29);
- tempBuf[30] = 0;
-
- /* check for card at this address */
- if (0 != strncmp(tempBuf, probeText, 29)){
--// not release_mem_region(virt_to_phys((void*)memaddr),0x2000);
-+ release_mem_region(paddr, ARLAN_SHMEM_SIZE);
- return -ENODEV;
- }
-
-@@ -1000,51 +996,8 @@ static int __init arlan_check_fingerprin
- ARLAN_DEBUG_EXIT("arlan_check_fingerprint");
-
- return 0;
--
--
--}
--
--static int __init arlan_probe_everywhere(struct net_device *dev)
--{
-- int m;
-- int probed = 0;
-- int found = 0;
--
-- SET_MODULE_OWNER(dev);
--
-- ARLAN_DEBUG_ENTRY("arlan_probe_everywhere");
-- if (mem != 0 && numDevices == 1) /* Check a single specified location. */
-- {
-- if (arlan_probe_here(dev, (int) phys_to_virt( mem) ) == 0)
-- return 0;
-- else
-- return -ENODEV;
-- }
-- for (m = (int)phys_to_virt(lastFoundAt) + 0x2000; m <= (int)phys_to_virt(0xDE000); m += 0x2000)
-- {
-- if (arlan_probe_here(dev, m) == 0)
-- {
-- found++;
-- lastFoundAt = (int)virt_to_phys((void*)m);
-- break;
-- }
-- probed++;
-- }
-- if (found == 0 && probed != 0)
-- {
-- if (lastFoundAt == 0xbe000)
-- printk(KERN_ERR "arlan: No Arlan devices found \n");
-- return -ENODEV;
-- }
-- else
-- return 0;
--
-- ARLAN_DEBUG_EXIT("arlan_probe_everywhere");
--
-- return -ENODEV;
- }
-
--
- static int arlan_change_mtu(struct net_device *dev, int new_mtu)
- {
- struct arlan_private *priv = dev->priv;
-@@ -1085,47 +1038,15 @@ static int arlan_mac_addr(struct net_dev
-
-
-
--
--static int __init
-- arlan_allocate_device(int num, struct net_device *devs)
-+static int __init arlan_setup_device(struct net_device *dev, int num)
- {
-+ struct arlan_private *ap = dev->priv;
-+ int err;
-
-- struct net_device *dev;
-- struct arlan_private *ap;
-+ ARLAN_DEBUG_ENTRY("arlan_setup_device");
-
-- ARLAN_DEBUG_ENTRY("arlan_allocate_device");
-+ ap->conf = (struct arlan_shmem *)(ap+1);
-
-- if (!devs) {
-- dev = init_etherdev(0, sizeof(struct arlan_private) + sizeof(struct arlan_shmem));
-- if (!dev) {
-- printk(KERN_ERR "ARLAN: init_etherdev failed\n");
-- return 0;
-- }
-- ap = dev->priv;
-- ap->conf = dev->priv + sizeof(struct arlan_private);
-- ap->init_etherdev_alloc = 1;
-- } else {
-- dev = devs;
-- dev->priv = kmalloc(sizeof(struct arlan_private) + sizeof(struct arlan_shmem), GFP_KERNEL);
-- if (!dev->priv) {
-- printk(KERN_ERR "ARLAN: kmalloc of dev->priv failed\n");
-- return 0;
-- }
-- ap = dev->priv;
-- ap->conf = dev->priv + sizeof(struct arlan_private);
-- memset(ap, 0, sizeof(*ap));
-- }
--
-- /* Fill in the 'dev' fields. */
-- dev->base_addr = 0;
-- dev->mem_start = 0;
-- dev->mem_end = 0;
-- dev->mtu = 1500;
-- dev->flags = 0; /* IFF_BROADCAST & IFF_MULTICAST & IFF_PROMISC; */
-- dev->irq = 0;
-- dev->dma = 0;
-- dev->tx_queue_len = tx_queue_len;
-- ether_setup(dev);
- dev->tx_queue_len = tx_queue_len;
- dev->open = arlan_open;
- dev->stop = arlan_close;
-@@ -1138,41 +1059,45 @@ static int __init
- dev->watchdog_timeo = 3*HZ;
-
- ap->irq_test_done = 0;
-- arlan_device[num] = dev;
- ap->Conf = &arlan_conf[num];
-
- ap->Conf->pre_Command_Wait = 40;
- ap->Conf->rx_tweak1 = 30;
- ap->Conf->rx_tweak2 = 0;
-
-- ARLAN_DEBUG_EXIT("arlan_allocate_device");
-- return (int) dev;
--}
-
-+ err = register_netdev(dev);
-+ if (err) {
-+ release_mem_region(virt_to_phys((void *) dev->mem_start),
-+ ARLAN_SHMEM_SIZE);
-+ free_netdev(dev);
-+ return err;
-+ }
-+ arlan_device[num] = dev;
-+ ARLAN_DEBUG_EXIT("arlan_setup_device");
-+ return 0;
-+}
-
--static int __init arlan_probe_here(struct net_device *dev, int memaddr)
-+static int __init arlan_probe_here(struct net_device *dev,
-+ unsigned long memaddr)
- {
-- volatile struct arlan_shmem *arlan;
-+ struct arlan_private *ap = dev->priv;
-
- ARLAN_DEBUG_ENTRY("arlan_probe_here");
-
- if (arlan_check_fingerprint(memaddr))
- return -ENODEV;
-
-- printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name, (int) virt_to_phys((void*)memaddr));
--
-- if (!arlan_allocate_device(arlans_found, dev))
-- return -1;
--
-- ((struct arlan_private *) dev->priv)->card = (struct arlan_shmem *) memaddr;
-- arlan = (void *) memaddr;
-+ printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name,
-+ (int) virt_to_phys((void*)memaddr));
-
-+ ap->card = (void *) memaddr;
- dev->mem_start = memaddr;
-- dev->mem_end = memaddr + 0x1FFF;
-+ dev->mem_end = memaddr + ARLAN_SHMEM_SIZE-1;
-
- if (dev->irq < 2)
- {
-- READSHM(dev->irq, arlan->irqLevel, u_char);
-+ READSHM(dev->irq, ap->card->irqLevel, u_char);
- } else if (dev->irq == 2)
- dev->irq = 9;
-
-@@ -1183,8 +1108,6 @@ static int __init arlan_probe_here(struc
- }
-
-
--
--
- static int arlan_open(struct net_device *dev)
- {
- struct arlan_private *priv = dev->priv;
-@@ -1193,12 +1116,6 @@ static int arlan_open(struct net_device
-
- ARLAN_DEBUG_ENTRY("arlan_open");
-
-- if (dev->mem_start == 0)
-- ret = arlan_probe_everywhere(dev);
-- if (ret != 0)
-- return ret;
--
-- arlan = priv->card;
- ret = request_irq(dev->irq, &arlan_interrupt, 0, dev->name, dev);
- if (ret)
- {
-@@ -1768,14 +1685,9 @@ static int arlan_close(struct net_device
- {
- struct arlan_private *priv = dev->priv;
-
-- if (!priv)
-- {
-- printk(KERN_CRIT "arlan: No Device priv \n");
-- return 0;
-- }
- ARLAN_DEBUG_ENTRY("arlan_close");
-
-- del_timer(&priv->timer);
-+ del_timer_sync(&priv->timer);
-
- arlan_command(dev, ARLAN_COMMAND_POWERDOWN);
-
-@@ -1867,39 +1779,70 @@ static void arlan_set_multicast(struct n
- }
-
-
--int __init arlan_probe(struct net_device *dev)
-+struct net_device * __init arlan_probe(int unit)
- {
-- printk("Arlan driver %s\n", arlan_version);
-+ struct net_device *dev;
-+ int err;
-+ int m;
-
-- if (arlan_probe_everywhere(dev))
-- return -ENODEV;
-+ ARLAN_DEBUG_ENTRY("arlan_probe");
-
-- arlans_found++;
-- return 0;
--}
-+ if (arlans_found == MAX_ARLANS)
-+ return ERR_PTR(-ENODEV);
-
--#ifdef MODULE
-+ /*
-+ * Reserve space for local data and a copy of the shared memory
-+ * that is used by the /proc interface.
-+ */
-+ dev = alloc_etherdev(sizeof(struct arlan_private)
-+ + sizeof(struct arlan_shmem));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-
--static int probe = probeUNKNOWN;
-+ SET_MODULE_OWNER(dev);
-
--static int __init arlan_find_devices(void)
--{
-- int m;
-- int found = 0;
-+ if (unit >= 0) {
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
-+
-+ if (dev->mem_start) {
-+ if (arlan_probe_here(dev, dev->mem_start) == 0)
-+ goto found;
-+ goto not_found;
-+ }
-+
-+ }
-
-- ARLAN_DEBUG_ENTRY("arlan_find_devices");
-- if (mem != 0 && numDevices == 1) /* Check a single specified location. */
-- return 1;
-- for (m =(int) phys_to_virt(0xc0000); m <=(int) phys_to_virt(0xDE000); m += 0x2000)
-+
-+ for (m = (int)phys_to_virt(lastFoundAt) + ARLAN_SHMEM_SIZE;
-+ m <= (int)phys_to_virt(0xDE000);
-+ m += ARLAN_SHMEM_SIZE)
- {
-- if (arlan_check_fingerprint(m) == 0)
-- found++;
-+ if (arlan_probe_here(dev, m) == 0)
-+ {
-+ lastFoundAt = (int)virt_to_phys((void*)m);
-+ goto found;
-+ }
- }
-- ARLAN_DEBUG_EXIT("arlan_find_devices");
-
-- return found;
-+ if (lastFoundAt == 0xbe000)
-+ printk(KERN_ERR "arlan: No Arlan devices found \n");
-+
-+ not_found:
-+ free_netdev(dev);
-+ return ERR_PTR(-ENODEV);
-+
-+ found:
-+ err = arlan_setup_device(dev, arlans_found);
-+ if (err)
-+ dev = ERR_PTR(err);
-+ else if (!arlans_found++)
-+ printk(KERN_INFO "Arlan driver %s\n", arlan_version);
-+
-+ return dev;
- }
-
-+#ifdef MODULE
- int init_module(void)
- {
- int i = 0;
-@@ -1909,21 +1852,11 @@ int init_module(void)
- if (channelSet != channelSetUNKNOWN || channelNumber != channelNumberUNKNOWN || systemId != systemIdUNKNOWN)
- return -EINVAL;
-
-- numDevices = arlan_find_devices();
-- if (numDevices == 0)
-- return -ENODEV;
--
-- for (i = 0; i < numDevices && i < MAX_ARLANS; i++)
-- {
-- if (!arlan_allocate_device(i, NULL))
-- return -ENOMEM;
-+ for (i = 0; i < MAX_ARLANS; i++) {
-+ struct net_device *dev = arlan_probe(i);
-
-- if (arlan_device[i] == NULL)
-- return -ENOMEM;
--
-- if (probe)
-- arlan_probe_everywhere(arlan_device[i]);
--// arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN );
-+ if (IS_ERR(dev))
-+ return PTR_ERR(dev);
- }
- init_arlan_proc();
- printk(KERN_INFO "Arlan driver %s\n", arlan_version);
-@@ -1935,7 +1868,7 @@ int init_module(void)
- void cleanup_module(void)
- {
- int i = 0;
-- struct arlan_private *ap;
-+ struct net_device *dev;
-
- ARLAN_DEBUG_ENTRY("cleanup_module");
-
-@@ -1946,22 +1879,18 @@ void cleanup_module(void)
-
- for (i = 0; i < MAX_ARLANS; i++)
- {
-- if (arlan_device[i])
-- {
-- arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN );
--
--// release_mem_region(virt_to_phys(arlan_device[i]->mem_start), 0x2000 );
-- unregister_netdev(arlan_device[i]);
-- ap = arlan_device[i]->priv;
-- if (ap->init_etherdev_alloc) {
-- free_netdev(arlan_device[i]);
-- arlan_device[i] = NULL;
-- } else {
-- kfree(ap);
-- ap = NULL;
-- }
-+ dev = arlan_device[i];
-+ if (dev) {
-+ arlan_command(dev, ARLAN_COMMAND_POWERDOWN );
-+
-+ unregister_netdev(dev);
-+ release_mem_region(virt_to_phys((void *) dev->mem_start),
-+ ARLAN_SHMEM_SIZE);
-+ free_netdev(dev);
-+ arlan_device[i] = NULL;
- }
- }
-+
- ARLAN_DEBUG_EXIT("cleanup_module");
- }
-
---- linux-2.6.0/drivers/net/wireless/atmel.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/wireless/atmel.c 2003-12-28 23:21:01.000000000 -0800
-@@ -748,13 +748,13 @@ static int start_tx (struct sk_buff *skb
-
- if(priv->station_state != STATION_STATE_READY) {
- priv->stats.tx_errors++;
-- return 0;
-+ goto done;
- }
-
- if (priv->card && priv->present_callback &&
- !(*priv->present_callback)(priv->card)) {
- priv->stats.tx_errors++;
-- return 0;
-+ goto done;
- }
-
- /* first ensure the timer func cannot run */
-@@ -804,6 +804,8 @@ static int start_tx (struct sk_buff *skb
-
- spin_unlock_irqrestore(&priv->irqlock, flags);
- spin_unlock_bh(&priv->timerlock);
-+
-+done:
- dev_kfree_skb(skb);
-
- return 0;
-@@ -1441,7 +1443,7 @@ struct net_device *init_atmel_card( unsi
- err_out_irq:
- free_irq(dev->irq, dev);
- err_out_free:
-- kfree(dev);
-+ free_netdev(dev);
- return NULL;
- }
-
---- linux-2.6.0/drivers/net/wireless/atmel_cs.c 2003-10-17 15:58:03.000000000 -0700
-+++ 25/drivers/net/wireless/atmel_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -246,7 +246,7 @@ static dev_link_t *atmel_attach(void)
- client_reg.event_handler = &atmel_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- atmel_detach(link);
-@@ -282,7 +282,7 @@ static void atmel_detach(dev_link_t *lin
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free pieces */
- *linkp = link->next;
-@@ -299,11 +299,8 @@ static void atmel_detach(dev_link_t *lin
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn),args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- /* Call-back function to interrogate PCMCIA-specific information
- about the current existance of the card */
-@@ -372,11 +369,11 @@ static void atmel_config(dev_link_t *lin
- tuple.TupleOffset = 0;
-
- tuple.DesiredTuple = CISTPL_MANFID;
-- if (CardServices(GetFirstTuple, handle, &tuple) == 0) {
-+ if (pcmcia_get_first_tuple(handle, &tuple) == 0) {
- int i;
- cistpl_manfid_t *manfid;
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- manfid = &(parse.manfid);
- for (i = 0; i < sizeof(card_table)/sizeof(card_table[0]); i++) {
- if (!card_table[i].ver1 &&
-@@ -389,11 +386,11 @@ static void atmel_config(dev_link_t *lin
- }
-
- tuple.DesiredTuple = CISTPL_VERS_1;
-- if (!done && (CardServices(GetFirstTuple, handle, &tuple) == 0)) {
-+ if (!done && (pcmcia_get_first_tuple(handle, &tuple) == 0)) {
- int i, j, k;
- cistpl_vers_1_t *ver1;
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- ver1 = &(parse.version_1);
-
- for (i = 0; i < sizeof(card_table)/sizeof(card_table[0]); i++) {
-@@ -429,9 +426,9 @@ static void atmel_config(dev_link_t *lin
- registers.
- */
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -451,12 +448,13 @@ static void atmel_config(dev_link_t *lin
- will only use the CIS to fill in implementation-defined details.
- */
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
- cistpl_cftable_entry_t dflt = { 0 };
- cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
-
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
- if (cfg->index == 0) goto next_entry;
-@@ -505,12 +503,14 @@ static void atmel_config(dev_link_t *lin
- }
-
- /* This reserves IO space but doesn't actually enable it */
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
-+
- /* If we got this far, we're cool! */
- break;
-
- next_entry:
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
- /*
-@@ -519,14 +519,14 @@ static void atmel_config(dev_link_t *lin
- irq structure is initialized.
- */
- if (link->conf.Attributes & CONF_ENABLE_IRQ)
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-
- /*
- This actually configures the PCMCIA socket -- setting up
- the I/O windows and the interrupt mapping, and putting the
- card and host interface into "Memory and IO" mode.
- */
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- if (link->irq.AssignedIRQ == 0) {
- printk(KERN_ALERT
-@@ -602,11 +602,11 @@ static void atmel_release(dev_link_t *li
- ((local_info_t*)link->priv)->eth_dev = 0;
-
- /* Don't bother checking to see if these succeed or not */
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- if (link->io.NumPorts1)
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- if (link->irq.AssignedIRQ)
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
- }
-
-@@ -648,7 +648,7 @@ static int atmel_event(event_t event, in
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG) {
- netif_device_detach(local->eth_dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -656,7 +656,7 @@ static int atmel_event(event_t event, in
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- reset_atmel_card(local->eth_dev);
- netif_device_attach(local->eth_dev);
- }
---- linux-2.6.0/drivers/net/wireless/netwave_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/netwave_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -513,7 +513,7 @@ static dev_link_t *netwave_attach(void)
- client_reg.event_handler = &netwave_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- netwave_detach(link);
-@@ -555,7 +555,7 @@ static void netwave_detach(dev_link_t *l
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Locate device structure */
- for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
-@@ -998,8 +998,8 @@ static int netwave_ioctl(struct net_devi
- *
- */
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void netwave_pcmcia_config(dev_link_t *link) {
- client_handle_t handle = link->handle;
-@@ -1024,9 +1024,9 @@ static void netwave_pcmcia_config(dev_li
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -1040,7 +1040,7 @@ static void netwave_pcmcia_config(dev_li
- */
- for (i = j = 0x0; j < 0x400; j += 0x20) {
- link->io.BasePort1 = j ^ 0x300;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- if (i != CS_SUCCESS) {
-@@ -1052,13 +1052,13 @@ static void netwave_pcmcia_config(dev_li
- * Now allocate an interrupt line. Note that this does not
- * actually assign a handler to the interrupt.
- */
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-
- /*
- * This actually configures the PCMCIA socket -- setting up
- * the I/O windows and the interrupt mapping.
- */
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- /*
- * Allocate a 32K memory window. Note that the dev_link_t
-@@ -1071,10 +1071,9 @@ static void netwave_pcmcia_config(dev_li
- req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
- req.Base = 0; req.Size = 0x8000;
- req.AccessSpeed = mem_speed;
-- link->win = (window_handle_t)link->handle;
-- CS_CHECK(RequestWindow, &link->win, &req);
-+ CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
- mem.CardOffset = 0x20000; mem.Page = 0;
-- CS_CHECK(MapMemPage, link->win, &mem);
-+ CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
-
- /* Store base address of the common window frame */
- ramBase = ioremap(req.Base, 0x8000);
-@@ -1145,11 +1144,11 @@ static void netwave_release(dev_link_t *
- /* Don't bother checking to see if these succeed or not */
- if (link->win) {
- iounmap(priv->ramBase);
-- CardServices(ReleaseWindow, link->win);
-+ pcmcia_release_window(link->win);
- }
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
-
-@@ -1201,7 +1200,7 @@ static int netwave_event(event_t event,
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -1209,7 +1208,7 @@ static int netwave_event(event_t event,
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- netwave_reset(dev);
- netif_device_attach(dev);
---- linux-2.6.0/drivers/net/wireless/orinoco_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/orinoco_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -131,7 +131,7 @@ orinoco_cs_hard_reset(struct orinoco_pri
- /* We need atomic ops here, because we're not holding the lock */
- set_bit(0, &card->hard_reset_in_progress);
-
-- err = CardServices(ResetCard, link->handle, NULL);
-+ err = pcmcia_reset_card(link->handle, NULL);
- if (err)
- return err;
-
-@@ -150,7 +150,7 @@ static void
- orinoco_cs_error(client_handle_t handle, int func, int ret)
- {
- error_info_t err = { func, ret };
-- CardServices(ReportError, handle, &err);
-+ pcmcia_report_error(handle, &err);
- }
-
- /*
-@@ -214,7 +214,7 @@ orinoco_cs_attach(void)
- client_reg.Version = 0x0210; /* FIXME: what does this mean? */
- client_reg.event_callback_args.client_data = link;
-
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- orinoco_cs_error(link->handle, RegisterClient, ret);
- orinoco_cs_detach(link);
-@@ -250,7 +250,7 @@ orinoco_cs_detach(dev_link_t * link)
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, and free it */
- *linkp = link->next;
-@@ -269,11 +269,8 @@ orinoco_cs_detach(dev_link_t * link)
- * device available to the system.
- */
-
--#define CS_CHECK(fn, args...) \
-- while ((last_ret=CardServices(last_fn=(fn),args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
-- if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void
- orinoco_cs_config(dev_link_t *link)
-@@ -290,7 +287,7 @@ orinoco_cs_config(dev_link_t *link)
- tuple_t tuple;
- cisparse_t parse;
-
-- CS_CHECK(ValidateCIS, handle, &info);
-+ CS_CHECK(ValidateCIS, pcmcia_validate_cis(handle, &info));
-
- /*
- * This reads the card's CONFIG tuple to find its
-@@ -301,9 +298,9 @@ orinoco_cs_config(dev_link_t *link)
- tuple.TupleData = buf;
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -311,7 +308,7 @@ orinoco_cs_config(dev_link_t *link)
- link->state |= DEV_CONFIG;
-
- /* Look up the current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- /*
-@@ -329,13 +326,14 @@ orinoco_cs_config(dev_link_t *link)
- * implementation-defined details.
- */
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
- cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
- cistpl_cftable_entry_t dflt = { .index = 0 };
-
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
-
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
- dflt = *cfg;
-@@ -400,7 +398,8 @@ orinoco_cs_config(dev_link_t *link)
- }
-
- /* This reserves IO space but doesn't actually enable it */
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
- }
-
-
-@@ -410,8 +409,8 @@ orinoco_cs_config(dev_link_t *link)
-
- next_entry:
- if (link->io.NumPorts1)
-- CardServices(ReleaseIO, link->handle, &link->io);
-- last_ret = CardServices(GetNextTuple, handle, &tuple);
-+ pcmcia_release_io(link->handle, &link->io);
-+ last_ret = pcmcia_get_next_tuple(handle, &tuple);
- if (last_ret == CS_NO_MORE_ITEMS) {
- printk(KERN_ERR "GetNextTuple(). No matching CIS configuration, "
- "maybe you need the ignore_cis_vcc=1 parameter.\n");
-@@ -438,7 +437,7 @@ orinoco_cs_config(dev_link_t *link)
- link->irq.Handler = orinoco_interrupt;
- link->irq.Instance = dev;
-
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
- }
-
- /* We initialize the hermes structure before completing PCMCIA
-@@ -452,7 +451,7 @@ orinoco_cs_config(dev_link_t *link)
- * the I/O windows and the interrupt mapping, and putting the
- * card and host interface into "Memory and IO" mode.
- */
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- /* Ok, we have the configuration, prepare to register the netdev */
- dev->base_addr = link->io.BasePort1;
-@@ -521,11 +520,11 @@ orinoco_cs_release(dev_link_t *link)
- spin_unlock_irqrestore(&priv->lock, flags);
-
- /* Don't bother checking to see if these succeed or not */
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- if (link->io.NumPorts1)
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- if (link->irq.AssignedIRQ)
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
- } /* orinoco_cs_release */
-
-@@ -587,7 +586,7 @@ orinoco_cs_event(event_t event, int prio
- spin_unlock_irqrestore(&priv->lock, flags);
- }
-
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
-
-@@ -598,8 +597,7 @@ orinoco_cs_event(event_t event, int prio
- if (link->state & DEV_CONFIG) {
- /* FIXME: should we double check that this is
- * the same card as we had before */
-- CardServices(RequestConfiguration, link->handle,
-- &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
-
- if (! test_bit(0, &card->hard_reset_in_progress)) {
- err = orinoco_reinit_firmware(dev);
---- linux-2.6.0/drivers/net/wireless/orinoco_pci.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/wireless/orinoco_pci.c 2003-12-28 23:21:01.000000000 -0800
-@@ -261,7 +261,7 @@ static int orinoco_pci_init_one(struct p
- if (dev->irq)
- free_irq(dev->irq, dev);
-
-- kfree(dev);
-+ free_netdev(dev);
- }
-
- if (pci_ioaddr)
-@@ -360,6 +360,7 @@ static int orinoco_pci_resume(struct pci
- }
-
- static struct pci_device_id orinoco_pci_pci_id_table[] = {
-+ {0x1260, 0x3872, PCI_ANY_ID, PCI_ANY_ID,},
- {0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID,},
- {0,},
- };
---- linux-2.6.0/drivers/net/wireless/orinoco_plx.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/wireless/orinoco_plx.c 2003-12-28 23:21:01.000000000 -0800
-@@ -263,7 +263,7 @@ static int orinoco_plx_init_one(struct p
- if (dev->irq)
- free_irq(dev->irq, dev);
-
-- kfree(dev);
-+ free_netdev(dev);
- }
-
- if (pccard_ioaddr)
---- linux-2.6.0/drivers/net/wireless/orinoco_tmd.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/wireless/orinoco_tmd.c 2003-12-28 23:21:01.000000000 -0800
-@@ -157,7 +157,7 @@ static int orinoco_tmd_init_one(struct p
- if (dev->irq)
- free_irq(dev->irq, dev);
-
-- kfree(dev);
-+ free_netdev(dev);
- }
-
- if (pccard_ioaddr)
---- linux-2.6.0/drivers/net/wireless/ray_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/ray_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -344,19 +344,14 @@ static dev_link_t *ray_attach(void)
- return NULL;
-
- /* Allocate space for private device-specific data */
-- dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
-+ dev = alloc_etherdev(sizeof(ray_dev_t));
-
- if (!dev)
- goto fail_alloc_dev;
-
-- local = kmalloc(sizeof(ray_dev_t), GFP_KERNEL);
--
-- if (!local)
-- goto fail_alloc_local;
-+ local = dev->priv;
-
- memset(link, 0, sizeof(struct dev_link_t));
-- memset(dev, 0, sizeof(struct net_device));
-- memset(local, 0, sizeof(ray_dev_t));
-
- /* The io structure describes IO port mapping. None used here */
- link->io.NumPorts1 = 0;
-@@ -379,7 +374,6 @@ static dev_link_t *ray_attach(void)
- link->priv = dev;
- link->irq.Instance = dev;
-
-- dev->priv = local;
- local->finder = link;
- local->card_status = CARD_INSERTED;
- local->authentication_state = UNAUTHENTICATED;
-@@ -401,7 +395,6 @@ static dev_link_t *ray_attach(void)
-
- DEBUG(2,"ray_cs ray_attach calling ether_setup.)\n");
- SET_MODULE_OWNER(dev);
-- ether_setup(dev);
- dev->init = &ray_dev_init;
- dev->open = &ray_open;
- dev->stop = &ray_dev_close;
-@@ -420,7 +413,7 @@ static dev_link_t *ray_attach(void)
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-
-- DEBUG(2,"ray_cs ray_attach calling CardServices(RegisterClient...)\n");
-+ DEBUG(2,"ray_cs ray_attach calling pcmcia_register_client(...)\n");
-
- init_timer(&local->timer);
-
-@@ -434,8 +427,6 @@ static dev_link_t *ray_attach(void)
- DEBUG(2,"ray_cs ray_attach ending\n");
- return link;
-
--fail_alloc_local:
-- kfree(dev);
- fail_alloc_dev:
- kfree(link);
- return NULL;
-@@ -478,9 +469,7 @@ static void ray_detach(dev_link_t *link)
- if (link->priv) {
- struct net_device *dev = link->priv;
- if (link->dev) unregister_netdev(dev);
-- if (dev->priv)
-- kfree(dev->priv);
-- kfree(link->priv);
-+ free_netdev(dev);
- }
- kfree(link);
- DEBUG(2,"ray_cs ray_detach ending\n");
-@@ -490,8 +479,8 @@ static void ray_detach(dev_link_t *link)
- is received, to configure the PCMCIA socket, and to make the
- ethernet device available to the system.
- =============================================================================*/
--#define CS_CHECK(fn, args...) \
--while ((last_ret=fn(args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
- #define MAX_TUPLE_SIZE 128
- static void ray_config(dev_link_t *link)
- {
-@@ -510,23 +499,23 @@ static void ray_config(dev_link_t *link)
-
- /* This reads the card's CONFIG tuple to find its configuration regs */
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(pcmcia_get_first_tuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- tuple.TupleData = buf;
- tuple.TupleDataMax = MAX_TUPLE_SIZE;
- tuple.TupleOffset = 0;
-- CS_CHECK(pcmcia_get_tuple_data, handle, &tuple);
-- CS_CHECK(pcmcia_parse_tuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
- /* Determine card type and firmware version */
- buf[0] = buf[MAX_TUPLE_SIZE - 1] = 0;
- tuple.DesiredTuple = CISTPL_VERS_1;
-- CS_CHECK(pcmcia_get_first_tuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- tuple.TupleData = buf;
- tuple.TupleDataMax = MAX_TUPLE_SIZE;
- tuple.TupleOffset = 2;
-- CS_CHECK(pcmcia_get_tuple_data, handle, &tuple);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-
- for (i=0; i<tuple.TupleDataLen - 4; i++)
- if (buf[i] == 0) buf[i] = ' ';
-@@ -538,22 +527,22 @@ static void ray_config(dev_link_t *link)
- /* Now allocate an interrupt line. Note that this does not
- actually assign a handler to the interrupt.
- */
-- CS_CHECK(pcmcia_request_irq, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
- dev->irq = link->irq.AssignedIRQ;
-
- /* This actually configures the PCMCIA socket -- setting up
- the I/O windows and the interrupt mapping.
- */
-- CS_CHECK(pcmcia_request_configuration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- /*** Set up 32k window for shared memory (transmit and control) ************/
- req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT;
- req.Base = 0;
- req.Size = 0x8000;
- req.AccessSpeed = ray_mem_speed;
-- CS_CHECK(pcmcia_request_window, &link->handle, &req, &link->win);
-+ CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
- mem.CardOffset = 0x0000; mem.Page = 0;
-- CS_CHECK(pcmcia_map_mem_page, link->win, &mem);
-+ CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
- local->sram = (UCHAR *)(ioremap(req.Base,req.Size));
-
- /*** Set up 16k window for shared memory (receive buffer) ***************/
-@@ -561,9 +550,9 @@ static void ray_config(dev_link_t *link)
- req.Base = 0;
- req.Size = 0x4000;
- req.AccessSpeed = ray_mem_speed;
-- CS_CHECK(pcmcia_request_window, &link->handle, &req, &local->rmem_handle);
-+ CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &local->rmem_handle));
- mem.CardOffset = 0x8000; mem.Page = 0;
-- CS_CHECK(pcmcia_map_mem_page, local->rmem_handle, &mem);
-+ CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->rmem_handle, &mem));
- local->rmem = (UCHAR *)(ioremap(req.Base,req.Size));
-
- /*** Set up window for attribute memory ***********************************/
-@@ -571,9 +560,9 @@ static void ray_config(dev_link_t *link)
- req.Base = 0;
- req.Size = 0x1000;
- req.AccessSpeed = ray_mem_speed;
-- CS_CHECK(pcmcia_request_window, &link->handle, &req, &local->amem_handle);
-+ CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &local->amem_handle));
- mem.CardOffset = 0x0000; mem.Page = 0;
-- CS_CHECK(pcmcia_map_mem_page, local->amem_handle, &mem);
-+ CS_CHECK(MapMemPage, pcmcia_map_mem_page(local->amem_handle, &mem));
- local->amem = (UCHAR *)(ioremap(req.Base,req.Size));
-
- DEBUG(3,"ray_config sram=%p\n",local->sram);
---- linux-2.6.0/drivers/net/wireless/strip.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/strip.c 2003-12-28 23:21:01.000000000 -0800
-@@ -2564,7 +2564,7 @@ static void strip_free(struct strip *str
-
- strip_info->magic = 0;
-
-- kfree(strip_info->dev);
-+ free_netdev(strip_info->dev);
- }
-
-
---- linux-2.6.0/drivers/net/wireless/wavelan.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/wireless/wavelan.c 2003-12-28 23:21:01.000000000 -0800
-@@ -153,7 +153,7 @@ static inline void wv_16_on(unsigned lon
- * Disable interrupts on the WaveLAN hardware.
- * (called by wv_82586_stop())
- */
--static inline void wv_ints_off(device * dev)
-+static inline void wv_ints_off(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -167,7 +167,7 @@ static inline void wv_ints_off(device *
- * Enable interrupts on the WaveLAN hardware.
- * (called by wv_hw_reset())
- */
--static inline void wv_ints_on(device * dev)
-+static inline void wv_ints_on(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -268,7 +268,7 @@ static inline u16 psa_crc(u8 * psa, /* T
- /*
- * update the checksum field in the Wavelan's PSA
- */
--static void update_psa_checksum(device * dev, unsigned long ioaddr, u16 hacr)
-+static void update_psa_checksum(struct net_device * dev, unsigned long ioaddr, u16 hacr)
- {
- #ifdef SET_PSA_CRC
- psa_t psa;
-@@ -547,7 +547,7 @@ static inline void obram_write(unsigned
- /*
- * Acknowledge the reading of the status issued by the i82586.
- */
--static void wv_ack(device * dev)
-+static void wv_ack(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -589,7 +589,7 @@ static void wv_ack(device * dev)
- * Set channel attention bit and busy wait until command has
- * completed, then acknowledge completion of the command.
- */
--static inline int wv_synchronous_cmd(device * dev, const char *str)
-+static inline int wv_synchronous_cmd(struct net_device * dev, const char *str)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -636,7 +636,7 @@ static inline int wv_synchronous_cmd(dev
- * Check if done, and if OK.
- */
- static inline int
--wv_config_complete(device * dev, unsigned long ioaddr, net_local * lp)
-+wv_config_complete(struct net_device * dev, unsigned long ioaddr, net_local * lp)
- {
- unsigned short mcs_addr;
- unsigned short status;
-@@ -703,7 +703,7 @@ wv_config_complete(device * dev, unsigne
- * (called in wavelan_interrupt()).
- * Note : the spinlock is already grabbed for us.
- */
--static int wv_complete(device * dev, unsigned long ioaddr, net_local * lp)
-+static int wv_complete(struct net_device * dev, unsigned long ioaddr, net_local * lp)
- {
- int nreaped = 0;
-
-@@ -845,7 +845,7 @@ if (lp->tx_n_in_use > 0)
- * wavelan_interrupt is not an option), so you may experience
- * delays sometimes.
- */
--static inline void wv_82586_reconfig(device * dev)
-+static inline void wv_82586_reconfig(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long flags;
-@@ -954,7 +954,7 @@ static void wv_psa_show(psa_t * p)
- * Print the formatted status of the Modem Management Controller.
- * This function needs to be completed.
- */
--static void wv_mmc_show(device * dev)
-+static void wv_mmc_show(struct net_device * dev)
- {
- unsigned long ioaddr = dev->base_addr;
- net_local *lp = (net_local *) dev->priv;
-@@ -1137,7 +1137,7 @@ static void wv_scb_show(unsigned long io
- /*
- * Print the formatted status of the i82586's receive unit.
- */
--static void wv_ru_show(device * dev)
-+static void wv_ru_show(struct net_device * dev)
- {
- /* net_local *lp = (net_local *) dev->priv; */
-
-@@ -1154,7 +1154,7 @@ static void wv_ru_show(device * dev)
- /*
- * Display info about one control block of the i82586 memory.
- */
--static void wv_cu_show_one(device * dev, net_local * lp, int i, u16 p)
-+static void wv_cu_show_one(struct net_device * dev, net_local * lp, int i, u16 p)
- {
- unsigned long ioaddr;
- ac_tx_t actx;
-@@ -1183,7 +1183,7 @@ static void wv_cu_show_one(device * dev,
- /*
- * Print status of the command unit of the i82586.
- */
--static void wv_cu_show(device * dev)
-+static void wv_cu_show(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned int i;
-@@ -1209,7 +1209,7 @@ static void wv_cu_show(device * dev)
- /*
- * Print the formatted status of the WaveLAN PCMCIA device driver.
- */
--static void wv_dev_show(device * dev)
-+static void wv_dev_show(struct net_device * dev)
- {
- printk(KERN_DEBUG "dev:");
- printk(" state=%lX,", dev->state);
-@@ -1223,7 +1223,7 @@ static void wv_dev_show(device * dev)
- * Print the formatted status of the WaveLAN PCMCIA device driver's
- * private information.
- */
--static void wv_local_show(device * dev)
-+static void wv_local_show(struct net_device * dev)
- {
- net_local *lp;
-
-@@ -1285,7 +1285,7 @@ static inline void wv_packet_info(u8 * p
- * This is the information which is displayed by the driver at startup.
- * There are lots of flags for configuring it to your liking.
- */
--static inline void wv_init_info(device * dev)
-+static inline void wv_init_info(struct net_device * dev)
- {
- short ioaddr = dev->base_addr;
- net_local *lp = (net_local *) dev->priv;
-@@ -1395,7 +1395,7 @@ static inline void wv_init_info(device *
- * card open or closed.
- * Used when the user read /proc/net/dev
- */
--static en_stats *wavelan_get_stats(device * dev)
-+static en_stats *wavelan_get_stats(struct net_device * dev)
- {
- #ifdef DEBUG_IOCTL_TRACE
- printk(KERN_DEBUG "%s: <>wavelan_get_stats()\n", dev->name);
-@@ -1412,7 +1412,7 @@ static en_stats *wavelan_get_stats(devic
- * num_addrs > 0 Multicast mode, receive normal and MC packets,
- * and do best-effort filtering.
- */
--static void wavelan_set_multicast_list(device * dev)
-+static void wavelan_set_multicast_list(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
-
-@@ -1485,7 +1485,7 @@ static void wavelan_set_multicast_list(d
- * (Note : it was a nice way to test the reconfigure stuff...)
- */
- #ifdef SET_MAC_ADDRESS
--static int wavelan_set_mac_address(device * dev, void *addr)
-+static int wavelan_set_mac_address(struct net_device * dev, void *addr)
- {
- struct sockaddr *mac = addr;
-
-@@ -1724,7 +1724,7 @@ static inline int wv_frequency_list(unsi
- * address with our list, and if they match, get the statistics.
- * Sorry, but this function really needs the wireless extensions.
- */
--static inline void wl_spy_gather(device * dev,
-+static inline void wl_spy_gather(struct net_device * dev,
- u8 * mac, /* MAC address */
- u8 * stats) /* Statistics to gather */
- {
-@@ -1750,7 +1750,7 @@ static inline void wl_spy_gather(device
- * With this histogram you may detect if one WaveLAN is really weak,
- * or you may also calculate the mean and standard deviation of the level.
- */
--static inline void wl_his_gather(device * dev, u8 * stats)
-+static inline void wl_his_gather(struct net_device * dev, u8 * stats)
- { /* Statistics to gather */
- net_local *lp = (net_local *) dev->priv;
- u8 level = stats[0] & MMR_SIGNAL_LVL;
-@@ -2415,7 +2415,7 @@ static const struct iw_handler_def wavel
- * Get wireless statistics.
- * Called by /proc/net/wireless
- */
--static iw_stats *wavelan_get_wireless_stats(device * dev)
-+static iw_stats *wavelan_get_wireless_stats(struct net_device * dev)
- {
- unsigned long ioaddr = dev->base_addr;
- net_local *lp = (net_local *) dev->priv;
-@@ -2492,7 +2492,7 @@ static iw_stats *wavelan_get_wireless_st
- * (called by wv_packet_rcv())
- */
- static inline void
--wv_packet_read(device * dev, u16 buf_off, int sksize)
-+wv_packet_read(struct net_device * dev, u16 buf_off, int sksize)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -2587,7 +2587,7 @@ wv_packet_read(device * dev, u16 buf_off
- * (called in wavelan_interrupt()).
- * Note : the spinlock is already grabbed for us.
- */
--static inline void wv_receive(device * dev)
-+static inline void wv_receive(struct net_device * dev)
- {
- unsigned long ioaddr = dev->base_addr;
- net_local *lp = (net_local *) dev->priv;
-@@ -2770,7 +2770,7 @@ static inline void wv_receive(device * d
- *
- * (called in wavelan_packet_xmit())
- */
--static inline int wv_packet_write(device * dev, void *buf, short length)
-+static inline int wv_packet_write(struct net_device * dev, void *buf, short length)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -2901,7 +2901,7 @@ static inline int wv_packet_write(device
- * the packet. We also prevent reentrance. Then we call the function
- * to send the packet.
- */
--static int wavelan_packet_xmit(struct sk_buff *skb, device * dev)
-+static int wavelan_packet_xmit(struct sk_buff *skb, struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long flags;
-@@ -2966,7 +2966,7 @@ static int wavelan_packet_xmit(struct sk
- * Routine to initialize the Modem Management Controller.
- * (called by wv_hw_reset())
- */
--static inline int wv_mmc_init(device * dev)
-+static inline int wv_mmc_init(struct net_device * dev)
- {
- unsigned long ioaddr = dev->base_addr;
- net_local *lp = (net_local *) dev->priv;
-@@ -3138,7 +3138,7 @@ static inline int wv_mmc_init(device * d
- * Start the receive unit.
- * (called by wv_hw_reset())
- */
--static inline int wv_ru_start(device * dev)
-+static inline int wv_ru_start(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -3230,7 +3230,7 @@ static inline int wv_ru_start(device * d
- *
- * (called by wv_hw_reset())
- */
--static inline int wv_cu_start(device * dev)
-+static inline int wv_cu_start(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -3331,7 +3331,7 @@ static inline int wv_cu_start(device * d
- *
- * (called by wv_hw_reset())
- */
--static inline int wv_82586_start(device * dev)
-+static inline int wv_82586_start(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -3463,7 +3463,7 @@ static inline int wv_82586_start(device
- *
- * (called by wv_hw_reset(), wv_82586_reconfig(), wavelan_packet_xmit())
- */
--static void wv_82586_config(device * dev)
-+static void wv_82586_config(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -3643,7 +3643,7 @@ static void wv_82586_config(device * dev
- * WaveLAN controller (i82586).
- * (called by wavelan_close())
- */
--static inline void wv_82586_stop(device * dev)
-+static inline void wv_82586_stop(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -3680,7 +3680,7 @@ static inline void wv_82586_stop(device
- * 5. Start the LAN controller's receive unit
- * (called by wavelan_interrupt(), wavelan_watchdog() & wavelan_open())
- */
--static int wv_hw_reset(device * dev)
-+static int wv_hw_reset(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long ioaddr = dev->base_addr;
-@@ -3770,7 +3770,7 @@ static int wv_check_ioaddr(unsigned long
- */
- static irqreturn_t wavelan_interrupt(int irq, void *dev_id, struct pt_regs *regs)
- {
-- device *dev;
-+ struct net_device *dev;
- unsigned long ioaddr;
- net_local *lp;
- u16 hasr;
-@@ -3923,7 +3923,7 @@ static irqreturn_t wavelan_interrupt(int
- * kernel. If the transmission completes, this timer is disabled. If
- * the timer expires, we are called and we try to unlock the hardware.
- */
--static void wavelan_watchdog(device * dev)
-+static void wavelan_watchdog(struct net_device * dev)
- {
- net_local * lp = (net_local *)dev->priv;
- u_long ioaddr = dev->base_addr;
-@@ -4003,7 +4003,7 @@ static void wavelan_watchdog(device * de
- * Configure and start up the WaveLAN PCMCIA adaptor.
- * Called by NET3 when it "opens" the device.
- */
--static int wavelan_open(device * dev)
-+static int wavelan_open(struct net_device * dev)
- {
- net_local * lp = (net_local *)dev->priv;
- unsigned long flags;
-@@ -4058,7 +4058,7 @@ static int wavelan_open(device * dev)
- * Shut down the WaveLAN ISA card.
- * Called by NET3 when it "closes" the device.
- */
--static int wavelan_close(device * dev)
-+static int wavelan_close(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
- unsigned long flags;
-@@ -4091,12 +4091,24 @@ static int wavelan_close(device * dev)
- * device structure
- * (called by wavelan_probe() and via init_module()).
- */
--static int __init wavelan_config(device * dev)
-+static int __init wavelan_config(struct net_device *dev, unsigned short ioaddr)
- {
-- unsigned long ioaddr = dev->base_addr;
- u8 irq_mask;
- int irq;
- net_local *lp;
-+ mac_addr mac;
-+ int err;
-+
-+ if (!request_region(ioaddr, sizeof(ha_t), "wavelan"))
-+ return -EADDRINUSE;
-+
-+ err = wv_check_ioaddr(ioaddr, mac);
-+ if (err)
-+ goto out;
-+
-+ memcpy(dev->dev_addr, mac, 6);
-+
-+ dev->base_addr = ioaddr;
-
- #ifdef DEBUG_CALLBACK_TRACE
- printk(KERN_DEBUG "%s: ->wavelan_config(dev=0x%x, ioaddr=0x%lx)\n",
-@@ -4136,25 +4148,18 @@ static int __init wavelan_config(device
- "%s: wavelan_config(): could not wavelan_map_irq(%d).\n",
- dev->name, irq_mask);
- #endif
-- return -EAGAIN;
-+ err = -EAGAIN;
-+ goto out;
- }
-
- dev->irq = irq;
-
-- if (!request_region(ioaddr, sizeof(ha_t), "wavelan"))
-- return -EBUSY;
--
- dev->mem_start = 0x0000;
- dev->mem_end = 0x0000;
- dev->if_port = 0;
-
- /* Initialize device structures */
-- dev->priv = kmalloc(sizeof(net_local), GFP_KERNEL);
-- if (dev->priv == NULL) {
-- release_region(ioaddr, sizeof(ha_t));
-- return -ENOMEM;
-- }
-- memset(dev->priv, 0x00, sizeof(net_local));
-+ memset(dev->priv, 0, sizeof(net_local));
- lp = (net_local *) dev->priv;
-
- /* Back link to the device structure. */
-@@ -4172,12 +4177,6 @@ static int __init wavelan_config(device
- /* Init spinlock */
- spin_lock_init(&lp->spinlock);
-
-- /*
-- * Fill in the fields of the device structure
-- * with generic Ethernet values.
-- */
-- ether_setup(dev);
--
- SET_MODULE_OWNER(dev);
- dev->open = wavelan_open;
- dev->stop = wavelan_close;
-@@ -4204,6 +4203,9 @@ static int __init wavelan_config(device
- printk(KERN_DEBUG "%s: <-wavelan_config()\n", dev->name);
- #endif
- return 0;
-+out:
-+ release_region(ioaddr, sizeof(ha_t));
-+ return err;
- }
-
- /*------------------------------------------------------------------*/
-@@ -4214,19 +4216,13 @@ static int __init wavelan_config(device
- * We follow the example in drivers/net/ne.c.
- * (called in "Space.c")
- */
--int __init wavelan_probe(device * dev)
-+struct net_device * __init wavelan_probe(int unit)
- {
-+ struct net_device *dev;
- short base_addr;
-- mac_addr mac; /* MAC address (check existence of WaveLAN) */
-+ int def_irq;
- int i;
-- int r;
--
--#ifdef DEBUG_CALLBACK_TRACE
-- printk(KERN_DEBUG
-- "%s: ->wavelan_probe(dev=0x%x (base_addr=0x%x))\n",
-- dev->name, (unsigned int) dev,
-- (unsigned int) dev->base_addr);
--#endif
-+ int r = 0;
-
- #ifdef STRUCT_CHECK
- if (wv_struct_check() != (char *) NULL) {
-@@ -4237,8 +4233,20 @@ int __init wavelan_probe(device * dev)
- }
- #endif /* STRUCT_CHECK */
-
-- /* Check the value of the command line parameter for base address. */
-+ dev = alloc_etherdev(sizeof(net_local));
-+ if (!dev)
-+ return ERR_PTR(-ENOMEM);
-+
-+ sprintf(dev->name, "eth%d", unit);
-+ netdev_boot_setup_check(dev);
- base_addr = dev->base_addr;
-+ def_irq = dev->irq;
-+
-+#ifdef DEBUG_CALLBACK_TRACE
-+ printk(KERN_DEBUG
-+ "%s: ->wavelan_probe(dev=%p (base_addr=0x%x))\n",
-+ dev->name, dev, (unsigned int) dev->base_addr);
-+#endif
-
- /* Don't probe at all. */
- if (base_addr < 0) {
-@@ -4247,16 +4255,9 @@ int __init wavelan_probe(device * dev)
- "%s: wavelan_probe(): invalid base address\n",
- dev->name);
- #endif
-- return -ENXIO;
-- }
--
-- /* Check a single specified location. */
-- if (base_addr > 0x100) {
-- /* Check if there is something at this base address */
-- if ((r = wv_check_ioaddr(base_addr, mac)) == 0) {
-- memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */
-- r = wavelan_config(dev);
-- }
-+ r = -ENXIO;
-+ } else if (base_addr > 0x100) { /* Check a single specified location. */
-+ r = wavelan_config(dev, base_addr);
- #ifdef DEBUG_CONFIG_INFO
- if (r != 0)
- printk(KERN_DEBUG
-@@ -4267,35 +4268,33 @@ int __init wavelan_probe(device * dev)
- #ifdef DEBUG_CALLBACK_TRACE
- printk(KERN_DEBUG "%s: <-wavelan_probe()\n", dev->name);
- #endif
-- return r;
-- }
--
-- /* Scan all possible addresses of the WaveLAN hardware. */
-- for (i = 0; i < NELS(iobase); i++) {
-- /* Check whether there is something at this base address. */
-- if (wv_check_ioaddr(iobase[i], mac) == 0) {
-- dev->base_addr = iobase[i]; /* Copy base address. */
-- memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */
-- if (wavelan_config(dev) == 0) {
-+ } else { /* Scan all possible addresses of the WaveLAN hardware. */
-+ for (i = 0; i < NELS(iobase); i++) {
-+ dev->irq = def_irq;
-+ if (wavelan_config(dev, iobase[i]) == 0) {
- #ifdef DEBUG_CALLBACK_TRACE
- printk(KERN_DEBUG
- "%s: <-wavelan_probe()\n",
- dev->name);
- #endif
-- return 0;
-+ break;
- }
- }
-+ if (i == NELS(iobase))
-+ r = -ENODEV;
- }
--
-- /* We may have touched base_addr. Another driver may not like it. */
-- dev->base_addr = base_addr;
--
--#ifdef DEBUG_CONFIG_INFO
-- printk(KERN_DEBUG "%s: wavelan_probe(): no device found\n",
-- dev->name);
--#endif
--
-- return -ENODEV;
-+ if (r)
-+ goto out;
-+ r = register_netdev(dev);
-+ if (r)
-+ goto out1;
-+ return dev;
-+out1:
-+ release_region(dev->base_addr, sizeof(ha_t));
-+ wavelan_list = wavelan_list->next;
-+out:
-+ free_netdev(dev);
-+ return ERR_PTR(r);
- }
-
- /****************************** MODULE ******************************/
-@@ -4311,7 +4310,6 @@ int __init wavelan_probe(device * dev)
- */
- int init_module(void)
- {
-- mac_addr mac; /* MAC address (check WaveLAN existence) */
- int ret = -EIO; /* Return error if no cards found */
- int i;
-
-@@ -4337,38 +4335,28 @@ int init_module(void)
- /* Loop on all possible base addresses. */
- i = -1;
- while ((io[++i] != 0) && (i < NELS(io))) {
-- /* Check if there is something at this base address. */
-- if (wv_check_ioaddr(io[i], mac) == 0) {
-- device *dev;
--
-- /* Create device and set basic arguments. */
-- dev =
-- kmalloc(sizeof(struct net_device), GFP_KERNEL);
-- if (dev == NULL) {
-- ret = -ENOMEM;
-- break;
-- }
-- memset(dev, 0x00, sizeof(struct net_device));
-- memcpy(dev->name, name[i], IFNAMSIZ); /* Copy name */
-- dev->base_addr = io[i];
-- dev->irq = irq[i];
-- dev->init = &wavelan_config;
-- memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */
-+ struct net_device *dev = alloc_etherdev(sizeof(net_local));
-+ if (!dev)
-+ break;
-+ memcpy(dev->name, name[i], IFNAMSIZ); /* Copy name */
-+ dev->base_addr = io[i];
-+ dev->irq = irq[i];
-
-- /* Try to create the device. */
-+ /* Check if there is something at this base address. */
-+ if (wavelan_config(dev, io[i]) == 0) {
- if (register_netdev(dev) != 0) {
-- /* Deallocate everything. */
-- /* Note: if dev->priv is mallocated, there is no way to fail. */
-- kfree(dev);
-+ release_region(dev->base_addr, sizeof(ha_t));
-+ wavelan_list = wavelan_list->next;
- } else {
-- /* If at least one device OK, we do not fail */
- ret = 0;
-+ continue;
- }
-- } /* if there is something at the address */
-- } /* Loop on all addresses. */
-+ }
-+ free_netdev(dev);
-+ }
-
- #ifdef DEBUG_CONFIG_ERROR
-- if (wavelan_list == (net_local *) NULL)
-+ if (!wavelan_list)
- printk(KERN_WARNING
- "WaveLAN init_module(): no device found\n");
- #endif
-@@ -4390,26 +4378,19 @@ void cleanup_module(void)
- #endif
-
- /* Loop on all devices and release them. */
-- while (wavelan_list != (net_local *) NULL) {
-- device *dev = wavelan_list->dev;
-+ while (wavelan_list) {
-+ struct net_device *dev = wavelan_list->dev;
-
- #ifdef DEBUG_CONFIG_INFO
- printk(KERN_DEBUG
- "%s: cleanup_module(): removing device at 0x%x\n",
- dev->name, (unsigned int) dev);
- #endif
--
-- /* Release the ioport region. */
-- release_region(dev->base_addr, sizeof(ha_t));
--
-- /* Definitely remove the device. */
- unregister_netdev(dev);
-
-- /* Unlink the device. */
-+ release_region(dev->base_addr, sizeof(ha_t));
- wavelan_list = wavelan_list->next;
-
-- /* Free pieces. */
-- kfree(dev->priv);
- free_netdev(dev);
- }
-
---- linux-2.6.0/drivers/net/wireless/wavelan_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/wavelan_cs.c 2003-12-28 23:21:01.000000000 -0800
-@@ -131,7 +131,7 @@ hacr_write_slow(u_long base,
- * Read the Parameter Storage Area from the WaveLAN card's memory
- */
- static void
--psa_read(device * dev,
-+psa_read(struct net_device * dev,
- int o, /* offset in PSA */
- u_char * b, /* buffer to fill */
- int n) /* size to read */
-@@ -155,7 +155,7 @@ psa_read(device * dev,
- * Write the Paramter Storage Area to the WaveLAN card's memory
- */
- static void
--psa_write(device * dev,
-+psa_write(struct net_device * dev,
- int o, /* Offset in psa */
- u_char * b, /* Buffer in memory */
- int n) /* Length of buffer */
-@@ -229,7 +229,7 @@ psa_crc(unsigned char * psa, /* The PSA
- * update the checksum field in the Wavelan's PSA
- */
- static void
--update_psa_checksum(device * dev)
-+update_psa_checksum(struct net_device * dev)
- {
- #ifdef SET_PSA_CRC
- psa_t psa;
-@@ -753,7 +753,7 @@ void wv_roam_handover(wavepoint_history
- }
-
- /* Called when a WavePoint beacon is received */
--static inline void wl_roam_gather(device * dev,
-+static inline void wl_roam_gather(struct net_device * dev,
- u_char * hdr, /* Beacon header */
- u_char * stats) /* SNR, Signal quality
- of packet */
-@@ -831,7 +831,7 @@ static inline int WAVELAN_BEACON(unsigne
- * wv_82593_config() & wv_diag())
- */
- static int
--wv_82593_cmd(device * dev,
-+wv_82593_cmd(struct net_device * dev,
- char * str,
- int cmd,
- int result)
-@@ -942,7 +942,7 @@ wv_82593_cmd(device * dev,
- * status for the WaveLAN.
- */
- static inline int
--wv_diag(device * dev)
-+wv_diag(struct net_device * dev)
- {
- int ret = FALSE;
-
-@@ -963,7 +963,7 @@ wv_diag(device * dev)
- * The return value is the address to use for next the call.
- */
- static int
--read_ringbuf(device * dev,
-+read_ringbuf(struct net_device * dev,
- int addr,
- char * buf,
- int len)
-@@ -1004,10 +1004,10 @@ read_ringbuf(device * dev,
- * some delay sometime...
- */
- static inline void
--wv_82593_reconfig(device * dev)
-+wv_82593_reconfig(struct net_device * dev)
- {
- net_local * lp = (net_local *)dev->priv;
-- dev_link_t * link = ((net_local *) dev->priv)->link;
-+ dev_link_t * link = lp->link;
- unsigned long flags;
-
- /* Arm the flag, will be cleard in wv_82593_config() */
-@@ -1132,7 +1132,7 @@ wv_psa_show(psa_t * p)
- * This function need to be completed...
- */
- static void
--wv_mmc_show(device * dev)
-+wv_mmc_show(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- net_local * lp = (net_local *)dev->priv;
-@@ -1222,7 +1222,7 @@ wv_mmc_show(device * dev)
- * Print the formatted status of the i82593's receive unit.
- */
- static void
--wv_ru_show(device * dev)
-+wv_ru_show(struct net_device * dev)
- {
- net_local *lp = (net_local *) dev->priv;
-
-@@ -1241,7 +1241,7 @@ wv_ru_show(device * dev)
- * Print the formatted status of the WaveLAN PCMCIA device driver.
- */
- static void
--wv_dev_show(device * dev)
-+wv_dev_show(struct net_device * dev)
- {
- printk(KERN_DEBUG "dev:");
- printk(" state=%lX,", dev->state);
-@@ -1256,7 +1256,7 @@ wv_dev_show(device * dev)
- * private information.
- */
- static void
--wv_local_show(device * dev)
-+wv_local_show(struct net_device * dev)
- {
- net_local *lp;
-
-@@ -1314,7 +1314,7 @@ wv_packet_info(u_char * p, /* Packet t
- * There is a lot of flag to configure it at your will...
- */
- static inline void
--wv_init_info(device * dev)
-+wv_init_info(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- psa_t psa;
-@@ -1412,7 +1412,7 @@ wv_init_info(device * dev)
- * Used when the user read /proc/net/dev
- */
- static en_stats *
--wavelan_get_stats(device * dev)
-+wavelan_get_stats(struct net_device * dev)
- {
- #ifdef DEBUG_IOCTL_TRACE
- printk(KERN_DEBUG "%s: <>wavelan_get_stats()\n", dev->name);
-@@ -1431,7 +1431,7 @@ wavelan_get_stats(device * dev)
- */
-
- static void
--wavelan_set_multicast_list(device * dev)
-+wavelan_set_multicast_list(struct net_device * dev)
- {
- net_local * lp = (net_local *) dev->priv;
-
-@@ -1529,7 +1529,7 @@ wavelan_set_multicast_list(device * dev)
- */
- #ifdef SET_MAC_ADDRESS
- static int
--wavelan_set_mac_address(device * dev,
-+wavelan_set_mac_address(struct net_device * dev,
- void * addr)
- {
- struct sockaddr * mac = addr;
-@@ -1796,7 +1796,7 @@ wv_frequency_list(u_long base, /* i/o po
- * Sorry, but this function really need wireless extensions...
- */
- static inline void
--wl_spy_gather(device * dev,
-+wl_spy_gather(struct net_device * dev,
- u_char * mac, /* MAC address */
- u_char * stats) /* Statistics to gather */
- {
-@@ -1823,7 +1823,7 @@ wl_spy_gather(device * dev,
- * or you may also calculate the mean and standard deviation of the level...
- */
- static inline void
--wl_his_gather(device * dev,
-+wl_his_gather(struct net_device * dev,
- u_char * stats) /* Statistics to gather */
- {
- net_local * lp = (net_local *) dev->priv;
-@@ -2785,7 +2785,7 @@ wavelan_ioctl(struct net_device * dev, /
- * Called by /proc/net/wireless...
- */
- static iw_stats *
--wavelan_get_wireless_stats(device * dev)
-+wavelan_get_wireless_stats(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- net_local * lp = (net_local *) dev->priv;
-@@ -2847,7 +2847,7 @@ wavelan_get_wireless_stats(device * dev)
- * (called by wv_packet_rcv())
- */
- static inline int
--wv_start_of_frame(device * dev,
-+wv_start_of_frame(struct net_device * dev,
- int rfp, /* end of frame */
- int wrap) /* start of buffer */
- {
-@@ -2909,7 +2909,7 @@ wv_start_of_frame(device * dev,
- * (called by wv_packet_rcv())
- */
- static inline void
--wv_packet_read(device * dev,
-+wv_packet_read(struct net_device * dev,
- int fd_p,
- int sksize)
- {
-@@ -3012,7 +3012,7 @@ wv_packet_read(device * dev,
- * Note : the spinlock is already grabbed for us and irq are disabled.
- */
- static inline void
--wv_packet_rcv(device * dev)
-+wv_packet_rcv(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- net_local * lp = (net_local *) dev->priv;
-@@ -3146,7 +3146,7 @@ wv_packet_rcv(device * dev)
- * (called in wavelan_packet_xmit())
- */
- static inline void
--wv_packet_write(device * dev,
-+wv_packet_write(struct net_device * dev,
- void * buf,
- short length)
- {
-@@ -3209,7 +3209,7 @@ wv_packet_write(device * dev,
- */
- static int
- wavelan_packet_xmit(struct sk_buff * skb,
-- device * dev)
-+ struct net_device * dev)
- {
- net_local * lp = (net_local *)dev->priv;
- unsigned long flags;
-@@ -3273,7 +3273,7 @@ wavelan_packet_xmit(struct sk_buff * skb
- * (called by wv_hw_config())
- */
- static inline int
--wv_mmc_init(device * dev)
-+wv_mmc_init(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- psa_t psa;
-@@ -3467,7 +3467,7 @@ wv_mmc_init(device * dev)
- * (called in wv_ru_start() and wavelan_close() and wavelan_event())
- */
- static int
--wv_ru_stop(device * dev)
-+wv_ru_stop(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- net_local * lp = (net_local *) dev->priv;
-@@ -3530,7 +3530,7 @@ wv_ru_stop(device * dev)
- * (called in wv_hw_reset() & wavelan_open())
- */
- static int
--wv_ru_start(device * dev)
-+wv_ru_start(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- net_local * lp = (net_local *) dev->priv;
-@@ -3618,7 +3618,7 @@ wv_ru_start(device * dev)
- * (called by wv_hw_config(), wv_82593_reconfig() & wavelan_packet_xmit())
- */
- static int
--wv_82593_config(device * dev)
-+wv_82593_config(struct net_device * dev)
- {
- ioaddr_t base = dev->base_addr;
- net_local * lp = (net_local *) dev->priv;
-@@ -3792,7 +3792,7 @@ wv_82593_config(device * dev)
- * (called by wv_config())
- */
- static inline int
--wv_pcmcia_reset(device * dev)
-+wv_pcmcia_reset(struct net_device * dev)
- {
- int i;
- conf_reg_t reg = { 0, CS_READ, CISREG_COR, 0 };
-@@ -3854,7 +3854,7 @@ wv_pcmcia_reset(device * dev)
- * (called by wavelan_event() & wv_hw_reset())
- */
- static int
--wv_hw_config(device * dev)
-+wv_hw_config(struct net_device * dev)
- {
- net_local * lp = (net_local *) dev->priv;
- ioaddr_t base = dev->base_addr;
-@@ -3961,7 +3961,7 @@ wv_hw_config(device * dev)
- * (called by wavelan_event(), wavelan_watchdog() and wavelan_open())
- */
- static inline void
--wv_hw_reset(device * dev)
-+wv_hw_reset(struct net_device * dev)
- {
- net_local * lp = (net_local *) dev->priv;
-
-@@ -4004,7 +4004,7 @@ wv_pcmcia_config(dev_link_t * link)
- memreq_t mem;
-
- handle = link->handle;
-- dev = (device *) link->priv;
-+ dev = (struct net_device *) link->priv;
-
- #ifdef DEBUG_CONFIG_TRACE
- printk(KERN_DEBUG "->wv_pcmcia_config(0x%p)\n", link);
-@@ -4150,7 +4150,7 @@ wv_pcmcia_config(dev_link_t * link)
- static void
- wv_pcmcia_release(dev_link_t *link)
- {
-- device * dev = (device *) link->priv;
-+ struct net_device * dev = (struct net_device *) link->priv;
-
- #ifdef DEBUG_CONFIG_TRACE
- printk(KERN_DEBUG "%s: -> wv_pcmcia_release(0x%p)\n", dev->name, link);
-@@ -4200,13 +4200,13 @@ wavelan_interrupt(int irq,
- void * dev_id,
- struct pt_regs * regs)
- {
-- device * dev;
-+ struct net_device * dev;
- net_local * lp;
- ioaddr_t base;
- int status0;
- u_int tx_status;
-
-- if((dev = (device *)dev_id) == (device *) NULL)
-+ if ((dev = dev_id) == NULL)
- {
- #ifdef DEBUG_INTERRUPT_ERROR
- printk(KERN_WARNING "wavelan_interrupt(): irq %d for unknown device.\n",
-@@ -4467,7 +4467,7 @@ wavelan_interrupt(int irq,
- * deal with the multiple Tx buffers...
- */
- static void
--wavelan_watchdog(device * dev)
-+wavelan_watchdog(struct net_device * dev)
- {
- net_local * lp = (net_local *) dev->priv;
- ioaddr_t base = dev->base_addr;
-@@ -4542,7 +4542,7 @@ wavelan_watchdog(device * dev)
- * Called by NET3 when it "open" the device.
- */
- static int
--wavelan_open(device * dev)
-+wavelan_open(struct net_device * dev)
- {
- dev_link_t * link = ((net_local *) dev->priv)->link;
- net_local * lp = (net_local *)dev->priv;
-@@ -4597,7 +4597,7 @@ wavelan_open(device * dev)
- * Called by NET3 when it "close" the device.
- */
- static int
--wavelan_close(device * dev)
-+wavelan_close(struct net_device * dev)
- {
- dev_link_t * link = ((net_local *) dev->priv)->link;
- ioaddr_t base = dev->base_addr;
-@@ -4661,7 +4661,7 @@ wavelan_attach(void)
- {
- client_reg_t client_reg; /* Register with cardmgr */
- dev_link_t * link; /* Info for cardmgr */
-- device * dev; /* Interface generic data */
-+ struct net_device * dev; /* Interface generic data */
- net_local * lp; /* Interface specific data */
- int i, ret;
-
-@@ -4699,22 +4699,14 @@ wavelan_attach(void)
- dev_list = link;
-
- /* Allocate the generic data structure */
-- dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
-+ dev = alloc_etherdev(sizeof(net_local));
- if (!dev) {
- kfree(link);
- return NULL;
- }
-- memset(dev, 0x00, sizeof(struct net_device));
- link->priv = link->irq.Instance = dev;
-
-- /* Allocate the wavelan-specific data structure. */
-- dev->priv = lp = (net_local *) kmalloc(sizeof(net_local), GFP_KERNEL);
-- if (!lp) {
-- kfree(link);
-- kfree(dev);
-- return NULL;
-- }
-- memset(lp, 0x00, sizeof(net_local));
-+ lp = dev->priv;
-
- /* Init specific data */
- lp->configured = 0;
-@@ -4732,9 +4724,6 @@ wavelan_attach(void)
- lp->link = link;
- lp->dev = dev;
-
-- /* Standard setup for generic data */
-- ether_setup(dev);
--
- /* wavelan NET3 callbacks */
- SET_MODULE_OWNER(dev);
- dev->open = &wavelan_open;
-@@ -4852,22 +4841,16 @@ wavelan_detach(dev_link_t * link)
- /* Free pieces */
- if(link->priv)
- {
-- device * dev = (device *) link->priv;
-+ struct net_device * dev = (struct net_device *) link->priv;
-
- /* Remove ourselves from the kernel list of ethernet devices */
- /* Warning : can't be called from interrupt, timer or wavelan_close() */
-- if(link->dev != NULL)
-+ if (link->dev)
- unregister_netdev(dev);
- link->dev = NULL;
--
-- if(dev->priv)
-- {
-- /* Sound strange, but safe... */
-- ((net_local *) dev->priv)->link = (dev_link_t *) NULL;
-- ((net_local *) dev->priv)->dev = (device *) NULL;
-- kfree(dev->priv);
-- }
-- kfree(link->priv);
-+ ((net_local *) dev->priv)->link = NULL;
-+ ((net_local *) dev->priv)->dev = NULL;
-+ free_netdev(dev);
- }
- kfree(link);
-
-@@ -4889,7 +4872,7 @@ wavelan_event(event_t event, /* The ev
- event_callback_args_t * args)
- {
- dev_link_t * link = (dev_link_t *) args->client_data;
-- device * dev = (device *) link->priv;
-+ struct net_device * dev = (struct net_device *) link->priv;
-
- #ifdef DEBUG_CALLBACK_TRACE
- printk(KERN_DEBUG "->wavelan_event(): %s\n",
---- linux-2.6.0/drivers/net/wireless/wavelan_cs.p.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/wavelan_cs.p.h 2003-12-28 23:21:01.000000000 -0800
-@@ -588,7 +588,6 @@ struct wavepoint_table
- /****************************** TYPES ******************************/
-
- /* Shortcuts */
--typedef struct net_device device;
- typedef struct net_device_stats en_stats;
- typedef struct iw_statistics iw_stats;
- typedef struct iw_quality iw_qual;
-@@ -611,7 +610,7 @@ typedef u_char mac_addr[WAVELAN_ADDR_SI
- struct net_local
- {
- dev_node_t node; /* ???? What is this stuff ???? */
-- device * dev; /* Reverse link... */
-+ struct net_device * dev; /* Reverse link... */
- spinlock_t spinlock; /* Serialize access to the hardware (SMP) */
- dev_link_t * link; /* pcmcia structure */
- en_stats stats; /* Ethernet interface statistics */
-@@ -673,11 +672,11 @@ static inline void
- hacr_write_slow(u_long,
- u_char);
- static void
-- psa_read(device *, /* Read the Parameter Storage Area */
-+ psa_read(struct net_device *, /* Read the Parameter Storage Area */
- int, /* offset in PSA */
- u_char *, /* buffer to fill */
- int), /* size to read */
-- psa_write(device *, /* Write to the PSA */
-+ psa_write(struct net_device *, /* Write to the PSA */
- int, /* Offset in psa */
- u_char *, /* Buffer in memory */
- int); /* Length of buffer */
-@@ -707,57 +706,57 @@ static void
- int); /* number of registers */
- /* ---------------------- I82593 SUBROUTINES ----------------------- */
- static int
-- wv_82593_cmd(device *, /* synchronously send a command to i82593 */
-+ wv_82593_cmd(struct net_device *, /* synchronously send a command to i82593 */
- char *,
- int,
- int);
- static inline int
-- wv_diag(device *); /* Diagnostique the i82593 */
-+ wv_diag(struct net_device *); /* Diagnostique the i82593 */
- static int
-- read_ringbuf(device *, /* Read a receive buffer */
-+ read_ringbuf(struct net_device *, /* Read a receive buffer */
- int,
- char *,
- int);
- static inline void
-- wv_82593_reconfig(device *); /* Reconfigure the controller */
-+ wv_82593_reconfig(struct net_device *); /* Reconfigure the controller */
- /* ------------------- DEBUG & INFO SUBROUTINES ------------------- */
- static inline void
-- wv_init_info(device *); /* display startup info */
-+ wv_init_info(struct net_device *); /* display startup info */
- /* ------------------- IOCTL, STATS & RECONFIG ------------------- */
- static en_stats *
-- wavelan_get_stats(device *); /* Give stats /proc/net/dev */
-+ wavelan_get_stats(struct net_device *); /* Give stats /proc/net/dev */
- /* ----------------------- PACKET RECEPTION ----------------------- */
- static inline int
-- wv_start_of_frame(device *, /* Seek beggining of current frame */
-+ wv_start_of_frame(struct net_device *, /* Seek beggining of current frame */
- int, /* end of frame */
- int); /* start of buffer */
- static inline void
-- wv_packet_read(device *, /* Read a packet from a frame */
-+ wv_packet_read(struct net_device *, /* Read a packet from a frame */
- int,
- int),
-- wv_packet_rcv(device *); /* Read all packets waiting */
-+ wv_packet_rcv(struct net_device *); /* Read all packets waiting */
- /* --------------------- PACKET TRANSMISSION --------------------- */
- static inline void
-- wv_packet_write(device *, /* Write a packet to the Tx buffer */
-+ wv_packet_write(struct net_device *, /* Write a packet to the Tx buffer */
- void *,
- short);
- static int
- wavelan_packet_xmit(struct sk_buff *, /* Send a packet */
-- device *);
-+ struct net_device *);
- /* -------------------- HARDWARE CONFIGURATION -------------------- */
- static inline int
-- wv_mmc_init(device *); /* Initialize the modem */
-+ wv_mmc_init(struct net_device *); /* Initialize the modem */
- static int
-- wv_ru_stop(device *), /* Stop the i82593 receiver unit */
-- wv_ru_start(device *); /* Start the i82593 receiver unit */
-+ wv_ru_stop(struct net_device *), /* Stop the i82593 receiver unit */
-+ wv_ru_start(struct net_device *); /* Start the i82593 receiver unit */
- static int
-- wv_82593_config(device *); /* Configure the i82593 */
-+ wv_82593_config(struct net_device *); /* Configure the i82593 */
- static inline int
-- wv_pcmcia_reset(device *); /* Reset the pcmcia interface */
-+ wv_pcmcia_reset(struct net_device *); /* Reset the pcmcia interface */
- static int
-- wv_hw_config(device *); /* Reset & configure the whole hardware */
-+ wv_hw_config(struct net_device *); /* Reset & configure the whole hardware */
- static inline void
-- wv_hw_reset(device *); /* Same, + start receiver unit */
-+ wv_hw_reset(struct net_device *); /* Same, + start receiver unit */
- static inline int
- wv_pcmcia_config(dev_link_t *); /* Configure the pcmcia interface */
- static void
-@@ -768,11 +767,11 @@ static irqreturn_t
- void *,
- struct pt_regs *);
- static void
-- wavelan_watchdog(device *); /* Transmission watchdog */
-+ wavelan_watchdog(struct net_device *); /* Transmission watchdog */
- /* ------------------- CONFIGURATION CALLBACKS ------------------- */
- static int
-- wavelan_open(device *), /* Open the device */
-- wavelan_close(device *); /* Close the device */
-+ wavelan_open(struct net_device *), /* Open the device */
-+ wavelan_close(struct net_device *); /* Close the device */
- static dev_link_t *
- wavelan_attach(void); /* Create a new device */
- static void
---- linux-2.6.0/drivers/net/wireless/wavelan.p.h 2003-06-14 12:18:28.000000000 -0700
-+++ 25/drivers/net/wireless/wavelan.p.h 2003-12-28 23:21:01.000000000 -0800
-@@ -469,7 +469,6 @@ static const char *version = "wavelan.c
- /****************************** TYPES ******************************/
-
- /* Shortcuts */
--typedef struct net_device device;
- typedef struct net_device_stats en_stats;
- typedef struct iw_statistics iw_stats;
- typedef struct iw_quality iw_qual;
-@@ -492,7 +491,7 @@ typedef u_char mac_addr[WAVELAN_ADDR_SI
- struct net_local
- {
- net_local * next; /* linked list of the devices */
-- device * dev; /* reverse link */
-+ struct net_device * dev; /* reverse link */
- spinlock_t spinlock; /* Serialize access to the hardware (SMP) */
- en_stats stats; /* Ethernet interface statistics */
- int nresets; /* number of hardware resets */
-@@ -542,8 +541,8 @@ static inline void
- u_short), /* hacr */
- wv_16_on(u_long, /* ioaddr */
- u_short), /* hacr */
-- wv_ints_off(device *),
-- wv_ints_on(device *);
-+ wv_ints_off(struct net_device *),
-+ wv_ints_on(struct net_device *);
- /* ----------------- MODEM MANAGEMENT SUBROUTINES ----------------- */
- static void
- psa_read(u_long, /* Read the Parameter Storage Area. */
-@@ -592,57 +591,57 @@ static inline void
- u_char *, /* b */
- int); /* n */
- static void
-- wv_ack(device *);
-+ wv_ack(struct net_device *);
- static inline int
-- wv_synchronous_cmd(device *,
-+ wv_synchronous_cmd(struct net_device *,
- const char *),
-- wv_config_complete(device *,
-+ wv_config_complete(struct net_device *,
- u_long,
- net_local *);
- static int
-- wv_complete(device *,
-+ wv_complete(struct net_device *,
- u_long,
- net_local *);
- static inline void
-- wv_82586_reconfig(device *);
-+ wv_82586_reconfig(struct net_device *);
- /* ------------------- DEBUG & INFO SUBROUTINES ------------------- */
- #ifdef DEBUG_I82586_SHOW
- static void
- wv_scb_show(unsigned short);
- #endif
- static inline void
-- wv_init_info(device *); /* display startup info */
-+ wv_init_info(struct net_device *); /* display startup info */
- /* ------------------- IOCTL, STATS & RECONFIG ------------------- */
- static en_stats *
-- wavelan_get_stats(device *); /* Give stats /proc/net/dev */
-+ wavelan_get_stats(struct net_device *); /* Give stats /proc/net/dev */
- static void
-- wavelan_set_multicast_list(device *);
-+ wavelan_set_multicast_list(struct net_device *);
- /* ----------------------- PACKET RECEPTION ----------------------- */
- static inline void
-- wv_packet_read(device *, /* Read a packet from a frame. */
-+ wv_packet_read(struct net_device *, /* Read a packet from a frame. */
- u_short,
- int),
-- wv_receive(device *); /* Read all packets waiting. */
-+ wv_receive(struct net_device *); /* Read all packets waiting. */
- /* --------------------- PACKET TRANSMISSION --------------------- */
- static inline int
-- wv_packet_write(device *, /* Write a packet to the Tx buffer. */
-+ wv_packet_write(struct net_device *, /* Write a packet to the Tx buffer. */
- void *,
- short);
- static int
- wavelan_packet_xmit(struct sk_buff *, /* Send a packet. */
-- device *);
-+ struct net_device *);
- /* -------------------- HARDWARE CONFIGURATION -------------------- */
- static inline int
-- wv_mmc_init(device *), /* Initialize the modem. */
-- wv_ru_start(device *), /* Start the i82586 receiver unit. */
-- wv_cu_start(device *), /* Start the i82586 command unit. */
-- wv_82586_start(device *); /* Start the i82586. */
-+ wv_mmc_init(struct net_device *), /* Initialize the modem. */
-+ wv_ru_start(struct net_device *), /* Start the i82586 receiver unit. */
-+ wv_cu_start(struct net_device *), /* Start the i82586 command unit. */
-+ wv_82586_start(struct net_device *); /* Start the i82586. */
- static void
-- wv_82586_config(device *); /* Configure the i82586. */
-+ wv_82586_config(struct net_device *); /* Configure the i82586. */
- static inline void
-- wv_82586_stop(device *);
-+ wv_82586_stop(struct net_device *);
- static int
-- wv_hw_reset(device *), /* Reset the WaveLAN hardware. */
-+ wv_hw_reset(struct net_device *), /* Reset the WaveLAN hardware. */
- wv_check_ioaddr(u_long, /* ioaddr */
- u_char *); /* mac address (read) */
- /* ---------------------- INTERRUPT HANDLING ---------------------- */
-@@ -651,14 +650,13 @@ static irqreturn_t
- void *,
- struct pt_regs *);
- static void
-- wavelan_watchdog(device *); /* transmission watchdog */
-+ wavelan_watchdog(struct net_device *); /* transmission watchdog */
- /* ------------------- CONFIGURATION CALLBACKS ------------------- */
- static int
-- wavelan_open(device *), /* Open the device. */
-- wavelan_close(device *), /* Close the device. */
-- wavelan_config(device *); /* Configure one device. */
--extern int
-- wavelan_probe(device *); /* See Space.c. */
-+ wavelan_open(struct net_device *), /* Open the device. */
-+ wavelan_close(struct net_device *), /* Close the device. */
-+ wavelan_config(struct net_device *, unsigned short);/* Configure one device. */
-+extern struct net_device *wavelan_probe(int unit); /* See Space.c. */
-
- /**************************** VARIABLES ****************************/
-
---- linux-2.6.0/drivers/net/wireless/wl3501_cs.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/net/wireless/wl3501_cs.c 2003-12-28 23:22:53.000000000 -0800
-@@ -1449,18 +1449,6 @@ fail:
- goto out;
- }
-
--/**
-- * wl3501_init - "initialize" board
-- * @dev - network device
-- *
-- * We never need to do anything when a wl3501 device is "initialized" by the net
-- * software, because we only register already-found cards.
-- */
--static int wl3501_init(struct net_device *dev)
--{
-- return 0;
--}
--
- struct net_device_stats *wl3501_get_stats(struct net_device *dev)
- {
- struct wl3501_card *this = dev->priv;
-@@ -1586,7 +1574,7 @@ static void wl3501_detach(dev_link_t *li
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free pieces */
- *linkp = link->next;
-@@ -2056,7 +2044,6 @@ static dev_link_t *wl3501_attach(void)
- dev = alloc_etherdev(sizeof(struct wl3501_card));
- if (!dev)
- goto out_link;
-- dev->init = wl3501_init;
- dev->open = wl3501_open;
- dev->stop = wl3501_close;
- dev->hard_start_xmit = wl3501_hard_start_xmit;
-@@ -2083,7 +2070,7 @@ static dev_link_t *wl3501_attach(void)
- client_reg.event_handler = wl3501_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret) {
- cs_error(link->handle, RegisterClient, ret);
- wl3501_detach(link);
-@@ -2097,8 +2084,8 @@ out_link:
- goto out;
- }
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret = CardServices(last_fn = (fn), args)) != 0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- /**
- * wl3501_config - configure the PCMCIA socket and make eth device available
-@@ -2121,12 +2108,12 @@ static void wl3501_config(dev_link_t *li
- /* This reads the card's CONFIG tuple to find its config registers. */
- tuple.Attributes = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- tuple.TupleData = bf;
- tuple.TupleDataMax = sizeof(bf);
- tuple.TupleOffset = 0;
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -2142,7 +2129,7 @@ static void wl3501_config(dev_link_t *li
- * 0x200-0x2ff, and so on, because this seems safer */
- link->io.BasePort1 = j;
- link->io.BasePort2 = link->io.BasePort1 + 0x10;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- break;
- }
-@@ -2154,12 +2141,12 @@ static void wl3501_config(dev_link_t *li
- /* Now allocate an interrupt line. Note that this does not actually
- * assign a handler to the interrupt. */
-
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-
- /* This actually configures the PCMCIA socket -- setting up the I/O
- * windows and the interrupt mapping. */
-
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- dev->irq = link->irq.AssignedIRQ;
- dev->base_addr = link->io.BasePort1;
-@@ -2249,9 +2236,9 @@ static void wl3501_release(dev_link_t *l
- }
-
- /* Don't bother checking to see if these succeed or not */
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
-
- if (link->state & DEV_STALE_CONFIG)
-@@ -2301,7 +2288,7 @@ static int wl3501_event(event_t event, i
- if (link->state & DEV_CONFIG) {
- if (link->open)
- netif_device_detach(dev);
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
- case CS_EVENT_PM_RESUME:
-@@ -2310,8 +2297,7 @@ static int wl3501_event(event_t event, i
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle,
-- &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (link->open) {
- wl3501_reset(dev);
- netif_device_attach(dev);
---- linux-2.6.0/drivers/net/znet.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/znet.c 2003-12-28 23:21:01.000000000 -0800
-@@ -372,10 +372,8 @@ static int __init znet_probe (void)
- struct znet_private *znet;
- struct net_device *dev;
- char *p;
-+ int err = -ENOMEM;
-
-- if (znet_dev) /* Only look for a single adaptor */
-- return -ENODEV;
--
- /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */
- for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++)
- if (*p == 'N' && strncmp(p, "NETIDBLK", 8) == 0)
-@@ -387,12 +385,14 @@ static int __init znet_probe (void)
- return -ENODEV;
- }
-
-- if (!(znet_dev = dev = init_etherdev(0, sizeof(struct znet_private))))
-- return -ENOMEM;
-+ dev = alloc_etherdev(sizeof(struct znet_private));
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ SET_MODULE_OWNER (dev);
-
- znet = dev->priv;
-
-- SET_MODULE_OWNER (dev);
- netinfo = (struct netidblk *)p;
- dev->base_addr = netinfo->iobase1;
- dev->irq = netinfo->irq1;
-@@ -430,7 +430,7 @@ static int __init znet_probe (void)
- znet->io_size = 2;
-
- if (!(znet->rx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA)))
-- goto free_netdev;
-+ goto free_dev;
- if (!(znet->tx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA)))
- goto free_rx;
-
-@@ -452,19 +452,19 @@ static int __init znet_probe (void)
- dev->set_multicast_list = &znet_set_multicast_list;
- dev->tx_timeout = znet_tx_timeout;
- dev->watchdog_timeo = TX_TIMEOUT;
--
-+ err = register_netdev(dev);
-+ if (err)
-+ goto free_tx;
-+ znet_dev = dev;
- return 0;
-
- free_tx:
-- kfree (znet->tx_start);
-+ kfree(znet->tx_start);
- free_rx:
-- kfree (znet->rx_start);
-- free_netdev:
-- unregister_netdev (dev);
-- kfree (dev);
-- znet_dev = NULL;
--
-- return -ENOMEM;
-+ kfree(znet->rx_start);
-+ free_dev:
-+ free_netdev(dev);
-+ return err;
- }
-
- \f
-@@ -934,16 +934,14 @@ static void update_stop_hit(short ioaddr
-
- static __exit void znet_cleanup (void)
- {
--#ifdef MODULE
- if (znet_dev) {
- struct znet_private *znet = znet_dev->priv;
-
-+ unregister_netdev (znet_dev);
- kfree (znet->rx_start);
- kfree (znet->tx_start);
-- unregister_netdev (znet_dev);
- free_netdev (znet_dev);
- }
--#endif
- }
-
- module_init (znet_probe);
---- linux-2.6.0/drivers/net/zorro8390.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/net/zorro8390.c 2003-12-28 23:21:01.000000000 -0800
-@@ -103,18 +103,18 @@ static int __init zorro8390_probe(void)
- continue;
- board = z->resource.start;
- ioaddr = board+cards[i].offset;
-- dev = init_etherdev(0, 0);
-- SET_MODULE_OWNER(dev);
-+ dev = alloc_ei_netdev();
- if (!dev)
- return -ENOMEM;
-+ SET_MODULE_OWNER(dev);
- if (!request_mem_region(ioaddr, NE_IO_EXTENT*2, dev->name)) {
-- kfree(dev);
-+ free_netdev(dev);
- continue;
- }
- if ((err = zorro8390_init(dev, board, cards[i].name,
- ZTWO_VADDR(ioaddr)))) {
- release_mem_region(ioaddr, NE_IO_EXTENT*2);
-- kfree(dev);
-+ free_netdev(dev);
- return err;
- }
- err = 0;
-@@ -129,6 +129,7 @@ static int __init zorro8390_init(struct
- const char *name, unsigned long ioaddr)
- {
- int i;
-+ int err;
- unsigned char SA_prom[32];
- int start_page, stop_page;
- static u32 zorro8390_offsets[16] = {
-@@ -195,12 +196,6 @@ static int __init zorro8390_init(struct
- i = request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, dev->name, dev);
- if (i) return i;
-
-- /* Allocate dev->priv and fill in 8390 specific dev fields. */
-- if (ethdev_init(dev)) {
-- printk("Unable to get memory for dev->priv.\n");
-- return -ENOMEM;
-- }
--
- for(i = 0; i < ETHER_ADDR_LEN; i++) {
- #ifdef DEBUG
- printk(" %2.2x", SA_prom[i]);
-@@ -232,7 +227,10 @@ static int __init zorro8390_init(struct
- root_zorro8390_dev = dev;
- #endif
- NS8390_init(dev, 0);
-- return 0;
-+ err = register_netdev(dev);
-+ if (err)
-+ free_irq(IRQ_AMIGA_PORTS, dev);
-+ return err;
- }
-
- static int zorro8390_open(struct net_device *dev)
---- linux-2.6.0/drivers/parport/parport_cs.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/parport/parport_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -151,7 +151,7 @@ static dev_link_t *parport_attach(void)
- client_reg.event_handler = &parport_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- parport_detach(link);
-@@ -187,7 +187,7 @@ static void parport_detach(dev_link_t *l
- parport_cs_release(link);
-
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -206,11 +206,8 @@ static void parport_detach(dev_link_t *l
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- void parport_config(dev_link_t *link)
- {
-@@ -231,9 +228,9 @@ void parport_config(dev_link_t *link)
- tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
- tuple.Attributes = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -241,14 +238,15 @@ void parport_config(dev_link_t *link)
- link->state |= DEV_CONFIG;
-
- /* Not sure if this is right... look up the current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
- tuple.Attributes = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
-
- if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
- cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
-@@ -262,18 +260,19 @@ void parport_config(dev_link_t *link)
- link->io.BasePort2 = io->win[1].base;
- link->io.NumPorts2 = io->win[1].len;
- }
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
- /* If we've got this far, we're done */
- break;
- }
-
- next_entry:
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- release_region(link->io.BasePort1, link->io.NumPorts1);
- if (link->io.NumPorts2)
-@@ -335,9 +334,9 @@ void parport_cs_release(dev_link_t *link
- info->ndev = 0;
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
-
-@@ -372,14 +371,14 @@ int parport_event(event_t event, int pri
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link))
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
- return 0;
---- linux-2.6.0/drivers/pci/Makefile 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/pci/Makefile 2003-12-28 23:21:44.000000000 -0800
-@@ -27,6 +27,7 @@ obj-$(CONFIG_PPC64) += setup-bus.o
- obj-$(CONFIG_SGI_IP27) += setup-irq.o
- obj-$(CONFIG_SGI_IP32) += setup-irq.o
- obj-$(CONFIG_X86_VISWS) += setup-irq.o
-+obj-$(CONFIG_PCI_USE_VECTOR) += msi.o
-
- # Cardbus & CompactPCI use setup-bus
- obj-$(CONFIG_HOTPLUG) += setup-bus.o
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/pci/msi.c 2003-12-28 23:21:44.000000000 -0800
-@@ -0,0 +1,1068 @@
-+/*
-+ * linux/drivers/pci/msi.c
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/irq.h>
-+#include <linux/interrupt.h>
-+#include <linux/init.h>
-+#include <linux/config.h>
-+#include <linux/ioport.h>
-+#include <linux/smp_lock.h>
-+#include <linux/pci.h>
-+#include <linux/proc_fs.h>
-+
-+#include <asm/errno.h>
-+#include <asm/io.h>
-+#include <asm/smp.h>
-+#include <asm/desc.h>
-+#include <asm/io_apic.h>
-+#include <mach_apic.h>
-+
-+#include <linux/pci_msi.h>
-+
-+_DEFINE_DBG_BUFFER
-+
-+static spinlock_t msi_lock = SPIN_LOCK_UNLOCKED;
-+static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL };
-+static kmem_cache_t* msi_cachep;
-+
-+static int pci_msi_enable = 1;
-+static int nr_alloc_vectors = 0;
-+static int nr_released_vectors = 0;
-+static int nr_reserved_vectors = NR_HP_RESERVED_VECTORS;
-+static int nr_msix_devices = 0;
-+
-+#ifndef CONFIG_X86_IO_APIC
-+int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
-+u8 irq_vector[NR_IRQS] = { FIRST_DEVICE_VECTOR , 0 };
-+#endif
-+
-+static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
-+{
-+ memset(p, 0, NR_IRQS * sizeof(struct msi_desc));
-+}
-+
-+static int msi_cache_init(void)
-+{
-+ msi_cachep = kmem_cache_create("msi_cache",
-+ NR_IRQS * sizeof(struct msi_desc),
-+ 0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL);
-+ if (!msi_cachep)
-+ return -ENOMEM;
-+
-+ return 0;
-+}
-+
-+static void msi_set_mask_bit(unsigned int vector, int flag)
-+{
-+ struct msi_desc *entry;
-+
-+ entry = (struct msi_desc *)msi_desc[vector];
-+ if (!entry || !entry->dev || !entry->mask_base)
-+ return;
-+ switch (entry->msi_attrib.type) {
-+ case PCI_CAP_ID_MSI:
-+ {
-+ int pos;
-+ unsigned int mask_bits;
-+
-+ pos = entry->mask_base;
-+ entry->dev->bus->ops->read(entry->dev->bus, entry->dev->devfn,
-+ pos, 4, &mask_bits);
-+ mask_bits &= ~(1);
-+ mask_bits |= flag;
-+ entry->dev->bus->ops->write(entry->dev->bus, entry->dev->devfn,
-+ pos, 4, mask_bits);
-+ break;
-+ }
-+ case PCI_CAP_ID_MSIX:
-+ {
-+ int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
-+ PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET;
-+ writel(flag, entry->mask_base + offset);
-+ break;
-+ }
-+ default:
-+ break;
-+ }
-+}
-+
-+#ifdef CONFIG_SMP
-+static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask)
-+{
-+ struct msi_desc *entry;
-+ struct msg_address address;
-+ unsigned int dest_id;
-+
-+ entry = (struct msi_desc *)msi_desc[vector];
-+ if (!entry || !entry->dev)
-+ return;
-+
-+ switch (entry->msi_attrib.type) {
-+ case PCI_CAP_ID_MSI:
-+ {
-+ int pos;
-+
-+ if (!(pos = pci_find_capability(entry->dev, PCI_CAP_ID_MSI)))
-+ return;
-+
-+ entry->dev->bus->ops->read(entry->dev->bus, entry->dev->devfn,
-+ msi_lower_address_reg(pos), 4,
-+ &address.lo_address.value);
-+ dest_id = (address.lo_address.u.dest_id &
-+ MSI_ADDRESS_HEADER_MASK) |
-+ (cpu_mask_to_apicid(cpu_mask) << MSI_TARGET_CPU_SHIFT);
-+ address.lo_address.u.dest_id = dest_id;
-+ entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
-+ entry->dev->bus->ops->write(entry->dev->bus, entry->dev->devfn,
-+ msi_lower_address_reg(pos), 4,
-+ address.lo_address.value);
-+ break;
-+ }
-+ case PCI_CAP_ID_MSIX:
-+ {
-+ int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
-+ PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET;
-+
-+ address.lo_address.value = readl(entry->mask_base + offset);
-+ dest_id = (address.lo_address.u.dest_id &
-+ MSI_ADDRESS_HEADER_MASK) |
-+ (cpu_mask_to_apicid(cpu_mask) << MSI_TARGET_CPU_SHIFT);
-+ address.lo_address.u.dest_id = dest_id;
-+ entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
-+ writel(address.lo_address.value, entry->mask_base + offset);
-+ break;
-+ }
-+ default:
-+ break;
-+ }
-+}
-+
-+static inline void move_msi(int vector)
-+{
-+ if (!cpus_empty(pending_irq_balance_cpumask[vector])) {
-+ set_msi_affinity(vector, pending_irq_balance_cpumask[vector]);
-+ cpus_clear(pending_irq_balance_cpumask[vector]);
-+ }
-+}
-+#endif
-+
-+static void mask_MSI_irq(unsigned int vector)
-+{
-+ msi_set_mask_bit(vector, 1);
-+}
-+
-+static void unmask_MSI_irq(unsigned int vector)
-+{
-+ msi_set_mask_bit(vector, 0);
-+}
-+
-+static unsigned int startup_msi_irq_wo_maskbit(unsigned int vector)
-+{
-+ return 0; /* never anything pending */
-+}
-+
-+static void pci_disable_msi(unsigned int vector);
-+static void shutdown_msi_irq(unsigned int vector)
-+{
-+ pci_disable_msi(vector);
-+}
-+
-+#define shutdown_msi_irq_wo_maskbit shutdown_msi_irq
-+static void enable_msi_irq_wo_maskbit(unsigned int vector) {}
-+static void disable_msi_irq_wo_maskbit(unsigned int vector) {}
-+static void ack_msi_irq_wo_maskbit(unsigned int vector) {}
-+static void end_msi_irq_wo_maskbit(unsigned int vector)
-+{
-+ move_msi(vector);
-+ ack_APIC_irq();
-+}
-+
-+static unsigned int startup_msi_irq_w_maskbit(unsigned int vector)
-+{
-+ unmask_MSI_irq(vector);
-+ return 0; /* never anything pending */
-+}
-+
-+#define shutdown_msi_irq_w_maskbit shutdown_msi_irq
-+#define enable_msi_irq_w_maskbit unmask_MSI_irq
-+#define disable_msi_irq_w_maskbit mask_MSI_irq
-+#define ack_msi_irq_w_maskbit mask_MSI_irq
-+
-+static void end_msi_irq_w_maskbit(unsigned int vector)
-+{
-+ move_msi(vector);
-+ unmask_MSI_irq(vector);
-+ ack_APIC_irq();
-+}
-+
-+/*
-+ * Interrupt Type for MSI-X PCI/PCI-X/PCI-Express Devices,
-+ * which implement the MSI-X Capability Structure.
-+ */
-+static struct hw_interrupt_type msix_irq_type = {
-+ .typename = "PCI MSI-X",
-+ .startup = startup_msi_irq_w_maskbit,
-+ .shutdown = shutdown_msi_irq_w_maskbit,
-+ .enable = enable_msi_irq_w_maskbit,
-+ .disable = disable_msi_irq_w_maskbit,
-+ .ack = ack_msi_irq_w_maskbit,
-+ .end = end_msi_irq_w_maskbit,
-+ .set_affinity = set_msi_irq_affinity
-+};
-+
-+/*
-+ * Interrupt Type for MSI PCI/PCI-X/PCI-Express Devices,
-+ * which implement the MSI Capability Structure with
-+ * Mask-and-Pending Bits.
-+ */
-+static struct hw_interrupt_type msi_irq_w_maskbit_type = {
-+ .typename = "PCI MSI",
-+ .startup = startup_msi_irq_w_maskbit,
-+ .shutdown = shutdown_msi_irq_w_maskbit,
-+ .enable = enable_msi_irq_w_maskbit,
-+ .disable = disable_msi_irq_w_maskbit,
-+ .ack = ack_msi_irq_w_maskbit,
-+ .end = end_msi_irq_w_maskbit,
-+ .set_affinity = set_msi_irq_affinity
-+};
-+
-+/*
-+ * Interrupt Type for MSI PCI/PCI-X/PCI-Express Devices,
-+ * which implement the MSI Capability Structure without
-+ * Mask-and-Pending Bits.
-+ */
-+static struct hw_interrupt_type msi_irq_wo_maskbit_type = {
-+ .typename = "PCI MSI",
-+ .startup = startup_msi_irq_wo_maskbit,
-+ .shutdown = shutdown_msi_irq_wo_maskbit,
-+ .enable = enable_msi_irq_wo_maskbit,
-+ .disable = disable_msi_irq_wo_maskbit,
-+ .ack = ack_msi_irq_wo_maskbit,
-+ .end = end_msi_irq_wo_maskbit,
-+ .set_affinity = set_msi_irq_affinity
-+};
-+
-+static void msi_data_init(struct msg_data *msi_data,
-+ unsigned int vector)
-+{
-+ memset(msi_data, 0, sizeof(struct msg_data));
-+ msi_data->vector = (u8)vector;
-+ msi_data->delivery_mode = MSI_DELIVERY_MODE;
-+ msi_data->level = MSI_LEVEL_MODE;
-+ msi_data->trigger = MSI_TRIGGER_MODE;
-+}
-+
-+static void msi_address_init(struct msg_address *msi_address)
-+{
-+ unsigned int dest_id;
-+
-+ memset(msi_address, 0, sizeof(struct msg_address));
-+ msi_address->hi_address = (u32)0;
-+ dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT) |
-+ (MSI_TARGET_CPU << MSI_TARGET_CPU_SHIFT);
-+ msi_address->lo_address.u.dest_mode = MSI_LOGICAL_MODE;
-+ msi_address->lo_address.u.redirection_hint = MSI_REDIRECTION_HINT_MODE;
-+ msi_address->lo_address.u.dest_id = dest_id;
-+}
-+
-+static int pci_vector_resources(void)
-+{
-+ static int res = -EINVAL;
-+ int nr_free_vectors;
-+
-+ if (res == -EINVAL) {
-+ int i, repeat;
-+ for (i = NR_REPEATS; i > 0; i--) {
-+ if ((FIRST_DEVICE_VECTOR + i * 8) > FIRST_SYSTEM_VECTOR)
-+ continue;
-+ break;
-+ }
-+ i++;
-+ repeat = (FIRST_SYSTEM_VECTOR - FIRST_DEVICE_VECTOR)/i;
-+ res = i * repeat - NR_RESERVED_VECTORS + 1;
-+ }
-+
-+ nr_free_vectors = res + nr_released_vectors - nr_alloc_vectors;
-+
-+ return nr_free_vectors;
-+}
-+
-+int assign_irq_vector(int irq)
-+{
-+ static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
-+
-+ if (irq != MSI_AUTO && IO_APIC_VECTOR(irq) > 0)
-+ return IO_APIC_VECTOR(irq);
-+next:
-+ current_vector += 8;
-+ if (current_vector == SYSCALL_VECTOR)
-+ goto next;
-+
-+ if (current_vector > FIRST_SYSTEM_VECTOR) {
-+ offset++;
-+ current_vector = FIRST_DEVICE_VECTOR + offset;
-+ }
-+
-+ if (current_vector == FIRST_SYSTEM_VECTOR)
-+ return -ENOSPC;
-+
-+ vector_irq[current_vector] = irq;
-+ if (irq != MSI_AUTO)
-+ IO_APIC_VECTOR(irq) = current_vector;
-+
-+ nr_alloc_vectors++;
-+
-+ return current_vector;
-+}
-+
-+static int assign_msi_vector(void)
-+{
-+ static int new_vector_avail = 1;
-+ int vector;
-+ unsigned long flags;
-+
-+ /*
-+ * msi_lock is provided to ensure that successful allocation of MSI
-+ * vector is assigned unique among drivers.
-+ */
-+ spin_lock_irqsave(&msi_lock, flags);
-+ if (!(pci_vector_resources() > 0)) {
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return -EBUSY;
-+ }
-+
-+ if (!new_vector_avail) {
-+ /*
-+ * vector_irq[] = -1 indicates that this specific vector is:
-+ * - assigned for MSI (since MSI have no associated IRQ) or
-+ * - assigned for legacy if less than 16, or
-+ * - having no corresponding 1:1 vector-to-IOxAPIC IRQ mapping
-+ * vector_irq[] = 0 indicates that this vector, previously
-+ * assigned for MSI, is freed by hotplug removed operations.
-+ * This vector will be reused for any subsequent hotplug added
-+ * operations.
-+ * vector_irq[] > 0 indicates that this vector is assigned for
-+ * IOxAPIC IRQs. This vector and its value provides a 1-to-1
-+ * vector-to-IOxAPIC IRQ mapping.
-+ */
-+ for (vector = FIRST_DEVICE_VECTOR; vector < NR_IRQS; vector++) {
-+ if (vector_irq[vector] != 0)
-+ continue;
-+ vector_irq[vector] = -1;
-+ nr_released_vectors--;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return vector;
-+ }
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return -EBUSY;
-+ }
-+
-+ vector = assign_irq_vector(MSI_AUTO);
-+ if (vector == (FIRST_SYSTEM_VECTOR - 8))
-+ new_vector_avail = 0;
-+
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return vector;
-+}
-+
-+static int get_new_vector(void)
-+{
-+ int vector;
-+
-+ if ((vector = assign_msi_vector()) > 0)
-+ set_intr_gate(vector, interrupt[vector]);
-+
-+ return vector;
-+}
-+
-+static int msi_init(void)
-+{
-+ static int status = -ENOMEM;
-+
-+ if (!status)
-+ return status;
-+
-+ if ((status = msi_cache_init()) < 0) {
-+ pci_msi_enable = 0;
-+ printk(KERN_INFO "WARNING: MSI INIT FAILURE\n");
-+ return status;
-+ }
-+ printk(KERN_INFO "MSI INIT SUCCESS\n");
-+
-+ return status;
-+}
-+
-+static int get_msi_vector(struct pci_dev *dev)
-+{
-+ return get_new_vector();
-+}
-+
-+static struct msi_desc* alloc_msi_entry(void)
-+{
-+ struct msi_desc *entry;
-+
-+ entry = (struct msi_desc*) kmem_cache_alloc(msi_cachep, SLAB_KERNEL);
-+ if (!entry)
-+ return NULL;
-+
-+ memset(entry, 0, sizeof(struct msi_desc));
-+ entry->link.tail = entry->link.head = 0; /* single message */
-+ entry->dev = NULL;
-+
-+ return entry;
-+}
-+
-+static void attach_msi_entry(struct msi_desc *entry, int vector)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ msi_desc[vector] = entry;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+}
-+
-+static void irq_handler_init(int cap_id, int pos, int mask)
-+{
-+ spin_lock(&irq_desc[pos].lock);
-+ if (cap_id == PCI_CAP_ID_MSIX)
-+ irq_desc[pos].handler = &msix_irq_type;
-+ else {
-+ if (!mask)
-+ irq_desc[pos].handler = &msi_irq_wo_maskbit_type;
-+ else
-+ irq_desc[pos].handler = &msi_irq_w_maskbit_type;
-+ }
-+ spin_unlock(&irq_desc[pos].lock);
-+}
-+
-+static void enable_msi_mode(struct pci_dev *dev, int pos, int type)
-+{
-+ u32 control;
-+
-+ dev->bus->ops->read(dev->bus, dev->devfn,
-+ msi_control_reg(pos), 2, &control);
-+ if (type == PCI_CAP_ID_MSI) {
-+ /* Set enabled bits to single MSI & enable MSI_enable bit */
-+ msi_enable(control, 1);
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_control_reg(pos), 2, control);
-+ } else {
-+ msix_enable(control);
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_control_reg(pos), 2, control);
-+ }
-+ if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
-+ /* PCI Express Endpoint device detected */
-+ u32 cmd;
-+ dev->bus->ops->read(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
-+ cmd |= PCI_COMMAND_INTX_DISABLE;
-+ dev->bus->ops->write(dev->bus, dev->devfn, PCI_COMMAND, 2, cmd);
-+ }
-+}
-+
-+static void disable_msi_mode(struct pci_dev *dev, int pos, int type)
-+{
-+ u32 control;
-+
-+ dev->bus->ops->read(dev->bus, dev->devfn,
-+ msi_control_reg(pos), 2, &control);
-+ if (type == PCI_CAP_ID_MSI) {
-+ /* Set enabled bits to single MSI & enable MSI_enable bit */
-+ msi_disable(control);
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_control_reg(pos), 2, control);
-+ } else {
-+ msix_disable(control);
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_control_reg(pos), 2, control);
-+ }
-+ if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
-+ /* PCI Express Endpoint device detected */
-+ u32 cmd;
-+ dev->bus->ops->read(dev->bus, dev->devfn, PCI_COMMAND, 2, &cmd);
-+ cmd &= ~PCI_COMMAND_INTX_DISABLE;
-+ dev->bus->ops->write(dev->bus, dev->devfn, PCI_COMMAND, 2, cmd);
-+ }
-+}
-+
-+static int msi_lookup_vector(struct pci_dev *dev)
-+{
-+ int vector;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ for (vector = FIRST_DEVICE_VECTOR; vector < NR_IRQS; vector++) {
-+ if (!msi_desc[vector] || msi_desc[vector]->dev != dev ||
-+ msi_desc[vector]->msi_attrib.entry_nr ||
-+ msi_desc[vector]->msi_attrib.default_vector != dev->irq)
-+ continue; /* not entry 0, skip */
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ /* This pre-assigned entry-0 MSI vector for this device
-+ already exits. Override dev->irq with this vector */
-+ dev->irq = vector;
-+ return 0;
-+ }
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+
-+ return -EACCES;
-+}
-+
-+void pci_scan_msi_device(struct pci_dev *dev)
-+{
-+ if (!dev)
-+ return;
-+
-+ if (pci_find_capability(dev, PCI_CAP_ID_MSIX) > 0) {
-+ nr_reserved_vectors++;
-+ nr_msix_devices++;
-+ } else if (pci_find_capability(dev, PCI_CAP_ID_MSI) > 0)
-+ nr_reserved_vectors++;
-+}
-+
-+/**
-+ * msi_capability_init - configure device's MSI capability structure
-+ * @dev: pointer to the pci_dev data structure of MSI device function
-+ *
-+ * Setup the MSI capability structure of device funtion with a single
-+ * MSI vector, regardless of device function is capable of handling
-+ * multiple messages. A return of zero indicates the successful setup
-+ * of an entry zero with the new MSI vector or non-zero for otherwise.
-+ **/
-+static int msi_capability_init(struct pci_dev *dev)
-+{
-+ struct msi_desc *entry;
-+ struct msg_address address;
-+ struct msg_data data;
-+ int pos, vector;
-+ u32 control;
-+
-+ pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
-+ if (!pos)
-+ return -EINVAL;
-+
-+ dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos),
-+ 2, &control);
-+ if (control & PCI_MSI_FLAGS_ENABLE)
-+ return 0;
-+
-+ if (!msi_lookup_vector(dev)) {
-+ /* Lookup Sucess */
-+ enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
-+ return 0;
-+ }
-+ /* MSI Entry Initialization */
-+ if (!(entry = alloc_msi_entry()))
-+ return -ENOMEM;
-+
-+ if ((vector = get_msi_vector(dev)) < 0) {
-+ kmem_cache_free(msi_cachep, entry);
-+ return -EBUSY;
-+ }
-+ entry->msi_attrib.type = PCI_CAP_ID_MSI;
-+ entry->msi_attrib.entry_nr = 0;
-+ entry->msi_attrib.maskbit = is_mask_bit_support(control);
-+ entry->msi_attrib.default_vector = dev->irq;
-+ dev->irq = vector; /* save default pre-assigned ioapic vector */
-+ entry->dev = dev;
-+ if (is_mask_bit_support(control)) {
-+ entry->mask_base = msi_mask_bits_reg(pos,
-+ is_64bit_address(control));
-+ }
-+ /* Replace with MSI handler */
-+ irq_handler_init(PCI_CAP_ID_MSI, vector, entry->msi_attrib.maskbit);
-+ /* Configure MSI capability structure */
-+ msi_address_init(&address);
-+ msi_data_init(&data, vector);
-+ entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
-+ MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
-+ dev->bus->ops->write(dev->bus, dev->devfn, msi_lower_address_reg(pos),
-+ 4, address.lo_address.value);
-+ if (is_64bit_address(control)) {
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_upper_address_reg(pos), 4, address.hi_address);
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_data_reg(pos, 1), 2, *((u32*)&data));
-+ } else
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_data_reg(pos, 0), 2, *((u32*)&data));
-+ if (entry->msi_attrib.maskbit) {
-+ unsigned int maskbits, temp;
-+ /* All MSIs are unmasked by default, Mask them all */
-+ dev->bus->ops->read(dev->bus, dev->devfn,
-+ msi_mask_bits_reg(pos, is_64bit_address(control)), 4,
-+ &maskbits);
-+ temp = (1 << multi_msi_capable(control));
-+ temp = ((temp - 1) & ~temp);
-+ maskbits |= temp;
-+ dev->bus->ops->write(dev->bus, dev->devfn,
-+ msi_mask_bits_reg(pos, is_64bit_address(control)), 4,
-+ maskbits);
-+ }
-+ attach_msi_entry(entry, vector);
-+ /* Set MSI enabled bits */
-+ enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
-+
-+ return 0;
-+}
-+
-+/**
-+ * msix_capability_init - configure device's MSI-X capability
-+ * @dev: pointer to the pci_dev data structure of MSI-X device function
-+ *
-+ * Setup the MSI-X capability structure of device funtion with a
-+ * single MSI-X vector. A return of zero indicates the successful setup
-+ * of an entry zero with the new MSI-X vector or non-zero for otherwise.
-+ * To request for additional MSI-X vectors, the device drivers are
-+ * required to utilize the following supported APIs:
-+ * 1) msi_alloc_vectors(...) for requesting one or more MSI-X vectors
-+ * 2) msi_free_vectors(...) for releasing one or more MSI-X vectors
-+ * back to PCI subsystem before calling free_irq(...)
-+ **/
-+static int msix_capability_init(struct pci_dev *dev)
-+{
-+ struct msi_desc *entry;
-+ struct msg_address address;
-+ struct msg_data data;
-+ int vector = 0, pos, dev_msi_cap;
-+ u32 phys_addr, table_offset;
-+ u32 control;
-+ u8 bir;
-+ void *base;
-+
-+ pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+ if (!pos)
-+ return -EINVAL;
-+
-+ /* Request & Map MSI-X table region */
-+ dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 2,
-+ &control);
-+ if (control & PCI_MSIX_FLAGS_ENABLE)
-+ return 0;
-+
-+ if (!msi_lookup_vector(dev)) {
-+ /* Lookup Sucess */
-+ enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
-+ return 0;
-+ }
-+
-+ dev_msi_cap = multi_msix_capable(control);
-+ dev->bus->ops->read(dev->bus, dev->devfn,
-+ msix_table_offset_reg(pos), 4, &table_offset);
-+ bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK);
-+ phys_addr = pci_resource_start (dev, bir);
-+ phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK);
-+ if (!request_mem_region(phys_addr,
-+ dev_msi_cap * PCI_MSIX_ENTRY_SIZE,
-+ "MSI-X iomap Failure"))
-+ return -ENOMEM;
-+ base = ioremap_nocache(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
-+ if (base == NULL)
-+ goto free_region;
-+ /* MSI Entry Initialization */
-+ entry = alloc_msi_entry();
-+ if (!entry)
-+ goto free_iomap;
-+ if ((vector = get_msi_vector(dev)) < 0)
-+ goto free_entry;
-+
-+ entry->msi_attrib.type = PCI_CAP_ID_MSIX;
-+ entry->msi_attrib.entry_nr = 0;
-+ entry->msi_attrib.maskbit = 1;
-+ entry->msi_attrib.default_vector = dev->irq;
-+ dev->irq = vector; /* save default pre-assigned ioapic vector */
-+ entry->dev = dev;
-+ entry->mask_base = (unsigned long)base;
-+ /* Replace with MSI handler */
-+ irq_handler_init(PCI_CAP_ID_MSIX, vector, 1);
-+ /* Configure MSI-X capability structure */
-+ msi_address_init(&address);
-+ msi_data_init(&data, vector);
-+ entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
-+ MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
-+ writel(address.lo_address.value, base + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
-+ writel(address.hi_address, base + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
-+ writel(*(u32*)&data, base + PCI_MSIX_ENTRY_DATA_OFFSET);
-+ /* Initialize all entries from 1 up to 0 */
-+ for (pos = 1; pos < dev_msi_cap; pos++) {
-+ writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
-+ PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
-+ writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
-+ PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
-+ writel(0, base + pos * PCI_MSIX_ENTRY_SIZE +
-+ PCI_MSIX_ENTRY_DATA_OFFSET);
-+ }
-+ attach_msi_entry(entry, vector);
-+ /* Set MSI enabled bits */
-+ enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
-+
-+ return 0;
-+
-+free_entry:
-+ kmem_cache_free(msi_cachep, entry);
-+free_iomap:
-+ iounmap(base);
-+free_region:
-+ release_mem_region(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
-+
-+ return ((vector < 0) ? -EBUSY : -ENOMEM);
-+}
-+
-+/**
-+ * pci_enable_msi - configure device's MSI(X) capability structure
-+ * @dev: pointer to the pci_dev data structure of MSI(X) device function
-+ *
-+ * Setup the MSI/MSI-X capability structure of device function with
-+ * a single MSI(X) vector upon its software driver call to request for
-+ * MSI(X) mode enabled on its hardware device function. A return of zero
-+ * indicates the successful setup of an entry zero with the new MSI(X)
-+ * vector or non-zero for otherwise.
-+ **/
-+int pci_enable_msi(struct pci_dev* dev)
-+{
-+ int status = -EINVAL;
-+
-+ if (!pci_msi_enable || !dev)
-+ return status;
-+
-+ if (msi_init() < 0)
-+ return -ENOMEM;
-+
-+ if ((status = msix_capability_init(dev)) == -EINVAL)
-+ status = msi_capability_init(dev);
-+ if (!status)
-+ nr_reserved_vectors--;
-+
-+ return status;
-+}
-+
-+static int msi_free_vector(struct pci_dev* dev, int vector);
-+static void pci_disable_msi(unsigned int vector)
-+{
-+ int head, tail, type, default_vector;
-+ struct msi_desc *entry;
-+ struct pci_dev *dev;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ entry = msi_desc[vector];
-+ if (!entry || !entry->dev) {
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return;
-+ }
-+ dev = entry->dev;
-+ type = entry->msi_attrib.type;
-+ head = entry->link.head;
-+ tail = entry->link.tail;
-+ default_vector = entry->msi_attrib.default_vector;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+
-+ disable_msi_mode(dev, pci_find_capability(dev, type), type);
-+ /* Restore dev->irq to its default pin-assertion vector */
-+ dev->irq = default_vector;
-+ if (type == PCI_CAP_ID_MSIX && head != tail) {
-+ /* Bad driver, which do not call msi_free_vectors before exit.
-+ We must do a cleanup here */
-+ while (1) {
-+ spin_lock_irqsave(&msi_lock, flags);
-+ entry = msi_desc[vector];
-+ head = entry->link.head;
-+ tail = entry->link.tail;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ if (tail == head)
-+ break;
-+ if (msi_free_vector(dev, entry->link.tail))
-+ break;
-+ }
-+ }
-+}
-+
-+static int msi_alloc_vector(struct pci_dev* dev, int head)
-+{
-+ struct msi_desc *entry;
-+ struct msg_address address;
-+ struct msg_data data;
-+ int i, offset, pos, dev_msi_cap, vector;
-+ u32 low_address, control;
-+ unsigned long base = 0L;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ entry = msi_desc[dev->irq];
-+ if (!entry) {
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return -EINVAL;
-+ }
-+ base = entry->mask_base;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+
-+ pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+ dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos),
-+ 2, &control);
-+ dev_msi_cap = multi_msix_capable(control);
-+ for (i = 1; i < dev_msi_cap; i++) {
-+ if (!(low_address = readl(base + i * PCI_MSIX_ENTRY_SIZE)))
-+ break;
-+ }
-+ if (i >= dev_msi_cap)
-+ return -EINVAL;
-+
-+ /* MSI Entry Initialization */
-+ if (!(entry = alloc_msi_entry()))
-+ return -ENOMEM;
-+
-+ if ((vector = get_new_vector()) < 0) {
-+ kmem_cache_free(msi_cachep, entry);
-+ return vector;
-+ }
-+ entry->msi_attrib.type = PCI_CAP_ID_MSIX;
-+ entry->msi_attrib.entry_nr = i;
-+ entry->msi_attrib.maskbit = 1;
-+ entry->dev = dev;
-+ entry->link.head = head;
-+ entry->mask_base = base;
-+ irq_handler_init(PCI_CAP_ID_MSIX, vector, 1);
-+ /* Configure MSI-X capability structure */
-+ msi_address_init(&address);
-+ msi_data_init(&data, vector);
-+ entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >>
-+ MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK);
-+ offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
-+ writel(address.lo_address.value, base + offset +
-+ PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
-+ writel(address.hi_address, base + offset +
-+ PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
-+ writel(*(u32*)&data, base + offset + PCI_MSIX_ENTRY_DATA_OFFSET);
-+ writel(1, base + offset + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
-+ attach_msi_entry(entry, vector);
-+
-+ return vector;
-+}
-+
-+static int msi_free_vector(struct pci_dev* dev, int vector)
-+{
-+ struct msi_desc *entry;
-+ int entry_nr, type;
-+ unsigned long base = 0L;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ entry = msi_desc[vector];
-+ if (!entry || entry->dev != dev) {
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return -EINVAL;
-+ }
-+ type = entry->msi_attrib.type;
-+ entry_nr = entry->msi_attrib.entry_nr;
-+ base = entry->mask_base;
-+ if (entry->link.tail != entry->link.head) {
-+ msi_desc[entry->link.head]->link.tail = entry->link.tail;
-+ if (entry->link.tail)
-+ msi_desc[entry->link.tail]->link.head = entry->link.head;
-+ }
-+ entry->dev = NULL;
-+ vector_irq[vector] = 0;
-+ nr_released_vectors++;
-+ msi_desc[vector] = NULL;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+
-+ kmem_cache_free(msi_cachep, entry);
-+ if (type == PCI_CAP_ID_MSIX) {
-+ int offset;
-+
-+ offset = entry_nr * PCI_MSIX_ENTRY_SIZE;
-+ writel(1, base + offset + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
-+ writel(0, base + offset + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
-+ }
-+
-+ return 0;
-+}
-+
-+/**
-+ * msi_alloc_vectors - allocate additional MSI-X vectors
-+ * @dev: pointer to the pci_dev data structure of MSI-X device function
-+ * @vector: pointer to an array of new allocated MSI-X vectors
-+ * @nvec: number of MSI-X vectors requested for allocation by device driver
-+ *
-+ * Allocate additional MSI-X vectors requested by device driver. A
-+ * return of zero indicates the successful setup of MSI-X capability
-+ * structure with new allocated MSI-X vectors or non-zero for otherwise.
-+ **/
-+int msi_alloc_vectors(struct pci_dev* dev, int *vector, int nvec)
-+{
-+ struct msi_desc *entry;
-+ int i, head, pos, vec, free_vectors, alloc_vectors;
-+ int *vectors = (int *)vector;
-+ u32 control;
-+ unsigned long flags;
-+
-+ if (!pci_msi_enable || !dev)
-+ return -EINVAL;
-+
-+ if (!(pos = pci_find_capability(dev, PCI_CAP_ID_MSIX)))
-+ return -EINVAL;
-+
-+ dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 2, &control);
-+ if (nvec > multi_msix_capable(control))
-+ return -EINVAL;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ entry = msi_desc[dev->irq];
-+ if (!entry || entry->dev != dev || /* legal call */
-+ entry->msi_attrib.type != PCI_CAP_ID_MSIX || /* must be MSI-X */
-+ entry->link.head != entry->link.tail) { /* already multi */
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return -EINVAL;
-+ }
-+ /*
-+ * msi_lock is provided to ensure that enough vectors resources are
-+ * available before granting.
-+ */
-+ free_vectors = pci_vector_resources();
-+ /* Ensure that each MSI/MSI-X device has one vector reserved by
-+ default to avoid any MSI-X driver to take all available
-+ resources */
-+ free_vectors -= nr_reserved_vectors;
-+ /* Find the average of free vectors among MSI-X devices */
-+ if (nr_msix_devices > 0)
-+ free_vectors /= nr_msix_devices;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+
-+ if (nvec > free_vectors)
-+ return -EBUSY;
-+
-+ alloc_vectors = 0;
-+ head = dev->irq;
-+ for (i = 0; i < nvec; i++) {
-+ if ((vec = msi_alloc_vector(dev, head)) < 0)
-+ break;
-+ *(vectors + i) = vec;
-+ head = vec;
-+ alloc_vectors++;
-+ }
-+ if (alloc_vectors != nvec) {
-+ for (i = 0; i < alloc_vectors; i++) {
-+ vec = *(vectors + i);
-+ msi_free_vector(dev, vec);
-+ }
-+ spin_lock_irqsave(&msi_lock, flags);
-+ msi_desc[dev->irq]->link.tail = msi_desc[dev->irq]->link.head;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return -EBUSY;
-+ }
-+ if (nr_msix_devices > 0)
-+ nr_msix_devices--;
-+
-+ return 0;
-+}
-+
-+/**
-+ * msi_free_vectors - reclaim MSI-X vectors to unused state
-+ * @dev: pointer to the pci_dev data structure of MSI-X device function
-+ * @vector: pointer to an array of released MSI-X vectors
-+ * @nvec: number of MSI-X vectors requested for release by device driver
-+ *
-+ * Reclaim MSI-X vectors released by device driver to unused state,
-+ * which may be used later on. A return of zero indicates the
-+ * success or non-zero for otherwise. Device driver should call this
-+ * before calling function free_irq.
-+ **/
-+int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec)
-+{
-+ struct msi_desc *entry;
-+ int i;
-+ unsigned long flags;
-+
-+ if (!pci_msi_enable)
-+ return -EINVAL;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ entry = msi_desc[dev->irq];
-+ if (!entry || entry->dev != dev ||
-+ entry->msi_attrib.type != PCI_CAP_ID_MSIX ||
-+ entry->link.head == entry->link.tail) { /* Nothing to free */
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return -EINVAL;
-+ }
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+
-+ for (i = 0; i < nvec; i++) {
-+ if (*(vector + i) == dev->irq)
-+ continue;/* Don't free entry 0 if mistaken by driver */
-+ msi_free_vector(dev, *(vector + i));
-+ }
-+
-+ return 0;
-+}
-+
-+/**
-+ * msi_remove_pci_irq_vectors - reclaim MSI(X) vectors to unused state
-+ * @dev: pointer to the pci_dev data structure of MSI(X) device function
-+ *
-+ * Being called during hotplug remove, from which the device funciton
-+ * is hot-removed. All previous assigned MSI/MSI-X vectors, if
-+ * allocated for this device function, are reclaimed to unused state,
-+ * which may be used later on.
-+ **/
-+void msi_remove_pci_irq_vectors(struct pci_dev* dev)
-+{
-+ struct msi_desc *entry;
-+ int type, temp;
-+ unsigned long flags;
-+
-+ if (!pci_msi_enable || !dev)
-+ return;
-+
-+ if (!pci_find_capability(dev, PCI_CAP_ID_MSI)) {
-+ if (!pci_find_capability(dev, PCI_CAP_ID_MSIX))
-+ return;
-+ }
-+ temp = dev->irq;
-+ if (msi_lookup_vector(dev))
-+ return;
-+
-+ spin_lock_irqsave(&msi_lock, flags);
-+ entry = msi_desc[dev->irq];
-+ if (!entry || entry->dev != dev) {
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ return;
-+ }
-+ type = entry->msi_attrib.type;
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+
-+ msi_free_vector(dev, dev->irq);
-+ if (type == PCI_CAP_ID_MSIX) {
-+ int i, pos, dev_msi_cap;
-+ u32 phys_addr, table_offset;
-+ u32 control;
-+ u8 bir;
-+
-+ pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+ dev->bus->ops->read(dev->bus, dev->devfn, msi_control_reg(pos), 2, &control);
-+ dev_msi_cap = multi_msix_capable(control);
-+ dev->bus->ops->read(dev->bus, dev->devfn,
-+ msix_table_offset_reg(pos), 4, &table_offset);
-+ bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK);
-+ phys_addr = pci_resource_start (dev, bir);
-+ phys_addr += (u32)(table_offset & ~PCI_MSIX_FLAGS_BIRMASK);
-+ for (i = FIRST_DEVICE_VECTOR; i < NR_IRQS; i++) {
-+ spin_lock_irqsave(&msi_lock, flags);
-+ if (!msi_desc[i] || msi_desc[i]->dev != dev) {
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ continue;
-+ }
-+ spin_unlock_irqrestore(&msi_lock, flags);
-+ msi_free_vector(dev, i);
-+ }
-+ writel(1, entry->mask_base + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
-+ iounmap((void*)entry->mask_base);
-+ release_mem_region(phys_addr, dev_msi_cap * PCI_MSIX_ENTRY_SIZE);
-+ }
-+ dev->irq = temp;
-+ nr_reserved_vectors++;
-+}
-+
-+EXPORT_SYMBOL(pci_enable_msi);
-+EXPORT_SYMBOL(msi_alloc_vectors);
-+EXPORT_SYMBOL(msi_free_vectors);
---- linux-2.6.0/drivers/pci/pci.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/pci/pci.c 2003-12-28 23:21:47.000000000 -0800
-@@ -223,6 +223,8 @@ pci_set_power_state(struct pci_dev *dev,
- int pm;
- u16 pmcsr;
-
-+ might_sleep();
-+
- /* bound the state we're entering */
- if (state > 3) state = 3;
-
---- linux-2.6.0/drivers/pci/pci.ids 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/pci/pci.ids 2003-12-28 23:21:01.000000000 -0800
-@@ -3247,8 +3247,6 @@
- 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
- 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
- 1148 9521 SK-9521 10/100/1000Base-T Adapter
-- 4400 SK-9Dxx Gigabit Ethernet Adapter
-- 4500 SK-9Mxx Gigabit Ethernet Adapter
- 1149 Win System Corporation
- 114a VMIC
- 5579 VMIPCI-5579 (Reflective Memory Card)
-@@ -3540,7 +3538,22 @@
- 11ab Galileo Technology Ltd.
- 0146 GT-64010/64010A System Controller
- 4320 Gigabit Ethernet Adapter
-- 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter
-+ 1019 0f38 Marvell 88E8001 Gigabit LOM Ethernet Adapter (ECS)
-+ 1019 8001 Marvell 88E8001 Gigabit LOM Ethernet Adapter (ECS)
-+ 1043 173c Marvell 88E8001 Gigabit LOM Ethernet Adapter (Asus)
-+ 1043 811a Marvell 88E8001 Gigabit LOM Ethernet Adapter (Asus)
-+ 105b 0c19 Marvell 88E8001 Gigabit LOM Ethernet Adapter (Foxconn)
-+ 10b8 b452 SMC EZ Card 1000 (SMC9452TXV.2)
-+ 11ab 0121 Marvell RDK-8001 Adapter
-+ 11ab 0321 Marvell RDK-8003 Adapter
-+ 11ab 1021 Marvell RDK-8010 Adapter
-+ 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (64 bit)
-+ 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (32 bit)
-+ 1458 e000 Marvell 88E8001 Gigabit LOM Ethernet Adapter (Gigabyte)
-+ 147b 1406 Marvell 88E8001 Gigabit LOM Ethernet Adapter (Abit)
-+ 15d4 0047 Marvell 88E8001 Gigabit LOM Ethernet Adapter (Iwill)
-+ 1695 9025 Marvell 88E8001 Gigabit LOM Ethernet Adapter (Epox)
-+ 17f2 1c03 Marvell 88E8001 Gigabit LOM Ethernet Adapter (Albatron)
- 4611 GT-64115 System Controller
- 4620 GT-64120/64120A/64121A System Controller
- 4801 GT-48001
-@@ -3803,8 +3816,6 @@
- 0802 Rocketport UPCI 8 port w/external I/F
- 0803 Rocketport UPCI 16 port w/external I/F
- 0805 Rocketport UPCI 8 port w/octa cable
-- 080C RocketModem III 8 port
-- 080D RocketModem III 4 port
- 0903 Rocketport Compact PCI 16 port w/external I/F
- 11ff Scion Corporation
- 1200 CSS Corporation
-@@ -5312,11 +5323,13 @@
- 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X
- 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X
- 1166 1648 NetXtreme CIOB-E 1000Base-T
-+ 1649 NetXtreme BCM5704S Gigabit Ethernet
- 164d NetXtreme BCM5702FE Gigabit Ethernet
- 1653 NetXtreme BCM5705 Gigabit Ethernet
- 1654 NetXtreme BCM5705 Gigabit Ethernet
- 165d NetXtreme BCM5705M Gigabit Ethernet
- 165e NetXtreme BCM5705M Gigabit Ethernet
-+ 166e NetXtreme BCM5705F Gigabit Ethernet
- 1696 NetXtreme BCM5782 Gigabit Ethernet
- 14e4 000d NetXtreme BCM5782 1000Base-T
- 169c NetXtreme BCM5788 Gigabit Ethernet
---- linux-2.6.0/drivers/pci/probe.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/pci/probe.c 2003-12-28 23:21:44.000000000 -0800
-@@ -176,7 +176,7 @@ void __devinit pci_read_bridge_bases(str
- limit |= (io_limit_hi << 16);
- }
-
-- if (base && base <= limit) {
-+ if (base <= limit) {
- res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO;
- res->start = base;
- res->end = limit + 0xfff;
-@@ -187,7 +187,7 @@ void __devinit pci_read_bridge_bases(str
- pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo);
- base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16;
- limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16;
-- if (base && base <= limit) {
-+ if (base <= limit) {
- res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
- res->start = base;
- res->end = limit + 0xfffff;
-@@ -213,7 +213,7 @@ void __devinit pci_read_bridge_bases(str
- }
- #endif
- }
-- if (base && base <= limit) {
-+ if (base <= limit) {
- res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
- res->start = base;
- res->end = limit + 0xfffff;
-@@ -552,6 +552,7 @@ int __devinit pci_scan_slot(struct pci_b
- struct pci_dev *dev;
-
- dev = pci_scan_device(bus, devfn);
-+ pci_scan_msi_device(dev);
- if (func == 0) {
- if (!dev)
- break;
---- linux-2.6.0/drivers/pci/proc.c 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/pci/proc.c 2003-12-28 23:22:13.000000000 -0800
-@@ -25,7 +25,7 @@ proc_bus_pci_lseek(struct file *file, lo
- {
- loff_t new = -1;
-
-- lock_kernel();
-+ down(&file->f_dentry->d_inode->i_sem);
- switch (whence) {
- case 0:
- new = off;
-@@ -37,10 +37,12 @@ proc_bus_pci_lseek(struct file *file, lo
- new = PCI_CFG_SPACE_SIZE + off;
- break;
- }
-- unlock_kernel();
- if (new < 0 || new > PCI_CFG_SPACE_SIZE)
-- return -EINVAL;
-- return (file->f_pos = new);
-+ new = -EINVAL;
-+ else
-+ file->f_pos = new;
-+ up(&file->f_dentry->d_inode->i_sem);
-+ return new;
- }
-
- static ssize_t
---- linux-2.6.0/drivers/pci/remove.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/pci/remove.c 2003-12-28 23:21:44.000000000 -0800
-@@ -14,6 +14,8 @@ static void pci_free_resources(struct pc
- {
- int i;
-
-+ msi_remove_pci_irq_vectors(dev);
-+
- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *res = dev->resource + i;
- if (res->parent)
---- linux-2.6.0/drivers/pci/setup-res.c 2003-11-23 19:03:00.000000000 -0800
-+++ 25/drivers/pci/setup-res.c 2003-12-28 23:23:02.000000000 -0800
-@@ -84,6 +84,10 @@ pci_update_resource(struct pci_dev *dev,
- pci_name(dev), resno, new, check);
- }
- }
-+ res->flags &= ~IORESOURCE_UNSET;
-+ DBGC((KERN_INFO "PCI: moved device %s resource %d (%lx) to %x\n",
-+ dev->slot_name, resno, res->flags,
-+ new & ~PCI_REGION_FLAG_MASK));
- }
-
- int __init
---- linux-2.6.0/drivers/pcmcia/cistpl.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/pcmcia/cistpl.c 2003-12-28 23:22:48.000000000 -0800
-@@ -341,8 +341,11 @@ void destroy_cis_cache(struct pcmcia_soc
- int verify_cis_cache(struct pcmcia_socket *s)
- {
- struct cis_cache_entry *cis;
-- char buf[256];
-+ char *buf;
-
-+ buf = kmalloc(256, GFP_KERNEL);
-+ if (buf == NULL)
-+ return -1;
- list_for_each_entry(cis, &s->cis_cache, node) {
- int len = cis->len;
-
-@@ -355,9 +358,12 @@ int verify_cis_cache(struct pcmcia_socke
- #endif
- read_cis_mem(s, cis->attr, cis->addr, len, buf);
-
-- if (memcmp(buf, cis->cache, len) != 0)
-+ if (memcmp(buf, cis->cache, len) != 0) {
-+ kfree(buf);
- return -1;
-+ }
- }
-+ kfree(buf);
- return 0;
- }
-
-@@ -1404,19 +1410,24 @@ int pcmcia_parse_tuple(client_handle_t h
- int read_tuple(client_handle_t handle, cisdata_t code, void *parse)
- {
- tuple_t tuple;
-- cisdata_t buf[255];
-+ cisdata_t *buf;
- int ret;
--
-+
-+ buf = kmalloc(256, GFP_KERNEL);
-+ if (buf == NULL)
-+ return CS_OUT_OF_RESOURCE;
- tuple.DesiredTuple = code;
- tuple.Attributes = TUPLE_RETURN_COMMON;
- ret = pcmcia_get_first_tuple(handle, &tuple);
-- if (ret != CS_SUCCESS) return ret;
-+ if (ret != CS_SUCCESS) goto done;
- tuple.TupleData = buf;
- tuple.TupleOffset = 0;
-- tuple.TupleDataMax = sizeof(buf);
-+ tuple.TupleDataMax = 255;
- ret = pcmcia_get_tuple_data(handle, &tuple);
-- if (ret != CS_SUCCESS) return ret;
-+ if (ret != CS_SUCCESS) goto done;
- ret = pcmcia_parse_tuple(handle, &tuple, parse);
-+done:
-+ kfree(buf);
- return ret;
- }
-
-@@ -1432,50 +1443,61 @@ int read_tuple(client_handle_t handle, c
-
- int pcmcia_validate_cis(client_handle_t handle, cisinfo_t *info)
- {
-- tuple_t tuple;
-- cisparse_t p;
-+ tuple_t *tuple;
-+ cisparse_t *p;
- int ret, reserved, dev_ok = 0, ident_ok = 0;
-
- if (CHECK_HANDLE(handle))
- return CS_BAD_HANDLE;
-+ tuple = kmalloc(sizeof(*tuple), GFP_KERNEL);
-+ if (tuple == NULL)
-+ return CS_OUT_OF_RESOURCE;
-+ p = kmalloc(sizeof(*p), GFP_KERNEL);
-+ if (p == NULL) {
-+ kfree(tuple);
-+ return CS_OUT_OF_RESOURCE;
-+ }
-
- info->Chains = reserved = 0;
-- tuple.DesiredTuple = RETURN_FIRST_TUPLE;
-- tuple.Attributes = TUPLE_RETURN_COMMON;
-- ret = pcmcia_get_first_tuple(handle, &tuple);
-+ tuple->DesiredTuple = RETURN_FIRST_TUPLE;
-+ tuple->Attributes = TUPLE_RETURN_COMMON;
-+ ret = pcmcia_get_first_tuple(handle, tuple);
- if (ret != CS_SUCCESS)
-- return CS_SUCCESS;
-+ goto done;
-
- /* First tuple should be DEVICE; we should really have either that
- or a CFTABLE_ENTRY of some sort */
-- if ((tuple.TupleCode == CISTPL_DEVICE) ||
-- (read_tuple(handle, CISTPL_CFTABLE_ENTRY, &p) == CS_SUCCESS) ||
-- (read_tuple(handle, CISTPL_CFTABLE_ENTRY_CB, &p) == CS_SUCCESS))
-+ if ((tuple->TupleCode == CISTPL_DEVICE) ||
-+ (read_tuple(handle, CISTPL_CFTABLE_ENTRY, p) == CS_SUCCESS) ||
-+ (read_tuple(handle, CISTPL_CFTABLE_ENTRY_CB, p) == CS_SUCCESS))
- dev_ok++;
-
- /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2
- tuple, for card identification. Certain old D-Link and Linksys
- cards have only a broken VERS_2 tuple; hence the bogus test. */
-- if ((read_tuple(handle, CISTPL_MANFID, &p) == CS_SUCCESS) ||
-- (read_tuple(handle, CISTPL_VERS_1, &p) == CS_SUCCESS) ||
-- (read_tuple(handle, CISTPL_VERS_2, &p) != CS_NO_MORE_ITEMS))
-+ if ((read_tuple(handle, CISTPL_MANFID, p) == CS_SUCCESS) ||
-+ (read_tuple(handle, CISTPL_VERS_1, p) == CS_SUCCESS) ||
-+ (read_tuple(handle, CISTPL_VERS_2, p) != CS_NO_MORE_ITEMS))
- ident_ok++;
-
- if (!dev_ok && !ident_ok)
-- return CS_SUCCESS;
-+ goto done;
-
- for (info->Chains = 1; info->Chains < MAX_TUPLES; info->Chains++) {
-- ret = pcmcia_get_next_tuple(handle, &tuple);
-+ ret = pcmcia_get_next_tuple(handle, tuple);
- if (ret != CS_SUCCESS) break;
-- if (((tuple.TupleCode > 0x23) && (tuple.TupleCode < 0x40)) ||
-- ((tuple.TupleCode > 0x47) && (tuple.TupleCode < 0x80)) ||
-- ((tuple.TupleCode > 0x90) && (tuple.TupleCode < 0xff)))
-+ if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) ||
-+ ((tuple->TupleCode > 0x47) && (tuple->TupleCode < 0x80)) ||
-+ ((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
- reserved++;
- }
- if ((info->Chains == MAX_TUPLES) || (reserved > 5) ||
- ((!dev_ok || !ident_ok) && (info->Chains > 10)))
- info->Chains = 0;
-
-+done:
-+ kfree(tuple);
-+ kfree(p);
- return CS_SUCCESS;
- }
-
---- linux-2.6.0/drivers/pcmcia/cs.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/pcmcia/cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -1916,7 +1916,7 @@ int pcmcia_request_irq(client_handle_t h
- {
- struct pcmcia_socket *s;
- config_t *c;
-- int ret = 0, irq = 0;
-+ int ret = CS_IN_USE, irq = 0;
-
- if (CHECK_HANDLE(handle))
- return CS_BAD_HANDLE;
-@@ -1928,13 +1928,9 @@ int pcmcia_request_irq(client_handle_t h
- return CS_CONFIGURATION_LOCKED;
- if (c->state & CONFIG_IRQ_REQ)
- return CS_IN_USE;
--
-- /* Short cut: if there are no ISA interrupts, then it is PCI */
-- if (!s->irq_mask) {
-- irq = s->pci_irq;
-- ret = (irq) ? 0 : CS_IN_USE;
-+
- #ifdef CONFIG_PCMCIA_PROBE
-- } else if (s->irq.AssignedIRQ != 0) {
-+ if (s->irq.AssignedIRQ != 0) {
- /* If the interrupt is already assigned, it must match */
- irq = s->irq.AssignedIRQ;
- if (req->IRQInfo1 & IRQ_INFO2_VALID) {
-@@ -1943,7 +1939,6 @@ int pcmcia_request_irq(client_handle_t h
- } else
- ret = ((req->IRQInfo1&IRQ_MASK) == irq) ? 0 : CS_BAD_ARGS;
- } else {
-- ret = CS_IN_USE;
- if (req->IRQInfo1 & IRQ_INFO2_VALID) {
- u_int try, mask = req->IRQInfo2 & s->irq_mask;
- for (try = 0; try < 2; try++) {
-@@ -1958,12 +1953,13 @@ int pcmcia_request_irq(client_handle_t h
- irq = req->IRQInfo1 & IRQ_MASK;
- ret = try_irq(req->Attributes, irq, 1);
- }
--#else
-- } else {
-- ret = CS_UNSUPPORTED_MODE;
-+ }
- #endif
-+ if (ret != 0) {
-+ if (!s->pci_irq)
-+ return ret;
-+ irq = s->pci_irq;
- }
-- if (ret != 0) return ret;
-
- if (req->Attributes & IRQ_HANDLE_PRESENT) {
- if (request_irq(irq, req->Handler,
-@@ -2293,149 +2289,6 @@ int pcmcia_report_error(client_handle_t
- return CS_SUCCESS;
- } /* report_error */
-
--/*====================================================================*/
--
--int CardServices(int func, void *a1, void *a2, void *a3)
--{
--
--#ifdef PCMCIA_DEBUG
-- if (pc_debug > 2) {
-- int i;
-- for (i = 0; i < SERVICE_COUNT; i++)
-- if (service_table[i].key == func) break;
-- if (i < SERVICE_COUNT)
-- printk(KERN_DEBUG "cs: CardServices(%s, 0x%p, 0x%p)\n",
-- service_table[i].msg, a1, a2);
-- else
-- printk(KERN_DEBUG "cs: CardServices(Unknown func %d, "
-- "0x%p, 0x%p)\n", func, a1, a2);
-- }
--#endif
-- switch (func) {
-- case AccessConfigurationRegister:
-- return pcmcia_access_configuration_register(a1, a2); break;
-- case AdjustResourceInfo:
-- return pcmcia_adjust_resource_info(a1, a2); break;
-- case CheckEraseQueue:
-- return pcmcia_check_erase_queue(a1); break;
-- case CloseMemory:
-- return pcmcia_close_memory(a1); break;
-- case CopyMemory:
-- return pcmcia_copy_memory(a1, a2); break;
-- case DeregisterClient:
-- return pcmcia_deregister_client(a1); break;
-- case DeregisterEraseQueue:
-- return pcmcia_deregister_erase_queue(a1); break;
-- case GetFirstClient:
-- return pcmcia_get_first_client(a1, a2); break;
-- case GetCardServicesInfo:
-- return pcmcia_get_card_services_info(a1); break;
-- case GetConfigurationInfo:
-- return pcmcia_get_configuration_info(a1, a2); break;
-- case GetNextClient:
-- return pcmcia_get_next_client(a1, a2); break;
-- case GetFirstRegion:
-- return pcmcia_get_first_region(a1, a2); break;
-- case GetFirstTuple:
-- return pcmcia_get_first_tuple(a1, a2); break;
-- case GetNextRegion:
-- return pcmcia_get_next_region(a1, a2); break;
-- case GetNextTuple:
-- return pcmcia_get_next_tuple(a1, a2); break;
-- case GetStatus:
-- return pcmcia_get_status(a1, a2); break;
-- case GetTupleData:
-- return pcmcia_get_tuple_data(a1, a2); break;
-- case MapMemPage:
-- return pcmcia_map_mem_page(a1, a2); break;
-- case ModifyConfiguration:
-- return pcmcia_modify_configuration(a1, a2); break;
-- case ModifyWindow:
-- return pcmcia_modify_window(a1, a2); break;
-- case OpenMemory:
--/* return pcmcia_open_memory(a1, a2); */
-- {
-- memory_handle_t m;
-- int ret = pcmcia_open_memory(a1, a2, &m);
-- *(memory_handle_t *)a1 = m;
-- return ret;
-- }
-- break;
-- case ParseTuple:
-- return pcmcia_parse_tuple(a1, a2, a3); break;
-- case ReadMemory:
-- return pcmcia_read_memory(a1, a2, a3); break;
-- case RegisterClient:
-- return pcmcia_register_client(a1, a2); break;
-- case RegisterEraseQueue:
-- {
-- eraseq_handle_t w;
-- int ret = pcmcia_register_erase_queue(a1, a2, &w);
-- *(eraseq_handle_t *)a1 = w;
-- return ret;
-- }
-- break;
--/* return pcmcia_register_erase_queue(a1, a2); break; */
--
-- return pcmcia_register_mtd(a1, a2); break;
-- case ReleaseConfiguration:
-- return pcmcia_release_configuration(a1); break;
-- case ReleaseIO:
-- return pcmcia_release_io(a1, a2); break;
-- case ReleaseIRQ:
-- return pcmcia_release_irq(a1, a2); break;
-- case ReleaseWindow:
-- return pcmcia_release_window(a1); break;
-- case RequestConfiguration:
-- return pcmcia_request_configuration(a1, a2); break;
-- case RequestIO:
-- return pcmcia_request_io(a1, a2); break;
-- case RequestIRQ:
-- return pcmcia_request_irq(a1, a2); break;
-- case RequestWindow:
-- {
-- window_handle_t w;
-- int ret = pcmcia_request_window(a1, a2, &w);
-- *(window_handle_t *)a1 = w;
-- return ret;
-- }
-- break;
-- case ResetCard:
-- return pcmcia_reset_card(a1, a2); break;
-- case SetEventMask:
-- return pcmcia_set_event_mask(a1, a2); break;
-- case ValidateCIS:
-- return pcmcia_validate_cis(a1, a2); break;
-- case WriteMemory:
-- return pcmcia_write_memory(a1, a2, a3); break;
-- case BindDevice:
-- return pcmcia_bind_device(a1); break;
-- case BindMTD:
-- return pcmcia_bind_mtd(a1); break;
-- case ReportError:
-- return pcmcia_report_error(a1, a2); break;
-- case SuspendCard:
-- return pcmcia_suspend_card(a1, a2); break;
-- case ResumeCard:
-- return pcmcia_resume_card(a1, a2); break;
-- case EjectCard:
-- return pcmcia_eject_card(a1, a2); break;
-- case InsertCard:
-- return pcmcia_insert_card(a1, a2); break;
-- case ReplaceCIS:
-- return pcmcia_replace_cis(a1, a2); break;
-- case GetFirstWindow:
-- return pcmcia_get_first_window(a1, a2); break;
-- case GetNextWindow:
-- return pcmcia_get_next_window(a1, a2); break;
-- case GetMemPage:
-- return pcmcia_get_mem_page(a1, a2); break;
-- default:
-- return CS_UNSUPPORTED_FUNCTION; break;
-- }
--
--} /* CardServices */
--
- /*======================================================================
-
- OS-specific module glue goes here
-@@ -2493,7 +2346,6 @@ EXPORT_SYMBOL(pcmcia_validate_cis);
- EXPORT_SYMBOL(pcmcia_write_memory);
-
- EXPORT_SYMBOL(dead_socket);
--EXPORT_SYMBOL(CardServices);
- EXPORT_SYMBOL(MTDHelperEntry);
- EXPORT_SYMBOL(pcmcia_parse_events);
-
---- linux-2.6.0/drivers/pcmcia/i82365.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/pcmcia/i82365.c 2003-12-28 23:22:48.000000000 -0800
-@@ -42,7 +42,6 @@
- #include <linux/timer.h>
- #include <linux/sched.h>
- #include <linux/slab.h>
--#include <linux/pci.h>
- #include <linux/ioport.h>
- #include <linux/delay.h>
- #include <linux/workqueue.h>
-@@ -188,10 +187,6 @@ static struct timer_list poll_timer;
-
- /*====================================================================*/
-
--/* Default settings for PCI command configuration register */
--#define CMD_DFLT (PCI_COMMAND_IO|PCI_COMMAND_MEMORY| \
-- PCI_COMMAND_MASTER|PCI_COMMAND_WAIT)
--
- /* These definitions must match the pcic table! */
- typedef enum pcic_id {
- IS_I82365A, IS_I82365B, IS_I82365DF,
-@@ -202,15 +197,10 @@ typedef enum pcic_id {
- /* Flags for classifying groups of controllers */
- #define IS_VADEM 0x0001
- #define IS_CIRRUS 0x0002
--#define IS_TI 0x0004
--#define IS_O2MICRO 0x0008
- #define IS_VIA 0x0010
--#define IS_TOPIC 0x0020
--#define IS_RICOH 0x0040
- #define IS_UNKNOWN 0x0400
- #define IS_VG_PWR 0x0800
- #define IS_DF_PWR 0x1000
--#define IS_PCI 0x2000
- #define IS_ALIVE 0x8000
-
- typedef struct pcic_t {
-@@ -351,26 +341,24 @@ static u_int __init cirrus_set_opts(u_sh
- if (has_ring == -1) has_ring = 1;
- flip(p->misc2, PD67_MC2_IRQ15_RI, has_ring);
- flip(p->misc2, PD67_MC2_DYNAMIC_MODE, dynamic_mode);
-+ flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
- if (p->misc2 & PD67_MC2_IRQ15_RI)
- strcat(buf, " [ring]");
- if (p->misc2 & PD67_MC2_DYNAMIC_MODE)
- strcat(buf, " [dyn mode]");
-+ if (p->misc2 & PD67_MC2_FREQ_BYPASS)
-+ strcat(buf, " [freq bypass]");
- if (p->misc1 & PD67_MC1_INPACK_ENA)
- strcat(buf, " [inpack]");
-- if (!(t->flags & IS_PCI)) {
-- if (p->misc2 & PD67_MC2_IRQ15_RI)
-- mask &= ~0x8000;
-- if (has_led > 0) {
-- strcat(buf, " [led]");
-- mask &= ~0x1000;
-- }
-- if (has_dma > 0) {
-- strcat(buf, " [dma]");
-- mask &= ~0x0600;
-- flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass);
-- if (p->misc2 & PD67_MC2_FREQ_BYPASS)
-- strcat(buf, " [freq bypass]");
-- }
-+ if (p->misc2 & PD67_MC2_IRQ15_RI)
-+ mask &= ~0x8000;
-+ if (has_led > 0) {
-+ strcat(buf, " [led]");
-+ mask &= ~0x1000;
-+ }
-+ if (has_dma > 0) {
-+ strcat(buf, " [dma]");
-+ mask &= ~0x0600;
- }
- if (!(t->flags & IS_VIA)) {
- if (setup_time >= 0)
-@@ -540,7 +528,6 @@ static u_int __init test_irq(u_short soc
- return (irq_hits != 1);
- }
-
--
- static u_int __init isa_scan(u_short sock, u_int mask0)
- {
- u_int mask1 = 0;
-@@ -585,7 +572,6 @@ static u_int __init isa_scan(u_short soc
- return mask1;
- }
-
--
- /*====================================================================*/
-
- /* Time conversion functions */
-@@ -597,7 +583,6 @@ static int to_cycles(int ns)
-
- /*====================================================================*/
-
--
- static int __init identify(u_short port, u_short sock)
- {
- u_char val;
-@@ -700,7 +685,7 @@ static void __init add_socket(u_short po
- static void __init add_pcic(int ns, int type)
- {
- u_int mask = 0, i, base;
-- int use_pci = 0, isa_irq = 0;
-+ int isa_irq = 0;
- struct i82365_socket *t = &socket[sockets-ns];
-
- base = sockets-ns;
-@@ -721,17 +706,16 @@ static void __init add_pcic(int ns, int
- mask &= I365_MASK & set_bridge_opts(base, ns);
- /* Scan for ISA interrupts */
- mask = isa_scan(base, mask);
-- printk(KERN_INFO " PCI card interrupts,");
-
- /* Poll if only two interrupts available */
-- if (!use_pci && !poll_interval) {
-+ if (!poll_interval) {
- u_int tmp = (mask & 0xff20);
- tmp = tmp & (tmp-1);
- if ((tmp & (tmp-1)) == 0)
- poll_interval = HZ;
- }
- /* Only try an ISA cs_irq if this is the first controller */
-- if (!use_pci && !grab_irq && (cs_irq || !poll_interval)) {
-+ if (!grab_irq && (cs_irq || !poll_interval)) {
- /* Avoid irq 12 unless it is explicitly requested */
- u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
- for (cs_irq = 15; cs_irq > 0; cs_irq--)
-@@ -745,7 +729,7 @@ static void __init add_pcic(int ns, int
- }
- }
-
-- if (!use_pci && !isa_irq) {
-+ if (!isa_irq) {
- if (poll_interval == 0)
- poll_interval = HZ;
- printk(" polling interval = %d ms\n",
-@@ -763,10 +747,8 @@ static void __init add_pcic(int ns, int
-
- } /* add_pcic */
-
--
- /*====================================================================*/
-
--
- #ifdef CONFIG_PNP
- static struct isapnp_device_id id_table[] __initdata = {
- { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('P', 'N', 'P'),
-@@ -832,7 +814,9 @@ static void __init isa_probe(void)
- }
- }
- } else {
-- for (i = 0; i < (extra_sockets ? 8 : 4); i += 2) {
-+ for (i = 0; i < 8; i += 2) {
-+ if (sockets && !extra_sockets && (i == 4))
-+ break;
- port = i365_base + 2*(i>>2);
- sock = (i & 3);
- id = identify(port, sock);
-@@ -856,7 +840,6 @@ static void __init isa_probe(void)
- }
- }
-
--
- /*====================================================================*/
-
- static irqreturn_t pcic_interrupt(int irq, void *dev,
-@@ -872,8 +855,7 @@ static irqreturn_t pcic_interrupt(int ir
- for (j = 0; j < 20; j++) {
- active = 0;
- for (i = 0; i < sockets; i++) {
-- if ((socket[i].cs_irq != irq) &&
-- (socket[i].socket.pci_irq != irq))
-+ if (socket[i].cs_irq != irq)
- continue;
- handled = 1;
- ISA_LOCK(i, flags);
-@@ -911,7 +893,6 @@ static irqreturn_t pcic_interrupt(int ir
- static void pcic_interrupt_wrapper(u_long data)
- {
- pcic_interrupt(0, NULL, NULL);
-- init_timer(&poll_timer);
- poll_timer.expires = jiffies + poll_interval;
- add_timer(&poll_timer);
- }
-@@ -1039,7 +1020,7 @@ static int i365_set_socket(u_short sock,
-
- /* IO card, RESET flag, IO interrupt */
- reg = t->intr;
-- if (state->io_irq != t->socket.pci_irq) reg |= state->io_irq;
-+ reg |= state->io_irq;
- reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET;
- reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0;
- i365_set(sock, I365_INTCTL, reg);
-@@ -1177,8 +1158,7 @@ static int i365_set_mem_map(u_short sock
- if ((map > 4) || (mem->card_start > 0x3ffffff) ||
- (mem->sys_start > mem->sys_stop) || (mem->speed > 1000))
- return -EINVAL;
-- if (!(socket[sock].flags & IS_PCI) &&
-- ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff)))
-+ if ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff))
- return -EINVAL;
-
- /* Turn off the window before changing anything */
-@@ -1211,6 +1191,7 @@ static int i365_set_mem_map(u_short sock
- return 0;
- } /* i365_set_mem_map */
-
-+#if 0 /* driver model ordering issue */
- /*======================================================================
-
- Routines for accessing socket information and register dumps via
-@@ -1250,6 +1231,7 @@ static ssize_t show_exca(struct class_de
-
- static CLASS_DEVICE_ATTR(exca, S_IRUGO, show_exca, NULL);
- static CLASS_DEVICE_ATTR(info, S_IRUGO, show_info, NULL);
-+#endif
-
- /*====================================================================*/
-
-@@ -1385,7 +1367,7 @@ static int __init init_i82365(void)
- if (driver_register(&i82365_driver))
- return -1;
-
-- printk(KERN_INFO "Intel PCIC probe: ");
-+ printk(KERN_INFO "Intel ISA PCIC probe: ");
- sockets = 0;
-
- isa_probe();
-@@ -1414,10 +1396,12 @@ static int __init init_i82365(void)
- pcmcia_unregister_socket(&socket[i].socket);
- break;
- }
-+#if 0 /* driver model ordering issue */
- class_device_create_file(&socket[i].socket.dev,
- &class_device_attr_info);
- class_device_create_file(&socket[i].socket.dev,
- &class_device_attr_exca);
-+#endif
- }
-
- /* Finally, schedule a polling interrupt */
---- linux-2.6.0/drivers/pcmcia/yenta_socket.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/drivers/pcmcia/yenta_socket.c 2003-12-28 23:22:47.000000000 -0800
-@@ -30,7 +30,7 @@
-
-
- #if 0
--#define DEBUG(x,args...) printk("%s: " x, __FUNCTION__, ##args)
-+#define DEBUG(x,args...) printk(KERN_DEBUG "%s: " x, __FUNCTION__, ##args)
- #else
- #define DEBUG(x,args...)
- #endif
-@@ -779,7 +779,7 @@ static void yenta_get_socket_capabilitie
- socket->socket.irq_mask = yenta_probe_irq(socket, isa_irq_mask);
- socket->socket.cb_dev = socket->dev;
-
-- printk(KERN_INFO "Yenta: ISA IRQ list %04x, PCI irq%d\n",
-+ printk(KERN_INFO "Yenta: ISA IRQ mask 0x%04x, PCI irq %d\n",
- socket->socket.irq_mask, socket->cb_irq);
- }
-
-@@ -860,7 +860,7 @@ static int __devinit yenta_probe (struct
- goto disable;
-
- if (!pci_resource_start(dev, 0)) {
-- printk("No cardbus resource!\n");
-+ printk(KERN_ERR "No cardbus resource!\n");
- ret = -ENODEV;
- goto release;
- }
-@@ -916,7 +916,7 @@ static int __devinit yenta_probe (struct
-
- /* Figure out what the dang thing can do for the PCMCIA layer... */
- yenta_get_socket_capabilities(socket, isa_interrupts);
-- printk("Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
-+ printk(KERN_INFO "Socket status: %08x\n", cb_readl(socket, CB_SOCKET_STATE));
-
- /* Register it with the pcmcia layer.. */
- ret = pcmcia_register_socket(&socket->socket);
---- linux-2.6.0/drivers/pnp/isapnp/core.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/pnp/isapnp/core.c 2003-12-28 23:22:08.000000000 -0800
-@@ -890,11 +890,9 @@ static int __init isapnp_build_device_li
- header[4], header[5], header[6], header[7], header[8]);
- printk(KERN_DEBUG "checksum = 0x%x\n", checksum);
- #endif
-- /* Don't be strict on the checksum, here !
-- e.g. 'SCM SwapBox Plug and Play' has header[8]==0 (should be: b7)*/
-- if (header[8] == 0)
-- ;
-- else if (checksum == 0x00 || checksum != header[8]) /* not valid CSN */
-+ /* Per Section 6.1 of the Plug and Play ISA Specification (Version 1.0a), */
-+ /* Bit[7] of Vendor ID Byte 0 must be 0 */
-+ if (header[0] & 0x80) /* not valid CSN */
- continue;
- if ((card = isapnp_alloc(sizeof(struct pnp_card))) == NULL)
- continue;
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/pnp/isapnp/Kconfig 2003-12-28 23:22:08.000000000 -0800
-@@ -0,0 +1,11 @@
-+#
-+# ISA Plug and Play configuration
-+#
-+config ISAPNP
-+ bool "ISA Plug and Play support (EXPERIMENTAL)"
-+ depends on PNP && EXPERIMENTAL
-+ help
-+ Say Y here if you would like support for ISA Plug and Play devices.
-+ Some information is in <file:Documentation/isapnp.txt>.
-+
-+ If unsure, say Y.
---- linux-2.6.0/drivers/pnp/Kconfig 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/pnp/Kconfig 2003-12-28 23:22:08.000000000 -0800
-@@ -30,33 +30,9 @@ config PNP_DEBUG
- comment "Protocols"
- depends on PNP
-
--config ISAPNP
-- bool "ISA Plug and Play support (EXPERIMENTAL)"
-- depends on PNP && EXPERIMENTAL
-- help
-- Say Y here if you would like support for ISA Plug and Play devices.
-- Some information is in <file:Documentation/isapnp.txt>.
-+source "drivers/pnp/isapnp/Kconfig"
-
-- If unsure, say Y.
--
--config PNPBIOS
-- bool "Plug and Play BIOS support (EXPERIMENTAL)"
-- depends on PNP && EXPERIMENTAL
-- ---help---
-- Linux uses the PNPBIOS as defined in "Plug and Play BIOS
-- Specification Version 1.0A May 5, 1994" to autodetect built-in
-- mainboard resources (e.g. parallel port resources).
--
-- Some features (e.g. event notification, docking station information,
-- ISAPNP services) are not used.
--
-- Note: ACPI is expected to supersede PNPBIOS some day, currently it
-- co-exists nicely.
--
-- See latest pcmcia-cs (stand-alone package) for a nice "lspnp" tools,
-- or have a look at /proc/bus/pnp.
--
-- If unsure, say Y.
-+source "drivers/pnp/pnpbios/Kconfig"
-
- endmenu
-
---- linux-2.6.0/drivers/pnp/pnpbios/bioscalls.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/pnp/pnpbios/bioscalls.c 2003-12-28 23:23:01.000000000 -0800
-@@ -493,7 +493,7 @@ static int __pnp_bios_read_escd(char *da
- if (!pnp_bios_present())
- return ESCD_FUNCTION_NOT_SUPPORTED;
- status = call_pnp_bios(PNP_READ_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0,
-- data, 65536, (void *)nvram_base, 65536);
-+ data, 65536, __va((void *)nvram_base), 65536);
- return status;
- }
-
-@@ -516,7 +516,7 @@ static int pnp_bios_write_escd(char *dat
- if (!pnp_bios_present())
- return ESCD_FUNCTION_NOT_SUPPORTED;
- status = call_pnp_bios(PNP_WRITE_ESCD, 0, PNP_TS1, PNP_TS2, PNP_DS, 0, 0, 0,
-- data, 65536, nvram_base, 65536);
-+ data, 65536, __va((void *)nvram_base), 65536);
- return status;
- }
- #endif
---- linux-2.6.0/drivers/pnp/pnpbios/core.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/pnp/pnpbios/core.c 2003-12-28 23:22:07.000000000 -0800
-@@ -353,16 +353,8 @@ static void __init build_devlist(void)
-
- for(nodenum=0; nodenum<0xff; ) {
- u8 thisnodenum = nodenum;
-- /* eventually we will want to use PNPMODE_STATIC here but for now
-- * dynamic will help us catch buggy bioses to add to the blacklist.
-- */
-- if (!pnpbios_dont_use_current_config) {
-- if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_DYNAMIC, node))
-- break;
-- } else {
-- if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_STATIC, node))
-- break;
-- }
-+ if (pnp_bios_get_dev_node(&nodenum, (char )PNPMODE_STATIC, node))
-+ break;
- nodes_got++;
- dev = pnpbios_kmalloc(sizeof (struct pnp_dev), GFP_KERNEL);
- if (!dev)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/pnp/pnpbios/Kconfig 2003-12-28 23:22:08.000000000 -0800
-@@ -0,0 +1,41 @@
-+#
-+# Plug and Play BIOS configuration
-+#
-+config PNPBIOS
-+ bool "Plug and Play BIOS support (EXPERIMENTAL)"
-+ depends on PNP && EXPERIMENTAL
-+ ---help---
-+ Linux uses the PNPBIOS as defined in "Plug and Play BIOS
-+ Specification Version 1.0A May 5, 1994" to autodetect built-in
-+ mainboard resources (e.g. parallel port resources).
-+
-+ Some features (e.g. event notification, docking station information,
-+ ISAPNP services) are not currently implemented.
-+
-+ If you would like the kernel to detect and allocate resources to
-+ your mainboard devices (on some systems they are disabled by the
-+ BIOS) say Y here. Also the PNPBIOS can help prevent resource
-+ conflicts between mainboard devices and other bus devices.
-+
-+ Note: ACPI is expected to supersede PNPBIOS some day, currently it
-+ co-exists nicely. If you have a non-ISA system that supports ACPI,
-+ you probably don't need PNPBIOS support.
-+
-+config PNPBIOS_PROC_FS
-+ bool "Plug and Play BIOS /proc interface"
-+ depends on PNPBIOS && PROC_FS
-+ ---help---
-+ If you say Y here and to "/proc file system support", you will be
-+ able to directly access the PNPBIOS. This includes resource
-+ allocation, ESCD, and other PNPBIOS services. Using this
-+ interface is potentially dangerous because the PNPBIOS driver will
-+ not be notified of any resource changes made by writting directly.
-+ Also some buggy systems will fault when accessing certain features
-+ in the PNPBIOS /proc interface (e.g. ESCD).
-+
-+ See the latest pcmcia-cs (stand-alone package) for a nice set of
-+ PNPBIOS /proc interface tools (lspnp and setpnp).
-+
-+ Unless you are debugging or have other specific reasons, it is
-+ recommended that you say N here.
-+
---- linux-2.6.0/drivers/pnp/pnpbios/Makefile 2003-08-08 22:55:12.000000000 -0700
-+++ 25/drivers/pnp/pnpbios/Makefile 2003-12-28 23:22:08.000000000 -0800
-@@ -2,6 +2,6 @@
- # Makefile for the kernel PNPBIOS driver.
- #
-
--pnpbios-proc-$(CONFIG_PROC_FS) = proc.o
-+pnpbios-proc-$(CONFIG_PNPBIOS_PROC_FS) = proc.o
-
- obj-y := core.o bioscalls.o rsparser.o $(pnpbios-proc-y)
---- linux-2.6.0/drivers/pnp/pnpbios/pnpbios.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/pnp/pnpbios/pnpbios.h 2003-12-28 23:22:08.000000000 -0800
-@@ -36,7 +36,7 @@ extern void pnpid32_to_pnpid(u32 id, cha
- extern void pnpbios_print_status(const char * module, u16 status);
- extern void pnpbios_calls_init(union pnp_bios_install_struct * header);
-
--#ifdef CONFIG_PROC_FS
-+#ifdef CONFIG_PNPBIOS_PROC_FS
- extern int pnpbios_interface_attach_device(struct pnp_bios_node * node);
- extern int pnpbios_proc_init (void);
- extern void pnpbios_proc_exit (void);
-@@ -44,4 +44,4 @@ extern void pnpbios_proc_exit (void);
- static inline int pnpbios_interface_attach_device(struct pnp_bios_node * node) { return 0; }
- static inline int pnpbios_proc_init (void) { return 0; }
- static inline void pnpbios_proc_exit (void) { ; }
--#endif /* CONFIG_PROC */
-+#endif /* CONFIG_PNPBIOS_PROC_FS */
---- linux-2.6.0/drivers/s390/block/dasd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/s390/block/dasd.c 2003-12-28 23:21:17.000000000 -0800
-@@ -1643,9 +1643,9 @@ dasd_flush_request_queue(struct dasd_dev
- }
-
- static int
--dasd_open(struct inode *inp, struct file *filp)
-+dasd_open(struct block_device *bdev, struct file *filp)
- {
-- struct gendisk *disk = inp->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct dasd_device *device = disk->private_data;
- int rc;
-
-@@ -1676,10 +1676,8 @@ out:
- return rc;
- }
-
--static int
--dasd_release(struct inode *inp, struct file *filp)
-+static int dasd_release(struct gendisk *disk)
- {
-- struct gendisk *disk = inp->i_bdev->bd_disk;
- struct dasd_device *device = disk->private_data;
-
- if (device->state < DASD_STATE_BASIC) {
---- linux-2.6.0/drivers/s390/block/dasd_int.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/s390/block/dasd_int.h 2003-12-28 23:21:12.000000000 -0800
-@@ -493,7 +493,7 @@ int dasd_ioctl_init(void);
- void dasd_ioctl_exit(void);
- int dasd_ioctl_no_register(struct module *, int, dasd_ioctl_fn_t);
- int dasd_ioctl_no_unregister(struct module *, int, dasd_ioctl_fn_t);
--int dasd_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
-+int dasd_ioctl(struct block_device *, struct file *, unsigned int, unsigned long);
-
- /* externals in dasd_proc.c */
- int dasd_proc_init(void);
---- linux-2.6.0/drivers/s390/block/dasd_ioctl.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/s390/block/dasd_ioctl.c 2003-12-28 23:21:12.000000000 -0800
-@@ -78,10 +78,9 @@ dasd_ioctl_no_unregister(struct module *
- }
-
- int
--dasd_ioctl(struct inode *inp, struct file *filp,
-+dasd_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int no, unsigned long data)
- {
-- struct block_device *bdev = inp->i_bdev;
- struct dasd_device *device = bdev->bd_disk->private_data;
- struct dasd_ioctl *ioctl;
- const char *dir;
---- linux-2.6.0/drivers/s390/block/xpram.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/s390/block/xpram.c 2003-12-28 23:21:12.000000000 -0800
-@@ -328,7 +328,7 @@ fail:
- return 0;
- }
-
--static int xpram_ioctl (struct inode *inode, struct file *filp,
-+static int xpram_ioctl (struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long arg)
- {
- struct hd_geometry *geo;
---- linux-2.6.0/drivers/s390/char/tape_block.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/s390/char/tape_block.c 2003-12-28 23:21:17.000000000 -0800
-@@ -27,8 +27,8 @@
- /*
- * file operation structure for tape block frontend
- */
--static int tapeblock_open(struct inode *, struct file *);
--static int tapeblock_release(struct inode *, struct file *);
-+static int tapeblock_open(block_device *, struct file *);
-+static int tapeblock_release(struct gendisk *);
-
- static struct block_device_operations tapeblock_fops = {
- .owner = THIS_MODULE,
-@@ -299,9 +299,9 @@ static int tapeblock_mediumdetect(struct
- * Block frontend tape device open function.
- */
- static int
--tapeblock_open(struct inode *inode, struct file *filp)
-+tapeblock_open(struct block_device *bdev, struct file *filp)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct tape_device *device = disk->private_data;
- int rc;
-
-@@ -336,9 +336,8 @@ tapeblock_open(struct inode *inode, stru
- * Block frontend tape device release function.
- */
- static int
--tapeblock_release(struct inode *inode, struct file *filp)
-+tapeblock_release(struct gendisk *disk)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
- struct tape_device *device = disk->private_data;
-
- tape_release(device);
---- linux-2.6.0/drivers/s390/net/qeth.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/s390/net/qeth.c 2003-12-28 23:21:01.000000000 -0800
-@@ -9739,28 +9739,28 @@ static int
- qeth_get_internal_functions(void)
- {
- struct net_device *dev;
--
-- dev = (struct net_device *) kmalloc(sizeof (struct net_device),
-- GFP_KERNEL);
-+#ifdef CONFIG_NET_ETHERNET
-+ dev = alloc_etherdev(0);
- if (!dev) {
- PRINT_ERR("Not enough memory for internal functions.\n");
- return -ENOMEM;
- }
--#ifdef CONFIG_NET_ETHERNET
-- ether_setup(dev);
- qeth_my_eth_header = dev->hard_header;
- qeth_my_eth_rebuild_header = dev->rebuild_header;
- qeth_my_eth_header_cache = dev->hard_header_cache;
- qeth_my_eth_header_cache_update = dev->header_cache_update;
-+ free_netdev(dev);
- #endif
- #ifdef CONFIG_TR
-- tr_setup(dev);
-+ dev = alloc_trdev(0);
-+ if (!dev) {
-+ PRINT_ERR("Not enough memory for internal functions.\n");
-+ return -ENOMEM;
-+ }
- qeth_my_tr_header = dev->hard_header;
- qeth_my_tr_rebuild_header = dev->rebuild_header;
-+ free_netdev(dev);
- #endif
--
-- kfree(dev);
--
- return 0;
- }
-
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7770.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7770.c 2003-12-28 23:21:39.000000000 -0800
-@@ -37,9 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#30 $
-- *
-- * $FreeBSD$
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#34 $
- */
-
- #ifdef __linux__
-@@ -47,6 +45,8 @@
- #include "aic7xxx_inline.h"
- #include "aic7xxx_93cx6.h"
- #else
-+#include <sys/cdefs.h>
-+__FBSDID("$FreeBSD$");
- #include <dev/aic7xxx/aic7xxx_osm.h>
- #include <dev/aic7xxx/aic7xxx_inline.h>
- #include <dev/aic7xxx/aic7xxx_93cx6.h>
-@@ -67,8 +67,7 @@ static ahc_device_setup_t ahc_aic7770_VL
- static ahc_device_setup_t ahc_aic7770_EISA_setup;;
- static ahc_device_setup_t ahc_aic7770_setup;
-
--
--struct aic7770_identity aic7770_ident_table [] =
-+struct aic7770_identity aic7770_ident_table[] =
- {
- {
- ID_AHA_274x,
-@@ -83,6 +82,12 @@ struct aic7770_identity aic7770_ident_ta
- ahc_aic7770_VL_setup
- },
- {
-+ ID_AHA_284x,
-+ 0xFFFFFFFE,
-+ "Adaptec 284X SCSI adapter (BIOS Disabled)",
-+ ahc_aic7770_VL_setup
-+ },
-+ {
- ID_OLV_274x,
- 0xFFFFFFFF,
- "Adaptec (Olivetti OEM) 274X SCSI adapter",
-@@ -154,7 +159,7 @@ aic7770_config(struct ahc_softc *ahc, st
- ahc->bus_suspend = aic7770_suspend;
- ahc->bus_resume = aic7770_resume;
-
-- error = ahc_reset(ahc);
-+ error = ahc_reset(ahc, /*reinit*/FALSE);
- if (error != 0)
- return (error);
-
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7770_osm.c 2003-06-14 12:18:25.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7770_osm.c 2003-12-28 23:21:39.000000000 -0800
-@@ -1,7 +1,7 @@
- /*
- * Linux driver attachment glue for aic7770 based controllers.
- *
-- * Copyright (c) 2000-2001 Adaptec Inc.
-+ * Copyright (c) 2000-2003 Adaptec Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
-@@ -36,27 +36,90 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#13 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#16 $
- */
-
- #include "aic7xxx_osm.h"
-
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+#include <linux/device.h>
-+#include <linux/eisa.h>
-+
-+#define EISA_MFCTR_CHAR0(ID) (char)(((ID>>26) & 0x1F) | '@') /* Bits 26-30 */
-+#define EISA_MFCTR_CHAR1(ID) (char)(((ID>>21) & 0x1F) | '@') /* Bits 21-25 */
-+#define EISA_MFCTR_CHAR2(ID) (char)(((ID>>16) & 0x1F) | '@') /* Bits 16-20 */
-+#define EISA_PRODUCT_ID(ID) (short)((ID>>4) & 0xFFF) /* Bits 4-15 */
-+#define EISA_REVISION_ID(ID) (uint8_t)(ID & 0x0F) /* Bits 0-3 */
-+
-+static int aic7770_eisa_dev_probe(struct device *dev);
-+static int aic7770_eisa_dev_remove(struct device *dev);
-+static struct eisa_driver aic7770_driver = {
-+ .driver = {
-+ .name = "aic7xxx",
-+ .probe = aic7770_eisa_dev_probe,
-+ .remove = aic7770_eisa_dev_remove,
-+ }
-+};
-+
-+typedef struct device *aic7770_dev_t;
-+#else
- #define MINSLOT 1
- #define NUMSLOTS 16
- #define IDOFFSET 0x80
-
--int
--aic7770_linux_probe(Scsi_Host_Template *template)
-+typedef void *aic7770_dev_t;
-+#endif
-+
-+static int aic7770_linux_config(struct aic7770_identity *entry,
-+ aic7770_dev_t dev, u_int eisaBase);
-+
-+void
-+ahc_linux_eisa_init(void)
- {
--#if defined(__i386__) || defined(__alpha__)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ struct eisa_device_id *eid;
-+ struct aic7770_identity *id;
-+ int i;
-+
-+ if (aic7xxx_probe_eisa_vl == 0)
-+ return;
-+
-+ /*
-+ * Linux requires the EISA IDs to be specified in
-+ * the EISA ID string format. Perform the conversion
-+ * and setup a table with a NUL terminal entry.
-+ */
-+ aic7770_driver.id_table = malloc(sizeof(struct eisa_device_id) *
-+ (ahc_num_aic7770_devs + 1),
-+ M_DEVBUF, M_NOWAIT);
-+ if (aic7770_driver.id_table == NULL)
-+ return;
-+
-+ for (eid = (struct eisa_device_id *)aic7770_driver.id_table,
-+ id = aic7770_ident_table, i = 0;
-+ i < ahc_num_aic7770_devs; eid++, id++, i++) {
-+
-+ sprintf(eid->sig, "%c%c%c%03X%01X",
-+ EISA_MFCTR_CHAR0(id->full_id),
-+ EISA_MFCTR_CHAR1(id->full_id),
-+ EISA_MFCTR_CHAR2(id->full_id),
-+ EISA_PRODUCT_ID(id->full_id),
-+ EISA_REVISION_ID(id->full_id));
-+ eid->driver_data = i;
-+ }
-+ eid->sig[0] = 0;
-+
-+ eisa_driver_register(&aic7770_driver);
-+#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) */
- struct aic7770_identity *entry;
-- struct ahc_softc *ahc;
-- int i, slot;
-- int eisaBase;
-- int found;
-+ u_int slot;
-+ u_int eisaBase;
-+ u_int i;
-+
-+ if (aic7xxx_probe_eisa_vl == 0)
-+ return;
-
- eisaBase = 0x1000 + AHC_EISA_SLOT_OFFSET;
-- found = 0;
- for (slot = 1; slot < NUMSLOTS; eisaBase+=0x1000, slot++) {
- uint32_t eisa_id;
- size_t id_size;
-@@ -83,45 +146,65 @@ aic7770_linux_probe(Scsi_Host_Template *
- continue; /* no EISA card in slot */
-
- entry = aic7770_find_device(eisa_id);
-- if (entry != NULL) {
-- char buf[80];
-- char *name;
-- int error;
--
-- /*
-- * Allocate a softc for this card and
-- * set it up for attachment by our
-- * common detect routine.
-- */
-- sprintf(buf, "ahc_eisa:%d", slot);
-- name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
-- if (name == NULL)
-- break;
-- strcpy(name, buf);
-- ahc = ahc_alloc(template, name);
-- if (ahc == NULL) {
-- /*
-- * If we can't allocate this one,
-- * chances are we won't be able to
-- * allocate future card structures.
-- */
-- break;
-- }
-- error = aic7770_config(ahc, entry, eisaBase);
-- if (error != 0) {
-- ahc->bsh.ioport = 0;
-- ahc_free(ahc);
-- continue;
-- }
-- found++;
-- }
-+ if (entry != NULL)
-+ aic7770_linux_config(entry, NULL, eisaBase);
-+ }
-+#endif
-+}
-+
-+void
-+ahc_linux_eisa_exit(void)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ if (aic7xxx_probe_eisa_vl == 0)
-+ return;
-+
-+ if (aic7770_driver.id_table != NULL) {
-+ eisa_driver_unregister(&aic7770_driver);
-+ free(aic7770_driver.id_table, M_DEVBUF);
- }
-- return (found);
--#else
-- return (0);
- #endif
- }
-
-+static int
-+aic7770_linux_config(struct aic7770_identity *entry, aic7770_dev_t dev,
-+ u_int eisaBase)
-+{
-+ struct ahc_softc *ahc;
-+ char buf[80];
-+ char *name;
-+ int error;
-+
-+ /*
-+ * Allocate a softc for this card and
-+ * set it up for attachment by our
-+ * common detect routine.
-+ */
-+ sprintf(buf, "ahc_eisa:%d", eisaBase >> 12);
-+ name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
-+ if (name == NULL)
-+ return (ENOMEM);
-+ strcpy(name, buf);
-+ ahc = ahc_alloc(&aic7xxx_driver_template, name);
-+ if (ahc == NULL) {
-+ free(name, M_DEVBUF);
-+ return (ENOMEM);
-+ }
-+ ahc->dev_softc = dev;
-+ error = aic7770_config(ahc, entry, eisaBase);
-+ if (error != 0) {
-+ ahc->bsh.ioport = 0;
-+ ahc_free(ahc);
-+ return (error);
-+ }
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ dev->driver_data = (void *)ahc;
-+ if (aic7xxx_detect_complete)
-+ error = ahc_linux_register_host(ahc, &aic7xxx_driver_template);
-+#endif
-+ return (error);
-+}
-+
- int
- aic7770_map_registers(struct ahc_softc *ahc, u_int port)
- {
-@@ -129,6 +212,8 @@ aic7770_map_registers(struct ahc_softc *
- * Lock out other contenders for our i/o space.
- */
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
-+ if (check_region(port, AHC_EISA_IOSIZE) != 0)
-+ return (ENOMEM);
- request_region(port, AHC_EISA_IOSIZE, "aic7xxx");
- #else
- if (request_region(port, AHC_EISA_IOSIZE, "aic7xxx") == 0)
-@@ -155,3 +240,43 @@ aic7770_map_int(struct ahc_softc *ahc, u
-
- return (-error);
- }
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+static int
-+aic7770_eisa_dev_probe(struct device *dev)
-+{
-+ struct eisa_device *edev;
-+
-+ edev = to_eisa_device(dev);
-+ return (aic7770_linux_config(aic7770_ident_table + edev->id.driver_data,
-+ dev, edev->base_addr+AHC_EISA_SLOT_OFFSET));
-+}
-+
-+static int
-+aic7770_eisa_dev_remove(struct device *dev)
-+{
-+ struct ahc_softc *ahc;
-+ u_long l;
-+
-+ /*
-+ * We should be able to just perform
-+ * the free directly, but check our
-+ * list for extra sanity.
-+ */
-+ ahc_list_lock(&l);
-+ ahc = ahc_find_softc((struct ahc_softc *)dev->driver_data);
-+ if (ahc != NULL) {
-+ u_long s;
-+
-+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
-+ ahc_list_unlock(&l);
-+ ahc_lock(ahc, &s);
-+ ahc_intr_enable(ahc, FALSE);
-+ ahc_unlock(ahc, &s);
-+ ahc_free(ahc);
-+ } else
-+ ahc_list_unlock(&l);
-+
-+ return (0);
-+}
-+#endif
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_core.c 2003-06-14 12:17:55.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_core.c 2003-12-28 23:21:39.000000000 -0800
-@@ -37,9 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#194 $
-- *
-- * $FreeBSD$
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#224 $
- */
-
- #ifdef __linux__
-@@ -47,6 +45,8 @@
- #include "aic79xx_inline.h"
- #include "aicasm/aicasm_insformat.h"
- #else
-+#include <sys/cdefs.h>
-+__FBSDID("$FreeBSD$");
- #include <dev/aic7xxx/aic79xx_osm.h>
- #include <dev/aic7xxx/aic79xx_inline.h>
- #include <dev/aic7xxx/aicasm/aicasm_insformat.h>
-@@ -224,6 +224,14 @@ static u_int ahd_resolve_seqaddr(struct
- static void ahd_download_instr(struct ahd_softc *ahd,
- u_int instrptr, uint8_t *dconsts);
- static int ahd_probe_stack_size(struct ahd_softc *ahd);
-+static void ahd_other_scb_timeout(struct ahd_softc *ahd,
-+ struct scb *scb,
-+ struct scb *other_scb);
-+static int ahd_scb_active_in_fifo(struct ahd_softc *ahd,
-+ struct scb *scb);
-+static void ahd_run_data_fifo(struct ahd_softc *ahd,
-+ struct scb *scb);
-+
- #ifdef AHD_TARGET_MODE
- static void ahd_queue_lstate_event(struct ahd_softc *ahd,
- struct ahd_tmode_lstate *lstate,
-@@ -328,10 +336,7 @@ ahd_restart(struct ahd_softc *ahd)
- /* Always allow reselection */
- ahd_outb(ahd, SCSISEQ1,
- ahd_inb(ahd, SCSISEQ_TEMPLATE) & (ENSELI|ENRSELI|ENAUTOATNP));
-- /* Ensure that no DMA operations are in progress */
- ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
-- ahd_outb(ahd, SCBHCNT, 0);
-- ahd_outb(ahd, CCSCBCTL, CCSCBRESET);
- ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
- ahd_unpause(ahd);
- }
-@@ -371,31 +376,119 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd
- u_int next_scbid;
-
- saved_modes = ahd_save_modes(ahd);
-- ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
-+
-+ /*
-+ * Flush the good status FIFO for completed packetized commands.
-+ */
-+ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
- saved_scbptr = ahd_get_scbptr(ahd);
-+ while ((ahd_inb(ahd, LQISTAT2) & LQIGSAVAIL) != 0) {
-+ u_int fifo_mode;
-+ u_int i;
-+
-+ scbid = ahd_inw(ahd, GSFIFO);
-+ scb = ahd_lookup_scb(ahd, scbid);
-+ if (scb == NULL) {
-+ printf("%s: Warning - GSFIFO SCB %d invalid\n",
-+ ahd_name(ahd), scbid);
-+ continue;
-+ }
-+ /*
-+ * Determine if this transaction is still active in
-+ * any FIFO. If it is, we must flush that FIFO to
-+ * the host before completing the command.
-+ */
-+ fifo_mode = 0;
-+rescan_fifos:
-+ for (i = 0; i < 2; i++) {
-+ /* Toggle to the other mode. */
-+ fifo_mode ^= 1;
-+ ahd_set_modes(ahd, fifo_mode, fifo_mode);
-+
-+ if (ahd_scb_active_in_fifo(ahd, scb) == 0)
-+ continue;
-+
-+ ahd_run_data_fifo(ahd, scb);
-+
-+ /*
-+ * Running this FIFO may cause a CFG4DATA for
-+ * this same transaction to assert in the other
-+ * FIFO or a new snapshot SAVEPTRS interrupt
-+ * in this FIFO. Even running a FIFO may not
-+ * clear the transaction if we are still waiting
-+ * for data to drain to the host. We must loop
-+ * until the transaction is not active in either
-+ * FIFO just to be sure. Reset our loop counter
-+ * so we will visit both FIFOs again before
-+ * declaring this transaction finished. We
-+ * also delay a bit so that status has a chance
-+ * to change before we look at this FIFO again.
-+ */
-+ aic_delay(200);
-+ goto rescan_fifos;
-+ }
-+ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-+ ahd_set_scbptr(ahd, scbid);
-+ if ((ahd_inb_scbram(ahd, SCB_SGPTR) & SG_LIST_NULL) == 0
-+ && ((ahd_inb_scbram(ahd, SCB_SGPTR) & SG_FULL_RESID) != 0
-+ || (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR)
-+ & SG_LIST_NULL) != 0)) {
-+ u_int comp_head;
-+
-+ /*
-+ * The transfer completed with a residual.
-+ * Place this SCB on the complete DMA list
-+ * so that we update our in-core copy of the
-+ * SCB before completing the command.
-+ */
-+ ahd_outb(ahd, SCB_SCSI_STATUS, 0);
-+ ahd_outb(ahd, SCB_SGPTR,
-+ ahd_inb_scbram(ahd, SCB_SGPTR)
-+ | SG_STATUS_VALID);
-+ ahd_outw(ahd, SCB_TAG, SCB_GET_TAG(scb));
-+ comp_head = ahd_inw(ahd, COMPLETE_DMA_SCB_HEAD);
-+ ahd_outw(ahd, SCB_NEXT_COMPLETE, comp_head);
-+ ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD, SCB_GET_TAG(scb));
-+ } else
-+ ahd_complete_scb(ahd, scb);
-+ }
-+ ahd_set_scbptr(ahd, saved_scbptr);
-+
-+ /*
-+ * Setup for command channel portion of flush.
-+ */
-+ ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
-
- /*
- * Wait for any inprogress DMA to complete and clear DMA state
- * if this if for an SCB in the qinfifo.
- */
-- while ((ccscbctl = ahd_inb(ahd, CCSCBCTL) & (CCARREN|CCSCBEN)) != 0) {
-+ while (((ccscbctl = ahd_inb(ahd, CCSCBCTL)) & (CCARREN|CCSCBEN)) != 0) {
-
- if ((ccscbctl & (CCSCBDIR|CCARREN)) == (CCSCBDIR|CCARREN)) {
- if ((ccscbctl & ARRDONE) != 0)
- break;
- } else if ((ccscbctl & CCSCBDONE) != 0)
- break;
-- ahd_delay(200);
-+ aic_delay(200);
- }
-- if ((ccscbctl & CCSCBDIR) != 0)
-+ /*
-+ * We leave the sequencer to cleanup in the case of DMA's to
-+ * update the qoutfifo. In all other cases (DMA's to the
-+ * chip or a push of an SCB from the COMPLETE_DMA_SCB list),
-+ * we disable the DMA engine so that the sequencer will not
-+ * attempt to handle the DMA completion.
-+ */
-+ if ((ccscbctl & CCSCBDIR) != 0 || (ccscbctl & ARRDONE) != 0)
- ahd_outb(ahd, CCSCBCTL, ccscbctl & ~(CCARREN|CCSCBEN));
-
- /*
-- * Complete any SCBs that just finished being
-- * DMA'ed into the qoutfifo.
-+ * Complete any SCBs that just finished
-+ * being DMA'ed into the qoutfifo.
- */
- ahd_run_qoutfifo(ahd);
-
-+ saved_scbptr = ahd_get_scbptr(ahd);
- /*
- * Manually update/complete any completed SCBs that are waiting to be
- * DMA'ed back up to the host.
-@@ -438,31 +531,272 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd
- scbid = next_scbid;
- }
- ahd_outw(ahd, COMPLETE_SCB_HEAD, SCB_LIST_NULL);
-- ahd_set_scbptr(ahd, saved_scbptr);
--
-- /*
-- * Flush the good status FIFO for compelted packetized commands.
-- */
-- ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-- while ((ahd_inb(ahd, LQISTAT2) & LQIGSAVAIL) != 0) {
-- scbid = (ahd_inb(ahd, GSFIFO+1) << 8)
-- | ahd_inb(ahd, GSFIFO);
-- scb = ahd_lookup_scb(ahd, scbid);
-- if (scb == NULL) {
-- printf("%s: Warning - GSFIFO SCB %d invalid\n",
-- ahd_name(ahd), scbid);
-- continue;
-- }
-- ahd_complete_scb(ahd, scb);
-- }
-
- /*
- * Restore state.
- */
-+ ahd_set_scbptr(ahd, saved_scbptr);
- ahd_restore_modes(ahd, saved_modes);
- ahd->flags |= AHD_UPDATE_PEND_CMDS;
- }
-
-+/*
-+ * Determine if an SCB for a packetized transaction
-+ * is active in a FIFO.
-+ */
-+static int
-+ahd_scb_active_in_fifo(struct ahd_softc *ahd, struct scb *scb)
-+{
-+
-+ /*
-+ * The FIFO is only active for our transaction if
-+ * the SCBPTR matches the SCB's ID and the firmware
-+ * has installed a handler for the FIFO or we have
-+ * a pending SAVEPTRS or CFG4DATA interrupt.
-+ */
-+ if (ahd_get_scbptr(ahd) != SCB_GET_TAG(scb)
-+ || ((ahd_inb(ahd, LONGJMP_ADDR+1) & INVALID_ADDR) != 0
-+ && (ahd_inb(ahd, SEQINTSRC) & (CFG4DATA|SAVEPTRS)) == 0))
-+ return (0);
-+
-+ return (1);
-+}
-+
-+/*
-+ * Run a data fifo to completion for a transaction we know
-+ * has completed across the SCSI bus (good status has been
-+ * received). We are already set to the correct FIFO mode
-+ * on entry to this routine.
-+ *
-+ * This function attempts to operate exactly as the firmware
-+ * would when running this FIFO. Care must be taken to update
-+ * this routine any time the firmware's FIFO algorithm is
-+ * changed.
-+ */
-+static void
-+ahd_run_data_fifo(struct ahd_softc *ahd, struct scb *scb)
-+{
-+ u_int seqintsrc;
-+
-+ seqintsrc = ahd_inb(ahd, SEQINTSRC);
-+ if ((seqintsrc & CFG4DATA) != 0) {
-+ uint32_t datacnt;
-+ uint32_t sgptr;
-+
-+ /*
-+ * Clear full residual flag.
-+ */
-+ sgptr = ahd_inl_scbram(ahd, SCB_SGPTR) & ~SG_FULL_RESID;
-+ ahd_outb(ahd, SCB_SGPTR, sgptr);
-+
-+ /*
-+ * Load datacnt and address.
-+ */
-+ datacnt = ahd_inl_scbram(ahd, SCB_DATACNT);
-+ if ((datacnt & AHD_DMA_LAST_SEG) != 0) {
-+ sgptr |= LAST_SEG;
-+ ahd_outb(ahd, SG_STATE, 0);
-+ } else
-+ ahd_outb(ahd, SG_STATE, LOADING_NEEDED);
-+ ahd_outq(ahd, HADDR, ahd_inq_scbram(ahd, SCB_DATAPTR));
-+ ahd_outl(ahd, HCNT, datacnt & AHD_SG_LEN_MASK);
-+ ahd_outb(ahd, SG_CACHE_PRE, sgptr);
-+ ahd_outb(ahd, DFCNTRL, PRELOADEN|SCSIEN|HDMAEN);
-+
-+ /*
-+ * Initialize Residual Fields.
-+ */
-+ ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, datacnt >> 24);
-+ ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr & SG_PTR_MASK);
-+
-+ /*
-+ * Mark the SCB as having a FIFO in use.
-+ */
-+ ahd_outb(ahd, SCB_FIFO_USE_COUNT,
-+ ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) + 1);
-+
-+ /*
-+ * Install a "fake" handler for this FIFO.
-+ */
-+ ahd_outw(ahd, LONGJMP_ADDR, 0);
-+
-+ /*
-+ * Notify the hardware that we have satisfied
-+ * this sequencer interrupt.
-+ */
-+ ahd_outb(ahd, CLRSEQINTSRC, CLRCFG4DATA);
-+ } else if ((seqintsrc & SAVEPTRS) != 0) {
-+ uint32_t sgptr;
-+ uint32_t resid;
-+
-+ if ((ahd_inb(ahd, LONGJMP_ADDR+1)&INVALID_ADDR) != 0) {
-+ /*
-+ * Snapshot Save Pointers. All that
-+ * is necessary to clear the snapshot
-+ * is a CLRCHN.
-+ */
-+ goto clrchn;
-+ }
-+
-+ /*
-+ * Disable S/G fetch so the DMA engine
-+ * is available to future users.
-+ */
-+ if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0)
-+ ahd_outb(ahd, CCSGCTL, 0);
-+ ahd_outb(ahd, SG_STATE, 0);
-+
-+ /*
-+ * Flush the data FIFO. Strickly only
-+ * necessary for Rev A parts.
-+ */
-+ ahd_outb(ahd, DFCNTRL, ahd_inb(ahd, DFCNTRL) | FIFOFLUSH);
-+
-+ /*
-+ * Calculate residual.
-+ */
-+ sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
-+ resid = ahd_inl(ahd, SHCNT);
-+ resid |= ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT+3) << 24;
-+ ahd_outl(ahd, SCB_RESIDUAL_DATACNT, resid);
-+ if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG) == 0) {
-+ /*
-+ * Must back up to the correct S/G element.
-+ * Typically this just means resetting our
-+ * low byte to the offset in the SG_CACHE,
-+ * but if we wrapped, we have to correct
-+ * the other bytes of the sgptr too.
-+ */
-+ if ((ahd_inb(ahd, SG_CACHE_SHADOW) & 0x80) != 0
-+ && (sgptr & 0x80) == 0)
-+ sgptr -= 0x100;
-+ sgptr &= ~0xFF;
-+ sgptr |= ahd_inb(ahd, SG_CACHE_SHADOW)
-+ & SG_ADDR_MASK;
-+ ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
-+ ahd_outb(ahd, SCB_RESIDUAL_DATACNT + 3, 0);
-+ } else if ((resid & AHD_SG_LEN_MASK) == 0) {
-+ ahd_outb(ahd, SCB_RESIDUAL_SGPTR,
-+ sgptr | SG_LIST_NULL);
-+ }
-+ /*
-+ * Save Pointers.
-+ */
-+ ahd_outq(ahd, SCB_DATAPTR, ahd_inq(ahd, SHADDR));
-+ ahd_outl(ahd, SCB_DATACNT, resid);
-+ ahd_outl(ahd, SCB_SGPTR, sgptr);
-+ ahd_outb(ahd, CLRSEQINTSRC, CLRSAVEPTRS);
-+ ahd_outb(ahd, SEQIMODE,
-+ ahd_inb(ahd, SEQIMODE) | ENSAVEPTRS);
-+ /*
-+ * If the data is to the SCSI bus, we are
-+ * done, otherwise wait for FIFOEMP.
-+ */
-+ if ((ahd_inb(ahd, DFCNTRL) & DIRECTION) != 0)
-+ goto clrchn;
-+ } else if ((ahd_inb(ahd, SG_STATE) & LOADING_NEEDED) != 0) {
-+ uint32_t sgptr;
-+ uint64_t data_addr;
-+ uint32_t data_len;
-+ u_int dfcntrl;
-+
-+ /*
-+ * Disable S/G fetch so the DMA engine
-+ * is available to future users. We won't
-+ * be using the DMA engine to load segments.
-+ */
-+ if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0) {
-+ ahd_outb(ahd, CCSGCTL, 0);
-+ ahd_outb(ahd, SG_STATE, LOADING_NEEDED);
-+ }
-+
-+ /*
-+ * Wait for the DMA engine to notice that the
-+ * host transfer is enabled and that there is
-+ * space in the S/G FIFO for new segments before
-+ * loading more segments.
-+ */
-+ if ((ahd_inb(ahd, DFSTATUS) & PRELOAD_AVAIL) != 0
-+ && (ahd_inb(ahd, DFCNTRL) & HDMAENACK) != 0) {
-+
-+ /*
-+ * Determine the offset of the next S/G
-+ * element to load.
-+ */
-+ sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
-+ sgptr &= SG_PTR_MASK;
-+ if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
-+ struct ahd_dma64_seg *sg;
-+
-+ sg = ahd_sg_bus_to_virt(ahd, scb, sgptr);
-+ data_addr = sg->addr;
-+ data_len = sg->len;
-+ sgptr += sizeof(*sg);
-+ } else {
-+ struct ahd_dma_seg *sg;
-+
-+ sg = ahd_sg_bus_to_virt(ahd, scb, sgptr);
-+ data_addr = sg->len & AHD_SG_HIGH_ADDR_MASK;
-+ data_addr <<= 8;
-+ data_addr |= sg->addr;
-+ data_len = sg->len;
-+ sgptr += sizeof(*sg);
-+ }
-+
-+ /*
-+ * Update residual information.
-+ */
-+ ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, data_len >> 24);
-+ ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
-+
-+ /*
-+ * Load the S/G.
-+ */
-+ if (data_len & AHD_DMA_LAST_SEG) {
-+ sgptr |= LAST_SEG;
-+ ahd_outb(ahd, SG_STATE, 0);
-+ }
-+ ahd_outq(ahd, HADDR, data_addr);
-+ ahd_outl(ahd, HCNT, data_len & AHD_SG_LEN_MASK);
-+ ahd_outb(ahd, SG_CACHE_PRE, sgptr & 0xFF);
-+
-+ /*
-+ * Advertise the segment to the hardware.
-+ */
-+ dfcntrl = ahd_inb(ahd, DFCNTRL)|PRELOADEN|HDMAEN;
-+ if ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0) {
-+ /*
-+ * Use SCSIENWRDIS so that SCSIEN
-+ * is never modified by this
-+ * operation.
-+ */
-+ dfcntrl |= SCSIENWRDIS;
-+ }
-+ ahd_outb(ahd, DFCNTRL, dfcntrl);
-+ }
-+ } else if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG_DONE) != 0) {
-+
-+ /*
-+ * Transfer completed to the end of SG list
-+ * and has flushed to the host.
-+ */
-+ ahd_outb(ahd, SCB_SGPTR,
-+ ahd_inb_scbram(ahd, SCB_SGPTR) | SG_LIST_NULL);
-+ goto clrchn;
-+ } else if ((ahd_inb(ahd, DFSTATUS) & FIFOEMP) != 0) {
-+clrchn:
-+ /*
-+ * Clear any handler for this FIFO, decrement
-+ * the FIFO use count for the SCB, and release
-+ * the FIFO.
-+ */
-+ ahd_outb(ahd, LONGJMP_ADDR + 1, INVALID_ADDR);
-+ ahd_outb(ahd, SCB_FIFO_USE_COUNT,
-+ ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) - 1);
-+ ahd_outb(ahd, DFFSXFRCTL, CLRCHN);
-+ }
-+}
-+
- void
- ahd_run_qoutfifo(struct ahd_softc *ahd)
- {
-@@ -476,7 +810,7 @@ ahd_run_qoutfifo(struct ahd_softc *ahd)
- while ((ahd->qoutfifo[ahd->qoutfifonext]
- & QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) {
-
-- scb_index = ahd_le16toh(ahd->qoutfifo[ahd->qoutfifonext]
-+ scb_index = aic_le16toh(ahd->qoutfifo[ahd->qoutfifonext]
- & ~QOUTFIFO_ENTRY_VALID_LE);
- scb = ahd_lookup_scb(ahd, scb_index);
- if (scb == NULL) {
-@@ -556,26 +890,6 @@ ahd_handle_seqint(struct ahd_softc *ahd,
- ahd_name(ahd), seqintcode);
- #endif
- switch (seqintcode) {
-- case BAD_SCB_STATUS:
-- {
-- struct scb *scb;
-- u_int scbid;
-- int cmds_pending;
--
-- scbid = ahd_get_scbptr(ahd);
-- scb = ahd_lookup_scb(ahd, scbid);
-- if (scb != NULL) {
-- ahd_complete_scb(ahd, scb);
-- } else {
-- printf("%s: WARNING no command for scb %d "
-- "(bad status)\n", ahd_name(ahd), scbid);
-- ahd_dump_card_state(ahd);
-- }
-- cmds_pending = ahd_inw(ahd, CMDS_PENDING);
-- if (cmds_pending > 0)
-- ahd_outw(ahd, CMDS_PENDING, cmds_pending - 1);
-- break;
-- }
- case ENTERING_NONPACK:
- {
- struct scb *scb;
-@@ -589,7 +903,7 @@ ahd_handle_seqint(struct ahd_softc *ahd,
- /*
- * Somehow need to know if this
- * is from a selection or reselection.
-- * From that, we can termine target
-+ * From that, we can determine target
- * ID so we at least have an I_T nexus.
- */
- } else {
-@@ -740,11 +1054,11 @@ ahd_handle_seqint(struct ahd_softc *ahd,
- ahd_outb(ahd, SAVED_LUN, 0);
- ahd_outb(ahd, SEQ_FLAGS, 0);
- ahd_assert_atn(ahd);
-- scb->flags &= ~(SCB_PACKETIZED);
-+ scb->flags &= ~SCB_PACKETIZED;
- scb->flags |= SCB_ABORT|SCB_CMDPHASE_ABORT;
- ahd_freeze_devq(ahd, scb);
-- ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
-- ahd_freeze_scb(scb);
-+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
-+ aic_freeze_scb(scb);
-
- /*
- * Allow the sequencer to continue with
-@@ -796,7 +1110,8 @@ ahd_handle_seqint(struct ahd_softc *ahd,
- * attempt to complete this bogus SCB.
- */
- ahd_outb(ahd, SCB_CONTROL,
-- ahd_inb(ahd, SCB_CONTROL) & ~STATUS_RCVD);
-+ ahd_inb_scbram(ahd, SCB_CONTROL)
-+ & ~STATUS_RCVD);
- }
- break;
- }
-@@ -991,7 +1306,7 @@ ahd_handle_seqint(struct ahd_softc *ahd,
- "NumSGs = %d.\n",
- ahd_inb(ahd, SEQ_FLAGS) & DPHASE
- ? "Have" : "Haven't",
-- ahd_get_transfer_length(scb), scb->sg_count);
-+ aic_get_transfer_length(scb), scb->sg_count);
- ahd_dump_sglist(scb);
- }
- #endif
-@@ -1001,8 +1316,8 @@ ahd_handle_seqint(struct ahd_softc *ahd,
- * target does a command complete.
- */
- ahd_freeze_devq(ahd, scb);
-- ahd_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-- ahd_freeze_scb(scb);
-+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-+ aic_freeze_scb(scb);
- break;
- }
- case MKMSG_FAILED:
-@@ -1029,7 +1344,7 @@ ahd_handle_seqint(struct ahd_softc *ahd,
- ROLE_INITIATOR, /*status*/0,
- SEARCH_REMOVE);
- ahd_outb(ahd, SCB_CONTROL,
-- ahd_inb(ahd, SCB_CONTROL) & ~MK_MESSAGE);
-+ ahd_inb_scbram(ahd, SCB_CONTROL) & ~MK_MESSAGE);
- break;
- }
- case TASKMGMT_FUNC_COMPLETE:
-@@ -1263,7 +1578,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd
- */
- ahd_scb_devinfo(ahd, &devinfo, scb);
- ahd_force_renegotiation(ahd, &devinfo);
-- ahd_set_transaction_status(scb, CAM_SEL_TIMEOUT);
-+ aic_set_transaction_status(scb, CAM_SEL_TIMEOUT);
- ahd_freeze_devq(ahd, scb);
- }
- ahd_outb(ahd, CLRINT, CLRSCSIINT);
-@@ -1710,8 +2025,8 @@ ahd_handle_pkt_busfree(struct ahd_softc
- }
- scb->crc_retry_count++;
- } else {
-- ahd_set_transaction_status(scb, CAM_UNCOR_PARITY);
-- ahd_freeze_scb(scb);
-+ aic_set_transaction_status(scb, CAM_UNCOR_PARITY);
-+ aic_freeze_scb(scb);
- ahd_freeze_devq(ahd, scb);
- }
- /* Return unpausing the sequencer. */
-@@ -1853,7 +2168,7 @@ ahd_handle_nonpkt_busfree(struct ahd_sof
- && ahd_match_scb(ahd, scb, target, 'A',
- CAM_LUN_WILDCARD, SCB_LIST_NULL,
- ROLE_INITIATOR))
-- ahd_set_transaction_status(scb, CAM_REQ_CMP);
-+ aic_set_transaction_status(scb, CAM_REQ_CMP);
- #endif
- ahd_handle_devreset(ahd, &devinfo, CAM_LUN_WILDCARD,
- CAM_BDR_SENT, "Bus Device Reset",
-@@ -1880,21 +2195,32 @@ ahd_handle_nonpkt_busfree(struct ahd_sof
- tinfo->goal.ppr_options = 0;
- ahd_qinfifo_requeue_tail(ahd, scb);
- printerror = 0;
-- } else if ((ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE)
-- || ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE))
-+ } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_WDTR, FALSE)
- && ppr_busfree == 0) {
- /*
-- * Negotiation Rejected. Go-async and
-+ * Negotiation Rejected. Go-narrow and
- * retry command.
- */
- #ifdef AHD_DEBUG
- if ((ahd_debug & AHD_SHOW_MESSAGES) != 0)
-- printf("Negotiation rejected busfree.\n");
-+ printf("WDTR negotiation rejected busfree.\n");
- #endif
- ahd_set_width(ahd, &devinfo,
- MSG_EXT_WDTR_BUS_8_BIT,
- AHD_TRANS_CUR|AHD_TRANS_GOAL,
- /*paused*/TRUE);
-+ ahd_qinfifo_requeue_tail(ahd, scb);
-+ printerror = 0;
-+ } else if (ahd_sent_msg(ahd, AHDMSG_EXT, MSG_EXT_SDTR, FALSE)
-+ && ppr_busfree == 0) {
-+ /*
-+ * Negotiation Rejected. Go-async and
-+ * retry command.
-+ */
-+#ifdef AHD_DEBUG
-+ if ((ahd_debug & AHD_SHOW_MESSAGES) != 0)
-+ printf("SDTR negotiation rejected busfree.\n");
-+#endif
- ahd_set_syncrate(ahd, &devinfo,
- /*period*/0, /*offset*/0,
- /*ppr_options*/0,
-@@ -1933,8 +2259,8 @@ ahd_handle_nonpkt_busfree(struct ahd_sof
- && ((ahd->msg_flags & MSG_FLAG_EXPECT_PPR_BUSFREE) != 0)) {
-
- ahd_freeze_devq(ahd, scb);
-- ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
-- ahd_freeze_scb(scb);
-+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
-+ aic_freeze_scb(scb);
- if ((ahd->msg_flags & MSG_FLAG_IU_REQ_CHANGED) != 0) {
- ahd_abort_scbs(ahd, SCB_GET_TARGET(ahd, scb),
- SCB_GET_CHANNEL(ahd, scb),
-@@ -1978,8 +2304,7 @@ ahd_handle_nonpkt_busfree(struct ahd_sof
- "PRGMCNT == 0x%x\n",
- ahd_lookup_phase_entry(lastphase)->phasemsg,
- aborted,
-- ahd_inb(ahd, PRGMCNT)
-- | (ahd_inb(ahd, PRGMCNT+1) << 8));
-+ ahd_inw(ahd, PRGMCNT));
- ahd_dump_card_state(ahd);
- }
- /* Always restart the sequencer. */
-@@ -2023,7 +2348,7 @@ ahd_handle_proto_violation(struct ahd_so
- printf("No SCB found during protocol violation\n");
- goto proto_violation_reset;
- } else {
-- ahd_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
-+ aic_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
- if ((seq_flags & NO_CDB_SENT) != 0) {
- ahd_print_path(ahd, scb);
- printf("No or incomplete CDB sent to device.\n");
-@@ -2142,8 +2467,7 @@ ahd_clear_critical_section(struct ahd_so
- u_int i;
-
- ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-- seqaddr = ahd_inb(ahd, CURADDR)
-- | (ahd_inb(ahd, CURADDR+1) << 8);
-+ seqaddr = ahd_inw(ahd, CURADDR);
-
- cs = ahd->critical_sections;
- for (i = 0; i < ahd->num_critical_sections; i++, cs++) {
-@@ -2187,8 +2511,14 @@ ahd_clear_critical_section(struct ahd_so
- ahd_outb(ahd, LQOMODE0, 0);
- ahd_outb(ahd, LQOMODE1, 0);
- ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-- simode1 = ahd_inb(ahd, SIMODE1);
-- ahd_outb(ahd, SIMODE1, ENBUSFREE);
-+ simode1 = ahd_inb(ahd, SIMODE1);
-+ /*
-+ * We don't clear ENBUSFREE. Unfortunately
-+ * we cannot re-enable busfree detection within
-+ * the current connection, so we must leave it
-+ * on while single stepping.
-+ */
-+ ahd_outb(ahd, SIMODE1, simode1 & ENBUSFREE);
- ahd_outb(ahd, SEQCTL0, ahd_inb(ahd, SEQCTL0) | STEP);
- stepping = TRUE;
- }
-@@ -2196,9 +2526,8 @@ ahd_clear_critical_section(struct ahd_so
- ahd_outb(ahd, CLRINT, CLRSCSIINT);
- ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
- ahd_outb(ahd, HCNTRL, ahd->unpause);
-- do {
-- ahd_delay(200);
-- } while (!ahd_is_paused(ahd));
-+ while (!ahd_is_paused(ahd))
-+ aic_delay(200);
- ahd_update_modes(ahd);
- }
- if (stepping) {
-@@ -2274,10 +2603,10 @@ ahd_print_scb(struct scb *scb)
- for (i = 0; i < sizeof(hscb->shared_data.idata.cdb); i++)
- printf("%#02x", hscb->shared_data.idata.cdb[i]);
- printf(" dataptr:%#x%x datacnt:%#x sgptr:%#x tag:%#x\n",
-- (uint32_t)((ahd_le64toh(hscb->dataptr) >> 32) & 0xFFFFFFFF),
-- (uint32_t)(ahd_le64toh(hscb->dataptr) & 0xFFFFFFFF),
-- ahd_le32toh(hscb->datacnt),
-- ahd_le32toh(hscb->sgptr),
-+ (uint32_t)((aic_le64toh(hscb->dataptr) >> 32) & 0xFFFFFFFF),
-+ (uint32_t)(aic_le64toh(hscb->dataptr) & 0xFFFFFFFF),
-+ aic_le32toh(hscb->datacnt),
-+ aic_le32toh(hscb->sgptr),
- SCB_GET_TAG(scb));
- ahd_dump_sglist(scb);
- }
-@@ -2296,8 +2625,8 @@ ahd_dump_sglist(struct scb *scb)
- uint64_t addr;
- uint32_t len;
-
-- addr = ahd_le64toh(sg_list[i].addr);
-- len = ahd_le32toh(sg_list[i].len);
-+ addr = aic_le64toh(sg_list[i].addr);
-+ len = aic_le32toh(sg_list[i].len);
- printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
- i,
- (uint32_t)((addr >> 32) & 0xFFFFFFFF),
-@@ -2313,11 +2642,11 @@ ahd_dump_sglist(struct scb *scb)
- for (i = 0; i < scb->sg_count; i++) {
- uint32_t len;
-
-- len = ahd_le32toh(sg_list[i].len);
-+ len = aic_le32toh(sg_list[i].len);
- printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
- i,
-- (len >> 24) & SG_HIGH_ADDR_BITS,
-- ahd_le32toh(sg_list[i].addr),
-+ (len & AHD_SG_HIGH_ADDR_MASK) >> 24,
-+ aic_le32toh(sg_list[i].addr),
- len & AHD_SG_LEN_MASK,
- len & AHD_DMA_LAST_SEG ? " Last" : "");
- }
-@@ -2859,14 +3188,25 @@ ahd_update_neg_table(struct ahd_softc *a
- iocell_opts[AHD_PRECOMP_SLEW_INDEX] &= ~AHD_PRECOMP_MASK;
-
- if ((ahd->features & AHD_NEW_IOCELL_OPTS) != 0
-- && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0) {
-+ && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0
-+ && (ppr_opts & MSG_EXT_PPR_IU_REQ) == 0) {
- /*
- * Slow down our CRC interval to be
-- * compatible with devices that can't
-- * handle a CRC at full speed.
-+ * compatible with non-packetized
-+ * U160 devices that can't handle a
-+ * CRC at full speed.
- */
- con_opts |= ENSLOWCRC;
- }
-+
-+ if ((ahd->bugs & AHD_PACED_NEGTABLE_BUG) != 0) {
-+ /*
-+ * On H2A4, revert to a slower slewrate
-+ * on non-paced transfers.
-+ */
-+ iocell_opts[AHD_PRECOMP_SLEW_INDEX] &=
-+ ~AHD_SLEWRATE_MASK;
-+ }
- }
-
- ahd_outb(ahd, ANNEXCOL, AHD_ANNEXCOL_PRECOMP_SLEW);
-@@ -2904,7 +3244,7 @@ ahd_update_pending_scbs(struct ahd_softc
- {
- struct scb *pending_scb;
- int pending_scb_count;
-- int i;
-+ u_int scb_tag;
- int paused;
- u_int saved_scbptr;
- ahd_mode_state saved_modes;
-@@ -2962,17 +3302,14 @@ ahd_update_pending_scbs(struct ahd_softc
- ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO);
- saved_scbptr = ahd_get_scbptr(ahd);
- /* Ensure that the hscbs down on the card match the new information */
-- for (i = 0; i < ahd->scb_data.maxhscbs; i++) {
-+ for (scb_tag = 0; scb_tag < ahd->scb_data.maxhscbs; scb_tag++) {
- struct hardware_scb *pending_hscb;
- u_int control;
-- u_int scb_tag;
-
-- ahd_set_scbptr(ahd, i);
-- scb_tag = i;
- pending_scb = ahd_lookup_scb(ahd, scb_tag);
- if (pending_scb == NULL)
- continue;
--
-+ ahd_set_scbptr(ahd, scb_tag);
- pending_hscb = pending_scb->hscb;
- control = ahd_inb_scbram(ahd, SCB_CONTROL);
- control &= ~MK_MESSAGE;
-@@ -3187,7 +3524,7 @@ ahd_setup_initiator_msgout(struct ahd_so
- devinfo->target_mask);
- panic("SCB = %d, SCB Control = %x:%x, MSG_OUT = %x "
- "SCB flags = %x", SCB_GET_TAG(scb), scb->hscb->control,
-- ahd_inb(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT),
-+ ahd_inb_scbram(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT),
- scb->flags);
- }
-
-@@ -3232,6 +3569,7 @@ ahd_build_transfer_msg(struct ahd_softc
- * may change.
- */
- period = tinfo->goal.period;
-+ offset = tinfo->goal.offset;
- ppr_options = tinfo->goal.ppr_options;
- /* Target initiated PPR is not allowed in the SCSI spec */
- if (devinfo->role == ROLE_TARGET)
-@@ -3239,7 +3577,7 @@ ahd_build_transfer_msg(struct ahd_softc
- ahd_devlimited_syncrate(ahd, tinfo, &period,
- &ppr_options, devinfo->role);
- dowide = tinfo->curr.width != tinfo->goal.width;
-- dosync = tinfo->curr.period != period;
-+ dosync = tinfo->curr.offset != offset || tinfo->curr.period != period;
- /*
- * Only use PPR if we have options that need it, even if the device
- * claims to support it. There might be an expander in the way
-@@ -3249,7 +3587,7 @@ ahd_build_transfer_msg(struct ahd_softc
-
- if (!dowide && !dosync && !doppr) {
- dowide = tinfo->goal.width != MSG_EXT_WDTR_BUS_8_BIT;
-- dosync = tinfo->goal.period != 0;
-+ dosync = tinfo->goal.offset != 0;
- }
-
- if (!dowide && !dosync && !doppr) {
-@@ -3725,8 +4063,13 @@ reswitch:
- if ((ahd->msg_flags & MSG_FLAG_PACKETIZED) != 0) {
- printf("%s: Returning to Idle Loop\n",
- ahd_name(ahd));
-- ahd_outb(ahd, LASTPHASE, P_BUSFREE);
- ahd_clear_msg_state(ahd);
-+
-+ /*
-+ * Perform the equivalent of a clear_target_state.
-+ */
-+ ahd_outb(ahd, LASTPHASE, P_BUSFREE);
-+ ahd_outb(ahd, SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT);
- ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
- } else {
- ahd_clear_msg_state(ahd);
-@@ -3983,22 +4326,30 @@ ahd_parse_msg(struct ahd_softc *ahd, str
- response = TRUE;
- sending_reply = TRUE;
- }
-+ /*
-+ * After a wide message, we are async, but
-+ * some devices don't seem to honor this portion
-+ * of the spec. Force a renegotiation of the
-+ * sync component of our transfer agreement even
-+ * if our goal is async. By updating our width
-+ * after forcing the negotiation, we avoid
-+ * renegotiating for width.
-+ */
-+ ahd_update_neg_request(ahd, devinfo, tstate,
-+ tinfo, AHD_NEG_ALWAYS);
- ahd_set_width(ahd, devinfo, bus_width,
- AHD_TRANS_ACTIVE|AHD_TRANS_GOAL,
- /*paused*/TRUE);
-- /* After a wide message, we are async */
-- ahd_set_syncrate(ahd, devinfo, /*period*/0,
-- /*offset*/0, /*ppr_options*/0,
-- AHD_TRANS_ACTIVE, /*paused*/TRUE);
- if (sending_reply == FALSE && reject == FALSE) {
-
-- if (tinfo->goal.offset) {
-- ahd->msgout_index = 0;
-- ahd->msgout_len = 0;
-- ahd_build_transfer_msg(ahd, devinfo);
-- ahd->msgout_index = 0;
-- response = TRUE;
-- }
-+ /*
-+ * We will always have an SDTR to send.
-+ */
-+ ahd->msgout_index = 0;
-+ ahd->msgout_len = 0;
-+ ahd_build_transfer_msg(ahd, devinfo);
-+ ahd->msgout_index = 0;
-+ response = TRUE;
- }
- done = MSGLOOP_MSGCOMPLETE;
- break;
-@@ -4326,7 +4677,7 @@ ahd_handle_msg_reject(struct ahd_softc *
- ahd_outb(ahd, SCB_CONTROL,
- ahd_inb_scbram(ahd, SCB_CONTROL) & mask);
- scb->hscb->control &= mask;
-- ahd_set_transaction_tag(scb, /*enabled*/FALSE,
-+ aic_set_transaction_tag(scb, /*enabled*/FALSE,
- /*type*/MSG_SIMPLE_TASK);
- ahd_outb(ahd, MSG_OUT, MSG_IDENTIFYFLAG);
- ahd_assert_atn(ahd);
-@@ -4384,7 +4735,7 @@ ahd_handle_ign_wide_residue(struct ahd_s
- * Perhaps add datadir to some spare bits in the hscb?
- */
- if ((ahd_inb(ahd, SEQ_FLAGS) & DPHASE) == 0
-- || ahd_get_transfer_dir(scb) != CAM_DIR_IN) {
-+ || aic_get_transfer_dir(scb) != CAM_DIR_IN) {
- /*
- * Ignore the message if we haven't
- * seen an appropriate data phase yet.
-@@ -4401,7 +4752,8 @@ ahd_handle_ign_wide_residue(struct ahd_s
-
- sgptr = ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR);
- if ((sgptr & SG_LIST_NULL) != 0
-- && (ahd_inb(ahd, SCB_TASK_ATTRIBUTE) & SCB_XFERLEN_ODD) != 0) {
-+ && (ahd_inb_scbram(ahd, SCB_TASK_ATTRIBUTE)
-+ & SCB_XFERLEN_ODD) != 0) {
- /*
- * If the residual occurred on the last
- * transfer and the transfer request was
-@@ -4438,18 +4790,18 @@ ahd_handle_ign_wide_residue(struct ahd_s
- * to load so we must go back one.
- */
- sg--;
-- sglen = ahd_le32toh(sg->len) & AHD_SG_LEN_MASK;
-+ sglen = aic_le32toh(sg->len) & AHD_SG_LEN_MASK;
- if (sg != scb->sg_list
- && sglen < (data_cnt & AHD_SG_LEN_MASK)) {
-
- sg--;
-- sglen = ahd_le32toh(sg->len);
-+ sglen = aic_le32toh(sg->len);
- /*
- * Preserve High Address and SG_LIST
- * bits while setting the count to 1.
- */
- data_cnt = 1|(sglen&(~AHD_SG_LEN_MASK));
-- data_addr = ahd_le64toh(sg->addr)
-+ data_addr = aic_le64toh(sg->addr)
- + (sglen & AHD_SG_LEN_MASK)
- - 1;
-
-@@ -4471,18 +4823,18 @@ ahd_handle_ign_wide_residue(struct ahd_s
- * to load so we must go back one.
- */
- sg--;
-- sglen = ahd_le32toh(sg->len) & AHD_SG_LEN_MASK;
-+ sglen = aic_le32toh(sg->len) & AHD_SG_LEN_MASK;
- if (sg != scb->sg_list
- && sglen < (data_cnt & AHD_SG_LEN_MASK)) {
-
- sg--;
-- sglen = ahd_le32toh(sg->len);
-+ sglen = aic_le32toh(sg->len);
- /*
- * Preserve High Address and SG_LIST
- * bits while setting the count to 1.
- */
- data_cnt = 1|(sglen&(~AHD_SG_LEN_MASK));
-- data_addr = ahd_le32toh(sg->addr)
-+ data_addr = aic_le32toh(sg->addr)
- + (sglen & AHD_SG_LEN_MASK)
- - 1;
-
-@@ -4502,7 +4854,8 @@ ahd_handle_ign_wide_residue(struct ahd_s
- * correct for subsequent data transfers.
- */
- ahd_outb(ahd, SCB_TASK_ATTRIBUTE,
-- ahd_inb(ahd, SCB_TASK_ATTRIBUTE) ^ SCB_XFERLEN_ODD);
-+ ahd_inb_scbram(ahd, SCB_TASK_ATTRIBUTE)
-+ ^ SCB_XFERLEN_ODD);
-
- ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
- ahd_outl(ahd, SCB_RESIDUAL_DATACNT, data_cnt);
-@@ -4542,9 +4895,8 @@ ahd_reinitialize_dataptrs(struct ahd_sof
- */
- ahd_outb(ahd, DFFSXFRCTL, CLRCHN);
- wait = 1000;
-- do {
-- ahd_delay(100);
-- } while (--wait && !(ahd_inb(ahd, MDFFSTAT) & FIFOFREE));
-+ while (--wait && !(ahd_inb(ahd, MDFFSTAT) & FIFOFREE))
-+ aic_delay(100);
- if (wait == 0) {
- ahd_print_path(ahd, scb);
- printf("ahd_reinitialize_dataptrs: Forcing FIFO free.\n");
-@@ -4560,10 +4912,7 @@ ahd_reinitialize_dataptrs(struct ahd_sof
- * Determine initial values for data_addr and data_cnt
- * for resuming the data phase.
- */
-- sgptr = (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 3) << 24)
-- | (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 2) << 16)
-- | (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 1) << 8)
-- | ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR);
-+ sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
- sgptr &= SG_PTR_MASK;
-
- resid = (ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT + 2) << 16)
-@@ -4578,13 +4927,10 @@ ahd_reinitialize_dataptrs(struct ahd_sof
- /* The residual sg_ptr always points to the next sg */
- sg--;
-
-- dataptr = ahd_le64toh(sg->addr)
-- + (ahd_le32toh(sg->len) & AHD_SG_LEN_MASK)
-+ dataptr = aic_le64toh(sg->addr)
-+ + (aic_le32toh(sg->len) & AHD_SG_LEN_MASK)
- - resid;
-- ahd_outb(ahd, HADDR + 7, dataptr >> 56);
-- ahd_outb(ahd, HADDR + 6, dataptr >> 48);
-- ahd_outb(ahd, HADDR + 5, dataptr >> 40);
-- ahd_outb(ahd, HADDR + 4, dataptr >> 32);
-+ ahd_outl(ahd, HADDR + 4, dataptr >> 32);
- } else {
- struct ahd_dma_seg *sg;
-
-@@ -4593,16 +4939,13 @@ ahd_reinitialize_dataptrs(struct ahd_sof
- /* The residual sg_ptr always points to the next sg */
- sg--;
-
-- dataptr = ahd_le32toh(sg->addr)
-- + (ahd_le32toh(sg->len) & AHD_SG_LEN_MASK)
-+ dataptr = aic_le32toh(sg->addr)
-+ + (aic_le32toh(sg->len) & AHD_SG_LEN_MASK)
- - resid;
- ahd_outb(ahd, HADDR + 4,
-- (ahd_le32toh(sg->len) & ~AHD_SG_LEN_MASK) >> 24);
-+ (aic_le32toh(sg->len) & ~AHD_SG_LEN_MASK) >> 24);
- }
-- ahd_outb(ahd, HADDR + 3, dataptr >> 24);
-- ahd_outb(ahd, HADDR + 2, dataptr >> 16);
-- ahd_outb(ahd, HADDR + 1, dataptr >> 8);
-- ahd_outb(ahd, HADDR, dataptr);
-+ ahd_outl(ahd, HADDR, dataptr);
- ahd_outb(ahd, HCNT + 2, resid >> 16);
- ahd_outb(ahd, HCNT + 1, resid >> 8);
- ahd_outb(ahd, HCNT, resid);
-@@ -4796,8 +5139,8 @@ ahd_alloc(void *platform_arg, char *name
- ahd->bugs = AHD_BUGNONE;
- ahd->flags = AHD_SPCHK_ENB_A|AHD_RESET_BUS_A|AHD_TERM_ENB_A
- | AHD_EXTENDED_TRANS_A|AHD_STPWLEVEL_A;
-- ahd_timer_init(&ahd->reset_timer);
-- ahd_timer_init(&ahd->stat_timer);
-+ aic_timer_init(&ahd->reset_timer);
-+ aic_timer_init(&ahd->stat_timer);
- ahd->int_coalescing_timer = AHD_INT_COALESCING_TIMER_DEFAULT;
- ahd->int_coalescing_maxcmds = AHD_INT_COALESCING_MAXCMDS_DEFAULT;
- ahd->int_coalescing_mincmds = AHD_INT_COALESCING_MINCMDS_DEFAULT;
-@@ -4833,24 +5176,24 @@ ahd_softc_insert(struct ahd_softc *ahd)
- {
- struct ahd_softc *list_ahd;
-
--#if AHD_PCI_CONFIG > 0
-+#if AIC_PCI_CONFIG > 0
- /*
- * Second Function PCI devices need to inherit some
- * settings from function 0.
- */
- if ((ahd->features & AHD_MULTI_FUNC) != 0) {
- TAILQ_FOREACH(list_ahd, &ahd_tailq, links) {
-- ahd_dev_softc_t list_pci;
-- ahd_dev_softc_t pci;
-+ aic_dev_softc_t list_pci;
-+ aic_dev_softc_t pci;
-
- list_pci = list_ahd->dev_softc;
- pci = ahd->dev_softc;
-- if (ahd_get_pci_slot(list_pci) == ahd_get_pci_slot(pci)
-- && ahd_get_pci_bus(list_pci) == ahd_get_pci_bus(pci)) {
-+ if (aic_get_pci_slot(list_pci) == aic_get_pci_slot(pci)
-+ && aic_get_pci_bus(list_pci) == aic_get_pci_bus(pci)) {
- struct ahd_softc *master;
- struct ahd_softc *slave;
-
-- if (ahd_get_pci_function(list_pci) == 0) {
-+ if (aic_get_pci_function(list_pci) == 0) {
- master = list_ahd;
- slave = ahd;
- } else {
-@@ -4915,27 +5258,27 @@ ahd_free(struct ahd_softc *ahd)
- {
- int i;
-
-+ ahd_terminate_recovery_thread(ahd);
- switch (ahd->init_level) {
- default:
- case 5:
- ahd_shutdown(ahd);
-- TAILQ_REMOVE(&ahd_tailq, ahd, links);
- /* FALLTHROUGH */
- case 4:
-- ahd_dmamap_unload(ahd, ahd->shared_data_dmat,
-- ahd->shared_data_dmamap);
-+ aic_dmamap_unload(ahd, ahd->shared_data_dmat,
-+ ahd->shared_data_map.dmamap);
- /* FALLTHROUGH */
- case 3:
-- ahd_dmamem_free(ahd, ahd->shared_data_dmat, ahd->qoutfifo,
-- ahd->shared_data_dmamap);
-- ahd_dmamap_destroy(ahd, ahd->shared_data_dmat,
-- ahd->shared_data_dmamap);
-+ aic_dmamem_free(ahd, ahd->shared_data_dmat, ahd->qoutfifo,
-+ ahd->shared_data_map.dmamap);
-+ aic_dmamap_destroy(ahd, ahd->shared_data_dmat,
-+ ahd->shared_data_map.dmamap);
- /* FALLTHROUGH */
- case 2:
-- ahd_dma_tag_destroy(ahd, ahd->shared_data_dmat);
-+ aic_dma_tag_destroy(ahd, ahd->shared_data_dmat);
- case 1:
- #ifndef __linux__
-- ahd_dma_tag_destroy(ahd, ahd->buffer_dmat);
-+ aic_dma_tag_destroy(ahd, ahd->buffer_dmat);
- #endif
- break;
- case 0:
-@@ -4943,7 +5286,7 @@ ahd_free(struct ahd_softc *ahd)
- }
-
- #ifndef __linux__
-- ahd_dma_tag_destroy(ahd, ahd->parent_dmat);
-+ aic_dma_tag_destroy(ahd, ahd->parent_dmat);
- #endif
- ahd_platform_free(ahd);
- ahd_fini_scbdata(ahd);
-@@ -4996,19 +5339,24 @@ ahd_shutdown(void *arg)
- /*
- * Stop periodic timer callbacks.
- */
-- ahd_timer_stop(&ahd->reset_timer);
-- ahd_timer_stop(&ahd->stat_timer);
-+ aic_timer_stop(&ahd->reset_timer);
-+ aic_timer_stop(&ahd->stat_timer);
-
- /* This will reset most registers to 0, but not all */
-- ahd_reset(ahd);
-+ ahd_reset(ahd, /*reinit*/FALSE);
- }
-
- /*
- * Reset the controller and record some information about it
-- * that is only available just after a reset.
-+ * that is only available just after a reset. If "reinit" is
-+ * non-zero, this reset occured after initial configuration
-+ * and the caller requests that the chip be fully reinitialized
-+ * to a runable state. Chip interrupts are *not* enabled after
-+ * a reinitialization. The caller must enable interrupts via
-+ * ahd_intr_enable().
- */
- int
--ahd_reset(struct ahd_softc *ahd)
-+ahd_reset(struct ahd_softc *ahd, int reinit)
- {
- u_int sxfrctl1;
- int wait;
-@@ -5024,7 +5372,7 @@ ahd_reset(struct ahd_softc *ahd)
- ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
- sxfrctl1 = ahd_inb(ahd, SXFRCTL1);
-
-- cmd = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
-+ cmd = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
- if ((ahd->bugs & AHD_PCIX_CHIPRST_BUG) != 0) {
- uint32_t mod_cmd;
-
-@@ -5038,7 +5386,7 @@ ahd_reset(struct ahd_softc *ahd)
- * PERR and SERR responses during the CHIPRST.
- */
- mod_cmd = cmd & ~(PCIM_CMD_PERRESPEN|PCIM_CMD_SERRESPEN);
-- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
-+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
- mod_cmd, /*bytes*/2);
- }
- ahd_outb(ahd, HCNTRL, CHIPRST | ahd->pause);
-@@ -5051,7 +5399,7 @@ ahd_reset(struct ahd_softc *ahd)
- */
- wait = 1000;
- do {
-- ahd_delay(1000);
-+ aic_delay(1000);
- } while (--wait && !(ahd_inb(ahd, HCNTRL) & CHIPRSTACK));
-
- if (wait == 0) {
-@@ -5065,9 +5413,9 @@ ahd_reset(struct ahd_softc *ahd)
- * Clear any latched PCI error status and restore
- * previous SERR and PERR response enables.
- */
-- ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
-+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
- 0xFF, /*bytes*/1);
-- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
-+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
- cmd, /*bytes*/2);
- }
-
-@@ -5101,7 +5449,7 @@ ahd_reset(struct ahd_softc *ahd)
- * If a recovery action has forced a chip reset,
- * re-initialize the chip to our liking.
- */
-- if (ahd->init_level > 0)
-+ if (reinit != 0)
- ahd_chip_init(ahd);
-
- return (0);
-@@ -5194,7 +5542,7 @@ ahd_init_scbdata(struct ahd_softc *ahd)
- */
-
- /* DMA tag for our hardware scb structures */
-- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -5208,7 +5556,7 @@ ahd_init_scbdata(struct ahd_softc *ahd)
- scb_data->init_level++;
-
- /* DMA tag for our S/G structures. */
-- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/8,
-+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/8,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -5227,7 +5575,7 @@ ahd_init_scbdata(struct ahd_softc *ahd)
- scb_data->init_level++;
-
- /* DMA tag for our sense buffers. We allocate in page sized chunks */
-- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -5315,13 +5663,13 @@ ahd_fini_scbdata(struct ahd_softc *ahd)
-
- while ((sns_map = SLIST_FIRST(&scb_data->sense_maps)) != NULL) {
- SLIST_REMOVE_HEAD(&scb_data->sense_maps, links);
-- ahd_dmamap_unload(ahd, scb_data->sense_dmat,
-+ aic_dmamap_unload(ahd, scb_data->sense_dmat,
- sns_map->dmamap);
-- ahd_dmamem_free(ahd, scb_data->sense_dmat,
-+ aic_dmamem_free(ahd, scb_data->sense_dmat,
- sns_map->vaddr, sns_map->dmamap);
- free(sns_map, M_DEVBUF);
- }
-- ahd_dma_tag_destroy(ahd, scb_data->sense_dmat);
-+ aic_dma_tag_destroy(ahd, scb_data->sense_dmat);
- /* FALLTHROUGH */
- }
- case 6:
-@@ -5330,13 +5678,13 @@ ahd_fini_scbdata(struct ahd_softc *ahd)
-
- while ((sg_map = SLIST_FIRST(&scb_data->sg_maps)) != NULL) {
- SLIST_REMOVE_HEAD(&scb_data->sg_maps, links);
-- ahd_dmamap_unload(ahd, scb_data->sg_dmat,
-+ aic_dmamap_unload(ahd, scb_data->sg_dmat,
- sg_map->dmamap);
-- ahd_dmamem_free(ahd, scb_data->sg_dmat,
-+ aic_dmamem_free(ahd, scb_data->sg_dmat,
- sg_map->vaddr, sg_map->dmamap);
- free(sg_map, M_DEVBUF);
- }
-- ahd_dma_tag_destroy(ahd, scb_data->sg_dmat);
-+ aic_dma_tag_destroy(ahd, scb_data->sg_dmat);
- /* FALLTHROUGH */
- }
- case 5:
-@@ -5345,13 +5693,13 @@ ahd_fini_scbdata(struct ahd_softc *ahd)
-
- while ((hscb_map = SLIST_FIRST(&scb_data->hscb_maps)) != NULL) {
- SLIST_REMOVE_HEAD(&scb_data->hscb_maps, links);
-- ahd_dmamap_unload(ahd, scb_data->hscb_dmat,
-+ aic_dmamap_unload(ahd, scb_data->hscb_dmat,
- hscb_map->dmamap);
-- ahd_dmamem_free(ahd, scb_data->hscb_dmat,
-+ aic_dmamem_free(ahd, scb_data->hscb_dmat,
- hscb_map->vaddr, hscb_map->dmamap);
- free(hscb_map, M_DEVBUF);
- }
-- ahd_dma_tag_destroy(ahd, scb_data->hscb_dmat);
-+ aic_dma_tag_destroy(ahd, scb_data->hscb_dmat);
- /* FALLTHROUGH */
- }
- case 4:
-@@ -5382,6 +5730,7 @@ ahd_setup_iocell_workaround(struct ahd_s
- printf("%s: Setting up iocell workaround\n", ahd_name(ahd));
- #endif
- ahd_restore_modes(ahd, saved_modes);
-+ ahd->flags &= ~AHD_HAD_FIRST_SEL;
- }
-
- static void
-@@ -5390,6 +5739,8 @@ ahd_iocell_first_selection(struct ahd_so
- ahd_mode_state saved_modes;
- u_int sblkctl;
-
-+ if ((ahd->flags & AHD_HAD_FIRST_SEL) != 0)
-+ return;
- saved_modes = ahd_save_modes(ahd);
- ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
- sblkctl = ahd_inb(ahd, SBLKCTL);
-@@ -5409,6 +5760,7 @@ ahd_iocell_first_selection(struct ahd_so
- ahd_outb(ahd, SIMODE0, ahd_inb(ahd, SIMODE0) & ~(ENSELDO|ENSELDI));
- ahd_outb(ahd, CLRINT, CLRSCSIINT);
- ahd_restore_modes(ahd, saved_modes);
-+ ahd->flags |= AHD_HAD_FIRST_SEL;
- }
-
- /*************************** SCB Management ***********************************/
-@@ -5552,7 +5904,7 @@ ahd_free_scb(struct ahd_softc *ahd, stru
- scb, links.le);
- }
-
-- ahd_platform_scb_free(ahd, scb);
-+ aic_platform_scb_free(ahd, scb);
- }
-
- void
-@@ -5583,7 +5935,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- offset = (PAGE_SIZE / sizeof(*hscb)) - scb_data->scbs_left;
- hscb_map = SLIST_FIRST(&scb_data->hscb_maps);
- hscb = &((struct hardware_scb *)hscb_map->vaddr)[offset];
-- hscb_busaddr = hscb_map->physaddr + (offset * sizeof(*hscb));
-+ hscb_busaddr = hscb_map->busaddr + (offset * sizeof(*hscb));
- } else {
- hscb_map = malloc(sizeof(*hscb_map), M_DEVBUF, M_NOWAIT);
-
-@@ -5591,7 +5943,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- return;
-
- /* Allocate the next batch of hardware SCBs */
-- if (ahd_dmamem_alloc(ahd, scb_data->hscb_dmat,
-+ if (aic_dmamem_alloc(ahd, scb_data->hscb_dmat,
- (void **)&hscb_map->vaddr,
- BUS_DMA_NOWAIT, &hscb_map->dmamap) != 0) {
- free(hscb_map, M_DEVBUF);
-@@ -5600,12 +5952,12 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
-
- SLIST_INSERT_HEAD(&scb_data->hscb_maps, hscb_map, links);
-
-- ahd_dmamap_load(ahd, scb_data->hscb_dmat, hscb_map->dmamap,
-+ aic_dmamap_load(ahd, scb_data->hscb_dmat, hscb_map->dmamap,
- hscb_map->vaddr, PAGE_SIZE, ahd_dmamap_cb,
-- &hscb_map->physaddr, /*flags*/0);
-+ &hscb_map->busaddr, /*flags*/0);
-
- hscb = (struct hardware_scb *)hscb_map->vaddr;
-- hscb_busaddr = hscb_map->physaddr;
-+ hscb_busaddr = hscb_map->busaddr;
- scb_data->scbs_left = PAGE_SIZE / sizeof(*hscb);
- }
-
-@@ -5616,7 +5968,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- - scb_data->sgs_left) * ahd_sglist_size(ahd);
- sg_map = SLIST_FIRST(&scb_data->sg_maps);
- segs = sg_map->vaddr + offset;
-- sg_busaddr = sg_map->physaddr + offset;
-+ sg_busaddr = sg_map->busaddr + offset;
- } else {
- sg_map = malloc(sizeof(*sg_map), M_DEVBUF, M_NOWAIT);
-
-@@ -5624,7 +5976,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- return;
-
- /* Allocate the next batch of S/G lists */
-- if (ahd_dmamem_alloc(ahd, scb_data->sg_dmat,
-+ if (aic_dmamem_alloc(ahd, scb_data->sg_dmat,
- (void **)&sg_map->vaddr,
- BUS_DMA_NOWAIT, &sg_map->dmamap) != 0) {
- free(sg_map, M_DEVBUF);
-@@ -5633,12 +5985,12 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
-
- SLIST_INSERT_HEAD(&scb_data->sg_maps, sg_map, links);
-
-- ahd_dmamap_load(ahd, scb_data->sg_dmat, sg_map->dmamap,
-+ aic_dmamap_load(ahd, scb_data->sg_dmat, sg_map->dmamap,
- sg_map->vaddr, ahd_sglist_allocsize(ahd),
-- ahd_dmamap_cb, &sg_map->physaddr, /*flags*/0);
-+ ahd_dmamap_cb, &sg_map->busaddr, /*flags*/0);
-
- segs = sg_map->vaddr;
-- sg_busaddr = sg_map->physaddr;
-+ sg_busaddr = sg_map->busaddr;
- scb_data->sgs_left =
- ahd_sglist_allocsize(ahd) / ahd_sglist_size(ahd);
- #ifdef AHD_DEBUG
-@@ -5653,7 +6005,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- offset = PAGE_SIZE - (AHD_SENSE_BUFSIZE * scb_data->sense_left);
- sense_map = SLIST_FIRST(&scb_data->sense_maps);
- sense_data = sense_map->vaddr + offset;
-- sense_busaddr = sense_map->physaddr + offset;
-+ sense_busaddr = sense_map->busaddr + offset;
- } else {
- sense_map = malloc(sizeof(*sense_map), M_DEVBUF, M_NOWAIT);
-
-@@ -5661,7 +6013,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- return;
-
- /* Allocate the next batch of sense buffers */
-- if (ahd_dmamem_alloc(ahd, scb_data->sense_dmat,
-+ if (aic_dmamem_alloc(ahd, scb_data->sense_dmat,
- (void **)&sense_map->vaddr,
- BUS_DMA_NOWAIT, &sense_map->dmamap) != 0) {
- free(sense_map, M_DEVBUF);
-@@ -5670,12 +6022,12 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
-
- SLIST_INSERT_HEAD(&scb_data->sense_maps, sense_map, links);
-
-- ahd_dmamap_load(ahd, scb_data->sense_dmat, sense_map->dmamap,
-+ aic_dmamap_load(ahd, scb_data->sense_dmat, sense_map->dmamap,
- sense_map->vaddr, PAGE_SIZE, ahd_dmamap_cb,
-- &sense_map->physaddr, /*flags*/0);
-+ &sense_map->busaddr, /*flags*/0);
-
- sense_data = sense_map->vaddr;
-- sense_busaddr = sense_map->physaddr;
-+ sense_busaddr = sense_map->busaddr;
- scb_data->sense_left = PAGE_SIZE / AHD_SENSE_BUFSIZE;
- #ifdef AHD_DEBUG
- if (ahd_debug & AHD_SHOW_MEMORY)
-@@ -5716,7 +6068,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- next_scb->sense_busaddr = sense_busaddr;
- memset(hscb, 0, sizeof(*hscb));
- next_scb->hscb = hscb;
-- hscb->hscb_busaddr = ahd_htole32(hscb_busaddr);
-+ hscb->hscb_busaddr = aic_htole32(hscb_busaddr);
-
- /*
- * The sequencer always starts with the second entry.
-@@ -5731,7 +6083,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- next_scb->ahd_softc = ahd;
- next_scb->flags = SCB_FLAG_NONE;
- #ifndef __linux__
-- error = ahd_dmamap_create(ahd, ahd->buffer_dmat, /*flags*/0,
-+ error = aic_dmamap_create(ahd, ahd->buffer_dmat, /*flags*/0,
- &next_scb->dmamap);
- if (error != 0) {
- free(next_scb, M_DEVBUF);
-@@ -5739,7 +6091,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
- break;
- }
- #endif
-- next_scb->hscb->tag = ahd_htole16(scb_data->numscbs);
-+ next_scb->hscb->tag = aic_htole16(scb_data->numscbs);
- col_tag = scb_data->numscbs ^ 0x100;
- next_scb->col_scb = ahd_find_scb_by_tag(ahd, col_tag);
- if (next_scb->col_scb != NULL)
-@@ -5799,7 +6151,6 @@ static const char *termstat_strings[] =
- int
- ahd_init(struct ahd_softc *ahd)
- {
-- uint8_t *base_vaddr;
- uint8_t *next_vaddr;
- bus_addr_t next_baddr;
- size_t driver_data_size;
-@@ -5842,7 +6193,7 @@ ahd_init(struct ahd_softc *ahd)
-
- #ifndef __linux__
- /* DMA tag for mapping buffers into device visible space. */
-- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/ahd->flags & AHD_39BIT_ADDRESSING
- ? (bus_addr_t)0x7FFFFFFFFFULL
-@@ -5873,7 +6224,7 @@ ahd_init(struct ahd_softc *ahd)
- driver_data_size += AHD_TMODE_CMDS * sizeof(struct target_cmd);
- if ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0)
- driver_data_size += PKT_OVERRUN_BUFSIZE;
-- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -5888,21 +6239,24 @@ ahd_init(struct ahd_softc *ahd)
- ahd->init_level++;
-
- /* Allocation of driver data */
-- if (ahd_dmamem_alloc(ahd, ahd->shared_data_dmat,
-- (void **)&base_vaddr,
-- BUS_DMA_NOWAIT, &ahd->shared_data_dmamap) != 0) {
-+ if (aic_dmamem_alloc(ahd, ahd->shared_data_dmat,
-+ (void **)&ahd->shared_data_map.vaddr,
-+ BUS_DMA_NOWAIT,
-+ &ahd->shared_data_map.dmamap) != 0) {
- return (ENOMEM);
- }
-
- ahd->init_level++;
-
- /* And permanently map it in */
-- ahd_dmamap_load(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap,
-- base_vaddr, driver_data_size, ahd_dmamap_cb,
-- &ahd->shared_data_busaddr, /*flags*/0);
-- ahd->qoutfifo = (uint16_t *)base_vaddr;
-+ aic_dmamap_load(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
-+ ahd->shared_data_map.vaddr, driver_data_size,
-+ ahd_dmamap_cb, &ahd->shared_data_map.busaddr,
-+ /*flags*/0);
-+ ahd->qoutfifo = (uint16_t *)ahd->shared_data_map.vaddr;
- next_vaddr = (uint8_t *)&ahd->qoutfifo[AHD_QOUT_SIZE];
-- next_baddr = ahd->shared_data_busaddr + AHD_QOUT_SIZE*sizeof(uint16_t);
-+ next_baddr = ahd->shared_data_map.busaddr
-+ + AHD_QOUT_SIZE*sizeof(uint16_t);
- if ((ahd->features & AHD_TARGETMODE) != 0) {
- ahd->targetcmds = (struct target_cmd *)next_vaddr;
- next_vaddr += AHD_TMODE_CMDS * sizeof(struct target_cmd);
-@@ -5923,7 +6277,8 @@ ahd_init(struct ahd_softc *ahd)
- * specially from the DMA safe memory chunk used for the QOUTFIFO.
- */
- ahd->next_queued_hscb = (struct hardware_scb *)next_vaddr;
-- ahd->next_queued_hscb->hscb_busaddr = ahd_htole32(next_baddr);
-+ ahd->next_queued_hscb_map = &ahd->shared_data_map;
-+ ahd->next_queued_hscb->hscb_busaddr = aic_htole32(next_baddr);
-
- ahd->init_level++;
-
-@@ -6014,7 +6369,7 @@ ahd_init(struct ahd_softc *ahd)
- }
- init_done:
- ahd_restart(ahd);
-- ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
-+ aic_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
- ahd_stat_timer, ahd);
- return (0);
- }
-@@ -6075,7 +6430,7 @@ ahd_chip_init(struct ahd_softc *ahd)
- for (wait = 10000;
- (ahd_inb(ahd, SBLKCTL) & (ENAB40|ENAB20)) == 0 && wait;
- wait--)
-- ahd_delay(100);
-+ aic_delay(100);
-
- /* Clear any false bus resets due to the transceivers settling */
- ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI);
-@@ -6174,7 +6529,7 @@ ahd_chip_init(struct ahd_softc *ahd)
- ahd_outb(ahd, LUNLEN,
- sizeof(ahd->next_queued_hscb->pkt_long_lun) - 1);
- } else {
-- ahd_outb(ahd, LUNLEN, sizeof(ahd->next_queued_hscb->lun) - 1);
-+ ahd_outb(ahd, LUNLEN, LUNLEN_SINGLE_LEVEL_LUN);
- }
- ahd_outb(ahd, CDBLIMIT, SCB_CDB_LEN_PTR - 1);
- ahd_outb(ahd, MAXCMD, 0xFF);
-@@ -6215,6 +6570,7 @@ ahd_chip_init(struct ahd_softc *ahd)
- ahd_outb(ahd, CLRSINT3, NTRAMPERR|OSRAMPERR);
- ahd_outb(ahd, CLRINT, CLRSCSIINT);
-
-+#if NEEDS_MORE_TESTING
- /*
- * Always enable abort on incoming L_Qs if this feature is
- * supported. We use this to catch invalid SCB references.
-@@ -6222,6 +6578,7 @@ ahd_chip_init(struct ahd_softc *ahd)
- if ((ahd->bugs & AHD_ABORT_LQI_BUG) == 0)
- ahd_outb(ahd, LQCTL1, ABORTPENDING);
- else
-+#endif
- ahd_outb(ahd, LQCTL1, 0);
-
- /* All of our queues are empty */
-@@ -6271,15 +6628,9 @@ ahd_chip_init(struct ahd_softc *ahd)
- /*
- * Tell the sequencer where it can find our arrays in memory.
- */
-- busaddr = ahd->shared_data_busaddr;
-- ahd_outb(ahd, SHARED_DATA_ADDR, busaddr & 0xFF);
-- ahd_outb(ahd, SHARED_DATA_ADDR + 1, (busaddr >> 8) & 0xFF);
-- ahd_outb(ahd, SHARED_DATA_ADDR + 2, (busaddr >> 16) & 0xFF);
-- ahd_outb(ahd, SHARED_DATA_ADDR + 3, (busaddr >> 24) & 0xFF);
-- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR, busaddr & 0xFF);
-- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 1, (busaddr >> 8) & 0xFF);
-- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 2, (busaddr >> 16) & 0xFF);
-- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 3, (busaddr >> 24) & 0xFF);
-+ busaddr = ahd->shared_data_map.busaddr;
-+ ahd_outl(ahd, SHARED_DATA_ADDR, busaddr);
-+ ahd_outl(ahd, QOUTFIFO_NEXT_ADDR, busaddr);
-
- /*
- * Setup the allowed SCSI Sequences based on operational mode.
-@@ -6327,11 +6678,8 @@ ahd_chip_init(struct ahd_softc *ahd)
- /*
- * Tell the sequencer which SCB will be the next one it receives.
- */
-- busaddr = ahd_le32toh(ahd->next_queued_hscb->hscb_busaddr);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
-+ busaddr = aic_le32toh(ahd->next_queued_hscb->hscb_busaddr);
-+ ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr);
-
- /*
- * Default to coalescing disabled.
-@@ -6652,6 +7000,12 @@ ahd_pause_and_flushwork(struct ahd_softc
- struct scb *waiting_scb;
-
- ahd_unpause(ahd);
-+ /*
-+ * Give the sequencer some time to service
-+ * any active selections.
-+ */
-+ aic_delay(200);
-+
- ahd_intr(ahd);
- ahd_pause(ahd);
- ahd_clear_critical_section(ahd);
-@@ -6703,141 +7057,24 @@ ahd_pause_and_flushwork(struct ahd_softc
- int
- ahd_suspend(struct ahd_softc *ahd)
- {
--#if 0
-- uint8_t *ptr;
-- int i;
-
- ahd_pause_and_flushwork(ahd);
-
-- if (LIST_FIRST(&ahd->pending_scbs) != NULL)
-- return (EBUSY);
--
--#if AHD_TARGET_MODE
-- /*
-- * XXX What about ATIOs that have not yet been serviced?
-- * Perhaps we should just refuse to be suspended if we
-- * are acting in a target role.
-- */
-- if (ahd->pending_device != NULL)
-+ if (LIST_FIRST(&ahd->pending_scbs) != NULL) {
-+ ahd_unpause(ahd);
- return (EBUSY);
--#endif
--
-- /* Save volatile registers */
-- ahd->suspend_state.channel[0].scsiseq = ahd_inb(ahd, SCSISEQ0);
-- ahd->suspend_state.channel[0].sxfrctl0 = ahd_inb(ahd, SXFRCTL0);
-- ahd->suspend_state.channel[0].sxfrctl1 = ahd_inb(ahd, SXFRCTL1);
-- ahd->suspend_state.channel[0].simode0 = ahd_inb(ahd, SIMODE0);
-- ahd->suspend_state.channel[0].simode1 = ahd_inb(ahd, SIMODE1);
-- ahd->suspend_state.channel[0].seltimer = ahd_inb(ahd, SELTIMER);
-- ahd->suspend_state.channel[0].seqctl = ahd_inb(ahd, SEQCTL0);
-- ahd->suspend_state.dscommand0 = ahd_inb(ahd, DSCOMMAND0);
-- ahd->suspend_state.dspcistatus = ahd_inb(ahd, DSPCISTATUS);
--
-- if ((ahd->features & AHD_DT) != 0) {
-- u_int sfunct;
--
-- sfunct = ahd_inb(ahd, SFUNCT) & ~ALT_MODE;
-- ahd_outb(ahd, SFUNCT, sfunct | ALT_MODE);
-- ahd->suspend_state.optionmode = ahd_inb(ahd, OPTIONMODE);
-- ahd_outb(ahd, SFUNCT, sfunct);
-- ahd->suspend_state.crccontrol1 = ahd_inb(ahd, CRCCONTROL1);
-- }
--
-- if ((ahd->features & AHD_MULTI_FUNC) != 0)
-- ahd->suspend_state.scbbaddr = ahd_inb(ahd, SCBBADDR);
--
-- if ((ahd->features & AHD_ULTRA2) != 0)
-- ahd->suspend_state.dff_thrsh = ahd_inb(ahd, DFF_THRSH);
--
-- ptr = ahd->suspend_state.scratch_ram;
-- for (i = 0; i < 64; i++)
-- *ptr++ = ahd_inb(ahd, SRAM_BASE + i);
--
-- if ((ahd->features & AHD_MORE_SRAM) != 0) {
-- for (i = 0; i < 16; i++)
-- *ptr++ = ahd_inb(ahd, TARG_OFFSET + i);
-- }
--
-- ptr = ahd->suspend_state.btt;
-- for (i = 0;i < AHD_NUM_TARGETS; i++) {
-- int j;
--
-- for (j = 0;j < AHD_NUM_LUNS_NONPKT; j++) {
-- u_int tcl;
--
-- tcl = BUILD_TCL_RAW(i, 'A', j);
-- *ptr = ahd_find_busy_tcl(ahd, tcl);
-- }
- }
- ahd_shutdown(ahd);
--#endif
- return (0);
- }
-
- int
- ahd_resume(struct ahd_softc *ahd)
- {
--#if 0
-- uint8_t *ptr;
-- int i;
--
-- ahd_reset(ahd);
--
-- ahd_build_free_scb_list(ahd);
--
-- /* Restore volatile registers */
-- ahd_outb(ahd, SCSISEQ0, ahd->suspend_state.channel[0].scsiseq);
-- ahd_outb(ahd, SXFRCTL0, ahd->suspend_state.channel[0].sxfrctl0);
-- ahd_outb(ahd, SXFRCTL1, ahd->suspend_state.channel[0].sxfrctl1);
-- ahd_outb(ahd, SIMODE0, ahd->suspend_state.channel[0].simode0);
-- ahd_outb(ahd, SIMODE1, ahd->suspend_state.channel[0].simode1);
-- ahd_outb(ahd, SELTIMER, ahd->suspend_state.channel[0].seltimer);
-- ahd_outb(ahd, SEQCTL0, ahd->suspend_state.channel[0].seqctl);
-- if ((ahd->features & AHD_ULTRA2) != 0)
-- ahd_outb(ahd, SCSIID_ULTRA2, ahd->our_id);
-- else
-- ahd_outb(ahd, SCSIID, ahd->our_id);
--
-- ahd_outb(ahd, DSCOMMAND0, ahd->suspend_state.dscommand0);
-- ahd_outb(ahd, DSPCISTATUS, ahd->suspend_state.dspcistatus);
--
-- if ((ahd->features & AHD_DT) != 0) {
-- u_int sfunct;
-
-- sfunct = ahd_inb(ahd, SFUNCT) & ~ALT_MODE;
-- ahd_outb(ahd, SFUNCT, sfunct | ALT_MODE);
-- ahd_outb(ahd, OPTIONMODE, ahd->suspend_state.optionmode);
-- ahd_outb(ahd, SFUNCT, sfunct);
-- ahd_outb(ahd, CRCCONTROL1, ahd->suspend_state.crccontrol1);
-- }
--
-- if ((ahd->features & AHD_MULTI_FUNC) != 0)
-- ahd_outb(ahd, SCBBADDR, ahd->suspend_state.scbbaddr);
--
-- if ((ahd->features & AHD_ULTRA2) != 0)
-- ahd_outb(ahd, DFF_THRSH, ahd->suspend_state.dff_thrsh);
--
-- ptr = ahd->suspend_state.scratch_ram;
-- for (i = 0; i < 64; i++)
-- ahd_outb(ahd, SRAM_BASE + i, *ptr++);
--
-- if ((ahd->features & AHD_MORE_SRAM) != 0) {
-- for (i = 0; i < 16; i++)
-- ahd_outb(ahd, TARG_OFFSET + i, *ptr++);
-- }
--
-- ptr = ahd->suspend_state.btt;
-- for (i = 0;i < AHD_NUM_TARGETS; i++) {
-- int j;
--
-- for (j = 0;j < AHD_NUM_LUNS; j++) {
-- u_int tcl;
--
-- tcl = BUILD_TCL(i << 4, j);
-- ahd_busy_tcl(ahd, tcl, *ptr);
-- }
-- }
--#endif
-+ ahd_reset(ahd, /*reinit*/TRUE);
-+ ahd_intr_enable(ahd, TRUE);
-+ ahd_restart(ahd);
- return (0);
- }
-
-@@ -6980,11 +7217,8 @@ ahd_qinfifo_requeue(struct ahd_softc *ah
- if (prev_scb == NULL) {
- uint32_t busaddr;
-
-- busaddr = ahd_le32toh(scb->hscb->hscb_busaddr);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
-+ busaddr = aic_le32toh(scb->hscb->hscb_busaddr);
-+ ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr);
- } else {
- prev_scb->hscb->next_hscb_busaddr = scb->hscb->hscb_busaddr;
- ahd_sync_scb(ahd, prev_scb,
-@@ -7090,11 +7324,8 @@ ahd_search_qinfifo(struct ahd_softc *ahd
- * for removal will be re-added to the queue as we go.
- */
- ahd->qinfifonext = qinstart;
-- busaddr = ahd_le32toh(ahd->next_queued_hscb->hscb_busaddr);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF);
-- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
-+ busaddr = aic_le32toh(ahd->next_queued_hscb->hscb_busaddr);
-+ ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr);
-
- while (qinpos != qintail) {
- scb = ahd_lookup_scb(ahd, ahd->qinfifo[qinpos]);
-@@ -7115,13 +7346,13 @@ ahd_search_qinfifo(struct ahd_softc *ahd
- cam_status ostat;
- cam_status cstat;
-
-- ostat = ahd_get_transaction_status(scb);
-+ ostat = aic_get_transaction_status(scb);
- if (ostat == CAM_REQ_INPROG)
-- ahd_set_transaction_status(scb,
-+ aic_set_transaction_status(scb,
- status);
-- cstat = ahd_get_transaction_status(scb);
-+ cstat = aic_get_transaction_status(scb);
- if (cstat != CAM_REQ_CMP)
-- ahd_freeze_scb(scb);
-+ aic_freeze_scb(scb);
- if ((scb->flags & SCB_ACTIVE) == 0)
- printf("Inactive SCB in qinfifo\n");
- ahd_done(ahd, scb);
-@@ -7257,12 +7488,12 @@ ahd_search_scb_list(struct ahd_softc *ah
- cam_status ostat;
- cam_status cstat;
-
-- ostat = ahd_get_transaction_status(scb);
-+ ostat = aic_get_transaction_status(scb);
- if (ostat == CAM_REQ_INPROG)
-- ahd_set_transaction_status(scb, status);
-- cstat = ahd_get_transaction_status(scb);
-+ aic_set_transaction_status(scb, status);
-+ cstat = aic_get_transaction_status(scb);
- if (cstat != CAM_REQ_CMP)
-- ahd_freeze_scb(scb);
-+ aic_freeze_scb(scb);
- if ((scb->flags & SCB_ACTIVE) == 0)
- printf("Inactive SCB in Waiting List\n");
- ahd_done(ahd, scb);
-@@ -7453,11 +7684,11 @@ ahd_abort_scbs(struct ahd_softc *ahd, in
- if (ahd_match_scb(ahd, scbp, target, channel, lun, tag, role)) {
- cam_status ostat;
-
-- ostat = ahd_get_transaction_status(scbp);
-+ ostat = aic_get_transaction_status(scbp);
- if (ostat == CAM_REQ_INPROG)
-- ahd_set_transaction_status(scbp, status);
-- if (ahd_get_transaction_status(scbp) != CAM_REQ_CMP)
-- ahd_freeze_scb(scbp);
-+ aic_set_transaction_status(scbp, status);
-+ if (aic_get_transaction_status(scbp) != CAM_REQ_CMP)
-+ aic_freeze_scb(scbp);
- if ((scbp->flags & SCB_ACTIVE) == 0)
- printf("Inactive SCB on pending list\n");
- ahd_done(ahd, scbp);
-@@ -7479,9 +7710,12 @@ ahd_reset_current_bus(struct ahd_softc *
- ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) & ~ENSCSIRST);
- scsiseq = ahd_inb(ahd, SCSISEQ0) & ~(ENSELO|ENARBO|SCSIRSTO);
- ahd_outb(ahd, SCSISEQ0, scsiseq | SCSIRSTO);
-- ahd_delay(AHD_BUSRESET_DELAY);
-+ ahd_flush_device_writes(ahd);
-+ aic_delay(AHD_BUSRESET_DELAY);
- /* Turn off the bus reset */
- ahd_outb(ahd, SCSISEQ0, scsiseq);
-+ ahd_flush_device_writes(ahd);
-+ aic_delay(AHD_BUSRESET_DELAY);
- if ((ahd->bugs & AHD_SCSIRST_BUG) != 0) {
- /*
- * 2A Razor #474
-@@ -7489,8 +7723,7 @@ ahd_reset_current_bus(struct ahd_softc *
- * SCSI bus resets that we initiate, so
- * we must reset the chip.
- */
-- ahd_delay(AHD_BUSRESET_DELAY);
-- ahd_reset(ahd);
-+ ahd_reset(ahd, /*reinit*/TRUE);
- ahd_intr_enable(ahd, /*enable*/TRUE);
- AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
- }
-@@ -7550,7 +7783,7 @@ ahd_reset_channel(struct ahd_softc *ahd,
- ahd_outb(ahd, DFCNTRL,
- ahd_inb(ahd, DFCNTRL) & ~(SCSIEN|HDMAEN));
- while ((ahd_inb(ahd, DFCNTRL) & HDMAENACK) != 0)
-- ahd_delay(10);
-+ aic_delay(10);
- /*
- * Set CURRFIFO to the now inactive channel.
- */
-@@ -7563,7 +7796,7 @@ ahd_reset_channel(struct ahd_softc *ahd,
- */
- ahd_clear_msg_state(ahd);
- ahd_outb(ahd, SIMODE1,
-- ahd_inb(ahd, SIMODE1) & ~(ENBUSFREE|ENSCSIRST|ENBUSFREE));
-+ ahd_inb(ahd, SIMODE1) & ~(ENBUSFREE|ENSCSIRST));
-
- if (initiate_reset)
- ahd_reset_current_bus(ahd);
-@@ -7645,8 +7878,8 @@ ahd_reset_channel(struct ahd_softc *ahd,
- */
- if ((ahd->flags & AHD_RESET_POLL_ACTIVE) == 0) {
- ahd->flags |= AHD_RESET_POLL_ACTIVE;
-- ahd_freeze_simq(ahd);
-- ahd_timer_reset(&ahd->reset_timer, 0, ahd_reset_poll, ahd);
-+ aic_freeze_simq(ahd);
-+ aic_timer_reset(&ahd->reset_timer, 0, ahd_reset_poll, ahd);
- }
- return (found);
- }
-@@ -7674,7 +7907,7 @@ ahd_reset_poll(void *arg)
- ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
- ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI);
- if ((ahd_inb(ahd, SSTAT1) & SCSIRSTI) != 0) {
-- ahd_timer_reset(&ahd->reset_timer, AHD_RESET_POLL_US,
-+ aic_timer_reset(&ahd->reset_timer, AHD_RESET_POLL_US,
- ahd_reset_poll, ahd);
- ahd_unpause(ahd);
- ahd_unlock(ahd, &s);
-@@ -7689,7 +7922,7 @@ ahd_reset_poll(void *arg)
- ahd_unpause(ahd);
- ahd->flags &= ~AHD_RESET_POLL_ACTIVE;
- ahd_unlock(ahd, &s);
-- ahd_release_simq(ahd);
-+ aic_release_simq(ahd);
- ahd_list_unlock(&l);
- }
-
-@@ -7732,7 +7965,7 @@ ahd_stat_timer(void *arg)
- ahd->cmdcmplt_bucket = (ahd->cmdcmplt_bucket+1) & (AHD_STAT_BUCKETS-1);
- ahd->cmdcmplt_total -= ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket];
- ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket] = 0;
-- ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
-+ aic_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
- ahd_stat_timer, ahd);
- ahd_unlock(ahd, &s);
- ahd_list_unlock(&l);
-@@ -7753,8 +7986,9 @@ ahd_handle_scb_status(struct ahd_softc *
- void
- ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb)
- {
-- struct hardware_scb *hscb;
-- u_int qfreeze_cnt;
-+ struct hardware_scb *hscb;
-+ u_int qfreeze_cnt;
-+ int paused;
-
- /*
- * The sequencer freezes its select-out queue
-@@ -7764,9 +7998,16 @@ ahd_handle_scsi_status(struct ahd_softc
- */
- hscb = scb->hscb;
-
-+ if (ahd_is_paused(ahd)) {
-+ paused = 1;
-+ } else {
-+ paused = 0;
-+ ahd_pause(ahd);
-+ }
-+
- /* Freeze the queue until the client sees the error. */
- ahd_freeze_devq(ahd, scb);
-- ahd_freeze_scb(scb);
-+ aic_freeze_scb(scb);
- qfreeze_cnt = ahd_inw(ahd, QFREEZE_COUNT);
- if (qfreeze_cnt == 0) {
- printf("%s: Bad status with 0 qfreeze count!\n", ahd_name(ahd));
-@@ -7778,6 +8019,9 @@ ahd_handle_scsi_status(struct ahd_softc
- ahd_outb(ahd, SEQ_FLAGS2,
- ahd_inb(ahd, SEQ_FLAGS2) & ~SELECTOUT_QFROZEN);
-
-+ if (paused == 0)
-+ ahd_unpause(ahd);
-+
- /* Don't want to clobber the original sense code */
- if ((scb->flags & SCB_SENSE) != 0) {
- /*
-@@ -7785,12 +8029,12 @@ ahd_handle_scsi_status(struct ahd_softc
- * a normal command completion.
- */
- scb->flags &= ~SCB_SENSE;
-- ahd_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
-+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
- ahd_done(ahd, scb);
- return;
- }
-- ahd_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
-- ahd_set_scsi_status(scb, hscb->shared_data.istatus.scsi_status);
-+ aic_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
-+ aic_set_scsi_status(scb, hscb->shared_data.istatus.scsi_status);
- switch (hscb->shared_data.istatus.scsi_status) {
- case STATUS_PKT_SENSE:
- {
-@@ -7798,7 +8042,7 @@ ahd_handle_scsi_status(struct ahd_softc
-
- ahd_sync_sense(ahd, scb, BUS_DMASYNC_POSTREAD);
- siu = (struct scsi_status_iu_header *)scb->sense_data;
-- ahd_set_scsi_status(scb, siu->status);
-+ aic_set_scsi_status(scb, siu->status);
- #ifdef AHD_DEBUG
- if ((ahd_debug & AHD_SHOW_SENSE) != 0) {
- ahd_print_path(ahd, scb);
-@@ -7839,7 +8083,7 @@ ahd_handle_scsi_status(struct ahd_softc
- }
- }
- if (siu->status == SCSI_STATUS_OK)
-- ahd_set_transaction_status(scb,
-+ aic_set_transaction_status(scb,
- CAM_REQ_CMP_ERR);
- }
- if ((siu->flags & SIU_SNSVALID) != 0) {
-@@ -7869,7 +8113,7 @@ ahd_handle_scsi_status(struct ahd_softc
- }
- #endif
-
-- if (ahd_perform_autosense(scb) == 0)
-+ if (aic_perform_autosense(scb) == 0)
- break;
-
- ahd_compile_devinfo(&devinfo, SCB_GET_OUR_ID(scb),
-@@ -7897,7 +8141,7 @@ ahd_handle_scsi_status(struct ahd_softc
- #endif
- scb->sg_count = 0;
- sg = ahd_sg_setup(ahd, scb, sg, ahd_get_sense_bufaddr(ahd, scb),
-- ahd_get_sense_bufsize(ahd, scb),
-+ aic_get_sense_bufsize(ahd, scb),
- /*last*/TRUE);
- sc->opcode = REQUEST_SENSE;
- sc->byte2 = 0;
-@@ -7906,7 +8150,7 @@ ahd_handle_scsi_status(struct ahd_softc
- sc->byte2 = SCB_GET_LUN(scb) << 5;
- sc->unused[0] = 0;
- sc->unused[1] = 0;
-- sc->length = ahd_get_sense_bufsize(ahd, scb);
-+ sc->length = aic_get_sense_bufsize(ahd, scb);
- sc->control = 0;
-
- /*
-@@ -7926,7 +8170,7 @@ ahd_handle_scsi_status(struct ahd_softc
- * errors will be reported before any data
- * phases occur.
- */
-- if (ahd_get_residual(scb) == ahd_get_transfer_length(scb)) {
-+ if (aic_get_residual(scb) == aic_get_transfer_length(scb)) {
- ahd_update_neg_request(ahd, &devinfo,
- tstate, targ_info,
- AHD_NEG_IF_NON_ASYNC);
-@@ -7945,7 +8189,7 @@ ahd_handle_scsi_status(struct ahd_softc
- * Ensure we have enough time to actually
- * retrieve the sense.
- */
-- ahd_scb_timer_reset(scb, 5 * 1000000);
-+ aic_scb_timer_reset(scb, 5 * 1000000);
- break;
- }
- case SCSI_STATUS_OK:
-@@ -7987,7 +8231,7 @@ ahd_calc_residual(struct ahd_softc *ahd,
- */
-
- hscb = scb->hscb;
-- sgptr = ahd_le32toh(hscb->sgptr);
-+ sgptr = aic_le32toh(hscb->sgptr);
- if ((sgptr & SG_STATUS_VALID) == 0)
- /* Case 1 */
- return;
-@@ -8004,10 +8248,10 @@ ahd_calc_residual(struct ahd_softc *ahd,
- * regardless of the role for this SCB.
- */
- spkt = &hscb->shared_data.istatus;
-- resid_sgptr = ahd_le32toh(spkt->residual_sgptr);
-+ resid_sgptr = aic_le32toh(spkt->residual_sgptr);
- if ((sgptr & SG_FULL_RESID) != 0) {
- /* Case 3 */
-- resid = ahd_get_transfer_length(scb);
-+ resid = aic_get_transfer_length(scb);
- } else if ((resid_sgptr & SG_LIST_NULL) != 0) {
- /* Case 4 */
- return;
-@@ -8016,8 +8260,8 @@ ahd_calc_residual(struct ahd_softc *ahd,
- printf("data overrun detected Tag == 0x%x.\n",
- SCB_GET_TAG(scb));
- ahd_freeze_devq(ahd, scb);
-- ahd_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-- ahd_freeze_scb(scb);
-+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-+ aic_freeze_scb(scb);
- return;
- } else if ((resid_sgptr & ~SG_PTR_MASK) != 0) {
- panic("Bogus resid sgptr value 0x%x\n", resid_sgptr);
-@@ -8029,7 +8273,7 @@ ahd_calc_residual(struct ahd_softc *ahd,
- * Remainder of the SG where the transfer
- * stopped.
- */
-- resid = ahd_le32toh(spkt->residual_datacnt) & AHD_SG_LEN_MASK;
-+ resid = aic_le32toh(spkt->residual_datacnt) & AHD_SG_LEN_MASK;
- sg = ahd_sg_bus_to_virt(ahd, scb, resid_sgptr & SG_PTR_MASK);
-
- /* The residual sg_ptr always points to the next sg */
-@@ -8040,15 +8284,15 @@ ahd_calc_residual(struct ahd_softc *ahd,
- * SG segments that are after the SG where
- * the transfer stopped.
- */
-- while ((ahd_le32toh(sg->len) & AHD_DMA_LAST_SEG) == 0) {
-+ while ((aic_le32toh(sg->len) & AHD_DMA_LAST_SEG) == 0) {
- sg++;
-- resid += ahd_le32toh(sg->len) & AHD_SG_LEN_MASK;
-+ resid += aic_le32toh(sg->len) & AHD_SG_LEN_MASK;
- }
- }
- if ((scb->flags & SCB_SENSE) == 0)
-- ahd_set_residual(scb, resid);
-+ aic_set_residual(scb, resid);
- else
-- ahd_set_sense_residual(scb, resid);
-+ aic_set_sense_residual(scb, resid);
-
- #ifdef AHD_DEBUG
- if ((ahd_debug & AHD_SHOW_MISC) != 0) {
-@@ -8160,8 +8404,7 @@ ahd_dumpseq(struct ahd_softc* ahd)
- max_prog = 2048;
-
- ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
-- ahd_outb(ahd, PRGMCNT, 0);
-- ahd_outb(ahd, PRGMCNT+1, 0);
-+ ahd_outw(ahd, PRGMCNT, 0);
- for (i = 0; i < max_prog; i++) {
- uint8_t ins_bytes[4];
-
-@@ -8276,8 +8519,7 @@ ahd_loadseq(struct ahd_softc *ahd)
- downloaded = 0;
- skip_addr = 0;
- ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
-- ahd_outb(ahd, PRGMCNT, 0);
-- ahd_outb(ahd, PRGMCNT+1, 0);
-+ ahd_outw(ahd, PRGMCNT, 0);
-
- for (i = 0; i < sizeof(seqprog)/4; i++) {
- if (ahd_check_patch(ahd, &cur_patch, i, &skip_addr) == 0) {
-@@ -8406,7 +8648,7 @@ ahd_download_instr(struct ahd_softc *ahd
- /*
- * The firmware is always compiled into a little endian format.
- */
-- instr.integer = ahd_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
-+ instr.integer = aic_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
-
- fmt1_ins = &instr.format1;
- fmt3_ins = NULL;
-@@ -8454,7 +8696,7 @@ ahd_download_instr(struct ahd_softc *ahd
- instr.format1.parity = 1;
-
- /* The sequencer is a little endian cpu */
-- instr.integer = ahd_htole32(instr.integer);
-+ instr.integer = aic_htole32(instr.integer);
- ahd_outsb(ahd, SEQRAM, instr.bytes, 4);
- break;
- }
-@@ -8580,11 +8822,15 @@ ahd_dump_card_state(struct ahd_softc *ah
- printf(">>>>>>>>>>>>>>>>>> Dump Card State Begins <<<<<<<<<<<<<<<<<\n"
- "%s: Dumping Card State at program address 0x%x Mode 0x%x\n",
- ahd_name(ahd),
-- ahd_inb(ahd, CURADDR) | (ahd_inb(ahd, CURADDR+1) << 8),
-+ ahd_inw(ahd, CURADDR),
- ahd_build_mode_state(ahd, ahd->saved_src_mode,
- ahd->saved_dst_mode));
- if (paused)
- printf("Card was paused\n");
-+
-+ if (ahd_check_cmdcmpltqueues(ahd))
-+ printf("Completions are pending\n");
-+
- /*
- * Mode independent registers.
- */
-@@ -8634,10 +8880,12 @@ ahd_dump_card_state(struct ahd_softc *ah
- if (i++ > AHD_SCB_MAX)
- break;
- cur_col = printf("\n%3d FIFO_USE[0x%x] ", SCB_GET_TAG(scb),
-- ahd_inb(ahd, SCB_FIFO_USE_COUNT));
-+ ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT));
- ahd_set_scbptr(ahd, SCB_GET_TAG(scb));
-- ahd_scb_control_print(ahd_inb(ahd, SCB_CONTROL), &cur_col, 60);
-- ahd_scb_scsiid_print(ahd_inb(ahd, SCB_SCSIID), &cur_col, 60);
-+ ahd_scb_control_print(ahd_inb_scbram(ahd, SCB_CONTROL),
-+ &cur_col, 60);
-+ ahd_scb_scsiid_print(ahd_inb_scbram(ahd, SCB_SCSIID),
-+ &cur_col, 60);
- }
- printf("\nTotal %d\n", i);
-
-@@ -8666,7 +8914,7 @@ ahd_dump_card_state(struct ahd_softc *ah
- while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
- ahd_set_scbptr(ahd, scb_index);
- printf("%d ", scb_index);
-- scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
-+ scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
- }
- printf("\n");
-
-@@ -8676,7 +8924,7 @@ ahd_dump_card_state(struct ahd_softc *ah
- while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
- ahd_set_scbptr(ahd, scb_index);
- printf("%d ", scb_index);
-- scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
-+ scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
- }
- printf("\n");
-
-@@ -8687,7 +8935,7 @@ ahd_dump_card_state(struct ahd_softc *ah
- while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
- ahd_set_scbptr(ahd, scb_index);
- printf("%d ", scb_index);
-- scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
-+ scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
- }
- printf("\n");
- ahd_set_scbptr(ahd, saved_scb_index);
-@@ -8766,15 +9014,16 @@ ahd_dump_card_state(struct ahd_softc *ah
- ahd_name(ahd), ahd_inw(ahd, REG0), ahd_inw(ahd, SINDEX),
- ahd_inw(ahd, DINDEX));
- printf("%s: SCBPTR == 0x%x, SCB_NEXT == 0x%x, SCB_NEXT2 == 0x%x\n",
-- ahd_name(ahd), ahd_get_scbptr(ahd), ahd_inw(ahd, SCB_NEXT),
-- ahd_inw(ahd, SCB_NEXT2));
-+ ahd_name(ahd), ahd_get_scbptr(ahd),
-+ ahd_inw_scbram(ahd, SCB_NEXT),
-+ ahd_inw_scbram(ahd, SCB_NEXT2));
- printf("CDB %x %x %x %x %x %x\n",
-- ahd_inb(ahd, SCB_CDB_STORE),
-- ahd_inb(ahd, SCB_CDB_STORE+1),
-- ahd_inb(ahd, SCB_CDB_STORE+2),
-- ahd_inb(ahd, SCB_CDB_STORE+3),
-- ahd_inb(ahd, SCB_CDB_STORE+4),
-- ahd_inb(ahd, SCB_CDB_STORE+5));
-+ ahd_inb_scbram(ahd, SCB_CDB_STORE),
-+ ahd_inb_scbram(ahd, SCB_CDB_STORE+1),
-+ ahd_inb_scbram(ahd, SCB_CDB_STORE+2),
-+ ahd_inb_scbram(ahd, SCB_CDB_STORE+3),
-+ ahd_inb_scbram(ahd, SCB_CDB_STORE+4),
-+ ahd_inb_scbram(ahd, SCB_CDB_STORE+5));
- printf("STACK:");
- for (i = 0; i < ahd->stack_size; i++) {
- ahd->saved_stack[i] =
-@@ -8806,16 +9055,292 @@ ahd_dump_scbs(struct ahd_softc *ahd)
- ahd_set_scbptr(ahd, i);
- printf("%3d", i);
- printf("(CTRL 0x%x ID 0x%x N 0x%x N2 0x%x SG 0x%x, RSG 0x%x)\n",
-- ahd_inb(ahd, SCB_CONTROL),
-- ahd_inb(ahd, SCB_SCSIID), ahd_inw(ahd, SCB_NEXT),
-- ahd_inw(ahd, SCB_NEXT2), ahd_inl(ahd, SCB_SGPTR),
-- ahd_inl(ahd, SCB_RESIDUAL_SGPTR));
-+ ahd_inb_scbram(ahd, SCB_CONTROL),
-+ ahd_inb_scbram(ahd, SCB_SCSIID),
-+ ahd_inw_scbram(ahd, SCB_NEXT),
-+ ahd_inw_scbram(ahd, SCB_NEXT2),
-+ ahd_inl_scbram(ahd, SCB_SGPTR),
-+ ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR));
- }
- printf("\n");
- ahd_set_scbptr(ahd, saved_scb_index);
- ahd_restore_modes(ahd, saved_modes);
- }
-
-+
-+/*************************** Timeout Handling *********************************/
-+void
-+ahd_timeout(struct scb *scb)
-+{
-+ struct ahd_softc *ahd;
-+
-+ ahd = scb->ahd_softc;
-+ if ((scb->flags & SCB_ACTIVE) != 0) {
-+ if ((scb->flags & SCB_TIMEDOUT) == 0) {
-+ LIST_INSERT_HEAD(&ahd->timedout_scbs, scb,
-+ timedout_links);
-+ scb->flags |= SCB_TIMEDOUT;
-+ }
-+ ahd_wakeup_recovery_thread(ahd);
-+ }
-+}
-+
-+/*
-+ * ahd_recover_commands determines if any of the commands that have currently
-+ * timedout are the root cause for this timeout. Innocent commands are given
-+ * a new timeout while we wait for the command executing on the bus to timeout.
-+ * This routine is invoked from a thread context so we are allowed to sleep.
-+ * Our lock is not held on entry.
-+ */
-+void
-+ahd_recover_commands(struct ahd_softc *ahd)
-+{
-+ struct scb *scb;
-+ struct scb *active_scb;
-+ long s;
-+ int found;
-+ int was_paused;
-+ u_int active_scbptr;
-+ u_int last_phase;
-+
-+ ahd_lock(ahd, &s);
-+
-+ /*
-+ * Pause the controller and manually flush any
-+ * commands that have just completed but that our
-+ * interrupt handler has yet to see.
-+ */
-+ was_paused = ahd_is_paused(ahd);
-+ ahd_pause_and_flushwork(ahd);
-+
-+ if (LIST_EMPTY(&ahd->timedout_scbs) != 0) {
-+ /*
-+ * The timedout commands have already
-+ * completed. This typically means
-+ * that either the timeout value was on
-+ * the hairy edge of what the device
-+ * requires or - more likely - interrupts
-+ * are not happening.
-+ */
-+ printf("%s: Timedout SCBs already complete. "
-+ "Interrupts may not be functioning.\n", ahd_name(ahd));
-+ ahd_unpause(ahd);
-+ ahd_unlock(ahd, &s);
-+ return;
-+ }
-+
-+ printf("%s: Recovery Initiated - Card was %spaused\n", ahd_name(ahd),
-+ was_paused ? "" : "not ");
-+ ahd_dump_card_state(ahd);
-+
-+ /*
-+ * Determine identity of SCB acting on the bus.
-+ * This test only catches non-packetized transactions.
-+ * Due to the fleeting nature of packetized operations,
-+ * we can't easily determine that a packetized operation
-+ * is on the bus.
-+ */
-+ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-+ last_phase = ahd_inb(ahd, LASTPHASE);
-+ active_scbptr = ahd_get_scbptr(ahd);
-+ active_scb = NULL;
-+ if (last_phase != P_BUSFREE
-+ || (ahd_inb(ahd, SEQ_FLAGS) & NOT_IDENTIFIED) == 0)
-+ active_scb = ahd_lookup_scb(ahd, active_scbptr);
-+
-+ while ((scb = LIST_FIRST(&ahd->timedout_scbs)) != NULL) {
-+ int target;
-+ int lun;
-+ char channel;
-+
-+ target = SCB_GET_TARGET(ahd, scb);
-+ channel = SCB_GET_CHANNEL(ahd, scb);
-+ lun = SCB_GET_LUN(scb);
-+
-+ ahd_print_path(ahd, scb);
-+ printf("SCB 0x%x - timed out\n", scb->hscb->tag);
-+
-+ if (scb->flags & (SCB_DEVICE_RESET|SCB_ABORT)) {
-+ /*
-+ * Been down this road before.
-+ * Do a full bus reset.
-+ */
-+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-+bus_reset:
-+ found = ahd_reset_channel(ahd, channel,
-+ /*Initiate Reset*/TRUE);
-+ printf("%s: Issued Channel %c Bus Reset. "
-+ "%d SCBs aborted\n", ahd_name(ahd), channel,
-+ found);
-+ continue;
-+ }
-+
-+ /*
-+ * Remove the command from the timedout list in
-+ * preparation for requeing it.
-+ */
-+ LIST_REMOVE(scb, timedout_links);
-+ scb->flags &= ~SCB_TIMEDOUT;
-+
-+ if (active_scb != NULL) {
-+
-+ if (active_scb != scb) {
-+ /*
-+ * If the active SCB is not us, assume that
-+ * the active SCB has a longer timeout than
-+ * the timedout SCB, and wait for the active
-+ * SCB to timeout.
-+ */
-+ ahd_other_scb_timeout(ahd, scb, active_scb);
-+ continue;
-+ }
-+
-+ /*
-+ * We're active on the bus, so assert ATN
-+ * and hope that the target responds.
-+ */
-+ ahd_set_recoveryscb(ahd, active_scb);
-+ active_scb->flags |= SCB_RECOVERY_SCB|SCB_DEVICE_RESET;
-+ ahd_outb(ahd, MSG_OUT, HOST_MSG);
-+ ahd_outb(ahd, SCSISIGO, last_phase|ATNO);
-+ ahd_print_path(ahd, active_scb);
-+ printf("BDR message in message buffer\n");
-+ aic_scb_timer_reset(scb, 2 * 1000000);
-+ break;
-+ } else if (last_phase != P_BUSFREE
-+ && ahd_inb(ahd, SCSIPHASE) == 0) {
-+ /*
-+ * SCB is not identified, there
-+ * is no pending REQ, and the sequencer
-+ * has not seen a busfree. Looks like
-+ * a stuck connection waiting to
-+ * go busfree. Reset the bus.
-+ */
-+ printf("%s: Connection stuck awaiting busfree or "
-+ "Identify Msg.\n", ahd_name(ahd));
-+ goto bus_reset;
-+ } else if (ahd_search_qinfifo(ahd, target, channel, lun,
-+ scb->hscb->tag, ROLE_INITIATOR,
-+ /*status*/0, SEARCH_COUNT) > 0) {
-+
-+ /*
-+ * We haven't even gone out on the bus
-+ * yet, so the timeout must be due to
-+ * some other command. Reset the timer
-+ * and go on.
-+ */
-+ ahd_other_scb_timeout(ahd, scb, scb);
-+ } else {
-+ /*
-+ * This SCB is for a disconnected transaction
-+ * and we haven't found a better candidate on
-+ * the bus to explain this timeout.
-+ */
-+ ahd_set_recoveryscb(ahd, scb);
-+
-+ /*
-+ * Actually re-queue this SCB in an attempt
-+ * to select the device before it reconnects.
-+ * In either case (selection or reselection),
-+ * we will now issue a target reset to the
-+ * timed-out device.
-+ *
-+ * Set the MK_MESSAGE control bit indicating
-+ * that we desire to send a message. We
-+ * also set the disconnected flag since
-+ * in the paging case there is no guarantee
-+ * that our SCB control byte matches the
-+ * version on the card. We don't want the
-+ * sequencer to abort the command thinking
-+ * an unsolicited reselection occurred.
-+ */
-+ scb->flags |= SCB_DEVICE_RESET;
-+ scb->hscb->cdb_len = 0;
-+ scb->hscb->task_attribute = 0;
-+ scb->hscb->task_management = SIU_TASKMGMT_ABORT_TASK;
-+
-+ ahd_set_scbptr(ahd, SCB_GET_TAG(scb));
-+ if ((scb->flags & SCB_PACKETIZED) != 0) {
-+ /*
-+ * Mark the SCB has having an outstanding
-+ * task management function. Should the command
-+ * complete normally before the task management
-+ * function can be sent, the host will be
-+ * notified to abort our requeued SCB.
-+ */
-+ ahd_outb(ahd, SCB_TASK_MANAGEMENT,
-+ scb->hscb->task_management);
-+ } else {
-+ /*
-+ * If non-packetized, set the MK_MESSAGE control
-+ * bit indicating that we desire to send a
-+ * message. We also set the disconnected flag
-+ * since there is no guarantee that our SCB
-+ * control byte matches the version on the
-+ * card. We don't want the sequencer to abort
-+ * the command thinking an unsolicited
-+ * reselection occurred.
-+ */
-+ scb->hscb->control |= MK_MESSAGE|DISCONNECTED;
-+
-+ /*
-+ * The sequencer will never re-reference the
-+ * in-core SCB. To make sure we are notified
-+ * during reslection, set the MK_MESSAGE flag in
-+ * the card's copy of the SCB.
-+ */
-+ ahd_outb(ahd, SCB_CONTROL,
-+ ahd_inb(ahd, SCB_CONTROL)|MK_MESSAGE);
-+ }
-+
-+ /*
-+ * Clear out any entries in the QINFIFO first
-+ * so we are the next SCB for this target
-+ * to run.
-+ */
-+ ahd_search_qinfifo(ahd, target, channel, lun,
-+ SCB_LIST_NULL, ROLE_INITIATOR,
-+ CAM_REQUEUE_REQ, SEARCH_COMPLETE);
-+ ahd_qinfifo_requeue_tail(ahd, scb);
-+ ahd_set_scbptr(ahd, active_scbptr);
-+ ahd_print_path(ahd, scb);
-+ printf("Queuing a BDR SCB\n");
-+ aic_scb_timer_reset(scb, 2 * 1000000);
-+ break;
-+ }
-+ }
-+
-+ /*
-+ * Any remaining SCBs were not the "culprit", so remove
-+ * them from the timeout list. The timer for these commands
-+ * will be reset once the recovery SCB completes.
-+ */
-+ while ((scb = LIST_FIRST(&ahd->timedout_scbs)) != NULL) {
-+
-+ LIST_REMOVE(scb, timedout_links);
-+ scb->flags &= ~SCB_TIMEDOUT;
-+ }
-+
-+ ahd_unpause(ahd);
-+ ahd_unlock(ahd, &s);
-+}
-+
-+static void
-+ahd_other_scb_timeout(struct ahd_softc *ahd, struct scb *scb,
-+ struct scb *other_scb)
-+{
-+ u_int newtimeout;
-+
-+ ahd_print_path(ahd, scb);
-+ printf("Other SCB Timeout%s",
-+ (scb->flags & SCB_OTHERTCL_TIMEOUT) != 0
-+ ? " again\n" : "\n");
-+ scb->flags |= SCB_OTHERTCL_TIMEOUT;
-+ newtimeout = MAX(aic_get_timeout(other_scb),
-+ aic_get_timeout(scb));
-+ aic_scb_timer_reset(scb, newtimeout);
-+}
-+
- /**************************** Flexport Logic **********************************/
- /*
- * Read count 16bit words from 16bit word address start_addr from the
-@@ -8922,9 +9447,9 @@ ahd_wait_seeprom(struct ahd_softc *ahd)
- {
- int cnt;
-
-- cnt = 20;
-+ cnt = 5000;
- while ((ahd_inb(ahd, SEESTAT) & (SEEARBACK|SEEBUSY)) != 0 && --cnt)
-- ahd_delay(5);
-+ aic_delay(5);
-
- if (cnt == 0)
- return (ETIMEDOUT);
-@@ -9066,7 +9591,7 @@ ahd_wait_flexport(struct ahd_softc *ahd)
- AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
- cnt = 1000000 * 2 / 5;
- while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt)
-- ahd_delay(5);
-+ aic_delay(5);
-
- if (cnt == 0)
- return (ETIMEDOUT);
-@@ -9192,6 +9717,7 @@ ahd_handle_en_lun(struct ahd_softc *ahd,
- ahd->flags &= ~AHD_INITIATORROLE;
- ahd_pause(ahd);
- ahd_loadseq(ahd);
-+ ahd_restart(ahd);
- ahd_unlock(ahd, &s);
- }
- cel = &ccb->cel;
-@@ -9267,13 +9793,9 @@ ahd_handle_en_lun(struct ahd_softc *ahd,
- if ((ahd->features & AHD_MULTI_TID) != 0) {
- u_int targid_mask;
-
-- targid_mask = ahd_inb(ahd, TARGID)
-- | (ahd_inb(ahd, TARGID + 1) << 8);
--
-+ targid_mask = ahd_inw(ahd, TARGID);
- targid_mask |= target_mask;
-- ahd_outb(ahd, TARGID, targid_mask);
-- ahd_outb(ahd, TARGID+1, (targid_mask >> 8));
--
-+ ahd_outw(ahd, TARGID, targid_mask);
- ahd_update_scsiid(ahd, targid_mask);
- } else {
- u_int our_id;
-@@ -9387,14 +9909,9 @@ ahd_handle_en_lun(struct ahd_softc *ahd,
- if (ahd->features & AHD_MULTI_TID) {
- u_int targid_mask;
-
-- targid_mask = ahd_inb(ahd, TARGID)
-- | (ahd_inb(ahd, TARGID + 1)
-- << 8);
--
-+ targid_mask = ahd_inw(ahd, TARGID);
- targid_mask &= ~target_mask;
-- ahd_outb(ahd, TARGID, targid_mask);
-- ahd_outb(ahd, TARGID+1,
-- (targid_mask >> 8));
-+ ahd_outw(ahd, TARGID, targid_mask);
- ahd_update_scsiid(ahd, targid_mask);
- }
- }
-@@ -9425,6 +9942,11 @@ ahd_handle_en_lun(struct ahd_softc *ahd,
- ahd->flags |= AHD_INITIATORROLE;
- ahd_pause(ahd);
- ahd_loadseq(ahd);
-+ ahd_restart(ahd);
-+ /*
-+ * Unpaused. The extra unpause
-+ * that follows is harmless.
-+ */
- }
- }
- ahd_unpause(ahd);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx.h 2003-06-14 12:18:25.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx.h 2003-12-28 23:21:39.000000000 -0800
-@@ -37,7 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#90 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#101 $
- *
- * $FreeBSD$
- */
-@@ -74,9 +74,9 @@ struct scb_platform_data;
- #define ALL_TARGETS_MASK 0xFFFF
- #define INITIATOR_WILDCARD (~0)
- #define SCB_LIST_NULL 0xFF00
--#define SCB_LIST_NULL_LE (ahd_htole16(SCB_LIST_NULL))
-+#define SCB_LIST_NULL_LE (aic_htole16(SCB_LIST_NULL))
- #define QOUTFIFO_ENTRY_VALID 0x8000
--#define QOUTFIFO_ENTRY_VALID_LE (ahd_htole16(0x8000))
-+#define QOUTFIFO_ENTRY_VALID_LE (aic_htole16(0x8000))
- #define SCBID_IS_NULL(scbid) (((scbid) & 0xFF00 ) == SCB_LIST_NULL)
-
- #define SCSIID_TARGET(ahd, scsiid) \
-@@ -118,7 +118,7 @@ struct scb_platform_data;
- ((lun) | ((target) << 8))
-
- #define SCB_GET_TAG(scb) \
-- ahd_le16toh(scb->hscb->tag)
-+ aic_le16toh(scb->hscb->tag)
-
- #ifndef AHD_TARGET_MODE
- #undef AHD_TMODE_ENABLE
-@@ -229,8 +229,10 @@ typedef enum {
- AHD_RTI = 0x04000,/* Retained Training Support */
- AHD_NEW_IOCELL_OPTS = 0x08000,/* More Signal knobs in the IOCELL */
- AHD_NEW_DFCNTRL_OPTS = 0x10000,/* SCSIENWRDIS bit */
-+ AHD_FAST_CDB_DELIVERY = 0x20000,/* CDB acks released to Output Sync */
- AHD_REMOVABLE = 0x00000,/* Hot-Swap supported - None so far*/
- AHD_AIC7901_FE = AHD_FENONE,
-+ AHD_AIC7901A_FE = AHD_FENONE,
- AHD_AIC7902_FE = AHD_MULTI_FUNC
- } ahd_feature;
-
-@@ -372,7 +374,9 @@ typedef enum {
- AHD_HP_BOARD = 0x100000,
- AHD_RESET_POLL_ACTIVE = 0x200000,
- AHD_UPDATE_PEND_CMDS = 0x400000,
-- AHD_RUNNING_QOUTFIFO = 0x800000
-+ AHD_RUNNING_QOUTFIFO = 0x800000,
-+ AHD_HAD_FIRST_SEL = 0x1000000,
-+ AHD_SHUTDOWN_RECOVERY = 0x2000000 /* Terminate recovery thread. */
- } ahd_flag;
-
- /************************* Hardware SCB Definition ***************************/
-@@ -494,21 +498,21 @@ struct hardware_scb {
- * transfer.
- */
- #define SG_PTR_MASK 0xFFFFFFF8
--/*16*/ uint64_t dataptr;
--/*24*/ uint32_t datacnt; /* Byte 3 is spare. */
--/*28*/ uint32_t sgptr;
--/*32*/ uint32_t hscb_busaddr;
--/*36*/ uint32_t next_hscb_busaddr;
--/*40*/ uint8_t control; /* See SCB_CONTROL in aic79xx.reg for details */
--/*41*/ uint8_t scsiid; /*
-+/*16*/ uint16_t tag; /* Reused by Sequencer. */
-+/*18*/ uint8_t control; /* See SCB_CONTROL in aic79xx.reg for details */
-+/*19*/ uint8_t scsiid; /*
- * Selection out Id
- * Our Id (bits 0-3) Their ID (bits 4-7)
- */
--/*42*/ uint8_t lun;
--/*43*/ uint8_t task_attribute;
--/*44*/ uint8_t cdb_len;
--/*45*/ uint8_t task_management;
--/*46*/ uint16_t tag; /* Reused by Sequencer. */
-+/*20*/ uint8_t lun;
-+/*21*/ uint8_t task_attribute;
-+/*22*/ uint8_t cdb_len;
-+/*23*/ uint8_t task_management;
-+/*24*/ uint64_t dataptr;
-+/*32*/ uint32_t datacnt; /* Byte 3 is spare. */
-+/*36*/ uint32_t sgptr;
-+/*40*/ uint32_t hscb_busaddr;
-+/*44*/ uint32_t next_hscb_busaddr;
- /********** Long lun field only downloaded for full 8 byte lun support ********/
- /*48*/ uint8_t pkt_long_lun[8];
- /******* Fields below are not Downloaded (Sequencer may use for scratch) ******/
-@@ -546,7 +550,7 @@ struct ahd_dma64_seg {
-
- struct map_node {
- bus_dmamap_t dmamap;
-- bus_addr_t physaddr;
-+ bus_addr_t busaddr;
- uint8_t *vaddr;
- SLIST_ENTRY(map_node) links;
- };
-@@ -588,12 +592,16 @@ typedef enum {
- SCB_PKT_SENSE = 0x02000,
- SCB_CMDPHASE_ABORT = 0x04000,
- SCB_ON_COL_LIST = 0x08000,
-- SCB_SILENT = 0x10000 /*
-+ SCB_SILENT = 0x10000,/*
- * Be quiet about transmission type
- * errors. They are expected and we
- * don't want to upset the user. This
- * flag is typically used during DV.
- */
-+ SCB_TIMEDOUT = 0x20000/*
-+ * SCB has timed out and is on the
-+ * timedout list.
-+ */
- } scb_flag;
-
- struct scb {
-@@ -610,8 +618,9 @@ struct scb {
- } links2;
- #define pending_links links2.le
- #define collision_links links2.le
-+ LIST_ENTRY(scb) timedout_links;
- struct scb *col_scb;
-- ahd_io_ctx_t io_ctx;
-+ aic_io_ctx_t io_ctx;
- struct ahd_softc *ahd_softc;
- scb_flag flags;
- #ifndef __linux__
-@@ -1059,6 +1068,7 @@ struct ahd_softc {
- struct scb_data scb_data;
-
- struct hardware_scb *next_queued_hscb;
-+ struct map_node *next_queued_hscb_map;
-
- /*
- * SCBs that have been sent to the controller
-@@ -1066,6 +1076,11 @@ struct ahd_softc {
- LIST_HEAD(, scb) pending_scbs;
-
- /*
-+ * SCBs whose timeout routine has been called.
-+ */
-+ LIST_HEAD(, scb) timedout_scbs;
-+
-+ /*
- * Current register window mode information.
- */
- ahd_mode dst_mode;
-@@ -1086,7 +1101,7 @@ struct ahd_softc {
- /*
- * Platform specific device information.
- */
-- ahd_dev_softc_t dev_softc;
-+ aic_dev_softc_t dev_softc;
-
- /*
- * Bus specific device information.
-@@ -1116,8 +1131,8 @@ struct ahd_softc {
- /*
- * Timer handles for timer driven callbacks.
- */
-- ahd_timer_t reset_timer;
-- ahd_timer_t stat_timer;
-+ aic_timer_t reset_timer;
-+ aic_timer_t stat_timer;
-
- /*
- * Statistics.
-@@ -1194,8 +1209,7 @@ struct ahd_softc {
- */
- bus_dma_tag_t parent_dmat;
- bus_dma_tag_t shared_data_dmat;
-- bus_dmamap_t shared_data_dmamap;
-- bus_addr_t shared_data_busaddr;
-+ struct map_node shared_data_map;
-
- /* Information saved through suspend/resume cycles */
- struct ahd_suspend_state suspend_state;
-@@ -1296,9 +1310,9 @@ struct ahd_devinfo {
- };
-
- /****************************** PCI Structures ********************************/
--#define AHD_PCI_IOADDR0 PCIR_MAPS /* I/O BAR*/
--#define AHD_PCI_MEMADDR (PCIR_MAPS + 4) /* Memory BAR */
--#define AHD_PCI_IOADDR1 (PCIR_MAPS + 12)/* Second I/O BAR */
-+#define AHD_PCI_IOADDR0 PCIR_BAR(0) /* I/O BAR*/
-+#define AHD_PCI_MEMADDR PCIR_BAR(1) /* Memory BAR */
-+#define AHD_PCI_IOADDR1 PCIR_BAR(3) /* Second I/O BAR */
-
- typedef int (ahd_device_setup_t)(struct ahd_softc *);
-
-@@ -1338,7 +1352,7 @@ ahd_unbusy_tcl(struct ahd_softc *ahd, u_
- }
-
- /***************************** PCI Front End *********************************/
--struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t);
-+struct ahd_pci_identity *ahd_find_pci_device(aic_dev_softc_t);
- int ahd_pci_config(struct ahd_softc *,
- struct ahd_pci_identity *);
- int ahd_pci_test_register_access(struct ahd_softc *);
-@@ -1379,13 +1393,13 @@ struct scb *ahd_get_scb(struct ahd_soft
- void ahd_free_scb(struct ahd_softc *ahd, struct scb *scb);
- void ahd_alloc_scbs(struct ahd_softc *ahd);
- void ahd_free(struct ahd_softc *ahd);
--int ahd_reset(struct ahd_softc *ahd);
-+int ahd_reset(struct ahd_softc *ahd, int reinit);
- void ahd_shutdown(void *arg);
--int ahd_write_flexport(struct ahd_softc *ahd,
-- u_int addr, u_int value);
--int ahd_read_flexport(struct ahd_softc *ahd, u_int addr,
-- uint8_t *value);
--int ahd_wait_flexport(struct ahd_softc *ahd);
-+int ahd_write_flexport(struct ahd_softc *ahd,
-+ u_int addr, u_int value);
-+int ahd_read_flexport(struct ahd_softc *ahd, u_int addr,
-+ uint8_t *value);
-+int ahd_wait_flexport(struct ahd_softc *ahd);
-
- /*************************** Interrupt Services *******************************/
- void ahd_pci_intr(struct ahd_softc *ahd);
-@@ -1430,6 +1444,8 @@ void ahd_handle_scsi_status(struct ahd
- struct scb *scb);
- void ahd_calc_residual(struct ahd_softc *ahd,
- struct scb *scb);
-+void ahd_timeout(struct scb *scb);
-+void ahd_recover_commands(struct ahd_softc *ahd);
- /*************************** Utility Functions ********************************/
- struct ahd_phase_table_entry*
- ahd_lookup_phase_entry(int phase);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_inline.h 2003-06-14 12:18:09.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_inline.h 2003-12-28 23:21:39.000000000 -0800
-@@ -37,7 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#50 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#55 $
- *
- * $FreeBSD$
- */
-@@ -250,15 +250,15 @@ ahd_sg_setup(struct ahd_softc *ahd, stru
- struct ahd_dma64_seg *sg;
-
- sg = (struct ahd_dma64_seg *)sgptr;
-- sg->addr = ahd_htole64(addr);
-- sg->len = ahd_htole32(len | (last ? AHD_DMA_LAST_SEG : 0));
-+ sg->addr = aic_htole64(addr);
-+ sg->len = aic_htole32(len | (last ? AHD_DMA_LAST_SEG : 0));
- return (sg + 1);
- } else {
- struct ahd_dma_seg *sg;
-
- sg = (struct ahd_dma_seg *)sgptr;
-- sg->addr = ahd_htole32(addr & 0xFFFFFFFF);
-- sg->len = ahd_htole32(len | ((addr >> 8) & 0x7F000000)
-+ sg->addr = aic_htole32(addr & 0xFFFFFFFF);
-+ sg->len = aic_htole32(len | ((addr >> 8) & 0x7F000000)
- | (last ? AHD_DMA_LAST_SEG : 0));
- return (sg + 1);
- }
-@@ -273,7 +273,7 @@ ahd_setup_scb_common(struct ahd_softc *a
- /* XXX what about ACA?? It is type 4, but TAG_TYPE == 0x3. */
- scb->hscb->task_attribute = scb->hscb->control & SCB_TAG_TYPE;
- } else {
-- if (ahd_get_transfer_length(scb) & 0x01)
-+ if (aic_get_transfer_length(scb) & 0x01)
- scb->hscb->task_attribute = SCB_XFERLEN_ODD;
- else
- scb->hscb->task_attribute = 0;
-@@ -282,7 +282,7 @@ ahd_setup_scb_common(struct ahd_softc *a
- if (scb->hscb->cdb_len <= MAX_CDB_LEN_WITH_SENSE_ADDR
- || (scb->hscb->cdb_len & SCB_CDB_LEN_PTR) != 0)
- scb->hscb->shared_data.idata.cdb_plus_saddr.sense_addr =
-- ahd_htole32(scb->sense_busaddr);
-+ aic_htole32(scb->sense_busaddr);
- }
-
- static __inline void
-@@ -308,8 +308,8 @@ ahd_setup_data_scb(struct ahd_softc *ahd
- if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) {
- uint64_t high_addr;
-
-- high_addr = ahd_le32toh(sg->len) & 0x7F000000;
-- scb->hscb->dataptr |= ahd_htole64(high_addr << 8);
-+ high_addr = aic_le32toh(sg->len) & 0x7F000000;
-+ scb->hscb->dataptr |= aic_htole64(high_addr << 8);
- }
- scb->hscb->datacnt = sg->len;
- }
-@@ -319,13 +319,13 @@ ahd_setup_data_scb(struct ahd_softc *ahd
- * sequencer will clear as soon as a data transfer
- * occurs.
- */
-- scb->hscb->sgptr = ahd_htole32(scb->sg_list_busaddr|SG_FULL_RESID);
-+ scb->hscb->sgptr = aic_htole32(scb->sg_list_busaddr|SG_FULL_RESID);
- }
-
- static __inline void
- ahd_setup_noxfer_scb(struct ahd_softc *ahd, struct scb *scb)
- {
-- scb->hscb->sgptr = ahd_htole32(SG_LIST_NULL);
-+ scb->hscb->sgptr = aic_htole32(SG_LIST_NULL);
- scb->hscb->dataptr = 0;
- scb->hscb->datacnt = 0;
- }
-@@ -383,7 +383,7 @@ ahd_sg_virt_to_bus(struct ahd_softc *ahd
- static __inline void
- ahd_sync_scb(struct ahd_softc *ahd, struct scb *scb, int op)
- {
-- ahd_dmamap_sync(ahd, ahd->scb_data.hscb_dmat,
-+ aic_dmamap_sync(ahd, ahd->scb_data.hscb_dmat,
- scb->hscb_map->dmamap,
- /*offset*/(uint8_t*)scb->hscb - scb->hscb_map->vaddr,
- /*len*/sizeof(*scb->hscb), op);
-@@ -395,7 +395,7 @@ ahd_sync_sglist(struct ahd_softc *ahd, s
- if (scb->sg_count == 0)
- return;
-
-- ahd_dmamap_sync(ahd, ahd->scb_data.sg_dmat,
-+ aic_dmamap_sync(ahd, ahd->scb_data.sg_dmat,
- scb->sg_map->dmamap,
- /*offset*/scb->sg_list_busaddr - ahd_sg_size(ahd),
- /*len*/ahd_sg_size(ahd) * scb->sg_count, op);
-@@ -404,7 +404,7 @@ ahd_sync_sglist(struct ahd_softc *ahd, s
- static __inline void
- ahd_sync_sense(struct ahd_softc *ahd, struct scb *scb, int op)
- {
-- ahd_dmamap_sync(ahd, ahd->scb_data.sense_dmat,
-+ aic_dmamap_sync(ahd, ahd->scb_data.sense_dmat,
- scb->sense_map->dmamap,
- /*offset*/scb->sense_busaddr,
- /*len*/AHD_SENSE_BUFSIZE, op);
-@@ -455,6 +455,8 @@ static __inline u_int ahd_inb_scbram(str
- static __inline u_int ahd_inw_scbram(struct ahd_softc *ahd, u_int offset);
- static __inline uint32_t
- ahd_inl_scbram(struct ahd_softc *ahd, u_int offset);
-+static __inline uint64_t
-+ ahd_inq_scbram(struct ahd_softc *ahd, u_int offset);
- static __inline void ahd_swap_with_next_hscb(struct ahd_softc *ahd,
- struct scb *scb);
- static __inline void ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb);
-@@ -470,7 +472,7 @@ ahd_complete_scb(struct ahd_softc *ahd,
- {
- uint32_t sgptr;
-
-- sgptr = ahd_le32toh(scb->hscb->sgptr);
-+ sgptr = aic_le32toh(scb->hscb->sgptr);
- if ((sgptr & SG_STATUS_VALID) != 0)
- ahd_handle_scb_status(ahd, scb);
- else
-@@ -486,7 +488,7 @@ ahd_update_residual(struct ahd_softc *ah
- {
- uint32_t sgptr;
-
-- sgptr = ahd_le32toh(scb->hscb->sgptr);
-+ sgptr = aic_le32toh(scb->hscb->sgptr);
- if ((sgptr & SG_STATUS_VALID) != 0)
- ahd_calc_residual(ahd, scb);
- }
-@@ -520,12 +522,21 @@ do { \
- static __inline uint16_t
- ahd_inw(struct ahd_softc *ahd, u_int port)
- {
-+ /*
-+ * Read high byte first as some registers increment
-+ * or have other side effects when the low byte is
-+ * read.
-+ */
- return ((ahd_inb(ahd, port+1) << 8) | ahd_inb(ahd, port));
- }
-
- static __inline void
- ahd_outw(struct ahd_softc *ahd, u_int port, u_int value)
- {
-+ /*
-+ * Write low byte first to accomodate registers
-+ * such as PRGMCNT where the order maters.
-+ */
- ahd_outb(ahd, port, value & 0xFF);
- ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
- }
-@@ -697,10 +708,15 @@ ahd_inw_scbram(struct ahd_softc *ahd, u_
- static __inline uint32_t
- ahd_inl_scbram(struct ahd_softc *ahd, u_int offset)
- {
-- return (ahd_inb_scbram(ahd, offset)
-- | (ahd_inb_scbram(ahd, offset+1) << 8)
-- | (ahd_inb_scbram(ahd, offset+2) << 16)
-- | (ahd_inb_scbram(ahd, offset+3) << 24));
-+ return (ahd_inw_scbram(ahd, offset)
-+ | (ahd_inw_scbram(ahd, offset+2) << 16));
-+}
-+
-+static __inline uint64_t
-+ahd_inq_scbram(struct ahd_softc *ahd, u_int offset)
-+{
-+ return (ahd_inl_scbram(ahd, offset)
-+ | ((uint64_t)ahd_inl_scbram(ahd, offset+4)) << 32);
- }
-
- static __inline struct scb *
-@@ -720,7 +736,8 @@ ahd_lookup_scb(struct ahd_softc *ahd, u_
- static __inline void
- ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb)
- {
-- struct hardware_scb *q_hscb;
-+ struct hardware_scb *q_hscb;
-+ struct map_node *q_hscb_map;
- uint32_t saved_hscb_busaddr;
-
- /*
-@@ -736,6 +753,7 @@ ahd_swap_with_next_hscb(struct ahd_softc
- * locate the correct SCB by SCB_TAG.
- */
- q_hscb = ahd->next_queued_hscb;
-+ q_hscb_map = ahd->next_queued_hscb_map;
- saved_hscb_busaddr = q_hscb->hscb_busaddr;
- memcpy(q_hscb, scb->hscb, sizeof(*scb->hscb));
- q_hscb->hscb_busaddr = saved_hscb_busaddr;
-@@ -743,7 +761,9 @@ ahd_swap_with_next_hscb(struct ahd_softc
-
- /* Now swap HSCB pointers. */
- ahd->next_queued_hscb = scb->hscb;
-+ ahd->next_queued_hscb_map = scb->hscb_map;
- scb->hscb = q_hscb;
-+ scb->hscb_map = q_hscb_map;
-
- /* Now define the mapping from tag to SCB in the scbindex */
- ahd->scb_data.scbindex[SCB_GET_TAG(scb)] = scb;
-@@ -783,13 +803,13 @@ ahd_queue_scb(struct ahd_softc *ahd, str
- if ((ahd_debug & AHD_SHOW_QUEUE) != 0) {
- uint64_t host_dataptr;
-
-- host_dataptr = ahd_le64toh(scb->hscb->dataptr);
-+ host_dataptr = aic_le64toh(scb->hscb->dataptr);
- printf("%s: Queueing SCB 0x%x bus addr 0x%x - 0x%x%x/0x%x\n",
- ahd_name(ahd),
-- SCB_GET_TAG(scb), ahd_le32toh(scb->hscb->hscb_busaddr),
-+ SCB_GET_TAG(scb), aic_le32toh(scb->hscb->hscb_busaddr),
- (u_int)((host_dataptr >> 32) & 0xFFFFFFFF),
- (u_int)(host_dataptr & 0xFFFFFFFF),
-- ahd_le32toh(scb->hscb->datacnt));
-+ aic_le32toh(scb->hscb->datacnt));
- }
- #endif
- /* Tell the adapter about the newly queued SCB */
-@@ -817,8 +837,8 @@ static __inline int ahd_intr(struct ahd_
- static __inline void
- ahd_sync_qoutfifo(struct ahd_softc *ahd, int op)
- {
-- ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap,
-- /*offset*/0, /*len*/AHC_SCB_MAX * sizeof(uint16_t), op);
-+ aic_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
-+ /*offset*/0, /*len*/AHD_SCB_MAX * sizeof(uint16_t), op);
- }
-
- static __inline void
-@@ -826,8 +846,8 @@ ahd_sync_tqinfifo(struct ahd_softc *ahd,
- {
- #ifdef AHD_TARGET_MODE
- if ((ahd->flags & AHD_TARGETROLE) != 0) {
-- ahd_dmamap_sync(ahd, ahd->shared_data_dmat,
-- ahd->shared_data_dmamap,
-+ aic_dmamap_sync(ahd, ahd->shared_data_dmat,
-+ ahd->shared_data_map.dmamap,
- ahd_targetcmd_offset(ahd, 0),
- sizeof(struct target_cmd) * AHD_TMODE_CMDS,
- op);
-@@ -847,7 +867,7 @@ ahd_check_cmdcmpltqueues(struct ahd_soft
- u_int retval;
-
- retval = 0;
-- ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap,
-+ aic_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
- /*offset*/ahd->qoutfifonext, /*len*/2,
- BUS_DMASYNC_POSTREAD);
- if ((ahd->qoutfifo[ahd->qoutfifonext]
-@@ -856,8 +876,8 @@ ahd_check_cmdcmpltqueues(struct ahd_soft
- #ifdef AHD_TARGET_MODE
- if ((ahd->flags & AHD_TARGETROLE) != 0
- && (ahd->flags & AHD_TQINFIFO_BLOCKED) == 0) {
-- ahd_dmamap_sync(ahd, ahd->shared_data_dmat,
-- ahd->shared_data_dmamap,
-+ aic_dmamap_sync(ahd, ahd->shared_data_dmat,
-+ ahd->shared_data_map.dmamap,
- ahd_targetcmd_offset(ahd, ahd->tqinfifofnext),
- /*len*/sizeof(struct target_cmd),
- BUS_DMASYNC_POSTREAD);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_osm.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_osm.c 2003-12-28 23:21:39.000000000 -0800
-@@ -1,7 +1,7 @@
- /*
- * Adaptec AIC79xx device driver for Linux.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#169 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#193 $
- *
- * --------------------------------------------------------------------------
- * Copyright (c) 1994-2000 Justin T. Gibbs.
-@@ -62,6 +62,16 @@
-
- #include <linux/mm.h> /* For fetching system memory size */
-
-+/************************* Magic SysReq Support *******************************/
-+static struct aic_sysrq_key_op ahd_sysrq_op =
-+{
-+ aic_sysrq_handler,
-+ "aic79xxstatedump",
-+ "Dump aic79xx controller information to Console"
-+};
-+
-+static int ahd_sysrq_key;
-+
- /*
- * Lock protecting manipulation of the ahd softc list.
- */
-@@ -425,7 +435,7 @@ static char *aic79xx = NULL;
- static char dummy_buffer[60] = "Please don't trounce on me insmod!!\n";
-
- MODULE_AUTHOR("Maintainer: Justin T. Gibbs <gibbs@scsiguy.com>");
--MODULE_DESCRIPTION("Adaptec Aic77XX/78XX SCSI Host Bus Adapter driver");
-+MODULE_DESCRIPTION("Adaptec Aic790X U320 SCSI Host Bus Adapter driver");
- #ifdef MODULE_LICENSE
- MODULE_LICENSE("Dual BSD/GPL");
- #endif
-@@ -466,7 +476,7 @@ MODULE_PARM_DESC(aic79xx,
- #endif
-
- static void ahd_linux_handle_scsi_status(struct ahd_softc *,
-- struct ahd_linux_device *,
-+ struct aic_linux_device *,
- struct scb *);
- static void ahd_linux_queue_cmd_complete(struct ahd_softc *ahd,
- Scsi_Cmnd *cmd);
-@@ -478,21 +488,20 @@ static void ahd_linux_initialize_scsi_bu
- static void ahd_linux_size_nseg(void);
- static void ahd_linux_thread_run_complete_queue(struct ahd_softc *ahd);
- static void ahd_linux_start_dv(struct ahd_softc *ahd);
--static void ahd_linux_dv_timeout(struct scsi_cmnd *cmd);
- static int ahd_linux_dv_thread(void *data);
- static void ahd_linux_kill_dv_thread(struct ahd_softc *ahd);
- static void ahd_linux_dv_target(struct ahd_softc *ahd, u_int target);
- static void ahd_linux_dv_transition(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahd_linux_dv_fill_cmd(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo);
- static void ahd_linux_dv_inq(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ,
-+ struct aic_linux_target *targ,
- u_int request_length);
- static void ahd_linux_dv_tur(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
-@@ -500,19 +509,19 @@ static void ahd_linux_dv_tur(struct ahd_
- static void ahd_linux_dv_rebd(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahd_linux_dv_web(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahd_linux_dv_reb(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahd_linux_dv_su(struct ahd_softc *ahd,
- struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ);
-+ struct aic_linux_target *targ);
- static __inline int
- ahd_linux_dv_fallback(struct ahd_softc *ahd,
- struct ahd_devinfo *devinfo);
-@@ -520,103 +529,57 @@ static int ahd_linux_fallback(struct ahd
- struct ahd_devinfo *devinfo);
- static __inline int ahd_linux_dv_fallback(struct ahd_softc *ahd,
- struct ahd_devinfo *devinfo);
--static void ahd_linux_dv_complete(Scsi_Cmnd *cmd);
--static void ahd_linux_generate_dv_pattern(struct ahd_linux_target *targ);
-+static void ahd_linux_generate_dv_pattern(struct aic_linux_target *targ);
- static u_int ahd_linux_user_tagdepth(struct ahd_softc *ahd,
- struct ahd_devinfo *devinfo);
- static u_int ahd_linux_user_dv_setting(struct ahd_softc *ahd);
- static void ahd_linux_setup_user_rd_strm_settings(struct ahd_softc *ahd);
--static void ahd_linux_device_queue_depth(struct ahd_softc *ahd,
-- struct ahd_linux_device *dev);
--static struct ahd_linux_target* ahd_linux_alloc_target(struct ahd_softc*,
-+static void aic_linux_device_queue_depth(struct ahd_softc *ahd,
-+ struct aic_linux_device *dev);
-+static struct aic_linux_target* ahd_linux_alloc_target(struct ahd_softc*,
- u_int, u_int);
- static void ahd_linux_free_target(struct ahd_softc*,
-- struct ahd_linux_target*);
--static struct ahd_linux_device* ahd_linux_alloc_device(struct ahd_softc*,
-- struct ahd_linux_target*,
-+ struct aic_linux_target*);
-+static struct aic_linux_device* ahd_linux_alloc_device(struct ahd_softc*,
-+ struct aic_linux_target*,
- u_int);
- static void ahd_linux_free_device(struct ahd_softc*,
-- struct ahd_linux_device*);
--static void ahd_linux_run_device_queue(struct ahd_softc*,
-- struct ahd_linux_device*);
-+ struct aic_linux_device*);
- static void ahd_linux_setup_tag_info_global(char *p);
- static aic_option_callback_t ahd_linux_setup_tag_info;
- static aic_option_callback_t ahd_linux_setup_rd_strm_info;
- static aic_option_callback_t ahd_linux_setup_dv;
- static aic_option_callback_t ahd_linux_setup_iocell_info;
- static int ahd_linux_next_unit(void);
--static void ahd_runq_tasklet(unsigned long data);
- static int aic79xx_setup(char *c);
-
- /****************************** Inlines ***************************************/
- static __inline void ahd_schedule_completeq(struct ahd_softc *ahd);
--static __inline void ahd_schedule_runq(struct ahd_softc *ahd);
--static __inline void ahd_setup_runq_tasklet(struct ahd_softc *ahd);
--static __inline void ahd_teardown_runq_tasklet(struct ahd_softc *ahd);
--static __inline struct ahd_linux_device*
-+static __inline struct aic_linux_device*
- ahd_linux_get_device(struct ahd_softc *ahd, u_int channel,
- u_int target, u_int lun, int alloc);
--static struct ahd_cmd *ahd_linux_run_complete_queue(struct ahd_softc *ahd);
--static __inline void ahd_linux_check_device_queue(struct ahd_softc *ahd,
-- struct ahd_linux_device *dev);
--static __inline struct ahd_linux_device *
-- ahd_linux_next_device_to_run(struct ahd_softc *ahd);
--static __inline void ahd_linux_run_device_queues(struct ahd_softc *ahd);
- static __inline void ahd_linux_unmap_scb(struct ahd_softc*, struct scb*);
--
--static __inline int ahd_linux_map_seg(struct ahd_softc *ahd, struct scb *scb,
-- struct ahd_dma_seg *sg,
-- bus_addr_t addr, bus_size_t len);
-+static __inline struct ahd_dma_seg*
-+ ahd_linux_sg_setup(struct ahd_softc *ahd, struct scb *scb,
-+ struct ahd_dma_seg *sg, bus_addr_t addr,
-+ bus_size_t len, int last_seg);
-
- static __inline void
- ahd_schedule_completeq(struct ahd_softc *ahd)
- {
-- if ((ahd->platform_data->flags & AHD_RUN_CMPLT_Q_TIMER) == 0) {
-- ahd->platform_data->flags |= AHD_RUN_CMPLT_Q_TIMER;
-+ if ((ahd->platform_data->flags & AIC_RUN_CMPLT_Q_TIMER) == 0) {
-+ ahd->platform_data->flags |= AIC_RUN_CMPLT_Q_TIMER;
- ahd->platform_data->completeq_timer.expires = jiffies;
- add_timer(&ahd->platform_data->completeq_timer);
- }
- }
-
--/*
-- * Must be called with our lock held.
-- */
--static __inline void
--ahd_schedule_runq(struct ahd_softc *ahd)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- tasklet_schedule(&ahd->platform_data->runq_tasklet);
--#else
-- /*
-- * Tasklets are not available, so run inline.
-- */
-- ahd_runq_tasklet((unsigned long)ahd);
--#endif
--}
--
--static __inline
--void ahd_setup_runq_tasklet(struct ahd_softc *ahd)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- tasklet_init(&ahd->platform_data->runq_tasklet, ahd_runq_tasklet,
-- (unsigned long)ahd);
--#endif
--}
--
--static __inline void
--ahd_teardown_runq_tasklet(struct ahd_softc *ahd)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- tasklet_kill(&ahd->platform_data->runq_tasklet);
--#endif
--}
--
--static __inline struct ahd_linux_device*
-+static __inline struct aic_linux_device*
- ahd_linux_get_device(struct ahd_softc *ahd, u_int channel, u_int target,
- u_int lun, int alloc)
- {
-- struct ahd_linux_target *targ;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_target *targ;
-+ struct aic_linux_device *dev;
- u_int target_offset;
-
- target_offset = target;
-@@ -638,10 +601,10 @@ ahd_linux_get_device(struct ahd_softc *a
- }
-
- #define AHD_LINUX_MAX_RETURNED_ERRORS 4
--static struct ahd_cmd *
-+static struct aic_cmd *
- ahd_linux_run_complete_queue(struct ahd_softc *ahd)
- {
-- struct ahd_cmd *acmd;
-+ struct aic_cmd *acmd;
- u_long done_flags;
- int with_errors;
-
-@@ -666,7 +629,7 @@ ahd_linux_run_complete_queue(struct ahd_
- acmd, acmd_links.tqe);
- cmd = &acmd_scsi_cmd(acmd);
- cmd->host_scribble = NULL;
-- if (ahd_cmd_get_transaction_status(cmd) != DID_OK
-+ if (aic_cmd_get_transaction_status(cmd) != DID_OK
- || (cmd->result & 0xFF) != SCSI_STATUS_OK)
- with_errors++;
-
-@@ -677,46 +640,6 @@ ahd_linux_run_complete_queue(struct ahd_
- }
-
- static __inline void
--ahd_linux_check_device_queue(struct ahd_softc *ahd,
-- struct ahd_linux_device *dev)
--{
-- if ((dev->flags & AHD_DEV_FREEZE_TIL_EMPTY) != 0
-- && dev->active == 0) {
-- dev->flags &= ~AHD_DEV_FREEZE_TIL_EMPTY;
-- dev->qfrozen--;
-- }
--
-- if (TAILQ_FIRST(&dev->busyq) == NULL
-- || dev->openings == 0 || dev->qfrozen != 0)
-- return;
--
-- ahd_linux_run_device_queue(ahd, dev);
--}
--
--static __inline struct ahd_linux_device *
--ahd_linux_next_device_to_run(struct ahd_softc *ahd)
--{
--
-- if ((ahd->flags & AHD_RESOURCE_SHORTAGE) != 0
-- || (ahd->platform_data->qfrozen != 0
-- && AHD_DV_SIMQ_FROZEN(ahd) == 0))
-- return (NULL);
-- return (TAILQ_FIRST(&ahd->platform_data->device_runq));
--}
--
--static __inline void
--ahd_linux_run_device_queues(struct ahd_softc *ahd)
--{
-- struct ahd_linux_device *dev;
--
-- while ((dev = ahd_linux_next_device_to_run(ahd)) != NULL) {
-- TAILQ_REMOVE(&ahd->platform_data->device_runq, dev, links);
-- dev->flags &= ~AHD_DEV_ON_RUN_LIST;
-- ahd_linux_check_device_queue(ahd, dev);
-- }
--}
--
--static __inline void
- ahd_linux_unmap_scb(struct ahd_softc *ahd, struct scb *scb)
- {
- Scsi_Cmnd *cmd;
-@@ -729,34 +652,22 @@ ahd_linux_unmap_scb(struct ahd_softc *ah
- struct scatterlist *sg;
-
- sg = (struct scatterlist *)cmd->request_buffer;
-- pci_unmap_sg(ahd->dev_softc, sg, cmd->use_sg, direction);
-+ aic_unmap_sg(ahd, sg, cmd->use_sg, direction);
- } else if (cmd->request_bufflen != 0) {
-- pci_unmap_single(ahd->dev_softc,
-+ aic_unmap_single(ahd,
- scb->platform_data->buf_busaddr,
- cmd->request_bufflen, direction);
- }
- }
-
--static __inline int
--ahd_linux_map_seg(struct ahd_softc *ahd, struct scb *scb,
-- struct ahd_dma_seg *sg, bus_addr_t addr, bus_size_t len)
-+static __inline struct ahd_dma_seg*
-+ahd_linux_sg_setup(struct ahd_softc *ahd, struct scb *scb,
-+ struct ahd_dma_seg *sg, bus_addr_t addr,
-+ bus_size_t len, int last_seg)
- {
-- int consumed;
--
-- if ((scb->sg_count + 1) > AHD_NSEG)
-- panic("Too few segs for dma mapping. "
-- "Increase AHD_NSEG\n");
--
-- consumed = 1;
-- sg->addr = ahd_htole32(addr & 0xFFFFFFFF);
-+ sg = ahd_sg_setup(ahd, scb, sg, addr, len, last_seg);
- scb->platform_data->xfer_len += len;
--
-- if (sizeof(bus_addr_t) > 4
-- && (ahd->flags & AHD_39BIT_ADDRESSING) != 0)
-- len |= (addr >> 8) & AHD_SG_HIGH_ADDR_MASK;
--
-- sg->len = ahd_htole32(len);
-- return (consumed);
-+ return (sg);
- }
-
- /******************************** Macros **************************************/
-@@ -797,7 +708,7 @@ static int ahd_linux_abort(Scsi_Cmnd
- * number of segments needed for the current transfer. Since the code that
- * sizes the SCSI malloc pool does not take into consideration fragmentation
- * of the pool, executing transactions numbering just a fraction of our
-- * concurrent transaction limit with SG list lengths aproaching AHC_NSEG will
-+ * concurrent transaction limit with SG list lengths aproaching AHD_NSEG will
- * quickly depleat the SCSI malloc pool of usable space. Unfortunately, the
- * mid-layer does not properly handle this scsi malloc failures for the S/G
- * array and the result can be a lockup of the I/O subsystem. We try to size
-@@ -848,6 +759,165 @@ ahd_linux_size_nseg(void)
- #endif
- }
-
-+/************************** Error Recovery ************************************/
-+static int ahd_linux_recovery_thread(void *arg);
-+
-+static int
-+ahd_linux_recovery_thread(void *arg)
-+{
-+ struct ahd_softc *ahd;
-+ u_long s;
-+
-+ ahd = (struct ahd_softc *)arg;
-+
-+ /*
-+ * Complete thread creation.
-+ */
-+ lock_kernel();
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,60)
-+ /*
-+ * Don't care about any signals.
-+ */
-+ siginitsetinv(¤t->blocked, 0);
-+
-+ daemonize();
-+ sprintf(current->comm, "ahd_recovery_%d", ahd->unit);
-+#else
-+ daemonize("ahd_recovery_%d", ahd->unit);
-+#endif
-+ unlock_kernel();
-+
-+ while (1) {
-+
-+ /*
-+ * Use down_interruptible() rather than down() to
-+ * avoid inclusion in the load average.
-+ */
-+ down_interruptible(&ahd->platform_data->recovery_sem);
-+
-+ ahd_lock(ahd, &s);
-+ if ((ahd->flags & AHD_SHUTDOWN_RECOVERY) != 0) {
-+ ahd_unlock(ahd, &s);
-+ break;
-+ }
-+
-+ /*
-+ * Don't bother the recovery handler if the
-+ * list has been cleared by a previous run
-+ * of the handler. This can happen when
-+ * several SCBs timeout before our handler
-+ * can run causing our semaphore to be up'ed
-+ * repeatedly. The extra calls need to be
-+ * avoided so that the recovery handler doesn't
-+ * confuse this case with timeouts occuring
-+ * due to interrupts failing to function.
-+ */
-+ if (LIST_EMPTY(&ahd->timedout_scbs) != 0) {
-+ ahd_unlock(ahd, &s);
-+ continue;
-+ }
-+
-+ ahd_unlock(ahd, &s);
-+ ahd_recover_commands(ahd);
-+
-+ /*
-+ * Process any pent up completions.
-+ */
-+ ahd_lock(ahd, &s);
-+ aic_schedule_runq(ahd);
-+ ahd_linux_run_complete_queue(ahd);
-+ ahd_unlock(ahd, &s);
-+ }
-+ up(&ahd->platform_data->recovery_ending_sem);
-+ return(0);
-+}
-+
-+int
-+ahd_spawn_recovery_thread(struct ahd_softc *ahd)
-+{
-+ ahd->platform_data->recovery_pid =
-+ kernel_thread(ahd_linux_recovery_thread, ahd, 0);
-+
-+ if (ahd->platform_data->recovery_pid < 0)
-+ return (-ahd->platform_data->recovery_pid);
-+
-+ return (0);
-+}
-+
-+void
-+ahd_terminate_recovery_thread(struct ahd_softc *ahd)
-+{
-+ u_long s;
-+
-+ ahd_lock(ahd, &s);
-+ if (ahd->platform_data->recovery_pid != 0) {
-+ ahd->flags |= AHD_SHUTDOWN_RECOVERY;
-+ ahd_unlock(ahd, &s);
-+ up(&ahd->platform_data->recovery_sem);
-+
-+ /*
-+ * Use the recovery_ending_sem as an indicator that
-+ * the dv thread is exiting. Note that the dv
-+ * thread must still return after performing
-+ * the up on our semaphore before it has
-+ * completely exited this module. Unfortunately,
-+ * there seems to be no easy way to wait for the
-+ * exit of a thread for which you are not the
-+ * parent (dv threads are parented by init).
-+ * Cross your fingers...
-+ */
-+ down(&ahd->platform_data->recovery_ending_sem);
-+
-+ /*
-+ * Mark the recovery thread as already dead. This
-+ * avoids attempting to kill it a second time.
-+ * This is necessary because we must kill the
-+ * our threads before calling ahd_free() in the
-+ * module shutdown case to avoid bogus locking
-+ * in the SCSI mid-layer, but when ahd_free() is
-+ * called without killing the DV thread in the
-+ * instance detach case, so ahd_platform_free()
-+ * calls us again to verify that the DV thread
-+ * is dead.
-+ */
-+ ahd->platform_data->recovery_pid = 0;
-+ } else {
-+ ahd_unlock(ahd, &s);
-+ }
-+}
-+
-+void
-+ahd_set_recoveryscb(struct ahd_softc *ahd, struct scb *scb)
-+{
-+ if ((scb->flags & SCB_RECOVERY_SCB) == 0) {
-+ struct scb *list_scb;
-+
-+ scb->flags |= SCB_RECOVERY_SCB;
-+
-+ /*
-+ * Take all queued, but not sent SCBs out of the equation.
-+ * Also ensure that no new commands are queued to us while we
-+ * try to fix this problem.
-+ */
-+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) == 0) {
-+ aic_freeze_simq(ahd);
-+ scb->platform_data->flags |= AIC_RELEASE_SIMQ;
-+ }
-+
-+ /*
-+ * Go through all of our pending SCBs and remove
-+ * any scheduled timeouts for them. We will reschedule
-+ * them after we've successfully fixed this problem.
-+ */
-+ LIST_FOREACH(list_scb, &ahd->pending_scbs, pending_links) {
-+
-+ scsi_delete_timer(list_scb->io_ctx);
-+ list_scb->platform_data->flags &= ~AIC_TIMEOUT_ACTIVE;
-+ }
-+ }
-+}
-+
-+/********************** Host Template Entry Points ****************************/
- /*
- * Try to detect an Adaptec 79XX controller.
- */
-@@ -870,7 +940,7 @@ ahd_linux_detect(Scsi_Host_Template *tem
- * that some of our hacks^H^H^H^H^Hassumptions aren't
- * violated.
- */
-- if (offsetof(struct ahd_cmd_internal, end)
-+ if (offsetof(struct aic_cmd_internal, end)
- > offsetof(struct scsi_cmnd, host_scribble)) {
- printf("ahd_linux_detect: SCSI data structures changed.\n");
- printf("ahd_linux_detect: Unable to attach\n");
-@@ -938,7 +1008,6 @@ ahd_linux_release(struct Scsi_Host * hos
- struct ahd_softc *ahd;
- u_long l;
-
-- ahd_list_lock(&l);
- if (host != NULL) {
-
- /*
-@@ -946,17 +1015,20 @@ ahd_linux_release(struct Scsi_Host * hos
- * the free directly, but check our
- * list for extra sanity.
- */
-+ ahd_list_lock(&l);
- ahd = ahd_find_softc(*(struct ahd_softc **)host->hostdata);
- if (ahd != NULL) {
- u_long s;
-
-+ TAILQ_REMOVE(&ahd_tailq, ahd, links);
-+ ahd_list_unlock(&l);
- ahd_lock(ahd, &s);
- ahd_intr_enable(ahd, FALSE);
- ahd_unlock(ahd, &s);
- ahd_free(ahd);
-- }
-+ } else
-+ ahd_list_unlock(&l);
- }
-- ahd_list_unlock(&l);
- return (0);
- }
- #endif
-@@ -996,7 +1068,7 @@ static int
- ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
- {
- struct ahd_softc *ahd;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_long flags;
-
- ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
-@@ -1015,9 +1087,9 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*
- * perform DV.
- */
- if (ahd->platform_data->qfrozen != 0
-- && AHD_DV_CMD(cmd) == 0) {
-+ && AIC_DV_CMD(cmd) == 0) {
-
-- ahd_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
-+ aic_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
- ahd_linux_queue_cmd_complete(ahd, cmd);
- ahd_schedule_completeq(ahd);
- ahd_midlayer_entrypoint_unlock(ahd, &flags);
-@@ -1027,7 +1099,8 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*
- cmd->device->id, cmd->device->lun,
- /*alloc*/TRUE);
- if (dev == NULL) {
-- ahd_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
-+
-+ aic_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
- ahd_linux_queue_cmd_complete(ahd, cmd);
- ahd_schedule_completeq(ahd);
- ahd_midlayer_entrypoint_unlock(ahd, &flags);
-@@ -1035,14 +1108,30 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*
- ahd_name(ahd));
- return (0);
- }
-- if (cmd->cmd_len > MAX_CDB_LEN)
-- return (-EINVAL);
-+
-+ if (cmd->cmd_len > MAX_CDB_LEN) {
-+
-+ aic_cmd_set_transaction_status(cmd, CAM_REQ_INVALID);
-+ ahd_linux_queue_cmd_complete(ahd, cmd);
-+ ahd_schedule_completeq(ahd);
-+ ahd_midlayer_entrypoint_unlock(ahd, &flags);
-+ printf("%s: aic79xx_linux_queue -"
-+ "CDB length of %d exceeds max!\n",
-+ ahd_name(ahd), cmd->cmd_len);
-+ return (0);
-+ }
-+
-+ /*
-+ * We perform our own timeout handling.
-+ */
-+ scsi_delete_timer(cmd);
-+
- cmd->result = CAM_REQ_INPROG << 16;
-- TAILQ_INSERT_TAIL(&dev->busyq, (struct ahd_cmd *)cmd, acmd_links.tqe);
-- if ((dev->flags & AHD_DEV_ON_RUN_LIST) == 0) {
-+ TAILQ_INSERT_TAIL(&dev->busyq, (struct aic_cmd *)cmd, acmd_links.tqe);
-+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
- TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq, dev, links);
-- dev->flags |= AHD_DEV_ON_RUN_LIST;
-- ahd_linux_run_device_queues(ahd);
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
-+ aic_linux_run_device_queues(ahd);
- }
- ahd_midlayer_entrypoint_unlock(ahd, &flags);
- return (0);
-@@ -1064,7 +1153,7 @@ static int
- ahd_linux_slave_configure(Scsi_Device *device)
- {
- struct ahd_softc *ahd;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_long flags;
-
- ahd = *((struct ahd_softc **)device->host->hostdata);
-@@ -1080,10 +1169,10 @@ ahd_linux_slave_configure(Scsi_Device *d
- device->id, device->lun,
- /*alloc*/TRUE);
- if (dev != NULL) {
-- dev->flags &= ~AHD_DEV_UNCONFIGURED;
-- dev->flags |= AHD_DEV_SLAVE_CONFIGURED;
-+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
-+ dev->flags |= AIC_DEV_SLAVE_CONFIGURED;
- dev->scsi_device = device;
-- ahd_linux_device_queue_depth(ahd, dev);
-+ aic_linux_device_queue_depth(ahd, dev);
- }
- ahd_midlayer_entrypoint_unlock(ahd, &flags);
- return (0);
-@@ -1093,7 +1182,7 @@ static void
- ahd_linux_slave_destroy(Scsi_Device *device)
- {
- struct ahd_softc *ahd;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_long flags;
-
- ahd = *((struct ahd_softc **)device->host->hostdata);
-@@ -1112,11 +1201,10 @@ ahd_linux_slave_destroy(Scsi_Device *dev
- * the refcounting process.
- */
- if (dev != NULL
-- && (dev->flags & AHD_DEV_SLAVE_CONFIGURED) != 0) {
-- dev->flags |= AHD_DEV_UNCONFIGURED;
-+ && (dev->flags & AIC_DEV_SLAVE_CONFIGURED) != 0) {
-+ dev->flags |= AIC_DEV_UNCONFIGURED;
- if (TAILQ_EMPTY(&dev->busyq)
-- && dev->active == 0
-- && (dev->flags & AHD_DEV_TIMER_ACTIVE) == 0)
-+ && dev->active == 0)
- ahd_linux_free_device(ahd, dev);
- }
- ahd_midlayer_entrypoint_unlock(ahd, &flags);
-@@ -1156,7 +1244,7 @@ ahd_linux_select_queue_depth(struct Scsi
- continue;
-
- if (device->host == host) {
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- /*
- * Since Linux has attached to the device, configure
-@@ -1167,13 +1255,13 @@ ahd_linux_select_queue_depth(struct Scsi
- device->id, device->lun,
- /*alloc*/TRUE);
- if (dev != NULL) {
-- dev->flags &= ~AHD_DEV_UNCONFIGURED;
-+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
- dev->scsi_device = device;
-- ahd_linux_device_queue_depth(ahd, dev);
-+ aic_linux_device_queue_depth(ahd, dev);
- device->queue_depth = dev->openings
- + dev->active;
-- if ((dev->flags & (AHD_DEV_Q_BASIC
-- | AHD_DEV_Q_TAGGED)) == 0) {
-+ if ((dev->flags & (AIC_DEV_Q_BASIC
-+ | AIC_DEV_Q_TAGGED)) == 0) {
- /*
- * We allow the OS to queue 2 untagged
- * transactions to us at any time even
-@@ -1262,9 +1350,9 @@ static int
- ahd_linux_abort(Scsi_Cmnd *cmd)
- {
- struct ahd_softc *ahd;
-- struct ahd_cmd *acmd;
-- struct ahd_cmd *list_acmd;
-- struct ahd_linux_device *dev;
-+ struct aic_cmd *acmd;
-+ struct aic_cmd *list_acmd;
-+ struct aic_linux_device *dev;
- struct scb *pending_scb;
- u_long s;
- u_int saved_scbptr;
-@@ -1282,7 +1370,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd)
- paused = FALSE;
- wait = FALSE;
- ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
-- acmd = (struct ahd_cmd *)cmd;
-+ acmd = (struct aic_cmd *)cmd;
-
- printf("%s:%d:%d:%d: Attempting to abort cmd %p:",
- ahd_name(ahd), cmd->device->channel, cmd->device->id,
-@@ -1341,6 +1429,17 @@ ahd_linux_abort(Scsi_Cmnd *cmd)
- cmd->device->lun);
- TAILQ_REMOVE(&dev->busyq, list_acmd, acmd_links.tqe);
- cmd->result = DID_ABORT << 16;
-+ /*
-+ * The completion handler believes that
-+ * commands without active timers running
-+ * have lost the race of completing before
-+ * their timer expires. Since commands in
-+ * our busy queues do not have timers running,
-+ * appease the mid-layer by adding a timer
-+ * now. This timer will be immediately
-+ * canceled by the midlayer.
-+ */
-+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
- ahd_linux_queue_cmd_complete(ahd, cmd);
- retval = SUCCESS;
- goto done;
-@@ -1516,7 +1615,7 @@ done:
- struct timer_list timer;
- int ret;
-
-- pending_scb->platform_data->flags |= AHD_SCB_UP_EH_SEM;
-+ pending_scb->platform_data->flags |= AIC_SCB_UP_EH_SEM;
- spin_unlock_irq(&ahd->platform_data->spin_lock);
- init_timer(&timer);
- timer.data = (u_long)pending_scb;
-@@ -1533,7 +1632,7 @@ done:
- }
- spin_lock_irq(&ahd->platform_data->spin_lock);
- }
-- ahd_schedule_runq(ahd);
-+ aic_schedule_runq(ahd);
- ahd_linux_run_complete_queue(ahd);
- ahd_midlayer_entrypoint_unlock(ahd, &s);
- return (retval);
-@@ -1554,7 +1653,7 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
- {
- struct ahd_softc *ahd;
- struct scsi_cmnd *recovery_cmd;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- struct ahd_initiator_tinfo *tinfo;
- struct ahd_tmode_tstate *tstate;
- struct scb *scb;
-@@ -1592,9 +1691,11 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
- recovery_cmd->host_scribble = (char *)scb;
- scb->io_ctx = recovery_cmd;
- scb->platform_data->dev = dev;
-+ scb->platform_data->flags = 0;
- scb->sg_count = 0;
-- ahd_set_residual(scb, 0);
-- ahd_set_sense_residual(scb, 0);
-+ aic_set_residual(scb, 0);
-+ aic_set_sense_residual(scb, 0);
-+ scb->platform_data->xfer_len = 0;
- hscb = scb->hscb;
- hscb->control = 0;
- hscb->scsiid = BUILD_SCSIID(ahd, cmd);
-@@ -1613,7 +1714,7 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
- LIST_INSERT_HEAD(&ahd->pending_scbs, scb, pending_links);
- ahd_queue_scb(ahd, scb);
-
-- scb->platform_data->flags |= AHD_SCB_UP_EH_SEM;
-+ scb->platform_data->flags |= AIC_SCB_UP_EH_SEM;
- spin_unlock_irq(&ahd->platform_data->spin_lock);
- init_timer(&timer);
- timer.data = (u_long)scb;
-@@ -1629,7 +1730,7 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
- retval = FAILED;
- }
- spin_lock_irq(&ahd->platform_data->spin_lock);
-- ahd_schedule_runq(ahd);
-+ aic_schedule_runq(ahd);
- ahd_linux_run_complete_queue(ahd);
- ahd_midlayer_entrypoint_unlock(ahd, &s);
- printf("%s: Device reset returning 0x%x\n", ahd_name(ahd), retval);
-@@ -1665,189 +1766,8 @@ ahd_linux_bus_reset(Scsi_Cmnd *cmd)
- return (SUCCESS);
- }
-
--Scsi_Host_Template aic79xx_driver_template = {
-- .module = THIS_MODULE,
-- .name = "aic79xx",
-- .proc_info = ahd_linux_proc_info,
-- .info = ahd_linux_info,
-- .queuecommand = ahd_linux_queue,
-- .eh_abort_handler = ahd_linux_abort,
-- .eh_device_reset_handler = ahd_linux_dev_reset,
-- .eh_bus_reset_handler = ahd_linux_bus_reset,
--#if defined(__i386__)
-- .bios_param = ahd_linux_biosparam,
--#endif
-- .can_queue = AHD_MAX_QUEUE,
-- .this_id = -1,
-- .cmd_per_lun = 2,
-- .use_clustering = ENABLE_CLUSTERING,
-- .slave_alloc = ahd_linux_slave_alloc,
-- .slave_configure = ahd_linux_slave_configure,
-- .slave_destroy = ahd_linux_slave_destroy,
--};
--
--/**************************** Tasklet Handler *********************************/
--
--/*
-- * In 2.4.X and above, this routine is called from a tasklet,
-- * so we must re-acquire our lock prior to executing this code.
-- * In all prior kernels, ahd_schedule_runq() calls this routine
-- * directly and ahd_schedule_runq() is called with our lock held.
-- */
--static void
--ahd_runq_tasklet(unsigned long data)
--{
-- struct ahd_softc* ahd;
-- struct ahd_linux_device *dev;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- u_long flags;
--#endif
--
-- ahd = (struct ahd_softc *)data;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- ahd_lock(ahd, &flags);
--#endif
-- while ((dev = ahd_linux_next_device_to_run(ahd)) != NULL) {
--
-- TAILQ_REMOVE(&ahd->platform_data->device_runq, dev, links);
-- dev->flags &= ~AHD_DEV_ON_RUN_LIST;
-- ahd_linux_check_device_queue(ahd, dev);
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- /* Yeild to our interrupt handler */
-- ahd_unlock(ahd, &flags);
-- ahd_lock(ahd, &flags);
--#endif
-- }
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- ahd_unlock(ahd, &flags);
--#endif
--}
--
--/******************************** Bus DMA *************************************/
--int
--ahd_dma_tag_create(struct ahd_softc *ahd, bus_dma_tag_t parent,
-- bus_size_t alignment, bus_size_t boundary,
-- bus_addr_t lowaddr, bus_addr_t highaddr,
-- bus_dma_filter_t *filter, void *filterarg,
-- bus_size_t maxsize, int nsegments,
-- bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
--{
-- bus_dma_tag_t dmat;
--
-- dmat = malloc(sizeof(*dmat), M_DEVBUF, M_NOWAIT);
-- if (dmat == NULL)
-- return (ENOMEM);
--
-- /*
-- * Linux is very simplistic about DMA memory. For now don't
-- * maintain all specification information. Once Linux supplies
-- * better facilities for doing these operations, or the
-- * needs of this particular driver change, we might need to do
-- * more here.
-- */
-- dmat->alignment = alignment;
-- dmat->boundary = boundary;
-- dmat->maxsize = maxsize;
-- *ret_tag = dmat;
-- return (0);
--}
--
--void
--ahd_dma_tag_destroy(struct ahd_softc *ahd, bus_dma_tag_t dmat)
--{
-- free(dmat, M_DEVBUF);
--}
--
--int
--ahd_dmamem_alloc(struct ahd_softc *ahd, bus_dma_tag_t dmat, void** vaddr,
-- int flags, bus_dmamap_t *mapp)
--{
-- bus_dmamap_t map;
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
-- if (map == NULL)
-- return (ENOMEM);
-- /*
-- * Although we can dma data above 4GB, our
-- * "consistent" memory is below 4GB for
-- * space efficiency reasons (only need a 4byte
-- * address). For this reason, we have to reset
-- * our dma mask when doing allocations.
-- */
-- if (ahd->dev_softc != NULL)
-- ahd_pci_set_dma_mask(ahd->dev_softc, 0xFFFFFFFF);
-- *vaddr = pci_alloc_consistent(ahd->dev_softc,
-- dmat->maxsize, &map->bus_addr);
-- if (ahd->dev_softc != NULL)
-- ahd_pci_set_dma_mask(ahd->dev_softc,
-- ahd->platform_data->hw_dma_mask);
--#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
-- /*
-- * At least in 2.2.14, malloc is a slab allocator so all
-- * allocations are aligned. We assume for these kernel versions
-- * that all allocations will be bellow 4Gig, physically contiguous,
-- * and accessible via DMA by the controller.
-- */
-- map = NULL; /* No additional information to store */
-- *vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT);
--#endif
-- if (*vaddr == NULL)
-- return (ENOMEM);
-- *mapp = map;
-- return(0);
--}
--
--void
--ahd_dmamem_free(struct ahd_softc *ahd, bus_dma_tag_t dmat,
-- void* vaddr, bus_dmamap_t map)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- pci_free_consistent(ahd->dev_softc, dmat->maxsize,
-- vaddr, map->bus_addr);
--#else
-- free(vaddr, M_DEVBUF);
--#endif
--}
--
--int
--ahd_dmamap_load(struct ahd_softc *ahd, bus_dma_tag_t dmat, bus_dmamap_t map,
-- void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
-- void *cb_arg, int flags)
--{
-- /*
-- * Assume for now that this will only be used during
-- * initialization and not for per-transaction buffer mapping.
-- */
-- bus_dma_segment_t stack_sg;
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- stack_sg.ds_addr = map->bus_addr;
--#else
--#define VIRT_TO_BUS(a) (uint32_t)virt_to_bus((void *)(a))
-- stack_sg.ds_addr = VIRT_TO_BUS(buf);
--#endif
-- stack_sg.ds_len = dmat->maxsize;
-- cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
-- return (0);
--}
--
--void
--ahd_dmamap_destroy(struct ahd_softc *ahd, bus_dma_tag_t dmat, bus_dmamap_t map)
--{
-- /*
-- * The map may is NULL in our < 2.3.X implementation.
-- */
-- if (map != NULL)
-- free(map, M_DEVBUF);
--}
--
--int
--ahd_dmamap_unload(struct ahd_softc *ahd, bus_dma_tag_t dmat, bus_dmamap_t map)
--{
-- /* Nothing to do */
-- return (0);
--}
-+Scsi_Host_Template aic79xx_driver_template =
-+ AIC_TEMPLATE_INITIALIZER("aic79xx", /*max_sectors*/8192);
-
- /********************* Platform Dependent Functions ***************************/
- /*
-@@ -1883,19 +1803,19 @@ ahd_softc_comp(struct ahd_softc *lahd, s
-
- /* Still equal. Sort by bus/slot/func. */
- if (aic79xx_reverse_scan != 0)
-- value = ahd_get_pci_bus(lahd->dev_softc)
-- - ahd_get_pci_bus(rahd->dev_softc);
-+ value = aic_get_pci_bus(lahd->dev_softc)
-+ - aic_get_pci_bus(rahd->dev_softc);
- else
-- value = ahd_get_pci_bus(rahd->dev_softc)
-- - ahd_get_pci_bus(lahd->dev_softc);
-+ value = aic_get_pci_bus(rahd->dev_softc)
-+ - aic_get_pci_bus(lahd->dev_softc);
- if (value != 0)
- return (value);
- if (aic79xx_reverse_scan != 0)
-- value = ahd_get_pci_slot(lahd->dev_softc)
-- - ahd_get_pci_slot(rahd->dev_softc);
-+ value = aic_get_pci_slot(lahd->dev_softc)
-+ - aic_get_pci_slot(rahd->dev_softc);
- else
-- value = ahd_get_pci_slot(rahd->dev_softc)
-- - ahd_get_pci_slot(lahd->dev_softc);
-+ value = aic_get_pci_slot(rahd->dev_softc)
-+ - aic_get_pci_slot(lahd->dev_softc);
- if (value != 0)
- return (value);
-
-@@ -2072,9 +1992,16 @@ ahd_linux_register_host(struct ahd_softc
- char *new_name;
- u_long s;
- u_long target;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ int error;
-+#endif
-
- template->name = ahd->description;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- host = scsi_host_alloc(template, sizeof(struct ahd_softc *));
-+#else
-+ host = scsi_register(template, sizeof(struct ahd_softc *));
-+#endif
- if (host == NULL)
- return (ENOMEM);
-
-@@ -2083,8 +2010,12 @@ ahd_linux_register_host(struct ahd_softc
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- scsi_assign_lock(host, &ahd->platform_data->spin_lock);
- #elif AHD_SCSI_HAS_HOST_LOCK != 0
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21)
-+ host->host_lock = &ahd->platform_data->spin_lock;
-+#else
- host->lock = &ahd->platform_data->spin_lock;
- #endif
-+#endif
- ahd->platform_data->host = host;
- host->can_queue = AHD_MAX_QUEUE;
- host->cmd_per_lun = 2;
-@@ -2110,13 +2041,20 @@ ahd_linux_register_host(struct ahd_softc
- ahd_linux_setup_user_rd_strm_settings(ahd);
- ahd_linux_initialize_scsi_bus(ahd);
- ahd_unlock(ahd, &s);
-+ ahd_sysrq_key = aic_install_sysrq(&ahd_sysrq_op);
-+ ahd_spawn_recovery_thread(ahd);
-+ if (ahd->platform_data->recovery_pid < 0) {
-+ printf("%s: Failed to create recovery thread, error= %d\n",
-+ ahd_name(ahd), ahd->platform_data->recovery_pid);
-+ return (-ahd->platform_data->recovery_pid);
-+ }
- ahd->platform_data->dv_pid = kernel_thread(ahd_linux_dv_thread, ahd, 0);
-- ahd_lock(ahd, &s);
- if (ahd->platform_data->dv_pid < 0) {
- printf("%s: Failed to create DV thread, error= %d\n",
- ahd_name(ahd), ahd->platform_data->dv_pid);
- return (-ahd->platform_data->dv_pid);
- }
-+ ahd_lock(ahd, &s);
- /*
- * Initially allocate *all* of our linux target objects
- * so that the DV thread will scan them all in parallel
-@@ -2136,7 +2074,7 @@ ahd_linux_register_host(struct ahd_softc
- * It is expected that either an external application
- * or a modified kernel will be used to probe this
- * ID if it is appropriate. To accommodate these
-- * installations, ahc_linux_alloc_target() will allocate
-+ * installations, ahd_linux_alloc_target() will allocate
- * for our ID if asked to do so.
- */
- if (target == ahd->our_id)
-@@ -2149,7 +2087,9 @@ ahd_linux_register_host(struct ahd_softc
- ahd_unlock(ahd, &s);
-
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-- scsi_add_host(host, &ahd->dev_softc->dev); /* XXX handle failure */
-+ error = scsi_add_host(host, ahd->dev_softc);
-+ if (error != 0)
-+ return (-error);
- scsi_scan_host(host);
- #endif
- return (0);
-@@ -2225,17 +2165,6 @@ ahd_linux_initialize_scsi_bus(struct ahd
- ahd_update_neg_request(ahd, &devinfo, tstate,
- tinfo, AHD_NEG_ALWAYS);
- }
-- /* Give the bus some time to recover */
-- if ((ahd->flags & AHD_RESET_BUS_A) != 0) {
-- ahd_freeze_simq(ahd);
-- init_timer(&ahd->platform_data->reset_timer);
-- ahd->platform_data->reset_timer.data = (u_long)ahd;
-- ahd->platform_data->reset_timer.expires =
-- jiffies + (AIC79XX_RESET_DELAY * HZ)/1000;
-- ahd->platform_data->reset_timer.function =
-- (ahd_linux_callback_t *)ahd_release_simq;
-- add_timer(&ahd->platform_data->reset_timer);
-- }
- }
-
- int
-@@ -2248,24 +2177,32 @@ ahd_platform_alloc(struct ahd_softc *ahd
- memset(ahd->platform_data, 0, sizeof(struct ahd_platform_data));
- TAILQ_INIT(&ahd->platform_data->completeq);
- TAILQ_INIT(&ahd->platform_data->device_runq);
-- ahd->platform_data->irq = AHD_LINUX_NOIRQ;
-+ ahd->platform_data->irq = AIC_LINUX_NOIRQ;
- ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
- ahd_lockinit(ahd);
- ahd_done_lockinit(ahd);
-+ init_timer(&ahd->platform_data->bus_settle_timer);
-+ ahd->platform_data->bus_settle_timer.data = (u_long)ahd;
-+ ahd->platform_data->bus_settle_timer.function =
-+ (aic_linux_callback_t *)aic_bus_settle_complete;
- init_timer(&ahd->platform_data->completeq_timer);
- ahd->platform_data->completeq_timer.data = (u_long)ahd;
- ahd->platform_data->completeq_timer.function =
-- (ahd_linux_callback_t *)ahd_linux_thread_run_complete_queue;
-+ (aic_linux_callback_t *)ahd_linux_thread_run_complete_queue;
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
- init_MUTEX_LOCKED(&ahd->platform_data->eh_sem);
- init_MUTEX_LOCKED(&ahd->platform_data->dv_sem);
- init_MUTEX_LOCKED(&ahd->platform_data->dv_cmd_sem);
-+ init_MUTEX_LOCKED(&ahd->platform_data->recovery_sem);
-+ init_MUTEX_LOCKED(&ahd->platform_data->recovery_ending_sem);
- #else
- ahd->platform_data->eh_sem = MUTEX_LOCKED;
- ahd->platform_data->dv_sem = MUTEX_LOCKED;
- ahd->platform_data->dv_cmd_sem = MUTEX_LOCKED;
-+ ahd->platform_data->recovery_sem = MUTEX_LOCKED;
-+ ahd->platform_data->recovery_ending_sem = MUTEX_LOCKED;
- #endif
-- ahd_setup_runq_tasklet(ahd);
-+ aic_setup_tasklets(ahd);
- ahd->seltime = (aic79xx_seltime & 0x3) << 4;
- return (0);
- }
-@@ -2273,19 +2210,22 @@ ahd_platform_alloc(struct ahd_softc *ahd
- void
- ahd_platform_free(struct ahd_softc *ahd)
- {
-- struct ahd_linux_target *targ;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_target *targ;
-+ struct aic_linux_device *dev;
- int i, j;
-
-+ aic_remove_sysrq(ahd_sysrq_key, &ahd_sysrq_op);
- if (ahd->platform_data != NULL) {
- del_timer_sync(&ahd->platform_data->completeq_timer);
- ahd_linux_kill_dv_thread(ahd);
-- ahd_teardown_runq_tasklet(ahd);
-+ aic_teardown_tasklets(ahd);
- if (ahd->platform_data->host != NULL) {
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- scsi_remove_host(ahd->platform_data->host);
--#endif
- scsi_host_put(ahd->platform_data->host);
-+#else
-+ scsi_unregister(ahd->platform_data->host);
-+#endif
- }
-
- /* destroy all of the device and target objects */
-@@ -2299,6 +2239,7 @@ ahd_platform_free(struct ahd_softc *ahd)
- if (targ->devices[j] == NULL)
- continue;
- dev = targ->devices[j];
-+ del_timer_sync(&dev->timer);
- ahd_linux_free_device(ahd, dev);
- }
- /*
-@@ -2309,7 +2250,7 @@ ahd_platform_free(struct ahd_softc *ahd)
- }
- }
-
-- if (ahd->platform_data->irq != AHD_LINUX_NOIRQ)
-+ if (ahd->platform_data->irq != AIC_LINUX_NOIRQ)
- free_irq(ahd->platform_data->irq, ahd);
- if (ahd->tags[0] == BUS_SPACE_PIO
- && ahd->bshs[0].ioport != 0)
-@@ -2377,7 +2318,7 @@ void
- ahd_platform_set_tags(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
- ahd_queue_alg alg)
- {
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- int was_queuing;
- int now_queuing;
-
-@@ -2386,27 +2327,27 @@ ahd_platform_set_tags(struct ahd_softc *
- devinfo->lun, /*alloc*/FALSE);
- if (dev == NULL)
- return;
-- was_queuing = dev->flags & (AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED);
-+ was_queuing = dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED);
- switch (alg) {
- default:
- case AHD_QUEUE_NONE:
- now_queuing = 0;
- break;
- case AHD_QUEUE_BASIC:
-- now_queuing = AHD_DEV_Q_BASIC;
-+ now_queuing = AIC_DEV_Q_BASIC;
- break;
- case AHD_QUEUE_TAGGED:
-- now_queuing = AHD_DEV_Q_TAGGED;
-+ now_queuing = AIC_DEV_Q_TAGGED;
- break;
- }
-- if ((dev->flags & AHD_DEV_FREEZE_TIL_EMPTY) == 0
-+ if ((dev->flags & AIC_DEV_FREEZE_TIL_EMPTY) == 0
- && (was_queuing != now_queuing)
- && (dev->active != 0)) {
-- dev->flags |= AHD_DEV_FREEZE_TIL_EMPTY;
-+ dev->flags |= AIC_DEV_FREEZE_TIL_EMPTY;
- dev->qfrozen++;
- }
-
-- dev->flags &= ~(AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED|AHD_DEV_PERIODIC_OTAG);
-+ dev->flags &= ~(AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED|AIC_DEV_PERIODIC_OTAG);
- if (now_queuing) {
- u_int usertags;
-
-@@ -2426,11 +2367,11 @@ ahd_platform_set_tags(struct ahd_softc *
- */
- dev->openings = 1;
- } else if (alg == AHD_QUEUE_TAGGED) {
-- dev->flags |= AHD_DEV_Q_TAGGED;
-+ dev->flags |= AIC_DEV_Q_TAGGED;
- if (aic79xx_periodic_otag != 0)
-- dev->flags |= AHD_DEV_PERIODIC_OTAG;
-+ dev->flags |= AIC_DEV_PERIODIC_OTAG;
- } else
-- dev->flags |= AHD_DEV_Q_BASIC;
-+ dev->flags |= AIC_DEV_Q_BASIC;
- } else {
- /* We can only have one opening. */
- dev->maxtags = 0;
-@@ -2438,13 +2379,13 @@ ahd_platform_set_tags(struct ahd_softc *
- }
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- if (dev->scsi_device != NULL) {
-- switch ((dev->flags & (AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED))) {
-- case AHD_DEV_Q_BASIC:
-+ switch ((dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED))) {
-+ case AIC_DEV_Q_BASIC:
- scsi_adjust_queue_depth(dev->scsi_device,
- MSG_SIMPLE_TASK,
- dev->openings + dev->active);
- break;
-- case AHD_DEV_Q_TAGGED:
-+ case AIC_DEV_Q_TAGGED:
- scsi_adjust_queue_depth(dev->scsi_device,
- MSG_ORDERED_TASK,
- dev->openings + dev->active);
-@@ -2497,9 +2438,9 @@ ahd_platform_abort_scbs(struct ahd_softc
- for (; targ < maxtarg; targ++) {
-
- for (; clun < maxlun; clun++) {
-- struct ahd_linux_device *dev;
-- struct ahd_busyq *busyq;
-- struct ahd_cmd *acmd;
-+ struct aic_linux_device *dev;
-+ struct aic_busyq *busyq;
-+ struct aic_cmd *acmd;
-
- dev = ahd_linux_get_device(ahd, /*chan*/0, targ,
- clun, /*alloc*/FALSE);
-@@ -2515,6 +2456,18 @@ ahd_platform_abort_scbs(struct ahd_softc
- acmd_links.tqe);
- count++;
- cmd->result = status << 16;
-+ /*
-+ * The completion handler believes that
-+ * commands without active timers running
-+ * have lost the race of completing before
-+ * their timer expires. Since commands in
-+ * our busy queues do not have timers running,
-+ * appease the mid-layer by adding a timer
-+ * now. This timer will be immediately
-+ * canceled by the midlayer.
-+ */
-+ scsi_add_timer(cmd, 60*HZ,
-+ aic_linux_midlayer_timeout);
- ahd_linux_queue_cmd_complete(ahd, cmd);
- }
- }
-@@ -2530,7 +2483,7 @@ ahd_linux_thread_run_complete_queue(stru
-
- ahd_lock(ahd, &flags);
- del_timer(&ahd->platform_data->completeq_timer);
-- ahd->platform_data->flags &= ~AHD_RUN_CMPLT_Q_TIMER;
-+ ahd->platform_data->flags &= ~AIC_RUN_CMPLT_Q_TIMER;
- ahd_linux_run_complete_queue(ahd);
- ahd_unlock(ahd, &flags);
- }
-@@ -2543,14 +2496,23 @@ ahd_linux_start_dv(struct ahd_softc *ahd
- * Freeze the simq and signal ahd_linux_queue to not let any
- * more commands through
- */
-- if ((ahd->platform_data->flags & AHD_DV_ACTIVE) == 0) {
-+ if ((ahd->platform_data->flags & AIC_DV_ACTIVE) == 0) {
- #ifdef AHD_DEBUG
- if (ahd_debug & AHD_SHOW_DV)
- printf("%s: Starting DV\n", ahd_name(ahd));
- #endif
-
-- ahd->platform_data->flags |= AHD_DV_ACTIVE;
-- ahd_freeze_simq(ahd);
-+ ahd->platform_data->flags |= AIC_DV_ACTIVE;
-+
-+ /*
-+ * Prevent upper layer from sending any
-+ * commands to us.
-+ */
-+ aic_freeze_simq(ahd);
-+ scsi_block_requests(ahd->platform_data->host);
-+ ahd_platform_abort_scbs(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS,
-+ CAM_LUN_WILDCARD, SCB_LIST_NULL,
-+ ROLE_INITIATOR, CAM_REQUEUE_REQ);
-
- /* Wake up the DV kthread */
- up(&ahd->platform_data->dv_sem);
-@@ -2589,6 +2551,7 @@ ahd_linux_dv_thread(void *data)
- unlock_kernel();
-
- while (1) {
-+
- /*
- * Use down_interruptible() rather than down() to
- * avoid inclusion in the load average.
-@@ -2597,7 +2560,7 @@ ahd_linux_dv_thread(void *data)
-
- /* Check to see if we've been signaled to exit */
- ahd_lock(ahd, &s);
-- if ((ahd->platform_data->flags & AHD_DV_SHUTDOWN) != 0) {
-+ if ((ahd->platform_data->flags & AIC_DV_SHUTDOWN) != 0) {
- ahd_unlock(ahd, &s);
- break;
- }
-@@ -2614,7 +2577,7 @@ ahd_linux_dv_thread(void *data)
- */
- ahd_lock(ahd, &s);
- while (LIST_FIRST(&ahd->pending_scbs) != NULL) {
-- ahd->platform_data->flags |= AHD_DV_WAIT_SIMQ_EMPTY;
-+ ahd->platform_data->flags |= AIC_DV_WAIT_SIMQ_EMPTY;
- ahd_unlock(ahd, &s);
- down_interruptible(&ahd->platform_data->dv_sem);
- ahd_lock(ahd, &s);
-@@ -2624,8 +2587,8 @@ ahd_linux_dv_thread(void *data)
- * Wait for the SIMQ to be released so that DV is the
- * only reason the queue is frozen.
- */
-- while (AHD_DV_SIMQ_FROZEN(ahd) == 0) {
-- ahd->platform_data->flags |= AHD_DV_WAIT_SIMQ_RELEASE;
-+ while (AIC_DV_SIMQ_FROZEN(ahd) == 0) {
-+ ahd->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
- ahd_unlock(ahd, &s);
- down_interruptible(&ahd->platform_data->dv_sem);
- ahd_lock(ahd, &s);
-@@ -2636,14 +2599,17 @@ ahd_linux_dv_thread(void *data)
- ahd_linux_dv_target(ahd, target);
-
- ahd_lock(ahd, &s);
-- ahd->platform_data->flags &= ~AHD_DV_ACTIVE;
-- ahd_unlock(ahd, &s);
-+ ahd->platform_data->flags &= ~AIC_DV_ACTIVE;
-
- /*
- * Release the SIMQ so that normal commands are
- * allowed to continue on the bus.
- */
-- ahd_release_simq(ahd);
-+ aic_release_simq_locked(ahd);
-+
-+ ahd_unlock(ahd, &s);
-+
-+ scsi_unblock_requests(ahd->platform_data->host);
- }
- up(&ahd->platform_data->eh_sem);
- return (0);
-@@ -2656,7 +2622,7 @@ ahd_linux_kill_dv_thread(struct ahd_soft
-
- ahd_lock(ahd, &s);
- if (ahd->platform_data->dv_pid != 0) {
-- ahd->platform_data->flags |= AHD_DV_SHUTDOWN;
-+ ahd->platform_data->flags |= AIC_DV_SHUTDOWN;
- ahd_unlock(ahd, &s);
- up(&ahd->platform_data->dv_sem);
-
-@@ -2676,10 +2642,10 @@ ahd_linux_kill_dv_thread(struct ahd_soft
- /*
- * Mark the dv thread as already dead. This
- * avoids attempting to kill it a second time.
-- * This is necessary because we must kill the
-- * DV thread before calling ahd_free() in the
-+ * This is necessary because we must kill our
-+ * threads before calling ahd_free() in the
- * module shutdown case to avoid bogus locking
-- * in the SCSI mid-layer, but we ahd_free() is
-+ * in the SCSI mid-layer, but when ahd_free() is
- * called without killing the DV thread in the
- * instance detach case, so ahd_platform_free()
- * calls us again to verify that the DV thread
-@@ -2699,10 +2665,10 @@ ahd_linux_kill_dv_thread(struct ahd_soft
- ahd_set_dv_state(ahd, targ, newstate, __LINE__)
-
- static __inline void
--ahd_set_dv_state(struct ahd_softc *ahd, struct ahd_linux_target *targ,
-- ahd_dv_state newstate, u_int line)
-+ahd_set_dv_state(struct ahd_softc *ahd, struct aic_linux_target *targ,
-+ aic_dv_state newstate, u_int line)
- {
-- ahd_dv_state oldstate;
-+ aic_dv_state oldstate;
-
- oldstate = targ->dv_state;
- #ifdef AHD_DEBUG
-@@ -2722,7 +2688,7 @@ static void
- ahd_linux_dv_target(struct ahd_softc *ahd, u_int target_offset)
- {
- struct ahd_devinfo devinfo;
-- struct ahd_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct scsi_cmnd *cmd;
- struct scsi_device *scsi_dev;
- struct scsi_sense_data *sense;
-@@ -2736,7 +2702,7 @@ ahd_linux_dv_target(struct ahd_softc *ah
- echo_size = 0;
- ahd_lock(ahd, &s);
- targ = ahd->platform_data->targets[target_offset];
-- if (targ == NULL || (targ->flags & AHD_DV_REQUIRED) == 0) {
-+ if (targ == NULL || (targ->flags & AIC_DV_REQUIRED) == 0) {
- ahd_unlock(ahd, &s);
- return;
- }
-@@ -2759,14 +2725,14 @@ ahd_linux_dv_target(struct ahd_softc *ah
- scsi_dev->channel = devinfo.channel - 'A';
- ahd->platform_data->dv_scsi_dev = scsi_dev;
-
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_INQ_SHORT_ASYNC);
-
-- while (targ->dv_state != AHD_DV_STATE_EXIT) {
-+ while (targ->dv_state != AIC_DV_STATE_EXIT) {
- timeout = AHD_LINUX_DV_TIMEOUT;
- switch (targ->dv_state) {
-- case AHD_DV_STATE_INQ_SHORT_ASYNC:
-- case AHD_DV_STATE_INQ_ASYNC:
-- case AHD_DV_STATE_INQ_ASYNC_VERIFY:
-+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
-+ case AIC_DV_STATE_INQ_ASYNC:
-+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
- /*
- * Set things to async narrow to reduce the
- * chance that the INQ will fail.
-@@ -2778,36 +2744,36 @@ ahd_linux_dv_target(struct ahd_softc *ah
- AHD_TRANS_GOAL, /*paused*/FALSE);
- ahd_unlock(ahd, &s);
- timeout = 10 * HZ;
-- targ->flags &= ~AHD_INQ_VALID;
-+ targ->flags &= ~AIC_INQ_VALID;
- /* FALLTHROUGH */
-- case AHD_DV_STATE_INQ_VERIFY:
-+ case AIC_DV_STATE_INQ_VERIFY:
- {
- u_int inq_len;
-
-- if (targ->dv_state == AHD_DV_STATE_INQ_SHORT_ASYNC)
-+ if (targ->dv_state == AIC_DV_STATE_INQ_SHORT_ASYNC)
- inq_len = AHD_LINUX_DV_INQ_SHORT_LEN;
- else
- inq_len = targ->inq_data->additional_length + 5;
- ahd_linux_dv_inq(ahd, cmd, &devinfo, targ, inq_len);
- break;
- }
-- case AHD_DV_STATE_TUR:
-- case AHD_DV_STATE_BUSY:
-+ case AIC_DV_STATE_TUR:
-+ case AIC_DV_STATE_BUSY:
- timeout = 5 * HZ;
- ahd_linux_dv_tur(ahd, cmd, &devinfo);
- break;
-- case AHD_DV_STATE_REBD:
-+ case AIC_DV_STATE_REBD:
- ahd_linux_dv_rebd(ahd, cmd, &devinfo, targ);
- break;
-- case AHD_DV_STATE_WEB:
-+ case AIC_DV_STATE_WEB:
- ahd_linux_dv_web(ahd, cmd, &devinfo, targ);
- break;
-
-- case AHD_DV_STATE_REB:
-+ case AIC_DV_STATE_REB:
- ahd_linux_dv_reb(ahd, cmd, &devinfo, targ);
- break;
-
-- case AHD_DV_STATE_SU:
-+ case AIC_DV_STATE_SU:
- ahd_linux_dv_su(ahd, cmd, &devinfo, targ);
- timeout = 50 * HZ;
- break;
-@@ -2819,8 +2785,6 @@ ahd_linux_dv_target(struct ahd_softc *ah
- }
-
- /* Queue the command and wait for it to complete */
-- /* Abuse eh_timeout in the scsi_cmnd struct for our purposes */
-- init_timer(&cmd->eh_timeout);
- #ifdef AHD_DEBUG
- if ((ahd_debug & AHD_SHOW_MESSAGES) != 0)
- /*
-@@ -2830,7 +2794,9 @@ ahd_linux_dv_target(struct ahd_softc *ah
- */
- timeout += HZ;
- #endif
-- scsi_add_timer(cmd, timeout, ahd_linux_dv_timeout);
-+ init_timer(&cmd->eh_timeout);
-+ cmd->timeout_per_command = timeout;
-+
- /*
- * In 2.5.X, it is assumed that all calls from the
- * "midlayer" (which we are emulating) will have the
-@@ -2849,13 +2815,14 @@ ahd_linux_dv_target(struct ahd_softc *ah
- spin_unlock_irqrestore(&io_request_lock, s);
- #endif
- down_interruptible(&ahd->platform_data->dv_cmd_sem);
-+
- /*
- * Wait for the SIMQ to be released so that DV is the
- * only reason the queue is frozen.
- */
- ahd_lock(ahd, &s);
-- while (AHD_DV_SIMQ_FROZEN(ahd) == 0) {
-- ahd->platform_data->flags |= AHD_DV_WAIT_SIMQ_RELEASE;
-+ while (AIC_DV_SIMQ_FROZEN(ahd) == 0) {
-+ ahd->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
- ahd_unlock(ahd, &s);
- down_interruptible(&ahd->platform_data->dv_sem);
- ahd_lock(ahd, &s);
-@@ -2866,7 +2833,7 @@ ahd_linux_dv_target(struct ahd_softc *ah
- }
-
- out:
-- if ((targ->flags & AHD_INQ_VALID) != 0
-+ if ((targ->flags & AIC_INQ_VALID) != 0
- && ahd_linux_get_device(ahd, devinfo.channel - 'A',
- devinfo.target, devinfo.lun,
- /*alloc*/FALSE) == NULL) {
-@@ -2877,7 +2844,7 @@ out:
- * parameters found in the inquiry string.
- */
- ahd_linux_filter_inquiry(ahd, &devinfo);
-- if ((targ->flags & (AHD_BASIC_DV|AHD_ENHANCED_DV)) != 0) {
-+ if ((targ->flags & (AIC_BASIC_DV|AIC_ENHANCED_DV)) != 0) {
- ahd_print_devinfo(ahd, &devinfo);
- printf("DV failed to configure device. "
- "Please file a bug report against "
-@@ -2902,7 +2869,7 @@ out:
- free(targ->dv_buffer1, M_DEVBUF);
- targ->dv_buffer1 = NULL;
- }
-- targ->flags &= ~AHD_DV_REQUIRED;
-+ targ->flags &= ~AIC_DV_REQUIRED;
- if (targ->refcount == 0)
- ahd_linux_free_target(ahd, targ);
- ahd_unlock(ahd, &s);
-@@ -2911,13 +2878,13 @@ out:
- static void
- ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ)
-+ struct aic_linux_target *targ)
- {
- u_int32_t status;
-
- status = aic_error_action(cmd, targ->inq_data,
-- ahd_cmd_get_transaction_status(cmd),
-- ahd_cmd_get_scsi_status(cmd));
-+ aic_cmd_get_transaction_status(cmd),
-+ aic_cmd_get_scsi_status(cmd));
-
-
- #ifdef AHD_DEBUG
-@@ -2930,8 +2897,8 @@ ahd_linux_dv_transition(struct ahd_softc
- #endif
-
- switch (targ->dv_state) {
-- case AHD_DV_STATE_INQ_SHORT_ASYNC:
-- case AHD_DV_STATE_INQ_ASYNC:
-+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
-+ case AIC_DV_STATE_INQ_ASYNC:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
-@@ -2940,21 +2907,21 @@ ahd_linux_dv_transition(struct ahd_softc
- }
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ)
- targ->dv_state_retry--;
- if ((status & SS_ERRMASK) == EBUSY)
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
- if (targ->dv_state_retry < 10)
- break;
- /* FALLTHROUGH */
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- #ifdef AHD_DEBUG
- if (ahd_debug & AHD_SHOW_DV) {
- ahd_print_devinfo(ahd, devinfo);
-@@ -2964,7 +2931,7 @@ ahd_linux_dv_transition(struct ahd_softc
- break;
- }
- break;
-- case AHD_DV_STATE_INQ_ASYNC_VERIFY:
-+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
-@@ -2978,12 +2945,12 @@ ahd_linux_dv_transition(struct ahd_softc
- * Try from the top again.
- */
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- }
-
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state+1);
-- targ->flags |= AHD_INQ_VALID;
-+ targ->flags |= AIC_INQ_VALID;
- if (ahd_linux_user_dv_setting(ahd) == 0)
- break;
-
-@@ -2996,33 +2963,33 @@ ahd_linux_dv_transition(struct ahd_softc
- default:
- case SID_SPI_CLOCK_ST:
- /* Assume only basic DV is supported. */
-- targ->flags |= AHD_BASIC_DV;
-+ targ->flags |= AIC_BASIC_DV;
- break;
- case SID_SPI_CLOCK_DT:
- case SID_SPI_CLOCK_DT_ST:
-- targ->flags |= AHD_ENHANCED_DV;
-+ targ->flags |= AIC_ENHANCED_DV;
- break;
- }
- break;
- }
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ)
- targ->dv_state_retry--;
-
- if ((status & SS_ERRMASK) == EBUSY)
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
- if (targ->dv_state_retry < 10)
- break;
- /* FALLTHROUGH */
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- #ifdef AHD_DEBUG
- if (ahd_debug & AHD_SHOW_DV) {
- ahd_print_devinfo(ahd, devinfo);
-@@ -3032,14 +2999,14 @@ ahd_linux_dv_transition(struct ahd_softc
- break;
- }
- break;
-- case AHD_DV_STATE_INQ_VERIFY:
-+ case AIC_DV_STATE_INQ_VERIFY:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
-
- if (memcmp(targ->inq_data, targ->dv_buffer,
- AHD_LINUX_DV_INQ_LEN) == 0) {
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
-
-@@ -3061,7 +3028,7 @@ ahd_linux_dv_transition(struct ahd_softc
- #endif
-
- if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -3074,18 +3041,18 @@ ahd_linux_dv_transition(struct ahd_softc
- }
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -3094,12 +3061,12 @@ ahd_linux_dv_transition(struct ahd_softc
- */
- targ->dv_state_retry = 0;
- } else if ((status & SS_ERRMASK) == EBUSY)
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
- if (targ->dv_state_retry < 10)
- break;
- /* FALLTHROUGH */
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- #ifdef AHD_DEBUG
- if (ahd_debug & AHD_SHOW_DV) {
- ahd_print_devinfo(ahd, devinfo);
-@@ -3110,33 +3077,33 @@ ahd_linux_dv_transition(struct ahd_softc
- }
- break;
-
-- case AHD_DV_STATE_TUR:
-+ case AIC_DV_STATE_TUR:
- switch (status & SS_MASK) {
- case SS_NOP:
-- if ((targ->flags & AHD_BASIC_DV) != 0) {
-+ if ((targ->flags & AIC_BASIC_DV) != 0) {
- ahd_linux_filter_inquiry(ahd, devinfo);
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_VERIFY);
-- } else if ((targ->flags & AHD_ENHANCED_DV) != 0) {
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_REBD);
-+ AIC_DV_STATE_INQ_VERIFY);
-+ } else if ((targ->flags & AIC_ENHANCED_DV) != 0) {
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_REBD);
- } else {
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- }
- break;
- case SS_RETRY:
- case SS_TUR:
- if ((status & SS_ERRMASK) == EBUSY) {
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
- break;
- }
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -3152,7 +3119,7 @@ ahd_linux_dv_transition(struct ahd_softc
- printf("DV TUR reties exhausted\n");
- }
- #endif
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- if (status & SSQ_DELAY)
-@@ -3160,25 +3127,25 @@ ahd_linux_dv_transition(struct ahd_softc
-
- break;
- case SS_START:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_SU);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_SU);
- break;
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHD_DV_STATE_REBD:
-+ case AIC_DV_STATE_REBD:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
- uint32_t echo_size;
-
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_WEB);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_WEB);
- echo_size = scsi_3btoul(&targ->dv_buffer[1]);
- echo_size &= 0x1FFF;
- #ifdef AHD_DEBUG
-@@ -3188,7 +3155,17 @@ ahd_linux_dv_transition(struct ahd_softc
- }
- #endif
- if (echo_size == 0) {
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ /*
-+ * Fall back to basic DV.
-+ */
-+ if (bootverbose) {
-+ ahd_print_devinfo(ahd, devinfo);
-+ printf("Echo Buffer unavailable. "
-+ "Performing basic DV.\n");
-+ }
-+ targ->flags &= ~AIC_ENHANCED_DV;
-+ targ->flags |= AIC_BASIC_DV;
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_TUR);
- break;
- }
-
-@@ -3203,11 +3180,11 @@ ahd_linux_dv_transition(struct ahd_softc
- }
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_RETRY:
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ)
- targ->dv_state_retry--;
- if (targ->dv_state_retry <= 10)
-@@ -3226,30 +3203,30 @@ ahd_linux_dv_transition(struct ahd_softc
- * and try level 1 DV.
- */
- ahd_linux_filter_inquiry(ahd, devinfo);
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_INQ_VERIFY);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_INQ_VERIFY);
- targ->dv_echo_size = 0;
- break;
- }
- break;
-
-- case AHD_DV_STATE_WEB:
-+ case AIC_DV_STATE_WEB:
- switch (status & SS_MASK) {
- case SS_NOP:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_REB);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_REB);
- break;
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_RETRY:
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -3268,22 +3245,22 @@ ahd_linux_dv_transition(struct ahd_softc
- }
- #endif
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHD_DV_STATE_REB:
-+ case AIC_DV_STATE_REB:
- switch (status & SS_MASK) {
- case SS_NOP:
- if (memcmp(targ->dv_buffer, targ->dv_buffer1,
- targ->dv_echo_size) != 0) {
- if (ahd_linux_dv_fallback(ahd, devinfo) != 0)
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- else
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_WEB);
-+ AIC_DV_STATE_WEB);
- break;
- }
-
-@@ -3295,24 +3272,24 @@ ahd_linux_dv_transition(struct ahd_softc
- free(targ->dv_buffer1, M_DEVBUF);
- targ->dv_buffer1 = NULL;
- }
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_RETRY:
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_WEB);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_WEB);
- }
- if (targ->dv_state_retry <= 10) {
- if ((status & (SSQ_DELAY_RANDOM|SSQ_DELAY))!= 0)
-@@ -3327,35 +3304,35 @@ ahd_linux_dv_transition(struct ahd_softc
- #endif
- /* FALLTHROUGH */
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHD_DV_STATE_SU:
-+ case AIC_DV_STATE_SU:
- switch (status & SS_MASK) {
- case SS_NOP:
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHD_DV_STATE_BUSY:
-+ case AIC_DV_STATE_BUSY:
- switch (status & SS_MASK) {
- case SS_NOP:
- case SS_INQ_REFRESH:
- AHD_SET_DV_STATE(ahd, targ,
-- AHD_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
-- if (ahd_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if (targ->dv_state_retry < 60) {
-@@ -3368,11 +3345,11 @@ ahd_linux_dv_transition(struct ahd_softc
- printf("DV BUSY reties exhausted\n");
- }
- #endif
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- }
- break;
- default:
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-@@ -3380,7 +3357,7 @@ ahd_linux_dv_transition(struct ahd_softc
- default:
- printf("%s: Invalid DV completion state %d\n", ahd_name(ahd),
- targ->dv_state);
-- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
-+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
- break;
- }
- }
-@@ -3400,7 +3377,7 @@ ahd_linux_dv_fill_cmd(struct ahd_softc *
- */
- static void
- ahd_linux_dv_inq(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
-- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ,
-+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ,
- u_int request_length)
- {
-
-@@ -3413,7 +3390,7 @@ ahd_linux_dv_inq(struct ahd_softc *ahd,
- if (targ->inq_data == NULL)
- targ->inq_data = malloc(AHD_LINUX_DV_INQ_LEN,
- M_DEVBUF, M_WAITOK);
-- if (targ->dv_state > AHD_DV_STATE_INQ_ASYNC) {
-+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC) {
- if (targ->dv_buffer != NULL)
- free(targ->dv_buffer, M_DEVBUF);
- targ->dv_buffer = malloc(AHD_LINUX_DV_INQ_LEN,
-@@ -3426,7 +3403,7 @@ ahd_linux_dv_inq(struct ahd_softc *ahd,
- cmd->cmnd[0] = INQUIRY;
- cmd->cmnd[4] = request_length;
- cmd->request_bufflen = request_length;
-- if (targ->dv_state > AHD_DV_STATE_INQ_ASYNC)
-+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC)
- cmd->request_buffer = targ->dv_buffer;
- else
- cmd->request_buffer = targ->inq_data;
-@@ -3455,7 +3432,7 @@ ahd_linux_dv_tur(struct ahd_softc *ahd,
-
- static void
- ahd_linux_dv_rebd(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
-- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ)
-+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ)
- {
-
- #ifdef AHD_DEBUG
-@@ -3480,7 +3457,7 @@ ahd_linux_dv_rebd(struct ahd_softc *ahd,
-
- static void
- ahd_linux_dv_web(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
-- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ)
-+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ)
- {
-
- #ifdef AHD_DEBUG
-@@ -3502,7 +3479,7 @@ ahd_linux_dv_web(struct ahd_softc *ahd,
-
- static void
- ahd_linux_dv_reb(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
-- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ)
-+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ)
- {
-
- #ifdef AHD_DEBUG
-@@ -3525,7 +3502,7 @@ ahd_linux_dv_reb(struct ahd_softc *ahd,
- static void
- ahd_linux_dv_su(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
- struct ahd_devinfo *devinfo,
-- struct ahd_linux_target *targ)
-+ struct aic_linux_target *targ)
- {
- u_int le;
-
-@@ -3560,7 +3537,7 @@ ahd_linux_dv_fallback(struct ahd_softc *
- static int
- ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
- {
-- struct ahd_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct ahd_initiator_tinfo *tinfo;
- struct ahd_transinfo *goal;
- struct ahd_tmode_tstate *tstate;
-@@ -3731,7 +3708,7 @@ ahd_linux_fallback(struct ahd_softc *ahd
- return (0);
- }
-
--static void
-+void
- ahd_linux_dv_timeout(struct scsi_cmnd *cmd)
- {
- struct ahd_softc *ahd;
-@@ -3765,29 +3742,18 @@ ahd_linux_dv_timeout(struct scsi_cmnd *c
- * error code.
- */
- if ((scb->flags & SCB_SENSE) != 0)
-- ahd_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
-+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
- else
-- ahd_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
- ahd_reset_channel(ahd, cmd->device->channel + 'A', /*initiate*/TRUE);
-
-- /*
-- * Add a minimal bus settle delay for devices that are slow to
-- * respond after bus resets.
-- */
-- ahd_freeze_simq(ahd);
-- init_timer(&ahd->platform_data->reset_timer);
-- ahd->platform_data->reset_timer.data = (u_long)ahd;
-- ahd->platform_data->reset_timer.expires = jiffies + HZ / 2;
-- ahd->platform_data->reset_timer.function =
-- (ahd_linux_callback_t *)ahd_release_simq;
-- add_timer(&ahd->platform_data->reset_timer);
-- if (ahd_linux_next_device_to_run(ahd) != NULL)
-- ahd_schedule_runq(ahd);
-+ if (aic_linux_next_device_to_run(ahd) != NULL)
-+ aic_schedule_runq(ahd);
- ahd_linux_run_complete_queue(ahd);
- ahd_unlock(ahd, &flags);
- }
-
--static void
-+void
- ahd_linux_dv_complete(struct scsi_cmnd *cmd)
- {
- struct ahd_softc *ahd;
-@@ -3809,7 +3775,7 @@ ahd_linux_dv_complete(struct scsi_cmnd *
- }
-
- static void
--ahd_linux_generate_dv_pattern(struct ahd_linux_target *targ)
-+ahd_linux_generate_dv_pattern(struct aic_linux_target *targ)
- {
- uint16_t b;
- u_int i;
-@@ -3975,8 +3941,8 @@ ahd_linux_setup_user_rd_strm_settings(st
- * Determines the queue depth for a given device.
- */
- static void
--ahd_linux_device_queue_depth(struct ahd_softc *ahd,
-- struct ahd_linux_device *dev)
-+aic_linux_device_queue_depth(struct ahd_softc *ahd,
-+ struct aic_linux_device *dev)
- {
- struct ahd_devinfo devinfo;
- u_int tags;
-@@ -3999,10 +3965,10 @@ ahd_linux_device_queue_depth(struct ahd_
- }
- }
-
--static void
--ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev)
-+void
-+ahd_linux_run_device_queue(struct ahd_softc *ahd, struct aic_linux_device *dev)
- {
-- struct ahd_cmd *acmd;
-+ struct aic_cmd *acmd;
- struct scsi_cmnd *cmd;
- struct scb *scb;
- struct hardware_scb *hscb;
-@@ -4011,7 +3977,7 @@ ahd_linux_run_device_queue(struct ahd_so
- u_int col_idx;
- uint16_t mask;
-
-- if ((dev->flags & AHD_DEV_ON_RUN_LIST) != 0)
-+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) != 0)
- panic("running device on run list");
-
- while ((acmd = TAILQ_FIRST(&dev->busyq)) != NULL
-@@ -4022,11 +3988,11 @@ ahd_linux_run_device_queue(struct ahd_so
- * running is because the whole controller Q is frozen.
- */
- if (ahd->platform_data->qfrozen != 0
-- && AHD_DV_SIMQ_FROZEN(ahd) == 0) {
-+ && AIC_DV_SIMQ_FROZEN(ahd) == 0) {
-
- TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq,
- dev, links);
-- dev->flags |= AHD_DEV_ON_RUN_LIST;
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
- return;
- }
-
-@@ -4037,7 +4003,7 @@ ahd_linux_run_device_queue(struct ahd_so
- */
- tinfo = ahd_fetch_transinfo(ahd, 'A', ahd->our_id,
- cmd->device->id, &tstate);
-- if ((dev->flags & (AHD_DEV_Q_TAGGED|AHD_DEV_Q_BASIC)) == 0
-+ if ((dev->flags & (AIC_DEV_Q_TAGGED|AIC_DEV_Q_BASIC)) == 0
- || (tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ) != 0) {
- col_idx = AHD_NEVER_COL_IDX;
- } else {
-@@ -4047,13 +4013,14 @@ ahd_linux_run_device_queue(struct ahd_so
- if ((scb = ahd_get_scb(ahd, col_idx)) == NULL) {
- TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq,
- dev, links);
-- dev->flags |= AHD_DEV_ON_RUN_LIST;
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
- ahd->flags |= AHD_RESOURCE_SHORTAGE;
- return;
- }
- TAILQ_REMOVE(&dev->busyq, acmd, acmd_links.tqe);
- scb->io_ctx = cmd;
- scb->platform_data->dev = dev;
-+ scb->platform_data->flags = 0;
- hscb = scb->hscb;
- cmd->host_scribble = (char *)scb;
-
-@@ -4069,7 +4036,7 @@ ahd_linux_run_device_queue(struct ahd_so
- if ((ahd->user_discenable & mask) != 0)
- hscb->control |= DISCENB;
-
-- if (AHD_DV_CMD(cmd) != 0)
-+ if (AIC_DV_CMD(cmd) != 0)
- scb->flags |= SCB_SILENT;
-
- if ((tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ) != 0)
-@@ -4080,7 +4047,7 @@ ahd_linux_run_device_queue(struct ahd_so
- scb->hscb->control |= MK_MESSAGE;
- }
-
-- if ((dev->flags & (AHD_DEV_Q_TAGGED|AHD_DEV_Q_BASIC)) != 0) {
-+ if ((dev->flags & (AIC_DEV_Q_TAGGED|AIC_DEV_Q_BASIC)) != 0) {
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- int msg_bytes;
- uint8_t tag_msgs[2];
-@@ -4092,8 +4059,8 @@ ahd_linux_run_device_queue(struct ahd_so
- dev->commands_since_idle_or_otag = 0;
- } else
- #endif
-- if (dev->commands_since_idle_or_otag == AHD_OTAG_THRESH
-- && (dev->flags & AHD_DEV_Q_TAGGED) != 0) {
-+ if (dev->commands_since_idle_or_otag == AIC_OTAG_THRESH
-+ && (dev->flags & AIC_DEV_Q_TAGGED) != 0) {
- hscb->control |= MSG_ORDERED_TASK;
- dev->commands_since_idle_or_otag = 0;
- } else {
-@@ -4105,8 +4072,9 @@ ahd_linux_run_device_queue(struct ahd_so
- memcpy(hscb->shared_data.idata.cdb, cmd->cmnd, hscb->cdb_len);
-
- scb->sg_count = 0;
-- ahd_set_residual(scb, 0);
-- ahd_set_sense_residual(scb, 0);
-+ aic_set_residual(scb, 0);
-+ aic_set_sense_residual(scb, 0);
-+ scb->platform_data->xfer_len = 0;
- if (cmd->use_sg != 0) {
- void *sg;
- struct scatterlist *cur_seg;
-@@ -4115,18 +4083,15 @@ ahd_linux_run_device_queue(struct ahd_so
-
- cur_seg = (struct scatterlist *)cmd->request_buffer;
- dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
-- nseg = pci_map_sg(ahd->dev_softc, cur_seg,
-- cmd->use_sg, dir);
-- scb->platform_data->xfer_len = 0;
-+ nseg = aic_map_sg(ahd, cur_seg, cmd->use_sg, dir);
- for (sg = scb->sg_list; nseg > 0; nseg--, cur_seg++) {
- bus_addr_t addr;
- bus_size_t len;
-
- addr = sg_dma_address(cur_seg);
- len = sg_dma_len(cur_seg);
-- scb->platform_data->xfer_len += len;
-- sg = ahd_sg_setup(ahd, scb, sg, addr, len,
-- /*last*/nseg == 1);
-+ sg = ahd_linux_sg_setup(ahd, scb, sg, addr, len,
-+ /*last*/nseg == 1);
- }
- } else if (cmd->request_bufflen != 0) {
- void *sg;
-@@ -4135,13 +4100,13 @@ ahd_linux_run_device_queue(struct ahd_so
-
- sg = scb->sg_list;
- dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
-- addr = pci_map_single(ahd->dev_softc,
-+ addr = aic_map_single(ahd,
- cmd->request_buffer,
- cmd->request_bufflen, dir);
-- scb->platform_data->xfer_len = cmd->request_bufflen;
- scb->platform_data->buf_busaddr = addr;
-- sg = ahd_sg_setup(ahd, scb, sg, addr,
-- cmd->request_bufflen, /*last*/TRUE);
-+ sg = ahd_linux_sg_setup(ahd, scb, sg, addr,
-+ cmd->request_bufflen,
-+ /*last*/TRUE);
- }
-
- LIST_INSERT_HEAD(&ahd->pending_scbs, scb, pending_links);
-@@ -4157,9 +4122,10 @@ ahd_linux_run_device_queue(struct ahd_so
- dev->target->cmds_since_error = 0;
- }
-
-- if ((dev->flags & AHD_DEV_PERIODIC_OTAG) != 0)
-+ if ((dev->flags & AIC_DEV_PERIODIC_OTAG) != 0)
- dev->commands_since_idle_or_otag++;
- scb->flags |= SCB_ACTIVE;
-+ aic_scb_timer_start(scb);
- ahd_queue_scb(ahd, scb);
- }
- }
-@@ -4177,8 +4143,8 @@ ahd_linux_isr(int irq, void *dev_id, str
- ahd = (struct ahd_softc *) dev_id;
- ahd_lock(ahd, &flags);
- ours = ahd_intr(ahd);
-- if (ahd_linux_next_device_to_run(ahd) != NULL)
-- ahd_schedule_runq(ahd);
-+ if (aic_linux_next_device_to_run(ahd) != NULL)
-+ aic_schedule_runq(ahd);
- ahd_linux_run_complete_queue(ahd);
- ahd_unlock(ahd, &flags);
- return IRQ_RETVAL(ours);
-@@ -4192,10 +4158,10 @@ ahd_platform_flushwork(struct ahd_softc
- ;
- }
-
--static struct ahd_linux_target*
-+static struct aic_linux_target*
- ahd_linux_alloc_target(struct ahd_softc *ahd, u_int channel, u_int target)
- {
-- struct ahd_linux_target *targ;
-+ struct aic_linux_target *targ;
-
- targ = malloc(sizeof(*targ), M_DEVBUF, M_NOWAIT);
- if (targ == NULL)
-@@ -4203,14 +4169,14 @@ ahd_linux_alloc_target(struct ahd_softc
- memset(targ, 0, sizeof(*targ));
- targ->channel = channel;
- targ->target = target;
-- targ->ahd = ahd;
-- targ->flags = AHD_DV_REQUIRED;
-+ targ->softc = ahd;
-+ targ->flags = AIC_DV_REQUIRED;
- ahd->platform_data->targets[target] = targ;
- return (targ);
- }
-
- static void
--ahd_linux_free_target(struct ahd_softc *ahd, struct ahd_linux_target *targ)
-+ahd_linux_free_target(struct ahd_softc *ahd, struct aic_linux_target *targ)
- {
- struct ahd_devinfo devinfo;
- struct ahd_initiator_tinfo *tinfo;
-@@ -4246,11 +4212,11 @@ ahd_linux_free_target(struct ahd_softc *
- free(targ, M_DEVBUF);
- }
-
--static struct ahd_linux_device*
-+static struct aic_linux_device*
- ahd_linux_alloc_device(struct ahd_softc *ahd,
-- struct ahd_linux_target *targ, u_int lun)
-+ struct aic_linux_target *targ, u_int lun)
- {
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- dev = malloc(sizeof(*dev), M_DEVBUG, M_NOWAIT);
- if (dev == NULL)
-@@ -4258,7 +4224,7 @@ ahd_linux_alloc_device(struct ahd_softc
- memset(dev, 0, sizeof(*dev));
- init_timer(&dev->timer);
- TAILQ_INIT(&dev->busyq);
-- dev->flags = AHD_DEV_UNCONFIGURED;
-+ dev->flags = AIC_DEV_UNCONFIGURED;
- dev->lun = lun;
- dev->target = targ;
-
-@@ -4281,9 +4247,9 @@ ahd_linux_alloc_device(struct ahd_softc
- }
-
- static void
--ahd_linux_free_device(struct ahd_softc *ahd, struct ahd_linux_device *dev)
-+ahd_linux_free_device(struct ahd_softc *ahd, struct aic_linux_device *dev)
- {
-- struct ahd_linux_target *targ;
-+ struct aic_linux_target *targ;
-
- del_timer(&dev->timer);
- targ = dev->target;
-@@ -4291,7 +4257,7 @@ ahd_linux_free_device(struct ahd_softc *
- free(dev, M_DEVBUF);
- targ->refcount--;
- if (targ->refcount == 0
-- && (targ->flags & AHD_DV_REQUIRED) == 0)
-+ && (targ->flags & AIC_DV_REQUIRED) == 0)
- ahd_linux_free_target(ahd, targ);
- }
-
-@@ -4303,7 +4269,7 @@ ahd_send_async(struct ahd_softc *ahd, ch
- case AC_TRANSFER_NEG:
- {
- char buf[80];
-- struct ahd_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct info_str info;
- struct ahd_initiator_tinfo *tinfo;
- struct ahd_tmode_tstate *tstate;
-@@ -4391,6 +4357,20 @@ ahd_send_async(struct ahd_softc *ahd, ch
- channel - 'A');
- }
- #endif
-+ /*
-+ * Add a minimal bus settle delay for devices that are slow to
-+ * respond after bus resets.
-+ */
-+ if ((ahd->platform_data->flags & AIC_BUS_SETTLE_TIMER) == 0) {
-+ aic_freeze_simq(ahd);
-+ ahd->platform_data->flags |= AIC_BUS_SETTLE_TIMER;
-+ ahd->platform_data->bus_settle_timer.expires =
-+ jiffies + (AIC79XX_RESET_DELAY * HZ)/1000;
-+ add_timer(&ahd->platform_data->bus_settle_timer);
-+ } else {
-+ mod_timer(&ahd->platform_data->bus_settle_timer,
-+ jiffies + (AIC79XX_RESET_DELAY * HZ)/1000);
-+ }
- break;
- default:
- panic("ahd_send_async: Unexpected async event");
-@@ -4404,14 +4384,18 @@ void
- ahd_done(struct ahd_softc *ahd, struct scb *scb)
- {
- Scsi_Cmnd *cmd;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- if ((scb->flags & SCB_ACTIVE) == 0) {
- printf("SCB %d done'd twice\n", SCB_GET_TAG(scb));
- ahd_dump_card_state(ahd);
- panic("Stopping for safety");
- }
-+
- LIST_REMOVE(scb, pending_links);
-+ if ((scb->flags & SCB_TIMEDOUT) != 0)
-+ LIST_REMOVE(scb, timedout_links);
-+
- cmd = scb->io_ctx;
- dev = scb->platform_data->dev;
- dev->active--;
-@@ -4429,11 +4413,11 @@ ahd_done(struct ahd_softc *ahd, struct s
- * the sense buffer looks "sane".
- */
- cmd->sense_buffer[0] = 0;
-- if (ahd_get_transaction_status(scb) == CAM_REQ_INPROG) {
-+ if (aic_get_transaction_status(scb) == CAM_REQ_INPROG) {
- uint32_t amount_xferred;
-
- amount_xferred =
-- ahd_get_transfer_length(scb) - ahd_get_residual(scb);
-+ aic_get_transfer_length(scb) - aic_get_residual(scb);
- if ((scb->flags & SCB_TRANSMISSION_ERROR) != 0) {
- #ifdef AHD_DEBUG
- if ((ahd_debug & AHD_SHOW_MISC) != 0) {
-@@ -4441,7 +4425,17 @@ ahd_done(struct ahd_softc *ahd, struct s
- printf("Set CAM_UNCOR_PARITY\n");
- }
- #endif
-- ahd_set_transaction_status(scb, CAM_UNCOR_PARITY);
-+ aic_set_transaction_status(scb, CAM_UNCOR_PARITY);
-+#ifdef AHD_REPORT_UNDERFLOWS
-+ /*
-+ * This code is disabled by default as some
-+ * clients of the SCSI system do not properly
-+ * initialize the underflow parameter. This
-+ * results in spurious termination of commands
-+ * that complete as expected (e.g. underflow is
-+ * allowed as command can return variable amounts
-+ * of data.
-+ */
- } else if (amount_xferred < scb->io_ctx->underflow) {
- u_int i;
-
-@@ -4453,30 +4447,31 @@ ahd_done(struct ahd_softc *ahd, struct s
- ahd_print_path(ahd, scb);
- printf("Saw underflow (%ld of %ld bytes). "
- "Treated as error\n",
-- ahd_get_residual(scb),
-- ahd_get_transfer_length(scb));
-- ahd_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-+ aic_get_residual(scb),
-+ aic_get_transfer_length(scb));
-+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-+#endif
- } else {
-- ahd_set_transaction_status(scb, CAM_REQ_CMP);
-+ aic_set_transaction_status(scb, CAM_REQ_CMP);
- }
-- } else if (ahd_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
-+ } else if (aic_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
- ahd_linux_handle_scsi_status(ahd, dev, scb);
-- } else if (ahd_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
-- dev->flags |= AHD_DEV_UNCONFIGURED;
-- if (AHD_DV_CMD(cmd) == FALSE)
-- dev->target->flags &= ~AHD_DV_REQUIRED;
-+ } else if (aic_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
-+ dev->flags |= AIC_DEV_UNCONFIGURED;
-+ if (AIC_DV_CMD(cmd) == FALSE)
-+ dev->target->flags &= ~AIC_DV_REQUIRED;
- }
- /*
- * Start DV for devices that require it assuming the first command
- * sent does not result in a selection timeout.
- */
-- if (ahd_get_transaction_status(scb) != CAM_SEL_TIMEOUT
-- && (dev->target->flags & AHD_DV_REQUIRED) != 0)
-+ if (aic_get_transaction_status(scb) != CAM_SEL_TIMEOUT
-+ && (dev->target->flags & AIC_DV_REQUIRED) != 0)
- ahd_linux_start_dv(ahd);
-
- if (dev->openings == 1
-- && ahd_get_transaction_status(scb) == CAM_REQ_CMP
-- && ahd_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
-+ && aic_get_transaction_status(scb) == CAM_REQ_CMP
-+ && aic_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
- dev->tag_success_count++;
- /*
- * Some devices deal with temporary internal resource
-@@ -4485,7 +4480,7 @@ ahd_done(struct ahd_softc *ahd, struct s
- * back to our previous queue depth.
- */
- if ((dev->openings + dev->active) < dev->maxtags
-- && dev->tag_success_count > AHD_TAG_SUCCESS_INTERVAL) {
-+ && dev->tag_success_count > AIC_TAG_SUCCESS_INTERVAL) {
- dev->tag_success_count = 0;
- dev->openings++;
- }
-@@ -4494,39 +4489,68 @@ ahd_done(struct ahd_softc *ahd, struct s
- dev->commands_since_idle_or_otag = 0;
-
- if (TAILQ_EMPTY(&dev->busyq)) {
-- if ((dev->flags & AHD_DEV_UNCONFIGURED) != 0
-- && dev->active == 0
-- && (dev->flags & AHD_DEV_TIMER_ACTIVE) == 0)
-+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
-+ && dev->active == 0)
- ahd_linux_free_device(ahd, dev);
-- } else if ((dev->flags & AHD_DEV_ON_RUN_LIST) == 0) {
-+ } else if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
- TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq, dev, links);
-- dev->flags |= AHD_DEV_ON_RUN_LIST;
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
- }
-
- if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
- printf("Recovery SCB completes\n");
-- if (ahd_get_transaction_status(scb) == CAM_BDR_SENT
-- || ahd_get_transaction_status(scb) == CAM_REQ_ABORTED)
-- ahd_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-- if ((scb->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) {
-- scb->platform_data->flags &= ~AHD_SCB_UP_EH_SEM;
-+ if (aic_get_transaction_status(scb) == CAM_BDR_SENT
-+ || aic_get_transaction_status(scb) == CAM_REQ_ABORTED)
-+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
-+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
- up(&ahd->platform_data->eh_sem);
-+ } else {
-+ struct scb *list_scb;
-+
-+ /*
-+ * We were able to complete the command successfully,
-+ * so reinstate the timeouts for all other pending
-+ * commands.
-+ */
-+ LIST_FOREACH(list_scb,
-+ &ahd->pending_scbs, pending_links) {
-+
-+ aic_scb_timer_start(list_scb);
-+ }
- }
- }
-
-+ if ((scb->platform_data->flags & AIC_TIMEOUT_ACTIVE) == 0) {
-+ /*
-+ * The completion handler believes that
-+ * commands without active timers running
-+ * have lost the race of completing before
-+ * their timer expires. Since commands in
-+ * our busy queues do not have timers running,
-+ * appease the mid-layer by adding a timer
-+ * now. This timer will be immediately
-+ * canceled by the midlayer.
-+ */
-+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
-+ }
-+
-+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) != 0)
-+ aic_release_simq_locked(ahd);
-+
- ahd_free_scb(ahd, scb);
- ahd_linux_queue_cmd_complete(ahd, cmd);
-
-- if ((ahd->platform_data->flags & AHD_DV_WAIT_SIMQ_EMPTY) != 0
-+ if ((ahd->platform_data->flags & AIC_DV_WAIT_SIMQ_EMPTY) != 0
- && LIST_FIRST(&ahd->pending_scbs) == NULL) {
-- ahd->platform_data->flags &= ~AHD_DV_WAIT_SIMQ_EMPTY;
-+ ahd->platform_data->flags &= ~AIC_DV_WAIT_SIMQ_EMPTY;
- up(&ahd->platform_data->dv_sem);
- }
- }
-
- static void
- ahd_linux_handle_scsi_status(struct ahd_softc *ahd,
-- struct ahd_linux_device *dev, struct scb *scb)
-+ struct aic_linux_device *dev, struct scb *scb)
- {
- struct ahd_devinfo devinfo;
-
-@@ -4546,7 +4570,7 @@ ahd_linux_handle_scsi_status(struct ahd_
- * we don't clobber the device with too many
- * commands.
- */
-- switch (ahd_get_scsi_status(scb)) {
-+ switch (aic_get_scsi_status(scb)) {
- default:
- break;
- case SCSI_STATUS_CHECK_COND:
-@@ -4560,13 +4584,15 @@ ahd_linux_handle_scsi_status(struct ahd_
- */
- cmd = scb->io_ctx;
- if ((scb->flags & (SCB_SENSE|SCB_PKT_SENSE)) != 0) {
-- struct scsi_status_iu_header *siu;
-- u_int sense_size;
-- u_int sense_offset;
-+ struct scsi_status_iu_header *siu;
-+ struct scsi_sense_data *sense;
-+ u_int sense_size;
-+ u_int sense_offset;
-+ int error_code, sense_key, asc, ascq;
-
- if (scb->flags & SCB_SENSE) {
- sense_size = MIN(sizeof(struct scsi_sense_data)
-- - ahd_get_sense_residual(scb),
-+ - aic_get_sense_residual(scb),
- sizeof(cmd->sense_buffer));
- sense_offset = 0;
- } else {
-@@ -4581,10 +4607,10 @@ ahd_linux_handle_scsi_status(struct ahd_
- sense_offset = SIU_SENSE_OFFSET(siu);
- }
-
-+ sense = (struct scsi_sense_data *)
-+ (ahd_get_sense_buf(ahd, scb) + sense_offset);
- memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
-- memcpy(cmd->sense_buffer,
-- ahd_get_sense_buf(ahd, scb)
-- + sense_offset, sense_size);
-+ memcpy(cmd->sense_buffer, sense, sense_size);
- cmd->result |= (DRIVER_SENSE << 24);
-
- #ifdef AHD_DEBUG
-@@ -4601,6 +4627,23 @@ ahd_linux_handle_scsi_status(struct ahd_
- printf("\n");
- }
- #endif
-+ /*
-+ * If this is not a DV command and the target
-+ * provides some status that makes us believe
-+ * that the target has changed (power on reset,
-+ * etc.) kick off a DV scan to re-validate the
-+ * device.
-+ */
-+ if (AIC_DV_CMD(cmd) != 0)
-+ break;
-+
-+ scsi_extract_sense(sense, &error_code,
-+ &sense_key, &asc, &ascq);
-+ if (error_code == SSD_CURRENT_ERROR
-+ && sense_key == SSD_KEY_UNIT_ATTENTION
-+ && asc == 0x29
-+ && (ascq == 0 || ascq == 1))
-+ dev->target->flags |= AIC_DV_REQUIRED;
- }
- break;
- }
-@@ -4640,7 +4683,7 @@ ahd_linux_handle_scsi_status(struct ahd_
- * this device.
- */
- if (dev->last_queuefull_same_count
-- == AHD_LOCK_TAGS_COUNT) {
-+ == AIC_LOCK_TAGS_COUNT) {
- dev->maxtags = dev->active;
- ahd_print_path(ahd, scb);
- printf("Locking max tag count at %d\n",
-@@ -4650,10 +4693,10 @@ ahd_linux_handle_scsi_status(struct ahd_
- dev->tags_on_last_queuefull = dev->active;
- dev->last_queuefull_same_count = 0;
- }
-- ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
-- ahd_set_scsi_status(scb, SCSI_STATUS_OK);
-+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
-+ aic_set_scsi_status(scb, SCSI_STATUS_OK);
- ahd_platform_set_tags(ahd, &devinfo,
-- (dev->flags & AHD_DEV_Q_BASIC)
-+ (dev->flags & AIC_DEV_Q_BASIC)
- ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED);
- break;
- }
-@@ -4663,9 +4706,9 @@ ahd_linux_handle_scsi_status(struct ahd_
- */
- dev->openings = 1;
- ahd_platform_set_tags(ahd, &devinfo,
-- (dev->flags & AHD_DEV_Q_BASIC)
-+ (dev->flags & AIC_DEV_Q_BASIC)
- ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED);
-- ahd_set_scsi_status(scb, SCSI_STATUS_BUSY);
-+ aic_set_scsi_status(scb, SCSI_STATUS_BUSY);
- /* FALLTHROUGH */
- }
- case SCSI_STATUS_BUSY:
-@@ -4673,13 +4716,13 @@ ahd_linux_handle_scsi_status(struct ahd_
- * Set a short timer to defer sending commands for
- * a bit since Linux will not delay in this case.
- */
-- if ((dev->flags & AHD_DEV_TIMER_ACTIVE) != 0) {
-+ if ((dev->flags & AIC_DEV_TIMER_ACTIVE) != 0) {
- printf("%s:%c:%d: Device Timer still active during "
- "busy processing\n", ahd_name(ahd),
- dev->target->channel, dev->target->target);
- break;
- }
-- dev->flags |= AHD_DEV_TIMER_ACTIVE;
-+ dev->flags |= AIC_DEV_TIMER_ACTIVE;
- dev->qfrozen++;
- init_timer(&dev->timer);
- dev->timer.data = (u_long)dev;
-@@ -4705,9 +4748,9 @@ ahd_linux_queue_cmd_complete(struct ahd_
- * not guarantee the order that aborted commands will be
- * returned to us.
- */
-- struct ahd_completeq *completeq;
-- struct ahd_cmd *list_cmd;
-- struct ahd_cmd *acmd;
-+ struct aic_completeq *completeq;
-+ struct aic_cmd *list_cmd;
-+ struct aic_cmd *acmd;
-
- /*
- * Map CAM error codes into Linux Error codes. We
-@@ -4715,13 +4758,13 @@ ahd_linux_queue_cmd_complete(struct ahd_
- * full error information available when making
- * state change decisions.
- */
-- if (AHD_DV_CMD(cmd) == FALSE) {
-+ if (AIC_DV_CMD(cmd) == FALSE) {
- uint32_t status;
- u_int new_status;
-
-- status = ahd_cmd_get_transaction_status(cmd);
-+ status = aic_cmd_get_transaction_status(cmd);
- if (status != CAM_REQ_CMP) {
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- struct ahd_devinfo devinfo;
- cam_status cam_status;
- uint32_t action;
-@@ -4741,8 +4784,8 @@ ahd_linux_queue_cmd_complete(struct ahd_
- dev->target->channel == 0 ? 'A':'B',
- ROLE_INITIATOR);
-
-- scsi_status = ahd_cmd_get_scsi_status(cmd);
-- cam_status = ahd_cmd_get_transaction_status(cmd);
-+ scsi_status = aic_cmd_get_scsi_status(cmd);
-+ cam_status = aic_cmd_get_transaction_status(cmd);
- action = aic_error_action(cmd, dev->target->inq_data,
- cam_status, scsi_status);
- if ((action & SSQ_FALLBACK) != 0) {
-@@ -4785,7 +4828,17 @@ no_fallback:
- new_status = DID_PARITY;
- break;
- case CAM_CMD_TIMEOUT:
-- new_status = DID_TIME_OUT;
-+ /*
-+ * Returning DID_TIME_OUT will
-+ * wake up the error recovery
-+ * thread instead of doing the
-+ * command retry we desire. Since
-+ * we have already recovered the
-+ * command, returning DID_ERROR
-+ * will cause a retry up to the
-+ * retry limit for this command.
-+ */
-+ new_status = DID_ERROR;
- break;
- case CAM_UA_ABORT:
- case CAM_REQ_CMP_ERR:
-@@ -4815,7 +4868,7 @@ no_fallback:
- if (cmd->retries > 0)
- cmd->retries--;
- new_status = DID_OK;
-- ahd_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
-+ aic_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
- cmd->result |= (DRIVER_SENSE << 24);
- memset(cmd->sense_buffer, 0,
- sizeof(cmd->sense_buffer));
-@@ -4829,12 +4882,12 @@ no_fallback:
- break;
- }
-
-- ahd_cmd_set_transaction_status(cmd, new_status);
-+ aic_cmd_set_transaction_status(cmd, new_status);
- }
-
- completeq = &ahd->platform_data->completeq;
- list_cmd = TAILQ_FIRST(completeq);
-- acmd = (struct ahd_cmd *)cmd;
-+ acmd = (struct aic_cmd *)cmd;
- while (list_cmd != NULL
- && acmd_scsi_cmd(list_cmd).serial_number
- < acmd_scsi_cmd(acmd).serial_number)
-@@ -4854,7 +4907,7 @@ ahd_linux_filter_inquiry(struct ahd_soft
- struct ahd_transinfo *goal;
- struct ahd_transinfo *curr;
- struct ahd_tmode_tstate *tstate;
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_int width;
- u_int period;
- u_int offset;
-@@ -4876,9 +4929,9 @@ ahd_linux_filter_inquiry(struct ahd_soft
- sid = (struct scsi_inquiry_data *)dev->target->inq_data;
- if (SID_QUAL(sid) == SID_QUAL_LU_CONNECTED) {
-
-- dev->flags &= ~AHD_DEV_UNCONFIGURED;
-+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
- } else {
-- dev->flags |= AHD_DEV_UNCONFIGURED;
-+ dev->flags |= AIC_DEV_UNCONFIGURED;
- return;
- }
-
-@@ -4944,48 +4997,6 @@ ahd_linux_filter_inquiry(struct ahd_soft
- AHD_TRANS_GOAL, /*paused*/FALSE);
- }
-
--void
--ahd_freeze_simq(struct ahd_softc *ahd)
--{
-- ahd->platform_data->qfrozen++;
-- if (ahd->platform_data->qfrozen == 1) {
-- scsi_block_requests(ahd->platform_data->host);
-- ahd_platform_abort_scbs(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS,
-- CAM_LUN_WILDCARD, SCB_LIST_NULL,
-- ROLE_INITIATOR, CAM_REQUEUE_REQ);
-- }
--}
--
--void
--ahd_release_simq(struct ahd_softc *ahd)
--{
-- u_long s;
-- int unblock_reqs;
--
-- unblock_reqs = 0;
-- ahd_lock(ahd, &s);
-- if (ahd->platform_data->qfrozen > 0)
-- ahd->platform_data->qfrozen--;
-- if (ahd->platform_data->qfrozen == 0) {
-- unblock_reqs = 1;
-- }
-- if (AHD_DV_SIMQ_FROZEN(ahd)
-- && ((ahd->platform_data->flags & AHD_DV_WAIT_SIMQ_RELEASE) != 0)) {
-- ahd->platform_data->flags &= ~AHD_DV_WAIT_SIMQ_RELEASE;
-- up(&ahd->platform_data->dv_sem);
-- }
-- ahd_schedule_runq(ahd);
-- ahd_unlock(ahd, &s);
-- /*
-- * There is still a race here. The mid-layer
-- * should keep its own freeze count and use
-- * a bottom half handler to run the queues
-- * so we can unblock with our own lock held.
-- */
-- if (unblock_reqs)
-- scsi_unblock_requests(ahd->platform_data->host);
--}
--
- static void
- ahd_linux_sem_timeout(u_long arg)
- {
-@@ -4996,8 +5007,8 @@ ahd_linux_sem_timeout(u_long arg)
- scb = (struct scb *)arg;
- ahd = scb->ahd_softc;
- ahd_lock(ahd, &s);
-- if ((scb->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) {
-- scb->platform_data->flags &= ~AHD_SCB_UP_EH_SEM;
-+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
-+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
- up(&ahd->platform_data->eh_sem);
- }
- ahd_unlock(ahd, &s);
-@@ -5006,20 +5017,21 @@ ahd_linux_sem_timeout(u_long arg)
- static void
- ahd_linux_dev_timed_unfreeze(u_long arg)
- {
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
- struct ahd_softc *ahd;
- u_long s;
-
-- dev = (struct ahd_linux_device *)arg;
-- ahd = dev->target->ahd;
-+ dev = (struct aic_linux_device *)arg;
-+ ahd = dev->target->softc;
- ahd_lock(ahd, &s);
-- dev->flags &= ~AHD_DEV_TIMER_ACTIVE;
-+ dev->flags &= ~AIC_DEV_TIMER_ACTIVE;
- if (dev->qfrozen > 0)
- dev->qfrozen--;
- if (dev->qfrozen == 0
-- && (dev->flags & AHD_DEV_ON_RUN_LIST) == 0)
-+ && (dev->flags & AIC_DEV_ON_RUN_LIST) == 0)
- ahd_linux_run_device_queue(ahd, dev);
-- if ((dev->flags & AHD_DEV_UNCONFIGURED) != 0
-+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
-+ && TAILQ_EMPTY(&dev->busyq)
- && dev->active == 0)
- ahd_linux_free_device(ahd, dev);
- ahd_unlock(ahd, &s);
-@@ -5028,17 +5040,26 @@ ahd_linux_dev_timed_unfreeze(u_long arg)
- void
- ahd_platform_dump_card_state(struct ahd_softc *ahd)
- {
-- struct ahd_linux_device *dev;
-+ struct Scsi_Host *host;
-+ struct aic_linux_device *dev;
- int target;
- int maxtarget;
- int lun;
- int i;
-
-+ host = ahd->platform_data->host;
-+ printf("%s: Host Status: Failed(%d) %s%s%s\n",
-+ ahd_name(ahd),
-+ host->host_failed,
-+ host->eh_active ? "eh_active " : "",
-+ host->host_blocked ? "host_blocked " : "",
-+ host->host_self_blocked ? "host_self_blocked " : "");
-+
- maxtarget = (ahd->features & AHD_WIDE) ? 15 : 7;
- for (target = 0; target <=maxtarget; target++) {
-
- for (lun = 0; lun < AHD_NUM_LUNS; lun++) {
-- struct ahd_cmd *acmd;
-+ struct aic_cmd *acmd;
-
- dev = ahd_linux_get_device(ahd, 0, target,
- lun, /*alloc*/FALSE);
-@@ -5077,20 +5098,18 @@ static void __exit
- ahd_linux_exit(void)
- {
- struct ahd_softc *ahd;
-- u_long l;
-
- /*
-- * Shutdown DV threads before going into the SCSI mid-layer.
-+ * Shutdown our threads before going into the SCSI mid-layer.
- * This avoids situations where the mid-layer locks the entire
- * kernel so that waiting for our DV threads to exit leads
- * to deadlock.
- */
-- ahd_list_lock(&l);
- TAILQ_FOREACH(ahd, &ahd_tailq, links) {
-
- ahd_linux_kill_dv_thread(ahd);
-+ ahd_terminate_recovery_thread(ahd);
- }
-- ahd_list_unlock(&l);
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
- /*
- * In 2.4 we have to unregister from the PCI core _after_
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_osm.h 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_osm.h 2003-12-28 23:21:39.000000000 -0800
-@@ -36,51 +36,22 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#133 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#153 $
- *
- */
- #ifndef _AIC79XX_LINUX_H_
- #define _AIC79XX_LINUX_H_
-
--#include <linux/types.h>
--#include <linux/blkdev.h>
--#include <linux/delay.h>
--#include <linux/ioport.h>
--#include <linux/pci.h>
--#include <linux/smp_lock.h>
- #include <linux/version.h>
--#include <linux/module.h>
--#include <asm/byteorder.h>
--#include <asm/io.h>
-
- #ifndef KERNEL_VERSION
- #define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
- #endif
-
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
--#include <linux/interrupt.h> /* For tasklet support. */
- #include <linux/config.h>
--#include <linux/slab.h>
--#else
--#include <linux/malloc.h>
- #endif
-
--/* Core SCSI definitions */
--#define AIC_LIB_PREFIX ahd
--#include "scsi.h"
--#include "hosts.h"
--
--/* Name space conflict with BSD queue macros */
--#ifdef LIST_HEAD
--#undef LIST_HEAD
--#endif
--
--#include "cam.h"
--#include "queue.h"
--#include "scsi_message.h"
--#include "scsi_iu.h"
--#include "aiclib.h"
--
- /*********************************** Debugging ********************************/
- #ifdef CONFIG_AIC79XX_DEBUG_ENABLE
- #ifdef CONFIG_AIC79XX_DEBUG_MASK
-@@ -96,188 +67,27 @@
- /* No debugging code. */
- #endif
-
--/********************************** Misc Macros *******************************/
--#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
--#define powerof2(x) ((((x)-1)&(x))==0)
--
--/************************* Forward Declarations *******************************/
--struct ahd_softc;
--typedef struct pci_dev *ahd_dev_softc_t;
--typedef Scsi_Cmnd *ahd_io_ctx_t;
--
--/******************************* Byte Order ***********************************/
--#define ahd_htobe16(x) cpu_to_be16(x)
--#define ahd_htobe32(x) cpu_to_be32(x)
--#define ahd_htobe64(x) cpu_to_be64(x)
--#define ahd_htole16(x) cpu_to_le16(x)
--#define ahd_htole32(x) cpu_to_le32(x)
--#define ahd_htole64(x) cpu_to_le64(x)
--
--#define ahd_be16toh(x) be16_to_cpu(x)
--#define ahd_be32toh(x) be32_to_cpu(x)
--#define ahd_be64toh(x) be64_to_cpu(x)
--#define ahd_le16toh(x) le16_to_cpu(x)
--#define ahd_le32toh(x) le32_to_cpu(x)
--#define ahd_le64toh(x) le64_to_cpu(x)
--
--#ifndef LITTLE_ENDIAN
--#define LITTLE_ENDIAN 1234
--#endif
--
--#ifndef BIG_ENDIAN
--#define BIG_ENDIAN 4321
--#endif
--
--#ifndef BYTE_ORDER
--#if defined(__BIG_ENDIAN)
--#define BYTE_ORDER BIG_ENDIAN
--#endif
--#if defined(__LITTLE_ENDIAN)
--#define BYTE_ORDER LITTLE_ENDIAN
--#endif
--#endif /* BYTE_ORDER */
--
--/************************* Configuration Data *********************************/
--extern uint32_t aic79xx_allow_memio;
--extern int aic79xx_detect_complete;
--extern Scsi_Host_Template aic79xx_driver_template;
--
--/***************************** Bus Space/DMA **********************************/
--
--#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,17)
--typedef dma_addr_t bus_addr_t;
--#else
--typedef uint32_t bus_addr_t;
--#endif
--typedef uint32_t bus_size_t;
--
--typedef enum {
-- BUS_SPACE_MEMIO,
-- BUS_SPACE_PIO
--} bus_space_tag_t;
--
--typedef union {
-- u_long ioport;
-- volatile uint8_t *maddr;
--} bus_space_handle_t;
--
--typedef struct bus_dma_segment
--{
-- bus_addr_t ds_addr;
-- bus_size_t ds_len;
--} bus_dma_segment_t;
--
--struct ahd_linux_dma_tag
--{
-- bus_size_t alignment;
-- bus_size_t boundary;
-- bus_size_t maxsize;
--};
--typedef struct ahd_linux_dma_tag* bus_dma_tag_t;
--
--struct ahd_linux_dmamap
--{
-- bus_addr_t bus_addr;
--};
--typedef struct ahd_linux_dmamap* bus_dmamap_t;
--
--typedef int bus_dma_filter_t(void*, bus_addr_t);
--typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
--
--#define BUS_DMA_WAITOK 0x0
--#define BUS_DMA_NOWAIT 0x1
--#define BUS_DMA_ALLOCNOW 0x2
--#define BUS_DMA_LOAD_SEGS 0x4 /*
-- * Argument is an S/G list not
-- * a single buffer.
-- */
--
--#define BUS_SPACE_MAXADDR 0xFFFFFFFF
--#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
--#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
--
--int ahd_dma_tag_create(struct ahd_softc *, bus_dma_tag_t /*parent*/,
-- bus_size_t /*alignment*/, bus_size_t /*boundary*/,
-- bus_addr_t /*lowaddr*/, bus_addr_t /*highaddr*/,
-- bus_dma_filter_t*/*filter*/, void */*filterarg*/,
-- bus_size_t /*maxsize*/, int /*nsegments*/,
-- bus_size_t /*maxsegsz*/, int /*flags*/,
-- bus_dma_tag_t */*dma_tagp*/);
--
--void ahd_dma_tag_destroy(struct ahd_softc *, bus_dma_tag_t /*tag*/);
--
--int ahd_dmamem_alloc(struct ahd_softc *, bus_dma_tag_t /*dmat*/,
-- void** /*vaddr*/, int /*flags*/,
-- bus_dmamap_t* /*mapp*/);
--
--void ahd_dmamem_free(struct ahd_softc *, bus_dma_tag_t /*dmat*/,
-- void* /*vaddr*/, bus_dmamap_t /*map*/);
--
--void ahd_dmamap_destroy(struct ahd_softc *, bus_dma_tag_t /*tag*/,
-- bus_dmamap_t /*map*/);
--
--int ahd_dmamap_load(struct ahd_softc *ahd, bus_dma_tag_t /*dmat*/,
-- bus_dmamap_t /*map*/, void * /*buf*/,
-- bus_size_t /*buflen*/, bus_dmamap_callback_t *,
-- void */*callback_arg*/, int /*flags*/);
--
--int ahd_dmamap_unload(struct ahd_softc *, bus_dma_tag_t, bus_dmamap_t);
--
--/*
-- * Operations performed by ahd_dmamap_sync().
-- */
--#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
--#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
--#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
--#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
--
--/*
-- * XXX
-- * ahd_dmamap_sync is only used on buffers allocated with
-- * the pci_alloc_consistent() API. Although I'm not sure how
-- * this works on architectures with a write buffer, Linux does
-- * not have an API to sync "coherent" memory. Perhaps we need
-- * to do an mb()?
-- */
--#define ahd_dmamap_sync(ahd, dma_tag, dmamap, offset, len, op)
--
--/************************** Timer DataStructures ******************************/
--typedef struct timer_list ahd_timer_t;
--
- /********************************** Includes **********************************/
-+/* Core SCSI definitions */
-+#define AIC_LIB_PREFIX ahd
-+#define AIC_CONST_PREFIX AHD
-+
- #ifdef CONFIG_AIC79XX_REG_PRETTY_PRINT
- #define AIC_DEBUG_REGISTERS 1
- #else
- #define AIC_DEBUG_REGISTERS 0
- #endif
--#include "aic79xx.h"
--
--/***************************** Timer Facilities *******************************/
--#define ahd_timer_init init_timer
--#define ahd_timer_stop del_timer_sync
--typedef void ahd_linux_callback_t (u_long);
--static __inline void ahd_timer_reset(ahd_timer_t *timer, u_int usec,
-- ahd_callback_t *func, void *arg);
--static __inline void ahd_scb_timer_reset(struct scb *scb, u_int usec);
--
--static __inline void
--ahd_timer_reset(ahd_timer_t *timer, u_int usec, ahd_callback_t *func, void *arg)
--{
-- struct ahd_softc *ahd;
-+#define AIC_CORE_INCLUDE "aic79xx.h"
-+#include "aiclib.h"
-
-- ahd = (struct ahd_softc *)arg;
-- del_timer(timer);
-- timer->data = (u_long)arg;
-- timer->expires = jiffies + (usec * HZ)/1000000;
-- timer->function = (ahd_linux_callback_t*)func;
-- add_timer(timer);
--}
-+/************************* Configuration Data *********************************/
-+extern uint32_t aic79xx_allow_memio;
-+extern int aic79xx_detect_complete;
-+extern Scsi_Host_Template aic79xx_driver_template;
-
--static __inline void
--ahd_scb_timer_reset(struct scb *scb, u_int usec)
--{
-- mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000);
--}
-+/***************************** Domain Validation ******************************/
-+void ahd_linux_dv_complete(Scsi_Cmnd *cmd);
-+void ahd_linux_dv_timeout(struct scsi_cmnd *cmd);
-
- /***************************** SMP support ************************************/
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,17)
-@@ -292,193 +102,7 @@ ahd_scb_timer_reset(struct scb *scb, u_i
- #define AHD_SCSI_HAS_HOST_LOCK 0
- #endif
-
--#define AIC79XX_DRIVER_VERSION "1.3.9"
--
--/**************************** Front End Queues ********************************/
--/*
-- * Data structure used to cast the Linux struct scsi_cmnd to something
-- * that allows us to use the queue macros. The linux structure has
-- * plenty of space to hold the links fields as required by the queue
-- * macros, but the queue macors require them to have the correct type.
-- */
--struct ahd_cmd_internal {
-- /* Area owned by the Linux scsi layer. */
-- uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
-- union {
-- STAILQ_ENTRY(ahd_cmd) ste;
-- LIST_ENTRY(ahd_cmd) le;
-- TAILQ_ENTRY(ahd_cmd) tqe;
-- } links;
-- uint32_t end;
--};
--
--struct ahd_cmd {
-- union {
-- struct ahd_cmd_internal icmd;
-- struct scsi_cmnd scsi_cmd;
-- } un;
--};
--
--#define acmd_icmd(cmd) ((cmd)->un.icmd)
--#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
--#define acmd_links un.icmd.links
--
--/*************************** Device Data Structures ***************************/
--/*
-- * A per probed device structure used to deal with some error recovery
-- * scenarios that the Linux mid-layer code just doesn't know how to
-- * handle. The structure allocated for a device only becomes persistent
-- * after a successfully completed inquiry command to the target when
-- * that inquiry data indicates a lun is present.
-- */
--TAILQ_HEAD(ahd_busyq, ahd_cmd);
--typedef enum {
-- AHD_DEV_UNCONFIGURED = 0x01,
-- AHD_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
-- AHD_DEV_TIMER_ACTIVE = 0x04, /* Our timer is active */
-- AHD_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
-- AHD_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
-- AHD_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
-- AHD_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
-- AHD_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
--} ahd_linux_dev_flags;
--
--struct ahd_linux_target;
--struct ahd_linux_device {
-- TAILQ_ENTRY(ahd_linux_device) links;
-- struct ahd_busyq busyq;
--
-- /*
-- * The number of transactions currently
-- * queued to the device.
-- */
-- int active;
--
-- /*
-- * The currently allowed number of
-- * transactions that can be queued to
-- * the device. Must be signed for
-- * conversion from tagged to untagged
-- * mode where the device may have more
-- * than one outstanding active transaction.
-- */
-- int openings;
--
-- /*
-- * A positive count indicates that this
-- * device's queue is halted.
-- */
-- u_int qfrozen;
--
-- /*
-- * Cumulative command counter.
-- */
-- u_long commands_issued;
--
-- /*
-- * The number of tagged transactions when
-- * running at our current opening level
-- * that have been successfully received by
-- * this device since the last QUEUE FULL.
-- */
-- u_int tag_success_count;
--#define AHD_TAG_SUCCESS_INTERVAL 50
--
-- ahd_linux_dev_flags flags;
--
-- /*
-- * Per device timer.
-- */
-- struct timer_list timer;
--
-- /*
-- * The high limit for the tags variable.
-- */
-- u_int maxtags;
--
-- /*
-- * The computed number of tags outstanding
-- * at the time of the last QUEUE FULL event.
-- */
-- u_int tags_on_last_queuefull;
--
-- /*
-- * How many times we have seen a queue full
-- * with the same number of tags. This is used
-- * to stop our adaptive queue depth algorithm
-- * on devices with a fixed number of tags.
-- */
-- u_int last_queuefull_same_count;
--#define AHD_LOCK_TAGS_COUNT 50
--
-- /*
-- * How many transactions have been queued
-- * without the device going idle. We use
-- * this statistic to determine when to issue
-- * an ordered tag to prevent transaction
-- * starvation. This statistic is only updated
-- * if the AHD_DEV_PERIODIC_OTAG flag is set
-- * on this device.
-- */
-- u_int commands_since_idle_or_otag;
--#define AHD_OTAG_THRESH 500
--
-- int lun;
-- Scsi_Device *scsi_device;
-- struct ahd_linux_target *target;
--};
--
--typedef enum {
-- AHD_DV_REQUIRED = 0x01,
-- AHD_INQ_VALID = 0x02,
-- AHD_BASIC_DV = 0x04,
-- AHD_ENHANCED_DV = 0x08
--} ahd_linux_targ_flags;
--
--/* DV States */
--typedef enum {
-- AHD_DV_STATE_EXIT = 0,
-- AHD_DV_STATE_INQ_SHORT_ASYNC,
-- AHD_DV_STATE_INQ_ASYNC,
-- AHD_DV_STATE_INQ_ASYNC_VERIFY,
-- AHD_DV_STATE_TUR,
-- AHD_DV_STATE_REBD,
-- AHD_DV_STATE_INQ_VERIFY,
-- AHD_DV_STATE_WEB,
-- AHD_DV_STATE_REB,
-- AHD_DV_STATE_SU,
-- AHD_DV_STATE_BUSY
--} ahd_dv_state;
--
--struct ahd_linux_target {
-- struct ahd_linux_device *devices[AHD_NUM_LUNS];
-- int channel;
-- int target;
-- int refcount;
-- struct ahd_transinfo last_tinfo;
-- struct ahd_softc *ahd;
-- ahd_linux_targ_flags flags;
-- struct scsi_inquiry_data *inq_data;
-- /*
-- * The next "fallback" period to use for narrow/wide transfers.
-- */
-- uint8_t dv_next_narrow_period;
-- uint8_t dv_next_wide_period;
-- uint8_t dv_max_width;
-- uint8_t dv_max_ppr_options;
-- uint8_t dv_last_ppr_options;
-- u_int dv_echo_size;
-- ahd_dv_state dv_state;
-- u_int dv_state_retry;
-- uint8_t *dv_buffer;
-- uint8_t *dv_buffer1;
--
-- /*
-- * Cumulative counter of errors.
-- */
-- u_long errors_detected;
-- u_long cmds_since_error;
--};
-+#define AIC79XX_DRIVER_VERSION "2.0.5"
-
- /********************* Definitions Required by the Core ***********************/
- /*
-@@ -500,100 +124,21 @@ extern u_int ahd_linux_nseg;
- #define AHD_NSEG 128
- #endif
-
--/*
-- * Per-SCB OSM storage.
-- */
--typedef enum {
-- AHD_SCB_UP_EH_SEM = 0x1
--} ahd_linux_scb_flags;
--
--struct scb_platform_data {
-- struct ahd_linux_device *dev;
-- bus_addr_t buf_busaddr;
-- uint32_t xfer_len;
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-- uint32_t resid; /* Transfer residual */
--#endif
-- uint32_t sense_resid; /* Auto-Sense residual */
-- ahd_linux_scb_flags flags;
--};
--
--/*
-- * Define a structure used for each host adapter. All members are
-- * aligned on a boundary >= the size of the member to honor the
-- * alignment restrictions of the various platforms supported by
-- * this driver.
-- */
--typedef enum {
-- AHD_DV_WAIT_SIMQ_EMPTY = 0x01,
-- AHD_DV_WAIT_SIMQ_RELEASE = 0x02,
-- AHD_DV_ACTIVE = 0x04,
-- AHD_DV_SHUTDOWN = 0x08,
-- AHD_RUN_CMPLT_Q_TIMER = 0x10
--} ahd_linux_softc_flags;
--
--TAILQ_HEAD(ahd_completeq, ahd_cmd);
--
--struct ahd_platform_data {
-- /*
-- * Fields accessed from interrupt context.
-- */
-- struct ahd_linux_target *targets[AHD_NUM_TARGETS];
-- TAILQ_HEAD(, ahd_linux_device) device_runq;
-- struct ahd_completeq completeq;
--
-- spinlock_t spin_lock;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- struct tasklet_struct runq_tasklet;
--#endif
-- u_int qfrozen;
-- pid_t dv_pid;
-- struct timer_list completeq_timer;
-- struct timer_list reset_timer;
-- struct timer_list stats_timer;
-- struct semaphore eh_sem;
-- struct semaphore dv_sem;
-- struct semaphore dv_cmd_sem; /* XXX This needs to be in
-- * the target struct
-- */
-- struct scsi_device *dv_scsi_dev;
-- struct Scsi_Host *host; /* pointer to scsi host */
--#define AHD_LINUX_NOIRQ ((uint32_t)~0)
-- uint32_t irq; /* IRQ for this adapter */
-- uint32_t bios_address;
-- uint32_t mem_busaddr; /* Mem Base Addr */
-- bus_addr_t hw_dma_mask;
-- ahd_linux_softc_flags flags;
--};
--
--/************************** OS Utility Wrappers *******************************/
--#define printf printk
--#define M_NOWAIT GFP_ATOMIC
--#define M_WAITOK 0
--#define malloc(size, type, flags) kmalloc(size, flags)
--#define free(ptr, type) kfree(ptr)
--
--static __inline void ahd_delay(long);
--static __inline void
--ahd_delay(long usec)
--{
-- /*
-- * udelay on Linux can have problems for
-- * multi-millisecond waits. Wait at most
-- * 1024us per call.
-- */
-- while (usec > 0) {
-- udelay(usec % 1024);
-- usec -= 1024;
-- }
--}
--
-+/************************** Error Recovery ************************************/
-+static __inline void ahd_wakeup_recovery_thread(struct ahd_softc *ahd);
-+
-+static __inline void
-+ahd_wakeup_recovery_thread(struct ahd_softc *ahd)
-+{
-+ up(&ahd->platform_data->recovery_sem);
-+}
-+
-+int ahd_spawn_recovery_thread(struct ahd_softc *ahd);
-+void ahd_terminate_recovery_thread(struct ahd_softc *ahd);
-+void ahd_set_recoveryscb(struct ahd_softc *ahd,
-+ struct scb *scb);
-
- /***************************** Low Level I/O **********************************/
--#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__)
--#define MMAPIO
--#endif
--
- static __inline uint8_t ahd_inb(struct ahd_softc * ahd, long port);
- static __inline uint16_t ahd_inw_atomic(struct ahd_softc * ahd, long port);
- static __inline void ahd_outb(struct ahd_softc * ahd, long port, uint8_t val);
-@@ -603,21 +148,18 @@ static __inline void ahd_outsb(struct ah
- uint8_t *, int count);
- static __inline void ahd_insb(struct ahd_softc * ahd, long port,
- uint8_t *, int count);
-+static __inline void ahd_flush_device_writes(struct ahd_softc *);
-
- static __inline uint8_t
- ahd_inb(struct ahd_softc * ahd, long port)
- {
- uint8_t x;
--#ifdef MMAPIO
-
- if (ahd->tags[0] == BUS_SPACE_MEMIO) {
- x = readb(ahd->bshs[0].maddr + port);
- } else {
- x = inb(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
- }
--#else
-- x = inb(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
--#endif
- mb();
- return (x);
- }
-@@ -626,16 +168,12 @@ static __inline uint16_t
- ahd_inw_atomic(struct ahd_softc * ahd, long port)
- {
- uint8_t x;
--#ifdef MMAPIO
-
- if (ahd->tags[0] == BUS_SPACE_MEMIO) {
- x = readw(ahd->bshs[0].maddr + port);
- } else {
- x = inw(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
- }
--#else
-- x = inw(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
--#endif
- mb();
- return (x);
- }
-@@ -643,30 +181,22 @@ ahd_inw_atomic(struct ahd_softc * ahd, l
- static __inline void
- ahd_outb(struct ahd_softc * ahd, long port, uint8_t val)
- {
--#ifdef MMAPIO
- if (ahd->tags[0] == BUS_SPACE_MEMIO) {
- writeb(val, ahd->bshs[0].maddr + port);
- } else {
- outb(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
- }
--#else
-- outb(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
--#endif
- mb();
- }
-
- static __inline void
- ahd_outw_atomic(struct ahd_softc * ahd, long port, uint16_t val)
- {
--#ifdef MMAPIO
- if (ahd->tags[0] == BUS_SPACE_MEMIO) {
- writew(val, ahd->bshs[0].maddr + port);
- } else {
- outw(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
- }
--#else
-- outw(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
--#endif
- mb();
- }
-
-@@ -698,6 +228,13 @@ ahd_insb(struct ahd_softc * ahd, long po
- *array++ = ahd_inb(ahd, port);
- }
-
-+static __inline void
-+ahd_flush_device_writes(struct ahd_softc *ahd)
-+{
-+ /* XXX Is this sufficient for all architectures??? */
-+ ahd_inb(ahd, INTSTAT);
-+}
-+
- /**************************** Initialization **********************************/
- int ahd_linux_register_host(struct ahd_softc *,
- Scsi_Host_Template *);
-@@ -826,384 +363,29 @@ ahd_list_unlock(unsigned long *flags)
- }
-
- /******************************* PCI Definitions ******************************/
--/*
-- * PCIM_xxx: mask to locate subfield in register
-- * PCIR_xxx: config register offset
-- * PCIC_xxx: device class
-- * PCIS_xxx: device subclass
-- * PCIP_xxx: device programming interface
-- * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
-- * PCID_xxx: device ID
-- */
--#define PCIR_DEVVENDOR 0x00
--#define PCIR_VENDOR 0x00
--#define PCIR_DEVICE 0x02
--#define PCIR_COMMAND 0x04
--#define PCIM_CMD_PORTEN 0x0001
--#define PCIM_CMD_MEMEN 0x0002
--#define PCIM_CMD_BUSMASTEREN 0x0004
--#define PCIM_CMD_MWRICEN 0x0010
--#define PCIM_CMD_PERRESPEN 0x0040
--#define PCIM_CMD_SERRESPEN 0x0100
--#define PCIR_STATUS 0x06
--#define PCIR_REVID 0x08
--#define PCIR_PROGIF 0x09
--#define PCIR_SUBCLASS 0x0a
--#define PCIR_CLASS 0x0b
--#define PCIR_CACHELNSZ 0x0c
--#define PCIR_LATTIMER 0x0d
--#define PCIR_HEADERTYPE 0x0e
--#define PCIM_MFDEV 0x80
--#define PCIR_BIST 0x0f
--#define PCIR_CAP_PTR 0x34
--
--/* config registers for header type 0 devices */
--#define PCIR_MAPS 0x10
--#define PCIR_SUBVEND_0 0x2c
--#define PCIR_SUBDEV_0 0x2e
--
--/****************************** PCI-X definitions *****************************/
--#define PCIXR_COMMAND 0x96
--#define PCIXR_DEVADDR 0x98
--#define PCIXM_DEVADDR_FNUM 0x0003 /* Function Number */
--#define PCIXM_DEVADDR_DNUM 0x00F8 /* Device Number */
--#define PCIXM_DEVADDR_BNUM 0xFF00 /* Bus Number */
--#define PCIXR_STATUS 0x9A
--#define PCIXM_STATUS_64BIT 0x0001 /* Active 64bit connection to device. */
--#define PCIXM_STATUS_133CAP 0x0002 /* Device is 133MHz capable */
--#define PCIXM_STATUS_SCDISC 0x0004 /* Split Completion Discarded */
--#define PCIXM_STATUS_UNEXPSC 0x0008 /* Unexpected Split Completion */
--#define PCIXM_STATUS_CMPLEXDEV 0x0010 /* Device Complexity (set == bridge) */
--#define PCIXM_STATUS_MAXMRDBC 0x0060 /* Maximum Burst Read Count */
--#define PCIXM_STATUS_MAXSPLITS 0x0380 /* Maximum Split Transactions */
--#define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */
--#define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */
--
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- extern struct pci_driver aic79xx_pci_driver;
- #endif
-
--typedef enum
--{
-- AHD_POWER_STATE_D0,
-- AHD_POWER_STATE_D1,
-- AHD_POWER_STATE_D2,
-- AHD_POWER_STATE_D3
--} ahd_power_state;
--
--void ahd_power_state_change(struct ahd_softc *ahd,
-- ahd_power_state new_state);
--
- /******************************* PCI Routines *********************************/
- int ahd_linux_pci_init(void);
- void ahd_linux_pci_exit(void);
- int ahd_pci_map_registers(struct ahd_softc *ahd);
- int ahd_pci_map_int(struct ahd_softc *ahd);
-
--static __inline uint32_t ahd_pci_read_config(ahd_dev_softc_t pci,
-- int reg, int width);
--
--static __inline uint32_t
--ahd_pci_read_config(ahd_dev_softc_t pci, int reg, int width)
--{
-- switch (width) {
-- case 1:
-- {
-- uint8_t retval;
--
-- pci_read_config_byte(pci, reg, &retval);
-- return (retval);
-- }
-- case 2:
-- {
-- uint16_t retval;
-- pci_read_config_word(pci, reg, &retval);
-- return (retval);
-- }
-- case 4:
-- {
-- uint32_t retval;
-- pci_read_config_dword(pci, reg, &retval);
-- return (retval);
-- }
-- default:
-- panic("ahd_pci_read_config: Read size too big");
-- /* NOTREACHED */
-- return (0);
-- }
--}
--
--static __inline void ahd_pci_write_config(ahd_dev_softc_t pci,
-- int reg, uint32_t value,
-- int width);
--
--static __inline void
--ahd_pci_write_config(ahd_dev_softc_t pci, int reg, uint32_t value, int width)
--{
-- switch (width) {
-- case 1:
-- pci_write_config_byte(pci, reg, value);
-- break;
-- case 2:
-- pci_write_config_word(pci, reg, value);
-- break;
-- case 4:
-- pci_write_config_dword(pci, reg, value);
-- break;
-- default:
-- panic("ahd_pci_write_config: Write size too big");
-- /* NOTREACHED */
-- }
--}
--
--static __inline int ahd_get_pci_function(ahd_dev_softc_t);
--static __inline int
--ahd_get_pci_function(ahd_dev_softc_t pci)
--{
-- return (PCI_FUNC(pci->devfn));
--}
--
--static __inline int ahd_get_pci_slot(ahd_dev_softc_t);
--static __inline int
--ahd_get_pci_slot(ahd_dev_softc_t pci)
--{
-- return (PCI_SLOT(pci->devfn));
--}
--
--static __inline int ahd_get_pci_bus(ahd_dev_softc_t);
--static __inline int
--ahd_get_pci_bus(ahd_dev_softc_t pci)
--{
-- return (pci->bus->number);
--}
--
--static __inline void ahd_flush_device_writes(struct ahd_softc *);
--static __inline void
--ahd_flush_device_writes(struct ahd_softc *ahd)
--{
-- /* XXX Is this sufficient for all architectures??? */
-- ahd_inb(ahd, INTSTAT);
--}
--
--#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0)
--#define pci_map_sg(pdev, sg_list, nseg, direction) (nseg)
--#define pci_unmap_sg(pdev, sg_list, nseg, direction)
--#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
--#define sg_dma_len(sg) ((sg)->length)
--#define pci_map_single(pdev, buffer, bufflen, direction) \
-- (VIRT_TO_BUS(buffer))
--#define pci_unmap_single(pdev, buffer, buflen, direction)
--#endif
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
--#define ahd_pci_set_dma_mask pci_set_dma_mask
--#else
--/*
-- * Always "return" 0 for success.
-- */
--#define ahd_pci_set_dma_mask(dev_softc, mask) \
-- (((dev_softc)->dma_mask = mask) && 0)
--#endif
- /**************************** Proc FS Support *********************************/
--int ahd_linux_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
--
--/*************************** Domain Validation ********************************/
--#define AHD_DV_CMD(cmd) ((cmd)->scsi_done == ahd_linux_dv_complete)
--#define AHD_DV_SIMQ_FROZEN(ahd) \
-- ((((ahd)->platform_data->flags & AHD_DV_ACTIVE) != 0) \
-- && (ahd)->platform_data->qfrozen == 1)
--
--/*********************** Transaction Access Wrappers **************************/
--static __inline void ahd_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);
--static __inline void ahd_set_transaction_status(struct scb *, uint32_t);
--static __inline void ahd_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);
--static __inline void ahd_set_scsi_status(struct scb *, uint32_t);
--static __inline uint32_t ahd_cmd_get_transaction_status(Scsi_Cmnd *cmd);
--static __inline uint32_t ahd_get_transaction_status(struct scb *);
--static __inline uint32_t ahd_cmd_get_scsi_status(Scsi_Cmnd *cmd);
--static __inline uint32_t ahd_get_scsi_status(struct scb *);
--static __inline void ahd_set_transaction_tag(struct scb *, int, u_int);
--static __inline u_long ahd_get_transfer_length(struct scb *);
--static __inline int ahd_get_transfer_dir(struct scb *);
--static __inline void ahd_set_residual(struct scb *, u_long);
--static __inline void ahd_set_sense_residual(struct scb *scb, u_long resid);
--static __inline u_long ahd_get_residual(struct scb *);
--static __inline u_long ahd_get_sense_residual(struct scb *);
--static __inline int ahd_perform_autosense(struct scb *);
--static __inline uint32_t ahd_get_sense_bufsize(struct ahd_softc *,
-- struct scb *);
--static __inline void ahd_notify_xfer_settings_change(struct ahd_softc *,
-- struct ahd_devinfo *);
--static __inline void ahd_platform_scb_free(struct ahd_softc *ahd,
-- struct scb *scb);
--static __inline void ahd_freeze_scb(struct scb *scb);
--
--static __inline
--void ahd_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status)
--{
-- cmd->result &= ~(CAM_STATUS_MASK << 16);
-- cmd->result |= status << 16;
--}
--
--static __inline
--void ahd_set_transaction_status(struct scb *scb, uint32_t status)
--{
-- ahd_cmd_set_transaction_status(scb->io_ctx,status);
--}
--
--static __inline
--void ahd_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status)
--{
-- cmd->result &= ~0xFFFF;
-- cmd->result |= status;
--}
--
--static __inline
--void ahd_set_scsi_status(struct scb *scb, uint32_t status)
--{
-- ahd_cmd_set_scsi_status(scb->io_ctx, status);
--}
--
--static __inline
--uint32_t ahd_cmd_get_transaction_status(Scsi_Cmnd *cmd)
--{
-- return ((cmd->result >> 16) & CAM_STATUS_MASK);
--}
--
--static __inline
--uint32_t ahd_get_transaction_status(struct scb *scb)
--{
-- return (ahd_cmd_get_transaction_status(scb->io_ctx));
--}
--
--static __inline
--uint32_t ahd_cmd_get_scsi_status(Scsi_Cmnd *cmd)
--{
-- return (cmd->result & 0xFFFF);
--}
--
--static __inline
--uint32_t ahd_get_scsi_status(struct scb *scb)
--{
-- return (ahd_cmd_get_scsi_status(scb->io_ctx));
--}
--
--static __inline
--void ahd_set_transaction_tag(struct scb *scb, int enabled, u_int type)
--{
-- /*
-- * Nothing to do for linux as the incoming transaction
-- * has no concept of tag/non tagged, etc.
-- */
--}
--
--static __inline
--u_long ahd_get_transfer_length(struct scb *scb)
--{
-- return (scb->platform_data->xfer_len);
--}
--
--static __inline
--int ahd_get_transfer_dir(struct scb *scb)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,40)
-- return (scb->io_ctx->sc_data_direction);
--#else
-- if (scb->io_ctx->bufflen == 0)
-- return (CAM_DIR_NONE);
--
-- switch(scb->io_ctx->cmnd[0]) {
-- case 0x08: /* READ(6) */
-- case 0x28: /* READ(10) */
-- case 0xA8: /* READ(12) */
-- return (CAM_DIR_IN);
-- case 0x0A: /* WRITE(6) */
-- case 0x2A: /* WRITE(10) */
-- case 0xAA: /* WRITE(12) */
-- return (CAM_DIR_OUT);
-- default:
-- return (CAM_DIR_NONE);
-- }
--#endif
--}
--
--static __inline
--void ahd_set_residual(struct scb *scb, u_long resid)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- scb->io_ctx->resid = resid;
--#else
-- scb->platform_data->resid = resid;
--#endif
--}
--
--static __inline
--void ahd_set_sense_residual(struct scb *scb, u_long resid)
--{
-- scb->platform_data->sense_resid = resid;
--}
--
--static __inline
--u_long ahd_get_residual(struct scb *scb)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- return (scb->io_ctx->resid);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+int ahd_linux_proc_info(char *, char **, off_t, int, int, int);
- #else
-- return (scb->platform_data->resid);
-+int ahd_linux_proc_info(struct Scsi_Host *, char *, char **,
-+ off_t, int, int);
- #endif
--}
--
--static __inline
--u_long ahd_get_sense_residual(struct scb *scb)
--{
-- return (scb->platform_data->sense_resid);
--}
--
--static __inline
--int ahd_perform_autosense(struct scb *scb)
--{
-- /*
-- * We always perform autosense in Linux.
-- * On other platforms this is set on a
-- * per-transaction basis.
-- */
-- return (1);
--}
--
--static __inline uint32_t
--ahd_get_sense_bufsize(struct ahd_softc *ahd, struct scb *scb)
--{
-- return (sizeof(struct scsi_sense_data));
--}
--
--static __inline void
--ahd_notify_xfer_settings_change(struct ahd_softc *ahd,
-- struct ahd_devinfo *devinfo)
--{
-- /* Nothing to do here for linux */
--}
--
--static __inline void
--ahd_platform_scb_free(struct ahd_softc *ahd, struct scb *scb)
--{
-- ahd->flags &= ~AHD_RESOURCE_SHORTAGE;
--}
-
-+/*********************** Transaction Access Wrappers **************************/
- int ahd_platform_alloc(struct ahd_softc *ahd, void *platform_arg);
- void ahd_platform_free(struct ahd_softc *ahd);
- void ahd_platform_init(struct ahd_softc *ahd);
- void ahd_platform_freeze_devq(struct ahd_softc *ahd, struct scb *scb);
--void ahd_freeze_simq(struct ahd_softc *ahd);
--void ahd_release_simq(struct ahd_softc *ahd);
--
--static __inline void
--ahd_freeze_scb(struct scb *scb)
--{
-- if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
-- scb->io_ctx->result |= CAM_DEV_QFRZN << 16;
-- scb->platform_data->dev->qfrozen++;
-- }
--}
-
- void ahd_platform_set_tags(struct ahd_softc *ahd,
- struct ahd_devinfo *devinfo, ahd_queue_alg);
-@@ -1221,9 +403,9 @@ void ahd_print_path(struct ahd_softc *,
- void ahd_platform_dump_card_state(struct ahd_softc *ahd);
-
- #ifdef CONFIG_PCI
--#define AHD_PCI_CONFIG 1
-+#define AIC_PCI_CONFIG 1
- #else
--#define AHD_PCI_CONFIG 0
-+#define AIC_PCI_CONFIG 0
- #endif
- #define bootverbose aic79xx_verbose
- extern uint32_t aic79xx_verbose;
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_osm_pci.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_osm_pci.c 2003-12-28 23:21:39.000000000 -0800
-@@ -36,12 +36,18 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#23 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#29 $
- */
-
- #include "aic79xx_osm.h"
- #include "aic79xx_inline.h"
-
-+/*
-+ * Include aiclib_pci.c as part of our
-+ * "module dependencies are hard" work around.
-+ */
-+#include "aiclib_pci.c"
-+
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
- struct pci_device_id
- {
-@@ -52,11 +58,9 @@ static int ahd_linux_pci_dev_probe(struc
- const struct pci_device_id *ent);
- static int ahd_linux_pci_reserve_io_regions(struct ahd_softc *ahd,
- u_long *base, u_long *base2);
--#ifdef MMAPIO
- static int ahd_linux_pci_reserve_mem_region(struct ahd_softc *ahd,
- u_long *bus_addr,
- uint8_t **maddr);
--#endif
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- static void ahd_linux_pci_dev_remove(struct pci_dev *pdev);
-
-@@ -94,12 +98,14 @@ ahd_linux_pci_dev_remove(struct pci_dev
- if (ahd != NULL) {
- u_long s;
-
-+ TAILQ_REMOVE(&ahd_tailq, ahd, links);
-+ ahd_list_unlock(&l);
- ahd_lock(ahd, &s);
- ahd_intr_enable(ahd, FALSE);
- ahd_unlock(ahd, &s);
- ahd_free(ahd);
-- }
-- ahd_list_unlock(&l);
-+ } else
-+ ahd_list_unlock(&l);
- }
- #endif /* !LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) */
-
-@@ -108,7 +114,7 @@ ahd_linux_pci_dev_probe(struct pci_dev *
- {
- char buf[80];
- struct ahd_softc *ahd;
-- ahd_dev_softc_t pci;
-+ aic_dev_softc_t dev;
- struct ahd_pci_identity *entry;
- char *name;
- int error;
-@@ -119,7 +125,7 @@ ahd_linux_pci_dev_probe(struct pci_dev *
- TAILQ_FOREACH(ahd, &ahd_tailq, links) {
- struct pci_dev *probed_pdev;
-
-- probed_pdev = ahd->dev_softc;
-+ probed_pdev = aic_pci_dev(ahd);
- if (probed_pdev->bus->number == pdev->bus->number
- && probed_pdev->devfn == pdev->devfn)
- break;
-@@ -129,8 +135,8 @@ ahd_linux_pci_dev_probe(struct pci_dev *
- return (-ENODEV);
- }
-
-- pci = pdev;
-- entry = ahd_find_pci_device(pci);
-+ dev = aic_pci_dev_to_dev(pdev);
-+ entry = ahd_find_pci_device(dev);
- if (entry == NULL)
- return (-ENODEV);
-
-@@ -140,9 +146,9 @@ ahd_linux_pci_dev_probe(struct pci_dev *
- * common detect routine.
- */
- sprintf(buf, "ahd_pci:%d:%d:%d",
-- ahd_get_pci_bus(pci),
-- ahd_get_pci_slot(pci),
-- ahd_get_pci_function(pci));
-+ aic_get_pci_bus(dev),
-+ aic_get_pci_slot(dev),
-+ aic_get_pci_function(dev));
- name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
- if (name == NULL)
- return (-ENOMEM);
-@@ -150,6 +156,7 @@ ahd_linux_pci_dev_probe(struct pci_dev *
- ahd = ahd_alloc(NULL, name);
- if (ahd == NULL)
- return (-ENOMEM);
-+ ahd->dev_softc = dev;
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- if (pci_enable_device(pdev)) {
- ahd_free(ahd);
-@@ -163,23 +170,22 @@ ahd_linux_pci_dev_probe(struct pci_dev *
- bus_addr_t mask_39bit;
-
- memsize = ahd_linux_get_memsize();
-- mask_64bit = (bus_addr_t)(0xFFFFFFFFFFFFFFFFULL&(bus_addr_t)~0);
-- mask_39bit = (bus_addr_t)(0x7FFFFFFFFFULL&(bus_addr_t)~0);
-+ mask_64bit = (bus_addr_t)0xFFFFFFFFFFFFFFFFULL;
-+ mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
- if (memsize >= 0x8000000000ULL
-- && ahd_pci_set_dma_mask(pdev, mask_64bit) == 0) {
-+ && aic_set_dma_mask(ahd, mask_64bit) == 0) {
- ahd->flags |= AHD_64BIT_ADDRESSING;
- ahd->platform_data->hw_dma_mask = mask_64bit;
- } else if (memsize > 0x80000000
-- && ahd_pci_set_dma_mask(pdev, mask_39bit) == 0) {
-+ && aic_set_dma_mask(ahd, mask_39bit) == 0) {
- ahd->flags |= AHD_39BIT_ADDRESSING;
- ahd->platform_data->hw_dma_mask = mask_39bit;
- }
- } else {
-- ahd_pci_set_dma_mask(pdev, 0xFFFFFFFF);
-+ aic_set_dma_mask(ahd, 0xFFFFFFFF);
- ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
- }
- #endif
-- ahd->dev_softc = pci;
- error = ahd_pci_config(ahd, entry);
- if (error != 0) {
- ahd_free(ahd);
-@@ -218,10 +224,8 @@ ahd_linux_pci_init(void)
- pdev = NULL;
- class = PCI_CLASS_STORAGE_SCSI << 8;
- while ((pdev = pci_find_class(class, pdev)) != NULL) {
-- ahd_dev_softc_t pci;
- int error;
-
-- pci = pdev;
- error = ahd_linux_pci_dev_probe(pdev, /*pci_devid*/NULL);
- if (error == 0)
- found++;
-@@ -240,17 +244,18 @@ static int
- ahd_linux_pci_reserve_io_regions(struct ahd_softc *ahd, u_long *base,
- u_long *base2)
- {
-+
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- *base = pci_resource_start(ahd->dev_softc, 0);
-+ *base = pci_resource_start(aic_pci_dev(ahd), 0);
- /*
- * This is really the 3rd bar and should be at index 2,
- * but the Linux PCI code doesn't know how to "count" 64bit
- * bars.
- */
-- *base2 = pci_resource_start(ahd->dev_softc, 3);
-+ *base2 = pci_resource_start(aic_pci_dev(ahd), 3);
- #else
-- *base = ahd_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR0, 4);
-- *base2 = ahd_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR1, 4);
-+ *base = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR0, 4);
-+ *base2 = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR1, 4);
- *base &= PCI_BASE_ADDRESS_IO_MASK;
- *base2 &= PCI_BASE_ADDRESS_IO_MASK;
- #endif
-@@ -273,7 +278,6 @@ ahd_linux_pci_reserve_io_regions(struct
- return (0);
- }
-
--#ifdef MMAPIO
- static int
- ahd_linux_pci_reserve_mem_region(struct ahd_softc *ahd,
- u_long *bus_addr,
-@@ -292,11 +296,11 @@ ahd_linux_pci_reserve_mem_region(struct
-
- error = 0;
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- start = pci_resource_start(ahd->dev_softc, 1);
-+ start = pci_resource_start(aic_pci_dev(ahd), 1);
- base_page = start & PAGE_MASK;
- base_offset = start - base_page;
- #else
-- start = ahd_pci_read_config(ahd->dev_softc, PCIR_MAPS+4, 4);
-+ start = aic_pci_read_config(ahd->dev_softc, PCIR_MAPS+4, 4);
- base_offset = start & PCI_BASE_ADDRESS_MEM_MASK;
- base_page = base_offset & PAGE_MASK;
- base_offset -= base_page;
-@@ -321,7 +325,6 @@ ahd_linux_pci_reserve_mem_region(struct
- error = ENOMEM;
- return (error);
- }
--#endif
-
- int
- ahd_pci_map_registers(struct ahd_softc *ahd)
-@@ -334,11 +337,10 @@ ahd_pci_map_registers(struct ahd_softc *
- /*
- * If its allowed, we prefer memory mapped access.
- */
-- command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, 4);
-+ command = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, 4);
- command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
- base = 0;
- maddr = NULL;
--#ifdef MMAPIO
- error = ahd_linux_pci_reserve_mem_region(ahd, &base, &maddr);
- if (error == 0) {
- ahd->platform_data->mem_busaddr = base;
-@@ -346,16 +348,16 @@ ahd_pci_map_registers(struct ahd_softc *
- ahd->bshs[0].maddr = maddr;
- ahd->tags[1] = BUS_SPACE_MEMIO;
- ahd->bshs[1].maddr = maddr + 0x100;
-- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
-+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
- command | PCIM_CMD_MEMEN, 4);
-
- if (ahd_pci_test_register_access(ahd) != 0) {
-
- printf("aic79xx: PCI Device %d:%d:%d "
- "failed memory mapped test. Using PIO.\n",
-- ahd_get_pci_bus(ahd->dev_softc),
-- ahd_get_pci_slot(ahd->dev_softc),
-- ahd_get_pci_function(ahd->dev_softc));
-+ aic_get_pci_bus(ahd->dev_softc),
-+ aic_get_pci_slot(ahd->dev_softc),
-+ aic_get_pci_function(ahd->dev_softc));
- iounmap((void *)((u_long)maddr & PAGE_MASK));
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- release_mem_region(ahd->platform_data->mem_busaddr,
-@@ -368,12 +370,11 @@ ahd_pci_map_registers(struct ahd_softc *
- } else if (bootverbose) {
- printf("aic79xx: PCI%d:%d:%d MEM region 0x%lx "
- "unavailable. Cannot memory map device.\n",
-- ahd_get_pci_bus(ahd->dev_softc),
-- ahd_get_pci_slot(ahd->dev_softc),
-- ahd_get_pci_function(ahd->dev_softc),
-+ aic_get_pci_bus(ahd->dev_softc),
-+ aic_get_pci_slot(ahd->dev_softc),
-+ aic_get_pci_function(ahd->dev_softc),
- base);
- }
--#endif
-
- if (maddr == NULL) {
- u_long base2;
-@@ -388,13 +389,13 @@ ahd_pci_map_registers(struct ahd_softc *
- } else {
- printf("aic79xx: PCI%d:%d:%d IO regions 0x%lx and 0x%lx"
- "unavailable. Cannot map device.\n",
-- ahd_get_pci_bus(ahd->dev_softc),
-- ahd_get_pci_slot(ahd->dev_softc),
-- ahd_get_pci_function(ahd->dev_softc),
-+ aic_get_pci_bus(ahd->dev_softc),
-+ aic_get_pci_slot(ahd->dev_softc),
-+ aic_get_pci_function(ahd->dev_softc),
- base, base2);
- }
- }
-- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, 4);
-+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, 4);
- return (error);
- }
-
-@@ -403,49 +404,10 @@ ahd_pci_map_int(struct ahd_softc *ahd)
- {
- int error;
-
-- error = request_irq(ahd->dev_softc->irq, ahd_linux_isr,
-+ error = request_irq(aic_pci_dev(ahd)->irq, ahd_linux_isr,
- SA_SHIRQ, "aic79xx", ahd);
- if (error == 0)
-- ahd->platform_data->irq = ahd->dev_softc->irq;
-+ ahd->platform_data->irq = aic_pci_dev(ahd)->irq;
-
- return (-error);
- }
--
--void
--ahd_power_state_change(struct ahd_softc *ahd, ahd_power_state new_state)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- pci_set_power_state(ahd->dev_softc, new_state);
--#else
-- uint32_t cap;
-- u_int cap_offset;
--
-- /*
-- * Traverse the capability list looking for
-- * the power management capability.
-- */
-- cap = 0;
-- cap_offset = ahd_pci_read_config(ahd->dev_softc,
-- PCIR_CAP_PTR, /*bytes*/1);
-- while (cap_offset != 0) {
--
-- cap = ahd_pci_read_config(ahd->dev_softc,
-- cap_offset, /*bytes*/4);
-- if ((cap & 0xFF) == 1
-- && ((cap >> 16) & 0x3) > 0) {
-- uint32_t pm_control;
--
-- pm_control = ahd_pci_read_config(ahd->dev_softc,
-- cap_offset + 4,
-- /*bytes*/4);
-- pm_control &= ~0x3;
-- pm_control |= new_state;
-- ahd_pci_write_config(ahd->dev_softc,
-- cap_offset + 4,
-- pm_control, /*bytes*/2);
-- break;
-- }
-- cap_offset = (cap >> 8) & 0xFF;
-- }
--#endif
--}
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_pci.c 2003-06-14 12:18:09.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_pci.c 2003-12-28 23:21:39.000000000 -0800
-@@ -38,15 +38,15 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#73 $
-- *
-- * $FreeBSD$
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#84 $
- */
-
- #ifdef __linux__
- #include "aic79xx_osm.h"
- #include "aic79xx_inline.h"
- #else
-+#include <sys/cdefs.h>
-+__FBSDID("$FreeBSD$");
- #include <dev/aic7xxx/aic79xx_osm.h>
- #include <dev/aic7xxx/aic79xx_inline.h>
- #endif
-@@ -75,13 +75,13 @@ ahd_compose_id(u_int device, u_int vendo
- #define ID_AHA_29320ALP 0x8017900500449005ull
-
- #define ID_AIC7901A 0x801E9005FFFF9005ull
--#define ID_AHA_29320 0x8012900500429005ull
--#define ID_AHA_29320B 0x8013900500439005ull
- #define ID_AHA_29320LP 0x8014900500449005ull
-
- #define ID_AIC7902 0x801F9005FFFF9005ull
- #define ID_AIC7902_B 0x801D9005FFFF9005ull
- #define ID_AHA_39320 0x8010900500409005ull
-+#define ID_AHA_29320 0x8012900500429005ull
-+#define ID_AHA_29320B 0x8013900500439005ull
- #define ID_AHA_39320_B 0x8015900500409005ull
- #define ID_AHA_39320A 0x8016900500409005ull
- #define ID_AHA_39320D 0x8011900500419005ull
-@@ -117,6 +117,7 @@ ahd_compose_id(u_int device, u_int vendo
- static ahd_device_setup_t ahd_aic7901_setup;
- static ahd_device_setup_t ahd_aic7901A_setup;
- static ahd_device_setup_t ahd_aic7902_setup;
-+static ahd_device_setup_t ahd_aic790X_setup;
-
- struct ahd_pci_identity ahd_pci_ident_table [] =
- {
-@@ -135,24 +136,24 @@ struct ahd_pci_identity ahd_pci_ident_ta
- },
- /* aic7901A based controllers */
- {
-- ID_AHA_29320,
-+ ID_AHA_29320LP,
- ID_ALL_MASK,
-- "Adaptec 29320 Ultra320 SCSI adapter",
-+ "Adaptec 29320LP Ultra320 SCSI adapter",
- ahd_aic7901A_setup
- },
-+ /* aic7902 based controllers */
- {
-- ID_AHA_29320B,
-+ ID_AHA_29320,
- ID_ALL_MASK,
-- "Adaptec 29320B Ultra320 SCSI adapter",
-- ahd_aic7901A_setup
-+ "Adaptec 29320 Ultra320 SCSI adapter",
-+ ahd_aic7902_setup
- },
- {
-- ID_AHA_29320LP,
-+ ID_AHA_29320B,
- ID_ALL_MASK,
-- "Adaptec 29320LP Ultra320 SCSI adapter",
-- ahd_aic7901A_setup
-+ "Adaptec 29320B Ultra320 SCSI adapter",
-+ ahd_aic7902_setup
- },
-- /* aic7902 based controllers */
- {
- ID_AHA_39320,
- ID_ALL_MASK,
-@@ -195,18 +196,6 @@ struct ahd_pci_identity ahd_pci_ident_ta
- "Adaptec (HP OEM) 39320D Ultra320 SCSI adapter",
- ahd_aic7902_setup
- },
-- {
-- ID_AHA_29320,
-- ID_ALL_MASK,
-- "Adaptec 29320 Ultra320 SCSI adapter",
-- ahd_aic7902_setup
-- },
-- {
-- ID_AHA_29320B,
-- ID_ALL_MASK,
-- "Adaptec 29320B Ultra320 SCSI adapter",
-- ahd_aic7902_setup
-- },
- /* Generic chip probes for devices we don't know 'exactly' */
- {
- ID_AIC7901 & ID_DEV_VENDOR_MASK,
-@@ -274,7 +263,7 @@ static void ahd_configure_termination(st
- static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat);
-
- struct ahd_pci_identity *
--ahd_find_pci_device(ahd_dev_softc_t pci)
-+ahd_find_pci_device(aic_dev_softc_t pci)
- {
- uint64_t full_id;
- uint16_t device;
-@@ -284,10 +273,10 @@ ahd_find_pci_device(ahd_dev_softc_t pci)
- struct ahd_pci_identity *entry;
- u_int i;
-
-- vendor = ahd_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
-- device = ahd_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
-- subvendor = ahd_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
-- subdevice = ahd_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
-+ vendor = aic_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
-+ device = aic_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
-+ subvendor = aic_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
-+ subdevice = aic_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
- full_id = ahd_compose_id(device,
- vendor,
- subdevice,
-@@ -320,7 +309,7 @@ ahd_pci_config(struct ahd_softc *ahd, st
- /*
- * Record if this is an HP board.
- */
-- subvendor = ahd_pci_read_config(ahd->dev_softc,
-+ subvendor = aic_pci_read_config(ahd->dev_softc,
- PCIR_SUBVEND_0, /*bytes*/2);
- if (subvendor == SUBID_HP)
- ahd->flags |= AHD_HP_BOARD;
-@@ -329,7 +318,7 @@ ahd_pci_config(struct ahd_softc *ahd, st
- if (error != 0)
- return (error);
-
-- devconfig = ahd_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
-+ devconfig = aic_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
- if ((devconfig & PCIXINITPAT) == PCIXINIT_PCI33_66) {
- ahd->chip |= AHD_PCI;
- /* Disable PCIX workarounds when running in PCI mode. */
-@@ -339,7 +328,7 @@ ahd_pci_config(struct ahd_softc *ahd, st
- }
- ahd->bus_description = pci_bus_modes[PCI_BUS_MODES_INDEX(devconfig)];
-
-- ahd_power_state_change(ahd, AHD_POWER_STATE_D0);
-+ aic_power_state_change(ahd, AIC_POWER_STATE_D0);
-
- error = ahd_pci_map_registers(ahd);
- if (error != 0)
-@@ -357,17 +346,17 @@ ahd_pci_config(struct ahd_softc *ahd, st
- if (bootverbose)
- printf("%s: Enabling 39Bit Addressing\n",
- ahd_name(ahd));
-- devconfig = ahd_pci_read_config(ahd->dev_softc,
-+ devconfig = aic_pci_read_config(ahd->dev_softc,
- DEVCONFIG, /*bytes*/4);
- devconfig |= DACEN;
-- ahd_pci_write_config(ahd->dev_softc, DEVCONFIG,
-+ aic_pci_write_config(ahd->dev_softc, DEVCONFIG,
- devconfig, /*bytes*/4);
- }
-
- /* Ensure busmastering is enabled */
-- command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
-+ command = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
- command |= PCIM_CMD_BUSMASTEREN;
-- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
-+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
-
- error = ahd_softc_init(ahd);
- if (error != 0)
-@@ -375,12 +364,12 @@ ahd_pci_config(struct ahd_softc *ahd, st
-
- ahd->bus_intr = ahd_pci_intr;
-
-- error = ahd_reset(ahd);
-+ error = ahd_reset(ahd, /*reinit*/FALSE);
- if (error != 0)
- return (ENXIO);
-
- ahd->pci_cachesize =
-- ahd_pci_read_config(ahd->dev_softc, CSIZE_LATTIME,
-+ aic_pci_read_config(ahd->dev_softc, CSIZE_LATTIME,
- /*bytes*/1) & CACHESIZE;
- ahd->pci_cachesize *= 4;
-
-@@ -418,9 +407,11 @@ ahd_pci_config(struct ahd_softc *ahd, st
- int
- ahd_pci_test_register_access(struct ahd_softc *ahd)
- {
-- uint32_t cmd;
-- int error;
-- uint8_t hcntrl;
-+ uint32_t cmd;
-+ u_int targpcistat;
-+ u_int pci_status1;
-+ int error;
-+ uint8_t hcntrl;
-
- error = EIO;
-
-@@ -428,8 +419,8 @@ ahd_pci_test_register_access(struct ahd_
- * Enable PCI error interrupt status, but suppress NMIs
- * generated by SERR raised due to target aborts.
- */
-- cmd = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
-- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
-+ cmd = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
-+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
- cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
-
- /*
-@@ -449,11 +440,25 @@ ahd_pci_test_register_access(struct ahd_
- * or read prefetching could be initiated by the
- * CPU or host bridge. Our device does not support
- * either, so look for data corruption and/or flaged
-- * PCI errors.
-+ * PCI errors. First pause without causing another
-+ * chip reset.
- */
-+ hcntrl &= ~CHIPRST;
- ahd_outb(ahd, HCNTRL, hcntrl|PAUSE);
- while (ahd_is_paused(ahd) == 0)
- ;
-+
-+ /* Clear any PCI errors that occurred before our driver attached. */
-+ ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG);
-+ targpcistat = ahd_inb(ahd, TARGPCISTAT);
-+ ahd_outb(ahd, TARGPCISTAT, targpcistat);
-+ pci_status1 = aic_pci_read_config(ahd->dev_softc,
-+ PCIR_STATUS + 1, /*bytes*/1);
-+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
-+ pci_status1, /*bytes*/1);
-+ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
-+ ahd_outb(ahd, CLRINT, CLRPCIINT);
-+
- ahd_outb(ahd, SEQCTL0, PERRORDIS);
- ahd_outl(ahd, SRAM_BASE, 0x5aa555aa);
- if (ahd_inl(ahd, SRAM_BASE) != 0x5aa555aa)
-@@ -472,23 +477,20 @@ ahd_pci_test_register_access(struct ahd_
-
- fail:
- if ((ahd_inb(ahd, INTSTAT) & PCIINT) != 0) {
-- u_int targpcistat;
-- u_int pci_status1;
-
- ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG);
- targpcistat = ahd_inb(ahd, TARGPCISTAT);
-
- /* Silently clear any latched errors. */
- ahd_outb(ahd, TARGPCISTAT, targpcistat);
-- pci_status1 = ahd_pci_read_config(ahd->dev_softc,
-+ pci_status1 = aic_pci_read_config(ahd->dev_softc,
- PCIR_STATUS + 1, /*bytes*/1);
-- ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
-+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
- pci_status1, /*bytes*/1);
- ahd_outb(ahd, CLRINT, CLRPCIINT);
- }
--
- ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS);
-- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
-+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
- return (error);
- }
-
-@@ -637,14 +639,14 @@ ahd_configure_termination(struct ahd_sof
- uint8_t termctl;
- uint32_t devconfig;
-
-- devconfig = ahd_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
-+ devconfig = aic_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
- devconfig &= ~STPWLEVEL;
- if ((ahd->flags & AHD_STPWLEVEL_A) != 0)
- devconfig |= STPWLEVEL;
- if (bootverbose)
- printf("%s: STPWLEVEL is %s\n",
- ahd_name(ahd), (devconfig & STPWLEVEL) ? "on" : "off");
-- ahd_pci_write_config(ahd->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
-+ aic_pci_write_config(ahd->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
-
- /* Make sure current sensing is off. */
- if ((ahd->flags & AHD_CURRENT_SENSING) != 0) {
-@@ -689,6 +691,7 @@ ahd_configure_termination(struct ahd_sof
- * Now set the termination based on what we found.
- */
- sxfrctl1 = ahd_inb(ahd, SXFRCTL1) & ~STPWEN;
-+ ahd->flags &= ~AHD_TERM_ENB_A;
- if ((termctl & FLX_TERMCTL_ENPRILOW) != 0) {
- ahd->flags |= AHD_TERM_ENB_A;
- sxfrctl1 |= STPWEN;
-@@ -821,9 +824,9 @@ ahd_pci_intr(struct ahd_softc *ahd)
- }
- }
- }
-- pci_status1 = ahd_pci_read_config(ahd->dev_softc,
-+ pci_status1 = aic_pci_read_config(ahd->dev_softc,
- PCIR_STATUS + 1, /*bytes*/1);
-- ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
-+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
- pci_status1, /*bytes*/1);
- ahd_restore_modes(ahd, saved_modes);
- ahd_outb(ahd, CLRINT, CLRPCIINT);
-@@ -845,7 +848,7 @@ ahd_pci_split_intr(struct ahd_softc *ahd
- * Check for splits in all modes. Modes 0 and 1
- * additionally have SG engine splits to look at.
- */
-- pcix_status = ahd_pci_read_config(ahd->dev_softc, PCIXR_STATUS,
-+ pcix_status = aic_pci_read_config(ahd->dev_softc, PCIXR_STATUS,
- /*bytes*/2);
- printf("%s: PCI Split Interrupt - PCI-X status = 0x%x\n",
- ahd_name(ahd), pcix_status);
-@@ -894,7 +897,7 @@ ahd_pci_split_intr(struct ahd_softc *ahd
- /*
- * Clear PCI-X status bits.
- */
-- ahd_pci_write_config(ahd->dev_softc, PCIXR_STATUS,
-+ aic_pci_write_config(ahd->dev_softc, PCIXR_STATUS,
- pcix_status, /*bytes*/2);
- ahd_outb(ahd, CLRINT, CLRSPLTINT);
- ahd_restore_modes(ahd, saved_modes);
-@@ -903,44 +906,44 @@ ahd_pci_split_intr(struct ahd_softc *ahd
- static int
- ahd_aic7901_setup(struct ahd_softc *ahd)
- {
-- int error;
-
-- error = ahd_aic7902_setup(ahd);
-- if (error != 0)
-- return (error);
- ahd->chip = AHD_AIC7901;
-- return (0);
-+ ahd->features = AHD_AIC7901_FE;
-+ return (ahd_aic790X_setup(ahd));
- }
-
- static int
- ahd_aic7901A_setup(struct ahd_softc *ahd)
- {
-- int error;
-
-- error = ahd_aic7902_setup(ahd);
-- if (error != 0)
-- return (error);
- ahd->chip = AHD_AIC7901A;
-- return (0);
-+ ahd->features = AHD_AIC7901A_FE;
-+ return (ahd_aic790X_setup(ahd));
- }
-
- static int
- ahd_aic7902_setup(struct ahd_softc *ahd)
- {
-- ahd_dev_softc_t pci;
-+ ahd->chip = AHD_AIC7902;
-+ ahd->features = AHD_AIC7902_FE;
-+ return (ahd_aic790X_setup(ahd));
-+}
-+
-+static int
-+ahd_aic790X_setup(struct ahd_softc *ahd)
-+{
-+ aic_dev_softc_t pci;
- u_int rev;
-
- pci = ahd->dev_softc;
-- rev = ahd_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
-+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
- if (rev < ID_AIC7902_PCI_REV_A4) {
- printf("%s: Unable to attach to unsupported chip revision %d\n",
- ahd_name(ahd), rev);
-- ahd_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/2);
-+ aic_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/2);
- return (ENXIO);
- }
-- ahd->channel = ahd_get_pci_function(pci) + 'A';
-- ahd->chip = AHD_AIC7902;
-- ahd->features = AHD_AIC7902_FE;
-+ ahd->channel = aic_get_pci_function(pci) + 'A';
- if (rev < ID_AIC7902_PCI_REV_B0) {
- /*
- * Enable A series workarounds.
-@@ -968,9 +971,14 @@ ahd_aic7902_setup(struct ahd_softc *ahd)
- u_int devconfig1;
-
- ahd->features |= AHD_RTI|AHD_NEW_IOCELL_OPTS
-- | AHD_NEW_DFCNTRL_OPTS;
-- ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_ABORT_LQI_BUG
-- | AHD_INTCOLLISION_BUG|AHD_EARLY_REQ_BUG;
-+ | AHD_NEW_DFCNTRL_OPTS|AHD_FAST_CDB_DELIVERY;
-+ ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_EARLY_REQ_BUG;
-+
-+ /*
-+ * Some issues have been resolved in the 7901B.
-+ */
-+ if ((ahd->features & AHD_MULTI_FUNC) != 0)
-+ ahd->bugs |= AHD_INTCOLLISION_BUG|AHD_ABORT_LQI_BUG;
-
- /*
- * IO Cell paramter setup.
-@@ -985,10 +993,10 @@ ahd_aic7902_setup(struct ahd_softc *ahd)
- * XXX - Find out exactly what this does from the hardware
- * folks!
- */
-- devconfig1 = ahd_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
-- ahd_pci_write_config(pci, DEVCONFIG1,
-+ devconfig1 = aic_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
-+ aic_pci_write_config(pci, DEVCONFIG1,
- devconfig1|PREQDIS, /*bytes*/1);
-- devconfig1 = ahd_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
-+ devconfig1 = aic_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
- }
-
- return (0);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_proc.c 2003-06-14 12:18:29.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_proc.c 2003-12-28 23:21:39.000000000 -0800
-@@ -37,7 +37,7 @@
- * String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
- * sym driver.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_proc.c#17 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_proc.c#20 $
- */
- #include "aic79xx_osm.h"
- #include "aic79xx_inline.h"
-@@ -49,7 +49,7 @@ static void ahd_dump_target_state(struct
- u_int our_id, char channel,
- u_int target_id, u_int target_offset);
- static void ahd_dump_device_state(struct info_str *info,
-- struct ahd_linux_device *dev);
-+ struct aic_linux_device *dev);
- static int ahd_proc_write_seeprom(struct ahd_softc *ahd,
- char *buffer, int length);
-
-@@ -166,7 +166,7 @@ ahd_dump_target_state(struct ahd_softc *
- u_int our_id, char channel, u_int target_id,
- u_int target_offset)
- {
-- struct ahd_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct ahd_initiator_tinfo *tinfo;
- struct ahd_tmode_tstate *tstate;
- int lun;
-@@ -187,7 +187,7 @@ ahd_dump_target_state(struct ahd_softc *
- copy_info(info, "\tTransmission Errors %ld\n", targ->errors_detected);
-
- for (lun = 0; lun < AHD_NUM_LUNS; lun++) {
-- struct ahd_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- dev = targ->devices[lun];
-
-@@ -199,7 +199,7 @@ ahd_dump_target_state(struct ahd_softc *
- }
-
- static void
--ahd_dump_device_state(struct info_str *info, struct ahd_linux_device *dev)
-+ahd_dump_device_state(struct info_str *info, struct aic_linux_device *dev)
- {
- copy_info(info, "\tChannel %c Target %d Lun %d Settings\n",
- dev->target->channel + 'A', dev->target->target, dev->lun);
-@@ -278,8 +278,13 @@ done:
- * Return information to handle /proc support for the driver.
- */
- int
--ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, off_t offset,
-- int length, int inout)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ahd_linux_proc_info(char *buffer, char **start, off_t offset,
-+ int length, int hostno, int inout)
-+#else
-+ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
-+ off_t offset, int length, int inout)
-+#endif
- {
- struct ahd_softc *ahd;
- struct info_str info;
-@@ -291,10 +296,14 @@ ahd_linux_proc_info(struct Scsi_Host *sh
-
- retval = -EINVAL;
- ahd_list_lock(&l);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
- TAILQ_FOREACH(ahd, &ahd_tailq, links) {
-- if (ahd->platform_data->host == shost)
-+ if (ahd->platform_data->host->host_no == hostno)
- break;
- }
-+#else
-+ ahd = ahd_find_softc(*(struct ahd_softc **)shost->hostdata);
-+#endif
-
- if (ahd == NULL)
- goto done;
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx.reg 2003-06-14 12:18:34.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx.reg 2003-12-28 23:21:39.000000000 -0800
-@@ -39,7 +39,7 @@
- *
- * $FreeBSD$
- */
--VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#69 $"
-+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $"
-
- /*
- * This file is processed by the aic7xxx_asm utility for use in assembling
-@@ -1377,7 +1377,10 @@ register LUNLEN {
- address 0x030
- access_mode RW
- modes M_CFG
-+ mask ILUNLEN 0x0F
-+ mask TLUNLEN 0xF0
- }
-+const LUNLEN_SINGLE_LEVEL_LUN 0xF
-
- /*
- * CDB Limit
-@@ -3797,32 +3800,8 @@ scb {
- size 4
- alias SCB_NEXT_COMPLETE
- }
-- SCB_DATAPTR {
-- size 8
-- }
-- SCB_DATACNT {
-- /*
-- * The last byte is really the high address bits for
-- * the data address.
-- */
-- size 4
-- field SG_LAST_SEG 0x80 /* In the fourth byte */
-- field SG_HIGH_ADDR_BITS 0x7F /* In the fourth byte */
-- }
-- SCB_SGPTR {
-- size 4
-- field SG_STATUS_VALID 0x04 /* In the first byte */
-- field SG_FULL_RESID 0x02 /* In the first byte */
-- field SG_LIST_NULL 0x01 /* In the first byte */
-- }
-- SCB_BUSADDR {
-- size 4
-- }
-- SCB_NEXT {
-- alias SCB_NEXT_SCB_BUSADDR
-- size 2
-- }
-- SCB_NEXT2 {
-+ SCB_TAG {
-+ alias SCB_FIFO_USE_COUNT
- size 2
- }
- SCB_CONTROL {
-@@ -3859,8 +3838,32 @@ scb {
- SCB_TASK_MANAGEMENT {
- size 1
- }
-- SCB_TAG {
-- alias SCB_FIFO_USE_COUNT
-+ SCB_DATAPTR {
-+ size 8
-+ }
-+ SCB_DATACNT {
-+ /*
-+ * The last byte is really the high address bits for
-+ * the data address.
-+ */
-+ size 4
-+ field SG_LAST_SEG 0x80 /* In the fourth byte */
-+ field SG_HIGH_ADDR_BITS 0x7F /* In the fourth byte */
-+ }
-+ SCB_SGPTR {
-+ size 4
-+ field SG_STATUS_VALID 0x04 /* In the first byte */
-+ field SG_FULL_RESID 0x02 /* In the first byte */
-+ field SG_LIST_NULL 0x01 /* In the first byte */
-+ }
-+ SCB_BUSADDR {
-+ size 4
-+ }
-+ SCB_NEXT {
-+ alias SCB_NEXT_SCB_BUSADDR
-+ size 2
-+ }
-+ SCB_NEXT2 {
- size 2
- }
- SCB_SPARE {
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped 2003-06-14 12:18:51.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped 2003-12-28 23:21:39.000000000 -0800
-@@ -2,8 +2,8 @@
- * DO NOT EDIT - This file is automatically generated
- * from the following source files:
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#69 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#107 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
- */
- typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
- typedef struct ahd_reg_parse_entry {
-@@ -2239,94 +2239,94 @@ ahd_reg_print_t ahd_scb_sense_busaddr_pr
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_dataptr_print;
-+ahd_reg_print_t ahd_scb_tag_print;
- #else
--#define ahd_scb_dataptr_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_DATAPTR", 0x190, regvalue, cur_col, wrap)
-+#define ahd_scb_tag_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_TAG", 0x190, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_datacnt_print;
-+ahd_reg_print_t ahd_scb_control_print;
- #else
--#define ahd_scb_datacnt_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_DATACNT", 0x198, regvalue, cur_col, wrap)
-+#define ahd_scb_control_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_CONTROL", 0x192, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_sgptr_print;
-+ahd_reg_print_t ahd_scb_scsiid_print;
- #else
--#define ahd_scb_sgptr_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_SGPTR", 0x19c, regvalue, cur_col, wrap)
-+#define ahd_scb_scsiid_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_SCSIID", 0x193, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_busaddr_print;
-+ahd_reg_print_t ahd_scb_lun_print;
- #else
--#define ahd_scb_busaddr_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_BUSADDR", 0x1a0, regvalue, cur_col, wrap)
-+#define ahd_scb_lun_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_LUN", 0x194, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_next_print;
-+ahd_reg_print_t ahd_scb_task_attribute_print;
- #else
--#define ahd_scb_next_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_NEXT", 0x1a4, regvalue, cur_col, wrap)
-+#define ahd_scb_task_attribute_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_TASK_ATTRIBUTE", 0x195, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_next2_print;
-+ahd_reg_print_t ahd_scb_cdb_len_print;
- #else
--#define ahd_scb_next2_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_NEXT2", 0x1a6, regvalue, cur_col, wrap)
-+#define ahd_scb_cdb_len_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_CDB_LEN", 0x196, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_control_print;
-+ahd_reg_print_t ahd_scb_task_management_print;
- #else
--#define ahd_scb_control_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_CONTROL", 0x1a8, regvalue, cur_col, wrap)
-+#define ahd_scb_task_management_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT", 0x197, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_scsiid_print;
-+ahd_reg_print_t ahd_scb_dataptr_print;
- #else
--#define ahd_scb_scsiid_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_SCSIID", 0x1a9, regvalue, cur_col, wrap)
-+#define ahd_scb_dataptr_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_DATAPTR", 0x198, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_lun_print;
-+ahd_reg_print_t ahd_scb_datacnt_print;
- #else
--#define ahd_scb_lun_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_LUN", 0x1aa, regvalue, cur_col, wrap)
-+#define ahd_scb_datacnt_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_DATACNT", 0x1a0, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_task_attribute_print;
-+ahd_reg_print_t ahd_scb_sgptr_print;
- #else
--#define ahd_scb_task_attribute_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_TASK_ATTRIBUTE", 0x1ab, regvalue, cur_col, wrap)
-+#define ahd_scb_sgptr_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_SGPTR", 0x1a4, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_cdb_len_print;
-+ahd_reg_print_t ahd_scb_busaddr_print;
- #else
--#define ahd_scb_cdb_len_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_CDB_LEN", 0x1ac, regvalue, cur_col, wrap)
-+#define ahd_scb_busaddr_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_BUSADDR", 0x1a8, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_task_management_print;
-+ahd_reg_print_t ahd_scb_next_print;
- #else
--#define ahd_scb_task_management_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT", 0x1ad, regvalue, cur_col, wrap)
-+#define ahd_scb_next_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_NEXT", 0x1ac, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
--ahd_reg_print_t ahd_scb_tag_print;
-+ahd_reg_print_t ahd_scb_next2_print;
- #else
--#define ahd_scb_tag_print(regvalue, cur_col, wrap) \
-- ahd_print_register(NULL, 0, "SCB_TAG", 0x1ae, regvalue, cur_col, wrap)
-+#define ahd_scb_next2_print(regvalue, cur_col, wrap) \
-+ ahd_print_register(NULL, 0, "SCB_NEXT2", 0x1ae, regvalue, cur_col, wrap)
- #endif
-
- #if AIC_DEBUG_REGISTERS
-@@ -2557,6 +2557,8 @@ ahd_reg_print_t ahd_scb_disconnected_lis
- #define SHORTTHRESH 0x2f
-
- #define LUNLEN 0x30
-+#define TLUNLEN 0xf0
-+#define ILUNLEN 0x0f
-
- #define CDBLIMIT 0x31
-
-@@ -3648,25 +3650,10 @@ ahd_reg_print_t ahd_scb_disconnected_lis
- #define SCB_SENSE_BUSADDR 0x18c
- #define SCB_NEXT_COMPLETE 0x18c
-
--#define SCB_DATAPTR 0x190
--
--#define SCB_DATACNT 0x198
--#define SG_LAST_SEG 0x80
--#define SG_HIGH_ADDR_BITS 0x7f
--
--#define SCB_SGPTR 0x19c
--#define SG_STATUS_VALID 0x04
--#define SG_FULL_RESID 0x02
--#define SG_LIST_NULL 0x01
-+#define SCB_TAG 0x190
-+#define SCB_FIFO_USE_COUNT 0x190
-
--#define SCB_BUSADDR 0x1a0
--
--#define SCB_NEXT 0x1a4
--#define SCB_NEXT_SCB_BUSADDR 0x1a4
--
--#define SCB_NEXT2 0x1a6
--
--#define SCB_CONTROL 0x1a8
-+#define SCB_CONTROL 0x192
- #define TARGET_SCB 0x80
- #define DISCENB 0x40
- #define TAG_ENB 0x20
-@@ -3675,23 +3662,38 @@ ahd_reg_print_t ahd_scb_disconnected_lis
- #define DISCONNECTED 0x04
- #define SCB_TAG_TYPE 0x03
-
--#define SCB_SCSIID 0x1a9
-+#define SCB_SCSIID 0x193
- #define TID 0xf0
- #define OID 0x0f
-
--#define SCB_LUN 0x1aa
-+#define SCB_LUN 0x194
- #define LID 0xff
-
--#define SCB_TASK_ATTRIBUTE 0x1ab
-+#define SCB_TASK_ATTRIBUTE 0x195
- #define SCB_XFERLEN_ODD 0x01
-
--#define SCB_CDB_LEN 0x1ac
-+#define SCB_CDB_LEN 0x196
- #define SCB_CDB_LEN_PTR 0x80
-
--#define SCB_TASK_MANAGEMENT 0x1ad
-+#define SCB_TASK_MANAGEMENT 0x197
-+
-+#define SCB_DATAPTR 0x198
-+
-+#define SCB_DATACNT 0x1a0
-+#define SG_LAST_SEG 0x80
-+#define SG_HIGH_ADDR_BITS 0x7f
-+
-+#define SCB_SGPTR 0x1a4
-+#define SG_STATUS_VALID 0x04
-+#define SG_FULL_RESID 0x02
-+#define SG_LIST_NULL 0x01
-+
-+#define SCB_BUSADDR 0x1a8
-+
-+#define SCB_NEXT 0x1ac
-+#define SCB_NEXT_SCB_BUSADDR 0x1ac
-
--#define SCB_TAG 0x1ae
--#define SCB_FIFO_USE_COUNT 0x1ae
-+#define SCB_NEXT2 0x1ae
-
- #define SCB_SPARE 0x1b0
- #define SCB_PKT_LUN 0x1b0
-@@ -3720,6 +3722,7 @@ ahd_reg_print_t ahd_scb_disconnected_lis
- #define AHD_PRECOMP_CUTBACK_29 0x06
- #define AHD_NUM_PER_DEV_ANNEXCOLS 0x04
- #define B_CURRFIFO_0 0x02
-+#define LUNLEN_SINGLE_LEVEL_LUN 0x0f
- #define NVRAM_SCB_OFFSET 0x2c
- #define AHD_TIMER_MAX_US 0x18ffe7
- #define AHD_TIMER_MAX_TICKS 0xffff
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped 2003-06-14 12:17:56.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped 2003-12-28 23:21:39.000000000 -0800
-@@ -2,8 +2,8 @@
- * DO NOT EDIT - This file is automatically generated
- * from the following source files:
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#93 $
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#68 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#107 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
- */
-
- #include "aic79xx_osm.h"
-@@ -489,10 +489,15 @@ ahd_shortthresh_print(u_int regvalue, u_
- 0x2f, regvalue, cur_col, wrap));
- }
-
-+static ahd_reg_parse_entry_t LUNLEN_parse_table[] = {
-+ { "ILUNLEN", 0x0f, 0x0f },
-+ { "TLUNLEN", 0xf0, 0xf0 }
-+};
-+
- int
- ahd_lunlen_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
-- return (ahd_print_register(NULL, 0, "LUNLEN",
-+ return (ahd_print_register(LUNLEN_parse_table, 2, "LUNLEN",
- 0x30, regvalue, cur_col, wrap));
- }
-
-@@ -3486,58 +3491,12 @@ ahd_scb_sense_busaddr_print(u_int regval
- }
-
- int
--ahd_scb_dataptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
-+ahd_scb_tag_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
-- return (ahd_print_register(NULL, 0, "SCB_DATAPTR",
-+ return (ahd_print_register(NULL, 0, "SCB_TAG",
- 0x190, regvalue, cur_col, wrap));
- }
-
--static ahd_reg_parse_entry_t SCB_DATACNT_parse_table[] = {
-- { "SG_HIGH_ADDR_BITS", 0x7f, 0x7f },
-- { "SG_LAST_SEG", 0x80, 0x80 }
--};
--
--int
--ahd_scb_datacnt_print(u_int regvalue, u_int *cur_col, u_int wrap)
--{
-- return (ahd_print_register(SCB_DATACNT_parse_table, 2, "SCB_DATACNT",
-- 0x198, regvalue, cur_col, wrap));
--}
--
--static ahd_reg_parse_entry_t SCB_SGPTR_parse_table[] = {
-- { "SG_LIST_NULL", 0x01, 0x01 },
-- { "SG_FULL_RESID", 0x02, 0x02 },
-- { "SG_STATUS_VALID", 0x04, 0x04 }
--};
--
--int
--ahd_scb_sgptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
--{
-- return (ahd_print_register(SCB_SGPTR_parse_table, 3, "SCB_SGPTR",
-- 0x19c, regvalue, cur_col, wrap));
--}
--
--int
--ahd_scb_busaddr_print(u_int regvalue, u_int *cur_col, u_int wrap)
--{
-- return (ahd_print_register(NULL, 0, "SCB_BUSADDR",
-- 0x1a0, regvalue, cur_col, wrap));
--}
--
--int
--ahd_scb_next_print(u_int regvalue, u_int *cur_col, u_int wrap)
--{
-- return (ahd_print_register(NULL, 0, "SCB_NEXT",
-- 0x1a4, regvalue, cur_col, wrap));
--}
--
--int
--ahd_scb_next2_print(u_int regvalue, u_int *cur_col, u_int wrap)
--{
-- return (ahd_print_register(NULL, 0, "SCB_NEXT2",
-- 0x1a6, regvalue, cur_col, wrap));
--}
--
- static ahd_reg_parse_entry_t SCB_CONTROL_parse_table[] = {
- { "SCB_TAG_TYPE", 0x03, 0x03 },
- { "DISCONNECTED", 0x04, 0x04 },
-@@ -3552,7 +3511,7 @@ int
- ahd_scb_control_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
- return (ahd_print_register(SCB_CONTROL_parse_table, 7, "SCB_CONTROL",
-- 0x1a8, regvalue, cur_col, wrap));
-+ 0x192, regvalue, cur_col, wrap));
- }
-
- static ahd_reg_parse_entry_t SCB_SCSIID_parse_table[] = {
-@@ -3564,7 +3523,7 @@ int
- ahd_scb_scsiid_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
- return (ahd_print_register(SCB_SCSIID_parse_table, 2, "SCB_SCSIID",
-- 0x1a9, regvalue, cur_col, wrap));
-+ 0x193, regvalue, cur_col, wrap));
- }
-
- static ahd_reg_parse_entry_t SCB_LUN_parse_table[] = {
-@@ -3575,14 +3534,18 @@ int
- ahd_scb_lun_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
- return (ahd_print_register(SCB_LUN_parse_table, 1, "SCB_LUN",
-- 0x1aa, regvalue, cur_col, wrap));
-+ 0x194, regvalue, cur_col, wrap));
- }
-
-+static ahd_reg_parse_entry_t SCB_TASK_ATTRIBUTE_parse_table[] = {
-+ { "SCB_XFERLEN_ODD", 0x01, 0x01 }
-+};
-+
- int
- ahd_scb_task_attribute_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
-- return (ahd_print_register(NULL, 0, "SCB_TASK_ATTRIBUTE",
-- 0x1ab, regvalue, cur_col, wrap));
-+ return (ahd_print_register(SCB_TASK_ATTRIBUTE_parse_table, 1, "SCB_TASK_ATTRIBUTE",
-+ 0x195, regvalue, cur_col, wrap));
- }
-
- static ahd_reg_parse_entry_t SCB_CDB_LEN_parse_table[] = {
-@@ -3593,20 +3556,66 @@ int
- ahd_scb_cdb_len_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
- return (ahd_print_register(SCB_CDB_LEN_parse_table, 1, "SCB_CDB_LEN",
-- 0x1ac, regvalue, cur_col, wrap));
-+ 0x196, regvalue, cur_col, wrap));
- }
-
- int
- ahd_scb_task_management_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
- return (ahd_print_register(NULL, 0, "SCB_TASK_MANAGEMENT",
-- 0x1ad, regvalue, cur_col, wrap));
-+ 0x197, regvalue, cur_col, wrap));
- }
-
- int
--ahd_scb_tag_print(u_int regvalue, u_int *cur_col, u_int wrap)
-+ahd_scb_dataptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
-- return (ahd_print_register(NULL, 0, "SCB_TAG",
-+ return (ahd_print_register(NULL, 0, "SCB_DATAPTR",
-+ 0x198, regvalue, cur_col, wrap));
-+}
-+
-+static ahd_reg_parse_entry_t SCB_DATACNT_parse_table[] = {
-+ { "SG_HIGH_ADDR_BITS", 0x7f, 0x7f },
-+ { "SG_LAST_SEG", 0x80, 0x80 }
-+};
-+
-+int
-+ahd_scb_datacnt_print(u_int regvalue, u_int *cur_col, u_int wrap)
-+{
-+ return (ahd_print_register(SCB_DATACNT_parse_table, 2, "SCB_DATACNT",
-+ 0x1a0, regvalue, cur_col, wrap));
-+}
-+
-+static ahd_reg_parse_entry_t SCB_SGPTR_parse_table[] = {
-+ { "SG_LIST_NULL", 0x01, 0x01 },
-+ { "SG_FULL_RESID", 0x02, 0x02 },
-+ { "SG_STATUS_VALID", 0x04, 0x04 }
-+};
-+
-+int
-+ahd_scb_sgptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
-+{
-+ return (ahd_print_register(SCB_SGPTR_parse_table, 3, "SCB_SGPTR",
-+ 0x1a4, regvalue, cur_col, wrap));
-+}
-+
-+int
-+ahd_scb_busaddr_print(u_int regvalue, u_int *cur_col, u_int wrap)
-+{
-+ return (ahd_print_register(NULL, 0, "SCB_BUSADDR",
-+ 0x1a8, regvalue, cur_col, wrap));
-+}
-+
-+int
-+ahd_scb_next_print(u_int regvalue, u_int *cur_col, u_int wrap)
-+{
-+ return (ahd_print_register(NULL, 0, "SCB_NEXT",
-+ 0x1ac, regvalue, cur_col, wrap));
-+}
-+
-+int
-+ahd_scb_next2_print(u_int regvalue, u_int *cur_col, u_int wrap)
-+{
-+ return (ahd_print_register(NULL, 0, "SCB_NEXT2",
- 0x1ae, regvalue, cur_col, wrap));
- }
-
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx.seq 2003-06-14 12:18:30.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx.seq 2003-12-28 23:21:39.000000000 -0800
-@@ -40,7 +40,7 @@
- * $FreeBSD$
- */
-
--VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $"
-+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#107 $"
- PATCH_ARG_LIST = "struct ahd_softc *ahd"
- PREFIX = "ahd_"
-
-@@ -90,6 +90,13 @@ idle_loop_check_nonpackreq:
- test SSTAT2, NONPACKREQ jz . + 2;
- call unexpected_nonpkt_phase_find_ctxt;
- if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
-+ /*
-+ * On Rev A. hardware, the busy LED is only
-+ * turned on automaically during selections
-+ * and re-selections. Make the LED status
-+ * more useful by forcing it to be on so
-+ * long as one of our data FIFOs is active.
-+ */
- and A, FIFO0FREE|FIFO1FREE, DFFSTAT;
- cmp A, FIFO0FREE|FIFO1FREE jne . + 3;
- and SBLKCTL, ~DIAGLEDEN|DIAGLEDON;
-@@ -101,9 +108,9 @@ idle_loop_check_nonpackreq:
- call idle_loop_cchan;
- jmp idle_loop;
-
--BEGIN_CRITICAL;
- idle_loop_gsfifo:
- SET_MODE(M_SCSI, M_SCSI)
-+BEGIN_CRITICAL;
- idle_loop_gsfifo_in_scsi_mode:
- test LQISTAT2, LQIGSAVAIL jz return;
- /*
-@@ -152,25 +159,28 @@ END_CRITICAL;
-
- idle_loop_service_fifos:
- SET_MODE(M_DFF0, M_DFF0)
-+BEGIN_CRITICAL;
- test LONGJMP_ADDR[1], INVALID_ADDR jnz idle_loop_next_fifo;
- call longjmp;
-+END_CRITICAL;
- idle_loop_next_fifo:
- SET_MODE(M_DFF1, M_DFF1)
-+BEGIN_CRITICAL;
- test LONGJMP_ADDR[1], INVALID_ADDR jz longjmp;
-+END_CRITICAL;
- return:
- ret;
-
- idle_loop_cchan:
- SET_MODE(M_CCHAN, M_CCHAN)
- test QOFF_CTLSTA, HS_MAILBOX_ACT jz hs_mailbox_empty;
-- mov LOCAL_HS_MAILBOX, HS_MAILBOX;
- or QOFF_CTLSTA, HS_MAILBOX_ACT;
-+ mov LOCAL_HS_MAILBOX, HS_MAILBOX;
- hs_mailbox_empty:
- BEGIN_CRITICAL;
- test CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle;
- test CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog;
- test CCSCBCTL, CCSCBDONE jz return;
--END_CRITICAL;
- /* FALLTHROUGH */
- scbdma_tohost_done:
- test CCSCBCTL, CCARREN jz fill_qoutfifo_dmadone;
-@@ -180,26 +190,18 @@ scbdma_tohost_done:
- * bad SCSI status (currently only for underruns), we
- * queue the SCB for normal completion. Otherwise, we
- * wait until any select-out activity has halted, and
-- * then notify the host so that the transaction can be
-- * dealt with.
-+ * then queue the completion.
- */
-- test SCB_SCSI_STATUS, 0xff jnz scbdma_notify_host;
-- and CCSCBCTL, ~(CCARREN|CCSCBEN);
-- bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2;
-- bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
-- bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
--scbdma_notify_host:
-+ test SCB_SCSI_STATUS, 0xff jz scbdma_queue_completion;
- SET_MODE(M_SCSI, M_SCSI)
- test SCSISEQ0, ENSELO jnz return;
- test SSTAT0, (SELDO|SELINGO) jnz return;
- SET_MODE(M_CCHAN, M_CCHAN)
-- /*
-- * Remove SCB and notify host.
-- */
-+scbdma_queue_completion:
- and CCSCBCTL, ~(CCARREN|CCSCBEN);
- bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2;
-- SET_SEQINTCODE(BAD_SCB_STATUS)
-- ret;
-+ bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
-+ bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
- fill_qoutfifo_dmadone:
- and CCSCBCTL, ~(CCARREN|CCSCBEN);
- call qoutfifo_updated;
-@@ -208,6 +210,7 @@ fill_qoutfifo_dmadone:
- test QOFF_CTLSTA, SDSCB_ROLLOVR jz return;
- bmov QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4;
- xor QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID_TOGGLE ret;
-+END_CRITICAL;
-
- qoutfifo_updated:
- /*
-@@ -276,7 +279,7 @@ fetch_new_scb_done:
- * knows the correct location to store the SCB.
- * Set it to zero before processing the SCB.
- */
-- mov SCB_FIFO_USE_COUNT, ALLZEROS;
-+ clr SCB_FIFO_USE_COUNT;
- /* Update the next SCB address to download. */
- bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4;
- mvi SCB_NEXT[1], SCB_LIST_NULL;
-@@ -490,14 +493,30 @@ allocate_fifo1:
- SET_SRC_MODE M_SCSI;
- SET_DST_MODE M_SCSI;
- select_in:
-+ if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
-+ /*
-+ * On Rev A. hardware, the busy LED is only
-+ * turned on automaically during selections
-+ * and re-selections. Make the LED status
-+ * more useful by forcing it to be on from
-+ * the point of selection until our idle
-+ * loop determines that neither of our FIFOs
-+ * are busy. This handles the non-packetized
-+ * case nicely as we will not return to the
-+ * idle loop until the busfree at the end of
-+ * each transaction.
-+ */
-+ or SBLKCTL, DIAGLEDEN|DIAGLEDON;
-+ }
- if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
- /*
-- * This exposes a window whereby a
-- * busfree just after a selection will
-- * be missed, but there is no other safe
-- * way to enable busfree detection if
-- * the busfreerev function is broken.
-+ * Test to ensure that the bus has not
-+ * already gone free prior to clearing
-+ * any stale busfree status. This avoids
-+ * a window whereby a busfree just after
-+ * a selection could be missed.
- */
-+ test SCSISIGI, BSYI jz . + 2;
- mvi CLRSINT1,CLRBUSFREE;
- or SIMODE1, ENBUSFREE;
- }
-@@ -527,6 +546,21 @@ SET_SRC_MODE M_SCSI;
- SET_DST_MODE M_SCSI;
- select_out:
- BEGIN_CRITICAL;
-+ if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
-+ /*
-+ * On Rev A. hardware, the busy LED is only
-+ * turned on automaically during selections
-+ * and re-selections. Make the LED status
-+ * more useful by forcing it to be on from
-+ * the point of re-selection until our idle
-+ * loop determines that neither of our FIFOs
-+ * are busy. This handles the non-packetized
-+ * case nicely as we will not return to the
-+ * idle loop until the busfree at the end of
-+ * each transaction.
-+ */
-+ or SBLKCTL, DIAGLEDEN|DIAGLEDON;
-+ }
- /* Clear out all SCBs that have been successfully sent. */
- if ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0) {
- /*
-@@ -582,9 +616,6 @@ found_last_sent_scb:
- bmov CURRSCB, SCBPTR, 2;
- curscb_ww_done:
- } else {
-- /*
-- * Untested - Verify with Rev B.
-- */
- bmov SCBPTR, CURRSCB, 2;
- }
-
-@@ -651,12 +682,13 @@ select_out_non_packetized:
- and SCSISEQ0, ~ENSELO;
- if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
- /*
-- * This exposes a window whereby a
-- * busfree just after a selection will
-- * be missed, but there is no other safe
-- * way to enable busfree detection if
-- * the busfreerev function is broken.
-+ * Test to ensure that the bus has not
-+ * already gone free prior to clearing
-+ * any stale busfree status. This avoids
-+ * a window whereby a busfree just after
-+ * a selection could be missed.
- */
-+ test SCSISIGI, BSYI jz . + 2;
- mvi CLRSINT1,CLRBUSFREE;
- or SIMODE1, ENBUSFREE;
- }
-@@ -729,13 +761,38 @@ p_command_embedded:
- mvi DFCNTRL, SCSIEN;
- p_command_xfer:
- and SEQ_FLAGS, ~NO_CDB_SENT;
-- test DFCNTRL, SCSIEN jnz .;
-+ if ((ahd->features & AHD_FAST_CDB_DELIVERY) != 0) {
-+ /*
-+ * To speed up CDB delivery in Rev B, all CDB acks
-+ * are "released" to the output sync as soon as the
-+ * command phase starts. There is only one problem
-+ * with this approach. If the target changes phase
-+ * before all data are sent, we have left over acks
-+ * that can go out on the bus in a data phase. Due
-+ * to other chip contraints, this only happens if
-+ * the target goes to data-in, but if the acks go
-+ * out before we can test SDONE, we'll think that
-+ * the transfer has completed successfully. Work
-+ * around this by taking advantage of the 400ns or
-+ * 800ns dead time between command phase and the REQ
-+ * of the new phase. If the transfer has completed
-+ * successfully, SCSIEN should fall *long* before we
-+ * see a phase change. We thus treat any phasemiss
-+ * that occurs before SCSIEN falls as an incomplete
-+ * transfer.
-+ */
-+ test SSTAT1, PHASEMIS jnz p_command_xfer_failed;
-+ test DFCNTRL, SCSIEN jnz . - 1;
-+ } else {
-+ test DFCNTRL, SCSIEN jnz .;
-+ }
- /*
- * DMA Channel automatically disabled.
- * Don't allow a data phase if the command
- * was not fully transferred.
- */
- test SSTAT2, SDONE jnz ITloop;
-+p_command_xfer_failed:
- or SEQ_FLAGS, NO_CDB_SENT;
- jmp ITloop;
-
-@@ -1061,8 +1118,10 @@ queue_scb_completion:
- test SCB_SGPTR, SG_FULL_RESID jnz upload_scb;/* Never xfered */
- test SCB_RESIDUAL_SGPTR, SG_LIST_NULL jz upload_scb;
- complete:
-+BEGIN_CRITICAL;
- bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
- bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
-+END_CRITICAL;
- bad_status:
- cmp SCB_SCSI_STATUS, STATUS_PKT_SENSE je upload_scb;
- call freeze_queue;
-@@ -1073,9 +1132,11 @@ upload_scb:
- * it on the host.
- */
- bmov SCB_TAG, SCBPTR, 2;
-+BEGIN_CRITICAL;
- bmov SCB_NEXT_COMPLETE, COMPLETE_DMA_SCB_HEAD, 2;
- bmov COMPLETE_DMA_SCB_HEAD, SCBPTR, 2;
- or SCB_SGPTR, SG_STATUS_VALID ret;
-+END_CRITICAL;
-
- /*
- * Is it a disconnect message? Set a flag in the SCB to remind us
-@@ -1122,8 +1183,18 @@ SET_DST_MODE M_DFF1;
- await_busfree_clrchn:
- mvi DFFSXFRCTL, CLRCHN;
- await_busfree_not_m_dff:
-- call clear_target_state;
-+ /* clear target specific flags */
-+ mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT;
- test SSTAT1,REQINIT|BUSFREE jz .;
-+ /*
-+ * We only set BUSFREE status once either a new
-+ * phase has been detected or we are really
-+ * BUSFREE. This allows the driver to know
-+ * that we are active on the bus even though
-+ * no identified transaction exists should a
-+ * timeout occur while awaiting busfree.
-+ */
-+ mvi LASTPHASE, P_BUSFREE;
- test SSTAT1, BUSFREE jnz idle_loop;
- SET_SEQINTCODE(MISSED_BUSFREE)
-
-@@ -1178,11 +1249,6 @@ msgin_rdptrs_get_fifo:
- call allocate_fifo;
- jmp mesgin_done;
-
--clear_target_state:
-- mvi LASTPHASE, P_BUSFREE;
-- /* clear target specific flags */
-- mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT ret;
--
- phase_lock:
- if ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0) {
- /*
-@@ -1634,7 +1700,7 @@ export seq_isr:
- * savepointer in the current FIFO. We do this so that
- * a pending CTXTDONE or SAVEPTR is visible in the active
- * FIFO. This status is the only way we can detect if we
-- * have lost the race (e.g. host paused us) and our attepts
-+ * have lost the race (e.g. host paused us) and our attempts
- * to disable the channel occurred after all REQs were
- * already seen and acked (REQINIT never comes true).
- */
-@@ -1643,7 +1709,7 @@ export seq_isr:
- test DFCNTRL, DIRECTION jz interrupt_return;
- and DFCNTRL, ~SCSIEN;
- snapshot_wait_data_valid:
-- test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz snapshot_data_valid;
-+ test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz interrupt_return;
- test SSTAT1, REQINIT jz snapshot_wait_data_valid;
- snapshot_data_valid:
- or DFCNTRL, SCSIEN;
-@@ -1810,7 +1876,6 @@ pkt_saveptrs_check_status:
- dec SCB_FIFO_USE_COUNT;
- test SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle;
- mvi DFFSXFRCTL, CLRCHN ret;
--END_CRITICAL;
-
- /*
- * LAST_SEG_DONE status has been seen in the current FIFO.
-@@ -1819,7 +1884,6 @@ END_CRITICAL;
- * Check for overrun and see if we can complete this command.
- */
- pkt_last_seg_done:
--BEGIN_CRITICAL;
- /*
- * Mark transfer as completed.
- */
-@@ -1959,12 +2023,14 @@ SET_DST_MODE M_SCSI;
- test SSTAT0, SELDO jnz return;
- mvi SCBPTR[1], SCB_LIST_NULL;
- unexpected_nonpkt_phase:
-- test MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1)) jnz . + 3;
-+ test MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1))
-+ jnz unexpected_nonpkt_mode_cleared;
- SET_SRC_MODE M_DFF0;
- SET_DST_MODE M_DFF0;
- or LONGJMP_ADDR[1], INVALID_ADDR;
- dec SCB_FIFO_USE_COUNT;
- mvi DFFSXFRCTL, CLRCHN;
-+unexpected_nonpkt_mode_cleared:
- mvi CLRSINT2, CLRNONPACKREQ;
- test SCSIPHASE, ~(MSG_IN_PHASE|MSG_OUT_PHASE) jnz illegal_phase;
- SET_SEQINTCODE(ENTERING_NONPACK)
---- linux-2.6.0/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped 2003-06-14 12:18:48.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped 2003-12-28 23:21:39.000000000 -0800
-@@ -2,25 +2,25 @@
- * DO NOT EDIT - This file is automatically generated
- * from the following source files:
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $
-- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#69 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#107 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $
- */
- static uint8_t seqprog[] = {
- 0xff, 0x02, 0x06, 0x78,
-- 0x00, 0xea, 0x50, 0x59,
-+ 0x00, 0xea, 0x46, 0x59,
- 0x01, 0xea, 0x04, 0x30,
- 0xff, 0x04, 0x0c, 0x78,
-- 0x19, 0xea, 0x50, 0x59,
-+ 0x19, 0xea, 0x46, 0x59,
- 0x19, 0xea, 0x04, 0x00,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x60, 0x3a, 0x1a, 0x68,
- 0x04, 0x47, 0x1b, 0x68,
- 0xff, 0x21, 0x1b, 0x70,
-- 0x40, 0x4b, 0x92, 0x69,
-- 0x00, 0xe2, 0x54, 0x59,
-- 0x40, 0x4b, 0x92, 0x69,
-- 0x20, 0x4b, 0x82, 0x69,
-+ 0x40, 0x4b, 0x8c, 0x69,
-+ 0x00, 0xe2, 0x4a, 0x59,
-+ 0x40, 0x4b, 0x8c, 0x69,
-+ 0x20, 0x4b, 0x78, 0x69,
- 0xfc, 0x42, 0x24, 0x78,
- 0x10, 0x40, 0x24, 0x78,
- 0x00, 0xe2, 0xc4, 0x5d,
-@@ -35,70 +35,65 @@ static uint8_t seqprog[] = {
- 0x00, 0xe2, 0x56, 0x58,
- 0x00, 0xe2, 0x66, 0x58,
- 0x00, 0xe2, 0x06, 0x40,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x01, 0x52, 0x64, 0x78,
- 0x02, 0x58, 0x50, 0x31,
- 0xff, 0xea, 0x10, 0x0b,
-- 0xff, 0xad, 0x4f, 0x78,
-+ 0xff, 0x97, 0x4f, 0x78,
- 0x50, 0x4b, 0x4a, 0x68,
- 0xbf, 0x3a, 0x74, 0x08,
-- 0x14, 0xea, 0x50, 0x59,
-+ 0x14, 0xea, 0x46, 0x59,
- 0x14, 0xea, 0x04, 0x00,
-- 0x08, 0xa8, 0x51, 0x03,
-- 0xff, 0xae, 0x3f, 0x68,
-- 0x00, 0xe2, 0x56, 0x5b,
-+ 0x08, 0x92, 0x25, 0x03,
-+ 0xff, 0x90, 0x3f, 0x68,
-+ 0x00, 0xe2, 0x58, 0x5b,
- 0x00, 0xe2, 0x3e, 0x40,
-- 0x00, 0xea, 0x44, 0x59,
-+ 0x00, 0xea, 0x3a, 0x59,
- 0x01, 0xea, 0x00, 0x30,
- 0x80, 0xf9, 0x5e, 0x68,
-- 0x00, 0xe2, 0x42, 0x59,
-- 0x11, 0xea, 0x44, 0x59,
-+ 0x00, 0xe2, 0x38, 0x59,
-+ 0x11, 0xea, 0x3a, 0x59,
- 0x11, 0xea, 0x00, 0x00,
-- 0x80, 0xf9, 0x42, 0x79,
-+ 0x80, 0xf9, 0x38, 0x79,
- 0xff, 0xea, 0xd4, 0x0d,
-- 0x22, 0xea, 0x44, 0x59,
-+ 0x22, 0xea, 0x3a, 0x59,
- 0x22, 0xea, 0x00, 0x00,
- 0x10, 0x16, 0x70, 0x78,
-- 0x01, 0x0b, 0xa2, 0x32,
- 0x10, 0x16, 0x2c, 0x00,
-- 0x18, 0xad, 0x00, 0x79,
-- 0x04, 0xad, 0xca, 0x68,
-+ 0x01, 0x0b, 0xa2, 0x32,
-+ 0x18, 0xad, 0xf6, 0x78,
-+ 0x04, 0xad, 0xc0, 0x68,
- 0x80, 0xad, 0x64, 0x78,
-- 0x10, 0xad, 0x98, 0x78,
-- 0xff, 0x88, 0x83, 0x68,
-- 0xe7, 0xad, 0x5a, 0x09,
-- 0x02, 0x8c, 0x59, 0x32,
-- 0x02, 0x28, 0x19, 0x33,
-- 0x02, 0xa8, 0x50, 0x36,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x10, 0xad, 0x8e, 0x78,
-+ 0xff, 0x88, 0x87, 0x78,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x40, 0x3a, 0x64, 0x68,
- 0x50, 0x4b, 0x64, 0x68,
-- 0x22, 0xea, 0x44, 0x59,
-+ 0x22, 0xea, 0x3a, 0x59,
- 0x22, 0xea, 0x00, 0x00,
- 0xe7, 0xad, 0x5a, 0x09,
- 0x02, 0x8c, 0x59, 0x32,
-- 0x1a, 0xea, 0x50, 0x59,
-- 0x1a, 0xea, 0x04, 0x00,
-- 0xff, 0xea, 0xd4, 0x0d,
-+ 0x02, 0x28, 0x19, 0x33,
-+ 0x02, 0xa8, 0x50, 0x36,
- 0xe7, 0xad, 0x5a, 0x09,
-- 0x00, 0xe2, 0xa6, 0x58,
-+ 0x00, 0xe2, 0x9c, 0x58,
- 0xff, 0xea, 0x56, 0x02,
- 0x04, 0x7c, 0x78, 0x32,
- 0x20, 0x16, 0x64, 0x78,
- 0x04, 0x38, 0x79, 0x32,
- 0x80, 0x37, 0x6f, 0x16,
-- 0xff, 0x2d, 0xb5, 0x60,
-- 0xff, 0x29, 0xb5, 0x60,
-- 0x40, 0x51, 0xc5, 0x78,
-- 0xff, 0x4f, 0xb5, 0x68,
-+ 0xff, 0x2d, 0xab, 0x60,
-+ 0xff, 0x29, 0xab, 0x60,
-+ 0x40, 0x51, 0xbb, 0x78,
-+ 0xff, 0x4f, 0xab, 0x68,
- 0xff, 0x4d, 0xc1, 0x19,
- 0x00, 0x4e, 0xd5, 0x19,
-- 0x00, 0xe2, 0xc4, 0x50,
-+ 0x00, 0xe2, 0xba, 0x50,
- 0x01, 0x4c, 0xc1, 0x31,
- 0x00, 0x50, 0xd5, 0x19,
-- 0x00, 0xe2, 0xc4, 0x48,
-+ 0x00, 0xe2, 0xba, 0x48,
- 0x80, 0x18, 0x64, 0x78,
- 0x02, 0x4a, 0x1d, 0x30,
- 0x10, 0xea, 0x18, 0x00,
-@@ -113,30 +108,30 @@ static uint8_t seqprog[] = {
- 0xff, 0xea, 0xc0, 0x09,
- 0x01, 0x4e, 0x9d, 0x1a,
- 0x00, 0x4f, 0x9f, 0x22,
-- 0x01, 0xaa, 0x6d, 0x33,
-- 0x01, 0xea, 0x5c, 0x33,
-- 0x04, 0xa4, 0x49, 0x32,
-- 0xff, 0xea, 0x4a, 0x03,
-- 0xff, 0xea, 0x4e, 0x03,
-+ 0x01, 0x94, 0x6d, 0x33,
-+ 0xff, 0xea, 0x20, 0x0b,
-+ 0x04, 0xac, 0x49, 0x32,
-+ 0xff, 0xea, 0x5a, 0x03,
-+ 0xff, 0xea, 0x5e, 0x03,
- 0x01, 0x10, 0xd4, 0x31,
-- 0x10, 0xa8, 0xf5, 0x68,
-- 0x3d, 0xa9, 0xc5, 0x29,
-+ 0x10, 0x92, 0xeb, 0x68,
-+ 0x3d, 0x93, 0xc5, 0x29,
- 0xfe, 0xe2, 0xc4, 0x09,
- 0x01, 0xea, 0xc6, 0x01,
- 0x02, 0xe2, 0xc8, 0x31,
- 0x02, 0xec, 0x50, 0x31,
- 0x02, 0xa0, 0xda, 0x31,
-- 0xff, 0xa9, 0xf4, 0x70,
-- 0x02, 0xa0, 0x48, 0x37,
-- 0xff, 0x21, 0xfd, 0x70,
-+ 0xff, 0xa9, 0xea, 0x70,
-+ 0x02, 0xa0, 0x58, 0x37,
-+ 0xff, 0x21, 0xf3, 0x70,
- 0x02, 0x22, 0x51, 0x31,
-- 0x02, 0xa0, 0x4c, 0x33,
-+ 0x02, 0xa0, 0x5c, 0x33,
- 0x02, 0xa0, 0x44, 0x36,
- 0x02, 0xa0, 0x40, 0x32,
- 0x02, 0xa0, 0x44, 0x36,
-- 0x04, 0x47, 0x05, 0x69,
-- 0x40, 0x16, 0x30, 0x69,
-- 0xff, 0x2d, 0x35, 0x61,
-+ 0x04, 0x47, 0xfb, 0x68,
-+ 0x40, 0x16, 0x26, 0x69,
-+ 0xff, 0x2d, 0x2b, 0x61,
- 0xff, 0x29, 0x65, 0x70,
- 0x01, 0x37, 0xc1, 0x31,
- 0x02, 0x28, 0x55, 0x32,
-@@ -149,20 +144,20 @@ static uint8_t seqprog[] = {
- 0x01, 0x50, 0xa1, 0x1a,
- 0xff, 0x4e, 0x9d, 0x1a,
- 0xff, 0x4f, 0x9f, 0x22,
-- 0xff, 0x8d, 0x29, 0x71,
-- 0x80, 0xac, 0x28, 0x71,
-- 0x20, 0x16, 0x28, 0x69,
-+ 0xff, 0x8d, 0x1f, 0x71,
-+ 0x80, 0xac, 0x1e, 0x71,
-+ 0x20, 0x16, 0x1e, 0x69,
- 0x02, 0x8c, 0x51, 0x31,
-- 0x00, 0xe2, 0x12, 0x41,
-+ 0x00, 0xe2, 0x08, 0x41,
- 0x01, 0xac, 0x08, 0x31,
- 0x09, 0xea, 0x5a, 0x01,
- 0x02, 0x8c, 0x51, 0x32,
- 0xff, 0xea, 0x1a, 0x07,
- 0x04, 0x24, 0xf9, 0x30,
-- 0x1d, 0xea, 0x3a, 0x41,
-+ 0x1d, 0xea, 0x30, 0x41,
- 0x02, 0x2c, 0x51, 0x31,
-- 0x04, 0xa0, 0xf9, 0x30,
-- 0x19, 0xea, 0x3a, 0x41,
-+ 0x04, 0xa8, 0xf9, 0x30,
-+ 0x19, 0xea, 0x30, 0x41,
- 0x06, 0xea, 0x08, 0x81,
- 0x01, 0xe2, 0x5a, 0x35,
- 0x02, 0xf2, 0xf0, 0x35,
-@@ -179,26 +174,28 @@ static uint8_t seqprog[] = {
- 0x02, 0x20, 0xbd, 0x30,
- 0x02, 0x20, 0xb9, 0x30,
- 0x02, 0x20, 0x51, 0x31,
-- 0x4c, 0xa9, 0xd7, 0x28,
-- 0x10, 0xa8, 0x63, 0x79,
-+ 0x4c, 0x93, 0xd7, 0x28,
-+ 0x10, 0x92, 0x59, 0x79,
- 0x01, 0x6b, 0xc0, 0x30,
- 0x02, 0x64, 0xc8, 0x00,
- 0x40, 0x3a, 0x74, 0x04,
- 0x00, 0xe2, 0x56, 0x58,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x30, 0x3f, 0xc0, 0x09,
-- 0x30, 0xe0, 0x64, 0x61,
-- 0x20, 0x3f, 0x7a, 0x69,
-- 0x10, 0x3f, 0x64, 0x79,
-+ 0x30, 0xe0, 0x5a, 0x61,
-+ 0x20, 0x3f, 0x70, 0x69,
-+ 0x10, 0x3f, 0x5a, 0x79,
- 0x02, 0xea, 0x7e, 0x00,
-- 0x00, 0xea, 0x44, 0x59,
-+ 0x00, 0xea, 0x3a, 0x59,
- 0x01, 0xea, 0x00, 0x30,
- 0x02, 0x48, 0x51, 0x35,
- 0x01, 0xea, 0x7e, 0x00,
-- 0x11, 0xea, 0x44, 0x59,
-+ 0x11, 0xea, 0x3a, 0x59,
- 0x11, 0xea, 0x00, 0x00,
- 0x02, 0x48, 0x51, 0x35,
-+ 0xc0, 0x4a, 0x94, 0x00,
-+ 0x04, 0x41, 0x7e, 0x79,
- 0x08, 0xea, 0x98, 0x00,
- 0x08, 0x57, 0xae, 0x00,
- 0x08, 0x3c, 0x78, 0x00,
-@@ -206,11 +203,12 @@ static uint8_t seqprog[] = {
- 0x0f, 0x67, 0xc0, 0x09,
- 0x00, 0x34, 0x69, 0x02,
- 0x20, 0xea, 0x96, 0x00,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x40, 0x3a, 0xae, 0x69,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0xc0, 0x4a, 0x94, 0x00,
-+ 0x40, 0x3a, 0xaa, 0x69,
- 0x02, 0x55, 0x06, 0x68,
-- 0x02, 0x56, 0xae, 0x69,
-- 0xff, 0x5b, 0xae, 0x61,
-+ 0x02, 0x56, 0xaa, 0x69,
-+ 0xff, 0x5b, 0xaa, 0x61,
- 0x02, 0x20, 0x51, 0x31,
- 0x80, 0xea, 0xb2, 0x01,
- 0x44, 0xea, 0x00, 0x00,
-@@ -218,146 +216,149 @@ static uint8_t seqprog[] = {
- 0x33, 0xea, 0x00, 0x00,
- 0xff, 0xea, 0xb2, 0x09,
- 0xff, 0xe0, 0xc0, 0x19,
-- 0xff, 0xe0, 0xb0, 0x79,
-- 0x02, 0xa4, 0x51, 0x31,
-- 0x00, 0xe2, 0xa6, 0x41,
-+ 0xff, 0xe0, 0xac, 0x79,
-+ 0x02, 0xac, 0x51, 0x31,
-+ 0x00, 0xe2, 0xa2, 0x41,
- 0x02, 0x5e, 0x50, 0x31,
- 0x02, 0xa8, 0xb8, 0x30,
- 0x02, 0x5c, 0x50, 0x31,
-- 0xff, 0xa5, 0xc1, 0x71,
-- 0x02, 0xa4, 0x41, 0x31,
-+ 0xff, 0xad, 0xbd, 0x71,
-+ 0x02, 0xac, 0x41, 0x31,
- 0x02, 0x22, 0x51, 0x31,
-- 0x02, 0xa0, 0x4c, 0x33,
-+ 0x02, 0xa0, 0x5c, 0x33,
- 0x02, 0xa0, 0x44, 0x32,
-- 0x00, 0xe2, 0xca, 0x41,
-- 0x10, 0xa8, 0xcb, 0x69,
-- 0x3d, 0xa9, 0xc9, 0x29,
-+ 0x00, 0xe2, 0xc6, 0x41,
-+ 0x10, 0x92, 0xc7, 0x69,
-+ 0x3d, 0x93, 0xc9, 0x29,
- 0x01, 0xe4, 0xc8, 0x01,
- 0x01, 0xea, 0xca, 0x01,
- 0xff, 0xea, 0xda, 0x01,
- 0x02, 0x20, 0x51, 0x31,
-- 0x02, 0xa6, 0x41, 0x32,
-- 0xff, 0x21, 0xd3, 0x61,
-+ 0x02, 0xae, 0x41, 0x32,
-+ 0xff, 0x21, 0xcf, 0x61,
- 0xff, 0xea, 0x46, 0x02,
- 0x02, 0x5c, 0x50, 0x31,
- 0x40, 0xea, 0x96, 0x00,
- 0x02, 0x56, 0xcc, 0x6d,
- 0x01, 0x55, 0xcc, 0x6d,
-- 0x10, 0xa8, 0xdf, 0x79,
-- 0x10, 0x40, 0xe8, 0x69,
-- 0x01, 0x56, 0xe8, 0x79,
-- 0xff, 0xad, 0x07, 0x78,
-- 0x13, 0xea, 0x50, 0x59,
-+ 0x10, 0x92, 0xdb, 0x79,
-+ 0x10, 0x40, 0xe4, 0x69,
-+ 0x01, 0x56, 0xe4, 0x79,
-+ 0xff, 0x97, 0x07, 0x78,
-+ 0x13, 0xea, 0x46, 0x59,
- 0x13, 0xea, 0x04, 0x00,
- 0x00, 0xe2, 0x06, 0x40,
- 0xbf, 0x3a, 0x74, 0x08,
-+ 0x04, 0x41, 0xea, 0x79,
- 0x08, 0xea, 0x98, 0x00,
- 0x08, 0x57, 0xae, 0x00,
-- 0x01, 0xa9, 0x69, 0x32,
-- 0x01, 0xaa, 0x6b, 0x32,
-+ 0x01, 0x93, 0x69, 0x32,
-+ 0x01, 0x94, 0x6b, 0x32,
- 0x40, 0xea, 0x66, 0x02,
- 0x08, 0x3c, 0x78, 0x00,
- 0x80, 0xea, 0x62, 0x02,
- 0x00, 0xe2, 0xb8, 0x5b,
- 0x01, 0x36, 0xc1, 0x31,
- 0x9f, 0xe0, 0x4c, 0x7c,
-- 0x80, 0xe0, 0x0c, 0x72,
-- 0xa0, 0xe0, 0x44, 0x72,
-- 0xc0, 0xe0, 0x3a, 0x72,
-- 0xe0, 0xe0, 0x74, 0x72,
-- 0x01, 0xea, 0x50, 0x59,
-+ 0x80, 0xe0, 0x0a, 0x72,
-+ 0xa0, 0xe0, 0x46, 0x72,
-+ 0xc0, 0xe0, 0x3c, 0x72,
-+ 0xe0, 0xe0, 0x76, 0x72,
-+ 0x01, 0xea, 0x46, 0x59,
- 0x01, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x80, 0x33, 0x13, 0x7a,
-- 0x03, 0xea, 0x50, 0x59,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0x80, 0x33, 0x11, 0x7a,
-+ 0x03, 0xea, 0x46, 0x59,
- 0x03, 0xea, 0x04, 0x00,
-- 0xee, 0x00, 0x1a, 0x6a,
-+ 0xee, 0x00, 0x18, 0x6a,
- 0x05, 0xea, 0xb4, 0x00,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x02, 0xa8, 0x90, 0x32,
-- 0x00, 0xe2, 0x6a, 0x59,
-- 0xef, 0xac, 0xd5, 0x19,
-- 0x00, 0xe2, 0x2a, 0x52,
-+ 0x00, 0xe2, 0x60, 0x59,
-+ 0xef, 0x96, 0xd5, 0x19,
-+ 0x00, 0xe2, 0x28, 0x52,
- 0x09, 0x80, 0xe1, 0x30,
- 0x02, 0xea, 0x36, 0x00,
- 0xa8, 0xea, 0x32, 0x00,
-- 0x00, 0xe2, 0x30, 0x42,
-- 0x01, 0xac, 0xd1, 0x30,
-+ 0x00, 0xe2, 0x2e, 0x42,
-+ 0x01, 0x96, 0xd1, 0x30,
- 0x10, 0x80, 0x89, 0x31,
- 0x20, 0xea, 0x32, 0x00,
- 0xbf, 0x33, 0x67, 0x0a,
-- 0x20, 0x19, 0x32, 0x6a,
-- 0x02, 0x4d, 0xf8, 0x69,
-+ 0x10, 0x4c, 0x38, 0x6a,
-+ 0x20, 0x19, 0x30, 0x6a,
-+ 0x20, 0x19, 0x34, 0x6a,
-+ 0x02, 0x4d, 0xf6, 0x69,
- 0x40, 0x33, 0x67, 0x02,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x80, 0x33, 0xb5, 0x6a,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0x80, 0x33, 0xb7, 0x6a,
- 0x01, 0x44, 0x10, 0x33,
-- 0x08, 0xa8, 0x51, 0x03,
-- 0x00, 0xe2, 0xf8, 0x41,
-+ 0x08, 0x92, 0x25, 0x03,
-+ 0x00, 0xe2, 0xf6, 0x41,
- 0x10, 0xea, 0x80, 0x00,
- 0x01, 0x31, 0xc5, 0x31,
-- 0x80, 0xe2, 0x60, 0x62,
-- 0x10, 0xa8, 0x85, 0x6a,
-- 0xc0, 0xaa, 0xc5, 0x01,
-- 0x40, 0xa8, 0x51, 0x6a,
-+ 0x80, 0xe2, 0x62, 0x62,
-+ 0x10, 0x92, 0x87, 0x6a,
-+ 0xc0, 0x94, 0xc5, 0x01,
-+ 0x40, 0x92, 0x53, 0x6a,
- 0xbf, 0xe2, 0xc4, 0x09,
-- 0x20, 0xa8, 0x65, 0x7a,
-+ 0x20, 0x92, 0x67, 0x7a,
- 0x01, 0xe2, 0x88, 0x30,
- 0x00, 0xe2, 0xb8, 0x5b,
-- 0xa0, 0x36, 0x6d, 0x62,
-- 0x23, 0xa8, 0x89, 0x08,
-+ 0xa0, 0x36, 0x6f, 0x62,
-+ 0x23, 0x92, 0x89, 0x08,
- 0x00, 0xe2, 0xb8, 0x5b,
-- 0xa0, 0x36, 0x6d, 0x62,
-- 0x00, 0xa8, 0x64, 0x42,
-- 0xff, 0xe2, 0x64, 0x62,
-- 0x00, 0xe2, 0x84, 0x42,
-+ 0xa0, 0x36, 0x6f, 0x62,
-+ 0x00, 0xa8, 0x66, 0x42,
-+ 0xff, 0xe2, 0x66, 0x62,
-+ 0x00, 0xe2, 0x86, 0x42,
- 0x40, 0xea, 0x98, 0x00,
- 0x01, 0xe2, 0x88, 0x30,
- 0x00, 0xe2, 0xb8, 0x5b,
-- 0xa0, 0x36, 0x43, 0x72,
-+ 0xa0, 0x36, 0x45, 0x72,
- 0x40, 0xea, 0x98, 0x00,
- 0x01, 0x31, 0x89, 0x32,
- 0x08, 0xea, 0x62, 0x02,
-- 0x00, 0xe2, 0xf8, 0x41,
-+ 0x00, 0xe2, 0xf6, 0x41,
- 0xe0, 0xea, 0xd4, 0x5b,
-- 0x80, 0xe0, 0xc0, 0x6a,
-- 0x04, 0xe0, 0x66, 0x73,
-- 0x02, 0xe0, 0x96, 0x73,
-- 0x00, 0xea, 0x1e, 0x73,
-- 0x03, 0xe0, 0xa6, 0x73,
-- 0x23, 0xe0, 0x96, 0x72,
-- 0x08, 0xe0, 0xbc, 0x72,
-+ 0x80, 0xe0, 0xc2, 0x6a,
-+ 0x04, 0xe0, 0x68, 0x73,
-+ 0x02, 0xe0, 0x9a, 0x73,
-+ 0x00, 0xea, 0x20, 0x73,
-+ 0x03, 0xe0, 0xaa, 0x73,
-+ 0x23, 0xe0, 0x98, 0x72,
-+ 0x08, 0xe0, 0xbe, 0x72,
- 0x00, 0xe2, 0xb8, 0x5b,
-- 0x07, 0xea, 0x50, 0x59,
-+ 0x07, 0xea, 0x46, 0x59,
- 0x07, 0xea, 0x04, 0x00,
-- 0x08, 0x42, 0xf9, 0x71,
-- 0x04, 0x42, 0x93, 0x62,
-+ 0x08, 0x42, 0xf7, 0x71,
-+ 0x04, 0x42, 0x95, 0x62,
- 0x01, 0x43, 0x89, 0x30,
-- 0x00, 0xe2, 0x84, 0x42,
-+ 0x00, 0xe2, 0x86, 0x42,
- 0x01, 0x44, 0xd4, 0x31,
-- 0x00, 0xe2, 0x84, 0x42,
-+ 0x00, 0xe2, 0x86, 0x42,
- 0x01, 0x00, 0x60, 0x32,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x4c, 0x34, 0xc1, 0x28,
- 0x01, 0x64, 0xc0, 0x31,
-- 0x00, 0x30, 0x45, 0x59,
-+ 0x00, 0x30, 0x3b, 0x59,
- 0x01, 0x30, 0x01, 0x30,
-- 0x01, 0xe0, 0xba, 0x7a,
-+ 0x01, 0xe0, 0xbc, 0x7a,
- 0xa0, 0xea, 0xca, 0x5b,
-- 0x01, 0xa0, 0xba, 0x62,
-- 0x01, 0x84, 0xaf, 0x7a,
-- 0x01, 0xab, 0xbd, 0x6a,
-- 0x05, 0xea, 0x50, 0x59,
-+ 0x01, 0xa0, 0xbc, 0x62,
-+ 0x01, 0x84, 0xb1, 0x7a,
-+ 0x01, 0x95, 0xbf, 0x6a,
-+ 0x05, 0xea, 0x46, 0x59,
- 0x05, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xbc, 0x42,
-- 0x03, 0xea, 0x50, 0x59,
-+ 0x00, 0xe2, 0xbe, 0x42,
-+ 0x03, 0xea, 0x46, 0x59,
- 0x03, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xbc, 0x42,
-+ 0x00, 0xe2, 0xbe, 0x42,
- 0x07, 0xea, 0xdc, 0x5b,
- 0x01, 0x44, 0xd4, 0x31,
-- 0x00, 0xe2, 0xf8, 0x41,
-+ 0x00, 0xe2, 0xf6, 0x41,
- 0x3f, 0xe0, 0x6a, 0x0a,
- 0xc0, 0x34, 0xc1, 0x09,
- 0x00, 0x35, 0x51, 0x01,
-@@ -368,54 +369,54 @@ static uint8_t seqprog[] = {
- 0x01, 0xea, 0xc6, 0x01,
- 0x02, 0xe2, 0xc8, 0x31,
- 0x02, 0xec, 0x40, 0x31,
-- 0xff, 0xa1, 0xdc, 0x72,
-+ 0xff, 0xa1, 0xde, 0x72,
- 0x02, 0xe8, 0xda, 0x31,
- 0x02, 0xa0, 0x50, 0x31,
-- 0x00, 0xe2, 0xfe, 0x42,
-+ 0x00, 0xe2, 0x00, 0x43,
- 0x80, 0x33, 0x67, 0x02,
- 0x01, 0x44, 0xd4, 0x31,
- 0x00, 0xe2, 0xb8, 0x5b,
- 0x01, 0x33, 0x67, 0x02,
-- 0xe0, 0x36, 0x19, 0x63,
-+ 0xe0, 0x36, 0x1b, 0x63,
- 0x02, 0x33, 0x67, 0x02,
-- 0x20, 0x46, 0x12, 0x63,
-+ 0x20, 0x46, 0x14, 0x63,
- 0xff, 0xea, 0x52, 0x09,
- 0xa8, 0xea, 0xca, 0x5b,
-- 0x04, 0xa8, 0xf9, 0x7a,
-+ 0x04, 0x92, 0xfb, 0x7a,
- 0x01, 0x34, 0xc1, 0x31,
-- 0x00, 0xa9, 0xf9, 0x62,
-+ 0x00, 0x93, 0xfb, 0x62,
- 0x01, 0x35, 0xc1, 0x31,
-- 0x00, 0xaa, 0x03, 0x73,
-+ 0x00, 0x94, 0x05, 0x73,
- 0x01, 0xa9, 0x52, 0x11,
-- 0xff, 0xa9, 0xee, 0x6a,
-- 0x00, 0xe2, 0x12, 0x43,
-+ 0xff, 0xa9, 0xf0, 0x6a,
-+ 0x00, 0xe2, 0x14, 0x43,
- 0x10, 0x33, 0x67, 0x02,
-- 0x04, 0xa8, 0x13, 0x7b,
-- 0xfb, 0xa8, 0x51, 0x0b,
-+ 0x04, 0x92, 0x15, 0x7b,
-+ 0xfb, 0x92, 0x25, 0x0b,
- 0xff, 0xea, 0x66, 0x0a,
-- 0x01, 0x9c, 0x0d, 0x6b,
-+ 0x01, 0xa4, 0x0f, 0x6b,
- 0x02, 0xa8, 0x90, 0x32,
-- 0x00, 0xe2, 0x6a, 0x59,
-- 0x10, 0xa8, 0xbd, 0x7a,
-+ 0x00, 0xe2, 0x60, 0x59,
-+ 0x10, 0x92, 0xbf, 0x7a,
- 0xff, 0xea, 0xdc, 0x5b,
-- 0x00, 0xe2, 0xbc, 0x42,
-- 0x04, 0xea, 0x50, 0x59,
-+ 0x00, 0xe2, 0xbe, 0x42,
-+ 0x04, 0xea, 0x46, 0x59,
- 0x04, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xbc, 0x42,
-- 0x04, 0xea, 0x50, 0x59,
-+ 0x00, 0xe2, 0xbe, 0x42,
-+ 0x04, 0xea, 0x46, 0x59,
- 0x04, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x08, 0xa8, 0xb5, 0x7a,
-- 0xc0, 0x33, 0x29, 0x7b,
-- 0x80, 0x33, 0xb5, 0x6a,
-- 0xff, 0x88, 0x29, 0x6b,
-- 0x40, 0x33, 0xb5, 0x6a,
-- 0x10, 0xa8, 0x2f, 0x7b,
-- 0x0a, 0xea, 0x50, 0x59,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0x08, 0x92, 0xb7, 0x7a,
-+ 0xc0, 0x33, 0x2b, 0x7b,
-+ 0x80, 0x33, 0xb7, 0x6a,
-+ 0xff, 0x88, 0x2b, 0x6b,
-+ 0x40, 0x33, 0xb7, 0x6a,
-+ 0x10, 0x92, 0x31, 0x7b,
-+ 0x0a, 0xea, 0x46, 0x59,
- 0x0a, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0x4e, 0x5b,
-- 0x00, 0xe2, 0x82, 0x43,
-- 0x50, 0x4b, 0x36, 0x6b,
-+ 0x00, 0xe2, 0x50, 0x5b,
-+ 0x00, 0xe2, 0x84, 0x43,
-+ 0x50, 0x4b, 0x38, 0x6b,
- 0xbf, 0x3a, 0x74, 0x08,
- 0x01, 0xe0, 0xf4, 0x31,
- 0xff, 0xea, 0xc0, 0x09,
-@@ -425,25 +426,25 @@ static uint8_t seqprog[] = {
- 0x01, 0xfa, 0xc0, 0x35,
- 0x02, 0xa8, 0x84, 0x32,
- 0x02, 0xea, 0xb4, 0x00,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x02, 0x42, 0x51, 0x31,
-- 0xff, 0xae, 0x65, 0x68,
-- 0xff, 0x88, 0x5b, 0x6b,
-- 0x01, 0x9c, 0x57, 0x6b,
-- 0x02, 0x9c, 0x5f, 0x6b,
-- 0x01, 0x84, 0x5f, 0x7b,
-+ 0xff, 0x90, 0x65, 0x68,
-+ 0xff, 0x88, 0x5d, 0x6b,
-+ 0x01, 0xa4, 0x59, 0x6b,
-+ 0x02, 0xa4, 0x61, 0x6b,
-+ 0x01, 0x84, 0x61, 0x7b,
- 0x02, 0x28, 0x19, 0x33,
- 0x02, 0xa8, 0x50, 0x36,
-- 0xff, 0x88, 0x5f, 0x73,
-- 0x00, 0xe2, 0x32, 0x5b,
-- 0x02, 0xa8, 0x5c, 0x33,
-+ 0xff, 0x88, 0x61, 0x73,
-+ 0x00, 0xe2, 0x34, 0x5b,
-+ 0x02, 0xa8, 0x20, 0x33,
- 0x02, 0x2c, 0x19, 0x33,
- 0x02, 0xa8, 0x58, 0x32,
-- 0x04, 0x9c, 0x39, 0x07,
-- 0xc0, 0x33, 0xb5, 0x6a,
-- 0x04, 0xa8, 0x51, 0x03,
-- 0x20, 0xa8, 0x83, 0x6b,
-+ 0x04, 0xa4, 0x49, 0x07,
-+ 0xc0, 0x33, 0xb7, 0x6a,
-+ 0x04, 0x92, 0x25, 0x03,
-+ 0x20, 0x92, 0x85, 0x6b,
- 0x02, 0xa8, 0x40, 0x31,
- 0xc0, 0x34, 0xc1, 0x09,
- 0x00, 0x35, 0x51, 0x01,
-@@ -458,30 +459,29 @@ static uint8_t seqprog[] = {
- 0xf7, 0x57, 0xae, 0x08,
- 0x08, 0xea, 0x98, 0x00,
- 0x01, 0x44, 0xd4, 0x31,
-- 0xee, 0x00, 0x8c, 0x6b,
-+ 0xee, 0x00, 0x8e, 0x6b,
- 0x02, 0xea, 0xb4, 0x00,
-- 0x00, 0xe2, 0xb4, 0x5b,
-- 0x09, 0x4c, 0x8e, 0x7b,
-+ 0xc0, 0xea, 0x66, 0x02,
-+ 0x09, 0x4c, 0x90, 0x7b,
-+ 0x01, 0xea, 0x6c, 0x02,
- 0x08, 0x4c, 0x06, 0x68,
-- 0x0b, 0xea, 0x50, 0x59,
-+ 0x0b, 0xea, 0x46, 0x59,
- 0x0b, 0xea, 0x04, 0x00,
- 0x01, 0x44, 0xd4, 0x31,
-- 0x20, 0x33, 0xf9, 0x79,
-- 0x00, 0xe2, 0x9e, 0x5b,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x01, 0x84, 0xa3, 0x7b,
-- 0x01, 0x9c, 0x39, 0x07,
-- 0x08, 0x60, 0x20, 0x33,
-- 0x08, 0x80, 0x31, 0x37,
-+ 0x20, 0x33, 0xf7, 0x79,
-+ 0x00, 0xe2, 0xa2, 0x5b,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0x01, 0x84, 0xa7, 0x7b,
-+ 0x01, 0xa4, 0x49, 0x07,
-+ 0x08, 0x60, 0x30, 0x33,
-+ 0x08, 0x80, 0x41, 0x37,
- 0xdf, 0x33, 0x67, 0x0a,
-- 0xee, 0x00, 0xb0, 0x6b,
-+ 0xee, 0x00, 0xb4, 0x6b,
- 0x05, 0xea, 0xb4, 0x00,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
-- 0x00, 0xe2, 0x6a, 0x59,
-- 0x00, 0xe2, 0xbc, 0x42,
-- 0x01, 0xea, 0x6c, 0x02,
-- 0xc0, 0xea, 0x66, 0x06,
-+ 0x00, 0xe2, 0x60, 0x59,
-+ 0x00, 0xe2, 0xbe, 0x42,
- 0xff, 0x42, 0xc4, 0x6b,
- 0x01, 0x41, 0xb8, 0x6b,
- 0x02, 0x41, 0xb8, 0x7b,
-@@ -495,7 +495,7 @@ static uint8_t seqprog[] = {
- 0xff, 0x42, 0xcc, 0x7b,
- 0x04, 0x4c, 0xcc, 0x6b,
- 0xe0, 0x41, 0x6c, 0x0a,
-- 0xe0, 0x36, 0xf9, 0x61,
-+ 0xe0, 0x36, 0xf7, 0x61,
- 0xff, 0xea, 0xca, 0x09,
- 0x01, 0xe2, 0xc8, 0x31,
- 0x01, 0x46, 0xda, 0x35,
-@@ -542,42 +542,42 @@ static uint8_t seqprog[] = {
- 0x01, 0xac, 0xd4, 0x99,
- 0x00, 0xe2, 0x64, 0x50,
- 0xfe, 0xa6, 0x4c, 0x0d,
-- 0x0b, 0x90, 0xe1, 0x30,
-- 0xfd, 0x9c, 0x49, 0x09,
-- 0x80, 0x9b, 0x39, 0x7c,
-+ 0x0b, 0x98, 0xe1, 0x30,
-+ 0xfd, 0xa4, 0x49, 0x09,
-+ 0x80, 0xa3, 0x39, 0x7c,
- 0x02, 0xa4, 0x48, 0x01,
- 0x01, 0xa4, 0x36, 0x30,
- 0xa8, 0xea, 0x32, 0x00,
-- 0xfd, 0x9c, 0x39, 0x0b,
-- 0x05, 0x9b, 0x07, 0x33,
-+ 0xfd, 0xa4, 0x49, 0x0b,
-+ 0x05, 0xa3, 0x07, 0x33,
- 0x80, 0x83, 0x45, 0x6c,
- 0x02, 0xea, 0x4c, 0x05,
- 0xff, 0xea, 0x4c, 0x0d,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x02, 0xa6, 0xe6, 0x6b,
- 0x80, 0xf9, 0xf2, 0x05,
- 0xc0, 0x33, 0x53, 0x7c,
-- 0x03, 0xea, 0x50, 0x59,
-+ 0x03, 0xea, 0x46, 0x59,
- 0x03, 0xea, 0x04, 0x00,
- 0x20, 0x33, 0x77, 0x7c,
- 0x01, 0x84, 0x5d, 0x6c,
-- 0x06, 0xea, 0x50, 0x59,
-+ 0x06, 0xea, 0x46, 0x59,
- 0x06, 0xea, 0x04, 0x00,
- 0x00, 0xe2, 0x7a, 0x44,
- 0x01, 0x00, 0x60, 0x32,
- 0xee, 0x00, 0x66, 0x6c,
- 0x05, 0xea, 0xb4, 0x00,
-- 0x33, 0xea, 0x44, 0x59,
-+ 0x33, 0xea, 0x3a, 0x59,
- 0x33, 0xea, 0x00, 0x00,
- 0x80, 0x3d, 0x7a, 0x00,
- 0xfc, 0x42, 0x68, 0x7c,
- 0x7f, 0x3d, 0x7a, 0x08,
-- 0x00, 0x30, 0x45, 0x59,
-+ 0x00, 0x30, 0x3b, 0x59,
- 0x01, 0x30, 0x01, 0x30,
-- 0x09, 0xea, 0x50, 0x59,
-+ 0x09, 0xea, 0x46, 0x59,
- 0x09, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x01, 0x9c, 0x5d, 0x6c,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0x01, 0xa4, 0x5d, 0x6c,
- 0x00, 0xe2, 0x30, 0x5c,
- 0x20, 0x33, 0x67, 0x02,
- 0x01, 0x00, 0x60, 0x32,
-@@ -586,7 +586,7 @@ static uint8_t seqprog[] = {
- 0x00, 0xe2, 0x56, 0x58,
- 0x00, 0xe2, 0x66, 0x58,
- 0x00, 0xe2, 0x3a, 0x58,
-- 0x00, 0x30, 0x45, 0x59,
-+ 0x00, 0x30, 0x3b, 0x59,
- 0x01, 0x30, 0x01, 0x30,
- 0x20, 0x19, 0x82, 0x6c,
- 0x00, 0xe2, 0xb2, 0x5c,
-@@ -601,11 +601,11 @@ static uint8_t seqprog[] = {
- 0x03, 0x42, 0x4c, 0x6c,
- 0x00, 0xe2, 0xe0, 0x5b,
- 0x80, 0xf9, 0xf2, 0x01,
-- 0x04, 0x33, 0xf9, 0x79,
-- 0x00, 0xe2, 0xf8, 0x41,
-+ 0x04, 0x33, 0xf7, 0x79,
-+ 0x00, 0xe2, 0xf6, 0x41,
- 0x08, 0x5d, 0xba, 0x6c,
- 0x00, 0xe2, 0x56, 0x58,
-- 0x00, 0x30, 0x45, 0x59,
-+ 0x00, 0x30, 0x3b, 0x59,
- 0x01, 0x30, 0x01, 0x30,
- 0x02, 0x1b, 0xaa, 0x7c,
- 0x08, 0x5d, 0xb8, 0x7c,
-@@ -619,7 +619,7 @@ static uint8_t seqprog[] = {
- 0xf8, 0x1b, 0x08, 0x0b,
- 0xff, 0xea, 0x06, 0x0b,
- 0x03, 0x68, 0x00, 0x37,
-- 0x00, 0xe2, 0xc4, 0x58,
-+ 0x00, 0xe2, 0xba, 0x58,
- 0x10, 0xea, 0x18, 0x00,
- 0xf9, 0xd9, 0xb2, 0x0d,
- 0x01, 0xd9, 0xb2, 0x05,
-@@ -631,7 +631,7 @@ static uint8_t seqprog[] = {
- 0x11, 0x00, 0x00, 0x10,
- 0x04, 0x19, 0x08, 0x7d,
- 0xdf, 0x19, 0x32, 0x08,
-- 0x60, 0x5b, 0xe6, 0x6c,
-+ 0x60, 0x5b, 0x08, 0x6d,
- 0x01, 0x4c, 0xe2, 0x7c,
- 0x20, 0x19, 0x32, 0x00,
- 0x01, 0xd9, 0xb2, 0x05,
-@@ -641,29 +641,29 @@ static uint8_t seqprog[] = {
- 0x08, 0x5b, 0x0a, 0x6d,
- 0x20, 0x5b, 0xfa, 0x6c,
- 0x02, 0x5b, 0x2a, 0x6d,
-- 0x0e, 0xea, 0x50, 0x59,
-+ 0x0e, 0xea, 0x46, 0x59,
- 0x0e, 0xea, 0x04, 0x00,
- 0x80, 0xf9, 0xea, 0x6c,
- 0xdf, 0x5c, 0xb8, 0x08,
- 0x01, 0xd9, 0xb2, 0x05,
-- 0x01, 0x9c, 0xe5, 0x6d,
-+ 0x01, 0xa4, 0xe5, 0x6d,
- 0x00, 0xe2, 0x30, 0x5c,
- 0x00, 0xe2, 0x34, 0x5d,
-- 0x01, 0xae, 0x5d, 0x1b,
-+ 0x01, 0x90, 0x21, 0x1b,
- 0x01, 0xd9, 0xb2, 0x05,
-- 0x00, 0xe2, 0x32, 0x5b,
-- 0xf3, 0xac, 0xd5, 0x19,
-+ 0x00, 0xe2, 0x34, 0x5b,
-+ 0xf3, 0x96, 0xd5, 0x19,
- 0x00, 0xe2, 0x18, 0x55,
-- 0x80, 0xac, 0x19, 0x6d,
-- 0x0f, 0xea, 0x50, 0x59,
-+ 0x80, 0x96, 0x19, 0x6d,
-+ 0x0f, 0xea, 0x46, 0x59,
- 0x0f, 0xea, 0x04, 0x00,
- 0x00, 0xe2, 0x20, 0x45,
- 0x04, 0x8c, 0xe1, 0x30,
- 0x01, 0xea, 0xf2, 0x00,
- 0x02, 0xea, 0x36, 0x00,
- 0xa8, 0xea, 0x32, 0x00,
-- 0xff, 0xad, 0x27, 0x7d,
-- 0x14, 0xea, 0x50, 0x59,
-+ 0xff, 0x97, 0x27, 0x7d,
-+ 0x14, 0xea, 0x46, 0x59,
- 0x14, 0xea, 0x04, 0x00,
- 0x00, 0xe2, 0x96, 0x5d,
- 0x01, 0xd9, 0xb2, 0x05,
-@@ -673,14 +673,14 @@ static uint8_t seqprog[] = {
- 0x00, 0xe2, 0x8e, 0x5d,
- 0x01, 0xd9, 0xb2, 0x05,
- 0x02, 0xa6, 0x44, 0x7d,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x20, 0x5b, 0x52, 0x6d,
- 0xfc, 0x42, 0x3e, 0x7d,
- 0x10, 0x40, 0x40, 0x6d,
- 0x20, 0x4d, 0x42, 0x7d,
- 0x08, 0x5d, 0x52, 0x6d,
- 0x02, 0xa6, 0xe6, 0x6b,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x20, 0x5b, 0x52, 0x6d,
- 0x01, 0x1b, 0x72, 0x6d,
- 0xfc, 0x42, 0x4e, 0x7d,
-@@ -690,22 +690,22 @@ static uint8_t seqprog[] = {
- 0x02, 0x19, 0x32, 0x00,
- 0x01, 0x5b, 0x40, 0x31,
- 0x00, 0xe2, 0xb2, 0x5c,
-- 0x00, 0xe2, 0x9e, 0x5b,
-+ 0x00, 0xe2, 0xa2, 0x5b,
- 0x20, 0xea, 0xb6, 0x00,
- 0x00, 0xe2, 0xe0, 0x5b,
- 0x20, 0x5c, 0xb8, 0x00,
- 0x04, 0x19, 0x68, 0x6d,
- 0x01, 0x1a, 0x68, 0x6d,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x01, 0x1a, 0x64, 0x78,
- 0x80, 0xf9, 0xf2, 0x01,
- 0x20, 0xa0, 0xcc, 0x7d,
-- 0xff, 0xae, 0x5d, 0x1b,
-- 0x08, 0xa8, 0x43, 0x6b,
-+ 0xff, 0x90, 0x21, 0x1b,
-+ 0x08, 0x92, 0x45, 0x6b,
- 0x02, 0xea, 0xb4, 0x04,
-- 0x01, 0x9c, 0x39, 0x03,
-+ 0x01, 0xa4, 0x49, 0x03,
- 0x40, 0x5b, 0x82, 0x6d,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x40, 0x5b, 0x82, 0x6d,
- 0x04, 0x5d, 0xe6, 0x7d,
- 0x01, 0x1a, 0xe6, 0x7d,
-@@ -714,14 +714,14 @@ static uint8_t seqprog[] = {
- 0x04, 0x5d, 0xe6, 0x7d,
- 0x01, 0x1a, 0xe6, 0x7d,
- 0x80, 0xf9, 0xf2, 0x01,
-- 0xff, 0xae, 0x5d, 0x1b,
-- 0x08, 0xa8, 0x43, 0x6b,
-+ 0xff, 0x90, 0x21, 0x1b,
-+ 0x08, 0x92, 0x45, 0x6b,
- 0x02, 0xea, 0xb4, 0x04,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x01, 0x1b, 0x64, 0x78,
- 0x80, 0xf9, 0xf2, 0x01,
- 0x02, 0xea, 0xb4, 0x04,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x01, 0x1b, 0xaa, 0x6d,
- 0x40, 0x5b, 0xb8, 0x7d,
- 0x01, 0x1b, 0xaa, 0x6d,
-@@ -729,45 +729,45 @@ static uint8_t seqprog[] = {
- 0x01, 0x1a, 0x64, 0x78,
- 0x80, 0xf9, 0xf2, 0x01,
- 0xff, 0xea, 0x10, 0x03,
-- 0x08, 0xa8, 0x51, 0x03,
-- 0x00, 0xe2, 0x42, 0x43,
-+ 0x08, 0x92, 0x25, 0x03,
-+ 0x00, 0xe2, 0x44, 0x43,
- 0x01, 0x1a, 0xb4, 0x7d,
- 0x40, 0x5b, 0xb0, 0x7d,
- 0x01, 0x1a, 0x9e, 0x6d,
- 0xfc, 0x42, 0x64, 0x78,
- 0x01, 0x1a, 0xb8, 0x6d,
-- 0x10, 0xea, 0x50, 0x59,
-+ 0x10, 0xea, 0x46, 0x59,
- 0x10, 0xea, 0x04, 0x00,
- 0xfc, 0x42, 0x64, 0x78,
- 0x10, 0x40, 0xbe, 0x6d,
- 0x20, 0x4d, 0x64, 0x78,
- 0x40, 0x5b, 0x9e, 0x6d,
- 0x01, 0x1a, 0x64, 0x78,
-- 0x01, 0xae, 0x5d, 0x1b,
-+ 0x01, 0x90, 0x21, 0x1b,
- 0x30, 0x3f, 0xc0, 0x09,
- 0x30, 0xe0, 0x64, 0x60,
- 0x40, 0x4b, 0x64, 0x68,
- 0xff, 0xea, 0x52, 0x01,
-- 0xee, 0x00, 0xd2, 0x6d,
-+ 0xee, 0x00, 0xd4, 0x6d,
- 0x80, 0xf9, 0xf2, 0x01,
-- 0xff, 0xae, 0x5d, 0x1b,
-+ 0xff, 0x90, 0x21, 0x1b,
- 0x02, 0xea, 0xb4, 0x00,
- 0x20, 0xea, 0x9a, 0x00,
- 0xf3, 0x42, 0xde, 0x6d,
-- 0x12, 0xea, 0x50, 0x59,
-+ 0x12, 0xea, 0x46, 0x59,
- 0x12, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x0d, 0xea, 0x50, 0x59,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0x0d, 0xea, 0x46, 0x59,
- 0x0d, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0xf8, 0x41,
-- 0x01, 0xae, 0x5d, 0x1b,
-- 0x11, 0xea, 0x50, 0x59,
-+ 0x00, 0xe2, 0xf6, 0x41,
-+ 0x01, 0x90, 0x21, 0x1b,
-+ 0x11, 0xea, 0x46, 0x59,
- 0x11, 0xea, 0x04, 0x00,
-- 0x00, 0xe2, 0x32, 0x5b,
-+ 0x00, 0xe2, 0x34, 0x5b,
- 0x08, 0x5a, 0xb4, 0x00,
- 0x00, 0xe2, 0x0c, 0x5e,
- 0xa8, 0xea, 0x32, 0x00,
-- 0x00, 0xe2, 0x3e, 0x59,
-+ 0x00, 0xe2, 0x34, 0x59,
- 0x80, 0x1a, 0xfa, 0x7d,
- 0x00, 0xe2, 0x0c, 0x5e,
- 0x80, 0x19, 0x32, 0x00,
-@@ -776,9 +776,9 @@ static uint8_t seqprog[] = {
- 0x20, 0x4d, 0x64, 0x78,
- 0x02, 0x84, 0x09, 0x03,
- 0x40, 0x5b, 0xcc, 0x7d,
-- 0xff, 0xae, 0x5d, 0x1b,
-+ 0xff, 0x90, 0x21, 0x1b,
- 0x80, 0xf9, 0xf2, 0x01,
-- 0x08, 0xa8, 0x43, 0x6b,
-+ 0x08, 0x92, 0x45, 0x6b,
- 0x02, 0xea, 0xb4, 0x04,
- 0x01, 0x38, 0xe1, 0x30,
- 0x05, 0x39, 0xe3, 0x98,
-@@ -794,12 +794,20 @@ static uint8_t seqprog[] = {
- };
-
- typedef int ahd_patch_func_t (struct ahd_softc *ahd);
-+static ahd_patch_func_t ahd_patch23_func;
-+
-+static int
-+ahd_patch23_func(struct ahd_softc *ahd)
-+{
-+ return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0);
-+}
-+
- static ahd_patch_func_t ahd_patch22_func;
-
- static int
- ahd_patch22_func(struct ahd_softc *ahd)
- {
-- return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0);
-+ return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0);
- }
-
- static ahd_patch_func_t ahd_patch21_func;
-@@ -807,7 +815,7 @@ static ahd_patch_func_t ahd_patch21_func
- static int
- ahd_patch21_func(struct ahd_softc *ahd)
- {
-- return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0);
-+ return ((ahd->features & AHD_RTI) == 0);
- }
-
- static ahd_patch_func_t ahd_patch20_func;
-@@ -815,7 +823,7 @@ static ahd_patch_func_t ahd_patch20_func
- static int
- ahd_patch20_func(struct ahd_softc *ahd)
- {
-- return ((ahd->features & AHD_RTI) == 0);
-+ return ((ahd->flags & AHD_INITIATORROLE) != 0);
- }
-
- static ahd_patch_func_t ahd_patch19_func;
-@@ -823,7 +831,7 @@ static ahd_patch_func_t ahd_patch19_func
- static int
- ahd_patch19_func(struct ahd_softc *ahd)
- {
-- return ((ahd->flags & AHD_INITIATORROLE) != 0);
-+ return ((ahd->flags & AHD_TARGETROLE) != 0);
- }
-
- static ahd_patch_func_t ahd_patch18_func;
-@@ -831,7 +839,7 @@ static ahd_patch_func_t ahd_patch18_func
- static int
- ahd_patch18_func(struct ahd_softc *ahd)
- {
-- return ((ahd->flags & AHD_TARGETROLE) != 0);
-+ return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0);
- }
-
- static ahd_patch_func_t ahd_patch17_func;
-@@ -839,7 +847,7 @@ static ahd_patch_func_t ahd_patch17_func
- static int
- ahd_patch17_func(struct ahd_softc *ahd)
- {
-- return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0);
-+ return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0);
- }
-
- static ahd_patch_func_t ahd_patch16_func;
-@@ -847,7 +855,7 @@ static ahd_patch_func_t ahd_patch16_func
- static int
- ahd_patch16_func(struct ahd_softc *ahd)
- {
-- return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0);
-+ return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0);
- }
-
- static ahd_patch_func_t ahd_patch15_func;
-@@ -855,7 +863,7 @@ static ahd_patch_func_t ahd_patch15_func
- static int
- ahd_patch15_func(struct ahd_softc *ahd)
- {
-- return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0);
-+ return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0);
- }
-
- static ahd_patch_func_t ahd_patch14_func;
-@@ -863,7 +871,7 @@ static ahd_patch_func_t ahd_patch14_func
- static int
- ahd_patch14_func(struct ahd_softc *ahd)
- {
-- return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0);
-+ return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0);
- }
-
- static ahd_patch_func_t ahd_patch13_func;
-@@ -871,7 +879,7 @@ static ahd_patch_func_t ahd_patch13_func
- static int
- ahd_patch13_func(struct ahd_softc *ahd)
- {
-- return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0);
-+ return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0);
- }
-
- static ahd_patch_func_t ahd_patch12_func;
-@@ -879,7 +887,7 @@ static ahd_patch_func_t ahd_patch12_func
- static int
- ahd_patch12_func(struct ahd_softc *ahd)
- {
-- return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0);
-+ return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0);
- }
-
- static ahd_patch_func_t ahd_patch11_func;
-@@ -887,7 +895,7 @@ static ahd_patch_func_t ahd_patch11_func
- static int
- ahd_patch11_func(struct ahd_softc *ahd)
- {
-- return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0);
-+ return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0);
- }
-
- static ahd_patch_func_t ahd_patch10_func;
-@@ -895,7 +903,7 @@ static ahd_patch_func_t ahd_patch10_func
- static int
- ahd_patch10_func(struct ahd_softc *ahd)
- {
-- return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0);
-+ return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0);
- }
-
- static ahd_patch_func_t ahd_patch9_func;
-@@ -903,7 +911,7 @@ static ahd_patch_func_t ahd_patch9_func;
- static int
- ahd_patch9_func(struct ahd_softc *ahd)
- {
-- return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0);
-+ return ((ahd->features & AHD_FAST_CDB_DELIVERY) != 0);
- }
-
- static ahd_patch_func_t ahd_patch8_func;
-@@ -1003,73 +1011,75 @@ static struct patch {
- { ahd_patch0_func, 48, 1, 1 },
- { ahd_patch2_func, 51, 1, 2 },
- { ahd_patch0_func, 52, 1, 1 },
-+ { ahd_patch2_func, 61, 1, 2 },
-+ { ahd_patch0_func, 62, 1, 1 },
- { ahd_patch2_func, 65, 1, 2 },
- { ahd_patch0_func, 66, 1, 1 },
-- { ahd_patch2_func, 69, 1, 2 },
-- { ahd_patch0_func, 70, 1, 1 },
-- { ahd_patch1_func, 73, 1, 2 },
-- { ahd_patch0_func, 74, 1, 1 },
-- { ahd_patch4_func, 107, 1, 1 },
-- { ahd_patch2_func, 162, 6, 1 },
-- { ahd_patch1_func, 168, 2, 1 },
-- { ahd_patch5_func, 170, 1, 1 },
-- { ahd_patch2_func, 179, 1, 2 },
-- { ahd_patch0_func, 180, 1, 1 },
-- { ahd_patch6_func, 181, 2, 2 },
-- { ahd_patch0_func, 183, 6, 3 },
-- { ahd_patch2_func, 186, 1, 2 },
-- { ahd_patch0_func, 187, 1, 1 },
-- { ahd_patch2_func, 190, 1, 2 },
-- { ahd_patch0_func, 191, 1, 1 },
-- { ahd_patch7_func, 193, 2, 1 },
-- { ahd_patch5_func, 201, 16, 2 },
-- { ahd_patch0_func, 217, 1, 1 },
-- { ahd_patch8_func, 237, 2, 1 },
-- { ahd_patch1_func, 241, 1, 2 },
-- { ahd_patch0_func, 242, 1, 1 },
-- { ahd_patch7_func, 245, 2, 1 },
-- { ahd_patch1_func, 259, 1, 2 },
-- { ahd_patch0_func, 260, 1, 1 },
-- { ahd_patch1_func, 263, 1, 2 },
-- { ahd_patch0_func, 264, 1, 1 },
-- { ahd_patch2_func, 267, 1, 2 },
-- { ahd_patch0_func, 268, 1, 1 },
-- { ahd_patch1_func, 323, 1, 2 },
-- { ahd_patch0_func, 324, 1, 1 },
-- { ahd_patch2_func, 332, 1, 2 },
-- { ahd_patch0_func, 333, 1, 1 },
-- { ahd_patch2_func, 336, 1, 2 },
-- { ahd_patch0_func, 337, 1, 1 },
-- { ahd_patch1_func, 343, 1, 2 },
-- { ahd_patch0_func, 344, 1, 1 },
-- { ahd_patch1_func, 346, 1, 2 },
-- { ahd_patch0_func, 347, 1, 1 },
-- { ahd_patch9_func, 366, 1, 1 },
-- { ahd_patch9_func, 369, 1, 1 },
-- { ahd_patch9_func, 371, 1, 1 },
-- { ahd_patch9_func, 383, 1, 1 },
-- { ahd_patch1_func, 393, 1, 2 },
-- { ahd_patch0_func, 394, 1, 1 },
-- { ahd_patch1_func, 396, 1, 2 },
-- { ahd_patch0_func, 397, 1, 1 },
-- { ahd_patch1_func, 405, 1, 2 },
-- { ahd_patch0_func, 406, 1, 1 },
-- { ahd_patch2_func, 419, 1, 2 },
-- { ahd_patch0_func, 420, 1, 1 },
-- { ahd_patch10_func, 450, 1, 1 },
-- { ahd_patch1_func, 457, 1, 2 },
-- { ahd_patch0_func, 458, 1, 1 },
-- { ahd_patch2_func, 470, 1, 2 },
-- { ahd_patch0_func, 471, 1, 1 },
-- { ahd_patch11_func, 476, 6, 2 },
-+ { ahd_patch4_func, 102, 1, 1 },
-+ { ahd_patch2_func, 157, 6, 1 },
-+ { ahd_patch1_func, 163, 2, 1 },
-+ { ahd_patch5_func, 165, 1, 1 },
-+ { ahd_patch2_func, 174, 1, 2 },
-+ { ahd_patch0_func, 175, 1, 1 },
-+ { ahd_patch6_func, 176, 2, 2 },
-+ { ahd_patch0_func, 178, 6, 3 },
-+ { ahd_patch2_func, 181, 1, 2 },
-+ { ahd_patch0_func, 182, 1, 1 },
-+ { ahd_patch2_func, 185, 1, 2 },
-+ { ahd_patch0_func, 186, 1, 1 },
-+ { ahd_patch3_func, 188, 1, 1 },
-+ { ahd_patch7_func, 189, 3, 1 },
-+ { ahd_patch3_func, 198, 1, 1 },
-+ { ahd_patch5_func, 199, 16, 2 },
-+ { ahd_patch0_func, 215, 1, 1 },
-+ { ahd_patch8_func, 235, 2, 1 },
-+ { ahd_patch1_func, 239, 1, 2 },
-+ { ahd_patch0_func, 240, 1, 1 },
-+ { ahd_patch7_func, 243, 3, 1 },
-+ { ahd_patch1_func, 258, 1, 2 },
-+ { ahd_patch0_func, 259, 1, 1 },
-+ { ahd_patch1_func, 262, 1, 2 },
-+ { ahd_patch0_func, 263, 1, 1 },
-+ { ahd_patch2_func, 266, 1, 2 },
-+ { ahd_patch0_func, 267, 1, 1 },
-+ { ahd_patch9_func, 280, 2, 2 },
-+ { ahd_patch0_func, 282, 1, 1 },
-+ { ahd_patch1_func, 324, 1, 2 },
-+ { ahd_patch0_func, 325, 1, 1 },
-+ { ahd_patch2_func, 333, 1, 2 },
-+ { ahd_patch0_func, 334, 1, 1 },
-+ { ahd_patch2_func, 337, 1, 2 },
-+ { ahd_patch0_func, 338, 1, 1 },
-+ { ahd_patch1_func, 344, 1, 2 },
-+ { ahd_patch0_func, 345, 1, 1 },
-+ { ahd_patch1_func, 347, 1, 2 },
-+ { ahd_patch0_func, 348, 1, 1 },
-+ { ahd_patch10_func, 367, 1, 1 },
-+ { ahd_patch10_func, 370, 1, 1 },
-+ { ahd_patch10_func, 372, 1, 1 },
-+ { ahd_patch10_func, 384, 1, 1 },
-+ { ahd_patch1_func, 394, 1, 2 },
-+ { ahd_patch0_func, 395, 1, 1 },
-+ { ahd_patch1_func, 397, 1, 2 },
-+ { ahd_patch0_func, 398, 1, 1 },
-+ { ahd_patch1_func, 406, 1, 2 },
-+ { ahd_patch0_func, 407, 1, 1 },
-+ { ahd_patch2_func, 420, 1, 2 },
-+ { ahd_patch0_func, 421, 1, 1 },
-+ { ahd_patch11_func, 451, 1, 1 },
-+ { ahd_patch1_func, 459, 1, 2 },
-+ { ahd_patch0_func, 460, 1, 1 },
-+ { ahd_patch2_func, 472, 1, 2 },
-+ { ahd_patch0_func, 473, 1, 1 },
-+ { ahd_patch12_func, 476, 6, 2 },
- { ahd_patch0_func, 482, 1, 1 },
-- { ahd_patch12_func, 505, 1, 1 },
-- { ahd_patch13_func, 514, 1, 1 },
-- { ahd_patch14_func, 515, 1, 2 },
-+ { ahd_patch13_func, 505, 1, 1 },
-+ { ahd_patch14_func, 514, 1, 1 },
-+ { ahd_patch15_func, 515, 1, 2 },
- { ahd_patch0_func, 516, 1, 1 },
-- { ahd_patch15_func, 519, 1, 1 },
-- { ahd_patch14_func, 520, 1, 1 },
-- { ahd_patch16_func, 531, 1, 2 },
-+ { ahd_patch16_func, 519, 1, 1 },
-+ { ahd_patch15_func, 520, 1, 1 },
-+ { ahd_patch17_func, 531, 1, 2 },
- { ahd_patch0_func, 532, 1, 1 },
- { ahd_patch1_func, 551, 1, 2 },
- { ahd_patch0_func, 552, 1, 1 },
-@@ -1083,25 +1093,25 @@ static struct patch {
- { ahd_patch0_func, 569, 1, 1 },
- { ahd_patch2_func, 580, 1, 2 },
- { ahd_patch0_func, 581, 1, 1 },
-- { ahd_patch17_func, 585, 1, 1 },
-- { ahd_patch18_func, 590, 1, 1 },
-- { ahd_patch19_func, 591, 2, 1 },
-- { ahd_patch18_func, 595, 1, 2 },
-+ { ahd_patch18_func, 585, 1, 1 },
-+ { ahd_patch19_func, 590, 1, 1 },
-+ { ahd_patch20_func, 591, 2, 1 },
-+ { ahd_patch19_func, 595, 1, 2 },
- { ahd_patch0_func, 596, 1, 1 },
- { ahd_patch2_func, 599, 1, 2 },
- { ahd_patch0_func, 600, 1, 1 },
- { ahd_patch2_func, 615, 1, 2 },
- { ahd_patch0_func, 616, 1, 1 },
-- { ahd_patch20_func, 617, 14, 1 },
-+ { ahd_patch21_func, 617, 14, 1 },
- { ahd_patch1_func, 635, 1, 2 },
- { ahd_patch0_func, 636, 1, 1 },
-- { ahd_patch20_func, 637, 1, 1 },
-+ { ahd_patch21_func, 637, 1, 1 },
- { ahd_patch1_func, 649, 1, 2 },
- { ahd_patch0_func, 650, 1, 1 },
- { ahd_patch1_func, 657, 1, 2 },
- { ahd_patch0_func, 658, 1, 1 },
-- { ahd_patch17_func, 681, 1, 1 },
-- { ahd_patch17_func, 719, 1, 1 },
-+ { ahd_patch18_func, 681, 1, 1 },
-+ { ahd_patch18_func, 719, 1, 1 },
- { ahd_patch1_func, 730, 1, 2 },
- { ahd_patch0_func, 731, 1, 1 },
- { ahd_patch1_func, 748, 1, 2 },
-@@ -1110,11 +1120,11 @@ static struct patch {
- { ahd_patch0_func, 752, 1, 1 },
- { ahd_patch1_func, 755, 1, 2 },
- { ahd_patch0_func, 756, 1, 1 },
-- { ahd_patch21_func, 758, 1, 2 },
-+ { ahd_patch22_func, 758, 1, 2 },
- { ahd_patch0_func, 759, 2, 1 },
-- { ahd_patch22_func, 762, 4, 2 },
-+ { ahd_patch23_func, 762, 4, 2 },
- { ahd_patch0_func, 766, 1, 1 },
-- { ahd_patch22_func, 774, 11, 1 }
-+ { ahd_patch23_func, 774, 11, 1 }
- };
-
- static struct cs {
-@@ -1123,15 +1133,18 @@ static struct cs {
- } critical_sections[] = {
- { 11, 12 },
- { 13, 14 },
-- { 29, 42 },
-- { 56, 59 },
-- { 101, 128 },
-- { 129, 157 },
-- { 159, 162 },
-- { 170, 178 },
-- { 201, 250 },
-- { 681, 697 },
-- { 697, 711 },
-+ { 31, 42 },
-+ { 45, 47 },
-+ { 49, 50 },
-+ { 56, 78 },
-+ { 96, 123 },
-+ { 124, 152 },
-+ { 154, 157 },
-+ { 165, 173 },
-+ { 198, 249 },
-+ { 428, 430 },
-+ { 433, 436 },
-+ { 681, 711 },
- { 721, 725 }
- };
-
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_93cx6.c 2003-06-14 12:18:35.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_93cx6.c 2003-12-28 23:21:39.000000000 -0800
-@@ -28,9 +28,7 @@
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_93cx6.c#17 $
-- *
-- * $FreeBSD$
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_93cx6.c#19 $
- */
-
- /*
-@@ -64,7 +62,6 @@
- * is preceded by an initial zero (leading 0, followed by 16-bits, MSB
- * first). The clock cycling from low to high initiates the next data
- * bit to be sent from the chip.
-- *
- */
-
- #ifdef __linux__
-@@ -72,6 +69,8 @@
- #include "aic7xxx_inline.h"
- #include "aic7xxx_93cx6.h"
- #else
-+#include <sys/cdefs.h>
-+__FBSDID("$FreeBSD$");
- #include <dev/aic7xxx/aic7xxx_osm.h>
- #include <dev/aic7xxx/aic7xxx_inline.h>
- #include <dev/aic7xxx/aic7xxx_93cx6.h>
-@@ -81,14 +80,22 @@
- * Right now, we only have to read the SEEPROM. But we make it easier to
- * add other 93Cx6 functions.
- */
--static struct seeprom_cmd {
-+struct seeprom_cmd {
- uint8_t len;
-- uint8_t bits[9];
--} seeprom_read = {3, {1, 1, 0}};
-+ uint8_t bits[11];
-+};
-
-+/* Short opcodes for the c46 */
- static struct seeprom_cmd seeprom_ewen = {9, {1, 0, 0, 1, 1, 0, 0, 0, 0}};
- static struct seeprom_cmd seeprom_ewds = {9, {1, 0, 0, 0, 0, 0, 0, 0, 0}};
-+
-+/* Long opcodes for the C56/C66 */
-+static struct seeprom_cmd seeprom_long_ewen = {11, {1, 0, 0, 1, 1, 0, 0, 0, 0}};
-+static struct seeprom_cmd seeprom_long_ewds = {11, {1, 0, 0, 0, 0, 0, 0, 0, 0}};
-+
-+/* Common opcodes */
- static struct seeprom_cmd seeprom_write = {3, {1, 0, 1}};
-+static struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
-
- /*
- * Wait for the SEERDY to go high; about 800 ns.
-@@ -222,12 +229,25 @@ int
- ahc_write_seeprom(struct seeprom_descriptor *sd, uint16_t *buf,
- u_int start_addr, u_int count)
- {
-+ struct seeprom_cmd *ewen, *ewds;
- uint16_t v;
- uint8_t temp;
- int i, k;
-
- /* Place the chip into write-enable mode */
-- send_seeprom_cmd(sd, &seeprom_ewen);
-+ if (sd->sd_chip == C46) {
-+ ewen = &seeprom_ewen;
-+ ewds = &seeprom_ewds;
-+ } else if (sd->sd_chip == C56_66) {
-+ ewen = &seeprom_long_ewen;
-+ ewds = &seeprom_long_ewds;
-+ } else {
-+ printf("ahc_write_seeprom: unsupported seeprom type %d\n",
-+ sd->sd_chip);
-+ return (0);
-+ }
-+
-+ send_seeprom_cmd(sd, ewen);
- reset_seeprom(sd);
-
- /* Write all requested data out to the seeprom. */
-@@ -277,7 +297,7 @@ ahc_write_seeprom(struct seeprom_descrip
- }
-
- /* Put the chip back into write-protect mode */
-- send_seeprom_cmd(sd, &seeprom_ewds);
-+ send_seeprom_cmd(sd, ewds);
- reset_seeprom(sd);
-
- return (1);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_core.c 2003-06-14 12:18:09.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_core.c 2003-12-28 23:21:39.000000000 -0800
-@@ -37,9 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#131 $
-- *
-- * $FreeBSD$
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#147 $
- */
-
- #ifdef __linux__
-@@ -47,6 +45,8 @@
- #include "aic7xxx_inline.h"
- #include "aicasm/aicasm_insformat.h"
- #else
-+#include <sys/cdefs.h>
-+__FBSDID("$FreeBSD$");
- #include <dev/aic7xxx/aic7xxx_osm.h>
- #include <dev/aic7xxx/aic7xxx_inline.h>
- #include <dev/aic7xxx/aicasm/aicasm_insformat.h>
-@@ -320,7 +320,7 @@ ahc_run_qoutfifo(struct ahc_softc *ahc)
- */
- modnext = ahc->qoutfifonext & ~0x3;
- *((uint32_t *)(&ahc->qoutfifo[modnext])) = 0xFFFFFFFFUL;
-- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
-+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
- ahc->shared_data_dmamap,
- /*offset*/modnext, /*len*/4,
- BUS_DMASYNC_PREREAD);
-@@ -458,14 +458,14 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- * complete.
- */
- scb->flags &= ~SCB_SENSE;
-- ahc_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
-+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
- break;
- }
-- ahc_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
-+ aic_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
- /* Freeze the queue until the client sees the error. */
- ahc_freeze_devq(ahc, scb);
-- ahc_freeze_scb(scb);
-- ahc_set_scsi_status(scb, hscb->shared_data.status.scsi_status);
-+ aic_freeze_scb(scb);
-+ aic_set_scsi_status(scb, hscb->shared_data.status.scsi_status);
- switch (hscb->shared_data.status.scsi_status) {
- case SCSI_STATUS_OK:
- printf("%s: Interrupted for staus of 0???\n",
-@@ -487,7 +487,7 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- }
- #endif
-
-- if (ahc_perform_autosense(scb) == 0)
-+ if (aic_perform_autosense(scb) == 0)
- break;
-
- targ_info = ahc_fetch_transinfo(ahc,
-@@ -509,12 +509,12 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- }
- #endif
- sg->addr = ahc_get_sense_bufaddr(ahc, scb);
-- sg->len = ahc_get_sense_bufsize(ahc, scb);
-+ sg->len = aic_get_sense_bufsize(ahc, scb);
- sg->len |= AHC_DMA_LAST_SEG;
-
- /* Fixup byte order */
-- sg->addr = ahc_htole32(sg->addr);
-- sg->len = ahc_htole32(sg->len);
-+ sg->addr = aic_htole32(sg->addr);
-+ sg->len = aic_htole32(sg->len);
-
- sc->opcode = REQUEST_SENSE;
- sc->byte2 = 0;
-@@ -543,8 +543,8 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- * errors will be reported before any data
- * phases occur.
- */
-- if (ahc_get_residual(scb)
-- == ahc_get_transfer_length(scb)) {
-+ if (aic_get_residual(scb)
-+ == aic_get_transfer_length(scb)) {
- ahc_update_neg_request(ahc, &devinfo,
- tstate, targ_info,
- AHC_NEG_IF_NON_ASYNC);
-@@ -558,7 +558,7 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- hscb->dataptr = sg->addr;
- hscb->datacnt = sg->len;
- hscb->sgptr = scb->sg_list_phys | SG_FULL_RESID;
-- hscb->sgptr = ahc_htole32(hscb->sgptr);
-+ hscb->sgptr = aic_htole32(hscb->sgptr);
- scb->sg_count = 1;
- scb->flags |= SCB_SENSE;
- ahc_qinfifo_requeue_tail(ahc, scb);
-@@ -567,7 +567,7 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- * Ensure we have enough time to actually
- * retrieve the sense.
- */
-- ahc_scb_timer_reset(scb, 5 * 1000000);
-+ aic_scb_timer_reset(scb, 5 * 1000000);
- break;
- }
- default:
-@@ -768,7 +768,7 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- if ((ahc_inb(ahc, SCSISIGI)
- & (CDI|MSGI)) != 0)
- break;
-- ahc_delay(100);
-+ aic_delay(100);
- }
- ahc_outb(ahc, SXFRCTL1,
- ahc_inb(ahc, SXFRCTL1) & ~BITBUCKET);
-@@ -782,7 +782,7 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- scb_index = ahc_inb(ahc, SCB_TAG);
- scb = ahc_lookup_scb(ahc, scb_index);
- if (scb != NULL)
-- ahc_set_transaction_status(scb,
-+ aic_set_transaction_status(scb,
- CAM_UNCOR_PARITY);
- ahc_reset_channel(ahc, devinfo.channel,
- /*init reset*/TRUE);
-@@ -820,16 +820,16 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- ahc_print_path(ahc, scb);
- printf("%s seen Data Phase. Length = %ld. NumSGs = %d.\n",
- ahc_inb(ahc, SEQ_FLAGS) & DPHASE ? "Have" : "Haven't",
-- ahc_get_transfer_length(scb), scb->sg_count);
-+ aic_get_transfer_length(scb), scb->sg_count);
- if (scb->sg_count > 0) {
- for (i = 0; i < scb->sg_count; i++) {
-
- printf("sg[%d] - Addr 0x%x%x : Length %d\n",
- i,
-- (ahc_le32toh(scb->sg_list[i].len) >> 24
-+ (aic_le32toh(scb->sg_list[i].len) >> 24
- & SG_HIGH_ADDR_BITS),
-- ahc_le32toh(scb->sg_list[i].addr),
-- ahc_le32toh(scb->sg_list[i].len)
-+ aic_le32toh(scb->sg_list[i].addr),
-+ aic_le32toh(scb->sg_list[i].len)
- & AHC_SG_LEN_MASK);
- }
- }
-@@ -839,12 +839,12 @@ ahc_handle_seqint(struct ahc_softc *ahc,
- */
- ahc_freeze_devq(ahc, scb);
- if ((scb->flags & SCB_SENSE) == 0) {
-- ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
- } else {
- scb->flags &= ~SCB_SENSE;
-- ahc_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
-+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
- }
-- ahc_freeze_scb(scb);
-+ aic_freeze_scb(scb);
-
- if ((ahc->features & AHC_ULTRA2) != 0) {
- /*
-@@ -1188,7 +1188,7 @@ ahc_handle_scsiint(struct ahc_softc *ahc
- */
- ahc_scb_devinfo(ahc, &devinfo, scb);
- ahc_force_renegotiation(ahc, &devinfo);
-- ahc_set_transaction_status(scb, CAM_SEL_TIMEOUT);
-+ aic_set_transaction_status(scb, CAM_SEL_TIMEOUT);
- ahc_freeze_devq(ahc, scb);
- }
- ahc_outb(ahc, CLRINT, CLRSCSIINT);
-@@ -1270,7 +1270,7 @@ ahc_handle_scsiint(struct ahc_softc *ahc
- CAM_LUN_WILDCARD,
- SCB_LIST_NULL,
- ROLE_INITIATOR)) {
-- ahc_set_transaction_status(scb, CAM_REQ_CMP);
-+ aic_set_transaction_status(scb, CAM_REQ_CMP);
- }
- #endif
- ahc_compile_devinfo(&devinfo,
-@@ -1304,17 +1304,23 @@ ahc_handle_scsiint(struct ahc_softc *ahc
- ahc_qinfifo_requeue_tail(ahc, scb);
- printerror = 0;
- } else if (ahc_sent_msg(ahc, AHCMSG_EXT,
-- MSG_EXT_WDTR, FALSE)
-- || ahc_sent_msg(ahc, AHCMSG_EXT,
-- MSG_EXT_SDTR, FALSE)) {
-+ MSG_EXT_WDTR, FALSE)) {
- /*
-- * Negotiation Rejected. Go-async and
-+ * Negotiation Rejected. Go-narrow and
- * retry command.
- */
- ahc_set_width(ahc, &devinfo,
- MSG_EXT_WDTR_BUS_8_BIT,
- AHC_TRANS_CUR|AHC_TRANS_GOAL,
- /*paused*/TRUE);
-+ ahc_qinfifo_requeue_tail(ahc, scb);
-+ printerror = 0;
-+ } else if (ahc_sent_msg(ahc, AHCMSG_EXT,
-+ MSG_EXT_SDTR, FALSE)) {
-+ /*
-+ * Negotiation Rejected. Go-async and
-+ * retry command.
-+ */
- ahc_set_syncrate(ahc, &devinfo,
- /*syncrate*/NULL,
- /*period*/0, /*offset*/0,
-@@ -1463,7 +1469,7 @@ ahc_clear_critical_section(struct ahc_so
- * current connection, so we must
- * leave it on while single stepping.
- */
-- ahc_outb(ahc, SIMODE1, ENBUSFREE);
-+ ahc_outb(ahc, SIMODE1, simode1 & ENBUSFREE);
- else
- ahc_outb(ahc, SIMODE1, 0);
- ahc_outb(ahc, CLRINT, CLRSCSIINT);
-@@ -1476,7 +1482,7 @@ ahc_clear_critical_section(struct ahc_so
- }
- ahc_outb(ahc, HCNTRL, ahc->unpause);
- while (!ahc_is_paused(ahc))
-- ahc_delay(200);
-+ aic_delay(200);
- }
- if (stepping) {
- ahc_outb(ahc, SIMODE0, simode0);
-@@ -1524,18 +1530,18 @@ ahc_print_scb(struct scb *scb)
- for (i = 0; i < sizeof(hscb->shared_data.cdb); i++)
- printf("%#02x", hscb->shared_data.cdb[i]);
- printf(" dataptr:%#x datacnt:%#x sgptr:%#x tag:%#x\n",
-- ahc_le32toh(hscb->dataptr),
-- ahc_le32toh(hscb->datacnt),
-- ahc_le32toh(hscb->sgptr),
-+ aic_le32toh(hscb->dataptr),
-+ aic_le32toh(hscb->datacnt),
-+ aic_le32toh(hscb->sgptr),
- hscb->tag);
- if (scb->sg_count > 0) {
- for (i = 0; i < scb->sg_count; i++) {
- printf("sg[%d] - Addr 0x%x%x : Length %d\n",
- i,
-- (ahc_le32toh(scb->sg_list[i].len) >> 24
-+ (aic_le32toh(scb->sg_list[i].len) >> 24
- & SG_HIGH_ADDR_BITS),
-- ahc_le32toh(scb->sg_list[i].addr),
-- ahc_le32toh(scb->sg_list[i].len));
-+ aic_le32toh(scb->sg_list[i].addr),
-+ aic_le32toh(scb->sg_list[i].len));
- }
- }
- }
-@@ -2373,6 +2379,7 @@ ahc_build_transfer_msg(struct ahc_softc
- * may change.
- */
- period = tinfo->goal.period;
-+ offset = tinfo->goal.offset;
- ppr_options = tinfo->goal.ppr_options;
- /* Target initiated PPR is not allowed in the SCSI spec */
- if (devinfo->role == ROLE_TARGET)
-@@ -2380,7 +2387,7 @@ ahc_build_transfer_msg(struct ahc_softc
- rate = ahc_devlimited_syncrate(ahc, tinfo, &period,
- &ppr_options, devinfo->role);
- dowide = tinfo->curr.width != tinfo->goal.width;
-- dosync = tinfo->curr.period != period;
-+ dosync = tinfo->curr.offset != offset || tinfo->curr.period != period;
- /*
- * Only use PPR if we have options that need it, even if the device
- * claims to support it. There might be an expander in the way
-@@ -2568,7 +2575,7 @@ ahc_handle_proto_violation(struct ahc_so
- printf("No SCB found during protocol violation\n");
- goto proto_violation_reset;
- } else {
-- ahc_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
-+ aic_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
- if ((seq_flags & NO_CDB_SENT) != 0) {
- ahc_print_path(ahc, scb);
- printf("No or incomplete CDB sent to device.\n");
-@@ -3176,23 +3183,30 @@ ahc_parse_msg(struct ahc_softc *ahc, str
- response = TRUE;
- sending_reply = TRUE;
- }
-+ /*
-+ * After a wide message, we are async, but
-+ * some devices don't seem to honor this portion
-+ * of the spec. Force a renegotiation of the
-+ * sync component of our transfer agreement even
-+ * if our goal is async. By updating our width
-+ * after forcing the negotiation, we avoid
-+ * renegotiating for width.
-+ */
-+ ahc_update_neg_request(ahc, devinfo, tstate,
-+ tinfo, AHC_NEG_ALWAYS);
- ahc_set_width(ahc, devinfo, bus_width,
- AHC_TRANS_ACTIVE|AHC_TRANS_GOAL,
- /*paused*/TRUE);
-- /* After a wide message, we are async */
-- ahc_set_syncrate(ahc, devinfo,
-- /*syncrate*/NULL, /*period*/0,
-- /*offset*/0, /*ppr_options*/0,
-- AHC_TRANS_ACTIVE, /*paused*/TRUE);
- if (sending_reply == FALSE && reject == FALSE) {
-
-- if (tinfo->goal.offset) {
-- ahc->msgout_index = 0;
-- ahc->msgout_len = 0;
-- ahc_build_transfer_msg(ahc, devinfo);
-- ahc->msgout_index = 0;
-- response = TRUE;
-- }
-+ /*
-+ * We will always have an SDTR to send.
-+ */
-+ ahc->msgout_index = 0;
-+ ahc->msgout_len = 0;
-+ ahc_build_transfer_msg(ahc, devinfo);
-+ ahc->msgout_index = 0;
-+ response = TRUE;
- }
- done = MSGLOOP_MSGCOMPLETE;
- break;
-@@ -3499,7 +3513,7 @@ ahc_handle_msg_reject(struct ahc_softc *
- ahc_outb(ahc, SCB_CONTROL,
- ahc_inb(ahc, SCB_CONTROL) & mask);
- scb->hscb->control &= mask;
-- ahc_set_transaction_tag(scb, /*enabled*/FALSE,
-+ aic_set_transaction_tag(scb, /*enabled*/FALSE,
- /*type*/MSG_SIMPLE_TASK);
- ahc_outb(ahc, MSG_OUT, MSG_IDENTIFYFLAG);
- ahc_assert_atn(ahc);
-@@ -3556,7 +3570,7 @@ ahc_handle_ign_wide_residue(struct ahc_s
- * Perhaps add datadir to some spare bits in the hscb?
- */
- if ((ahc_inb(ahc, SEQ_FLAGS) & DPHASE) == 0
-- || ahc_get_transfer_dir(scb) != CAM_DIR_IN) {
-+ || aic_get_transfer_dir(scb) != CAM_DIR_IN) {
- /*
- * Ignore the message if we haven't
- * seen an appropriate data phase yet.
-@@ -3612,18 +3626,18 @@ ahc_handle_ign_wide_residue(struct ahc_s
- * to load so we must go back one.
- */
- sg--;
-- sglen = ahc_le32toh(sg->len) & AHC_SG_LEN_MASK;
-+ sglen = aic_le32toh(sg->len) & AHC_SG_LEN_MASK;
- if (sg != scb->sg_list
- && sglen < (data_cnt & AHC_SG_LEN_MASK)) {
-
- sg--;
-- sglen = ahc_le32toh(sg->len);
-+ sglen = aic_le32toh(sg->len);
- /*
- * Preserve High Address and SG_LIST bits
- * while setting the count to 1.
- */
- data_cnt = 1 | (sglen & (~AHC_SG_LEN_MASK));
-- data_addr = ahc_le32toh(sg->addr)
-+ data_addr = aic_le32toh(sg->addr)
- + (sglen & AHC_SG_LEN_MASK) - 1;
-
- /*
-@@ -3679,8 +3693,8 @@ ahc_reinitialize_dataptrs(struct ahc_sof
- | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT + 1) << 8)
- | ahc_inb(ahc, SCB_RESIDUAL_DATACNT);
-
-- dataptr = ahc_le32toh(sg->addr)
-- + (ahc_le32toh(sg->len) & AHC_SG_LEN_MASK)
-+ dataptr = aic_le32toh(sg->addr)
-+ + (aic_le32toh(sg->len) & AHC_SG_LEN_MASK)
- - resid;
- if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
- u_int dscommand1;
-@@ -3688,7 +3702,7 @@ ahc_reinitialize_dataptrs(struct ahc_sof
- dscommand1 = ahc_inb(ahc, DSCOMMAND1);
- ahc_outb(ahc, DSCOMMAND1, dscommand1 | HADDLDSEL0);
- ahc_outb(ahc, HADDR,
-- (ahc_le32toh(sg->len) >> 24) & SG_HIGH_ADDR_BITS);
-+ (aic_le32toh(sg->len) >> 24) & SG_HIGH_ADDR_BITS);
- ahc_outb(ahc, DSCOMMAND1, dscommand1);
- }
- ahc_outb(ahc, HADDR + 3, dataptr >> 24);
-@@ -3869,7 +3883,7 @@ ahc_softc_insert(struct ahc_softc *ahc)
- {
- struct ahc_softc *list_ahc;
-
--#if AHC_PCI_CONFIG > 0
-+#if AIC_PCI_CONFIG > 0
- /*
- * Second Function PCI devices need to inherit some
- * settings from function 0.
-@@ -3877,17 +3891,17 @@ ahc_softc_insert(struct ahc_softc *ahc)
- if ((ahc->chip & AHC_BUS_MASK) == AHC_PCI
- && (ahc->features & AHC_MULTI_FUNC) != 0) {
- TAILQ_FOREACH(list_ahc, &ahc_tailq, links) {
-- ahc_dev_softc_t list_pci;
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t list_pci;
-+ aic_dev_softc_t pci;
-
- list_pci = list_ahc->dev_softc;
- pci = ahc->dev_softc;
-- if (ahc_get_pci_slot(list_pci) == ahc_get_pci_slot(pci)
-- && ahc_get_pci_bus(list_pci) == ahc_get_pci_bus(pci)) {
-+ if (aic_get_pci_slot(list_pci) == aic_get_pci_slot(pci)
-+ && aic_get_pci_bus(list_pci) == aic_get_pci_bus(pci)) {
- struct ahc_softc *master;
- struct ahc_softc *slave;
-
-- if (ahc_get_pci_function(list_pci) == 0) {
-+ if (aic_get_pci_function(list_pci) == 0) {
- master = list_ahc;
- slave = ahc;
- } else {
-@@ -3955,27 +3969,27 @@ ahc_free(struct ahc_softc *ahc)
- {
- int i;
-
-+ ahc_terminate_recovery_thread(ahc);
- switch (ahc->init_level) {
- default:
- case 5:
- ahc_shutdown(ahc);
-- TAILQ_REMOVE(&ahc_tailq, ahc, links);
- /* FALLTHROUGH */
- case 4:
-- ahc_dmamap_unload(ahc, ahc->shared_data_dmat,
-+ aic_dmamap_unload(ahc, ahc->shared_data_dmat,
- ahc->shared_data_dmamap);
- /* FALLTHROUGH */
- case 3:
-- ahc_dmamem_free(ahc, ahc->shared_data_dmat, ahc->qoutfifo,
-+ aic_dmamem_free(ahc, ahc->shared_data_dmat, ahc->qoutfifo,
- ahc->shared_data_dmamap);
-- ahc_dmamap_destroy(ahc, ahc->shared_data_dmat,
-+ aic_dmamap_destroy(ahc, ahc->shared_data_dmat,
- ahc->shared_data_dmamap);
- /* FALLTHROUGH */
- case 2:
-- ahc_dma_tag_destroy(ahc, ahc->shared_data_dmat);
-+ aic_dma_tag_destroy(ahc, ahc->shared_data_dmat);
- case 1:
- #ifndef __linux__
-- ahc_dma_tag_destroy(ahc, ahc->buffer_dmat);
-+ aic_dma_tag_destroy(ahc, ahc->buffer_dmat);
- #endif
- break;
- case 0:
-@@ -3983,7 +3997,7 @@ ahc_free(struct ahc_softc *ahc)
- }
-
- #ifndef __linux__
-- ahc_dma_tag_destroy(ahc, ahc->parent_dmat);
-+ aic_dma_tag_destroy(ahc, ahc->parent_dmat);
- #endif
- ahc_platform_free(ahc);
- ahc_fini_scbdata(ahc);
-@@ -4033,7 +4047,7 @@ ahc_shutdown(void *arg)
- ahc = (struct ahc_softc *)arg;
-
- /* This will reset most registers to 0, but not all */
-- ahc_reset(ahc);
-+ ahc_reset(ahc, /*reinit*/FALSE);
- ahc_outb(ahc, SCSISEQ, 0);
- ahc_outb(ahc, SXFRCTL0, 0);
- ahc_outb(ahc, DSPCISTATUS, 0);
-@@ -4044,10 +4058,15 @@ ahc_shutdown(void *arg)
-
- /*
- * Reset the controller and record some information about it
-- * that is only available just after a reset.
-+ * that is only available just after a reset. If "reinit" is
-+ * non-zero, this reset occured after initial configuration
-+ * and the caller requests that the chip be fully reinitialized
-+ * to a runable state. Chip interrupts are *not* enabled after
-+ * a reinitialization. The caller must enable interrupts via
-+ * ahc_intr_enable().
- */
- int
--ahc_reset(struct ahc_softc *ahc)
-+ahc_reset(struct ahc_softc *ahc, int reinit)
- {
- u_int sblkctl;
- u_int sxfrctl1_a, sxfrctl1_b;
-@@ -4060,14 +4079,6 @@ ahc_reset(struct ahc_softc *ahc)
- * to disturb the integrity of the bus.
- */
- ahc_pause(ahc);
-- if ((ahc_inb(ahc, HCNTRL) & CHIPRST) != 0) {
-- /*
-- * The chip has not been initialized since
-- * PCI/EISA/VLB bus reset. Don't trust
-- * "left over BIOS data".
-- */
-- ahc->flags |= AHC_NO_BIOS_INIT;
-- }
- sxfrctl1_b = 0;
- if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7770) {
- u_int sblkctl;
-@@ -4093,7 +4104,7 @@ ahc_reset(struct ahc_softc *ahc)
- */
- wait = 1000;
- do {
-- ahc_delay(1000);
-+ aic_delay(1000);
- } while (--wait && !(ahc_inb(ahc, HCNTRL) & CHIPRSTACK));
-
- if (wait == 0) {
-@@ -4143,7 +4154,7 @@ ahc_reset(struct ahc_softc *ahc)
- ahc_outb(ahc, SXFRCTL1, sxfrctl1_a);
-
- error = 0;
-- if (ahc->init_level > 0)
-+ if (reinit != 0)
- /*
- * If a recovery action has forced a chip reset,
- * re-initialize the chip to our liking.
-@@ -4273,7 +4284,7 @@ ahc_init_scbdata(struct ahc_softc *ahc)
- */
-
- /* DMA tag for our hardware scb structures */
-- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -4288,7 +4299,7 @@ ahc_init_scbdata(struct ahc_softc *ahc)
- scb_data->init_level++;
-
- /* Allocation for our hscbs */
-- if (ahc_dmamem_alloc(ahc, scb_data->hscb_dmat,
-+ if (aic_dmamem_alloc(ahc, scb_data->hscb_dmat,
- (void **)&scb_data->hscbs,
- BUS_DMA_NOWAIT, &scb_data->hscb_dmamap) != 0) {
- goto error_exit;
-@@ -4297,7 +4308,7 @@ ahc_init_scbdata(struct ahc_softc *ahc)
- scb_data->init_level++;
-
- /* And permanently map them */
-- ahc_dmamap_load(ahc, scb_data->hscb_dmat, scb_data->hscb_dmamap,
-+ aic_dmamap_load(ahc, scb_data->hscb_dmat, scb_data->hscb_dmamap,
- scb_data->hscbs,
- AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb),
- ahc_dmamap_cb, &scb_data->hscb_busaddr, /*flags*/0);
-@@ -4305,7 +4316,7 @@ ahc_init_scbdata(struct ahc_softc *ahc)
- scb_data->init_level++;
-
- /* DMA tag for our sense buffers */
-- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -4320,7 +4331,7 @@ ahc_init_scbdata(struct ahc_softc *ahc)
- scb_data->init_level++;
-
- /* Allocate them */
-- if (ahc_dmamem_alloc(ahc, scb_data->sense_dmat,
-+ if (aic_dmamem_alloc(ahc, scb_data->sense_dmat,
- (void **)&scb_data->sense,
- BUS_DMA_NOWAIT, &scb_data->sense_dmamap) != 0) {
- goto error_exit;
-@@ -4329,7 +4340,7 @@ ahc_init_scbdata(struct ahc_softc *ahc)
- scb_data->init_level++;
-
- /* And permanently map them */
-- ahc_dmamap_load(ahc, scb_data->sense_dmat, scb_data->sense_dmamap,
-+ aic_dmamap_load(ahc, scb_data->sense_dmat, scb_data->sense_dmamap,
- scb_data->sense,
- AHC_SCB_MAX_ALLOC * sizeof(struct scsi_sense_data),
- ahc_dmamap_cb, &scb_data->sense_busaddr, /*flags*/0);
-@@ -4337,7 +4348,7 @@ ahc_init_scbdata(struct ahc_softc *ahc)
- scb_data->init_level++;
-
- /* DMA tag for our S/G structures. We allocate in page sized chunks */
-- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/8,
-+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/8,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -4394,35 +4405,35 @@ ahc_fini_scbdata(struct ahc_softc *ahc)
-
- while ((sg_map = SLIST_FIRST(&scb_data->sg_maps))!= NULL) {
- SLIST_REMOVE_HEAD(&scb_data->sg_maps, links);
-- ahc_dmamap_unload(ahc, scb_data->sg_dmat,
-+ aic_dmamap_unload(ahc, scb_data->sg_dmat,
- sg_map->sg_dmamap);
-- ahc_dmamem_free(ahc, scb_data->sg_dmat,
-+ aic_dmamem_free(ahc, scb_data->sg_dmat,
- sg_map->sg_vaddr,
- sg_map->sg_dmamap);
- free(sg_map, M_DEVBUF);
- }
-- ahc_dma_tag_destroy(ahc, scb_data->sg_dmat);
-+ aic_dma_tag_destroy(ahc, scb_data->sg_dmat);
- }
- case 6:
-- ahc_dmamap_unload(ahc, scb_data->sense_dmat,
-+ aic_dmamap_unload(ahc, scb_data->sense_dmat,
- scb_data->sense_dmamap);
- case 5:
-- ahc_dmamem_free(ahc, scb_data->sense_dmat, scb_data->sense,
-+ aic_dmamem_free(ahc, scb_data->sense_dmat, scb_data->sense,
- scb_data->sense_dmamap);
-- ahc_dmamap_destroy(ahc, scb_data->sense_dmat,
-+ aic_dmamap_destroy(ahc, scb_data->sense_dmat,
- scb_data->sense_dmamap);
- case 4:
-- ahc_dma_tag_destroy(ahc, scb_data->sense_dmat);
-+ aic_dma_tag_destroy(ahc, scb_data->sense_dmat);
- case 3:
-- ahc_dmamap_unload(ahc, scb_data->hscb_dmat,
-+ aic_dmamap_unload(ahc, scb_data->hscb_dmat,
- scb_data->hscb_dmamap);
- case 2:
-- ahc_dmamem_free(ahc, scb_data->hscb_dmat, scb_data->hscbs,
-+ aic_dmamem_free(ahc, scb_data->hscb_dmat, scb_data->hscbs,
- scb_data->hscb_dmamap);
-- ahc_dmamap_destroy(ahc, scb_data->hscb_dmat,
-+ aic_dmamap_destroy(ahc, scb_data->hscb_dmat,
- scb_data->hscb_dmamap);
- case 1:
-- ahc_dma_tag_destroy(ahc, scb_data->hscb_dmat);
-+ aic_dma_tag_destroy(ahc, scb_data->hscb_dmat);
- break;
- case 0:
- break;
-@@ -4455,7 +4466,7 @@ ahc_alloc_scbs(struct ahc_softc *ahc)
- return;
-
- /* Allocate S/G space for the next batch of SCBS */
-- if (ahc_dmamem_alloc(ahc, scb_data->sg_dmat,
-+ if (aic_dmamem_alloc(ahc, scb_data->sg_dmat,
- (void **)&sg_map->sg_vaddr,
- BUS_DMA_NOWAIT, &sg_map->sg_dmamap) != 0) {
- free(sg_map, M_DEVBUF);
-@@ -4464,7 +4475,7 @@ ahc_alloc_scbs(struct ahc_softc *ahc)
-
- SLIST_INSERT_HEAD(&scb_data->sg_maps, sg_map, links);
-
-- ahc_dmamap_load(ahc, scb_data->sg_dmat, sg_map->sg_dmamap,
-+ aic_dmamap_load(ahc, scb_data->sg_dmat, sg_map->sg_dmamap,
- sg_map->sg_vaddr, PAGE_SIZE, ahc_dmamap_cb,
- &sg_map->sg_physaddr, /*flags*/0);
-
-@@ -4491,9 +4502,9 @@ ahc_alloc_scbs(struct ahc_softc *ahc)
- */
- next_scb->sg_list_phys = physaddr + sizeof(struct ahc_dma_seg);
- next_scb->ahc_softc = ahc;
-- next_scb->flags = SCB_FREE;
-+ next_scb->flags = SCB_FLAG_NONE;
- #ifndef __linux__
-- error = ahc_dmamap_create(ahc, ahc->buffer_dmat, /*flags*/0,
-+ error = aic_dmamap_create(ahc, ahc->buffer_dmat, /*flags*/0,
- &next_scb->dmamap);
- if (error != 0)
- break;
-@@ -4725,14 +4736,12 @@ ahc_chip_init(struct ahc_softc *ahc)
- * never settle, so don't complain if we
- * fail here.
- */
-- ahc_pause(ahc);
- for (wait = 5000;
- (ahc_inb(ahc, SBLKCTL) & (ENAB40|ENAB20)) == 0 && wait;
- wait--)
-- ahc_delay(100);
-- ahc_unpause(ahc);
-+ aic_delay(100);
- }
--
-+ ahc_restart(ahc);
- return (0);
- }
-
-@@ -4743,6 +4752,7 @@ int
- ahc_init(struct ahc_softc *ahc)
- {
- int max_targ;
-+ int error;
- u_int i;
- u_int scsi_conf;
- u_int ultraenb;
-@@ -4800,7 +4810,7 @@ ahc_init(struct ahc_softc *ahc)
-
- #ifndef __linux__
- /* DMA tag for mapping buffers into device visible space. */
-- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/ahc->flags & AHC_39BIT_ADDRESSING
- ? (bus_addr_t)0x7FFFFFFFFFULL
-@@ -4831,7 +4841,7 @@ ahc_init(struct ahc_softc *ahc)
- if ((ahc->features & AHC_TARGETMODE) != 0)
- driver_data_size += AHC_TMODE_CMDS * sizeof(struct target_cmd)
- + /*DMA WideOdd Bug Buffer*/1;
-- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
-+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
- /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
- /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
- /*highaddr*/BUS_SPACE_MAXADDR,
-@@ -4846,7 +4856,7 @@ ahc_init(struct ahc_softc *ahc)
- ahc->init_level++;
-
- /* Allocation of driver data */
-- if (ahc_dmamem_alloc(ahc, ahc->shared_data_dmat,
-+ if (aic_dmamem_alloc(ahc, ahc->shared_data_dmat,
- (void **)&ahc->qoutfifo,
- BUS_DMA_NOWAIT, &ahc->shared_data_dmamap) != 0) {
- return (ENOMEM);
-@@ -4855,7 +4865,7 @@ ahc_init(struct ahc_softc *ahc)
- ahc->init_level++;
-
- /* And permanently map it in */
-- ahc_dmamap_load(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
-+ aic_dmamap_load(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
- ahc->qoutfifo, driver_data_size, ahc_dmamap_cb,
- &ahc->shared_data_busaddr, /*flags*/0);
-
-@@ -4898,6 +4908,13 @@ ahc_init(struct ahc_softc *ahc)
- }
- }
-
-+ /*
-+ * Fire up a recovery thread for this controller.
-+ */
-+ error = ahc_spawn_recovery_thread(ahc);
-+ if (error != 0)
-+ return (error);
-+
- if (ahc->scb_data->maxhscbs < AHC_SCB_MAX_ALLOC) {
- ahc->flags |= AHC_PAGESCBS;
- } else {
-@@ -5095,8 +5112,14 @@ ahc_pause_and_flushwork(struct ahc_softc
- ahc->flags |= AHC_ALL_INTERRUPTS;
- paused = FALSE;
- do {
-- if (paused)
-+ if (paused) {
- ahc_unpause(ahc);
-+ /*
-+ * Give the sequencer some time to service
-+ * any active selections.
-+ */
-+ aic_delay(200);
-+ }
- ahc_intr(ahc);
- ahc_pause(ahc);
- paused = TRUE;
-@@ -5145,7 +5168,9 @@ int
- ahc_resume(struct ahc_softc *ahc)
- {
-
-- ahc_reset(ahc);
-+ ahc_reset(ahc, /*reinit*/TRUE);
-+ ahc_intr_enable(ahc, TRUE);
-+ ahc_restart(ahc);
- return (0);
- }
-
-@@ -5380,12 +5405,12 @@ ahc_search_qinfifo(struct ahc_softc *ahc
- cam_status ostat;
- cam_status cstat;
-
-- ostat = ahc_get_transaction_status(scb);
-+ ostat = aic_get_transaction_status(scb);
- if (ostat == CAM_REQ_INPROG)
-- ahc_set_transaction_status(scb, status);
-- cstat = ahc_get_transaction_status(scb);
-+ aic_set_transaction_status(scb, status);
-+ cstat = aic_get_transaction_status(scb);
- if (cstat != CAM_REQ_CMP)
-- ahc_freeze_scb(scb);
-+ aic_freeze_scb(scb);
- if ((scb->flags & SCB_ACTIVE) == 0)
- printf("Inactive SCB in qinfifo\n");
- ahc_done(ahc, scb);
-@@ -5492,13 +5517,13 @@ ahc_search_qinfifo(struct ahc_softc *ahc
- cam_status ostat;
- cam_status cstat;
-
-- ostat = ahc_get_transaction_status(scb);
-+ ostat = aic_get_transaction_status(scb);
- if (ostat == CAM_REQ_INPROG)
-- ahc_set_transaction_status(scb,
-+ aic_set_transaction_status(scb,
- status);
-- cstat = ahc_get_transaction_status(scb);
-+ cstat = aic_get_transaction_status(scb);
- if (cstat != CAM_REQ_CMP)
-- ahc_freeze_scb(scb);
-+ aic_freeze_scb(scb);
- if ((scb->flags & SCB_ACTIVE) == 0)
- printf("Inactive SCB in Waiting List\n");
- ahc_done(ahc, scb);
-@@ -5520,7 +5545,7 @@ ahc_search_qinfifo(struct ahc_softc *ahc
- }
- ahc_outb(ahc, SCBPTR, curscbptr);
-
-- found += ahc_search_untagged_queues(ahc, /*ahc_io_ctx_t*/NULL, target,
-+ found += ahc_search_untagged_queues(ahc, /*aic_io_ctx_t*/NULL, target,
- channel, lun, status, action);
-
- if (action == SEARCH_COMPLETE)
-@@ -5529,7 +5554,7 @@ ahc_search_qinfifo(struct ahc_softc *ahc
- }
-
- int
--ahc_search_untagged_queues(struct ahc_softc *ahc, ahc_io_ctx_t ctx,
-+ahc_search_untagged_queues(struct ahc_softc *ahc, aic_io_ctx_t ctx,
- int target, char channel, int lun, uint32_t status,
- ahc_search_action action)
- {
-@@ -5600,12 +5625,12 @@ ahc_search_untagged_queues(struct ahc_so
- cam_status ostat;
- cam_status cstat;
-
-- ostat = ahc_get_transaction_status(scb);
-+ ostat = aic_get_transaction_status(scb);
- if (ostat == CAM_REQ_INPROG)
-- ahc_set_transaction_status(scb, status);
-- cstat = ahc_get_transaction_status(scb);
-+ aic_set_transaction_status(scb, status);
-+ cstat = aic_get_transaction_status(scb);
- if (cstat != CAM_REQ_CMP)
-- ahc_freeze_scb(scb);
-+ aic_freeze_scb(scb);
- if ((scb->flags & SCB_ACTIVE) == 0)
- printf("Inactive SCB in untaggedQ\n");
- ahc_done(ahc, scb);
-@@ -5904,11 +5929,11 @@ ahc_abort_scbs(struct ahc_softc *ahc, in
- if (ahc_match_scb(ahc, scbp, target, channel, lun, tag, role)) {
- cam_status ostat;
-
-- ostat = ahc_get_transaction_status(scbp);
-+ ostat = aic_get_transaction_status(scbp);
- if (ostat == CAM_REQ_INPROG)
-- ahc_set_transaction_status(scbp, status);
-- if (ahc_get_transaction_status(scbp) != CAM_REQ_CMP)
-- ahc_freeze_scb(scbp);
-+ aic_set_transaction_status(scbp, status);
-+ if (aic_get_transaction_status(scbp) != CAM_REQ_CMP)
-+ aic_freeze_scb(scbp);
- if ((scbp->flags & SCB_ACTIVE) == 0)
- printf("Inactive SCB on pending list\n");
- ahc_done(ahc, scbp);
-@@ -5930,7 +5955,7 @@ ahc_reset_current_bus(struct ahc_softc *
- scsiseq = ahc_inb(ahc, SCSISEQ);
- ahc_outb(ahc, SCSISEQ, scsiseq | SCSIRSTO);
- ahc_flush_device_writes(ahc);
-- ahc_delay(AHC_BUSRESET_DELAY);
-+ aic_delay(AHC_BUSRESET_DELAY);
- /* Turn off the bus reset */
- ahc_outb(ahc, SCSISEQ, scsiseq & ~SCSIRSTO);
-
-@@ -6137,7 +6162,7 @@ ahc_calc_residual(struct ahc_softc *ahc,
- */
-
- hscb = scb->hscb;
-- sgptr = ahc_le32toh(hscb->sgptr);
-+ sgptr = aic_le32toh(hscb->sgptr);
- if ((sgptr & SG_RESID_VALID) == 0)
- /* Case 1 */
- return;
-@@ -6148,10 +6173,10 @@ ahc_calc_residual(struct ahc_softc *ahc,
- return;
-
- spkt = &hscb->shared_data.status;
-- resid_sgptr = ahc_le32toh(spkt->residual_sg_ptr);
-+ resid_sgptr = aic_le32toh(spkt->residual_sg_ptr);
- if ((sgptr & SG_FULL_RESID) != 0) {
- /* Case 3 */
-- resid = ahc_get_transfer_length(scb);
-+ resid = aic_get_transfer_length(scb);
- } else if ((resid_sgptr & SG_LIST_NULL) != 0) {
- /* Case 4 */
- return;
-@@ -6164,7 +6189,7 @@ ahc_calc_residual(struct ahc_softc *ahc,
- * Remainder of the SG where the transfer
- * stopped.
- */
-- resid = ahc_le32toh(spkt->residual_datacnt) & AHC_SG_LEN_MASK;
-+ resid = aic_le32toh(spkt->residual_datacnt) & AHC_SG_LEN_MASK;
- sg = ahc_sg_bus_to_virt(scb, resid_sgptr & SG_PTR_MASK);
-
- /* The residual sg_ptr always points to the next sg */
-@@ -6175,15 +6200,15 @@ ahc_calc_residual(struct ahc_softc *ahc,
- * SG segments that are after the SG where
- * the transfer stopped.
- */
-- while ((ahc_le32toh(sg->len) & AHC_DMA_LAST_SEG) == 0) {
-+ while ((aic_le32toh(sg->len) & AHC_DMA_LAST_SEG) == 0) {
- sg++;
-- resid += ahc_le32toh(sg->len) & AHC_SG_LEN_MASK;
-+ resid += aic_le32toh(sg->len) & AHC_SG_LEN_MASK;
- }
- }
- if ((scb->flags & SCB_SENSE) == 0)
-- ahc_set_residual(scb, resid);
-+ aic_set_residual(scb, resid);
- else
-- ahc_set_sense_residual(scb, resid);
-+ aic_set_sense_residual(scb, resid);
-
- #ifdef AHC_DEBUG
- if ((ahc_debug & AHC_SHOW_MISC) != 0) {
-@@ -6407,7 +6432,6 @@ ahc_loadseq(struct ahc_softc *ahc)
- memcpy(ahc->critical_sections, cs_table, cs_count);
- }
- ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE);
-- ahc_restart(ahc);
-
- if (bootverbose) {
- printf(" %d instructions downloaded\n", downloaded);
-@@ -6464,7 +6488,7 @@ ahc_download_instr(struct ahc_softc *ahc
- /*
- * The firmware is always compiled into a little endian format.
- */
-- instr.integer = ahc_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
-+ instr.integer = aic_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
-
- fmt1_ins = &instr.format1;
- fmt3_ins = NULL;
-@@ -6569,7 +6593,7 @@ ahc_download_instr(struct ahc_softc *ahc
- }
- }
- /* The sequencer is a little endian cpu */
-- instr.integer = ahc_htole32(instr.integer);
-+ instr.integer = aic_htole32(instr.integer);
- ahc_outsb(ahc, SEQRAM, instr.bytes, 4);
- break;
- default:
-@@ -6809,6 +6833,324 @@ ahc_dump_card_state(struct ahc_softc *ah
- ahc_unpause(ahc);
- }
-
-+/*************************** Timeout Handling *********************************/
-+void
-+ahc_timeout(struct scb *scb)
-+{
-+ struct ahc_softc *ahc;
-+
-+ ahc = scb->ahc_softc;
-+ if ((scb->flags & SCB_ACTIVE) != 0) {
-+ if ((scb->flags & SCB_TIMEDOUT) == 0) {
-+ LIST_INSERT_HEAD(&ahc->timedout_scbs, scb,
-+ timedout_links);
-+ scb->flags |= SCB_TIMEDOUT;
-+ }
-+ ahc_wakeup_recovery_thread(ahc);
-+ }
-+}
-+
-+/*
-+ * ahc_recover_commands determines if any of the commands that have currently
-+ * timedout are the root cause for this timeout. Innocent commands are given
-+ * a new timeout while we wait for the command executing on the bus to timeout.
-+ * This routine is invoked from a thread context so we are allowed to sleep.
-+ * Our lock is not held on entry.
-+ */
-+void
-+ahc_recover_commands(struct ahc_softc *ahc)
-+{
-+ struct scb *scb;
-+ long s;
-+ int found;
-+ int restart_needed;
-+ u_int last_phase;
-+
-+ ahc_lock(ahc, &s);
-+
-+ /*
-+ * Pause the controller and manually flush any
-+ * commands that have just completed but that our
-+ * interrupt handler has yet to see.
-+ */
-+ ahc_pause_and_flushwork(ahc);
-+
-+ if (LIST_EMPTY(&ahc->timedout_scbs) != 0) {
-+ /*
-+ * The timedout commands have already
-+ * completed. This typically means
-+ * that either the timeout value was on
-+ * the hairy edge of what the device
-+ * requires or - more likely - interrupts
-+ * are not happening.
-+ */
-+ printf("%s: Timedout SCBs already complete. "
-+ "Interrupts may not be functioning.\n", ahc_name(ahc));
-+ ahc_unpause(ahc);
-+ ahc_unlock(ahc, &s);
-+ return;
-+ }
-+
-+ restart_needed = 0;
-+ printf("%s: Recovery Initiated\n", ahc_name(ahc));
-+ ahc_dump_card_state(ahc);
-+
-+ last_phase = ahc_inb(ahc, LASTPHASE);
-+ while ((scb = LIST_FIRST(&ahc->timedout_scbs)) != NULL) {
-+ u_int active_scb_index;
-+ u_int saved_scbptr;
-+ int target;
-+ int lun;
-+ int i;
-+ char channel;
-+
-+ target = SCB_GET_TARGET(ahc, scb);
-+ channel = SCB_GET_CHANNEL(ahc, scb);
-+ lun = SCB_GET_LUN(scb);
-+
-+ ahc_print_path(ahc, scb);
-+ printf("SCB 0x%x - timed out\n", scb->hscb->tag);
-+ if (scb->sg_count > 0) {
-+ for (i = 0; i < scb->sg_count; i++) {
-+ printf("sg[%d] - Addr 0x%x : Length %d\n",
-+ i,
-+ scb->sg_list[i].addr,
-+ scb->sg_list[i].len & AHC_SG_LEN_MASK);
-+ }
-+ }
-+ if (scb->flags & (SCB_DEVICE_RESET|SCB_ABORT)) {
-+ /*
-+ * Been down this road before.
-+ * Do a full bus reset.
-+ */
-+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-+bus_reset:
-+ found = ahc_reset_channel(ahc, channel,
-+ /*Initiate Reset*/TRUE);
-+ printf("%s: Issued Channel %c Bus Reset. "
-+ "%d SCBs aborted\n", ahc_name(ahc), channel,
-+ found);
-+ continue;
-+ }
-+
-+ /*
-+ * Remove the command from the timedout list in
-+ * preparation for requeing it.
-+ */
-+ LIST_REMOVE(scb, timedout_links);
-+ scb->flags &= ~SCB_TIMEDOUT;
-+
-+ /*
-+ * If we are a target, transition to bus free and report
-+ * the timeout.
-+ *
-+ * The target/initiator that is holding up the bus may not
-+ * be the same as the one that triggered this timeout
-+ * (different commands have different timeout lengths).
-+ * If the bus is idle and we are actiing as the initiator
-+ * for this request, queue a BDR message to the timed out
-+ * target. Otherwise, if the timed out transaction is
-+ * active:
-+ * Initiator transaction:
-+ * Stuff the message buffer with a BDR message and assert
-+ * ATN in the hopes that the target will let go of the bus
-+ * and go to the mesgout phase. If this fails, we'll
-+ * get another timeout 2 seconds later which will attempt
-+ * a bus reset.
-+ *
-+ * Target transaction:
-+ * Transition to BUS FREE and report the error.
-+ * It's good to be the target!
-+ */
-+ saved_scbptr = ahc_inb(ahc, SCBPTR);
-+ active_scb_index = ahc_inb(ahc, SCB_TAG);
-+
-+ if ((ahc_inb(ahc, SEQ_FLAGS) & NOT_IDENTIFIED) == 0
-+ && (active_scb_index < ahc->scb_data->numscbs)) {
-+ struct scb *active_scb;
-+
-+ /*
-+ * If the active SCB is not us, assume that
-+ * the active SCB has a longer timeout than
-+ * the timedout SCB, and wait for the active
-+ * SCB to timeout.
-+ */
-+ active_scb = ahc_lookup_scb(ahc, active_scb_index);
-+ if (active_scb != scb) {
-+ u_int newtimeout;
-+
-+ ahc_print_path(ahc, scb);
-+ printf("Other SCB Timeout%s",
-+ (scb->flags & SCB_OTHERTCL_TIMEOUT) != 0
-+ ? " again\n" : "\n");
-+ scb->flags |= SCB_OTHERTCL_TIMEOUT;
-+ newtimeout =
-+ MAX(aic_get_timeout(active_scb),
-+ aic_get_timeout(scb));
-+ aic_scb_timer_reset(scb, newtimeout);
-+ continue;
-+ }
-+
-+ /* It's us */
-+ if ((scb->flags & SCB_TARGET_SCB) != 0) {
-+
-+ /*
-+ * Send back any queued up transactions
-+ * and properly record the error condition.
-+ */
-+ ahc_abort_scbs(ahc, SCB_GET_TARGET(ahc, scb),
-+ SCB_GET_CHANNEL(ahc, scb),
-+ SCB_GET_LUN(scb),
-+ scb->hscb->tag,
-+ ROLE_TARGET,
-+ CAM_CMD_TIMEOUT);
-+
-+ /* Will clear us from the bus */
-+ restart_needed = 1;
-+ break;
-+ }
-+
-+ ahc_set_recoveryscb(ahc, active_scb);
-+ ahc_outb(ahc, MSG_OUT, HOST_MSG);
-+ ahc_outb(ahc, SCSISIGO, last_phase|ATNO);
-+ ahc_print_path(ahc, active_scb);
-+ printf("BDR message in message buffer\n");
-+ active_scb->flags |= SCB_DEVICE_RESET;
-+ aic_scb_timer_reset(scb, 2 * 1000000);
-+ } else if (last_phase != P_BUSFREE
-+ && (ahc_inb(ahc, SSTAT1) & REQINIT) == 0) {
-+ /*
-+ * SCB is not identified, there
-+ * is no pending REQ, and the sequencer
-+ * has not seen a busfree. Looks like
-+ * a stuck connection waiting to
-+ * go busfree. Reset the bus.
-+ */
-+ printf("%s: Connection stuck awaiting busfree or "
-+ "Identify Msg.\n", ahc_name(ahc));
-+ goto bus_reset;
-+ } else {
-+ int disconnected;
-+
-+ if (last_phase != P_BUSFREE
-+ && (ahc_inb(ahc, SSTAT0) & TARGET) != 0) {
-+ /* Hung target selection. Goto busfree */
-+ printf("%s: Hung target selection\n",
-+ ahc_name(ahc));
-+ restart_needed = 1;
-+ break;
-+ }
-+
-+ /* XXX Shouldn't panic. Just punt instead? */
-+ if ((scb->flags & SCB_TARGET_SCB) != 0)
-+ panic("Timed-out target SCB but bus idle");
-+
-+ if (ahc_search_qinfifo(ahc, target, channel, lun,
-+ scb->hscb->tag, ROLE_INITIATOR,
-+ /*status*/0, SEARCH_COUNT) > 0) {
-+ disconnected = FALSE;
-+ } else {
-+ disconnected = TRUE;
-+ }
-+
-+ if (disconnected) {
-+
-+ ahc_set_recoveryscb(ahc, scb);
-+ /*
-+ * Actually re-queue this SCB in an attempt
-+ * to select the device before it reconnects.
-+ * In either case (selection or reselection),
-+ * we will now issue a target reset to the
-+ * timed-out device.
-+ *
-+ * Set the MK_MESSAGE control bit indicating
-+ * that we desire to send a message. We
-+ * also set the disconnected flag since
-+ * in the paging case there is no guarantee
-+ * that our SCB control byte matches the
-+ * version on the card. We don't want the
-+ * sequencer to abort the command thinking
-+ * an unsolicited reselection occurred.
-+ */
-+ scb->hscb->control |= MK_MESSAGE|DISCONNECTED;
-+ scb->flags |= SCB_DEVICE_RESET;
-+
-+ /*
-+ * Remove any cached copy of this SCB in the
-+ * disconnected list in preparation for the
-+ * queuing of our abort SCB. We use the
-+ * same element in the SCB, SCB_NEXT, for
-+ * both the qinfifo and the disconnected list.
-+ */
-+ ahc_search_disc_list(ahc, target, channel,
-+ lun, scb->hscb->tag,
-+ /*stop_on_first*/TRUE,
-+ /*remove*/TRUE,
-+ /*save_state*/FALSE);
-+
-+ /*
-+ * In the non-paging case, the sequencer will
-+ * never re-reference the in-core SCB.
-+ * To make sure we are notified during
-+ * reslection, set the MK_MESSAGE flag in
-+ * the card's copy of the SCB.
-+ */
-+ if ((ahc->flags & AHC_PAGESCBS) == 0) {
-+ ahc_outb(ahc, SCBPTR, scb->hscb->tag);
-+ ahc_outb(ahc, SCB_CONTROL,
-+ ahc_inb(ahc, SCB_CONTROL)
-+ | MK_MESSAGE);
-+ }
-+
-+ /*
-+ * Clear out any entries in the QINFIFO first
-+ * so we are the next SCB for this target
-+ * to run.
-+ */
-+ ahc_search_qinfifo(ahc,
-+ SCB_GET_TARGET(ahc, scb),
-+ channel, SCB_GET_LUN(scb),
-+ SCB_LIST_NULL,
-+ ROLE_INITIATOR,
-+ CAM_REQUEUE_REQ,
-+ SEARCH_COMPLETE);
-+ ahc_print_path(ahc, scb);
-+ printf("Queuing a BDR SCB\n");
-+ ahc_qinfifo_requeue_tail(ahc, scb);
-+ ahc_outb(ahc, SCBPTR, saved_scbptr);
-+ aic_scb_timer_reset(scb, 2 * 1000000);
-+ } else {
-+ /* Go "immediatly" to the bus reset */
-+ /* This shouldn't happen */
-+ ahc_set_recoveryscb(ahc, scb);
-+ ahc_print_path(ahc, scb);
-+ printf("SCB %d: Immediate reset. "
-+ "Flags = 0x%x\n", scb->hscb->tag,
-+ scb->flags);
-+ goto bus_reset;
-+ }
-+ }
-+ break;
-+ }
-+
-+ /*
-+ * Any remaining SCBs were not the "culprit", so remove
-+ * them from the timeout list. The timer for these commands
-+ * will be reset once the recovery SCB completes.
-+ */
-+ while ((scb = LIST_FIRST(&ahc->timedout_scbs)) != NULL) {
-+
-+ LIST_REMOVE(scb, timedout_links);
-+ scb->flags &= ~SCB_TIMEDOUT;
-+ }
-+
-+ if (restart_needed)
-+ ahc_restart(ahc);
-+ else
-+ ahc_unpause(ahc);
-+ ahc_unlock(ahc, &s);
-+}
-+
- /************************* Target Mode ****************************************/
- #ifdef AHC_TARGET_MODE
- cam_status
-@@ -6968,11 +7310,12 @@ ahc_handle_en_lun(struct ahc_softc *ahc,
- */
- ahc->flags = saved_flags;
- (void)ahc_loadseq(ahc);
-- ahc_unpause(ahc);
-+ ahc_restart(ahc);
- ahc_unlock(ahc, &s);
- ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
- return;
- }
-+ ahc_restart(ahc);
- ahc_unlock(ahc, &s);
- }
- cel = &ccb->cel;
-@@ -7207,12 +7550,16 @@ ahc_handle_en_lun(struct ahc_softc *ahc,
- printf("Configuring Initiator Mode\n");
- ahc->flags &= ~AHC_TARGETROLE;
- ahc->flags |= AHC_INITIATORROLE;
-- ahc_pause(ahc);
- /*
- * Returning to a configuration that
- * fit previously will always succeed.
- */
- (void)ahc_loadseq(ahc);
-+ ahc_restart(ahc);
-+ /*
-+ * Unpaused. The extra unpause
-+ * that follows is harmless.
-+ */
- }
- }
- ahc_unpause(ahc);
-@@ -7282,7 +7629,7 @@ ahc_run_tqinfifo(struct ahc_softc *ahc,
- break;
-
- cmd->cmd_valid = 0;
-- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
-+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
- ahc->shared_data_dmamap,
- ahc_targetcmd_offset(ahc, ahc->tqinfifonext),
- sizeof(struct target_cmd),
-@@ -7419,7 +7766,7 @@ ahc_handle_target_cmd(struct ahc_softc *
- initiator, target, lun, ahc->pending_device);
- #endif
- ahc->pending_device = lstate;
-- ahc_freeze_ccb((union ccb *)atio);
-+ aic_freeze_ccb((union ccb *)atio);
- atio->ccb_h.flags |= CAM_DIS_DISCONNECT;
- }
- xpt_done((union ccb*)atio);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx.h 2003-06-14 12:18:22.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx.h 2003-12-28 23:21:39.000000000 -0800
-@@ -37,7 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#77 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#85 $
- *
- * $FreeBSD$
- */
-@@ -243,7 +243,7 @@ typedef enum {
- */
- AHC_AIC7850_FE = AHC_SPIOCAP|AHC_AUTOPAUSE|AHC_TARGETMODE|AHC_ULTRA,
- AHC_AIC7860_FE = AHC_AIC7850_FE,
-- AHC_AIC7870_FE = AHC_TARGETMODE,
-+ AHC_AIC7870_FE = AHC_TARGETMODE|AHC_AUTOPAUSE,
- AHC_AIC7880_FE = AHC_AIC7870_FE|AHC_ULTRA,
- /*
- * Although we have space for both the initiator and
-@@ -366,7 +366,8 @@ typedef enum {
- AHC_SCB_CONFIG_USED = 0x4000000, /* No SEEPROM but SCB2 had info. */
- AHC_NO_BIOS_INIT = 0x8000000, /* No BIOS left over settings. */
- AHC_DISABLE_PCI_PERR = 0x10000000,
-- AHC_HAS_TERM_LOGIC = 0x20000000
-+ AHC_HAS_TERM_LOGIC = 0x20000000,
-+ AHC_SHUTDOWN_RECOVERY = 0x40000000 /* Terminate recovery thread. */
- } ahc_flag;
-
- /************************* Hardware SCB Definition ***************************/
-@@ -411,6 +412,7 @@ struct target_data {
- uint8_t initiator_tag; /* Initiator's transaction tag */
- };
-
-+#define MAX_CDB_LEN 16
- struct hardware_scb {
- /*0*/ union {
- /*
-@@ -530,7 +532,7 @@ struct sg_map_node {
- * The current state of this SCB.
- */
- typedef enum {
-- SCB_FREE = 0x0000,
-+ SCB_FLAG_NONE = 0x0000,
- SCB_OTHERTCL_TIMEOUT = 0x0002,/*
- * Another device was active
- * during the first timeout for
-@@ -560,12 +562,16 @@ typedef enum {
- * to report the error.
- */
- SCB_TARGET_SCB = 0x2000,
-- SCB_SILENT = 0x4000 /*
-+ SCB_SILENT = 0x4000,/*
- * Be quiet about transmission type
- * errors. They are expected and we
- * don't want to upset the user. This
- * flag is typically used during DV.
- */
-+ SCB_TIMEDOUT = 0x8000 /*
-+ * SCB has timed out and is on the
-+ * timedout list.
-+ */
- } scb_flag;
-
- struct scb {
-@@ -575,7 +581,8 @@ struct scb {
- TAILQ_ENTRY(scb) tqe;
- } links;
- LIST_ENTRY(scb) pending_links;
-- ahc_io_ctx_t io_ctx;
-+ LIST_ENTRY(scb) timedout_links;
-+ aic_io_ctx_t io_ctx;
- struct ahc_softc *ahc_softc;
- scb_flag flags;
- #ifndef __linux__
-@@ -929,6 +936,11 @@ struct ahc_softc {
- LIST_HEAD(, scb) pending_scbs;
-
- /*
-+ * SCBs whose timeout routine has been called.
-+ */
-+ LIST_HEAD(, scb) timedout_scbs;
-+
-+ /*
- * Counting lock for deferring the release of additional
- * untagged transactions from the untagged_queues. When
- * the lock is decremented to 0, all queues in the
-@@ -958,7 +970,7 @@ struct ahc_softc {
- /*
- * Platform specific device information.
- */
-- ahc_dev_softc_t dev_softc;
-+ aic_dev_softc_t dev_softc;
-
- /*
- * Bus specific device information.
-@@ -1135,6 +1147,9 @@ struct ahc_devinfo {
- };
-
- /****************************** PCI Structures ********************************/
-+#define AHC_PCI_IOADDR PCIR_BAR(0) /* I/O Address */
-+#define AHC_PCI_MEMADDR PCIR_BAR(1) /* Mem I/O Address */
-+
- typedef int (ahc_device_setup_t)(struct ahc_softc *);
-
- struct ahc_pci_identity {
-@@ -1143,17 +1158,17 @@ struct ahc_pci_identity {
- char *name;
- ahc_device_setup_t *setup;
- };
--extern struct ahc_pci_identity ahc_pci_ident_table [];
-+extern struct ahc_pci_identity ahc_pci_ident_table[];
- extern const u_int ahc_num_pci_devs;
-
- /***************************** VL/EISA Declarations ***************************/
- struct aic7770_identity {
- uint32_t full_id;
- uint32_t id_mask;
-- char *name;
-+ const char *name;
- ahc_device_setup_t *setup;
- };
--extern struct aic7770_identity aic7770_ident_table [];
-+extern struct aic7770_identity aic7770_ident_table[];
- extern const int ahc_num_aic7770_devs;
-
- #define AHC_EISA_SLOT_OFFSET 0xc00
-@@ -1167,7 +1182,7 @@ void ahc_busy_tcl(struct ahc_softc *ah
- u_int tcl, u_int busyid);
-
- /***************************** PCI Front End *********************************/
--struct ahc_pci_identity *ahc_find_pci_device(ahc_dev_softc_t);
-+struct ahc_pci_identity *ahc_find_pci_device(aic_dev_softc_t);
- int ahc_pci_config(struct ahc_softc *,
- struct ahc_pci_identity *);
- int ahc_pci_test_register_access(struct ahc_softc *);
-@@ -1205,7 +1220,7 @@ void ahc_set_unit(struct ahc_softc *,
- void ahc_set_name(struct ahc_softc *, char *);
- void ahc_alloc_scbs(struct ahc_softc *ahc);
- void ahc_free(struct ahc_softc *ahc);
--int ahc_reset(struct ahc_softc *ahc);
-+int ahc_reset(struct ahc_softc *ahc, int reinit);
- void ahc_shutdown(void *arg);
-
- /*************************** Interrupt Services *******************************/
-@@ -1231,7 +1246,7 @@ int ahc_search_qinfifo(struct ahc_soft
- role_t role, uint32_t status,
- ahc_search_action action);
- int ahc_search_untagged_queues(struct ahc_softc *ahc,
-- ahc_io_ctx_t ctx,
-+ aic_io_ctx_t ctx,
- int target, char channel,
- int lun, uint32_t status,
- ahc_search_action action);
-@@ -1248,6 +1263,8 @@ int ahc_abort_scbs(struct ahc_softc *a
- void ahc_restart(struct ahc_softc *ahc);
- void ahc_calc_residual(struct ahc_softc *ahc,
- struct scb *scb);
-+void ahc_timeout(struct scb *scb);
-+void ahc_recover_commands(struct ahc_softc *ahc);
- /*************************** Utility Functions ********************************/
- struct ahc_phase_table_entry*
- ahc_lookup_phase_entry(int phase);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_inline.h 2003-06-14 12:18:51.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_inline.h 2003-12-28 23:21:39.000000000 -0800
-@@ -37,7 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_inline.h#43 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_inline.h#47 $
- *
- * $FreeBSD$
- */
-@@ -196,7 +196,7 @@ ahc_hscb_busaddr(struct ahc_softc *ahc,
- static __inline void
- ahc_sync_scb(struct ahc_softc *ahc, struct scb *scb, int op)
- {
-- ahc_dmamap_sync(ahc, ahc->scb_data->hscb_dmat,
-+ aic_dmamap_sync(ahc, ahc->scb_data->hscb_dmat,
- ahc->scb_data->hscb_dmamap,
- /*offset*/(scb->hscb - ahc->hscbs) * sizeof(*scb->hscb),
- /*len*/sizeof(*scb->hscb), op);
-@@ -208,7 +208,7 @@ ahc_sync_sglist(struct ahc_softc *ahc, s
- if (scb->sg_count == 0)
- return;
-
-- ahc_dmamap_sync(ahc, ahc->scb_data->sg_dmat, scb->sg_map->sg_dmamap,
-+ aic_dmamap_sync(ahc, ahc->scb_data->sg_dmat, scb->sg_map->sg_dmamap,
- /*offset*/(scb->sg_list - scb->sg_map->sg_vaddr)
- * sizeof(struct ahc_dma_seg),
- /*len*/sizeof(struct ahc_dma_seg) * scb->sg_count, op);
-@@ -272,7 +272,7 @@ ahc_update_residual(struct ahc_softc *ah
- {
- uint32_t sgptr;
-
-- sgptr = ahc_le32toh(scb->hscb->sgptr);
-+ sgptr = aic_le32toh(scb->hscb->sgptr);
- if ((sgptr & SG_RESID_VALID) != 0)
- ahc_calc_residual(ahc, scb);
- }
-@@ -383,13 +383,13 @@ ahc_free_scb(struct ahc_softc *ahc, stru
- hscb = scb->hscb;
- /* Clean up for the next user */
- ahc->scb_data->scbindex[hscb->tag] = NULL;
-- scb->flags = SCB_FREE;
-+ scb->flags = SCB_FLAG_NONE;
- hscb->control = 0;
-
- SLIST_INSERT_HEAD(&ahc->scb_data->free_scbs, scb, links.sle);
-
- /* Notify the OSM that a resource is now available. */
-- ahc_platform_scb_free(ahc, scb);
-+ aic_platform_scb_free(ahc, scb);
- }
-
- static __inline struct scb *
-@@ -427,7 +427,7 @@ ahc_swap_with_next_hscb(struct ahc_softc
- memcpy(q_hscb, scb->hscb, sizeof(*scb->hscb));
- if ((scb->flags & SCB_CDB32_PTR) != 0) {
- q_hscb->shared_data.cdb_ptr =
-- ahc_htole32(ahc_hscb_busaddr(ahc, q_hscb->tag)
-+ aic_htole32(ahc_hscb_busaddr(ahc, q_hscb->tag)
- + offsetof(struct hardware_scb, cdb32));
- }
- q_hscb->tag = saved_tag;
-@@ -458,7 +458,7 @@ ahc_queue_scb(struct ahc_softc *ahc, str
- * Setup data "oddness".
- */
- scb->hscb->lun &= LID;
-- if (ahc_get_transfer_length(scb) & 0x1)
-+ if (aic_get_transfer_length(scb) & 0x1)
- scb->hscb->lun |= SCB_XFERLEN_ODD;
-
- /*
-@@ -512,7 +512,7 @@ static __inline int ahc_intr(struct ahc_
- static __inline void
- ahc_sync_qoutfifo(struct ahc_softc *ahc, int op)
- {
-- ahc_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
-+ aic_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
- /*offset*/0, /*len*/256, op);
- }
-
-@@ -521,7 +521,7 @@ ahc_sync_tqinfifo(struct ahc_softc *ahc,
- {
- #ifdef AHC_TARGET_MODE
- if ((ahc->flags & AHC_TARGETROLE) != 0) {
-- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
-+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
- ahc->shared_data_dmamap,
- ahc_targetcmd_offset(ahc, 0),
- sizeof(struct target_cmd) * AHC_TMODE_CMDS,
-@@ -542,7 +542,7 @@ ahc_check_cmdcmpltqueues(struct ahc_soft
- u_int retval;
-
- retval = 0;
-- ahc_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
-+ aic_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
- /*offset*/ahc->qoutfifonext, /*len*/1,
- BUS_DMASYNC_POSTREAD);
- if (ahc->qoutfifo[ahc->qoutfifonext] != SCB_LIST_NULL)
-@@ -550,7 +550,7 @@ ahc_check_cmdcmpltqueues(struct ahc_soft
- #ifdef AHC_TARGET_MODE
- if ((ahc->flags & AHC_TARGETROLE) != 0
- && (ahc->flags & AHC_TQINFIFO_BLOCKED) == 0) {
-- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
-+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
- ahc->shared_data_dmamap,
- ahc_targetcmd_offset(ahc, ahc->tqinfifofnext),
- /*len*/sizeof(struct target_cmd),
-@@ -593,7 +593,7 @@ ahc_intr(struct ahc_softc *ahc)
- }
-
- if ((intstat & INT_PEND) == 0) {
--#if AHC_PCI_CONFIG > 0
-+#if AIC_PCI_CONFIG > 0
- if (ahc->unsolicited_ints > 500) {
- ahc->unsolicited_ints = 0;
- if ((ahc->chip & AHC_PCI) != 0
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_osm.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_osm.c 2003-12-28 23:21:40.000000000 -0800
-@@ -1,7 +1,7 @@
- /*
- * Adaptec AIC7xxx device driver for Linux.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#232 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#256 $
- *
- * Copyright (c) 1994 John Aycock
- * The University of Calgary Department of Computer Science.
-@@ -139,7 +139,16 @@
- #endif
-
- #include <linux/mm.h> /* For fetching system memory size */
--#include <linux/blkdev.h> /* For block_size() */
-+
-+/************************* Magic SysReq Support *******************************/
-+static struct aic_sysrq_key_op ahc_sysrq_op =
-+{
-+ aic_sysrq_handler,
-+ "aic7xxxstatedump",
-+ "Dump aic7xxx controller information to Console"
-+};
-+
-+static int ahc_sysrq_key;
-
- /*
- * Lock protecting manipulation of the ahc softc list.
-@@ -293,7 +302,7 @@ static adapter_tag_info_t aic7xxx_tag_in
- #define AIC7XXX_CONFIGED_DV -1
- #endif
-
--static uint8_t aic7xxx_dv_settings[] =
-+static int8_t aic7xxx_dv_settings[] =
- {
- AIC7XXX_CONFIGED_DV,
- AIC7XXX_CONFIGED_DV,
-@@ -391,9 +400,9 @@ static uint32_t aic7xxx_pci_parity = ~0;
- * would result in never finding any devices :)
- */
- #ifndef CONFIG_AIC7XXX_PROBE_EISA_VL
--static uint32_t aic7xxx_probe_eisa_vl;
-+uint32_t aic7xxx_probe_eisa_vl;
- #else
--static uint32_t aic7xxx_probe_eisa_vl = ~0;
-+uint32_t aic7xxx_probe_eisa_vl = ~0;
- #endif
-
- /*
-@@ -482,35 +491,32 @@ MODULE_PARM_DESC(aic7xxx,
- #endif
-
- static void ahc_linux_handle_scsi_status(struct ahc_softc *,
-- struct ahc_linux_device *,
-+ struct aic_linux_device *,
- struct scb *);
- static void ahc_linux_queue_cmd_complete(struct ahc_softc *ahc,
- Scsi_Cmnd *cmd);
- static void ahc_linux_filter_inquiry(struct ahc_softc*, struct ahc_devinfo*);
- static void ahc_linux_sem_timeout(u_long arg);
--static void ahc_linux_freeze_simq(struct ahc_softc *ahc);
--static void ahc_linux_release_simq(u_long arg);
- static void ahc_linux_dev_timed_unfreeze(u_long arg);
- static int ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag);
- static void ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc);
- static void ahc_linux_size_nseg(void);
- static void ahc_linux_thread_run_complete_queue(struct ahc_softc *ahc);
- static void ahc_linux_start_dv(struct ahc_softc *ahc);
--static void ahc_linux_dv_timeout(struct scsi_cmnd *cmd);
- static int ahc_linux_dv_thread(void *data);
- static void ahc_linux_kill_dv_thread(struct ahc_softc *ahc);
- static void ahc_linux_dv_target(struct ahc_softc *ahc, u_int target);
- static void ahc_linux_dv_transition(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahc_linux_dv_fill_cmd(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo);
- static void ahc_linux_dv_inq(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ,
-+ struct aic_linux_target *targ,
- u_int request_length);
- static void ahc_linux_dv_tur(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
-@@ -518,58 +524,48 @@ static void ahc_linux_dv_tur(struct ahc_
- static void ahc_linux_dv_rebd(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahc_linux_dv_web(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahc_linux_dv_reb(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ);
-+ struct aic_linux_target *targ);
- static void ahc_linux_dv_su(struct ahc_softc *ahc,
- struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ);
-+ struct aic_linux_target *targ);
- static int ahc_linux_fallback(struct ahc_softc *ahc,
- struct ahc_devinfo *devinfo);
--static void ahc_linux_dv_complete(Scsi_Cmnd *cmd);
--static void ahc_linux_generate_dv_pattern(struct ahc_linux_target *targ);
-+static void ahc_linux_generate_dv_pattern(struct aic_linux_target *targ);
- static u_int ahc_linux_user_tagdepth(struct ahc_softc *ahc,
- struct ahc_devinfo *devinfo);
- static u_int ahc_linux_user_dv_setting(struct ahc_softc *ahc);
--static void ahc_linux_device_queue_depth(struct ahc_softc *ahc,
-- struct ahc_linux_device *dev);
--static struct ahc_linux_target* ahc_linux_alloc_target(struct ahc_softc*,
-+static void aic_linux_device_queue_depth(struct ahc_softc *ahc,
-+ struct aic_linux_device *dev);
-+static struct aic_linux_target* ahc_linux_alloc_target(struct ahc_softc*,
- u_int, u_int);
- static void ahc_linux_free_target(struct ahc_softc*,
-- struct ahc_linux_target*);
--static struct ahc_linux_device* ahc_linux_alloc_device(struct ahc_softc*,
-- struct ahc_linux_target*,
-+ struct aic_linux_target*);
-+static struct aic_linux_device* ahc_linux_alloc_device(struct ahc_softc*,
-+ struct aic_linux_target*,
- u_int);
- static void ahc_linux_free_device(struct ahc_softc*,
-- struct ahc_linux_device*);
--static void ahc_linux_run_device_queue(struct ahc_softc*,
-- struct ahc_linux_device*);
-+ struct aic_linux_device*);
- static void ahc_linux_setup_tag_info_global(char *p);
- static aic_option_callback_t ahc_linux_setup_tag_info;
- static aic_option_callback_t ahc_linux_setup_dv;
- static int aic7xxx_setup(char *s);
- static int ahc_linux_next_unit(void);
--static void ahc_runq_tasklet(unsigned long data);
--static struct ahc_cmd *ahc_linux_run_complete_queue(struct ahc_softc *ahc);
-+static struct aic_cmd *ahc_linux_run_complete_queue(struct ahc_softc *ahc);
-
- /********************************* Inlines ************************************/
--static __inline void ahc_schedule_runq(struct ahc_softc *ahc);
--static __inline struct ahc_linux_device*
-+static __inline struct aic_linux_device*
- ahc_linux_get_device(struct ahc_softc *ahc, u_int channel,
- u_int target, u_int lun, int alloc);
- static __inline void ahc_schedule_completeq(struct ahc_softc *ahc);
--static __inline void ahc_linux_check_device_queue(struct ahc_softc *ahc,
-- struct ahc_linux_device *dev);
--static __inline struct ahc_linux_device *
-- ahc_linux_next_device_to_run(struct ahc_softc *ahc);
--static __inline void ahc_linux_run_device_queues(struct ahc_softc *ahc);
- static __inline void ahc_linux_unmap_scb(struct ahc_softc*, struct scb*);
-
- static __inline int ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
-@@ -579,35 +575,19 @@ static __inline int ahc_linux_map_seg(st
- static __inline void
- ahc_schedule_completeq(struct ahc_softc *ahc)
- {
-- if ((ahc->platform_data->flags & AHC_RUN_CMPLT_Q_TIMER) == 0) {
-- ahc->platform_data->flags |= AHC_RUN_CMPLT_Q_TIMER;
-+ if ((ahc->platform_data->flags & AIC_RUN_CMPLT_Q_TIMER) == 0) {
-+ ahc->platform_data->flags |= AIC_RUN_CMPLT_Q_TIMER;
- ahc->platform_data->completeq_timer.expires = jiffies;
- add_timer(&ahc->platform_data->completeq_timer);
- }
- }
-
--/*
-- * Must be called with our lock held.
-- */
--static __inline void
--ahc_schedule_runq(struct ahc_softc *ahc)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- tasklet_schedule(&ahc->platform_data->runq_tasklet);
--#else
-- /*
-- * Tasklets are not available, so run inline.
-- */
-- ahc_runq_tasklet((unsigned long)ahc);
--#endif
--}
--
--static __inline struct ahc_linux_device*
-+static __inline struct aic_linux_device*
- ahc_linux_get_device(struct ahc_softc *ahc, u_int channel, u_int target,
- u_int lun, int alloc)
- {
-- struct ahc_linux_target *targ;
-- struct ahc_linux_device *dev;
-+ struct aic_linux_target *targ;
-+ struct aic_linux_device *dev;
- u_int target_offset;
-
- target_offset = target;
-@@ -629,10 +609,10 @@ ahc_linux_get_device(struct ahc_softc *a
- }
-
- #define AHC_LINUX_MAX_RETURNED_ERRORS 4
--static struct ahc_cmd *
-+static struct aic_cmd *
- ahc_linux_run_complete_queue(struct ahc_softc *ahc)
- {
-- struct ahc_cmd *acmd;
-+ struct aic_cmd *acmd;
- u_long done_flags;
- int with_errors;
-
-@@ -657,7 +637,7 @@ ahc_linux_run_complete_queue(struct ahc_
- acmd, acmd_links.tqe);
- cmd = &acmd_scsi_cmd(acmd);
- cmd->host_scribble = NULL;
-- if (ahc_cmd_get_transaction_status(cmd) != DID_OK
-+ if (aic_cmd_get_transaction_status(cmd) != DID_OK
- || (cmd->result & 0xFF) != SCSI_STATUS_OK)
- with_errors++;
-
-@@ -666,47 +646,6 @@ ahc_linux_run_complete_queue(struct ahc_
- ahc_done_unlock(ahc, &done_flags);
- return (acmd);
- }
--
--static __inline void
--ahc_linux_check_device_queue(struct ahc_softc *ahc,
-- struct ahc_linux_device *dev)
--{
-- if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) != 0
-- && dev->active == 0) {
-- dev->flags &= ~AHC_DEV_FREEZE_TIL_EMPTY;
-- dev->qfrozen--;
-- }
--
-- if (TAILQ_FIRST(&dev->busyq) == NULL
-- || dev->openings == 0 || dev->qfrozen != 0)
-- return;
--
-- ahc_linux_run_device_queue(ahc, dev);
--}
--
--static __inline struct ahc_linux_device *
--ahc_linux_next_device_to_run(struct ahc_softc *ahc)
--{
--
-- if ((ahc->flags & AHC_RESOURCE_SHORTAGE) != 0
-- || (ahc->platform_data->qfrozen != 0
-- && AHC_DV_SIMQ_FROZEN(ahc) == 0))
-- return (NULL);
-- return (TAILQ_FIRST(&ahc->platform_data->device_runq));
--}
--
--static __inline void
--ahc_linux_run_device_queues(struct ahc_softc *ahc)
--{
-- struct ahc_linux_device *dev;
--
-- while ((dev = ahc_linux_next_device_to_run(ahc)) != NULL) {
-- TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
-- dev->flags &= ~AHC_DEV_ON_RUN_LIST;
-- ahc_linux_check_device_queue(ahc, dev);
-- }
--}
--
- static __inline void
- ahc_linux_unmap_scb(struct ahc_softc *ahc, struct scb *scb)
- {
-@@ -718,10 +657,10 @@ ahc_linux_unmap_scb(struct ahc_softc *ah
- struct scatterlist *sg;
-
- sg = (struct scatterlist *)cmd->request_buffer;
-- pci_unmap_sg(ahc->dev_softc, sg, cmd->use_sg,
-+ aic_unmap_sg(ahc, sg, cmd->use_sg,
- scsi_to_pci_dma_dir(cmd->sc_data_direction));
- } else if (cmd->request_bufflen != 0) {
-- pci_unmap_single(ahc->dev_softc,
-+ aic_unmap_single(ahc,
- scb->platform_data->buf_busaddr,
- cmd->request_bufflen,
- scsi_to_pci_dma_dir(cmd->sc_data_direction));
-@@ -739,20 +678,19 @@ ahc_linux_map_seg(struct ahc_softc *ahc,
- "Increase AHC_NSEG\n");
-
- consumed = 1;
-- sg->addr = ahc_htole32(addr & 0xFFFFFFFF);
-+ sg->addr = aic_htole32(addr & 0xFFFFFFFF);
- scb->platform_data->xfer_len += len;
-
- if (sizeof(bus_addr_t) > 4
- && (ahc->flags & AHC_39BIT_ADDRESSING) != 0)
- len |= (addr >> 8) & AHC_SG_HIGH_ADDR_MASK;
-
-- sg->len = ahc_htole32(len);
-+ sg->len = aic_htole32(len);
- return (consumed);
- }
-
- /************************ Host template entry points *************************/
- static int ahc_linux_detect(Scsi_Host_Template *);
--static int ahc_linux_release(struct Scsi_Host *);
- static int ahc_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
- static const char *ahc_linux_info(struct Scsi_Host *);
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-@@ -765,6 +703,7 @@ static int ahc_linux_biosparam(struct
- sector_t, int[]);
- #endif
- #else
-+static int ahc_linux_release(struct Scsi_Host *);
- static void ahc_linux_select_queue_depth(struct Scsi_Host *host,
- Scsi_Device *scsi_devs);
- #if defined(__i386__)
-@@ -836,6 +775,164 @@ ahc_linux_size_nseg(void)
- #endif
- }
-
-+/************************** Error Recovery ************************************/
-+static int ahc_linux_recovery_thread(void *arg);
-+
-+static int
-+ahc_linux_recovery_thread(void *arg)
-+{
-+ struct ahc_softc *ahc;
-+ u_long s;
-+
-+ ahc = (struct ahc_softc *)arg;
-+
-+ /*
-+ * Complete thread creation.
-+ */
-+ lock_kernel();
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,60)
-+ /*
-+ * Don't care about any signals.
-+ */
-+ siginitsetinv(¤t->blocked, 0);
-+
-+ daemonize();
-+ sprintf(current->comm, "ahc_recovery_%d", ahc->unit);
-+#else
-+ daemonize("ahc_recovery_%d", ahc->unit);
-+#endif
-+ unlock_kernel();
-+
-+ while (1) {
-+
-+ /*
-+ * Use down_interruptible() rather than down() to
-+ * avoid inclusion in the load average.
-+ */
-+ down_interruptible(&ahc->platform_data->recovery_sem);
-+
-+ ahc_lock(ahc, &s);
-+ if ((ahc->flags & AHC_SHUTDOWN_RECOVERY) != 0) {
-+ ahc_unlock(ahc, &s);
-+ break;
-+ }
-+
-+ /*
-+ * Don't bother the recovery handler if the
-+ * list has been cleared by a previous run
-+ * of the handler. This can happen when
-+ * several SCBs timeout before our handler
-+ * can run causing our semaphore to be up'ed
-+ * repeatedly. The extra calls need to be
-+ * avoided so that the recovery handler doesn't
-+ * confuse this case with timeouts occuring
-+ * due to interrupts failing to function.
-+ */
-+ if (LIST_EMPTY(&ahc->timedout_scbs) != 0) {
-+ ahc_unlock(ahc, &s);
-+ continue;
-+ }
-+ ahc_unlock(ahc, &s);
-+ ahc_recover_commands(ahc);
-+
-+ /*
-+ * Process any pent up completions.
-+ */
-+ ahc_lock(ahc, &s);
-+ aic_schedule_runq(ahc);
-+ ahc_linux_run_complete_queue(ahc);
-+ ahc_unlock(ahc, &s);
-+ }
-+ up(&ahc->platform_data->recovery_ending_sem);
-+ return(0);
-+}
-+
-+int
-+ahc_spawn_recovery_thread(struct ahc_softc *ahc)
-+{
-+ ahc->platform_data->recovery_pid =
-+ kernel_thread(ahc_linux_recovery_thread, ahc, 0);
-+
-+ if (ahc->platform_data->recovery_pid < 0)
-+ return (-ahc->platform_data->recovery_pid);
-+
-+ return (0);
-+}
-+
-+void
-+ahc_terminate_recovery_thread(struct ahc_softc *ahc)
-+{
-+ u_long s;
-+
-+ ahc_lock(ahc, &s);
-+ if (ahc->platform_data->recovery_pid != 0) {
-+ ahc->flags |= AHC_SHUTDOWN_RECOVERY;
-+ ahc_unlock(ahc, &s);
-+ up(&ahc->platform_data->recovery_sem);
-+
-+ /*
-+ * Use the recovery_ending_sem as an indicator that
-+ * the dv thread is exiting. Note that the dv
-+ * thread must still return after performing
-+ * the up on our semaphore before it has
-+ * completely exited this module. Unfortunately,
-+ * there seems to be no easy way to wait for the
-+ * exit of a thread for which you are not the
-+ * parent (dv threads are parented by init).
-+ * Cross your fingers...
-+ */
-+ down(&ahc->platform_data->recovery_ending_sem);
-+
-+ /*
-+ * Mark the recovery thread as already dead. This
-+ * avoids attempting to kill it a second time.
-+ * This is necessary because we must kill the
-+ * our threads before calling ahc_free() in the
-+ * module shutdown case to avoid bogus locking
-+ * in the SCSI mid-layer, but when ahc_free() is
-+ * called without killing the DV thread in the
-+ * instance detach case, so ahc_platform_free()
-+ * calls us again to verify that the DV thread
-+ * is dead.
-+ */
-+ ahc->platform_data->recovery_pid = 0;
-+ } else {
-+ ahc_unlock(ahc, &s);
-+ }
-+}
-+
-+void
-+ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb)
-+{
-+ if ((scb->flags & SCB_RECOVERY_SCB) == 0) {
-+ struct scb *list_scb;
-+
-+ scb->flags |= SCB_RECOVERY_SCB;
-+
-+ /*
-+ * Take all queued, but not sent SCBs out of the equation.
-+ * Also ensure that no new commands are queued to us while we
-+ * try to fix this problem.
-+ */
-+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) == 0) {
-+ aic_freeze_simq(ahc);
-+ scb->platform_data->flags |= AIC_RELEASE_SIMQ;
-+ }
-+
-+ /*
-+ * Go through all of our pending SCBs and remove
-+ * any scheduled timeouts for them. We will reschedule
-+ * them after we've successfully fixed this problem.
-+ */
-+ LIST_FOREACH(list_scb, &ahc->pending_scbs, pending_links) {
-+
-+ scsi_delete_timer(list_scb->io_ctx);
-+ list_scb->platform_data->flags &= ~AIC_TIMEOUT_ACTIVE;
-+ }
-+ }
-+}
-+
-+/************************ Linux Entry Points **********************************/
- /*
- * Try to detect an Adaptec 7XXX controller.
- */
-@@ -858,7 +955,7 @@ ahc_linux_detect(Scsi_Host_Template *tem
- * that some of our hacks^H^H^H^H^Hassumptions aren't
- * violated.
- */
-- if (offsetof(struct ahc_cmd_internal, end)
-+ if (offsetof(struct aic_cmd_internal, end)
- > offsetof(struct scsi_cmnd, host_scribble)) {
- printf("ahc_linux_detect: SCSI data structures changed.\n");
- printf("ahc_linux_detect: Unable to attach\n");
-@@ -895,8 +992,9 @@ ahc_linux_detect(Scsi_Host_Template *tem
- ahc_linux_pci_init();
- #endif
-
-- if (aic7xxx_probe_eisa_vl != 0)
-- aic7770_linux_probe(template);
-+#ifdef CONFIG_EISA
-+ ahc_linux_eisa_init();
-+#endif
-
- /*
- * Register with the SCSI layer all
-@@ -915,6 +1013,7 @@ ahc_linux_detect(Scsi_Host_Template *tem
- return (found);
- }
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
- /*
- * Free the passed in Scsi_Host memory structures prior to unloading the
- * module.
-@@ -925,7 +1024,6 @@ ahc_linux_release(struct Scsi_Host * hos
- struct ahc_softc *ahc;
- u_long l;
-
-- ahc_list_lock(&l);
- if (host != NULL) {
-
- /*
-@@ -933,19 +1031,23 @@ ahc_linux_release(struct Scsi_Host * hos
- * the free directly, but check our
- * list for extra sanity.
- */
-+ ahc_list_lock(&l);
- ahc = ahc_find_softc(*(struct ahc_softc **)host->hostdata);
- if (ahc != NULL) {
- u_long s;
-
-+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
-+ ahc_list_unlock(&l);
- ahc_lock(ahc, &s);
- ahc_intr_enable(ahc, FALSE);
- ahc_unlock(ahc, &s);
- ahc_free(ahc);
-- }
-+ } else
-+ ahc_list_unlock(&l);
- }
-- ahc_list_unlock(&l);
- return (0);
- }
-+#endif
-
- /*
- * Return a string describing the driver.
-@@ -982,7 +1084,7 @@ static int
- ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
- {
- struct ahc_softc *ahc;
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_long flags;
-
- ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
-@@ -1001,9 +1103,9 @@ ahc_linux_queue(Scsi_Cmnd * cmd, void (*
- * perform DV.
- */
- if (ahc->platform_data->qfrozen != 0
-- && AHC_DV_CMD(cmd) == 0) {
-+ && AIC_DV_CMD(cmd) == 0) {
-
-- ahc_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
-+ aic_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
- ahc_linux_queue_cmd_complete(ahc, cmd);
- ahc_schedule_completeq(ahc);
- ahc_midlayer_entrypoint_unlock(ahc, &flags);
-@@ -1012,7 +1114,8 @@ ahc_linux_queue(Scsi_Cmnd * cmd, void (*
- dev = ahc_linux_get_device(ahc, cmd->device->channel, cmd->device->id,
- cmd->device->lun, /*alloc*/TRUE);
- if (dev == NULL) {
-- ahc_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
-+
-+ aic_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
- ahc_linux_queue_cmd_complete(ahc, cmd);
- ahc_schedule_completeq(ahc);
- ahc_midlayer_entrypoint_unlock(ahc, &flags);
-@@ -1020,12 +1123,30 @@ ahc_linux_queue(Scsi_Cmnd * cmd, void (*
- ahc_name(ahc));
- return (0);
- }
-+
-+ if (cmd->cmd_len > MAX_CDB_LEN) {
-+
-+ aic_cmd_set_transaction_status(cmd, CAM_REQ_INVALID);
-+ ahc_linux_queue_cmd_complete(ahc, cmd);
-+ ahc_schedule_completeq(ahc);
-+ ahc_midlayer_entrypoint_unlock(ahc, &flags);
-+ printf("%s: aic7xxx_linux_queue -"
-+ "CDB length of %d exceeds max!\n",
-+ ahc_name(ahc), cmd->cmd_len);
-+ return (0);
-+ }
-+
-+ /*
-+ * We perform our own timeout handling.
-+ */
-+ scsi_delete_timer(cmd);
-+
- cmd->result = CAM_REQ_INPROG << 16;
-- TAILQ_INSERT_TAIL(&dev->busyq, (struct ahc_cmd *)cmd, acmd_links.tqe);
-- if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
-+ TAILQ_INSERT_TAIL(&dev->busyq, (struct aic_cmd *)cmd, acmd_links.tqe);
-+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
- TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
-- dev->flags |= AHC_DEV_ON_RUN_LIST;
-- ahc_linux_run_device_queues(ahc);
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
-+ aic_linux_run_device_queues(ahc);
- }
- ahc_midlayer_entrypoint_unlock(ahc, &flags);
- return (0);
-@@ -1047,7 +1168,7 @@ static int
- ahc_linux_slave_configure(Scsi_Device *device)
- {
- struct ahc_softc *ahc;
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_long flags;
-
- ahc = *((struct ahc_softc **)device->host->hostdata);
-@@ -1063,9 +1184,9 @@ ahc_linux_slave_configure(Scsi_Device *d
- device->id, device->lun,
- /*alloc*/TRUE);
- if (dev != NULL) {
-- dev->flags &= ~AHC_DEV_UNCONFIGURED;
-+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
- dev->scsi_device = device;
-- ahc_linux_device_queue_depth(ahc, dev);
-+ aic_linux_device_queue_depth(ahc, dev);
- }
- ahc_midlayer_entrypoint_unlock(ahc, &flags);
- return (0);
-@@ -1075,7 +1196,7 @@ static void
- ahc_linux_slave_destroy(Scsi_Device *device)
- {
- struct ahc_softc *ahc;
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_long flags;
-
- ahc = *((struct ahc_softc **)device->host->hostdata);
-@@ -1093,11 +1214,10 @@ ahc_linux_slave_destroy(Scsi_Device *dev
- * the refcounting process.
- */
- if (dev != NULL
-- && (dev->flags & AHC_DEV_SLAVE_CONFIGURED) != 0) {
-- dev->flags |= AHC_DEV_UNCONFIGURED;
-+ && (dev->flags & AIC_DEV_SLAVE_CONFIGURED) != 0) {
-+ dev->flags |= AIC_DEV_UNCONFIGURED;
- if (TAILQ_EMPTY(&dev->busyq)
-- && dev->active == 0
-- && (dev->flags & AHC_DEV_TIMER_ACTIVE) == 0)
-+ && dev->active == 0)
- ahc_linux_free_device(ahc, dev);
- }
- ahc_midlayer_entrypoint_unlock(ahc, &flags);
-@@ -1136,7 +1256,7 @@ ahc_linux_select_queue_depth(struct Scsi
- continue;
-
- if (device->host == host) {
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- /*
- * Since Linux has attached to the device, configure
-@@ -1147,13 +1267,13 @@ ahc_linux_select_queue_depth(struct Scsi
- device->id, device->lun,
- /*alloc*/TRUE);
- if (dev != NULL) {
-- dev->flags &= ~AHC_DEV_UNCONFIGURED;
-+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
- dev->scsi_device = device;
-- ahc_linux_device_queue_depth(ahc, dev);
-+ aic_linux_device_queue_depth(ahc, dev);
- device->queue_depth = dev->openings
- + dev->active;
-- if ((dev->flags & (AHC_DEV_Q_BASIC
-- | AHC_DEV_Q_TAGGED)) == 0) {
-+ if ((dev->flags & (AIC_DEV_Q_BASIC
-+ | AIC_DEV_Q_TAGGED)) == 0) {
- /*
- * We allow the OS to queue 2 untagged
- * transactions to us at any time even
-@@ -1291,63 +1411,8 @@ ahc_linux_bus_reset(Scsi_Cmnd *cmd)
- return SUCCESS;
- }
-
--Scsi_Host_Template aic7xxx_driver_template = {
-- .module = THIS_MODULE,
-- .name = "aic7xxx",
-- .proc_info = ahc_linux_proc_info,
-- .info = ahc_linux_info,
-- .queuecommand = ahc_linux_queue,
-- .eh_abort_handler = ahc_linux_abort,
-- .eh_device_reset_handler = ahc_linux_dev_reset,
-- .eh_bus_reset_handler = ahc_linux_bus_reset,
--#if defined(__i386__)
-- .bios_param = ahc_linux_biosparam,
--#endif
-- .can_queue = AHC_MAX_QUEUE,
-- .this_id = -1,
-- .cmd_per_lun = 2,
-- .use_clustering = ENABLE_CLUSTERING,
-- .slave_alloc = ahc_linux_slave_alloc,
-- .slave_configure = ahc_linux_slave_configure,
-- .slave_destroy = ahc_linux_slave_destroy,
--};
--
--/**************************** Tasklet Handler *********************************/
--
--/*
-- * In 2.4.X and above, this routine is called from a tasklet,
-- * so we must re-acquire our lock prior to executing this code.
-- * In all prior kernels, ahc_schedule_runq() calls this routine
-- * directly and ahc_schedule_runq() is called with our lock held.
-- */
--static void
--ahc_runq_tasklet(unsigned long data)
--{
-- struct ahc_softc* ahc;
-- struct ahc_linux_device *dev;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- u_long flags;
--#endif
--
-- ahc = (struct ahc_softc *)data;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- ahc_lock(ahc, &flags);
--#endif
-- while ((dev = ahc_linux_next_device_to_run(ahc)) != NULL) {
--
-- TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
-- dev->flags &= ~AHC_DEV_ON_RUN_LIST;
-- ahc_linux_check_device_queue(ahc, dev);
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- /* Yeild to our interrupt handler */
-- ahc_unlock(ahc, &flags);
-- ahc_lock(ahc, &flags);
--#endif
-- }
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- ahc_unlock(ahc, &flags);
--#endif
--}
-+Scsi_Host_Template aic7xxx_driver_template =
-+ AIC_TEMPLATE_INITIALIZER("aic7xxx", /* max_sectors*/8192);
-
- /******************************** Macros **************************************/
- #define BUILD_SCSIID(ahc, cmd) \
-@@ -1355,132 +1420,6 @@ ahc_runq_tasklet(unsigned long data)
- | (((cmd)->device->channel == 0) ? (ahc)->our_id : (ahc)->our_id_b) \
- | (((cmd)->device->channel == 0) ? 0 : TWIN_CHNLB))
-
--/******************************** Bus DMA *************************************/
--int
--ahc_dma_tag_create(struct ahc_softc *ahc, bus_dma_tag_t parent,
-- bus_size_t alignment, bus_size_t boundary,
-- bus_addr_t lowaddr, bus_addr_t highaddr,
-- bus_dma_filter_t *filter, void *filterarg,
-- bus_size_t maxsize, int nsegments,
-- bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
--{
-- bus_dma_tag_t dmat;
--
-- dmat = malloc(sizeof(*dmat), M_DEVBUF, M_NOWAIT);
-- if (dmat == NULL)
-- return (ENOMEM);
--
-- /*
-- * Linux is very simplistic about DMA memory. For now don't
-- * maintain all specification information. Once Linux supplies
-- * better facilities for doing these operations, or the
-- * needs of this particular driver change, we might need to do
-- * more here.
-- */
-- dmat->alignment = alignment;
-- dmat->boundary = boundary;
-- dmat->maxsize = maxsize;
-- *ret_tag = dmat;
-- return (0);
--}
--
--void
--ahc_dma_tag_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat)
--{
-- free(dmat, M_DEVBUF);
--}
--
--int
--ahc_dmamem_alloc(struct ahc_softc *ahc, bus_dma_tag_t dmat, void** vaddr,
-- int flags, bus_dmamap_t *mapp)
--{
-- bus_dmamap_t map;
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
-- if (map == NULL)
-- return (ENOMEM);
-- /*
-- * Although we can dma data above 4GB, our
-- * "consistent" memory is below 4GB for
-- * space efficiency reasons (only need a 4byte
-- * address). For this reason, we have to reset
-- * our dma mask when doing allocations.
-- */
-- if (ahc->dev_softc != NULL)
-- ahc_pci_set_dma_mask(ahc->dev_softc, 0xFFFFFFFF);
-- *vaddr = pci_alloc_consistent(ahc->dev_softc,
-- dmat->maxsize, &map->bus_addr);
-- if (ahc->dev_softc != NULL)
-- ahc_pci_set_dma_mask(ahc->dev_softc,
-- ahc->platform_data->hw_dma_mask);
--#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
-- /*
-- * At least in 2.2.14, malloc is a slab allocator so all
-- * allocations are aligned. We assume for these kernel versions
-- * that all allocations will be bellow 4Gig, physically contiguous,
-- * and accessible via DMA by the controller.
-- */
-- map = NULL; /* No additional information to store */
-- *vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT);
--#endif
-- if (*vaddr == NULL)
-- return (ENOMEM);
-- *mapp = map;
-- return(0);
--}
--
--void
--ahc_dmamem_free(struct ahc_softc *ahc, bus_dma_tag_t dmat,
-- void* vaddr, bus_dmamap_t map)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- pci_free_consistent(ahc->dev_softc, dmat->maxsize,
-- vaddr, map->bus_addr);
--#else
-- free(vaddr, M_DEVBUF);
--#endif
--}
--
--int
--ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map,
-- void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
-- void *cb_arg, int flags)
--{
-- /*
-- * Assume for now that this will only be used during
-- * initialization and not for per-transaction buffer mapping.
-- */
-- bus_dma_segment_t stack_sg;
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- stack_sg.ds_addr = map->bus_addr;
--#else
--#define VIRT_TO_BUS(a) (uint32_t)virt_to_bus((void *)(a))
-- stack_sg.ds_addr = VIRT_TO_BUS(buf);
--#endif
-- stack_sg.ds_len = dmat->maxsize;
-- cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
-- return (0);
--}
--
--void
--ahc_dmamap_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
--{
-- /*
-- * The map may is NULL in our < 2.3.X implementation.
-- */
-- if (map != NULL)
-- free(map, M_DEVBUF);
--}
--
--int
--ahc_dmamap_unload(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
--{
-- /* Nothing to do */
-- return (0);
--}
--
- /********************* Platform Dependent Functions ***************************/
- /*
- * Compare "left hand" softc with "right hand" softc, returning:
-@@ -1525,24 +1464,25 @@ ahc_softc_comp(struct ahc_softc *lahc, s
-
- /* Still equal. Sort by BIOS address, ioport, or bus/slot/func. */
- switch (rvalue) {
-+#ifdef CONFIG_PCI
- case AHC_PCI:
- {
- char primary_channel;
-
- if (aic7xxx_reverse_scan != 0)
-- value = ahc_get_pci_bus(lahc->dev_softc)
-- - ahc_get_pci_bus(rahc->dev_softc);
-+ value = aic_get_pci_bus(lahc->dev_softc)
-+ - aic_get_pci_bus(rahc->dev_softc);
- else
-- value = ahc_get_pci_bus(rahc->dev_softc)
-- - ahc_get_pci_bus(lahc->dev_softc);
-+ value = aic_get_pci_bus(rahc->dev_softc)
-+ - aic_get_pci_bus(lahc->dev_softc);
- if (value != 0)
- break;
- if (aic7xxx_reverse_scan != 0)
-- value = ahc_get_pci_slot(lahc->dev_softc)
-- - ahc_get_pci_slot(rahc->dev_softc);
-+ value = aic_get_pci_slot(lahc->dev_softc)
-+ - aic_get_pci_slot(rahc->dev_softc);
- else
-- value = ahc_get_pci_slot(rahc->dev_softc)
-- - ahc_get_pci_slot(lahc->dev_softc);
-+ value = aic_get_pci_slot(rahc->dev_softc)
-+ - aic_get_pci_slot(lahc->dev_softc);
- if (value != 0)
- break;
- /*
-@@ -1557,6 +1497,8 @@ ahc_softc_comp(struct ahc_softc *lahc, s
- value = 1;
- break;
- }
-+#endif
-+#ifdef CONFIG_EISA
- case AHC_EISA:
- if ((rahc->flags & AHC_BIOS_ENABLED) != 0) {
- value = rahc->platform_data->bios_address
-@@ -1566,6 +1508,7 @@ ahc_softc_comp(struct ahc_softc *lahc, s
- - lahc->bsh.ioport;
- }
- break;
-+#endif
- default:
- panic("ahc_softc_sort: invalid bus type");
- }
-@@ -1699,9 +1642,16 @@ ahc_linux_register_host(struct ahc_softc
- char *new_name;
- u_long s;
- u_int targ_offset;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ int error;
-+#endif
-
- template->name = ahc->description;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- host = scsi_host_alloc(template, sizeof(struct ahc_softc *));
-+#else
-+ host = scsi_register(template, sizeof(struct ahc_softc *));
-+#endif
- if (host == NULL)
- return (ENOMEM);
-
-@@ -1710,8 +1660,12 @@ ahc_linux_register_host(struct ahc_softc
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- scsi_assign_lock(host, &ahc->platform_data->spin_lock);
- #elif AHC_SCSI_HAS_HOST_LOCK != 0
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21)
-+ host->host_lock = &ahc->platform_data->spin_lock;
-+#else
- host->lock = &ahc->platform_data->spin_lock;
- #endif
-+#endif
- ahc->platform_data->host = host;
- host->can_queue = AHC_MAX_QUEUE;
- host->cmd_per_lun = 2;
-@@ -1736,13 +1690,20 @@ ahc_linux_register_host(struct ahc_softc
- #endif
- ahc_linux_initialize_scsi_bus(ahc);
- ahc_unlock(ahc, &s);
-+ ahc_sysrq_key = aic_install_sysrq(&ahc_sysrq_op);
-+ ahc_spawn_recovery_thread(ahc);
-+ if (ahc->platform_data->recovery_pid < 0) {
-+ printf("%s: Failed to create recovery thread, error= %d\n",
-+ ahc_name(ahc), ahc->platform_data->recovery_pid);
-+ return (-ahc->platform_data->recovery_pid);
-+ }
- ahc->platform_data->dv_pid = kernel_thread(ahc_linux_dv_thread, ahc, 0);
-- ahc_lock(ahc, &s);
- if (ahc->platform_data->dv_pid < 0) {
- printf("%s: Failed to create DV thread, error= %d\n",
- ahc_name(ahc), ahc->platform_data->dv_pid);
- return (-ahc->platform_data->dv_pid);
- }
-+ ahc_lock(ahc, &s);
- /*
- * Initially allocate *all* of our linux target objects
- * so that the DV thread will scan them all in parallel
-@@ -1787,7 +1748,9 @@ ahc_linux_register_host(struct ahc_softc
- ahc_unlock(ahc, &s);
-
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-- scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL)); /* XXX handle failure */
-+ error = scsi_add_host(host, ahc->dev_softc);
-+ if (error != 0)
-+ return (-error);
- scsi_scan_host(host);
- #endif
- return (0);
-@@ -1885,17 +1848,6 @@ ahc_linux_initialize_scsi_bus(struct ahc
- ahc_update_neg_request(ahc, &devinfo, tstate,
- tinfo, AHC_NEG_ALWAYS);
- }
-- /* Give the bus some time to recover */
-- if ((ahc->flags & (AHC_RESET_BUS_A|AHC_RESET_BUS_B)) != 0) {
-- ahc_linux_freeze_simq(ahc);
-- init_timer(&ahc->platform_data->reset_timer);
-- ahc->platform_data->reset_timer.data = (u_long)ahc;
-- ahc->platform_data->reset_timer.expires =
-- jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000;
-- ahc->platform_data->reset_timer.function =
-- ahc_linux_release_simq;
-- add_timer(&ahc->platform_data->reset_timer);
-- }
- }
-
- int
-@@ -1909,27 +1861,32 @@ ahc_platform_alloc(struct ahc_softc *ahc
- memset(ahc->platform_data, 0, sizeof(struct ahc_platform_data));
- TAILQ_INIT(&ahc->platform_data->completeq);
- TAILQ_INIT(&ahc->platform_data->device_runq);
-- ahc->platform_data->irq = AHC_LINUX_NOIRQ;
-+ ahc->platform_data->irq = AIC_LINUX_NOIRQ;
- ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
- ahc_lockinit(ahc);
- ahc_done_lockinit(ahc);
-+ init_timer(&ahc->platform_data->bus_settle_timer);
-+ ahc->platform_data->bus_settle_timer.data = (u_long)ahc;
-+ ahc->platform_data->bus_settle_timer.function =
-+ (aic_linux_callback_t *)aic_bus_settle_complete;
- init_timer(&ahc->platform_data->completeq_timer);
- ahc->platform_data->completeq_timer.data = (u_long)ahc;
- ahc->platform_data->completeq_timer.function =
-- (ahc_linux_callback_t *)ahc_linux_thread_run_complete_queue;
-+ (aic_linux_callback_t *)ahc_linux_thread_run_complete_queue;
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
- init_MUTEX_LOCKED(&ahc->platform_data->eh_sem);
- init_MUTEX_LOCKED(&ahc->platform_data->dv_sem);
- init_MUTEX_LOCKED(&ahc->platform_data->dv_cmd_sem);
-+ init_MUTEX_LOCKED(&ahc->platform_data->recovery_sem);
-+ init_MUTEX_LOCKED(&ahc->platform_data->recovery_ending_sem);
- #else
- ahc->platform_data->eh_sem = MUTEX_LOCKED;
- ahc->platform_data->dv_sem = MUTEX_LOCKED;
- ahc->platform_data->dv_cmd_sem = MUTEX_LOCKED;
-+ ahc->platform_data->recovery_sem = MUTEX_LOCKED;
-+ ahc->platform_data->recovery_ending_sem = MUTEX_LOCKED;
- #endif
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- tasklet_init(&ahc->platform_data->runq_tasklet, ahc_runq_tasklet,
-- (unsigned long)ahc);
--#endif
-+ aic_setup_tasklets(ahc);
- ahc->seltime = (aic7xxx_seltime & 0x3) << 4;
- ahc->seltime_b = (aic7xxx_seltime & 0x3) << 4;
- if (aic7xxx_pci_parity == 0)
-@@ -1941,21 +1898,22 @@ ahc_platform_alloc(struct ahc_softc *ahc
- void
- ahc_platform_free(struct ahc_softc *ahc)
- {
-- struct ahc_linux_target *targ;
-- struct ahc_linux_device *dev;
-+ struct aic_linux_target *targ;
-+ struct aic_linux_device *dev;
- int i, j;
-
-+ aic_remove_sysrq(ahc_sysrq_key, &ahc_sysrq_op);
- if (ahc->platform_data != NULL) {
- del_timer_sync(&ahc->platform_data->completeq_timer);
- ahc_linux_kill_dv_thread(ahc);
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- tasklet_kill(&ahc->platform_data->runq_tasklet);
--#endif
-+ aic_teardown_tasklets(ahc);
- if (ahc->platform_data->host != NULL) {
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- scsi_remove_host(ahc->platform_data->host);
--#endif
- scsi_host_put(ahc->platform_data->host);
-+#else
-+ scsi_unregister(ahc->platform_data->host);
-+#endif
- }
-
- /* destroy all of the device and target objects */
-@@ -1969,6 +1927,7 @@ ahc_platform_free(struct ahc_softc *ahc)
- if (targ->devices[j] == NULL)
- continue;
- dev = targ->devices[j];
-+ del_timer_sync(&dev->timer);
- ahc_linux_free_device(ahc, dev);
- }
- /*
-@@ -1979,7 +1938,7 @@ ahc_platform_free(struct ahc_softc *ahc)
- }
- }
-
-- if (ahc->platform_data->irq != AHC_LINUX_NOIRQ)
-+ if (ahc->platform_data->irq != AIC_LINUX_NOIRQ)
- free_irq(ahc->platform_data->irq, ahc);
- if (ahc->tag == BUS_SPACE_PIO
- && ahc->bsh.ioport != 0)
-@@ -2024,7 +1983,7 @@ void
- ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
- ahc_queue_alg alg)
- {
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
- int was_queuing;
- int now_queuing;
-
-@@ -2033,27 +1992,27 @@ ahc_platform_set_tags(struct ahc_softc *
- devinfo->lun, /*alloc*/FALSE);
- if (dev == NULL)
- return;
-- was_queuing = dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED);
-+ was_queuing = dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED);
- switch (alg) {
- default:
- case AHC_QUEUE_NONE:
- now_queuing = 0;
- break;
- case AHC_QUEUE_BASIC:
-- now_queuing = AHC_DEV_Q_BASIC;
-+ now_queuing = AIC_DEV_Q_BASIC;
- break;
- case AHC_QUEUE_TAGGED:
-- now_queuing = AHC_DEV_Q_TAGGED;
-+ now_queuing = AIC_DEV_Q_TAGGED;
- break;
- }
-- if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) == 0
-+ if ((dev->flags & AIC_DEV_FREEZE_TIL_EMPTY) == 0
- && (was_queuing != now_queuing)
- && (dev->active != 0)) {
-- dev->flags |= AHC_DEV_FREEZE_TIL_EMPTY;
-+ dev->flags |= AIC_DEV_FREEZE_TIL_EMPTY;
- dev->qfrozen++;
- }
-
-- dev->flags &= ~(AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED|AHC_DEV_PERIODIC_OTAG);
-+ dev->flags &= ~(AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED|AIC_DEV_PERIODIC_OTAG);
- if (now_queuing) {
- u_int usertags;
-
-@@ -2073,11 +2032,11 @@ ahc_platform_set_tags(struct ahc_softc *
- */
- dev->openings = 1;
- } else if (alg == AHC_QUEUE_TAGGED) {
-- dev->flags |= AHC_DEV_Q_TAGGED;
-+ dev->flags |= AIC_DEV_Q_TAGGED;
- if (aic7xxx_periodic_otag != 0)
-- dev->flags |= AHC_DEV_PERIODIC_OTAG;
-+ dev->flags |= AIC_DEV_PERIODIC_OTAG;
- } else
-- dev->flags |= AHC_DEV_Q_BASIC;
-+ dev->flags |= AIC_DEV_Q_BASIC;
- } else {
- /* We can only have one opening. */
- dev->maxtags = 0;
-@@ -2085,13 +2044,13 @@ ahc_platform_set_tags(struct ahc_softc *
- }
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- if (dev->scsi_device != NULL) {
-- switch ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED))) {
-- case AHC_DEV_Q_BASIC:
-+ switch ((dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED))) {
-+ case AIC_DEV_Q_BASIC:
- scsi_adjust_queue_depth(dev->scsi_device,
- MSG_SIMPLE_TASK,
- dev->openings + dev->active);
- break;
-- case AHC_DEV_Q_TAGGED:
-+ case AIC_DEV_Q_TAGGED:
- scsi_adjust_queue_depth(dev->scsi_device,
- MSG_ORDERED_TASK,
- dev->openings + dev->active);
-@@ -2155,9 +2114,9 @@ ahc_platform_abort_scbs(struct ahc_softc
- for (; targ < maxtarg; targ++) {
-
- for (; clun < maxlun; clun++) {
-- struct ahc_linux_device *dev;
-- struct ahc_busyq *busyq;
-- struct ahc_cmd *acmd;
-+ struct aic_linux_device *dev;
-+ struct aic_busyq *busyq;
-+ struct aic_cmd *acmd;
-
- dev = ahc_linux_get_device(ahc, chan,
- targ, clun,
-@@ -2174,6 +2133,20 @@ ahc_platform_abort_scbs(struct ahc_softc
- acmd_links.tqe);
- count++;
- cmd->result = status << 16;
-+ /*
-+ * The completion handler believes that
-+ * commands without active timers
-+ * running have lost the race of
-+ * completing before their timer
-+ * expires. Since commands in our
-+ * busy queues do not have timers
-+ * running, appease the mid-layer by
-+ * adding a timer now. This timer will
-+ * be immediately canceled by the
-+ * midlayer.
-+ */
-+ scsi_add_timer(cmd, 60*HZ,
-+ aic_linux_midlayer_timeout);
- ahc_linux_queue_cmd_complete(ahc, cmd);
- }
- }
-@@ -2190,7 +2163,7 @@ ahc_linux_thread_run_complete_queue(stru
-
- ahc_lock(ahc, &flags);
- del_timer(&ahc->platform_data->completeq_timer);
-- ahc->platform_data->flags &= ~AHC_RUN_CMPLT_Q_TIMER;
-+ ahc->platform_data->flags &= ~AIC_RUN_CMPLT_Q_TIMER;
- ahc_linux_run_complete_queue(ahc);
- ahc_unlock(ahc, &flags);
- }
-@@ -2203,14 +2176,23 @@ ahc_linux_start_dv(struct ahc_softc *ahc
- * Freeze the simq and signal ahc_linux_queue to not let any
- * more commands through.
- */
-- if ((ahc->platform_data->flags & AHC_DV_ACTIVE) == 0) {
-+ if ((ahc->platform_data->flags & AIC_DV_ACTIVE) == 0) {
- #ifdef AHC_DEBUG
- if (ahc_debug & AHC_SHOW_DV)
- printf("%s: Waking DV thread\n", ahc_name(ahc));
- #endif
-
-- ahc->platform_data->flags |= AHC_DV_ACTIVE;
-- ahc_linux_freeze_simq(ahc);
-+ ahc->platform_data->flags |= AIC_DV_ACTIVE;
-+
-+ /*
-+ * Prevent upper layer from sending any
-+ * commands to us.
-+ */
-+ aic_freeze_simq(ahc);
-+ scsi_block_requests(ahc->platform_data->host);
-+ ahc_platform_abort_scbs(ahc, CAM_TARGET_WILDCARD, ALL_CHANNELS,
-+ CAM_LUN_WILDCARD, SCB_LIST_NULL,
-+ ROLE_INITIATOR, CAM_REQUEUE_REQ);
-
- /* Wake up the DV kthread */
- up(&ahc->platform_data->dv_sem);
-@@ -2224,7 +2206,7 @@ ahc_linux_kill_dv_thread(struct ahc_soft
-
- ahc_lock(ahc, &s);
- if (ahc->platform_data->dv_pid != 0) {
-- ahc->platform_data->flags |= AHC_DV_SHUTDOWN;
-+ ahc->platform_data->flags |= AIC_DV_SHUTDOWN;
- ahc_unlock(ahc, &s);
- up(&ahc->platform_data->dv_sem);
-
-@@ -2299,7 +2281,7 @@ ahc_linux_dv_thread(void *data)
-
- /* Check to see if we've been signaled to exit */
- ahc_lock(ahc, &s);
-- if ((ahc->platform_data->flags & AHC_DV_SHUTDOWN) != 0) {
-+ if ((ahc->platform_data->flags & AIC_DV_SHUTDOWN) != 0) {
- ahc_unlock(ahc, &s);
- break;
- }
-@@ -2316,7 +2298,7 @@ ahc_linux_dv_thread(void *data)
- */
- ahc_lock(ahc, &s);
- while (LIST_FIRST(&ahc->pending_scbs) != NULL) {
-- ahc->platform_data->flags |= AHC_DV_WAIT_SIMQ_EMPTY;
-+ ahc->platform_data->flags |= AIC_DV_WAIT_SIMQ_EMPTY;
- ahc_unlock(ahc, &s);
- down_interruptible(&ahc->platform_data->dv_sem);
- ahc_lock(ahc, &s);
-@@ -2326,8 +2308,8 @@ ahc_linux_dv_thread(void *data)
- * Wait for the SIMQ to be released so that DV is the
- * only reason the queue is frozen.
- */
-- while (AHC_DV_SIMQ_FROZEN(ahc) == 0) {
-- ahc->platform_data->flags |= AHC_DV_WAIT_SIMQ_RELEASE;
-+ while (AIC_DV_SIMQ_FROZEN(ahc) == 0) {
-+ ahc->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
- ahc_unlock(ahc, &s);
- down_interruptible(&ahc->platform_data->dv_sem);
- ahc_lock(ahc, &s);
-@@ -2338,14 +2320,16 @@ ahc_linux_dv_thread(void *data)
- ahc_linux_dv_target(ahc, target);
-
- ahc_lock(ahc, &s);
-- ahc->platform_data->flags &= ~AHC_DV_ACTIVE;
-- ahc_unlock(ahc, &s);
-+ ahc->platform_data->flags &= ~AIC_DV_ACTIVE;
-
- /*
- * Release the SIMQ so that normal commands are
- * allowed to continue on the bus.
- */
-- ahc_linux_release_simq((u_long)ahc);
-+ aic_release_simq_locked(ahc);
-+ ahc_unlock(ahc, &s);
-+
-+ scsi_unblock_requests(ahc->platform_data->host);
- }
- up(&ahc->platform_data->eh_sem);
- return (0);
-@@ -2359,10 +2343,10 @@ ahc_linux_dv_thread(void *data)
- ahc_set_dv_state(ahc, targ, newstate, __LINE__)
-
- static __inline void
--ahc_set_dv_state(struct ahc_softc *ahc, struct ahc_linux_target *targ,
-- ahc_dv_state newstate, u_int line)
-+ahc_set_dv_state(struct ahc_softc *ahc, struct aic_linux_target *targ,
-+ aic_dv_state newstate, u_int line)
- {
-- ahc_dv_state oldstate;
-+ aic_dv_state oldstate;
-
- oldstate = targ->dv_state;
- #ifdef AHC_DEBUG
-@@ -2382,7 +2366,7 @@ static void
- ahc_linux_dv_target(struct ahc_softc *ahc, u_int target_offset)
- {
- struct ahc_devinfo devinfo;
-- struct ahc_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct scsi_cmnd *cmd;
- struct scsi_device *scsi_dev;
- struct scsi_sense_data *sense;
-@@ -2396,7 +2380,7 @@ ahc_linux_dv_target(struct ahc_softc *ah
- echo_size = 0;
- ahc_lock(ahc, &s);
- targ = ahc->platform_data->targets[target_offset];
-- if (targ == NULL || (targ->flags & AHC_DV_REQUIRED) == 0) {
-+ if (targ == NULL || (targ->flags & AIC_DV_REQUIRED) == 0) {
- ahc_unlock(ahc, &s);
- return;
- }
-@@ -2421,14 +2405,14 @@ ahc_linux_dv_target(struct ahc_softc *ah
- scsi_dev->channel = devinfo.channel - 'A';
- ahc->platform_data->dv_scsi_dev = scsi_dev;
-
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_INQ_SHORT_ASYNC);
-
-- while (targ->dv_state != AHC_DV_STATE_EXIT) {
-+ while (targ->dv_state != AIC_DV_STATE_EXIT) {
- timeout = AHC_LINUX_DV_TIMEOUT;
- switch (targ->dv_state) {
-- case AHC_DV_STATE_INQ_SHORT_ASYNC:
-- case AHC_DV_STATE_INQ_ASYNC:
-- case AHC_DV_STATE_INQ_ASYNC_VERIFY:
-+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
-+ case AIC_DV_STATE_INQ_ASYNC:
-+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
- /*
- * Set things to async narrow to reduce the
- * chance that the INQ will fail.
-@@ -2440,36 +2424,36 @@ ahc_linux_dv_target(struct ahc_softc *ah
- AHC_TRANS_GOAL, /*paused*/FALSE);
- ahc_unlock(ahc, &s);
- timeout = 10 * HZ;
-- targ->flags &= ~AHC_INQ_VALID;
-+ targ->flags &= ~AIC_INQ_VALID;
- /* FALLTHROUGH */
-- case AHC_DV_STATE_INQ_VERIFY:
-+ case AIC_DV_STATE_INQ_VERIFY:
- {
- u_int inq_len;
-
-- if (targ->dv_state == AHC_DV_STATE_INQ_SHORT_ASYNC)
-+ if (targ->dv_state == AIC_DV_STATE_INQ_SHORT_ASYNC)
- inq_len = AHC_LINUX_DV_INQ_SHORT_LEN;
- else
- inq_len = targ->inq_data->additional_length + 5;
- ahc_linux_dv_inq(ahc, cmd, &devinfo, targ, inq_len);
- break;
- }
-- case AHC_DV_STATE_TUR:
-- case AHC_DV_STATE_BUSY:
-+ case AIC_DV_STATE_TUR:
-+ case AIC_DV_STATE_BUSY:
- timeout = 5 * HZ;
- ahc_linux_dv_tur(ahc, cmd, &devinfo);
- break;
-- case AHC_DV_STATE_REBD:
-+ case AIC_DV_STATE_REBD:
- ahc_linux_dv_rebd(ahc, cmd, &devinfo, targ);
- break;
-- case AHC_DV_STATE_WEB:
-+ case AIC_DV_STATE_WEB:
- ahc_linux_dv_web(ahc, cmd, &devinfo, targ);
- break;
-
-- case AHC_DV_STATE_REB:
-+ case AIC_DV_STATE_REB:
- ahc_linux_dv_reb(ahc, cmd, &devinfo, targ);
- break;
-
-- case AHC_DV_STATE_SU:
-+ case AIC_DV_STATE_SU:
- ahc_linux_dv_su(ahc, cmd, &devinfo, targ);
- timeout = 50 * HZ;
- break;
-@@ -2481,8 +2465,6 @@ ahc_linux_dv_target(struct ahc_softc *ah
- }
-
- /* Queue the command and wait for it to complete */
-- /* Abuse eh_timeout in the scsi_cmnd struct for our purposes */
-- init_timer(&cmd->eh_timeout);
- #ifdef AHC_DEBUG
- if ((ahc_debug & AHC_SHOW_MESSAGES) != 0)
- /*
-@@ -2492,7 +2474,9 @@ ahc_linux_dv_target(struct ahc_softc *ah
- */
- timeout += HZ;
- #endif
-- scsi_add_timer(cmd, timeout, ahc_linux_dv_timeout);
-+ init_timer(&cmd->eh_timeout);
-+ cmd->timeout_per_command = timeout;
-+
- /*
- * In 2.5.X, it is assumed that all calls from the
- * "midlayer" (which we are emulating) will have the
-@@ -2516,8 +2500,8 @@ ahc_linux_dv_target(struct ahc_softc *ah
- * only reason the queue is frozen.
- */
- ahc_lock(ahc, &s);
-- while (AHC_DV_SIMQ_FROZEN(ahc) == 0) {
-- ahc->platform_data->flags |= AHC_DV_WAIT_SIMQ_RELEASE;
-+ while (AIC_DV_SIMQ_FROZEN(ahc) == 0) {
-+ ahc->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
- ahc_unlock(ahc, &s);
- down_interruptible(&ahc->platform_data->dv_sem);
- ahc_lock(ahc, &s);
-@@ -2528,7 +2512,7 @@ ahc_linux_dv_target(struct ahc_softc *ah
- }
-
- out:
-- if ((targ->flags & AHC_INQ_VALID) != 0
-+ if ((targ->flags & AIC_INQ_VALID) != 0
- && ahc_linux_get_device(ahc, devinfo.channel - 'A',
- devinfo.target, devinfo.lun,
- /*alloc*/FALSE) == NULL) {
-@@ -2539,7 +2523,7 @@ out:
- * parameters found in the inquiry string.
- */
- ahc_linux_filter_inquiry(ahc, &devinfo);
-- if ((targ->flags & (AHC_BASIC_DV|AHC_ENHANCED_DV)) != 0) {
-+ if ((targ->flags & (AIC_BASIC_DV|AIC_ENHANCED_DV)) != 0) {
- ahc_print_devinfo(ahc, &devinfo);
- printf("DV failed to configure device. "
- "Please file a bug report against "
-@@ -2564,7 +2548,7 @@ out:
- free(targ->dv_buffer1, M_DEVBUF);
- targ->dv_buffer1 = NULL;
- }
-- targ->flags &= ~AHC_DV_REQUIRED;
-+ targ->flags &= ~AIC_DV_REQUIRED;
- if (targ->refcount == 0)
- ahc_linux_free_target(ahc, targ);
- ahc_unlock(ahc, &s);
-@@ -2573,13 +2557,13 @@ out:
- static void
- ahc_linux_dv_transition(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ)
-+ struct aic_linux_target *targ)
- {
- u_int32_t status;
-
- status = aic_error_action(cmd, targ->inq_data,
-- ahc_cmd_get_transaction_status(cmd),
-- ahc_cmd_get_scsi_status(cmd));
-+ aic_cmd_get_transaction_status(cmd),
-+ aic_cmd_get_scsi_status(cmd));
-
- #ifdef AHC_DEBUG
- if (ahc_debug & AHC_SHOW_DV) {
-@@ -2591,8 +2575,8 @@ ahc_linux_dv_transition(struct ahc_softc
- #endif
-
- switch (targ->dv_state) {
-- case AHC_DV_STATE_INQ_SHORT_ASYNC:
-- case AHC_DV_STATE_INQ_ASYNC:
-+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
-+ case AIC_DV_STATE_INQ_ASYNC:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
-@@ -2601,21 +2585,21 @@ ahc_linux_dv_transition(struct ahc_softc
- }
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ)
- targ->dv_state_retry--;
- if ((status & SS_ERRMASK) == EBUSY)
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
- if (targ->dv_state_retry < 10)
- break;
- /* FALLTHROUGH */
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- #ifdef AHC_DEBUG
- if (ahc_debug & AHC_SHOW_DV) {
- ahc_print_devinfo(ahc, devinfo);
-@@ -2625,7 +2609,7 @@ ahc_linux_dv_transition(struct ahc_softc
- break;
- }
- break;
-- case AHC_DV_STATE_INQ_ASYNC_VERIFY:
-+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
-@@ -2639,12 +2623,12 @@ ahc_linux_dv_transition(struct ahc_softc
- * Try from the top again.
- */
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- }
-
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state+1);
-- targ->flags |= AHC_INQ_VALID;
-+ targ->flags |= AIC_INQ_VALID;
- if (ahc_linux_user_dv_setting(ahc) == 0)
- break;
-
-@@ -2657,33 +2641,33 @@ ahc_linux_dv_transition(struct ahc_softc
- default:
- case SID_SPI_CLOCK_ST:
- /* Assume only basic DV is supported. */
-- targ->flags |= AHC_BASIC_DV;
-+ targ->flags |= AIC_BASIC_DV;
- break;
- case SID_SPI_CLOCK_DT:
- case SID_SPI_CLOCK_DT_ST:
-- targ->flags |= AHC_ENHANCED_DV;
-+ targ->flags |= AIC_ENHANCED_DV;
- break;
- }
- break;
- }
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ)
- targ->dv_state_retry--;
-
- if ((status & SS_ERRMASK) == EBUSY)
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
- if (targ->dv_state_retry < 10)
- break;
- /* FALLTHROUGH */
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- #ifdef AHC_DEBUG
- if (ahc_debug & AHC_SHOW_DV) {
- ahc_print_devinfo(ahc, devinfo);
-@@ -2693,14 +2677,14 @@ ahc_linux_dv_transition(struct ahc_softc
- break;
- }
- break;
-- case AHC_DV_STATE_INQ_VERIFY:
-+ case AIC_DV_STATE_INQ_VERIFY:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
-
- if (memcmp(targ->inq_data, targ->dv_buffer,
- AHC_LINUX_DV_INQ_LEN) == 0) {
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- #ifdef AHC_DEBUG
-@@ -2721,7 +2705,7 @@ ahc_linux_dv_transition(struct ahc_softc
- #endif
-
- if (ahc_linux_fallback(ahc, devinfo) != 0) {
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -2734,18 +2718,18 @@ ahc_linux_dv_transition(struct ahc_softc
- }
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahc_linux_fallback(ahc, devinfo) != 0) {
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -2754,12 +2738,12 @@ ahc_linux_dv_transition(struct ahc_softc
- */
- targ->dv_state_retry = 0;
- } else if ((status & SS_ERRMASK) == EBUSY)
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
- if (targ->dv_state_retry < 10)
- break;
- /* FALLTHROUGH */
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- #ifdef AHC_DEBUG
- if (ahc_debug & AHC_SHOW_DV) {
- ahc_print_devinfo(ahc, devinfo);
-@@ -2770,33 +2754,33 @@ ahc_linux_dv_transition(struct ahc_softc
- }
- break;
-
-- case AHC_DV_STATE_TUR:
-+ case AIC_DV_STATE_TUR:
- switch (status & SS_MASK) {
- case SS_NOP:
-- if ((targ->flags & AHC_BASIC_DV) != 0) {
-+ if ((targ->flags & AIC_BASIC_DV) != 0) {
- ahc_linux_filter_inquiry(ahc, devinfo);
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_VERIFY);
-- } else if ((targ->flags & AHC_ENHANCED_DV) != 0) {
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_REBD);
-+ AIC_DV_STATE_INQ_VERIFY);
-+ } else if ((targ->flags & AIC_ENHANCED_DV) != 0) {
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_REBD);
- } else {
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- }
- break;
- case SS_RETRY:
- case SS_TUR:
- if ((status & SS_ERRMASK) == EBUSY) {
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
- break;
- }
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahc_linux_fallback(ahc, devinfo) != 0) {
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -2812,7 +2796,7 @@ ahc_linux_dv_transition(struct ahc_softc
- printf("DV TUR reties exhausted\n");
- }
- #endif
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- if (status & SSQ_DELAY)
-@@ -2820,25 +2804,25 @@ ahc_linux_dv_transition(struct ahc_softc
-
- break;
- case SS_START:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_SU);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_SU);
- break;
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHC_DV_STATE_REBD:
-+ case AIC_DV_STATE_REBD:
- switch (status & SS_MASK) {
- case SS_NOP:
- {
- uint32_t echo_size;
-
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_WEB);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_WEB);
- echo_size = scsi_3btoul(&targ->dv_buffer[1]);
- echo_size &= 0x1FFF;
- #ifdef AHC_DEBUG
-@@ -2848,7 +2832,17 @@ ahc_linux_dv_transition(struct ahc_softc
- }
- #endif
- if (echo_size == 0) {
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ /*
-+ * Fall back to basic DV.
-+ */
-+ if (bootverbose) {
-+ ahc_print_devinfo(ahc, devinfo);
-+ printf("Echo Buffer unavailable. "
-+ "Performing basic DV.\n");
-+ }
-+ targ->flags &= ~AIC_ENHANCED_DV;
-+ targ->flags |= AIC_BASIC_DV;
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_TUR);
- break;
- }
-
-@@ -2863,11 +2857,11 @@ ahc_linux_dv_transition(struct ahc_softc
- }
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_RETRY:
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ)
- targ->dv_state_retry--;
- if (targ->dv_state_retry <= 10)
-@@ -2886,30 +2880,30 @@ ahc_linux_dv_transition(struct ahc_softc
- * and try level 1 DV.
- */
- ahc_linux_filter_inquiry(ahc, devinfo);
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_INQ_VERIFY);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_INQ_VERIFY);
- targ->dv_echo_size = 0;
- break;
- }
- break;
-
-- case AHC_DV_STATE_WEB:
-+ case AIC_DV_STATE_WEB:
- switch (status & SS_MASK) {
- case SS_NOP:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_REB);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_REB);
- break;
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_RETRY:
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahc_linux_fallback(ahc, devinfo) != 0) {
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
- /*
-@@ -2928,22 +2922,22 @@ ahc_linux_dv_transition(struct ahc_softc
- }
- #endif
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHC_DV_STATE_REB:
-+ case AIC_DV_STATE_REB:
- switch (status & SS_MASK) {
- case SS_NOP:
- if (memcmp(targ->dv_buffer, targ->dv_buffer1,
- targ->dv_echo_size) != 0) {
- if (ahc_linux_fallback(ahc, devinfo) != 0)
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- else
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_WEB);
-+ AIC_DV_STATE_WEB);
- break;
- }
-
-@@ -2955,24 +2949,24 @@ ahc_linux_dv_transition(struct ahc_softc
- free(targ->dv_buffer1, M_DEVBUF);
- targ->dv_buffer1 = NULL;
- }
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_RETRY:
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if ((status & SSQ_FALLBACK) != 0) {
- if (ahc_linux_fallback(ahc, devinfo) != 0) {
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_EXIT);
-+ AIC_DV_STATE_EXIT);
- break;
- }
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_WEB);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_WEB);
- }
- if (targ->dv_state_retry <= 10) {
- if ((status & (SSQ_DELAY_RANDOM|SSQ_DELAY))!= 0)
-@@ -2987,35 +2981,35 @@ ahc_linux_dv_transition(struct ahc_softc
- #endif
- /* FALLTHROUGH */
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHC_DV_STATE_SU:
-+ case AIC_DV_STATE_SU:
- switch (status & SS_MASK) {
- case SS_NOP:
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-
-- case AHC_DV_STATE_BUSY:
-+ case AIC_DV_STATE_BUSY:
- switch (status & SS_MASK) {
- case SS_NOP:
- case SS_INQ_REFRESH:
- AHC_SET_DV_STATE(ahc, targ,
-- AHC_DV_STATE_INQ_SHORT_ASYNC);
-+ AIC_DV_STATE_INQ_SHORT_ASYNC);
- break;
- case SS_TUR:
- case SS_RETRY:
- AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
-- if (ahc_cmd_get_transaction_status(cmd)
-+ if (aic_cmd_get_transaction_status(cmd)
- == CAM_REQUEUE_REQ) {
- targ->dv_state_retry--;
- } else if (targ->dv_state_retry < 60) {
-@@ -3028,11 +3022,11 @@ ahc_linux_dv_transition(struct ahc_softc
- printf("DV BUSY reties exhausted\n");
- }
- #endif
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- }
- break;
- default:
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- break;
-@@ -3040,7 +3034,7 @@ ahc_linux_dv_transition(struct ahc_softc
- default:
- printf("%s: Invalid DV completion state %d\n", ahc_name(ahc),
- targ->dv_state);
-- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
-+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
- break;
- }
- }
-@@ -3060,7 +3054,7 @@ ahc_linux_dv_fill_cmd(struct ahc_softc *
- */
- static void
- ahc_linux_dv_inq(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
-- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ,
-+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ,
- u_int request_length)
- {
-
-@@ -3073,7 +3067,7 @@ ahc_linux_dv_inq(struct ahc_softc *ahc,
- if (targ->inq_data == NULL)
- targ->inq_data = malloc(AHC_LINUX_DV_INQ_LEN,
- M_DEVBUF, M_WAITOK);
-- if (targ->dv_state > AHC_DV_STATE_INQ_ASYNC) {
-+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC) {
- if (targ->dv_buffer != NULL)
- free(targ->dv_buffer, M_DEVBUF);
- targ->dv_buffer = malloc(AHC_LINUX_DV_INQ_LEN,
-@@ -3086,7 +3080,7 @@ ahc_linux_dv_inq(struct ahc_softc *ahc,
- cmd->cmnd[0] = INQUIRY;
- cmd->cmnd[4] = request_length;
- cmd->request_bufflen = request_length;
-- if (targ->dv_state > AHC_DV_STATE_INQ_ASYNC)
-+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC)
- cmd->request_buffer = targ->dv_buffer;
- else
- cmd->request_buffer = targ->inq_data;
-@@ -3115,7 +3109,7 @@ ahc_linux_dv_tur(struct ahc_softc *ahc,
-
- static void
- ahc_linux_dv_rebd(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
-- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ)
-+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ)
- {
-
- #ifdef AHC_DEBUG
-@@ -3140,7 +3134,7 @@ ahc_linux_dv_rebd(struct ahc_softc *ahc,
-
- static void
- ahc_linux_dv_web(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
-- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ)
-+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ)
- {
-
- #ifdef AHC_DEBUG
-@@ -3162,7 +3156,7 @@ ahc_linux_dv_web(struct ahc_softc *ahc,
-
- static void
- ahc_linux_dv_reb(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
-- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ)
-+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ)
- {
-
- #ifdef AHC_DEBUG
-@@ -3185,7 +3179,7 @@ ahc_linux_dv_reb(struct ahc_softc *ahc,
- static void
- ahc_linux_dv_su(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
- struct ahc_devinfo *devinfo,
-- struct ahc_linux_target *targ)
-+ struct aic_linux_target *targ)
- {
- u_int le;
-
-@@ -3207,7 +3201,7 @@ ahc_linux_dv_su(struct ahc_softc *ahc, s
- static int
- ahc_linux_fallback(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
- {
-- struct ahc_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct ahc_initiator_tinfo *tinfo;
- struct ahc_transinfo *goal;
- struct ahc_tmode_tstate *tstate;
-@@ -3386,7 +3380,7 @@ ahc_linux_fallback(struct ahc_softc *ahc
- return (0);
- }
-
--static void
-+void
- ahc_linux_dv_timeout(struct scsi_cmnd *cmd)
- {
- struct ahc_softc *ahc;
-@@ -3420,29 +3414,19 @@ ahc_linux_dv_timeout(struct scsi_cmnd *c
- * error code.
- */
- if ((scb->flags & SCB_SENSE) != 0)
-- ahc_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
-+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
- else
-- ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
- ahc_reset_channel(ahc, cmd->device->channel + 'A', /*initiate*/TRUE);
-
-- /*
-- * Add a minimal bus settle delay for devices that are slow to
-- * respond after bus resets.
-- */
-- ahc_linux_freeze_simq(ahc);
-- init_timer(&ahc->platform_data->reset_timer);
-- ahc->platform_data->reset_timer.data = (u_long)ahc;
-- ahc->platform_data->reset_timer.expires = jiffies + HZ / 2;
-- ahc->platform_data->reset_timer.function =
-- (ahc_linux_callback_t *)ahc_linux_release_simq;
-- add_timer(&ahc->platform_data->reset_timer);
-- if (ahc_linux_next_device_to_run(ahc) != NULL)
-- ahc_schedule_runq(ahc);
-+ if (aic_linux_next_device_to_run(ahc) != NULL)
-+ aic_schedule_runq(ahc);
-+
- ahc_linux_run_complete_queue(ahc);
- ahc_unlock(ahc, &flags);
- }
-
--static void
-+void
- ahc_linux_dv_complete(struct scsi_cmnd *cmd)
- {
- struct ahc_softc *ahc;
-@@ -3464,7 +3448,7 @@ ahc_linux_dv_complete(struct scsi_cmnd *
- }
-
- static void
--ahc_linux_generate_dv_pattern(struct ahc_linux_target *targ)
-+ahc_linux_generate_dv_pattern(struct aic_linux_target *targ)
- {
- uint16_t b;
- u_int i;
-@@ -3596,8 +3580,8 @@ ahc_linux_user_dv_setting(struct ahc_sof
- * Determines the queue depth for a given device.
- */
- static void
--ahc_linux_device_queue_depth(struct ahc_softc *ahc,
-- struct ahc_linux_device *dev)
-+aic_linux_device_queue_depth(struct ahc_softc *ahc,
-+ struct aic_linux_device *dev)
- {
- struct ahc_devinfo devinfo;
- u_int tags;
-@@ -3621,10 +3605,10 @@ ahc_linux_device_queue_depth(struct ahc_
- }
- }
-
--static void
--ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev)
-+void
-+ahc_linux_run_device_queue(struct ahc_softc *ahc, struct aic_linux_device *dev)
- {
-- struct ahc_cmd *acmd;
-+ struct aic_cmd *acmd;
- struct scsi_cmnd *cmd;
- struct scb *scb;
- struct hardware_scb *hscb;
-@@ -3632,7 +3616,7 @@ ahc_linux_run_device_queue(struct ahc_so
- struct ahc_tmode_tstate *tstate;
- uint16_t mask;
-
-- if ((dev->flags & AHC_DEV_ON_RUN_LIST) != 0)
-+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) != 0)
- panic("running device on run list");
-
- while ((acmd = TAILQ_FIRST(&dev->busyq)) != NULL
-@@ -3643,10 +3627,10 @@ ahc_linux_run_device_queue(struct ahc_so
- * running is because the whole controller Q is frozen.
- */
- if (ahc->platform_data->qfrozen != 0
-- && AHC_DV_SIMQ_FROZEN(ahc) == 0) {
-+ && AIC_DV_SIMQ_FROZEN(ahc) == 0) {
- TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
- dev, links);
-- dev->flags |= AHC_DEV_ON_RUN_LIST;
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
- return;
- }
- /*
-@@ -3655,7 +3639,7 @@ ahc_linux_run_device_queue(struct ahc_so
- if ((scb = ahc_get_scb(ahc)) == NULL) {
- TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
- dev, links);
-- dev->flags |= AHC_DEV_ON_RUN_LIST;
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
- ahc->flags |= AHC_RESOURCE_SHORTAGE;
- return;
- }
-@@ -3663,6 +3647,7 @@ ahc_linux_run_device_queue(struct ahc_so
- cmd = &acmd_scsi_cmd(acmd);
- scb->io_ctx = cmd;
- scb->platform_data->dev = dev;
-+ scb->platform_data->flags = 0;
- hscb = scb->hscb;
- cmd->host_scribble = (char *)scb;
-
-@@ -3684,7 +3669,7 @@ ahc_linux_run_device_queue(struct ahc_so
- if ((ahc->user_discenable & mask) != 0)
- hscb->control |= DISCENB;
-
-- if (AHC_DV_CMD(cmd) != 0)
-+ if (AIC_DV_CMD(cmd) != 0)
- scb->flags |= SCB_SILENT;
-
- if ((tstate->auto_negotiate & mask) != 0) {
-@@ -3692,7 +3677,7 @@ ahc_linux_run_device_queue(struct ahc_so
- scb->hscb->control |= MK_MESSAGE;
- }
-
-- if ((dev->flags & (AHC_DEV_Q_TAGGED|AHC_DEV_Q_BASIC)) != 0) {
-+ if ((dev->flags & (AIC_DEV_Q_TAGGED|AIC_DEV_Q_BASIC)) != 0) {
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- int msg_bytes;
- uint8_t tag_msgs[2];
-@@ -3704,8 +3689,8 @@ ahc_linux_run_device_queue(struct ahc_so
- dev->commands_since_idle_or_otag = 0;
- } else
- #endif
-- if (dev->commands_since_idle_or_otag == AHC_OTAG_THRESH
-- && (dev->flags & AHC_DEV_Q_TAGGED) != 0) {
-+ if (dev->commands_since_idle_or_otag == AIC_OTAG_THRESH
-+ && (dev->flags & AIC_DEV_Q_TAGGED) != 0) {
- hscb->control |= MSG_ORDERED_TASK;
- dev->commands_since_idle_or_otag = 0;
- } else {
-@@ -3722,8 +3707,8 @@ ahc_linux_run_device_queue(struct ahc_so
- }
-
- scb->platform_data->xfer_len = 0;
-- ahc_set_residual(scb, 0);
-- ahc_set_sense_residual(scb, 0);
-+ aic_set_residual(scb, 0);
-+ aic_set_sense_residual(scb, 0);
- scb->sg_count = 0;
- if (cmd->use_sg != 0) {
- struct ahc_dma_seg *sg;
-@@ -3732,7 +3717,7 @@ ahc_linux_run_device_queue(struct ahc_so
- int nseg;
-
- cur_seg = (struct scatterlist *)cmd->request_buffer;
-- nseg = pci_map_sg(ahc->dev_softc, cur_seg, cmd->use_sg,
-+ nseg = aic_map_sg(ahc, cur_seg, cmd->use_sg,
- scsi_to_pci_dma_dir(cmd->sc_data_direction));
- end_seg = cur_seg + nseg;
- /* Copy the segments into the SG list. */
-@@ -3755,13 +3740,13 @@ ahc_linux_run_device_queue(struct ahc_so
- cur_seg++;
- }
- sg--;
-- sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
-+ sg->len |= aic_htole32(AHC_DMA_LAST_SEG);
-
- /*
- * Reset the sg list pointer.
- */
- scb->hscb->sgptr =
-- ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
-+ aic_htole32(scb->sg_list_phys | SG_FULL_RESID);
-
- /*
- * Copy the first SG into the "current"
-@@ -3774,7 +3759,7 @@ ahc_linux_run_device_queue(struct ahc_so
- bus_addr_t addr;
-
- sg = scb->sg_list;
-- addr = pci_map_single(ahc->dev_softc,
-+ addr = aic_map_single(ahc,
- cmd->request_buffer,
- cmd->request_bufflen,
- scsi_to_pci_dma_dir(cmd->sc_data_direction));
-@@ -3782,13 +3767,13 @@ ahc_linux_run_device_queue(struct ahc_so
- scb->sg_count = ahc_linux_map_seg(ahc, scb,
- sg, addr,
- cmd->request_bufflen);
-- sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
-+ sg->len |= aic_htole32(AHC_DMA_LAST_SEG);
-
- /*
- * Reset the sg list pointer.
- */
- scb->hscb->sgptr =
-- ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
-+ aic_htole32(scb->sg_list_phys | SG_FULL_RESID);
-
- /*
- * Copy the first SG into the "current"
-@@ -3797,7 +3782,7 @@ ahc_linux_run_device_queue(struct ahc_so
- scb->hscb->dataptr = sg->addr;
- scb->hscb->datacnt = sg->len;
- } else {
-- scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
-+ scb->hscb->sgptr = aic_htole32(SG_LIST_NULL);
- scb->hscb->dataptr = 0;
- scb->hscb->datacnt = 0;
- scb->sg_count = 0;
-@@ -3808,7 +3793,7 @@ ahc_linux_run_device_queue(struct ahc_so
- dev->openings--;
- dev->active++;
- dev->commands_issued++;
-- if ((dev->flags & AHC_DEV_PERIODIC_OTAG) != 0)
-+ if ((dev->flags & AIC_DEV_PERIODIC_OTAG) != 0)
- dev->commands_since_idle_or_otag++;
-
- /*
-@@ -3830,6 +3815,7 @@ ahc_linux_run_device_queue(struct ahc_so
- continue;
- }
- scb->flags |= SCB_ACTIVE;
-+ aic_scb_timer_start(scb);
- ahc_queue_scb(ahc, scb);
- }
- }
-@@ -3847,8 +3833,8 @@ ahc_linux_isr(int irq, void *dev_id, str
- ahc = (struct ahc_softc *) dev_id;
- ahc_lock(ahc, &flags);
- ours = ahc_intr(ahc);
-- if (ahc_linux_next_device_to_run(ahc) != NULL)
-- ahc_schedule_runq(ahc);
-+ if (aic_linux_next_device_to_run(ahc) != NULL)
-+ aic_schedule_runq(ahc);
- ahc_linux_run_complete_queue(ahc);
- ahc_unlock(ahc, &flags);
- return IRQ_RETVAL(ours);
-@@ -3862,10 +3848,10 @@ ahc_platform_flushwork(struct ahc_softc
- ;
- }
-
--static struct ahc_linux_target*
-+static struct aic_linux_target*
- ahc_linux_alloc_target(struct ahc_softc *ahc, u_int channel, u_int target)
- {
-- struct ahc_linux_target *targ;
-+ struct aic_linux_target *targ;
- u_int target_offset;
-
- target_offset = target;
-@@ -3878,14 +3864,14 @@ ahc_linux_alloc_target(struct ahc_softc
- memset(targ, 0, sizeof(*targ));
- targ->channel = channel;
- targ->target = target;
-- targ->ahc = ahc;
-- targ->flags = AHC_DV_REQUIRED;
-+ targ->softc = ahc;
-+ targ->flags = AIC_DV_REQUIRED;
- ahc->platform_data->targets[target_offset] = targ;
- return (targ);
- }
-
- static void
--ahc_linux_free_target(struct ahc_softc *ahc, struct ahc_linux_target *targ)
-+ahc_linux_free_target(struct ahc_softc *ahc, struct aic_linux_target *targ)
- {
- struct ahc_devinfo devinfo;
- struct ahc_initiator_tinfo *tinfo;
-@@ -3925,11 +3911,11 @@ ahc_linux_free_target(struct ahc_softc *
- free(targ, M_DEVBUF);
- }
-
--static struct ahc_linux_device*
-+static struct aic_linux_device*
- ahc_linux_alloc_device(struct ahc_softc *ahc,
-- struct ahc_linux_target *targ, u_int lun)
-+ struct aic_linux_target *targ, u_int lun)
- {
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- dev = malloc(sizeof(*dev), M_DEVBUG, M_NOWAIT);
- if (dev == NULL)
-@@ -3937,7 +3923,7 @@ ahc_linux_alloc_device(struct ahc_softc
- memset(dev, 0, sizeof(*dev));
- init_timer(&dev->timer);
- TAILQ_INIT(&dev->busyq);
-- dev->flags = AHC_DEV_UNCONFIGURED;
-+ dev->flags = AIC_DEV_UNCONFIGURED;
- dev->lun = lun;
- dev->target = targ;
-
-@@ -3960,17 +3946,17 @@ ahc_linux_alloc_device(struct ahc_softc
- }
-
- static void
--ahc_linux_free_device(struct ahc_softc *ahc, struct ahc_linux_device *dev)
-+ahc_linux_free_device(struct ahc_softc *ahc, struct aic_linux_device *dev)
- {
-- struct ahc_linux_target *targ;
-+ struct aic_linux_target *targ;
-
-- del_timer_sync(&dev->timer);
-+ del_timer(&dev->timer);
- targ = dev->target;
- targ->devices[dev->lun] = NULL;
- free(dev, M_DEVBUF);
- targ->refcount--;
- if (targ->refcount == 0
-- && (targ->flags & AHC_DV_REQUIRED) == 0)
-+ && (targ->flags & AIC_DV_REQUIRED) == 0)
- ahc_linux_free_target(ahc, targ);
- }
-
-@@ -3982,7 +3968,7 @@ ahc_send_async(struct ahc_softc *ahc, ch
- case AC_TRANSFER_NEG:
- {
- char buf[80];
-- struct ahc_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct info_str info;
- struct ahc_initiator_tinfo *tinfo;
- struct ahc_tmode_tstate *tstate;
-@@ -4076,6 +4062,20 @@ ahc_send_async(struct ahc_softc *ahc, ch
- channel - 'A');
- }
- #endif
-+ /*
-+ * Add a minimal bus settle delay for devices that are slow to
-+ * respond after bus resets.
-+ */
-+ if ((ahc->platform_data->flags & AIC_BUS_SETTLE_TIMER) == 0) {
-+ aic_freeze_simq(ahc);
-+ ahc->platform_data->flags |= AIC_BUS_SETTLE_TIMER;
-+ ahc->platform_data->bus_settle_timer.expires =
-+ jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000;
-+ add_timer(&ahc->platform_data->bus_settle_timer);
-+ } else {
-+ mod_timer(&ahc->platform_data->bus_settle_timer,
-+ jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000);
-+ }
- break;
- default:
- panic("ahc_send_async: Unexpected async event");
-@@ -4089,9 +4089,11 @@ void
- ahc_done(struct ahc_softc *ahc, struct scb *scb)
- {
- Scsi_Cmnd *cmd;
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- LIST_REMOVE(scb, pending_links);
-+ if ((scb->flags & SCB_TIMEDOUT) != 0)
-+ LIST_REMOVE(scb, timedout_links);
- if ((scb->flags & SCB_UNTAGGEDQ) != 0) {
- struct scb_tailq *untagged_q;
- int target_offset;
-@@ -4124,11 +4126,11 @@ ahc_done(struct ahc_softc *ahc, struct s
- * the sense buffer looks "sane".
- */
- cmd->sense_buffer[0] = 0;
-- if (ahc_get_transaction_status(scb) == CAM_REQ_INPROG) {
-+ if (aic_get_transaction_status(scb) == CAM_REQ_INPROG) {
- uint32_t amount_xferred;
-
- amount_xferred =
-- ahc_get_transfer_length(scb) - ahc_get_residual(scb);
-+ aic_get_transfer_length(scb) - aic_get_residual(scb);
- if ((scb->flags & SCB_TRANSMISSION_ERROR) != 0) {
- #ifdef AHC_DEBUG
- if ((ahc_debug & AHC_SHOW_MISC) != 0) {
-@@ -4136,7 +4138,17 @@ ahc_done(struct ahc_softc *ahc, struct s
- printf("Set CAM_UNCOR_PARITY\n");
- }
- #endif
-- ahc_set_transaction_status(scb, CAM_UNCOR_PARITY);
-+ aic_set_transaction_status(scb, CAM_UNCOR_PARITY);
-+#ifdef AHC_REPORT_UNDERFLOWS
-+ /*
-+ * This code is disabled by default as some
-+ * clients of the SCSI system do not properly
-+ * initialize the underflow parameter. This
-+ * results in spurious termination of commands
-+ * that complete as expected (e.g. underflow is
-+ * allowed as command can return variable amounts
-+ * of data.
-+ */
- } else if (amount_xferred < scb->io_ctx->underflow) {
- u_int i;
-
-@@ -4148,30 +4160,31 @@ ahc_done(struct ahc_softc *ahc, struct s
- ahc_print_path(ahc, scb);
- printf("Saw underflow (%ld of %ld bytes). "
- "Treated as error\n",
-- ahc_get_residual(scb),
-- ahc_get_transfer_length(scb));
-- ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-+ aic_get_residual(scb),
-+ aic_get_transfer_length(scb));
-+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
-+#endif
- } else {
-- ahc_set_transaction_status(scb, CAM_REQ_CMP);
-+ aic_set_transaction_status(scb, CAM_REQ_CMP);
- }
-- } else if (ahc_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
-+ } else if (aic_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
- ahc_linux_handle_scsi_status(ahc, dev, scb);
-- } else if (ahc_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
-- dev->flags |= AHC_DEV_UNCONFIGURED;
-- if (AHC_DV_CMD(cmd) == FALSE)
-- dev->target->flags &= ~AHC_DV_REQUIRED;
-+ } else if (aic_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
-+ dev->flags |= AIC_DEV_UNCONFIGURED;
-+ if (AIC_DV_CMD(cmd) == FALSE)
-+ dev->target->flags &= ~AIC_DV_REQUIRED;
- }
- /*
- * Start DV for devices that require it assuming the first command
- * sent does not result in a selection timeout.
- */
-- if (ahc_get_transaction_status(scb) != CAM_SEL_TIMEOUT
-- && (dev->target->flags & AHC_DV_REQUIRED) != 0)
-+ if (aic_get_transaction_status(scb) != CAM_SEL_TIMEOUT
-+ && (dev->target->flags & AIC_DV_REQUIRED) != 0)
- ahc_linux_start_dv(ahc);
-
- if (dev->openings == 1
-- && ahc_get_transaction_status(scb) == CAM_REQ_CMP
-- && ahc_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
-+ && aic_get_transaction_status(scb) == CAM_REQ_CMP
-+ && aic_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
- dev->tag_success_count++;
- /*
- * Some devices deal with temporary internal resource
-@@ -4180,7 +4193,7 @@ ahc_done(struct ahc_softc *ahc, struct s
- * back to our previous queue depth.
- */
- if ((dev->openings + dev->active) < dev->maxtags
-- && dev->tag_success_count > AHC_TAG_SUCCESS_INTERVAL) {
-+ && dev->tag_success_count > AIC_TAG_SUCCESS_INTERVAL) {
- dev->tag_success_count = 0;
- dev->openings++;
- }
-@@ -4189,32 +4202,61 @@ ahc_done(struct ahc_softc *ahc, struct s
- dev->commands_since_idle_or_otag = 0;
-
- if (TAILQ_EMPTY(&dev->busyq)) {
-- if ((dev->flags & AHC_DEV_UNCONFIGURED) != 0
-- && dev->active == 0
-- && (dev->flags & AHC_DEV_TIMER_ACTIVE) == 0)
-+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
-+ && dev->active == 0)
- ahc_linux_free_device(ahc, dev);
-- } else if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
-+ } else if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
- TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
-- dev->flags |= AHC_DEV_ON_RUN_LIST;
-+ dev->flags |= AIC_DEV_ON_RUN_LIST;
- }
-
- if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
- printf("Recovery SCB completes\n");
-- if (ahc_get_transaction_status(scb) == CAM_BDR_SENT
-- || ahc_get_transaction_status(scb) == CAM_REQ_ABORTED)
-- ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-- if ((ahc->platform_data->flags & AHC_UP_EH_SEMAPHORE) != 0) {
-- ahc->platform_data->flags &= ~AHC_UP_EH_SEMAPHORE;
-+ if (aic_get_transaction_status(scb) == CAM_BDR_SENT
-+ || aic_get_transaction_status(scb) == CAM_REQ_ABORTED)
-+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
-+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
- up(&ahc->platform_data->eh_sem);
-+ } else {
-+ struct scb *list_scb;
-+
-+ /*
-+ * We were able to complete the command successfully,
-+ * so reinstate the timeouts for all other pending
-+ * commands.
-+ */
-+ LIST_FOREACH(list_scb,
-+ &ahc->pending_scbs, pending_links) {
-+
-+ aic_scb_timer_start(list_scb);
-+ }
- }
- }
-
-+ if ((scb->platform_data->flags & AIC_TIMEOUT_ACTIVE) == 0) {
-+ /*
-+ * The completion handler believes that
-+ * commands without active timers running
-+ * have lost the race of completing before
-+ * their timer expires. Since commands in
-+ * our busy queues do not have timers running,
-+ * appease the mid-layer by adding a timer
-+ * now. This timer will be immediately
-+ * canceled by the midlayer.
-+ */
-+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
-+ }
-+
-+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) != 0)
-+ aic_release_simq_locked(ahc);
-+
- ahc_free_scb(ahc, scb);
- ahc_linux_queue_cmd_complete(ahc, cmd);
-
-- if ((ahc->platform_data->flags & AHC_DV_WAIT_SIMQ_EMPTY) != 0
-+ if ((ahc->platform_data->flags & AIC_DV_WAIT_SIMQ_EMPTY) != 0
- && LIST_FIRST(&ahc->pending_scbs) == NULL) {
-- ahc->platform_data->flags &= ~AHC_DV_WAIT_SIMQ_EMPTY;
-+ ahc->platform_data->flags &= ~AIC_DV_WAIT_SIMQ_EMPTY;
- up(&ahc->platform_data->dv_sem);
- }
-
-@@ -4222,7 +4264,7 @@ ahc_done(struct ahc_softc *ahc, struct s
-
- static void
- ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
-- struct ahc_linux_device *dev, struct scb *scb)
-+ struct aic_linux_device *dev, struct scb *scb)
- {
- struct ahc_devinfo devinfo;
-
-@@ -4242,7 +4284,7 @@ ahc_linux_handle_scsi_status(struct ahc_
- * we don't clobber the device with too many
- * commands.
- */
-- switch (ahc_get_scsi_status(scb)) {
-+ switch (aic_get_scsi_status(scb)) {
- default:
- break;
- case SCSI_STATUS_CHECK_COND:
-@@ -4256,13 +4298,15 @@ ahc_linux_handle_scsi_status(struct ahc_
- */
- cmd = scb->io_ctx;
- if (scb->flags & SCB_SENSE) {
-- u_int sense_size;
-+ struct scsi_sense_data *sense;
-+ u_int sense_size;
-+ int error_code, sense_key, asc, ascq;
-
-+ sense = ahc_get_sense_buf(ahc, scb);
- sense_size = MIN(sizeof(struct scsi_sense_data)
-- - ahc_get_sense_residual(scb),
-+ - aic_get_sense_residual(scb),
- sizeof(cmd->sense_buffer));
-- memcpy(cmd->sense_buffer,
-- ahc_get_sense_buf(ahc, scb), sense_size);
-+ memcpy(cmd->sense_buffer, sense, sense_size);
- if (sense_size < sizeof(cmd->sense_buffer))
- memset(&cmd->sense_buffer[sense_size], 0,
- sizeof(cmd->sense_buffer) - sense_size);
-@@ -4281,6 +4325,23 @@ ahc_linux_handle_scsi_status(struct ahc_
- printf("\n");
- }
- #endif
-+ /*
-+ * If this is not a DV command and the target
-+ * provides some status that makes us believe
-+ * that the target has changed (power on reset,
-+ * etc.) kick off a DV scan to re-validate the
-+ * device.
-+ */
-+ if (AIC_DV_CMD(cmd) != 0)
-+ break;
-+
-+ scsi_extract_sense(sense, &error_code,
-+ &sense_key, &asc, &ascq);
-+ if (error_code == SSD_CURRENT_ERROR
-+ && sense_key == SSD_KEY_UNIT_ATTENTION
-+ && asc == 0x29
-+ && (ascq == 0 || ascq == 1))
-+ dev->target->flags |= AIC_DV_REQUIRED;
- }
- break;
- }
-@@ -4317,7 +4378,7 @@ ahc_linux_handle_scsi_status(struct ahc_
- * this device.
- */
- if (dev->last_queuefull_same_count
-- == AHC_LOCK_TAGS_COUNT) {
-+ == AIC_LOCK_TAGS_COUNT) {
- dev->maxtags = dev->active;
- ahc_print_path(ahc, scb);
- printf("Locking max tag count at %d\n",
-@@ -4327,10 +4388,10 @@ ahc_linux_handle_scsi_status(struct ahc_
- dev->tags_on_last_queuefull = dev->active;
- dev->last_queuefull_same_count = 0;
- }
-- ahc_set_transaction_status(scb, CAM_REQUEUE_REQ);
-- ahc_set_scsi_status(scb, SCSI_STATUS_OK);
-+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
-+ aic_set_scsi_status(scb, SCSI_STATUS_OK);
- ahc_platform_set_tags(ahc, &devinfo,
-- (dev->flags & AHC_DEV_Q_BASIC)
-+ (dev->flags & AIC_DEV_Q_BASIC)
- ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
- break;
- }
-@@ -4339,9 +4400,9 @@ ahc_linux_handle_scsi_status(struct ahc_
- * as if the target returned BUSY SCSI status.
- */
- dev->openings = 1;
-- ahc_set_scsi_status(scb, SCSI_STATUS_BUSY);
-+ aic_set_scsi_status(scb, SCSI_STATUS_BUSY);
- ahc_platform_set_tags(ahc, &devinfo,
-- (dev->flags & AHC_DEV_Q_BASIC)
-+ (dev->flags & AIC_DEV_Q_BASIC)
- ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
- /* FALLTHROUGH */
- }
-@@ -4351,13 +4412,13 @@ ahc_linux_handle_scsi_status(struct ahc_
- * Set a short timer to defer sending commands for
- * a bit since Linux will not delay in this case.
- */
-- if ((dev->flags & AHC_DEV_TIMER_ACTIVE) != 0) {
-+ if ((dev->flags & AIC_DEV_TIMER_ACTIVE) != 0) {
- printf("%s:%c:%d: Device Timer still active during "
- "busy processing\n", ahc_name(ahc),
- dev->target->channel, dev->target->target);
- break;
- }
-- dev->flags |= AHC_DEV_TIMER_ACTIVE;
-+ dev->flags |= AIC_DEV_TIMER_ACTIVE;
- dev->qfrozen++;
- init_timer(&dev->timer);
- dev->timer.data = (u_long)dev;
-@@ -4384,9 +4445,9 @@ ahc_linux_queue_cmd_complete(struct ahc_
- * not guarantee the order that aborted commands will be
- * returned to us.
- */
-- struct ahc_completeq *completeq;
-- struct ahc_cmd *list_cmd;
-- struct ahc_cmd *acmd;
-+ struct aic_completeq *completeq;
-+ struct aic_cmd *list_cmd;
-+ struct aic_cmd *acmd;
-
- /*
- * Map CAM error codes into Linux Error codes. We
-@@ -4394,10 +4455,10 @@ ahc_linux_queue_cmd_complete(struct ahc_
- * full error information available when making
- * state change decisions.
- */
-- if (AHC_DV_CMD(cmd) == FALSE) {
-+ if (AIC_DV_CMD(cmd) == FALSE) {
- u_int new_status;
-
-- switch (ahc_cmd_get_transaction_status(cmd)) {
-+ switch (aic_cmd_get_transaction_status(cmd)) {
- case CAM_REQ_INPROG:
- case CAM_REQ_CMP:
- case CAM_SCSI_STATUS_ERROR:
-@@ -4424,7 +4485,17 @@ ahc_linux_queue_cmd_complete(struct ahc_
- new_status = DID_PARITY;
- break;
- case CAM_CMD_TIMEOUT:
-- new_status = DID_TIME_OUT;
-+ /*
-+ * Returning DID_TIME_OUT will
-+ * wake up the error recovery
-+ * thread instead of doing the
-+ * command retry we desire. Since
-+ * we have already recovered the
-+ * command, returning DID_ERROR
-+ * will cause a retry up to the
-+ * retry limit for this command.
-+ */
-+ new_status = DID_ERROR;
- break;
- case CAM_UA_ABORT:
- case CAM_REQ_CMP_ERR:
-@@ -4454,7 +4525,7 @@ ahc_linux_queue_cmd_complete(struct ahc_
- if (cmd->retries > 0)
- cmd->retries--;
- new_status = DID_OK;
-- ahc_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
-+ aic_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
- cmd->result |= (DRIVER_SENSE << 24);
- memset(cmd->sense_buffer, 0,
- sizeof(cmd->sense_buffer));
-@@ -4468,12 +4539,12 @@ ahc_linux_queue_cmd_complete(struct ahc_
- break;
- }
-
-- ahc_cmd_set_transaction_status(cmd, new_status);
-+ aic_cmd_set_transaction_status(cmd, new_status);
- }
-
- completeq = &ahc->platform_data->completeq;
- list_cmd = TAILQ_FIRST(completeq);
-- acmd = (struct ahc_cmd *)cmd;
-+ acmd = (struct aic_cmd *)cmd;
- while (list_cmd != NULL
- && acmd_scsi_cmd(list_cmd).serial_number
- < acmd_scsi_cmd(acmd).serial_number)
-@@ -4494,7 +4565,7 @@ ahc_linux_filter_inquiry(struct ahc_soft
- struct ahc_transinfo *curr;
- struct ahc_tmode_tstate *tstate;
- struct ahc_syncrate *syncrate;
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
- u_int maxsync;
- u_int width;
- u_int period;
-@@ -4517,9 +4588,9 @@ ahc_linux_filter_inquiry(struct ahc_soft
- sid = (struct scsi_inquiry_data *)dev->target->inq_data;
- if (SID_QUAL(sid) == SID_QUAL_LU_CONNECTED) {
-
-- dev->flags &= ~AHC_DEV_UNCONFIGURED;
-+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
- } else {
-- dev->flags |= AHC_DEV_UNCONFIGURED;
-+ dev->flags |= AIC_DEV_UNCONFIGURED;
- return;
- }
-
-@@ -4596,82 +4667,38 @@ ahc_linux_filter_inquiry(struct ahc_soft
- static void
- ahc_linux_sem_timeout(u_long arg)
- {
-+ struct scb *scb;
- struct ahc_softc *ahc;
- u_long s;
-
-- ahc = (struct ahc_softc *)arg;
--
-+ scb = (struct scb *)arg;
-+ ahc = scb->ahc_softc;
- ahc_lock(ahc, &s);
-- if ((ahc->platform_data->flags & AHC_UP_EH_SEMAPHORE) != 0) {
-- ahc->platform_data->flags &= ~AHC_UP_EH_SEMAPHORE;
-+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
-+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
- up(&ahc->platform_data->eh_sem);
- }
- ahc_unlock(ahc, &s);
- }
-
- static void
--ahc_linux_freeze_simq(struct ahc_softc *ahc)
--{
-- ahc->platform_data->qfrozen++;
-- if (ahc->platform_data->qfrozen == 1) {
-- scsi_block_requests(ahc->platform_data->host);
--
-- /* XXX What about Twin channels? */
-- ahc_platform_abort_scbs(ahc, CAM_TARGET_WILDCARD, ALL_CHANNELS,
-- CAM_LUN_WILDCARD, SCB_LIST_NULL,
-- ROLE_INITIATOR, CAM_REQUEUE_REQ);
-- }
--}
--
--static void
--ahc_linux_release_simq(u_long arg)
--{
-- struct ahc_softc *ahc;
-- u_long s;
-- int unblock_reqs;
--
-- ahc = (struct ahc_softc *)arg;
--
-- unblock_reqs = 0;
-- ahc_lock(ahc, &s);
-- if (ahc->platform_data->qfrozen > 0)
-- ahc->platform_data->qfrozen--;
-- if (ahc->platform_data->qfrozen == 0)
-- unblock_reqs = 1;
-- if (AHC_DV_SIMQ_FROZEN(ahc)
-- && ((ahc->platform_data->flags & AHC_DV_WAIT_SIMQ_RELEASE) != 0)) {
-- ahc->platform_data->flags &= ~AHC_DV_WAIT_SIMQ_RELEASE;
-- up(&ahc->platform_data->dv_sem);
-- }
-- ahc_schedule_runq(ahc);
-- ahc_unlock(ahc, &s);
-- /*
-- * There is still a race here. The mid-layer
-- * should keep its own freeze count and use
-- * a bottom half handler to run the queues
-- * so we can unblock with our own lock held.
-- */
-- if (unblock_reqs)
-- scsi_unblock_requests(ahc->platform_data->host);
--}
--
--static void
- ahc_linux_dev_timed_unfreeze(u_long arg)
- {
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
- struct ahc_softc *ahc;
- u_long s;
-
-- dev = (struct ahc_linux_device *)arg;
-- ahc = dev->target->ahc;
-+ dev = (struct aic_linux_device *)arg;
-+ ahc = dev->target->softc;
- ahc_lock(ahc, &s);
-- dev->flags &= ~AHC_DEV_TIMER_ACTIVE;
-+ dev->flags &= ~AIC_DEV_TIMER_ACTIVE;
- if (dev->qfrozen > 0)
- dev->qfrozen--;
- if (dev->qfrozen == 0
-- && (dev->flags & AHC_DEV_ON_RUN_LIST) == 0)
-+ && (dev->flags & AIC_DEV_ON_RUN_LIST) == 0)
- ahc_linux_run_device_queue(ahc, dev);
-- if (TAILQ_EMPTY(&dev->busyq)
-+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
-+ && TAILQ_EMPTY(&dev->busyq)
- && dev->active == 0)
- ahc_linux_free_device(ahc, dev);
- ahc_unlock(ahc, &s);
-@@ -4681,9 +4708,9 @@ static int
- ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
- {
- struct ahc_softc *ahc;
-- struct ahc_cmd *acmd;
-- struct ahc_cmd *list_acmd;
-- struct ahc_linux_device *dev;
-+ struct aic_cmd *acmd;
-+ struct aic_cmd *list_acmd;
-+ struct aic_linux_device *dev;
- struct scb *pending_scb;
- u_long s;
- u_int saved_scbptr;
-@@ -4701,7 +4728,7 @@ ahc_linux_queue_recovery_cmd(Scsi_Cmnd *
- paused = FALSE;
- wait = FALSE;
- ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
-- acmd = (struct ahc_cmd *)cmd;
-+ acmd = (struct aic_cmd *)cmd;
-
- printf("%s:%d:%d:%d: Attempting to queue a%s message\n",
- ahc_name(ahc), cmd->device->channel,
-@@ -4763,13 +4790,24 @@ ahc_linux_queue_recovery_cmd(Scsi_Cmnd *
- if (flag == SCB_ABORT) {
- TAILQ_REMOVE(&dev->busyq, list_acmd, acmd_links.tqe);
- cmd->result = DID_ABORT << 16;
-+ /*
-+ * The completion handler believes that
-+ * commands without active timers running
-+ * have lost the race of completing before
-+ * their timer expires. Since commands in our
-+ * busy queues do not have timers running,
-+ * appease the mid-layer by adding a timer
-+ * now. This timer will be immediately
-+ * canceled by the midlayer.
-+ */
-+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
- ahc_linux_queue_cmd_complete(ahc, cmd);
- retval = SUCCESS;
- goto done;
- }
- }
-
-- if ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED)) == 0
-+ if ((dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED)) == 0
- && ahc_search_untagged_queues(ahc, cmd, cmd->device->id,
- cmd->device->channel + 'A',
- cmd->device->lun,
-@@ -4985,10 +5023,10 @@ done:
- struct timer_list timer;
- int ret;
-
-- ahc->platform_data->flags |= AHC_UP_EH_SEMAPHORE;
-+ pending_scb->platform_data->flags |= AIC_SCB_UP_EH_SEM;
- spin_unlock_irq(&ahc->platform_data->spin_lock);
- init_timer(&timer);
-- timer.data = (u_long)ahc;
-+ timer.data = (u_long)pending_scb;
- timer.expires = jiffies + (5 * HZ);
- timer.function = ahc_linux_sem_timeout;
- add_timer(&timer);
-@@ -5002,7 +5040,7 @@ done:
- }
- spin_lock_irq(&ahc->platform_data->spin_lock);
- }
-- ahc_schedule_runq(ahc);
-+ aic_schedule_runq(ahc);
- ahc_linux_run_complete_queue(ahc);
- ahc_midlayer_entrypoint_unlock(ahc, &s);
- return (retval);
-@@ -5011,7 +5049,8 @@ done:
- void
- ahc_platform_dump_card_state(struct ahc_softc *ahc)
- {
-- struct ahc_linux_device *dev;
-+ struct Scsi_Host *host;
-+ struct aic_linux_device *dev;
- int channel;
- int maxchannel;
- int target;
-@@ -5019,6 +5058,14 @@ ahc_platform_dump_card_state(struct ahc_
- int lun;
- int i;
-
-+ host = ahc->platform_data->host;
-+ printf("%s: Host Status: Failed(%d) %s%s%s\n",
-+ ahc_name(ahc),
-+ host->host_failed,
-+ host->eh_active ? "eh_active " : "",
-+ host->host_blocked ? "host_blocked " : "",
-+ host->host_self_blocked ? "host_self_blocked " : "");
-+
- maxchannel = (ahc->features & AHC_TWIN) ? 1 : 0;
- maxtarget = (ahc->features & AHC_WIDE) ? 15 : 7;
- for (channel = 0; channel <= maxchannel; channel++) {
-@@ -5026,7 +5073,7 @@ ahc_platform_dump_card_state(struct ahc_
- for (target = 0; target <=maxtarget; target++) {
-
- for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
-- struct ahc_cmd *acmd;
-+ struct aic_cmd *acmd;
-
- dev = ahc_linux_get_device(ahc, channel, target,
- lun, /*alloc*/FALSE);
-@@ -5068,41 +5115,33 @@ static void __exit
- ahc_linux_exit(void)
- {
- struct ahc_softc *ahc;
-- u_long l;
-
- /*
-- * Shutdown DV threads before going into the SCSI mid-layer.
-+ * Shutdown our threads before going into the SCSI mid-layer.
- * This avoids situations where the mid-layer locks the entire
- * kernel so that waiting for our DV threads to exit leads
- * to deadlock.
- */
-- ahc_list_lock(&l);
- TAILQ_FOREACH(ahc, &ahc_tailq, links) {
-
- ahc_linux_kill_dv_thread(ahc);
-+ ahc_terminate_recovery_thread(ahc);
- }
-- ahc_list_unlock(&l);
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
--
-- ahc_linux_pci_exit();
--
-- /*
-- * Get rid of the non-pci devices.
-- *
-- * XXX(hch): switch over eisa support to new LDM-based API
-- */
-- TAILQ_FOREACH(ahc, &ahc_tailq, links)
-- ahc_linux_release(ahc->platform_data->host);
--#else
-- scsi_unregister_module(MODULE_SCSI_HA, &aic7xxx_driver_template);
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
- /*
- * In 2.4 we have to unregister from the PCI core _after_
- * unregistering from the scsi midlayer to avoid dangling
- * references.
- */
-+ scsi_unregister_module(MODULE_SCSI_HA, &aic7xxx_driver_template);
-+#endif
-+#ifdef CONFIG_PCI
- ahc_linux_pci_exit();
- #endif
-+#ifdef CONFIG_EISA
-+ ahc_linux_eisa_exit();
-+#endif
- }
-
- module_init(ahc_linux_init);
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_osm.h 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_osm.h 2003-12-28 23:21:40.000000000 -0800
-@@ -53,50 +53,22 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#147 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#166 $
- *
- */
- #ifndef _AIC7XXX_LINUX_H_
- #define _AIC7XXX_LINUX_H_
-
--#include <linux/types.h>
--#include <linux/blkdev.h>
--#include <linux/delay.h>
--#include <linux/ioport.h>
--#include <linux/pci.h>
--#include <linux/smp_lock.h>
- #include <linux/version.h>
--#include <linux/module.h>
--#include <asm/byteorder.h>
--#include <asm/io.h>
-
- #ifndef KERNEL_VERSION
- #define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
- #endif
-
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
--#include <linux/interrupt.h> /* For tasklet support. */
- #include <linux/config.h>
--#include <linux/slab.h>
--#else
--#include <linux/malloc.h>
- #endif
-
--/* Core SCSI definitions */
--#define AIC_LIB_PREFIX ahc
--#include "scsi.h"
--#include "hosts.h"
--
--/* Name space conflict with BSD queue macros */
--#ifdef LIST_HEAD
--#undef LIST_HEAD
--#endif
--
--#include "cam.h"
--#include "queue.h"
--#include "scsi_message.h"
--#include "aiclib.h"
--
- /*********************************** Debugging ********************************/
- #ifdef CONFIG_AIC7XXX_DEBUG_ENABLE
- #ifdef CONFIG_AIC7XXX_DEBUG_MASK
-@@ -111,42 +83,18 @@
- /* No debugging code. */
- #endif
-
--/************************* Forward Declarations *******************************/
--struct ahc_softc;
--typedef struct pci_dev *ahc_dev_softc_t;
--typedef Scsi_Cmnd *ahc_io_ctx_t;
--
--/******************************* Byte Order ***********************************/
--#define ahc_htobe16(x) cpu_to_be16(x)
--#define ahc_htobe32(x) cpu_to_be32(x)
--#define ahc_htobe64(x) cpu_to_be64(x)
--#define ahc_htole16(x) cpu_to_le16(x)
--#define ahc_htole32(x) cpu_to_le32(x)
--#define ahc_htole64(x) cpu_to_le64(x)
--
--#define ahc_be16toh(x) be16_to_cpu(x)
--#define ahc_be32toh(x) be32_to_cpu(x)
--#define ahc_be64toh(x) be64_to_cpu(x)
--#define ahc_le16toh(x) le16_to_cpu(x)
--#define ahc_le32toh(x) le32_to_cpu(x)
--#define ahc_le64toh(x) le64_to_cpu(x)
--
--#ifndef LITTLE_ENDIAN
--#define LITTLE_ENDIAN 1234
--#endif
--
--#ifndef BIG_ENDIAN
--#define BIG_ENDIAN 4321
--#endif
-+/********************************** Includes **********************************/
-+/* Core SCSI definitions */
-+#define AIC_LIB_PREFIX ahc
-+#define AIC_CONST_PREFIX AHC
-
--#ifndef BYTE_ORDER
--#if defined(__BIG_ENDIAN)
--#define BYTE_ORDER BIG_ENDIAN
--#endif
--#if defined(__LITTLE_ENDIAN)
--#define BYTE_ORDER LITTLE_ENDIAN
-+#ifdef CONFIG_AIC7XXX_REG_PRETTY_PRINT
-+#define AIC_DEBUG_REGISTERS 1
-+#else
-+#define AIC_DEBUG_REGISTERS 0
- #endif
--#endif /* BYTE_ORDER */
-+#define AIC_CORE_INCLUDE "aic7xxx.h"
-+#include "aiclib.h"
-
- /************************* Configuration Data *********************************/
- extern u_int aic7xxx_no_probe;
-@@ -154,142 +102,9 @@ extern u_int aic7xxx_allow_memio;
- extern int aic7xxx_detect_complete;
- extern Scsi_Host_Template aic7xxx_driver_template;
-
--/***************************** Bus Space/DMA **********************************/
--
--#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,17)
--typedef dma_addr_t bus_addr_t;
--#else
--typedef uint32_t bus_addr_t;
--#endif
--typedef uint32_t bus_size_t;
--
--typedef enum {
-- BUS_SPACE_MEMIO,
-- BUS_SPACE_PIO
--} bus_space_tag_t;
--
--typedef union {
-- u_long ioport;
-- volatile uint8_t *maddr;
--} bus_space_handle_t;
--
--typedef struct bus_dma_segment
--{
-- bus_addr_t ds_addr;
-- bus_size_t ds_len;
--} bus_dma_segment_t;
--
--struct ahc_linux_dma_tag
--{
-- bus_size_t alignment;
-- bus_size_t boundary;
-- bus_size_t maxsize;
--};
--typedef struct ahc_linux_dma_tag* bus_dma_tag_t;
--
--struct ahc_linux_dmamap
--{
-- bus_addr_t bus_addr;
--};
--typedef struct ahc_linux_dmamap* bus_dmamap_t;
--
--typedef int bus_dma_filter_t(void*, bus_addr_t);
--typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
--
--#define BUS_DMA_WAITOK 0x0
--#define BUS_DMA_NOWAIT 0x1
--#define BUS_DMA_ALLOCNOW 0x2
--#define BUS_DMA_LOAD_SEGS 0x4 /*
-- * Argument is an S/G list not
-- * a single buffer.
-- */
--
--#define BUS_SPACE_MAXADDR 0xFFFFFFFF
--#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
--#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
--
--int ahc_dma_tag_create(struct ahc_softc *, bus_dma_tag_t /*parent*/,
-- bus_size_t /*alignment*/, bus_size_t /*boundary*/,
-- bus_addr_t /*lowaddr*/, bus_addr_t /*highaddr*/,
-- bus_dma_filter_t*/*filter*/, void */*filterarg*/,
-- bus_size_t /*maxsize*/, int /*nsegments*/,
-- bus_size_t /*maxsegsz*/, int /*flags*/,
-- bus_dma_tag_t */*dma_tagp*/);
--
--void ahc_dma_tag_destroy(struct ahc_softc *, bus_dma_tag_t /*tag*/);
--
--int ahc_dmamem_alloc(struct ahc_softc *, bus_dma_tag_t /*dmat*/,
-- void** /*vaddr*/, int /*flags*/,
-- bus_dmamap_t* /*mapp*/);
--
--void ahc_dmamem_free(struct ahc_softc *, bus_dma_tag_t /*dmat*/,
-- void* /*vaddr*/, bus_dmamap_t /*map*/);
--
--void ahc_dmamap_destroy(struct ahc_softc *, bus_dma_tag_t /*tag*/,
-- bus_dmamap_t /*map*/);
--
--int ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t /*dmat*/,
-- bus_dmamap_t /*map*/, void * /*buf*/,
-- bus_size_t /*buflen*/, bus_dmamap_callback_t *,
-- void */*callback_arg*/, int /*flags*/);
--
--int ahc_dmamap_unload(struct ahc_softc *, bus_dma_tag_t, bus_dmamap_t);
--
--/*
-- * Operations performed by ahc_dmamap_sync().
-- */
--#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
--#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
--#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
--#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
--
--/*
-- * XXX
-- * ahc_dmamap_sync is only used on buffers allocated with
-- * the pci_alloc_consistent() API. Although I'm not sure how
-- * this works on architectures with a write buffer, Linux does
-- * not have an API to sync "coherent" memory. Perhaps we need
-- * to do an mb()?
-- */
--#define ahc_dmamap_sync(ahc, dma_tag, dmamap, offset, len, op)
--
--/************************** Timer DataStructures ******************************/
--typedef struct timer_list ahc_timer_t;
--
--/********************************** Includes **********************************/
--#ifdef CONFIG_AIC7XXX_REG_PRETTY_PRINT
--#define AIC_DEBUG_REGISTERS 1
--#else
--#define AIC_DEBUG_REGISTERS 0
--#endif
--#include "aic7xxx.h"
--
--/***************************** Timer Facilities *******************************/
--#define ahc_timer_init init_timer
--#define ahc_timer_stop del_timer_sync
--typedef void ahc_linux_callback_t (u_long);
--static __inline void ahc_timer_reset(ahc_timer_t *timer, int usec,
-- ahc_callback_t *func, void *arg);
--static __inline void ahc_scb_timer_reset(struct scb *scb, u_int usec);
--
--static __inline void
--ahc_timer_reset(ahc_timer_t *timer, int usec, ahc_callback_t *func, void *arg)
--{
-- struct ahc_softc *ahc;
--
-- ahc = (struct ahc_softc *)arg;
-- del_timer(timer);
-- timer->data = (u_long)arg;
-- timer->expires = jiffies + (usec * HZ)/1000000;
-- timer->function = (ahc_linux_callback_t*)func;
-- add_timer(timer);
--}
--
--static __inline void
--ahc_scb_timer_reset(struct scb *scb, u_int usec)
--{
-- mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000);
--}
-+/***************************** Domain Validation ******************************/
-+void ahc_linux_dv_complete(Scsi_Cmnd *cmd);
-+void ahc_linux_dv_timeout(struct scsi_cmnd *cmd);
-
- /***************************** SMP support ************************************/
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,17)
-@@ -304,187 +119,7 @@ ahc_scb_timer_reset(struct scb *scb, u_i
- #define AHC_SCSI_HAS_HOST_LOCK 0
- #endif
-
--#define AIC7XXX_DRIVER_VERSION "6.2.35"
--
--/**************************** Front End Queues ********************************/
--/*
-- * Data structure used to cast the Linux struct scsi_cmnd to something
-- * that allows us to use the queue macros. The linux structure has
-- * plenty of space to hold the links fields as required by the queue
-- * macros, but the queue macors require them to have the correct type.
-- */
--struct ahc_cmd_internal {
-- /* Area owned by the Linux scsi layer. */
-- uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
-- union {
-- STAILQ_ENTRY(ahc_cmd) ste;
-- LIST_ENTRY(ahc_cmd) le;
-- TAILQ_ENTRY(ahc_cmd) tqe;
-- } links;
-- uint32_t end;
--};
--
--struct ahc_cmd {
-- union {
-- struct ahc_cmd_internal icmd;
-- struct scsi_cmnd scsi_cmd;
-- } un;
--};
--
--#define acmd_icmd(cmd) ((cmd)->un.icmd)
--#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
--#define acmd_links un.icmd.links
--
--/*************************** Device Data Structures ***************************/
--/*
-- * A per probed device structure used to deal with some error recovery
-- * scenarios that the Linux mid-layer code just doesn't know how to
-- * handle. The structure allocated for a device only becomes persistent
-- * after a successfully completed inquiry command to the target when
-- * that inquiry data indicates a lun is present.
-- */
--TAILQ_HEAD(ahc_busyq, ahc_cmd);
--typedef enum {
-- AHC_DEV_UNCONFIGURED = 0x01,
-- AHC_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
-- AHC_DEV_TIMER_ACTIVE = 0x04, /* Our timer is active */
-- AHC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
-- AHC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
-- AHC_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
-- AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
-- AHC_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
--} ahc_linux_dev_flags;
--
--struct ahc_linux_target;
--struct ahc_linux_device {
-- TAILQ_ENTRY(ahc_linux_device) links;
-- struct ahc_busyq busyq;
--
-- /*
-- * The number of transactions currently
-- * queued to the device.
-- */
-- int active;
--
-- /*
-- * The currently allowed number of
-- * transactions that can be queued to
-- * the device. Must be signed for
-- * conversion from tagged to untagged
-- * mode where the device may have more
-- * than one outstanding active transaction.
-- */
-- int openings;
--
-- /*
-- * A positive count indicates that this
-- * device's queue is halted.
-- */
-- u_int qfrozen;
--
-- /*
-- * Cumulative command counter.
-- */
-- u_long commands_issued;
--
-- /*
-- * The number of tagged transactions when
-- * running at our current opening level
-- * that have been successfully received by
-- * this device since the last QUEUE FULL.
-- */
-- u_int tag_success_count;
--#define AHC_TAG_SUCCESS_INTERVAL 50
--
-- ahc_linux_dev_flags flags;
--
-- /*
-- * Per device timer.
-- */
-- struct timer_list timer;
--
-- /*
-- * The high limit for the tags variable.
-- */
-- u_int maxtags;
--
-- /*
-- * The computed number of tags outstanding
-- * at the time of the last QUEUE FULL event.
-- */
-- u_int tags_on_last_queuefull;
--
-- /*
-- * How many times we have seen a queue full
-- * with the same number of tags. This is used
-- * to stop our adaptive queue depth algorithm
-- * on devices with a fixed number of tags.
-- */
-- u_int last_queuefull_same_count;
--#define AHC_LOCK_TAGS_COUNT 50
--
-- /*
-- * How many transactions have been queued
-- * without the device going idle. We use
-- * this statistic to determine when to issue
-- * an ordered tag to prevent transaction
-- * starvation. This statistic is only updated
-- * if the AHC_DEV_PERIODIC_OTAG flag is set
-- * on this device.
-- */
-- u_int commands_since_idle_or_otag;
--#define AHC_OTAG_THRESH 500
--
-- int lun;
-- Scsi_Device *scsi_device;
-- struct ahc_linux_target *target;
--};
--
--typedef enum {
-- AHC_DV_REQUIRED = 0x01,
-- AHC_INQ_VALID = 0x02,
-- AHC_BASIC_DV = 0x04,
-- AHC_ENHANCED_DV = 0x08
--} ahc_linux_targ_flags;
--
--/* DV States */
--typedef enum {
-- AHC_DV_STATE_EXIT = 0,
-- AHC_DV_STATE_INQ_SHORT_ASYNC,
-- AHC_DV_STATE_INQ_ASYNC,
-- AHC_DV_STATE_INQ_ASYNC_VERIFY,
-- AHC_DV_STATE_TUR,
-- AHC_DV_STATE_REBD,
-- AHC_DV_STATE_INQ_VERIFY,
-- AHC_DV_STATE_WEB,
-- AHC_DV_STATE_REB,
-- AHC_DV_STATE_SU,
-- AHC_DV_STATE_BUSY
--} ahc_dv_state;
--
--struct ahc_linux_target {
-- struct ahc_linux_device *devices[AHC_NUM_LUNS];
-- int channel;
-- int target;
-- int refcount;
-- struct ahc_transinfo last_tinfo;
-- struct ahc_softc *ahc;
-- ahc_linux_targ_flags flags;
-- struct scsi_inquiry_data *inq_data;
-- /*
-- * The next "fallback" period to use for narrow/wide transfers.
-- */
-- uint8_t dv_next_narrow_period;
-- uint8_t dv_next_wide_period;
-- uint8_t dv_max_width;
-- uint8_t dv_max_ppr_options;
-- uint8_t dv_last_ppr_options;
-- u_int dv_echo_size;
-- ahc_dv_state dv_state;
-- u_int dv_state_retry;
-- char *dv_buffer;
-- char *dv_buffer1;
--};
-+#define AIC7XXX_DRIVER_VERSION "6.3.4"
-
- /********************* Definitions Required by the Core ***********************/
- /*
-@@ -506,120 +141,39 @@ extern u_int ahc_linux_nseg;
- #define AHC_NSEG 128
- #endif
-
--/*
-- * Per-SCB OSM storage.
-- */
--typedef enum {
-- AHC_UP_EH_SEMAPHORE = 0x1
--} ahc_linux_scb_flags;
--
--struct scb_platform_data {
-- struct ahc_linux_device *dev;
-- bus_addr_t buf_busaddr;
-- uint32_t xfer_len;
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-- uint32_t resid; /* Transfer residual */
--#endif
-- uint32_t sense_resid; /* Auto-Sense residual */
-- ahc_linux_scb_flags flags;
--};
--
--/*
-- * Define a structure used for each host adapter. All members are
-- * aligned on a boundary >= the size of the member to honor the
-- * alignment restrictions of the various platforms supported by
-- * this driver.
-- */
--typedef enum {
-- AHC_DV_WAIT_SIMQ_EMPTY = 0x01,
-- AHC_DV_WAIT_SIMQ_RELEASE = 0x02,
-- AHC_DV_ACTIVE = 0x04,
-- AHC_DV_SHUTDOWN = 0x08,
-- AHC_RUN_CMPLT_Q_TIMER = 0x10
--} ahc_linux_softc_flags;
--
--TAILQ_HEAD(ahc_completeq, ahc_cmd);
--
--struct ahc_platform_data {
-- /*
-- * Fields accessed from interrupt context.
-- */
-- struct ahc_linux_target *targets[AHC_NUM_TARGETS];
-- TAILQ_HEAD(, ahc_linux_device) device_runq;
-- struct ahc_completeq completeq;
--
-- spinlock_t spin_lock;
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- struct tasklet_struct runq_tasklet;
--#endif
-- u_int qfrozen;
-- pid_t dv_pid;
-- struct timer_list completeq_timer;
-- struct timer_list reset_timer;
-- struct semaphore eh_sem;
-- struct semaphore dv_sem;
-- struct semaphore dv_cmd_sem; /* XXX This needs to be in
-- * the target struct
-- */
-- struct scsi_device *dv_scsi_dev;
-- struct Scsi_Host *host; /* pointer to scsi host */
--#define AHC_LINUX_NOIRQ ((uint32_t)~0)
-- uint32_t irq; /* IRQ for this adapter */
-- uint32_t bios_address;
-- uint32_t mem_busaddr; /* Mem Base Addr */
-- bus_addr_t hw_dma_mask;
-- ahc_linux_softc_flags flags;
--};
--
--/************************** OS Utility Wrappers *******************************/
--#define printf printk
--#define M_NOWAIT GFP_ATOMIC
--#define M_WAITOK 0
--#define malloc(size, type, flags) kmalloc(size, flags)
--#define free(ptr, type) kfree(ptr)
--
--static __inline void ahc_delay(long);
--static __inline void
--ahc_delay(long usec)
--{
-- /*
-- * udelay on Linux can have problems for
-- * multi-millisecond waits. Wait at most
-- * 1024us per call.
-- */
-- while (usec > 0) {
-- udelay(usec % 1024);
-- usec -= 1024;
-- }
--}
--
-+/************************** Error Recovery ************************************/
-+static __inline void ahc_wakeup_recovery_thread(struct ahc_softc *ahc);
-+
-+static __inline void
-+ahc_wakeup_recovery_thread(struct ahc_softc *ahc)
-+{
-+ up(&ahc->platform_data->recovery_sem);
-+}
-+
-+int ahc_spawn_recovery_thread(struct ahc_softc *ahc);
-+void ahc_terminate_recovery_thread(struct ahc_softc *ahc);
-+void ahc_set_recoveryscb(struct ahc_softc *ahc,
-+ struct scb *scb);
-
- /***************************** Low Level I/O **********************************/
--#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__)
--#define MMAPIO
--#endif
--
- static __inline uint8_t ahc_inb(struct ahc_softc * ahc, long port);
- static __inline void ahc_outb(struct ahc_softc * ahc, long port, uint8_t val);
- static __inline void ahc_outsb(struct ahc_softc * ahc, long port,
- uint8_t *, int count);
- static __inline void ahc_insb(struct ahc_softc * ahc, long port,
- uint8_t *, int count);
-+static __inline void ahc_flush_device_writes(struct ahc_softc *);
-
- static __inline uint8_t
- ahc_inb(struct ahc_softc * ahc, long port)
- {
- uint8_t x;
--#ifdef MMAPIO
-
- if (ahc->tag == BUS_SPACE_MEMIO) {
- x = readb(ahc->bsh.maddr + port);
- } else {
- x = inb(ahc->bsh.ioport + port);
- }
--#else
-- x = inb(ahc->bsh.ioport + port);
--#endif
- mb();
- return (x);
- }
-@@ -627,15 +181,11 @@ ahc_inb(struct ahc_softc * ahc, long por
- static __inline void
- ahc_outb(struct ahc_softc * ahc, long port, uint8_t val)
- {
--#ifdef MMAPIO
- if (ahc->tag == BUS_SPACE_MEMIO) {
- writeb(val, ahc->bsh.maddr + port);
- } else {
- outb(val, ahc->bsh.ioport + port);
- }
--#else
-- outb(val, ahc->bsh.ioport + port);
--#endif
- mb();
- }
-
-@@ -667,6 +217,13 @@ ahc_insb(struct ahc_softc * ahc, long po
- *array++ = ahc_inb(ahc, port);
- }
-
-+static __inline void
-+ahc_flush_device_writes(struct ahc_softc *ahc)
-+{
-+ /* XXX Is this sufficient for all architectures??? */
-+ ahc_inb(ahc, INTSTAT);
-+}
-+
- /**************************** Initialization **********************************/
- int ahc_linux_register_host(struct ahc_softc *,
- Scsi_Host_Template *);
-@@ -795,174 +352,41 @@ ahc_list_unlock(unsigned long *flags)
- }
-
- /******************************* PCI Definitions ******************************/
--/*
-- * PCIM_xxx: mask to locate subfield in register
-- * PCIR_xxx: config register offset
-- * PCIC_xxx: device class
-- * PCIS_xxx: device subclass
-- * PCIP_xxx: device programming interface
-- * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
-- * PCID_xxx: device ID
-- */
--#define PCIR_DEVVENDOR 0x00
--#define PCIR_VENDOR 0x00
--#define PCIR_DEVICE 0x02
--#define PCIR_COMMAND 0x04
--#define PCIM_CMD_PORTEN 0x0001
--#define PCIM_CMD_MEMEN 0x0002
--#define PCIM_CMD_BUSMASTEREN 0x0004
--#define PCIM_CMD_MWRICEN 0x0010
--#define PCIM_CMD_PERRESPEN 0x0040
--#define PCIM_CMD_SERRESPEN 0x0100
--#define PCIR_STATUS 0x06
--#define PCIR_REVID 0x08
--#define PCIR_PROGIF 0x09
--#define PCIR_SUBCLASS 0x0a
--#define PCIR_CLASS 0x0b
--#define PCIR_CACHELNSZ 0x0c
--#define PCIR_LATTIMER 0x0d
--#define PCIR_HEADERTYPE 0x0e
--#define PCIM_MFDEV 0x80
--#define PCIR_BIST 0x0f
--#define PCIR_CAP_PTR 0x34
--
--/* config registers for header type 0 devices */
--#define PCIR_MAPS 0x10
--#define PCIR_SUBVEND_0 0x2c
--#define PCIR_SUBDEV_0 0x2e
--
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- extern struct pci_driver aic7xxx_pci_driver;
- #endif
-
--typedef enum
--{
-- AHC_POWER_STATE_D0,
-- AHC_POWER_STATE_D1,
-- AHC_POWER_STATE_D2,
-- AHC_POWER_STATE_D3
--} ahc_power_state;
--
--void ahc_power_state_change(struct ahc_softc *ahc,
-- ahc_power_state new_state);
- /**************************** VL/EISA Routines ********************************/
--int aic7770_linux_probe(Scsi_Host_Template *);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) \
-+ && (defined(__i386__) || defined(__alpha__)) \
-+ && (!defined(CONFIG_EISA)))
-+#define CONFIG_EISA
-+#endif
-+
-+#ifdef CONFIG_EISA
-+extern uint32_t aic7xxx_probe_eisa_vl;
-+void ahc_linux_eisa_init(void);
-+void ahc_linux_eisa_exit(void);
- int aic7770_map_registers(struct ahc_softc *ahc,
- u_int port);
- int aic7770_map_int(struct ahc_softc *ahc, u_int irq);
-+#endif
-
- /******************************* PCI Routines *********************************/
-+#ifdef CONFIG_PCI
- int ahc_linux_pci_init(void);
- void ahc_linux_pci_exit(void);
- int ahc_pci_map_registers(struct ahc_softc *ahc);
- int ahc_pci_map_int(struct ahc_softc *ahc);
-+#endif
-
--static __inline uint32_t ahc_pci_read_config(ahc_dev_softc_t pci,
-- int reg, int width);
--
--static __inline uint32_t
--ahc_pci_read_config(ahc_dev_softc_t pci, int reg, int width)
--{
-- switch (width) {
-- case 1:
-- {
-- uint8_t retval;
--
-- pci_read_config_byte(pci, reg, &retval);
-- return (retval);
-- }
-- case 2:
-- {
-- uint16_t retval;
-- pci_read_config_word(pci, reg, &retval);
-- return (retval);
-- }
-- case 4:
-- {
-- uint32_t retval;
-- pci_read_config_dword(pci, reg, &retval);
-- return (retval);
-- }
-- default:
-- panic("ahc_pci_read_config: Read size too big");
-- /* NOTREACHED */
-- return (0);
-- }
--}
--
--static __inline void ahc_pci_write_config(ahc_dev_softc_t pci,
-- int reg, uint32_t value,
-- int width);
--
--static __inline void
--ahc_pci_write_config(ahc_dev_softc_t pci, int reg, uint32_t value, int width)
--{
-- switch (width) {
-- case 1:
-- pci_write_config_byte(pci, reg, value);
-- break;
-- case 2:
-- pci_write_config_word(pci, reg, value);
-- break;
-- case 4:
-- pci_write_config_dword(pci, reg, value);
-- break;
-- default:
-- panic("ahc_pci_write_config: Write size too big");
-- /* NOTREACHED */
-- }
--}
--
--static __inline int ahc_get_pci_function(ahc_dev_softc_t);
--static __inline int
--ahc_get_pci_function(ahc_dev_softc_t pci)
--{
-- return (PCI_FUNC(pci->devfn));
--}
--
--static __inline int ahc_get_pci_slot(ahc_dev_softc_t);
--static __inline int
--ahc_get_pci_slot(ahc_dev_softc_t pci)
--{
-- return (PCI_SLOT(pci->devfn));
--}
--
--static __inline int ahc_get_pci_bus(ahc_dev_softc_t);
--static __inline int
--ahc_get_pci_bus(ahc_dev_softc_t pci)
--{
-- return (pci->bus->number);
--}
--
--static __inline void ahc_flush_device_writes(struct ahc_softc *);
--static __inline void
--ahc_flush_device_writes(struct ahc_softc *ahc)
--{
-- /* XXX Is this sufficient for all architectures??? */
-- ahc_inb(ahc, INTSTAT);
--}
--
--#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0)
--#define pci_map_sg(pdev, sg_list, nseg, direction) (nseg)
--#define pci_unmap_sg(pdev, sg_list, nseg, direction)
--#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
--#define sg_dma_len(sg) ((sg)->length)
--#define pci_map_single(pdev, buffer, bufflen, direction) \
-- (VIRT_TO_BUS(buffer))
--#define pci_unmap_single(pdev, buffer, buflen, direction)
--#endif
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
--#define ahc_pci_set_dma_mask pci_set_dma_mask
-+/**************************** Proc FS Support *********************************/
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+int ahc_linux_proc_info(char *, char **, off_t, int, int, int);
- #else
--/*
-- * Always "return" 0 for success.
-- */
--#define ahc_pci_set_dma_mask(dev_softc, mask) \
-- (((dev_softc)->dma_mask = mask) && 0)
-+int ahc_linux_proc_info(struct Scsi_Host *, char *, char **,
-+ off_t, int, int);
- #endif
--/**************************** Proc FS Support *********************************/
--int ahc_linux_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
-
- /*************************** Domain Validation ********************************/
- #define AHC_DV_CMD(cmd) ((cmd)->scsi_done == ahc_linux_dv_complete)
-@@ -971,194 +395,9 @@ int ahc_linux_proc_info(struct Scsi_Host
- && (ahc)->platform_data->qfrozen == 1)
-
- /*********************** Transaction Access Wrappers *************************/
--static __inline void ahc_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);
--static __inline void ahc_set_transaction_status(struct scb *, uint32_t);
--static __inline void ahc_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);
--static __inline void ahc_set_scsi_status(struct scb *, uint32_t);
--static __inline uint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd);
--static __inline uint32_t ahc_get_transaction_status(struct scb *);
--static __inline uint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd);
--static __inline uint32_t ahc_get_scsi_status(struct scb *);
--static __inline void ahc_set_transaction_tag(struct scb *, int, u_int);
--static __inline u_long ahc_get_transfer_length(struct scb *);
--static __inline int ahc_get_transfer_dir(struct scb *);
--static __inline void ahc_set_residual(struct scb *, u_long);
--static __inline void ahc_set_sense_residual(struct scb *scb, u_long resid);
--static __inline u_long ahc_get_residual(struct scb *);
--static __inline u_long ahc_get_sense_residual(struct scb *);
--static __inline int ahc_perform_autosense(struct scb *);
--static __inline uint32_t ahc_get_sense_bufsize(struct ahc_softc *,
-- struct scb *);
--static __inline void ahc_notify_xfer_settings_change(struct ahc_softc *,
-- struct ahc_devinfo *);
--static __inline void ahc_platform_scb_free(struct ahc_softc *ahc,
-- struct scb *scb);
--static __inline void ahc_freeze_scb(struct scb *scb);
--
--static __inline
--void ahc_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status)
--{
-- cmd->result &= ~(CAM_STATUS_MASK << 16);
-- cmd->result |= status << 16;
--}
--
--static __inline
--void ahc_set_transaction_status(struct scb *scb, uint32_t status)
--{
-- ahc_cmd_set_transaction_status(scb->io_ctx,status);
--}
--
--static __inline
--void ahc_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status)
--{
-- cmd->result &= ~0xFFFF;
-- cmd->result |= status;
--}
--
--static __inline
--void ahc_set_scsi_status(struct scb *scb, uint32_t status)
--{
-- ahc_cmd_set_scsi_status(scb->io_ctx, status);
--}
--
--static __inline
--uint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd)
--{
-- return ((cmd->result >> 16) & CAM_STATUS_MASK);
--}
--
--static __inline
--uint32_t ahc_get_transaction_status(struct scb *scb)
--{
-- return (ahc_cmd_get_transaction_status(scb->io_ctx));
--}
--
--static __inline
--uint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd)
--{
-- return (cmd->result & 0xFFFF);
--}
--
--static __inline
--uint32_t ahc_get_scsi_status(struct scb *scb)
--{
-- return (ahc_cmd_get_scsi_status(scb->io_ctx));
--}
--
--static __inline
--void ahc_set_transaction_tag(struct scb *scb, int enabled, u_int type)
--{
-- /*
-- * Nothing to do for linux as the incoming transaction
-- * has no concept of tag/non tagged, etc.
-- */
--}
--
--static __inline
--u_long ahc_get_transfer_length(struct scb *scb)
--{
-- return (scb->platform_data->xfer_len);
--}
--
--static __inline
--int ahc_get_transfer_dir(struct scb *scb)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,40)
-- return (scb->io_ctx->sc_data_direction);
--#else
-- if (scb->io_ctx->bufflen == 0)
-- return (CAM_DIR_NONE);
--
-- switch(scb->io_ctx->cmnd[0]) {
-- case 0x08: /* READ(6) */
-- case 0x28: /* READ(10) */
-- case 0xA8: /* READ(12) */
-- return (CAM_DIR_IN);
-- case 0x0A: /* WRITE(6) */
-- case 0x2A: /* WRITE(10) */
-- case 0xAA: /* WRITE(12) */
-- return (CAM_DIR_OUT);
-- default:
-- return (CAM_DIR_NONE);
-- }
--#endif
--}
--
--static __inline
--void ahc_set_residual(struct scb *scb, u_long resid)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- scb->io_ctx->resid = resid;
--#else
-- scb->platform_data->resid = resid;
--#endif
--}
--
--static __inline
--void ahc_set_sense_residual(struct scb *scb, u_long resid)
--{
-- scb->platform_data->sense_resid = resid;
--}
--
--static __inline
--u_long ahc_get_residual(struct scb *scb)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- return (scb->io_ctx->resid);
--#else
-- return (scb->platform_data->resid);
--#endif
--}
--
--static __inline
--u_long ahc_get_sense_residual(struct scb *scb)
--{
-- return (scb->platform_data->sense_resid);
--}
--
--static __inline
--int ahc_perform_autosense(struct scb *scb)
--{
-- /*
-- * We always perform autosense in Linux.
-- * On other platforms this is set on a
-- * per-transaction basis.
-- */
-- return (1);
--}
--
--static __inline uint32_t
--ahc_get_sense_bufsize(struct ahc_softc *ahc, struct scb *scb)
--{
-- return (sizeof(struct scsi_sense_data));
--}
--
--static __inline void
--ahc_notify_xfer_settings_change(struct ahc_softc *ahc,
-- struct ahc_devinfo *devinfo)
--{
-- /* Nothing to do here for linux */
--}
--
--static __inline void
--ahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb)
--{
-- ahc->flags &= ~AHC_RESOURCE_SHORTAGE;
--}
--
- int ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);
- void ahc_platform_free(struct ahc_softc *ahc);
- void ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb);
--
--static __inline void
--ahc_freeze_scb(struct scb *scb)
--{
-- if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
-- scb->io_ctx->result |= CAM_DEV_QFRZN << 16;
-- scb->platform_data->dev->qfrozen++;
-- }
--}
--
- void ahc_platform_set_tags(struct ahc_softc *ahc,
- struct ahc_devinfo *devinfo, ahc_queue_alg);
- int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target,
-@@ -1175,9 +414,9 @@ void ahc_print_path(struct ahc_softc *,
- void ahc_platform_dump_card_state(struct ahc_softc *ahc);
-
- #ifdef CONFIG_PCI
--#define AHC_PCI_CONFIG 1
-+#define AIC_PCI_CONFIG 1
- #else
--#define AHC_PCI_CONFIG 0
-+#define AIC_PCI_CONFIG 0
- #endif
- #define bootverbose aic7xxx_verbose
- extern u_int aic7xxx_verbose;
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c 2003-12-28 23:21:40.000000000 -0800
-@@ -36,11 +36,17 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#45 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#52 $
- */
-
- #include "aic7xxx_osm.h"
-
-+/*
-+ * Include aiclib_pci.c as part of our
-+ * "module dependencies are hard" work around.
-+ */
-+#include "aiclib_pci.c"
-+
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
- struct pci_device_id
- {
-@@ -51,11 +57,9 @@ static int ahc_linux_pci_dev_probe(struc
- const struct pci_device_id *ent);
- static int ahc_linux_pci_reserve_io_region(struct ahc_softc *ahc,
- u_long *base);
--#ifdef MMAPIO
- static int ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc,
- u_long *bus_addr,
- uint8_t **maddr);
--#endif /* MMAPIO */
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- static void ahc_linux_pci_dev_remove(struct pci_dev *pdev);
-
-@@ -97,12 +101,14 @@ ahc_linux_pci_dev_remove(struct pci_dev
- if (ahc != NULL) {
- u_long s;
-
-+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
-+ ahc_list_unlock(&l);
- ahc_lock(ahc, &s);
- ahc_intr_enable(ahc, FALSE);
- ahc_unlock(ahc, &s);
- ahc_free(ahc);
-- }
-- ahc_list_unlock(&l);
-+ } else
-+ ahc_list_unlock(&l);
- }
- #endif /* !LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) */
-
-@@ -112,7 +118,7 @@ ahc_linux_pci_dev_probe(struct pci_dev *
- char buf[80];
- bus_addr_t mask_39bit;
- struct ahc_softc *ahc;
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t dev;
- struct ahc_pci_identity *entry;
- char *name;
- int error;
-@@ -123,7 +129,7 @@ ahc_linux_pci_dev_probe(struct pci_dev *
- TAILQ_FOREACH(ahc, &ahc_tailq, links) {
- struct pci_dev *probed_pdev;
-
-- probed_pdev = ahc->dev_softc;
-+ probed_pdev = aic_dev_to_pci_dev(ahc->dev_softc);
- if (probed_pdev->bus->number == pdev->bus->number
- && probed_pdev->devfn == pdev->devfn)
- break;
-@@ -133,8 +139,8 @@ ahc_linux_pci_dev_probe(struct pci_dev *
- return (-ENODEV);
- }
-
-- pci = pdev;
-- entry = ahc_find_pci_device(pci);
-+ dev = aic_pci_dev_to_dev(pdev);
-+ entry = ahc_find_pci_device(dev);
- if (entry == NULL)
- return (-ENODEV);
-
-@@ -144,9 +150,9 @@ ahc_linux_pci_dev_probe(struct pci_dev *
- * common detect routine.
- */
- sprintf(buf, "ahc_pci:%d:%d:%d",
-- ahc_get_pci_bus(pci),
-- ahc_get_pci_slot(pci),
-- ahc_get_pci_function(pci));
-+ aic_get_pci_bus(dev),
-+ aic_get_pci_slot(dev),
-+ aic_get_pci_function(dev));
- name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
- if (name == NULL)
- return (-ENOMEM);
-@@ -154,6 +160,8 @@ ahc_linux_pci_dev_probe(struct pci_dev *
- ahc = ahc_alloc(NULL, name);
- if (ahc == NULL)
- return (-ENOMEM);
-+ ahc->dev_softc = dev;
-+
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- if (pci_enable_device(pdev)) {
- ahc_free(ahc);
-@@ -161,18 +169,17 @@ ahc_linux_pci_dev_probe(struct pci_dev *
- }
- pci_set_master(pdev);
-
-- mask_39bit = (bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0);
-+ mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
- if (sizeof(bus_addr_t) > 4
- && ahc_linux_get_memsize() > 0x80000000
-- && ahc_pci_set_dma_mask(pdev, mask_39bit) == 0) {
-+ && aic_set_dma_mask(ahc, mask_39bit) == 0) {
- ahc->flags |= AHC_39BIT_ADDRESSING;
- ahc->platform_data->hw_dma_mask = mask_39bit;
- } else {
-- ahc_pci_set_dma_mask(pdev, 0xFFFFFFFF);
-+ aic_set_dma_mask(ahc, 0xFFFFFFFF);
- ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
- }
- #endif
-- ahc->dev_softc = pci;
- error = ahc_pci_config(ahc, entry);
- if (error != 0) {
- ahc_free(ahc);
-@@ -211,10 +218,8 @@ ahc_linux_pci_init(void)
- pdev = NULL;
- class = PCI_CLASS_STORAGE_SCSI << 8;
- while ((pdev = pci_find_class(class, pdev)) != NULL) {
-- ahc_dev_softc_t pci;
- int error;
-
-- pci = pdev;
- error = ahc_linux_pci_dev_probe(pdev, /*pci_devid*/NULL);
- if (error == 0)
- found++;
-@@ -236,9 +241,9 @@ ahc_linux_pci_reserve_io_region(struct a
- return (ENOMEM);
-
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- *base = pci_resource_start(ahc->dev_softc, 0);
-+ *base = pci_resource_start(aic_pci_dev(ahc), 0);
- #else
-- *base = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4);
-+ *base = aic_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4);
- *base &= PCI_BASE_ADDRESS_IO_MASK;
- #endif
- if (*base == 0)
-@@ -254,7 +259,6 @@ ahc_linux_pci_reserve_io_region(struct a
- return (0);
- }
-
--#ifdef MMAPIO
- static int
- ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc,
- u_long *bus_addr,
-@@ -267,11 +271,11 @@ ahc_linux_pci_reserve_mem_region(struct
-
- error = 0;
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-- start = pci_resource_start(ahc->dev_softc, 1);
-+ start = pci_resource_start(aic_pci_dev(ahc), 1);
- base_page = start & PAGE_MASK;
- base_offset = start - base_page;
- #else
-- start = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS+4, 4);
-+ start = aic_pci_read_config(ahc->dev_softc, PCIR_MAPS+4, 4);
- base_offset = start & PCI_BASE_ADDRESS_MEM_MASK;
- base_page = base_offset & PAGE_MASK;
- base_offset -= base_page;
-@@ -296,7 +300,6 @@ ahc_linux_pci_reserve_mem_region(struct
- error = ENOMEM;
- return (error);
- }
--#endif /* MMAPIO */
-
- int
- ahc_pci_map_registers(struct ahc_softc *ahc)
-@@ -309,17 +312,16 @@ ahc_pci_map_registers(struct ahc_softc *
- /*
- * If its allowed, we prefer memory mapped access.
- */
-- command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4);
-+ command = aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4);
- command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
- base = 0;
- maddr = NULL;
--#ifdef MMAPIO
- error = ahc_linux_pci_reserve_mem_region(ahc, &base, &maddr);
- if (error == 0) {
- ahc->platform_data->mem_busaddr = base;
- ahc->tag = BUS_SPACE_MEMIO;
- ahc->bsh.maddr = maddr;
-- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
-+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
- command | PCIM_CMD_MEMEN, 4);
-
- /*
-@@ -330,9 +332,9 @@ ahc_pci_map_registers(struct ahc_softc *
-
- printf("aic7xxx: PCI Device %d:%d:%d "
- "failed memory mapped test. Using PIO.\n",
-- ahc_get_pci_bus(ahc->dev_softc),
-- ahc_get_pci_slot(ahc->dev_softc),
-- ahc_get_pci_function(ahc->dev_softc));
-+ aic_get_pci_bus(ahc->dev_softc),
-+ aic_get_pci_slot(ahc->dev_softc),
-+ aic_get_pci_function(ahc->dev_softc));
- iounmap((void *)((u_long)maddr & PAGE_MASK));
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- release_mem_region(ahc->platform_data->mem_busaddr,
-@@ -345,12 +347,11 @@ ahc_pci_map_registers(struct ahc_softc *
- } else {
- printf("aic7xxx: PCI%d:%d:%d MEM region 0x%lx "
- "unavailable. Cannot memory map device.\n",
-- ahc_get_pci_bus(ahc->dev_softc),
-- ahc_get_pci_slot(ahc->dev_softc),
-- ahc_get_pci_function(ahc->dev_softc),
-+ aic_get_pci_bus(ahc->dev_softc),
-+ aic_get_pci_slot(ahc->dev_softc),
-+ aic_get_pci_function(ahc->dev_softc),
- base);
- }
--#endif /* MMAPIO */
-
- /*
- * We always prefer memory mapped access.
-@@ -358,20 +359,20 @@ ahc_pci_map_registers(struct ahc_softc *
- if (maddr == NULL) {
-
- error = ahc_linux_pci_reserve_io_region(ahc, &base);
-- if (error == 0) {
-+ if (error == 0 && ahc_pci_test_register_access(ahc) == 0) {
- ahc->tag = BUS_SPACE_PIO;
- ahc->bsh.ioport = base;
- command |= PCIM_CMD_PORTEN;
- } else {
- printf("aic7xxx: PCI%d:%d:%d IO region 0x%lx[0..255] "
- "unavailable. Cannot map device.\n",
-- ahc_get_pci_bus(ahc->dev_softc),
-- ahc_get_pci_slot(ahc->dev_softc),
-- ahc_get_pci_function(ahc->dev_softc),
-+ aic_get_pci_bus(ahc->dev_softc),
-+ aic_get_pci_slot(ahc->dev_softc),
-+ aic_get_pci_function(ahc->dev_softc),
- base);
- }
- }
-- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4);
-+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4);
- return (error);
- }
-
-@@ -380,49 +381,10 @@ ahc_pci_map_int(struct ahc_softc *ahc)
- {
- int error;
-
-- error = request_irq(ahc->dev_softc->irq, ahc_linux_isr,
-+ error = request_irq(aic_pci_dev(ahc)->irq, ahc_linux_isr,
- SA_SHIRQ, "aic7xxx", ahc);
- if (error == 0)
-- ahc->platform_data->irq = ahc->dev_softc->irq;
-+ ahc->platform_data->irq = aic_pci_dev(ahc)->irq;
-
- return (-error);
- }
--
--void
--ahc_power_state_change(struct ahc_softc *ahc, ahc_power_state new_state)
--{
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-- pci_set_power_state(ahc->dev_softc, new_state);
--#else
-- uint32_t cap;
-- u_int cap_offset;
--
-- /*
-- * Traverse the capability list looking for
-- * the power management capability.
-- */
-- cap = 0;
-- cap_offset = ahc_pci_read_config(ahc->dev_softc,
-- PCIR_CAP_PTR, /*bytes*/1);
-- while (cap_offset != 0) {
--
-- cap = ahc_pci_read_config(ahc->dev_softc,
-- cap_offset, /*bytes*/4);
-- if ((cap & 0xFF) == 1
-- && ((cap >> 16) & 0x3) > 0) {
-- uint32_t pm_control;
--
-- pm_control = ahc_pci_read_config(ahc->dev_softc,
-- cap_offset + 4,
-- /*bytes*/4);
-- pm_control &= ~0x3;
-- pm_control |= new_state;
-- ahc_pci_write_config(ahc->dev_softc,
-- cap_offset + 4,
-- pm_control, /*bytes*/2);
-- break;
-- }
-- cap_offset = (cap >> 8) & 0xFF;
-- }
--#endif
--}
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_pci.c 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_pci.c 2003-12-28 23:21:40.000000000 -0800
-@@ -39,9 +39,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#66 $
-- *
-- * $FreeBSD$
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#78 $
- */
-
- #ifdef __linux__
-@@ -49,14 +47,13 @@
- #include "aic7xxx_inline.h"
- #include "aic7xxx_93cx6.h"
- #else
-+#include <sys/cdefs.h>
-+__FBSDID("$FreeBSD$");
- #include <dev/aic7xxx/aic7xxx_osm.h>
- #include <dev/aic7xxx/aic7xxx_inline.h>
- #include <dev/aic7xxx/aic7xxx_93cx6.h>
- #endif
-
--#define AHC_PCI_IOADDR PCIR_MAPS /* I/O Address */
--#define AHC_PCI_MEMADDR (PCIR_MAPS + 4) /* Mem I/O Address */
--
- static __inline uint64_t
- ahc_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
- {
-@@ -76,7 +73,7 @@ ahc_compose_id(u_int device, u_int vendo
- #define ID_9005_SISL_MASK 0x000FFFFF00000000ull
- #define ID_9005_SISL_ID 0x0005900500000000ull
- #define ID_AIC7850 0x5078900400000000ull
--#define ID_AHA_2902_04_10_15_20_30C 0x5078900478509004ull
-+#define ID_AHA_2902_04_10_15_20C_30C 0x5078900478509004ull
- #define ID_AIC7855 0x5578900400000000ull
- #define ID_AIC7859 0x3860900400000000ull
- #define ID_AHA_2930CU 0x3860900438699004ull
-@@ -133,6 +130,7 @@ ahc_compose_id(u_int device, u_int vendo
- #define ID_AHA_29160C 0x0080900562209005ull
- #define ID_AHA_29160B 0x00809005E2209005ull
- #define ID_AHA_19160B 0x0081900562A19005ull
-+#define ID_AHA_2915_30LP 0x0082900502109005ull
-
- #define ID_AIC7896 0x005F9005FFFF9005ull
- #define ID_AIC7896_ARO 0x00539005FFFF9005ull
-@@ -245,9 +243,9 @@ struct ahc_pci_identity ahc_pci_ident_ta
- {
- /* aic7850 based controllers */
- {
-- ID_AHA_2902_04_10_15_20_30C,
-+ ID_AHA_2902_04_10_15_20C_30C,
- ID_ALL_MASK,
-- "Adaptec 2902/04/10/15/20/30C SCSI adapter",
-+ "Adaptec 2902/04/10/15/20C/30C SCSI adapter",
- ahc_aic785X_setup
- },
- /* aic7860 based controllers */
-@@ -470,6 +468,12 @@ struct ahc_pci_identity ahc_pci_ident_ta
- "Adaptec aic7892 Ultra160 SCSI adapter (ARO)",
- ahc_aic7892_setup
- },
-+ {
-+ ID_AHA_2915_30LP,
-+ ID_ALL_MASK,
-+ "Adaptec 2915/30LP Ultra160 SCSI adapter",
-+ ahc_aic7892_setup
-+ },
- /* aic7895 based controllers */
- {
- ID_AHA_2940U_DUAL,
-@@ -738,7 +742,7 @@ ahc_9005_subdevinfo_valid(uint16_t devic
- }
-
- struct ahc_pci_identity *
--ahc_find_pci_device(ahc_dev_softc_t pci)
-+ahc_find_pci_device(aic_dev_softc_t pci)
- {
- uint64_t full_id;
- uint16_t device;
-@@ -748,10 +752,10 @@ ahc_find_pci_device(ahc_dev_softc_t pci)
- struct ahc_pci_identity *entry;
- u_int i;
-
-- vendor = ahc_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
-- device = ahc_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
-- subvendor = ahc_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
-- subdevice = ahc_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
-+ vendor = aic_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
-+ device = aic_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
-+ subvendor = aic_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
-+ subdevice = aic_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
- full_id = ahc_compose_id(device, vendor, subdevice, subvendor);
-
- /*
-@@ -761,7 +765,7 @@ ahc_find_pci_device(ahc_dev_softc_t pci)
- * to sanity check it prior to accepting the subdevice
- * ID as valid.
- */
-- if (ahc_get_pci_function(pci) > 0
-+ if (aic_get_pci_function(pci) > 0
- && ahc_9005_subdevinfo_valid(vendor, device, subvendor, subdevice)
- && SUBID_9005_MFUNCENB(subdevice) == 0)
- return (NULL);
-@@ -798,7 +802,7 @@ ahc_pci_config(struct ahc_softc *ahc, st
- ahc->chip |= AHC_PCI;
- ahc->description = entry->name;
-
-- ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
-+ aic_power_state_change(ahc, AIC_POWER_STATE_D0);
-
- error = ahc_pci_map_registers(ahc);
- if (error != 0)
-@@ -812,7 +816,7 @@ ahc_pci_config(struct ahc_softc *ahc, st
- */
- ahc_intr_enable(ahc, FALSE);
-
-- devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
-+ devconfig = aic_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
-
- /*
- * If we need to support high memory, enable dual
-@@ -831,13 +835,13 @@ ahc_pci_config(struct ahc_softc *ahc, st
- /* Ensure that pci error generation, a test feature, is disabled. */
- devconfig |= PCIERRGENDIS;
-
-- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
-+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
-
- /* Ensure busmastering is enabled */
-- command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
-+ command = aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
- command |= PCIM_CMD_BUSMASTEREN;
-
-- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
-+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
-
- /* On all PCI adapters, we allow SCB paging */
- ahc->flags |= AHC_PAGESCBS;
-@@ -877,7 +881,7 @@ ahc_pci_config(struct ahc_softc *ahc, st
- scsiseq = 0;
- }
-
-- error = ahc_reset(ahc);
-+ error = ahc_reset(ahc, /*reinit*/FALSE);
- if (error != 0)
- return (ENXIO);
-
-@@ -920,14 +924,14 @@ ahc_pci_config(struct ahc_softc *ahc, st
- ahc_outb(ahc, DSCOMMAND0, dscommand0);
-
- ahc->pci_cachesize =
-- ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME,
-+ aic_pci_read_config(ahc->dev_softc, CSIZE_LATTIME,
- /*bytes*/1) & CACHESIZE;
- ahc->pci_cachesize *= 4;
-
- if ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0
- && ahc->pci_cachesize == 4) {
-
-- ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
-+ aic_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
- 0, /*bytes*/1);
- ahc->pci_cachesize = 0;
- }
-@@ -939,7 +943,7 @@ ahc_pci_config(struct ahc_softc *ahc, st
- if ((ahc->features & AHC_ULTRA) != 0) {
- uint32_t devconfig;
-
-- devconfig = ahc_pci_read_config(ahc->dev_softc,
-+ devconfig = aic_pci_read_config(ahc->dev_softc,
- DEVCONFIG, /*bytes*/4);
- if ((devconfig & REXTVALID) == 0)
- ahc->features &= ~AHC_ULTRA;
-@@ -1005,11 +1009,11 @@ ahc_pci_config(struct ahc_softc *ahc, st
- * that occur during runtime and resume events.
- */
- ahc->bus_softc.pci_softc.devconfig =
-- ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
-+ aic_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
- ahc->bus_softc.pci_softc.command =
-- ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
-+ aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
- ahc->bus_softc.pci_softc.csize_lattime =
-- ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1);
-+ aic_pci_read_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1);
- ahc->bus_softc.pci_softc.dscommand0 = ahc_inb(ahc, DSCOMMAND0);
- ahc->bus_softc.pci_softc.dspcistatus = ahc_inb(ahc, DSPCISTATUS);
- if ((ahc->features & AHC_DT) != 0) {
-@@ -1063,7 +1067,7 @@ ahc_ext_scbram_present(struct ahc_softc
- uint32_t devconfig;
-
- chip = ahc->chip & AHC_CHIPID_MASK;
-- devconfig = ahc_pci_read_config(ahc->dev_softc,
-+ devconfig = aic_pci_read_config(ahc->dev_softc,
- DEVCONFIG, /*bytes*/4);
- single_user = (devconfig & MPORTMODE) != 0;
-
-@@ -1101,13 +1105,13 @@ ahc_scbram_config(struct ahc_softc *ahc,
- * Set the SCB Base addr (highest address bit)
- * depending on which channel we are.
- */
-- ahc_outb(ahc, SCBBADDR, ahc_get_pci_function(ahc->dev_softc));
-+ ahc_outb(ahc, SCBBADDR, aic_get_pci_function(ahc->dev_softc));
- }
-
- ahc->flags &= ~AHC_LSCBS_ENABLED;
- if (large)
- ahc->flags |= AHC_LSCBS_ENABLED;
-- devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
-+ devconfig = aic_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
- if ((ahc->features & AHC_ULTRA2) != 0) {
- u_int dscommand0;
-
-@@ -1140,7 +1144,7 @@ ahc_scbram_config(struct ahc_softc *ahc,
- else
- devconfig &= ~EXTSCBPEN;
-
-- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
-+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
- }
-
- /*
-@@ -1263,8 +1267,8 @@ ahc_pci_test_register_access(struct ahc_
- * Enable PCI error interrupt status, but suppress NMIs
- * generated by SERR raised due to target aborts.
- */
-- cmd = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
-- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
-+ cmd = aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
-+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
- cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
-
- /*
-@@ -1276,26 +1280,46 @@ ahc_pci_test_register_access(struct ahc_
- * use for this test.
- */
- hcntrl = ahc_inb(ahc, HCNTRL);
-+
- if (hcntrl == 0xFF)
- goto fail;
-
-+ if ((hcntrl & CHIPRST) != 0) {
-+ /*
-+ * The chip has not been initialized since
-+ * PCI/EISA/VLB bus reset. Don't trust
-+ * "left over BIOS data".
-+ */
-+ ahc->flags |= AHC_NO_BIOS_INIT;
-+ }
-+
- /*
- * Next create a situation where write combining
- * or read prefetching could be initiated by the
- * CPU or host bridge. Our device does not support
- * either, so look for data corruption and/or flagged
-- * PCI errors.
-+ * PCI errors. First pause without causing another
-+ * chip reset.
- */
-+ hcntrl &= ~CHIPRST;
- ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
- while (ahc_is_paused(ahc) == 0)
- ;
-+
-+ /* Clear any PCI errors that occurred before our driver attached. */
-+ status1 = aic_pci_read_config(ahc->dev_softc,
-+ PCIR_STATUS + 1, /*bytes*/1);
-+ aic_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
-+ status1, /*bytes*/1);
-+ ahc_outb(ahc, CLRINT, CLRPARERR);
-+
- ahc_outb(ahc, SEQCTL, PERRORDIS);
- ahc_outb(ahc, SCBPTR, 0);
- ahc_outl(ahc, SCB_BASE, 0x5aa555aa);
- if (ahc_inl(ahc, SCB_BASE) != 0x5aa555aa)
- goto fail;
-
-- status1 = ahc_pci_read_config(ahc->dev_softc,
-+ status1 = aic_pci_read_config(ahc->dev_softc,
- PCIR_STATUS + 1, /*bytes*/1);
- if ((status1 & STA) != 0)
- goto fail;
-@@ -1304,13 +1328,13 @@ ahc_pci_test_register_access(struct ahc_
-
- fail:
- /* Silently clear any latched errors. */
-- status1 = ahc_pci_read_config(ahc->dev_softc,
-+ status1 = aic_pci_read_config(ahc->dev_softc,
- PCIR_STATUS + 1, /*bytes*/1);
-- ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
-+ aic_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
- status1, /*bytes*/1);
- ahc_outb(ahc, CLRINT, CLRPARERR);
- ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS);
-- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
-+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
- return (error);
- }
-
-@@ -1380,6 +1404,10 @@ check_extport(struct ahc_softc *ahc, u_i
- sd.sd_chip = C56_66;
- }
- ahc_release_seeprom(&sd);
-+
-+ /* Remember the SEEPROM type for later */
-+ if (sd.sd_chip == C56_66)
-+ ahc->flags |= AHC_LARGE_SEEPROM;
- }
-
- if (!have_seeprom) {
-@@ -1565,12 +1593,12 @@ ahc_parse_pci_eeprom(struct ahc_softc *a
- uint32_t devconfig;
-
- /* Honor the STPWLEVEL settings */
-- devconfig = ahc_pci_read_config(ahc->dev_softc,
-+ devconfig = aic_pci_read_config(ahc->dev_softc,
- DEVCONFIG, /*bytes*/4);
- devconfig &= ~STPWLEVEL;
- if ((sc->bios_control & CFSTPWLEVEL) != 0)
- devconfig |= STPWLEVEL;
-- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG,
-+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG,
- devconfig, /*bytes*/4);
- }
- /* Set SCSICONF info */
-@@ -1883,10 +1911,10 @@ aic785X_cable_detect(struct ahc_softc *a
- ahc_outb(ahc, SPIOCAP, spiocap);
- ahc_outb(ahc, BRDCTL, BRDRW|BRDCS);
- ahc_flush_device_writes(ahc);
-- ahc_delay(500);
-+ aic_delay(500);
- ahc_outb(ahc, BRDCTL, 0);
- ahc_flush_device_writes(ahc);
-- ahc_delay(500);
-+ aic_delay(500);
- brdctl = ahc_inb(ahc, BRDCTL);
- *internal50_present = (brdctl & BRDDAT5) ? 0 : 1;
- *externalcable_present = (brdctl & BRDDAT6) ? 0 : 1;
-@@ -1912,7 +1940,7 @@ ahc_acquire_seeprom(struct ahc_softc *ah
- SEEPROM_OUTB(sd, sd->sd_MS);
- wait = 1000; /* 1 second timeout in msec */
- while (--wait && ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0)) {
-- ahc_delay(1000); /* delay 1 msec */
-+ aic_delay(1000); /* delay 1 msec */
- }
- if ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0) {
- SEEPROM_OUTB(sd, 0);
-@@ -1992,7 +2020,7 @@ ahc_pci_intr(struct ahc_softc *ahc)
- if ((error & PCIERRSTAT) == 0)
- return;
-
-- status1 = ahc_pci_read_config(ahc->dev_softc,
-+ status1 = aic_pci_read_config(ahc->dev_softc,
- PCIR_STATUS + 1, /*bytes*/1);
-
- printf("%s: PCI error Interrupt at seqaddr = 0x%x\n",
-@@ -2022,7 +2050,7 @@ ahc_pci_intr(struct ahc_softc *ahc)
- }
-
- /* Clear latched errors. */
-- ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
-+ aic_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
- status1, /*bytes*/1);
-
- if ((status1 & (DPE|SSE|RMA|RTA|STA|DPR)) == 0) {
-@@ -2083,7 +2111,7 @@ static int
- ahc_pci_resume(struct ahc_softc *ahc)
- {
-
-- ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
-+ aic_power_state_change(ahc, AIC_POWER_STATE_D0);
-
- /*
- * We assume that the OS has restored our register
-@@ -2091,11 +2119,11 @@ ahc_pci_resume(struct ahc_softc *ahc)
- * that the OS doesn't know about and rely on our chip
- * reset handler to handle the rest.
- */
-- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4,
-+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4,
- ahc->bus_softc.pci_softc.devconfig);
-- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1,
-+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1,
- ahc->bus_softc.pci_softc.command);
-- ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1,
-+ aic_pci_write_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1,
- ahc->bus_softc.pci_softc.csize_lattime);
- if ((ahc->flags & AHC_HAS_TERM_LOGIC) != 0) {
- struct seeprom_descriptor sd;
-@@ -2118,7 +2146,7 @@ ahc_pci_resume(struct ahc_softc *ahc)
- static int
- ahc_aic785X_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
- uint8_t rev;
-
- pci = ahc->dev_softc;
-@@ -2126,7 +2154,7 @@ ahc_aic785X_setup(struct ahc_softc *ahc)
- ahc->chip = AHC_AIC7850;
- ahc->features = AHC_AIC7850_FE;
- ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
-- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
-+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
- if (rev >= 1)
- ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
- ahc->instruction_ram_size = 512;
-@@ -2136,7 +2164,7 @@ ahc_aic785X_setup(struct ahc_softc *ahc)
- static int
- ahc_aic7860_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
- uint8_t rev;
-
- pci = ahc->dev_softc;
-@@ -2144,7 +2172,7 @@ ahc_aic7860_setup(struct ahc_softc *ahc)
- ahc->chip = AHC_AIC7860;
- ahc->features = AHC_AIC7860_FE;
- ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
-- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
-+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
- if (rev >= 1)
- ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
- ahc->instruction_ram_size = 512;
-@@ -2211,7 +2239,7 @@ ahc_aha494X_setup(struct ahc_softc *ahc)
- static int
- ahc_aic7880_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
- uint8_t rev;
-
- pci = ahc->dev_softc;
-@@ -2219,7 +2247,7 @@ ahc_aic7880_setup(struct ahc_softc *ahc)
- ahc->chip = AHC_AIC7880;
- ahc->features = AHC_AIC7880_FE;
- ahc->bugs |= AHC_TMODE_WIDEODD_BUG;
-- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
-+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
- if (rev >= 1) {
- ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
- } else {
-@@ -2262,7 +2290,7 @@ ahc_aha398XU_setup(struct ahc_softc *ahc
- static int
- ahc_aic7890_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
- uint8_t rev;
-
- pci = ahc->dev_softc;
-@@ -2270,7 +2298,7 @@ ahc_aic7890_setup(struct ahc_softc *ahc)
- ahc->chip = AHC_AIC7890;
- ahc->features = AHC_AIC7890_FE;
- ahc->flags |= AHC_NEWEEPROM_FMT;
-- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
-+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
- if (rev == 0)
- ahc->bugs |= AHC_AUTOFLUSH_BUG|AHC_CACHETHEN_BUG;
- ahc->instruction_ram_size = 768;
-@@ -2293,15 +2321,15 @@ ahc_aic7892_setup(struct ahc_softc *ahc)
- static int
- ahc_aic7895_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
- uint8_t rev;
-
- pci = ahc->dev_softc;
-- ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
-+ ahc->channel = aic_get_pci_function(pci) == 1 ? 'B' : 'A';
- /*
- * The 'C' revision of the aic7895 has a few additional features.
- */
-- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
-+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
- if (rev >= 4) {
- ahc->chip = AHC_AIC7895C;
- ahc->features = AHC_AIC7895C_FE;
-@@ -2317,9 +2345,9 @@ ahc_aic7895_setup(struct ahc_softc *ahc)
- * we have. Disabling MWI reduces performance, so
- * turn it on again.
- */
-- command = ahc_pci_read_config(pci, PCIR_COMMAND, /*bytes*/1);
-+ command = aic_pci_read_config(pci, PCIR_COMMAND, /*bytes*/1);
- command |= PCIM_CMD_MWRICEN;
-- ahc_pci_write_config(pci, PCIR_COMMAND, command, /*bytes*/1);
-+ aic_pci_write_config(pci, PCIR_COMMAND, command, /*bytes*/1);
- ahc->bugs |= AHC_PCI_MWI_BUG;
- }
- /*
-@@ -2336,10 +2364,10 @@ ahc_aic7895_setup(struct ahc_softc *ahc)
- * Cachesize must also be zero due to stray DAC
- * problem when sitting behind some bridges.
- */
-- ahc_pci_write_config(pci, CSIZE_LATTIME, 0, /*bytes*/1);
-- devconfig = ahc_pci_read_config(pci, DEVCONFIG, /*bytes*/1);
-+ aic_pci_write_config(pci, CSIZE_LATTIME, 0, /*bytes*/1);
-+ devconfig = aic_pci_read_config(pci, DEVCONFIG, /*bytes*/1);
- devconfig |= MRDCEN;
-- ahc_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
-+ aic_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
- #endif
- ahc->flags |= AHC_NEWEEPROM_FMT;
- ahc->instruction_ram_size = 512;
-@@ -2349,10 +2377,10 @@ ahc_aic7895_setup(struct ahc_softc *ahc)
- static int
- ahc_aic7896_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
-
- pci = ahc->dev_softc;
-- ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
-+ ahc->channel = aic_get_pci_function(pci) == 1 ? 'B' : 'A';
- ahc->chip = AHC_AIC7896;
- ahc->features = AHC_AIC7896_FE;
- ahc->flags |= AHC_NEWEEPROM_FMT;
-@@ -2364,10 +2392,10 @@ ahc_aic7896_setup(struct ahc_softc *ahc)
- static int
- ahc_aic7899_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
-
- pci = ahc->dev_softc;
-- ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
-+ ahc->channel = aic_get_pci_function(pci) == 1 ? 'B' : 'A';
- ahc->chip = AHC_AIC7899;
- ahc->features = AHC_AIC7899_FE;
- ahc->flags |= AHC_NEWEEPROM_FMT;
-@@ -2398,10 +2426,10 @@ ahc_raid_setup(struct ahc_softc *ahc)
- static int
- ahc_aha394XX_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
-
- pci = ahc->dev_softc;
-- switch (ahc_get_pci_slot(pci)) {
-+ switch (aic_get_pci_slot(pci)) {
- case AHC_394X_SLOT_CHANNEL_A:
- ahc->channel = 'A';
- break;
-@@ -2411,7 +2439,7 @@ ahc_aha394XX_setup(struct ahc_softc *ahc
- default:
- printf("adapter at unexpected slot %d\n"
- "unable to map to a channel\n",
-- ahc_get_pci_slot(pci));
-+ aic_get_pci_slot(pci));
- ahc->channel = 'A';
- }
- return (0);
-@@ -2420,10 +2448,10 @@ ahc_aha394XX_setup(struct ahc_softc *ahc
- static int
- ahc_aha398XX_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
-
- pci = ahc->dev_softc;
-- switch (ahc_get_pci_slot(pci)) {
-+ switch (aic_get_pci_slot(pci)) {
- case AHC_398X_SLOT_CHANNEL_A:
- ahc->channel = 'A';
- break;
-@@ -2436,7 +2464,7 @@ ahc_aha398XX_setup(struct ahc_softc *ahc
- default:
- printf("adapter at unexpected slot %d\n"
- "unable to map to a channel\n",
-- ahc_get_pci_slot(pci));
-+ aic_get_pci_slot(pci));
- ahc->channel = 'A';
- break;
- }
-@@ -2447,10 +2475,10 @@ ahc_aha398XX_setup(struct ahc_softc *ahc
- static int
- ahc_aha494XX_setup(struct ahc_softc *ahc)
- {
-- ahc_dev_softc_t pci;
-+ aic_dev_softc_t pci;
-
- pci = ahc->dev_softc;
-- switch (ahc_get_pci_slot(pci)) {
-+ switch (aic_get_pci_slot(pci)) {
- case AHC_494X_SLOT_CHANNEL_A:
- ahc->channel = 'A';
- break;
-@@ -2466,7 +2494,7 @@ ahc_aha494XX_setup(struct ahc_softc *ahc
- default:
- printf("adapter at unexpected slot %d\n"
- "unable to map to a channel\n",
-- ahc_get_pci_slot(pci));
-+ aic_get_pci_slot(pci));
- ahc->channel = 'A';
- }
- ahc->flags |= AHC_LARGE_SEEPROM;
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_proc.c 2003-06-14 12:17:56.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_proc.c 2003-12-28 23:21:40.000000000 -0800
-@@ -37,7 +37,7 @@
- * String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
- * sym driver.
- *
-- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#27 $
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#32 $
- */
- #include "aic7xxx_osm.h"
- #include "aic7xxx_inline.h"
-@@ -50,7 +50,7 @@ static void ahc_dump_target_state(struct
- u_int our_id, char channel,
- u_int target_id, u_int target_offset);
- static void ahc_dump_device_state(struct info_str *info,
-- struct ahc_linux_device *dev);
-+ struct aic_linux_device *dev);
- static int ahc_proc_write_seeprom(struct ahc_softc *ahc,
- char *buffer, int length);
-
-@@ -141,7 +141,7 @@ ahc_dump_target_state(struct ahc_softc *
- u_int our_id, char channel, u_int target_id,
- u_int target_offset)
- {
-- struct ahc_linux_target *targ;
-+ struct aic_linux_target *targ;
- struct ahc_initiator_tinfo *tinfo;
- struct ahc_tmode_tstate *tstate;
- int lun;
-@@ -163,7 +163,7 @@ ahc_dump_target_state(struct ahc_softc *
- ahc_format_transinfo(info, &tinfo->curr);
-
- for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
-- struct ahc_linux_device *dev;
-+ struct aic_linux_device *dev;
-
- dev = targ->devices[lun];
-
-@@ -175,7 +175,7 @@ ahc_dump_target_state(struct ahc_softc *
- }
-
- static void
--ahc_dump_device_state(struct info_str *info, struct ahc_linux_device *dev)
-+ahc_dump_device_state(struct info_str *info, struct aic_linux_device *dev)
- {
- copy_info(info, "\tChannel %c Target %d Lun %d Settings\n",
- dev->target->channel + 'A', dev->target->target, dev->lun);
-@@ -204,7 +204,8 @@ ahc_proc_write_seeprom(struct ahc_softc
- ahc_pause(ahc);
-
- if (length != sizeof(struct seeprom_config)) {
-- printf("ahc_proc_write_seeprom: incorrect buffer size\n");
-+ printf("ahc_proc_write_seeprom: incorrect buffer size %d\n",
-+ length);
- goto done;
- }
-
-@@ -215,7 +216,7 @@ ahc_proc_write_seeprom(struct ahc_softc
- }
-
- sd.sd_ahc = ahc;
--#if AHC_PCI_CONFIG > 0
-+#if AIC_PCI_CONFIG > 0
- if ((ahc->chip & AHC_PCI) != 0) {
- sd.sd_control_offset = SEECTL;
- sd.sd_status_offset = SEECTL;
-@@ -271,7 +272,7 @@ ahc_proc_write_seeprom(struct ahc_softc
- sizeof(struct seeprom_config)/2);
- ahc_read_seeprom(&sd, (uint16_t *)ahc->seep_config,
- start_addr, sizeof(struct seeprom_config)/2);
--#if AHC_PCI_CONFIG > 0
-+#if AIC_PCI_CONFIG > 0
- if ((ahc->chip & AHC_VL) == 0)
- ahc_release_seeprom(&sd);
- #endif
-@@ -289,8 +290,13 @@ done:
- * Return information to handle /proc support for the driver.
- */
- int
--ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, off_t offset,
-- int length, int inout)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ahc_linux_proc_info(char *buffer, char **start, off_t offset,
-+ int length, int hostno, int inout)
-+#else
-+ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
-+ off_t offset, int length, int inout)
-+#endif
- {
- struct ahc_softc *ahc;
- struct info_str info;
-@@ -302,10 +308,14 @@ ahc_linux_proc_info(struct Scsi_Host *sh
-
- retval = -EINVAL;
- ahc_list_lock(&s);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
- TAILQ_FOREACH(ahc, &ahc_tailq, links) {
-- if (ahc->platform_data->host == shost)
-+ if (ahc->platform_data->host->host_no == hostno)
- break;
- }
-+#else
-+ ahc = ahc_find_softc(*(struct ahc_softc **)shost->hostdata);
-+#endif
-
- if (ahc == NULL)
- goto done;
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx.reg 2003-06-14 12:18:51.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx.reg 2003-12-28 23:21:40.000000000 -0800
-@@ -39,7 +39,7 @@
- *
- * $FreeBSD$
- */
--VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $"
-+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $"
-
- /*
- * This file is processed by the aic7xxx_asm utility for use in assembling
-@@ -1306,7 +1306,6 @@ scratch_ram {
- */
- MWI_RESIDUAL {
- size 1
-- alias TARG_IMMEDIATE_SCB
- }
- /*
- * SCBID of the next SCB to be started by the controller.
-@@ -1461,6 +1460,7 @@ scratch_ram {
- */
- LAST_MSG {
- size 1
-+ alias TARG_IMMEDIATE_SCB
- }
-
- /*
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped 2003-06-14 12:18:24.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped 2003-12-28 23:21:40.000000000 -0800
-@@ -2,8 +2,8 @@
- * DO NOT EDIT - This file is automatically generated
- * from the following source files:
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#56 $
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#58 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $
- */
- typedef int (ahc_reg_print_t)(u_int, u_int *, u_int);
- typedef struct ahc_reg_parse_entry {
-@@ -1298,7 +1298,6 @@ ahc_reg_print_t ahc_sg_cache_pre_print;
- #define CMDSIZE_TABLE_TAIL 0x34
-
- #define MWI_RESIDUAL 0x38
--#define TARG_IMMEDIATE_SCB 0x38
-
- #define NEXT_QUEUED_SCB 0x39
-
-@@ -1380,6 +1379,7 @@ ahc_reg_print_t ahc_sg_cache_pre_print;
- #define RETURN_2 0x52
-
- #define LAST_MSG 0x53
-+#define TARG_IMMEDIATE_SCB 0x53
-
- #define SCSISEQ_TEMPLATE 0x54
- #define ENSELO 0x40
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped 2003-06-14 12:18:22.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped 2003-12-28 23:21:40.000000000 -0800
-@@ -2,8 +2,8 @@
- * DO NOT EDIT - This file is automatically generated
- * from the following source files:
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#54 $
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#38 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#58 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $
- */
-
- #include "aic7xxx_osm.h"
-@@ -747,13 +747,6 @@ ahc_scsiseq_template_print(u_int regvalu
- 0x54, regvalue, cur_col, wrap));
- }
-
--int
--ahc_data_count_odd_print(u_int regvalue, u_int *cur_col, u_int wrap)
--{
-- return (ahc_print_register(NULL, 0, "DATA_COUNT_ODD",
-- 0x55, regvalue, cur_col, wrap));
--}
--
- static ahc_reg_parse_entry_t HA_274_BIOSGLOBAL_parse_table[] = {
- { "HA_274_EXTENDED_TRANS",0x01, 0x01 }
- };
-@@ -1416,13 +1409,14 @@ ahc_scb_scsiid_print(u_int regvalue, u_i
- }
-
- static ahc_reg_parse_entry_t SCB_LUN_parse_table[] = {
-- { "LID", 0xff, 0xff }
-+ { "SCB_XFERLEN_ODD", 0x80, 0x80 },
-+ { "LID", 0x3f, 0x3f }
- };
-
- int
- ahc_scb_lun_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
-- return (ahc_print_register(SCB_LUN_parse_table, 1, "SCB_LUN",
-+ return (ahc_print_register(SCB_LUN_parse_table, 2, "SCB_LUN",
- 0xba, regvalue, cur_col, wrap));
- }
-
-@@ -1662,28 +1656,26 @@ ahc_dff_thrsh_print(u_int regvalue, u_in
- static ahc_reg_parse_entry_t SG_CACHE_SHADOW_parse_table[] = {
- { "LAST_SEG_DONE", 0x01, 0x01 },
- { "LAST_SEG", 0x02, 0x02 },
-- { "ODD_SEG", 0x04, 0x04 },
- { "SG_ADDR_MASK", 0xf8, 0xf8 }
- };
-
- int
- ahc_sg_cache_shadow_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
-- return (ahc_print_register(SG_CACHE_SHADOW_parse_table, 4, "SG_CACHE_SHADOW",
-+ return (ahc_print_register(SG_CACHE_SHADOW_parse_table, 3, "SG_CACHE_SHADOW",
- 0xfc, regvalue, cur_col, wrap));
- }
-
- static ahc_reg_parse_entry_t SG_CACHE_PRE_parse_table[] = {
- { "LAST_SEG_DONE", 0x01, 0x01 },
- { "LAST_SEG", 0x02, 0x02 },
-- { "ODD_SEG", 0x04, 0x04 },
- { "SG_ADDR_MASK", 0xf8, 0xf8 }
- };
-
- int
- ahc_sg_cache_pre_print(u_int regvalue, u_int *cur_col, u_int wrap)
- {
-- return (ahc_print_register(SG_CACHE_PRE_parse_table, 4, "SG_CACHE_PRE",
-+ return (ahc_print_register(SG_CACHE_PRE_parse_table, 3, "SG_CACHE_PRE",
- 0xfc, regvalue, cur_col, wrap));
- }
-
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx.seq 2003-06-14 12:18:30.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx.seq 2003-12-28 23:21:40.000000000 -0800
-@@ -40,7 +40,7 @@
- * $FreeBSD$
- */
-
--VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#56 $"
-+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#58 $"
- PATCH_ARG_LIST = "struct ahc_softc *ahc"
- PREFIX = "ahc_"
-
-@@ -679,6 +679,7 @@ await_busfree:
- clr SCSIBUSL; /* Prevent bit leakage durint SELTO */
- }
- and SXFRCTL0, ~SPIOEN;
-+ mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT;
- test SSTAT1,REQINIT|BUSFREE jz .;
- test SSTAT1, BUSFREE jnz poll_for_work;
- mvi MISSED_BUSFREE call set_seqint;
-@@ -1097,7 +1098,7 @@ ultra2_dmahalt:
- test SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jz dma_mid_sg;
- if ((ahc->flags & AHC_TARGETROLE) != 0) {
- test SSTAT0, TARGET jz dma_last_sg;
-- if ((ahc->flags & AHC_TMODE_WIDEODD_BUG) != 0) {
-+ if ((ahc->bugs & AHC_TMODE_WIDEODD_BUG) != 0) {
- test DMAPARAMS, DIRECTION jz dma_mid_sg;
- }
- }
---- linux-2.6.0/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped 2003-06-14 12:18:52.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped 2003-12-28 23:21:40.000000000 -0800
-@@ -2,13 +2,13 @@
- * DO NOT EDIT - This file is automatically generated
- * from the following source files:
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#56 $
-- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#39 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#58 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#40 $
- */
- static uint8_t seqprog[] = {
- 0xb2, 0x00, 0x00, 0x08,
- 0xf7, 0x11, 0x22, 0x08,
-- 0x00, 0x65, 0xec, 0x59,
-+ 0x00, 0x65, 0xee, 0x59,
- 0xf7, 0x01, 0x02, 0x08,
- 0xff, 0x6a, 0x24, 0x08,
- 0x40, 0x00, 0x40, 0x68,
-@@ -21,15 +21,15 @@ static uint8_t seqprog[] = {
- 0x01, 0x4d, 0xc8, 0x30,
- 0x00, 0x4c, 0x12, 0x70,
- 0x01, 0x39, 0xa2, 0x30,
-- 0x00, 0x6a, 0xc0, 0x5e,
-+ 0x00, 0x6a, 0xc2, 0x5e,
- 0x01, 0x51, 0x20, 0x31,
- 0x01, 0x57, 0xae, 0x00,
- 0x0d, 0x6a, 0x76, 0x00,
-- 0x00, 0x51, 0x12, 0x5e,
-+ 0x00, 0x51, 0x14, 0x5e,
- 0x01, 0x51, 0xc8, 0x30,
- 0x00, 0x39, 0xc8, 0x60,
- 0x00, 0xbb, 0x30, 0x70,
-- 0xc1, 0x6a, 0xd8, 0x5e,
-+ 0xc1, 0x6a, 0xda, 0x5e,
- 0x01, 0xbf, 0x72, 0x30,
- 0x01, 0x40, 0x7e, 0x31,
- 0x01, 0x90, 0x80, 0x30,
-@@ -49,10 +49,10 @@ static uint8_t seqprog[] = {
- 0x08, 0x6a, 0x78, 0x00,
- 0x01, 0x50, 0xc8, 0x30,
- 0xe0, 0x6a, 0xcc, 0x00,
-- 0x48, 0x6a, 0xfc, 0x5d,
-+ 0x48, 0x6a, 0xfe, 0x5d,
- 0x01, 0x6a, 0xdc, 0x01,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0x48, 0x6a, 0xfc, 0x5d,
-+ 0x48, 0x6a, 0xfe, 0x5d,
- 0x01, 0x6a, 0x26, 0x01,
- 0xf0, 0x19, 0x7a, 0x08,
- 0x0f, 0x18, 0xc8, 0x08,
-@@ -93,7 +93,7 @@ static uint8_t seqprog[] = {
- 0x00, 0x65, 0x20, 0x41,
- 0x02, 0x57, 0xae, 0x00,
- 0x00, 0x65, 0x9e, 0x40,
-- 0x61, 0x6a, 0xd8, 0x5e,
-+ 0x61, 0x6a, 0xda, 0x5e,
- 0x08, 0x51, 0x20, 0x71,
- 0x02, 0x0b, 0xb2, 0x78,
- 0x00, 0x65, 0xae, 0x40,
-@@ -106,7 +106,7 @@ static uint8_t seqprog[] = {
- 0x80, 0x3d, 0x7a, 0x00,
- 0x20, 0x6a, 0x16, 0x00,
- 0x00, 0x65, 0xcc, 0x41,
-- 0x00, 0x65, 0xb2, 0x5e,
-+ 0x00, 0x65, 0xb4, 0x5e,
- 0x00, 0x65, 0x12, 0x40,
- 0x20, 0x11, 0xd2, 0x68,
- 0x20, 0x6a, 0x18, 0x00,
-@@ -140,27 +140,27 @@ static uint8_t seqprog[] = {
- 0x80, 0x0b, 0xc4, 0x79,
- 0x12, 0x01, 0x02, 0x00,
- 0x01, 0xab, 0xac, 0x30,
-- 0xe4, 0x6a, 0x6e, 0x5d,
-+ 0xe4, 0x6a, 0x70, 0x5d,
- 0x40, 0x6a, 0x16, 0x00,
-- 0x80, 0x3e, 0x84, 0x5d,
-+ 0x80, 0x3e, 0x86, 0x5d,
- 0x20, 0xb8, 0x18, 0x79,
-- 0x20, 0x6a, 0x84, 0x5d,
-- 0x00, 0xab, 0x84, 0x5d,
-+ 0x20, 0x6a, 0x86, 0x5d,
-+ 0x00, 0xab, 0x86, 0x5d,
- 0x01, 0xa9, 0x78, 0x30,
- 0x10, 0xb8, 0x20, 0x79,
-- 0xe4, 0x6a, 0x6e, 0x5d,
-+ 0xe4, 0x6a, 0x70, 0x5d,
- 0x00, 0x65, 0xae, 0x40,
- 0x10, 0x03, 0x3c, 0x69,
- 0x08, 0x3c, 0x5a, 0x69,
- 0x04, 0x3c, 0x92, 0x69,
- 0x02, 0x3c, 0x98, 0x69,
- 0x01, 0x3c, 0x44, 0x79,
-- 0xff, 0x6a, 0x70, 0x00,
-+ 0xff, 0x6a, 0xa6, 0x00,
- 0x00, 0x65, 0xa4, 0x59,
-- 0x00, 0x6a, 0xc0, 0x5e,
-- 0xff, 0x38, 0x30, 0x71,
-+ 0x00, 0x6a, 0xc2, 0x5e,
-+ 0xff, 0x53, 0x30, 0x71,
- 0x0d, 0x6a, 0x76, 0x00,
-- 0x00, 0x38, 0x12, 0x5e,
-+ 0x00, 0x53, 0x14, 0x5e,
- 0x00, 0x65, 0xea, 0x58,
- 0x12, 0x01, 0x02, 0x00,
- 0x00, 0x65, 0x18, 0x41,
-@@ -168,10 +168,10 @@ static uint8_t seqprog[] = {
- 0x00, 0x65, 0xf2, 0x58,
- 0xfd, 0x57, 0xae, 0x08,
- 0x00, 0x65, 0xae, 0x40,
-- 0xe4, 0x6a, 0x6e, 0x5d,
-+ 0xe4, 0x6a, 0x70, 0x5d,
- 0x20, 0x3c, 0x4a, 0x79,
-- 0x02, 0x6a, 0x84, 0x5d,
-- 0x04, 0x6a, 0x84, 0x5d,
-+ 0x02, 0x6a, 0x86, 0x5d,
-+ 0x04, 0x6a, 0x86, 0x5d,
- 0x01, 0x03, 0x4c, 0x69,
- 0xf7, 0x11, 0x22, 0x08,
- 0xff, 0x6a, 0x24, 0x08,
-@@ -182,13 +182,13 @@ static uint8_t seqprog[] = {
- 0x80, 0x86, 0xc8, 0x08,
- 0x01, 0x4f, 0xc8, 0x30,
- 0x00, 0x50, 0x6c, 0x61,
-- 0xc4, 0x6a, 0x6e, 0x5d,
-+ 0xc4, 0x6a, 0x70, 0x5d,
- 0x40, 0x3c, 0x68, 0x79,
-- 0x28, 0x6a, 0x84, 0x5d,
-+ 0x28, 0x6a, 0x86, 0x5d,
- 0x00, 0x65, 0x4c, 0x41,
-- 0x08, 0x6a, 0x84, 0x5d,
-+ 0x08, 0x6a, 0x86, 0x5d,
- 0x00, 0x65, 0x4c, 0x41,
-- 0x84, 0x6a, 0x6e, 0x5d,
-+ 0x84, 0x6a, 0x70, 0x5d,
- 0x00, 0x65, 0xf2, 0x58,
- 0x01, 0x66, 0xc8, 0x30,
- 0x01, 0x64, 0xd8, 0x31,
-@@ -208,16 +208,16 @@ static uint8_t seqprog[] = {
- 0xf7, 0x3c, 0x78, 0x08,
- 0x00, 0x65, 0x20, 0x41,
- 0x40, 0xaa, 0x7e, 0x10,
-- 0x04, 0xaa, 0x6e, 0x5d,
-- 0x00, 0x65, 0x56, 0x42,
-- 0xc4, 0x6a, 0x6e, 0x5d,
-+ 0x04, 0xaa, 0x70, 0x5d,
-+ 0x00, 0x65, 0x58, 0x42,
-+ 0xc4, 0x6a, 0x70, 0x5d,
- 0xc0, 0x6a, 0x7e, 0x00,
-- 0x00, 0xa8, 0x84, 0x5d,
-+ 0x00, 0xa8, 0x86, 0x5d,
- 0xe4, 0x6a, 0x06, 0x00,
-- 0x00, 0x6a, 0x84, 0x5d,
-+ 0x00, 0x6a, 0x86, 0x5d,
- 0x00, 0x65, 0x4c, 0x41,
- 0x10, 0x3c, 0xa8, 0x69,
-- 0x00, 0xbb, 0x8a, 0x44,
-+ 0x00, 0xbb, 0x8c, 0x44,
- 0x18, 0x6a, 0xda, 0x01,
- 0x01, 0x69, 0xd8, 0x31,
- 0x1c, 0x6a, 0xd0, 0x01,
-@@ -227,31 +227,32 @@ static uint8_t seqprog[] = {
- 0x01, 0x93, 0x26, 0x01,
- 0x03, 0x6a, 0x2a, 0x01,
- 0x01, 0x69, 0x32, 0x31,
-- 0x1c, 0x6a, 0xe0, 0x5d,
-+ 0x1c, 0x6a, 0xe2, 0x5d,
- 0x0a, 0x93, 0x26, 0x01,
-- 0x00, 0x65, 0xa8, 0x5e,
-+ 0x00, 0x65, 0xaa, 0x5e,
- 0x01, 0x50, 0xa0, 0x18,
- 0x02, 0x6a, 0x22, 0x05,
- 0x1a, 0x01, 0x02, 0x00,
- 0x80, 0x6a, 0x74, 0x00,
- 0x40, 0x6a, 0x78, 0x00,
- 0x40, 0x6a, 0x16, 0x00,
-- 0x00, 0x65, 0xd8, 0x5d,
-+ 0x00, 0x65, 0xda, 0x5d,
- 0x01, 0x3f, 0xc8, 0x30,
-- 0xbf, 0x64, 0x56, 0x7a,
-- 0x80, 0x64, 0x9e, 0x73,
-- 0xa0, 0x64, 0x00, 0x74,
-- 0xc0, 0x64, 0xf4, 0x73,
-- 0xe0, 0x64, 0x30, 0x74,
-- 0x01, 0x6a, 0xd8, 0x5e,
-+ 0xbf, 0x64, 0x58, 0x7a,
-+ 0x80, 0x64, 0xa0, 0x73,
-+ 0xa0, 0x64, 0x02, 0x74,
-+ 0xc0, 0x64, 0xf6, 0x73,
-+ 0xe0, 0x64, 0x32, 0x74,
-+ 0x01, 0x6a, 0xda, 0x5e,
- 0x00, 0x65, 0xcc, 0x41,
- 0xf7, 0x11, 0x22, 0x08,
- 0x01, 0x06, 0xd4, 0x30,
- 0xff, 0x6a, 0x24, 0x08,
- 0xf7, 0x01, 0x02, 0x08,
-- 0x09, 0x0c, 0xe6, 0x79,
-+ 0xc0, 0x6a, 0x78, 0x00,
-+ 0x09, 0x0c, 0xe8, 0x79,
- 0x08, 0x0c, 0x04, 0x68,
-- 0xb1, 0x6a, 0xd8, 0x5e,
-+ 0xb1, 0x6a, 0xda, 0x5e,
- 0xff, 0x6a, 0x26, 0x09,
- 0x12, 0x01, 0x02, 0x00,
- 0x02, 0x6a, 0x08, 0x30,
-@@ -264,29 +265,29 @@ static uint8_t seqprog[] = {
- 0x00, 0xa5, 0x4a, 0x21,
- 0x00, 0xa6, 0x4c, 0x21,
- 0x00, 0xa7, 0x4e, 0x25,
-- 0x08, 0xeb, 0xdc, 0x7e,
-- 0x80, 0xeb, 0x06, 0x7a,
-+ 0x08, 0xeb, 0xde, 0x7e,
-+ 0x80, 0xeb, 0x08, 0x7a,
- 0xff, 0x6a, 0xd6, 0x09,
-- 0x08, 0xeb, 0x0a, 0x6a,
-+ 0x08, 0xeb, 0x0c, 0x6a,
- 0xff, 0x6a, 0xd4, 0x0c,
-- 0x80, 0xa3, 0xdc, 0x6e,
-- 0x88, 0xeb, 0x20, 0x72,
-- 0x08, 0xeb, 0xdc, 0x6e,
-- 0x04, 0xea, 0x24, 0xe2,
-- 0x08, 0xee, 0xdc, 0x6e,
-+ 0x80, 0xa3, 0xde, 0x6e,
-+ 0x88, 0xeb, 0x22, 0x72,
-+ 0x08, 0xeb, 0xde, 0x6e,
-+ 0x04, 0xea, 0x26, 0xe2,
-+ 0x08, 0xee, 0xde, 0x6e,
- 0x04, 0x6a, 0xd0, 0x81,
- 0x05, 0xa4, 0xc0, 0x89,
- 0x03, 0xa5, 0xc2, 0x31,
- 0x09, 0x6a, 0xd6, 0x05,
-- 0x00, 0x65, 0x08, 0x5a,
-+ 0x00, 0x65, 0x0a, 0x5a,
- 0x06, 0xa4, 0xd4, 0x89,
-- 0x80, 0x94, 0xdc, 0x7e,
-+ 0x80, 0x94, 0xde, 0x7e,
- 0x07, 0xe9, 0x10, 0x31,
- 0x01, 0xe9, 0x46, 0x31,
-- 0x00, 0xa3, 0xba, 0x5e,
-- 0x00, 0x65, 0xfa, 0x59,
-+ 0x00, 0xa3, 0xbc, 0x5e,
-+ 0x00, 0x65, 0xfc, 0x59,
- 0x01, 0xa4, 0xca, 0x30,
-- 0x80, 0xa3, 0x34, 0x7a,
-+ 0x80, 0xa3, 0x36, 0x7a,
- 0x02, 0x65, 0xca, 0x00,
- 0x01, 0x65, 0xf8, 0x31,
- 0x80, 0x93, 0x26, 0x01,
-@@ -294,162 +295,162 @@ static uint8_t seqprog[] = {
- 0x01, 0x8c, 0xc8, 0x30,
- 0x00, 0x88, 0xc8, 0x18,
- 0x02, 0x64, 0xc8, 0x88,
-- 0xff, 0x64, 0xdc, 0x7e,
-- 0xff, 0x8d, 0x4a, 0x6a,
-- 0xff, 0x8e, 0x4a, 0x6a,
-+ 0xff, 0x64, 0xde, 0x7e,
-+ 0xff, 0x8d, 0x4c, 0x6a,
-+ 0xff, 0x8e, 0x4c, 0x6a,
- 0x03, 0x8c, 0xd4, 0x98,
-- 0x00, 0x65, 0xdc, 0x56,
-+ 0x00, 0x65, 0xde, 0x56,
- 0x01, 0x64, 0x70, 0x30,
- 0xff, 0x64, 0xc8, 0x10,
- 0x01, 0x64, 0xc8, 0x18,
- 0x00, 0x8c, 0x18, 0x19,
- 0xff, 0x8d, 0x1a, 0x21,
- 0xff, 0x8e, 0x1c, 0x25,
-- 0xc0, 0x3c, 0x5a, 0x7a,
-- 0x21, 0x6a, 0xd8, 0x5e,
-+ 0xc0, 0x3c, 0x5c, 0x7a,
-+ 0x21, 0x6a, 0xda, 0x5e,
- 0xa8, 0x6a, 0x76, 0x00,
- 0x79, 0x6a, 0x76, 0x00,
-- 0x40, 0x3f, 0x62, 0x6a,
-+ 0x40, 0x3f, 0x64, 0x6a,
- 0x04, 0x3b, 0x76, 0x00,
- 0x04, 0x6a, 0xd4, 0x81,
-- 0x20, 0x3c, 0x6a, 0x7a,
-- 0x51, 0x6a, 0xd8, 0x5e,
-- 0x00, 0x65, 0x82, 0x42,
-+ 0x20, 0x3c, 0x6c, 0x7a,
-+ 0x51, 0x6a, 0xda, 0x5e,
-+ 0x00, 0x65, 0x84, 0x42,
- 0x20, 0x3c, 0x78, 0x00,
-- 0x00, 0xb3, 0xba, 0x5e,
-+ 0x00, 0xb3, 0xbc, 0x5e,
- 0x07, 0xac, 0x10, 0x31,
- 0x05, 0xb3, 0x46, 0x31,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0xac, 0x6a, 0xee, 0x5d,
-+ 0xac, 0x6a, 0xf0, 0x5d,
- 0xa3, 0x6a, 0xcc, 0x00,
-- 0xb3, 0x6a, 0xf2, 0x5d,
-- 0x00, 0x65, 0x3a, 0x5a,
-+ 0xb3, 0x6a, 0xf4, 0x5d,
-+ 0x00, 0x65, 0x3c, 0x5a,
- 0xfd, 0xa4, 0x48, 0x09,
- 0x03, 0x8c, 0x10, 0x30,
-- 0x00, 0x65, 0xe6, 0x5d,
-- 0x01, 0xa4, 0x94, 0x7a,
-+ 0x00, 0x65, 0xe8, 0x5d,
-+ 0x01, 0xa4, 0x96, 0x7a,
- 0x04, 0x3b, 0x76, 0x08,
- 0x01, 0x3b, 0x26, 0x31,
- 0x80, 0x02, 0x04, 0x00,
-- 0x10, 0x0c, 0x8a, 0x7a,
-- 0x03, 0x9e, 0x8c, 0x6a,
-+ 0x10, 0x0c, 0x8c, 0x7a,
-+ 0x03, 0x9e, 0x8e, 0x6a,
- 0x7f, 0x02, 0x04, 0x08,
-- 0x91, 0x6a, 0xd8, 0x5e,
-+ 0x91, 0x6a, 0xda, 0x5e,
- 0x00, 0x65, 0xcc, 0x41,
- 0x01, 0xa4, 0xca, 0x30,
-- 0x80, 0xa3, 0x9a, 0x7a,
-+ 0x80, 0xa3, 0x9c, 0x7a,
- 0x02, 0x65, 0xca, 0x00,
- 0x01, 0x65, 0xf8, 0x31,
- 0x01, 0x3b, 0x26, 0x31,
-- 0x00, 0x65, 0x0e, 0x5a,
-- 0x01, 0xfc, 0xa8, 0x6a,
-- 0x80, 0x0b, 0x9e, 0x6a,
-- 0x10, 0x0c, 0x9e, 0x7a,
-- 0x20, 0x93, 0x9e, 0x6a,
-+ 0x00, 0x65, 0x10, 0x5a,
-+ 0x01, 0xfc, 0xaa, 0x6a,
-+ 0x80, 0x0b, 0xa0, 0x6a,
-+ 0x10, 0x0c, 0xa0, 0x7a,
-+ 0x20, 0x93, 0xa0, 0x6a,
- 0x02, 0x93, 0x26, 0x01,
-- 0x02, 0xfc, 0xb2, 0x7a,
-- 0x40, 0x0d, 0xc6, 0x6a,
-+ 0x02, 0xfc, 0xb4, 0x7a,
-+ 0x40, 0x0d, 0xc8, 0x6a,
- 0x01, 0xa4, 0x48, 0x01,
-- 0x00, 0x65, 0xc6, 0x42,
-- 0x40, 0x0d, 0xb8, 0x6a,
-- 0x00, 0x65, 0x0e, 0x5a,
-- 0x00, 0x65, 0xaa, 0x42,
-- 0x80, 0xfc, 0xc2, 0x7a,
-- 0x80, 0xa4, 0xc2, 0x6a,
-+ 0x00, 0x65, 0xc8, 0x42,
-+ 0x40, 0x0d, 0xba, 0x6a,
-+ 0x00, 0x65, 0x10, 0x5a,
-+ 0x00, 0x65, 0xac, 0x42,
-+ 0x80, 0xfc, 0xc4, 0x7a,
-+ 0x80, 0xa4, 0xc4, 0x6a,
- 0xff, 0xa5, 0x4a, 0x19,
- 0xff, 0xa6, 0x4c, 0x21,
- 0xff, 0xa7, 0x4e, 0x21,
- 0xf8, 0xfc, 0x48, 0x09,
- 0x7f, 0xa3, 0x46, 0x09,
-- 0x04, 0x3b, 0xe2, 0x6a,
-+ 0x04, 0x3b, 0xe4, 0x6a,
- 0x02, 0x93, 0x26, 0x01,
-- 0x01, 0x94, 0xc8, 0x7a,
-- 0x01, 0x94, 0xc8, 0x7a,
-- 0x01, 0x94, 0xc8, 0x7a,
-- 0x01, 0x94, 0xc8, 0x7a,
-- 0x01, 0x94, 0xc8, 0x7a,
-- 0x01, 0xa4, 0xe0, 0x7a,
-- 0x01, 0xfc, 0xd6, 0x7a,
-- 0x01, 0x94, 0xe2, 0x6a,
-- 0x01, 0x94, 0xe2, 0x6a,
-- 0x01, 0x94, 0xe2, 0x6a,
-- 0x00, 0x65, 0x82, 0x42,
-- 0x01, 0x94, 0xe0, 0x7a,
-- 0x10, 0x94, 0xe2, 0x6a,
-+ 0x01, 0x94, 0xca, 0x7a,
-+ 0x01, 0x94, 0xca, 0x7a,
-+ 0x01, 0x94, 0xca, 0x7a,
-+ 0x01, 0x94, 0xca, 0x7a,
-+ 0x01, 0x94, 0xca, 0x7a,
-+ 0x01, 0xa4, 0xe2, 0x7a,
-+ 0x01, 0xfc, 0xd8, 0x7a,
-+ 0x01, 0x94, 0xe4, 0x6a,
-+ 0x01, 0x94, 0xe4, 0x6a,
-+ 0x01, 0x94, 0xe4, 0x6a,
-+ 0x00, 0x65, 0x84, 0x42,
-+ 0x01, 0x94, 0xe2, 0x7a,
-+ 0x10, 0x94, 0xe4, 0x6a,
- 0xd7, 0x93, 0x26, 0x09,
-- 0x28, 0x93, 0xe6, 0x6a,
-+ 0x28, 0x93, 0xe8, 0x6a,
- 0x01, 0x85, 0x0a, 0x01,
-- 0x02, 0xfc, 0xee, 0x6a,
-+ 0x02, 0xfc, 0xf0, 0x6a,
- 0x01, 0x14, 0x46, 0x31,
- 0xff, 0x6a, 0x10, 0x09,
- 0xfe, 0x85, 0x0a, 0x09,
-- 0xff, 0x38, 0xfc, 0x6a,
-- 0x80, 0xa3, 0xfc, 0x7a,
-- 0x80, 0x0b, 0xfa, 0x7a,
-- 0x04, 0x3b, 0xfc, 0x7a,
-+ 0xff, 0x38, 0xfe, 0x6a,
-+ 0x80, 0xa3, 0xfe, 0x7a,
-+ 0x80, 0x0b, 0xfc, 0x7a,
-+ 0x04, 0x3b, 0xfe, 0x7a,
- 0xbf, 0x3b, 0x76, 0x08,
- 0x01, 0x3b, 0x26, 0x31,
-- 0x00, 0x65, 0x0e, 0x5a,
-- 0x01, 0x0b, 0x0a, 0x6b,
-- 0x10, 0x0c, 0xfe, 0x7a,
-- 0x04, 0x93, 0x08, 0x6b,
-- 0x01, 0x94, 0x06, 0x7b,
-- 0x10, 0x94, 0x08, 0x6b,
-+ 0x00, 0x65, 0x10, 0x5a,
-+ 0x01, 0x0b, 0x0c, 0x6b,
-+ 0x10, 0x0c, 0x00, 0x7b,
-+ 0x04, 0x93, 0x0a, 0x6b,
-+ 0x01, 0x94, 0x08, 0x7b,
-+ 0x10, 0x94, 0x0a, 0x6b,
- 0xc7, 0x93, 0x26, 0x09,
- 0x01, 0x99, 0xd4, 0x30,
-- 0x38, 0x93, 0x0c, 0x6b,
-- 0xff, 0x08, 0x5a, 0x6b,
-- 0xff, 0x09, 0x5a, 0x6b,
-- 0xff, 0x0a, 0x5a, 0x6b,
-- 0xff, 0x38, 0x28, 0x7b,
-+ 0x38, 0x93, 0x0e, 0x6b,
-+ 0xff, 0x08, 0x5c, 0x6b,
-+ 0xff, 0x09, 0x5c, 0x6b,
-+ 0xff, 0x0a, 0x5c, 0x6b,
-+ 0xff, 0x38, 0x2a, 0x7b,
- 0x04, 0x14, 0x10, 0x31,
- 0x01, 0x38, 0x18, 0x31,
- 0x02, 0x6a, 0x1a, 0x31,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0x14, 0x6a, 0xf4, 0x5d,
-- 0x00, 0x38, 0xe0, 0x5d,
-+ 0x14, 0x6a, 0xf6, 0x5d,
-+ 0x00, 0x38, 0xe2, 0x5d,
- 0xff, 0x6a, 0x70, 0x08,
-- 0x00, 0x65, 0x54, 0x43,
-- 0x80, 0xa3, 0x2e, 0x7b,
-+ 0x00, 0x65, 0x56, 0x43,
-+ 0x80, 0xa3, 0x30, 0x7b,
- 0x01, 0xa4, 0x48, 0x01,
-- 0x00, 0x65, 0x5a, 0x43,
-- 0x08, 0xeb, 0x34, 0x7b,
-- 0x00, 0x65, 0x0e, 0x5a,
-- 0x08, 0xeb, 0x30, 0x6b,
-+ 0x00, 0x65, 0x5c, 0x43,
-+ 0x08, 0xeb, 0x36, 0x7b,
-+ 0x00, 0x65, 0x10, 0x5a,
-+ 0x08, 0xeb, 0x32, 0x6b,
- 0x07, 0xe9, 0x10, 0x31,
- 0x01, 0xe9, 0xca, 0x30,
- 0x01, 0x65, 0x46, 0x31,
-- 0x00, 0x6a, 0xba, 0x5e,
-+ 0x00, 0x6a, 0xbc, 0x5e,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0xa4, 0x6a, 0xf4, 0x5d,
-- 0x08, 0x6a, 0xe0, 0x5d,
-+ 0xa4, 0x6a, 0xf6, 0x5d,
-+ 0x08, 0x6a, 0xe2, 0x5d,
- 0x0d, 0x93, 0x26, 0x01,
-- 0x00, 0x65, 0xa8, 0x5e,
-+ 0x00, 0x65, 0xaa, 0x5e,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0x00, 0x65, 0x8a, 0x5e,
-+ 0x00, 0x65, 0x8c, 0x5e,
- 0x01, 0x99, 0x46, 0x31,
-- 0x00, 0xa3, 0xba, 0x5e,
-+ 0x00, 0xa3, 0xbc, 0x5e,
- 0x01, 0x88, 0x10, 0x31,
-- 0x00, 0x65, 0x3a, 0x5a,
-- 0x00, 0x65, 0xfa, 0x59,
-+ 0x00, 0x65, 0x3c, 0x5a,
-+ 0x00, 0x65, 0xfc, 0x59,
- 0x03, 0x8c, 0x10, 0x30,
-- 0x00, 0x65, 0xe6, 0x5d,
-- 0x80, 0x0b, 0x82, 0x6a,
-- 0x80, 0x0b, 0x62, 0x6b,
-- 0x01, 0x0c, 0x5c, 0x7b,
-- 0x10, 0x0c, 0x82, 0x7a,
-- 0x03, 0x9e, 0x82, 0x6a,
-- 0x00, 0x65, 0x04, 0x5a,
-- 0x00, 0x6a, 0xba, 0x5e,
-- 0x01, 0xa4, 0x82, 0x6b,
-- 0xff, 0x38, 0x78, 0x7b,
-+ 0x00, 0x65, 0xe8, 0x5d,
-+ 0x80, 0x0b, 0x84, 0x6a,
-+ 0x80, 0x0b, 0x64, 0x6b,
-+ 0x01, 0x0c, 0x5e, 0x7b,
-+ 0x10, 0x0c, 0x84, 0x7a,
-+ 0x03, 0x9e, 0x84, 0x6a,
-+ 0x00, 0x65, 0x06, 0x5a,
-+ 0x00, 0x6a, 0xbc, 0x5e,
-+ 0x01, 0xa4, 0x84, 0x6b,
-+ 0xff, 0x38, 0x7a, 0x7b,
- 0x01, 0x38, 0xc8, 0x30,
- 0x00, 0x08, 0x40, 0x19,
- 0xff, 0x6a, 0xc8, 0x08,
- 0x00, 0x09, 0x42, 0x21,
- 0x00, 0x0a, 0x44, 0x21,
- 0xff, 0x6a, 0x70, 0x08,
-- 0x00, 0x65, 0x7a, 0x43,
-+ 0x00, 0x65, 0x7c, 0x43,
- 0x03, 0x08, 0x40, 0x31,
- 0x03, 0x08, 0x40, 0x31,
- 0x01, 0x08, 0x40, 0x31,
-@@ -461,16 +462,16 @@ static uint8_t seqprog[] = {
- 0x04, 0x3c, 0xcc, 0x79,
- 0xfb, 0x3c, 0x78, 0x08,
- 0x04, 0x93, 0x20, 0x79,
-- 0x01, 0x0c, 0x8e, 0x6b,
-+ 0x01, 0x0c, 0x90, 0x6b,
- 0x80, 0xba, 0x20, 0x79,
- 0x80, 0x04, 0x20, 0x79,
-- 0xe4, 0x6a, 0x6e, 0x5d,
-- 0x23, 0x6a, 0x84, 0x5d,
-- 0x01, 0x6a, 0x84, 0x5d,
-+ 0xe4, 0x6a, 0x70, 0x5d,
-+ 0x23, 0x6a, 0x86, 0x5d,
-+ 0x01, 0x6a, 0x86, 0x5d,
- 0x00, 0x65, 0x20, 0x41,
- 0x00, 0x65, 0xcc, 0x41,
-- 0x80, 0x3c, 0xa2, 0x7b,
-- 0x21, 0x6a, 0xd8, 0x5e,
-+ 0x80, 0x3c, 0xa4, 0x7b,
-+ 0x21, 0x6a, 0xda, 0x5e,
- 0x01, 0xbc, 0x18, 0x31,
- 0x02, 0x6a, 0x1a, 0x31,
- 0x02, 0x6a, 0xf8, 0x01,
-@@ -480,16 +481,16 @@ static uint8_t seqprog[] = {
- 0xff, 0x6a, 0x12, 0x08,
- 0xff, 0x6a, 0x14, 0x08,
- 0xf3, 0xbc, 0xd4, 0x18,
-- 0xa0, 0x6a, 0xc8, 0x53,
-+ 0xa0, 0x6a, 0xca, 0x53,
- 0x04, 0xa0, 0x10, 0x31,
- 0xac, 0x6a, 0x26, 0x01,
- 0x04, 0xa0, 0x10, 0x31,
- 0x03, 0x08, 0x18, 0x31,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0xa0, 0x6a, 0xf4, 0x5d,
-- 0x00, 0xbc, 0xe0, 0x5d,
-+ 0xa0, 0x6a, 0xf6, 0x5d,
-+ 0x00, 0xbc, 0xe2, 0x5d,
- 0x3d, 0x6a, 0x26, 0x01,
-- 0x00, 0x65, 0xe0, 0x43,
-+ 0x00, 0x65, 0xe2, 0x43,
- 0xff, 0x6a, 0x10, 0x09,
- 0xa4, 0x6a, 0x26, 0x01,
- 0x0c, 0xa0, 0x32, 0x31,
-@@ -499,128 +500,128 @@ static uint8_t seqprog[] = {
- 0x36, 0x6a, 0x26, 0x01,
- 0x02, 0x93, 0x26, 0x01,
- 0x35, 0x6a, 0x26, 0x01,
-- 0x00, 0x65, 0x9c, 0x5e,
-- 0x00, 0x65, 0x9c, 0x5e,
-+ 0x00, 0x65, 0x9e, 0x5e,
-+ 0x00, 0x65, 0x9e, 0x5e,
- 0x02, 0x93, 0x26, 0x01,
- 0xbf, 0x3c, 0x78, 0x08,
-- 0x04, 0x0b, 0xe6, 0x6b,
-- 0x10, 0x0c, 0xe2, 0x7b,
-- 0x01, 0x03, 0xe6, 0x6b,
-- 0x20, 0x93, 0xe8, 0x6b,
-- 0x04, 0x0b, 0xee, 0x6b,
-+ 0x04, 0x0b, 0xe8, 0x6b,
-+ 0x10, 0x0c, 0xe4, 0x7b,
-+ 0x01, 0x03, 0xe8, 0x6b,
-+ 0x20, 0x93, 0xea, 0x6b,
-+ 0x04, 0x0b, 0xf0, 0x6b,
- 0x40, 0x3c, 0x78, 0x00,
- 0xc7, 0x93, 0x26, 0x09,
-- 0x38, 0x93, 0xf0, 0x6b,
-+ 0x38, 0x93, 0xf2, 0x6b,
- 0x00, 0x65, 0xcc, 0x41,
-- 0x80, 0x3c, 0x56, 0x6c,
-+ 0x80, 0x3c, 0x58, 0x6c,
- 0x01, 0x06, 0x50, 0x31,
- 0x80, 0xb8, 0x70, 0x01,
- 0x00, 0x65, 0xcc, 0x41,
- 0x10, 0x3f, 0x06, 0x00,
- 0x10, 0x6a, 0x06, 0x00,
- 0x01, 0x3a, 0xca, 0x30,
-- 0x80, 0x65, 0x1c, 0x64,
-- 0x10, 0xb8, 0x40, 0x6c,
-+ 0x80, 0x65, 0x1e, 0x64,
-+ 0x10, 0xb8, 0x42, 0x6c,
- 0xc0, 0x3e, 0xca, 0x00,
-- 0x40, 0xb8, 0x0c, 0x6c,
-+ 0x40, 0xb8, 0x0e, 0x6c,
- 0xbf, 0x65, 0xca, 0x08,
-- 0x20, 0xb8, 0x20, 0x7c,
-+ 0x20, 0xb8, 0x22, 0x7c,
- 0x01, 0x65, 0x0c, 0x30,
-- 0x00, 0x65, 0xd8, 0x5d,
-- 0xa0, 0x3f, 0x28, 0x64,
-+ 0x00, 0x65, 0xda, 0x5d,
-+ 0xa0, 0x3f, 0x2a, 0x64,
- 0x23, 0xb8, 0x0c, 0x08,
-- 0x00, 0x65, 0xd8, 0x5d,
-- 0xa0, 0x3f, 0x28, 0x64,
-- 0x00, 0xbb, 0x20, 0x44,
-- 0xff, 0x65, 0x20, 0x64,
-- 0x00, 0x65, 0x40, 0x44,
-+ 0x00, 0x65, 0xda, 0x5d,
-+ 0xa0, 0x3f, 0x2a, 0x64,
-+ 0x00, 0xbb, 0x22, 0x44,
-+ 0xff, 0x65, 0x22, 0x64,
-+ 0x00, 0x65, 0x42, 0x44,
- 0x40, 0x6a, 0x18, 0x00,
- 0x01, 0x65, 0x0c, 0x30,
-- 0x00, 0x65, 0xd8, 0x5d,
-- 0xa0, 0x3f, 0xfc, 0x73,
-+ 0x00, 0x65, 0xda, 0x5d,
-+ 0xa0, 0x3f, 0xfe, 0x73,
- 0x40, 0x6a, 0x18, 0x00,
- 0x01, 0x3a, 0xa6, 0x30,
- 0x08, 0x6a, 0x74, 0x00,
- 0x00, 0x65, 0xcc, 0x41,
-- 0x64, 0x6a, 0x68, 0x5d,
-- 0x80, 0x64, 0xd8, 0x6c,
-- 0x04, 0x64, 0x9a, 0x74,
-- 0x02, 0x64, 0xaa, 0x74,
-- 0x00, 0x6a, 0x60, 0x74,
-- 0x03, 0x64, 0xc8, 0x74,
-- 0x23, 0x64, 0x48, 0x74,
-- 0x08, 0x64, 0x5c, 0x74,
-- 0x61, 0x6a, 0xd8, 0x5e,
-- 0x00, 0x65, 0xd8, 0x5d,
-+ 0x64, 0x6a, 0x6a, 0x5d,
-+ 0x80, 0x64, 0xda, 0x6c,
-+ 0x04, 0x64, 0x9c, 0x74,
-+ 0x02, 0x64, 0xac, 0x74,
-+ 0x00, 0x6a, 0x62, 0x74,
-+ 0x03, 0x64, 0xca, 0x74,
-+ 0x23, 0x64, 0x4a, 0x74,
-+ 0x08, 0x64, 0x5e, 0x74,
-+ 0x61, 0x6a, 0xda, 0x5e,
-+ 0x00, 0x65, 0xda, 0x5d,
- 0x08, 0x51, 0xce, 0x71,
-- 0x00, 0x65, 0x40, 0x44,
-- 0x80, 0x04, 0x5a, 0x7c,
-- 0x51, 0x6a, 0x5e, 0x5d,
-- 0x01, 0x51, 0x5a, 0x64,
-- 0x01, 0xa4, 0x52, 0x7c,
-- 0x80, 0xba, 0x5c, 0x6c,
-- 0x41, 0x6a, 0xd8, 0x5e,
-- 0x00, 0x65, 0x5c, 0x44,
-- 0x21, 0x6a, 0xd8, 0x5e,
-- 0x00, 0x65, 0x5c, 0x44,
-- 0x07, 0x6a, 0x54, 0x5d,
-+ 0x00, 0x65, 0x42, 0x44,
-+ 0x80, 0x04, 0x5c, 0x7c,
-+ 0x51, 0x6a, 0x60, 0x5d,
-+ 0x01, 0x51, 0x5c, 0x64,
-+ 0x01, 0xa4, 0x54, 0x7c,
-+ 0x80, 0xba, 0x5e, 0x6c,
-+ 0x41, 0x6a, 0xda, 0x5e,
-+ 0x00, 0x65, 0x5e, 0x44,
-+ 0x21, 0x6a, 0xda, 0x5e,
-+ 0x00, 0x65, 0x5e, 0x44,
-+ 0x07, 0x6a, 0x56, 0x5d,
- 0x01, 0x06, 0xd4, 0x30,
- 0x00, 0x65, 0xcc, 0x41,
-- 0x80, 0xb8, 0x56, 0x7c,
-- 0xc0, 0x3c, 0x6a, 0x7c,
-- 0x80, 0x3c, 0x56, 0x6c,
-- 0xff, 0xa8, 0x6a, 0x6c,
-- 0x40, 0x3c, 0x56, 0x6c,
-- 0x10, 0xb8, 0x6e, 0x7c,
-- 0xa1, 0x6a, 0xd8, 0x5e,
-- 0x01, 0xb4, 0x74, 0x6c,
-- 0x02, 0xb4, 0x76, 0x6c,
-- 0x01, 0xa4, 0x76, 0x7c,
-- 0xff, 0xa8, 0x86, 0x7c,
-+ 0x80, 0xb8, 0x58, 0x7c,
-+ 0xc0, 0x3c, 0x6c, 0x7c,
-+ 0x80, 0x3c, 0x58, 0x6c,
-+ 0xff, 0xa8, 0x6c, 0x6c,
-+ 0x40, 0x3c, 0x58, 0x6c,
-+ 0x10, 0xb8, 0x70, 0x7c,
-+ 0xa1, 0x6a, 0xda, 0x5e,
-+ 0x01, 0xb4, 0x76, 0x6c,
-+ 0x02, 0xb4, 0x78, 0x6c,
-+ 0x01, 0xa4, 0x78, 0x7c,
-+ 0xff, 0xa8, 0x88, 0x7c,
- 0x04, 0xb4, 0x68, 0x01,
- 0x01, 0x6a, 0x76, 0x00,
-- 0x00, 0xbb, 0x12, 0x5e,
-- 0xff, 0xa8, 0x86, 0x7c,
-- 0x71, 0x6a, 0xd8, 0x5e,
-- 0x40, 0x51, 0x86, 0x64,
-- 0x00, 0x65, 0xb2, 0x5e,
-+ 0x00, 0xbb, 0x14, 0x5e,
-+ 0xff, 0xa8, 0x88, 0x7c,
-+ 0x71, 0x6a, 0xda, 0x5e,
-+ 0x40, 0x51, 0x88, 0x64,
-+ 0x00, 0x65, 0xb4, 0x5e,
- 0x00, 0x65, 0xde, 0x41,
-- 0x00, 0xbb, 0x8a, 0x5c,
-+ 0x00, 0xbb, 0x8c, 0x5c,
- 0x00, 0x65, 0xde, 0x41,
-- 0x00, 0x65, 0xb2, 0x5e,
-+ 0x00, 0x65, 0xb4, 0x5e,
- 0x01, 0x65, 0xa2, 0x30,
- 0x01, 0xf8, 0xc8, 0x30,
- 0x01, 0x4e, 0xc8, 0x30,
-- 0x00, 0x6a, 0xb6, 0xdd,
-- 0x00, 0x51, 0xc8, 0x5d,
-+ 0x00, 0x6a, 0xb8, 0xdd,
-+ 0x00, 0x51, 0xca, 0x5d,
- 0x01, 0x4e, 0x9c, 0x18,
- 0x02, 0x6a, 0x22, 0x05,
-- 0xc0, 0x3c, 0x56, 0x6c,
-+ 0xc0, 0x3c, 0x58, 0x6c,
- 0x04, 0xb8, 0x70, 0x01,
-- 0x00, 0x65, 0xd4, 0x5e,
-+ 0x00, 0x65, 0xd6, 0x5e,
- 0x20, 0xb8, 0xde, 0x69,
- 0x01, 0xbb, 0xa2, 0x30,
- 0x3f, 0xba, 0x7c, 0x08,
-- 0x00, 0xb9, 0xce, 0x5c,
-+ 0x00, 0xb9, 0xd0, 0x5c,
- 0x00, 0x65, 0xde, 0x41,
- 0x01, 0x06, 0xd4, 0x30,
- 0x20, 0x3c, 0xcc, 0x79,
-- 0x20, 0x3c, 0x5c, 0x7c,
-- 0x01, 0xa4, 0xb8, 0x7c,
-+ 0x20, 0x3c, 0x5e, 0x7c,
-+ 0x01, 0xa4, 0xba, 0x7c,
- 0x01, 0xb4, 0x68, 0x01,
- 0x00, 0x65, 0xcc, 0x41,
-- 0x00, 0x65, 0x5c, 0x44,
-+ 0x00, 0x65, 0x5e, 0x44,
- 0x04, 0x14, 0x58, 0x31,
- 0x01, 0x06, 0xd4, 0x30,
- 0x08, 0xa0, 0x60, 0x31,
- 0xac, 0x6a, 0xcc, 0x00,
-- 0x14, 0x6a, 0xf4, 0x5d,
-+ 0x14, 0x6a, 0xf6, 0x5d,
- 0x01, 0x06, 0xd4, 0x30,
-- 0xa0, 0x6a, 0xec, 0x5d,
-+ 0xa0, 0x6a, 0xee, 0x5d,
- 0x00, 0x65, 0xcc, 0x41,
- 0xdf, 0x3c, 0x78, 0x08,
- 0x12, 0x01, 0x02, 0x00,
-- 0x00, 0x65, 0x5c, 0x44,
-+ 0x00, 0x65, 0x5e, 0x44,
- 0x4c, 0x65, 0xcc, 0x28,
- 0x01, 0x3e, 0x20, 0x31,
- 0xd0, 0x66, 0xcc, 0x18,
-@@ -631,102 +632,102 @@ static uint8_t seqprog[] = {
- 0xd0, 0x65, 0xca, 0x18,
- 0x01, 0x3e, 0x20, 0x31,
- 0x30, 0x65, 0xd4, 0x18,
-- 0x00, 0x65, 0xe6, 0x4c,
-+ 0x00, 0x65, 0xe8, 0x4c,
- 0xe1, 0x6a, 0x22, 0x01,
- 0xff, 0x6a, 0xd4, 0x08,
- 0x20, 0x65, 0xd4, 0x18,
-- 0x00, 0x65, 0xee, 0x54,
-+ 0x00, 0x65, 0xf0, 0x54,
- 0xe1, 0x6a, 0x22, 0x01,
- 0xff, 0x6a, 0xd4, 0x08,
- 0x20, 0x65, 0xca, 0x18,
- 0xe0, 0x65, 0xd4, 0x18,
-- 0x00, 0x65, 0xf8, 0x4c,
-+ 0x00, 0x65, 0xfa, 0x4c,
- 0xe1, 0x6a, 0x22, 0x01,
- 0xff, 0x6a, 0xd4, 0x08,
- 0xd0, 0x65, 0xd4, 0x18,
-- 0x00, 0x65, 0x00, 0x55,
-+ 0x00, 0x65, 0x02, 0x55,
- 0xe1, 0x6a, 0x22, 0x01,
- 0xff, 0x6a, 0xd4, 0x08,
- 0x01, 0x6c, 0xa2, 0x30,
-- 0xff, 0x51, 0x12, 0x75,
-- 0x00, 0x51, 0x8e, 0x5d,
-+ 0xff, 0x51, 0x14, 0x75,
-+ 0x00, 0x51, 0x90, 0x5d,
- 0x01, 0x51, 0x20, 0x31,
-- 0x00, 0x65, 0x34, 0x45,
-+ 0x00, 0x65, 0x36, 0x45,
- 0x3f, 0xba, 0xc8, 0x08,
-- 0x00, 0x3e, 0x34, 0x75,
-- 0x00, 0x65, 0xb0, 0x5e,
-+ 0x00, 0x3e, 0x36, 0x75,
-+ 0x00, 0x65, 0xb2, 0x5e,
- 0x80, 0x3c, 0x78, 0x00,
- 0x01, 0x06, 0xd4, 0x30,
-- 0x00, 0x65, 0xd8, 0x5d,
-+ 0x00, 0x65, 0xda, 0x5d,
- 0x01, 0x3c, 0x78, 0x00,
-- 0xe0, 0x3f, 0x50, 0x65,
-+ 0xe0, 0x3f, 0x52, 0x65,
- 0x02, 0x3c, 0x78, 0x00,
-- 0x20, 0x12, 0x50, 0x65,
-- 0x51, 0x6a, 0x5e, 0x5d,
-- 0x00, 0x51, 0x8e, 0x5d,
-- 0x51, 0x6a, 0x5e, 0x5d,
-+ 0x20, 0x12, 0x52, 0x65,
-+ 0x51, 0x6a, 0x60, 0x5d,
-+ 0x00, 0x51, 0x90, 0x5d,
-+ 0x51, 0x6a, 0x60, 0x5d,
- 0x01, 0x51, 0x20, 0x31,
- 0x04, 0x3c, 0x78, 0x00,
- 0x01, 0xb9, 0xc8, 0x30,
-- 0x00, 0x3d, 0x4e, 0x65,
-+ 0x00, 0x3d, 0x50, 0x65,
- 0x08, 0x3c, 0x78, 0x00,
- 0x3f, 0xba, 0xc8, 0x08,
-- 0x00, 0x3e, 0x4e, 0x65,
-+ 0x00, 0x3e, 0x50, 0x65,
- 0x10, 0x3c, 0x78, 0x00,
-- 0x04, 0xb8, 0x4e, 0x7d,
-+ 0x04, 0xb8, 0x50, 0x7d,
- 0xfb, 0xb8, 0x70, 0x09,
-- 0x20, 0xb8, 0x44, 0x6d,
-+ 0x20, 0xb8, 0x46, 0x6d,
- 0x01, 0x90, 0xc8, 0x30,
- 0xff, 0x6a, 0xa2, 0x00,
-- 0x00, 0x3d, 0xce, 0x5c,
-+ 0x00, 0x3d, 0xd0, 0x5c,
- 0x01, 0x64, 0x20, 0x31,
- 0xff, 0x6a, 0x78, 0x08,
- 0x00, 0x65, 0xea, 0x58,
-- 0x10, 0xb8, 0x5c, 0x7c,
-- 0xff, 0x6a, 0x54, 0x5d,
-- 0x00, 0x65, 0x5c, 0x44,
-- 0x00, 0x65, 0xb0, 0x5e,
-- 0x31, 0x6a, 0xd8, 0x5e,
-- 0x00, 0x65, 0x5c, 0x44,
-+ 0x10, 0xb8, 0x5e, 0x7c,
-+ 0xff, 0x6a, 0x56, 0x5d,
-+ 0x00, 0x65, 0x5e, 0x44,
-+ 0x00, 0x65, 0xb2, 0x5e,
-+ 0x31, 0x6a, 0xda, 0x5e,
-+ 0x00, 0x65, 0x5e, 0x44,
- 0x10, 0x3f, 0x06, 0x00,
- 0x10, 0x6a, 0x06, 0x00,
- 0x01, 0x65, 0x74, 0x34,
-- 0x81, 0x6a, 0xd8, 0x5e,
-- 0x00, 0x65, 0x60, 0x45,
-+ 0x81, 0x6a, 0xda, 0x5e,
-+ 0x00, 0x65, 0x62, 0x45,
- 0x01, 0x06, 0xd4, 0x30,
-- 0x01, 0x0c, 0x60, 0x7d,
-- 0x04, 0x0c, 0x5a, 0x6d,
-+ 0x01, 0x0c, 0x62, 0x7d,
-+ 0x04, 0x0c, 0x5c, 0x6d,
- 0xe0, 0x03, 0x7e, 0x08,
- 0xe0, 0x3f, 0xcc, 0x61,
- 0x01, 0x65, 0xcc, 0x30,
- 0x01, 0x12, 0xda, 0x34,
- 0x01, 0x06, 0xd4, 0x34,
-- 0x01, 0x03, 0x6e, 0x6d,
-+ 0x01, 0x03, 0x70, 0x6d,
- 0x40, 0x03, 0xcc, 0x08,
- 0x01, 0x65, 0x06, 0x30,
- 0x40, 0x65, 0xc8, 0x08,
-- 0x00, 0x66, 0x7c, 0x75,
-- 0x40, 0x65, 0x7c, 0x7d,
-- 0x00, 0x65, 0x7c, 0x5d,
-+ 0x00, 0x66, 0x7e, 0x75,
-+ 0x40, 0x65, 0x7e, 0x7d,
-+ 0x00, 0x65, 0x7e, 0x5d,
- 0xff, 0x6a, 0xd4, 0x08,
- 0xff, 0x6a, 0xd4, 0x08,
- 0xff, 0x6a, 0xd4, 0x08,
- 0xff, 0x6a, 0xd4, 0x0c,
- 0x08, 0x01, 0x02, 0x00,
-- 0x02, 0x0b, 0x86, 0x7d,
-+ 0x02, 0x0b, 0x88, 0x7d,
- 0x01, 0x65, 0x0c, 0x30,
-- 0x02, 0x0b, 0x8a, 0x7d,
-+ 0x02, 0x0b, 0x8c, 0x7d,
- 0xf7, 0x01, 0x02, 0x0c,
- 0x01, 0x65, 0xc8, 0x30,
-- 0xff, 0x41, 0xae, 0x75,
-+ 0xff, 0x41, 0xb0, 0x75,
- 0x01, 0x41, 0x20, 0x31,
- 0xff, 0x6a, 0xa4, 0x00,
-- 0x00, 0x65, 0x9e, 0x45,
-- 0xff, 0xbf, 0xae, 0x75,
-+ 0x00, 0x65, 0xa0, 0x45,
-+ 0xff, 0xbf, 0xb0, 0x75,
- 0x01, 0x90, 0xa4, 0x30,
- 0x01, 0xbf, 0x20, 0x31,
-- 0x00, 0xbb, 0x98, 0x65,
-- 0xff, 0x52, 0xac, 0x75,
-+ 0x00, 0xbb, 0x9a, 0x65,
-+ 0xff, 0x52, 0xae, 0x75,
- 0x01, 0xbf, 0xcc, 0x30,
- 0x01, 0x90, 0xca, 0x30,
- 0x01, 0x52, 0x20, 0x31,
-@@ -734,28 +735,28 @@ static uint8_t seqprog[] = {
- 0x01, 0x65, 0x20, 0x35,
- 0x01, 0xbf, 0x82, 0x34,
- 0x01, 0x64, 0xa2, 0x30,
-- 0x00, 0x6a, 0xc0, 0x5e,
-+ 0x00, 0x6a, 0xc2, 0x5e,
- 0x0d, 0x6a, 0x76, 0x00,
-- 0x00, 0x51, 0x12, 0x46,
-+ 0x00, 0x51, 0x14, 0x46,
- 0x01, 0x65, 0xa4, 0x30,
- 0xe0, 0x6a, 0xcc, 0x00,
-- 0x48, 0x6a, 0x06, 0x5e,
-+ 0x48, 0x6a, 0x08, 0x5e,
- 0x01, 0x6a, 0xd0, 0x01,
- 0x01, 0x6a, 0xdc, 0x05,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0x48, 0x6a, 0x06, 0x5e,
-- 0x01, 0x6a, 0xe0, 0x5d,
-+ 0x48, 0x6a, 0x08, 0x5e,
-+ 0x01, 0x6a, 0xe2, 0x5d,
- 0x01, 0x6a, 0x26, 0x05,
- 0x01, 0x65, 0xd8, 0x31,
- 0x09, 0xee, 0xdc, 0x01,
-- 0x80, 0xee, 0xcc, 0x7d,
-+ 0x80, 0xee, 0xce, 0x7d,
- 0xff, 0x6a, 0xdc, 0x0d,
- 0x01, 0x65, 0x32, 0x31,
- 0x0a, 0x93, 0x26, 0x01,
-- 0x00, 0x65, 0xa8, 0x46,
-- 0x81, 0x6a, 0xd8, 0x5e,
-- 0x01, 0x0c, 0xd8, 0x7d,
-- 0x04, 0x0c, 0xd6, 0x6d,
-+ 0x00, 0x65, 0xaa, 0x46,
-+ 0x81, 0x6a, 0xda, 0x5e,
-+ 0x01, 0x0c, 0xda, 0x7d,
-+ 0x04, 0x0c, 0xd8, 0x6d,
- 0xe0, 0x03, 0x06, 0x08,
- 0xe0, 0x03, 0x7e, 0x0c,
- 0x01, 0x65, 0x18, 0x31,
-@@ -774,7 +775,7 @@ static uint8_t seqprog[] = {
- 0x01, 0x6c, 0xda, 0x34,
- 0x3d, 0x64, 0xa4, 0x28,
- 0x55, 0x64, 0xc8, 0x28,
-- 0x00, 0x65, 0x06, 0x46,
-+ 0x00, 0x65, 0x08, 0x46,
- 0x2e, 0x64, 0xa4, 0x28,
- 0x66, 0x64, 0xc8, 0x28,
- 0x00, 0x6c, 0xda, 0x18,
-@@ -785,63 +786,63 @@ static uint8_t seqprog[] = {
- 0x00, 0x6c, 0xda, 0x24,
- 0x01, 0x65, 0xc8, 0x30,
- 0xe0, 0x6a, 0xcc, 0x00,
-- 0x44, 0x6a, 0x02, 0x5e,
-+ 0x44, 0x6a, 0x04, 0x5e,
- 0x01, 0x90, 0xe2, 0x31,
-- 0x04, 0x3b, 0x26, 0x7e,
-+ 0x04, 0x3b, 0x28, 0x7e,
- 0x30, 0x6a, 0xd0, 0x01,
- 0x20, 0x6a, 0xd0, 0x01,
- 0x1d, 0x6a, 0xdc, 0x01,
-- 0xdc, 0xee, 0x22, 0x66,
-- 0x00, 0x65, 0x3e, 0x46,
-+ 0xdc, 0xee, 0x24, 0x66,
-+ 0x00, 0x65, 0x40, 0x46,
- 0x20, 0x6a, 0xd0, 0x01,
- 0x01, 0x6a, 0xdc, 0x01,
- 0x20, 0xa0, 0xd8, 0x31,
- 0x09, 0xee, 0xdc, 0x01,
-- 0x80, 0xee, 0x2e, 0x7e,
-+ 0x80, 0xee, 0x30, 0x7e,
- 0x11, 0x6a, 0xdc, 0x01,
-- 0x50, 0xee, 0x32, 0x66,
-+ 0x50, 0xee, 0x34, 0x66,
- 0x20, 0x6a, 0xd0, 0x01,
- 0x09, 0x6a, 0xdc, 0x01,
-- 0x88, 0xee, 0x38, 0x66,
-+ 0x88, 0xee, 0x3a, 0x66,
- 0x19, 0x6a, 0xdc, 0x01,
-- 0xd8, 0xee, 0x3c, 0x66,
-+ 0xd8, 0xee, 0x3e, 0x66,
- 0xff, 0x6a, 0xdc, 0x09,
-- 0x18, 0xee, 0x40, 0x6e,
-+ 0x18, 0xee, 0x42, 0x6e,
- 0xff, 0x6a, 0xd4, 0x0c,
- 0x88, 0x6a, 0xcc, 0x00,
-- 0x44, 0x6a, 0x02, 0x5e,
-- 0x20, 0x6a, 0xe0, 0x5d,
-+ 0x44, 0x6a, 0x04, 0x5e,
-+ 0x20, 0x6a, 0xe2, 0x5d,
- 0x01, 0x3b, 0x26, 0x31,
-- 0x04, 0x3b, 0x5a, 0x6e,
-+ 0x04, 0x3b, 0x5c, 0x6e,
- 0xa0, 0x6a, 0xca, 0x00,
- 0x20, 0x65, 0xc8, 0x18,
-- 0x00, 0x65, 0x98, 0x5e,
-- 0x00, 0x65, 0x52, 0x66,
-+ 0x00, 0x65, 0x9a, 0x5e,
-+ 0x00, 0x65, 0x54, 0x66,
- 0x0a, 0x93, 0x26, 0x01,
-- 0x00, 0x65, 0xa8, 0x46,
-+ 0x00, 0x65, 0xaa, 0x46,
- 0xa0, 0x6a, 0xcc, 0x00,
- 0xff, 0x6a, 0xc8, 0x08,
-- 0x20, 0x94, 0x5e, 0x6e,
-- 0x10, 0x94, 0x60, 0x6e,
-- 0x08, 0x94, 0x7a, 0x6e,
-- 0x08, 0x94, 0x7a, 0x6e,
-- 0x08, 0x94, 0x7a, 0x6e,
-+ 0x20, 0x94, 0x60, 0x6e,
-+ 0x10, 0x94, 0x62, 0x6e,
-+ 0x08, 0x94, 0x7c, 0x6e,
-+ 0x08, 0x94, 0x7c, 0x6e,
-+ 0x08, 0x94, 0x7c, 0x6e,
- 0xff, 0x8c, 0xc8, 0x10,
- 0xc1, 0x64, 0xc8, 0x18,
- 0xf8, 0x64, 0xc8, 0x08,
- 0x01, 0x99, 0xda, 0x30,
-- 0x00, 0x66, 0x6e, 0x66,
-- 0xc0, 0x66, 0xaa, 0x76,
-+ 0x00, 0x66, 0x70, 0x66,
-+ 0xc0, 0x66, 0xac, 0x76,
- 0x60, 0x66, 0xc8, 0x18,
- 0x3d, 0x64, 0xc8, 0x28,
-- 0x00, 0x65, 0x5e, 0x46,
-+ 0x00, 0x65, 0x60, 0x46,
- 0xf7, 0x93, 0x26, 0x09,
-- 0x08, 0x93, 0x7c, 0x6e,
-+ 0x08, 0x93, 0x7e, 0x6e,
- 0x00, 0x62, 0xc4, 0x18,
-- 0x00, 0x65, 0xa8, 0x5e,
-- 0x00, 0x65, 0x88, 0x5e,
-- 0x00, 0x65, 0x88, 0x5e,
-- 0x00, 0x65, 0x88, 0x5e,
-+ 0x00, 0x65, 0xaa, 0x5e,
-+ 0x00, 0x65, 0x8a, 0x5e,
-+ 0x00, 0x65, 0x8a, 0x5e,
-+ 0x00, 0x65, 0x8a, 0x5e,
- 0x01, 0x99, 0xda, 0x30,
- 0x01, 0x99, 0xda, 0x30,
- 0x01, 0x99, 0xda, 0x30,
-@@ -858,11 +859,11 @@ static uint8_t seqprog[] = {
- 0x01, 0x6c, 0x32, 0x31,
- 0x01, 0x6c, 0x32, 0x31,
- 0x01, 0x6c, 0x32, 0x35,
-- 0x08, 0x94, 0xa8, 0x7e,
-+ 0x08, 0x94, 0xaa, 0x7e,
- 0xf7, 0x93, 0x26, 0x09,
-- 0x08, 0x93, 0xac, 0x6e,
-+ 0x08, 0x93, 0xae, 0x6e,
- 0xff, 0x6a, 0xd4, 0x0c,
-- 0x04, 0xb8, 0xd4, 0x6e,
-+ 0x04, 0xb8, 0xd6, 0x6e,
- 0x01, 0x42, 0x7e, 0x31,
- 0xff, 0x6a, 0x76, 0x01,
- 0x01, 0x90, 0x84, 0x34,
-@@ -870,14 +871,14 @@ static uint8_t seqprog[] = {
- 0x01, 0x85, 0x0a, 0x01,
- 0x7f, 0x65, 0x10, 0x09,
- 0xfe, 0x85, 0x0a, 0x0d,
-- 0xff, 0x42, 0xd0, 0x66,
-- 0xff, 0x41, 0xc8, 0x66,
-- 0xd1, 0x6a, 0xd8, 0x5e,
-+ 0xff, 0x42, 0xd2, 0x66,
-+ 0xff, 0x41, 0xca, 0x66,
-+ 0xd1, 0x6a, 0xda, 0x5e,
- 0xff, 0x6a, 0xca, 0x04,
- 0x01, 0x41, 0x20, 0x31,
- 0x01, 0xbf, 0x82, 0x30,
- 0x01, 0x6a, 0x76, 0x00,
-- 0x00, 0xbb, 0x12, 0x46,
-+ 0x00, 0xbb, 0x14, 0x46,
- 0x01, 0x42, 0x20, 0x31,
- 0x01, 0xbf, 0x84, 0x34,
- 0x01, 0x41, 0x7e, 0x31,
-@@ -941,7 +942,7 @@ static ahc_patch_func_t ahc_patch17_func
- static int
- ahc_patch17_func(struct ahc_softc *ahc)
- {
-- return ((ahc->flags & AHC_TMODE_WIDEODD_BUG) != 0);
-+ return ((ahc->bugs & AHC_TMODE_WIDEODD_BUG) != 0);
- }
-
- static ahc_patch_func_t ahc_patch16_func;
-@@ -1142,152 +1143,152 @@ static struct patch {
- { ahc_patch0_func, 196, 1, 1 },
- { ahc_patch9_func, 212, 6, 2 },
- { ahc_patch0_func, 218, 6, 1 },
-- { ahc_patch8_func, 226, 20, 2 },
-+ { ahc_patch8_func, 226, 21, 2 },
- { ahc_patch1_func, 241, 1, 1 },
-- { ahc_patch1_func, 248, 1, 2 },
-- { ahc_patch0_func, 249, 2, 2 },
-- { ahc_patch11_func, 250, 1, 1 },
-- { ahc_patch9_func, 258, 27, 3 },
-- { ahc_patch1_func, 274, 10, 2 },
-- { ahc_patch13_func, 277, 1, 1 },
-- { ahc_patch14_func, 285, 14, 1 },
-- { ahc_patch1_func, 301, 1, 2 },
-- { ahc_patch0_func, 302, 1, 1 },
-- { ahc_patch9_func, 305, 1, 1 },
-- { ahc_patch13_func, 310, 1, 1 },
-- { ahc_patch9_func, 311, 2, 2 },
-- { ahc_patch0_func, 313, 4, 1 },
-- { ahc_patch14_func, 317, 1, 1 },
-- { ahc_patch15_func, 319, 2, 3 },
-- { ahc_patch9_func, 319, 1, 2 },
-- { ahc_patch0_func, 320, 1, 1 },
-- { ahc_patch6_func, 325, 1, 2 },
-- { ahc_patch0_func, 326, 1, 1 },
-- { ahc_patch1_func, 330, 47, 11 },
-- { ahc_patch6_func, 337, 2, 4 },
-- { ahc_patch7_func, 337, 1, 1 },
-- { ahc_patch8_func, 338, 1, 1 },
-- { ahc_patch0_func, 339, 1, 1 },
-- { ahc_patch16_func, 340, 1, 1 },
-- { ahc_patch6_func, 356, 6, 3 },
-- { ahc_patch16_func, 356, 5, 1 },
-- { ahc_patch0_func, 362, 7, 1 },
-- { ahc_patch13_func, 372, 5, 1 },
-- { ahc_patch0_func, 377, 52, 17 },
-- { ahc_patch14_func, 377, 1, 1 },
-- { ahc_patch7_func, 379, 2, 2 },
-- { ahc_patch17_func, 380, 1, 1 },
-- { ahc_patch9_func, 383, 1, 1 },
-- { ahc_patch18_func, 390, 1, 1 },
-- { ahc_patch14_func, 395, 9, 3 },
-- { ahc_patch9_func, 396, 3, 2 },
-- { ahc_patch0_func, 399, 3, 1 },
-- { ahc_patch9_func, 407, 6, 2 },
-- { ahc_patch0_func, 413, 9, 2 },
-- { ahc_patch13_func, 413, 1, 1 },
-- { ahc_patch13_func, 422, 2, 1 },
-- { ahc_patch14_func, 424, 1, 1 },
-- { ahc_patch9_func, 426, 1, 2 },
-- { ahc_patch0_func, 427, 1, 1 },
-- { ahc_patch7_func, 428, 1, 1 },
-+ { ahc_patch1_func, 249, 1, 2 },
-+ { ahc_patch0_func, 250, 2, 2 },
-+ { ahc_patch11_func, 251, 1, 1 },
-+ { ahc_patch9_func, 259, 27, 3 },
-+ { ahc_patch1_func, 275, 10, 2 },
-+ { ahc_patch13_func, 278, 1, 1 },
-+ { ahc_patch14_func, 286, 14, 1 },
-+ { ahc_patch1_func, 302, 1, 2 },
-+ { ahc_patch0_func, 303, 1, 1 },
-+ { ahc_patch9_func, 306, 1, 1 },
-+ { ahc_patch13_func, 311, 1, 1 },
-+ { ahc_patch9_func, 312, 2, 2 },
-+ { ahc_patch0_func, 314, 4, 1 },
-+ { ahc_patch14_func, 318, 1, 1 },
-+ { ahc_patch15_func, 320, 2, 3 },
-+ { ahc_patch9_func, 320, 1, 2 },
-+ { ahc_patch0_func, 321, 1, 1 },
-+ { ahc_patch6_func, 326, 1, 2 },
-+ { ahc_patch0_func, 327, 1, 1 },
-+ { ahc_patch1_func, 331, 47, 11 },
-+ { ahc_patch6_func, 338, 2, 4 },
-+ { ahc_patch7_func, 338, 1, 1 },
-+ { ahc_patch8_func, 339, 1, 1 },
-+ { ahc_patch0_func, 340, 1, 1 },
-+ { ahc_patch16_func, 341, 1, 1 },
-+ { ahc_patch6_func, 357, 6, 3 },
-+ { ahc_patch16_func, 357, 5, 1 },
-+ { ahc_patch0_func, 363, 7, 1 },
-+ { ahc_patch13_func, 373, 5, 1 },
-+ { ahc_patch0_func, 378, 52, 17 },
-+ { ahc_patch14_func, 378, 1, 1 },
-+ { ahc_patch7_func, 380, 2, 2 },
-+ { ahc_patch17_func, 381, 1, 1 },
-+ { ahc_patch9_func, 384, 1, 1 },
-+ { ahc_patch18_func, 391, 1, 1 },
-+ { ahc_patch14_func, 396, 9, 3 },
-+ { ahc_patch9_func, 397, 3, 2 },
-+ { ahc_patch0_func, 400, 3, 1 },
-+ { ahc_patch9_func, 408, 6, 2 },
-+ { ahc_patch0_func, 414, 9, 2 },
-+ { ahc_patch13_func, 414, 1, 1 },
-+ { ahc_patch13_func, 423, 2, 1 },
-+ { ahc_patch14_func, 425, 1, 1 },
-+ { ahc_patch9_func, 427, 1, 2 },
-+ { ahc_patch0_func, 428, 1, 1 },
- { ahc_patch7_func, 429, 1, 1 },
-- { ahc_patch8_func, 430, 3, 3 },
-- { ahc_patch6_func, 431, 1, 2 },
-- { ahc_patch0_func, 432, 1, 1 },
-- { ahc_patch9_func, 433, 1, 1 },
-- { ahc_patch15_func, 434, 1, 2 },
-- { ahc_patch13_func, 434, 1, 1 },
-- { ahc_patch14_func, 436, 9, 4 },
-- { ahc_patch9_func, 436, 1, 1 },
-- { ahc_patch9_func, 443, 2, 1 },
-- { ahc_patch0_func, 445, 4, 3 },
-- { ahc_patch9_func, 445, 1, 2 },
-- { ahc_patch0_func, 446, 3, 1 },
-- { ahc_patch1_func, 450, 2, 1 },
-- { ahc_patch7_func, 452, 10, 2 },
-- { ahc_patch0_func, 462, 1, 1 },
-- { ahc_patch8_func, 463, 118, 22 },
-- { ahc_patch1_func, 465, 3, 2 },
-- { ahc_patch0_func, 468, 5, 3 },
-- { ahc_patch9_func, 468, 2, 2 },
-- { ahc_patch0_func, 470, 3, 1 },
-- { ahc_patch1_func, 475, 2, 2 },
-- { ahc_patch0_func, 477, 6, 3 },
-- { ahc_patch9_func, 477, 2, 2 },
-- { ahc_patch0_func, 479, 3, 1 },
-- { ahc_patch1_func, 485, 2, 2 },
-- { ahc_patch0_func, 487, 9, 7 },
-- { ahc_patch9_func, 487, 5, 6 },
-- { ahc_patch19_func, 487, 1, 2 },
-- { ahc_patch0_func, 488, 1, 1 },
-- { ahc_patch19_func, 490, 1, 2 },
-- { ahc_patch0_func, 491, 1, 1 },
-- { ahc_patch0_func, 492, 4, 1 },
-- { ahc_patch6_func, 497, 3, 2 },
-- { ahc_patch0_func, 500, 1, 1 },
-- { ahc_patch6_func, 510, 1, 2 },
-- { ahc_patch0_func, 511, 1, 1 },
-- { ahc_patch20_func, 548, 7, 1 },
-- { ahc_patch3_func, 583, 1, 2 },
-- { ahc_patch0_func, 584, 1, 1 },
-- { ahc_patch21_func, 587, 1, 1 },
-- { ahc_patch8_func, 589, 106, 33 },
-- { ahc_patch4_func, 591, 1, 1 },
-- { ahc_patch1_func, 597, 2, 2 },
-- { ahc_patch0_func, 599, 1, 1 },
-- { ahc_patch1_func, 602, 1, 2 },
-- { ahc_patch0_func, 603, 1, 1 },
-- { ahc_patch9_func, 604, 3, 3 },
-- { ahc_patch15_func, 605, 1, 1 },
-- { ahc_patch0_func, 607, 4, 1 },
-- { ahc_patch19_func, 616, 2, 2 },
-- { ahc_patch0_func, 618, 1, 1 },
-- { ahc_patch19_func, 622, 10, 3 },
-- { ahc_patch5_func, 624, 8, 1 },
-- { ahc_patch0_func, 632, 9, 2 },
-- { ahc_patch5_func, 633, 8, 1 },
-- { ahc_patch4_func, 643, 1, 2 },
-- { ahc_patch0_func, 644, 1, 1 },
-- { ahc_patch19_func, 645, 1, 2 },
-- { ahc_patch0_func, 646, 3, 2 },
-- { ahc_patch4_func, 648, 1, 1 },
-- { ahc_patch5_func, 649, 1, 1 },
-- { ahc_patch5_func, 652, 1, 1 },
-- { ahc_patch5_func, 654, 1, 1 },
-- { ahc_patch4_func, 656, 2, 2 },
-- { ahc_patch0_func, 658, 2, 1 },
-- { ahc_patch5_func, 660, 1, 1 },
-- { ahc_patch5_func, 663, 1, 1 },
-- { ahc_patch5_func, 666, 1, 1 },
-- { ahc_patch19_func, 670, 1, 1 },
-- { ahc_patch19_func, 673, 1, 1 },
-- { ahc_patch4_func, 679, 1, 1 },
-- { ahc_patch6_func, 682, 1, 2 },
-- { ahc_patch0_func, 683, 1, 1 },
-- { ahc_patch7_func, 695, 16, 1 },
-- { ahc_patch4_func, 711, 20, 1 },
-- { ahc_patch9_func, 732, 4, 2 },
-- { ahc_patch0_func, 736, 4, 1 },
-- { ahc_patch9_func, 740, 4, 2 },
-- { ahc_patch0_func, 744, 3, 1 },
-- { ahc_patch6_func, 750, 1, 1 },
-- { ahc_patch22_func, 752, 14, 1 },
-- { ahc_patch7_func, 766, 3, 1 },
-- { ahc_patch9_func, 778, 24, 8 },
-- { ahc_patch19_func, 782, 1, 2 },
-- { ahc_patch0_func, 783, 1, 1 },
-- { ahc_patch15_func, 788, 4, 2 },
-- { ahc_patch0_func, 792, 7, 3 },
-- { ahc_patch23_func, 792, 5, 2 },
-- { ahc_patch0_func, 797, 2, 1 },
-- { ahc_patch0_func, 802, 42, 3 },
-- { ahc_patch18_func, 814, 18, 2 },
-- { ahc_patch0_func, 832, 1, 1 },
-- { ahc_patch4_func, 856, 1, 1 },
-- { ahc_patch4_func, 857, 3, 2 },
-- { ahc_patch0_func, 860, 1, 1 },
-- { ahc_patch13_func, 861, 3, 1 },
-- { ahc_patch4_func, 864, 12, 1 }
-+ { ahc_patch7_func, 430, 1, 1 },
-+ { ahc_patch8_func, 431, 3, 3 },
-+ { ahc_patch6_func, 432, 1, 2 },
-+ { ahc_patch0_func, 433, 1, 1 },
-+ { ahc_patch9_func, 434, 1, 1 },
-+ { ahc_patch15_func, 435, 1, 2 },
-+ { ahc_patch13_func, 435, 1, 1 },
-+ { ahc_patch14_func, 437, 9, 4 },
-+ { ahc_patch9_func, 437, 1, 1 },
-+ { ahc_patch9_func, 444, 2, 1 },
-+ { ahc_patch0_func, 446, 4, 3 },
-+ { ahc_patch9_func, 446, 1, 2 },
-+ { ahc_patch0_func, 447, 3, 1 },
-+ { ahc_patch1_func, 451, 2, 1 },
-+ { ahc_patch7_func, 453, 10, 2 },
-+ { ahc_patch0_func, 463, 1, 1 },
-+ { ahc_patch8_func, 464, 118, 22 },
-+ { ahc_patch1_func, 466, 3, 2 },
-+ { ahc_patch0_func, 469, 5, 3 },
-+ { ahc_patch9_func, 469, 2, 2 },
-+ { ahc_patch0_func, 471, 3, 1 },
-+ { ahc_patch1_func, 476, 2, 2 },
-+ { ahc_patch0_func, 478, 6, 3 },
-+ { ahc_patch9_func, 478, 2, 2 },
-+ { ahc_patch0_func, 480, 3, 1 },
-+ { ahc_patch1_func, 486, 2, 2 },
-+ { ahc_patch0_func, 488, 9, 7 },
-+ { ahc_patch9_func, 488, 5, 6 },
-+ { ahc_patch19_func, 488, 1, 2 },
-+ { ahc_patch0_func, 489, 1, 1 },
-+ { ahc_patch19_func, 491, 1, 2 },
-+ { ahc_patch0_func, 492, 1, 1 },
-+ { ahc_patch0_func, 493, 4, 1 },
-+ { ahc_patch6_func, 498, 3, 2 },
-+ { ahc_patch0_func, 501, 1, 1 },
-+ { ahc_patch6_func, 511, 1, 2 },
-+ { ahc_patch0_func, 512, 1, 1 },
-+ { ahc_patch20_func, 549, 7, 1 },
-+ { ahc_patch3_func, 584, 1, 2 },
-+ { ahc_patch0_func, 585, 1, 1 },
-+ { ahc_patch21_func, 588, 1, 1 },
-+ { ahc_patch8_func, 590, 106, 33 },
-+ { ahc_patch4_func, 592, 1, 1 },
-+ { ahc_patch1_func, 598, 2, 2 },
-+ { ahc_patch0_func, 600, 1, 1 },
-+ { ahc_patch1_func, 603, 1, 2 },
-+ { ahc_patch0_func, 604, 1, 1 },
-+ { ahc_patch9_func, 605, 3, 3 },
-+ { ahc_patch15_func, 606, 1, 1 },
-+ { ahc_patch0_func, 608, 4, 1 },
-+ { ahc_patch19_func, 617, 2, 2 },
-+ { ahc_patch0_func, 619, 1, 1 },
-+ { ahc_patch19_func, 623, 10, 3 },
-+ { ahc_patch5_func, 625, 8, 1 },
-+ { ahc_patch0_func, 633, 9, 2 },
-+ { ahc_patch5_func, 634, 8, 1 },
-+ { ahc_patch4_func, 644, 1, 2 },
-+ { ahc_patch0_func, 645, 1, 1 },
-+ { ahc_patch19_func, 646, 1, 2 },
-+ { ahc_patch0_func, 647, 3, 2 },
-+ { ahc_patch4_func, 649, 1, 1 },
-+ { ahc_patch5_func, 650, 1, 1 },
-+ { ahc_patch5_func, 653, 1, 1 },
-+ { ahc_patch5_func, 655, 1, 1 },
-+ { ahc_patch4_func, 657, 2, 2 },
-+ { ahc_patch0_func, 659, 2, 1 },
-+ { ahc_patch5_func, 661, 1, 1 },
-+ { ahc_patch5_func, 664, 1, 1 },
-+ { ahc_patch5_func, 667, 1, 1 },
-+ { ahc_patch19_func, 671, 1, 1 },
-+ { ahc_patch19_func, 674, 1, 1 },
-+ { ahc_patch4_func, 680, 1, 1 },
-+ { ahc_patch6_func, 683, 1, 2 },
-+ { ahc_patch0_func, 684, 1, 1 },
-+ { ahc_patch7_func, 696, 16, 1 },
-+ { ahc_patch4_func, 712, 20, 1 },
-+ { ahc_patch9_func, 733, 4, 2 },
-+ { ahc_patch0_func, 737, 4, 1 },
-+ { ahc_patch9_func, 741, 4, 2 },
-+ { ahc_patch0_func, 745, 3, 1 },
-+ { ahc_patch6_func, 751, 1, 1 },
-+ { ahc_patch22_func, 753, 14, 1 },
-+ { ahc_patch7_func, 767, 3, 1 },
-+ { ahc_patch9_func, 779, 24, 8 },
-+ { ahc_patch19_func, 783, 1, 2 },
-+ { ahc_patch0_func, 784, 1, 1 },
-+ { ahc_patch15_func, 789, 4, 2 },
-+ { ahc_patch0_func, 793, 7, 3 },
-+ { ahc_patch23_func, 793, 5, 2 },
-+ { ahc_patch0_func, 798, 2, 1 },
-+ { ahc_patch0_func, 803, 42, 3 },
-+ { ahc_patch18_func, 815, 18, 2 },
-+ { ahc_patch0_func, 833, 1, 1 },
-+ { ahc_patch4_func, 857, 1, 1 },
-+ { ahc_patch4_func, 858, 3, 2 },
-+ { ahc_patch0_func, 861, 1, 1 },
-+ { ahc_patch13_func, 862, 3, 1 },
-+ { ahc_patch4_func, 865, 12, 1 }
- };
-
- static struct cs {
-@@ -1296,11 +1297,11 @@ static struct cs {
- } critical_sections[] = {
- { 11, 18 },
- { 21, 30 },
-- { 711, 727 },
-- { 857, 860 },
-- { 864, 870 },
-- { 872, 874 },
-- { 874, 876 }
-+ { 712, 728 },
-+ { 858, 861 },
-+ { 865, 871 },
-+ { 873, 875 },
-+ { 875, 877 }
- };
-
- static const int num_critical_sections = sizeof(critical_sections)
---- linux-2.6.0/drivers/scsi/aic7xxx/aicasm/aicasm.c 2003-06-14 12:18:06.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aicasm/aicasm.c 2003-12-28 23:21:40.000000000 -0800
-@@ -37,7 +37,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.c#22 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.c#23 $
- *
- * $FreeBSD$
- */
-@@ -609,10 +609,10 @@ output_listing(char *ifilename)
-
- while (line < cur_instr->srcline) {
- fgets(buf, sizeof(buf), ifile);
-- fprintf(listfile, "\t\t%s", buf);
-+ fprintf(listfile, " \t%s", buf);
- line++;
- }
-- fprintf(listfile, "%03x %02x%02x%02x%02x", instrptr,
-+ fprintf(listfile, "%04x %02x%02x%02x%02x", instrptr,
- #if BYTE_ORDER == LITTLE_ENDIAN
- cur_instr->format.bytes[0],
- cur_instr->format.bytes[1],
-@@ -624,14 +624,23 @@ output_listing(char *ifilename)
- cur_instr->format.bytes[1],
- cur_instr->format.bytes[0]);
- #endif
-- fgets(buf, sizeof(buf), ifile);
-- fprintf(listfile, "\t%s", buf);
-- line++;
-+ /*
-+ * Macro expansions can cause several instructions
-+ * to be output for a single source line. Only
-+ * advance the line once in these cases.
-+ */
-+ if (line == cur_instr->srcline) {
-+ fgets(buf, sizeof(buf), ifile);
-+ fprintf(listfile, "\t%s", buf);
-+ line++;
-+ } else {
-+ fprintf(listfile, "\n");
-+ }
- instrptr++;
- }
- /* Dump the remainder of the file */
- while(fgets(buf, sizeof(buf), ifile) != NULL)
-- fprintf(listfile, "\t\t%s", buf);
-+ fprintf(listfile, " %s", buf);
-
- fclose(ifile);
- }
---- linux-2.6.0/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l 2003-06-14 12:18:09.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l 2003-12-28 23:21:40.000000000 -0800
-@@ -38,7 +38,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_scan.l#7 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_scan.l#8 $
- *
- * $FreeBSD$
- */
-@@ -78,6 +78,7 @@ MCARG [^(), \t]+
- \n {
- ++yylineno;
- }
-+\r ;
- <ARGLIST>{SPACE} ;
- <ARGLIST>\( {
- parren_count++;
---- linux-2.6.0/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l 2003-06-14 12:18:29.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l 2003-12-28 23:21:40.000000000 -0800
-@@ -38,7 +38,7 @@
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- *
-- * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#18 $
-+ * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#19 $
- *
- * $FreeBSD$
- */
-@@ -87,6 +87,7 @@ MBODY ((\\[^\n])*[^\n\\]*)+
-
- %%
- \n { ++yylineno; }
-+\r ;
- "/*" { BEGIN COMMENT; /* Enter comment eating state */ }
- <COMMENT>"/*" { fprintf(stderr, "Warning! Comment within comment."); }
- <COMMENT>\n { ++yylineno; }
-@@ -114,6 +115,7 @@ if[ \t]*\( {
- }
- }
- <CEXPR>\n { ++yylineno; }
-+<CEXPR>\r ;
- <CEXPR>[^()\n]+ {
- char *yptr;
-
-@@ -359,6 +361,7 @@ else { return T_ELSE; }
- /* Eat escaped newlines. */
- ++yylineno;
- }
-+<MACROBODY>\r ;
- <MACROBODY>\n {
- /* Macros end on the first unescaped newline. */
- BEGIN INITIAL;
-@@ -369,10 +372,17 @@ else { return T_ELSE; }
- }
- <MACROBODY>{MBODY} {
- char *yptr;
-+ char c;
-
- yptr = yytext;
-- while (*yptr)
-- *string_buf_ptr++ = *yptr++;
-+ while (c = *yptr++) {
-+ /*
-+ * Strip carriage returns.
-+ */
-+ if (c == '\r')
-+ continue;
-+ *string_buf_ptr++ = c;
-+ }
- }
- {WORD}\( {
- char *yptr;
---- linux-2.6.0/drivers/scsi/aic7xxx/aicasm/Makefile 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/aic7xxx/aicasm/Makefile 2003-12-28 23:21:40.000000000 -0800
-@@ -49,11 +49,19 @@ aicdb.h:
- clean:
- rm -f $(clean-files)
-
-+# Create a dependency chain in generated files
-+# to avoid concurrent invocations of the single
-+# rule that builds them all.
-+aicasm_gram.c: aicasm_gram.h
- aicasm_gram.c aicasm_gram.h: aicasm_gram.y
- $(YACC) $(YFLAGS) -b $(<:.y=) $<
- mv $(<:.y=).tab.c $(<:.y=.c)
- mv $(<:.y=).tab.h $(<:.y=.h)
-
-+# Create a dependency chain in generated files
-+# to avoid concurrent invocations of the single
-+# rule that builds them all.
-+aicasm_macro_gram.c: aicasm_macro_gram.h
- aicasm_macro_gram.c aicasm_macro_gram.h: aicasm_macro_gram.y
- $(YACC) $(YFLAGS) -b $(<:.y=) -p mm $<
- mv $(<:.y=).tab.c $(<:.y=.c)
---- linux-2.6.0/drivers/scsi/aic7xxx/aiclib.c 2003-07-27 12:14:39.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aiclib.c 2003-12-28 23:21:40.000000000 -0800
-@@ -30,16 +30,6 @@
- * $Id$
- */
-
--#include <linux/blkdev.h>
--#include <linux/delay.h>
--#include <linux/version.h>
--
--/* Core SCSI definitions */
--#include "scsi.h"
--#include "hosts.h"
--#include "aiclib.h"
--#include "cam.h"
--
- #ifndef FALSE
- #define FALSE 0
- #endif /* FALSE */
-@@ -1410,3 +1400,336 @@ aic_parse_brace_option(char *opt_name, c
- }
- return (opt_arg);
- }
-+
-+/************************* Magic SysReq Support *******************************/
-+void
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+aic_sysrq_handler(int key, struct pt_regs *unused, struct kbd_struct *unused1,
-+ struct tty_struct *unused2)
-+#else
-+aic_sysrq_handler(int key, struct pt_regs *unused, struct tty_struct *unused2)
-+#endif
-+{
-+#ifdef CONFIG_MAGIC_SYSRQ
-+ struct aic_softc *aic;
-+ u_long l;
-+
-+ aic_list_lock(&l);
-+
-+ TAILQ_FOREACH(aic, &aic_tailq, links) {
-+ u_long s;
-+
-+ aic_lock(aic, &s);
-+ aic_dump_card_state(aic);
-+ aic_unlock(aic, &s);
-+ }
-+ aic_list_unlock(&l);
-+#endif
-+}
-+
-+int
-+aic_install_sysrq(struct aic_sysrq_key_op *key_op)
-+{
-+#ifdef CONFIG_MAGIC_SYSRQ
-+ char *str;
-+ int len;
-+ int i;
-+
-+ str = key_op->help_msg;
-+ len = strlen(str);
-+ for (i = 0; i < len; i++) {
-+ int key;
-+
-+ key = str[i];
-+ if (register_sysrq_key(key, key_op) == 0) {
-+
-+ if (key >= 'a' && key <= 'z')
-+ str[i] = key + ('A' - 'a');
-+ return (key);
-+ }
-+ }
-+#endif
-+ return (0);
-+}
-+
-+void
-+aic_remove_sysrq(int key, struct aic_sysrq_key_op *key_op)
-+{
-+#ifdef CONFIG_MAGIC_SYSRQ
-+ unregister_sysrq_key(key, key_op);
-+#endif
-+}
-+
-+/******************************** Bus DMA *************************************/
-+int
-+aic_dma_tag_create(struct aic_softc *aic, bus_dma_tag_t parent,
-+ bus_size_t alignment, bus_size_t boundary,
-+ bus_addr_t lowaddr, bus_addr_t highaddr,
-+ bus_dma_filter_t *filter, void *filterarg,
-+ bus_size_t maxsize, int nsegments,
-+ bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
-+{
-+ bus_dma_tag_t dmat;
-+
-+ dmat = malloc(sizeof(*dmat), M_DEVBUF, M_NOWAIT);
-+ if (dmat == NULL)
-+ return (ENOMEM);
-+
-+ /*
-+ * Linux is very simplistic about DMA memory. For now don't
-+ * maintain all specification information. Once Linux supplies
-+ * better facilities for doing these operations, or the
-+ * needs of this particular driver change, we might need to do
-+ * more here.
-+ */
-+ dmat->alignment = alignment;
-+ dmat->boundary = boundary;
-+ dmat->maxsize = maxsize;
-+ *ret_tag = dmat;
-+ return (0);
-+}
-+
-+void
-+aic_dma_tag_destroy(struct aic_softc *aic, bus_dma_tag_t dmat)
-+{
-+ free(dmat, M_DEVBUF);
-+}
-+
-+int
-+aic_dmamem_alloc(struct aic_softc *aic, bus_dma_tag_t dmat, void** vaddr,
-+ int flags, bus_dmamap_t *mapp)
-+{
-+ bus_dmamap_t map;
-+
-+ map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
-+ if (map == NULL)
-+ return (ENOMEM);
-+ /*
-+ * Although we can dma data above 4GB, our
-+ * coherent memory is below 4GB for
-+ * space efficiency reasons (only need a 4byte
-+ * address). For this reason, we have to reset
-+ * our dma mask when doing allocations.
-+ */
-+ aic_set_dma_mask(aic, 0xFFFFFFFF);
-+ *vaddr = aic_alloc_coherent(aic, dmat->maxsize, &map->bus_addr);
-+ aic_set_dma_mask(aic, aic->platform_data->hw_dma_mask);
-+ if (*vaddr == NULL)
-+ return (ENOMEM);
-+ *mapp = map;
-+ return(0);
-+}
-+
-+void
-+aic_dmamem_free(struct aic_softc *aic, bus_dma_tag_t dmat,
-+ void* vaddr, bus_dmamap_t map)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-+ aic_free_coherent(aic, dmat->maxsize, vaddr, map->bus_addr);
-+#else
-+ free(vaddr, M_DEVBUF);
-+#endif
-+}
-+
-+int
-+aic_dmamap_load(struct aic_softc *aic, bus_dma_tag_t dmat, bus_dmamap_t map,
-+ void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
-+ void *cb_arg, int flags)
-+{
-+ /*
-+ * Assume for now that this will only be used during
-+ * initialization and not for per-transaction buffer mapping.
-+ */
-+ bus_dma_segment_t stack_sg;
-+
-+ stack_sg.ds_addr = map->bus_addr;
-+ stack_sg.ds_len = dmat->maxsize;
-+ cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
-+ return (0);
-+}
-+
-+void
-+aic_dmamap_destroy(struct aic_softc *aic, bus_dma_tag_t dmat, bus_dmamap_t map)
-+{
-+ free(map, M_DEVBUF);
-+}
-+
-+int
-+aic_dmamap_unload(struct aic_softc *aic, bus_dma_tag_t dmat, bus_dmamap_t map)
-+{
-+ /* Nothing to do */
-+ return (0);
-+}
-+
-+/***************************** Queue Handling ********************************/
-+/*
-+ * In 2.4.X and above, this routine is called from a tasklet,
-+ * so we must re-acquire our lock prior to executing this code.
-+ * In all prior kernels, aic_schedule_runq() calls this routine
-+ * directly and aic_schedule_runq() is called with our lock held.
-+ */
-+void
-+aic_runq_tasklet(unsigned long data)
-+{
-+ struct aic_softc* aic;
-+ struct aic_linux_device *dev;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ u_long flags;
-+#endif
-+
-+ aic = (struct aic_softc *)data;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ aic_lock(aic, &flags);
-+#endif
-+ while ((dev = aic_linux_next_device_to_run(aic)) != NULL) {
-+
-+ TAILQ_REMOVE(&aic->platform_data->device_runq, dev, links);
-+ dev->flags &= ~AIC_DEV_ON_RUN_LIST;
-+ aic_linux_check_device_queue(aic, dev);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ /* Yeild to our interrupt handler */
-+ aic_unlock(aic, &flags);
-+ aic_lock(aic, &flags);
-+#endif
-+ }
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ aic_unlock(aic, &flags);
-+#endif
-+}
-+
-+void
-+aic_unblock_tasklet(unsigned long data)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ struct aic_softc* aic;
-+
-+ aic = (struct aic_softc *)data;
-+ scsi_unblock_requests(aic->platform_data->host);
-+#else
-+#error "Fix 2.2.X Kernel Support"
-+#endif
-+}
-+
-+void
-+aic_bus_settle_complete(u_long data)
-+{
-+ struct aic_softc *aic;
-+ u_long s;
-+
-+ aic = (struct aic_softc *)data;
-+ /*
-+ * Guard against our bottom half scheduling another
-+ * bus settle delay just as our timer runs. If this
-+ * occurs, do nothing. The newly scheduled timer will
-+ * take care of things.
-+ */
-+ aic_lock(aic, &s);
-+ if (timer_pending(&aic->platform_data->bus_settle_timer) == 0) {
-+ aic->platform_data->flags &= ~AIC_BUS_SETTLE_TIMER;
-+ aic_release_simq_locked(aic);
-+ }
-+ aic_unlock(aic, &s);
-+}
-+
-+void
-+aic_freeze_simq(struct aic_softc *aic)
-+{
-+ aic->platform_data->qfrozen++;
-+ if (aic->platform_data->qfrozen == 1)
-+ scsi_block_requests(aic->platform_data->host);
-+}
-+
-+void
-+aic_release_simq(struct aic_softc *aic)
-+{
-+ u_long s;
-+
-+ aic_lock(aic, &s);
-+ aic_release_simq_locked(aic);
-+ aic_unlock(aic, &s);
-+}
-+
-+void
-+aic_release_simq_locked(struct aic_softc *aic)
-+{
-+
-+ if (aic->platform_data->qfrozen > 0)
-+ aic->platform_data->qfrozen--;
-+ if (AIC_DV_SIMQ_FROZEN(aic)
-+ && ((aic->platform_data->flags & AIC_DV_WAIT_SIMQ_RELEASE) != 0)) {
-+ aic->platform_data->flags &= ~AIC_DV_WAIT_SIMQ_RELEASE;
-+ up(&aic->platform_data->dv_sem);
-+ }
-+ if (aic->platform_data->qfrozen == 0) {
-+ aic_schedule_unblock(aic);
-+ aic_schedule_runq(aic);
-+ }
-+}
-+
-+/***************************** Timer Facilities *******************************/
-+void
-+aic_platform_timeout(struct scsi_cmnd *cmd)
-+{
-+
-+ if (AIC_DV_CMD(cmd) != 0) {
-+
-+ aic_linux_dv_timeout(cmd);
-+ } else {
-+ struct scb *scb;
-+ struct aic_softc *aic;
-+ u_long s;
-+
-+ scb = (struct scb *)cmd->host_scribble;
-+ aic = scb->aic_softc;
-+ aic_lock(aic, &s);
-+
-+ if (scb == NULL
-+ || scb->flags == SCB_FLAG_NONE) {
-+ int done_late;
-+
-+ /*
-+ * Handle timeout/completion races.
-+ * If the command is still sitting on
-+ * our completion queue, just re-instate
-+ * the timeout. If we've already completed
-+ * the command, the function pointer in our
-+ * timer will be cleared and we will need to
-+ * additionally complete it again to the mid-layer.
-+ *
-+ * Since done_late is cleared by adding a
-+ * timer, we must save off its value first.
-+ */
-+ done_late = cmd->eh_timeout.function == NULL;
-+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
-+ if (done_late)
-+ cmd->scsi_done(cmd);
-+ } else if ((scb->platform_data->flags & AIC_TIMEOUT_ACTIVE)) {
-+
-+ /*
-+ * Handle the case of timeouts that expire just
-+ * as we delete timers during recovery by skipping
-+ * SCBs that don't have timers active.
-+ */
-+ scb->platform_data->flags &= ~AIC_TIMEOUT_ACTIVE;
-+
-+ /*
-+ * We must clear out the function pointer so that
-+ * scsi_add_timer does not believe that a del_timer
-+ * is required before setting up a new timer for
-+ * this command.
-+ */
-+ scb->io_ctx->eh_timeout.function = NULL;
-+ aic_timeout(scb);
-+ }
-+ aic_unlock(aic, &s);
-+ }
-+}
-+
-+void
-+aic_linux_midlayer_timeout(struct scsi_cmnd *cmd)
-+{
-+ struct aic_softc *aic;
-+
-+ aic = *(struct aic_softc **)cmd->device->host->hostdata;
-+ printf("%s: midlayer_timeout\n", aic_name(aic));
-+}
---- linux-2.6.0/drivers/scsi/aic7xxx/aiclib.h 2003-06-14 12:17:57.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aiclib.h 2003-12-28 23:21:40.000000000 -0800
-@@ -1,4 +1,5 @@
- /*
-+ * SCSI definitions...
- * Largely written by Julian Elischer (julian@tfs.com)
- * for TRW Financial Systems.
- *
-@@ -57,6 +58,42 @@
- #ifndef _AICLIB_H
- #define _AICLIB_H
-
-+#include <linux/types.h>
-+#include <linux/delay.h>
-+#include <linux/ioport.h>
-+#include <linux/pci.h>
-+#include <linux/smp_lock.h>
-+#include <linux/module.h>
-+#include <asm/byteorder.h>
-+#include <asm/io.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+#include <linux/slab.h>
-+#else
-+#include <linux/malloc.h>
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+#include <linux/interrupt.h> /* For tasklet support. */
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+#include <linux/blk.h>
-+#endif
-+#include <linux/blkdev.h>
-+
-+#include "scsi.h"
-+#include "hosts.h"
-+
-+/* Name space conflict with BSD queue macros */
-+#ifdef LIST_HEAD
-+#undef LIST_HEAD
-+#endif
-+#include "cam.h"
-+#include "queue.h"
-+#include "scsi_message.h"
-+#include "scsi_iu.h"
-+
- /*
- * Linux Interrupt Support.
- */
-@@ -66,9 +103,731 @@ typedef void irqreturn_t;
- #endif
-
- /*
-- * SCSI command format
-+ * Linux Timer Support.
-+ */
-+#define AIC_USECS_PER_JIFFY (1000000/HZ)
-+
-+/**************************** Module Library Hack *****************************/
-+/*
-+ * What we'd like to do is have a single "scsi library" module that both the
-+ * aic7xxx and aic79xx drivers could load and depend on. A cursory examination
-+ * of implementing module dependencies in Linux (handling the install and
-+ * initrd cases) does not look promissing. For now, we just duplicate this
-+ * code in both drivers using a simple symbol renaming scheme that hides this
-+ * hack from the drivers.
-+ */
-+#define AIC_LIB_ENTRY_CONCAT(x, prefix) prefix ## x
-+#define AIC_LIB_ENTRY_EXPAND(x, prefix) AIC_LIB_ENTRY_CONCAT(x, prefix)
-+#define AIC_LIB_ENTRY(x) AIC_LIB_ENTRY_EXPAND(x, AIC_LIB_PREFIX)
-+
-+#define AIC_CONST_ENTRY(x) AIC_LIB_ENTRY_EXPAND(x,AIC_CONST_PREFIX)
-+
-+#define aic_sense_desc AIC_LIB_ENTRY(_sense_desc)
-+#define aic_sense_error_action AIC_LIB_ENTRY(_sense_error_action)
-+#define aic_error_action AIC_LIB_ENTRY(_error_action)
-+#define aic_op_desc AIC_LIB_ENTRY(_op_desc)
-+#define aic_cdb_string AIC_LIB_ENTRY(_cdb_string)
-+#define aic_print_inquiry AIC_LIB_ENTRY(_print_inquiry)
-+#define aic_calc_syncsrate AIC_LIB_ENTRY(_calc_syncrate)
-+#define aic_calc_syncparam AIC_LIB_ENTRY(_calc_syncparam)
-+#define aic_calc_speed AIC_LIB_ENTRY(_calc_speed)
-+#define aic_inquiry_match AIC_LIB_ENTRY(_inquiry_match)
-+#define aic_static_inquiry_match AIC_LIB_ENTRY(_static_inquiry_match)
-+#define aic_parse_brace_option AIC_LIB_ENTRY(_parse_brace_option)
-+#define aic_power_state_change AIC_LIB_ENTRY(_power_state_change)
-+#define aic_sysrq_handler AIC_LIB_ENTRY(_sysrq_handler)
-+#define aic_install_sysrq AIC_LIB_ENTRY(_install_sysrq)
-+#define aic_remove_sysrq AIC_LIB_ENTRY(_remove_sysrq)
-+#define aic_list_lock AIC_LIB_ENTRY(_list_lock)
-+#define aic_list_unlock AIC_LIB_ENTRY(_list_unlock)
-+#define aic_lock AIC_LIB_ENTRY(_lock)
-+#define aic_unlock AIC_LIB_ENTRY(_unlock)
-+#define aic_dump_card_state AIC_LIB_ENTRY(_dump_card_state)
-+#define aic_linux_dv_complete AIC_LIB_ENTRY(_linux_dv_complete)
-+#define aic_linux_run_device_queue AIC_LIB_ENTRY(_linux_run_device_queue)
-+#define aic_linux_dv_timeout AIC_LIB_ENTRY(_linux_dv_timeout)
-+#define aic_linux_midlayer_timeout AIC_LIB_ENTRY(_linux_midlayer_timeout)
-+#define aic_freeze_simq AIC_LIB_ENTRY(_freeze_simq)
-+#define aic_bus_settle_complete AIC_LIB_ENTRY(_bus_settle_complete)
-+#define aic_release_simq AIC_LIB_ENTRY(_release_simq)
-+#define aic_release_simq AIC_LIB_ENTRY(_release_simq)
-+#define aic_release_simq_locked AIC_LIB_ENTRY(_release_simq_locked)
-+#define aic_dma_tag_create AIC_LIB_ENTRY(_dma_tag_create)
-+#define aic_dma_tag_destroy AIC_LIB_ENTRY(_dma_tag_destroy)
-+#define aic_dmamem_alloc AIC_LIB_ENTRY(_dmamem_alloc)
-+#define aic_dmamem_free AIC_LIB_ENTRY(_dmamem_free)
-+#define aic_dmamap_create AIC_LIB_ENTRY(_dmamap_create)
-+#define aic_dmamap_destroy AIC_LIB_ENTRY(_dmamap_destroy)
-+#define aic_dmamap_load AIC_LIB_ENTRY(_dmamap_load)
-+#define aic_dmamap_unload AIC_LIB_ENTRY(_dmamap_unload)
-+#define aic_dmamap_destroy AIC_LIB_ENTRY(_dmamap_destroy)
-+#define aic_timeout AIC_LIB_ENTRY(_timeout)
-+#define aic_runq_tasklet AIC_LIB_ENTRY(_runq_tasklet)
-+#define aic_unblock_tasklet AIC_LIB_ENTRY(_unblock_tasklet)
-+#define aic_platform_timeout AIC_LIB_ENTRY(_platform_timeout)
-+#define aic_name AIC_LIB_ENTRY(_name)
-+
-+#define aic_tailq AIC_LIB_ENTRY(_tailq)
-+#define aic_softc AIC_LIB_ENTRY(_softc)
-+#define aic_transinfo AIC_LIB_ENTRY(_transinfo)
-+#define aic_platform_data AIC_LIB_ENTRY(_platform_data)
-+#define aic_devinfo AIC_LIB_ENTRY(_devinfo)
-+#define aic_callback_t AIC_LIB_ENTRY(_callback_t)
-+
-+#define AIC_NUM_LUNS AIC_CONST_ENTRY(_NUM_LUNS)
-+#define AIC_NUM_TARGETS AIC_CONST_ENTRY(_NUM_TARGETS)
-+#define AIC_RESOURCE_SHORTAGE AIC_CONST_ENTRY(_RESOURCE_SHORTAGE)
-+
-+/*************************** Forward Declarations *****************************/
-+struct aic_softc;
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+typedef struct device *aic_dev_softc_t;
-+#else
-+typedef struct pci_dev *aic_dev_softc_t;
-+#endif
-+typedef Scsi_Cmnd *aic_io_ctx_t;
-+
-+/*************************** Timer DataStructures *****************************/
-+typedef struct timer_list aic_timer_t;
-+
-+/***************************** Bus Space/DMA **********************************/
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,17)
-+typedef dma_addr_t bus_addr_t;
-+#else
-+typedef uint32_t bus_addr_t;
-+#endif
-+typedef uint32_t bus_size_t;
-+
-+typedef enum {
-+ BUS_SPACE_MEMIO,
-+ BUS_SPACE_PIO
-+} bus_space_tag_t;
-+
-+typedef union {
-+ u_long ioport;
-+ volatile uint8_t *maddr;
-+} bus_space_handle_t;
-+
-+typedef struct bus_dma_segment
-+{
-+ bus_addr_t ds_addr;
-+ bus_size_t ds_len;
-+} bus_dma_segment_t;
-+
-+struct aic_linux_dma_tag
-+{
-+ bus_size_t alignment;
-+ bus_size_t boundary;
-+ bus_size_t maxsize;
-+};
-+typedef struct aic_linux_dma_tag* bus_dma_tag_t;
-+
-+struct aic_linux_dmamap
-+{
-+ bus_addr_t bus_addr;
-+};
-+typedef struct aic_linux_dmamap* bus_dmamap_t;
-+
-+typedef int bus_dma_filter_t(void*, bus_addr_t);
-+typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
-+
-+#define BUS_DMA_WAITOK 0x0
-+#define BUS_DMA_NOWAIT 0x1
-+#define BUS_DMA_ALLOCNOW 0x2
-+#define BUS_DMA_LOAD_SEGS 0x4 /*
-+ * Argument is an S/G list not
-+ * a single buffer.
-+ */
-+
-+#define BUS_SPACE_MAXADDR 0xFFFFFFFF
-+#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
-+#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
-+
-+int aic_dma_tag_create(struct aic_softc *, bus_dma_tag_t /*parent*/,
-+ bus_size_t /*alignment*/, bus_size_t /*boundary*/,
-+ bus_addr_t /*lowaddr*/, bus_addr_t /*highaddr*/,
-+ bus_dma_filter_t*/*filter*/, void */*filterarg*/,
-+ bus_size_t /*maxsize*/, int /*nsegments*/,
-+ bus_size_t /*maxsegsz*/, int /*flags*/,
-+ bus_dma_tag_t */*dma_tagp*/);
-+
-+void aic_dma_tag_destroy(struct aic_softc *, bus_dma_tag_t /*tag*/);
-+
-+int aic_dmamem_alloc(struct aic_softc *, bus_dma_tag_t /*dmat*/,
-+ void** /*vaddr*/, int /*flags*/,
-+ bus_dmamap_t* /*mapp*/);
-+
-+void aic_dmamem_free(struct aic_softc *, bus_dma_tag_t /*dmat*/,
-+ void* /*vaddr*/, bus_dmamap_t /*map*/);
-+
-+void aic_dmamap_destroy(struct aic_softc *, bus_dma_tag_t /*tag*/,
-+ bus_dmamap_t /*map*/);
-+
-+int aic_dmamap_load(struct aic_softc *aic, bus_dma_tag_t /*dmat*/,
-+ bus_dmamap_t /*map*/, void * /*buf*/,
-+ bus_size_t /*buflen*/, bus_dmamap_callback_t *,
-+ void */*callback_arg*/, int /*flags*/);
-+
-+int aic_dmamap_unload(struct aic_softc *, bus_dma_tag_t, bus_dmamap_t);
-+
-+/*
-+ * Operations performed by aic_dmamap_sync().
- */
-+#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
-+#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
-+#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
-+#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
-+
-+/*
-+ * XXX
-+ * aic_dmamap_sync is only used on buffers allocated with
-+ * the pci_alloc_consistent() API. Although I'm not sure how
-+ * this works on architectures with a write buffer, Linux does
-+ * not have an API to sync "coherent" memory. Perhaps we need
-+ * to do an mb()?
-+ */
-+#define aic_dmamap_sync(aic, dma_tag, dmamap, offset, len, op)
-+
-+/*************************** Linux DMA Wrappers *******************************/
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+#define aic_alloc_coherent(aic, size, bus_addr_ptr) \
-+ dma_alloc_coherent(aic->dev_softc, size, bus_addr_ptr, /*flag*/0)
-+
-+#define aic_free_coherent(aic, size, vaddr, bus_addr) \
-+ dma_free_coherent(aic->dev_softc, size, vaddr, bus_addr)
-+
-+#define aic_map_single(aic, buf, size, direction) \
-+ dma_map_single(aic->dev_softc, buf, size, direction)
-+
-+#define aic_unmap_single(aic, busaddr, size, direction) \
-+ dma_unmap_single(aic->dev_softc, busaddr, size, direction)
-+
-+#define aic_map_sg(aic, sg_list, num_sg, direction) \
-+ dma_map_sg(aic->dev_softc, sg_list, num_sg, direction)
-+
-+#define aic_unmap_sg(aic, sg_list, num_sg, direction) \
-+ dma_unmap_sg(aic->dev_softc, sg_list, num_sg, direction)
-+
-+#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
-+
-+#define aic_alloc_coherent(aic, size, bus_addr_ptr) \
-+ pci_alloc_consistent(aic->dev_softc, size, bus_addr_ptr)
-+
-+#define aic_free_coherent(aic, size, vaddr, bus_addr) \
-+ pci_free_consistent(aic->dev_softc, size, vaddr, bus_addr)
-+
-+#define aic_map_single(aic, buf, size, direction) \
-+ pci_map_single(aic->dev_softc, buf, size, direction)
-+
-+#define aic_unmap_single(aic, busaddr, size, direction) \
-+ pci_unmap_single(aic->dev_softc, busaddr, size, direction)
-+
-+#define aic_map_sg(aic, sg_list, num_sg, direction) \
-+ pci_map_sg(aic->dev_softc, sg_list, num_sg, direction)
-+
-+#define aic_unmap_sg(aic, sg_list, num_sg, direction) \
-+ pci_unmap_sg(aic->dev_softc, sg_list, num_sg, direction)
-+
-+#else
-+
-+static __inline void *aic_alloc_coherent(struct aic_softc *aic,
-+ bus_size_t size, bus_addr_t *baddrp);
-+
-+/*
-+ * At least in 2.2.14, malloc is a slab allocator so all
-+ * allocations are aligned. We assume for these kernel versions
-+ * that all allocations will be bellow 4Gig, physically contiguous,
-+ * and accessible via DMA by the controller.
-+ */
-+static __inline void *
-+aic_alloc_coherent(struct aic_softc *aic, bus_size_t size, bus_addr_t *baddrp)
-+{
-+ void *vaddr;
-+
-+ vaddr_ = malloc(size, M_DEVBUF, M_NOWAIT);
-+ if (vaddr != NULL)
-+ *baddrp = virt_to_bus(vaddr);
-+ return (vaddr);
-+}
-+
-+#define aic_free_coherent(aic, size, vaddr, bus_addr) \
-+ free(vaddr, M_DEVBUF)
-+
-+#define aic_map_sg(pdev, sg_list, nseg, direction) (nseg)
-+#define aic_unmap_sg(pdev, sg_list, nseg, direction)
-+#define aic_map_single(pdev, buffer, bufflen, direction) \
-+ (VIRT_TO_BUS(buffer))
-+#define aic_unmap_single(pdev, buffer, buflen, direction)
-+#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
-+#define sg_dma_len(sg) ((sg)->length)
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+
-+#define aic_set_dma_mask(aic, mask) dma_set_mask(aic->dev_softc, mask)
-+
-+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
-+
-+/*
-+ * Device softc is NULL for EISA devices.
-+ */
-+#define aic_set_dma_mask(aic, mask) \
-+ ((aic)->dev_softc == NULL ? 0 : pci_set_dma_mask(aic->dev_softc, mask))
-+
-+#else
-+/*
-+ * Device softc is NULL for EISA devices.
-+ * Always "return" 0 for success.
-+ */
-+#define aic_set_dma_mask(aic, mask) \
-+ (((aic)->dev_softc == NULL) \
-+ ? 0 \
-+ : (((aic)->dev_softc->dma_mask = mask) && 0))
-+#endif
-+
-+/************************* Host Template Macros *******************************/
-+#if defined CONFIG_HIGHIO
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
-+/* Assume RedHat Distribution with its different HIGHIO conventions. */
-+#define AIC_TEMPLATE_DMA_SETTINGS() \
-+ .can_dma_32 = 1, \
-+ .single_sg_okay = 1,
-+#else
-+#define AIC_TEMPLATE_DMA_SETTINGS() \
-+ .highmem_io = 1,
-+#endif
-+#else
-+#define AIC_TEMPLATE_DMA_SETTINGS()
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
-+#define AIC_TEMPLATE_MAX_SECTORS(sectors) \
-+ .max_sectors = (sectors),
-+#else
-+#define AIC_TEMPLATE_MAX_SECTORS(sectors)
-+#endif
-+
-+#if defined(__i386__)
-+#define AIC_TEMPLATE_BIOSPARAM() \
-+ .bios_param = AIC_LIB_ENTRY(_linux_biosparam),
-+#else
-+#define AIC_TEMPLATE_BIOSPARAM()
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+#define AIC_TEMPLATE_VERSIONED_ENTRIES() \
-+ .slave_alloc = AIC_LIB_ENTRY(_linux_slave_alloc), \
-+ .slave_configure = AIC_LIB_ENTRY(_linux_slave_configure), \
-+ .slave_destroy = AIC_LIB_ENTRY(_linux_slave_destroy)
-+#else
-+#define AIC_TEMPLATE_VERSIONED_ENTRIES() \
-+ .detect = AIC_LIB_ENTRY(_linux_detect), \
-+ .release = AIC_LIB_ENTRY(_linux_release), \
-+ .select_queue_depths = AIC_LIB_ENTRY(_linux_select_queue_depth), \
-+ .use_new_eh_code = 1
-+#endif
-+
-+#define AIC_TEMPLATE_INITIALIZER(NAME, MAX_SECTORS) \
-+{ \
-+ .module = THIS_MODULE, \
-+ .name = NAME, \
-+ .proc_info = AIC_LIB_ENTRY(_linux_proc_info), \
-+ .info = AIC_LIB_ENTRY(_linux_info), \
-+ .queuecommand = AIC_LIB_ENTRY(_linux_queue), \
-+ .eh_abort_handler = AIC_LIB_ENTRY(_linux_abort), \
-+ .eh_device_reset_handler = AIC_LIB_ENTRY(_linux_dev_reset), \
-+ .eh_bus_reset_handler = AIC_LIB_ENTRY(_linux_bus_reset), \
-+ .can_queue = AIC_CONST_ENTRY(_MAX_QUEUE), \
-+ .this_id = -1, \
-+ .cmd_per_lun = 2, \
-+ .use_clustering = ENABLE_CLUSTERING, \
-+ AIC_TEMPLATE_MAX_SECTORS(MAX_SECTORS) \
-+ AIC_TEMPLATE_DMA_SETTINGS() \
-+ AIC_TEMPLATE_BIOSPARAM() \
-+ AIC_TEMPLATE_VERSIONED_ENTRIES() \
-+}
-+
-+/************************** OS Utility Wrappers *******************************/
-+#define printf printk
-+#define M_NOWAIT GFP_ATOMIC
-+#define M_WAITOK 0
-+#define malloc(size, type, flags) kmalloc(size, flags)
-+#define free(ptr, type) kfree(ptr)
-+
-+static __inline void aic_delay(long);
-+static __inline void
-+aic_delay(long usec)
-+{
-+ /*
-+ * udelay on Linux can have problems for
-+ * multi-millisecond waits. Wait at most
-+ * 1024us per call.
-+ */
-+ while (usec > 0) {
-+ udelay(usec % 1024);
-+ usec -= 1024;
-+ }
-+}
-+
-+/********************************** Misc Macros *******************************/
-+#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
-+#define powerof2(x) ((((x)-1)&(x))==0)
-+
-+/******************************* Byte Order ***********************************/
-+#define aic_htobe16(x) cpu_to_be16(x)
-+#define aic_htobe32(x) cpu_to_be32(x)
-+#define aic_htobe64(x) cpu_to_be64(x)
-+#define aic_htole16(x) cpu_to_le16(x)
-+#define aic_htole32(x) cpu_to_le32(x)
-+#define aic_htole64(x) cpu_to_le64(x)
-+
-+#define aic_be16toh(x) be16_to_cpu(x)
-+#define aic_be32toh(x) be32_to_cpu(x)
-+#define aic_be64toh(x) be64_to_cpu(x)
-+#define aic_le16toh(x) le16_to_cpu(x)
-+#define aic_le32toh(x) le32_to_cpu(x)
-+#define aic_le64toh(x) le64_to_cpu(x)
-+
-+#ifndef LITTLE_ENDIAN
-+#define LITTLE_ENDIAN 1234
-+#endif
-+
-+#ifndef BIG_ENDIAN
-+#define BIG_ENDIAN 4321
-+#endif
-+
-+#ifndef BYTE_ORDER
-+#if defined(__BIG_ENDIAN)
-+#define BYTE_ORDER BIG_ENDIAN
-+#endif
-+#if defined(__LITTLE_ENDIAN)
-+#define BYTE_ORDER LITTLE_ENDIAN
-+#endif
-+#endif /* BYTE_ORDER */
-+
-+/********************************* Core Includes ******************************/
-+#include AIC_CORE_INCLUDE
-+
-+/**************************** Front End Queues ********************************/
-+/*
-+ * Data structure used to cast the Linux struct scsi_cmnd to something
-+ * that allows us to use the queue macros. The linux structure has
-+ * plenty of space to hold the links fields as required by the queue
-+ * macros, but the queue macors require them to have the correct type.
-+ */
-+struct aic_cmd_internal {
-+ /* Area owned by the Linux scsi layer. */
-+ uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
-+ union {
-+ STAILQ_ENTRY(aic_cmd) ste;
-+ LIST_ENTRY(aic_cmd) le;
-+ TAILQ_ENTRY(aic_cmd) tqe;
-+ } links;
-+ uint32_t end;
-+};
-+
-+struct aic_cmd {
-+ union {
-+ struct aic_cmd_internal icmd;
-+ struct scsi_cmnd scsi_cmd;
-+ } un;
-+};
-+
-+#define acmd_icmd(cmd) ((cmd)->un.icmd)
-+#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
-+#define acmd_links un.icmd.links
-+
-+/*************************** Device Data Structures ***************************/
-+/*
-+ * A per probed device structure used to deal with some error recovery
-+ * scenarios that the Linux mid-layer code just doesn't know how to
-+ * handle. The structure allocated for a device only becomes persistent
-+ * after a successfully completed inquiry command to the target when
-+ * that inquiry data indicates a lun is present.
-+ */
-+TAILQ_HEAD(aic_busyq, aic_cmd);
-+typedef enum {
-+ AIC_DEV_UNCONFIGURED = 0x01,
-+ AIC_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
-+ AIC_DEV_TIMER_ACTIVE = 0x04, /* Our timer is active */
-+ AIC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
-+ AIC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
-+ AIC_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
-+ AIC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
-+ AIC_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
-+} aic_linux_dev_flags;
-+
-+struct aic_linux_target;
-+struct aic_linux_device {
-+ TAILQ_ENTRY(aic_linux_device) links;
-+ struct aic_busyq busyq;
-+
-+ /*
-+ * The number of transactions currently
-+ * queued to the device.
-+ */
-+ int active;
-+
-+ /*
-+ * The currently allowed number of
-+ * transactions that can be queued to
-+ * the device. Must be signed for
-+ * conversion from tagged to untagged
-+ * mode where the device may have more
-+ * than one outstanding active transaction.
-+ */
-+ int openings;
-+
-+ /*
-+ * A positive count indicates that this
-+ * device's queue is halted.
-+ */
-+ u_int qfrozen;
-+
-+ /*
-+ * Cumulative command counter.
-+ */
-+ u_long commands_issued;
-+
-+ /*
-+ * The number of tagged transactions when
-+ * running at our current opening level
-+ * that have been successfully received by
-+ * this device since the last QUEUE FULL.
-+ */
-+ u_int tag_success_count;
-+#define AIC_TAG_SUCCESS_INTERVAL 50
-+
-+ aic_linux_dev_flags flags;
-+
-+ /*
-+ * Per device timer.
-+ */
-+ struct timer_list timer;
-+
-+ /*
-+ * The high limit for the tags variable.
-+ */
-+ u_int maxtags;
-+
-+ /*
-+ * The computed number of tags outstanding
-+ * at the time of the last QUEUE FULL event.
-+ */
-+ u_int tags_on_last_queuefull;
-+
-+ /*
-+ * How many times we have seen a queue full
-+ * with the same number of tags. This is used
-+ * to stop our adaptive queue depth algorithm
-+ * on devices with a fixed number of tags.
-+ */
-+ u_int last_queuefull_same_count;
-+#define AIC_LOCK_TAGS_COUNT 50
-+
-+ /*
-+ * How many transactions have been queued
-+ * without the device going idle. We use
-+ * this statistic to determine when to issue
-+ * an ordered tag to prevent transaction
-+ * starvation. This statistic is only updated
-+ * if the AIC_DEV_PERIODIC_OTAG flag is set
-+ * on this device.
-+ */
-+ u_int commands_since_idle_or_otag;
-+#define AIC_OTAG_THRESH 500
-+
-+ int lun;
-+ Scsi_Device *scsi_device;
-+ struct aic_linux_target *target;
-+};
-+
-+typedef enum {
-+ AIC_DV_REQUIRED = 0x01,
-+ AIC_INQ_VALID = 0x02,
-+ AIC_BASIC_DV = 0x04,
-+ AIC_ENHANCED_DV = 0x08
-+} aic_linux_targ_flags;
-+
-+/* DV States */
-+typedef enum {
-+ AIC_DV_STATE_EXIT = 0,
-+ AIC_DV_STATE_INQ_SHORT_ASYNC,
-+ AIC_DV_STATE_INQ_ASYNC,
-+ AIC_DV_STATE_INQ_ASYNC_VERIFY,
-+ AIC_DV_STATE_TUR,
-+ AIC_DV_STATE_REBD,
-+ AIC_DV_STATE_INQ_VERIFY,
-+ AIC_DV_STATE_WEB,
-+ AIC_DV_STATE_REB,
-+ AIC_DV_STATE_SU,
-+ AIC_DV_STATE_BUSY
-+} aic_dv_state;
-+
-+struct aic_linux_target {
-+ struct aic_linux_device *devices[AIC_NUM_LUNS];
-+ int channel;
-+ int target;
-+ int refcount;
-+ struct aic_transinfo last_tinfo;
-+ struct aic_softc *softc;
-+ aic_linux_targ_flags flags;
-+ struct scsi_inquiry_data *inq_data;
-+ /*
-+ * The next "fallback" period to use for narrow/wide transfers.
-+ */
-+ uint8_t dv_next_narrow_period;
-+ uint8_t dv_next_wide_period;
-+ uint8_t dv_max_width;
-+ uint8_t dv_max_ppr_options;
-+ uint8_t dv_last_ppr_options;
-+ u_int dv_echo_size;
-+ aic_dv_state dv_state;
-+ u_int dv_state_retry;
-+ uint8_t *dv_buffer;
-+ uint8_t *dv_buffer1;
-+
-+ /*
-+ * Cumulative counter of errors.
-+ */
-+ u_long errors_detected;
-+ u_long cmds_since_error;
-+};
-+
-+/*************** OSM Dependent Components of Core Datastructures **************/
-+/*
-+ * Per-SCB OSM storage.
-+ */
-+typedef enum {
-+ AIC_SCB_UP_EH_SEM = 0x1,
-+ AIC_TIMEOUT_ACTIVE = 0x2,
-+ AIC_RELEASE_SIMQ = 0x4
-+} aic_linux_scb_flags;
-+
-+struct scb_platform_data {
-+ struct aic_linux_device *dev;
-+ bus_addr_t buf_busaddr;
-+ uint32_t xfer_len;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-+ uint32_t resid; /* Transfer residual */
-+#endif
-+ uint32_t sense_resid; /* Auto-Sense residual */
-+ aic_linux_scb_flags flags;
-+};
-+
-+/*
-+ * Define a structure used for each host adapter. All members are
-+ * aligned on a boundary >= the size of the member to honor the
-+ * alignment restrictions of the various platforms supported by
-+ * this driver.
-+ */
-+typedef enum {
-+ AIC_DV_WAIT_SIMQ_EMPTY = 0x01,
-+ AIC_DV_WAIT_SIMQ_RELEASE = 0x02,
-+ AIC_DV_ACTIVE = 0x04,
-+ AIC_DV_SHUTDOWN = 0x08,
-+ AIC_RUN_CMPLT_Q_TIMER = 0x10,
-+ AIC_BUS_SETTLE_TIMER = 0x20
-+} aic_linux_softc_flags;
-+
-+TAILQ_HEAD(aic_completeq, aic_cmd);
-+
-+struct aic_platform_data {
-+ /*
-+ * Fields accessed from interrupt context.
-+ */
-+ struct aic_linux_target *targets[AIC_NUM_TARGETS];
-+ TAILQ_HEAD(, aic_linux_device) device_runq;
-+ struct aic_completeq completeq;
-+
-+ spinlock_t spin_lock;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ struct tasklet_struct runq_tasklet;
-+ struct tasklet_struct unblock_tasklet;
-+#endif
-+ u_int qfrozen;
-+ pid_t dv_pid;
-+ pid_t recovery_pid;
-+ struct timer_list completeq_timer;
-+ struct timer_list bus_settle_timer;
-+ struct timer_list stats_timer;
-+ struct semaphore eh_sem;
-+ struct semaphore dv_sem;
-+ struct semaphore dv_cmd_sem;
-+ struct semaphore recovery_sem;
-+ struct semaphore recovery_ending_sem;
-+ struct scsi_device *dv_scsi_dev;
-+ struct Scsi_Host *host; /* pointer to scsi host */
-+#define AIC_LINUX_NOIRQ ((uint32_t)~0)
-+ uint32_t irq; /* IRQ for this adapter */
-+ uint32_t bios_address;
-+ uint32_t mem_busaddr; /* Mem Base Addr */
-+ bus_addr_t hw_dma_mask;
-+ aic_linux_softc_flags flags;
-+};
-+
-+/***************************** Timer Facilities *******************************/
-+typedef void aic_linux_callback_t (u_long);
-+void aic_platform_timeout(struct scsi_cmnd *);
-+void aic_linux_midlayer_timeout(struct scsi_cmnd *);
-+
-+#define aic_timer_init init_timer
-+#define aic_timer_stop del_timer_sync
-+static __inline void aic_timer_reset(aic_timer_t *timer, uint32_t usec,
-+ aic_callback_t *func, void *arg);
-+static __inline uint32_t aic_get_timeout(struct scb *);
-+static __inline void aic_scb_timer_start(struct scb *scb);
-+static __inline void aic_scb_timer_reset(struct scb *scb, uint32_t usec);
-
-+static __inline void
-+aic_timer_reset(aic_timer_t *timer, uint32_t usec,
-+ aic_callback_t *func, void *arg)
-+{
-+ struct aic_softc *aic;
-+
-+ aic = (struct aic_softc *)arg;
-+ del_timer(timer);
-+ timer->data = (u_long)arg;
-+ timer->expires = jiffies + (usec / AIC_USECS_PER_JIFFY);
-+ timer->function = (aic_linux_callback_t*)func;
-+ add_timer(timer);
-+}
-+
-+static __inline uint32_t
-+aic_get_timeout(struct scb *scb)
-+{
-+
-+ /*
-+ * Convert from jiffies to usec.
-+ */
-+ return (scb->io_ctx->timeout_per_command * AIC_USECS_PER_JIFFY);
-+}
-+
-+static __inline void
-+aic_scb_timer_start(struct scb *scb)
-+{
-+ scb->platform_data->flags |= AIC_TIMEOUT_ACTIVE;
-+ scsi_add_timer(scb->io_ctx, scb->io_ctx->timeout_per_command,
-+ aic_platform_timeout);
-+}
-+
-+static __inline void
-+aic_scb_timer_reset(struct scb *scb, uint32_t usec)
-+{
-+ /*
-+ * Restore timer data that is clobbered by scsi_delete_timer().
-+ */
-+ scb->io_ctx->eh_timeout.data = (unsigned long)scb->io_ctx;
-+ scb->io_ctx->eh_timeout.function =
-+ (void (*)(unsigned long))aic_platform_timeout;
-+ scb->platform_data->flags |= AIC_TIMEOUT_ACTIVE;
-+ mod_timer(&scb->io_ctx->eh_timeout,
-+ jiffies + (usec / AIC_USECS_PER_JIFFY));
-+}
-+
-+/************************* SCSI command formats *******************************/
- /*
- * Define dome bits that are in ALL (or a lot of) scsi commands
- */
-@@ -865,6 +1624,368 @@ typedef enum {
-
- extern const char *scsi_sense_key_text[];
-
-+/*************************** Domain Validation ********************************/
-+#define AIC_DV_CMD(cmd) ((cmd)->scsi_done == aic_linux_dv_complete)
-+#define AIC_DV_SIMQ_FROZEN(aic) \
-+ ((((aic)->platform_data->flags & AIC_DV_ACTIVE) != 0) \
-+ && (aic)->platform_data->qfrozen == 1)
-+
-+/*********************** Transaction Access Wrappers **************************/
-+static __inline void aic_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);
-+static __inline void aic_set_transaction_status(struct scb *, uint32_t);
-+static __inline void aic_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);
-+static __inline void aic_set_scsi_status(struct scb *, uint32_t);
-+static __inline uint32_t aic_cmd_get_transaction_status(Scsi_Cmnd *cmd);
-+static __inline uint32_t aic_get_transaction_status(struct scb *);
-+static __inline uint32_t aic_cmd_get_scsi_status(Scsi_Cmnd *cmd);
-+static __inline uint32_t aic_get_scsi_status(struct scb *);
-+static __inline void aic_set_transaction_tag(struct scb *, int, u_int);
-+static __inline u_long aic_get_transfer_length(struct scb *);
-+static __inline int aic_get_transfer_dir(struct scb *);
-+static __inline void aic_set_residual(struct scb *, u_long);
-+static __inline void aic_set_sense_residual(struct scb *scb, u_long resid);
-+static __inline u_long aic_get_residual(struct scb *);
-+static __inline u_long aic_get_sense_residual(struct scb *);
-+static __inline int aic_perform_autosense(struct scb *);
-+static __inline uint32_t aic_get_sense_bufsize(struct aic_softc *,
-+ struct scb *);
-+static __inline void aic_notify_xfer_settings_change(struct aic_softc *,
-+ struct aic_devinfo *);
-+static __inline void aic_platform_scb_free(struct aic_softc *aic,
-+ struct scb *scb);
-+static __inline void aic_freeze_scb(struct scb *scb);
-+
-+static __inline
-+void aic_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status)
-+{
-+ cmd->result &= ~(CAM_STATUS_MASK << 16);
-+ cmd->result |= status << 16;
-+}
-+
-+static __inline
-+void aic_set_transaction_status(struct scb *scb, uint32_t status)
-+{
-+ aic_cmd_set_transaction_status(scb->io_ctx,status);
-+}
-+
-+static __inline
-+void aic_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status)
-+{
-+ cmd->result &= ~0xFFFF;
-+ cmd->result |= status;
-+}
-+
-+static __inline
-+void aic_set_scsi_status(struct scb *scb, uint32_t status)
-+{
-+ aic_cmd_set_scsi_status(scb->io_ctx, status);
-+}
-+
-+static __inline
-+uint32_t aic_cmd_get_transaction_status(Scsi_Cmnd *cmd)
-+{
-+ return ((cmd->result >> 16) & CAM_STATUS_MASK);
-+}
-+
-+static __inline
-+uint32_t aic_get_transaction_status(struct scb *scb)
-+{
-+ return (aic_cmd_get_transaction_status(scb->io_ctx));
-+}
-+
-+static __inline
-+uint32_t aic_cmd_get_scsi_status(Scsi_Cmnd *cmd)
-+{
-+ return (cmd->result & 0xFFFF);
-+}
-+
-+static __inline
-+uint32_t aic_get_scsi_status(struct scb *scb)
-+{
-+ return (aic_cmd_get_scsi_status(scb->io_ctx));
-+}
-+
-+static __inline
-+void aic_set_transaction_tag(struct scb *scb, int enabled, u_int type)
-+{
-+ /*
-+ * Nothing to do for linux as the incoming transaction
-+ * has no concept of tag/non tagged, etc.
-+ */
-+}
-+
-+static __inline
-+u_long aic_get_transfer_length(struct scb *scb)
-+{
-+ return (scb->platform_data->xfer_len);
-+}
-+
-+static __inline
-+int aic_get_transfer_dir(struct scb *scb)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,40)
-+ return (scb->io_ctx->sc_data_direction);
-+#else
-+ if (scb->io_ctx->bufflen == 0)
-+ return (CAM_DIR_NONE);
-+
-+ switch(scb->io_ctx->cmnd[0]) {
-+ case 0x08: /* READ(6) */
-+ case 0x28: /* READ(10) */
-+ case 0xA8: /* READ(12) */
-+ return (CAM_DIR_IN);
-+ case 0x0A: /* WRITE(6) */
-+ case 0x2A: /* WRITE(10) */
-+ case 0xAA: /* WRITE(12) */
-+ return (CAM_DIR_OUT);
-+ default:
-+ return (CAM_DIR_NONE);
-+ }
-+#endif
-+}
-+
-+static __inline
-+void aic_set_residual(struct scb *scb, u_long resid)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-+ scb->io_ctx->resid = resid;
-+#else
-+ scb->platform_data->resid = resid;
-+#endif
-+}
-+
-+static __inline
-+void aic_set_sense_residual(struct scb *scb, u_long resid)
-+{
-+ scb->platform_data->sense_resid = resid;
-+}
-+
-+static __inline
-+u_long aic_get_residual(struct scb *scb)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
-+ return (scb->io_ctx->resid);
-+#else
-+ return (scb->platform_data->resid);
-+#endif
-+}
-+
-+static __inline
-+u_long aic_get_sense_residual(struct scb *scb)
-+{
-+ return (scb->platform_data->sense_resid);
-+}
-+
-+static __inline
-+int aic_perform_autosense(struct scb *scb)
-+{
-+ /*
-+ * We always perform autosense in Linux.
-+ * On other platforms this is set on a
-+ * per-transaction basis.
-+ */
-+ return (1);
-+}
-+
-+static __inline uint32_t
-+aic_get_sense_bufsize(struct aic_softc *aic, struct scb *scb)
-+{
-+ return (sizeof(struct scsi_sense_data));
-+}
-+
-+static __inline void
-+aic_notify_xfer_settings_change(struct aic_softc *aic,
-+ struct aic_devinfo *devinfo)
-+{
-+ /* Nothing to do here for linux */
-+}
-+
-+static __inline void
-+aic_platform_scb_free(struct aic_softc *aic, struct scb *scb)
-+{
-+ aic->flags &= ~AIC_RESOURCE_SHORTAGE;
-+}
-+
-+static __inline void
-+aic_freeze_scb(struct scb *scb)
-+{
-+ if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
-+ scb->io_ctx->result |= CAM_DEV_QFRZN << 16;
-+ scb->platform_data->dev->qfrozen++;
-+ }
-+}
-+
-+/******************************* PCI Definitions ******************************/
-+/*
-+ * PCIM_xxx: mask to locate subfield in register
-+ * PCIR_xxx: config register offset
-+ * PCIC_xxx: device class
-+ * PCIS_xxx: device subclass
-+ * PCIP_xxx: device programming interface
-+ * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
-+ * PCID_xxx: device ID
-+ */
-+#define PCIR_DEVVENDOR 0x00
-+#define PCIR_VENDOR 0x00
-+#define PCIR_DEVICE 0x02
-+#define PCIR_COMMAND 0x04
-+#define PCIM_CMD_PORTEN 0x0001
-+#define PCIM_CMD_MEMEN 0x0002
-+#define PCIM_CMD_BUSMASTEREN 0x0004
-+#define PCIM_CMD_MWRICEN 0x0010
-+#define PCIM_CMD_PERRESPEN 0x0040
-+#define PCIM_CMD_SERRESPEN 0x0100
-+#define PCIR_STATUS 0x06
-+#define PCIR_REVID 0x08
-+#define PCIR_PROGIF 0x09
-+#define PCIR_SUBCLASS 0x0a
-+#define PCIR_CLASS 0x0b
-+#define PCIR_CACHELNSZ 0x0c
-+#define PCIR_LATTIMER 0x0d
-+#define PCIR_HEADERTYPE 0x0e
-+#define PCIM_MFDEV 0x80
-+#define PCIR_BIST 0x0f
-+#define PCIR_CAP_PTR 0x34
-+
-+/* config registers for header type 0 devices */
-+#define PCIR_MAPS 0x10
-+#define PCIR_BARS PCIR_MAPS
-+#define PCIR_BAR(x) (PCIR_BARS + (x) * 4)
-+#define PCIR_SUBVEND_0 0x2c
-+#define PCIR_SUBDEV_0 0x2e
-+
-+typedef enum
-+{
-+ AIC_POWER_STATE_D0,
-+ AIC_POWER_STATE_D1,
-+ AIC_POWER_STATE_D2,
-+ AIC_POWER_STATE_D3
-+} aic_power_state;
-+
-+/****************************** PCI-X definitions *****************************/
-+#define PCIXR_COMMAND 0x96
-+#define PCIXR_DEVADDR 0x98
-+#define PCIXM_DEVADDR_FNUM 0x0003 /* Function Number */
-+#define PCIXM_DEVADDR_DNUM 0x00F8 /* Device Number */
-+#define PCIXM_DEVADDR_BNUM 0xFF00 /* Bus Number */
-+#define PCIXR_STATUS 0x9A
-+#define PCIXM_STATUS_64BIT 0x0001 /* Active 64bit connection to device. */
-+#define PCIXM_STATUS_133CAP 0x0002 /* Device is 133MHz capable */
-+#define PCIXM_STATUS_SCDISC 0x0004 /* Split Completion Discarded */
-+#define PCIXM_STATUS_UNEXPSC 0x0008 /* Unexpected Split Completion */
-+#define PCIXM_STATUS_CMPLEXDEV 0x0010 /* Device Complexity (set == bridge) */
-+#define PCIXM_STATUS_MAXMRDBC 0x0060 /* Maximum Burst Read Count */
-+#define PCIXM_STATUS_MAXSPLITS 0x0380 /* Maximum Split Transactions */
-+#define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */
-+#define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */
-+
-+/**************************** KObject Wrappers ********************************/
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+#define aic_dev_to_pci_dev(dev) to_pci_dev(dev)
-+#define aic_dev_to_eisa_dev(dev) to_eisa_dev(dev)
-+#define aic_pci_dev_to_dev(pci) (&pci->dev)
-+#define aic_eisa_dev_to_dev(eisa) (&eisa->dev)
-+#else
-+#define aic_dev_to_pci_dev(dev) (dev)
-+#define aic_dev_to_eisa_dev(dev) (NULL)
-+#define aic_pci_dev_to_dev(pci) (pci)
-+#define aic_eisa_dev_to_dev(eisa) (NULL)
-+#endif
-+
-+#define aic_pci_dev(aic) aic_dev_to_pci_dev((aic)->dev_softc)
-+#define aic_eisa_dev(aic) aic_dev_to_eisa_dev((aic)->dev_softc)
-+/***************************** PCI Routines ***********************************/
-+static __inline uint32_t aic_pci_read_config(aic_dev_softc_t dev,
-+ int reg, int width);
-+static __inline void aic_pci_write_config(aic_dev_softc_t dev,
-+ int reg, uint32_t value,
-+ int width);
-+static __inline int aic_get_pci_function(aic_dev_softc_t);
-+static __inline int aic_get_pci_slot(aic_dev_softc_t);
-+static __inline int aic_get_pci_bus(aic_dev_softc_t);
-+
-+static __inline uint32_t
-+aic_pci_read_config(aic_dev_softc_t dev, int reg, int width)
-+{
-+ struct pci_dev *pci;
-+
-+ pci = aic_dev_to_pci_dev(dev);
-+ switch (width) {
-+ case 1:
-+ {
-+ uint8_t retval;
-+
-+ pci_read_config_byte(pci, reg, &retval);
-+ return (retval);
-+ }
-+ case 2:
-+ {
-+ uint16_t retval;
-+ pci_read_config_word(pci, reg, &retval);
-+ return (retval);
-+ }
-+ case 4:
-+ {
-+ uint32_t retval;
-+ pci_read_config_dword(pci, reg, &retval);
-+ return (retval);
-+ }
-+ default:
-+ panic("aic_pci_read_config: Read size too big");
-+ /* NOTREACHED */
-+ return (0);
-+ }
-+}
-+
-+static __inline void
-+aic_pci_write_config(aic_dev_softc_t dev, int reg, uint32_t value, int width)
-+{
-+ struct pci_dev *pci;
-+
-+ pci = aic_dev_to_pci_dev(dev);
-+ switch (width) {
-+ case 1:
-+ pci_write_config_byte(pci, reg, value);
-+ break;
-+ case 2:
-+ pci_write_config_word(pci, reg, value);
-+ break;
-+ case 4:
-+ pci_write_config_dword(pci, reg, value);
-+ break;
-+ default:
-+ panic("aic_pci_write_config: Write size too big");
-+ /* NOTREACHED */
-+ }
-+}
-+
-+static __inline int
-+aic_get_pci_function(aic_dev_softc_t dev)
-+{
-+ struct pci_dev *pci;
-+
-+ pci = aic_dev_to_pci_dev(dev);
-+ return (PCI_FUNC(pci->devfn));
-+}
-+
-+static __inline int
-+aic_get_pci_slot(aic_dev_softc_t dev)
-+{
-+ struct pci_dev *pci;
-+
-+ pci = aic_dev_to_pci_dev(dev);
-+ return (PCI_SLOT(pci->devfn));
-+}
-+
-+static __inline int
-+aic_get_pci_bus(aic_dev_softc_t dev)
-+{
-+ struct pci_dev *pci;
-+
-+ pci = aic_dev_to_pci_dev(dev);
-+ return (pci->bus->number);
-+}
-+
- /************************* Large Disk Handling ********************************/
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
- static __inline int aic_sector_div(u_long capacity, int heads, int sectors);
-@@ -886,34 +2007,31 @@ aic_sector_div(sector_t capacity, int he
- }
- #endif
-
--/**************************** Module Library Hack *****************************/
--/*
-- * What we'd like to do is have a single "scsi library" module that both the
-- * aic7xxx and aic79xx drivers could load and depend on. A cursory examination
-- * of implementing module dependencies in Linux (handling the install and
-- * initrd cases) does not look promissing. For now, we just duplicate this
-- * code in both drivers using a simple symbol renaming scheme that hides this
-- * hack from the drivers.
-- */
--#define AIC_LIB_ENTRY_CONCAT(x, prefix) prefix ## x
--#define AIC_LIB_ENTRY_EXPAND(x, prefix) AIC_LIB_ENTRY_CONCAT(x, prefix)
--#define AIC_LIB_ENTRY(x) AIC_LIB_ENTRY_EXPAND(x, AIC_LIB_PREFIX)
-+/************************* Magic SysReq Support *******************************/
-+#include <linux/sysrq.h>
-
--#define aic_sense_desc AIC_LIB_ENTRY(_sense_desc)
--#define aic_sense_error_action AIC_LIB_ENTRY(_sense_error_action)
--#define aic_error_action AIC_LIB_ENTRY(_error_action)
--#define aic_op_desc AIC_LIB_ENTRY(_op_desc)
--#define aic_cdb_string AIC_LIB_ENTRY(_cdb_string)
--#define aic_print_inquiry AIC_LIB_ENTRY(_print_inquiry)
--#define aic_calc_syncsrate AIC_LIB_ENTRY(_calc_syncrate)
--#define aic_calc_syncparam AIC_LIB_ENTRY(_calc_syncparam)
--#define aic_calc_speed AIC_LIB_ENTRY(_calc_speed)
--#define aic_inquiry_match AIC_LIB_ENTRY(_inquiry_match)
--#define aic_static_inquiry_match AIC_LIB_ENTRY(_static_inquiry_match)
--#define aic_parse_brace_option AIC_LIB_ENTRY(_parse_brace_option)
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+typedef void aic_sysrq_handler_t (int, struct pt_regs *, struct kbd_struct *,
-+ struct tty_struct *);
-+#else
-+typedef void aic_sysrq_handler_t (int, struct pt_regs *, struct tty_struct *);
-+#endif
-
--/******************************************************************************/
-+#ifdef CONFIG_MAGIC_SYSRQ
-+#define aic_sysrq_key_op sysrq_key_op
-+#else
-+struct aic_sysrq_key_op {
-+ aic_sysrq_handler_t *handler;
-+ char *help_msg;
-+ char *action_msg;
-+};
-+#endif
-
-+aic_sysrq_handler_t aic_sysrq_handler;
-+int aic_install_sysrq(struct aic_sysrq_key_op *);
-+void aic_remove_sysrq(int key,
-+ struct aic_sysrq_key_op *key_op);
-+/************************ SCSI Library Functions *****************************/
- void aic_sense_desc(int /*sense_key*/, int /*asc*/,
- int /*ascq*/, struct scsi_inquiry_data*,
- const char** /*sense_key_desc*/,
-@@ -1043,4 +2161,115 @@ scsi_4btoul(uint8_t *bytes)
- return (rv);
- }
-
-+/******************************* PCI Funcitons ********************************/
-+void aic_power_state_change(struct aic_softc *aic, aic_power_state new_state);
-+
-+/******************************* Queue Handling *******************************/
-+void aic_runq_tasklet(unsigned long data);
-+void aic_unblock_tasklet(unsigned long data);
-+void aic_linux_run_device_queue(struct aic_softc*,
-+ struct aic_linux_device*);
-+void aic_bus_settle_complete(u_long data);
-+void aic_freeze_simq(struct aic_softc *aic);
-+void aic_release_simq(struct aic_softc *aic);
-+void aic_release_simq_locked(struct aic_softc *aic);
-+static __inline void aic_schedule_runq(struct aic_softc *aic);
-+static __inline void aic_schedule_unblock(struct aic_softc *aic);
-+static __inline struct aic_linux_device *
-+ aic_linux_next_device_to_run(struct aic_softc *aic);
-+static __inline void aic_linux_check_device_queue(struct aic_softc *aic,
-+ struct aic_linux_device *dev);
-+static __inline void aic_linux_run_device_queues(struct aic_softc *aic);
-+
-+/*
-+ * Must be called with our lock held.
-+ */
-+static __inline void
-+aic_schedule_runq(struct aic_softc *aic)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ tasklet_schedule(&aic->platform_data->runq_tasklet);
-+#else
-+ /*
-+ * Tasklets are not available, so run inline.
-+ */
-+ aic_runq_tasklet((unsigned long)aic);
-+#endif
-+}
-+
-+static __inline void
-+aic_schedule_unblock(struct aic_softc *aic)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ tasklet_schedule(&aic->platform_data->unblock_tasklet);
-+#else
-+#error "Fix 2.2.X Kernel Support"
-+#endif
-+}
-+
-+static __inline struct aic_linux_device *
-+aic_linux_next_device_to_run(struct aic_softc *aic)
-+{
-+
-+ if ((aic->flags & AIC_RESOURCE_SHORTAGE) != 0
-+ || (aic->platform_data->qfrozen != 0
-+ && AIC_DV_SIMQ_FROZEN(aic) == 0))
-+ return (NULL);
-+ return (TAILQ_FIRST(&aic->platform_data->device_runq));
-+}
-+
-+static __inline void
-+aic_linux_check_device_queue(struct aic_softc *aic,
-+ struct aic_linux_device *dev)
-+{
-+ if ((dev->flags & AIC_DEV_FREEZE_TIL_EMPTY) != 0
-+ && dev->active == 0) {
-+ dev->flags &= ~AIC_DEV_FREEZE_TIL_EMPTY;
-+ dev->qfrozen--;
-+ }
-+
-+ if (TAILQ_FIRST(&dev->busyq) == NULL
-+ || dev->openings == 0 || dev->qfrozen != 0)
-+ return;
-+
-+ aic_linux_run_device_queue(aic, dev);
-+}
-+
-+static __inline void
-+aic_linux_run_device_queues(struct aic_softc *aic)
-+{
-+ struct aic_linux_device *dev;
-+
-+ while ((dev = aic_linux_next_device_to_run(aic)) != NULL) {
-+ TAILQ_REMOVE(&aic->platform_data->device_runq, dev, links);
-+ dev->flags &= ~AIC_DEV_ON_RUN_LIST;
-+ aic_linux_check_device_queue(aic, dev);
-+ }
-+}
-+
-+/****************************** Tasklet Support *******************************/
-+static __inline void aic_setup_tasklets(struct aic_softc *aic);
-+static __inline void aic_teardown_tasklets(struct aic_softc *aic);
-+
-+static __inline void
-+aic_setup_tasklets(struct aic_softc *aic)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ tasklet_init(&aic->platform_data->runq_tasklet, aic_runq_tasklet,
-+ (unsigned long)aic);
-+ tasklet_init(&aic->platform_data->unblock_tasklet, aic_unblock_tasklet,
-+ (unsigned long)aic);
-+#endif
-+}
-+
-+static __inline void
-+aic_teardown_tasklets(struct aic_softc *aic)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ tasklet_kill(&aic->platform_data->runq_tasklet);
-+ tasklet_kill(&aic->platform_data->unblock_tasklet);
-+#endif
-+}
-+
-+
- #endif /*_AICLIB_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/aiclib_pci.c 2003-12-28 23:21:40.000000000 -0800
-@@ -0,0 +1,79 @@
-+/*
-+ * Implementation of Utility functions for PCI controller types.
-+ *
-+ * Copyright (c) 2000-2003 Adaptec Inc.
-+ * All rights reserved.
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ * notice, this list of conditions, and the following disclaimer,
-+ * without modification.
-+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
-+ * substantially similar to the "NO WARRANTY" disclaimer below
-+ * ("Disclaimer") and any redistribution must be conditioned upon
-+ * including a substantially similar Disclaimer requirement for further
-+ * binary redistribution.
-+ * 3. Neither the names of the above-listed copyright holders nor the names
-+ * of any contributors may be used to endorse or promote products derived
-+ * from this software without specific prior written permission.
-+ *
-+ * Alternatively, this software may be distributed under the terms of the
-+ * GNU General Public License ("GPL") version 2 as published by the Free
-+ * Software Foundation.
-+ *
-+ * NO WARRANTY
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
-+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-+ * POSSIBILITY OF SUCH DAMAGES.
-+ *
-+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#25 $
-+ */
-+
-+void
-+aic_power_state_change(struct aic_softc *aic, aic_power_state new_state)
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-+ pci_set_power_state(aic_dev_to_pci_dev(aic->dev_softc), new_state);
-+#else
-+ uint32_t cap;
-+ u_int cap_offset;
-+
-+ /*
-+ * Traverse the capability list looking for
-+ * the power management capability.
-+ */
-+ cap = 0;
-+ cap_offset = aic_pci_read_config(aic->dev_softc,
-+ PCIR_CAP_PTR, /*bytes*/1);
-+ while (cap_offset != 0) {
-+
-+ cap = aic_pci_read_config(aic->dev_softc,
-+ cap_offset, /*bytes*/4);
-+ if ((cap & 0xFF) == 1
-+ && ((cap >> 16) & 0x3) > 0) {
-+ uint32_t pm_control;
-+
-+ pm_control = aic_pci_read_config(aic->dev_softc,
-+ cap_offset + 4,
-+ /*bytes*/4);
-+ pm_control &= ~0x3;
-+ pm_control |= new_state;
-+ aic_pci_write_config(aic->dev_softc,
-+ cap_offset + 4,
-+ pm_control, /*bytes*/2);
-+ break;
-+ }
-+ cap_offset = (cap >> 8) & 0xFF;
-+ }
-+#endif
-+}
---- linux-2.6.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/scsi/aic7xxx/Kconfig.aic7xxx 2003-12-28 23:21:40.000000000 -0800
-@@ -1,18 +1,16 @@
- #
- # AIC7XXX and AIC79XX 2.5.X Kernel configuration File.
--# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#6 $
-+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#8 $
- #
- config SCSI_AIC7XXX
- tristate "Adaptec AIC7xxx Fast -> U160 support (New Driver)"
-+ depends on PCI || EISA
- ---help---
- This driver supports all of Adaptec's Fast through Ultra 160 PCI
- based SCSI controllers as well as the aic7770 based EISA and VLB
- SCSI controllers (the 274x and 284x series). For AAA and ARO based
- configurations, only SCSI functionality is provided.
-
-- To compile this driver as a module, choose M here: the
-- module will be called aic7xxx.
--
- config AIC7XXX_CMDS_PER_DEVICE
- int "Maximum number of TCQ commands per device"
- depends on SCSI_AIC7XXX
-@@ -50,7 +48,7 @@ config AIC7XXX_RESET_DELAY_MS
-
- config AIC7XXX_PROBE_EISA_VL
- bool "Probe for EISA and VL AIC7XXX Adapters"
-- depends on SCSI_AIC7XXX
-+ depends on SCSI_AIC7XXX && EISA
- help
- Probe for EISA and VLB Aic7xxx controllers. In many newer systems,
- the invasive probes necessary to detect these controllers can cause
---- linux-2.6.0/drivers/scsi/aic7xxx/Makefile 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/aic7xxx/Makefile 2003-12-28 23:21:40.000000000 -0800
-@@ -1,7 +1,7 @@
- #
- # Makefile for the Linux aic7xxx SCSI driver.
- #
--# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#6 $
-+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Makefile#8 $
- #
-
- # Let kbuild descend into aicasm when cleaning
-@@ -12,15 +12,15 @@ obj-$(CONFIG_SCSI_AIC79XX) += aic79xx.o
-
- # Core Fast -> U160 files
- aic7xxx-y += aic7xxx_core.o \
-- aic7xxx_93cx6.o \
-- aic7770.o
-+ aic7xxx_93cx6.o
-+aic7xxx-$(CONFIG_EISA) += aic7770.o
- aic7xxx-$(CONFIG_PCI) += aic7xxx_pci.o
- aic7xxx-$(CONFIG_AIC7XXX_REG_PRETTY_PRINT) += aic7xxx_reg_print.o
-
- # Platform Specific Fast -> U160 Files
- aic7xxx-y += aic7xxx_osm.o \
-- aic7xxx_proc.o \
-- aic7770_osm.o
-+ aic7xxx_proc.o
-+aic7xxx-$(CONFIG_EISA) += aic7770_osm.o
- aic7xxx-$(CONFIG_PCI) += aic7xxx_osm_pci.o
-
- # Core U320 files
-@@ -58,6 +58,13 @@ aicasm-7xxx-opts-$(CONFIG_AIC7XXX_REG_PR
- -p $(obj)/aic7xxx_reg_print.c -i aic7xxx_osm.h
-
- ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y)
-+# Create a dependency chain in generated files
-+# to avoid concurrent invocations of the single
-+# rule that builds them all.
-+aic7xxx_seq.h: aic7xxx_reg.h
-+ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
-+aic7xxx_reg.h: aic7xxx_reg_print.c
-+endif
- $(aic7xxx-gen-y): $(src)/aic7xxx.seq $(src)/aic7xxx.reg $(obj)/aicasm/aicasm
- $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic7xxx_reg.h \
- $(aicasm-7xxx-opts-y) -o $(obj)/aic7xxx_seq.h \
-@@ -72,6 +79,13 @@ aicasm-79xx-opts-$(CONFIG_AIC79XX_REG_PR
- -p $(obj)/aic79xx_reg_print.c -i aic79xx_osm.h
-
- ifeq ($(CONFIG_AIC79XX_BUILD_FIRMWARE),y)
-+# Create a dependency chain in generated files
-+# to avoid concurrent invocations of the single
-+# rule that builds them all.
-+aic79xx_seq.h: aic79xx_reg.h
-+ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
-+aic79xx_reg.h: aic79xx_reg_print.c
-+endif
- $(aic79xx-gen-y): $(src)/aic79xx.seq $(src)/aic79xx.reg $(obj)/aicasm/aicasm
- $(obj)/aicasm/aicasm -I$(src) -r $(obj)/aic79xx_reg.h \
- $(aicasm-79xx-opts-y) -o $(obj)/aic79xx_seq.h \
---- linux-2.6.0/drivers/scsi/aic7xxx_old/aic7xxx_proc.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/aic7xxx_old/aic7xxx_proc.c 2003-12-28 23:21:41.000000000 -0800
-@@ -90,9 +90,7 @@ aic7xxx_proc_info ( struct Scsi_Host *HB
- unsigned char i;
- unsigned char tindex;
-
-- HBAptr = NULL;
--
-- for(p=first_aic7xxx; p->host != HBAptr; p=p->next)
-+ for(p=first_aic7xxx; p && p->host != HBAptr; p=p->next)
- ;
-
- if (!p)
---- linux-2.6.0/drivers/scsi/BusLogic.c 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/scsi/BusLogic.c 2003-12-28 23:22:18.000000000 -0800
-@@ -3462,6 +3462,18 @@ static boolean BusLogic_WriteOutgoingMai
- return false;
- }
-
-+/* Error Handling (EH) support */
-+
-+static int BusLogic_host_reset(Scsi_Cmnd *SCpnt)
-+{
-+ BusLogic_HostAdapter_T *HostAdapter =
-+ (BusLogic_HostAdapter_T *) SCpnt->device->host->hostdata;
-+
-+ /* printk("BusLogic_host_reset\n"); */
-+ HostAdapter->HostAdapterExternalReset = 1;
-+ BusLogic_ResetHostAdapter(HostAdapter, NULL, 0);
-+ return SUCCESS;
-+}
-
- /*
- BusLogic_QueueCommand creates a CCB for Command and places it into an
-@@ -4589,220 +4601,8 @@ static boolean BusLogic_ParseKeyword(cha
- adapters whereas the remaining options apply individually only to the
- selected host adapter.
-
-- The BusLogic Driver Probing Options comprise the following:
--
-- IO:<integer>
--
-- The "IO:" option specifies an ISA I/O Address to be probed for a non-PCI
-- MultiMaster Host Adapter. If neither "IO:" nor "NoProbeISA" options are
-- specified, then the standard list of BusLogic MultiMaster ISA I/O Addresses
-- will be probed (0x330, 0x334, 0x230, 0x234, 0x130, and 0x134). Multiple
-- "IO:" options may be specified to precisely determine the I/O Addresses to
-- be probed, but the probe order will always follow the standard list.
--
-- NoProbe
--
-- The "NoProbe" option disables all probing and therefore no BusLogic Host
-- Adapters will be detected.
--
-- NoProbeISA
--
-- The "NoProbeISA" option disables probing of the standard BusLogic ISA I/O
-- Addresses and therefore only PCI MultiMaster and FlashPoint Host Adapters
-- will be detected.
--
-- NoProbePCI
--
-- The "NoProbePCI" options disables the interrogation of PCI Configuration
-- Space and therefore only ISA Multimaster Host Adapters will be detected, as
-- well as PCI Multimaster Host Adapters that have their ISA Compatible I/O
-- Port set to "Primary" or "Alternate".
--
-- NoSortPCI
--
-- The "NoSortPCI" option forces PCI MultiMaster Host Adapters to be
-- enumerated in the order provided by the PCI BIOS, ignoring any setting of
-- the AutoSCSI "Use Bus And Device # For PCI Scanning Seq." option.
--
-- MultiMasterFirst
--
-- The "MultiMasterFirst" option forces MultiMaster Host Adapters to be probed
-- before FlashPoint Host Adapters. By default, if both FlashPoint and PCI
-- MultiMaster Host Adapters are present, this driver will probe for
-- FlashPoint Host Adapters first unless the BIOS primary disk is controlled
-- by the first PCI MultiMaster Host Adapter, in which case MultiMaster Host
-- Adapters will be probed first.
--
-- FlashPointFirst
--
-- The "FlashPointFirst" option forces FlashPoint Host Adapters to be probed
-- before MultiMaster Host Adapters.
--
-- The BusLogic Driver Tagged Queuing Options allow for explicitly specifying
-- the Queue Depth and whether Tagged Queuing is permitted for each Target
-- Device (assuming that the Target Device supports Tagged Queuing). The Queue
-- Depth is the number of SCSI Commands that are allowed to be concurrently
-- presented for execution (either to the Host Adapter or Target Device). Note
-- that explicitly enabling Tagged Queuing may lead to problems; the option to
-- enable or disable Tagged Queuing is provided primarily to allow disabling
-- Tagged Queuing on Target Devices that do not implement it correctly. The
-- following options are available:
--
-- QueueDepth:<integer>
--
-- The "QueueDepth:" or QD:" option specifies the Queue Depth to use for all
-- Target Devices that support Tagged Queuing, as well as the maximum Queue
-- Depth for devices that do not support Tagged Queuing. If no Queue Depth
-- option is provided, the Queue Depth will be determined automatically based
-- on the Host Adapter's Total Queue Depth and the number, type, speed, and
-- capabilities of the detected Target Devices. For Host Adapters that
-- require ISA Bounce Buffers, the Queue Depth is automatically set by default
-- to BusLogic_TaggedQueueDepthBB or BusLogic_UntaggedQueueDepthBB to avoid
-- excessive preallocation of DMA Bounce Buffer memory. Target Devices that
-- do not support Tagged Queuing always have their Queue Depth set to
-- BusLogic_UntaggedQueueDepth or BusLogic_UntaggedQueueDepthBB, unless a
-- lower Queue Depth option is provided. A Queue Depth of 1 automatically
-- disables Tagged Queuing.
--
-- QueueDepth:[<integer>,<integer>...]
--
-- The "QueueDepth:[...]" or "QD:[...]" option specifies the Queue Depth
-- individually for each Target Device. If an <integer> is omitted, the
-- associated Target Device will have its Queue Depth selected automatically.
--
-- TaggedQueuing:Default
--
-- The "TaggedQueuing:Default" or "TQ:Default" option permits Tagged Queuing
-- based on the firmware version of the BusLogic Host Adapter and based on
-- whether the Queue Depth allows queuing multiple commands.
--
-- TaggedQueuing:Enable
--
-- The "TaggedQueuing:Enable" or "TQ:Enable" option enables Tagged Queuing for
-- all Target Devices on this Host Adapter, overriding any limitation that
-- would otherwise be imposed based on the Host Adapter firmware version.
--
-- TaggedQueuing:Disable
--
-- The "TaggedQueuing:Disable" or "TQ:Disable" option disables Tagged Queuing
-- for all Target Devices on this Host Adapter.
--
-- TaggedQueuing:<Target-Spec>
--
-- The "TaggedQueuing:<Target-Spec>" or "TQ:<Target-Spec>" option controls
-- Tagged Queuing individually for each Target Device. <Target-Spec> is a
-- sequence of "Y", "N", and "X" characters. "Y" enables Tagged Queuing, "N"
-- disables Tagged Queuing, and "X" accepts the default based on the firmware
-- version. The first character refers to Target Device 0, the second to
-- Target Device 1, and so on; if the sequence of "Y", "N", and "X" characters
-- does not cover all the Target Devices, unspecified characters are assumed
-- to be "X".
--
-- The BusLogic Driver Error Recovery Option allows for explicitly specifying
-- the Error Recovery action to be performed when BusLogic_ResetCommand is
-- called due to a SCSI Command failing to complete successfully. The following
-- options are available:
--
-- ErrorRecovery:Default
--
-- The "ErrorRecovery:Default" or "ER:Default" option selects between the Hard
-- Reset and Bus Device Reset options based on the recommendation of the SCSI
-- Subsystem.
--
-- ErrorRecovery:HardReset
--
-- The "ErrorRecovery:HardReset" or "ER:HardReset" option will initiate a Host
-- Adapter Hard Reset which also causes a SCSI Bus Reset.
--
-- ErrorRecovery:BusDeviceReset
--
-- The "ErrorRecovery:BusDeviceReset" or "ER:BusDeviceReset" option will send
-- a Bus Device Reset message to the individual Target Device causing the
-- error. If Error Recovery is again initiated for this Target Device and no
-- SCSI Command to this Target Device has completed successfully since the Bus
-- Device Reset message was sent, then a Hard Reset will be attempted.
--
-- ErrorRecovery:None
--
-- The "ErrorRecovery:None" or "ER:None" option suppresses Error Recovery.
-- This option should only be selected if a SCSI Bus Reset or Bus Device Reset
-- will cause the Target Device or a critical operation to suffer a complete
-- and unrecoverable failure.
--
-- ErrorRecovery:<Target-Spec>
--
-- The "ErrorRecovery:<Target-Spec>" or "ER:<Target-Spec>" option controls
-- Error Recovery individually for each Target Device. <Target-Spec> is a
-- sequence of "D", "H", "B", and "N" characters. "D" selects Default, "H"
-- selects Hard Reset, "B" selects Bus Device Reset, and "N" selects None.
-- The first character refers to Target Device 0, the second to Target Device
-- 1, and so on; if the sequence of "D", "H", "B", and "N" characters does not
-- cover all the possible Target Devices, unspecified characters are assumed
-- to be "D".
--
-- The BusLogic Driver Miscellaneous Options comprise the following:
--
-- BusSettleTime:<seconds>
--
-- The "BusSettleTime:" or "BST:" option specifies the Bus Settle Time in
-- seconds. The Bus Settle Time is the amount of time to wait between a Host
-- Adapter Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI
-- Commands. If unspecified, it defaults to BusLogic_DefaultBusSettleTime.
--
-- InhibitTargetInquiry
--
-- The "InhibitTargetInquiry" option inhibits the execution of an Inquire
-- Target Devices or Inquire Installed Devices command on MultiMaster Host
-- Adapters. This may be necessary with some older Target Devices that do not
-- respond correctly when Logical Units above 0 are addressed.
--
-- The BusLogic Driver Debugging Options comprise the following:
--
-- TraceProbe
--
-- The "TraceProbe" option enables tracing of Host Adapter Probing.
--
-- TraceHardwareReset
--
-- The "TraceHardwareReset" option enables tracing of Host Adapter Hardware
-- Reset.
--
-- TraceConfiguration
--
-- The "TraceConfiguration" option enables tracing of Host Adapter
-- Configuration.
--
-- TraceErrors
--
-- The "TraceErrors" option enables tracing of SCSI Commands that return an
-- error from the Target Device. The CDB and Sense Data will be printed for
-- each SCSI Command that fails.
--
-- Debug
--
-- The "Debug" option enables all debugging options.
--
-- The following examples demonstrate setting the Queue Depth for Target Devices
-- 1 and 2 on the first host adapter to 7 and 15, the Queue Depth for all Target
-- Devices on the second host adapter to 31, and the Bus Settle Time on the
-- second host adapter to 30 seconds.
--
-- Linux Kernel Command Line:
--
-- linux BusLogic=QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30
--
-- LILO Linux Boot Loader (in /etc/lilo.conf):
--
-- append = "BusLogic=QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"
--
-- INSMOD Loadable Kernel Module Installation Facility:
--
-- insmod BusLogic.o \
-- 'BusLogic="QueueDepth:[,7,15];QueueDepth:31,BusSettleTime:30"'
--
-- NOTE: Module Utilities 2.1.71 or later is required for correct parsing
-- of driver options containing commas.
--
-+ The BusLogic Driver Probing Options are described in
-+ <file:Documentation/scsi/BusLogic.txt>.
- */
-
- static int __init BusLogic_ParseDriverOptions(char *OptionsString)
-@@ -5126,6 +4926,7 @@ static SCSI_Host_Template_T driver_templ
- .queuecommand = BusLogic_QueueCommand,
- .slave_configure = BusLogic_SlaveConfigure,
- .bios_param = BusLogic_BIOSDiskParameters,
-+ .eh_host_reset_handler = BusLogic_host_reset,
- .unchecked_isa_dma = 1,
- .max_sectors = 128,
- .use_clustering = ENABLE_CLUSTERING,
---- linux-2.6.0/drivers/scsi/hosts.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/drivers/scsi/hosts.c 2003-12-28 23:22:30.000000000 -0800
-@@ -109,7 +109,7 @@ int scsi_add_host(struct Scsi_Host *shos
- }
-
- if (!shost->shost_gendev.parent)
-- shost->shost_gendev.parent = dev ? dev : &legacy_bus;
-+ shost->shost_gendev.parent = dev ? dev : &platform_bus;
-
- error = device_add(&shost->shost_gendev);
- if (error)
---- linux-2.6.0/drivers/scsi/ide-scsi.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/scsi/ide-scsi.c 2003-12-28 23:21:17.000000000 -0800
-@@ -636,24 +636,23 @@ static ide_driver_t idescsi_driver = {
- .drives = LIST_HEAD_INIT(idescsi_driver.drives),
- };
-
--static int idescsi_ide_open(struct inode *inode, struct file *filp)
-+static int idescsi_ide_open(struct block_device *bdev, struct file *filp)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = bdev->bd_disk->private_data;
- drive->usage++;
- return 0;
- }
-
--static int idescsi_ide_release(struct inode *inode, struct file *filp)
-+static int idescsi_ide_release(struct gendisk *disk)
- {
-- ide_drive_t *drive = inode->i_bdev->bd_disk->private_data;
-+ ide_drive_t *drive = disk->private_data;
- drive->usage--;
- return 0;
- }
-
--static int idescsi_ide_ioctl(struct inode *inode, struct file *file,
-+static int idescsi_ide_ioctl(struct block_device *bdev, struct file *file,
- unsigned int cmd, unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- return generic_ide_ioctl(bdev, cmd, arg);
- }
-
---- linux-2.6.0/drivers/scsi/Kconfig 2003-11-23 19:03:01.000000000 -0800
-+++ 25/drivers/scsi/Kconfig 2003-12-28 23:21:49.000000000 -0800
-@@ -55,6 +55,14 @@ config BLK_DEV_SD
- In this case, do not compile the driver for your SCSI host adapter
- (below) as a module either.
-
-+config MAX_SD_DISKS
-+ int "Maximum number of SCSI disks to support (256-8192)"
-+ depends on BLK_DEV_SD
-+ default "256"
-+ help
-+ The maximum number SCSI disks to support. Default is 256.
-+ Change this value if you want kernel to support lots of SCSI devices.
-+
- config CHR_DEV_ST
- tristate "SCSI tape support"
- depends on SCSI
-@@ -911,37 +919,34 @@ config SCSI_SYM53C8XX_DMA_ADDRESSING_MOD
- depends on SCSI_SYM53C8XX_2
- default "1"
- ---help---
-- This option only applies to PCI-SCSI chip that are PCI DAC capable
-- (875A, 895A, 896, 1010-33, 1010-66, 1000).
-+ This option only applies to PCI-SCSI chips that are PCI DAC
-+ capable (875A, 895A, 896, 1010-33, 1010-66, 1000).
-
-- When set to 0, only PCI 32 bit DMA addressing (SAC) will be performed.
-- When set to 1, 40 bit DMA addressing (with upper 24 bits of address
-- set to zero) is supported. The addressable range is here 1 TB.
-- When set to 2, full 64 bits of address for DMA are supported, but only
-- 16 segments of 4 GB can be addressed. The addressable range is so
-- limited to 64 GB.
--
-- The safest value is 0 (32 bit DMA addressing) that is guessed to still
-- fit most of real machines.
--
-- The preferred value 1 (40 bit DMA addressing) should make happy
-- properly engineered PCI DAC capable host bridges. You may configure
-- this option for Intel platforms with more than 4 GB of memory.
--
-- The still experimental value 2 (64 bit DMA addressing with 16 x 4GB
-- segments limitation) can be used on systems that require PCI address
-- bits past bit 39 to be set for the addressing of memory using PCI
-- DAC cycles.
-+ When set to 0, the driver will program the chip to only perform
-+ 32-bit DMA. When set to 1, the chip will be able to perform DMA
-+ to addresses up to 1TB. When set to 2, the driver supports the
-+ full 64-bit DMA address range, but can only address 16 segments
-+ of 4 GB each. This limits the total addressable range to 64 GB.
-+
-+ Most machines with less than 4GB of memory should use a setting
-+ of 0 for best performance. If your machine has 4GB of memory
-+ or more, you should set this option to 1 (the default).
-+
-+ The still experimental value 2 (64 bit DMA addressing with 16
-+ x 4GB segments limitation) can be used on systems that require
-+ PCI address bits past bit 39 to be set for the addressing of
-+ memory using PCI DAC cycles.
-
- config SCSI_SYM53C8XX_DEFAULT_TAGS
- int "default tagged command queue depth"
- depends on SCSI_SYM53C8XX_2
- default "16"
- help
-- This is the default value of the command queue depth the driver will
-- announce to the generic SCSI layer for devices that support tagged
-- command queueing. This value can be changed from the boot command line.
-- This is a soft limit that cannot exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
-+ This is the default value of the command queue depth the
-+ driver will announce to the generic SCSI layer for devices
-+ that support tagged command queueing. This value can be changed
-+ from the boot command line. This is a soft limit that cannot
-+ exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
-
- config SCSI_SYM53C8XX_MAX_TAGS
- int "maximum number of queued commands"
-@@ -954,11 +959,12 @@ config SCSI_SYM53C8XX_MAX_TAGS
- This value is used as a compiled-in hard limit.
-
- config SCSI_SYM53C8XX_IOMAPPED
-- bool "use normal IO"
-+ bool "use port IO"
- depends on SCSI_SYM53C8XX_2
- help
-- If you say Y here, the driver will preferently use normal IO rather than
-- memory mapped IO.
-+ If you say Y here, the driver will use port IO to access
-+ the card. This is significantly slower then using memory
-+ mapped IO. Most people should answer N.
-
- config SCSI_ZALON
- tristate "Zalon SCSI support"
---- linux-2.6.0/drivers/scsi/pcmcia/aha152x_stub.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/scsi/pcmcia/aha152x_stub.c 2003-12-28 23:22:54.000000000 -0800
-@@ -153,7 +153,7 @@ static dev_link_t *aha152x_attach(void)
- CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- aha152x_detach(link);
-@@ -181,7 +181,7 @@ static void aha152x_detach(dev_link_t *l
- aha152x_release_cs(link);
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-@@ -191,11 +191,8 @@ static void aha152x_detach(dev_link_t *l
-
- /*====================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void aha152x_config_cs(dev_link_t *link)
- {
-@@ -214,19 +211,20 @@ static void aha152x_config_cs(dev_link_t
- tuple.TupleData = tuple_data;
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
- /* For New Media T&J, look for a SCSI window */
- if (parse.cftable_entry.io.win[0].len >= 0x20)
- link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
-@@ -236,15 +234,15 @@ static void aha152x_config_cs(dev_link_t
- if ((parse.cftable_entry.io.nwin > 0) &&
- (link->io.BasePort1 < 0xffff)) {
- link->conf.ConfigIndex = parse.cftable_entry.index;
-- i = CardServices(RequestIO, handle, &link->io);
-+ i = pcmcia_request_io(handle, &link->io);
- if (i == CS_SUCCESS) break;
- }
- next_entry:
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- /* A bad hack... */
- release_region(link->io.BasePort1, link->io.NumPorts1);
-@@ -291,9 +289,9 @@ static void aha152x_release_cs(dev_link_
- scsi_remove_host(info->host);
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- link->state &= ~DEV_CONFIG;
- scsi_unregister(info->host);
-@@ -322,7 +320,7 @@ static int aha152x_event(event_t event,
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
-@@ -330,7 +328,7 @@ static int aha152x_event(event_t event,
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
- Scsi_Cmnd tmp;
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- tmp.device->host = info->host;
- aha152x_host_reset(&tmp);
- }
---- linux-2.6.0/drivers/scsi/pcmcia/fdomain_stub.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/scsi/pcmcia/fdomain_stub.c 2003-12-28 23:22:54.000000000 -0800
-@@ -142,7 +142,7 @@ static dev_link_t *fdomain_attach(void)
- CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- fdomain_detach(link);
-@@ -170,7 +170,7 @@ static void fdomain_detach(dev_link_t *l
- fdomain_release(link);
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-@@ -180,11 +180,8 @@ static void fdomain_detach(dev_link_t *l
-
- /*====================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void fdomain_config(dev_link_t *link)
- {
-@@ -203,29 +200,30 @@ static void fdomain_config(dev_link_t *l
- tuple.TupleData = tuple_data;
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
- link->conf.ConfigIndex = parse.cftable_entry.index;
- link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
-- i = CardServices(RequestIO, handle, &link->io);
-+ i = pcmcia_request_io(handle, &link->io);
- if (i == CS_SUCCESS) break;
- next_entry:
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- /* A bad hack... */
- release_region(link->io.BasePort1, link->io.NumPorts1);
-@@ -271,9 +269,9 @@ static void fdomain_release(dev_link_t *
- scsi_remove_host(info->host);
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- scsi_unregister(info->host);
-
-@@ -304,14 +302,14 @@ static int fdomain_event(event_t event,
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- fdomain_16x0_bus_reset(NULL);
- }
- break;
---- linux-2.6.0/drivers/scsi/pcmcia/nsp_cs.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/scsi/pcmcia/nsp_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -1681,7 +1681,7 @@ static dev_link_t *nsp_cs_attach(void)
- client_reg.event_handler = &nsp_cs_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- nsp_cs_detach(link);
-@@ -1721,7 +1721,7 @@ static void nsp_cs_detach(dev_link_t *li
-
- /* Break the link with Card Services */
- if (link->handle) {
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
- }
-
- /* Unlink device structure, free bits */
-@@ -1737,10 +1737,8 @@ static void nsp_cs_detach(dev_link_t *li
- is received, to configure the PCMCIA socket, and to make the
- ethernet device available to the system.
- ======================================================================*/
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn),args))!=0) goto cs_failed
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
- /*====================================================================*/
- static void nsp_cs_config(dev_link_t *link)
- {
-@@ -1768,9 +1766,9 @@ static void nsp_cs_config(dev_link_t *li
- tuple.TupleData = tuple_data;
- tuple.TupleDataMax = sizeof(tuple_data);
- tuple.TupleOffset = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
-
-@@ -1778,16 +1776,17 @@ static void nsp_cs_config(dev_link_t *li
- link->state |= DEV_CONFIG;
-
- /* Look up the current Vcc */
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
- cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
-
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
-
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; }
- if (cfg->index == 0) { goto next_entry; }
-@@ -1842,7 +1841,8 @@ static void nsp_cs_config(dev_link_t *li
- link->io.NumPorts2 = io->win[1].len;
- }
- /* This reserves IO space but doesn't actually enable it */
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
- }
-
- if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
-@@ -1856,10 +1856,11 @@ static void nsp_cs_config(dev_link_t *li
- req.Size = 0x1000;
- }
- req.AccessSpeed = 0;
-- link->win = (window_handle_t)link->handle;
-- CFG_CHECK(RequestWindow, &link->win, &req);
-+ if (pcmcia_request_window(&link->handle, &req, &link->win) != 0)
-+ goto next_entry;
- map.Page = 0; map.CardOffset = mem->win[0].card_addr;
-- CFG_CHECK(MapMemPage, link->win, &map);
-+ if (pcmcia_map_mem_page(link->win, &map) != 0)
-+ goto next_entry;
-
- data->MmioAddress = (unsigned long)ioremap_nocache(req.Base, req.Size);
- data->MmioLength = req.Size;
-@@ -1871,15 +1872,15 @@ static void nsp_cs_config(dev_link_t *li
- nsp_dbg(NSP_DEBUG_INIT, "next");
-
- if (link->io.NumPorts1) {
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- }
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
- if (link->conf.Attributes & CONF_ENABLE_IRQ) {
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
- }
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- if (free_ports) {
- if (link->io.BasePort1) {
-@@ -2007,7 +2008,6 @@ static void nsp_cs_config(dev_link_t *li
- return;
- } /* nsp_cs_config */
- #undef CS_CHECK
--#undef CFG_CHECK
-
-
- /*======================================================================
-@@ -2042,14 +2042,14 @@ static void nsp_cs_release(dev_link_t *l
- if (data != NULL) {
- iounmap((void *)(data->MmioAddress));
- }
-- CardServices(ReleaseWindow, link->win);
-+ pcmcia_release_window(link->win);
- }
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- if (link->io.NumPorts1) {
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_io(link->handle, &link->io);
- }
- if (link->irq.AssignedIRQ) {
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_irq(link->handle, &link->irq);
- }
- link->state &= ~DEV_CONFIG;
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
-@@ -2119,7 +2119,7 @@ static int nsp_cs_event(event_t
-
- info->stop = 1;
- if (link->state & DEV_CONFIG) {
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- }
- break;
-
-@@ -2130,7 +2130,7 @@ static int nsp_cs_event(event_t
- case CS_EVENT_CARD_RESET:
- nsp_dbg(NSP_DEBUG_INIT, "event: reset");
- if (link->state & DEV_CONFIG) {
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- }
- info->stop = 0;
-
-@@ -2177,7 +2177,7 @@ static int __init nsp_cs_init(void)
- servinfo_t serv;
-
- nsp_msg(KERN_INFO, "loading...");
-- CardServices(GetCardServicesInfo, &serv);
-+ pcmcia_get_card_services_info(&serv);
- if (serv.Revision != CS_RELEASE_CODE) {
- nsp_msg(KERN_DEBUG, "Card Services release does not match!");
- return -EINVAL;
---- linux-2.6.0/drivers/scsi/pcmcia/nsp_cs.h 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/scsi/pcmcia/nsp_cs.h 2003-12-28 23:22:54.000000000 -0800
-@@ -457,7 +457,7 @@ static inline struct Scsi_Host *scsi_hos
- static void cs_error(client_handle_t handle, int func, int ret)
- {
- error_info_t err = { func, ret };
-- CardServices(ReportError, handle, &err);
-+ pcmcia_report_error(handle, &err);
- }
-
- /* scatter-gather table */
---- linux-2.6.0/drivers/scsi/pcmcia/qlogic_stub.c 2003-08-22 19:23:41.000000000 -0700
-+++ 25/drivers/scsi/pcmcia/qlogic_stub.c 2003-12-28 23:22:54.000000000 -0800
-@@ -140,7 +140,7 @@ static dev_link_t *qlogic_attach(void)
- client_reg.EventMask = CS_EVENT_RESET_REQUEST | CS_EVENT_CARD_RESET | CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != 0) {
- cs_error(link->handle, RegisterClient, ret);
- qlogic_detach(link);
-@@ -169,7 +169,7 @@ static void qlogic_detach(dev_link_t * l
- qlogic_release(link);
-
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- /* Unlink device structure, free bits */
- *linkp = link->next;
-@@ -179,11 +179,8 @@ static void qlogic_detach(dev_link_t * l
-
- /*====================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void qlogic_config(dev_link_t * link)
- {
-@@ -201,37 +198,38 @@ static void qlogic_config(dev_link_t * l
- tuple.TupleDataMax = 64;
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
-
- tuple.DesiredTuple = CISTPL_MANFID;
-- if ((CardServices(GetFirstTuple, handle, &tuple) == CS_SUCCESS) && (CardServices(GetTupleData, handle, &tuple) == CS_SUCCESS))
-+ if ((pcmcia_get_first_tuple(handle, &tuple) == CS_SUCCESS) && (pcmcia_get_tuple_data(handle, &tuple) == CS_SUCCESS))
- info->manf_id = le16_to_cpu(tuple.TupleData[0]);
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
- link->conf.ConfigIndex = parse.cftable_entry.index;
- link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
- link->io.NumPorts1 = parse.cftable_entry.io.win[0].len;
- if (link->io.BasePort1 != 0) {
-- i = CardServices(RequestIO, handle, &link->io);
-+ i = pcmcia_request_io(handle, &link->io);
- if (i == CS_SUCCESS)
- break;
- }
- next_entry:
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
-- CS_CHECK(RequestIRQ, handle, &link->irq);
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {
- /* set ATAcmd */
-@@ -284,9 +282,9 @@ static void qlogic_release(dev_link_t *l
- scsi_remove_host(info->host);
- link->dev = NULL;
-
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
-
- scsi_unregister(info->host);
-
-@@ -316,7 +314,7 @@ static int qlogic_event(event_t event, i
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
-@@ -324,7 +322,7 @@ static int qlogic_event(event_t event, i
- case CS_EVENT_CARD_RESET:
- if (link->state & DEV_CONFIG) {
- scsi_info_t *info = link->priv;
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {
- outb(0x80, link->io.BasePort1 + 0xd);
- outb(0x24, link->io.BasePort1 + 0x9);
---- linux-2.6.0/drivers/scsi/qla1280.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/drivers/scsi/qla1280.c 2003-12-28 23:21:38.000000000 -0800
-@@ -4,6 +4,7 @@
- * QLogic QLA1280 (Ultra2) and QLA12160 (Ultra3) SCSI driver
- * Copyright (C) 2000 Qlogic Corporation (www.qlogic.com)
- * Copyright (C) 2001-2003 Jes Sorensen, Wild Open Source Inc.
-+* Copyright (C) 2003 Christoph Hellwig
- *
- * 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
-@@ -16,13 +17,17 @@
- * General Public License for more details.
- *
- ******************************************************************************/
--#define QLA1280_VERSION "3.23.37.1"
-+#define QLA1280_VERSION "3.23.38.1"
- /*****************************************************************************
- Revision History:
- Rev 3.23.37.1 December 17, 2003, Jes Sorensen
- - Delete completion queue from srb if mailbox command failed to
- to avoid qla1280_done completeting qla1280_error_action's
- obsolete context
-+ Rev 3.23.38 October 18, 2003, Christoph Hellwig
-+ - Convert to new-style hotplugable driver for 2.6
-+ - Fix missing scsi_unregister/scsi_host_put on HBA removal
-+ - Kill some of cruft
- Rev 3.23.37 October 1, 2003, Jes Sorensen
- - Make MMIO depend on CONFIG_X86_VISWS instead of yet another
- random CONFIG option
-@@ -341,9 +346,6 @@
- * Compile time Options:
- * 0 - Disable and 1 - Enable
- */
--#define QL1280_LUN_SUPPORT 0
--#define WATCHDOGTIMER 0
--
- #define DEBUG_QLA1280_INTR 0
- #define DEBUG_PRINT_NVRAM 0
- #define DEBUG_QLA1280 0
-@@ -423,6 +425,14 @@ scsi_adjust_queue_depth(Scsi_Device *dev
- }
- device->queue_depth = depth;
- }
-+static inline struct Scsi_Host *scsi_host_alloc(Scsi_Host_Template *t, size_t s)
-+{
-+ return scsi_register(t, s);
-+}
-+static inline void scsi_host_put(struct Scsi_Host *h)
-+{
-+ scsi_unregister(h);
-+}
- #else
- #define HOST_LOCK ha->host->host_lock
- #endif
-@@ -435,30 +445,23 @@ scsi_adjust_queue_depth(Scsi_Device *dev
- #define ia64_platform_is(foo) (!strcmp(x, platform_name))
- #endif
-
-+static int qla1280_probe_one(struct pci_dev *, const struct pci_device_id *);
-+static void qla1280_remove_one(struct pci_dev *);
-+
- /*
- * QLogic Driver Support Function Prototypes.
- */
- static void qla1280_done(struct scsi_qla_host *, struct srb **, struct srb **);
--static void qla1280_done_q_put(struct srb *, struct srb **, struct srb **);
--static int qla1280_slave_configure(Scsi_Device *);
- #if LINUX_VERSION_CODE < 0x020545
--static void qla1280_select_queue_depth(struct Scsi_Host *, Scsi_Device *);
- static void qla1280_get_target_options(struct scsi_cmnd *, struct scsi_qla_host *);
- #endif
--
--static int qla1280_return_status(struct response * sts, Scsi_Cmnd * cp);
--static void qla1280_mem_free(struct scsi_qla_host *ha);
- static int qla1280_get_token(char *);
- static int qla1280_setup(char *s) __init;
--static inline void qla1280_enable_intrs(struct scsi_qla_host *);
--static inline void qla1280_disable_intrs(struct scsi_qla_host *);
-
- /*
- * QLogic ISP1280 Hardware Support Function Prototypes.
- */
--static int qla1280_initialize_adapter(struct scsi_qla_host *ha);
- static int qla1280_isp_firmware(struct scsi_qla_host *);
--static int qla1280_pci_config(struct scsi_qla_host *);
- static int qla1280_chip_diag(struct scsi_qla_host *);
- static int qla1280_setup_chip(struct scsi_qla_host *);
- static int qla1280_init_rings(struct scsi_qla_host *);
-@@ -477,7 +480,6 @@ static void qla1280_poll(struct scsi_qla
- static void qla1280_reset_adapter(struct scsi_qla_host *);
- static void qla1280_marker(struct scsi_qla_host *, int, int, int, u8);
- static void qla1280_isp_cmd(struct scsi_qla_host *);
--irqreturn_t qla1280_intr_handler(int, void *, struct pt_regs *);
- static void qla1280_isr(struct scsi_qla_host *, struct srb **, struct srb **);
- static void qla1280_rst_aen(struct scsi_qla_host *);
- static void qla1280_status_entry(struct scsi_qla_host *, struct response *,
-@@ -490,11 +492,9 @@ static uint16_t qla1280_debounce_registe
- static request_t *qla1280_req_pkt(struct scsi_qla_host *);
- static int qla1280_check_for_dead_scsi_bus(struct scsi_qla_host *,
- unsigned int);
--static int qla1280_mem_alloc(struct scsi_qla_host *ha);
--
--static void qla12160_get_target_parameters(struct scsi_qla_host *,
-+static void qla1280_get_target_parameters(struct scsi_qla_host *,
- Scsi_Device *);
--static int qla12160_set_target_parameters(struct scsi_qla_host *, int, int);
-+static int qla1280_set_target_parameters(struct scsi_qla_host *, int, int);
-
-
- static struct qla_driver_setup driver_setup __initdata;
-@@ -529,10 +529,6 @@ qla1280_data_direction(struct scsi_cmnd
- return flags;
- }
-
--#if QL1280_LUN_SUPPORT
--static void qla1280_enable_lun(struct scsi_qla_host *, int, int);
--#endif
--
- #if DEBUG_QLA1280
- static void __qla1280_print_scsi_cmd(Scsi_Cmnd * cmd);
- static void __qla1280_dump_buffer(char *, int);
-@@ -551,8 +547,6 @@ MODULE_PARM(qla1280, "s");
- __setup("qla1280=", qla1280_setup);
- #endif
-
--MODULE_LICENSE("GPL");
--
-
- /* We use the Scsi_Pointer structure that's included with each command
- * SCSI_Cmnd as a scratchpad for our SRB.
-@@ -576,28 +570,23 @@ MODULE_LICENSE("GPL");
- #define CMD_RESULT(Cmnd) Cmnd->result
- #define CMD_HANDLE(Cmnd) Cmnd->host_scribble
- #if LINUX_VERSION_CODE < 0x020545
--#define CMD_HOST(Cmnd) Cmnd->host
- #define CMD_REQUEST(Cmnd) Cmnd->request.cmd
--#define SCSI_BUS_32(Cmnd) Cmnd->channel
--#define SCSI_TCN_32(Cmnd) Cmnd->target
--#define SCSI_LUN_32(Cmnd) Cmnd->lun
- #else
--#define CMD_HOST(Cmnd) Cmnd->device->host
- #define CMD_REQUEST(Cmnd) Cmnd->request->cmd
-+#endif
-+
-+#define CMD_HOST(Cmnd) Cmnd->device->host
- #define SCSI_BUS_32(Cmnd) Cmnd->device->channel
- #define SCSI_TCN_32(Cmnd) Cmnd->device->id
- #define SCSI_LUN_32(Cmnd) Cmnd->device->lun
--#endif
-+
-
- /*****************************************/
- /* ISP Boards supported by this driver */
- /*****************************************/
-
--#define NUM_OF_ISP_DEVICES 6
--
- struct qla_boards {
- unsigned char name[9]; /* Board ID String */
-- unsigned long device_id; /* Device PCI ID */
- int numPorts; /* Number of SCSI ports */
- unsigned short *fwcode; /* pointer to FW array */
- unsigned short *fwlen; /* number of words in array */
-@@ -605,28 +594,38 @@ struct qla_boards {
- unsigned char *fwver; /* Ptr to F/W version array */
- };
-
--struct qla_boards ql1280_board_tbl[NUM_OF_ISP_DEVICES] = {
-- /* Name , Board PCI Device ID, Number of ports */
-- {"QLA12160", PCI_DEVICE_ID_QLOGIC_ISP12160, 2,
-- &fw12160i_code01[0], &fw12160i_length01,
-+/* NOTE: qla1280_pci_tbl and ql1280_board_tbl must be in the same order */
-+static struct pci_device_id qla1280_pci_tbl[] = {
-+ {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP12160,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-+ {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1080,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
-+ {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1240,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
-+ {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP1280,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
-+ {PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP10160,
-+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
-+ {0,}
-+};
-+MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl);
-+
-+static struct qla_boards ql1280_board_tbl[] = {
-+ /* Name , Number of ports, FW details */
-+ {"QLA12160", 2, &fw12160i_code01[0], &fw12160i_length01,
- &fw12160i_addr01, &fw12160i_version_str[0]},
-- {"QLA1080", PCI_DEVICE_ID_QLOGIC_ISP1080, 1,
-- &fw1280ei_code01[0], &fw1280ei_length01,
-+ {"QLA1080", 1, &fw1280ei_code01[0], &fw1280ei_length01,
- &fw1280ei_addr01, &fw1280ei_version_str[0]},
-- {"QLA1240", PCI_DEVICE_ID_QLOGIC_ISP1240, 2,
-- &fw1280ei_code01[0], &fw1280ei_length01,
-+ {"QLA1240", 2, &fw1280ei_code01[0], &fw1280ei_length01,
- &fw1280ei_addr01, &fw1280ei_version_str[0]},
-- {"QLA1280", PCI_DEVICE_ID_QLOGIC_ISP1280, 2,
-- &fw1280ei_code01[0], &fw1280ei_length01,
-+ {"QLA1280", 2, &fw1280ei_code01[0], &fw1280ei_length01,
- &fw1280ei_addr01, &fw1280ei_version_str[0]},
-- {"QLA10160", PCI_DEVICE_ID_QLOGIC_ISP10160, 1,
-- &fw12160i_code01[0], &fw12160i_length01,
-+ {"QLA10160", 1, &fw12160i_code01[0], &fw12160i_length01,
- &fw12160i_addr01, &fw12160i_version_str[0]},
-- {" ", 0, 0}
-+ {" ", 0}
- };
-
- static int qla1280_verbose = 1;
--static struct scsi_qla_host *qla1280_hostlist;
- static int qla1280_buffer_size;
- static char *qla1280_buffer;
-
-@@ -675,31 +674,19 @@ static int qla1280_proc_info(struct Scsi
- int size = 0;
- int len = 0;
- struct qla_boards *bdp;
--#ifdef BOGUS_QUEUE
-- struct scsi_lu *up;
-- uint32_t b, t, l;
--#endif
--#if LINUX_VERSION_CODE >= 0x020600
-- ha = (struct scsi_qla_host *)host->hostdata;
--#else
-+#if LINUX_VERSION_CODE < 0x020600
- struct Scsi_Host *host;
-- /* Find the host that was specified */
-- for (ha = qla1280_hostlist; (ha != NULL)
-- && ha->host->host_no != hostno; ha = ha->next) ;
--
-- /* if host wasn't found then exit */
-- if (!ha) {
-- size = sprintf(buffer, "Can't find adapter for host "
-- "number %d\n", hostno);
-- if (size > length) {
-- return size;
-- } else {
-- return 0;
-- }
-+
-+ for (host = scsi_hostlist; host; host = host->next) {
-+ if (host->host_no == hostno)
-+ goto found;
- }
-
-- host = ha->host;
-+ return -ESRCH;
-+
-+ found:
- #endif
-+ ha = (struct scsi_qla_host *)host->hostdata;
-
- if (inout)
- return -ENOSYS;
-@@ -753,51 +740,6 @@ static int qla1280_proc_info(struct Scsi
- size = sprintf(PROC_BUF, "\n"); /* 1 */
- len += size;
-
-- size = sprintf(PROC_BUF, "SCSI device Information:\n");
-- len += size;
--#ifdef BOGUS_QUEUE
-- /* scan for all equipment stats */
-- for (b = 0; b < MAX_BUSES; b++)
-- for (t = 0; t < MAX_TARGETS; t++) {
-- for (l = 0; l < MAX_LUNS; l++) {
-- up = LU_Q(ha, b, t, l);
-- if (up == NULL)
-- continue;
-- /* unused device/lun */
-- if (up->io_cnt == 0 || up->io_cnt < 2)
-- continue;
-- /* total reads since boot */
-- /* total writes since boot */
-- /* total requests since boot */
-- size = sprintf (PROC_BUF,
-- "(%2d:%2d:%2d): Total reqs %ld,",
-- b, t, l, up->io_cnt);
-- len += size;
-- /* current number of pending requests */
-- size = sprintf(PROC_BUF, " Pend reqs %d,",
-- up->q_outcnt);
-- len += size;
--#if 0
-- /* avg response time */
-- size = sprintf(PROC_BUF, " Avg resp time %ld%%,",
-- (up->resp_time / up->io_cnt) *
-- 100);
-- len += size;
--
-- /* avg active time */
-- size = sprintf(PROC_BUF,
-- " Avg active time %ld%%\n",
-- (up->act_time / up->io_cnt) * 100);
--#else
-- size = sprintf(PROC_BUF, "\n");
--#endif
-- len += size;
-- }
-- if (len >= qla1280_buffer_size)
-- break;
-- }
--#endif
--
- if (len >= qla1280_buffer_size) {
- printk(KERN_WARNING
- "qla1280: Overflow buffer in qla1280_proc.c\n");
-@@ -875,312 +817,6 @@ static int qla1280_read_nvram(struct scs
- return chksum;
- }
-
--
--/**************************************************************************
-- * qla1280_do_device_init
-- * This routine will register the device with the SCSI subsystem,
-- * initialize the host adapter structure and call the device init
-- * routines.
-- *
-- * Input:
-- * pdev - pointer to struct pci_dev for adapter
-- * template - pointer to SCSI template
-- * devnum - the device number
-- * bdp - pointer to struct _qlaboards
-- * num_hosts - the host number
-- *
-- * Returns:
-- * host - pointer to SCSI host structure
-- **************************************************************************/
--struct Scsi_Host *
--qla1280_do_device_init(struct pci_dev *pdev, Scsi_Host_Template * template,
-- int devnum, struct qla_boards *bdp, int num_hosts)
--{
-- struct Scsi_Host *host;
-- struct scsi_qla_host *ha;
--
-- printk(KERN_INFO "qla1280: %s found on PCI bus %i, dev %i\n",
-- bdp->name, pdev->bus->number, PCI_SLOT(pdev->devfn));
--
-- host = scsi_register(template, sizeof(struct scsi_qla_host));
-- if (!host) {
-- printk(KERN_WARNING
-- "qla1280: Failed to register host, aborting.\n");
-- goto error;
-- }
--
--#if LINUX_VERSION_CODE < 0x020545
-- scsi_set_pci_device(host, pdev);
--#else
-- scsi_set_device(host, &pdev->dev);
--#endif
-- ha = (struct scsi_qla_host *)host->hostdata;
-- /* Clear our data area */
-- memset(ha, 0, sizeof(struct scsi_qla_host));
-- /* Sanitize the information from PCI BIOS. */
-- host->irq = pdev->irq;
-- ha->pci_bus = pdev->bus->number;
-- ha->pci_device_fn = pdev->devfn;
-- ha->pdev = pdev;
-- ha->device_id = bdp->device_id;
-- ha->devnum = devnum; /* specifies microcode load address */
--
-- if (qla1280_mem_alloc(ha)) {
-- printk(KERN_INFO "qla1x160: Failed to get memory\n");
-- goto error_scsi_unregister;
-- }
--
-- ha->ports = bdp->numPorts;
-- /* following needed for all cases of OS versions */
-- ha->host = host;
-- ha->host_no = host->host_no;
--
-- host->can_queue = 0xfffff; /* unlimited */
-- host->cmd_per_lun = 1;
-- host->base = (unsigned long)ha->mmpbase;
-- host->max_channel = bdp->numPorts - 1;
-- host->max_lun = MAX_LUNS - 1;
-- host->max_id = MAX_TARGETS;
-- host->max_sectors = 1024;
--#if LINUX_VERSION_CODE < 0x020545
-- host->select_queue_depths = qla1280_select_queue_depth;
--#endif
--
-- ha->instance = num_hosts;
-- host->unique_id = ha->instance;
--
-- if (qla1280_pci_config(ha)) {
-- printk(KERN_INFO "qla1x160: Unable to configure PCI\n");
-- goto error_mem_alloced;
-- }
--
-- /* Disable ISP interrupts. */
-- qla1280_disable_intrs(ha);
--
-- /* Register the IRQ with Linux (sharable) */
-- if (request_irq(host->irq, qla1280_intr_handler, SA_SHIRQ,
-- "qla1280", ha)) {
-- printk("qla1280 : Failed to reserve interrupt %d already "
-- "in use\n", host->irq);
-- goto error_iounmap;
-- }
--#if !MEMORY_MAPPED_IO
-- /* Register the I/O space with Linux */
-- if (!request_region(host->io_port, 0xff, "qla1280")) {
-- printk("qla1280: Failed to reserve i/o region 0x%04lx-0x%04lx"
-- " already in use\n",
-- host->io_port, host->io_port + 0xff);
-- goto error_free_irq;
-- }
--#endif
--
-- /* load the F/W, read paramaters, and init the H/W */
-- if (qla1280_initialize_adapter(ha)) {
-- printk(KERN_INFO "qla1x160: Failed to initialize adapter\n");
-- goto error_release_region;
-- }
--
-- /* set our host ID (need to do something about our two IDs) */
-- host->this_id = ha->bus_settings[0].id;
--
-- return host;
--
-- error_release_region:
--#if !MEMORY_MAPPED_IO
-- release_region(host->io_port, 0xff);
-- error_free_irq:
--#endif
-- free_irq(host->irq, ha);
-- error_iounmap:
--#if MEMORY_MAPPED_IO
-- if (ha->mmpbase)
-- iounmap((void *)(((unsigned long) ha->mmpbase) & PAGE_MASK));
--#endif
-- error_mem_alloced:
-- qla1280_mem_free(ha);
-- error_scsi_unregister:
-- scsi_unregister(host);
-- error:
-- return NULL;
--}
--
--/**************************************************************************
-- * qla1280_detect
-- * This routine will probe for Qlogic 1280 SCSI host adapters.
-- * It returns the number of host adapters of a particular
-- * type that were found. It also initialize all data necessary for
-- * the driver. It is passed-in the host number, so that it
-- * knows where its first entry is in the scsi_hosts[] array.
-- *
-- * Input:
-- * template - pointer to SCSI template
-- *
-- * Returns:
-- * num - number of host adapters found.
-- **************************************************************************/
--static int
--qla1280_detect(Scsi_Host_Template * template)
--{
-- struct pci_dev *pdev = NULL;
-- struct Scsi_Host *host;
-- struct scsi_qla_host *ha, *cur_ha;
-- struct qla_boards *bdp;
-- uint16_t subsys_vendor, subsys_device;
-- int num_hosts = 0;
-- int devnum = 0;
--
-- ENTER("qla1280_detect");
--
-- if (sizeof(struct srb) > sizeof(Scsi_Pointer)) {
-- printk(KERN_WARNING
-- "qla1280_detect: [WARNING] struct srb too big\n");
-- return 0;
-- }
--#ifdef MODULE
-- /*
-- * If we are called as a module, the qla1280 pointer may not be null
-- * and it would point to our bootup string, just like on the lilo
-- * command line. IF not NULL, then process this config string with
-- * qla1280_setup
-- *
-- * Boot time Options
-- * To add options at boot time add a line to your lilo.conf file like:
-- * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}"
-- * which will result in the first four devices on the first two
-- * controllers being set to a tagged queue depth of 32.
-- */
-- if (qla1280)
-- qla1280_setup(qla1280);
--#endif
--
-- bdp = &ql1280_board_tbl[0];
-- qla1280_hostlist = NULL;
-- template->proc_name = "qla1280";
--
-- /* First Initialize QLA12160 on PCI Bus 1 Dev 2 */
-- while ((pdev = pci_find_subsys(PCI_VENDOR_ID_QLOGIC, bdp->device_id,
-- PCI_ANY_ID, PCI_ANY_ID, pdev))) {
--
-- /* find QLA12160 device on PCI bus=1 slot=2 */
-- if ((pdev->bus->number != 1) || (PCI_SLOT(pdev->devfn) != 2))
-- continue;
--
-- /* Bypass all AMI SUBSYS VENDOR IDs */
-- if (pdev->subsystem_vendor == PCI_VENDOR_ID_AMI) {
-- printk(KERN_INFO
-- "qla1x160: Skip AMI SubSys Vendor ID Chip\n");
-- continue;
-- }
--
-- if (pci_enable_device(pdev))
-- goto find_devices;
--
-- host = qla1280_do_device_init(pdev, template, devnum,
-- bdp, num_hosts);
-- if (!host)
-- continue;
-- ha = (struct scsi_qla_host *)host->hostdata;
--
-- /* this preferred device will always be the first one found */
-- cur_ha = qla1280_hostlist = ha;
-- num_hosts++;
-- }
--
-- find_devices:
--
-- pdev = NULL;
-- /* Try and find each different type of adapter we support */
-- for (devnum = 0; bdp->device_id != 0 && devnum < NUM_OF_ISP_DEVICES;
-- devnum++, bdp++) {
-- /* PCI_SUBSYSTEM_IDS supported */
-- while ((pdev = pci_find_subsys(PCI_VENDOR_ID_QLOGIC,
-- bdp->device_id, PCI_ANY_ID,
-- PCI_ANY_ID, pdev))) {
-- if (pci_enable_device(pdev))
-- continue;
-- /* found an adapter */
-- subsys_vendor = pdev->subsystem_vendor;
-- subsys_device = pdev->subsystem_device;
--
-- /*
-- * skip QLA12160 already initialized on
-- * PCI Bus 1 Dev 2 since we already initialized
-- * and presented it
-- */
-- if ((bdp->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160)&&
-- (pdev->bus->number == 1) &&
-- (PCI_SLOT(pdev->devfn) == 2))
-- continue;
--
-- /* Bypass all AMI SUBSYS VENDOR IDs */
-- if (subsys_vendor == PCI_VENDOR_ID_AMI) {
-- printk(KERN_INFO
-- "qla1x160: Skip AMI SubSys Vendor ID Chip\n");
-- continue;
-- }
-- dprintk(1, "qla1x160: Supported Device Found VID=%x "
-- "DID=%x SSVID=%x SSDID=%x\n", pdev->vendor,
-- pdev->device, subsys_vendor, subsys_device);
--
-- host = qla1280_do_device_init(pdev, template,
-- devnum, bdp, num_hosts);
-- if (!host)
-- continue;
-- ha = (struct scsi_qla_host *)host->hostdata;
--
-- if (qla1280_hostlist == NULL) {
-- cur_ha = qla1280_hostlist = ha;
-- } else {
-- cur_ha = qla1280_hostlist;
-- while (cur_ha->next != NULL)
-- cur_ha = cur_ha->next;
-- cur_ha->next = ha;
-- }
-- num_hosts++;
-- } /* end of WHILE */
-- } /* end of FOR */
--
-- LEAVE("qla1280_detect");
-- return num_hosts;
--}
--
--/**************************************************************************
-- * qla1280_release
-- * Free the passed in Scsi_Host memory structures prior to unloading the
-- * module.
-- **************************************************************************/
--static int
--qla1280_release(struct Scsi_Host *host)
--{
-- struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
--
-- ENTER("qla1280_release");
--
-- if (!ha->flags.online)
-- return 0;
--
-- /* turn-off interrupts on the card */
-- WRT_REG_WORD(&ha->iobase->ictrl, 0);
--
-- /* Detach interrupts */
-- if (host->irq)
-- free_irq(host->irq, ha);
--
--#if MEMORY_MAPPED_IO
-- if (ha->mmpbase)
-- iounmap(ha->mmpbase);
--#else
-- /* release io space registers */
-- if (host->io_port)
-- release_region(host->io_port, 0xff);
--#endif /* MEMORY_MAPPED_IO */
--
-- qla1280_mem_free(ha);
--
-- ENTER("qla1280_release");
-- return 0;
--}
--
- /**************************************************************************
- * qla1280_info
- * Return a string describing the driver.
-@@ -1197,11 +833,11 @@ qla1280_info(struct Scsi_Host *host)
- ha = (struct scsi_qla_host *)host->hostdata;
- bdp = &ql1280_board_tbl[ha->devnum];
- memset(bp, 0, sizeof(qla1280_scsi_name_buffer));
-+
- sprintf (bp,
-- "QLogic %s PCI to SCSI Host Adapter: bus %d device %d irq %d\n"
-+ "QLogic %s PCI to SCSI Host Adapter\n"
- " Firmware version: %2d.%02d.%02d, Driver version %s",
-- &bdp->name[0], ha->pci_bus, (ha->pci_device_fn & 0xf8) >> 3,
-- host->irq, bdp->fwver[0], bdp->fwver[1], bdp->fwver[2],
-+ &bdp->name[0], bdp->fwver[0], bdp->fwver[1], bdp->fwver[2],
- QLA1280_VERSION);
- return bp;
- }
-@@ -1220,38 +856,19 @@ qla1280_info(struct Scsi_Host *host)
- static int
- qla1280_queuecommand(Scsi_Cmnd * cmd, void (*fn) (Scsi_Cmnd *))
- {
-- struct scsi_qla_host *ha;
-- struct srb *sp;
-- struct Scsi_Host *host;
-- int bus, target, lun;
-- int status;
--
-- /*ENTER("qla1280_queuecommand");
-- */
-- dprintk(2, "qla1280_queuecommand(): jiffies %li\n", jiffies);
--
-- host = CMD_HOST(cmd);
-- ha = (struct scsi_qla_host *)host->hostdata;
-+ struct Scsi_Host *host = cmd->device->host;
-+ struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
-+ struct srb *sp = (struct srb *)&cmd->SCp;
-
-- /* send command to adapter */
-- sp = (struct srb *)CMD_SP(cmd);
-- sp->cmd = cmd;
- cmd->scsi_done = fn;
-+ sp->cmd = cmd;
- sp->flags = 0;
-
- qla1280_print_scsi_cmd(5, cmd);
-
-- /* Generate LU queue on bus, target, LUN */
-- bus = SCSI_BUS_32(cmd);
-- target = SCSI_TCN_32(cmd);
-- lun = SCSI_LUN_32(cmd);
- if (ha->flags.enable_64bit_addressing)
-- status = qla1280_64bit_start_scsi(ha, sp);
-- else
-- status = qla1280_32bit_start_scsi(ha, sp);
--
-- /*LEAVE("qla1280_queuecommand"); */
-- return status;
-+ return qla1280_64bit_start_scsi(ha, sp);
-+ return qla1280_32bit_start_scsi(ha, sp);
- }
-
- enum action {
-@@ -1564,29 +1181,105 @@ qla1280_biosparam(struct scsi_device *sd
- unsigned long capacity = disk->capacity;
- #endif
-
-- heads = 64;
-- sectors = 32;
-- cylinders = (unsigned long)capacity / (heads * sectors);
-- if (cylinders > 1024) {
-- heads = 255;
-- sectors = 63;
-- cylinders = (unsigned long)capacity / (heads * sectors);
-- /* if (cylinders > 1023)
-- cylinders = 1023; */
-+ heads = 64;
-+ sectors = 32;
-+ cylinders = (unsigned long)capacity / (heads * sectors);
-+ if (cylinders > 1024) {
-+ heads = 255;
-+ sectors = 63;
-+ cylinders = (unsigned long)capacity / (heads * sectors);
-+ /* if (cylinders > 1023)
-+ cylinders = 1023; */
-+ }
-+
-+ geom[0] = heads;
-+ geom[1] = sectors;
-+ geom[2] = cylinders;
-+
-+ return 0;
-+}
-+
-+#if LINUX_VERSION_CODE < 0x020600
-+static int
-+qla1280_detect(Scsi_Host_Template *template)
-+{
-+ struct pci_device_id *id = &qla1280_pci_tbl[0];
-+ struct pci_dev *pdev = NULL;
-+ int num_hosts = 0;
-+
-+ if (sizeof(struct srb) > sizeof(Scsi_Pointer)) {
-+ printk(KERN_WARNING
-+ "qla1280: struct srb too big, aborting\n");
-+ return 0;
-+ }
-+
-+#ifdef MODULE
-+ /*
-+ * If we are called as a module, the qla1280 pointer may not be null
-+ * and it would point to our bootup string, just like on the lilo
-+ * command line. IF not NULL, then process this config string with
-+ * qla1280_setup
-+ *
-+ * Boot time Options
-+ * To add options at boot time add a line to your lilo.conf file like:
-+ * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}"
-+ * which will result in the first four devices on the first two
-+ * controllers being set to a tagged queue depth of 32.
-+ */
-+ if (qla1280)
-+ qla1280_setup(qla1280);
-+#endif
-+
-+ /* First Initialize QLA12160 on PCI Bus 1 Dev 2 */
-+ while ((pdev = pci_find_device(id->vendor, id->device, pdev))) {
-+ if (pdev->bus->number == 1 && PCI_SLOT(pdev->devfn) == 2) {
-+ if (!qla1280_probe_one(pdev, id))
-+ num_hosts++;
-+ }
-+ }
-+
-+ pdev = NULL;
-+ /* Try and find each different type of adapter we support */
-+ for (id = &qla1280_pci_tbl[0]; id->device; id++) {
-+ while ((pdev = pci_find_device(id->vendor, id->device, pdev))) {
-+ /*
-+ * skip QLA12160 already initialized on
-+ * PCI Bus 1 Dev 2 since we already initialized
-+ * and presented it
-+ */
-+ if (id->device == PCI_DEVICE_ID_QLOGIC_ISP12160 &&
-+ pdev->bus->number == 1 &&
-+ PCI_SLOT(pdev->devfn) == 2)
-+ continue;
-+
-+ if (!qla1280_probe_one(pdev, id))
-+ num_hosts++;
-+ }
- }
-
-- geom[0] = heads;
-- geom[1] = sectors;
-- geom[2] = cylinders;
-+ return num_hosts;
-+}
-+
-+/*
-+ * This looks a bit ugly as we could just pass down host to
-+ * qla1280_remove_one, but I want to keep qla1280_release purely a wrapper
-+ * around pci_driver::remove as used from 2.6 onwards.
-+ */
-+static int
-+qla1280_release(struct Scsi_Host *host)
-+{
-+ struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
-
-+ qla1280_remove_one(ha->pdev);
- return 0;
- }
-+#endif
-
- /**************************************************************************
- * qla1280_intr_handler
- * Handles the H/W interrupt
- **************************************************************************/
--irqreturn_t
-+static irqreturn_t
- qla1280_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
- {
- struct scsi_qla_host *ha;
-@@ -1624,7 +1317,7 @@ qla1280_intr_handler(int irq, void *dev_
-
-
- static int
--qla12160_set_target_parameters(struct scsi_qla_host *ha, int bus, int target)
-+qla1280_set_target_parameters(struct scsi_qla_host *ha, int bus, int target)
- {
- uint8_t mr;
- uint16_t mb[MAILBOX_REGISTER_COUNT];
-@@ -1633,8 +1326,8 @@ qla12160_set_target_parameters(struct sc
-
- nv = &ha->nvram;
-
-- if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-- ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160)
-+ if (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-+ ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP10160)
- is1x160 = 1;
- else
- is1x160 = 0;
-@@ -1721,8 +1414,8 @@ qla1280_slave_configure(Scsi_Device *dev
- (driver_setup.wide_mask &&
- (~driver_setup.wide_mask & (1 << target))))
- nv->bus[bus].target[target].parameter.f.enable_wide = 0;
-- if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-- ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160) {
-+ if (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-+ ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP10160) {
- if (driver_setup.no_ppr ||
- (driver_setup.ppr_mask &&
- (~driver_setup.ppr_mask & (1 << target))))
-@@ -1730,11 +1423,9 @@ qla1280_slave_configure(Scsi_Device *dev
- }
-
- spin_lock_irqsave(HOST_LOCK, flags);
-- if (nv->bus[bus].target[target].parameter.f.enable_sync) {
-- status = qla12160_set_target_parameters(ha, bus, target);
-- }
--
-- qla12160_get_target_parameters(ha, device);
-+ if (nv->bus[bus].target[target].parameter.f.enable_sync)
-+ status = qla1280_set_target_parameters(ha, bus, target);
-+ qla1280_get_target_parameters(ha, device);
- spin_unlock_irqrestore(HOST_LOCK, flags);
- return status;
- }
-@@ -1761,16 +1452,11 @@ qla1280_select_queue_depth(struct Scsi_H
-
- if (scsi_devs)
- qla1280_check_for_dead_scsi_bus(ha, scsi_devs->channel);
--
- LEAVE("qla1280_select_queue_depth");
- }
- #endif
-
- /*
-- * Driver Support Routines
-- */
--
--/*
- * qla1280_done
- * Process completed commands.
- *
-@@ -1972,100 +1658,19 @@ qla1280_done_q_put(struct srb * sp, stru
- LEAVE("qla1280_put_done_q");
- }
-
--
--/*
--* qla1280_mem_alloc
--* Allocates adapter memory.
--*
--* Returns:
--* 0 = success.
--* 1 = failure.
--*/
--static int
--qla1280_mem_alloc(struct scsi_qla_host *ha)
--{
-- int status = 1;
-- dma_addr_t dma_handle;
--
-- ENTER("qla1280_mem_alloc");
--
-- /* get consistent memory allocated for request and response rings */
-- ha->request_ring = pci_alloc_consistent(ha->pdev,
-- ((REQUEST_ENTRY_CNT + 1) *
-- (sizeof(request_t))),
-- &dma_handle);
-- if (!ha->request_ring)
-- goto error;
-- ha->request_dma = dma_handle;
-- ha->response_ring = pci_alloc_consistent(ha->pdev,
-- ((RESPONSE_ENTRY_CNT + 1) *
-- (sizeof(struct response))),
-- &dma_handle);
-- if (!ha->response_ring)
-- goto error;
-- ha->response_dma = dma_handle;
-- status = 0;
-- goto finish;
--
-- error:
-- if (status)
-- dprintk(2, "qla1280_mem_alloc: **** FAILED ****\n");
--
-- if (ha->request_ring)
-- pci_free_consistent(ha->pdev,
-- ((REQUEST_ENTRY_CNT + 1) *
-- (sizeof(request_t))),
-- ha->request_ring, ha->request_dma);
-- finish:
-- LEAVE("qla1280_mem_alloc");
-- return status;
--}
--
--/*
-- * qla1280_mem_free
-- * Frees adapter allocated memory.
-- *
-- * Input:
-- * ha = adapter block pointer.
-- */
--static void
--qla1280_mem_free(struct scsi_qla_host *ha)
--{
-- ENTER("qlc1280_mem_free");
-- /* free consistent memory allocated for request and response rings */
-- if (ha->request_ring)
-- pci_free_consistent(ha->pdev,
-- ((REQUEST_ENTRY_CNT + 1) *
-- (sizeof(request_t))),
-- ha->request_ring, ha->request_dma);
--
-- if (ha->response_ring)
-- pci_free_consistent(ha->pdev,
-- ((RESPONSE_ENTRY_CNT + 1) *
-- (sizeof(struct response))),
-- ha->response_ring, ha->response_dma);
--
-- if (qla1280_buffer) {
-- free_page((unsigned long) qla1280_buffer);
-- qla1280_buffer = NULL;
-- }
--
-- LEAVE("qlc1280_mem_free");
--}
--
- /****************************************************************************/
- /* QLogic ISP1280 Hardware Support Functions. */
- /****************************************************************************/
-
- /*
-- * qla2100_enable_intrs
-- * qla2100_disable_intrs
-- *
-- * Input:
-- * ha = adapter block pointer.
-- *
-- * Returns:
-- * None
-+ * qla2100_enable_intrs
-+ * qla2100_disable_intrs
-+ *
-+ * Input:
-+ * ha = adapter block pointer.
-+ *
-+ * Returns:
-+ * None
- */
- static inline void
- qla1280_enable_intrs(struct scsi_qla_host *ha)
-@@ -2101,7 +1706,7 @@ qla1280_disable_intrs(struct scsi_qla_ho
- * Returns:
- * 0 = success
- */
--static int
-+static int __devinit
- qla1280_initialize_adapter(struct scsi_qla_host *ha)
- {
- struct device_reg *reg;
-@@ -2297,7 +1902,7 @@ qla1280_isp_firmware(struct scsi_qla_hos
- * Returns:
- * 0 = success.
- */
--static int
-+static int __devinit
- qla1280_pci_config(struct scsi_qla_host *ha)
- {
- #if MEMORY_MAPPED_IO
-@@ -2724,8 +2329,8 @@ qla1280_nvram_config(struct scsi_qla_hos
-
- ENTER("qla1280_nvram_config");
-
-- if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-- ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160)
-+ if (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP12160 ||
-+ ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP10160)
- is1x160 = 1;
- else
- is1x160 = 0;
-@@ -4207,48 +3812,6 @@ qla1280_isp_cmd(struct scsi_qla_host *ha
- LEAVE("qla1280_isp_cmd");
- }
-
--#if QL1280_LUN_SUPPORT
--/*
-- * qla1280_enable_lun
-- * Issue enable LUN entry IOCB.
-- *
-- * Input:
-- * ha = adapter block pointer.
-- * bus = SCSI BUS number.
-- * lun = LUN number.
-- */
--static void
--qla1280_enable_lun(struct scsi_qla_host *ha, int bus, int lun)
--{
-- struct elun_entry *pkt;
--
-- ENTER("qla1280_enable_lun");
--
-- /* Get request packet. */
-- /*
-- if (pkt = (struct elun_entry *)qla1280_req_pkt(ha))
-- {
-- pkt->entry_type = ENABLE_LUN_TYPE;
-- pkt->lun = cpu_to_le16(bus ? lun | BIT_15 : lun);
-- pkt->command_count = 32;
-- pkt->immed_notify_count = 1;
-- pkt->group_6_length = MAX_CMDSZ;
-- pkt->group_7_length = MAX_CMDSZ;
-- pkt->timeout = cpu_to_le16(0x30);
--
-- qla1280_isp_cmd(ha);
-- }
-- */
-- pkt = (struct elun_entry *) 1;
--
-- if (!pkt)
-- dprintk(2, "qla1280_enable_lun: **** FAILED ****\n");
-- else
-- dprintk(3, "qla1280_enable_lun: exiting normally\n");
--}
--#endif
--
--
- /****************************************************************************/
- /* Interrupt Service Routine. */
- /****************************************************************************/
-@@ -4894,7 +4457,7 @@ qla1280_check_for_dead_scsi_bus(struct s
- }
-
- static void
--qla12160_get_target_parameters(struct scsi_qla_host *ha, Scsi_Device *device)
-+qla1280_get_target_parameters(struct scsi_qla_host *ha, Scsi_Device *device)
- {
- uint16_t mb[MAILBOX_REGISTER_COUNT];
- int bus, target, lun;
-@@ -5136,34 +4699,274 @@ qla1280_get_token(char *str)
- return ret;
- }
-
--
--static Scsi_Host_Template driver_template = {
-- .proc_info = qla1280_proc_info,
-+static Scsi_Host_Template qla1280_driver_template = {
-+ .proc_name = "qla1280",
- .name = "Qlogic ISP 1280/12160",
-+#if LINUX_VERSION_CODE >= 0x020545
-+ .slave_configure = qla1280_slave_configure,
-+#else
- .detect = qla1280_detect,
- .release = qla1280_release,
-+#endif
- .info = qla1280_info,
- .queuecommand = qla1280_queuecommand,
--#if LINUX_VERSION_CODE >= 0x020545
-- .slave_configure = qla1280_slave_configure,
--#endif
- .eh_abort_handler = qla1280_eh_abort,
- .eh_device_reset_handler= qla1280_eh_device_reset,
- .eh_bus_reset_handler = qla1280_eh_bus_reset,
- .eh_host_reset_handler = qla1280_eh_adapter_reset,
- .bios_param = qla1280_biosparam,
-- .can_queue = 255,
-+ .proc_info = qla1280_proc_info,
-+ .can_queue = 0xfffff,
- .this_id = -1,
- .sg_tablesize = SG_ALL,
-- .cmd_per_lun = 3,
-+ .cmd_per_lun = 1,
- .use_clustering = ENABLE_CLUSTERING,
- #if LINUX_VERSION_CODE < 0x020545
- .use_new_eh_code = 1,
- #endif
- };
-
--#include "scsi_module.c"
-+static int __devinit
-+qla1280_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
-+{
-+ int devnum = id->driver_data;
-+ struct qla_boards *bdp = &ql1280_board_tbl[devnum];
-+ struct Scsi_Host *host;
-+ struct scsi_qla_host *ha;
-+ int error = -ENODEV;
-+
-+ /* Bypass all AMI SUBSYS VENDOR IDs */
-+ if (pdev->subsystem_vendor == PCI_VENDOR_ID_AMI) {
-+ printk(KERN_INFO
-+ "qla1280: Skipping AMI SubSys Vendor ID Chip\n");
-+ goto error;
-+ }
-+
-+ printk(KERN_INFO "qla1280: %s found on PCI bus %i, dev %i\n",
-+ bdp->name, pdev->bus->number, PCI_SLOT(pdev->devfn));
-+
-+ if (pci_enable_device(pdev)) {
-+ printk(KERN_WARNING
-+ "qla1280: Failed to enabled pci device, aborting.\n");
-+ goto error;
-+ }
-+
-+ error = -ENOMEM;
-+ host = scsi_host_alloc(&qla1280_driver_template, sizeof(*ha));
-+ if (!host) {
-+ printk(KERN_WARNING
-+ "qla1280: Failed to register host, aborting.\n");
-+ goto error;
-+ }
-+
-+ ha = (struct scsi_qla_host *)host->hostdata;
-+ memset(ha, 0, sizeof(struct scsi_qla_host));
-+
-+ ha->pdev = pdev;
-+ ha->devnum = devnum; /* specifies microcode load address */
-+
-+ ha->request_ring = pci_alloc_consistent(ha->pdev,
-+ ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
-+ &ha->request_dma);
-+ if (!ha->request_ring) {
-+ printk(KERN_INFO "qla1280: Failed to get request memory\n");
-+ goto error_put_host;
-+ }
-+
-+ ha->response_ring = pci_alloc_consistent(ha->pdev,
-+ ((RESPONSE_ENTRY_CNT + 1) * (sizeof(struct response))),
-+ &ha->response_dma);
-+ if (!ha->response_ring) {
-+ printk(KERN_INFO "qla1280: Failed to get response memory\n");
-+ goto error_free_request_ring;
-+ }
-+
-+ ha->ports = bdp->numPorts;
-+
-+ ha->host = host;
-+ ha->host_no = host->host_no;
-+
-+ host->irq = pdev->irq;
-+ host->base = (unsigned long)ha->mmpbase;
-+ host->max_channel = bdp->numPorts - 1;
-+ host->max_lun = MAX_LUNS - 1;
-+ host->max_id = MAX_TARGETS;
-+ host->max_sectors = 1024;
-+ host->unique_id = host->host_no;
-+
-+#if LINUX_VERSION_CODE < 0x020545
-+ host->select_queue_depths = qla1280_select_queue_depth;
-+#endif
-+
-+ error = -ENODEV;
-+ if (qla1280_pci_config(ha)) {
-+ printk(KERN_INFO "qla1280: Unable to configure PCI\n");
-+ goto error_free_response_ring;
-+ }
-+
-+ /* Disable ISP interrupts. */
-+ qla1280_disable_intrs(ha);
-+
-+ /* Register the IRQ with Linux (sharable) */
-+ if (request_irq(pdev->irq, qla1280_intr_handler, SA_SHIRQ,
-+ "qla1280", ha)) {
-+ printk("qla1280 : Failed to reserve interrupt %d already "
-+ "in use\n", pdev->irq);
-+ goto error_iounmap;
-+ }
-+
-+#if !MEMORY_MAPPED_IO
-+ /* Register the I/O space with Linux */
-+ if (!request_region(host->io_port, 0xff, "qla1280")) {
-+ printk("qla1280: Failed to reserve i/o region 0x%04lx-0x%04lx"
-+ " already in use\n",
-+ host->io_port, host->io_port + 0xff);
-+ goto error_free_irq;
-+ }
-+#endif
-+
-+ /* load the F/W, read paramaters, and init the H/W */
-+ if (qla1280_initialize_adapter(ha)) {
-+ printk(KERN_INFO "qla1x160: Failed to initialize adapter\n");
-+ goto error_release_region;
-+ }
-+
-+ /* set our host ID (need to do something about our two IDs) */
-+ host->this_id = ha->bus_settings[0].id;
-+
-+ pci_set_drvdata(pdev, host);
-+
-+#if LINUX_VERSION_CODE >= 0x020600
-+ error = scsi_add_host(host, &pdev->dev);
-+ if (error)
-+ goto error_disable_adapter;
-+ scsi_scan_host(host);
-+#else
-+ scsi_set_pci_device(host, pdev);
-+#endif
-+
-+ return 0;
-+
-+#if LINUX_VERSION_CODE >= 0x020600
-+ error_disable_adapter:
-+ WRT_REG_WORD(&ha->iobase->ictrl, 0);
-+#endif
-+ error_release_region:
-+#if !MEMORY_MAPPED_IO
-+ release_region(host->io_port, 0xff);
-+ error_free_irq:
-+#endif
-+ free_irq(pdev->irq, ha);
-+ error_iounmap:
-+#if MEMORY_MAPPED_IO
-+ iounmap((void *)(((unsigned long) ha->mmpbase) & PAGE_MASK));
-+#endif
-+ error_free_response_ring:
-+ pci_free_consistent(ha->pdev,
-+ ((RESPONSE_ENTRY_CNT + 1) * (sizeof(struct response))),
-+ ha->response_ring, ha->response_dma);
-+ error_free_request_ring:
-+ pci_free_consistent(ha->pdev,
-+ ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
-+ ha->request_ring, ha->request_dma);
-+ error_put_host:
-+ scsi_host_put(host);
-+ error:
-+ return error;
-+}
-+
-+/*
-+ * Older ia64 toolchains have problems with relative links when this
-+ * goes into the .exit.text section
-+ */
-+#if !defined(CONFIG_QLA1280_MODULE) && defined(__ia64__) && (__GNUC__ == 2)
-+static void
-+#else
-+static void __devexit
-+#endif
-+qla1280_remove_one(struct pci_dev *pdev)
-+{
-+ struct Scsi_Host *host = pci_get_drvdata(pdev);
-+ struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata;
-+
-+#if LINUX_VERSION_CODE >= 0x020600
-+ scsi_remove_host(host);
-+#endif
-+
-+ WRT_REG_WORD(&ha->iobase->ictrl, 0);
-+
-+ free_irq(pdev->irq, ha);
-+
-+#if MEMORY_MAPPED_IO
-+ iounmap(ha->mmpbase);
-+#else
-+ release_region(host->io_port, 0xff);
-+#endif
-+
-+ pci_free_consistent(ha->pdev,
-+ ((REQUEST_ENTRY_CNT + 1) * (sizeof(request_t))),
-+ ha->request_ring, ha->request_dma);
-+ pci_free_consistent(ha->pdev,
-+ ((RESPONSE_ENTRY_CNT + 1) * (sizeof(struct response))),
-+ ha->response_ring, ha->response_dma);
-+
-+ scsi_host_put(host);
-+}
-+
-+#if LINUX_VERSION_CODE >= 0x020600
-+static struct pci_driver qla1280_pci_driver = {
-+ .name = "qla1280",
-+ .id_table = qla1280_pci_tbl,
-+ .probe = qla1280_probe_one,
-+ .remove = __devexit_p(qla1280_remove_one),
-+};
-+
-+static int __init
-+qla1280_init(void)
-+{
-+ if (sizeof(struct srb) > sizeof(Scsi_Pointer)) {
-+ printk(KERN_WARNING
-+ "qla1280: struct srb too big, aborting\n");
-+ return -EINVAL;
-+ }
-+
-+#ifdef MODULE
-+ /*
-+ * If we are called as a module, the qla1280 pointer may not be null
-+ * and it would point to our bootup string, just like on the lilo
-+ * command line. IF not NULL, then process this config string with
-+ * qla1280_setup
-+ *
-+ * Boot time Options
-+ * To add options at boot time add a line to your lilo.conf file like:
-+ * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}"
-+ * which will result in the first four devices on the first two
-+ * controllers being set to a tagged queue depth of 32.
-+ */
-+ if (qla1280)
-+ qla1280_setup(qla1280);
-+#endif
-+
-+ return pci_module_init(&qla1280_pci_driver);
-+}
-
-+static void __exit
-+qla1280_exit(void)
-+{
-+ pci_unregister_driver(&qla1280_pci_driver);
-+}
-+
-+module_init(qla1280_init);
-+module_exit(qla1280_exit);
-+
-+#else
-+# define driver_template qla1280_driver_template
-+# include "scsi_module.c"
-+#endif
-+
-+MODULE_AUTHOR("Qlogic & Jes Sorensen");
-+MODULE_DESCRIPTION("Qlogic ISP SCSI (qla1x80/qla1x160) driver");
-+MODULE_LICENSE("GPL");
-
- /*
- * Overrides for Emacs so that we almost follow Linus's tabbing style.
---- linux-2.6.0/drivers/scsi/qla1280.h 2003-09-27 18:57:45.000000000 -0700
-+++ 25/drivers/scsi/qla1280.h 2003-12-28 23:21:38.000000000 -0800
-@@ -1021,11 +1021,7 @@ struct scsi_qla_host {
-
- unsigned char *mmpbase; /* memory mapped address */
- unsigned long host_no;
-- unsigned long instance;
- struct pci_dev *pdev;
-- uint32_t device_id;
-- uint8_t pci_bus;
-- uint8_t pci_device_fn;
- uint8_t devnum;
- uint8_t revision;
- uint8_t ports;
-@@ -1040,18 +1036,9 @@ struct scsi_qla_host {
- /* BUS configuration data */
- struct bus_param bus_settings[MAX_BUSES];
-
--#if 0
-- /* bottom half run queue */
-- struct tq_struct run_qla_bh;
--#endif
--
- /* Received ISP mailbox data. */
- volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT];
-
--#ifdef UNUSED
-- struct timer_list dev_timer[MAX_TARGETS];
--#endif
--
- dma_addr_t request_dma; /* Physical Address */
- request_t *request_ring; /* Base virtual address */
- request_t *request_ring_ptr; /* Current address. */
-@@ -1063,15 +1050,6 @@ struct scsi_qla_host {
- struct response *response_ring_ptr; /* Current address. */
- uint16_t rsp_ring_index; /* Current index. */
-
--#if WATCHDOGTIMER
-- /* Watchdog queue, lock and total timer */
-- uint8_t watchdog_q_lock; /* Lock for watchdog queue */
-- struct srb *wdg_q_first; /* First job on watchdog queue */
-- struct srb *wdg_q_last; /* Last job on watchdog queue */
-- uint32_t total_timeout; /* Total timeout (quantum count) */
-- uint32_t watchdogactive;
--#endif
--
- struct srb *done_q_first; /* First job on done queue */
- struct srb *done_q_last; /* Last job on done queue */
-
---- linux-2.6.0/drivers/scsi/sd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sd.c 2003-12-28 23:21:45.000000000 -0800
-@@ -62,6 +62,7 @@
- */
- #define SD_MAJORS 16
- #define SD_DISKS (SD_MAJORS << 4)
-+#define TOTAL_SD_DISKS CONFIG_MAX_SD_DISKS
-
- /*
- * Time out in seconds for disks and Magneto-opticals (which are slower).
-@@ -95,7 +96,7 @@ struct scsi_disk {
- };
-
-
--static unsigned long sd_index_bits[SD_DISKS / BITS_PER_LONG];
-+static unsigned long sd_index_bits[TOTAL_SD_DISKS / BITS_PER_LONG];
- static spinlock_t sd_index_lock = SPIN_LOCK_UNLOCKED;
-
- static int sd_revalidate_disk(struct gendisk *disk);
-@@ -130,6 +131,9 @@ static int sd_major(int major_idx)
- return SCSI_DISK1_MAJOR + major_idx - 1;
- case 8 ... 15:
- return SCSI_DISK8_MAJOR + major_idx - 8;
-+#define MAX_IDX (TOTAL_SD_DISKS >> 4)
-+ case 16 ... MAX_IDX:
-+ return SCSI_DISK15_MAJOR;
- default:
- BUG();
- return 0; /* shut up gcc */
-@@ -378,9 +382,9 @@ queue:
- * In the latter case @inode and @filp carry an abridged amount
- * of information as noted above.
- **/
--static int sd_open(struct inode *inode, struct file *filp)
-+static int sd_open(struct block_device *bdev, struct file *filp)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
-+ struct gendisk *disk = bdev->bd_disk;
- struct scsi_disk *sdkp = scsi_disk(disk);
- struct scsi_device *sdev;
- int retval;
-@@ -402,7 +406,7 @@ static int sd_open(struct inode *inode,
- goto error_out;
-
- if (sdev->removable || sdkp->write_prot)
-- check_disk_change(inode->i_bdev);
-+ check_disk_change(bdev);
-
- /*
- * If the drive is empty, just let the open fail.
-@@ -453,9 +457,8 @@ error_out:
- * Note: may block (uninterruptible) if error recovery is underway
- * on this disk.
- **/
--static int sd_release(struct inode *inode, struct file *filp)
-+static int sd_release(struct gendisk *disk)
- {
-- struct gendisk *disk = inode->i_bdev->bd_disk;
- struct scsi_disk *sdkp = scsi_disk(disk);
- struct scsi_device *sdev = sdkp->device;
-
-@@ -518,10 +521,9 @@ static int sd_hdio_getgeo(struct block_d
- * Note: most ioctls are forward onto the block subsystem or further
- * down in the scsi subsytem.
- **/
--static int sd_ioctl(struct inode * inode, struct file * filp,
-+static int sd_ioctl(struct block_device *bdev, struct file *filp,
- unsigned int cmd, unsigned long arg)
- {
-- struct block_device *bdev = inode->i_bdev;
- struct gendisk *disk = bdev->bd_disk;
- struct scsi_device *sdp = scsi_disk(disk)->device;
- int error;
-@@ -1320,8 +1322,8 @@ static int sd_probe(struct device *dev)
- goto out_free;
-
- spin_lock(&sd_index_lock);
-- index = find_first_zero_bit(sd_index_bits, SD_DISKS);
-- if (index == SD_DISKS) {
-+ index = find_first_zero_bit(sd_index_bits, TOTAL_SD_DISKS);
-+ if (index == TOTAL_SD_DISKS) {
- spin_unlock(&sd_index_lock);
- error = -EBUSY;
- goto out_put;
-@@ -1336,15 +1338,24 @@ static int sd_probe(struct device *dev)
- sdkp->openers = 0;
-
- gd->major = sd_major(index >> 4);
-- gd->first_minor = (index & 15) << 4;
-+ if (index > SD_DISKS)
-+ gd->first_minor = ((index - SD_DISKS) & 15) << 4;
-+ else
-+ gd->first_minor = (index & 15) << 4;
- gd->minors = 16;
- gd->fops = &sd_fops;
-
-- if (index >= 26) {
-+ if (index < 26) {
-+ sprintf(gd->disk_name, "sd%c", 'a' + index % 26);
-+ } else if (index < (26*27)) {
- sprintf(gd->disk_name, "sd%c%c",
- 'a' + index/26-1,'a' + index % 26);
- } else {
-- sprintf(gd->disk_name, "sd%c", 'a' + index % 26);
-+ const unsigned int m1 = (index/ 26 - 1) / 26 - 1;
-+ const unsigned int m2 = (index / 26 - 1) % 26;
-+ const unsigned int m3 = index % 26;
-+ sprintf(gd->disk_name, "sd%c%c%c",
-+ 'a' + m1, 'a' + m2, 'a' + m3);
- }
-
- strcpy(gd->devfs_name, sdp->devfs_name);
---- linux-2.6.0/drivers/scsi/sg.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/drivers/scsi/sg.c 2003-12-28 23:22:25.000000000 -0800
-@@ -1118,7 +1118,7 @@ sg_rb_correct4mmap(Sg_scatter_hold * rsv
- }
-
- static struct page *
--sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int unused)
-+sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type)
- {
- Sg_fd *sfp;
- struct page *page = NOPAGE_SIGBUS;
-@@ -1158,6 +1158,8 @@ sg_vma_nopage(struct vm_area_struct *vma
- page = virt_to_page(page_ptr);
- get_page(page); /* increment page count */
- }
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return page;
- }
-
-@@ -2974,3 +2976,4 @@ sg_proc_version_info(char *buffer, int *
-
- module_init(init_sg);
- module_exit(exit_sg);
-+MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR);
---- linux-2.6.0/drivers/scsi/sr.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sr.c 2003-12-28 23:22:35.000000000 -0800
-@@ -67,7 +67,8 @@ MODULE_PARM(xa_test, "i"); /* see sr_ioc
- (CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \
- CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \
- CDC_PLAY_AUDIO|CDC_RESET|CDC_IOCTLS|CDC_DRIVE_STATUS| \
-- CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET)
-+ CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
-+ CDC_MRW|CDC_MRW_W|CDC_RAM)
-
- static int sr_probe(struct device *);
- static int sr_remove(struct device *);
-@@ -413,22 +414,22 @@ queue:
- return 1;
- }
-
--static int sr_block_open(struct inode *inode, struct file *file)
-+static int sr_block_open(struct block_device *bdev, struct file *file)
- {
-- struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-- return cdrom_open(&cd->cdi, inode, file);
-+ struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
-+ return cdrom_open(&cd->cdi, bdev, file);
- }
-
--static int sr_block_release(struct inode *inode, struct file *file)
-+static int sr_block_release(struct gendisk *disk)
- {
-- struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-- return cdrom_release(&cd->cdi, file);
-+ struct scsi_cd *cd = scsi_cd(disk);
-+ return cdrom_release(&cd->cdi);
- }
-
--static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
-- unsigned long arg)
-+static int sr_block_ioctl(struct block_device *bdev, struct file *file,
-+ unsigned cmd, unsigned long arg)
- {
-- struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-+ struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
- struct scsi_device *sdev = cd->device;
-
- /*
-@@ -440,7 +441,7 @@ static int sr_block_ioctl(struct inode *
- case SCSI_IOCTL_GET_BUS_NUMBER:
- return scsi_ioctl(sdev, cmd, (void *)arg);
- }
-- return cdrom_ioctl(&cd->cdi, inode, cmd, arg);
-+ return cdrom_ioctl(&cd->cdi, bdev, cmd, arg);
- }
-
- static int sr_block_media_changed(struct gendisk *disk)
-@@ -692,7 +693,7 @@ Enomem:
- static void get_capabilities(struct scsi_cd *cd)
- {
- unsigned char *buffer;
-- int rc, n;
-+ int rc, n, mrw_write = 0, mrw = 1;
- struct scsi_mode_data data;
- struct scsi_request *SRpnt;
- unsigned char cmd[MAX_COMMAND_SIZE];
-@@ -765,6 +766,15 @@ static void get_capabilities(struct scsi
- printk("%s: scsi-1 drive\n", cd->cdi.name);
- return;
- }
-+
-+ if (cdrom_is_mrw(&cd->cdi, &mrw_write)) {
-+ mrw = 0;
-+ cd->cdi.mask |= CDC_MRW;
-+ cd->cdi.mask |= CDC_MRW_W;
-+ }
-+ if (!mrw_write)
-+ cd->cdi.mask |= CDC_MRW_W;
-+
- n = data.header_length + data.block_descriptor_length;
- cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
- cd->readcd_known = 1;
-@@ -788,9 +798,7 @@ static void get_capabilities(struct scsi
- if ((buffer[n + 3] & 0x20) == 0) {
- /* can't write DVD-RAM media */
- cd->cdi.mask |= CDC_DVD_RAM;
-- } else {
-- cd->device->writeable = 1;
-- }
-+ } else
- if ((buffer[n + 3] & 0x10) == 0)
- /* can't write DVD-R media */
- cd->cdi.mask |= CDC_DVD_R;
-@@ -814,6 +822,12 @@ static void get_capabilities(struct scsi
- /*else I don't think it can close its tray
- cd->cdi.mask |= CDC_CLOSE_TRAY; */
-
-+ /*
-+ * if DVD-RAM of MRW-W, we are randomly writeable
-+ */
-+ if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) != (CDC_DVD_RAM | CDC_MRW_W))
-+ cd->device->writeable = 1;
-+
- scsi_release_request(SRpnt);
- kfree(buffer);
- }
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym53c8xx.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym53c8xx.h 2003-12-28 23:21:49.000000000 -0800
-@@ -55,19 +55,7 @@
-
- #include <linux/config.h>
-
--/*
-- * Use normal IO if configured.
-- * Normal IO forced for alpha.
-- * Forced to MMIO for sparc.
-- */
--#if defined(__alpha__)
--#define SYM_CONF_IOMAPPED
--#elif defined(__sparc__)
--#undef SYM_CONF_IOMAPPED
--/* #elif defined(__powerpc__) */
--/* #define SYM_CONF_IOMAPPED */
--/* #define SYM_OPT_NO_BUS_MEMORY_MAPPING */
--#elif defined(CONFIG_SCSI_SYM53C8XX_IOMAPPED)
-+#ifdef CONFIG_SCSI_SYM53C8XX_IOMAPPED
- #define SYM_CONF_IOMAPPED
- #endif
-
-@@ -93,8 +81,6 @@
- */
- #if 1
- #define SYM_CONF_NVRAM_SUPPORT (1)
--#define SYM_SETUP_SYMBIOS_NVRAM (1)
--#define SYM_SETUP_TEKRAM_NVRAM (1)
- #endif
-
- /*
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_fw1.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_fw1.h 2003-12-28 23:21:49.000000000 -0800
-@@ -234,10 +234,6 @@ struct SYM_FWB_SCR {
- struct SYM_FWZ_SCR {
- u32 snooptest [ 9];
- u32 snoopend [ 2];
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- u32 start_ram [ 1];
-- u32 scripta0_ba [ 4];
--#endif
- };
-
- static struct SYM_FWA_SCR SYM_FWA_SCR = {
-@@ -1851,24 +1847,5 @@ static struct SYM_FWZ_SCR SYM_FWZ_SCR =
- */
- SCR_INT,
- 99,
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- /*
-- * We may use MEMORY MOVE instructions to load the on chip-RAM,
-- * if it happens that mapping PCI memory is not possible.
-- * But writing the RAM from the CPU is the preferred method,
-- * since PCI 2.2 seems to disallow PCI self-mastering.
-- */
--}/*-------------------------< START_RAM >------------------------*/,{
-- /*
-- * Load the script into on-chip RAM,
-- * and jump to start point.
-- */
-- SCR_COPY (sizeof(struct SYM_FWA_SCR)),
--}/*-------------------------< SCRIPTA0_BA >----------------------*/,{
-- 0,
-- PADDR_A (start),
-- SCR_JUMP,
-- PADDR_A (init),
--#endif /* SYM_OPT_NO_BUS_MEMORY_MAPPING */
- }/*--------------------------<>----------------------------------*/
- };
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_fw2.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_fw2.h 2003-12-28 23:21:49.000000000 -0800
-@@ -228,14 +228,6 @@ struct SYM_FWB_SCR {
- struct SYM_FWZ_SCR {
- u32 snooptest [ 6];
- u32 snoopend [ 2];
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- u32 start_ram [ 1];
-- u32 scripta0_ba [ 4];
-- u32 start_ram64 [ 3];
-- u32 scripta0_ba64 [ 3];
-- u32 scriptb0_ba64 [ 6];
-- u32 ram_seg64 [ 1];
--#endif
- };
-
- static struct SYM_FWA_SCR SYM_FWA_SCR = {
-@@ -1944,51 +1936,5 @@ static struct SYM_FWZ_SCR SYM_FWZ_SCR =
- */
- SCR_INT,
- 99,
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- /*
-- * We may use MEMORY MOVE instructions to load the on chip-RAM,
-- * if it happens that mapping PCI memory is not possible.
-- * But writing the RAM from the CPU is the preferred method,
-- * since PCI 2.2 seems to disallow PCI self-mastering.
-- */
--}/*-------------------------< START_RAM >------------------------*/,{
-- /*
-- * Load the script into on-chip RAM,
-- * and jump to start point.
-- */
-- SCR_COPY (sizeof(struct SYM_FWA_SCR)),
--}/*-------------------------< SCRIPTA0_BA >----------------------*/,{
-- 0,
-- PADDR_A (start),
-- SCR_JUMP,
-- PADDR_A (init),
--}/*-------------------------< START_RAM64 >----------------------*/,{
-- /*
-- * Load the RAM and start for 64 bit PCI (895A,896).
-- * Both scripts (script and scripth) are loaded into
-- * the RAM which is 8K (4K for 825A/875/895).
-- * We also need to load some 32-63 bit segments
-- * address of the SCRIPTS processor.
-- * LOAD/STORE ABSOLUTE always refers to on-chip RAM
-- * in our implementation. The main memory is
-- * accessed using LOAD/STORE DSA RELATIVE.
-- */
-- SCR_LOAD_REL (mmws, 4),
-- offsetof (struct sym_hcb, scr_ram_seg),
-- SCR_COPY (sizeof(struct SYM_FWA_SCR)),
--}/*-------------------------< SCRIPTA0_BA64 >--------------------*/,{
-- 0,
-- PADDR_A (start),
-- SCR_COPY (sizeof(struct SYM_FWB_SCR)),
--}/*-------------------------< SCRIPTB0_BA64 >--------------------*/,{
-- 0,
-- PADDR_B (start64),
-- SCR_LOAD_REL (mmrs, 4),
-- offsetof (struct sym_hcb, scr_ram_seg),
-- SCR_JUMP64,
-- PADDR_B (start64),
--}/*-------------------------< RAM_SEG64 >------------------------*/,{
-- 0,
--#endif /* SYM_OPT_NO_BUS_MEMORY_MAPPING */
- }/*-------------------------<>-----------------------------------*/
- };
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_fw.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_fw.c 2003-12-28 23:21:49.000000000 -0800
-@@ -89,9 +89,6 @@ static struct sym_fwb_ofs sym_fw1b_ofs =
- };
- static struct sym_fwz_ofs sym_fw1z_ofs = {
- SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram)
--#endif
- };
- #undef SYM_FWA_SCR
- #undef SYM_FWB_SCR
-@@ -122,10 +119,6 @@ static struct sym_fwb_ofs sym_fw2b_ofs =
- };
- static struct sym_fwz_ofs sym_fw2z_ofs = {
- SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram)
-- SYM_GEN_Z(struct SYM_FWZ_SCR, start_ram64)
--#endif
- };
- #undef SYM_FWA_SCR
- #undef SYM_FWB_SCR
-@@ -146,22 +139,10 @@ sym_fw1_patch(hcb_p np)
- {
- struct sym_fw1a_scr *scripta0;
- struct sym_fw1b_scr *scriptb0;
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- struct sym_fw1z_scr *scriptz0 =
-- (struct sym_fw1z_scr *) np->scriptz0;
--#endif
-
- scripta0 = (struct sym_fw1a_scr *) np->scripta0;
- scriptb0 = (struct sym_fw1b_scr *) np->scriptb0;
-
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- /*
-- * Set up BUS physical address of SCRIPTS that is to
-- * be copied to on-chip RAM by the SCRIPTS processor.
-- */
-- scriptz0->scripta0_ba[0] = cpu_to_scr(vtobus(scripta0));
--#endif
--
- /*
- * Remove LED support if not needed.
- */
-@@ -199,25 +180,10 @@ sym_fw2_patch(hcb_p np)
- {
- struct sym_fw2a_scr *scripta0;
- struct sym_fw2b_scr *scriptb0;
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- struct sym_fw2z_scr *scriptz0 =
-- (struct sym_fw2z_scr *) np->scriptz0;
--#endif
-
- scripta0 = (struct sym_fw2a_scr *) np->scripta0;
- scriptb0 = (struct sym_fw2b_scr *) np->scriptb0;
-
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- /*
-- * Set up BUS physical address of SCRIPTS that is to
-- * be copied to on-chip RAM by the SCRIPTS processor.
-- */
-- scriptz0->scripta0_ba64[0] = /* Nothing is missing here */
-- scriptz0->scripta0_ba[0] = cpu_to_scr(vtobus(scripta0));
-- scriptz0->scriptb0_ba64[0] = cpu_to_scr(vtobus(scriptb0));
-- scriptz0->ram_seg64[0] = np->scr_ram_seg;
--#endif
--
- /*
- * Remove LED support if not needed.
- */
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_fw.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_fw.h 2003-12-28 23:21:49.000000000 -0800
-@@ -113,10 +113,6 @@ struct sym_fwb_ofs {
- };
- struct sym_fwz_ofs {
- SYM_GEN_FW_Z(u_short)
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- SYM_GEN_Z(u_short, start_ram)
-- SYM_GEN_Z(u_short, start_ram64)
--#endif
- };
-
- /*
-@@ -136,10 +132,6 @@ struct sym_fwb_ba {
- };
- struct sym_fwz_ba {
- SYM_GEN_FW_Z(u32)
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- SYM_GEN_Z(u32, start_ram)
-- SYM_GEN_Z(u32, start_ram64)
--#endif
- };
- #undef SYM_GEN_A
- #undef SYM_GEN_B
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_glue.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_glue.c 2003-12-28 23:21:49.000000000 -0800
-@@ -167,34 +167,16 @@ struct sym_ucmd { /* Override the SCSI
- #define SYM_SCMD_PTR(ucmd) sym_que_entry(ucmd, struct scsi_cmnd, SCp)
- #define SYM_SOFTC_PTR(cmd) (((struct host_data *)cmd->device->host->hostdata)->ncb)
-
--/*
-- * Deal with DMA mapping/unmapping.
-- */
--#define bus_unmap_sg(pdev, sgptr, sgcnt, dir) \
-- pci_unmap_sg(pdev, sgptr, sgcnt, dir)
--#define bus_unmap_single(pdev, mapping, bufptr, dir) \
-- pci_unmap_single(pdev, mapping, bufptr, dir)
--#define bus_map_single(pdev, bufptr, bufsiz, dir) \
-- pci_map_single(pdev, bufptr, bufsiz, dir)
--#define bus_map_sg(pdev, sgptr, sgcnt, dir) \
-- pci_map_sg(pdev, sgptr, sgcnt, dir)
--#define bus_dma_sync_sg(pdev, sgptr, sgcnt, dir) \
-- pci_dma_sync_sg(pdev, sgptr, sgcnt, dir)
--#define bus_dma_sync_single(pdev, mapping, bufsiz, dir) \
-- pci_dma_sync_single(pdev, mapping, bufsiz, dir)
--#define bus_sg_dma_address(sc) sg_dma_address(sc)
--#define bus_sg_dma_len(sc) sg_dma_len(sc)
--
- static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
- {
- int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
-
- switch(SYM_UCMD_PTR(cmd)->data_mapped) {
- case 2:
-- bus_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
-+ pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
- break;
- case 1:
-- bus_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
-+ pci_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
- cmd->request_bufflen, dma_dir);
- break;
- }
-@@ -206,7 +188,7 @@ static dma_addr_t __map_scsi_single_data
- dma_addr_t mapping;
- int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
-
-- mapping = bus_map_single(pdev, cmd->request_buffer,
-+ mapping = pci_map_single(pdev, cmd->request_buffer,
- cmd->request_bufflen, dma_dir);
- if (mapping) {
- SYM_UCMD_PTR(cmd)->data_mapped = 1;
-@@ -221,7 +203,7 @@ static int __map_scsi_sg_data(struct pci
- int use_sg;
- int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
-
-- use_sg = bus_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
-+ use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
- if (use_sg > 0) {
- SYM_UCMD_PTR(cmd)->data_mapped = 2;
- SYM_UCMD_PTR(cmd)->data_mapping = use_sg;
-@@ -236,10 +218,10 @@ static void __sync_scsi_data(struct pci_
-
- switch(SYM_UCMD_PTR(cmd)->data_mapped) {
- case 2:
-- bus_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
-+ pci_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
- break;
- case 1:
-- bus_dma_sync_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
-+ pci_dma_sync_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
- cmd->request_bufflen, dma_dir);
- break;
- }
-@@ -469,8 +451,8 @@ static int sym_scatter(struct sym_hcb *n
- data = &cp->phys.data[SYM_CONF_MAX_SG - use_sg];
-
- for (segment = 0; segment < use_sg; segment++) {
-- dma_addr_t baddr = bus_sg_dma_address(&scatter[segment]);
-- unsigned int len = bus_sg_dma_len(&scatter[segment]);
-+ dma_addr_t baddr = sg_dma_address(&scatter[segment]);
-+ unsigned int len = sg_dma_len(&scatter[segment]);
-
- sym_build_sge(np, &data[segment], baddr, len);
- cp->data_len += len;
-@@ -1595,10 +1577,8 @@ static void sym_free_resources(struct sy
- if (np->s.mmio_va)
- iounmap(np->s.mmio_va);
- #endif
--#ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
- if (np->s.ram_va)
- iounmap(np->s.ram_va);
--#endif
- /*
- * Free O/S independent resources.
- */
-@@ -1650,14 +1630,13 @@ out_err32:
- * If all is OK, install interrupt handling and
- * start the timer daemon.
- */
--static int __devinit
--sym_attach (struct scsi_host_template *tpnt, int unit, struct sym_device *dev)
-+static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt,
-+ int unit, struct sym_device *dev)
- {
- struct host_data *host_data;
- struct sym_hcb *np = NULL;
- struct Scsi_Host *instance = NULL;
- unsigned long flags;
-- struct sym_nvram *nvram = dev->nvram;
- struct sym_fw *fw;
-
- printk(KERN_INFO
-@@ -1762,20 +1741,18 @@ sym_attach (struct scsi_host_template *t
- np->ram_ws = 8192;
- else
- np->ram_ws = 4096;
--#ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
- np->s.ram_va = ioremap(dev->s.base_2_c, np->ram_ws);
- if (!np->s.ram_va) {
- printf_err("%s: can't map PCI MEMORY region\n",
- sym_name(np));
- goto attach_failed;
- }
--#endif
- }
-
- /*
- * Perform O/S independent stuff.
- */
-- if (sym_hcb_attach(np, fw, nvram))
-+ if (sym_hcb_attach(np, fw, dev->nvram))
- goto attach_failed;
-
-
-@@ -1843,13 +1820,7 @@ sym_attach (struct scsi_host_template *t
-
- spin_unlock_irqrestore(instance->host_lock, flags);
-
-- /*
-- * Now let the generic SCSI driver
-- * look for the SCSI devices on the bus ..
-- */
-- scsi_add_host(instance, &dev->pdev->dev); /* XXX: handle failure */
-- scsi_scan_host(instance);
-- return 0;
-+ return instance;
-
- reset_failed:
- printf_err("%s: FATAL ERROR: CHECK SCSI BUS - CABLES, "
-@@ -1857,13 +1828,13 @@ sym_attach (struct scsi_host_template *t
- spin_unlock_irqrestore(instance->host_lock, flags);
- attach_failed:
- if (!instance)
-- return -1;
-+ return NULL;
- printf_info("%s: giving up ...\n", sym_name(np));
- if (np)
- sym_free_resources(np);
- scsi_host_put(instance);
-
-- return -1;
-+ return NULL;
- }
-
-
-@@ -2115,7 +2086,7 @@ sym53c8xx_pci_init(struct pci_dev *pdev,
- * Ignore Symbios chips controlled by various RAID controllers.
- * These controllers set value 0x52414944 at RAM end - 16.
- */
--#if defined(__i386__) && !defined(SYM_OPT_NO_BUS_MEMORY_MAPPING)
-+#if defined(__i386__)
- if (base_2_c) {
- unsigned int ram_size, ram_val;
- void *ram_ptr;
-@@ -2202,12 +2173,9 @@ sym53c8xx_pci_init(struct pci_dev *pdev,
-
-
- /*
-- * Linux release module stuff.
-- *
- * Called before unloading the module.
- * Detach the host.
- * We have to free resources and halt the NCR chip.
-- *
- */
- static int __devexit sym_detach(struct sym_hcb *np)
- {
-@@ -2216,18 +2184,15 @@ static int __devexit sym_detach(struct s
- del_timer_sync(&np->s.timer);
-
- /*
-- * Reset NCR chip.
-- * We should use sym_soft_reset(), but we donnot want to do
-- * so, since we may not be safe if interrupts occur.
-+ * Reset NCR chip.
-+ * We should use sym_soft_reset(), but we don't want to do
-+ * so, since we may not be safe if interrupts occur.
- */
- printk("%s: resetting chip\n", sym_name(np));
- OUTB (nc_istat, SRST);
- UDELAY (10);
- OUTB (nc_istat, 0);
-
-- /*
-- * Free host resources
-- */
- sym_free_resources(np);
-
- return 1;
-@@ -2336,6 +2301,7 @@ static int __devinit sym2_probe(struct p
- {
- struct sym_device sym_dev;
- struct sym_nvram nvram;
-+ struct Scsi_Host *instance;
-
- memset(&sym_dev, 0, sizeof(sym_dev));
- memset(&nvram, 0, sizeof(nvram));
-@@ -2354,12 +2320,20 @@ static int __devinit sym2_probe(struct p
-
- sym_get_nvram(&sym_dev, &nvram);
-
-- if (sym_attach(&sym2_template, attach_count, &sym_dev))
-+ instance = sym_attach(&sym2_template, attach_count, &sym_dev);
-+ if (!instance)
- goto free;
-
-+ if (scsi_add_host(instance, &pdev->dev))
-+ goto detach;
-+ scsi_scan_host(instance);
-+
- attach_count++;
-+
- return 0;
-
-+ detach:
-+ sym_detach(pci_get_drvdata(pdev));
- free:
- pci_release_regions(pdev);
- disable:
-@@ -2369,7 +2343,13 @@ static int __devinit sym2_probe(struct p
-
- static void __devexit sym2_remove(struct pci_dev *pdev)
- {
-- sym_detach(pci_get_drvdata(pdev));
-+ struct sym_hcb *np = pci_get_drvdata(pdev);
-+ struct Scsi_Host *host = np->s.host;
-+
-+ scsi_remove_host(host);
-+ scsi_host_put(host);
-+
-+ sym_detach(np);
-
- pci_release_regions(pdev);
- pci_disable_device(pdev);
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_glue.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_glue.h 2003-12-28 23:21:49.000000000 -0800
-@@ -74,10 +74,6 @@
- #define bzero(d, n) memset((d), 0, (n))
- #endif
-
--#ifndef bcmp
--#define bcmp(a, b, n) memcmp((a), (b), (n))
--#endif
--
- /*
- * General driver includes.
- */
-@@ -96,7 +92,6 @@
- #define SYM_OPT_SNIFF_INQUIRY
- #define SYM_OPT_LIMIT_COMMAND_REORDERING
- #define SYM_OPT_ANNOUNCE_TRANSFER_RATE
--#define SYM_OPT_BUS_DMA_ABSTRACTION
-
- /*
- * Print a message with severity.
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_hipd.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_hipd.c 2003-12-28 23:21:49.000000000 -0800
-@@ -50,7 +50,7 @@
- * SUCH DAMAGE.
- */
-
--#define SYM_DRIVER_NAME "sym-2.1.18b"
-+#define SYM_DRIVER_NAME "sym-2.1.18f"
-
- #ifdef __FreeBSD__
- #include <dev/sym/sym_glue.h>
-@@ -751,8 +751,6 @@ static u32 parisc_setup_hcb(hcb_p np, u3
- &np->maxwide, &scsi_mode))
- return period;
-
-- printk("scsi_mode = %d, period = %ld\n", scsi_mode, pdc_period);
--
- if (scsi_mode >= 0) {
- /* C3000 PDC reports period/mode */
- SYM_SETUP_SCSI_DIFF = 0;
-@@ -1060,12 +1058,10 @@ static int sym_prepare_setting(hcb_p np,
- * and BUS width.
- */
- if (np->features & FE_ULTRA3) {
-- if (tp->tinfo.user.period <= 9 &&
-- tp->tinfo.user.width == BUS_16_BIT) {
-- tp->tinfo.user.options |= PPR_OPT_DT;
-- tp->tinfo.user.offset = np->maxoffs_dt;
-- tp->tinfo.user.spi_version = 3;
-- }
-+ tp->tinfo.user.options |= PPR_OPT_DT;
-+ tp->tinfo.user.period = np->minsync_dt;
-+ tp->tinfo.user.offset = np->maxoffs_dt;
-+ tp->tinfo.user.spi_version = 3;
- }
-
- if (!tp->usrtags)
-@@ -1962,13 +1958,6 @@ void sym_start_up (hcb_p np, int reason)
- if (sym_verbose >= 2)
- printf ("%s: Downloading SCSI SCRIPTS.\n",
- sym_name(np));
--#ifdef SYM_OPT_NO_BUS_MEMORY_MAPPING
-- np->fw_patch(np);
-- if (np->ram_ws == 8192)
-- phys = SCRIPTZ_BA (np, start_ram64);
-- else
-- phys = SCRIPTZ_BA (np, start_ram);
--#else
- if (np->ram_ws == 8192) {
- OUTRAM_OFF(4096, np->scriptb0, np->scriptb_sz);
- phys = scr_to_cpu(np->scr_ram_seg);
-@@ -1980,7 +1969,6 @@ void sym_start_up (hcb_p np, int reason)
- else
- phys = SCRIPTA_BA (np, init);
- OUTRAM_OFF(0, np->scripta0, np->scripta_sz);
--#endif
- }
- else
- phys = SCRIPTA_BA (np, init);
-@@ -2136,9 +2124,15 @@ sym_setsync(hcb_p np, int target,
-
- sym_settrans(np, target, 0, ofs, per, wide, div, fak);
-
-- tp->tinfo.goal.period = tp->tinfo.curr.period = per;
-- tp->tinfo.goal.offset = tp->tinfo.curr.offset = ofs;
-- tp->tinfo.goal.options = tp->tinfo.curr.options = 0;
-+ tp->tinfo.curr.period = per;
-+ tp->tinfo.curr.offset = ofs;
-+ tp->tinfo.curr.options = 0;
-+
-+ if (!(tp->tinfo.goal.options & PPR_OPT_MASK)) {
-+ tp->tinfo.goal.period = per;
-+ tp->tinfo.goal.offset = ofs;
-+ tp->tinfo.goal.options = 0;
-+ }
-
- sym_xpt_async_nego_sync(np, target);
- }
-@@ -4151,8 +4145,10 @@ sym_ppr_nego_check(hcb_p np, int req, in
- /*
- * Check values against our limits.
- */
-- if (wide > np->maxwide)
-- {chg = 1; wide = np->maxwide;}
-+ if (wide > np->maxwide) {
-+ chg = 1;
-+ wide = np->maxwide;
-+ }
- if (!wide || !(np->features & FE_ULTRA3))
- dt &= ~PPR_OPT_DT;
- if (req) {
-@@ -4306,8 +4302,10 @@ sym_wide_nego_check(hcb_p np, int req, i
- /*
- * Check values against our limits.
- */
-- if (wide > np->maxwide)
-- {chg = 1; wide = np->maxwide;}
-+ if (wide > np->maxwide) {
-+ chg = 1;
-+ wide = np->maxwide;
-+ }
- if (req) {
- if (wide > tp->tinfo.user.width)
- {chg = 1; wide = tp->tinfo.user.width;}
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_hipd.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_hipd.h 2003-12-28 23:21:49.000000000 -0800
-@@ -59,12 +59,6 @@
- * They may be defined in platform specific headers, if they
- * are useful.
- *
-- * SYM_OPT_NO_BUS_MEMORY_MAPPING
-- * When this option is set, the driver will not load the
-- * on-chip RAM using MMIO, but let the SCRIPTS processor
-- * do the work using MOVE MEMORY instructions.
-- * (set for Linux/PPC)
-- *
- * SYM_OPT_HANDLE_DIR_UNKNOWN
- * When this option is set, the SCRIPTS used by the driver
- * are able to handle SCSI transfers with direction not
-@@ -75,12 +69,6 @@
- * When this option is set, the driver will use a queue per
- * device and handle QUEUE FULL status requeuing internally.
- *
-- * SYM_OPT_BUS_DMA_ABSTRACTION
-- * When this option is set, the driver allocator is responsible
-- * of maintaining bus physical addresses and so provides virtual
-- * to bus physical address translation of driver data structures.
-- * (set for FreeBSD-4 and Linux 2.3)
-- *
- * SYM_OPT_SNIFF_INQUIRY
- * When this option is set, the driver sniff out successful
- * INQUIRY response and performs negotiations accordingly.
-@@ -92,10 +80,8 @@
- * (set for Linux)
- */
- #if 0
--#define SYM_OPT_NO_BUS_MEMORY_MAPPING
- #define SYM_OPT_HANDLE_DIR_UNKNOWN
- #define SYM_OPT_HANDLE_DEVICE_QUEUEING
--#define SYM_OPT_BUS_DMA_ABSTRACTION
- #define SYM_OPT_SNIFF_INQUIRY
- #define SYM_OPT_LIMIT_COMMAND_REORDERING
- #endif
-@@ -958,9 +944,7 @@ struct sym_hcb {
- /*
- * DMA pool handle for this HBA.
- */
--#ifdef SYM_OPT_BUS_DMA_ABSTRACTION
- m_pool_ident_t bus_dmat;
--#endif
-
- /*
- * O/S specific data structure
-@@ -1133,9 +1117,20 @@ struct sym_hcb {
- /*
- * NVRAM reading (sym_nvram.c).
- */
-+#if SYM_CONF_NVRAM_SUPPORT
- void sym_nvram_setup_host (hcb_p np, struct sym_nvram *nvram);
- void sym_nvram_setup_target (hcb_p np, int target, struct sym_nvram *nvp);
- int sym_read_nvram (sdev_p np, struct sym_nvram *nvp);
-+#else
-+static inline void sym_nvram_setup_host(hcb_p np, struct sym_nvram *nvram) { }
-+static inline void sym_nvram_setup_target(hcb_p np, struct sym_nvram *nvram) { }
-+static inline int sym_read_nvram(sdev_p np, struct sym_nvram *nvp)
-+{
-+ nvp->type = 0;
-+ return 0;
-+}
-+#endif
-+
-
- /*
- * FIRMWARES (sym_fw.c)
-@@ -1347,7 +1342,6 @@ typedef struct sym_m_link {
- * Virtual to bus physical translation for a given cluster.
- * Such a structure is only useful with DMA abstraction.
- */
--#ifdef SYM_OPT_BUS_DMA_ABSTRACTION
- typedef struct sym_m_vtob { /* Virtual to Bus address translation */
- struct sym_m_vtob *next;
- #ifdef SYM_HAVE_M_SVTOB
-@@ -1363,7 +1357,6 @@ typedef struct sym_m_vtob { /* Virtual t
- #define VTOB_HASH_MASK (VTOB_HASH_SIZE-1)
- #define VTOB_HASH_CODE(m) \
- ((((m_addr_t) (m)) >> SYM_MEM_CLUSTER_SHIFT) & VTOB_HASH_MASK)
--#endif /* SYM_OPT_BUS_DMA_ABSTRACTION */
-
- /*
- * Memory pool of a given kind.
-@@ -1375,7 +1368,6 @@ typedef struct sym_m_vtob { /* Virtual t
- * method are expected to tell the driver about.
- */
- typedef struct sym_m_pool {
--#ifdef SYM_OPT_BUS_DMA_ABSTRACTION
- m_pool_ident_t dev_dmat; /* Identifies the pool (see above) */
- m_addr_t (*get_mem_cluster)(struct sym_m_pool *);
- #ifdef SYM_MEM_FREE_UNUSED
-@@ -1389,10 +1381,6 @@ typedef struct sym_m_pool {
- int nump;
- m_vtob_p vtob[VTOB_HASH_SIZE];
- struct sym_m_pool *next;
--#else
--#define M_GET_MEM_CLUSTER() sym_get_mem_cluster()
--#define M_FREE_MEM_CLUSTER(p) sym_free_mem_cluster(p)
--#endif /* SYM_OPT_BUS_DMA_ABSTRACTION */
- struct sym_m_link h[SYM_MEM_CLUSTER_SHIFT - SYM_MEM_SHIFT + 1];
- } *m_pool_p;
-
-@@ -1406,12 +1394,10 @@ void *sym_calloc_unlocked(int size, char
- * Alloc, free and translate addresses to bus physical
- * for DMAable memory.
- */
--#ifdef SYM_OPT_BUS_DMA_ABSTRACTION
- void *__sym_calloc_dma_unlocked(m_pool_ident_t dev_dmat, int size, char *name);
- void
- __sym_mfree_dma_unlocked(m_pool_ident_t dev_dmat, void *m,int size, char *name);
- u32 __vtobus_unlocked(m_pool_ident_t dev_dmat, void *m);
--#endif
-
- /*
- * Verbs used by the driver code for DMAable memory handling.
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_malloc.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_malloc.c 2003-12-28 23:21:49.000000000 -0800
-@@ -204,18 +204,9 @@ static void __sym_mfree(m_pool_p mp, voi
- /*
- * Default memory pool we donnot need to involve in DMA.
- *
-- * If DMA abtraction is not needed, the generic allocator
-- * calls directly some kernel allocator.
-- *
- * With DMA abstraction, we use functions (methods), to
- * distinguish between non DMAable memory and DMAable memory.
- */
--#ifndef SYM_OPT_BUS_DMA_ABSTRACTION
--
--static struct sym_m_pool mp0;
--
--#else
--
- static m_addr_t ___mp0_get_mem_cluster(m_pool_p mp)
- {
- m_addr_t m = (m_addr_t) sym_get_mem_cluster();
-@@ -240,8 +231,6 @@ static struct sym_m_pool mp0 =
- {0, ___mp0_get_mem_cluster};
- #endif
-
--#endif /* SYM_OPT_BUS_DMA_ABSTRACTION */
--
- /*
- * Actual memory allocation routine for non-DMAed memory.
- */
-@@ -260,7 +249,6 @@ void sym_mfree_unlocked(void *ptr, int s
- __sym_mfree(&mp0, ptr, size, name);
- }
-
--#ifdef SYM_OPT_BUS_DMA_ABSTRACTION
- /*
- * Methods that maintains DMAable pools according to user allocations.
- * New pools are created on the fly when a new pool id is provided.
-@@ -417,5 +405,3 @@ u32 __vtobus_unlocked(m_pool_ident_t dev
- panic("sym: VTOBUS FAILED!\n");
- return (u32)(vp ? vp->baddr + (((m_addr_t) m) - a) : 0);
- }
--
--#endif /* SYM_OPT_BUS_DMA_ABSTRACTION */
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_misc.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/scsi/sym53c8xx_2/sym_misc.c 2003-12-28 23:22:24.000000000 -0800
-@@ -328,7 +328,6 @@ printf("XXXXXX [%d] inq_version=%x inq_b
- tp->inq_byte56 != inq_byte56) {
- tp->inq_version = inq_version;
- tp->inq_byte7 = inq_byte7;
-- tp->inq_byte56 = inq_byte56;
- return 1;
- }
- return 0;
---- linux-2.6.0/drivers/scsi/sym53c8xx_2/sym_nvram.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/scsi/sym53c8xx_2/sym_nvram.c 2003-12-28 23:21:49.000000000 -0800
-@@ -59,25 +59,22 @@
- /*
- * Some poor and bogus sync table that refers to Tekram NVRAM layout.
- */
--#if SYM_CONF_NVRAM_SUPPORT
- static u_char Tekram_sync[16] =
- {25,31,37,43, 50,62,75,125, 12,15,18,21, 6,7,9,10};
- #ifdef SYM_CONF_DEBUG_NVRAM
- static u_char Tekram_boot_delay[7] = {3, 5, 10, 20, 30, 60, 120};
- #endif
--#endif
-
- /*
- * Get host setup from NVRAM.
- */
--void sym_nvram_setup_host (hcb_p np, struct sym_nvram *nvram)
-+void sym_nvram_setup_host(struct sym_hcb *np, struct sym_nvram *nvram)
- {
--#if SYM_CONF_NVRAM_SUPPORT
- /*
- * Get parity checking, host ID, verbose mode
- * and miscellaneous host flags from NVRAM.
- */
-- switch(nvram->type) {
-+ switch (nvram->type) {
- case SYM_SYMBIOS_NVRAM:
- if (!(nvram->data.Symbios.flags & SYMBIOS_PARITY_ENABLE))
- np->rv_scntl0 &= ~0x0a;
-@@ -95,41 +92,15 @@ void sym_nvram_setup_host (hcb_p np, str
- default:
- break;
- }
--#endif
--}
--
--/*
-- * Get target setup from NVRAM.
-- */
--#if SYM_CONF_NVRAM_SUPPORT
--static void sym_Symbios_setup_target(hcb_p np,int target, Symbios_nvram *nvram);
--static void sym_Tekram_setup_target(hcb_p np,int target, Tekram_nvram *nvram);
--#endif
--
--void sym_nvram_setup_target (hcb_p np, int target, struct sym_nvram *nvp)
--{
--#if SYM_CONF_NVRAM_SUPPORT
-- switch(nvp->type) {
-- case SYM_SYMBIOS_NVRAM:
-- sym_Symbios_setup_target (np, target, &nvp->data.Symbios);
-- break;
-- case SYM_TEKRAM_NVRAM:
-- sym_Tekram_setup_target (np, target, &nvp->data.Tekram);
-- break;
-- default:
-- break;
-- }
--#endif
- }
-
--#if SYM_CONF_NVRAM_SUPPORT
- /*
- * Get target set-up from Symbios format NVRAM.
- */
- static void
--sym_Symbios_setup_target(hcb_p np, int target, Symbios_nvram *nvram)
-+sym_Symbios_setup_target(struct sym_hcb *np, int target, Symbios_nvram *nvram)
- {
-- tcb_p tp = &np->target[target];
-+ struct sym_tcb *tp = &np->target[target];
- Symbios_target *tn = &nvram->target[target];
-
- tp->tinfo.user.period = tn->sync_period ? (tn->sync_period + 3) / 4 : 0;
-@@ -149,9 +120,9 @@ sym_Symbios_setup_target(hcb_p np, int t
- * Get target set-up from Tekram format NVRAM.
- */
- static void
--sym_Tekram_setup_target(hcb_p np, int target, Tekram_nvram *nvram)
-+sym_Tekram_setup_target(struct sym_hcb *np, int target, Tekram_nvram *nvram)
- {
-- tcb_p tp = &np->target[target];
-+ struct sym_tcb *tp = &np->target[target];
- struct Tekram_target *tn = &nvram->target[target];
- int i;
-
-@@ -160,8 +131,8 @@ sym_Tekram_setup_target(hcb_p np, int ta
- tp->tinfo.user.period = Tekram_sync[i];
- }
-
-- tp->tinfo.user.width =
-- (tn->flags & TEKRAM_WIDE_NEGO) ? BUS_16_BIT : BUS_8_BIT;
-+ tp->tinfo.user.width = (tn->flags & TEKRAM_WIDE_NEGO) ?
-+ BUS_16_BIT : BUS_8_BIT;
-
- if (tn->flags & TEKRAM_TAGGED_COMMANDS) {
- tp->usrtags = 2 << nvram->max_tags_index;
-@@ -175,11 +146,28 @@ sym_Tekram_setup_target(hcb_p np, int ta
- np->rv_scntl0 &= ~0x0a; /* SCSI parity checking disabled */
- }
-
-+/*
-+ * Get target setup from NVRAM.
-+ */
-+void sym_nvram_setup_target(struct sym_hcb *np, int target, struct sym_nvram *nvp)
-+{
-+ switch (nvp->type) {
-+ case SYM_SYMBIOS_NVRAM:
-+ sym_Symbios_setup_target(np, target, &nvp->data.Symbios);
-+ break;
-+ case SYM_TEKRAM_NVRAM:
-+ sym_Tekram_setup_target(np, target, &nvp->data.Tekram);
-+ break;
-+ default:
-+ break;
-+ }
-+}
-+
- #ifdef SYM_CONF_DEBUG_NVRAM
- /*
- * Dump Symbios format NVRAM for debugging purpose.
- */
--static void sym_display_Symbios_nvram(sdev_p np, Symbios_nvram *nvram)
-+static void sym_display_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram)
- {
- int i;
-
-@@ -211,7 +199,7 @@ static void sym_display_Symbios_nvram(sd
- /*
- * Dump TEKRAM format NVRAM for debugging purpose.
- */
--static void sym_display_Tekram_nvram(sdev_p np, Tekram_nvram *nvram)
-+static void sym_display_Tekram_nvram(struct sym_device *np, Tekram_nvram *nvram)
- {
- int i, tags, boot_delay;
- char *rem;
-@@ -221,7 +209,7 @@ static void sym_display_Tekram_nvram(sde
- boot_delay = 0;
- if (nvram->boot_delay_index < 6)
- boot_delay = Tekram_boot_delay[nvram->boot_delay_index];
-- switch((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) {
-+ switch ((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) {
- default:
- case 0: rem = ""; break;
- case 1: rem = " REMOVABLE=boot device"; break;
-@@ -257,49 +245,12 @@ static void sym_display_Tekram_nvram(sde
- sync);
- }
- }
--#endif /* SYM_CONF_DEBUG_NVRAM */
--#endif /* SYM_CONF_NVRAM_SUPPORT */
--
--
--/*
-- * Try reading Symbios or Tekram NVRAM
-- */
--#if SYM_CONF_NVRAM_SUPPORT
--static int sym_read_Symbios_nvram (sdev_p np, Symbios_nvram *nvram);
--static int sym_read_Tekram_nvram (sdev_p np, Tekram_nvram *nvram);
--#endif
--
--int sym_read_nvram (sdev_p np, struct sym_nvram *nvp)
--{
--#if SYM_CONF_NVRAM_SUPPORT
-- /*
-- * Try to read SYMBIOS nvram.
-- * Try to read TEKRAM nvram if Symbios nvram not found.
-- */
-- if (SYM_SETUP_SYMBIOS_NVRAM &&
-- !sym_read_Symbios_nvram (np, &nvp->data.Symbios)) {
-- nvp->type = SYM_SYMBIOS_NVRAM;
--#ifdef SYM_CONF_DEBUG_NVRAM
-- sym_display_Symbios_nvram(np, &nvp->data.Symbios);
--#endif
-- }
-- else if (SYM_SETUP_TEKRAM_NVRAM &&
-- !sym_read_Tekram_nvram (np, &nvp->data.Tekram)) {
-- nvp->type = SYM_TEKRAM_NVRAM;
--#ifdef SYM_CONF_DEBUG_NVRAM
-- sym_display_Tekram_nvram(np, &nvp->data.Tekram);
--#endif
-- }
-- else
-- nvp->type = 0;
- #else
-- nvp->type = 0;
--#endif
-- return nvp->type;
--}
-+static void sym_display_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram) { }
-+static void sym_display_Tekram_nvram(struct sym_device *np, Tekram_nvram *nvram) { }
-+#endif /* SYM_CONF_DEBUG_NVRAM */
-
-
--#if SYM_CONF_NVRAM_SUPPORT
- /*
- * 24C16 EEPROM reading.
- *
-@@ -316,11 +267,11 @@ int sym_read_nvram (sdev_p np, struct sy
- /*
- * Set/clear data/clock bit in GPIO0
- */
--static void S24C16_set_bit(sdev_p np, u_char write_bit, u_char *gpreg,
-+static void S24C16_set_bit(struct sym_device *np, u_char write_bit, u_char *gpreg,
- int bit_mode)
- {
- UDELAY (5);
-- switch (bit_mode){
-+ switch (bit_mode) {
- case SET_BIT:
- *gpreg |= write_bit;
- break;
-@@ -342,7 +293,7 @@ static void S24C16_set_bit(sdev_p np, u_
- /*
- * Send START condition to NVRAM to wake it up.
- */
--static void S24C16_start(sdev_p np, u_char *gpreg)
-+static void S24C16_start(struct sym_device *np, u_char *gpreg)
- {
- S24C16_set_bit(np, 1, gpreg, SET_BIT);
- S24C16_set_bit(np, 0, gpreg, SET_CLK);
-@@ -353,7 +304,7 @@ static void S24C16_start(sdev_p np, u_ch
- /*
- * Send STOP condition to NVRAM - puts NVRAM to sleep... ZZzzzz!!
- */
--static void S24C16_stop(sdev_p np, u_char *gpreg)
-+static void S24C16_stop(struct sym_device *np, u_char *gpreg)
- {
- S24C16_set_bit(np, 0, gpreg, SET_CLK);
- S24C16_set_bit(np, 1, gpreg, SET_BIT);
-@@ -363,7 +314,7 @@ static void S24C16_stop(sdev_p np, u_cha
- * Read or write a bit to the NVRAM,
- * read if GPIO0 input else write if GPIO0 output
- */
--static void S24C16_do_bit(sdev_p np, u_char *read_bit, u_char write_bit,
-+static void S24C16_do_bit(struct sym_device *np, u_char *read_bit, u_char write_bit,
- u_char *gpreg)
- {
- S24C16_set_bit(np, write_bit, gpreg, SET_BIT);
-@@ -378,7 +329,7 @@ static void S24C16_do_bit(sdev_p np, u_c
- * Output an ACK to the NVRAM after reading,
- * change GPIO0 to output and when done back to an input
- */
--static void S24C16_write_ack(sdev_p np, u_char write_bit, u_char *gpreg,
-+static void S24C16_write_ack(struct sym_device *np, u_char write_bit, u_char *gpreg,
- u_char *gpcntl)
- {
- OUTB (nc_gpcntl, *gpcntl & 0xfe);
-@@ -390,7 +341,7 @@ static void S24C16_write_ack(sdev_p np,
- * Input an ACK from NVRAM after writing,
- * change GPIO0 to input and when done back to an output
- */
--static void S24C16_read_ack(sdev_p np, u_char *read_bit, u_char *gpreg,
-+static void S24C16_read_ack(struct sym_device *np, u_char *read_bit, u_char *gpreg,
- u_char *gpcntl)
- {
- OUTB (nc_gpcntl, *gpcntl | 0x01);
-@@ -402,7 +353,7 @@ static void S24C16_read_ack(sdev_p np, u
- * WRITE a byte to the NVRAM and then get an ACK to see it was accepted OK,
- * GPIO0 must already be set as an output
- */
--static void S24C16_write_byte(sdev_p np, u_char *ack_data, u_char write_data,
-+static void S24C16_write_byte(struct sym_device *np, u_char *ack_data, u_char write_data,
- u_char *gpreg, u_char *gpcntl)
- {
- int x;
-@@ -417,7 +368,7 @@ static void S24C16_write_byte(sdev_p np,
- * READ a byte from the NVRAM and then send an ACK to say we have got it,
- * GPIO0 must already be set as an input
- */
--static void S24C16_read_byte(sdev_p np, u_char *read_data, u_char ack_data,
-+static void S24C16_read_byte(struct sym_device *np, u_char *read_data, u_char ack_data,
- u_char *gpreg, u_char *gpcntl)
- {
- int x;
-@@ -435,7 +386,7 @@ static void S24C16_read_byte(sdev_p np,
- /*
- * Read 'len' bytes starting at 'offset'.
- */
--static int sym_read_S24C16_nvram (sdev_p np, int offset, u_char *data, int len)
-+static int sym_read_S24C16_nvram(struct sym_device *np, int offset, u_char *data, int len)
- {
- u_char gpcntl, gpreg;
- u_char old_gpcntl, old_gpreg;
-@@ -514,7 +465,7 @@ out:
- * Try reading Symbios NVRAM.
- * Return 0 if OK.
- */
--static int sym_read_Symbios_nvram (sdev_p np, Symbios_nvram *nvram)
-+static int sym_read_Symbios_nvram(struct sym_device *np, Symbios_nvram *nvram)
- {
- static u_char Symbios_trailer[6] = {0xfe, 0xfe, 0, 0, 0, 0};
- u_char *data = (u_char *) nvram;
-@@ -528,7 +479,7 @@ static int sym_read_Symbios_nvram (sdev_
-
- /* check valid NVRAM signature, verify byte count and checksum */
- if (nvram->type != 0 ||
-- bcmp(nvram->trailer, Symbios_trailer, 6) ||
-+ memcmp(nvram->trailer, Symbios_trailer, 6) ||
- nvram->byte_count != len - 12)
- return 1;
-
-@@ -555,7 +506,7 @@ static int sym_read_Symbios_nvram (sdev_
- /*
- * Pulse clock bit in GPIO0
- */
--static void T93C46_Clk(sdev_p np, u_char *gpreg)
-+static void T93C46_Clk(struct sym_device *np, u_char *gpreg)
- {
- OUTB (nc_gpreg, *gpreg | 0x04);
- UDELAY (2);
-@@ -565,7 +516,7 @@ static void T93C46_Clk(sdev_p np, u_char
- /*
- * Read bit from NVRAM
- */
--static void T93C46_Read_Bit(sdev_p np, u_char *read_bit, u_char *gpreg)
-+static void T93C46_Read_Bit(struct sym_device *np, u_char *read_bit, u_char *gpreg)
- {
- UDELAY (2);
- T93C46_Clk(np, gpreg);
-@@ -575,7 +526,7 @@ static void T93C46_Read_Bit(sdev_p np, u
- /*
- * Write bit to GPIO0
- */
--static void T93C46_Write_Bit(sdev_p np, u_char write_bit, u_char *gpreg)
-+static void T93C46_Write_Bit(struct sym_device *np, u_char write_bit, u_char *gpreg)
- {
- if (write_bit & 0x01)
- *gpreg |= 0x02;
-@@ -593,7 +544,7 @@ static void T93C46_Write_Bit(sdev_p np,
- /*
- * Send STOP condition to NVRAM - puts NVRAM to sleep... ZZZzzz!!
- */
--static void T93C46_Stop(sdev_p np, u_char *gpreg)
-+static void T93C46_Stop(struct sym_device *np, u_char *gpreg)
- {
- *gpreg &= 0xef;
- OUTB (nc_gpreg, *gpreg);
-@@ -605,7 +556,7 @@ static void T93C46_Stop(sdev_p np, u_cha
- /*
- * Send read command and address to NVRAM
- */
--static void T93C46_Send_Command(sdev_p np, u_short write_data,
-+static void T93C46_Send_Command(struct sym_device *np, u_short write_data,
- u_char *read_bit, u_char *gpreg)
- {
- int x;
-@@ -620,7 +571,8 @@ static void T93C46_Send_Command(sdev_p n
- /*
- * READ 2 bytes from the NVRAM
- */
--static void T93C46_Read_Word(sdev_p np, u_short *nvram_data, u_char *gpreg)
-+static void T93C46_Read_Word(struct sym_device *np,
-+ unsigned short *nvram_data, unsigned char *gpreg)
- {
- int x;
- u_char read_bit;
-@@ -639,13 +591,13 @@ static void T93C46_Read_Word(sdev_p np,
- /*
- * Read Tekram NvRAM data.
- */
--static int T93C46_Read_Data(sdev_p np, u_short *data,int len,u_char *gpreg)
-+static int T93C46_Read_Data(struct sym_device *np, unsigned short *data,
-+ int len, unsigned char *gpreg)
- {
-- u_char read_bit;
-- int x;
-+ int x;
-
- for (x = 0; x < len; x++) {
--
-+ unsigned char read_bit;
- /* output read command and address */
- T93C46_Send_Command(np, 0x180 | x, &read_bit, gpreg);
- if (read_bit & 0x01)
-@@ -660,7 +612,7 @@ static int T93C46_Read_Data(sdev_p np, u
- /*
- * Try reading 93C46 Tekram NVRAM.
- */
--static int sym_read_T93C46_nvram (sdev_p np, Tekram_nvram *nvram)
-+static int sym_read_T93C46_nvram(struct sym_device *np, Tekram_nvram *nvram)
- {
- u_char gpcntl, gpreg;
- u_char old_gpcntl, old_gpreg;
-@@ -692,7 +644,7 @@ static int sym_read_T93C46_nvram (sdev_p
- * Try reading Tekram NVRAM.
- * Return 0 if OK.
- */
--static int sym_read_Tekram_nvram (sdev_p np, Tekram_nvram *nvram)
-+static int sym_read_Tekram_nvram (struct sym_device *np, Tekram_nvram *nvram)
- {
- u_char *data = (u_char *) nvram;
- int len = sizeof(*nvram);
-@@ -700,13 +652,13 @@ static int sym_read_Tekram_nvram (sdev_p
- int x;
-
- switch (np->device_id) {
-- case PCI_ID_SYM53C885:
-- case PCI_ID_SYM53C895:
-- case PCI_ID_SYM53C896:
-+ case PCI_DEVICE_ID_NCR_53C885:
-+ case PCI_DEVICE_ID_NCR_53C895:
-+ case PCI_DEVICE_ID_NCR_53C896:
- x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
- data, len);
- break;
-- case PCI_ID_SYM53C875:
-+ case PCI_DEVICE_ID_NCR_53C875:
- x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
- data, len);
- if (!x)
-@@ -727,4 +679,19 @@ static int sym_read_Tekram_nvram (sdev_p
- return 0;
- }
-
--#endif /* SYM_CONF_NVRAM_SUPPORT */
-+/*
-+ * Try reading Symbios or Tekram NVRAM
-+ */
-+int sym_read_nvram(struct sym_device *np, struct sym_nvram *nvp)
-+{
-+ if (!sym_read_Symbios_nvram(np, &nvp->data.Symbios)) {
-+ nvp->type = SYM_SYMBIOS_NVRAM;
-+ sym_display_Symbios_nvram(np, &nvp->data.Symbios);
-+ } else if (!sym_read_Tekram_nvram(np, &nvp->data.Tekram)) {
-+ nvp->type = SYM_TEKRAM_NVRAM;
-+ sym_display_Tekram_nvram(np, &nvp->data.Tekram);
-+ } else {
-+ nvp->type = 0;
-+ }
-+ return nvp->type;
-+}
---- linux-2.6.0/drivers/serial/8250.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/serial/8250.c 2003-12-28 23:21:07.000000000 -0800
-@@ -844,7 +844,7 @@ receive_chars(struct uart_8250_port *up,
- if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
- tty->flip.work.func((void *)tty);
- if (tty->flip.count >= TTY_FLIPBUF_SIZE)
-- return; // if TTY_DONT_FLIP is set
-+ return; /* if TTY_DONT_FLIP is set */
- }
- ch = serial_inp(up, UART_RX);
- *tty->flip.char_buf_ptr = ch;
-@@ -1205,12 +1205,21 @@ static void serial8250_break_ctl(struct
- spin_unlock_irqrestore(&up->port.lock, flags);
- }
-
-+#ifdef CONFIG_KGDB
-+static int kgdb_irq = -1;
-+#endif
-+
- static int serial8250_startup(struct uart_port *port)
- {
- struct uart_8250_port *up = (struct uart_8250_port *)port;
- unsigned long flags;
- int retval;
-
-+#ifdef CONFIG_KGDB
-+ if (up->port.irq == kgdb_irq)
-+ return -EBUSY;
-+#endif
-+
- up->capabilities = uart_config[up->port.type].flags;
-
- if (up->port.type == PORT_16C950) {
-@@ -1876,6 +1885,10 @@ static void __init serial8250_register_p
- for (i = 0; i < UART_NR; i++) {
- struct uart_8250_port *up = &serial8250_ports[i];
-
-+#ifdef CONFIG_KGDB
-+ if (up->port.irq == kgdb_irq)
-+ up->port.kgdb = 1;
-+#endif
- up->port.line = i;
- up->port.ops = &serial8250_pops;
- init_timer(&up->timer);
-@@ -2145,6 +2158,31 @@ void serial8250_resume_port(int line)
- uart_resume_port(&serial8250_reg, &serial8250_ports[line].port);
- }
-
-+#ifdef CONFIG_KGDB
-+/*
-+ * Find all the ports using the given irq and shut them down.
-+ * Result should be that the irq will be released.
-+ */
-+void shutdown_for_kgdb(struct async_struct * info)
-+{
-+ int irq = info->state->irq;
-+ struct uart_8250_port *up;
-+ int ttyS;
-+
-+ kgdb_irq = irq; /* save for later init */
-+ for (ttyS = 0; ttyS < UART_NR; ttyS++){
-+ up = &serial8250_ports[ttyS];
-+ if (up->port.irq == irq && (irq_lists + irq)->head) {
-+#ifdef CONFIG_DEBUG_SPINLOCK /* ugly business... */
-+ if(up->port.lock.magic != SPINLOCK_MAGIC)
-+ spin_lock_init(&up->port.lock);
-+#endif
-+ serial8250_shutdown(&up->port);
-+ }
-+ }
-+}
-+#endif /* CONFIG_KGDB */
-+
- static int __init serial8250_init(void)
- {
- int ret, i;
---- linux-2.6.0/drivers/serial/serial_core.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/drivers/serial/serial_core.c 2003-12-28 23:21:51.000000000 -0800
-@@ -1862,6 +1862,9 @@ uart_set_options(struct uart_port *port,
- if (flow == 'r')
- termios.c_cflag |= CRTSCTS;
-
-+ if (!port->ops)
-+ return 0; /* "console=" on ia64 */
-+
- port->ops->set_termios(port, &termios, NULL);
- co->cflag = termios.c_cflag;
-
-@@ -1975,6 +1978,11 @@ uart_configure_port(struct uart_driver *
- {
- unsigned int flags;
-
-+#ifdef CONFIG_KGDB
-+ if (port->kgdb)
-+ return;
-+#endif
-+
- /*
- * If there isn't a port here, don't do anything further.
- */
---- linux-2.6.0/drivers/serial/serial_cs.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/drivers/serial/serial_cs.c 2003-12-28 23:22:54.000000000 -0800
-@@ -149,9 +149,9 @@ static void serial_remove(dev_link_t *li
- info->link.dev = NULL;
-
- if (!info->slave) {
-- CardServices(ReleaseConfiguration, info->link.handle);
-- CardServices(ReleaseIO, info->link.handle, &info->link.io);
-- CardServices(ReleaseIRQ, info->link.handle, &info->link.irq);
-+ pcmcia_release_configuration(info->link.handle);
-+ pcmcia_release_io(info->link.handle, &info->link.io);
-+ pcmcia_release_irq(info->link.handle, &info->link.irq);
- }
-
- info->link.state &= ~DEV_CONFIG;
-@@ -211,7 +211,7 @@ static dev_link_t *serial_attach(void)
- client_reg.event_handler = &serial_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- serial_detach(link);
-@@ -256,7 +256,7 @@ static void serial_detach(dev_link_t * l
- serial_remove(link);
-
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -300,20 +300,30 @@ static int setup_serial(struct serial_in
- /*====================================================================*/
-
- static int
--get_tuple(int fn, client_handle_t handle, tuple_t * tuple, cisparse_t * parse)
-+first_tuple(client_handle_t handle, tuple_t * tuple, cisparse_t * parse)
- {
- int i;
-- i = CardServices(fn, handle, tuple);
-+ i = pcmcia_get_first_tuple(handle, tuple);
- if (i != CS_SUCCESS)
- return CS_NO_MORE_ITEMS;
-- i = CardServices(GetTupleData, handle, tuple);
-+ i = pcmcia_get_tuple_data(handle, tuple);
- if (i != CS_SUCCESS)
- return i;
-- return CardServices(ParseTuple, handle, tuple, parse);
-+ return pcmcia_parse_tuple(handle, tuple, parse);
- }
-
--#define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
--#define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
-+static int
-+next_tuple(client_handle_t handle, tuple_t * tuple, cisparse_t * parse)
-+{
-+ int i;
-+ i = pcmcia_get_next_tuple(handle, tuple);
-+ if (i != CS_SUCCESS)
-+ return CS_NO_MORE_ITEMS;
-+ i = pcmcia_get_tuple_data(handle, tuple);
-+ if (i != CS_SUCCESS)
-+ return i;
-+ return pcmcia_parse_tuple(handle, tuple, parse);
-+}
-
- /*====================================================================*/
-
-@@ -330,7 +340,7 @@ static int simple_config(dev_link_t * li
- int i, j, try;
-
- /* If the card is already configured, look up the port and irq */
-- i = CardServices(GetConfigurationInfo, handle, &config);
-+ i = pcmcia_get_configuration_info(handle, &config);
- if ((i == CS_SUCCESS) && (config.Attributes & CONF_VALID_CLIENT)) {
- ioaddr_t port = 0;
- if ((config.BasePort2 != 0) && (config.NumPorts2 == 8)) {
-@@ -367,9 +377,7 @@ static int simple_config(dev_link_t * li
- link->io.BasePort1 = cf->io.win[0].base;
- link->io.IOAddrLines = (try == 0) ?
- 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
-- i =
-- CardServices(RequestIO, link->handle,
-- &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- goto found_port;
- }
-@@ -389,8 +397,7 @@ static int simple_config(dev_link_t * li
- for (j = 0; j < 5; j++) {
- link->io.BasePort1 = base[j];
- link->io.IOAddrLines = base[j] ? 16 : 3;
-- i = CardServices(RequestIO, link->handle,
-- &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- if (i == CS_SUCCESS)
- goto found_port;
- }
-@@ -406,14 +413,14 @@ static int simple_config(dev_link_t * li
- return -1;
- }
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestIRQ, i);
- link->irq.AssignedIRQ = 0;
- }
- if (info->multi && (info->manfid == MANFID_3COM))
- link->conf.ConfigIndex &= ~(0x08);
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
- return -1;
-@@ -433,7 +440,7 @@ static int multi_config(dev_link_t * lin
- config_info_t config;
- int i, base2 = 0;
-
-- i = CardServices(GetConfigurationInfo, handle, &config);
-+ i = pcmcia_get_configuration_info(handle, &config);
- if (i != CS_SUCCESS) {
- cs_error(handle, GetConfigurationInfo, i);
- return -1;
-@@ -458,7 +465,7 @@ static int multi_config(dev_link_t * lin
- link->io.BasePort1 = cf->io.win[0].base;
- link->io.IOAddrLines =
- cf->io.flags & CISTPL_IO_LINES_MASK;
-- i = CardServices(RequestIO, link->handle, &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- base2 = link->io.BasePort1 + 8;
- if (i == CS_SUCCESS)
- break;
-@@ -478,9 +485,7 @@ static int multi_config(dev_link_t * lin
- link->io.BasePort2 = cf->io.win[1].base;
- link->io.IOAddrLines =
- cf->io.flags & CISTPL_IO_LINES_MASK;
-- i =
-- CardServices(RequestIO, link->handle,
-- &link->io);
-+ i = pcmcia_request_io(link->handle, &link->io);
- base2 = link->io.BasePort2;
- if (i == CS_SUCCESS)
- break;
-@@ -494,7 +499,7 @@ static int multi_config(dev_link_t * lin
- return -1;
- }
-
-- i = CardServices(RequestIRQ, link->handle, &link->irq);
-+ i = pcmcia_request_irq(link->handle, &link->irq);
- if (i != CS_SUCCESS) {
- printk(KERN_NOTICE
- "serial_cs: no usable port range found, giving up\n");
-@@ -506,7 +511,7 @@ static int multi_config(dev_link_t * lin
- link->conf.Present |= PRESENT_EXT_STATUS;
- link->conf.ExtStatus = ESR_REQ_ATTN_ENA;
- }
-- i = CardServices(RequestConfiguration, link->handle, &link->conf);
-+ i = pcmcia_request_configuration(link->handle, &link->conf);
- if (i != CS_SUCCESS) {
- cs_error(link->handle, RequestConfiguration, i);
- return -1;
-@@ -543,9 +548,6 @@ static int multi_config(dev_link_t * lin
-
- ======================================================================*/
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
- void serial_config(dev_link_t * link)
- {
- client_handle_t handle = link->handle;
-@@ -619,10 +621,18 @@ void serial_config(dev_link_t * link)
-
- if (info->manfid == MANFID_IBM) {
- conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
-- CS_CHECK(AccessConfigurationRegister, link->handle, ®);
-+ last_ret = pcmcia_access_configuration_register(link->handle, ®);
-+ if (last_ret) {
-+ last_fn = AccessConfigurationRegister;
-+ goto cs_failed;
-+ }
- reg.Action = CS_WRITE;
- reg.Value = reg.Value | 1;
-- CS_CHECK(AccessConfigurationRegister, link->handle, ®);
-+ last_ret = pcmcia_access_configuration_register(link->handle, ®);
-+ if (last_ret) {
-+ last_fn = AccessConfigurationRegister;
-+ goto cs_failed;
-+ }
- }
-
- link->dev = &info->node[0];
-@@ -668,7 +678,7 @@ serial_event(event_t event, int priority
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if ((link->state & DEV_CONFIG) && !info->slave)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
-
- case CS_EVENT_PM_RESUME:
-@@ -676,8 +686,7 @@ serial_event(event_t event, int priority
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link) && !info->slave)
-- CardServices(RequestConfiguration, link->handle,
-- &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
- return 0;
---- linux-2.6.0/drivers/telephony/ixj_pcmcia.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/drivers/telephony/ixj_pcmcia.c 2003-12-28 23:22:54.000000000 -0800
-@@ -77,7 +77,7 @@ static dev_link_t *ixj_attach(void)
- client_reg.event_handler = &ixj_event;
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- ixj_detach(link);
-@@ -100,7 +100,7 @@ static void ixj_detach(dev_link_t * link
- if (link->state & DEV_CONFIG)
- ixj_cs_release(link);
- if (link->handle) {
-- ret = CardServices(DeregisterClient, link->handle);
-+ ret = pcmcia_deregister_client(link->handle);
- if (ret != CS_SUCCESS)
- cs_error(link->handle, DeregisterClient, ret);
- }
-@@ -110,11 +110,8 @@ static void ixj_detach(dev_link_t * link
- kfree(link);
- }
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
--
--#define CFG_CHECK(fn, args...) \
--if (CardServices(fn, args) != 0) goto next_entry
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void ixj_get_serial(dev_link_t * link, IXJ * j)
- {
-@@ -130,8 +127,8 @@ static void ixj_get_serial(dev_link_t *
- tuple.TupleDataMax = 80;
- tuple.Attributes = 0;
- tuple.DesiredTuple = CISTPL_VERS_1;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
- str = (char *) buf;
- printk("PCMCIA Version %d.%d\n", str[0], str[1]);
- str += 2;
-@@ -202,19 +199,20 @@ static void ixj_config(dev_link_t * link
- tuple.TupleDataMax = 255;
- tuple.Attributes = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.Present = parse.config.rmask[0];
- link->state |= DEV_CONFIG;
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
- tuple.Attributes = 0;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
- while (1) {
-- CFG_CHECK(GetTupleData, handle, &tuple);
-- CFG_CHECK(ParseTuple, handle, &tuple, &parse);
-+ if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||
-+ pcmcia_parse_tuple(handle, &tuple, &parse) != 0)
-+ goto next_entry;
- if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
- cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
- link->conf.ConfigIndex = cfg->index;
-@@ -224,17 +222,18 @@ static void ixj_config(dev_link_t * link
- link->io.BasePort2 = io->win[1].base;
- link->io.NumPorts2 = io->win[1].len;
- }
-- CFG_CHECK(RequestIO, link->handle, &link->io);
-+ if (pcmcia_request_io(link->handle, &link->io) != 0)
-+ goto next_entry;
- /* If we've got this far, we're done */
- break;
- }
- next_entry:
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
- dflt = *cfg;
-- CS_CHECK(GetNextTuple, handle, &tuple);
-+ CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));
- }
-
-- CS_CHECK(RequestConfiguration, handle, &link->conf);
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
-
- /*
- * Register the card with the core.
-@@ -258,8 +257,8 @@ static void ixj_cs_release(dev_link_t *l
- DEBUG(0, "ixj_cs_release(0x%p)\n", link);
- info->ndev = 0;
- link->dev = NULL;
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
- link->state &= ~DEV_CONFIG;
- }
-
-@@ -284,14 +283,14 @@ static int ixj_event(event_t event, int
- /* Fall through... */
- case CS_EVENT_RESET_PHYSICAL:
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- link->state &= ~DEV_SUSPEND;
- /* Fall through... */
- case CS_EVENT_CARD_RESET:
- if (DEV_OK(link))
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- break;
- }
- return 0;
---- linux-2.6.0/drivers/usb/class/cdc-acm.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/usb/class/cdc-acm.c 2003-12-28 23:22:00.000000000 -0800
-@@ -1,5 +1,5 @@
- /*
-- * acm.c Version 0.22
-+ * cdc-acm.c
- *
- * Copyright (c) 1999 Armin Fuerst <fuerst@in.tum.de>
- * Copyright (c) 1999 Pavel Machek <pavel@suse.cz>
-@@ -26,6 +26,7 @@
- * v0.21 - revert to probing on device for devices with multiple configs
- * v0.22 - probe only the control interface. if usbcore doesn't choose the
- * config we want, sysadmin changes bConfigurationValue in sysfs.
-+ * v0.23 - use softirq for rx processing, as needed by tty layer
- */
-
- /*
-@@ -44,6 +45,8 @@
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-+#undef DEBUG
-+
- #include <linux/kernel.h>
- #include <linux/errno.h>
- #include <linux/init.h>
-@@ -54,14 +57,13 @@
- #include <linux/module.h>
- #include <linux/smp_lock.h>
- #include <asm/uaccess.h>
--#undef DEBUG
- #include <linux/usb.h>
- #include <asm/byteorder.h>
-
- /*
- * Version Information
- */
--#define DRIVER_VERSION "v0.21"
-+#define DRIVER_VERSION "v0.23"
- #define DRIVER_AUTHOR "Armin Fuerst, Pavel Machek, Johannes Erdfelt, Vojtech Pavlik"
- #define DRIVER_DESC "USB Abstract Control Model driver for USB modems and ISDN adapters"
-
-@@ -146,7 +148,8 @@ struct acm {
- struct tty_struct *tty; /* the corresponding tty */
- struct urb *ctrlurb, *readurb, *writeurb; /* urbs */
- struct acm_line line; /* line coding (bits, stop, parity) */
-- struct work_struct work; /* work queue entry for line discipline waking up */
-+ struct work_struct work; /* work queue entry for line discipline waking up */
-+ struct tasklet_struct bh; /* rx processing */
- unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */
- unsigned int ctrlout; /* output control lines (DTR, RTS) */
- unsigned int writesize; /* max packet size for the output bulk endpoint */
-@@ -184,9 +187,10 @@ static int acm_ctrl_msg(struct acm *acm,
- #define acm_send_break(acm, ms) acm_ctrl_msg(acm, ACM_REQ_SEND_BREAK, ms, NULL, 0)
-
- /*
-- * Interrupt handler for various ACM control events
-+ * Interrupt handlers for various ACM device responses
- */
-
-+/* control interface reports status changes with "interrupt" transfers */
- static void acm_ctrl_irq(struct urb *urb, struct pt_regs *regs)
- {
- struct acm *acm = urb->context;
-@@ -251,20 +255,30 @@ exit:
- __FUNCTION__, status);
- }
-
-+/* data interface returns incoming bytes, or we got unthrottled */
- static void acm_read_bulk(struct urb *urb, struct pt_regs *regs)
- {
- struct acm *acm = urb->context;
-- struct tty_struct *tty = acm->tty;
-- unsigned char *data = urb->transfer_buffer;
-- int i = 0;
-
- if (!ACM_READY(acm))
- return;
-
- if (urb->status)
-- dbg("nonzero read bulk status received: %d", urb->status);
-+ dev_dbg(&acm->data->dev, "bulk rx status %d\n", urb->status);
-+
-+ /* calling tty_flip_buffer_push() in_irq() isn't allowed */
-+ tasklet_schedule(&acm->bh);
-+}
-+
-+static void acm_rx_tasklet(unsigned long _acm)
-+{
-+ struct acm *acm = (void *)_acm;
-+ struct urb *urb = acm->readurb;
-+ struct tty_struct *tty = acm->tty;
-+ unsigned char *data = urb->transfer_buffer;
-+ int i = 0;
-
-- if (!urb->status && !acm->throttle) {
-+ if (urb->actual_length > 0 && !acm->throttle) {
- for (i = 0; i < urb->actual_length && !acm->throttle; i++) {
- /* if we insert more than TTY_FLIPBUF_SIZE characters,
- * we drop them. */
-@@ -285,10 +299,12 @@ static void acm_read_bulk(struct urb *ur
- urb->actual_length = 0;
- urb->dev = acm->dev;
-
-- if (usb_submit_urb(urb, GFP_ATOMIC))
-- dbg("failed resubmitting read urb");
-+ i = usb_submit_urb(urb, GFP_ATOMIC);
-+ if (i)
-+ dev_dbg(&acm->data->dev, "bulk rx resubmit %d\n", i);
- }
-
-+/* data interface wrote those outgoing bytes */
- static void acm_write_bulk(struct urb *urb, struct pt_regs *regs)
- {
- struct acm *acm = (struct acm *)urb->context;
-@@ -621,6 +637,8 @@ static int acm_probe (struct usb_interfa
- acm->minor = minor;
- acm->dev = dev;
-
-+ acm->bh.func = acm_rx_tasklet;
-+ acm->bh.data = (unsigned long) acm;
- INIT_WORK(&acm->work, acm_softint, acm);
-
- if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) {
---- linux-2.6.0/drivers/usb/core/urb.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/drivers/usb/core/urb.c 2003-12-28 23:22:11.000000000 -0800
-@@ -268,7 +268,7 @@ int usb_submit_urb(struct urb *urb, int
- /* "high bandwidth" mode, 1-3 packets/uframe? */
- if (dev->speed == USB_SPEED_HIGH) {
- int mult = 1 + ((max >> 11) & 0x03);
-- max &= 0x03ff;
-+ max &= 0x07ff;
- max *= mult;
- }
-
---- linux-2.6.0/drivers/usb/gadget/ether.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/drivers/usb/gadget/ether.c 2003-12-28 23:21:01.000000000 -0800
-@@ -1761,9 +1761,7 @@ eth_bind (struct usb_gadget *gadget)
- /* network device setup */
- dev->net = net;
- SET_MODULE_OWNER (net);
-- net->priv = dev;
- strcpy (net->name, "usb%d");
-- ether_setup (net);
-
- /* one random address for the gadget device ... both of these could
- * reasonably come from an id prom or a module parameter.
---- linux-2.6.0/drivers/usb/host/ehci-sched.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/drivers/usb/host/ehci-sched.c 2003-12-28 23:22:11.000000000 -0800
-@@ -580,10 +580,10 @@ itd_fill (
- maxp = urb->dev->epmaxpacketout [epnum];
- buf1 = 0;
- }
-- buf1 |= (maxp & 0x03ff);
-+ buf1 |= (maxp & 0x07ff);
- multi = 1;
- multi += (maxp >> 11) & 0x03;
-- maxp &= 0x03ff;
-+ maxp &= 0x07ff;
- maxp *= multi;
-
- /* transfer can't fit in any uframe? */
---- linux-2.6.0/drivers/usb/image/scanner.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/drivers/usb/image/scanner.c 2003-12-28 23:23:06.000000000 -0800
-@@ -282,7 +282,7 @@
- * for common error messages rather than the maintainer.
- *
- * 0.4.7 11/28/2001
-- * - Fixed typo in Documentation/scanner.txt. Thanks to
-+ * - Fixed typo in Documentation/usb/scanner.txt. Thanks to
- * Karel <karel.vervaeke@pandora.be> for pointing it out.
- * - Added ID's for a Memorex 6136u. Thanks to Álvaro Gaspar de
- * Valenzuela" <agaspard@utsi.edu>.
---- linux-2.6.0/drivers/usb/input/powermate.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/usb/input/powermate.c 2003-12-28 23:22:01.000000000 -0800
-@@ -54,7 +54,11 @@
- #define UPDATE_PULSE_AWAKE (1<<2)
- #define UPDATE_PULSE_MODE (1<<3)
-
--#define POWERMATE_PAYLOAD_SIZE 3
-+/* at least two versions of the hardware exist, with differing payload
-+ sizes. the first three bytes always contain the "interesting" data in
-+ the relevant format. */
-+#define POWERMATE_PAYLOAD_SIZE_MAX 6
-+#define POWERMATE_PAYLOAD_SIZE_MIN 3
- struct powermate_device {
- signed char *data;
- dma_addr_t data_dma;
-@@ -269,7 +273,7 @@ static int powermate_input_event(struct
-
- static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_device *pm)
- {
-- pm->data = usb_buffer_alloc(udev, POWERMATE_PAYLOAD_SIZE,
-+ pm->data = usb_buffer_alloc(udev, POWERMATE_PAYLOAD_SIZE_MAX,
- SLAB_ATOMIC, &pm->data_dma);
- if (!pm->data)
- return -1;
-@@ -284,7 +288,7 @@ static int powermate_alloc_buffers(struc
- static void powermate_free_buffers(struct usb_device *udev, struct powermate_device *pm)
- {
- if (pm->data)
-- usb_buffer_free(udev, POWERMATE_PAYLOAD_SIZE,
-+ usb_buffer_free(udev, POWERMATE_PAYLOAD_SIZE_MAX,
- pm->data, pm->data_dma);
- if (pm->configcr)
- usb_buffer_free(udev, sizeof(*(pm->configcr)),
-@@ -347,12 +351,14 @@ static int powermate_probe(struct usb_in
- pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
- maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
-
-- if (maxp != POWERMATE_PAYLOAD_SIZE)
-- printk("powermate: Expected payload of %d bytes, found %d bytes!\n", POWERMATE_PAYLOAD_SIZE, maxp);
--
-+ if(maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX){
-+ printk("powermate: Expected payload of %d--%d bytes, found %d bytes!\n",
-+ POWERMATE_PAYLOAD_SIZE_MIN, POWERMATE_PAYLOAD_SIZE_MAX, maxp);
-+ maxp = POWERMATE_PAYLOAD_SIZE_MAX;
-+ }
-
- usb_fill_int_urb(pm->irq, udev, pipe, pm->data,
-- POWERMATE_PAYLOAD_SIZE, powermate_irq,
-+ maxp, powermate_irq,
- pm, endpoint->bInterval);
- pm->irq->transfer_dma = pm->data_dma;
- pm->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
---- linux-2.6.0/drivers/video/aty/aty128fb.c 2003-10-17 15:58:04.000000000 -0700
-+++ 25/drivers/video/aty/aty128fb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1536,6 +1536,7 @@ aty128_init(struct pci_dev *pdev, const
- /* fill in info */
- info->fbops = &aty128fb_ops;
- info->flags = FBINFO_FLAG_DEFAULT;
-+ info->dev = &pdev->dev;
-
- #ifdef CONFIG_PMAC_PBOOK
- par->lcd_on = default_lcd_on;
---- linux-2.6.0/drivers/video/cirrusfb.c 2003-06-14 12:18:32.000000000 -0700
-+++ 25/drivers/video/cirrusfb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -2528,7 +2528,7 @@ static int __init clgen_pci_setup (struc
-
- pdev = clgen_pci_dev_get (btype);
- if (!pdev) {
-- printk (KERN_ERR " Couldn't find PCI device\n");
-+ printk (KERN_INFO "cirrusfb: couldn't find Cirrus Logic PCI device\n");
- DPRINTK ("EXIT, returning 1\n");
- return 1;
- }
-@@ -2787,6 +2787,7 @@ int __init clgenfb_init(void)
- fb_info->gen.info.switch_con = &fbgen_switch;
- fb_info->gen.info.updatevar = &fbgen_update_var;
- fb_info->gen.info.flags = FBINFO_FLAG_DEFAULT;
-+ fb_info->gen.info.dev = fb_info->pdev;
-
- for (j = 0; j < 256; j++) {
- if (j < 16) {
---- linux-2.6.0/drivers/video/cyber2000fb.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/drivers/video/cyber2000fb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1366,6 +1366,7 @@ static int __devinit cyberpro_common_pro
- cfb->fb.fix.smem_len = smem_size;
- cfb->fb.fix.mmio_len = MMIO_SIZE;
- cfb->fb.screen_base = cfb->region;
-+ cfb->fb.dev = &cfb->dev->dev;
-
- err = -EINVAL;
- if (!fb_find_mode(&cfb->fb.var, &cfb->fb, NULL, NULL, 0,
---- linux-2.6.0/drivers/video/fbmem.c 2003-09-08 13:58:58.000000000 -0700
-+++ 25/drivers/video/fbmem.c 2003-12-28 23:23:00.000000000 -0800
-@@ -31,6 +31,7 @@
- #include <linux/kmod.h>
- #endif
- #include <linux/devfs_fs_kernel.h>
-+#include <linux/device.h>
-
- #if defined(__mc68000__) || defined(CONFIG_APUS)
- #include <asm/setup.h>
-@@ -1199,6 +1200,10 @@ static struct file_operations fb_fops =
- #endif
- };
-
-+static struct class fb_class = {
-+ .name = "video",
-+};
-+
- /**
- * register_framebuffer - registers a frame buffer device
- * @fb_info: frame buffer info structure
-@@ -1242,6 +1247,8 @@ register_framebuffer(struct fb_info *fb_
-
- devfs_mk_cdev(MKDEV(FB_MAJOR, i),
- S_IFCHR | S_IRUGO | S_IWUGO, "fb/%d", i);
-+
-+ simple_add_class_device(&fb_class, MKDEV(FB_MAJOR, i), fb_info->dev, "fb%d", i);
- return 0;
- }
-
-@@ -1270,6 +1277,7 @@ unregister_framebuffer(struct fb_info *f
- kfree(fb_info->pixmap.addr);
- registered_fb[i]=NULL;
- num_registered_fb--;
-+ simple_remove_class_device(MKDEV(FB_MAJOR, i));
- return 0;
- }
-
-@@ -1294,6 +1302,8 @@ fbmem_init(void)
- if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
- printk("unable to get major %d for fb devs\n", FB_MAJOR);
-
-+ class_register(&fb_class);
-+
- #ifdef CONFIG_FB_OF
- if (ofonly) {
- offb_init();
---- linux-2.6.0/drivers/video/fbmon.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/drivers/video/fbmon.c 2003-12-28 23:21:48.000000000 -0800
-@@ -890,30 +890,6 @@ struct __fb_timings {
- u32 vtotal;
- };
-
--/*
-- * a simple function to get the square root of integers
-- */
--static u32 fb_sqrt(int x)
--{
-- register int op, res, one;
--
-- op = x;
-- res = 0;
--
-- one = 1 << 30;
-- while (one > op) one >>= 2;
--
-- while (one != 0) {
-- if (op >= res + one) {
-- op = op - (res + one);
-- res = res + 2 * one;
-- }
-- res /= 2;
-- one /= 4;
-- }
-- return((u32) res);
--}
--
- /**
- * fb_get_vblank - get vertical blank time
- * @hfreq: horizontal freq
-@@ -1002,7 +978,7 @@ static u32 fb_get_hblank_by_dclk(u32 dcl
- h_period += (M_VAL * xres * 2 * 1000)/(5 * dclk);
- h_period *=10000;
-
-- h_period = fb_sqrt((int) h_period);
-+ h_period = int_sqrt(h_period);
- h_period -= (100 - C_VAL) * 100;
- h_period *= 1000;
- h_period /= 2 * M_VAL;
---- linux-2.6.0/drivers/video/hgafb.c 2003-06-14 12:18:30.000000000 -0700
-+++ 25/drivers/video/hgafb.c 2003-12-28 23:22:57.000000000 -0800
-@@ -539,7 +539,7 @@ static struct fb_ops hgafb_ops = {
- int __init hgafb_init(void)
- {
- if (! hga_card_detect()) {
-- printk(KERN_ERR "hgafb: HGA card not detected.\n");
-+ printk(KERN_INFO "hgafb: HGA card not detected.\n");
- return -EINVAL;
- }
-
---- linux-2.6.0/drivers/video/i810/i810_main.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/drivers/video/i810/i810_main.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1880,6 +1880,7 @@ static int __devinit i810fb_init_pci (st
- info->fbops = &par->i810fb_ops;
- info->pseudo_palette = par->pseudo_palette;
- info->flags = FBINFO_FLAG_DEFAULT;
-+ info->dev = &dev->dev;
-
- fb_alloc_cmap(&info->cmap, 256, 0);
-
---- linux-2.6.0/drivers/video/igafb.c 2003-11-26 13:53:35.000000000 -0800
-+++ 25/drivers/video/igafb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -332,7 +332,7 @@ static struct fb_ops igafb_ops = {
- #endif
- };
-
--static int __init iga_init(struct fb_info *info, struct iga_par *par)
-+static int __init iga_init(struct fb_info *info, struct iga_par *par, struct pci_dev *dev)
- {
- char vramsz = iga_inb(par, IGA_EXT_CNTRL, IGA_IDX_EXT_BUS_CNTL)
- & MEM_SIZE_ALIAS;
-@@ -358,6 +358,7 @@ static int __init iga_init(struct fb_inf
-
- info->fbops = &igafb_ops;
- info->flags = FBINFO_FLAG_DEFAULT;
-+ info->dev = &dev->dev;
-
- fb_alloc_cmap(&info->cmap, video_cmap_len, 0);
-
-@@ -529,7 +530,7 @@ int __init igafb_init(void)
- info->fix = igafb_fix;
- info->pseudo_palette = (void *)(par + 1);
-
-- if (!iga_init(info, par)) {
-+ if (!iga_init(info, par, pdev)) {
- iounmap((void *)par->io_base);
- iounmap(info->screen_base);
- if (par->mmap_map)
---- linux-2.6.0/drivers/video/imsttfb.c 2003-10-17 15:58:04.000000000 -0700
-+++ 25/drivers/video/imsttfb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1348,7 +1348,7 @@ static struct fb_ops imsttfb_ops = {
- };
-
- static void __init
--init_imstt(struct fb_info *info)
-+init_imstt(struct fb_info *info, struct pci_dev *pdev)
- {
- struct imstt_par *par = (struct imstt_par *) info->par;
- __u32 i, tmp, *ip, *end;
-@@ -1442,6 +1442,7 @@ init_imstt(struct fb_info *info)
-
- info->fbops = &imsttfb_ops;
- info->flags = FBINFO_FLAG_DEFAULT;
-+ info->dev = &pdev->dev;
-
- fb_alloc_cmap(&info->cmap, 0, 0);
-
-@@ -1520,7 +1521,7 @@ imsttfb_probe(struct pci_dev *pdev, cons
- par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
- info->par = par;
- info->pseudo_palette = (void *) (par + 1);
-- init_imstt(info);
-+ init_imstt(info, pdev);
-
- pci_set_drvdata(pdev, info);
- return 0;
---- linux-2.6.0/drivers/video/matrox/matroxfb_crtc2.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/drivers/video/matrox/matroxfb_crtc2.c 2003-12-28 23:23:00.000000000 -0800
-@@ -605,6 +605,7 @@ static int matroxfb_dh_regit(CPMINFO str
- m2info->fbcon.flags = FBINFO_FLAG_DEFAULT;
- m2info->fbcon.currcon = -1;
- m2info->fbcon.pseudo_palette = m2info->cmap;
-+ m2info->fbcon.dev = &m2info->primary_dev->pcidev->dev;
- fb_alloc_cmap(&m2info->fbcon.cmap, 256, 1);
-
- if (mem < 64)
---- linux-2.6.0/drivers/video/neofb.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/drivers/video/neofb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1943,6 +1943,7 @@ static struct fb_info *__devinit neo_all
- info->flags = FBINFO_FLAG_DEFAULT;
- info->par = par;
- info->pseudo_palette = (void *) (par + 1);
-+ info->dev = &dev->dev;
-
- fb_alloc_cmap(&info->cmap, NR_PALETTE, 0);
-
---- linux-2.6.0/drivers/video/radeonfb.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/drivers/video/radeonfb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -679,7 +679,7 @@ static __inline__ int _max(int val1, int
- */
-
- static char *mode_option __initdata;
--static char noaccel = 1;
-+static char noaccel = 0;
- static char mirror = 0;
- static int panel_yres __initdata = 0;
- static char force_dfp __initdata = 0;
-@@ -1099,7 +1099,7 @@ static int radeon_get_dfpinfo_BIOS(struc
- printk("radeonfb: detected DFP panel size from BIOS: %dx%d\n",
- rinfo->panel_xres, rinfo->panel_yres);
-
-- for(i=0; i<20; i++) {
-+ for(i=0; i<21; i++) {
- tmp0 = rinfo->bios_seg + readw(tmp+64+i*2);
- if (tmp0 == 0)
- break;
-@@ -1241,9 +1241,6 @@ static void radeon_engine_init (struct r
- radeon_fifo_wait (1);
- OUTREG(RB2D_DSTCACHE_MODE, 0);
-
-- /* XXX */
-- rinfo->pitch = ((rinfo->xres_virtual * (rinfo->bpp / 8) + 0x3f)) >> 6;
--
- radeon_fifo_wait (1);
- temp = INREG(DEFAULT_PITCH_OFFSET);
- OUTREG(DEFAULT_PITCH_OFFSET, ((temp & 0xc0000000) |
-@@ -1782,6 +1779,7 @@ static int radeonfb_set_par (struct fb_i
- int hsync_start, hsync_fudge, bytpp, hsync_wid, vsync_wid;
- int primary_mon = PRIMARY_MONITOR(rinfo);
- int depth = var_to_depth(mode);
-+ int accel = (mode->accel_flags & FB_ACCELF_TEXT) != 0;
-
- rinfo->xres = mode->xres;
- rinfo->yres = mode->yres;
-@@ -1878,7 +1876,15 @@ static int radeonfb_set_par (struct fb_i
- newmode.crtc_v_sync_strt_wid = (((vSyncStart - 1) & 0xfff) |
- (vsync_wid << 16) | (v_sync_pol << 23));
-
-- newmode.crtc_pitch = (mode->xres_virtual >> 3);
-+ if (accel) {
-+ /* We first calculate the engine pitch */
-+ rinfo->pitch = ((mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8) + 0x3f)
-+ & ~(0x3f)) >> 6;
-+
-+ /* Then, re-multiply it to get the CRTC pitch */
-+ newmode.crtc_pitch = (rinfo->pitch << 3) / ((mode->bits_per_pixel + 1) / 8);
-+ } else
-+ newmode.crtc_pitch = (mode->xres_virtual >> 3);
- newmode.crtc_pitch |= (newmode.crtc_pitch << 16);
-
- #if defined(__BIG_ENDIAN)
-@@ -2085,18 +2091,21 @@ static int radeonfb_set_par (struct fb_i
- if (!rinfo->asleep) {
- radeon_write_mode (rinfo, &newmode);
- /* (re)initialize the engine */
-- if (!noaccel)
-+ if (noaccel)
- radeon_engine_init (rinfo);
-
- }
- /* Update fix */
-- info->fix.line_length = rinfo->pitch*64;
-+ if (accel)
-+ info->fix.line_length = rinfo->pitch*64;
-+ else
-+ info->fix.line_length = mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8);
- info->fix.visual = rinfo->depth == 8 ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR;
-
- #ifdef CONFIG_BOOTX_TEXT
- /* Update debug text engine */
- btext_update_display(rinfo->fb_base_phys, mode->xres, mode->yres,
-- rinfo->depth, rinfo->pitch*64);
-+ rinfo->depth, info->fix.line_length);
- #endif
-
- return 0;
-@@ -3022,17 +3031,13 @@ static int radeonfb_pci_register (struct
- */
- radeon_save_state (rinfo, &rinfo->init_state);
-
-- if (!noaccel) {
-- /* initialize the engine */
-- radeon_engine_init (rinfo);
-- }
--
- /* set all the vital stuff */
- radeon_set_fbinfo (rinfo);
-
- pci_set_drvdata(pdev, rinfo);
- rinfo->next = board_list;
- board_list = rinfo;
-+ rinfo->info.dev = &pdev->dev;
-
- if (register_framebuffer ((struct fb_info *) rinfo) < 0) {
- printk ("radeonfb: could not register framebuffer\n");
---- linux-2.6.0/drivers/video/riva/fbdev.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/drivers/video/riva/fbdev.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1751,6 +1751,7 @@ static int __devinit rivafb_probe(struct
- if (info->pixmap.addr == NULL)
- goto err_out_kfree1;
- memset(info->pixmap.addr, 0, 64 * 1024);
-+ info->dev = &pd->dev;
-
- strcat(rivafb_fix.id, rci->name);
- default_par->riva.Architecture = rci->arch_rev;
---- linux-2.6.0/drivers/video/sis/init301.c 2003-07-13 21:44:34.000000000 -0700
-+++ 25/drivers/video/sis/init301.c 2003-12-28 23:22:17.000000000 -0800
-@@ -11712,7 +11712,7 @@ SetOEMLCDData(SiS_Private *SiS_Pr, PSIS_
- }
-
- temp = GetOEMLCDPtr(SiS_Pr,HwDeviceExtension, ROMAddr, 1);
-- if(temp = 0xFFFF) return;
-+ if(temp == 0xFFFF) return;
-
- index = SiS_Pr->SiS_VBModeIDTable[ModeIdIndex]._VB_LCDHIndex;
- for(i=0x14, j=0; i<=0x17; i++, j++) {
---- linux-2.6.0/drivers/video/sis/sis_main.c 2003-06-14 12:18:25.000000000 -0700
-+++ 25/drivers/video/sis/sis_main.c 2003-12-28 23:23:00.000000000 -0800
-@@ -4507,6 +4507,7 @@ int __init sisfb_init(void)
- sis_fb_info.par = &ivideo;
- sis_fb_info.screen_base = ivideo.video_vbase;
- sis_fb_info.fbops = &sisfb_ops;
-+ sis_fb_info.dev = &pdev->dev;
- sisfb_get_fix(&sis_fb_info.fix, -1, &sis_fb_info);
- sis_fb_info.pseudo_palette = pseudo_palette;
-
---- linux-2.6.0/drivers/video/sstfb.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/drivers/video/sstfb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1477,6 +1477,7 @@ static int __devinit sstfb_probe(struct
- info->fbops = &sstfb_ops;
- info->currcon = -1;
- info->pseudo_palette = &all->pseudo_palette;
-+ info->dev = &pdev->dev;
-
- fix->type = FB_TYPE_PACKED_PIXELS;
- fix->visual = FB_VISUAL_TRUECOLOR;
---- linux-2.6.0/drivers/video/tdfxfb.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/drivers/video/tdfxfb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1248,6 +1248,7 @@ static int __devinit tdfxfb_probe(struct
- info->par = default_par;
- info->pseudo_palette = (void *)(default_par + 1);
- info->flags = FBINFO_FLAG_DEFAULT;
-+ info->dev = &pdev->dev;
-
- #ifndef MODULE
- if (!mode_option)
---- linux-2.6.0/drivers/video/tgafb.c 2003-06-14 12:18:28.000000000 -0700
-+++ 25/drivers/video/tgafb.c 2003-12-28 23:23:00.000000000 -0800
-@@ -1430,6 +1430,7 @@ tgafb_pci_register(struct pci_dev *pdev,
- all->info.currcon = -1;
- all->info.par = &all->par;
- all->info.pseudo_palette = all->pseudo_palette;
-+ all->info.dev = &pdev->dev;
-
- /* This should give a reasonable default video mode. */
-
---- linux-2.6.0/drivers/video/tridentfb.c 2003-10-17 15:58:04.000000000 -0700
-+++ 25/drivers/video/tridentfb.c 2003-12-28 23:23:02.000000000 -0800
-@@ -723,7 +723,7 @@ static int tridentfb_check_var(struct fb
- if (bpp == 24 )
- bpp = var->bits_per_pixel = 32;
- /* check whether resolution fits on panel and in memory*/
-- if (var->xres > nativex)
-+ if (flatpanel && nativex && var->xres > nativex)
- return -EINVAL;
- if (var->xres * var->yres_virtual * bpp/8 > info->fix.smem_len)
- return -EINVAL;
-@@ -1156,6 +1156,7 @@ static int __devinit trident_pci_probe(s
- default_var.accel_flags &= ~FB_ACCELF_TEXT;
- default_var.activate |= FB_ACTIVATE_NOW;
- fb_info.var = default_var;
-+ fb_info.dev = &dev->dev;
- if (register_framebuffer(&fb_info) < 0) {
- output("Could not register Trident framebuffer\n");
- return -EINVAL;
---- linux-2.6.0/fs/aio.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/aio.c 2003-12-28 23:26:44.000000000 -0800
-@@ -27,6 +27,8 @@
- #include <linux/aio.h>
- #include <linux/highmem.h>
- #include <linux/workqueue.h>
-+#include <linux/writeback.h>
-+#include <linux/pagemap.h>
-
- #include <asm/kmap_types.h>
- #include <asm/uaccess.h>
-@@ -38,6 +40,9 @@
- #define dprintk(x...) do { ; } while (0)
- #endif
-
-+long aio_run = 0; /* for testing only */
-+long aio_wakeups = 0; /* for testing only */
-+
- /*------ sysctl variables----*/
- atomic_t aio_nr = ATOMIC_INIT(0); /* current system wide number of aio requests */
- unsigned aio_max_nr = 0x10000; /* system wide maximum number of aio requests */
-@@ -47,6 +52,7 @@ static kmem_cache_t *kiocb_cachep;
- static kmem_cache_t *kioctx_cachep;
-
- static struct workqueue_struct *aio_wq;
-+static struct workqueue_struct *aio_fput_wq;
-
- /* Used for rare fput completion. */
- static void aio_fput_routine(void *);
-@@ -74,6 +80,7 @@ static int __init aio_setup(void)
- panic("unable to create kioctx cache");
-
- aio_wq = create_workqueue("aio");
-+ aio_fput_wq = create_workqueue("aio_fput");
-
- pr_debug("aio_setup: sizeof(struct page) = %d\n", (int)sizeof(struct page));
-
-@@ -281,6 +288,7 @@ static void aio_cancel_all(struct kioctx
- struct kiocb *iocb = list_kiocb(pos);
- list_del_init(&iocb->ki_list);
- cancel = iocb->ki_cancel;
-+ kiocbSetCancelled(iocb);
- if (cancel) {
- iocb->ki_users++;
- spin_unlock_irq(&ctx->ctx_lock);
-@@ -341,6 +349,11 @@ void exit_aio(struct mm_struct *mm)
- aio_cancel_all(ctx);
-
- wait_for_all_aios(ctx);
-+ /*
-+ * this is an overkill, but ensures we don't leave
-+ * the ctx on the aio_wq
-+ */
-+ flush_workqueue(aio_wq);
-
- if (1 != atomic_read(&ctx->users))
- printk(KERN_DEBUG
-@@ -400,6 +413,7 @@ static struct kiocb *__aio_get_req(struc
- req->ki_cancel = NULL;
- req->ki_retry = NULL;
- req->ki_user_obj = NULL;
-+ INIT_LIST_HEAD(&req->ki_run_list);
-
- /* Check if the completion queue has enough free space to
- * accept an event from this io.
-@@ -499,7 +513,7 @@ static int __aio_put_req(struct kioctx *
- spin_lock(&fput_lock);
- list_add(&req->ki_list, &fput_head);
- spin_unlock(&fput_lock);
-- queue_work(aio_wq, &fput_work);
-+ queue_work(aio_fput_wq, &fput_work);
- } else
- really_put_req(ctx, req);
- return 1;
-@@ -541,65 +555,324 @@ struct kioctx *lookup_ioctx(unsigned lon
- return ioctx;
- }
-
-+/*
-+ * use_mm
-+ * Makes the calling kernel thread take on the specified
-+ * mm context.
-+ * Called by the retry thread execute retries within the
-+ * iocb issuer's mm context, so that copy_from/to_user
-+ * operations work seamlessly for aio.
-+ * (Note: this routine is intended to be called only
-+ * from a kernel thread context)
-+ */
- static void use_mm(struct mm_struct *mm)
- {
-- struct mm_struct *active_mm = current->active_mm;
-+ struct mm_struct *active_mm;
-+ struct task_struct *tsk = current;
-+
-+ task_lock(tsk);
-+ active_mm = tsk->active_mm;
- atomic_inc(&mm->mm_count);
-- current->mm = mm;
-- if (mm != active_mm) {
-- current->active_mm = mm;
-- activate_mm(active_mm, mm);
-- }
-+ tsk->mm = mm;
-+ tsk->active_mm = mm;
-+ activate_mm(active_mm, mm);
-+ task_unlock(tsk);
-+
- mmdrop(active_mm);
- }
-
--static void unuse_mm(struct mm_struct *mm)
-+/*
-+ * unuse_mm
-+ * Reverses the effect of use_mm, i.e. releases the
-+ * specified mm context which was earlier taken on
-+ * by the calling kernel thread
-+ * (Note: this routine is intended to be called only
-+ * from a kernel thread context)
-+ *
-+ * Comments: Called with ctx->ctx_lock held. This nests
-+ * task_lock instead ctx_lock.
-+ */
-+void unuse_mm(struct mm_struct *mm)
- {
-- current->mm = NULL;
-+ struct task_struct *tsk = current;
-+
-+ task_lock(tsk);
-+ tsk->mm = NULL;
- /* active_mm is still 'mm' */
-- enter_lazy_tlb(mm, current);
-+ enter_lazy_tlb(mm, tsk);
-+ task_unlock(tsk);
- }
-
--/* Run on kevent's context. FIXME: needs to be per-cpu and warn if an
-- * operation blocks.
-+/*
-+ * Queue up a kiocb to be retried. Assumes that the kiocb
-+ * has already been marked as kicked, and places it on
-+ * the retry run list for the corresponding ioctx, if it
-+ * isn't already queued. Returns 1 if it actually queued
-+ * the kiocb (to tell the caller to activate the work
-+ * queue to process it), or 0, if it found that it was
-+ * already queued.
-+ *
-+ * Should be called with the spin lock iocb->ki_ctx->ctx_lock
-+ * held
- */
--static void aio_kick_handler(void *data)
-+static inline int __queue_kicked_iocb(struct kiocb *iocb)
- {
-- struct kioctx *ctx = data;
-+ struct kioctx *ctx = iocb->ki_ctx;
-
-- use_mm(ctx->mm);
-+ if (list_empty(&iocb->ki_run_list)) {
-+ list_add_tail(&iocb->ki_run_list,
-+ &ctx->run_list);
-+ iocb->ki_queued++;
-+ return 1;
-+ }
-+ return 0;
-+}
-
-- spin_lock_irq(&ctx->ctx_lock);
-- while (!list_empty(&ctx->run_list)) {
-- struct kiocb *iocb;
-- long ret;
-+/* aio_run_iocb
-+ * This is the core aio execution routine. It is
-+ * invoked both for initial i/o submission and
-+ * subsequent retries via the aio_kick_handler.
-+ * Expects to be invoked with iocb->ki_ctx->lock
-+ * already held. The lock is released and reaquired
-+ * as needed during processing.
-+ *
-+ * Calls the iocb retry method (already setup for the
-+ * iocb on initial submission) for operation specific
-+ * handling, but takes care of most of common retry
-+ * execution details for a given iocb. The retry method
-+ * needs to be non-blocking as far as possible, to avoid
-+ * holding up other iocbs waiting to be serviced by the
-+ * retry kernel thread.
-+ *
-+ * The trickier parts in this code have to do with
-+ * ensuring that only one retry instance is in progress
-+ * for a given iocb at any time. Providing that guarantee
-+ * simplifies the coding of individual aio operations as
-+ * it avoids various potential races.
-+ */
-+static ssize_t aio_run_iocb(struct kiocb *iocb)
-+{
-+ struct kioctx *ctx = iocb->ki_ctx;
-+ ssize_t (*retry)(struct kiocb *);
-+ ssize_t ret;
-
-- iocb = list_entry(ctx->run_list.next, struct kiocb,
-- ki_run_list);
-- list_del(&iocb->ki_run_list);
-- iocb->ki_users ++;
-- spin_unlock_irq(&ctx->ctx_lock);
-+ if (iocb->ki_retried++ > 1024*1024) {
-+ printk("Maximal retry count. Bytes done %Zd\n",
-+ iocb->ki_nbytes - iocb->ki_left);
-+ return -EAGAIN;
-+ }
-
-- kiocbClearKicked(iocb);
-- ret = iocb->ki_retry(iocb);
-+ if (!(iocb->ki_retried & 0xff)) {
-+ pr_debug("%ld retry: %d of %d (kick %ld, Q %ld run %ld, wake %ld)\n",
-+ iocb->ki_retried,
-+ iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
-+ iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
-+ }
-+
-+ if (!(retry = iocb->ki_retry)) {
-+ printk("aio_run_iocb: iocb->ki_retry = NULL\n");
-+ return 0;
-+ }
-+
-+ /*
-+ * We don't want the next retry iteration for this
-+ * operation to start until this one has returned and
-+ * updated the iocb state. However, wait_queue functions
-+ * can trigger a kick_iocb from interrupt context in the
-+ * meantime, indicating that data is available for the next
-+ * iteration. We want to remember that and enable the
-+ * next retry iteration _after_ we are through with
-+ * this one.
-+ *
-+ * So, in order to be able to register a "kick", but
-+ * prevent it from being queued now, we clear the kick
-+ * flag, but make the kick code *think* that the iocb is
-+ * still on the run list until we are actually done.
-+ * When we are done with this iteration, we check if
-+ * the iocb was kicked in the meantime and if so, queue
-+ * it up afresh.
-+ */
-+
-+ kiocbClearKicked(iocb);
-+
-+ /*
-+ * This is so that aio_complete knows it doesn't need to
-+ * pull the iocb off the run list (We can't just call
-+ * INIT_LIST_HEAD because we don't want a kick_iocb to
-+ * queue this on the run list yet)
-+ */
-+ iocb->ki_run_list.next = iocb->ki_run_list.prev = NULL;
-+ iocb->ki_retry = NULL;
-+ spin_unlock_irq(&ctx->ctx_lock);
-+
-+ /* Quit retrying if the i/o has been cancelled */
-+ if (kiocbIsCancelled(iocb)) {
-+ ret = -EINTR;
-+ aio_complete(iocb, ret, 0);
-+ /* must not access the iocb after this */
-+ goto out;
-+ }
-+
-+ /*
-+ * Now we are all set to call the retry method in async
-+ * context. By setting this thread's io_wait context
-+ * to point to the wait queue entry inside the currently
-+ * running iocb for the duration of the retry, we ensure
-+ * that async notification wakeups are queued by the
-+ * operation instead of blocking waits, and when notified,
-+ * cause the iocb to be kicked for continuation (through
-+ * the aio_wake_function callback).
-+ */
-+ BUG_ON(current->io_wait != NULL);
-+ current->io_wait = &iocb->ki_wait;
-+ ret = retry(iocb);
-+ current->io_wait = NULL;
-+
-+ if (-EIOCBRETRY != ret) {
- if (-EIOCBQUEUED != ret) {
-+ BUG_ON(!list_empty(&iocb->ki_wait.task_list));
- aio_complete(iocb, ret, 0);
-- iocb = NULL;
-+ /* must not access the iocb after this */
- }
-+ } else {
-+ /*
-+ * Issue an additional retry to avoid waiting forever if
-+ * no waits were queued (e.g. in case of a short read).
-+ */
-+ if (list_empty(&iocb->ki_wait.task_list))
-+ kiocbSetKicked(iocb);
-+ }
-+out:
-+ spin_lock_irq(&ctx->ctx_lock);
-
-- spin_lock_irq(&ctx->ctx_lock);
-- if (NULL != iocb)
-- __aio_put_req(ctx, iocb);
-+ if (-EIOCBRETRY == ret) {
-+ /*
-+ * OK, now that we are done with this iteration
-+ * and know that there is more left to go,
-+ * this is where we let go so that a subsequent
-+ * "kick" can start the next iteration
-+ */
-+ iocb->ki_retry = retry;
-+ /* will make __queue_kicked_iocb succeed from here on */
-+ INIT_LIST_HEAD(&iocb->ki_run_list);
-+ /* we must queue the next iteration ourselves, if it
-+ * has already been kicked */
-+ if (kiocbIsKicked(iocb)) {
-+ __queue_kicked_iocb(iocb);
-+ }
- }
-+ return ret;
-+}
-+
-+/*
-+ * __aio_run_iocbs:
-+ * Process all pending retries queued on the ioctx
-+ * run list.
-+ * Assumes it is operating within the aio issuer's mm
-+ * context. Expects to be called with ctx->ctx_lock held
-+ */
-+static int __aio_run_iocbs(struct kioctx *ctx)
-+{
-+ struct kiocb *iocb;
-+ int count = 0;
-+ LIST_HEAD(run_list);
-+
-+ list_splice_init(&ctx->run_list, &run_list);
-+ while (!list_empty(&run_list)) {
-+ iocb = list_entry(run_list.next, struct kiocb,
-+ ki_run_list);
-+ list_del(&iocb->ki_run_list);
-+ /*
-+ * Hold an extra reference while retrying i/o.
-+ */
-+ iocb->ki_users++; /* grab extra reference */
-+ aio_run_iocb(iocb);
-+ if (__aio_put_req(ctx, iocb)) /* drop extra ref */
-+ put_ioctx(ctx);
-+ count++;
-+ }
-+ aio_run++;
-+ if (!list_empty(&ctx->run_list))
-+ return 1;
-+ return 0;
-+}
-+
-+/*
-+ * aio_run_iocbs:
-+ * Process all pending retries queued on the ioctx
-+ * run list.
-+ * Assumes it is operating within the aio issuer's mm
-+ * context.
-+ */
-+static inline void aio_run_iocbs(struct kioctx *ctx)
-+{
-+ int requeue;
-+
-+ spin_lock_irq(&ctx->ctx_lock);
-+ requeue = __aio_run_iocbs(ctx);
- spin_unlock_irq(&ctx->ctx_lock);
-+ if (requeue)
-+ queue_work(aio_wq, &ctx->wq);
-+}
-
-+/*
-+ * aio_kick_handler:
-+ * Work queue handler triggered to process pending
-+ * retries on an ioctx. Takes on the aio issuer's
-+ * mm context before running the iocbs, so that
-+ * copy_xxx_user operates on the issuer's address
-+ * space.
-+ * Run on aiod's context.
-+ */
-+static void aio_kick_handler(void *data)
-+{
-+ struct kioctx *ctx = data;
-+ mm_segment_t oldfs = get_fs();
-+ int requeue;
-+
-+ set_fs(USER_DS);
-+ use_mm(ctx->mm);
-+ spin_lock_irq(&ctx->ctx_lock);
-+ requeue = __aio_run_iocbs(ctx);
- unuse_mm(ctx->mm);
-+ spin_unlock_irq(&ctx->ctx_lock);
-+ set_fs(oldfs);
-+ if (requeue)
-+ queue_work(aio_wq, &ctx->wq);
- }
-
--void kick_iocb(struct kiocb *iocb)
-+
-+/*
-+ * Called by kick_iocb to queue the kiocb for retry
-+ * and if required activate the aio work queue to process
-+ * it
-+ */
-+void queue_kicked_iocb(struct kiocb *iocb)
- {
- struct kioctx *ctx = iocb->ki_ctx;
-+ unsigned long flags;
-+ int run = 0;
-+
-+ WARN_ON((!list_empty(&iocb->ki_wait.task_list)));
-
-+ spin_lock_irqsave(&ctx->ctx_lock, flags);
-+ run = __queue_kicked_iocb(iocb);
-+ spin_unlock_irqrestore(&ctx->ctx_lock, flags);
-+ if (run) {
-+ queue_work(aio_wq, &ctx->wq);
-+ aio_wakeups++;
-+ }
-+}
-+
-+/*
-+ * kick_iocb:
-+ * Called typically from a wait queue callback context
-+ * (aio_wake_function) to trigger a retry of the iocb.
-+ * The retry is usually executed by aio workqueue
-+ * threads (See aio_kick_handler).
-+ */
-+void kick_iocb(struct kiocb *iocb)
-+{
- /* sync iocbs are easy: they can only ever be executing from a
- * single context. */
- if (is_sync_kiocb(iocb)) {
-@@ -608,12 +881,10 @@ void kick_iocb(struct kiocb *iocb)
- return;
- }
-
-+ iocb->ki_kicked++;
-+ /* If its already kicked we shouldn't queue it again */
- if (!kiocbTryKick(iocb)) {
-- unsigned long flags;
-- spin_lock_irqsave(&ctx->ctx_lock, flags);
-- list_add_tail(&iocb->ki_run_list, &ctx->run_list);
-- spin_unlock_irqrestore(&ctx->ctx_lock, flags);
-- schedule_work(&ctx->wq);
-+ queue_kicked_iocb(iocb);
- }
- }
-
-@@ -666,6 +937,9 @@ int aio_complete(struct kiocb *iocb, lon
- */
- spin_lock_irqsave(&ctx->ctx_lock, flags);
-
-+ if (iocb->ki_run_list.prev && !list_empty(&iocb->ki_run_list))
-+ list_del_init(&iocb->ki_run_list);
-+
- ring = kmap_atomic(info->ring_pages[0], KM_IRQ1);
-
- tail = info->tail;
-@@ -694,6 +968,11 @@ int aio_complete(struct kiocb *iocb, lon
-
- pr_debug("added to ring %p at [%lu]\n", iocb, tail);
-
-+ pr_debug("%ld retries: %d of %d (kicked %ld, Q %ld run %ld wake %ld)\n",
-+ iocb->ki_retried,
-+ iocb->ki_nbytes - iocb->ki_left, iocb->ki_nbytes,
-+ iocb->ki_kicked, iocb->ki_queued, aio_run, aio_wakeups);
-+
- /* everything turned out well, dispose of the aiocb. */
- ret = __aio_put_req(ctx, iocb);
-
-@@ -808,6 +1087,7 @@ static int read_events(struct kioctx *ct
- int i = 0;
- struct io_event ent;
- struct timeout to;
-+ int event_loop = 0; /* testing only */
-
- /* needed to zero any padding within an entry (there shouldn't be
- * any, but C is fun!
-@@ -857,7 +1137,6 @@ static int read_events(struct kioctx *ct
- add_wait_queue_exclusive(&ctx->wait, &wait);
- do {
- set_task_state(tsk, TASK_INTERRUPTIBLE);
--
- ret = aio_read_evt(ctx, &ent);
- if (ret)
- break;
-@@ -867,6 +1146,7 @@ static int read_events(struct kioctx *ct
- if (to.timed_out) /* Only check after read evt */
- break;
- schedule();
-+ event_loop++;
- if (signal_pending(tsk)) {
- ret = -EINTR;
- break;
-@@ -894,6 +1174,9 @@ static int read_events(struct kioctx *ct
- if (timeout)
- clear_timeout(&to);
- out:
-+ pr_debug("event loop executed %d times\n", event_loop);
-+ pr_debug("aio_run %ld\n", aio_run);
-+ pr_debug("aio_wakeups %ld\n", aio_wakeups);
- return i ? i : ret;
- }
-
-@@ -923,6 +1206,11 @@ static void io_destroy(struct kioctx *io
-
- aio_cancel_all(ioctx);
- wait_for_all_aios(ioctx);
-+ /*
-+ * this is an overkill, but ensures we don't leave
-+ * the ctx on the aio_wq
-+ */
-+ flush_workqueue(aio_wq);
- put_ioctx(ioctx); /* once for the lookup */
- }
-
-@@ -985,13 +1273,191 @@ asmlinkage long sys_io_destroy(aio_conte
- return -EINVAL;
- }
-
-+/*
-+ * Retry method for aio_read (also used for first time submit)
-+ * Responsible for updating iocb state as retries progress
-+ */
-+static ssize_t aio_pread(struct kiocb *iocb)
-+{
-+ struct file *file = iocb->ki_filp;
-+ ssize_t ret = 0;
-+
-+ ret = file->f_op->aio_read(iocb, iocb->ki_buf,
-+ iocb->ki_left, iocb->ki_pos);
-+
-+ /*
-+ * Can't just depend on iocb->ki_left to determine
-+ * whether we are done. This may have been a short read.
-+ */
-+ if (ret > 0) {
-+ iocb->ki_buf += ret;
-+ iocb->ki_left -= ret;
-+
-+ ret = -EIOCBRETRY;
-+ }
-+
-+ /* This means we must have transferred all that we could */
-+ /* No need to retry anymore */
-+ if ((ret == 0) || (iocb->ki_left == 0))
-+ ret = iocb->ki_nbytes - iocb->ki_left;
-+
-+ return ret;
-+}
-+
-+/*
-+ * Retry method for aio_write (also used for first time submit)
-+ * Responsible for updating iocb state as retries progress
-+ */
-+static ssize_t aio_pwrite(struct kiocb *iocb)
-+{
-+ struct file *file = iocb->ki_filp;
-+ struct address_space *mapping = file->f_mapping;
-+ struct inode *inode = mapping->host;
-+ ssize_t ret = 0;
-+
-+ ret = file->f_op->aio_write(iocb, iocb->ki_buf,
-+ iocb->ki_left, iocb->ki_pos);
-+
-+ /*
-+ * Even if iocb->ki_left = 0, we may need to wait
-+ * for a balance_dirty_pages to complete
-+ */
-+ if (ret > 0) {
-+ iocb->ki_buf += iocb->ki_buf ? ret : 0;
-+ iocb->ki_left -= ret;
-+
-+ ret = -EIOCBRETRY;
-+ }
-+
-+ /* This means we must have transferred all that we could */
-+ /* No need to retry anymore unless we need to osync data */
-+ if (ret == 0) {
-+ ret = iocb->ki_nbytes - iocb->ki_left;
-+ if (!iocb->ki_buf)
-+ return ret;
-+
-+ /* Set things up for potential O_SYNC */
-+ if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
-+ iocb->ki_buf = NULL;
-+ iocb->ki_pos -= ret; /* back up fpos */
-+ iocb->ki_left = ret; /* sync what we have written out */
-+ iocb->ki_nbytes = ret;
-+ ret = -EIOCBRETRY;
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+static ssize_t aio_fdsync(struct kiocb *iocb)
-+{
-+ struct file *file = iocb->ki_filp;
-+ ssize_t ret = -EINVAL;
-+
-+ if (file->f_op->aio_fsync)
-+ ret = file->f_op->aio_fsync(iocb, 1);
-+ return ret;
-+}
-+
-+static ssize_t aio_fsync(struct kiocb *iocb)
-+{
-+ struct file *file = iocb->ki_filp;
-+ ssize_t ret = -EINVAL;
-+
-+ if (file->f_op->aio_fsync)
-+ ret = file->f_op->aio_fsync(iocb, 0);
-+ return ret;
-+}
-+
-+/*
-+ * aio_setup_iocb:
-+ * Performs the initial checks and aio retry method
-+ * setup for the kiocb at the time of io submission.
-+ */
-+ssize_t aio_setup_iocb(struct kiocb *kiocb)
-+{
-+ struct file *file = kiocb->ki_filp;
-+ ssize_t ret = 0;
-+
-+ switch (kiocb->ki_opcode) {
-+ case IOCB_CMD_PREAD:
-+ ret = -EBADF;
-+ if (unlikely(!(file->f_mode & FMODE_READ)))
-+ break;
-+ ret = -EFAULT;
-+ if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
-+ kiocb->ki_left)))
-+ break;
-+ ret = -EINVAL;
-+ if (file->f_op->aio_read)
-+ kiocb->ki_retry = aio_pread;
-+ break;
-+ case IOCB_CMD_PWRITE:
-+ ret = -EBADF;
-+ if (unlikely(!(file->f_mode & FMODE_WRITE)))
-+ break;
-+ ret = -EFAULT;
-+ if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
-+ kiocb->ki_left)))
-+ break;
-+ ret = -EINVAL;
-+ if (file->f_op->aio_write)
-+ kiocb->ki_retry = aio_pwrite;
-+ break;
-+ case IOCB_CMD_FDSYNC:
-+ ret = -EINVAL;
-+ if (file->f_op->aio_fsync)
-+ kiocb->ki_retry = aio_fdsync;
-+ break;
-+ case IOCB_CMD_FSYNC:
-+ ret = -EINVAL;
-+ if (file->f_op->aio_fsync)
-+ kiocb->ki_retry = aio_fsync;
-+ break;
-+ default:
-+ dprintk("EINVAL: io_submit: no operation provided\n");
-+ ret = -EINVAL;
-+ }
-+
-+ if (!kiocb->ki_retry)
-+ return ret;
-+
-+ return 0;
-+}
-+
-+/*
-+ * aio_wake_function:
-+ * wait queue callback function for aio notification,
-+ * Simply triggers a retry of the operation via kick_iocb.
-+ *
-+ * This callback is specified in the wait queue entry in
-+ * a kiocb (current->io_wait points to this wait queue
-+ * entry when an aio operation executes; it is used
-+ * instead of a synchronous wait when an i/o blocking
-+ * condition is encountered during aio).
-+ *
-+ * Note:
-+ * This routine is executed with the wait queue lock held.
-+ * Since kick_iocb acquires iocb->ctx->ctx_lock, it nests
-+ * the ioctx lock inside the wait queue lock. This is safe
-+ * because this callback isn't used for wait queues which
-+ * are nested inside ioctx lock (i.e. ctx->wait)
-+ */
-+int aio_wake_function(wait_queue_t *wait, unsigned mode, int sync)
-+{
-+ struct kiocb *iocb = container_of(wait, struct kiocb, ki_wait);
-+
-+ list_del_init(&wait->task_list);
-+ kick_iocb(iocb);
-+ return 1;
-+}
-+
- int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
- struct iocb *iocb)
- {
- struct kiocb *req;
- struct file *file;
- ssize_t ret;
-- char *buf;
-
- /* enforce forwards compatibility on users */
- if (unlikely(iocb->aio_reserved1 || iocb->aio_reserved2 ||
-@@ -1032,52 +1498,31 @@ int io_submit_one(struct kioctx *ctx, st
- req->ki_user_data = iocb->aio_data;
- req->ki_pos = iocb->aio_offset;
-
-- buf = (char *)(unsigned long)iocb->aio_buf;
-+ req->ki_buf = (char *)(unsigned long)iocb->aio_buf;
-+ req->ki_left = req->ki_nbytes = iocb->aio_nbytes;
-+ req->ki_opcode = iocb->aio_lio_opcode;
-+ init_waitqueue_func_entry(&req->ki_wait, aio_wake_function);
-+ INIT_LIST_HEAD(&req->ki_wait.task_list);
-+ req->ki_run_list.next = req->ki_run_list.prev = NULL;
-+ req->ki_retry = NULL;
-+ req->ki_retried = 0;
-+ req->ki_kicked = 0;
-+ req->ki_queued = 0;
-+ aio_run = 0;
-+ aio_wakeups = 0;
-
-- switch (iocb->aio_lio_opcode) {
-- case IOCB_CMD_PREAD:
-- ret = -EBADF;
-- if (unlikely(!(file->f_mode & FMODE_READ)))
-- goto out_put_req;
-- ret = -EFAULT;
-- if (unlikely(!access_ok(VERIFY_WRITE, buf, iocb->aio_nbytes)))
-- goto out_put_req;
-- ret = -EINVAL;
-- if (file->f_op->aio_read)
-- ret = file->f_op->aio_read(req, buf,
-- iocb->aio_nbytes, req->ki_pos);
-- break;
-- case IOCB_CMD_PWRITE:
-- ret = -EBADF;
-- if (unlikely(!(file->f_mode & FMODE_WRITE)))
-- goto out_put_req;
-- ret = -EFAULT;
-- if (unlikely(!access_ok(VERIFY_READ, buf, iocb->aio_nbytes)))
-- goto out_put_req;
-- ret = -EINVAL;
-- if (file->f_op->aio_write)
-- ret = file->f_op->aio_write(req, buf,
-- iocb->aio_nbytes, req->ki_pos);
-- break;
-- case IOCB_CMD_FDSYNC:
-- ret = -EINVAL;
-- if (file->f_op->aio_fsync)
-- ret = file->f_op->aio_fsync(req, 1);
-- break;
-- case IOCB_CMD_FSYNC:
-- ret = -EINVAL;
-- if (file->f_op->aio_fsync)
-- ret = file->f_op->aio_fsync(req, 0);
-- break;
-- default:
-- dprintk("EINVAL: io_submit: no operation provided\n");
-- ret = -EINVAL;
-- }
-+ ret = aio_setup_iocb(req);
-+
-+ if (ret)
-+ goto out_put_req;
-+
-+ spin_lock_irq(&ctx->ctx_lock);
-+ ret = aio_run_iocb(req);
-+ spin_unlock_irq(&ctx->ctx_lock);
-
-+ if (-EIOCBRETRY == ret)
-+ queue_work(aio_wq, &ctx->wq);
- aio_put_req(req); /* drop extra ref to req */
-- if (likely(-EIOCBQUEUED == ret))
-- return 0;
-- aio_complete(req, ret, 0); /* will drop i/o ref to req */
- return 0;
-
- out_put_req:
---- linux-2.6.0/fs/binfmt_elf.c 2003-10-25 14:45:46.000000000 -0700
-+++ 25/fs/binfmt_elf.c 2003-12-28 23:22:21.000000000 -0800
-@@ -82,13 +82,17 @@ static struct linux_binfmt elf_format =
-
- #define BAD_ADDR(x) ((unsigned long)(x) > TASK_SIZE)
-
--static void set_brk(unsigned long start, unsigned long end)
-+static int set_brk(unsigned long start, unsigned long end)
- {
- start = ELF_PAGEALIGN(start);
- end = ELF_PAGEALIGN(end);
-- if (end > start)
-- do_brk(start, end - start);
-+ if (end > start) {
-+ unsigned long addr = do_brk(start, end - start);
-+ if (BAD_ADDR(addr))
-+ return addr;
-+ }
- current->mm->start_brk = current->mm->brk = end;
-+ return 0;
- }
-
-
-@@ -381,8 +385,11 @@ static unsigned long load_elf_interp(str
- elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); /* What we have mapped so far */
-
- /* Map the last of the bss segment */
-- if (last_bss > elf_bss)
-- do_brk(elf_bss, last_bss - elf_bss);
-+ if (last_bss > elf_bss) {
-+ error = do_brk(elf_bss, last_bss - elf_bss);
-+ if (BAD_ADDR(error))
-+ goto out_close;
-+ }
-
- *interp_load_addr = load_addr;
- error = ((unsigned long) interp_elf_ex->e_entry) + load_addr;
-@@ -466,6 +473,7 @@ static int load_elf_binary(struct linux_
- struct elfhdr interp_elf_ex;
- struct exec interp_ex;
- char passed_fileno[6];
-+ struct files_struct *files;
-
- /* Get the exec-header */
- elf_ex = *((struct elfhdr *) bprm->buf);
-@@ -498,9 +506,20 @@ static int load_elf_binary(struct linux_
- if (retval < 0)
- goto out_free_ph;
-
-+ files = current->files; /* Refcounted so ok */
-+ if(unshare_files() < 0)
-+ goto out_free_ph;
-+ if (files == current->files) {
-+ put_files_struct(files);
-+ files = NULL;
-+ }
-+
-+ /* exec will make our files private anyway, but for the a.out
-+ loader stuff we need to do it earlier */
-+
- retval = get_unused_fd();
- if (retval < 0)
-- goto out_free_ph;
-+ goto out_free_fh;
- get_file(bprm->file);
- fd_install(elf_exec_fileno = retval, bprm->file);
-
-@@ -631,6 +650,13 @@ static int load_elf_binary(struct linux_
- if (retval)
- goto out_free_dentry;
-
-+ /* Discard our unneeded old files struct */
-+ if (files) {
-+ steal_locks(files);
-+ put_files_struct(files);
-+ files = NULL;
-+ }
-+
- /* OK, This is the point of no return */
- current->mm->start_data = 0;
- current->mm->end_data = 0;
-@@ -672,7 +698,12 @@ static int load_elf_binary(struct linux_
- /* There was a PT_LOAD segment with p_memsz > p_filesz
- before this one. Map anonymous pages, if needed,
- and clear the area. */
-- set_brk (elf_bss + load_bias, elf_brk + load_bias);
-+ retval = set_brk (elf_bss + load_bias,
-+ elf_brk + load_bias);
-+ if (retval) {
-+ send_sig(SIGKILL, current, 0);
-+ goto out_free_dentry;
-+ }
- nbyte = ELF_PAGEOFFSET(elf_bss);
- if (nbyte) {
- nbyte = ELF_MIN_ALIGN - nbyte;
-@@ -737,6 +768,18 @@ static int load_elf_binary(struct linux_
- start_data += load_bias;
- end_data += load_bias;
-
-+ /* Calling set_brk effectively mmaps the pages that we need
-+ * for the bss and break sections. We must do this before
-+ * mapping in the interpreter, to make sure it doesn't wind
-+ * up getting placed where the bss needs to go.
-+ */
-+ retval = set_brk(elf_bss, elf_brk);
-+ if (retval) {
-+ send_sig(SIGKILL, current, 0);
-+ goto out_free_dentry;
-+ }
-+ padzero(elf_bss);
-+
- if (elf_interpreter) {
- if (interpreter_type == INTERPRETER_AOUT)
- elf_entry = load_aout_interp(&interp_ex,
-@@ -745,19 +788,17 @@ static int load_elf_binary(struct linux_
- elf_entry = load_elf_interp(&interp_elf_ex,
- interpreter,
- &interp_load_addr);
--
-- allow_write_access(interpreter);
-- fput(interpreter);
-- kfree(elf_interpreter);
--
- if (BAD_ADDR(elf_entry)) {
- printk(KERN_ERR "Unable to load interpreter\n");
-- kfree(elf_phdata);
- send_sig(SIGSEGV, current, 0);
- retval = -ENOEXEC; /* Nobody gets to see this, but.. */
-- goto out;
-+ goto out_free_dentry;
- }
- reloc_func_desc = interp_load_addr;
-+
-+ allow_write_access(interpreter);
-+ fput(interpreter);
-+ kfree(elf_interpreter);
- } else {
- elf_entry = elf_ex.e_entry;
- }
-@@ -782,13 +823,6 @@ static int load_elf_binary(struct linux_
- current->mm->end_data = end_data;
- current->mm->start_stack = bprm->p;
-
-- /* Calling set_brk effectively mmaps the pages that we need
-- * for the bss and break sections
-- */
-- set_brk(elf_bss, elf_brk);
--
-- padzero(elf_bss);
--
- if (current->personality & MMAP_PAGE_ZERO) {
- /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
- and some applications "depend" upon this behavior.
-@@ -835,6 +869,11 @@ out_free_interp:
- kfree(elf_interpreter);
- out_free_file:
- sys_close(elf_exec_fileno);
-+out_free_fh:
-+ if (files) {
-+ put_files_struct(current->files);
-+ current->files = files;
-+ }
- out_free_ph:
- kfree(elf_phdata);
- goto out;
---- linux-2.6.0/fs/binfmt_som.c 2003-06-14 12:18:07.000000000 -0700
-+++ 25/fs/binfmt_som.c 2003-12-28 23:21:23.000000000 -0800
-@@ -217,7 +217,7 @@ load_som_binary(struct linux_binprm * bp
- (char *) hpuxhdr, size);
- if (retval < 0)
- goto out_free;
--
-+#error "Fix security hole before enabling me"
- retval = get_unused_fd();
- if (retval < 0)
- goto out_free;
---- linux-2.6.0/fs/block_dev.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/block_dev.c 2003-12-28 23:21:22.000000000 -0800
-@@ -25,6 +25,22 @@
- #include <linux/namei.h>
- #include <asm/uaccess.h>
-
-+struct bdev_inode {
-+ struct block_device bdev;
-+ struct inode vfs_inode;
-+};
-+
-+static inline struct bdev_inode *BDEV_I(struct inode *inode)
-+{
-+ return container_of(inode, struct bdev_inode, vfs_inode);
-+}
-+
-+inline struct block_device *I_BDEV(struct inode *inode)
-+{
-+ return &BDEV_I(inode)->bdev;
-+}
-+
-+EXPORT_SYMBOL(I_BDEV);
-
- static sector_t max_block(struct block_device *bdev)
- {
-@@ -100,10 +116,10 @@ static int
- blkdev_get_block(struct inode *inode, sector_t iblock,
- struct buffer_head *bh, int create)
- {
-- if (iblock >= max_block(inode->i_bdev))
-+ if (iblock >= max_block(I_BDEV(inode)))
- return -EIO;
-
-- bh->b_bdev = inode->i_bdev;
-+ bh->b_bdev = I_BDEV(inode);
- bh->b_blocknr = iblock;
- set_buffer_mapped(bh);
- return 0;
-@@ -113,10 +129,10 @@ static int
- blkdev_get_blocks(struct inode *inode, sector_t iblock,
- unsigned long max_blocks, struct buffer_head *bh, int create)
- {
-- if ((iblock + max_blocks) > max_block(inode->i_bdev))
-+ if ((iblock + max_blocks) > max_block(I_BDEV(inode)))
- return -EIO;
-
-- bh->b_bdev = inode->i_bdev;
-+ bh->b_bdev = I_BDEV(inode);
- bh->b_blocknr = iblock;
- bh->b_size = max_blocks << inode->i_blkbits;
- set_buffer_mapped(bh);
-@@ -128,9 +144,9 @@ blkdev_direct_IO(int rw, struct kiocb *i
- loff_t offset, unsigned long nr_segs)
- {
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
-
-- return blockdev_direct_IO(rw, iocb, inode, inode->i_bdev, iov, offset,
-+ return blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset,
- nr_segs, blkdev_get_blocks, NULL);
- }
-
-@@ -161,11 +177,10 @@ static int blkdev_commit_write(struct fi
- */
- static loff_t block_llseek(struct file *file, loff_t offset, int origin)
- {
-- struct inode *bd_inode;
-+ struct inode *bd_inode = file->f_mapping->host;
- loff_t size;
- loff_t retval;
-
-- bd_inode = file->f_dentry->d_inode->i_bdev->bd_inode;
- down(&bd_inode->i_sem);
- size = i_size_read(bd_inode);
-
-@@ -188,15 +203,13 @@ static loff_t block_llseek(struct file *
- }
-
- /*
-- * Filp may be NULL when we are called by an msync of a vma
-- * since the vma has no handle.
-+ * Filp is never NULL; the only case when ->fsync() is called with
-+ * NULL first argument is nfsd_sync_dir() and that's not a directory.
- */
-
- static int block_fsync(struct file *filp, struct dentry *dentry, int datasync)
- {
-- struct inode * inode = dentry->d_inode;
--
-- return sync_blockdev(inode->i_bdev);
-+ return sync_blockdev(I_BDEV(filp->f_mapping->host));
- }
-
- /*
-@@ -206,16 +219,6 @@ static int block_fsync(struct file *filp
- static spinlock_t bdev_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
- static kmem_cache_t * bdev_cachep;
-
--struct bdev_inode {
-- struct block_device bdev;
-- struct inode vfs_inode;
--};
--
--static inline struct bdev_inode *BDEV_I(struct inode *inode)
--{
-- return container_of(inode, struct bdev_inode, vfs_inode);
--}
--
- static struct inode *bdev_alloc_inode(struct super_block *sb)
- {
- struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, SLAB_KERNEL);
-@@ -387,26 +390,27 @@ void bdput(struct block_device *bdev)
-
- EXPORT_SYMBOL(bdput);
-
--int bd_acquire(struct inode *inode)
-+static struct block_device *bd_acquire(struct inode *inode)
- {
- struct block_device *bdev;
- spin_lock(&bdev_lock);
-- if (inode->i_bdev && igrab(inode->i_bdev->bd_inode)) {
-+ bdev = inode->i_bdev;
-+ if (bdev && igrab(bdev->bd_inode)) {
- spin_unlock(&bdev_lock);
-- return 0;
-+ return bdev;
- }
- spin_unlock(&bdev_lock);
- bdev = bdget(inode->i_rdev);
-- if (!bdev)
-- return -ENOMEM;
-- spin_lock(&bdev_lock);
-- if (inode->i_bdev)
-- __bd_forget(inode);
-- inode->i_bdev = bdev;
-- inode->i_mapping = bdev->bd_inode->i_mapping;
-- list_add(&inode->i_devices, &bdev->bd_inodes);
-- spin_unlock(&bdev_lock);
-- return 0;
-+ if (bdev) {
-+ spin_lock(&bdev_lock);
-+ if (inode->i_bdev)
-+ __bd_forget(inode);
-+ inode->i_bdev = bdev;
-+ inode->i_mapping = bdev->bd_inode->i_mapping;
-+ list_add(&inode->i_devices, &bdev->bd_inodes);
-+ spin_unlock(&bdev_lock);
-+ }
-+ return bdev;
- }
-
- /* Call when you free inode */
-@@ -531,13 +535,14 @@ static void bd_set_size(struct block_dev
- bdev->bd_inode->i_blkbits = blksize_bits(bsize);
- }
-
--static int do_open(struct block_device *bdev, struct inode *inode, struct file *file)
-+static int do_open(struct block_device *bdev, struct file *file)
- {
- struct module *owner = NULL;
- struct gendisk *disk;
- int ret = -ENXIO;
- int part;
-
-+ file->f_mapping = bdev->bd_inode->i_mapping;
- lock_kernel();
- disk = get_gendisk(bdev->bd_dev, &part);
- if (!disk) {
-@@ -554,7 +559,7 @@ static int do_open(struct block_device *
- if (!part) {
- struct backing_dev_info *bdi;
- if (disk->fops->open) {
-- ret = disk->fops->open(inode, file);
-+ ret = disk->fops->open(bdev, file);
- if (ret)
- goto out_first;
- }
-@@ -599,7 +604,7 @@ static int do_open(struct block_device *
- module_put(owner);
- if (bdev->bd_contains == bdev) {
- if (bdev->bd_disk->fops->open) {
-- ret = bdev->bd_disk->fops->open(inode, file);
-+ ret = bdev->bd_disk->fops->open(bdev, file);
- if (ret)
- goto out;
- }
-@@ -647,7 +652,7 @@ int blkdev_get(struct block_device *bdev
- fake_file.f_dentry = &fake_dentry;
- fake_dentry.d_inode = bdev->bd_inode;
-
-- return do_open(bdev, bdev->bd_inode, &fake_file);
-+ return do_open(bdev, &fake_file);
- }
-
- EXPORT_SYMBOL(blkdev_get);
-@@ -665,10 +670,9 @@ int blkdev_open(struct inode * inode, st
- */
- filp->f_flags |= O_LARGEFILE;
-
-- bd_acquire(inode);
-- bdev = inode->i_bdev;
-+ bdev = bd_acquire(inode);
-
-- res = do_open(bdev, inode, filp);
-+ res = do_open(bdev, filp);
- if (res)
- return res;
-
-@@ -687,7 +691,6 @@ EXPORT_SYMBOL(blkdev_open);
- int blkdev_put(struct block_device *bdev, int kind)
- {
- int ret = 0;
-- struct inode *bd_inode = bdev->bd_inode;
- struct gendisk *disk = bdev->bd_disk;
-
- down(&bdev->bd_sem);
-@@ -696,14 +699,14 @@ int blkdev_put(struct block_device *bdev
- switch (kind) {
- case BDEV_FILE:
- case BDEV_FS:
-- sync_blockdev(bd_inode->i_bdev);
-+ sync_blockdev(bdev);
- break;
- }
- kill_bdev(bdev);
- }
- if (bdev->bd_contains == bdev) {
- if (disk->fops->release)
-- ret = disk->fops->release(bd_inode, NULL);
-+ ret = disk->fops->release(disk);
- } else {
- down(&bdev->bd_contains->bd_sem);
- bdev->bd_contains->bd_part_count--;
-@@ -734,11 +737,12 @@ int blkdev_put(struct block_device *bdev
-
- EXPORT_SYMBOL(blkdev_put);
-
--int blkdev_close(struct inode * inode, struct file * filp)
-+static int blkdev_close(struct inode * inode, struct file * filp)
- {
-- if (inode->i_bdev->bd_holder == filp)
-- bd_release(inode->i_bdev);
-- return blkdev_put(inode->i_bdev, BDEV_FILE);
-+ struct block_device *bdev = I_BDEV(filp->f_mapping->host);
-+ if (bdev->bd_holder == filp)
-+ bd_release(bdev);
-+ return blkdev_put(bdev, BDEV_FILE);
- }
-
- static ssize_t blkdev_file_write(struct file *file, const char __user *buf,
-@@ -757,6 +761,11 @@ static ssize_t blkdev_file_aio_write(str
- return generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos);
- }
-
-+static int block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
-+ unsigned long arg)
-+{
-+ return blkdev_ioctl(I_BDEV(file->f_mapping->host), file, cmd, arg);
-+}
-
- struct address_space_operations def_blk_aops = {
- .readpage = blkdev_readpage,
-@@ -778,7 +787,7 @@ struct file_operations def_blk_fops = {
- .aio_write = blkdev_file_aio_write,
- .mmap = generic_file_mmap,
- .fsync = block_fsync,
-- .ioctl = blkdev_ioctl,
-+ .ioctl = block_ioctl,
- .readv = generic_file_readv,
- .writev = generic_file_writev,
- .sendfile = generic_file_sendfile,
-@@ -791,7 +800,7 @@ int ioctl_by_bdev(struct block_device *b
- int res;
- mm_segment_t old_fs = get_fs();
- set_fs(KERNEL_DS);
-- res = blkdev_ioctl(bdev->bd_inode, NULL, cmd, arg);
-+ res = blkdev_ioctl(bdev, NULL, cmd, arg);
- set_fs(old_fs);
- return res;
- }
-@@ -828,11 +837,10 @@ struct block_device *lookup_bdev(const c
- error = -EACCES;
- if (nd.mnt->mnt_flags & MNT_NODEV)
- goto fail;
-- error = bd_acquire(inode);
-- if (error)
-+ error = -ENOMEM;
-+ bdev = bd_acquire(inode);
-+ if (!bdev)
- goto fail;
-- bdev = inode->i_bdev;
--
- out:
- path_release(&nd);
- return bdev;
---- linux-2.6.0/fs/buffer.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/buffer.c 2003-12-28 23:26:41.000000000 -0800
-@@ -116,27 +116,50 @@ void unlock_buffer(struct buffer_head *b
- }
-
- /*
-- * Block until a buffer comes unlocked. This doesn't stop it
-+ * Wait until a buffer comes unlocked. This doesn't stop it
- * from becoming locked again - you have to lock it yourself
- * if you want to preserve its state.
-+ * If the wait queue parameter specifies an async i/o callback,
-+ * then instead of blocking, we just queue up the callback
-+ * on the wait queue for async notification when the buffer gets
-+ * unlocked.
-+ * A NULL wait queue parameter defaults to synchronous behaviour
- */
--void __wait_on_buffer(struct buffer_head * bh)
-+int __wait_on_buffer_wq(struct buffer_head * bh, wait_queue_t *wait)
- {
- wait_queue_head_t *wqh = bh_waitq_head(bh);
-- DEFINE_WAIT(wait);
-+ DEFINE_WAIT(local_wait);
-+
-+ if (!wait)
-+ wait = &local_wait;
-
- if (atomic_read(&bh->b_count) == 0 &&
- (!bh->b_page || !PageLocked(bh->b_page)))
- buffer_error();
-
- do {
-- prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
-+ prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
- if (buffer_locked(bh)) {
- blk_run_queues();
-+ if (!is_sync_wait(wait)) {
-+ /*
-+ * if we've queued an async wait queue
-+ * callback do not block; just tell the
-+ * caller to return and retry later when
-+ * the callback is notified
-+ */
-+ return -EIOCBRETRY;
-+ }
- io_schedule();
- }
- } while (buffer_locked(bh));
-- finish_wait(wqh, &wait);
-+ finish_wait(wqh, wait);
-+ return 0;
-+}
-+
-+void __wait_on_buffer(struct buffer_head * bh)
-+{
-+ __wait_on_buffer_wq(bh, NULL);
- }
-
- static void
-@@ -314,8 +337,7 @@ int file_fsync(struct file *filp, struct
- asmlinkage long sys_fsync(unsigned int fd)
- {
- struct file * file;
-- struct dentry * dentry;
-- struct inode * inode;
-+ struct address_space *mapping;
- int ret, err;
-
- ret = -EBADF;
-@@ -323,8 +345,7 @@ asmlinkage long sys_fsync(unsigned int f
- if (!file)
- goto out;
-
-- dentry = file->f_dentry;
-- inode = dentry->d_inode;
-+ mapping = file->f_mapping;
-
- ret = -EINVAL;
- if (!file->f_op || !file->f_op->fsync) {
-@@ -333,17 +354,17 @@ asmlinkage long sys_fsync(unsigned int f
- }
-
- /* We need to protect against concurrent writers.. */
-- down(&inode->i_sem);
-+ down(&mapping->host->i_sem);
- current->flags |= PF_SYNCWRITE;
-- ret = filemap_fdatawrite(inode->i_mapping);
-- err = file->f_op->fsync(file, dentry, 0);
-+ ret = filemap_fdatawrite(mapping);
-+ err = file->f_op->fsync(file, file->f_dentry, 0);
- if (!ret)
- ret = err;
-- err = filemap_fdatawait(inode->i_mapping);
-+ err = filemap_fdatawait(mapping);
- if (!ret)
- ret = err;
- current->flags &= ~PF_SYNCWRITE;
-- up(&inode->i_sem);
-+ up(&mapping->host->i_sem);
-
- out_putf:
- fput(file);
-@@ -354,8 +375,7 @@ out:
- asmlinkage long sys_fdatasync(unsigned int fd)
- {
- struct file * file;
-- struct dentry * dentry;
-- struct inode * inode;
-+ struct address_space *mapping;
- int ret, err;
-
- ret = -EBADF;
-@@ -363,24 +383,23 @@ asmlinkage long sys_fdatasync(unsigned i
- if (!file)
- goto out;
-
-- dentry = file->f_dentry;
-- inode = dentry->d_inode;
--
- ret = -EINVAL;
- if (!file->f_op || !file->f_op->fsync)
- goto out_putf;
-
-- down(&inode->i_sem);
-+ mapping = file->f_mapping;
-+
-+ down(&mapping->host->i_sem);
- current->flags |= PF_SYNCWRITE;
-- ret = filemap_fdatawrite(inode->i_mapping);
-- err = file->f_op->fsync(file, dentry, 1);
-+ ret = filemap_fdatawrite(mapping);
-+ err = file->f_op->fsync(file, file->f_dentry, 1);
- if (!ret)
- ret = err;
-- err = filemap_fdatawait(inode->i_mapping);
-+ err = filemap_fdatawait(mapping);
- if (!ret)
- ret = err;
- current->flags &= ~PF_SYNCWRITE;
-- up(&inode->i_sem);
-+ up(&mapping->host->i_sem);
-
- out_putf:
- fput(file);
-@@ -432,6 +451,7 @@ __find_get_block_slow(struct block_devic
- printk("block=%llu, b_blocknr=%llu\n",
- (unsigned long long)block, (unsigned long long)bh->b_blocknr);
- printk("b_state=0x%08lx, b_size=%u\n", bh->b_state, bh->b_size);
-+ printk("device blocksize: %d\n", 1 << bd_inode->i_blkbits);
- out_unlock:
- spin_unlock(&bd_mapping->private_lock);
- page_cache_release(page);
-@@ -487,7 +507,7 @@ void invalidate_bdev(struct block_device
- */
- static void free_more_memory(void)
- {
-- struct zone *zone;
-+ struct zone **zones;
- pg_data_t *pgdat;
-
- wakeup_bdflush(1024);
-@@ -495,9 +515,9 @@ static void free_more_memory(void)
- yield();
-
- for_each_pgdat(pgdat) {
-- zone = pgdat->node_zonelists[GFP_NOFS&GFP_ZONEMASK].zones[0];
-- if (zone)
-- try_to_free_pages(zone, GFP_NOFS, 0);
-+ zones = pgdat->node_zonelists[GFP_NOFS&GFP_ZONEMASK].zones;
-+ if (*zones)
-+ try_to_free_pages(zones, GFP_NOFS, 0);
- }
- }
-
-@@ -1296,9 +1316,12 @@ void __bforget(struct buffer_head *bh)
- __brelse(bh);
- }
-
--static struct buffer_head *__bread_slow(struct buffer_head *bh)
-+static struct buffer_head *__bread_slow_wq(struct buffer_head *bh,
-+ wait_queue_t *wait)
- {
-- lock_buffer(bh);
-+ if (-EIOCBRETRY == lock_buffer_wq(bh, wait))
-+ return ERR_PTR(-EIOCBRETRY);
-+
- if (buffer_uptodate(bh)) {
- unlock_buffer(bh);
- return bh;
-@@ -1308,7 +1331,8 @@ static struct buffer_head *__bread_slow(
- get_bh(bh);
- bh->b_end_io = end_buffer_read_sync;
- submit_bh(READ, bh);
-- wait_on_buffer(bh);
-+ if (-EIOCBRETRY == wait_on_buffer_wq(bh, wait))
-+ return ERR_PTR(-EIOCBRETRY);
- if (buffer_uptodate(bh))
- return bh;
- }
-@@ -1316,6 +1340,11 @@ static struct buffer_head *__bread_slow(
- return NULL;
- }
-
-+static inline struct buffer_head *__bread_slow(struct buffer_head *bh)
-+{
-+ return __bread_slow_wq(bh, NULL);
-+}
-+
- /*
- * Per-cpu buffer LRU implementation. To reduce the cost of __find_get_block().
- * The bhs[] array is sorted - newest buffer is at bhs[0]. Buffers have their
-@@ -1503,6 +1532,18 @@ __bread(struct block_device *bdev, secto
- }
- EXPORT_SYMBOL(__bread);
-
-+struct buffer_head *
-+__bread_wq(struct block_device *bdev, sector_t block, int size,
-+ wait_queue_t *wait)
-+{
-+ struct buffer_head *bh = __getblk(bdev, block, size);
-+
-+ if (!buffer_uptodate(bh))
-+ bh = __bread_slow_wq(bh, wait);
-+ return bh;
-+}
-+EXPORT_SYMBOL(__bread_wq);
-+
- /*
- * invalidate_bh_lrus() is called rarely - at unmount. Because it is only for
- * unmount it only needs to ensure that all buffers from the target device are
-@@ -1980,8 +2021,9 @@ static int __block_prepare_write(struct
- /*
- * If we issued read requests - let them complete.
- */
-- while(wait_bh > wait) {
-- wait_on_buffer(*--wait_bh);
-+ while (wait_bh > wait) {
-+ if ((err = wait_on_buffer_wq(*--wait_bh, current->io_wait)))
-+ return err;
- if (!buffer_uptodate(*wait_bh))
- return -EIO;
- }
-@@ -2823,7 +2865,7 @@ drop_buffers(struct page *page, struct b
- bh = bh->b_this_page;
- } while (bh != head);
-
-- if (!was_uptodate && PageUptodate(page))
-+ if (!was_uptodate && PageUptodate(page) && !PageError(page))
- buffer_error();
-
- do {
-@@ -3039,6 +3081,7 @@ void __init buffer_init(void)
- EXPORT_SYMBOL(__bforget);
- EXPORT_SYMBOL(__brelse);
- EXPORT_SYMBOL(__wait_on_buffer);
-+EXPORT_SYMBOL(__wait_on_buffer_wq);
- EXPORT_SYMBOL(block_commit_write);
- EXPORT_SYMBOL(block_prepare_write);
- EXPORT_SYMBOL(block_read_full_page);
---- linux-2.6.0/fs/char_dev.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/char_dev.c 2003-12-28 23:21:42.000000000 -0800
-@@ -434,7 +434,9 @@ void cdev_init(struct cdev *cdev, struct
-
- static struct kobject *base_probe(dev_t dev, int *part, void *data)
- {
-- request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev));
-+ if (request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
-+ /* Make old-style 2.4 aliases work */
-+ request_module("char-major-%d", MAJOR(dev));
- return NULL;
- }
-
---- linux-2.6.0/fs/coda/file.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/coda/file.c 2003-12-28 23:21:18.000000000 -0800
-@@ -89,6 +89,7 @@ coda_file_mmap(struct file *coda_file, s
-
- coda_inode = coda_file->f_dentry->d_inode;
- host_inode = host_file->f_dentry->d_inode;
-+ coda_file->f_mapping = host_file->f_mapping;
- if (coda_inode->i_mapping == &coda_inode->i_data)
- coda_inode->i_mapping = host_inode->i_mapping;
-
---- linux-2.6.0/fs/compat.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/compat.c 2003-12-28 23:21:47.000000000 -0800
-@@ -559,3 +559,96 @@ asmlinkage long compat_sys_fcntl(unsigne
- return compat_sys_fcntl64(fd, cmd, arg);
- }
-
-+extern asmlinkage long sys_io_setup(unsigned nr_reqs, aio_context_t *ctx);
-+
-+asmlinkage long
-+compat_sys_io_setup(unsigned nr_reqs, u32 *ctx32p)
-+{
-+ long ret;
-+ aio_context_t ctx64;
-+
-+ mm_segment_t oldfs = get_fs();
-+ if (unlikely(get_user(ctx64, ctx32p)))
-+ return -EFAULT;
-+
-+ set_fs(KERNEL_DS);
-+ ret = sys_io_setup(nr_reqs, &ctx64);
-+ set_fs(oldfs);
-+ /* truncating is ok because it's a user address */
-+ if (!ret)
-+ ret = put_user((u32) ctx64, ctx32p);
-+ return ret;
-+}
-+
-+extern asmlinkage long sys_io_getevents(aio_context_t ctx_id,
-+ long min_nr,
-+ long nr,
-+ struct io_event *events,
-+ struct timespec *timeout);
-+
-+asmlinkage long
-+compat_sys_io_getevents(aio_context_t ctx_id,
-+ unsigned long min_nr,
-+ unsigned long nr,
-+ struct io_event *events,
-+ struct compat_timespec *timeout)
-+{
-+ long ret;
-+ struct timespec t;
-+ struct timespec *ut = NULL;
-+
-+ ret = -EFAULT;
-+ if (unlikely(!access_ok(VERIFY_WRITE, events,
-+ nr * sizeof(struct io_event))))
-+ goto out;
-+ if (timeout) {
-+ if (get_compat_timespec(&t, timeout))
-+ goto out;
-+
-+ ut = compat_alloc_user_space(sizeof(*ut));
-+ if (copy_to_user(ut, &t, sizeof(t)) )
-+ goto out;
-+ }
-+ ret = sys_io_getevents(ctx_id, min_nr, nr, events, ut);
-+out:
-+ return ret;
-+}
-+
-+extern asmlinkage long sys_io_submit(aio_context_t, long,
-+ struct iocb __user **);
-+
-+static inline long
-+copy_iocb(long nr, u32 *ptr32, u64 *ptr64)
-+{
-+ compat_uptr_t uptr;
-+ int i;
-+
-+ for (i = 0; i < nr; ++i) {
-+ if (get_user(uptr, ptr32 + i))
-+ return -EFAULT;
-+ if (put_user((u64)compat_ptr(uptr), ptr64 + i))
-+ return -EFAULT;
-+ }
-+ return 0;
-+}
-+
-+#define MAX_AIO_SUBMITS (PAGE_SIZE/sizeof(struct iocb *))
-+
-+asmlinkage long
-+compat_sys_io_submit(aio_context_t ctx_id, int nr, u32 *iocb)
-+{
-+ struct iocb **iocb64;
-+ long ret;
-+
-+ if (unlikely(nr < 0))
-+ return -EINVAL;
-+
-+ if (nr > MAX_AIO_SUBMITS)
-+ nr = MAX_AIO_SUBMITS;
-+
-+ iocb64 = compat_alloc_user_space(nr * sizeof(*iocb64));
-+ ret = copy_iocb(nr, iocb, (u64 *) iocb64);
-+ if (!ret)
-+ ret = sys_io_submit(ctx_id, nr, iocb64);
-+ return ret;
-+}
---- linux-2.6.0/fs/compat_ioctl.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/compat_ioctl.c 2003-12-28 23:21:48.000000000 -0800
-@@ -63,6 +63,8 @@
- #include <linux/ctype.h>
- #include <linux/ioctl32.h>
- #include <linux/ncp_fs.h>
-+#include <linux/i2c.h>
-+#include <linux/i2c-dev.h>
-
- #include <net/sock.h> /* siocdevprivate_ioctl */
- #include <net/bluetooth/bluetooth.h>
-@@ -128,7 +130,7 @@ static int w_long(unsigned int fd, unsig
- set_fs (KERNEL_DS);
- err = sys_ioctl(fd, cmd, (unsigned long)&val);
- set_fs (old_fs);
-- if (!err && put_user(val, (u32 *)arg))
-+ if (!err && put_user(val, (u32 *)compat_ptr(arg)))
- return -EFAULT;
- return err;
- }
-@@ -136,15 +138,16 @@ static int w_long(unsigned int fd, unsig
- static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
- {
- mm_segment_t old_fs = get_fs();
-+ u32 *argptr = compat_ptr(arg);
- int err;
- unsigned long val;
-
-- if(get_user(val, (u32 *)arg))
-+ if(get_user(val, argptr))
- return -EFAULT;
- set_fs (KERNEL_DS);
- err = sys_ioctl(fd, cmd, (unsigned long)&val);
- set_fs (old_fs);
-- if (!err && put_user(val, (u32 *)arg))
-+ if (!err && put_user(val, argptr))
- return -EFAULT;
- return err;
- }
-@@ -1701,7 +1704,7 @@ static int do_smb_getmountuid(unsigned i
- set_fs(old_fs);
-
- if (err >= 0)
-- err = put_user(kuid, (compat_pid_t *)arg);
-+ err = put_user(kuid, (compat_uid_t *)arg);
-
- return err;
- }
-@@ -2869,6 +2872,105 @@ static int do_usbdevfs_discsignal(unsign
-
- return err;
- }
-+
-+/*
-+ * I2C layer ioctls
-+ */
-+
-+struct i2c_msg32 {
-+ u16 addr;
-+ u16 flags;
-+ u16 len;
-+ compat_caddr_t buf;
-+};
-+
-+struct i2c_rdwr_ioctl_data32 {
-+ compat_caddr_t msgs; /* struct i2c_msg __user *msgs */
-+ u32 nmsgs;
-+};
-+
-+struct i2c_smbus_ioctl_data32 {
-+ u8 read_write;
-+ u8 command;
-+ u32 size;
-+ compat_caddr_t data; /* union i2c_smbus_data *data */
-+};
-+
-+static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-+{
-+ struct i2c_rdwr_ioctl_data *tdata;
-+ struct i2c_rdwr_ioctl_data32 *udata;
-+ struct i2c_msg *tmsgs;
-+ struct i2c_msg32 *umsgs;
-+ compat_caddr_t datap;
-+ int nmsgs, i;
-+
-+ tdata = compat_alloc_user_space(sizeof(*tdata));
-+ if (tdata == NULL)
-+ return -ENOMEM;
-+ if (verify_area(VERIFY_WRITE, tdata, sizeof(*tdata)))
-+ return -EFAULT;
-+
-+ udata = (struct i2c_rdwr_ioctl_data32 *)compat_ptr(arg);
-+ if (verify_area(VERIFY_READ, udata, sizeof(*udata)))
-+ return -EFAULT;
-+ if (__get_user(nmsgs, &udata->nmsgs) || __put_user(nmsgs, &tdata->nmsgs))
-+ return -EFAULT;
-+ if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
-+ return -EINVAL;
-+ if (__get_user(datap, &udata->msgs))
-+ return -EFAULT;
-+ umsgs = (struct i2c_msg32 *)compat_ptr(datap);
-+ if (verify_area(VERIFY_READ, umsgs, sizeof(struct i2c_msg) * nmsgs))
-+ return -EFAULT;
-+
-+ tmsgs = compat_alloc_user_space(sizeof(struct i2c_msg) * nmsgs);
-+ if (tmsgs == NULL)
-+ return -ENOMEM;
-+ if (verify_area(VERIFY_WRITE, tmsgs, sizeof(struct i2c_msg) * nmsgs))
-+ return -EFAULT;
-+ if (__put_user(tmsgs, &tdata->msgs))
-+ return -ENOMEM;
-+ for (i = 0; i < nmsgs; i++) {
-+ if (__copy_in_user(&tmsgs[i].addr,
-+ &umsgs[i].addr,
-+ 3 * sizeof(u16)))
-+ return -EFAULT;
-+ if (__get_user(datap, &umsgs[i].buf) ||
-+ __put_user(compat_ptr(datap), &tmsgs[i].buf))
-+ return -EFAULT;
-+ }
-+ return sys_ioctl(fd, cmd, (unsigned long)tdata);
-+}
-+
-+static int do_i2c_smbus_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-+{
-+ struct i2c_smbus_ioctl_data *tdata;
-+ struct i2c_smbus_ioctl_data32 *udata;
-+ compat_caddr_t datap;
-+
-+ tdata = compat_alloc_user_space(sizeof(*tdata));
-+ if (tdata == NULL)
-+ return -ENOMEM;
-+ if (verify_area(VERIFY_WRITE, tdata, sizeof(*tdata)))
-+ return -EFAULT;
-+
-+ udata = (struct i2c_smbus_ioctl_data32 *)compat_ptr(arg);
-+ if (verify_area(VERIFY_READ, udata, sizeof(*udata)))
-+ return -EFAULT;
-+
-+ if (__copy_in_user(&tdata->read_write, &udata->read_write, 2 * sizeof(u8)))
-+ return -EFAULT;
-+ if (__copy_in_user(&tdata->size, &udata->size, 2 * sizeof(u32)))
-+ return -EFAULT;
-+ if (__get_user(datap, &udata->data) ||
-+ __put_user(compat_ptr(datap), &tdata->data))
-+ return -EFAULT;
-+
-+ return sys_ioctl(fd, cmd, (unsigned long)tdata);
-+}
-+
-+
- #undef CODE
- #endif
-
-@@ -2979,7 +3081,7 @@ HANDLE_IOCTL(VIDIOCSFBUF32, do_video_ioc
- HANDLE_IOCTL(VIDIOCGFREQ32, do_video_ioctl)
- HANDLE_IOCTL(VIDIOCSFREQ32, do_video_ioctl)
- /* One SMB ioctl needs translations. */
--#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_pid_t)
-+#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
- HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid)
- HANDLE_IOCTL(ATM_GETLINKRATE32, do_atm_ioctl)
- HANDLE_IOCTL(ATM_GETNAMES32, do_atm_ioctl)
-@@ -3027,5 +3129,10 @@ HANDLE_IOCTL(USBDEVFS_BULK32, do_usbdevf
- HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb)
- HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb)
- HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal)
-+/* i2c */
-+HANDLE_IOCTL(I2C_FUNCS, w_long)
-+HANDLE_IOCTL(I2C_RDWR, do_i2c_rdwr_ioctl)
-+HANDLE_IOCTL(I2C_SMBUS, do_i2c_smbus_ioctl)
-+
- #undef DECLARES
- #endif
---- linux-2.6.0/fs/cramfs/inode.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/cramfs/inode.c 2003-12-28 23:21:22.000000000 -0800
-@@ -112,8 +112,8 @@ static int next_buffer;
- */
- static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned int len)
- {
-- struct buffer_head * bh_array[BLKS_PER_BUF];
-- struct buffer_head * read_array[BLKS_PER_BUF];
-+ struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping;
-+ struct page *pages[BLKS_PER_BUF];
- unsigned i, blocknr, buffer, unread;
- unsigned long devsize;
- char *data;
-@@ -138,33 +138,36 @@ static void *cramfs_read(struct super_bl
- return read_buffers[i] + blk_offset;
- }
-
-- devsize = sb->s_bdev->bd_inode->i_size >> 12;
-- if (!devsize)
-- devsize = ~0UL;
-+ devsize = mapping->host->i_size >> PAGE_CACHE_SHIFT;
-
- /* Ok, read in BLKS_PER_BUF pages completely first. */
- unread = 0;
- for (i = 0; i < BLKS_PER_BUF; i++) {
-- struct buffer_head *bh;
-+ struct page *page = NULL;
-
-- bh = NULL;
- if (blocknr + i < devsize) {
-- bh = sb_getblk(sb, blocknr + i);
-- if (!buffer_uptodate(bh))
-- read_array[unread++] = bh;
-+ page = read_cache_page(mapping, blocknr + i,
-+ (filler_t *)mapping->a_ops->readpage,
-+ NULL);
-+ /* synchronous error? */
-+ if (IS_ERR(page))
-+ page = NULL;
- }
-- bh_array[i] = bh;
-+ pages[i] = page;
- }
-
-- if (unread) {
-- ll_rw_block(READ, unread, read_array);
-- do {
-- unread--;
-- wait_on_buffer(read_array[unread]);
-- } while (unread);
-+ for (i = 0; i < BLKS_PER_BUF; i++) {
-+ struct page *page = pages[i];
-+ if (page) {
-+ wait_on_page_locked(page);
-+ if (!PageUptodate(page)) {
-+ /* asynchronous error */
-+ page_cache_release(page);
-+ pages[i] = NULL;
-+ }
-+ }
- }
-
-- /* Ok, copy them to the staging area without sleeping. */
- buffer = next_buffer;
- next_buffer = NEXT_BUFFER(buffer);
- buffer_blocknr[buffer] = blocknr;
-@@ -172,10 +175,11 @@ static void *cramfs_read(struct super_bl
-
- data = read_buffers[buffer];
- for (i = 0; i < BLKS_PER_BUF; i++) {
-- struct buffer_head * bh = bh_array[i];
-- if (bh) {
-- memcpy(data, bh->b_data, PAGE_CACHE_SIZE);
-- brelse(bh);
-+ struct page *page = pages[i];
-+ if (page) {
-+ memcpy(data, kmap(page), PAGE_CACHE_SIZE);
-+ kunmap(page);
-+ page_cache_release(page);
- } else
- memset(data, 0, PAGE_CACHE_SIZE);
- data += PAGE_CACHE_SIZE;
-@@ -202,8 +206,6 @@ static int cramfs_fill_super(struct supe
- sb->s_fs_info = sbi;
- memset(sbi, 0, sizeof(struct cramfs_sb_info));
-
-- sb_set_blocksize(sb, PAGE_CACHE_SIZE);
--
- /* Invalidate the read buffers on mount: think disk change.. */
- down(&read_mutex);
- for (i = 0; i < READ_BUFFERS; i++)
---- linux-2.6.0/fs/dcache.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/dcache.c 2003-12-28 23:21:54.000000000 -0800
-@@ -639,24 +639,9 @@ void shrink_dcache_anon(struct hlist_hea
-
- /*
- * This is called from kswapd when we think we need some more memory.
-- *
-- * We don't want the VM to steal _all_ unused dcache. Because that leads to
-- * the VM stealing all unused inodes, which shoots down recently-used
-- * pagecache. So what we do is to tell fibs to the VM about how many reapable
-- * objects there are in this cache. If the number of unused dentries is
-- * less than half of the total dentry count then return zero. The net effect
-- * is that the number of unused dentries will be, at a minimum, equal to the
-- * number of used ones.
-- *
-- * If unused_ratio is set to 5, the number of unused dentries will not fall
-- * below 5* the number of used ones.
- */
- static int shrink_dcache_memory(int nr, unsigned int gfp_mask)
- {
-- int nr_used;
-- int nr_unused;
-- const int unused_ratio = 1;
--
- if (nr) {
- /*
- * Nasty deadlock avoidance.
-@@ -672,11 +657,7 @@ static int shrink_dcache_memory(int nr,
- if (gfp_mask & __GFP_FS)
- prune_dcache(nr);
- }
-- nr_unused = dentry_stat.nr_unused;
-- nr_used = dentry_stat.nr_dentry - nr_unused;
-- if (nr_unused < nr_used * unused_ratio)
-- return 0;
-- return nr_unused - nr_used * unused_ratio;
-+ return dentry_stat.nr_unused;
- }
-
- #define NAME_ALLOC_LEN(len) ((len+16) & ~15)
---- linux-2.6.0/fs/devfs/base.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/devfs/base.c 2003-12-28 23:21:21.000000000 -0800
-@@ -1955,15 +1955,9 @@ static int devfs_notify_change (struct d
- return 0;
- } /* End Function devfs_notify_change */
-
--static void devfs_clear_inode (struct inode *inode)
--{
-- if ( S_ISBLK (inode->i_mode) ) bdput (inode->i_bdev);
--} /* End Function devfs_clear_inode */
--
- static struct super_operations devfs_sops =
- {
- .drop_inode = generic_delete_inode,
-- .clear_inode = devfs_clear_inode,
- .statfs = simple_statfs,
- };
-
-@@ -2015,11 +2009,7 @@ static struct inode *_devfs_get_vfs_inod
- inode->i_rdev = de->u.cdev.dev;
- }
- else if ( S_ISBLK (de->mode) )
-- {
-- inode->i_rdev = de->u.bdev.dev;
-- if (bd_acquire (inode) != 0)
-- PRINTK ("(%d): no block device from bdget()\n",(int)inode->i_ino);
-- }
-+ init_special_inode(inode, de->mode, de->u.bdev.dev);
- else if ( S_ISFIFO (de->mode) )
- inode->i_fop = &def_fifo_fops;
- else if ( S_ISDIR (de->mode) )
-@@ -2118,11 +2108,7 @@ static int devfs_open (struct inode *ino
- if (de == NULL) return -ENODEV;
- if ( S_ISDIR (de->mode) ) return 0;
- file->private_data = de->info;
-- if ( S_ISBLK (inode->i_mode) )
-- {
-- file->f_op = &def_blk_fops;
-- err = def_blk_fops.open (inode, file); /* Module refcount unchanged */
-- } else if (S_ISCHR(inode->i_mode)) {
-+ if (S_ISCHR(inode->i_mode)) {
- ops = devfs_get_ops (de); /* Now have module refcount */
- file->f_op = ops;
- if (file->f_op)
---- linux-2.6.0/fs/direct-io.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/direct-io.c 2003-12-28 23:26:38.000000000 -0800
-@@ -52,6 +52,10 @@
- *
- * If blkfactor is zero then the user's request was aligned to the filesystem's
- * blocksize.
-+ *
-+ * needs_locking is set for regular files on direct-IO-naive filesystems. It
-+ * determines whether we need to do the fancy locking which prevents direct-IO
-+ * from being able to read uninitialised disk blocks.
- */
-
- struct dio {
-@@ -59,6 +63,7 @@ struct dio {
- struct bio *bio; /* bio under assembly */
- struct inode *inode;
- int rw;
-+ int needs_locking; /* doesn't change */
- unsigned blkbits; /* doesn't change */
- unsigned blkfactor; /* When we're using an alignment which
- is finer than the filesystem's soft
-@@ -204,8 +209,10 @@ static struct page *dio_get_page(struct
- */
- static void dio_complete(struct dio *dio, loff_t offset, ssize_t bytes)
- {
-- if (dio->end_io)
-+ if (dio->end_io && dio->result)
- dio->end_io(dio->inode, offset, bytes, dio->map_bh.b_private);
-+ if (dio->needs_locking)
-+ up_read(&dio->inode->i_alloc_sem);
- }
-
- /*
-@@ -218,8 +225,14 @@ static void finished_one_bio(struct dio
- if (dio->is_async) {
- dio_complete(dio, dio->block_in_file << dio->blkbits,
- dio->result);
-- aio_complete(dio->iocb, dio->result, 0);
-- kfree(dio);
-+ /* Complete AIO later if falling back to buffered i/o */
-+ if (dio->result != -ENOTBLK) {
-+ aio_complete(dio->iocb, dio->result, 0);
-+ kfree(dio);
-+ } else {
-+ if (dio->waiter)
-+ wake_up_process(dio->waiter);
-+ }
- }
- }
- }
-@@ -449,6 +462,7 @@ static int get_more_blocks(struct dio *d
- unsigned long fs_count; /* Number of filesystem-sized blocks */
- unsigned long dio_count;/* Number of dio_block-sized blocks */
- unsigned long blkmask;
-+ int beyond_eof = 0;
-
- /*
- * If there was a memory error and we've overwritten all the
-@@ -466,8 +480,19 @@ static int get_more_blocks(struct dio *d
- if (dio_count & blkmask)
- fs_count++;
-
-+ if (dio->needs_locking) {
-+ if (dio->block_in_file >= (i_size_read(dio->inode) >>
-+ dio->blkbits))
-+ beyond_eof = 1;
-+ }
-+ /*
-+ * For writes inside i_size we forbid block creations: only
-+ * overwrites are permitted. We fall back to buffered writes
-+ * at a higher level for inside-i_size block-instantiating
-+ * writes.
-+ */
- ret = (*dio->get_blocks)(dio->inode, fs_startblk, fs_count,
-- map_bh, dio->rw == WRITE);
-+ map_bh, (dio->rw == WRITE) && beyond_eof);
- }
- return ret;
- }
-@@ -774,6 +799,10 @@ do_holes:
- if (!buffer_mapped(map_bh)) {
- char *kaddr;
-
-+ /* AKPM: eargh, -ENOTBLK is a hack */
-+ if (dio->rw == WRITE)
-+ return -ENOTBLK;
-+
- if (dio->block_in_file >=
- i_size_read(dio->inode)>>blkbits) {
- /* We hit eof */
-@@ -839,23 +868,21 @@ out:
- return ret;
- }
-
-+/*
-+ * Releases both i_sem and i_alloc_sem
-+ */
- static int
- direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
- const struct iovec *iov, loff_t offset, unsigned long nr_segs,
-- unsigned blkbits, get_blocks_t get_blocks, dio_iodone_t end_io)
-+ unsigned blkbits, get_blocks_t get_blocks, dio_iodone_t end_io,
-+ struct dio *dio)
- {
- unsigned long user_addr;
- int seg;
- int ret = 0;
- int ret2;
-- struct dio *dio;
- size_t bytes;
-
-- dio = kmalloc(sizeof(*dio), GFP_KERNEL);
-- if (!dio)
-- return -ENOMEM;
-- dio->is_async = !is_sync_kiocb(iocb);
--
- dio->bio = NULL;
- dio->inode = inode;
- dio->rw = rw;
-@@ -864,7 +891,6 @@ direct_io_worker(int rw, struct kiocb *i
- dio->start_zero_done = 0;
- dio->block_in_file = offset >> blkbits;
- dio->blocks_available = 0;
--
- dio->cur_page = NULL;
-
- dio->boundary = 0;
-@@ -947,14 +973,51 @@ direct_io_worker(int rw, struct kiocb *i
- dio_bio_submit(dio);
-
- /*
-+ * It is possible that, we return short IO due to end of file.
-+ * In that case, we need to release all the pages we got hold on.
-+ */
-+ dio_cleanup(dio);
-+
-+ /*
-+ * All block lookups have been performed. For READ requests
-+ * we can let i_sem go now that its achieved its purpose
-+ * of protecting us from looking up uninitialized blocks.
-+ */
-+ if ((rw == READ) && dio->needs_locking)
-+ up(&dio->inode->i_sem);
-+
-+ /*
- * OK, all BIOs are submitted, so we can decrement bio_count to truly
- * reflect the number of to-be-processed BIOs.
- */
- if (dio->is_async) {
- if (ret == 0)
- ret = dio->result; /* Bytes written */
-+ if (ret == -ENOTBLK) {
-+ /*
-+ * The request will be reissued via buffered I/O
-+ * when we return; Any I/O already issued
-+ * effectively becomes redundant.
-+ */
-+ dio->result = ret;
-+ dio->waiter = current;
-+ }
- finished_one_bio(dio); /* This can free the dio */
- blk_run_queues();
-+ if (ret == -ENOTBLK) {
-+ /*
-+ * Wait for already issued I/O to drain out and
-+ * release its references to user-space pages
-+ * before returning to fallback on buffered I/O
-+ */
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ while (atomic_read(&dio->bio_count)) {
-+ io_schedule();
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ }
-+ set_current_state(TASK_RUNNING);
-+ dio->waiter = NULL;
-+ }
- } else {
- finished_one_bio(dio);
- ret2 = dio_await_completion(dio);
-@@ -974,6 +1037,9 @@ direct_io_worker(int rw, struct kiocb *i
- ret = i_size - offset;
- }
- dio_complete(dio, offset, ret);
-+ /* We could have also come here on an AIO file extend */
-+ if (!is_sync_kiocb(iocb) && (ret != -ENOTBLK))
-+ aio_complete(iocb, ret, 0);
- kfree(dio);
- }
- return ret;
-@@ -981,11 +1047,17 @@ direct_io_worker(int rw, struct kiocb *i
-
- /*
- * This is a library function for use by filesystem drivers.
-+ *
-+ * For writes to S_ISREG files, we are called under i_sem and return with i_sem
-+ * held, even though it is internally dropped.
-+ *
-+ * For writes to S_ISBLK files, i_sem is not held on entry; it is never taken.
- */
- int
--blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
-+__blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
- struct block_device *bdev, const struct iovec *iov, loff_t offset,
-- unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io)
-+ unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io,
-+ int needs_special_locking)
- {
- int seg;
- size_t size;
-@@ -994,6 +1066,9 @@ blockdev_direct_IO(int rw, struct kiocb
- unsigned bdev_blkbits = 0;
- unsigned blocksize_mask = (1 << blkbits) - 1;
- ssize_t retval = -EINVAL;
-+ loff_t end = offset;
-+ struct dio *dio;
-+ int needs_locking;
-
- if (bdev)
- bdev_blkbits = blksize_bits(bdev_hardsect_size(bdev));
-@@ -1010,6 +1085,7 @@ blockdev_direct_IO(int rw, struct kiocb
- for (seg = 0; seg < nr_segs; seg++) {
- addr = (unsigned long)iov[seg].iov_base;
- size = iov[seg].iov_len;
-+ end += size;
- if ((addr & blocksize_mask) || (size & blocksize_mask)) {
- if (bdev)
- blkbits = bdev_blkbits;
-@@ -1019,10 +1095,43 @@ blockdev_direct_IO(int rw, struct kiocb
- }
- }
-
-- retval = direct_io_worker(rw, iocb, inode, iov, offset,
-- nr_segs, blkbits, get_blocks, end_io);
-+ dio = kmalloc(sizeof(*dio), GFP_KERNEL);
-+ retval = -ENOMEM;
-+ if (!dio)
-+ goto out;
-+
-+ /*
-+ * For regular files,
-+ * readers need to grab i_sem and i_alloc_sem
-+ * writers need to grab i_alloc_sem only (i_sem is already held)
-+ */
-+ needs_locking = 0;
-+ if (S_ISREG(inode->i_mode) && needs_special_locking) {
-+ needs_locking = 1;
-+ if (rw == READ) {
-+ down(&inode->i_sem);
-+ retval = filemap_write_and_wait(inode->i_mapping);
-+ if (retval) {
-+ up(&inode->i_sem);
-+ kfree(dio);
-+ goto out;
-+ }
-+ }
-+ down_read(&inode->i_alloc_sem);
-+ }
-+ dio->needs_locking = needs_locking;
-+ /*
-+ * For file extending writes updating i_size before data
-+ * writeouts complete can expose uninitialized blocks. So
-+ * even for AIO, we need to wait for i/o to complete before
-+ * returning in this case.
-+ */
-+ dio->is_async = !is_sync_kiocb(iocb) && !((rw == WRITE) &&
-+ (end > i_size_read(inode)));
-+
-+ retval = direct_io_worker(rw, iocb, inode, iov, offset,
-+ nr_segs, blkbits, get_blocks, end_io, dio);
- out:
- return retval;
- }
--
--EXPORT_SYMBOL(blockdev_direct_IO);
-+EXPORT_SYMBOL(__blockdev_direct_IO);
---- linux-2.6.0/fs/dquot.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/dquot.c 2003-12-28 23:22:17.000000000 -0800
-@@ -192,6 +192,8 @@ static struct list_head dquot_hash[NR_DQ
-
- struct dqstats dqstats;
-
-+static void dqput(struct dquot *dquot);
-+
- static inline int const hashfn(struct super_block *sb, unsigned int id, int type)
- {
- return((((unsigned long)sb>>L1_CACHE_SHIFT) ^ id) * (MAXQUOTAS - type)) % NR_DQHASH;
-@@ -339,8 +341,11 @@ restart:
- continue;
- if (!dquot_dirty(dquot))
- continue;
-+ atomic_inc(&dquot->dq_count);
-+ dqstats.lookups++;
- spin_unlock(&dq_list_lock);
-- sb->dq_op->sync_dquot(dquot);
-+ sb->dq_op->write_dquot(dquot);
-+ dqput(dquot);
- goto restart;
- }
- spin_unlock(&dq_list_lock);
-@@ -427,7 +432,7 @@ we_slept:
- }
- if (dquot_dirty(dquot)) {
- spin_unlock(&dq_list_lock);
-- commit_dqblk(dquot);
-+ dquot->dq_sb->dq_op->write_dquot(dquot);
- goto we_slept;
- }
- atomic_dec(&dquot->dq_count);
-@@ -1083,7 +1088,7 @@ struct dquot_operations dquot_operations
- .free_space = dquot_free_space,
- .free_inode = dquot_free_inode,
- .transfer = dquot_transfer,
-- .sync_dquot = commit_dqblk
-+ .write_dquot = commit_dqblk
- };
-
- /* Function used by filesystems for initializing the dquot_operations structure */
-@@ -1207,9 +1212,9 @@ int vfs_quota_on(struct super_block *sb,
- error = -EINVAL;
- if (!fmt->qf_ops->check_quota_file(sb, type))
- goto out_file_init;
-- /* We don't want quota on quota files */
-+ /* We don't want quota and atime on quota files (deadlocks possible) */
- dquot_drop_nolock(inode);
-- inode->i_flags |= S_NOQUOTA;
-+ inode->i_flags |= S_NOQUOTA | S_NOATIME;
-
- dqopt->ops[type] = fmt->qf_ops;
- dqopt->info[type].dqi_format = fmt;
---- linux-2.6.0/fs/eventpoll.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/eventpoll.c 2003-12-28 23:23:06.000000000 -0800
-@@ -93,6 +93,8 @@
- #define EPI_SLAB_DEBUG 0
- #endif /* #if DEBUG_EPI != 0 */
-
-+/* Epoll private bits inside the event mask */
-+#define EP_PRIVATE_BITS (EPOLLONESHOT | EPOLLET)
-
- /* Maximum number of poll wake up nests we are allowing */
- #define EP_MAX_POLLWAKE_NESTS 4
-@@ -740,6 +742,7 @@ static int ep_getfd(int *efd, struct ino
- d_add(dentry, inode);
- file->f_vfsmnt = mntget(eventpoll_mnt);
- file->f_dentry = dget(dentry);
-+ file->f_mapping = inode->i_mapping;
-
- file->f_pos = 0;
- file->f_flags = O_RDONLY;
-@@ -1305,6 +1308,15 @@ static int ep_poll_callback(wait_queue_t
-
- write_lock_irqsave(&ep->lock, flags);
-
-+ /*
-+ * If the event mask does not contain any poll(2) event, we consider the
-+ * descriptor to be disabled. This condition is likely the effect of the
-+ * EPOLLONESHOT bit that disables the descriptor when an event is received,
-+ * until the next EPOLL_CTL_MOD will be issued.
-+ */
-+ if (!(epi->event.events & ~EP_PRIVATE_BITS))
-+ goto is_disabled;
-+
- /* If this file is already in the ready list we exit soon */
- if (EP_IS_LINKED(&epi->rdllink))
- goto is_linked;
-@@ -1321,6 +1333,7 @@ is_linked:
- if (waitqueue_active(&ep->poll_wait))
- pwake++;
-
-+is_disabled:
- write_unlock_irqrestore(&ep->lock, flags);
-
- /* We have to call this outside the lock */
-@@ -1457,6 +1470,8 @@ static int ep_send_events(struct eventpo
- eventcnt += eventbuf;
- eventbuf = 0;
- }
-+ if (epi->event.events & EPOLLONESHOT)
-+ epi->event.events &= EP_PRIVATE_BITS;
- }
- }
-
---- linux-2.6.0/fs/exec.c 2003-10-17 15:58:04.000000000 -0700
-+++ 25/fs/exec.c 2003-12-28 23:22:56.000000000 -0800
-@@ -779,6 +779,7 @@ int flush_old_exec(struct linux_binprm *
- {
- char * name;
- int i, ch, retval;
-+ struct files_struct *files;
-
- /*
- * Make sure we have a private signal table and that
-@@ -789,15 +790,26 @@ int flush_old_exec(struct linux_binprm *
- goto out;
-
- /*
-+ * Make sure we have private file handles. Ask the
-+ * fork helper to do the work for us and the exit
-+ * helper to do the cleanup of the old one.
-+ */
-+ files = current->files; /* refcounted so safe to hold */
-+ retval = unshare_files();
-+ if (retval)
-+ goto out;
-+ /*
- * Release all of the old mmap stuff
- */
- retval = exec_mmap(bprm->mm);
- if (retval)
-- goto out;
-+ goto mmap_failed;
-
- bprm->mm = NULL; /* We're using it now */
-
- /* This is the point of no return */
-+ steal_locks(files);
-+ put_files_struct(files);
-
- current->sas_ss_sp = current->sas_ss_size = 0;
-
-@@ -830,6 +842,9 @@ int flush_old_exec(struct linux_binprm *
-
- return 0;
-
-+mmap_failed:
-+ put_files_struct(current->files);
-+ current->files = files;
- out:
- return retval;
- }
-@@ -1070,6 +1085,7 @@ int do_execve(char * filename,
- struct linux_binprm bprm;
- struct file *file;
- int retval;
-+ int i;
-
- sched_balance_exec();
-
-@@ -1138,7 +1154,11 @@ int do_execve(char * filename,
-
- out:
- /* Something went wrong, return the inode and free the argument pages*/
-- free_arg_pages(&bprm);
-+ for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
-+ struct page * page = bprm.page[i];
-+ if (page)
-+ __free_page(page);
-+ }
-
- if (bprm.security)
- security_bprm_free(&bprm);
---- linux-2.6.0/fs/ext2/inode.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/ext2/inode.c 2003-12-28 23:26:41.000000000 -0800
-@@ -257,11 +257,12 @@ static int ext2_block_to_path(struct ino
- * or when it reads all @depth-1 indirect blocks successfully and finds
- * the whole chain, all way to the data (returns %NULL, *err == 0).
- */
--static Indirect *ext2_get_branch(struct inode *inode,
-+static Indirect *ext2_get_branch_wq(struct inode *inode,
- int depth,
- int *offsets,
- Indirect chain[4],
-- int *err)
-+ int *err,
-+ wait_queue_t *wait)
- {
- struct super_block *sb = inode->i_sb;
- Indirect *p = chain;
-@@ -273,8 +274,8 @@ static Indirect *ext2_get_branch(struct
- if (!p->key)
- goto no_block;
- while (--depth) {
-- bh = sb_bread(sb, le32_to_cpu(p->key));
-- if (!bh)
-+ bh = sb_bread_wq(sb, le32_to_cpu(p->key), wait);
-+ if (!bh || IS_ERR(bh))
- goto failure;
- read_lock(&EXT2_I(inode)->i_meta_lock);
- if (!verify_chain(chain, p))
-@@ -292,11 +293,21 @@ changed:
- *err = -EAGAIN;
- goto no_block;
- failure:
-- *err = -EIO;
-+ *err = IS_ERR(bh) ? PTR_ERR(bh) : -EIO;
- no_block:
- return p;
- }
-
-+static Indirect *ext2_get_branch(struct inode *inode,
-+ int depth,
-+ int *offsets,
-+ Indirect chain[4],
-+ int *err)
-+{
-+ return ext2_get_branch_wq(inode, depth, offsets, chain,
-+ err, NULL);
-+}
-+
- /**
- * ext2_find_near - find a place for allocation with sufficient locality
- * @inode: owner
-@@ -536,7 +547,8 @@ changed:
- * reachable from inode.
- */
-
--static int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
-+static int ext2_get_block_wq(struct inode *inode, sector_t iblock,
-+ struct buffer_head *bh_result, int create, wait_queue_t *wait)
- {
- int err = -EIO;
- int offsets[4];
-@@ -551,7 +563,8 @@ static int ext2_get_block(struct inode *
- goto out;
-
- reread:
-- partial = ext2_get_branch(inode, depth, offsets, chain, &err);
-+ partial = ext2_get_branch_wq(inode, depth, offsets, chain, &err,
-+ wait);
-
- /* Simplest case - block found, no allocation needed */
- if (!partial) {
-@@ -565,7 +578,7 @@ got_it:
- }
-
- /* Next simple case - plain lookup or failed read of indirect block */
-- if (!create || err == -EIO) {
-+ if (!create || err == -EIO || err == -EIOCBRETRY) {
- cleanup:
- while (partial > chain) {
- brelse(partial->bh);
-@@ -606,6 +619,19 @@ changed:
- goto reread;
- }
-
-+static int ext2_get_block_async(struct inode *inode, sector_t iblock,
-+ struct buffer_head *bh_result, int create)
-+{
-+ return ext2_get_block_wq(inode, iblock, bh_result, create,
-+ current->io_wait);
-+}
-+
-+static int ext2_get_block(struct inode *inode, sector_t iblock,
-+ struct buffer_head *bh_result, int create)
-+{
-+ return ext2_get_block_wq(inode, iblock, bh_result, create, NULL);
-+}
-+
- static int ext2_writepage(struct page *page, struct writeback_control *wbc)
- {
- return block_write_full_page(page, ext2_get_block, wbc);
-@@ -627,7 +653,7 @@ static int
- ext2_prepare_write(struct file *file, struct page *page,
- unsigned from, unsigned to)
- {
-- return block_prepare_write(page,from,to,ext2_get_block);
-+ return block_prepare_write(page,from,to,ext2_get_block_async);
- }
-
- static int
-@@ -659,7 +685,7 @@ ext2_direct_IO(int rw, struct kiocb *ioc
- loff_t offset, unsigned long nr_segs)
- {
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
-
- return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
- offset, nr_segs, ext2_get_blocks, NULL);
---- linux-2.6.0/fs/ext3/balloc.c 2003-08-22 19:23:42.000000000 -0700
-+++ 25/fs/ext3/balloc.c 2003-12-28 23:22:36.000000000 -0800
-@@ -517,7 +517,7 @@ ext3_new_block(handle_t *handle, struct
- sbi->s_resuid != current->fsuid &&
- (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) {
- *errp = -ENOSPC;
-- return 0;
-+ goto out;
- }
-
- /*
---- linux-2.6.0/fs/ext3/inode.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/ext3/inode.c 2003-12-28 23:21:19.000000000 -0800
-@@ -1532,7 +1532,7 @@ static int ext3_direct_IO(int rw, struct
- unsigned long nr_segs)
- {
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
- struct ext3_inode_info *ei = EXT3_I(inode);
- handle_t *handle = NULL;
- int ret;
---- linux-2.6.0/fs/ext3/super.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/fs/ext3/super.c 2003-12-28 23:22:17.000000000 -0800
-@@ -340,6 +340,7 @@ fail:
- */
- static int ext3_blkdev_put(struct block_device *bdev)
- {
-+ bd_release(bdev);
- return blkdev_put(bdev, BDEV_FS);
- }
-
-@@ -1480,6 +1481,13 @@ static journal_t *ext3_get_dev_journal(s
- if (bdev == NULL)
- return NULL;
-
-+ if (bd_claim(bdev, sb)) {
-+ printk(KERN_ERR
-+ "EXT3: failed to claim external journal device.\n");
-+ blkdev_put(bdev, BDEV_FS);
-+ return NULL;
-+ }
-+
- blocksize = sb->s_blocksize;
- hblock = bdev_hardsect_size(bdev);
- if (blocksize < hblock) {
-@@ -1944,9 +1952,9 @@ int ext3_statfs (struct super_block * sb
- /* Blocks: quota info + (4 pointer blocks + 1 entry block) * (3 indirect + 1 descriptor + 1 bitmap) + superblock */
- #define EXT3_V0_QFMT_BLOCKS 27
-
--static int (*old_sync_dquot)(struct dquot *dquot);
-+static int (*old_write_dquot)(struct dquot *dquot);
-
--static int ext3_sync_dquot(struct dquot *dquot)
-+static int ext3_write_dquot(struct dquot *dquot)
- {
- int nblocks;
- int ret;
-@@ -1971,7 +1979,7 @@ static int ext3_sync_dquot(struct dquot
- ret = PTR_ERR(handle);
- goto out;
- }
-- ret = old_sync_dquot(dquot);
-+ ret = old_write_dquot(dquot);
- err = ext3_journal_stop(handle);
- if (ret == 0)
- ret = err;
-@@ -2004,8 +2012,8 @@ static int __init init_ext3_fs(void)
- goto out1;
- #ifdef CONFIG_QUOTA
- init_dquot_operations(&ext3_qops);
-- old_sync_dquot = ext3_qops.sync_dquot;
-- ext3_qops.sync_dquot = ext3_sync_dquot;
-+ old_write_dquot = ext3_qops.write_dquot;
-+ ext3_qops.write_dquot = ext3_write_dquot;
- #endif
- err = register_filesystem(&ext3_fs_type);
- if (err)
---- linux-2.6.0/fs/fat/file.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/fs/fat/file.c 2003-12-28 23:22:50.000000000 -0800
-@@ -20,6 +20,8 @@ struct file_operations fat_file_operatio
- .write = fat_file_write,
- .mmap = generic_file_mmap,
- .fsync = file_fsync,
-+ .readv = generic_file_readv,
-+ .writev = generic_file_writev,
- .sendfile = generic_file_sendfile,
- };
-
---- linux-2.6.0/fs/fat/inode.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/fat/inode.c 2003-12-28 23:22:52.000000000 -0800
-@@ -191,9 +191,9 @@ static int fat_show_options(struct seq_f
- int isvfat = opts->isvfat;
-
- if (opts->fs_uid != 0)
-- seq_printf(m, ",uid=%d", opts->fs_uid);
-+ seq_printf(m, ",uid=%u", opts->fs_uid);
- if (opts->fs_gid != 0)
-- seq_printf(m, ",gid=%d", opts->fs_gid);
-+ seq_printf(m, ",gid=%u", opts->fs_gid);
- seq_printf(m, ",fmask=%04o", opts->fs_fmask);
- seq_printf(m, ",dmask=%04o", opts->fs_dmask);
- if (sbi->nls_disk)
-@@ -765,8 +765,9 @@ int fat_fill_super(struct super_block *s
- struct buffer_head *bh;
- struct fat_boot_sector *b;
- struct msdos_sb_info *sbi;
-- int logical_sector_size, fat_clusters, debug, cp, first;
-- unsigned int total_sectors, rootdir_sectors;
-+ u16 logical_sector_size;
-+ u32 total_sectors, total_clusters, fat_clusters, rootdir_sectors;
-+ int debug, cp, first;
- unsigned int media;
- long error;
- char buf[50];
-@@ -831,14 +832,13 @@ int fat_fill_super(struct super_block *s
- brelse(bh);
- goto out_invalid;
- }
-- logical_sector_size =
-- CF_LE_W(get_unaligned((unsigned short *) &b->sector_size));
-+ logical_sector_size = CF_LE_W(get_unaligned((u16 *)&b->sector_size));
- if (!logical_sector_size
- || (logical_sector_size & (logical_sector_size - 1))
- || (logical_sector_size < 512)
- || (PAGE_CACHE_SIZE < logical_sector_size)) {
- if (!silent)
-- printk(KERN_ERR "FAT: bogus logical sector size %d\n",
-+ printk(KERN_ERR "FAT: bogus logical sector size %u\n",
- logical_sector_size);
- brelse(bh);
- goto out_invalid;
-@@ -847,7 +847,7 @@ int fat_fill_super(struct super_block *s
- if (!sbi->sec_per_clus
- || (sbi->sec_per_clus & (sbi->sec_per_clus - 1))) {
- if (!silent)
-- printk(KERN_ERR "FAT: bogus sectors per cluster %d\n",
-+ printk(KERN_ERR "FAT: bogus sectors per cluster %u\n",
- sbi->sec_per_clus);
- brelse(bh);
- goto out_invalid;
-@@ -855,7 +855,7 @@ int fat_fill_super(struct super_block *s
-
- if (logical_sector_size < sb->s_blocksize) {
- printk(KERN_ERR "FAT: logical sector size too small for device"
-- " (logical sector size = %d)\n", logical_sector_size);
-+ " (logical sector size = %u)\n", logical_sector_size);
- brelse(bh);
- goto out_fail;
- }
-@@ -863,7 +863,7 @@ int fat_fill_super(struct super_block *s
- brelse(bh);
-
- if (!sb_set_blocksize(sb, logical_sector_size)) {
-- printk(KERN_ERR "FAT: unable to set blocksize %d\n",
-+ printk(KERN_ERR "FAT: unable to set blocksize %u\n",
- logical_sector_size);
- goto out_fail;
- }
-@@ -885,7 +885,7 @@ int fat_fill_super(struct super_block *s
- sbi->fat_length = CF_LE_W(b->fat_length);
- sbi->root_cluster = 0;
- sbi->free_clusters = -1; /* Don't know yet */
-- sbi->prev_free = 0;
-+ sbi->prev_free = -1;
-
- if (!sbi->fat_length && b->fat32_length) {
- struct fat_boot_fsinfo *fsinfo;
-@@ -932,10 +932,11 @@ int fat_fill_super(struct super_block *s
- sbi->dir_per_block_bits = ffs(sbi->dir_per_block) - 1;
-
- sbi->dir_start = sbi->fat_start + sbi->fats * sbi->fat_length;
-- sbi->dir_entries =
-- CF_LE_W(get_unaligned((unsigned short *)&b->dir_entries));
-+ sbi->dir_entries = CF_LE_W(get_unaligned((u16 *)&b->dir_entries));
- if (sbi->dir_entries & (sbi->dir_per_block - 1)) {
-- printk(KERN_ERR "FAT: bogus directroy-entries per block\n");
-+ if (!silent)
-+ printk(KERN_ERR "FAT: bogus directroy-entries per block"
-+ " (%u)\n", sbi->dir_entries);
- brelse(bh);
- goto out_invalid;
- }
-@@ -943,18 +944,27 @@ int fat_fill_super(struct super_block *s
- rootdir_sectors = sbi->dir_entries
- * sizeof(struct msdos_dir_entry) / sb->s_blocksize;
- sbi->data_start = sbi->dir_start + rootdir_sectors;
-- total_sectors = CF_LE_W(get_unaligned((unsigned short *)&b->sectors));
-+ total_sectors = CF_LE_W(get_unaligned((u16 *)&b->sectors));
- if (total_sectors == 0)
- total_sectors = CF_LE_L(b->total_sect);
-- sbi->clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
-+
-+ total_clusters = (total_sectors - sbi->data_start) / sbi->sec_per_clus;
-
- if (sbi->fat_bits != 32)
-- sbi->fat_bits = (sbi->clusters > MSDOS_FAT12) ? 16 : 12;
-+ sbi->fat_bits = (total_clusters > MAX_FAT12) ? 16 : 12;
-
- /* check that FAT table does not overflow */
- fat_clusters = sbi->fat_length * sb->s_blocksize * 8 / sbi->fat_bits;
-- if (sbi->clusters > fat_clusters - 2)
-- sbi->clusters = fat_clusters - 2;
-+ total_clusters = min(total_clusters, fat_clusters - 2);
-+ if (total_clusters > MAX_FAT(sb)) {
-+ if (!silent)
-+ printk(KERN_ERR "FAT: count of clusters too big (%u)\n",
-+ total_clusters);
-+ brelse(bh);
-+ goto out_invalid;
-+ }
-+
-+ sbi->clusters = total_clusters;
-
- brelse(bh);
-
-@@ -968,6 +978,8 @@ int fat_fill_super(struct super_block *s
- /* all is as it should be */
- } else if (media == 0xf8 && FAT_FIRST_ENT(sb, 0xfe) == first) {
- /* bad, reported on pc9800 */
-+ } else if (media == 0xf0 && FAT_FIRST_ENT(sb, 0xf8) == first) {
-+ /* bad, reported with a MO disk on win95/me */
- } else if (first == 0) {
- /* bad, reported with a SmartMedia card */
- } else {
-@@ -1047,7 +1059,7 @@ out_fail:
-
- int fat_statfs(struct super_block *sb, struct kstatfs *buf)
- {
-- int free, nr;
-+ int free, nr, ret;
-
- if (MSDOS_SB(sb)->free_clusters != -1)
- free = MSDOS_SB(sb)->free_clusters;
-@@ -1057,9 +1069,14 @@ int fat_statfs(struct super_block *sb, s
- free = MSDOS_SB(sb)->free_clusters;
- else {
- free = 0;
-- for (nr = 2; nr < MSDOS_SB(sb)->clusters + 2; nr++)
-- if (fat_access(sb, nr, -1) == FAT_ENT_FREE)
-+ for (nr = 2; nr < MSDOS_SB(sb)->clusters + 2; nr++) {
-+ ret = fat_access(sb, nr, -1);
-+ if (ret < 0) {
-+ unlock_fat(sb);
-+ return ret;
-+ } else if (ret == FAT_ENT_FREE)
- free++;
-+ }
- MSDOS_SB(sb)->free_clusters = free;
- }
- unlock_fat(sb);
-@@ -1209,10 +1226,10 @@ retry:
- }
- lock_kernel();
- if (!(bh = sb_bread(sb, i_pos >> MSDOS_SB(sb)->dir_per_block_bits))) {
-- fat_fs_panic(sb, "unable to read i-node block (i_pos %lld)",
-- i_pos);
-+ printk(KERN_ERR "FAT: unable to read inode block "
-+ "for updating (i_pos %lld)", i_pos);
- unlock_kernel();
-- return;
-+ return /* -EIO */;
- }
- spin_lock(&fat_inode_lock);
- if (i_pos != MSDOS_I(inode)->i_pos) {
---- linux-2.6.0/fs/fat/misc.c 2003-08-08 22:55:13.000000000 -0700
-+++ 25/fs/fat/misc.c 2003-12-28 23:22:51.000000000 -0800
-@@ -74,7 +74,7 @@ void fat_clusters_flush(struct super_blo
- } else {
- if (sbi->free_clusters != -1)
- fsinfo->free_clusters = CF_LE_L(sbi->free_clusters);
-- if (sbi->prev_free)
-+ if (sbi->prev_free != -1)
- fsinfo->next_cluster = CF_LE_L(sbi->prev_free);
- mark_buffer_dirty(bh);
- }
-@@ -88,7 +88,7 @@ void fat_clusters_flush(struct super_blo
- int fat_add_cluster(struct inode *inode)
- {
- struct super_block *sb = inode->i_sb;
-- int count, limit, new_dclus, new_fclus, last;
-+ int ret, count, limit, new_dclus, new_fclus, last;
- int cluster_bits = MSDOS_SB(sb)->cluster_bits;
-
- /*
-@@ -123,7 +123,12 @@ int fat_add_cluster(struct inode *inode)
- new_dclus = new_dclus % limit;
- if (new_dclus < 2)
- new_dclus = 2;
-- if (fat_access(sb, new_dclus, -1) == FAT_ENT_FREE)
-+
-+ ret = fat_access(sb, new_dclus, -1);
-+ if (ret < 0) {
-+ unlock_fat(sb);
-+ return ret;
-+ } else if (ret == FAT_ENT_FREE)
- break;
- }
- if (count >= MSDOS_SB(sb)->clusters) {
-@@ -131,9 +136,14 @@ int fat_add_cluster(struct inode *inode)
- unlock_fat(sb);
- return -ENOSPC;
- }
-- MSDOS_SB(sb)->prev_free = new_dclus;
-
-- fat_access(sb, new_dclus, FAT_ENT_EOF);
-+ ret = fat_access(sb, new_dclus, FAT_ENT_EOF);
-+ if (ret < 0) {
-+ unlock_fat(sb);
-+ return ret;
-+ }
-+
-+ MSDOS_SB(sb)->prev_free = new_dclus;
- if (MSDOS_SB(sb)->free_clusters != -1)
- MSDOS_SB(sb)->free_clusters--;
- fat_clusters_flush(sb);
-@@ -142,7 +152,9 @@ int fat_add_cluster(struct inode *inode)
-
- /* add new one to the last of the cluster chain */
- if (last) {
-- fat_access(sb, last, new_dclus);
-+ ret = fat_access(sb, last, new_dclus);
-+ if (ret < 0)
-+ return ret;
- fat_cache_add(inode, new_fclus, new_dclus);
- } else {
- MSDOS_I(inode)->i_start = new_dclus;
---- linux-2.6.0/fs/fcntl.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/fcntl.c 2003-12-28 23:21:20.000000000 -0800
-@@ -229,8 +229,8 @@ static int setfl(int fd, struct file * f
- arg |= O_NONBLOCK;
-
- if (arg & O_DIRECT) {
-- if (!inode->i_mapping || !inode->i_mapping->a_ops ||
-- !inode->i_mapping->a_ops->direct_IO)
-+ if (!filp->f_mapping || !filp->f_mapping->a_ops ||
-+ !filp->f_mapping->a_ops->direct_IO)
- return -EINVAL;
- }
-
---- linux-2.6.0/fs/file_table.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/file_table.c 2003-12-28 23:22:13.000000000 -0800
-@@ -120,6 +120,7 @@ int open_private_file(struct file *filp,
- filp->f_mode = (flags+1) & O_ACCMODE;
- atomic_set(&filp->f_count, 1);
- filp->f_dentry = dentry;
-+ filp->f_mapping = dentry->d_inode->i_mapping;
- filp->f_uid = current->fsuid;
- filp->f_gid = current->fsgid;
- filp->f_op = dentry->d_inode->i_fop;
-@@ -183,9 +184,9 @@ void __fput(struct file *file)
- fops_put(file->f_op);
- if (file->f_mode & FMODE_WRITE)
- put_write_access(inode);
-+ file_kill(file);
- file->f_dentry = NULL;
- file->f_vfsmnt = NULL;
-- file_kill(file);
- file_free(file);
- dput(dentry);
- mntput(mnt);
---- linux-2.6.0/fs/fs-writeback.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/fs-writeback.c 2003-12-28 23:21:20.000000000 -0800
-@@ -514,7 +514,7 @@ EXPORT_SYMBOL(write_inode_now);
- * OSYNC_INODE: the inode itself
- */
-
--int generic_osync_inode(struct inode *inode, int what)
-+int generic_osync_inode(struct inode *inode, struct address_space *mapping, int what)
- {
- int err = 0;
- int need_write_inode_now = 0;
-@@ -522,14 +522,14 @@ int generic_osync_inode(struct inode *in
-
- current->flags |= PF_SYNCWRITE;
- if (what & OSYNC_DATA)
-- err = filemap_fdatawrite(inode->i_mapping);
-+ err = filemap_fdatawrite(mapping);
- if (what & (OSYNC_METADATA|OSYNC_DATA)) {
-- err2 = sync_mapping_buffers(inode->i_mapping);
-+ err2 = sync_mapping_buffers(mapping);
- if (!err)
- err = err2;
- }
- if (what & OSYNC_DATA) {
-- err2 = filemap_fdatawait(inode->i_mapping);
-+ err2 = filemap_fdatawait(mapping);
- if (!err)
- err = err2;
- }
---- linux-2.6.0/fs/hugetlbfs/inode.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/hugetlbfs/inode.c 2003-12-28 23:26:43.000000000 -0800
-@@ -165,7 +165,7 @@ void truncate_hugepages(struct address_s
- pagevec_init(&pvec, 0);
- next = start;
- while (1) {
-- if (!pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
-+ if (!pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
- if (next == start)
- break;
- next = start;
-@@ -176,9 +176,6 @@ void truncate_hugepages(struct address_s
- struct page *page = pvec.pages[i];
-
- lock_page(page);
-- if (page->index > next)
-- next = page->index;
-- ++next;
- truncate_huge_page(page);
- unlock_page(page);
- hugetlb_put_quota(mapping);
-@@ -194,6 +191,7 @@ static void hugetlbfs_delete_inode(struc
-
- hlist_del_init(&inode->i_hash);
- list_del_init(&inode->i_list);
-+ list_del_init(&inode->i_sb_list);
- inode->i_state |= I_FREEING;
- inodes_stat.nr_inodes--;
- spin_unlock(&inode_lock);
-@@ -236,6 +234,7 @@ static void hugetlbfs_forget_inode(struc
- hlist_del_init(&inode->i_hash);
- out_truncate:
- list_del_init(&inode->i_list);
-+ list_del_init(&inode->i_sb_list);
- inode->i_state |= I_FREEING;
- inodes_stat.nr_inodes--;
- spin_unlock(&inode_lock);
-@@ -788,6 +787,7 @@ struct file *hugetlb_zero_setup(size_t s
- inode->i_nlink = 0;
- file->f_vfsmnt = mntget(hugetlbfs_vfsmount);
- file->f_dentry = dentry;
-+ file->f_mapping = inode->i_mapping;
- file->f_op = &hugetlbfs_file_operations;
- file->f_mode = FMODE_WRITE | FMODE_READ;
- return file;
---- linux-2.6.0/fs/inode.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/inode.c 2003-12-28 23:26:37.000000000 -0800
-@@ -183,6 +183,7 @@ void inode_init_once(struct inode *inode
- INIT_LIST_HEAD(&inode->i_dentry);
- INIT_LIST_HEAD(&inode->i_devices);
- sema_init(&inode->i_sem, 1);
-+ init_rwsem(&inode->i_alloc_sem);
- INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
- spin_lock_init(&inode->i_data.page_lock);
- init_MUTEX(&inode->i_data.i_shared_sem);
-@@ -285,7 +286,7 @@ static void dispose_list(struct list_hea
- /*
- * Invalidate all inodes for a device.
- */
--static int invalidate_list(struct list_head *head, struct super_block * sb, struct list_head * dispose)
-+static int invalidate_list(struct list_head *head, struct list_head *dispose)
- {
- struct list_head *next;
- int busy = 0, count = 0;
-@@ -298,13 +299,12 @@ static int invalidate_list(struct list_h
- next = next->next;
- if (tmp == head)
- break;
-- inode = list_entry(tmp, struct inode, i_list);
-- if (inode->i_sb != sb)
-- continue;
-+ inode = list_entry(tmp, struct inode, i_sb_list);
- invalidate_inode_buffers(inode);
- if (!atomic_read(&inode->i_count)) {
- hlist_del_init(&inode->i_hash);
- list_del(&inode->i_list);
-+ list_del(&inode->i_sb_list);
- list_add(&inode->i_list, dispose);
- inode->i_state |= I_FREEING;
- count++;
-@@ -340,10 +340,7 @@ int invalidate_inodes(struct super_block
-
- down(&iprune_sem);
- spin_lock(&inode_lock);
-- busy = invalidate_list(&inode_in_use, sb, &throw_away);
-- busy |= invalidate_list(&inode_unused, sb, &throw_away);
-- busy |= invalidate_list(&sb->s_dirty, sb, &throw_away);
-- busy |= invalidate_list(&sb->s_io, sb, &throw_away);
-+ busy = invalidate_list(&sb->s_inodes, &throw_away);
- spin_unlock(&inode_lock);
-
- dispose_list(&throw_away);
-@@ -443,6 +440,7 @@ static void prune_icache(int nr_to_scan)
- continue;
- }
- hlist_del_init(&inode->i_hash);
-+ list_del_init(&inode->i_sb_list);
- list_move(&inode->i_list, &freeable);
- inode->i_state |= I_FREEING;
- nr_pruned++;
-@@ -553,6 +551,7 @@ struct inode *new_inode(struct super_blo
- spin_lock(&inode_lock);
- inodes_stat.nr_inodes++;
- list_add(&inode->i_list, &inode_in_use);
-+ list_add(&inode->i_sb_list, &sb->s_inodes);
- inode->i_ino = ++last_ino;
- inode->i_state = 0;
- spin_unlock(&inode_lock);
-@@ -601,6 +600,7 @@ static struct inode * get_new_inode(stru
-
- inodes_stat.nr_inodes++;
- list_add(&inode->i_list, &inode_in_use);
-+ list_add(&inode->i_sb_list, &sb->s_inodes);
- hlist_add_head(&inode->i_hash, head);
- inode->i_state = I_LOCK|I_NEW;
- spin_unlock(&inode_lock);
-@@ -649,6 +649,7 @@ static struct inode * get_new_inode_fast
- inode->i_ino = ino;
- inodes_stat.nr_inodes++;
- list_add(&inode->i_list, &inode_in_use);
-+ list_add(&inode->i_sb_list, &sb->s_inodes);
- hlist_add_head(&inode->i_hash, head);
- inode->i_state = I_LOCK|I_NEW;
- spin_unlock(&inode_lock);
-@@ -984,6 +985,7 @@ void generic_delete_inode(struct inode *
- struct super_operations *op = inode->i_sb->s_op;
-
- list_del_init(&inode->i_list);
-+ list_del_init(&inode->i_sb_list);
- inode->i_state|=I_FREEING;
- inodes_stat.nr_inodes--;
- spin_unlock(&inode_lock);
-@@ -1031,6 +1033,7 @@ static void generic_forget_inode(struct
- hlist_del_init(&inode->i_hash);
- }
- list_del_init(&inode->i_list);
-+ list_del_init(&inode->i_sb_list);
- inode->i_state|=I_FREEING;
- inodes_stat.nr_inodes--;
- spin_unlock(&inode_lock);
-@@ -1221,34 +1224,17 @@ int remove_inode_dquot_ref(struct inode
- void remove_dquot_ref(struct super_block *sb, int type)
- {
- struct inode *inode;
-- struct list_head *act_head;
- LIST_HEAD(tofree_head);
-
- if (!sb->dq_op)
- return; /* nothing to do */
- spin_lock(&inode_lock); /* This lock is for inodes code */
- /* We don't have to lock against quota code - test IS_QUOTAINIT is just for speedup... */
--
-- list_for_each(act_head, &inode_in_use) {
-- inode = list_entry(act_head, struct inode, i_list);
-- if (inode->i_sb == sb && IS_QUOTAINIT(inode))
-- remove_inode_dquot_ref(inode, type, &tofree_head);
-- }
-- list_for_each(act_head, &inode_unused) {
-- inode = list_entry(act_head, struct inode, i_list);
-- if (inode->i_sb == sb && IS_QUOTAINIT(inode))
-- remove_inode_dquot_ref(inode, type, &tofree_head);
-- }
-- list_for_each(act_head, &sb->s_dirty) {
-- inode = list_entry(act_head, struct inode, i_list);
-- if (IS_QUOTAINIT(inode))
-- remove_inode_dquot_ref(inode, type, &tofree_head);
-- }
-- list_for_each(act_head, &sb->s_io) {
-- inode = list_entry(act_head, struct inode, i_list);
-+
-+ list_for_each_entry(inode, &sb->s_inodes, i_sb_list)
- if (IS_QUOTAINIT(inode))
- remove_inode_dquot_ref(inode, type, &tofree_head);
-- }
-+
- spin_unlock(&inode_lock);
-
- put_dquot_list(&tofree_head);
---- linux-2.6.0/fs/intermezzo/file.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/intermezzo/file.c 2003-12-28 23:21:18.000000000 -0800
-@@ -336,7 +336,7 @@ static void presto_apply_write_policy(st
- unlock_kernel();
- return;
- }
-- error = presto_journal_close(&rec, fset, file,
-+ error = presto_journal_close(&rec, fset, fdata,
- file->f_dentry,
- &fdata->fd_version,
- &new_file_ver);
---- linux-2.6.0/fs/intermezzo/intermezzo_fs.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/intermezzo/intermezzo_fs.h 2003-12-28 23:21:18.000000000 -0800
-@@ -603,7 +603,7 @@ int presto_journal_rename(struct rec_inf
- int presto_journal_open(struct rec_info *, struct presto_file_set *,
- struct dentry *, struct presto_version *old_ver);
- int presto_journal_close(struct rec_info *rec, struct presto_file_set *,
-- struct file *, struct dentry *,
-+ struct presto_file_data *, struct dentry *,
- struct presto_version *old_file_ver,
- struct presto_version *new_file_ver);
- int presto_write_lml_close(struct rec_info *rec,
---- linux-2.6.0/fs/intermezzo/journal.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/intermezzo/journal.c 2003-12-28 23:21:18.000000000 -0800
-@@ -2103,12 +2103,11 @@ int presto_journal_unlink(struct rec_inf
-
- int
- presto_journal_close(struct rec_info *rec, struct presto_file_set *fset,
-- struct file *file, struct dentry *dentry,
-+ struct presto_file_data *fd, struct dentry *dentry,
- struct presto_version *old_file_ver,
- struct presto_version *new_file_ver)
- {
- int opcode = KML_OPCODE_CLOSE;
-- struct presto_file_data *fd;
- char *buffer, *path, *logrecord, record[316];
- struct dentry *root;
- int error, size, i;
-@@ -2137,7 +2136,6 @@ presto_journal_close(struct rec_info *re
-
- root = fset->fset_dentry;
-
-- fd = (struct presto_file_data *)file->private_data;
- if (fd) {
- open_ngroups = fd->fd_ngroups;
- for (i = 0; i < fd->fd_ngroups; i++)
---- linux-2.6.0/fs/intermezzo/presto.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/intermezzo/presto.c 2003-12-28 23:21:18.000000000 -0800
-@@ -259,11 +259,8 @@ int lento_cancel_lml(char *path,
-
-
- if (info->flags & LENTO_FL_WRITE_KML) {
-- struct file file;
-- file.private_data = NULL;
-- file.f_dentry = dentry;
- presto_getversion(&new_ver, dentry->d_inode);
-- error = presto_journal_close(&rec, fset, &file, dentry,
-+ error = presto_journal_close(&rec, fset, NULL, dentry,
- &new_ver);
- if ( error ) {
- EXIT;
---- linux-2.6.0/fs/intermezzo/vfs.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/intermezzo/vfs.c 2003-12-28 23:21:18.000000000 -0800
-@@ -321,7 +321,7 @@ int presto_do_close(struct presto_file_s
- }
-
- if (fdata->fd_info.flags & LENTO_FL_KML)
-- rc = presto_journal_close(&rec, fset, file, file->f_dentry,
-+ rc = presto_journal_close(&rec, fset, fdata, file->f_dentry,
- &fdata->fd_version,
- &fdata->fd_info.remote_version);
- if (rc) {
-@@ -431,14 +431,11 @@ int presto_do_setattr(struct presto_file
-
- if ( presto_do_kml(info, dentry) ) {
- if ((iattr->ia_valid & ATTR_SIZE) && (old_size != inode->i_size)) {
-- struct file file;
- /* Journal a close whenever we see a potential truncate
- * At the receiving end, lento should explicitly remove
- * ATTR_SIZE from the list of valid attributes */
- presto_getversion(&new_ver, inode);
-- file.private_data = NULL;
-- file.f_dentry = dentry;
-- error = presto_journal_close(&rec, fset, &file, dentry,
-+ error = presto_journal_close(&rec, fset, NULL, dentry,
- &old_ver, &new_ver);
- }
-
-@@ -2086,7 +2083,9 @@ static struct file *presto_filp_dopen(st
- }
- }
-
-+ /* XXX: where the fuck is ->f_vfsmnt? */
- f->f_dentry = dentry;
-+ f->f_mapping = dentry->d_inode->i_mapping;
- f->f_pos = 0;
- //f->f_reada = 0;
- f->f_op = NULL;
---- linux-2.6.0/fs/ioctl.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/ioctl.c 2003-12-28 23:21:20.000000000 -0800
-@@ -22,7 +22,7 @@ static int file_ioctl(struct file *filp,
- switch (cmd) {
- case FIBMAP:
- {
-- struct address_space *mapping = inode->i_mapping;
-+ struct address_space *mapping = filp->f_mapping;
- int res;
- /* do we support this mess? */
- if (!mapping->a_ops->bmap)
---- linux-2.6.0/fs/isofs/inode.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/fs/isofs/inode.c 2003-12-28 23:23:02.000000000 -0800
-@@ -447,10 +447,7 @@ static int parse_options(char *options,
- case Opt_sb:
- if (match_int(&args[0], &option))
- return 0;
-- n = option;
-- if (n > 660 * 512)
-- return 0;
-- popt->sbsector = n;
-+ popt->sbsector = option;
- break;
- case Opt_check_r:
- popt->check = 'r';
-@@ -1463,4 +1460,5 @@ static void __exit exit_iso9660_fs(void)
- module_init(init_iso9660_fs)
- module_exit(exit_iso9660_fs)
- MODULE_LICENSE("GPL");
--
-+/* Actual filesystem name is iso9660, as requested in filesystems.c */
-+MODULE_ALIAS("iso9660");
---- linux-2.6.0/fs/jbd/commit.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/jbd/commit.c 2003-12-28 23:22:22.000000000 -0800
-@@ -177,8 +177,14 @@ void journal_commit_transaction(journal_
- * leave undo-committed data.
- */
- if (jh->b_committed_data) {
-- kfree(jh->b_committed_data);
-- jh->b_committed_data = NULL;
-+ struct buffer_head *bh = jh2bh(jh);
-+
-+ jbd_lock_bh_state(bh);
-+ if (jh->b_committed_data) {
-+ kfree(jh->b_committed_data);
-+ jh->b_committed_data = NULL;
-+ }
-+ jbd_unlock_bh_state(bh);
- }
- journal_refile_buffer(journal, jh);
- }
-@@ -264,6 +270,16 @@ write_out_data_locked:
- jbd_unlock_bh_state(bh);
- journal_remove_journal_head(bh);
- __brelse(bh);
-+ if (need_resched() && commit_transaction->
-+ t_sync_datalist) {
-+ commit_transaction->t_sync_datalist =
-+ next_jh;
-+ if (bufs)
-+ break;
-+ spin_unlock(&journal->j_list_lock);
-+ cond_resched();
-+ goto write_out_data;
-+ }
- }
- }
- if (bufs == ARRAY_SIZE(wbuf)) {
-@@ -284,8 +300,7 @@ write_out_data_locked:
- cond_resched();
- journal_brelse_array(wbuf, bufs);
- spin_lock(&journal->j_list_lock);
-- if (bufs)
-- goto write_out_data_locked;
-+ goto write_out_data_locked;
- }
-
- /*
---- linux-2.6.0/fs/jffs/intrep.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/jffs/intrep.c 2003-12-28 23:21:43.000000000 -0800
-@@ -3337,18 +3337,16 @@ jffs_garbage_collect_thread(void *ptr)
- int result = 0;
- D1(int i = 1);
-
-+ daemonize("jffs_gcd");
-+
- c->gc_task = current;
-
- lock_kernel();
-- exit_mm(c->gc_task);
--
-- set_special_pids(1, 1);
- init_completion(&c->gc_thread_comp); /* barrier */
- spin_lock_irq(¤t->sighand->siglock);
- siginitsetinv (¤t->blocked, sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT));
- recalc_sigpending();
- spin_unlock_irq(¤t->sighand->siglock);
-- strcpy(current->comm, "jffs_gcd");
-
- D1(printk (KERN_NOTICE "jffs_garbage_collect_thread(): Starting infinite loop.\n"));
-
---- linux-2.6.0/fs/jfs/inode.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/jfs/inode.c 2003-12-28 23:21:19.000000000 -0800
-@@ -306,7 +306,7 @@ static int jfs_direct_IO(int rw, struct
- loff_t offset, unsigned long nr_segs)
- {
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
-
- return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
- offset, nr_segs, jfs_get_blocks, NULL);
---- linux-2.6.0/fs/jfs/namei.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/jfs/namei.c 2003-12-28 23:22:29.000000000 -0800
-@@ -1439,14 +1439,18 @@ static struct dentry *jfs_lookup(struct
- struct dentry *jfs_get_parent(struct dentry *dentry)
- {
- struct super_block *sb = dentry->d_inode->i_sb;
-- struct dentry *parent = ERR_PTR(-EACCES);
-+ struct dentry *parent = ERR_PTR(-ENOENT);
- struct inode *inode;
-+ unsigned long parent_ino;
-
-- inode = iget(sb, JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
-+ parent_ino =
-+ le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
-+ inode = iget(sb, parent_ino);
- if (inode) {
-- if (is_bad_inode(inode))
-+ if (is_bad_inode(inode)) {
- iput(inode);
-- else {
-+ parent = ERR_PTR(-EACCES);
-+ } else {
- parent = d_alloc_anon(inode);
- if (!parent) {
- parent = ERR_PTR(-ENOMEM);
---- linux-2.6.0/fs/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/Kconfig 2003-12-28 23:21:55.000000000 -0800
-@@ -246,6 +246,7 @@ config REISERFS_PROC_INFO
-
- config JFS_FS
- tristate "JFS filesystem support"
-+ select NLS
- help
- This is a port of IBM's Journaled Filesystem . More information is
- available in the file Documentation/filesystems/jfs.txt.
-@@ -485,6 +486,7 @@ config ISO9660_FS
- config JOLIET
- bool "Microsoft Joliet CDROM extensions"
- depends on ISO9660_FS
-+ select NLS
- help
- Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
- which allows for long filenames in unicode format (unicode is the
-@@ -530,6 +532,7 @@ menu "DOS/FAT/NT Filesystems"
-
- config FAT_FS
- tristate "DOS FAT fs support"
-+ select NLS
- help
- If you want to use one of the FAT-based file systems (the MS-DOS,
- VFAT (Windows 95) and UMSDOS (used to run Linux on top of an
-@@ -651,6 +654,7 @@ config UMSDOS_FS
-
- config NTFS_FS
- tristate "NTFS file system support"
-+ select NLS
- help
- NTFS is the file system of Microsoft Windows NT, 2000, XP and 2003.
-
-@@ -764,6 +768,30 @@ config PROC_KCORE
- bool
- default y if !ARM
-
-+config SYSFS
-+ bool "sysfs file system support" if EMBEDDED
-+ default y
-+ help
-+ The sysfs filesystem is a virtual filesystem that the kernel uses to export
-+ internal kernel objects, their attributes, and their relationships to one
-+ another.
-+
-+ Users can use sysfs to ascertain useful information about the running kernel,
-+ such as the devices the kernel has discovered on each bus and which driver
-+ each is bound to. sysfs can also be used to tune devices and other kernel
-+ subsystems.
-+
-+ Some system agents rely on the information in sysfs to operate. /sbin/hotplug
-+ uses device and object attributes in sysfs to assist in delegating policy
-+ decisions, like persistantly naming devices.
-+
-+ sysfs is currently needed by the block subsystem to mount the root partition.
-+ Therefore, you MUST say Y if you're booting from a hard drive. If you use any
-+ type of hotpluggable device, you'll also need sysfs for /sbin/hotplug support.
-+
-+ However, designers of embedded systems may want to say Y here to conserve
-+ space.
-+
- config DEVFS_FS
- bool "/dev file system support (OBSOLETE)"
- depends on EXPERIMENTAL
-@@ -962,6 +990,7 @@ config HFS_FS
- config BEFS_FS
- tristate "BeOS file systemv(BeFS) support (read only) (EXPERIMENTAL)"
- depends on EXPERIMENTAL
-+ select NLS
- help
- The BeOS File System (BeFS) is the native file system of Be, Inc's
- BeOS. Notable features include support for arbitrary attributes
-@@ -1440,6 +1469,7 @@ config RPCSEC_GSS_KRB5
- config SMB_FS
- tristate "SMB file system support (to mount Windows shares etc.)"
- depends on INET
-+ select NLS
- help
- SMB (Server Message Block) is the protocol Windows for Workgroups
- (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
-@@ -1495,6 +1525,7 @@ config SMB_NLS_REMOTE
- config CIFS
- tristate "CIFS support (advanced network filesystem for Samba, Window and other CIFS compliant servers)(EXPERIMENTAL)"
- depends on INET
-+ select NLS
- help
- This is the client VFS module for the Common Internet File System
- (CIFS) protocol which is the successor to the Server Message Block
---- linux-2.6.0/fs/Kconfig.binfmt 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/Kconfig.binfmt 2003-12-28 23:22:18.000000000 -0800
-@@ -23,10 +23,6 @@ config BINFMT_ELF
- ld.so (check the file <file:Documentation/Changes> for location and
- latest version).
-
-- To compile this as a module, choose M here: the module will be called
-- binfmt_elf. Saying M or N here is dangerous because some crucial
-- programs on your system might be in ELF format.
--
- config BINFMT_FLAT
- tristate "Kernel support for flat binaries"
- depends on !MMU || SUPERH
---- linux-2.6.0/fs/locks.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/locks.c 2003-12-28 23:21:24.000000000 -0800
-@@ -1454,7 +1454,7 @@ int fcntl_setlk(struct file *filp, unsig
- */
- if (IS_MANDLOCK(inode) &&
- (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-- struct address_space *mapping = inode->i_mapping;
-+ struct address_space *mapping = filp->f_mapping;
-
- if (!list_empty(&mapping->i_mmap_shared)) {
- error = -EAGAIN;
-@@ -1592,7 +1592,7 @@ int fcntl_setlk64(struct file *filp, uns
- */
- if (IS_MANDLOCK(inode) &&
- (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-- struct address_space *mapping = inode->i_mapping;
-+ struct address_space *mapping = filp->f_mapping;
-
- if (!list_empty(&mapping->i_mmap_shared)) {
- error = -EAGAIN;
-@@ -1983,6 +1983,24 @@ int lock_may_write(struct inode *inode,
-
- EXPORT_SYMBOL(lock_may_write);
-
-+void steal_locks(fl_owner_t from)
-+{
-+ struct list_head *tmp;
-+
-+ if (from == current->files)
-+ return;
-+
-+ lock_kernel();
-+ list_for_each(tmp, &file_lock_list) {
-+ struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
-+ if (fl->fl_owner == from)
-+ fl->fl_owner = current->files;
-+ }
-+ unlock_kernel();
-+}
-+
-+EXPORT_SYMBOL(steal_locks);
-+
- static int __init filelock_init(void)
- {
- filelock_cache = kmem_cache_create("file_lock_cache",
---- linux-2.6.0/fs/Makefile 2003-08-22 19:23:42.000000000 -0700
-+++ 25/fs/Makefile 2003-12-28 23:21:50.000000000 -0800
-@@ -39,7 +39,7 @@ obj-$(CONFIG_QUOTACTL) += quota.o
-
- obj-$(CONFIG_PROC_FS) += proc/
- obj-y += partitions/
--obj-y += sysfs/
-+obj-$(CONFIG_SYSFS) += sysfs/
- obj-y += devpts/
-
- obj-$(CONFIG_PROFILING) += dcookies.o
---- linux-2.6.0/fs/msdos/namei.c 2003-07-27 12:14:40.000000000 -0700
-+++ 25/fs/msdos/namei.c 2003-12-28 23:22:52.000000000 -0800
-@@ -244,13 +244,14 @@ static int msdos_add_entry(struct inode
- */
- dir->i_ctime = dir->i_mtime = CURRENT_TIME;
- mark_inode_dirty(dir);
-- memcpy((*de)->name,name,MSDOS_NAME);
-+
-+ memcpy((*de)->name, name, MSDOS_NAME);
- (*de)->attr = is_dir ? ATTR_DIR : ATTR_ARCH;
- if (is_hid)
- (*de)->attr |= ATTR_HIDDEN;
- (*de)->start = 0;
- (*de)->starthi = 0;
-- fat_date_unix2dos(dir->i_mtime.tv_sec,&(*de)->time,&(*de)->date);
-+ fat_date_unix2dos(dir->i_mtime.tv_sec, &(*de)->time, &(*de)->date);
- (*de)->size = 0;
- mark_buffer_dirty(*bh);
- return 0;
-@@ -393,7 +394,6 @@ out_unlock:
- return res;
-
- mkdir_error:
-- printk(KERN_WARNING "msdos_mkdir: error=%d, attempting cleanup\n", res);
- inode->i_nlink = 0;
- inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
- dir->i_nlink--;
-@@ -468,13 +468,9 @@ static int do_msdos_rename(struct inode
- if (error)
- goto out;
- }
-- error = fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
-- &dotdot_de, &dotdot_i_pos);
-- if (error < 0) {
-- printk(KERN_WARNING
-- "MSDOS: %s/%s, get dotdot failed, ret=%d\n",
-- old_dentry->d_parent->d_name.name,
-- old_dentry->d_name.name, error);
-+ if (fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
-+ &dotdot_de, &dotdot_i_pos) < 0) {
-+ error = -EIO;
- goto out;
- }
- }
---- linux-2.6.0/fs/namespace.c 2003-10-08 15:07:09.000000000 -0700
-+++ 25/fs/namespace.c 2003-12-28 23:21:50.000000000 -0800
-@@ -24,7 +24,15 @@
- #include <asm/uaccess.h>
-
- extern int __init init_rootfs(void);
-+
-+#ifdef CONFIG_SYSFS
- extern int __init sysfs_init(void);
-+#else
-+static inline int sysfs_init(void)
-+{
-+ return 0;
-+}
-+#endif
-
- /* spinlock for vfsmount related operations, inplace of dcache_lock */
- spinlock_t vfsmount_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
---- linux-2.6.0/fs/ncpfs/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/ncpfs/Kconfig 2003-12-28 23:21:55.000000000 -0800
-@@ -65,6 +65,7 @@ config NCPFS_SMALLDOS
- config NCPFS_NLS
- bool "Use Native Language Support"
- depends on NCP_FS
-+ select NLS
- help
- Allows you to use codepages and I/O charsets for file name
- translation between the server file system and input/output. This
---- linux-2.6.0/fs/ncpfs/mmap.c 2003-06-14 12:18:25.000000000 -0700
-+++ 25/fs/ncpfs/mmap.c 2003-12-28 23:22:12.000000000 -0800
-@@ -26,7 +26,7 @@
- * Fill in the supplied page for mmap
- */
- static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area,
-- unsigned long address, int write_access)
-+ unsigned long address, int *type)
- {
- struct file *file = area->vm_file;
- struct dentry *dentry = file->f_dentry;
-@@ -85,6 +85,15 @@ static struct page* ncp_file_mmap_nopage
- memset(pg_addr + already_read, 0, PAGE_SIZE - already_read);
- flush_dcache_page(page);
- kunmap(page);
-+
-+ /*
-+ * If I understand ncp_read_kernel() properly, the above always
-+ * fetches from the network, here the analogue of disk.
-+ * -- wli
-+ */
-+ if (type)
-+ *type = VM_FAULT_MAJOR;
-+ inc_page_state(pgmajfault);
- return page;
- }
-
---- linux-2.6.0/fs/nfs/file.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/nfs/file.c 2003-12-28 23:21:20.000000000 -0800
-@@ -266,7 +266,7 @@ out_swapfile:
- int
- nfs_lock(struct file *filp, int cmd, struct file_lock *fl)
- {
-- struct inode * inode = filp->f_dentry->d_inode;
-+ struct inode * inode = filp->f_mapping->host;
- int status = 0;
- int status2;
-
-@@ -309,13 +309,13 @@ nfs_lock(struct file *filp, int cmd, str
- * Flush all pending writes before doing anything
- * with locks..
- */
-- status = filemap_fdatawrite(inode->i_mapping);
-+ status = filemap_fdatawrite(filp->f_mapping);
- down(&inode->i_sem);
- status2 = nfs_wb_all(inode);
- if (!status)
- status = status2;
- up(&inode->i_sem);
-- status2 = filemap_fdatawait(inode->i_mapping);
-+ status2 = filemap_fdatawait(filp->f_mapping);
- if (!status)
- status = status2;
- if (status < 0)
-@@ -335,11 +335,11 @@ nfs_lock(struct file *filp, int cmd, str
- */
- out_ok:
- if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) {
-- filemap_fdatawrite(inode->i_mapping);
-+ filemap_fdatawrite(filp->f_mapping);
- down(&inode->i_sem);
- nfs_wb_all(inode); /* we may have slept */
- up(&inode->i_sem);
-- filemap_fdatawait(inode->i_mapping);
-+ filemap_fdatawait(filp->f_mapping);
- nfs_zap_caches(inode);
- }
- return status;
---- linux-2.6.0/fs/nls/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/nls/Kconfig 2003-12-28 23:21:55.000000000 -0800
-@@ -1,24 +1,25 @@
- #
- # Native language support configuration
- #
--# smb wants NLS
--config SMB_NLS
-- bool
-- depends on SMB_FS
-- default y
-
--# msdos and Joliet want NLS
-+menu "Native Language Support"
-+
- config NLS
-- bool
-- depends on JOLIET || FAT_FS || NTFS_FS || NCPFS_NLS || SMB_NLS || JFS_FS || CIFS || BEFS_FS
-- default y
-+ tristate "Base native language support"
-+ ---help---
-+ The base Native Language Support. A number of filesystems
-+ depend on it (e.g. FAT, JOLIET, NT, BEOS filesystems), as well
-+ as the ability of some filesystems to use native languages
-+ (NCP, SMB).
-
-+ If unsure, say Y.
-
--menu "Native Language Support"
-- depends on NLS
-+ To compile this code as a module, choose M here: the module
-+ will be called nls_base.
-
- config NLS_DEFAULT
- string "Default NLS Option"
-+ depends on NLS
- default "iso8859-1"
- ---help---
- The default NLS used when mounting file system. Note, that this is
-@@ -38,6 +39,7 @@ config NLS_DEFAULT
-
- config NLS_CODEPAGE_437
- tristate "Codepage 437 (United States, Canada)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored
-@@ -50,6 +52,7 @@ config NLS_CODEPAGE_437
-
- config NLS_CODEPAGE_737
- tristate "Codepage 737 (Greek)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored
-@@ -62,6 +65,7 @@ config NLS_CODEPAGE_737
-
- config NLS_CODEPAGE_775
- tristate "Codepage 775 (Baltic Rim)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored
-@@ -75,6 +79,7 @@ config NLS_CODEPAGE_775
-
- config NLS_CODEPAGE_850
- tristate "Codepage 850 (Europe)"
-+ depends on NLS
- ---help---
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -91,6 +96,7 @@ config NLS_CODEPAGE_850
-
- config NLS_CODEPAGE_852
- tristate "Codepage 852 (Central/Eastern Europe)"
-+ depends on NLS
- ---help---
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -106,6 +112,7 @@ config NLS_CODEPAGE_852
-
- config NLS_CODEPAGE_855
- tristate "Codepage 855 (Cyrillic)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -117,6 +124,7 @@ config NLS_CODEPAGE_855
-
- config NLS_CODEPAGE_857
- tristate "Codepage 857 (Turkish)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -128,6 +136,7 @@ config NLS_CODEPAGE_857
-
- config NLS_CODEPAGE_860
- tristate "Codepage 860 (Portuguese)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -139,6 +148,7 @@ config NLS_CODEPAGE_860
-
- config NLS_CODEPAGE_861
- tristate "Codepage 861 (Icelandic)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -150,6 +160,7 @@ config NLS_CODEPAGE_861
-
- config NLS_CODEPAGE_862
- tristate "Codepage 862 (Hebrew)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -161,6 +172,7 @@ config NLS_CODEPAGE_862
-
- config NLS_CODEPAGE_863
- tristate "Codepage 863 (Canadian French)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -173,6 +185,7 @@ config NLS_CODEPAGE_863
-
- config NLS_CODEPAGE_864
- tristate "Codepage 864 (Arabic)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -184,6 +197,7 @@ config NLS_CODEPAGE_864
-
- config NLS_CODEPAGE_865
- tristate "Codepage 865 (Norwegian, Danish)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -196,6 +210,7 @@ config NLS_CODEPAGE_865
-
- config NLS_CODEPAGE_866
- tristate "Codepage 866 (Cyrillic/Russian)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -208,6 +223,7 @@ config NLS_CODEPAGE_866
-
- config NLS_CODEPAGE_869
- tristate "Codepage 869 (Greek)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -219,6 +235,7 @@ config NLS_CODEPAGE_869
-
- config NLS_CODEPAGE_936
- tristate "Simplified Chinese charset (CP936, GB2312)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -231,6 +248,7 @@ config NLS_CODEPAGE_936
-
- config NLS_CODEPAGE_950
- tristate "Traditional Chinese charset (Big5)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -243,6 +261,7 @@ config NLS_CODEPAGE_950
-
- config NLS_CODEPAGE_932
- tristate "Japanese charsets (Shift-JIS, EUC-JP)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -256,6 +275,7 @@ config NLS_CODEPAGE_932
-
- config NLS_CODEPAGE_949
- tristate "Korean charset (CP949, EUC-KR)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -267,6 +287,7 @@ config NLS_CODEPAGE_949
-
- config NLS_CODEPAGE_874
- tristate "Thai charset (CP874, TIS-620)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -278,6 +299,7 @@ config NLS_CODEPAGE_874
-
- config NLS_ISO8859_8
- tristate "Hebrew charsets (ISO-8859-8, CP1255)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -287,6 +309,7 @@ config NLS_ISO8859_8
-
- config NLS_CODEPAGE_1250
- tristate "Windows CP1250 (Slavic/Central European Languages)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CDROMs
-@@ -298,6 +321,7 @@ config NLS_CODEPAGE_1250
-
- config NLS_CODEPAGE_1251
- tristate "Windows CP1251 (Bulgarian, Belarusian)"
-+ depends on NLS
- help
- The Microsoft FAT file system family can deal with filenames in
- native language character sets. These character sets are stored in
-@@ -310,6 +334,7 @@ config NLS_CODEPAGE_1251
-
- config NLS_ISO8859_1
- tristate "NLS ISO 8859-1 (Latin 1; Western European Languages)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -322,6 +347,7 @@ config NLS_ISO8859_1
-
- config NLS_ISO8859_2
- tristate "NLS ISO 8859-2 (Latin 2; Slavic/Central European Languages)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -333,6 +359,7 @@ config NLS_ISO8859_2
-
- config NLS_ISO8859_3
- tristate "NLS ISO 8859-3 (Latin 3; Esperanto, Galician, Maltese, Turkish)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -343,6 +370,7 @@ config NLS_ISO8859_3
-
- config NLS_ISO8859_4
- tristate "NLS ISO 8859-4 (Latin 4; old Baltic charset)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -353,6 +381,7 @@ config NLS_ISO8859_4
-
- config NLS_ISO8859_5
- tristate "NLS ISO 8859-5 (Cyrillic)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -364,6 +393,7 @@ config NLS_ISO8859_5
-
- config NLS_ISO8859_6
- tristate "NLS ISO 8859-6 (Arabic)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -373,6 +403,7 @@ config NLS_ISO8859_6
-
- config NLS_ISO8859_7
- tristate "NLS ISO 8859-7 (Modern Greek)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -382,6 +413,7 @@ config NLS_ISO8859_7
-
- config NLS_ISO8859_9
- tristate "NLS ISO 8859-9 (Latin 5; Turkish)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -392,6 +424,7 @@ config NLS_ISO8859_9
-
- config NLS_ISO8859_13
- tristate "NLS ISO 8859-13 (Latin 7; Baltic)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -402,6 +435,7 @@ config NLS_ISO8859_13
-
- config NLS_ISO8859_14
- tristate "NLS ISO 8859-14 (Latin 8; Celtic)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -413,6 +447,7 @@ config NLS_ISO8859_14
-
- config NLS_ISO8859_15
- tristate "NLS ISO 8859-15 (Latin 9; Western European Languages with Euro)"
-+ depends on NLS
- ---help---
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -429,6 +464,7 @@ config NLS_ISO8859_15
-
- config NLS_KOI8_R
- tristate "NLS KOI8-R (Russian)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -438,6 +474,7 @@ config NLS_KOI8_R
-
- config NLS_KOI8_U
- tristate "NLS KOI8-U/RU (Ukrainian, Belarusian)"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
-@@ -447,6 +484,7 @@ config NLS_KOI8_U
-
- config NLS_UTF8
- tristate "NLS UTF8"
-+ depends on NLS
- help
- If you want to display filenames with native language characters
- from the Microsoft FAT file system family or from JOLIET CD-ROMs
---- linux-2.6.0/fs/nls/nls_base.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/nls/nls_base.c 2003-12-28 23:22:50.000000000 -0800
-@@ -99,6 +99,7 @@ utf8_mbstowcs(wchar_t *pwcs, const __u8
- }
- } else {
- *op++ = *ip++;
-+ n--;
- }
- }
- return (op - pwcs);
-@@ -480,7 +481,7 @@ struct nls_table *load_nls_default(void)
- if (default_nls != NULL)
- return default_nls;
- else
-- return &default_table;
-+ return &default_table;
- }
-
- EXPORT_SYMBOL(register_nls);
-@@ -492,3 +493,5 @@ EXPORT_SYMBOL(utf8_mbtowc);
- EXPORT_SYMBOL(utf8_mbstowcs);
- EXPORT_SYMBOL(utf8_wctomb);
- EXPORT_SYMBOL(utf8_wcstombs);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
---- linux-2.6.0/fs/open.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/open.c 2003-12-28 23:26:37.000000000 -0800
-@@ -192,7 +192,9 @@ int do_truncate(struct dentry *dentry, l
- newattrs.ia_size = length;
- newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
- down(&dentry->d_inode->i_sem);
-+ down_write(&dentry->d_inode->i_alloc_sem);
- err = notify_change(dentry, &newattrs);
-+ up_write(&dentry->d_inode->i_alloc_sem);
- up(&dentry->d_inode->i_sem);
- return err;
- }
-@@ -776,7 +778,8 @@ struct file *dentry_open(struct dentry *
- goto cleanup_file;
- }
-
-- file_ra_state_init(&f->f_ra, inode->i_mapping);
-+ f->f_mapping = inode->i_mapping;
-+ file_ra_state_init(&f->f_ra, f->f_mapping);
- f->f_dentry = dentry;
- f->f_vfsmnt = mnt;
- f->f_pos = 0;
-@@ -792,8 +795,8 @@ struct file *dentry_open(struct dentry *
-
- /* NB: we're sure to have correct a_ops only after f_op->open */
- if (f->f_flags & O_DIRECT) {
-- if (!inode->i_mapping || !inode->i_mapping->a_ops ||
-- !inode->i_mapping->a_ops->direct_IO) {
-+ if (!f->f_mapping || !f->f_mapping->a_ops ||
-+ !f->f_mapping->a_ops->direct_IO) {
- fput(f);
- f = ERR_PTR(-EINVAL);
- }
---- linux-2.6.0/fs/pipe.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/pipe.c 2003-12-28 23:22:03.000000000 -0800
-@@ -13,6 +13,7 @@
- #include <linux/fs.h>
- #include <linux/mount.h>
- #include <linux/pipe_fs_i.h>
-+#include <linux/uio.h>
- #include <asm/uaccess.h>
- #include <asm/ioctls.h>
-
-@@ -43,19 +44,63 @@ void pipe_wait(struct inode * inode)
- down(PIPE_SEM(*inode));
- }
-
-+static inline int
-+pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len)
-+{
-+ unsigned long copy;
-+
-+ while (len > 0) {
-+ while (!iov->iov_len)
-+ iov++;
-+ copy = min_t(unsigned long, len, iov->iov_len);
-+
-+ if (copy_from_user(to, iov->iov_base, copy))
-+ return -EFAULT;
-+ to += copy;
-+ len -= copy;
-+ iov->iov_base += copy;
-+ iov->iov_len -= copy;
-+ }
-+ return 0;
-+}
-+
-+static inline int
-+pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len)
-+{
-+ unsigned long copy;
-+
-+ while (len > 0) {
-+ while (!iov->iov_len)
-+ iov++;
-+ copy = min_t(unsigned long, len, iov->iov_len);
-+
-+ if (copy_to_user(iov->iov_base, from, copy))
-+ return -EFAULT;
-+ from += copy;
-+ len -= copy;
-+ iov->iov_base += copy;
-+ iov->iov_len -= copy;
-+ }
-+ return 0;
-+}
-+
- static ssize_t
--pipe_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
-+pipe_readv(struct file *filp, const struct iovec *_iov,
-+ unsigned long nr_segs, loff_t *ppos)
- {
- struct inode *inode = filp->f_dentry->d_inode;
- int do_wakeup;
- ssize_t ret;
-+ struct iovec *iov = (struct iovec *)_iov;
-+ size_t total_len;
-
- /* pread is not allowed on pipes. */
- if (unlikely(ppos != &filp->f_pos))
- return -ESPIPE;
--
-+
-+ total_len = iov_length(iov, nr_segs);
- /* Null read succeeds. */
-- if (unlikely(count == 0))
-+ if (unlikely(total_len == 0))
- return 0;
-
- do_wakeup = 0;
-@@ -67,12 +112,12 @@ pipe_read(struct file *filp, char __user
- char *pipebuf = PIPE_BASE(*inode) + PIPE_START(*inode);
- ssize_t chars = PIPE_MAX_RCHUNK(*inode);
-
-- if (chars > count)
-- chars = count;
-+ if (chars > total_len)
-+ chars = total_len;
- if (chars > size)
- chars = size;
-
-- if (copy_to_user(buf, pipebuf, chars)) {
-+ if (pipe_iov_copy_to_user(iov, pipebuf, chars)) {
- if (!ret) ret = -EFAULT;
- break;
- }
-@@ -81,12 +126,11 @@ pipe_read(struct file *filp, char __user
- PIPE_START(*inode) += chars;
- PIPE_START(*inode) &= (PIPE_SIZE - 1);
- PIPE_LEN(*inode) -= chars;
-- count -= chars;
-- buf += chars;
-+ total_len -= chars;
- do_wakeup = 1;
-+ if (!total_len)
-+ break; /* common path: read succeeded */
- }
-- if (!count)
-- break; /* common path: read succeeded */
- if (PIPE_LEN(*inode)) /* test for cyclic buffers */
- continue;
- if (!PIPE_WRITERS(*inode))
-@@ -126,24 +170,35 @@ pipe_read(struct file *filp, char __user
- }
-
- static ssize_t
--pipe_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
-+pipe_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
-+{
-+ struct iovec iov = { .iov_base = buf, .iov_len = count };
-+ return pipe_readv(filp, &iov, 1, ppos);
-+}
-+
-+static ssize_t
-+pipe_writev(struct file *filp, const struct iovec *_iov,
-+ unsigned long nr_segs, loff_t *ppos)
- {
- struct inode *inode = filp->f_dentry->d_inode;
- ssize_t ret;
- size_t min;
- int do_wakeup;
-+ struct iovec *iov = (struct iovec *)_iov;
-+ size_t total_len;
-
- /* pwrite is not allowed on pipes. */
- if (unlikely(ppos != &filp->f_pos))
- return -ESPIPE;
--
-+
-+ total_len = iov_length(iov, nr_segs);
- /* Null write succeeds. */
-- if (unlikely(count == 0))
-+ if (unlikely(total_len == 0))
- return 0;
-
- do_wakeup = 0;
- ret = 0;
-- min = count;
-+ min = total_len;
- if (min > PIPE_BUF)
- min = 1;
- down(PIPE_SEM(*inode));
-@@ -164,23 +219,22 @@ pipe_write(struct file *filp, const char
- * syscall merging.
- */
- do_wakeup = 1;
-- if (chars > count)
-- chars = count;
-+ if (chars > total_len)
-+ chars = total_len;
- if (chars > free)
- chars = free;
-
-- if (copy_from_user(pipebuf, buf, chars)) {
-+ if (pipe_iov_copy_from_user(pipebuf, iov, chars)) {
- if (!ret) ret = -EFAULT;
- break;
- }
--
- ret += chars;
-+
- PIPE_LEN(*inode) += chars;
-- count -= chars;
-- buf += chars;
-+ total_len -= chars;
-+ if (!total_len)
-+ break;
- }
-- if (!count)
-- break;
- if (PIPE_FREE(*inode) && ret) {
- /* handle cyclic data buffers */
- min = 1;
-@@ -214,6 +268,14 @@ pipe_write(struct file *filp, const char
- }
-
- static ssize_t
-+pipe_write(struct file *filp, const char __user *buf,
-+ size_t count, loff_t *ppos)
-+{
-+ struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = count };
-+ return pipe_writev(filp, &iov, 1, ppos);
-+}
-+
-+static ssize_t
- bad_pipe_r(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
- {
- return -EBADF;
-@@ -405,6 +467,7 @@ pipe_rdwr_open(struct inode *inode, stru
- struct file_operations read_fifo_fops = {
- .llseek = no_llseek,
- .read = pipe_read,
-+ .readv = pipe_readv,
- .write = bad_pipe_w,
- .poll = fifo_poll,
- .ioctl = pipe_ioctl,
-@@ -417,6 +480,7 @@ struct file_operations write_fifo_fops =
- .llseek = no_llseek,
- .read = bad_pipe_r,
- .write = pipe_write,
-+ .writev = pipe_writev,
- .poll = fifo_poll,
- .ioctl = pipe_ioctl,
- .open = pipe_write_open,
-@@ -427,7 +491,9 @@ struct file_operations write_fifo_fops =
- struct file_operations rdwr_fifo_fops = {
- .llseek = no_llseek,
- .read = pipe_read,
-+ .readv = pipe_readv,
- .write = pipe_write,
-+ .writev = pipe_writev,
- .poll = fifo_poll,
- .ioctl = pipe_ioctl,
- .open = pipe_rdwr_open,
-@@ -438,6 +504,7 @@ struct file_operations rdwr_fifo_fops =
- struct file_operations read_pipe_fops = {
- .llseek = no_llseek,
- .read = pipe_read,
-+ .readv = pipe_readv,
- .write = bad_pipe_w,
- .poll = pipe_poll,
- .ioctl = pipe_ioctl,
-@@ -450,6 +517,7 @@ struct file_operations write_pipe_fops =
- .llseek = no_llseek,
- .read = bad_pipe_r,
- .write = pipe_write,
-+ .writev = pipe_writev,
- .poll = pipe_poll,
- .ioctl = pipe_ioctl,
- .open = pipe_write_open,
-@@ -460,7 +528,9 @@ struct file_operations write_pipe_fops =
- struct file_operations rdwr_pipe_fops = {
- .llseek = no_llseek,
- .read = pipe_read,
-+ .readv = pipe_readv,
- .write = pipe_write,
-+ .writev = pipe_writev,
- .poll = pipe_poll,
- .ioctl = pipe_ioctl,
- .open = pipe_rdwr_open,
-@@ -580,6 +650,7 @@ int do_pipe(int *fd)
- d_add(dentry, inode);
- f1->f_vfsmnt = f2->f_vfsmnt = mntget(mntget(pipe_mnt));
- f1->f_dentry = f2->f_dentry = dget(dentry);
-+ f1->f_mapping = f2->f_mapping = inode->i_mapping;
-
- /* read file */
- f1->f_pos = f2->f_pos = 0;
---- linux-2.6.0/fs/proc/base.c 2003-12-17 21:20:02.000000000 -0800
-+++ 25/fs/proc/base.c 2003-12-28 23:21:55.000000000 -0800
-@@ -277,15 +277,50 @@ static int proc_root_link(struct inode *
- return result;
- }
-
-+#define MAY_PTRACE(task) \
-+ (task == current || \
-+ (task->parent == current && \
-+ (task->ptrace & PT_PTRACED) && task->state == TASK_STOPPED && \
-+ security_ptrace(current,task) == 0))
-+
-+static int may_ptrace_attach(struct task_struct *task)
-+{
-+ int retval = 0;
-+
-+ task_lock(task);
-+
-+ if (!task->mm)
-+ goto out;
-+ if (((current->uid != task->euid) ||
-+ (current->uid != task->suid) ||
-+ (current->uid != task->uid) ||
-+ (current->gid != task->egid) ||
-+ (current->gid != task->sgid) ||
-+ (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
-+ goto out;
-+ rmb();
-+ if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
-+ goto out;
-+ if (security_ptrace(current, task))
-+ goto out;
-+
-+ retval = 1;
-+out:
-+ task_unlock(task);
-+ return retval;
-+}
-+
- static int proc_pid_environ(struct task_struct *task, char * buffer)
- {
- int res = 0;
- struct mm_struct *mm = get_task_mm(task);
- if (mm) {
-- int len = mm->env_end - mm->env_start;
-+ unsigned int len = mm->env_end - mm->env_start;
- if (len > PAGE_SIZE)
- len = PAGE_SIZE;
- res = access_process_vm(task, mm->env_start, buffer, len, 0);
-+ if (!may_ptrace_attach(task))
-+ res = -ESRCH;
- mmput(mm);
- }
- return res;
-@@ -294,7 +329,7 @@ static int proc_pid_environ(struct task_
- static int proc_pid_cmdline(struct task_struct *task, char * buffer)
- {
- int res = 0;
-- int len;
-+ unsigned int len;
- struct mm_struct *mm = get_task_mm(task);
- if (!mm)
- goto out;
-@@ -521,10 +556,6 @@ static struct file_operations proc_info_
- .read = proc_info_read,
- };
-
--#define MAY_PTRACE(p) \
--(p==current||(p->parent==current&&(p->ptrace & PT_PTRACED)&&p->state==TASK_STOPPED&&security_ptrace(current,p)==0))
--
--
- static int mem_open(struct inode* inode, struct file* file)
- {
- file->private_data = (void*)((long)current->self_exec_id);
-@@ -540,7 +571,7 @@ static ssize_t mem_read(struct file * fi
- int ret = -ESRCH;
- struct mm_struct *mm;
-
-- if (!MAY_PTRACE(task))
-+ if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
- goto out;
-
- ret = -ENOMEM;
-@@ -566,7 +597,7 @@ static ssize_t mem_read(struct file * fi
-
- this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
- retval = access_process_vm(task, src, page, this_len, 0);
-- if (!retval) {
-+ if (!retval || !MAY_PTRACE(task) || !may_ptrace_attach(task)) {
- if (!ret)
- ret = -EIO;
- break;
-@@ -604,7 +635,7 @@ static ssize_t mem_write(struct file * f
- struct task_struct *task = proc_task(file->f_dentry->d_inode);
- unsigned long dst = *ppos;
-
-- if (!MAY_PTRACE(task))
-+ if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
- return -ESRCH;
-
- page = (char *)__get_free_page(GFP_USER);
-@@ -1524,6 +1555,7 @@ struct dentry *proc_pid_lookup(struct in
- struct inode *inode;
- struct proc_inode *ei;
- unsigned tgid;
-+ int died;
-
- if (dentry->d_name.len == 4 && !memcmp(dentry->d_name.name,"self",4)) {
- inode = new_inode(dir->i_sb);
-@@ -1567,12 +1599,21 @@ struct dentry *proc_pid_lookup(struct in
-
- dentry->d_op = &pid_base_dentry_operations;
-
-+ died = 0;
-+ d_add(dentry, inode);
- spin_lock(&task->proc_lock);
- task->proc_dentry = dentry;
-- d_add(dentry, inode);
-+ if (!pid_alive(task)) {
-+ dentry = proc_pid_unhash(task);
-+ died = 1;
-+ }
- spin_unlock(&task->proc_lock);
-
- put_task_struct(task);
-+ if (died) {
-+ proc_pid_flush(dentry);
-+ goto out;
-+ }
- return NULL;
- out:
- return ERR_PTR(-ENOENT);
-@@ -1612,10 +1653,7 @@ static struct dentry *proc_task_lookup(s
-
- dentry->d_op = &pid_base_dentry_operations;
-
-- spin_lock(&task->proc_lock);
-- task->proc_dentry = dentry;
- d_add(dentry, inode);
-- spin_unlock(&task->proc_lock);
-
- put_task_struct(task);
- return NULL;
---- linux-2.6.0/fs/proc/generic.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/fs/proc/generic.c 2003-12-28 23:21:25.000000000 -0800
-@@ -567,12 +567,12 @@ struct proc_dir_entry *proc_symlink(cons
- return ent;
- }
-
--struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent)
-+struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
-+ struct proc_dir_entry *parent)
- {
- struct proc_dir_entry *ent;
-
-- ent = proc_create(&parent,name,
-- (S_IFDIR | S_IRUGO | S_IXUGO),2);
-+ ent = proc_create(&parent, name, S_IFDIR | mode, 2);
- if (ent) {
- ent->proc_fops = &proc_dir_operations;
- ent->proc_iops = &proc_dir_inode_operations;
-@@ -585,6 +585,12 @@ struct proc_dir_entry *proc_mkdir(const
- return ent;
- }
-
-+struct proc_dir_entry *proc_mkdir(const char *name,
-+ struct proc_dir_entry *parent)
-+{
-+ return proc_mkdir_mode(name, S_IRUGO | S_IXUGO, parent);
-+}
-+
- struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
- struct proc_dir_entry *parent)
- {
---- linux-2.6.0/fs/proc/proc_misc.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/proc/proc_misc.c 2003-12-28 23:26:33.000000000 -0800
-@@ -473,30 +473,46 @@ static int devices_read_proc(char *page,
- return proc_calc_metrics(page, start, off, count, eof, len);
- }
-
--extern int show_interrupts(struct seq_file *p, void *v);
--static int interrupts_open(struct inode *inode, struct file *file)
-+/*
-+ * /proc/interrupts
-+ */
-+static void *int_seq_start(struct seq_file *f, loff_t *pos)
-+{
-+ return (*pos <= NR_IRQS) ? pos : NULL;
-+}
-+
-+static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
-+{
-+ (*pos)++;
-+ if (*pos > NR_IRQS)
-+ return NULL;
-+ return pos;
-+}
-+
-+static void int_seq_stop(struct seq_file *f, void *v)
- {
-- unsigned size = 4096 * (1 + num_online_cpus() / 8);
-- char *buf = kmalloc(size, GFP_KERNEL);
-- struct seq_file *m;
-- int res;
--
-- if (!buf)
-- return -ENOMEM;
-- res = single_open(file, show_interrupts, NULL);
-- if (!res) {
-- m = file->private_data;
-- m->buf = buf;
-- m->size = size;
-- } else
-- kfree(buf);
-- return res;
-+ /* Nothing to do */
- }
-+
-+
-+extern int show_interrupts(struct seq_file *f, void *v); /* In arch code */
-+static struct seq_operations int_seq_ops = {
-+ .start = int_seq_start,
-+ .next = int_seq_next,
-+ .stop = int_seq_stop,
-+ .show = show_interrupts
-+};
-+
-+int interrupts_open(struct inode *inode, struct file *filp)
-+{
-+ return seq_open(filp, &int_seq_ops);
-+}
-+
- static struct file_operations proc_interrupts_operations = {
- .open = interrupts_open,
- .read = seq_read,
- .llseek = seq_lseek,
-- .release = single_release,
-+ .release = seq_release,
- };
-
- static int filesystems_read_proc(char *page, char **start, off_t off,
-@@ -638,6 +654,36 @@ static void create_seq_entry(char *name,
- entry->proc_fops = f;
- }
-
-+#ifdef CONFIG_LOCKMETER
-+extern ssize_t get_lockmeter_info(char *, size_t, loff_t *);
-+extern ssize_t put_lockmeter_info(const char *, size_t);
-+extern int get_lockmeter_info_size(void);
-+
-+/*
-+ * This function accesses lock metering information.
-+ */
-+static ssize_t read_lockmeter(struct file *file, char *buf,
-+ size_t count, loff_t *ppos)
-+{
-+ return get_lockmeter_info(buf, count, ppos);
-+}
-+
-+/*
-+ * Writing to /proc/lockmeter resets the counters
-+ */
-+static ssize_t write_lockmeter(struct file * file, const char * buf,
-+ size_t count, loff_t *ppos)
-+{
-+ return put_lockmeter_info(buf, count);
-+}
-+
-+static struct file_operations proc_lockmeter_operations = {
-+ NULL, /* lseek */
-+ read: read_lockmeter,
-+ write: write_lockmeter,
-+};
-+#endif /* CONFIG_LOCKMETER */
-+
- void __init proc_misc_init(void)
- {
- struct proc_dir_entry *entry;
-@@ -705,6 +751,13 @@ void __init proc_misc_init(void)
- if (entry)
- entry->proc_fops = &proc_sysrq_trigger_operations;
- #endif
-+#ifdef CONFIG_LOCKMETER
-+ entry = create_proc_entry("lockmeter", S_IWUSR | S_IRUGO, NULL);
-+ if (entry) {
-+ entry->proc_fops = &proc_lockmeter_operations;
-+ entry->size = get_lockmeter_info_size();
-+ }
-+#endif
- #ifdef CONFIG_PPC32
- {
- extern struct file_operations ppc_htab_operations;
---- linux-2.6.0/fs/proc/proc_tty.c 2003-11-26 13:53:35.000000000 -0800
-+++ 25/fs/proc/proc_tty.c 2003-12-28 23:21:25.000000000 -0800
-@@ -229,7 +229,13 @@ void __init proc_tty_init(void)
- if (!proc_mkdir("tty", 0))
- return;
- proc_tty_ldisc = proc_mkdir("tty/ldisc", 0);
-- proc_tty_driver = proc_mkdir("tty/driver", 0);
-+ /*
-+ * /proc/tty/driver/serial reveals the exact character counts for
-+ * serial links which is just too easy to abuse for inferring
-+ * password lengths and inter-keystroke timings during password
-+ * entry.
-+ */
-+ proc_tty_driver = proc_mkdir_mode("tty/driver", S_IRUSR | S_IXUSR, 0);
-
- create_proc_read_entry("tty/ldiscs", 0, 0, tty_ldiscs_read_proc,NULL);
- entry = create_proc_entry("tty/drivers", 0, NULL);
---- linux-2.6.0/fs/proc/task_mmu.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/proc/task_mmu.c 2003-12-28 23:22:48.000000000 -0800
-@@ -1,6 +1,7 @@
- #include <linux/mm.h>
- #include <linux/hugetlb.h>
- #include <linux/seq_file.h>
-+#include <asm/elf.h>
- #include <asm/uaccess.h>
-
- char *task_mem(struct mm_struct *mm, char *buffer)
-@@ -75,6 +76,22 @@ int task_statm(struct mm_struct *mm, int
- return size;
- }
-
-+#ifdef AT_SYSINFO_EHDR
-+
-+static struct vm_area_struct gate_vmarea = {
-+ /* Do _not_ mark this area as readable, cuz not the entire range may be readable
-+ (e.g., due to execute-only pages or holes) and the tools that read
-+ /proc/PID/maps should read the interesting bits from the gate-DSO file
-+ instead. */
-+ .vm_start = FIXADDR_USER_START,
-+ .vm_end = FIXADDR_USER_END
-+};
-+
-+# define gate_map() &gate_vmarea
-+#else
-+# define gate_map() NULL
-+#endif
-+
- static int show_map(struct seq_file *m, void *v)
- {
- struct vm_area_struct *map = v;
-@@ -105,7 +122,7 @@ static int show_map(struct seq_file *m,
- if (len < 1)
- len = 1;
- seq_printf(m, "%*c", len, ' ');
-- seq_path(m, file->f_vfsmnt, file->f_dentry, " \t\n\\");
-+ seq_path(m, file->f_vfsmnt, file->f_dentry, "");
- }
- seq_putc(m, '\n');
- return 0;
-@@ -128,6 +145,8 @@ static void *m_start(struct seq_file *m,
- if (!map) {
- up_read(&mm->mmap_sem);
- mmput(mm);
-+ if (l == -1)
-+ map = gate_map();
- }
- return map;
- }
-@@ -135,7 +154,7 @@ static void *m_start(struct seq_file *m,
- static void m_stop(struct seq_file *m, void *v)
- {
- struct vm_area_struct *map = v;
-- if (map) {
-+ if (map && map != gate_map()) {
- struct mm_struct *mm = map->vm_mm;
- up_read(&mm->mmap_sem);
- mmput(mm);
-@@ -149,6 +168,8 @@ static void *m_next(struct seq_file *m,
- if (map->vm_next)
- return map->vm_next;
- m_stop(m, v);
-+ if (map != gate_map())
-+ return gate_map();
- return NULL;
- }
-
---- linux-2.6.0/fs/read_write.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/read_write.c 2003-12-28 23:21:19.000000000 -0800
-@@ -28,7 +28,7 @@ EXPORT_SYMBOL(generic_ro_fops);
- loff_t generic_file_llseek(struct file *file, loff_t offset, int origin)
- {
- long long retval;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
-
- down(&inode->i_sem);
- switch (origin) {
---- linux-2.6.0/fs/reiserfs/file.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/reiserfs/file.c 2003-12-28 23:21:22.000000000 -0800
-@@ -1052,7 +1052,7 @@ ssize_t reiserfs_file_write( struct file
- /* Check if we can write to specified region of file, file
- is not overly big and this kind of stuff. Adjust pos and
- count, if needed */
-- res = generic_write_checks(inode, file, &pos, &count, 0);
-+ res = generic_write_checks(file, &pos, &count, 0);
- if (res)
- goto out;
-
-@@ -1179,7 +1179,7 @@ ssize_t reiserfs_file_write( struct file
- }
-
- if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
-- res = generic_osync_inode(inode, OSYNC_METADATA|OSYNC_DATA);
-+ res = generic_osync_inode(inode, file->f_mapping, OSYNC_METADATA|OSYNC_DATA);
-
- up(&inode->i_sem);
- return (already_written != 0)?already_written:res;
---- linux-2.6.0/fs/reiserfs/inode.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/reiserfs/inode.c 2003-12-28 23:21:19.000000000 -0800
-@@ -2375,7 +2375,7 @@ static int reiserfs_direct_IO(int rw, st
- loff_t offset, unsigned long nr_segs)
- {
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
-
- return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
- offset, nr_segs, reiserfs_get_blocks_direct_io, NULL);
---- linux-2.6.0/fs/reiserfs/journal.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/reiserfs/journal.c 2003-12-28 23:23:05.000000000 -0800
-@@ -1937,18 +1937,13 @@ static int journal_init_dev( struct supe
-
- journal -> j_dev_file = filp_open( jdev_name, 0, 0 );
- if( !IS_ERR( journal -> j_dev_file ) ) {
-- struct inode *jdev_inode;
--
-- jdev_inode = journal -> j_dev_file -> f_dentry -> d_inode;
-- journal -> j_dev_bd = jdev_inode -> i_bdev;
-+ struct inode *jdev_inode = journal->j_dev_file->f_mapping->host;
- if( !S_ISBLK( jdev_inode -> i_mode ) ) {
- printk( "journal_init_dev: '%s' is not a block device\n", jdev_name );
- result = -ENOTBLK;
-- } else if( jdev_inode -> i_bdev == NULL ) {
-- printk( "journal_init_dev: bdev uninitialized for '%s'\n", jdev_name );
-- result = -ENOMEM;
- } else {
- /* ok */
-+ journal->j_dev_bd = I_BDEV(jdev_inode);
- set_blocksize(journal->j_dev_bd, super->s_blocksize);
- }
- } else {
-@@ -1967,7 +1962,7 @@ static int journal_init_dev( struct supe
- /*
- ** must be called once on fs mount. calls journal_read for you
- */
--int journal_init(struct super_block *p_s_sb, const char * j_dev_name, int old_format) {
-+int journal_init(struct super_block *p_s_sb, const char * j_dev_name, int old_format, unsigned int commit_max_age) {
- int num_cnodes = SB_ONDISK_JOURNAL_SIZE(p_s_sb) * 2 ;
- struct buffer_head *bhjh;
- struct reiserfs_super_block * rs;
-@@ -2032,7 +2027,11 @@ int journal_init(struct super_block *p_s
-
- SB_JOURNAL_TRANS_MAX(p_s_sb) = le32_to_cpu (jh->jh_journal.jp_journal_trans_max);
- SB_JOURNAL_MAX_BATCH(p_s_sb) = le32_to_cpu (jh->jh_journal.jp_journal_max_batch);
-+ if (commit_max_age != 0) {
-+ SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) = commit_max_age;
-+ } else {
- SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) = le32_to_cpu (jh->jh_journal.jp_journal_max_commit_age);
-+ }
- SB_JOURNAL_MAX_TRANS_AGE(p_s_sb) = JOURNAL_MAX_TRANS_AGE;
-
- if (SB_JOURNAL_TRANS_MAX(p_s_sb)) {
---- linux-2.6.0/fs/reiserfs/namei.c 2003-09-27 18:57:46.000000000 -0700
-+++ 25/fs/reiserfs/namei.c 2003-12-28 23:23:05.000000000 -0800
-@@ -1088,11 +1088,16 @@ static int reiserfs_rename (struct inode
- int jbegin_count ;
- umode_t old_inode_mode;
- unsigned long savelink = 1;
-+ struct timespec ctime;
-
-- /* two balancings: old name removal, new name insertion or "save" link,
-- stat data updates: old directory and new directory and maybe block
-- containing ".." of renamed directory */
-- jbegin_count = JOURNAL_PER_BALANCE_CNT * 3 + 3;
-+ /* three balancings: (1) old name removal, (2) new name insertion
-+ and (3) maybe "save" link insertion
-+ stat data updates: (1) old directory,
-+ (2) new directory and (3) maybe old object stat data (when it is
-+ directory) and (4) maybe stat data of object to which new entry
-+ pointed initially and (5) maybe block containing ".." of
-+ renamed directory */
-+ jbegin_count = JOURNAL_PER_BALANCE_CNT * 3 + 5;
-
- old_inode = old_dentry->d_inode;
- new_dentry_inode = new_dentry->d_inode;
-@@ -1255,8 +1260,12 @@ static int reiserfs_rename (struct inode
-
- mark_de_hidden (old_de.de_deh + old_de.de_entry_num);
- journal_mark_dirty (&th, old_dir->i_sb, old_de.de_bh);
-- old_dir->i_ctime = old_dir->i_mtime =
-- new_dir->i_ctime = new_dir->i_mtime = CURRENT_TIME;
-+ ctime = CURRENT_TIME;
-+ old_dir->i_ctime = old_dir->i_mtime = ctime;
-+ new_dir->i_ctime = new_dir->i_mtime = ctime;
-+ /* thanks to Alex Adriaanse <alex_a@caltech.edu> for patch which adds ctime update of
-+ renamed object */
-+ old_inode->i_ctime = ctime;
-
- if (new_dentry_inode) {
- // adjust link number of the victim
-@@ -1265,7 +1274,7 @@ static int reiserfs_rename (struct inode
- } else {
- new_dentry_inode->i_nlink--;
- }
-- new_dentry_inode->i_ctime = new_dir->i_ctime;
-+ new_dentry_inode->i_ctime = ctime;
- savelink = new_dentry_inode->i_nlink;
- }
-
-@@ -1298,6 +1307,7 @@ static int reiserfs_rename (struct inode
-
- reiserfs_update_sd (&th, old_dir);
- reiserfs_update_sd (&th, new_dir);
-+ reiserfs_update_sd (&th, old_inode);
-
- if (new_dentry_inode) {
- if (savelink == 0)
---- linux-2.6.0/fs/reiserfs/procfs.c 2003-10-17 15:58:04.000000000 -0700
-+++ 25/fs/reiserfs/procfs.c 2003-12-28 23:23:05.000000000 -0800
-@@ -401,7 +401,7 @@ static int show_journal(struct seq_file
- DJP( jp_journal_trans_max ),
- DJP( jp_journal_magic ),
- DJP( jp_journal_max_batch ),
-- DJP( jp_journal_max_commit_age ),
-+ SB_JOURNAL_MAX_COMMIT_AGE(sb),
- DJP( jp_journal_max_trans_age ),
-
- JF( j_1st_reserved_block ),
---- linux-2.6.0/fs/reiserfs/super.c 2003-11-23 19:03:01.000000000 -0800
-+++ 25/fs/reiserfs/super.c 2003-12-28 23:23:05.000000000 -0800
-@@ -645,7 +645,8 @@ static int reiserfs_parse_options (struc
- collection of bitflags defining what
- mount options were selected. */
- unsigned long * blocks, /* strtol-ed from NNN of resize=NNN */
-- char ** jdev_name)
-+ char ** jdev_name,
-+ unsigned int * commit_max_age)
- {
- int c;
- char * arg = NULL;
-@@ -662,6 +663,7 @@ static int reiserfs_parse_options (struc
- {"resize", 'r', 0, 0, 0},
- {"jdev", 'j', 0, 0, 0},
- {"nolargeio", 'w', 0, 0, 0},
-+ {"commit", 'c', 0, 0, 0},
- {NULL, 0, 0, 0, 0}
- };
-
-@@ -690,6 +692,19 @@ static int reiserfs_parse_options (struc
- }
- }
-
-+ if ( c == 'c' ) {
-+ char *p = 0;
-+ int val = simple_strtoul (arg, &p, 0);
-+ /* commit=NNN (time in seconds) */
-+ if ( *p != '\0' || val == 0) {
-+ printk ("reiserfs_parse_options: bad value %s\n", arg);
-+ return 0;
-+ }
-+ if ( val > 0 ) {
-+ *commit_max_age = val;
-+ }
-+ }
-+
- if ( c == 'w' ) {
- char *p=0;
- int val = simple_strtoul (arg, &p, 0);
-@@ -743,10 +758,11 @@ static int reiserfs_remount (struct supe
- unsigned long blocks;
- unsigned long mount_options = REISERFS_SB(s)->s_mount_opt;
- unsigned long safe_mask = 0;
-+ unsigned int commit_max_age = 0;
-
- rs = SB_DISK_SUPER_BLOCK (s);
-
-- if (!reiserfs_parse_options(s, arg, &mount_options, &blocks, NULL))
-+ if (!reiserfs_parse_options(s, arg, &mount_options, &blocks, NULL, &commit_max_age))
- return -EINVAL;
-
- handle_attrs(s);
-@@ -764,6 +780,10 @@ static int reiserfs_remount (struct supe
- * the bits we're not allowed to change here */
- REISERFS_SB(s)->s_mount_opt = (REISERFS_SB(s)->s_mount_opt & ~safe_mask) | (mount_options & safe_mask);
-
-+ if(commit_max_age != 0) {
-+ SB_JOURNAL_MAX_COMMIT_AGE(s) = commit_max_age;
-+ }
-+
- if(blocks) {
- int rc = reiserfs_resize(s, blocks);
- if (rc != 0)
-@@ -1201,11 +1221,15 @@ int function2code (hashf_t func)
- if (func == r5_hash)
- return R5_HASH;
-
-- BUG() ; // should never happen
-+ BUG() ; // should never happen
-
- return 0;
- }
-
-+#define SPRINTK(silent, ...) \
-+ if (!(silent)) \
-+ printk(__VA_ARGS__)
-+
- static int reiserfs_fill_super (struct super_block * s, void * data, int silent)
- {
- struct inode *root_inode;
-@@ -1213,6 +1237,7 @@ static int reiserfs_fill_super (struct s
- struct reiserfs_transaction_handle th ;
- int old_format = 0;
- unsigned long blocks;
-+ unsigned int commit_max_age = 0;
- int jinit_done = 0 ;
- struct reiserfs_iget_args args ;
- struct reiserfs_super_block * rs;
-@@ -1237,58 +1262,58 @@ static int reiserfs_fill_super (struct s
- REISERFS_SB(s)->s_alloc_options.preallocsize = 9;
-
- jdev_name = NULL;
-- if (reiserfs_parse_options (s, (char *) data, &(sbi->s_mount_opt), &blocks, &jdev_name) == 0) {
-+ if (reiserfs_parse_options (s, (char *) data, &(sbi->s_mount_opt), &blocks, &jdev_name, &commit_max_age) == 0) {
- goto error;
- }
-
- if (blocks) {
-- printk("jmacd-7: reiserfs_fill_super: resize option for remount only\n");
-+ SPRINTK(silent, "jmacd-7: reiserfs_fill_super: resize option for remount only\n");
- goto error;
- }
-
- /* try old format (undistributed bitmap, super block in 8-th 1k block of a device) */
-- if (!read_super_block (s, REISERFS_OLD_DISK_OFFSET_IN_BYTES))
-+ if (!read_super_block (s, REISERFS_OLD_DISK_OFFSET_IN_BYTES))
- old_format = 1;
- /* try new format (64-th 1k block), which can contain reiserfs super block */
- else if (read_super_block (s, REISERFS_DISK_OFFSET_IN_BYTES)) {
-- printk("sh-2021: reiserfs_fill_super: can not find reiserfs on %s\n", reiserfs_bdevname (s));
-- goto error;
-+ SPRINTK(silent, "sh-2021: reiserfs_fill_super: can not find reiserfs on %s\n", reiserfs_bdevname (s));
-+ goto error;
- }
-
- rs = SB_DISK_SUPER_BLOCK (s);
- /* Let's do basic sanity check to verify that underlying device is not
- smaller than the filesystem. If the check fails then abort and scream,
- because bad stuff will happen otherwise. */
-- if ( s->s_bdev && s->s_bdev->bd_inode && i_size_read(s->s_bdev->bd_inode) < sb_block_count(rs)*sb_blocksize(rs) ) {
-- printk("Filesystem on %s cannot be mounted because it is bigger than the device\n", reiserfs_bdevname(s));
-- printk("You may need to run fsck or increase size of your LVM partition\n");
-- printk("Or may be you forgot to reboot after fdisk when it told you to\n");
-+ if ( s->s_bdev && s->s_bdev->bd_inode && i_size_read(s->s_bdev->bd_inode) < sb_block_count(rs)*sb_blocksize(rs)) {
-+ SPRINTK(silent, "Filesystem on %s cannot be mounted because it is bigger than the device\n", reiserfs_bdevname(s));
-+ SPRINTK(silent, "You may need to run fsck or increase size of your LVM partition\n");
-+ SPRINTK(silent, "Or may be you forgot to reboot after fdisk when it told you to\n");
- goto error;
- }
-
- sbi->s_mount_state = SB_REISERFS_STATE(s);
- sbi->s_mount_state = REISERFS_VALID_FS ;
-
-- if (old_format ? read_old_bitmaps(s) : read_bitmaps(s)) {
-- printk ("jmacd-8: reiserfs_fill_super: unable to read bitmap\n");
-+ if (old_format ? read_old_bitmaps(s) : read_bitmaps(s)) {
-+ SPRINTK(silent, "jmacd-8: reiserfs_fill_super: unable to read bitmap\n");
- goto error;
- }
- #ifdef CONFIG_REISERFS_CHECK
-- printk("reiserfs:warning: CONFIG_REISERFS_CHECK is set ON\n");
-- printk("reiserfs:warning: - it is slow mode for debugging.\n");
-+ SPRINTK(silent, "reiserfs:warning: CONFIG_REISERFS_CHECK is set ON\n");
-+ SPRINTK(silent, "reiserfs:warning: - it is slow mode for debugging.\n");
- #endif
-
- // set_device_ro(s->s_dev, 1) ;
-- if( journal_init(s, jdev_name, old_format) ) {
-- printk("sh-2022: reiserfs_fill_super: unable to initialize journal space\n") ;
-+ if( journal_init(s, jdev_name, old_format, commit_max_age) ) {
-+ SPRINTK(silent, "sh-2022: reiserfs_fill_super: unable to initialize journal space\n") ;
- goto error ;
- } else {
- jinit_done = 1 ; /* once this is set, journal_release must be called
-- ** if we error out of the mount
-+ ** if we error out of the mount
- */
- }
- if (reread_meta_blocks(s)) {
-- printk("jmacd-9: reiserfs_fill_super: unable to reread meta blocks after journal init\n") ;
-+ SPRINTK(silent, "jmacd-9: reiserfs_fill_super: unable to reread meta blocks after journal init\n") ;
- goto error ;
- }
-
-@@ -1296,14 +1321,14 @@ static int reiserfs_fill_super (struct s
- goto error;
-
- if (bdev_read_only(s->s_bdev) && !(s->s_flags & MS_RDONLY)) {
-- printk("clm-7000: Detected readonly device, marking FS readonly\n") ;
-+ SPRINTK(silent, "clm-7000: Detected readonly device, marking FS readonly\n") ;
- s->s_flags |= MS_RDONLY ;
- }
- args.objectid = REISERFS_ROOT_OBJECTID ;
- args.dirid = REISERFS_ROOT_PARENT_OBJECTID ;
- root_inode = iget5_locked (s, REISERFS_ROOT_OBJECTID, reiserfs_find_actor, reiserfs_init_locked_inode, (void *)(&args));
- if (!root_inode) {
-- printk ("jmacd-10: reiserfs_fill_super: get root inode failed\n");
-+ SPRINTK(silent, "jmacd-10: reiserfs_fill_super: get root inode failed\n");
- goto error;
- }
-
-@@ -1341,22 +1366,23 @@ static int reiserfs_fill_super (struct s
-
- if (old_format_only(s)) {
- /* filesystem of format 3.5 either with standard or non-standard
-- journal */
-+ journal */
- if (convert_reiserfs (s)) {
-- /* and -o conv is given */
-- reiserfs_warning ("reiserfs: converting 3.5 filesystem to the 3.6 format\n") ;
--
-+ /* and -o conv is given */
-+ if(!silent)
-+ reiserfs_warning ("reiserfs: converting 3.5 filesystem to the 3.6 format\n") ;
-+
- if (is_reiserfs_3_5 (rs))
- /* put magic string of 3.6 format. 2.2 will not be able to
- mount this filesystem anymore */
-- memcpy (rs->s_v1.s_magic, reiserfs_3_6_magic_string,
-+ memcpy (rs->s_v1.s_magic, reiserfs_3_6_magic_string,
- sizeof (reiserfs_3_6_magic_string));
--
-+
- set_sb_version(rs,REISERFS_VERSION_2);
- reiserfs_convert_objectid_map_v1(s) ;
- set_bit(REISERFS_3_6, &(sbi->s_properties));
- clear_bit(REISERFS_3_5, &(sbi->s_properties));
-- } else {
-+ } else if (!silent){
- reiserfs_warning("reiserfs: using 3.5.x disk format\n") ;
- }
- }
-@@ -1369,7 +1395,7 @@ static int reiserfs_fill_super (struct s
-
- s->s_dirt = 0;
- } else {
-- if ( old_format_only(s) ) {
-+ if ( old_format_only(s) && !silent) {
- reiserfs_warning("reiserfs: using 3.5.x disk format\n") ;
- }
- }
---- linux-2.6.0/fs/stat.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/fs/stat.c 2003-12-28 23:22:16.000000000 -0800
-@@ -106,7 +106,7 @@ int vfs_fstat(unsigned int fd, struct ks
- EXPORT_SYMBOL(vfs_fstat);
-
- #if !defined(__alpha__) && !defined(__sparc__) && !defined(__ia64__) \
-- && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) && !defined(__x86_64__) \
-+ && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) \
- && !defined(__arm__) && !defined(CONFIG_V850) && !defined(__powerpc64__)
-
- /*
---- linux-2.6.0/fs/super.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/super.c 2003-12-28 23:21:23.000000000 -0800
-@@ -66,6 +66,7 @@ static struct super_block *alloc_super(v
- INIT_LIST_HEAD(&s->s_files);
- INIT_LIST_HEAD(&s->s_instances);
- INIT_HLIST_HEAD(&s->s_anon);
-+ INIT_LIST_HEAD(&s->s_inodes);
- init_rwsem(&s->s_umount);
- sema_init(&s->s_lock, 1);
- down_write(&s->s_umount);
---- linux-2.6.0/fs/sysfs/dir.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/sysfs/dir.c 2003-12-28 23:22:59.000000000 -0800
-@@ -83,7 +83,8 @@ static void remove_dir(struct dentry * d
- struct dentry * parent = dget(d->d_parent);
- down(&parent->d_inode->i_sem);
- d_delete(d);
-- simple_rmdir(parent->d_inode,d);
-+ if (d->d_inode)
-+ simple_rmdir(parent->d_inode,d);
-
- pr_debug(" o %s removing done (%d)\n",d->d_name.name,
- atomic_read(&d->d_count));
-@@ -122,8 +123,8 @@ void sysfs_remove_dir(struct kobject * k
- node = dentry->d_subdirs.next;
- while (node != &dentry->d_subdirs) {
- struct dentry * d = list_entry(node,struct dentry,d_child);
-- list_del_init(node);
-
-+ node = node->next;
- pr_debug(" o %s (%d): ",d->d_name.name,atomic_read(&d->d_count));
- if (d->d_inode) {
- d = dget_locked(d);
-@@ -139,9 +140,7 @@ void sysfs_remove_dir(struct kobject * k
- spin_lock(&dcache_lock);
- }
- pr_debug(" done\n");
-- node = dentry->d_subdirs.next;
- }
-- list_del_init(&dentry->d_child);
- spin_unlock(&dcache_lock);
- up(&dentry->d_inode->i_sem);
-
---- linux-2.6.0/fs/udf/super.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/udf/super.c 2003-12-28 23:21:55.000000000 -0800
-@@ -414,7 +414,7 @@ udf_parse_options(char *options, struct
- case Opt_utf8:
- uopt->flags |= (1 << UDF_FLAG_UTF8);
- break;
--#ifdef CONFIG_NLS
-+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
- case Opt_iocharset:
- uopt->nls_map = load_nls(args[0].from);
- uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
-@@ -1510,7 +1510,7 @@ static int udf_fill_super(struct super_b
- "utf8 cannot be combined with iocharset\n");
- goto error_out;
- }
--#ifdef CONFIG_NLS
-+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
- if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map)
- {
- uopt.nls_map = load_nls_default();
-@@ -1674,7 +1674,7 @@ error_out:
- udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
- }
- }
--#ifdef CONFIG_NLS
-+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
- if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
- unload_nls(UDF_SB(sb)->s_nls_map);
- #endif
-@@ -1766,7 +1766,7 @@ udf_put_super(struct super_block *sb)
- udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
- }
- }
--#ifdef CONFIG_NLS
-+#if defined(CONFIG_NLS) || defined(CONFIG_NLS_MODULE)
- if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
- unload_nls(UDF_SB(sb)->s_nls_map);
- #endif
---- linux-2.6.0/fs/vfat/namei.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/fs/vfat/namei.c 2003-12-28 23:22:52.000000000 -0800
-@@ -25,23 +25,6 @@
- #include <linux/buffer_head.h>
- #include <linux/namei.h>
-
--#define DEBUG_LEVEL 0
--#if (DEBUG_LEVEL >= 1)
--# define PRINTK1(x) printk x
--#else
--# define PRINTK1(x)
--#endif
--#if (DEBUG_LEVEL >= 2)
--# define PRINTK2(x) printk x
--#else
--# define PRINTK2(x)
--#endif
--#if (DEBUG_LEVEL >= 3)
--# define PRINTK3(x) printk x
--#else
--# define PRINTK3(x)
--#endif
--
- static int vfat_hashi(struct dentry *parent, struct qstr *qstr);
- static int vfat_hash(struct dentry *parent, struct qstr *qstr);
- static int vfat_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b);
-@@ -573,13 +556,18 @@ xlate_to_uni(const unsigned char *name,
- int charlen;
-
- if (utf8) {
-+ int name_len = strlen(name);
-+
- *outlen = utf8_mbstowcs((wchar_t *)outname, name, PAGE_SIZE);
-- if (name[len-1] == '.')
-- *outlen-=2;
-+
-+ /*
-+ * We stripped '.'s before and set len appropriately,
-+ * but utf8_mbstowcs doesn't care about len
-+ */
-+ *outlen -= (name_len-len);
-+
- op = &outname[*outlen * sizeof(wchar_t)];
- } else {
-- if (name[len-1] == '.')
-- len--;
- if (nls) {
- for (i = 0, ip = name, op = outname, *outlen = 0;
- i < len && *outlen <= 260; *outlen += 1)
-@@ -694,7 +682,6 @@ static int vfat_build_slots(struct inode
- for (cksum = i = 0; i < 11; i++) {
- cksum = (((cksum&1)<<7)|((cksum&0xfe)>>1)) + msdos_name[i];
- }
-- PRINTK3(("vfat_fill_slots 3: slots=%d\n",*slots));
-
- for (ps = ds, slot = *slots; slot > 0; slot--, ps++) {
- ps->id = slot;
-@@ -711,7 +698,6 @@ static int vfat_build_slots(struct inode
- de = (struct msdos_dir_entry *) ps;
-
- shortname:
-- PRINTK3(("vfat_fill_slots 9\n"));
- /* build the entry of 8.3 alias name */
- (*slots)++;
- memcpy(de->name, msdos_name, MSDOS_NAME);
-@@ -734,18 +720,22 @@ static int vfat_add_entry(struct inode *
- {
- struct msdos_dir_slot *dir_slots;
- loff_t offset;
-- int slots, slot;
-- int res;
-+ int res, slots, slot;
-+ unsigned int len;
- struct msdos_dir_entry *dummy_de;
- struct buffer_head *dummy_bh;
- loff_t dummy_i_pos;
-
-- dir_slots = (struct msdos_dir_slot *)
-+ len = vfat_striptail_len(qname);
-+ if (len == 0)
-+ return -ENOENT;
-+
-+ dir_slots =
- kmalloc(sizeof(struct msdos_dir_slot) * MSDOS_SLOTS, GFP_KERNEL);
- if (dir_slots == NULL)
- return -ENOMEM;
-
-- res = vfat_build_slots(dir, qname->name, vfat_striptail_len(qname),
-+ res = vfat_build_slots(dir, qname->name, len,
- dir_slots, &slots, is_dir);
- if (res < 0)
- goto cleanup;
-@@ -796,11 +786,16 @@ static int vfat_find(struct inode *dir,s
- {
- struct super_block *sb = dir->i_sb;
- loff_t offset;
-+ unsigned int len;
- int res;
-
-- res = fat_search_long(dir, qname->name, vfat_striptail_len(qname),
-- (MSDOS_SB(sb)->options.name_check != 's'),
-- &offset,&sinfo->longname_offset);
-+ len = vfat_striptail_len(qname);
-+ if (len == 0)
-+ return -ENOENT;
-+
-+ res = fat_search_long(dir, qname->name, len,
-+ (MSDOS_SB(sb)->options.name_check != 's'),
-+ &offset, &sinfo->longname_offset);
- if (res>0) {
- sinfo->long_slots = res-1;
- if (fat_get_entry(dir,&offset,last_bh,last_de,&sinfo->i_pos)>=0)
-@@ -820,9 +815,6 @@ struct dentry *vfat_lookup(struct inode
- struct msdos_dir_entry *de;
- int table;
-
-- PRINTK2(("vfat_lookup: name=%s, len=%d\n",
-- dentry->d_name.name, dentry->d_name.len));
--
- lock_kernel();
- table = (MSDOS_SB(dir->i_sb)->options.name_check == 's') ? 2 : 0;
- dentry->d_op = &vfat_dentry_ops[table];
-@@ -955,7 +947,6 @@ int vfat_unlink(struct inode *dir, struc
- struct buffer_head *bh = NULL;
- struct msdos_dir_entry *de;
-
-- PRINTK1(("vfat_unlink: %s\n", dentry->d_name.name));
- lock_kernel();
- res = vfat_find(dir,&dentry->d_name,&sinfo,&bh,&de);
- if (res < 0) {
-@@ -1036,14 +1027,18 @@ int vfat_rename(struct inode *old_dir,st
- new_inode = new_dentry->d_inode;
- lock_kernel();
- res = vfat_find(old_dir,&old_dentry->d_name,&old_sinfo,&old_bh,&old_de);
-- PRINTK3(("vfat_rename 2\n"));
-- if (res < 0) goto rename_done;
-+ if (res < 0)
-+ goto rename_done;
-
- is_dir = S_ISDIR(old_inode->i_mode);
-
-- if (is_dir && (res = fat_scan(old_inode,MSDOS_DOTDOT,&dotdot_bh,
-- &dotdot_de,&dotdot_i_pos)) < 0)
-- goto rename_done;
-+ if (is_dir) {
-+ if (fat_scan(old_inode, MSDOS_DOTDOT, &dotdot_bh,
-+ &dotdot_de, &dotdot_i_pos) < 0) {
-+ res = -EIO;
-+ goto rename_done;
-+ }
-+ }
-
- if (new_dentry->d_inode) {
- res = vfat_find(new_dir,&new_dentry->d_name,&sinfo,&new_bh,
---- linux-2.6.0/fs/xfs/linux/xfs_aops.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/xfs/linux/xfs_aops.c 2003-12-28 23:26:37.000000000 -0800
-@@ -974,7 +974,7 @@ linvfs_direct_IO(
- unsigned long nr_segs)
- {
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
- vnode_t *vp = LINVFS_GET_VP(inode);
- page_buf_bmap_t pbmap;
- int maps = 1;
-@@ -984,7 +984,8 @@ linvfs_direct_IO(
- if (error)
- return -error;
-
-- return blockdev_direct_IO(rw, iocb, inode, pbmap.pbm_target->pbr_bdev,
-+ return blockdev_direct_IO_no_locking(rw, iocb, inode,
-+ pbmap.pbm_target->pbr_bdev,
- iov, offset, nr_segs,
- linvfs_get_blocks_direct,
- linvfs_unwritten_convert_direct);
---- linux-2.6.0/fs/xfs/linux/xfs_file.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/fs/xfs/linux/xfs_file.c 2003-12-28 23:21:19.000000000 -0800
-@@ -112,7 +112,7 @@ __linvfs_write(
- {
- struct iovec iov = {(void *)buf, count};
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
- vnode_t *vp = LINVFS_GET_VP(inode);
- int error;
-
-@@ -160,7 +160,7 @@ __linvfs_readv(
- unsigned long nr_segs,
- loff_t *ppos)
- {
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
- vnode_t *vp = LINVFS_GET_VP(inode);
- struct kiocb kiocb;
- int error;
-@@ -207,7 +207,7 @@ __linvfs_writev(
- unsigned long nr_segs,
- loff_t *ppos)
- {
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-+ struct inode *inode = file->f_mapping->host;
- vnode_t *vp = LINVFS_GET_VP(inode);
- struct kiocb kiocb;
- int error;
---- linux-2.6.0/fs/xfs/pagebuf/page_buf.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/fs/xfs/pagebuf/page_buf.c 2003-12-28 23:22:28.000000000 -0800
-@@ -1395,7 +1395,6 @@ next_chunk:
- break;
-
- offset = 0;
--
- sector += nbytes >> BBSHIFT;
- size -= nbytes;
- total_nr_pages--;
-@@ -1403,15 +1402,11 @@ next_chunk:
-
- submit_io:
- if (likely(bio->bi_size)) {
-- if (pb->pb_flags & PBF_READ) {
-- submit_bio(READ, bio);
-- } else {
-- submit_bio(WRITE, bio);
-- }
--
-+ submit_bio((pb->pb_flags & PBF_READ) ? READ : WRITE, bio);
- if (size)
- goto next_chunk;
- } else {
-+ bio_put(bio);
- pagebuf_ioerror(pb, EIO);
- }
-
---- linux-2.6.0/fs/xfs/xfs_vfsops.c 2003-10-17 15:58:04.000000000 -0700
-+++ 25/fs/xfs/xfs_vfsops.c 2003-12-28 23:22:28.000000000 -0800
-@@ -1598,8 +1598,9 @@ xfs_vget(
- #define MNTOPT_NORECOVERY "norecovery" /* don't run XFS recovery */
- #define MNTOPT_NOLOGFLUSH "nologflush" /* don't hard flush on log writes */
- #define MNTOPT_OSYNCISOSYNC "osyncisosync" /* o_sync is REALLY o_sync */
--#define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */
--#define MNTOPT_IKEEP "ikeep" /* free empty inode clusters */
-+#define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */
-+#define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */
-+#define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */
-
-
- int
-@@ -1614,7 +1615,9 @@ xfs_parseargs(
- int dsunit, dswidth, vol_dsunit, vol_dswidth;
- int iosize;
-
-+#if 0 /* XXX: off by default, until some remaining issues ironed out */
- args->flags |= XFSMNT_IDELETE; /* default to on */
-+#endif
-
- if (!options)
- return 0;
-@@ -1722,6 +1725,8 @@ xfs_parseargs(
- args->flags |= XFSMNT_NOLOGFLUSH;
- } else if (!strcmp(this_char, MNTOPT_IKEEP)) {
- args->flags &= ~XFSMNT_IDELETE;
-+ } else if (!strcmp(this_char, MNTOPT_NOIKEEP)) {
-+ args->flags |= XFSMNT_IDELETE;
- } else if (!strcmp(this_char, "osyncisdsync")) {
- /* no-op, this is now the default */
- printk("XFS: osyncisdsync is now the default, option is deprecated.\n");
---- linux-2.6.0/include/acpi/acconfig.h 2003-10-17 15:58:04.000000000 -0700
-+++ 25/include/acpi/acconfig.h 2003-12-28 23:21:33.000000000 -0800
-@@ -64,7 +64,7 @@
-
- /* Version string */
-
--#define ACPI_CA_VERSION 0x20031002
-+#define ACPI_CA_VERSION 0x20031203
-
- /* Maximum objects in the various object caches */
-
---- linux-2.6.0/include/acpi/acevents.h 2003-06-14 12:18:23.000000000 -0700
-+++ 25/include/acpi/acevents.h 2003-12-28 23:21:33.000000000 -0800
-@@ -182,6 +182,17 @@ acpi_ev_detach_region (
- union acpi_operand_object *region_obj,
- u8 acpi_ns_is_locked);
-
-+acpi_status
-+acpi_ev_execute_reg_method (
-+ union acpi_operand_object *region_obj,
-+ u32 function);
-+
-+acpi_status
-+acpi_ev_reg_run (
-+ acpi_handle obj_handle,
-+ u32 level,
-+ void *context,
-+ void **return_value);
-
- /*
- * Evregini - Region initialization and setup
---- linux-2.6.0/include/acpi/acglobal.h 2003-06-22 12:04:44.000000000 -0700
-+++ 25/include/acpi/acglobal.h 2003-12-28 23:21:33.000000000 -0800
-@@ -106,6 +106,9 @@ ACPI_EXTERN struct acpi_common_facs
- ACPI_EXTERN u8 acpi_gbl_integer_bit_width;
- ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
- ACPI_EXTERN u8 acpi_gbl_integer_nybble_width;
-+
-+/* Keep local copies of these FADT-based registers */
-+
- ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1a_enable;
- ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_enable;
-
---- linux-2.6.0/include/acpi/acmacros.h 2003-06-14 12:18:22.000000000 -0700
-+++ 25/include/acpi/acmacros.h 2003-12-28 23:21:33.000000000 -0800
-@@ -48,7 +48,6 @@
- /*
- * Data manipulation macros
- */
--
- #define ACPI_LOWORD(l) ((u16)(u32)(l))
- #define ACPI_HIWORD(l) ((u16)((((u32)(l)) >> 16) & 0xFFFF))
- #define ACPI_LOBYTE(l) ((u8)(u16)(l))
-@@ -94,10 +93,18 @@
- #endif
- #endif
-
-- /*
-- * Extract a byte of data using a pointer. Any more than a byte and we
-- * get into potential aligment issues -- see the STORE macros below
-- */
-+/*
-+ * printf() format helpers
-+ */
-+
-+/* Split 64-bit integer into two 32-bit values. use with %8,8_x%8.8X */
-+
-+#define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i),ACPI_LODWORD(i)
-+
-+/*
-+ * Extract a byte of data using a pointer. Any more than a byte and we
-+ * get into potential aligment issues -- see the STORE macros below
-+ */
- #define ACPI_GET8(addr) (*(u8*)(addr))
-
- /* Pointer arithmetic */
-@@ -129,7 +136,6 @@
- * If the hardware supports the transfer of unaligned data, just do the store.
- * Otherwise, we have to move one byte at a time.
- */
--
- #ifdef ACPI_BIG_ENDIAN
- /*
- * Macros for big-endian machines
-@@ -299,7 +305,6 @@
- /*
- * Fast power-of-two math macros for non-optimized compilers
- */
--
- #define _ACPI_DIV(value,power_of2) ((u32) ((value) >> (power_of2)))
- #define _ACPI_MUL(value,power_of2) ((u32) ((value) << (power_of2)))
- #define _ACPI_MOD(value,divisor) ((u32) ((value) & ((divisor) -1)))
-@@ -443,7 +448,6 @@
- /*
- * Reporting macros that are never compiled out
- */
--
- #define ACPI_PARAM_LIST(pl) pl
-
- /*
-@@ -451,7 +455,6 @@
- * _THIS_MODULE gets compiled out when ACPI_DEBUG_OUTPUT isn't defined, only
- * use it in debug mode.
- */
--
- #ifdef ACPI_DEBUG_OUTPUT
-
- #define ACPI_REPORT_INFO(fp) {acpi_ut_report_info(_THIS_MODULE,__LINE__,_COMPONENT); \
-@@ -490,7 +493,6 @@
- /*
- * Debug macros that are conditionally compiled
- */
--
- #ifdef ACPI_DEBUG_OUTPUT
-
- #define ACPI_MODULE_NAME(name) static char ACPI_UNUSED_VAR *_THIS_MODULE = name;
-@@ -500,7 +502,6 @@
- * The first parameter should be the procedure name as a quoted string. This is declared
- * as a local string ("_proc_name) so that it can be also used by the function exit macros below.
- */
--
- #define ACPI_FUNCTION_NAME(a) struct acpi_debug_print_info _dbg; \
- _dbg.component_id = _COMPONENT; \
- _dbg.proc_name = a; \
-@@ -562,7 +563,6 @@
- /*
- * Generate INT3 on ACPI_ERROR (Debug only!)
- */
--
- #define ACPI_ERROR_BREAK
- #ifdef ACPI_ERROR_BREAK
- #define ACPI_BREAK_ON_ERROR(lvl) if ((lvl)&ACPI_ERROR) \
-@@ -577,7 +577,6 @@
- * 1) Debug print for the current component is enabled
- * 2) Debug error level or trace level for the print statement is enabled
- */
--
- #define ACPI_DEBUG_PRINT(pl) acpi_ut_debug_print ACPI_PARAM_LIST(pl)
- #define ACPI_DEBUG_PRINT_RAW(pl) acpi_ut_debug_print_raw ACPI_PARAM_LIST(pl)
-
-@@ -587,7 +586,6 @@
- * This is the non-debug case -- make everything go away,
- * leaving no executable debug code!
- */
--
- #define ACPI_MODULE_NAME(name)
- #define _THIS_MODULE ""
-
-@@ -662,7 +660,6 @@
- /*
- * Memory allocation tracking (DEBUG ONLY)
- */
--
- #ifndef ACPI_DBG_TRACK_ALLOCATIONS
-
- /* Memory allocation */
---- linux-2.6.0/include/acpi/acobject.h 2003-06-14 12:17:58.000000000 -0700
-+++ 25/include/acpi/acobject.h 2003-12-28 23:21:33.000000000 -0800
-@@ -114,7 +114,7 @@
- #define ACPI_COMMON_NOTIFY_INFO \
- union acpi_operand_object *system_notify; /* Handler for system notifies */\
- union acpi_operand_object *device_notify; /* Handler for driver notifies */\
-- union acpi_operand_object *address_space; /* Handler for Address space */
-+ union acpi_operand_object *handler; /* Handler for Address space */
-
-
- /******************************************************************************
-@@ -214,7 +214,7 @@ struct acpi_object_region
- ACPI_OBJECT_COMMON_HEADER
-
- u8 space_id;
-- union acpi_operand_object *address_space; /* Handler for region access */
-+ union acpi_operand_object *handler; /* Handler for region access */
- struct acpi_namespace_node *node; /* containing object */
- union acpi_operand_object *next;
- u32 length;
-@@ -464,21 +464,22 @@ union acpi_operand_object
-
- /* Object descriptor types */
-
--#define ACPI_DESC_TYPE_CACHED 0x11 /* Used only when object is cached */
--#define ACPI_DESC_TYPE_STATE 0x20
--#define ACPI_DESC_TYPE_STATE_UPDATE 0x21
--#define ACPI_DESC_TYPE_STATE_PACKAGE 0x22
--#define ACPI_DESC_TYPE_STATE_CONTROL 0x23
--#define ACPI_DESC_TYPE_STATE_RPSCOPE 0x24
--#define ACPI_DESC_TYPE_STATE_PSCOPE 0x25
--#define ACPI_DESC_TYPE_STATE_WSCOPE 0x26
--#define ACPI_DESC_TYPE_STATE_RESULT 0x27
--#define ACPI_DESC_TYPE_STATE_NOTIFY 0x28
--#define ACPI_DESC_TYPE_STATE_THREAD 0x29
--#define ACPI_DESC_TYPE_WALK 0x44
--#define ACPI_DESC_TYPE_PARSER 0x66
--#define ACPI_DESC_TYPE_OPERAND 0x88
--#define ACPI_DESC_TYPE_NAMED 0xAA
-+#define ACPI_DESC_TYPE_CACHED 0x01 /* Used only when object is cached */
-+#define ACPI_DESC_TYPE_STATE 0x02
-+#define ACPI_DESC_TYPE_STATE_UPDATE 0x03
-+#define ACPI_DESC_TYPE_STATE_PACKAGE 0x04
-+#define ACPI_DESC_TYPE_STATE_CONTROL 0x05
-+#define ACPI_DESC_TYPE_STATE_RPSCOPE 0x06
-+#define ACPI_DESC_TYPE_STATE_PSCOPE 0x07
-+#define ACPI_DESC_TYPE_STATE_WSCOPE 0x08
-+#define ACPI_DESC_TYPE_STATE_RESULT 0x09
-+#define ACPI_DESC_TYPE_STATE_NOTIFY 0x0A
-+#define ACPI_DESC_TYPE_STATE_THREAD 0x0B
-+#define ACPI_DESC_TYPE_WALK 0x0C
-+#define ACPI_DESC_TYPE_PARSER 0x0D
-+#define ACPI_DESC_TYPE_OPERAND 0x0E
-+#define ACPI_DESC_TYPE_NAMED 0x0F
-+#define ACPI_DESC_TYPE_MAX 0x0F
-
-
- union acpi_descriptor
---- linux-2.6.0/include/acpi/acpi_drivers.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/acpi/acpi_drivers.h 2003-12-28 23:21:33.000000000 -0800
-@@ -53,10 +53,6 @@
-
- #define ACPI_PCI_COMPONENT 0x00400000
-
--/* ACPI PCI Root Bridge (pci_root.c) */
--
--void acpi_pci_get_translations (struct acpi_pci_id* id, u64* mem_tra, u64* io_tra);
--
- /* ACPI PCI Interrupt Link (pci_link.c) */
-
- int acpi_pci_link_check (void);
---- linux-2.6.0/include/acpi/acutils.h 2003-06-14 12:17:56.000000000 -0700
-+++ 25/include/acpi/acutils.h 2003-12-28 23:21:33.000000000 -0800
-@@ -125,6 +125,14 @@ acpi_ut_get_type_name (
- acpi_object_type type);
-
- char *
-+acpi_ut_get_node_name (
-+ void *object);
-+
-+char *
-+acpi_ut_get_descriptor_name (
-+ void *object);
-+
-+char *
- acpi_ut_get_object_type_name (
- union acpi_operand_object *obj_desc);
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-alpha/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_ALPHA_CPUMASK_H
-+#define _ASM_ALPHA_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_ALPHA_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-alpha/lockmeter.h 2003-12-28 23:26:33.000000000 -0800
-@@ -0,0 +1,90 @@
-+/*
-+ * Written by John Hawkes (hawkes@sgi.com)
-+ * Based on klstat.h by Jack Steiner (steiner@sgi.com)
-+ *
-+ * Modified by Peter Rival (frival@zk3.dec.com)
-+ */
-+
-+#ifndef _ALPHA_LOCKMETER_H
-+#define _ALPHA_LOCKMETER_H
-+
-+#include <asm/hwrpb.h>
-+#define CPU_CYCLE_FREQUENCY hwrpb->cycle_freq
-+
-+#define get_cycles64() get_cycles()
-+
-+#define THIS_CPU_NUMBER smp_processor_id()
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-+#define local_irq_save(x) \
-+ __save_and_cli(x)
-+#define local_irq_restore(x) \
-+ __restore_flags(x)
-+#endif /* Linux version 2.2.x */
-+
-+#define SPINLOCK_MAGIC_INIT /**/
-+
-+/*
-+ * Macros to cache and retrieve an index value inside of a lock
-+ * these macros assume that there are less than 65536 simultaneous
-+ * (read mode) holders of a rwlock.
-+ * We also assume that the hash table has less than 32767 entries.
-+ * the high order bit is used for write locking a rw_lock
-+ * Note: although these defines and macros are the same as what is being used
-+ * in include/asm-i386/lockmeter.h, they are present here to easily
-+ * allow an alternate Alpha implementation.
-+ */
-+/*
-+ * instrumented spinlock structure -- never used to allocate storage
-+ * only used in macros below to overlay a spinlock_t
-+ */
-+typedef struct inst_spinlock_s {
-+ /* remember, Alpha is little endian */
-+ unsigned short lock;
-+ unsigned short index;
-+} inst_spinlock_t;
-+#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
-+#define GET_INDEX(lock_ptr) ((inst_spinlock_t *)(lock_ptr))->index
-+
-+/*
-+ * macros to cache and retrieve an index value in a read/write lock
-+ * as well as the cpu where a reader busy period started
-+ * we use the 2nd word (the debug word) for this, so require the
-+ * debug word to be present
-+ */
-+/*
-+ * instrumented rwlock structure -- never used to allocate storage
-+ * only used in macros below to overlay a rwlock_t
-+ */
-+typedef struct inst_rwlock_s {
-+ volatile int lock;
-+ unsigned short index;
-+ unsigned short cpu;
-+} inst_rwlock_t;
-+#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
-+#define GET_RWINDEX(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->index
-+#define PUT_RW_CPU(rwlock_ptr,cpuv) ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
-+#define GET_RW_CPU(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->cpu
-+
-+/*
-+ * return true if rwlock is write locked
-+ * (note that other lock attempts can cause the lock value to be negative)
-+ */
-+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) (((inst_rwlock_t *)rwlock_ptr)->lock & 1)
-+#define IABS(x) ((x) > 0 ? (x) : -(x))
-+
-+#define RWLOCK_READERS(rwlock_ptr) rwlock_readers(rwlock_ptr)
-+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
-+{
-+ int tmp = (int) ((inst_rwlock_t *)rwlock_ptr)->lock;
-+ /* readers subtract 2, so we have to: */
-+ /* - andnot off a possible writer (bit 0) */
-+ /* - get the absolute value */
-+ /* - divide by 2 (right shift by one) */
-+ /* to find the number of readers */
-+ if (tmp == 0) return(0);
-+ else return(IABS(tmp & ~1)>>1);
-+}
-+
-+#endif /* _ALPHA_LOCKMETER_H */
---- linux-2.6.0/include/asm-alpha/spinlock.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-alpha/spinlock.h 2003-12-28 23:26:33.000000000 -0800
-@@ -6,6 +6,10 @@
- #include <linux/kernel.h>
- #include <asm/current.h>
-
-+#ifdef CONFIG_LOCKMETER
-+#undef DEBUG_SPINLOCK
-+#undef DEBUG_RWLOCK
-+#endif
-
- /*
- * Simple spin lock operations. There are two variants, one clears IRQ's
-@@ -95,9 +99,18 @@ static inline int _raw_spin_trylock(spin
-
- typedef struct {
- volatile int write_lock:1, read_counter:31;
-+#ifdef CONFIG_LOCKMETER
-+ /* required for LOCKMETER since all bits in lock are used */
-+ /* need this storage for CPU and lock INDEX ............. */
-+ unsigned magic;
-+#endif
- } /*__attribute__((aligned(32)))*/ rwlock_t;
-
-+#ifdef CONFIG_LOCKMETER
-+#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
-+#else
- #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
-+#endif
-
- #define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
- #define rwlock_is_locked(x) (*(volatile int *)(x) != 0)
-@@ -169,4 +182,41 @@ static inline void _raw_read_unlock(rwlo
- : "m" (*lock) : "memory");
- }
-
-+#ifdef CONFIG_LOCKMETER
-+static inline int _raw_write_trylock(rwlock_t *lock)
-+{
-+ long temp,result;
-+
-+ __asm__ __volatile__(
-+ " ldl_l %1,%0\n"
-+ " mov $31,%2\n"
-+ " bne %1,1f\n"
-+ " or $31,1,%2\n"
-+ " stl_c %2,%0\n"
-+ "1: mb\n"
-+ : "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
-+ : "m" (*(volatile int *)lock)
-+ );
-+
-+ return (result);
-+}
-+
-+static inline int _raw_read_trylock(rwlock_t *lock)
-+{
-+ unsigned long temp,result;
-+
-+ __asm__ __volatile__(
-+ " ldl_l %1,%0\n"
-+ " mov $31,%2\n"
-+ " blbs %1,1f\n"
-+ " subl %1,2,%2\n"
-+ " stl_c %2,%0\n"
-+ "1: mb\n"
-+ : "=m" (*(volatile int *)lock), "=&r" (temp), "=&r" (result)
-+ : "m" (*(volatile int *)lock)
-+ );
-+ return (result);
-+}
-+#endif /* CONFIG_LOCKMETER */
-+
- #endif /* _ALPHA_SPINLOCK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-arm26/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_ARM26_CPUMASK_H
-+#define _ASM_ARM26_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_ARM26_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-arm/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_ARM_CPUMASK_H
-+#define _ASM_ARM_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_ARM_CPUMASK_H */
---- linux-2.6.0/include/asm-cris/arch-v10/byteorder.h 2003-07-10 18:50:32.000000000 -0700
-+++ 25/include/asm-cris/arch-v10/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -2,20 +2,21 @@
- #define _CRIS_ARCH_BYTEORDER_H
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- /* we just define these two (as we can do the swap in a single
- * asm instruction in CRIS) and the arch-independent files will put
- * them together into ntohl etc.
- */
-
--extern __inline__ __const__ __u32 ___arch__swab32(__u32 x)
-+extern __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
- {
- __asm__ ("swapwb %0" : "=r" (x) : "0" (x));
-
- return(x);
- }
-
--extern __inline__ __const__ __u16 ___arch__swab16(__u16 x)
-+extern __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
- {
- __asm__ ("swapb %0" : "=r" (x) : "0" (x));
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-cris/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_CRIS_CPUMASK_H
-+#define _ASM_CRIS_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_CRIS_CPUMASK_H */
---- linux-2.6.0/include/asm-generic/cpumask_arith.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-generic/cpumask_arith.h 2003-12-28 23:22:10.000000000 -0800
-@@ -17,6 +17,7 @@
- #define cpus_complement(map) do { map = ~(map); } while (0)
- #define cpus_equal(map1, map2) ((map1) == (map2))
- #define cpus_empty(map) ((map) == 0)
-+#define cpus_addr(map) (&(map))
-
- #if BITS_PER_LONG == 32
- #define cpus_weight(map) hweight32(map)
---- linux-2.6.0/include/asm-generic/cpumask_array.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-generic/cpumask_array.h 2003-12-28 23:22:10.000000000 -0800
-@@ -20,6 +20,7 @@
- #define cpus_complement(map) bitmap_complement((map).mask, NR_CPUS)
- #define cpus_equal(map1, map2) bitmap_equal((map1).mask, (map2).mask, NR_CPUS)
- #define cpus_empty(map) bitmap_empty(map.mask, NR_CPUS)
-+#define cpus_addr(map) ((map).mask)
- #define cpus_weight(map) bitmap_weight((map).mask, NR_CPUS)
- #define cpus_shift_right(d, s, n) bitmap_shift_right((d).mask, (s).mask, n, NR_CPUS)
- #define cpus_shift_left(d, s, n) bitmap_shift_left((d).mask, (s).mask, n, NR_CPUS)
---- linux-2.6.0/include/asm-generic/cpumask_const_value.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-generic/cpumask_const_value.h 2003-12-28 23:22:02.000000000 -0800
-@@ -3,7 +3,7 @@
-
- typedef const cpumask_t cpumask_const_t;
-
--#define mk_cpumask_const(map) ((cpumask_const_t)(map))
-+#define mk_cpumask_const(map) (map)
- #define cpu_isset_const(cpu, map) cpu_isset(cpu, map)
- #define cpus_and_const(dst,src1,src2) cpus_and(dst, src1, src2)
- #define cpus_or_const(dst,src1,src2) cpus_or(dst, src1, src2)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-generic/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,40 @@
-+#ifndef __ASM_GENERIC_CPUMASK_H
-+#define __ASM_GENERIC_CPUMASK_H
-+
-+#include <linux/config.h>
-+#include <linux/kernel.h>
-+#include <linux/threads.h>
-+#include <linux/types.h>
-+#include <linux/bitmap.h>
-+
-+#if NR_CPUS > BITS_PER_LONG && NR_CPUS != 1
-+#define CPU_ARRAY_SIZE BITS_TO_LONGS(NR_CPUS)
-+
-+struct cpumask
-+{
-+ unsigned long mask[CPU_ARRAY_SIZE];
-+};
-+
-+typedef struct cpumask cpumask_t;
-+
-+#else
-+typedef unsigned long cpumask_t;
-+#endif
-+
-+#ifdef CONFIG_SMP
-+#if NR_CPUS > BITS_PER_LONG
-+#include <asm-generic/cpumask_array.h>
-+#else
-+#include <asm-generic/cpumask_arith.h>
-+#endif
-+#else
-+#include <asm-generic/cpumask_up.h>
-+#endif
-+
-+#if NR_CPUS <= 4*BITS_PER_LONG
-+#include <asm-generic/cpumask_const_value.h>
-+#else
-+#include <asm-generic/cpumask_const_reference.h>
-+#endif
-+
-+#endif /* __ASM_GENERIC_CPUMASK_H */
---- linux-2.6.0/include/asm-generic/cpumask_up.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-generic/cpumask_up.h 2003-12-28 23:22:10.000000000 -0800
-@@ -33,6 +33,7 @@
-
- #define cpus_equal(map1, map2) (cpus_coerce(map1) == cpus_coerce(map2))
- #define cpus_empty(map) (cpus_coerce(map) == 0UL)
-+#define cpus_addr(map) (&(map))
- #define cpus_weight(map) (cpus_coerce(map) ? 1UL : 0UL)
- #define cpus_shift_right(d, s, n) do { cpus_coerce(d) = 0UL; } while (0)
- #define cpus_shift_left(d, s, n) do { cpus_coerce(d) = 0UL; } while (0)
---- linux-2.6.0/include/asm-generic/statfs.h 2003-06-22 12:04:45.000000000 -0700
-+++ 25/include/asm-generic/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -34,4 +34,18 @@ struct statfs64 {
- __u32 f_spare[5];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+};
-+
- #endif
---- linux-2.6.0/include/asm-h8300/bitops.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-h8300/bitops.h 2003-12-28 23:22:56.000000000 -0800
-@@ -23,25 +23,22 @@
- */
- static __inline__ unsigned long ffz(unsigned long word)
- {
-- register unsigned long result asm("er0");
-- register unsigned long _word asm("er1");
-+ unsigned long result;
-
-- _word = word;
-- __asm__("sub.l %0,%0\n\t"
-- "dec.l #1,%0\n"
-- "1:\n\t"
-- "shlr.l %1\n\t"
-+ result = -1;
-+ __asm__("1:\n\t"
-+ "shlr.l %2\n\t"
- "adds #1,%0\n\t"
- "bcs 1b"
-- : "=r" (result) : "r" (_word));
-+ : "=r" (result)
-+ : "0" (result),"r" (word));
- return result;
- }
-
- static __inline__ void set_bit(int nr, volatile unsigned long* addr)
- {
- volatile unsigned char *b_addr;
-- b_addr = &(((volatile unsigned char *) addr)
-- [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
-+ b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
- __asm__("mov.l %1,er0\n\t"
- "bset r0l,%0"
- :"+m"(*b_addr)
-@@ -61,8 +58,7 @@ static __inline__ void set_bit(int nr, v
- static __inline__ void clear_bit(int nr, volatile unsigned long* addr)
- {
- volatile unsigned char *b_addr;
-- b_addr = &(((volatile unsigned char *) addr)
-- [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
-+ b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
- __asm__("mov.l %1,er0\n\t"
- "bclr r0l,%0"
- :"+m"(*b_addr)
-@@ -75,8 +71,7 @@ static __inline__ void clear_bit(int nr,
- static __inline__ void change_bit(int nr, volatile unsigned long* addr)
- {
- volatile unsigned char *b_addr;
-- b_addr = &(((volatile unsigned char *) addr)
-- [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)]);
-+ b_addr = (volatile unsigned char *)addr + ((nr >> 3) ^ 3);
- __asm__("mov.l %1,er0\n\t"
- "bnot r0l,%0"
- :"+m"(*b_addr)
-@@ -88,22 +83,18 @@ static __inline__ void change_bit(int nr
-
- static __inline__ int test_bit(int nr, const unsigned long* addr)
- {
-- return ((1UL << (nr & 7)) &
-- (((const volatile unsigned char *) addr)
-- [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)])) != 0;
-+ return (*((volatile unsigned char *)addr + ((nr >> 3) ^ 3)) & (1UL << (nr & 7))) != 0;
- }
-
- #define __test_bit(nr, addr) test_bit(nr, addr)
-
- static __inline__ int test_and_set_bit(int nr, volatile unsigned long* addr)
- {
-- register int retval __asm__("er0");
-+ int retval = 0;
- volatile unsigned char *a;
-- a = (volatile unsigned char *)addr;
-
-- a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-- __asm__("mov.l %2,er3\n\t"
-- "sub.l %0,%0\n\t"
-+ a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3); \
-+ __asm__("mov.l %4,er3\n\t"
- "stc ccr,r3h\n\t"
- "orc #0x80,ccr\n\t"
- "btst r3l,%1\n\t"
-@@ -112,37 +103,35 @@ static __inline__ int test_and_set_bit(i
- "inc.l #1,%0\n\t"
- "1:"
- "ldc r3h,ccr"
-- : "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
-+ : "=r"(retval),"+m"(*a)
-+ : "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
- return retval;
- }
-
- static __inline__ int __test_and_set_bit(int nr, volatile unsigned long* addr)
- {
-- register int retval __asm__("er0");
-+ int retval = 0;
- volatile unsigned char *a;
-- a = (volatile unsigned char *)addr;
-
-- a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-- __asm__("mov.l %2,er3\n\t"
-- "sub.l %0,%0\n\t"
-+ a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3); \
-+ __asm__("mov.l %4,er3\n\t"
- "btst r3l,%1\n\t"
- "bset r3l,%1\n\t"
- "beq 1f\n\t"
- "inc.l #1,%0\n\t"
- "1:"
-- : "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
-+ : "=r"(retval),"+m"(*a)
-+ : "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
- return retval;
- }
-
- static __inline__ int test_and_clear_bit(int nr, volatile unsigned long* addr)
- {
-- register int retval __asm__("er0");
-+ int retval = 0;
- volatile unsigned char *a;
-- a = (volatile unsigned char *)addr;
-
-- a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-- __asm__("mov.l %2,er3\n\t"
-- "sub.l %0,%0\n\t"
-+ a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3); \
-+ __asm__("mov.l %4,er3\n\t"
- "stc ccr,r3h\n\t"
- "orc #0x80,ccr\n\t"
- "btst r3l,%1\n\t"
-@@ -151,37 +140,35 @@ static __inline__ int test_and_clear_bit
- "inc.l #1,%0\n\t"
- "1:"
- "ldc r3h,ccr"
-- : "=r"(retval),"=m"(*a) :"g"(nr & 7):"er3","memory");
-+ : "=r"(retval),"+m"(*a)
-+ : "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
- return retval;
- }
-
- static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long* addr)
- {
-- register int retval __asm__("er0");
-+ int retval = 0;
- volatile unsigned char *a;
-- a = (volatile unsigned char *)addr;
-
-- a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-- __asm__("mov.l %2,er3\n\t"
-- "sub.l %0,%0\n\t"
-+ a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3); \
-+ __asm__("mov.l %4,er3\n\t"
- "btst r3l,%1\n\t"
- "bclr r3l,%1\n\t"
- "beq 1f\n\t"
- "inc.l #1,%0\n\t"
- "1:"
-- : "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
-+ : "=r"(retval),"+m"(*a)
-+ : "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
- return retval;
- }
-
- static __inline__ int test_and_change_bit(int nr, volatile unsigned long* addr)
- {
-- register int retval __asm__("er0");
-+ int retval = 0;
- volatile unsigned char *a;
-- a = (volatile unsigned char *)addr;
-
-- a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-- __asm__("mov.l %2,er3\n\t"
-- "sub.l %0,%0\n\t"
-+ a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3); \
-+ __asm__("mov.l %4,er3\n\t"
- "stc ccr,r3h\n\t"
- "orc #0x80,ccr\n\t"
- "btst r3l,%1\n\t"
-@@ -190,25 +177,25 @@ static __inline__ int test_and_change_bi
- "inc.l #1,%0\n\t"
- "1:"
- "ldc r3h,ccr"
-- : "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
-+ : "=r"(retval),"+m"(*a)
-+ : "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
- return retval;
- }
-
- static __inline__ int __test_and_change_bit(int nr, volatile unsigned long* addr)
- {
-- register int retval __asm__("er0");
-+ int retval = 0;
- volatile unsigned char *a;
-- a = (volatile unsigned char *)addr;
-
-- a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
-- __asm__("mov.l %2,er3\n\t"
-- "sub.l %0,%0\n\t"
-+ a = (volatile unsigned char *)addr += ((nr >> 3) ^ 3); \
-+ __asm__("mov.l %4,er3\n\t"
- "btst r3l,%1\n\t"
- "bnot r3l,%1\n\t"
- "beq 1f\n\t"
- "inc.l #1,%0\n\t"
- "1:"
-- : "=r"(retval),"+m"(*a) :"g"(nr & 7):"er3","memory");
-+ : "=r"(retval),"+m"(*a)
-+ : "0" (retval),"m" (*a),"g"(nr & 7):"er3","memory");
- return retval;
- }
-
-@@ -251,27 +238,21 @@ found_middle:
- return result + ffz(tmp);
- }
-
--static __inline__ unsigned long ffs(unsigned long word)
-+static __inline__ unsigned long __ffs(unsigned long word)
- {
-- register unsigned long result asm("er0");
-- register unsigned long _word asm("er1");
-+ unsigned long result;
-
-- _word = word;
-- __asm__("sub.l %0,%0\n\t"
-- "dec.l #1,%0\n"
-- "1:\n\t"
-- "shlr.l %1\n\t"
-+ result = -1;
-+ __asm__("1:\n\t"
-+ "shlr.l %2\n\t"
- "adds #1,%0\n\t"
- "bcc 1b"
-- : "=r" (result) : "r"(_word));
-+ : "=r" (result)
-+ : "0"(result),"r"(word));
- return result;
- }
-
--#define __ffs(x) ffs(x)
--
--/*
-- * fls: find last bit set.
-- */
-+#define ffs(x) generic_ffs(x)
- #define fls(x) generic_fls(x)
-
- /*
-@@ -316,6 +297,7 @@ static __inline__ int ext2_set_bit(int n
- local_irq_restore(flags);
- return retval;
- }
-+#define ext2_set_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr)
-
- static __inline__ int ext2_clear_bit(int nr, volatile void * addr)
- {
-@@ -331,6 +313,7 @@ static __inline__ int ext2_clear_bit(int
- local_irq_restore(flags);
- return retval;
- }
-+#define ext2_clear_bit_atomic(lock, nr, addr) ext2_set_bit(nr, addr)
-
- static __inline__ int ext2_test_bit(int nr, const volatile void * addr)
- {
-@@ -402,17 +385,6 @@ found_middle:
- #define minix_test_bit(nr,addr) test_bit(nr,addr)
- #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size)
-
--/**
-- * hweightN - returns the hamming weight of a N-bit word
-- * @x: the word to weigh
-- *
-- * The Hamming Weight of a number is the total number of bits set in it.
-- */
--
--#define hweight32(x) generic_hweight32(x)
--#define hweight16(x) generic_hweight16(x)
--#define hweight8(x) generic_hweight8(x)
--
- #endif /* __KERNEL__ */
-
- #endif /* _H8300_BITOPS_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-h8300/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_H8300_CPUMASK_H
-+#define _ASM_H8300_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_H8300_CPUMASK_H */
---- linux-2.6.0/include/asm-i386/acpi.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-i386/acpi.h 2003-12-28 23:21:33.000000000 -0800
-@@ -109,7 +109,7 @@
- #ifdef CONFIG_ACPI_BOOT
- extern int acpi_lapic;
- extern int acpi_ioapic;
--
-+extern int acpi_noirq;
-
- /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
- #define FIX_ACPI_PAGES 4
-@@ -139,6 +139,14 @@ static inline void disable_ioapic_setup(
-
- #endif
-
-+#ifdef CONFIG_ACPI_PCI
-+static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
-+extern int acpi_irq_balance_set(char *str);
-+#else
-+static inline void acpi_noirq_set(void) { }
-+static inline int acpi_irq_balance_set(char *str) { return 0; }
-+#endif
-+
- #ifdef CONFIG_ACPI_SLEEP
-
- /* routines for saving/restoring kernel state */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-i386/atomic_kmap.h 2003-12-28 23:26:36.000000000 -0800
-@@ -0,0 +1,95 @@
-+/*
-+ * atomic_kmap.h: temporary virtual kernel memory mappings
-+ *
-+ * Copyright (C) 2003 Ingo Molnar <mingo@redhat.com>
-+ */
-+
-+#ifndef _ASM_ATOMIC_KMAP_H
-+#define _ASM_ATOMIC_KMAP_H
-+
-+#ifdef __KERNEL__
-+
-+#include <linux/config.h>
-+#include <asm/tlbflush.h>
-+
-+#ifdef CONFIG_DEBUG_HIGHMEM
-+#define HIGHMEM_DEBUG 1
-+#else
-+#define HIGHMEM_DEBUG 0
-+#endif
-+
-+extern pte_t *kmap_pte;
-+#define kmap_prot PAGE_KERNEL
-+
-+#define PKMAP_BASE (0xff000000UL)
-+#define NR_SHARED_PMDS ((0xffffffff-PKMAP_BASE+1)/PMD_SIZE)
-+
-+static inline unsigned long __kmap_atomic_vaddr(enum km_type type)
-+{
-+ enum fixed_addresses idx;
-+
-+ idx = type + KM_TYPE_NR*smp_processor_id();
-+ return __fix_to_virt(FIX_KMAP_BEGIN + idx);
-+}
-+
-+static inline void *__kmap_atomic_noflush(struct page *page, enum km_type type)
-+{
-+ enum fixed_addresses idx;
-+ unsigned long vaddr;
-+
-+ idx = type + KM_TYPE_NR*smp_processor_id();
-+ vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-+ /*
-+ * NOTE: entries that rely on some secondary TLB-flush
-+ * effect must not be global:
-+ */
-+ set_pte(kmap_pte-idx, mk_pte(page, PAGE_KERNEL));
-+
-+ return (void*) vaddr;
-+}
-+
-+static inline void *__kmap_atomic(struct page *page, enum km_type type)
-+{
-+ enum fixed_addresses idx;
-+ unsigned long vaddr;
-+
-+ idx = type + KM_TYPE_NR*smp_processor_id();
-+ vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-+#if HIGHMEM_DEBUG
-+ BUG_ON(!pte_none(*(kmap_pte-idx)));
-+#else
-+ /*
-+ * Performance optimization - do not flush if the new
-+ * pte is the same as the old one:
-+ */
-+ if (pte_val(*(kmap_pte-idx)) == pte_val(mk_pte(page, kmap_prot)))
-+ return (void *) vaddr;
-+#endif
-+ set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
-+ __flush_tlb_one(vaddr);
-+
-+ return (void*) vaddr;
-+}
-+
-+static inline void __kunmap_atomic(void *kvaddr, enum km_type type)
-+{
-+#if HIGHMEM_DEBUG
-+ unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-+ enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
-+
-+ BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx));
-+ /*
-+ * force other mappings to Oops if they'll try to access
-+ * this pte without first remap it
-+ */
-+ pte_clear(kmap_pte-idx);
-+ __flush_tlb_one(vaddr);
-+#endif
-+}
-+
-+#define __kunmap_atomic_type(type) \
-+ __kunmap_atomic((void *)__kmap_atomic_vaddr(type), (type))
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _ASM_ATOMIC_KMAP_H */
---- linux-2.6.0/include/asm-i386/bugs.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/bugs.h 2003-12-28 23:21:07.000000000 -0800
-@@ -1,11 +1,11 @@
- /*
- * include/asm-i386/bugs.h
- *
-- * Copyright (C) 1994 Linus Torvalds
-+ * Copyright (C) 1994 Linus Torvalds
- *
- * Cyrix stuff, June 1998 by:
- * - Rafael R. Reilova (moved everything from head.S),
-- * <rreilova@ececs.uc.edu>
-+ * <rreilova@ececs.uc.edu>
- * - Channing Corn (tests & fixes),
- * - Andrew D. Balsa (code cleanup).
- *
-@@ -25,7 +25,20 @@
- #include <asm/processor.h>
- #include <asm/i387.h>
- #include <asm/msr.h>
--
-+#ifdef CONFIG_KGDB
-+/*
-+ * Provied the command line "gdb" initial break
-+ */
-+int __init kgdb_initial_break(char * str)
-+{
-+ if (*str == '\0'){
-+ breakpoint();
-+ return 1;
-+ }
-+ return 0;
-+}
-+__setup("gdb",kgdb_initial_break);
-+#endif
- static int __init no_halt(char *s)
- {
- boot_cpu_data.hlt_works_ok = 0;
-@@ -140,7 +153,7 @@ static void __init check_popad(void)
- : "ecx", "edi" );
- /* If this fails, it means that any user program may lock the CPU hard. Too bad. */
- if (res != 12345678) printk( "Buggy.\n" );
-- else printk( "OK.\n" );
-+ else printk( "OK.\n" );
- #endif
- }
-
---- linux-2.6.0/include/asm-i386/byteorder.h 2003-06-14 12:18:23.000000000 -0700
-+++ 25/include/asm-i386/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -2,6 +2,7 @@
- #define _I386_BYTEORDER_H
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
-
-@@ -10,7 +11,7 @@
- #include <linux/config.h>
- #endif
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
- {
- #ifdef CONFIG_X86_BSWAP
- __asm__("bswap %0" : "=r" (x) : "0" (x));
-@@ -24,18 +25,7 @@ static __inline__ __const__ __u32 ___arc
- return x;
- }
-
--/* gcc should generate this for open coded C now too. May be worth switching to
-- it because inline assembly cannot be scheduled. -AK */
--static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
--{
-- __asm__("xchgb %b0,%h0" /* swap bytes */
-- : "=q" (x)
-- : "0" (x));
-- return x;
--}
--
--
--static inline __u64 ___arch__swab64(__u64 val)
-+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 val)
- {
- union {
- struct { __u32 a,b; } s;
-@@ -54,9 +44,11 @@ static inline __u64 ___arch__swab64(__u6
- return v.u;
- }
-
-+/* Do not define swab16. Gcc is smart enough to recognize "C" version and
-+ convert it into rotation or exhange. */
-+
- #define __arch__swab64(x) ___arch__swab64(x)
- #define __arch__swab32(x) ___arch__swab32(x)
--#define __arch__swab16(x) ___arch__swab16(x)
-
- #define __BYTEORDER_HAS_U64__
-
---- linux-2.6.0/include/asm-i386/checksum.h 2003-11-23 19:03:01.000000000 -0800
-+++ 25/include/asm-i386/checksum.h 2003-12-28 23:26:36.000000000 -0800
-@@ -25,7 +25,7 @@ asmlinkage unsigned int csum_partial(con
- * better 64-bit) boundary
- */
-
--asmlinkage unsigned int csum_partial_copy_generic( const char *src, char *dst, int len, int sum,
-+asmlinkage unsigned int direct_csum_partial_copy_generic( const char *src, char *dst, int len, int sum,
- int *src_err_ptr, int *dst_err_ptr);
-
- /*
-@@ -39,14 +39,19 @@ static __inline__
- unsigned int csum_partial_copy_nocheck ( const char *src, char *dst,
- int len, int sum)
- {
-- return csum_partial_copy_generic ( src, dst, len, sum, NULL, NULL);
-+ /*
-+ * The direct function is OK for kernel-space => kernel-space copies:
-+ */
-+ return direct_csum_partial_copy_generic ( src, dst, len, sum, NULL, NULL);
- }
-
- static __inline__
- unsigned int csum_partial_copy_from_user ( const char *src, char *dst,
- int len, int sum, int *err_ptr)
- {
-- return csum_partial_copy_generic ( src, dst, len, sum, err_ptr, NULL);
-+ if (copy_from_user(dst, src, len))
-+ *err_ptr = -EFAULT;
-+ return csum_partial(dst, len, sum);
- }
-
- /*
-@@ -172,11 +177,26 @@ static __inline__ unsigned short int csu
- * Copy and checksum to user
- */
- #define HAVE_CSUM_COPY_USER
--static __inline__ unsigned int csum_and_copy_to_user(const char *src, char *dst,
-+static __inline__ unsigned int direct_csum_and_copy_to_user(const char *src, char *dst,
- int len, int sum, int *err_ptr)
- {
- if (access_ok(VERIFY_WRITE, dst, len))
-- return csum_partial_copy_generic(src, dst, len, sum, NULL, err_ptr);
-+ return direct_csum_partial_copy_generic(src, dst, len, sum, NULL, err_ptr);
-+
-+ if (len)
-+ *err_ptr = -EFAULT;
-+
-+ return -1; /* invalid checksum */
-+}
-+
-+static __inline__ unsigned int csum_and_copy_to_user(const char *src, char *dst,
-+ int len, int sum, int *err_ptr)
-+{
-+ if (access_ok(VERIFY_WRITE, dst, len)) {
-+ if (copy_to_user(dst, src, len))
-+ *err_ptr = -EFAULT;
-+ return csum_partial(src, len, sum);
-+ }
-
- if (len)
- *err_ptr = -EFAULT;
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-i386/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_I386_CPUMASK_H
-+#define _ASM_I386_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_I386_CPUMASK_H */
---- linux-2.6.0/include/asm-i386/desc.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/desc.h 2003-12-28 23:26:36.000000000 -0800
-@@ -21,6 +21,13 @@ struct Xgt_desc_struct {
-
- extern struct Xgt_desc_struct idt_descr, cpu_gdt_descr[NR_CPUS];
-
-+extern void trap_init_virtual_IDT(void);
-+extern void trap_init_virtual_GDT(void);
-+
-+asmlinkage int system_call(void);
-+asmlinkage void lcall7(void);
-+asmlinkage void lcall27(void);
-+
- #define load_TR_desc() __asm__ __volatile__("ltr %%ax"::"a" (GDT_ENTRY_TSS*8))
- #define load_LDT_desc() __asm__ __volatile__("lldt %%ax"::"a" (GDT_ENTRY_LDT*8))
-
-@@ -30,6 +37,7 @@ extern struct Xgt_desc_struct idt_descr,
- */
- extern struct desc_struct default_ldt[];
- extern void set_intr_gate(unsigned int irq, void * addr);
-+extern void set_trap_gate(unsigned int n, void *addr);
-
- #define _set_tssldt_desc(n,addr,limit,type) \
- __asm__ __volatile__ ("movw %w3,0(%2)\n\t" \
-@@ -90,31 +98,8 @@ static inline void load_TLS(struct threa
- #undef C
- }
-
--static inline void clear_LDT(void)
--{
-- int cpu = get_cpu();
--
-- set_ldt_desc(cpu, &default_ldt[0], 5);
-- load_LDT_desc();
-- put_cpu();
--}
--
--/*
-- * load one particular LDT into the current CPU
-- */
--static inline void load_LDT_nolock(mm_context_t *pc, int cpu)
--{
-- void *segments = pc->ldt;
-- int count = pc->size;
--
-- if (likely(!count)) {
-- segments = &default_ldt[0];
-- count = 5;
-- }
--
-- set_ldt_desc(cpu, segments, count);
-- load_LDT_desc();
--}
-+extern struct page *default_ldt_page;
-+extern void load_LDT_nolock(mm_context_t *pc, int cpu);
-
- static inline void load_LDT(mm_context_t *pc)
- {
-@@ -123,6 +108,6 @@ static inline void load_LDT(mm_context_t
- put_cpu();
- }
-
--#endif /* !__ASSEMBLY__ */
-
-+#endif /* !__ASSEMBLY__ */
- #endif
---- linux-2.6.0/include/asm-i386/fixmap.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/fixmap.h 2003-12-28 23:26:36.000000000 -0800
-@@ -18,17 +18,15 @@
- #include <asm/acpi.h>
- #include <asm/apicdef.h>
- #include <asm/page.h>
--#ifdef CONFIG_HIGHMEM
- #include <linux/threads.h>
- #include <asm/kmap_types.h>
--#endif
-
- /*
- * Here we define all the compile-time 'special' virtual
- * addresses. The point is to have a constant address at
- * compile time, but to set the physical address only
-- * in the boot process. We allocate these special addresses
-- * from the end of virtual memory (0xfffff000) backwards.
-+ * in the boot process. We allocate these special addresses
-+ * from the end of virtual memory (0xffffe000) backwards.
- * Also this lets us do fail-safe vmalloc(), we
- * can guarantee that these special addresses and
- * vmalloc()-ed addresses never overlap.
-@@ -41,11 +39,20 @@
- * TLB entries of such buffers will not be flushed across
- * task switches.
- */
-+
-+/*
-+ * on UP currently we will have no trace of the fixmap mechanizm,
-+ * no page table allocations, etc. This might change in the
-+ * future, say framebuffers for the console driver(s) could be
-+ * fix-mapped?
-+ */
- enum fixed_addresses {
- FIX_HOLE,
- FIX_VSYSCALL,
- #ifdef CONFIG_X86_LOCAL_APIC
- FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
-+#else
-+ FIX_VSTACK_HOLE_1,
- #endif
- #ifdef CONFIG_X86_IO_APIC
- FIX_IO_APIC_BASE_0,
-@@ -57,16 +64,21 @@ enum fixed_addresses {
- FIX_LI_PCIA, /* Lithium PCI Bridge A */
- FIX_LI_PCIB, /* Lithium PCI Bridge B */
- #endif
--#ifdef CONFIG_X86_F00F_BUG
-- FIX_F00F_IDT, /* Virtual mapping for IDT */
--#endif
-+ FIX_IDT,
-+ FIX_GDT_1,
-+ FIX_GDT_0,
-+ FIX_TSS_3,
-+ FIX_TSS_2,
-+ FIX_TSS_1,
-+ FIX_TSS_0,
-+ FIX_ENTRY_TRAMPOLINE_1,
-+ FIX_ENTRY_TRAMPOLINE_0,
- #ifdef CONFIG_X86_CYCLONE_TIMER
- FIX_CYCLONE_TIMER, /*cyclone timer register*/
-+ FIX_VSTACK_HOLE_2,
- #endif
--#ifdef CONFIG_HIGHMEM
- FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
- FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
--#endif
- #ifdef CONFIG_ACPI_BOOT
- FIX_ACPI_BEGIN,
- FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
-@@ -95,12 +107,15 @@ extern void __set_fixmap (enum fixed_add
- __set_fixmap(idx, 0, __pgprot(0))
-
- /*
-- * used by vmalloc.c.
-+ * used by vmalloc.c and various other places.
- *
- * Leave one empty page between vmalloc'ed areas and
- * the start of the fixmap.
-+ *
-+ * IMPORTANT: dont change FIXADDR_TOP without adjusting KM_VSTACK0
-+ * and KM_VSTACK1 so that the virtual stack is 8K aligned.
- */
--#define FIXADDR_TOP (0xfffff000UL)
-+#define FIXADDR_TOP (0xffffe000UL)
- #define __FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
- #define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
-
---- linux-2.6.0/include/asm-i386/genapic.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-i386/genapic.h 2003-12-28 23:21:32.000000000 -0800
-@@ -45,6 +45,7 @@ struct genapic {
- void (*setup_portio_remap)(void);
- int (*check_phys_apicid_present)(int boot_cpu_physical_apicid);
- void (*enable_apic_mode)(void);
-+ u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb);
-
- /* mpparse */
- void (*mpc_oem_bus_info)(struct mpc_config_bus *, char *,
-@@ -105,6 +106,7 @@ struct genapic {
- APICFUNC(send_IPI_allbutself), \
- APICFUNC(send_IPI_all), \
- APICFUNC(enable_apic_mode), \
-+ APICFUNC(phys_pkg_id), \
- }
-
- extern struct genapic *genapic;
---- linux-2.6.0/include/asm-i386/highmem.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/highmem.h 2003-12-28 23:26:36.000000000 -0800
-@@ -25,26 +25,19 @@
- #include <linux/threads.h>
- #include <asm/kmap_types.h>
- #include <asm/tlbflush.h>
-+#include <asm/atomic_kmap.h>
-
- /* declarations for highmem.c */
- extern unsigned long highstart_pfn, highend_pfn;
-
--extern pte_t *kmap_pte;
--extern pgprot_t kmap_prot;
- extern pte_t *pkmap_page_table;
--
--extern void kmap_init(void);
-+extern void kmap_init(void) __init;
-
- /*
- * Right now we initialize only a single pte table. It can be extended
- * easily, subsequent pte tables have to be allocated in one physical
- * chunk of RAM.
- */
--#if NR_CPUS <= 32
--#define PKMAP_BASE (0xff800000UL)
--#else
--#define PKMAP_BASE (0xff600000UL)
--#endif
- #ifdef CONFIG_X86_PAE
- #define LAST_PKMAP 512
- #else
---- linux-2.6.0/include/asm-i386/hw_irq.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/hw_irq.h 2003-12-28 23:21:44.000000000 -0800
-@@ -41,6 +41,7 @@ asmlinkage void apic_timer_interrupt(voi
- asmlinkage void error_interrupt(void);
- asmlinkage void spurious_interrupt(void);
- asmlinkage void thermal_interrupt(struct pt_regs);
-+#define platform_legacy_irq(irq) ((irq) < 16)
- #endif
-
- void mask_irq(unsigned int irq);
---- linux-2.6.0/include/asm-i386/io_apic.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/io_apic.h 2003-12-28 23:21:44.000000000 -0800
-@@ -13,6 +13,46 @@
-
- #ifdef CONFIG_X86_IO_APIC
-
-+#ifdef CONFIG_PCI_USE_VECTOR
-+static inline int use_pci_vector(void) {return 1;}
-+static inline void disable_edge_ioapic_vector(unsigned int vector) { }
-+static inline void mask_and_ack_level_ioapic_vector(unsigned int vector) { }
-+static inline void end_edge_ioapic_vector (unsigned int vector) { }
-+#define startup_level_ioapic startup_level_ioapic_vector
-+#define shutdown_level_ioapic mask_IO_APIC_vector
-+#define enable_level_ioapic unmask_IO_APIC_vector
-+#define disable_level_ioapic mask_IO_APIC_vector
-+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_vector
-+#define end_level_ioapic end_level_ioapic_vector
-+#define set_ioapic_affinity set_ioapic_affinity_vector
-+
-+#define startup_edge_ioapic startup_edge_ioapic_vector
-+#define shutdown_edge_ioapic disable_edge_ioapic_vector
-+#define enable_edge_ioapic unmask_IO_APIC_vector
-+#define disable_edge_ioapic disable_edge_ioapic_vector
-+#define ack_edge_ioapic ack_edge_ioapic_vector
-+#define end_edge_ioapic end_edge_ioapic_vector
-+#else
-+static inline int use_pci_vector(void) {return 0;}
-+static inline void disable_edge_ioapic_irq(unsigned int irq) { }
-+static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { }
-+static inline void end_edge_ioapic_irq (unsigned int irq) { }
-+#define startup_level_ioapic startup_level_ioapic_irq
-+#define shutdown_level_ioapic mask_IO_APIC_irq
-+#define enable_level_ioapic unmask_IO_APIC_irq
-+#define disable_level_ioapic mask_IO_APIC_irq
-+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_irq
-+#define end_level_ioapic end_level_ioapic_irq
-+#define set_ioapic_affinity set_ioapic_affinity_irq
-+
-+#define startup_edge_ioapic startup_edge_ioapic_irq
-+#define shutdown_edge_ioapic disable_edge_ioapic_irq
-+#define enable_edge_ioapic unmask_IO_APIC_irq
-+#define disable_edge_ioapic disable_edge_ioapic_irq
-+#define ack_edge_ioapic ack_edge_ioapic_irq
-+#define end_edge_ioapic end_edge_ioapic_irq
-+#endif
-+
- #define APIC_MISMATCH_DEBUG
-
- #define IO_APIC_BASE(idx) \
-@@ -177,4 +217,6 @@ extern int io_apic_set_pci_routing (int
- #define io_apic_assign_pci_irqs 0
- #endif
-
-+extern int assign_irq_vector(int irq);
-+
- #endif
---- linux-2.6.0/include/asm-i386/ioctl.h 2003-09-08 13:58:59.000000000 -0700
-+++ 25/include/asm-i386/ioctl.h 2003-12-28 23:22:30.000000000 -0800
-@@ -53,7 +53,7 @@
- ((size) << _IOC_SIZESHIFT))
-
- /* provoke compile error for invalid uses of size argument */
--extern int __invalid_size_argument_for_IOC;
-+extern unsigned int __invalid_size_argument_for_IOC;
- #define _IOC_TYPECHECK(t) \
- ((sizeof(t) == sizeof(t[1]) && \
- sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-i386/kgdb.h 2003-12-28 23:21:09.000000000 -0800
-@@ -0,0 +1,69 @@
-+#ifndef __KGDB
-+#define __KGDB
-+
-+/*
-+ * This file should not include ANY others. This makes it usable
-+ * most anywhere without the fear of include order or inclusion.
-+ * Make it so!
-+ *
-+ * This file may be included all the time. It is only active if
-+ * CONFIG_KGDB is defined, otherwise it stubs out all the macros
-+ * and entry points.
-+ */
-+#if defined(CONFIG_KGDB) && !defined(__ASSEMBLY__)
-+
-+extern void breakpoint(void);
-+#define INIT_KGDB_INTS kgdb_enable_ints()
-+
-+#ifndef BREAKPOINT
-+#define BREAKPOINT asm(" int $3")
-+#endif
-+
-+extern void kgdb_schedule_breakpoint(void);
-+extern void kgdb_process_breakpoint(void);
-+
-+extern int kgdb_tty_hook(void);
-+extern int kgdb_eth_hook(void);
-+extern int kgdboe;
-+
-+/*
-+ * GDB debug stub (or any debug stub) can point the 'linux_debug_hook'
-+ * pointer to its routine and it will be entered as the first thing
-+ * when a trap occurs.
-+ *
-+ * Return values are, at present, undefined.
-+ *
-+ * The debug hook routine does not necessarily return to its caller.
-+ * It has the register image and thus may choose to resume execution
-+ * anywhere it pleases.
-+ */
-+struct pt_regs;
-+
-+extern int kgdb_handle_exception(int trapno,
-+ int signo, int err_code, struct pt_regs *regs);
-+extern int in_kgdb(struct pt_regs *regs);
-+
-+#ifdef CONFIG_KGDB_TS
-+void kgdb_tstamp(int line, char *source, int data0, int data1);
-+/*
-+ * This is the time stamp function. The macro adds the source info and
-+ * does a cast on the data to allow most any 32-bit value.
-+ */
-+
-+#define kgdb_ts(data0,data1) kgdb_tstamp(__LINE__,__FILE__,(int)data0,(int)data1)
-+#else
-+#define kgdb_ts(data0,data1)
-+#endif
-+#else /* CONFIG_KGDB && ! __ASSEMBLY__ ,stubs follow... */
-+#ifndef BREAKPOINT
-+#define BREAKPOINT
-+#endif
-+#define kgdb_ts(data0,data1)
-+#define in_kgdb
-+#define kgdb_handle_exception
-+#define breakpoint
-+#define INIT_KGDB_INTS
-+#define kgdb_process_breakpoint() do {} while(0)
-+
-+#endif
-+#endif /* __KGDB */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-i386/kgdb_local.h 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,102 @@
-+#ifndef __KGDB_LOCAL
-+#define ___KGDB_LOCAL
-+#include <linux/config.h>
-+#include <linux/types.h>
-+#include <linux/serial.h>
-+#include <linux/serialP.h>
-+#include <linux/spinlock.h>
-+#include <asm/processor.h>
-+#include <asm/msr.h>
-+#include <asm/kgdb.h>
-+
-+#define PORT 0x3f8
-+#ifdef CONFIG_KGDB_PORT
-+#undef PORT
-+#define PORT CONFIG_KGDB_PORT
-+#endif
-+#define IRQ 4
-+#ifdef CONFIG_KGDB_IRQ
-+#undef IRQ
-+#define IRQ CONFIG_KGDB_IRQ
-+#endif
-+#define SB_CLOCK 1843200
-+#define SB_BASE (SB_CLOCK/16)
-+#define SB_BAUD9600 SB_BASE/9600
-+#define SB_BAUD192 SB_BASE/19200
-+#define SB_BAUD384 SB_BASE/38400
-+#define SB_BAUD576 SB_BASE/57600
-+#define SB_BAUD1152 SB_BASE/115200
-+#ifdef CONFIG_KGDB_9600BAUD
-+#define SB_BAUD SB_BAUD9600
-+#endif
-+#ifdef CONFIG_KGDB_19200BAUD
-+#define SB_BAUD SB_BAUD192
-+#endif
-+#ifdef CONFIG_KGDB_38400BAUD
-+#define SB_BAUD SB_BAUD384
-+#endif
-+#ifdef CONFIG_KGDB_57600BAUD
-+#define SB_BAUD SB_BAUD576
-+#endif
-+#ifdef CONFIG_KGDB_115200BAUD
-+#define SB_BAUD SB_BAUD1152
-+#endif
-+#ifndef SB_BAUD
-+#define SB_BAUD SB_BAUD1152 /* Start with this if not given */
-+#endif
-+
-+#ifndef CONFIG_X86_TSC
-+#undef rdtsc
-+#define rdtsc(a,b) if (a++ > 10000){a = 0; b++;}
-+#undef rdtscll
-+#define rdtscll(s) s++
-+#endif
-+
-+#ifdef _raw_read_unlock /* must use a name that is "define"ed, not an inline */
-+#undef spin_lock
-+#undef spin_trylock
-+#undef spin_unlock
-+#define spin_lock _raw_spin_lock
-+#define spin_trylock _raw_spin_trylock
-+#define spin_unlock _raw_spin_unlock
-+#else
-+#endif
-+#undef spin_unlock_wait
-+#define spin_unlock_wait(x) do { cpu_relax(); barrier();} \
-+ while(spin_is_locked(x))
-+
-+#define SB_IER 1
-+#define SB_MCR UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS
-+
-+#define FLAGS 0
-+#define SB_STATE { \
-+ magic: SSTATE_MAGIC, \
-+ baud_base: SB_BASE, \
-+ port: PORT, \
-+ irq: IRQ, \
-+ flags: FLAGS, \
-+ custom_divisor:SB_BAUD}
-+#define SB_INFO { \
-+ magic: SERIAL_MAGIC, \
-+ port: PORT,0,FLAGS, \
-+ state: &state, \
-+ tty: (struct tty_struct *)&state, \
-+ IER: SB_IER, \
-+ MCR: SB_MCR}
-+extern void putDebugChar(int);
-+/* RTAI support needs us to really stop/start interrupts */
-+
-+#define kgdb_sti() __asm__ __volatile__("sti": : :"memory")
-+#define kgdb_cli() __asm__ __volatile__("cli": : :"memory")
-+#define kgdb_local_save_flags(x) __asm__ __volatile__(\
-+ "pushfl ; popl %0":"=g" (x): /* no input */)
-+#define kgdb_local_irq_restore(x) __asm__ __volatile__(\
-+ "pushl %0 ; popfl": \
-+ /* no output */ :"g" (x):"memory", "cc")
-+#define kgdb_local_irq_save(x) kgdb_local_save_flags(x); kgdb_cli()
-+
-+#ifdef CONFIG_SERIAL
-+extern void shutdown_for_kgdb(struct async_struct *info);
-+#endif
-+#define INIT_KDEBUG putDebugChar("+");
-+#endif /* __KGDB_LOCAL */
---- linux-2.6.0/include/asm-i386/kmap_types.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/kmap_types.h 2003-12-28 23:26:36.000000000 -0800
-@@ -3,30 +3,36 @@
-
- #include <linux/config.h>
-
--#ifdef CONFIG_DEBUG_HIGHMEM
--# define D(n) __KM_FENCE_##n ,
--#else
--# define D(n)
--#endif
--
- enum km_type {
--D(0) KM_BOUNCE_READ,
--D(1) KM_SKB_SUNRPC_DATA,
--D(2) KM_SKB_DATA_SOFTIRQ,
--D(3) KM_USER0,
--D(4) KM_USER1,
--D(5) KM_BIO_SRC_IRQ,
--D(6) KM_BIO_DST_IRQ,
--D(7) KM_PTE0,
--D(8) KM_PTE1,
--D(9) KM_PTE2,
--D(10) KM_IRQ0,
--D(11) KM_IRQ1,
--D(12) KM_SOFTIRQ0,
--D(13) KM_SOFTIRQ1,
--D(14) KM_TYPE_NR
--};
--
--#undef D
-+ /*
-+ * IMPORTANT: don't move these 3 entries, and only add entries in
-+ * pairs: the 4G/4G virtual stack must be 8K aligned on each cpu.
-+ */
-+ KM_BOUNCE_READ,
-+ KM_VSTACK1,
-+ KM_VSTACK0,
-
-+ KM_LDT_PAGE15,
-+ KM_LDT_PAGE0 = KM_LDT_PAGE15 + 16-1,
-+ KM_USER_COPY,
-+ KM_VSTACK_HOLE,
-+ KM_SKB_SUNRPC_DATA,
-+ KM_SKB_DATA_SOFTIRQ,
-+ KM_USER0,
-+ KM_USER1,
-+ KM_BIO_SRC_IRQ,
-+ KM_BIO_DST_IRQ,
-+ KM_PTE0,
-+ KM_PTE1,
-+ KM_PTE2,
-+ KM_IRQ0,
-+ KM_IRQ1,
-+ KM_SOFTIRQ0,
-+ KM_SOFTIRQ1,
-+ /*
-+ * Add new entries in pairs:
-+ * the 4G/4G virtual stack must be 8K aligned on each cpu.
-+ */
-+ KM_TYPE_NR
-+};
- #endif
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-i386/lockmeter.h 2003-12-28 23:26:35.000000000 -0800
-@@ -0,0 +1,123 @@
-+/*
-+ * Copyright (C) 1999,2000 Silicon Graphics, Inc.
-+ *
-+ * Written by John Hawkes (hawkes@sgi.com)
-+ * Based on klstat.h by Jack Steiner (steiner@sgi.com)
-+ *
-+ * Modified by Ray Bryant (raybry@us.ibm.com)
-+ * Changes Copyright (C) 2000 IBM, Inc.
-+ * Added save of index in spinlock_t to improve efficiency
-+ * of "hold" time reporting for spinlocks.
-+ * Added support for hold time statistics for read and write
-+ * locks.
-+ * Moved machine dependent code here from include/lockmeter.h.
-+ *
-+ */
-+
-+#ifndef _I386_LOCKMETER_H
-+#define _I386_LOCKMETER_H
-+
-+#include <asm/spinlock.h>
-+#include <asm/rwlock.h>
-+
-+#include <linux/version.h>
-+
-+#ifdef __KERNEL__
-+extern unsigned long cpu_khz;
-+#define CPU_CYCLE_FREQUENCY (cpu_khz * 1000)
-+#else
-+#define CPU_CYCLE_FREQUENCY 450000000
-+#endif
-+
-+#define THIS_CPU_NUMBER smp_processor_id()
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-+#define local_irq_save(x) \
-+ __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")
-+
-+#define local_irq_restore(x) \
-+ __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory")
-+#endif /* Linux version 2.2.x */
-+
-+/*
-+ * macros to cache and retrieve an index value inside of a spin lock
-+ * these macros assume that there are less than 65536 simultaneous
-+ * (read mode) holders of a rwlock. Not normally a problem!!
-+ * we also assume that the hash table has less than 65535 entries.
-+ */
-+/*
-+ * instrumented spinlock structure -- never used to allocate storage
-+ * only used in macros below to overlay a spinlock_t
-+ */
-+typedef struct inst_spinlock_s {
-+ /* remember, Intel is little endian */
-+ unsigned short lock;
-+ unsigned short index;
-+} inst_spinlock_t;
-+#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
-+#define GET_INDEX(lock_ptr) ((inst_spinlock_t *)(lock_ptr))->index
-+
-+/*
-+ * macros to cache and retrieve an index value in a read/write lock
-+ * as well as the cpu where a reader busy period started
-+ * we use the 2nd word (the debug word) for this, so require the
-+ * debug word to be present
-+ */
-+/*
-+ * instrumented rwlock structure -- never used to allocate storage
-+ * only used in macros below to overlay a rwlock_t
-+ */
-+typedef struct inst_rwlock_s {
-+ volatile int lock;
-+ unsigned short index;
-+ unsigned short cpu;
-+} inst_rwlock_t;
-+#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
-+#define GET_RWINDEX(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->index
-+#define PUT_RW_CPU(rwlock_ptr,cpuv) ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
-+#define GET_RW_CPU(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->cpu
-+
-+/*
-+ * return the number of readers for a rwlock_t
-+ */
-+#define RWLOCK_READERS(rwlock_ptr) rwlock_readers(rwlock_ptr)
-+
-+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
-+{
-+ int tmp = (int) rwlock_ptr->lock;
-+ /* read and write lock attempts may cause the lock value to temporarily */
-+ /* be negative. Until it is >= 0 we know nothing (i. e. can't tell if */
-+ /* is -1 because it was write locked and somebody tried to read lock it */
-+ /* or if it is -1 because it was read locked and somebody tried to write*/
-+ /* lock it. ........................................................... */
-+ do {
-+ tmp = (int) rwlock_ptr->lock;
-+ } while (tmp < 0);
-+ if (tmp == 0) return(0);
-+ else return(RW_LOCK_BIAS-tmp);
-+}
-+
-+/*
-+ * return true if rwlock is write locked
-+ * (note that other lock attempts can cause the lock value to be negative)
-+ */
-+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock <= 0)
-+#define IABS(x) ((x) > 0 ? (x) : -(x))
-+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr) ((IABS((rwlock_ptr)->lock) % RW_LOCK_BIAS) != 0)
-+
-+/* this is a lot of typing just to get gcc to emit "rdtsc" */
-+static inline long long get_cycles64 (void)
-+{
-+ union longlong_u {
-+ long long intlong;
-+ struct intint_s {
-+ uint32_t eax;
-+ uint32_t edx;
-+ } intint;
-+ } longlong;
-+
-+ rdtsc(longlong.intint.eax,longlong.intint.edx);
-+ return longlong.intlong;
-+}
-+
-+#endif /* _I386_LOCKMETER_H */
---- linux-2.6.0/include/asm-i386/mach-bigsmp/mach_apic.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-i386/mach-bigsmp/mach_apic.h 2003-12-28 23:21:32.000000000 -0800
-@@ -173,4 +173,9 @@ static inline unsigned int cpu_mask_to_a
- return apicid;
- }
-
-+static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
-+{
-+ return cpuid_apic >> index_msb;
-+}
-+
- #endif /* __ASM_MACH_APIC_H */
---- linux-2.6.0/include/asm-i386/mach-default/irq_vectors.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/mach-default/irq_vectors.h 2003-12-28 23:21:44.000000000 -0800
-@@ -76,6 +76,18 @@
- * Since vectors 0x00-0x1f are used/reserved for the CPU,
- * the usable vector space is 0x20-0xff (224 vectors)
- */
-+
-+/*
-+ * The maximum number of vectors supported by i386 processors
-+ * is limited to 256. For processors other than i386, NR_VECTORS
-+ * should be changed accordingly.
-+ */
-+#define NR_VECTORS 256
-+
-+#ifdef CONFIG_PCI_USE_VECTOR
-+#define NR_IRQS FIRST_SYSTEM_VECTOR
-+#define NR_IRQ_VECTORS NR_IRQS
-+#else
- #ifdef CONFIG_X86_IO_APIC
- #define NR_IRQS 224
- # if (224 >= 32 * NR_CPUS)
-@@ -87,6 +99,7 @@
- #define NR_IRQS 16
- #define NR_IRQ_VECTORS NR_IRQS
- #endif
-+#endif
-
- #define FPU_IRQ 13
-
---- linux-2.6.0/include/asm-i386/mach-default/mach_apic.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-i386/mach-default/mach_apic.h 2003-12-28 23:22:02.000000000 -0800
-@@ -5,12 +5,12 @@
-
- #define APIC_DFR_VALUE (APIC_DFR_FLAT)
-
--static inline cpumask_t target_cpus(void)
-+static inline cpumask_const_t target_cpus(void)
- {
- #ifdef CONFIG_SMP
-- return cpu_online_map;
-+ return mk_cpumask_const(cpu_online_map);
- #else
-- return cpumask_of_cpu(0);
-+ return mk_cpumask_const(cpumask_of_cpu(0));
- #endif
- }
- #define TARGET_CPUS (target_cpus())
-@@ -127,4 +127,9 @@ static inline void enable_apic_mode(void
- {
- }
-
-+static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
-+{
-+ return cpuid_apic >> index_msb;
-+}
-+
- #endif /* __ASM_MACH_APIC_H */
---- linux-2.6.0/include/asm-i386/mach-es7000/mach_apic.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-i386/mach-es7000/mach_apic.h 2003-12-28 23:22:45.000000000 -0800
-@@ -39,6 +39,7 @@ static inline cpumask_t target_cpus(void
- #endif
-
- #define APIC_BROADCAST_ID (0xff)
-+#define NO_IOAPIC_CHECK (0)
-
- static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
- {
-@@ -191,4 +192,9 @@ static inline unsigned int cpu_mask_to_a
- return apicid;
- }
-
-+static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
-+{
-+ return cpuid_apic >> index_msb;
-+}
-+
- #endif /* __ASM_MACH_APIC_H */
---- linux-2.6.0/include/asm-i386/mach-generic/mach_apic.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-i386/mach-generic/mach_apic.h 2003-12-28 23:21:32.000000000 -0800
-@@ -27,5 +27,6 @@
- #define check_apicid_used (genapic->check_apicid_used)
- #define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
- #define enable_apic_mode (genapic->enable_apic_mode)
-+#define phys_pkg_id (genapic->phys_pkg_id)
-
- #endif /* __ASM_MACH_APIC_H */
---- linux-2.6.0/include/asm-i386/mach-numaq/mach_apic.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-i386/mach-numaq/mach_apic.h 2003-12-28 23:21:32.000000000 -0800
-@@ -141,4 +141,10 @@ static inline unsigned int cpu_mask_to_a
- return (int) 0xF;
- }
-
-+/* No NUMA-Q box has a HT CPU, but it can't hurt to use the default code. */
-+static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
-+{
-+ return cpuid_apic >> index_msb;
-+}
-+
- #endif /* __ASM_MACH_APIC_H */
---- linux-2.6.0/include/asm-i386/mach-summit/mach_apic.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-i386/mach-summit/mach_apic.h 2003-12-28 23:21:32.000000000 -0800
-@@ -173,4 +173,15 @@ static inline unsigned int cpu_mask_to_a
- return apicid;
- }
-
-+/* cpuid returns the value latched in the HW at reset, not the APIC ID
-+ * register's value. For any box whose BIOS changes APIC IDs, like
-+ * clustered APIC systems, we must use hard_smp_processor_id.
-+ *
-+ * See Intel's IA-32 SW Dev's Manual Vol2 under CPUID.
-+ */
-+static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
-+{
-+ return hard_smp_processor_id() >> index_msb;
-+}
-+
- #endif /* __ASM_MACH_APIC_H */
---- linux-2.6.0/include/asm-i386/mach-summit/mach_mpparse.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-i386/mach-summit/mach_mpparse.h 2003-12-28 23:22:43.000000000 -0800
-@@ -5,11 +5,11 @@
-
- extern int use_cyclone;
-
--#ifdef CONFIG_NUMA
-+#ifdef CONFIG_X86_SUMMIT_NUMA
- extern void setup_summit(void);
--#else /* !CONFIG_NUMA */
-+#else
- #define setup_summit() {}
--#endif /* CONFIG_NUMA */
-+#endif
-
- static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
- struct mpc_config_translation *translation)
-@@ -110,9 +110,9 @@ typedef enum {
- LookOutBWPEG = 7, /* LookOut WPEG */
- } node_type;
-
--static inline int is_WPEG(node_type type){
-- return (type == CompatWPEG || type == AltWPEG ||
-- type == LookOutAWPEG || type == LookOutBWPEG);
-+static inline int is_WPEG(struct rio_detail *rio){
-+ return (rio->type == CompatWPEG || rio->type == AltWPEG ||
-+ rio->type == LookOutAWPEG || rio->type == LookOutBWPEG);
- }
-
- #endif /* __ASM_MACH_MPPARSE_H */
---- linux-2.6.0/include/asm-i386/mach-visws/mach_apic.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-i386/mach-visws/mach_apic.h 2003-12-28 23:21:32.000000000 -0800
-@@ -88,4 +88,10 @@ static inline unsigned int cpu_mask_to_a
- {
- return cpus_coerce_const(cpumask);
- }
-+
-+static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
-+{
-+ return cpuid_apic >> index_msb;
-+}
-+
- #endif /* __ASM_MACH_APIC_H */
---- linux-2.6.0/include/asm-i386/mmu_context.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/mmu_context.h 2003-12-28 23:26:36.000000000 -0800
-@@ -29,6 +29,10 @@ static inline void switch_mm(struct mm_s
- {
- int cpu = smp_processor_id();
-
-+#ifdef CONFIG_X86_SWITCH_PAGETABLES
-+ if (tsk->mm)
-+ tsk->thread_info->user_pgd = (void *)__pa(tsk->mm->pgd);
-+#endif
- if (likely(prev != next)) {
- /* stop flush ipis for the previous mm */
- cpu_clear(cpu, prev->cpu_vm_mask);
-@@ -39,12 +43,14 @@ static inline void switch_mm(struct mm_s
- cpu_set(cpu, next->cpu_vm_mask);
-
- /* Re-load page tables */
-+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
- load_cr3(next->pgd);
-+#endif
-
- /*
- * load the LDT, if the LDT is different:
- */
-- if (unlikely(prev->context.ldt != next->context.ldt))
-+ if (unlikely(prev->context.size + next->context.size))
- load_LDT_nolock(&next->context, cpu);
- }
- #ifdef CONFIG_SMP
-@@ -56,7 +62,9 @@ static inline void switch_mm(struct mm_s
- /* We were in lazy tlb mode and leave_mm disabled
- * tlb flush IPI delivery. We must reload %cr3.
- */
-+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
- load_cr3(next->pgd);
-+#endif
- load_LDT_nolock(&next->context, cpu);
- }
- }
-@@ -67,6 +75,6 @@ static inline void switch_mm(struct mm_s
- asm("movl %0,%%fs ; movl %0,%%gs": :"r" (0))
-
- #define activate_mm(prev, next) \
-- switch_mm((prev),(next),NULL)
-+ switch_mm((prev),(next),current)
-
- #endif
---- linux-2.6.0/include/asm-i386/mmu.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/mmu.h 2003-12-28 23:26:36.000000000 -0800
-@@ -8,10 +8,13 @@
- *
- * cpu_vm_mask is used to optimize ldt flushing.
- */
-+
-+#define MAX_LDT_PAGES 16
-+
- typedef struct {
- int size;
- struct semaphore sem;
-- void *ldt;
-+ struct page *ldt_pages[MAX_LDT_PAGES];
- } mm_context_t;
-
- #endif
---- linux-2.6.0/include/asm-i386/mpspec.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-i386/mpspec.h 2003-12-28 23:22:43.000000000 -0800
-@@ -27,10 +27,6 @@ extern unsigned long mp_lapic_addr;
- extern int pic_mode;
- extern int using_apic_timer;
-
--#ifdef CONFIG_X86_SUMMIT
--extern void setup_summit (void);
--#endif
--
- #ifdef CONFIG_ACPI_BOOT
- extern void mp_register_lapic (u8 id, u8 enabled);
- extern void mp_register_lapic_address (u64 address);
---- linux-2.6.0/include/asm-i386/page.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/page.h 2003-12-28 23:26:36.000000000 -0800
-@@ -1,6 +1,8 @@
- #ifndef _I386_PAGE_H
- #define _I386_PAGE_H
-
-+#include <linux/config.h>
-+
- /* PAGE_SHIFT determines the page size */
- #define PAGE_SHIFT 12
- #define PAGE_SIZE (1UL << PAGE_SHIFT)
-@@ -9,11 +11,10 @@
- #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
- #define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
-
--#ifdef __KERNEL__
--#ifndef __ASSEMBLY__
--
- #include <linux/config.h>
-
-+#ifdef __KERNEL__
-+#ifndef __ASSEMBLY__
- #ifdef CONFIG_X86_USE_3DNOW
-
- #include <asm/mmx.h>
-@@ -88,8 +89,19 @@ typedef struct { unsigned long pgprot; }
- *
- * If you want more physical memory than this then see the CONFIG_HIGHMEM4G
- * and CONFIG_HIGHMEM64G options in the kernel configuration.
-+ *
-+ * Note: on PAE the kernel must never go below 32 MB, we use the
-+ * first 8 entries of the 2-level boot pgd for PAE magic.
- */
-
-+#ifdef CONFIG_X86_4G_VM_LAYOUT
-+#define __PAGE_OFFSET (0x02000000)
-+#define TASK_SIZE (0xff000000)
-+#else
-+#define __PAGE_OFFSET (0xc0000000)
-+#define TASK_SIZE (0xc0000000)
-+#endif
-+
- /*
- * This much address space is reserved for vmalloc() and iomap()
- * as well as fixmap mappings.
-@@ -114,16 +126,10 @@ static __inline__ int get_order(unsigned
-
- #endif /* __ASSEMBLY__ */
-
--#ifdef __ASSEMBLY__
--#define __PAGE_OFFSET (0xC0000000)
--#else
--#define __PAGE_OFFSET (0xC0000000UL)
--#endif
--
--
- #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
- #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE)
--#define MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE)
-+#define __MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE)
-+#define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE))
- #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
- #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
- #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
---- linux-2.6.0/include/asm-i386/pgtable.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/pgtable.h 2003-12-28 23:26:36.000000000 -0800
-@@ -32,16 +32,17 @@
- #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
- extern unsigned long empty_zero_page[1024];
- extern pgd_t swapper_pg_dir[1024];
--extern kmem_cache_t *pgd_cache;
--extern kmem_cache_t *pmd_cache;
-+extern kmem_cache_t *pgd_cache, *pmd_cache, *kpmd_cache;
- extern spinlock_t pgd_lock;
- extern struct list_head pgd_list;
-
- void pmd_ctor(void *, kmem_cache_t *, unsigned long);
-+void kpmd_ctor(void *, kmem_cache_t *, unsigned long);
- void pgd_ctor(void *, kmem_cache_t *, unsigned long);
- void pgd_dtor(void *, kmem_cache_t *, unsigned long);
- void pgtable_cache_init(void);
- void paging_init(void);
-+void setup_identity_mappings(pgd_t *pgd_base, unsigned long start, unsigned long end);
-
- #endif /* !__ASSEMBLY__ */
-
-@@ -51,6 +52,11 @@ void paging_init(void);
- * newer 3-level PAE-mode page tables.
- */
- #ifndef __ASSEMBLY__
-+
-+extern void set_system_gate(unsigned int n, void *addr);
-+extern void init_entry_mappings(void);
-+extern void entry_trampoline_setup(void);
-+
- #ifdef CONFIG_X86_PAE
- # include <asm/pgtable-3level.h>
- #else
-@@ -63,7 +69,12 @@ void paging_init(void);
- #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
- #define PGDIR_MASK (~(PGDIR_SIZE-1))
-
--#define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE)
-+#if defined(CONFIG_X86_PAE) && defined(CONFIG_X86_4G_VM_LAYOUT)
-+# define USER_PTRS_PER_PGD 4
-+#else
-+# define USER_PTRS_PER_PGD ((TASK_SIZE/PGDIR_SIZE) + ((TASK_SIZE % PGDIR_SIZE) + PGDIR_SIZE-1)/PGDIR_SIZE)
-+#endif
-+
- #define FIRST_USER_PGD_NR 0
-
- #define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
-@@ -233,6 +244,7 @@ static inline void ptep_mkdirty(pte_t *p
-
- #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
- #define mk_pte_huge(entry) ((entry).pte_low |= _PAGE_PRESENT | _PAGE_PSE)
-+#define mk_pte_phys(physpage, pgprot) pfn_pte((physpage) >> PAGE_SHIFT, pgprot)
-
- static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
- {
---- linux-2.6.0/include/asm-i386/processor.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/processor.h 2003-12-28 23:26:36.000000000 -0800
-@@ -291,11 +291,6 @@ extern unsigned int machine_submodel_id;
- extern unsigned int BIOS_revision;
- extern unsigned int mca_pentium_flag;
-
--/*
-- * User space process size: 3GB (default).
-- */
--#define TASK_SIZE (PAGE_OFFSET)
--
- /* This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-@@ -406,7 +401,9 @@ struct tss_struct {
- struct thread_struct {
- /* cached TLS descriptors. */
- struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
-+ void *stack_page0, *stack_page1;
- unsigned long esp0;
-+ unsigned long sysenter_cs;
- unsigned long eip;
- unsigned long esp;
- unsigned long fs;
-@@ -428,6 +425,7 @@ struct thread_struct {
-
- #define INIT_THREAD { \
- .vm86_info = NULL, \
-+ .sysenter_cs = __KERNEL_CS, \
- .io_bitmap_ptr = NULL, \
- }
-
-@@ -447,21 +445,14 @@ struct thread_struct {
- .io_bitmap = { [ 0 ... IO_BITMAP_LONGS] = ~0 }, \
- }
-
--static inline void load_esp0(struct tss_struct *tss, unsigned long esp0)
-+static inline void
-+load_esp0(struct tss_struct *tss, struct thread_struct *thread)
- {
-- tss->esp0 = esp0;
-+ tss->esp0 = thread->esp0;
- /* This can only happen when SEP is enabled, no need to test "SEP"arately */
-- if ((unlikely(tss->ss1 != __KERNEL_CS))) {
-- tss->ss1 = __KERNEL_CS;
-- wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
-- }
--}
--
--static inline void disable_sysenter(struct tss_struct *tss)
--{
-- if (cpu_has_sep) {
-- tss->ss1 = 0;
-- wrmsr(MSR_IA32_SYSENTER_CS, 0, 0);
-+ if (unlikely(tss->ss1 != thread->sysenter_cs)) {
-+ tss->ss1 = thread->sysenter_cs;
-+ wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
- }
- }
-
-@@ -491,6 +482,23 @@ extern void prepare_to_copy(struct task_
- */
- extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-
-+#ifdef CONFIG_X86_HIGH_ENTRY
-+#define virtual_esp0(tsk) \
-+ ((unsigned long)(tsk)->thread_info->virtual_stack + ((tsk)->thread.esp0 - (unsigned long)(tsk)->thread_info->real_stack))
-+#else
-+# define virtual_esp0(tsk) ((tsk)->thread.esp0)
-+#endif
-+
-+#define load_virtual_esp0(tss, task) \
-+ do { \
-+ tss->esp0 = virtual_esp0(task); \
-+ if (likely(cpu_has_sep) && unlikely(tss->ss1 != task->thread.sysenter_cs)) { \
-+ tss->ss1 = task->thread.sysenter_cs; \
-+ wrmsr(MSR_IA32_SYSENTER_CS, \
-+ task->thread.sysenter_cs, 0); \
-+ } \
-+ } while (0)
-+
- extern unsigned long thread_saved_pc(struct task_struct *tsk);
- void show_trace(struct task_struct *task, unsigned long *stack);
-
---- linux-2.6.0/include/asm-i386/rwlock.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/rwlock.h 2003-12-28 23:21:35.000000000 -0800
-@@ -20,28 +20,52 @@
- #define RW_LOCK_BIAS 0x01000000
- #define RW_LOCK_BIAS_STR "0x01000000"
-
--#define __build_read_lock_ptr(rw, helper) \
-- asm volatile(LOCK "subl $1,(%0)\n\t" \
-- "js 2f\n" \
-- "1:\n" \
-- LOCK_SECTION_START("") \
-- "2:\tcall " helper "\n\t" \
-- "jmp 1b\n" \
-- LOCK_SECTION_END \
-- ::"a" (rw) : "memory")
--
--#define __build_read_lock_const(rw, helper) \
-- asm volatile(LOCK "subl $1,%0\n\t" \
-- "js 2f\n" \
-- "1:\n" \
-- LOCK_SECTION_START("") \
-- "2:\tpushl %%eax\n\t" \
-- "leal %0,%%eax\n\t" \
-- "call " helper "\n\t" \
-- "popl %%eax\n\t" \
-- "jmp 1b\n" \
-- LOCK_SECTION_END \
-- :"=m" (*(volatile int *)rw) : : "memory")
-+#ifdef CONFIG_SPINLINE
-+
-+ #define __build_read_lock_ptr(rw, helper) \
-+ asm volatile(LOCK "subl $1,(%0)\n\t" \
-+ "jns 1f\n\t" \
-+ "call " helper "\n\t" \
-+ "1:\t" \
-+ ::"a" (rw) : "memory")
-+
-+ #define __build_read_lock_const(rw, helper) \
-+ asm volatile(LOCK "subl $1,%0\n\t" \
-+ "jns 1f\n\t" \
-+ "pushl %%eax\n\t" \
-+ "leal %0,%%eax\n\t" \
-+ "call " helper "\n\t" \
-+ "popl %%eax\n\t" \
-+ "1:\t" \
-+ :"=m" (*(volatile int *)rw) : : "memory")
-+
-+#else /* !CONFIG_SPINLINE */
-+
-+ #define __build_read_lock_ptr(rw, helper) \
-+ asm volatile(LOCK "subl $1,(%0)\n\t" \
-+ "js 2f\n" \
-+ "1:\n" \
-+ LOCK_SECTION_START("") \
-+ "2:\tcall " helper "\n\t" \
-+ "jmp 1b\n" \
-+ LOCK_SECTION_END \
-+ ::"a" (rw) : "memory")
-+
-+ #define __build_read_lock_const(rw, helper) \
-+ asm volatile(LOCK "subl $1,%0\n\t" \
-+ "js 2f\n" \
-+ "1:\n" \
-+ LOCK_SECTION_START("") \
-+ "2:\tpushl %%eax\n\t" \
-+ "leal %0,%%eax\n\t" \
-+ "call " helper "\n\t" \
-+ "popl %%eax\n\t" \
-+ "jmp 1b\n" \
-+ LOCK_SECTION_END \
-+ :"=m" (*(volatile int *)rw) : : "memory")
-+
-+#endif /* CONFIG_SPINLINE */
-+
-
- #define __build_read_lock(rw, helper) do { \
- if (__builtin_constant_p(rw)) \
-@@ -50,28 +74,51 @@
- __build_read_lock_ptr(rw, helper); \
- } while (0)
-
--#define __build_write_lock_ptr(rw, helper) \
-- asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
-- "jnz 2f\n" \
-- "1:\n" \
-- LOCK_SECTION_START("") \
-- "2:\tcall " helper "\n\t" \
-- "jmp 1b\n" \
-- LOCK_SECTION_END \
-- ::"a" (rw) : "memory")
--
--#define __build_write_lock_const(rw, helper) \
-- asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
-- "jnz 2f\n" \
-- "1:\n" \
-- LOCK_SECTION_START("") \
-- "2:\tpushl %%eax\n\t" \
-- "leal %0,%%eax\n\t" \
-- "call " helper "\n\t" \
-- "popl %%eax\n\t" \
-- "jmp 1b\n" \
-- LOCK_SECTION_END \
-- :"=m" (*(volatile int *)rw) : : "memory")
-+#ifdef CONFIG_SPINLINE
-+
-+ #define __build_write_lock_ptr(rw, helper) \
-+ asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
-+ "jz 1f\n\t" \
-+ "call " helper "\n\t" \
-+ "1:\n" \
-+ ::"a" (rw) : "memory")
-+
-+ #define __build_write_lock_const(rw, helper) \
-+ asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
-+ "jz 1f\n\t" \
-+ "pushl %%eax\n\t" \
-+ "leal %0,%%eax\n\t" \
-+ "call " helper "\n\t" \
-+ "popl %%eax\n\t" \
-+ "1:\n" \
-+ :"=m" (*(volatile int *)rw) : : "memory")
-+
-+#else /* !CONFIG_SPINLINE */
-+
-+ #define __build_write_lock_ptr(rw, helper) \
-+ asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \
-+ "jnz 2f\n" \
-+ "1:\n" \
-+ LOCK_SECTION_START("") \
-+ "2:\tcall " helper "\n\t" \
-+ "jmp 1b\n" \
-+ LOCK_SECTION_END \
-+ ::"a" (rw) : "memory")
-+
-+ #define __build_write_lock_const(rw, helper) \
-+ asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",%0\n\t" \
-+ "jnz 2f\n" \
-+ "1:\n" \
-+ LOCK_SECTION_START("") \
-+ "2:\tpushl %%eax\n\t" \
-+ "leal %0,%%eax\n\t" \
-+ "call " helper "\n\t" \
-+ "popl %%eax\n\t" \
-+ "jmp 1b\n" \
-+ LOCK_SECTION_END \
-+ :"=m" (*(volatile int *)rw) : : "memory")
-+
-+#endif /* CONFIG_SPINLINE */
-
- #define __build_write_lock(rw, helper) do { \
- if (__builtin_constant_p(rw)) \
---- linux-2.6.0/include/asm-i386/setup.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/setup.h 2003-12-28 23:21:45.000000000 -0800
-@@ -29,6 +29,11 @@
- #define IST_INFO (*(struct ist_info *) (PARAM+0x60))
- #define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80))
- #define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0))
-+#define EFI_SYSTAB ((efi_system_table_t *) *((unsigned long *)(PARAM+0x1c4)))
-+#define EFI_MEMDESC_SIZE (*((unsigned long *) (PARAM+0x1c8)))
-+#define EFI_MEMDESC_VERSION (*((unsigned long *) (PARAM+0x1cc)))
-+#define EFI_MEMMAP ((efi_memory_desc_t *) *((unsigned long *)(PARAM+0x1d0)))
-+#define EFI_MEMMAP_SIZE (*((unsigned long *) (PARAM+0x1d4)))
- #define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2))
- #define RAMDISK_FLAGS (*(unsigned short *) (PARAM+0x1F8))
- #define VIDEO_MODE (*(unsigned short *) (PARAM+0x1FA))
---- linux-2.6.0/include/asm-i386/spinlock.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/spinlock.h 2003-12-28 23:26:34.000000000 -0800
-@@ -43,18 +43,35 @@ typedef struct {
- #define spin_is_locked(x) (*(volatile signed char *)(&(x)->lock) <= 0)
- #define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x))
-
--#define spin_lock_string \
-- "\n1:\t" \
-- "lock ; decb %0\n\t" \
-- "js 2f\n" \
-- LOCK_SECTION_START("") \
-- "2:\t" \
-- "rep;nop\n\t" \
-- "cmpb $0,%0\n\t" \
-- "jle 2b\n\t" \
-- "jmp 1b\n" \
-- LOCK_SECTION_END
-+#ifdef CONFIG_SPINLINE
-
-+ #define spin_lock_string \
-+ "\n1:\t" \
-+ "lock ; decb %0\n\t" \
-+ "js 2f\n" \
-+ "jmp 3f\n" \
-+ "2:\t" \
-+ "rep;nop\n\t" \
-+ "cmpb $0,%0\n\t" \
-+ "jle 2b\n\t" \
-+ "jmp 1b\n" \
-+ "3:\t"
-+
-+#else /* !CONFIG_SPINLINE */
-+
-+ #define spin_lock_string \
-+ "\n1:\t" \
-+ "lock ; decb %0\n\t" \
-+ "js 2f\n" \
-+ LOCK_SECTION_START("") \
-+ "2:\t" \
-+ "rep;nop\n\t" \
-+ "cmpb $0,%0\n\t" \
-+ "jle 2b\n\t" \
-+ "jmp 1b\n" \
-+ LOCK_SECTION_END
-+
-+#endif /* CONFIG_SPINLINE */
- /*
- * This works. Despite all the confusion.
- * (except on PPro SMP or if we are using OOSTORE)
-@@ -138,6 +155,11 @@ here:
- */
- typedef struct {
- volatile unsigned int lock;
-+#ifdef CONFIG_LOCKMETER
-+ /* required for LOCKMETER since all bits in lock are used */
-+ /* and we need this storage for CPU and lock INDEX */
-+ unsigned lockmeter_magic;
-+#endif
- #ifdef CONFIG_DEBUG_SPINLOCK
- unsigned magic;
- #endif
-@@ -145,11 +167,19 @@ typedef struct {
-
- #define RWLOCK_MAGIC 0xdeaf1eed
-
-+#ifdef CONFIG_LOCKMETER
-+#ifdef CONFIG_DEBUG_SPINLOCK
-+#define RWLOCK_MAGIC_INIT , 0, RWLOCK_MAGIC
-+#else
-+#define RWLOCK_MAGIC_INIT , 0
-+#endif
-+#else /* !CONFIG_LOCKMETER */
- #ifdef CONFIG_DEBUG_SPINLOCK
- #define RWLOCK_MAGIC_INIT , RWLOCK_MAGIC
- #else
- #define RWLOCK_MAGIC_INIT /* */
- #endif
-+#endif /* !CONFIG_LOCKMETER */
-
- #define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
-
-@@ -196,4 +226,60 @@ static inline int _raw_write_trylock(rwl
- return 0;
- }
-
-+#ifdef CONFIG_LOCKMETER
-+static inline int _raw_read_trylock(rwlock_t *lock)
-+{
-+/* FIXME -- replace with assembler */
-+ atomic_t *count = (atomic_t *)lock;
-+ atomic_dec(count);
-+ if (count->counter > 0)
-+ return 1;
-+ atomic_inc(count);
-+ return 0;
-+}
-+#endif
-+
-+#if defined(CONFIG_LOCKMETER) && defined(CONFIG_HAVE_DEC_LOCK)
-+extern void _metered_spin_lock (spinlock_t *lock);
-+extern void _metered_spin_unlock(spinlock_t *lock);
-+
-+/*
-+ * Matches what is in arch/i386/lib/dec_and_lock.c, except this one is
-+ * "static inline" so that the spin_lock(), if actually invoked, is charged
-+ * against the real caller, not against the catch-all atomic_dec_and_lock
-+ */
-+static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
-+{
-+ int counter;
-+ int newcount;
-+
-+repeat:
-+ counter = atomic_read(atomic);
-+ newcount = counter-1;
-+
-+ if (!newcount)
-+ goto slow_path;
-+
-+ asm volatile("lock; cmpxchgl %1,%2"
-+ :"=a" (newcount)
-+ :"r" (newcount), "m" (atomic->counter), "0" (counter));
-+
-+ /* If the above failed, "eax" will have changed */
-+ if (newcount != counter)
-+ goto repeat;
-+ return 0;
-+
-+slow_path:
-+ preempt_disable();
-+ _metered_spin_lock(lock);
-+ if (atomic_dec_and_test(atomic))
-+ return 1;
-+ _metered_spin_unlock(lock);
-+ preempt_enable();
-+ return 0;
-+}
-+
-+#define ATOMIC_DEC_AND_LOCK
-+#endif
-+
- #endif /* __ASM_SPINLOCK_H */
---- linux-2.6.0/include/asm-i386/string.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/string.h 2003-12-28 23:26:36.000000000 -0800
-@@ -56,6 +56,29 @@ __asm__ __volatile__(
- return dest;
- }
-
-+/*
-+ * This is a more generic variant of strncpy_count() suitable for
-+ * implementing string-access routines with all sorts of return
-+ * code semantics. It's used by mm/usercopy.c.
-+ */
-+static inline size_t strncpy_count(char * dest,const char *src,size_t count)
-+{
-+ __asm__ __volatile__(
-+
-+ "1:\tdecl %0\n\t"
-+ "js 2f\n\t"
-+ "lodsb\n\t"
-+ "stosb\n\t"
-+ "testb %%al,%%al\n\t"
-+ "jne 1b\n\t"
-+ "2:"
-+ "incl %0"
-+ : "=c" (count)
-+ :"S" (src),"D" (dest),"0" (count) : "memory");
-+
-+ return count;
-+}
-+
- #define __HAVE_ARCH_STRCAT
- static inline char * strcat(char * dest,const char * src)
- {
-@@ -291,7 +314,7 @@ extern void __struct_cpy_bug (void);
- #define struct_cpy(x,y) \
- ({ \
- if (sizeof(*(x)) != sizeof(*(y))) \
-- __struct_cpy_bug; \
-+ __struct_cpy_bug(); \
- memcpy(x, y, sizeof(*(x))); \
- })
-
-@@ -299,14 +322,9 @@ extern void __struct_cpy_bug (void);
- static inline void * memmove(void * dest,const void * src, size_t n)
- {
- int d0, d1, d2;
--if (dest<src)
--__asm__ __volatile__(
-- "rep\n\t"
-- "movsb"
-- : "=&c" (d0), "=&S" (d1), "=&D" (d2)
-- :"0" (n),"1" (src),"2" (dest)
-- : "memory");
--else
-+if (dest<src) {
-+ memcpy(dest,src,n);
-+} else
- __asm__ __volatile__(
- "std\n\t"
- "rep\n\t"
---- linux-2.6.0/include/asm-i386/system.h 2003-06-14 12:17:56.000000000 -0700
-+++ 25/include/asm-i386/system.h 2003-12-28 23:21:33.000000000 -0800
-@@ -470,6 +470,7 @@ void enable_hlt(void);
-
- extern unsigned long dmi_broken;
- extern int is_sony_vaio_laptop;
-+extern int es7000_plat;
-
- #define BROKEN_ACPI_Sx 0x0001
- #define BROKEN_INIT_AFTER_S1 0x0002
---- linux-2.6.0/include/asm-i386/thread_info.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/thread_info.h 2003-12-28 23:26:36.000000000 -0800
-@@ -33,23 +33,12 @@ struct thread_info {
- 0-0xBFFFFFFF for user-thead
- 0-0xFFFFFFFF for kernel-thread
- */
-- struct restart_block restart_block;
-+ void *real_stack, *virtual_stack, *user_pgd;
-
-+ struct restart_block restart_block;
- __u8 supervisor_stack[0];
- };
-
--#else /* !__ASSEMBLY__ */
--
--/* offsets into the thread_info struct for assembly code access */
--#define TI_TASK 0x00000000
--#define TI_EXEC_DOMAIN 0x00000004
--#define TI_FLAGS 0x00000008
--#define TI_STATUS 0x0000000C
--#define TI_CPU 0x00000010
--#define TI_PRE_COUNT 0x00000014
--#define TI_ADDR_LIMIT 0x00000018
--#define TI_RESTART_BLOCK 0x000001C
--
- #endif
-
- #define PREEMPT_ACTIVE 0x4000000
-@@ -61,7 +50,7 @@ struct thread_info {
- */
- #ifndef __ASSEMBLY__
-
--#define INIT_THREAD_INFO(tsk) \
-+#define INIT_THREAD_INFO(tsk, thread_info) \
- { \
- .task = &tsk, \
- .exec_domain = &default_exec_domain, \
-@@ -72,6 +61,7 @@ struct thread_info {
- .restart_block = { \
- .fn = do_no_restart_syscall, \
- }, \
-+ .real_stack = &thread_info, \
- }
-
- #define init_thread_info (init_thread_union.thread_info)
-@@ -113,6 +103,7 @@ static inline struct thread_info *curren
- #define TIF_NEED_RESCHED 3 /* rescheduling necessary */
- #define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */
- #define TIF_IRET 5 /* return with iret */
-+#define TIF_DB7 6 /* has debug registers */
- #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */
-
- #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
-@@ -121,6 +112,7 @@ static inline struct thread_info *curren
- #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
- #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
- #define _TIF_IRET (1<<TIF_IRET)
-+#define _TIF_DB7 (1<<TIF_DB7)
- #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
-
- #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */
---- linux-2.6.0/include/asm-i386/timer.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/timer.h 2003-12-28 23:21:57.000000000 -0800
-@@ -11,6 +11,7 @@
- * last timer intruupt.
- */
- struct timer_opts{
-+ char* name;
- int (*init)(char *override);
- void (*mark_offset)(void);
- unsigned long (*get_offset)(void);
-@@ -39,9 +40,13 @@ extern struct timer_opts timer_cyclone;
- #endif
-
- extern unsigned long calibrate_tsc(void);
-+extern void init_cpu_khz(void);
- #ifdef CONFIG_HPET_TIMER
- extern struct timer_opts timer_hpet;
- extern unsigned long calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr);
- #endif
-
-+#ifdef CONFIG_X86_PM_TIMER
-+extern struct timer_opts timer_pmtmr;
-+#endif
- #endif
---- linux-2.6.0/include/asm-i386/tlbflush.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/tlbflush.h 2003-12-28 23:26:36.000000000 -0800
-@@ -85,22 +85,28 @@ extern unsigned long pgkern_mask;
-
- static inline void flush_tlb_mm(struct mm_struct *mm)
- {
-+#ifndef CONFIG_X86_SWITCH_PAGETABLES
- if (mm == current->active_mm)
- __flush_tlb();
-+#endif
- }
-
- static inline void flush_tlb_page(struct vm_area_struct *vma,
- unsigned long addr)
- {
-+#ifndef CONFIG_X86_SWITCH_PAGETABLES
- if (vma->vm_mm == current->active_mm)
- __flush_tlb_one(addr);
-+#endif
- }
-
- static inline void flush_tlb_range(struct vm_area_struct *vma,
- unsigned long start, unsigned long end)
- {
-+#ifndef CONFIG_X86_SWITCH_PAGETABLES
- if (vma->vm_mm == current->active_mm)
- __flush_tlb();
-+#endif
- }
-
- #else
-@@ -111,11 +117,10 @@ static inline void flush_tlb_range(struc
- __flush_tlb()
-
- extern void flush_tlb_all(void);
--extern void flush_tlb_current_task(void);
- extern void flush_tlb_mm(struct mm_struct *);
- extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
-
--#define flush_tlb() flush_tlb_current_task()
-+#define flush_tlb() flush_tlb_all()
-
- static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
- {
---- linux-2.6.0/include/asm-i386/uaccess.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-i386/uaccess.h 2003-12-28 23:26:36.000000000 -0800
-@@ -26,7 +26,7 @@
-
-
- #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFFUL)
--#define USER_DS MAKE_MM_SEG(PAGE_OFFSET)
-+#define USER_DS MAKE_MM_SEG(TASK_SIZE)
-
- #define get_ds() (KERNEL_DS)
- #define get_fs() (current_thread_info()->addr_limit)
-@@ -149,6 +149,45 @@ extern void __get_user_4(void);
- :"=a" (ret),"=d" (x) \
- :"0" (ptr))
-
-+extern int get_user_size(unsigned int size, void *val, const void *ptr);
-+extern int put_user_size(unsigned int size, const void *val, void *ptr);
-+extern int zero_user_size(unsigned int size, void *ptr);
-+extern int copy_str_fromuser_size(unsigned int size, void *val, const void *ptr);
-+extern int strlen_fromuser_size(unsigned int size, const void *ptr);
-+
-+
-+# define indirect_get_user(x,ptr) \
-+({ int __ret_gu,__val_gu; \
-+ __typeof__(ptr) __ptr_gu = (ptr); \
-+ __ret_gu = get_user_size(sizeof(*__ptr_gu), &__val_gu,__ptr_gu) ? -EFAULT : 0;\
-+ (x) = (__typeof__(*__ptr_gu))__val_gu; \
-+ __ret_gu; \
-+})
-+#define indirect_put_user(x,ptr) \
-+({ \
-+ __typeof__(*(ptr)) *__ptr_pu = (ptr), __x_pu = (x); \
-+ put_user_size(sizeof(*__ptr_pu), &__x_pu, __ptr_pu) ? -EFAULT : 0; \
-+})
-+#define __indirect_put_user indirect_put_user
-+#define __indirect_get_user indirect_get_user
-+
-+#define indirect_copy_from_user(to,from,n) get_user_size(n,to,from)
-+#define indirect_copy_to_user(to,from,n) put_user_size(n,from,to)
-+
-+#define __indirect_copy_from_user indirect_copy_from_user
-+#define __indirect_copy_to_user indirect_copy_to_user
-+
-+#define indirect_strncpy_from_user(dst, src, count) \
-+ copy_str_fromuser_size(count, dst, src)
-+
-+extern int strlen_fromuser_size(unsigned int size, const void *ptr);
-+#define indirect_strnlen_user(str, n) strlen_fromuser_size(n, str)
-+#define indirect_strlen_user(str) indirect_strnlen_user(str, ~0UL >> 1)
-+
-+extern int zero_user_size(unsigned int size, void *ptr);
-+
-+#define indirect_clear_user(mem, len) zero_user_size(len, mem)
-+#define __indirect_clear_user clear_user
-
- /* Careful: we have to cast the result to the type of the pointer for sign reasons */
- /**
-@@ -168,7 +207,7 @@ extern void __get_user_4(void);
- * Returns zero on success, or -EFAULT on error.
- * On error, the variable @x is set to zero.
- */
--#define get_user(x,ptr) \
-+#define direct_get_user(x,ptr) \
- ({ int __ret_gu,__val_gu; \
- switch(sizeof (*(ptr))) { \
- case 1: __get_user_x(1,__ret_gu,__val_gu,ptr); break; \
-@@ -198,7 +237,7 @@ extern void __put_user_bad(void);
- *
- * Returns zero on success, or -EFAULT on error.
- */
--#define put_user(x,ptr) \
-+#define direct_put_user(x,ptr) \
- __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-
-
-@@ -222,7 +261,7 @@ extern void __put_user_bad(void);
- * Returns zero on success, or -EFAULT on error.
- * On error, the variable @x is set to zero.
- */
--#define __get_user(x,ptr) \
-+#define __direct_get_user(x,ptr) \
- __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
-
-
-@@ -245,7 +284,7 @@ extern void __put_user_bad(void);
- *
- * Returns zero on success, or -EFAULT on error.
- */
--#define __put_user(x,ptr) \
-+#define __direct_put_user(x,ptr) \
- __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-
- #define __put_user_nocheck(x,ptr,size) \
-@@ -396,7 +435,7 @@ unsigned long __copy_from_user_ll(void *
- * On success, this will be zero.
- */
- static inline unsigned long
--__copy_to_user(void __user *to, const void *from, unsigned long n)
-+__direct_copy_to_user(void __user *to, const void *from, unsigned long n)
- {
- if (__builtin_constant_p(n)) {
- unsigned long ret;
-@@ -434,7 +473,7 @@ __copy_to_user(void __user *to, const vo
- * data to the requested size using zero bytes.
- */
- static inline unsigned long
--__copy_from_user(void *to, const void __user *from, unsigned long n)
-+__direct_copy_from_user(void *to, const void __user *from, unsigned long n)
- {
- if (__builtin_constant_p(n)) {
- unsigned long ret;
-@@ -468,11 +507,11 @@ __copy_from_user(void *to, const void __
- * On success, this will be zero.
- */
- static inline unsigned long
--copy_to_user(void __user *to, const void *from, unsigned long n)
-+direct_copy_to_user(void __user *to, const void *from, unsigned long n)
- {
- might_sleep();
- if (access_ok(VERIFY_WRITE, to, n))
-- n = __copy_to_user(to, from, n);
-+ n = __direct_copy_to_user(to, from, n);
- return n;
- }
-
-@@ -493,11 +532,11 @@ copy_to_user(void __user *to, const void
- * data to the requested size using zero bytes.
- */
- static inline unsigned long
--copy_from_user(void *to, const void __user *from, unsigned long n)
-+direct_copy_from_user(void *to, const void __user *from, unsigned long n)
- {
- might_sleep();
- if (access_ok(VERIFY_READ, from, n))
-- n = __copy_from_user(to, from, n);
-+ n = __direct_copy_from_user(to, from, n);
- else
- memset(to, 0, n);
- return n;
-@@ -520,10 +559,68 @@ long __strncpy_from_user(char *dst, cons
- * If there is a limit on the length of a valid string, you may wish to
- * consider using strnlen_user() instead.
- */
--#define strlen_user(str) strnlen_user(str, ~0UL >> 1)
-
--long strnlen_user(const char __user *str, long n);
--unsigned long clear_user(void __user *mem, unsigned long len);
--unsigned long __clear_user(void __user *mem, unsigned long len);
-+long direct_strncpy_from_user(char *dst, const char *src, long count);
-+long __direct_strncpy_from_user(char *dst, const char *src, long count);
-+#define direct_strlen_user(str) direct_strnlen_user(str, ~0UL >> 1)
-+long direct_strnlen_user(const char *str, long n);
-+unsigned long direct_clear_user(void *mem, unsigned long len);
-+unsigned long __direct_clear_user(void *mem, unsigned long len);
-+
-+extern int indirect_uaccess;
-+
-+#ifdef CONFIG_X86_UACCESS_INDIRECT
-+
-+/*
-+ * Return code and zeroing semantics:
-+
-+ __clear_user 0 <-> bytes not done
-+ clear_user 0 <-> bytes not done
-+ __copy_to_user 0 <-> bytes not done
-+ copy_to_user 0 <-> bytes not done
-+ __copy_from_user 0 <-> bytes not done, zero rest
-+ copy_from_user 0 <-> bytes not done, zero rest
-+ __get_user 0 <-> -EFAULT
-+ get_user 0 <-> -EFAULT
-+ __put_user 0 <-> -EFAULT
-+ put_user 0 <-> -EFAULT
-+ strlen_user strlen + 1 <-> 0
-+ strnlen_user strlen + 1 (or n+1) <-> 0
-+ strncpy_from_user strlen (or n) <-> -EFAULT
-+
-+ */
-+
-+#define __clear_user(mem,len) __indirect_clear_user(mem,len)
-+#define clear_user(mem,len) indirect_clear_user(mem,len)
-+#define __copy_to_user(to,from,n) __indirect_copy_to_user(to,from,n)
-+#define copy_to_user(to,from,n) indirect_copy_to_user(to,from,n)
-+#define __copy_from_user(to,from,n) __indirect_copy_from_user(to,from,n)
-+#define copy_from_user(to,from,n) indirect_copy_from_user(to,from,n)
-+#define __get_user(val,ptr) __indirect_get_user(val,ptr)
-+#define get_user(val,ptr) indirect_get_user(val,ptr)
-+#define __put_user(val,ptr) __indirect_put_user(val,ptr)
-+#define put_user(val,ptr) indirect_put_user(val,ptr)
-+#define strlen_user(str) indirect_strlen_user(str)
-+#define strnlen_user(src,count) indirect_strnlen_user(src,count)
-+#define strncpy_from_user(dst,src,count) \
-+ indirect_strncpy_from_user(dst,src,count)
-+
-+#else
-+
-+#define __clear_user __direct_clear_user
-+#define clear_user direct_clear_user
-+#define __copy_to_user __direct_copy_to_user
-+#define copy_to_user direct_copy_to_user
-+#define __copy_from_user __direct_copy_from_user
-+#define copy_from_user direct_copy_from_user
-+#define __get_user __direct_get_user
-+#define get_user direct_get_user
-+#define __put_user __direct_put_user
-+#define put_user direct_put_user
-+#define strlen_user direct_strlen_user
-+#define strnlen_user direct_strnlen_user
-+#define strncpy_from_user direct_strncpy_from_user
-+
-+#endif /* CONFIG_X86_UACCESS_INDIRECT */
-
- #endif /* __i386_UACCESS_H */
---- linux-2.6.0/include/asm-ia64/byteorder.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-ia64/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -8,8 +8,9 @@
-
- #include <asm/types.h>
- #include <asm/intrinsics.h>
-+#include <linux/compiler.h>
-
--static __inline__ __const__ __u64
-+static __inline__ __attribute_const__ __u64
- __ia64_swab64 (__u64 x)
- {
- __u64 result;
-@@ -18,13 +19,13 @@ __ia64_swab64 (__u64 x)
- return result;
- }
-
--static __inline__ __const__ __u32
-+static __inline__ __attribute_const__ __u32
- __ia64_swab32 (__u32 x)
- {
- return __ia64_swab64(x) >> 32;
- }
-
--static __inline__ __const__ __u16
-+static __inline__ __attribute_const__ __u16
- __ia64_swab16(__u16 x)
- {
- return __ia64_swab64(x) >> 48;
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-ia64/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_IA64_CPUMASK_H
-+#define _ASM_IA64_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_IA64_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-ia64/lockmeter.h 2003-12-28 23:26:33.000000000 -0800
-@@ -0,0 +1,72 @@
-+/*
-+ * Copyright (C) 1999,2000 Silicon Graphics, Inc.
-+ *
-+ * Written by John Hawkes (hawkes@sgi.com)
-+ * Based on klstat.h by Jack Steiner (steiner@sgi.com)
-+ */
-+
-+#ifndef _IA64_LOCKMETER_H
-+#define _IA64_LOCKMETER_H
-+
-+#ifdef local_cpu_data
-+#define CPU_CYCLE_FREQUENCY local_cpu_data->itc_freq
-+#else
-+#define CPU_CYCLE_FREQUENCY my_cpu_data.itc_freq
-+#endif
-+#define get_cycles64() get_cycles()
-+
-+#define THIS_CPU_NUMBER smp_processor_id()
-+
-+/*
-+ * macros to cache and retrieve an index value inside of a lock
-+ * these macros assume that there are less than 65536 simultaneous
-+ * (read mode) holders of a rwlock.
-+ * we also assume that the hash table has less than 32767 entries.
-+ */
-+/*
-+ * instrumented spinlock structure -- never used to allocate storage
-+ * only used in macros below to overlay a spinlock_t
-+ */
-+typedef struct inst_spinlock_s {
-+ /* remember, Intel is little endian */
-+ volatile unsigned short lock;
-+ volatile unsigned short index;
-+} inst_spinlock_t;
-+#define PUT_INDEX(lock_ptr,indexv) ((inst_spinlock_t *)(lock_ptr))->index = indexv
-+#define GET_INDEX(lock_ptr) ((inst_spinlock_t *)(lock_ptr))->index
-+
-+/*
-+ * macros to cache and retrieve an index value in a read/write lock
-+ * as well as the cpu where a reader busy period started
-+ * we use the 2nd word (the debug word) for this, so require the
-+ * debug word to be present
-+ */
-+/*
-+ * instrumented rwlock structure -- never used to allocate storage
-+ * only used in macros below to overlay a rwlock_t
-+ */
-+typedef struct inst_rwlock_s {
-+ volatile int read_counter:31;
-+ volatile int write_lock:1;
-+ volatile unsigned short index;
-+ volatile unsigned short cpu;
-+} inst_rwlock_t;
-+#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
-+#define GET_RWINDEX(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->index
-+#define PUT_RW_CPU(rwlock_ptr,cpuv) ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
-+#define GET_RW_CPU(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->cpu
-+
-+/*
-+ * return the number of readers for a rwlock_t
-+ */
-+#define RWLOCK_READERS(rwlock_ptr) ((rwlock_ptr)->read_counter)
-+
-+/*
-+ * return true if rwlock is write locked
-+ * (note that other lock attempts can cause the lock value to be negative)
-+ */
-+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->write_lock)
-+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr) ((rwlock_ptr)->read_counter)
-+
-+#endif /* _IA64_LOCKMETER_H */
-+
---- linux-2.6.0/include/asm-ia64/spinlock.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-ia64/spinlock.h 2003-12-28 23:26:33.000000000 -0800
-@@ -110,8 +110,18 @@ do { \
- typedef struct {
- volatile int read_counter : 31;
- volatile int write_lock : 1;
-+#ifdef CONFIG_LOCKMETER
-+ /* required for LOCKMETER since all bits in lock are used */
-+ /* and we need this storage for CPU and lock INDEX */
-+ unsigned lockmeter_magic;
-+#endif
- } rwlock_t;
-+
-+#ifdef CONFIG_LOCKMETER
-+#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0 }
-+#else
- #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
-+#endif
-
- #define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
- #define rwlock_is_locked(x) (*(volatile int *) (x) != 0)
-@@ -127,6 +137,48 @@ do { \
- } \
- } while (0)
-
-+#ifdef CONFIG_LOCKMETER
-+/*
-+ * HACK: This works, but still have a timing window that affects performance:
-+ * we see that no one owns the Write lock, then someone * else grabs for Write
-+ * lock before we do a read_lock().
-+ * This means that on rare occasions our read_lock() will stall and spin-wait
-+ * until we acquire for Read, instead of simply returning a trylock failure.
-+ */
-+static inline int _raw_read_trylock(rwlock_t *rw)
-+{
-+ if (rw->write_lock) {
-+ return 0;
-+ } else {
-+ _raw_read_lock(rw);
-+ return 1;
-+ }
-+}
-+
-+static inline int _raw_write_trylock(rwlock_t *rw)
-+{
-+ if (!(rw->write_lock)) {
-+ /* isn't currently write-locked... that looks promising... */
-+ if (test_and_set_bit(31, rw) == 0) {
-+ /* now it is write-locked by me... */
-+ if (rw->read_counter) {
-+ /* really read-locked, so release write-lock and fail */
-+ clear_bit(31, rw);
-+ } else {
-+ /* we've the the write-lock, no read-lockers... success! */
-+ barrier();
-+ return 1;
-+ }
-+
-+ }
-+ }
-+
-+ /* falls through ... fails to write-lock */
-+ barrier();
-+ return 0;
-+}
-+#endif
-+
- #define _raw_read_unlock(rw) \
- do { \
- rwlock_t *__read_lock_ptr = (rw); \
-@@ -190,4 +242,25 @@ do { \
- clear_bit(31, (x)); \
- })
-
-+#ifdef CONFIG_LOCKMETER
-+extern void _metered_spin_lock (spinlock_t *lock);
-+extern void _metered_spin_unlock(spinlock_t *lock);
-+
-+/*
-+ * Use a less efficient, and inline, atomic_dec_and_lock() if lockmetering
-+ * so we can see the callerPC of who is actually doing the spin_lock().
-+ * Otherwise, all we see is the generic rollup of all locks done by
-+ * atomic_dec_and_lock().
-+ */
-+static inline int atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
-+{
-+ _metered_spin_lock(lock);
-+ if (atomic_dec_and_test(atomic))
-+ return 1;
-+ _metered_spin_unlock(lock);
-+ return 0;
-+}
-+#define ATOMIC_DEC_AND_LOCK
-+#endif
-+
- #endif /* _ASM_IA64_SPINLOCK_H */
---- linux-2.6.0/include/asm-ia64/statfs.h 2003-08-08 22:55:13.000000000 -0700
-+++ 25/include/asm-ia64/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -43,5 +43,18 @@ struct statfs64 {
- long f_spare[5];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+} __attribute__((packed));
-
- #endif /* _ASM_IA64_STATFS_H */
---- linux-2.6.0/include/asm-m68k/byteorder.h 2003-06-14 12:18:08.000000000 -0700
-+++ 25/include/asm-m68k/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -2,10 +2,11 @@
- #define _M68K_BYTEORDER_H
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 val)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val)
- {
- __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
- return val;
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-m68k/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_M68K_CPUMASK_H
-+#define _ASM_M68K_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_M68K_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-m68knommu/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_M68KNOMMU_CPUMASK_H
-+#define _ASM_M68KNOMMU_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_M68KNOMMU_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-mips/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_MIPS_CPUMASK_H
-+#define _ASM_MIPS_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_MIPS_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-mips/lockmeter.h 2003-12-28 23:26:33.000000000 -0800
-@@ -0,0 +1,126 @@
-+/*
-+ * Copyright (C) 1999,2000 Silicon Graphics, Inc.
-+ *
-+ * Written by John Hawkes (hawkes@sgi.com)
-+ * Based on klstat.h by Jack Steiner (steiner@sgi.com)
-+ * Ported to mips32 for Asita Technologies
-+ * by D.J. Barrow ( dj.barrow@asitatechnologies.com )
-+ */
-+#ifndef _ASM_LOCKMETER_H
-+#define _ASM_LOCKMETER_H
-+
-+/* do_gettimeoffset is a function pointer on mips */
-+/* & it is not included by <linux/time.h> */
-+#include <asm/time.h>
-+#include <linux/time.h>
-+#include <asm/div64.h>
-+
-+#define SPINLOCK_MAGIC_INIT /* */
-+
-+#define CPU_CYCLE_FREQUENCY get_cpu_cycle_frequency()
-+
-+#define THIS_CPU_NUMBER smp_processor_id()
-+
-+static uint32_t cpu_cycle_frequency = 0;
-+
-+static uint32_t get_cpu_cycle_frequency(void)
-+{
-+ /* a total hack, slow and invasive, but ... it works */
-+ int sec;
-+ uint32_t start_cycles;
-+ struct timeval tv;
-+
-+ if (cpu_cycle_frequency == 0) { /* uninitialized */
-+ do_gettimeofday(&tv);
-+ sec = tv.tv_sec; /* set up to catch the tv_sec rollover */
-+ while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
-+ sec = tv.tv_sec; /* rolled over to a new sec value */
-+ start_cycles = get_cycles();
-+ while (sec == tv.tv_sec) { do_gettimeofday(&tv); }
-+ cpu_cycle_frequency = get_cycles() - start_cycles;
-+ }
-+
-+ return cpu_cycle_frequency;
-+}
-+
-+extern struct timeval xtime;
-+
-+static uint64_t get_cycles64(void)
-+{
-+ static uint64_t last_get_cycles64 = 0;
-+ uint64_t ret;
-+ unsigned long sec;
-+ unsigned long usec, usec_offset;
-+
-+again:
-+ sec = xtime.tv_sec;
-+ usec = xtime.tv_usec;
-+ usec_offset = do_gettimeoffset();
-+ if ((xtime.tv_sec != sec) ||
-+ (xtime.tv_usec != usec)||
-+ (usec_offset >= 20000))
-+ goto again;
-+
-+ ret = ((uint64_t)(usec + usec_offset) * cpu_cycle_frequency);
-+ /* We can't do a normal 64 bit division on mips without libgcc.a */
-+ do_div(ret,1000000);
-+ ret += ((uint64_t)sec * cpu_cycle_frequency);
-+
-+ /* XXX why does time go backwards? do_gettimeoffset? general time adj? */
-+ if (ret <= last_get_cycles64)
-+ ret = last_get_cycles64+1;
-+ last_get_cycles64 = ret;
-+
-+ return ret;
-+}
-+
-+/*
-+ * macros to cache and retrieve an index value inside of a lock
-+ * these macros assume that there are less than 65536 simultaneous
-+ * (read mode) holders of a rwlock.
-+ * we also assume that the hash table has less than 32767 entries.
-+ * the high order bit is used for write locking a rw_lock
-+ */
-+#define INDEX_MASK 0x7FFF0000
-+#define READERS_MASK 0x0000FFFF
-+#define INDEX_SHIFT 16
-+#define PUT_INDEX(lockp,index) \
-+ lockp->lock = (((lockp->lock) & ~INDEX_MASK) | (index) << INDEX_SHIFT)
-+#define GET_INDEX(lockp) \
-+ (((lockp->lock) & INDEX_MASK) >> INDEX_SHIFT)
-+
-+/*
-+ * macros to cache and retrieve an index value in a read/write lock
-+ * as well as the cpu where a reader busy period started
-+ * we use the 2nd word (the debug word) for this, so require the
-+ * debug word to be present
-+ */
-+/*
-+ * instrumented rwlock structure -- never used to allocate storage
-+ * only used in macros below to overlay a rwlock_t
-+ */
-+typedef struct inst_rwlock_s {
-+ volatile int lock;
-+ unsigned short index;
-+ unsigned short cpu;
-+} inst_rwlock_t;
-+#define PUT_RWINDEX(rwlock_ptr,indexv) ((inst_rwlock_t *)(rwlock_ptr))->index = indexv
-+#define GET_RWINDEX(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->index
-+#define PUT_RW_CPU(rwlock_ptr,cpuv) ((inst_rwlock_t *)(rwlock_ptr))->cpu = cpuv
-+#define GET_RW_CPU(rwlock_ptr) ((inst_rwlock_t *)(rwlock_ptr))->cpu
-+
-+/*
-+ * return the number of readers for a rwlock_t
-+ */
-+#define RWLOCK_READERS(rwlock_ptr) rwlock_readers(rwlock_ptr)
-+
-+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
-+{
-+ int tmp = (int) rwlock_ptr->lock;
-+ return (tmp >= 0) ? tmp : 0;
-+}
-+
-+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock < 0)
-+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr) ((rwlock_ptr)->lock > 0)
-+
-+#endif /* _ASM_LOCKMETER_H */
---- linux-2.6.0/include/asm-mips/spinlock.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/asm-mips/spinlock.h 2003-12-28 23:26:33.000000000 -0800
-@@ -91,9 +91,18 @@ static inline unsigned int _raw_spin_try
-
- typedef struct {
- volatile unsigned int lock;
-+#ifdef CONFIG_LOCKMETER
-+ /* required for LOCKMETER since all bits in lock are used */
-+ /* and we need this storage for CPU and lock INDEX */
-+ unsigned lockmeter_magic;
-+#endif
- } rwlock_t;
-
-+#ifdef CONFIG_LOCKMETER
-+#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
-+#else
- #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
-+#endif
-
- #define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
-
---- linux-2.6.0/include/asm-mips/statfs.h 2003-08-08 22:55:13.000000000 -0700
-+++ 25/include/asm-mips/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -75,6 +75,20 @@ struct statfs64 { /* Same as struct st
- long f_spare[6];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+};
-+
- #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
-
- #endif /* _ASM_STATFS_H */
---- linux-2.6.0/include/asm-parisc/byteorder.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-parisc/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -2,10 +2,11 @@
- #define _PARISC_BYTEORDER_H
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
-
--static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
-+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
- {
- __asm__("dep %0, 15, 8, %0\n\t" /* deposit 00ab -> 0bab */
- "shd %%r0, %0, 8, %0" /* shift 000000ab -> 00ba */
-@@ -14,7 +15,7 @@ static __inline__ __const__ __u16 ___arc
- return x;
- }
-
--static __inline__ __const__ __u32 ___arch__swab24(__u32 x)
-+static __inline__ __attribute_const__ __u32 ___arch__swab24(__u32 x)
- {
- __asm__("shd %0, %0, 8, %0\n\t" /* shift xabcxabc -> cxab */
- "dep %0, 15, 8, %0\n\t" /* deposit cxab -> cbab */
-@@ -24,7 +25,7 @@ static __inline__ __const__ __u32 ___arc
- return x;
- }
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
- {
- unsigned int temp;
- __asm__("shd %0, %0, 16, %1\n\t" /* shift abcdabcd -> cdab */
-@@ -47,7 +48,7 @@ static __inline__ __const__ __u32 ___arc
- ** HSHR 67452301 -> *6*4*2*0 into %0
- ** OR %0 | %1 -> 76543210 into %0 (all done!)
- */
--static __inline__ __const__ __u64 ___arch__swab64(__u64 x) {
-+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x) {
- __u64 temp;
- __asm__("permh,3210 %0, %0\n\t"
- "hshl %0, 8, %1\n\t"
-@@ -60,7 +61,7 @@ static __inline__ __const__ __u64 ___arc
- #define __arch__swab64(x) ___arch__swab64(x)
- #define __BYTEORDER_HAS_U64__
- #elif !defined(__STRICT_ANSI__)
--static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
-+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
- {
- __u32 t1 = ___arch__swab32((__u32) x);
- __u32 t2 = ___arch__swab32((__u32) (x >> 32));
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-parisc/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_PARISC_CPUMASK_H
-+#define _ASM_PARISC_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_PARISC_CPUMASK_H */
---- linux-2.6.0/include/asm-parisc/ioctl.h 2003-10-08 15:07:10.000000000 -0700
-+++ 25/include/asm-parisc/ioctl.h 2003-12-28 23:22:30.000000000 -0800
-@@ -45,7 +45,7 @@
- ((size) << _IOC_SIZESHIFT))
-
- /* provoke compile error for invalid uses of size argument */
--extern int __invalid_size_argument_for_IOC;
-+extern unsigned int __invalid_size_argument_for_IOC;
- #define _IOC_TYPECHECK(t) \
- ((sizeof(t) == sizeof(t[1]) && \
- sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
---- linux-2.6.0/include/asm-parisc/statfs.h 2003-06-22 12:04:45.000000000 -0700
-+++ 25/include/asm-parisc/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -41,4 +41,18 @@ struct statfs64 {
- long f_spare[5];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+};
-+
- #endif
---- linux-2.6.0/include/asm-ppc64/byteorder.h 2003-06-14 12:18:51.000000000 -0700
-+++ 25/include/asm-ppc64/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -9,6 +9,7 @@
- */
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
- #ifdef __KERNEL__
-@@ -40,7 +41,7 @@ static __inline__ void st_le32(volatile
- }
-
- #if 0
--static __inline__ __const__ __u16 ___arch__swab16(__u16 value)
-+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 value)
- {
- __u16 result;
-
-@@ -50,7 +51,7 @@ static __inline__ __const__ __u16 ___arc
- return result;
- }
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 value)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 value)
- {
- __u32 result;
-
-@@ -62,7 +63,7 @@ static __inline__ __const__ __u32 ___arc
- return result;
- }
-
--static __inline__ __const__ __u64 ___arch__swab64(__u64 value)
-+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 value)
- {
- __u64 result;
- #error implement me
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-ppc64/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_PPC64_CPUMASK_H
-+#define _ASM_PPC64_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_PPC64_CPUMASK_H */
---- linux-2.6.0/include/asm-ppc64/ioctl.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-ppc64/ioctl.h 2003-12-28 23:22:30.000000000 -0800
-@@ -43,7 +43,7 @@
- ((size) << _IOC_SIZESHIFT))
-
- /* provoke compile error for invalid uses of size argument */
--extern int __invalid_size_argument_for_IOC;
-+extern unsigned int __invalid_size_argument_for_IOC;
- #define _IOC_TYPECHECK(t) \
- ((sizeof(t) == sizeof(t[1]) && \
- sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
---- linux-2.6.0/include/asm-ppc64/page.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-ppc64/page.h 2003-12-28 23:22:58.000000000 -0800
-@@ -41,6 +41,7 @@
- ( ((addr > (TASK_HPAGE_BASE-len)) && (addr < TASK_HPAGE_END)) || \
- ((current->mm->context & CONTEXT_LOW_HPAGES) && \
- (addr > (TASK_HPAGE_BASE_32-len)) && (addr < TASK_HPAGE_END_32)) )
-+#define hugetlb_free_pgtables free_pgtables
- #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
-
- #define in_hugepage_area(context, addr) \
---- linux-2.6.0/include/asm-ppc64/statfs.h 2003-06-22 12:04:45.000000000 -0700
-+++ 25/include/asm-ppc64/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -44,4 +44,18 @@ struct statfs64 {
- long f_spare[5];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+};
-+
- #endif /* _PPC64_STATFS_H */
---- linux-2.6.0/include/asm-ppc/byteorder.h 2003-06-14 12:18:09.000000000 -0700
-+++ 25/include/asm-ppc/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -2,6 +2,7 @@
- #define _PPC_BYTEORDER_H
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
- #ifdef __KERNEL__
-@@ -32,7 +33,7 @@ extern __inline__ void st_le32(volatile
- __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr));
- }
-
--static __inline__ __const__ __u16 ___arch__swab16(__u16 value)
-+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 value)
- {
- __u16 result;
-
-@@ -40,7 +41,7 @@ static __inline__ __const__ __u16 ___arc
- return result;
- }
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 value)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 value)
- {
- __u32 result;
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-ppc/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_PPC_CPUMASK_H
-+#define _ASM_PPC_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_PPC_CPUMASK_H */
---- linux-2.6.0/include/asm-ppc/highmem.h 2003-10-08 15:07:10.000000000 -0700
-+++ 25/include/asm-ppc/highmem.h 2003-12-28 23:22:58.000000000 -0800
-@@ -81,6 +81,7 @@ static inline void *kmap_atomic(struct p
- unsigned int idx;
- unsigned long vaddr;
-
-+ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
- inc_preempt_count();
- if (page < highmem_start_page)
- return page_address(page);
-@@ -105,6 +106,7 @@ static inline void kunmap_atomic(void *k
-
- if (vaddr < KMAP_FIX_BEGIN) { // FIXME
- dec_preempt_count();
-+ preempt_check_resched();
- return;
- }
-
-@@ -119,6 +121,7 @@ static inline void kunmap_atomic(void *k
- flush_tlb_page(0, vaddr);
- #endif
- dec_preempt_count();
-+ preempt_check_resched();
- }
-
- static inline struct page *kmap_atomic_to_page(void *ptr)
---- linux-2.6.0/include/asm-ppc/ibm4xx.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-ppc/ibm4xx.h 2003-12-28 23:22:27.000000000 -0800
-@@ -90,8 +90,6 @@ void ppc4xx_init(unsigned long r3, unsig
- #include <platforms/4xx/ocotea.h>
- #endif
-
--#endif /* CONFIG_40x */
--
- #ifndef __ASSEMBLY__
- /*
- * The "residual" board information structure the boot loader passes
-@@ -99,6 +97,7 @@ void ppc4xx_init(unsigned long r3, unsig
- */
- extern bd_t __res;
- #endif
-+#endif /* CONFIG_40x */
-
- #endif /* __ASM_IBM4XX_H__ */
- #endif /* __KERNEL__ */
---- linux-2.6.0/include/asm-ppc/ioctl.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/asm-ppc/ioctl.h 2003-12-28 23:22:30.000000000 -0800
-@@ -38,7 +38,7 @@
- ((size) << _IOC_SIZESHIFT))
-
- /* provoke compile error for invalid uses of size argument */
--extern int __invalid_size_argument_for_IOC;
-+extern unsigned int __invalid_size_argument_for_IOC;
- #define _IOC_TYPECHECK(t) \
- ((sizeof(t) == sizeof(t[1]) && \
- sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
---- linux-2.6.0/include/asm-ppc/mpc8260.h 2003-06-14 12:17:56.000000000 -0700
-+++ 25/include/asm-ppc/mpc8260.h 2003-12-28 23:22:27.000000000 -0800
-@@ -1,15 +1,36 @@
--/* This is the single file included by all MPC8260 build options.
-+/*
- * Since there are many different boards and no standard configuration,
- * we have a unique include file for each. Rather than change every
- * file that has to include MPC8260 configuration, they all include
- * this one and the configuration switching is done here.
- */
- #ifdef __KERNEL__
--#ifndef __CONFIG_8260_DEFS
--#define __CONFIG_8260_DEFS
-+#ifndef __ASM_PPC_MPC8260_H__
-+#define __ASM_PPC_MPC8260_H__
-
- #include <linux/config.h>
--#include <platforms/mpc82xx.h>
-+
-+#ifdef CONFIG_8260
-+
-+#ifdef CONFIG_EST8260
-+#include <platforms/est8260.h>
-+#endif
-+
-+#ifdef CONFIG_SBS8260
-+#include <platforms/sbs8260.h>
-+#endif
-+
-+#ifdef CONFIG_RPX6
-+#include <platforms/rpxsuper.h>
-+#endif
-+
-+#ifdef CONFIG_WILLOW
-+#include <platforms/willow.h>
-+#endif
-+
-+#ifdef CONFIG_TQM8260
-+#include <platforms/tqm8260.h>
-+#endif
-
- /* Make sure the memory translation stuff is there if PCI not used.
- */
-@@ -34,10 +55,13 @@
- #define IO_VIRT_ADDR IO_PHYS_ADDR
- #endif
-
-+#ifndef __ASSEMBLY__
- /* The "residual" data board information structure the boot loader
- * hands to us.
- */
- extern unsigned char __res[];
-+#endif
-
--#endif /* !__CONFIG_8260_DEFS */
-+#endif /* CONFIG_8260 */
-+#endif /* !__ASM_PPC_MPC8260_H__ */
- #endif /* __KERNEL__ */
---- linux-2.6.0/include/asm-s390/byteorder.h 2003-06-14 12:18:51.000000000 -0700
-+++ 25/include/asm-s390/byteorder.h 2003-12-28 23:22:56.000000000 -0800
-@@ -10,11 +10,12 @@
- */
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
-
- #ifdef __s390x__
--static __inline__ __const__ __u64 ___arch__swab64p(__u64 *x)
-+static __inline__ __attribute_pure__ __u64 ___arch__swab64p(__const__ __u64 *x)
- {
- __u64 result;
-
-@@ -24,7 +25,7 @@ static __inline__ __const__ __u64 ___arc
- return result;
- }
-
--static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
-+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
- {
- __u64 result;
-
-@@ -40,7 +41,7 @@ static __inline__ void ___arch__swab64s(
- }
- #endif /* __s390x__ */
-
--static __inline__ __const__ __u32 ___arch__swab32p(__u32 *x)
-+static __inline__ __attribute_pure__ __u32 ___arch__swab32p(__const__ __u32 *x)
- {
- __u32 result;
-
-@@ -58,7 +59,7 @@ static __inline__ __const__ __u32 ___arc
- return result;
- }
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
- {
- #ifndef __s390x__
- return ___arch__swab32p(&x);
-@@ -77,7 +78,7 @@ static __inline__ void ___arch__swab32s(
- *x = ___arch__swab32p(x);
- }
-
--static __inline__ __const__ __u16 ___arch__swab16p(__u16 *x)
-+static __inline__ __attribute_pure__ __u16 ___arch__swab16p(__const__ __u16 *x)
- {
- __u16 result;
-
-@@ -93,7 +94,7 @@ static __inline__ __const__ __u16 ___arc
- return result;
- }
-
--static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
-+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
- {
- return ___arch__swab16p(&x);
- }
---- linux-2.6.0/include/asm-s390/ccwdev.h 2003-07-02 14:53:17.000000000 -0700
-+++ 25/include/asm-s390/ccwdev.h 2003-12-28 23:23:06.000000000 -0800
-@@ -69,7 +69,7 @@ ccw_device_id_match(const struct ccw_dev
- /* The struct ccw device is our replacement for the globally accessible
- * ioinfo array. ioinfo will mutate into a subchannel device later.
- *
-- * Reference: Documentation/driver-model.txt */
-+ * Reference: Documentation/s390/driver-model.txt */
- struct ccw_device {
- spinlock_t *ccwlock;
- struct ccw_device_private *private; /* cio private information */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-s390/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_S390_CPUMASK_H
-+#define _ASM_S390_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_S390_CPUMASK_H */
---- linux-2.6.0/include/asm-s390/statfs.h 2003-07-02 14:53:17.000000000 -0700
-+++ 25/include/asm-s390/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -53,5 +53,19 @@ struct statfs64 {
- int f_spare[5];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+};
-+
- #endif /* __s390x__ */
- #endif
---- linux-2.6.0/include/asm-sh/byteorder.h 2003-07-02 14:53:18.000000000 -0700
-+++ 25/include/asm-sh/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -6,8 +6,9 @@
- */
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
- {
- __asm__("swap.b %0, %0\n\t"
- "swap.w %0, %0\n\t"
-@@ -17,7 +18,7 @@ static __inline__ __const__ __u32 ___arc
- return x;
- }
-
--static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
-+static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
- {
- __asm__("swap.b %0, %0"
- : "=r" (x)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-sh/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SH_CPUMASK_H
-+#define _ASM_SH_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_SH_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-sparc64/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SPARC64_CPUMASK_H
-+#define _ASM_SPARC64_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_SPARC64_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-sparc64/lockmeter.h 2003-12-28 23:26:33.000000000 -0800
-@@ -0,0 +1,45 @@
-+/*
-+ * Copyright (C) 2000 Anton Blanchard (anton@linuxcare.com)
-+ * Copyright (C) 2003 David S. Miller (davem@redhat.com)
-+ */
-+
-+#ifndef _SPARC64_LOCKMETER_H
-+#define _SPARC64_LOCKMETER_H
-+
-+#include <linux/smp.h>
-+#include <asm/spinlock.h>
-+#include <asm/timer.h>
-+#include <asm/timex.h>
-+
-+/* Actually, this is not the CPU frequency by the system tick
-+ * frequency which is good enough for lock metering.
-+ */
-+#define CPU_CYCLE_FREQUENCY (timer_tick_offset * HZ)
-+#define THIS_CPU_NUMBER smp_processor_id()
-+
-+#define PUT_INDEX(lock_ptr,indexv) (lock_ptr)->index = (indexv)
-+#define GET_INDEX(lock_ptr) (lock_ptr)->index
-+
-+#define PUT_RWINDEX(rwlock_ptr,indexv) (rwlock_ptr)->index = (indexv)
-+#define GET_RWINDEX(rwlock_ptr) (rwlock_ptr)->index
-+#define PUT_RW_CPU(rwlock_ptr,cpuv) (rwlock_ptr)->cpu = (cpuv)
-+#define GET_RW_CPU(rwlock_ptr) (rwlock_ptr)->cpu
-+
-+#define RWLOCK_READERS(rwlock_ptr) rwlock_readers(rwlock_ptr)
-+
-+extern inline int rwlock_readers(rwlock_t *rwlock_ptr)
-+{
-+ signed int tmp = rwlock_ptr->lock;
-+
-+ if (tmp > 0)
-+ return tmp;
-+ else
-+ return 0;
-+}
-+
-+#define RWLOCK_IS_WRITE_LOCKED(rwlock_ptr) ((signed int)((rwlock_ptr)->lock) < 0)
-+#define RWLOCK_IS_READ_LOCKED(rwlock_ptr) ((signed int)((rwlock_ptr)->lock) > 0)
-+
-+#define get_cycles64() get_cycles()
-+
-+#endif /* _SPARC64_LOCKMETER_H */
---- linux-2.6.0/include/asm-sparc64/spinlock.h 2003-11-23 19:03:02.000000000 -0800
-+++ 25/include/asm-sparc64/spinlock.h 2003-12-28 23:26:33.000000000 -0800
-@@ -30,15 +30,23 @@
-
- #ifndef CONFIG_DEBUG_SPINLOCK
-
--typedef unsigned char spinlock_t;
--#define SPIN_LOCK_UNLOCKED 0
-+typedef struct {
-+ unsigned char lock;
-+ unsigned int index;
-+} spinlock_t;
-
--#define spin_lock_init(lock) (*((unsigned char *)(lock)) = 0)
--#define spin_is_locked(lock) (*((volatile unsigned char *)(lock)) != 0)
-+#ifdef CONFIG_LOCKMETER
-+#define SPIN_LOCK_UNLOCKED (spinlock_t) {0, 0}
-+#else
-+#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
-+#endif
-
--#define spin_unlock_wait(lock) \
-+#define spin_lock_init(__lock) do { *(__lock) = SPIN_LOCK_UNLOCKED; } while(0)
-+#define spin_is_locked(__lock) (*((volatile unsigned char *)(&((__lock)->lock))) != 0)
-+
-+#define spin_unlock_wait(__lock) \
- do { membar("#LoadLoad"); \
--} while(*((volatile unsigned char *)lock))
-+} while(*((volatile unsigned char *)(&(((spinlock_t *)__lock)->lock))))
-
- static __inline__ void _raw_spin_lock(spinlock_t *lock)
- {
-@@ -109,17 +117,31 @@ extern int _spin_trylock (spinlock_t *lo
-
- #ifndef CONFIG_DEBUG_SPINLOCK
-
--typedef unsigned int rwlock_t;
--#define RW_LOCK_UNLOCKED 0
--#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
--#define rwlock_is_locked(x) (*(x) != RW_LOCK_UNLOCKED)
-+#ifdef CONFIG_LOCKMETER
-+typedef struct {
-+ unsigned int lock;
-+ unsigned int index;
-+ unsigned int cpu;
-+} rwlock_t;
-+#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0xff }
-+#else
-+typedef struct {
-+ unsigned int lock;
-+} rwlock_t;
-+#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
-+#endif
-+
-+#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
-+#define rwlock_is_locked(x) ((x)->lock != 0)
-
-+extern int __read_trylock(rwlock_t *);
- extern void __read_lock(rwlock_t *);
- extern void __read_unlock(rwlock_t *);
- extern void __write_lock(rwlock_t *);
- extern void __write_unlock(rwlock_t *);
- extern int __write_trylock(rwlock_t *);
-
-+#define _raw_read_trylock(p) __read_trylock(p)
- #define _raw_read_lock(p) __read_lock(p)
- #define _raw_read_unlock(p) __read_unlock(p)
- #define _raw_write_lock(p) __write_lock(p)
---- linux-2.6.0/include/asm-sparc64/statfs.h 2003-06-22 12:04:45.000000000 -0700
-+++ 25/include/asm-sparc64/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -38,4 +38,18 @@ struct statfs64 {
- long f_spare[5];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+};
-+
- #endif
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-sparc/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_SPARC_CPUMASK_H
-+#define _ASM_SPARC_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_SPARC_CPUMASK_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-um/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_UM_CPUMASK_H
-+#define _ASM_UM_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_UM_CPUMASK_H */
---- linux-2.6.0/include/asm-v850/byteorder.h 2003-06-14 12:18:30.000000000 -0700
-+++ 25/include/asm-v850/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -15,17 +15,18 @@
- #define __V850_BYTEORDER_H__
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
-
--static __inline__ __const__ __u32 ___arch__swab32 (__u32 word)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32 (__u32 word)
- {
- __u32 res;
- __asm__ ("bsw %1, %0" : "=r" (res) : "r" (word));
- return res;
- }
-
--static __inline__ __const__ __u16 ___arch__swab16 (__u16 half_word)
-+static __inline__ __attribute_const__ __u16 ___arch__swab16 (__u16 half_word)
- {
- __u16 res;
- __asm__ ("bsh %1, %0" : "=r" (res) : "r" (half_word));
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-v850/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_V850_CPUMASK_H
-+#define _ASM_V850_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_V850_CPUMASK_H */
---- linux-2.6.0/include/asm-x86_64/acpi.h 2003-06-14 12:18:25.000000000 -0700
-+++ 25/include/asm-x86_64/acpi.h 2003-12-28 23:21:33.000000000 -0800
-@@ -104,25 +104,26 @@
- :"0"(n_hi), "1"(n_lo))
-
-
--#ifndef CONFIG_ACPI_BOOT
--#define acpi_lapic 0
--#define acpi_ioapic 0
--#else
--#ifdef CONFIG_X86_LOCAL_APIC
-+#ifdef CONFIG_ACPI_BOOT
- extern int acpi_lapic;
--#else
--#define acpi_lapic 0
--#endif
--#ifdef CONFIG_X86_IO_APIC
- extern int acpi_ioapic;
--#else
--#define acpi_ioapic 0
--#endif
-+extern int acpi_noirq;
-
- /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */
- #define FIX_ACPI_PAGES 4
-
--#endif /*CONFIG_ACPI_BOOT*/
-+#else /* !CONFIG_ACPI_BOOT */
-+#define acpi_lapic 0
-+#define acpi_ioapic 0
-+#endif /* !CONFIG_ACPI_BOOT */
-+
-+#ifdef CONFIG_ACPI_PCI
-+static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
-+extern int acpi_irq_balance_set(char *str);
-+#else
-+static inline void acpi_noirq_set(void) { }
-+static inline int acpi_irq_balance_set(char *str) { return 0; }
-+#endif
-
- #ifdef CONFIG_ACPI_SLEEP
-
---- linux-2.6.0/include/asm-x86_64/a.out.h 2003-06-14 12:18:08.000000000 -0700
-+++ 25/include/asm-x86_64/a.out.h 2003-12-28 23:22:16.000000000 -0800
-@@ -1,13 +1,11 @@
- #ifndef __X8664_A_OUT_H__
- #define __X8664_A_OUT_H__
-
--
--/* Note: a.out is not supported in 64bit mode. This is just here to
-- still let some old things compile. */
-+/* 32bit a.out */
-
- struct exec
- {
-- unsigned long a_info; /* Use macros N_MAGIC, etc for access */
-+ unsigned int a_info; /* Use macros N_MAGIC, etc for access */
- unsigned a_text; /* length of text, in bytes */
- unsigned a_data; /* length of data, in bytes */
- unsigned a_bss; /* length of uninitialized data area for file, in bytes */
-@@ -23,7 +21,7 @@ struct exec
-
- #ifdef __KERNEL__
-
--#define STACK_TOP TASK_SIZE
-+#define STACK_TOP 0xc0000000
-
- #endif
-
---- linux-2.6.0/include/asm-x86_64/byteorder.h 2003-06-14 12:18:29.000000000 -0700
-+++ 25/include/asm-x86_64/byteorder.h 2003-12-28 23:22:55.000000000 -0800
-@@ -2,16 +2,17 @@
- #define _X86_64_BYTEORDER_H
-
- #include <asm/types.h>
-+#include <linux/compiler.h>
-
- #ifdef __GNUC__
-
--static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
-+static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
- {
- __asm__("bswapq %0" : "=r" (x) : "0" (x));
- return x;
- }
-
--static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
- {
- __asm__("bswapl %0" : "=r" (x) : "0" (x));
- return x;
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/asm-x86_64/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,6 @@
-+#ifndef _ASM_X86_64_CPUMASK_H
-+#define _ASM_X86_64_CPUMASK_H
-+
-+#include <asm-generic/cpumask.h>
-+
-+#endif /* _ASM_X86_64_CPUMASK_H */
---- linux-2.6.0/include/asm-x86_64/hw_irq.h 2003-11-23 19:03:02.000000000 -0800
-+++ 25/include/asm-x86_64/hw_irq.h 2003-12-28 23:21:44.000000000 -0800
-@@ -173,6 +173,8 @@ static inline void hw_resend_irq(struct
- static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i) {}
- #endif
-
-+#define platform_legacy_irq(irq) ((irq) < 16)
-+
- #endif
-
- #endif /* _ASM_HW_IRQ_H */
---- linux-2.6.0/include/asm-x86_64/io_apic.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-x86_64/io_apic.h 2003-12-28 23:21:44.000000000 -0800
-@@ -174,6 +174,25 @@ extern int sis_apic_bug; /* dummy */
- #define io_apic_assign_pci_irqs 0
- #endif
-
-+static inline int use_pci_vector(void) {return 0;}
-+static inline void disable_edge_ioapic_irq(unsigned int irq) { }
-+static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { }
-+static inline void end_edge_ioapic_irq (unsigned int irq) { }
-+#define startup_level_ioapic startup_level_ioapic_irq
-+#define shutdown_level_ioapic mask_IO_APIC_irq
-+#define enable_level_ioapic unmask_IO_APIC_irq
-+#define disable_level_ioapic mask_IO_APIC_irq
-+#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_irq
-+#define end_level_ioapic end_level_ioapic_irq
-+#define set_ioapic_affinity set_ioapic_affinity_irq
-+
-+#define startup_edge_ioapic startup_edge_ioapic_irq
-+#define shutdown_edge_ioapic disable_edge_ioapic_irq
-+#define enable_edge_ioapic unmask_IO_APIC_irq
-+#define disable_edge_ioapic disable_edge_ioapic_irq
-+#define ack_edge_ioapic ack_edge_ioapic_irq
-+#define end_edge_ioapic end_edge_ioapic_irq
-+
- void enable_NMI_through_LVT0 (void * dummy);
-
- #endif
---- linux-2.6.0/include/asm-x86_64/io.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/asm-x86_64/io.h 2003-12-28 23:26:30.000000000 -0800
-@@ -304,8 +304,8 @@ out:
- /* Disable vmerge for now. Need to fix the block layer code
- to check for non iommu addresses first.
- When the IOMMU is force it is safe to enable. */
--extern int force_iommu;
--#define BIO_VERMGE_BOUNDARY (force_iommu ? 4096 : 0)
-+extern int iommu_merge;
-+#define BIO_VMERGE_BOUNDARY (iommu_merge ? 4096 : 0)
-
- #endif /* __KERNEL__ */
-
---- linux-2.6.0/include/asm-x86_64/statfs.h 2003-06-22 12:04:45.000000000 -0700
-+++ 25/include/asm-x86_64/statfs.h 2003-12-28 23:22:16.000000000 -0800
-@@ -41,4 +41,18 @@ struct statfs64 {
- long f_spare[5];
- };
-
-+struct compat_statfs64 {
-+ __u32 f_type;
-+ __u32 f_bsize;
-+ __u64 f_blocks;
-+ __u64 f_bfree;
-+ __u64 f_bavail;
-+ __u64 f_files;
-+ __u64 f_ffree;
-+ __kernel_fsid_t f_fsid;
-+ __u32 f_namelen;
-+ __u32 f_frsize;
-+ __u32 f_spare[5];
-+} __attribute__((packed));
-+
- #endif
---- linux-2.6.0/include/asm-x86_64/stat.h 2003-06-14 12:18:33.000000000 -0700
-+++ 25/include/asm-x86_64/stat.h 2003-12-28 23:22:16.000000000 -0800
-@@ -26,4 +26,19 @@ struct stat {
- long __unused[3];
- };
-
-+/* For 32bit emulation */
-+struct __old_kernel_stat {
-+ unsigned short st_dev;
-+ unsigned short st_ino;
-+ unsigned short st_mode;
-+ unsigned short st_nlink;
-+ unsigned short st_uid;
-+ unsigned short st_gid;
-+ unsigned short st_rdev;
-+ unsigned int st_size;
-+ unsigned int st_atime;
-+ unsigned int st_mtime;
-+ unsigned int st_ctime;
-+};
-+
- #endif
---- linux-2.6.0/include/linux/aio.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/aio.h 2003-12-28 23:26:44.000000000 -0800
-@@ -29,21 +29,26 @@ struct kioctx;
- #define KIF_LOCKED 0
- #define KIF_KICKED 1
- #define KIF_CANCELLED 2
-+#define KIF_SYNCED 3
-
- #define kiocbTryLock(iocb) test_and_set_bit(KIF_LOCKED, &(iocb)->ki_flags)
- #define kiocbTryKick(iocb) test_and_set_bit(KIF_KICKED, &(iocb)->ki_flags)
-+#define kiocbTrySync(iocb) test_and_set_bit(KIF_SYNCED, &(iocb)->ki_flags)
-
- #define kiocbSetLocked(iocb) set_bit(KIF_LOCKED, &(iocb)->ki_flags)
- #define kiocbSetKicked(iocb) set_bit(KIF_KICKED, &(iocb)->ki_flags)
- #define kiocbSetCancelled(iocb) set_bit(KIF_CANCELLED, &(iocb)->ki_flags)
-+#define kiocbSetSynced(iocb) set_bit(KIF_SYNCED, &(iocb)->ki_flags)
-
- #define kiocbClearLocked(iocb) clear_bit(KIF_LOCKED, &(iocb)->ki_flags)
- #define kiocbClearKicked(iocb) clear_bit(KIF_KICKED, &(iocb)->ki_flags)
- #define kiocbClearCancelled(iocb) clear_bit(KIF_CANCELLED, &(iocb)->ki_flags)
-+#define kiocbClearSynced(iocb) clear_bit(KIF_SYNCED, &(iocb)->ki_flags)
-
- #define kiocbIsLocked(iocb) test_bit(KIF_LOCKED, &(iocb)->ki_flags)
- #define kiocbIsKicked(iocb) test_bit(KIF_KICKED, &(iocb)->ki_flags)
- #define kiocbIsCancelled(iocb) test_bit(KIF_CANCELLED, &(iocb)->ki_flags)
-+#define kiocbIsSynced(iocb) test_bit(KIF_SYNCED, &(iocb)->ki_flags)
-
- struct kiocb {
- struct list_head ki_run_list;
-@@ -54,7 +59,7 @@ struct kiocb {
- struct file *ki_filp;
- struct kioctx *ki_ctx; /* may be NULL for sync ops */
- int (*ki_cancel)(struct kiocb *, struct io_event *);
-- long (*ki_retry)(struct kiocb *);
-+ ssize_t (*ki_retry)(struct kiocb *);
-
- struct list_head ki_list; /* the aio core uses this
- * for cancellation */
-@@ -63,6 +68,16 @@ struct kiocb {
- __u64 ki_user_data; /* user's data for completion */
- loff_t ki_pos;
-
-+ /* State that we remember to be able to restart/retry */
-+ unsigned short ki_opcode;
-+ size_t ki_nbytes; /* copy of iocb->aio_nbytes */
-+ char *ki_buf; /* remaining iocb->aio_buf */
-+ size_t ki_left; /* remaining bytes */
-+ wait_queue_t ki_wait;
-+ long ki_retried; /* just for testing */
-+ long ki_kicked; /* just for testing */
-+ long ki_queued; /* just for testing */
-+
- char private[KIOCB_PRIVATE_SIZE];
- };
-
-@@ -77,6 +92,8 @@ struct kiocb {
- (x)->ki_ctx = &tsk->active_mm->default_kioctx; \
- (x)->ki_cancel = NULL; \
- (x)->ki_user_obj = tsk; \
-+ (x)->ki_user_data = 0; \
-+ init_wait((&(x)->ki_wait)); \
- } while (0)
-
- #define AIO_RING_MAGIC 0xa10a10a1
-@@ -159,6 +176,17 @@ int FASTCALL(io_submit_one(struct kioctx
- #define get_ioctx(kioctx) do { if (unlikely(atomic_read(&(kioctx)->users) <= 0)) BUG(); atomic_inc(&(kioctx)->users); } while (0)
- #define put_ioctx(kioctx) do { if (unlikely(atomic_dec_and_test(&(kioctx)->users))) __put_ioctx(kioctx); else if (unlikely(atomic_read(&(kioctx)->users) < 0)) BUG(); } while (0)
-
-+#define in_aio() !is_sync_wait(current->io_wait)
-+/* may be used for debugging */
-+#define warn_if_async() if (in_aio()) {\
-+ printk(KERN_ERR "%s(%s:%d) called in async context!\n", \
-+ __FUNCTION__, __FILE__, __LINE__); \
-+ dump_stack(); \
-+ }
-+
-+#define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait)
-+#define is_retried_kiocb(iocb) ((iocb)->ki_retried > 1)
-+
- #include <linux/aio_abi.h>
-
- static inline struct kiocb *list_kiocb(struct list_head *h)
-@@ -167,6 +195,7 @@ static inline struct kiocb *list_kiocb(s
- }
-
- /* for sysctl: */
--extern unsigned aio_max_nr, aio_max_size, aio_max_pinned;
-+extern atomic_t aio_nr;
-+extern unsigned aio_max_nr;
-
- #endif /* __LINUX__AIO_H */
---- linux-2.6.0/include/linux/arcdevice.h 2003-07-27 12:14:40.000000000 -0700
-+++ 25/include/linux/arcdevice.h 2003-12-28 23:21:01.000000000 -0800
-@@ -331,6 +331,7 @@ void arcnet_dump_packet(struct net_devic
- void arcnet_unregister_proto(struct ArcProto *proto);
- irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs);
- void arcdev_setup(struct net_device *dev);
-+struct net_device *alloc_arcdev(char *name);
- void arcnet_rx(struct net_device *dev, int bufnum);
-
- #endif /* __KERNEL__ */
---- linux-2.6.0/include/linux/bio.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/bio.h 2003-12-28 23:22:57.000000000 -0800
-@@ -162,7 +162,7 @@ struct bio {
- */
-
- #define __BVEC_END(bio) bio_iovec_idx((bio), (bio)->bi_vcnt - 1)
--#define __BVEC_START(bio) bio_iovec_idx((bio), 0)
-+#define __BVEC_START(bio) bio_iovec_idx((bio), (bio)->bi_idx)
- #define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \
- ((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2)))
- #define BIOVEC_VIRT_MERGEABLE(vec1, vec2) \
---- linux-2.6.0/include/linux/blkdev.h 2003-12-17 21:20:03.000000000 -0800
-+++ 25/include/linux/blkdev.h 2003-12-28 23:26:41.000000000 -0800
-@@ -195,11 +195,6 @@ enum rq_flag_bits {
- __REQ_PM_SUSPEND, /* suspend request */
- __REQ_PM_RESUME, /* resume request */
- __REQ_PM_SHUTDOWN, /* shutdown request */
-- __REQ_IDETAPE_PC1, /* packet command (first stage) */
-- __REQ_IDETAPE_PC2, /* packet command (second stage) */
-- __REQ_IDETAPE_READ,
-- __REQ_IDETAPE_WRITE,
-- __REQ_IDETAPE_READ_BUFFER,
- __REQ_NR_BITS, /* stops here */
- };
-
-@@ -225,11 +220,6 @@ enum rq_flag_bits {
- #define REQ_PM_SUSPEND (1 << __REQ_PM_SUSPEND)
- #define REQ_PM_RESUME (1 << __REQ_PM_RESUME)
- #define REQ_PM_SHUTDOWN (1 << __REQ_PM_SHUTDOWN)
--#define REQ_IDETAPE_PC1 (1 << __REQ_IDETAPE_PC1)
--#define REQ_IDETAPE_PC2 (1 << __REQ_IDETAPE_PC2)
--#define REQ_IDETAPE_READ (1 << __REQ_IDETAPE_READ)
--#define REQ_IDETAPE_WRITE (1 << __REQ_IDETAPE_WRITE)
--#define REQ_IDETAPE_READ_BUFFER (1 << __REQ_IDETAPE_READ_BUFFER)
-
- /*
- * State information carried for REQ_PM_SUSPEND and REQ_PM_RESUME
-@@ -597,6 +587,7 @@ extern void blk_queue_free_tags(request_
- extern int blk_queue_resize_tags(request_queue_t *, int);
- extern void blk_queue_invalidate_tags(request_queue_t *);
- extern void blk_congestion_wait(int rw, long timeout);
-+extern int blk_congestion_wait_wq(int rw, long timeout, wait_queue_t *wait);
-
- extern void blk_rq_bio_prep(request_queue_t *, struct request *, struct bio *);
- extern void blk_rq_prep_restart(struct request *);
---- linux-2.6.0/include/linux/buffer_head.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/buffer_head.h 2003-12-28 23:26:42.000000000 -0800
-@@ -162,6 +162,7 @@ void mark_buffer_async_write(struct buff
- void invalidate_bdev(struct block_device *, int);
- int sync_blockdev(struct block_device *bdev);
- void __wait_on_buffer(struct buffer_head *);
-+int __wait_on_buffer_wq(struct buffer_head *, wait_queue_t *wait);
- wait_queue_head_t *bh_waitq_head(struct buffer_head *bh);
- void wake_up_buffer(struct buffer_head *bh);
- int fsync_bdev(struct block_device *);
-@@ -173,6 +174,8 @@ void __brelse(struct buffer_head *);
- void __bforget(struct buffer_head *);
- void __breadahead(struct block_device *, sector_t block, int size);
- struct buffer_head *__bread(struct block_device *, sector_t block, int size);
-+struct buffer_head *__bread_wq(struct block_device *, sector_t block,
-+ int size, wait_queue_t *wait);
- struct buffer_head *alloc_buffer_head(int gfp_flags);
- void free_buffer_head(struct buffer_head * bh);
- void FASTCALL(unlock_buffer(struct buffer_head *bh));
-@@ -207,12 +210,6 @@ int nobh_prepare_write(struct page*, uns
- int nobh_commit_write(struct file *, struct page *, unsigned, unsigned);
- int nobh_truncate_page(struct address_space *, loff_t);
-
--#define OSYNC_METADATA (1<<0)
--#define OSYNC_DATA (1<<1)
--#define OSYNC_INODE (1<<2)
--int generic_osync_inode(struct inode *, int);
--
--
- /*
- * inline definitions
- */
-@@ -230,13 +227,13 @@ static inline void put_bh(struct buffer_
-
- static inline void brelse(struct buffer_head *bh)
- {
-- if (bh)
-+ if (bh && !IS_ERR(bh))
- __brelse(bh);
- }
-
- static inline void bforget(struct buffer_head *bh)
- {
-- if (bh)
-+ if (bh && !IS_ERR(bh))
- __bforget(bh);
- }
-
-@@ -253,7 +250,12 @@ sb_breadahead(struct super_block *sb, se
- }
-
- static inline struct buffer_head *
--sb_getblk(struct super_block *sb, sector_t block)
-+sb_bread_wq(struct super_block *sb, sector_t block, wait_queue_t *wait)
-+{
-+ return __bread_wq(sb->s_bdev, block, sb->s_blocksize, wait);
-+}
-+
-+static inline struct buffer_head *sb_getblk(struct super_block *sb, sector_t block)
- {
- return __getblk(sb->s_bdev, block, sb->s_blocksize);
- }
-@@ -277,16 +279,34 @@ map_bh(struct buffer_head *bh, struct su
- * __wait_on_buffer() just to trip a debug check. Because debug code in inline
- * functions is bloaty.
- */
--static inline void wait_on_buffer(struct buffer_head *bh)
-+
-+static inline int wait_on_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
- {
- if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
-- __wait_on_buffer(bh);
-+ return __wait_on_buffer_wq(bh, wait);
-+
-+ return 0;
-+}
-+
-+static inline void wait_on_buffer(struct buffer_head *bh)
-+{
-+ wait_on_buffer_wq(bh, NULL);
-+}
-+
-+static inline int lock_buffer_wq(struct buffer_head *bh, wait_queue_t *wait)
-+{
-+ while (test_set_buffer_locked(bh)) {
-+ int ret = __wait_on_buffer_wq(bh, wait);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
- }
-
- static inline void lock_buffer(struct buffer_head *bh)
- {
-- while (test_set_buffer_locked(bh))
-- __wait_on_buffer(bh);
-+ lock_buffer_wq(bh, NULL);
- }
-
- #endif /* _LINUX_BUFFER_HEAD_H */
---- linux-2.6.0/include/linux/byteorder/swab.h 2003-06-14 12:18:51.000000000 -0700
-+++ 25/include/linux/byteorder/swab.h 2003-12-28 23:22:55.000000000 -0800
-@@ -15,6 +15,8 @@
- *
- */
-
-+#include <linux/compiler.h>
-+
- /* casts are necessary for constants, because we never know how for sure
- * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way.
- */
-@@ -128,7 +130,7 @@
- #endif /* OPTIMIZE */
-
-
--static __inline__ __const__ __u16 __fswab16(__u16 x)
-+static __inline__ __attribute_const__ __u16 __fswab16(__u16 x)
- {
- return __arch__swab16(x);
- }
-@@ -141,7 +143,7 @@ static __inline__ void __swab16s(__u16 *
- __arch__swab16s(addr);
- }
-
--static __inline__ __const__ __u32 __fswab32(__u32 x)
-+static __inline__ __attribute_const__ __u32 __fswab32(__u32 x)
- {
- return __arch__swab32(x);
- }
-@@ -155,7 +157,7 @@ static __inline__ void __swab32s(__u32 *
- }
-
- #ifdef __BYTEORDER_HAS_U64__
--static __inline__ __const__ __u64 __fswab64(__u64 x)
-+static __inline__ __attribute_const__ __u64 __fswab64(__u64 x)
- {
- # ifdef __SWAB_64_THRU_32__
- __u32 h = x >> 32;
---- linux-2.6.0/include/linux/cdrom.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/cdrom.h 2003-12-28 23:22:35.000000000 -0800
-@@ -5,7 +5,7 @@
- * 1994, 1995 Eberhard Moenkeberg, emoenke@gwdg.de
- * 1996 David van Leeuwen, david@tm.tno.nl
- * 1997, 1998 Erik Andersen, andersee@debian.org
-- * 1998-2000 Jens Axboe, axboe@suse.de
-+ * 1998-2002 Jens Axboe, axboe@suse.de
- */
-
- #ifndef _LINUX_CDROM_H
-@@ -388,6 +388,9 @@ struct cdrom_generic_command
- #define CDC_DVD_R 0x10000 /* drive can write DVD-R */
- #define CDC_DVD_RAM 0x20000 /* drive can write DVD-RAM */
- #define CDC_MO_DRIVE 0x40000 /* drive is an MO device */
-+#define CDC_MRW 0x80000 /* drive can read MRW */
-+#define CDC_MRW_W 0x100000 /* drive can write MRW */
-+#define CDC_RAM 0x200000 /* ok to open for WRITE */
-
- /* drive status possibilities returned by CDROM_DRIVE_STATUS ioctl */
- #define CDS_NO_INFO 0 /* if not implemented */
-@@ -715,92 +718,57 @@ struct request_sense {
- __u8 asb[46];
- };
-
--#ifdef __KERNEL__
--#include <linux/fs.h> /* not really needed, later.. */
--#include <linux/device.h>
--
--struct cdrom_write_settings {
-- unsigned char fpacket; /* fixed/variable packets */
-- unsigned long packet_size; /* write out this number of packets */
-- unsigned long nwa; /* next writeable address */
-- unsigned char writeable; /* cdrom is writeable */
--};
--
--/* Uniform cdrom data structures for cdrom.c */
--struct cdrom_device_info {
-- struct cdrom_device_ops *ops; /* link to device_ops */
-- struct cdrom_device_info *next; /* next device_info for this major */
-- void *handle; /* driver-dependent data */
--/* specifications */
-- int mask; /* mask of capability: disables them */
-- int speed; /* maximum speed for reading data */
-- int capacity; /* number of discs in jukebox */
--/* device-related storage */
-- int options : 30; /* options flags */
-- unsigned mc_flags : 2; /* media change buffer flags */
-- int use_count; /* number of times device opened */
-- char name[20]; /* name of the device type */
--/* per-device flags */
-- __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */
-- __u8 reserved : 6; /* not used yet */
-- struct cdrom_write_settings write;
--};
--
--struct cdrom_device_ops {
--/* routines */
-- int (*open) (struct cdrom_device_info *, int);
-- void (*release) (struct cdrom_device_info *);
-- int (*drive_status) (struct cdrom_device_info *, int);
-- int (*media_changed) (struct cdrom_device_info *, int);
-- int (*tray_move) (struct cdrom_device_info *, int);
-- int (*lock_door) (struct cdrom_device_info *, int);
-- int (*select_speed) (struct cdrom_device_info *, int);
-- int (*select_disc) (struct cdrom_device_info *, int);
-- int (*get_last_session) (struct cdrom_device_info *,
-- struct cdrom_multisession *);
-- int (*get_mcn) (struct cdrom_device_info *,
-- struct cdrom_mcn *);
-- /* hard reset device */
-- int (*reset) (struct cdrom_device_info *);
-- /* play stuff */
-- int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
-- /* dev-specific */
-- int (*dev_ioctl) (struct cdrom_device_info *,
-- unsigned int, unsigned long);
--/* driver specifications */
-- const int capability; /* capability flags */
-- int n_minors; /* number of active minor devices */
-- /* handle uniform packets for scsi type devices (scsi,atapi) */
-- int (*generic_packet) (struct cdrom_device_info *,
-- struct cdrom_generic_command *);
--};
-+/*
-+ * feature profile
-+ */
-+#define CDF_MRW 0x28
-
--/* the general block_device operations structure: */
--extern int cdrom_open(struct cdrom_device_info *, struct inode *, struct file *);
--extern int cdrom_release(struct cdrom_device_info *, struct file *);
--extern int cdrom_ioctl(struct cdrom_device_info *, struct inode *, unsigned, unsigned long);
--extern int cdrom_media_changed(struct cdrom_device_info *);
-+/*
-+ * media status bits
-+ */
-+#define CDM_MRW_NOTMRW 0
-+#define CDM_MRW_BGFORMAT_INACTIVE 1
-+#define CDM_MRW_BGFORMAT_ACTIVE 2
-+#define CDM_MRW_BGFORMAT_COMPLETE 3
-
--extern int register_cdrom(struct cdrom_device_info *cdi);
--extern int unregister_cdrom(struct cdrom_device_info *cdi);
-+/*
-+ * mrw address spaces
-+ */
-+#define MRW_LBA_DMA 0
-+#define MRW_LBA_GAA 1
-
--typedef struct {
-- int data;
-- int audio;
-- int cdi;
-- int xa;
-- long error;
--} tracktype;
-+/*
-+ * mrw mode pages (first is deprecated) -- probed at init time and
-+ * cdi->mrw_mode_page is set
-+ */
-+#define MRW_MODE_PC_PRE1 0x2c
-+#define MRW_MODE_PC 0x03
-
--extern int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written);
--extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);
--extern int cdrom_mode_select(struct cdrom_device_info *cdi,
-- struct cdrom_generic_command *cgc);
--extern int cdrom_mode_sense(struct cdrom_device_info *cdi,
-- struct cdrom_generic_command *cgc,
-- int page_code, int page_control);
--extern void init_cdrom_command(struct cdrom_generic_command *cgc,
-- void *buffer, int len, int type);
-+struct mrw_feature_desc {
-+ __u16 feature_code;
-+#if defined(__BIG_ENDIAN_BITFIELD)
-+ __u8 reserved1 : 2;
-+ __u8 feature_version : 4;
-+ __u8 persistent : 1;
-+ __u8 curr : 1;
-+#elif defined(__LITTLE_ENDIAN_BITFIELD)
-+ __u8 curr : 1;
-+ __u8 persistent : 1;
-+ __u8 feature_version : 4;
-+ __u8 reserved1 : 2;
-+#endif
-+ __u8 add_len;
-+#if defined(__BIG_ENDIAN_BITFIELD)
-+ __u8 reserved2 : 7;
-+ __u8 write : 1;
-+#elif defined(__LITTLE_ENDIAN_BITFIELD)
-+ __u8 write : 1;
-+ __u8 reserved2 : 7;
-+#endif
-+ __u8 reserved3;
-+ __u8 reserved4;
-+ __u8 reserved5;
-+};
-
- typedef struct {
- __u16 disc_information_length;
-@@ -825,9 +793,13 @@ typedef struct {
- __u8 did_v : 1;
- __u8 dbc_v : 1;
- __u8 uru : 1;
-- __u8 reserved2 : 5;
-+ __u8 reserved2 : 2;
-+ __u8 dbit : 1;
-+ __u8 mrw_status : 2;
- #elif defined(__LITTLE_ENDIAN_BITFIELD)
-- __u8 reserved2 : 5;
-+ __u8 mrw_status : 2;
-+ __u8 dbit : 1;
-+ __u8 reserved2 : 2;
- __u8 uru : 1;
- __u8 dbc_v : 1;
- __u8 did_v : 1;
-@@ -884,6 +856,104 @@ typedef struct {
- __u32 last_rec_address;
- } track_information;
-
-+struct feature_header {
-+ __u32 data_len;
-+ __u8 reserved1;
-+ __u8 reserved2;
-+ __u16 curr_profile;
-+};
-+
-+struct mode_page_header {
-+ __u16 mode_data_length;
-+ __u8 medium_type;
-+ __u8 reserved1;
-+ __u8 reserved2;
-+ __u8 reserved3;
-+ __u16 desc_length;
-+};
-+
-+#ifdef __KERNEL__
-+#include <linux/fs.h> /* not really needed, later.. */
-+#include <linux/device.h>
-+
-+/* Uniform cdrom data structures for cdrom.c */
-+struct cdrom_device_info {
-+ struct cdrom_device_ops *ops; /* link to device_ops */
-+ struct cdrom_device_info *next; /* next device_info for this major */
-+ void *handle; /* driver-dependent data */
-+/* specifications */
-+ int mask; /* mask of capability: disables them */
-+ int speed; /* maximum speed for reading data */
-+ int capacity; /* number of discs in jukebox */
-+/* device-related storage */
-+ int options : 30; /* options flags */
-+ unsigned mc_flags : 2; /* media change buffer flags */
-+ int use_count; /* number of times device opened */
-+ char name[20]; /* name of the device type */
-+/* per-device flags */
-+ __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */
-+ __u8 reserved : 6; /* not used yet */
-+ int for_data;
-+ int (*exit)(struct cdrom_device_info *);
-+ int mrw_mode_page;
-+};
-+
-+struct cdrom_device_ops {
-+/* routines */
-+ int (*open) (struct cdrom_device_info *, int);
-+ void (*release) (struct cdrom_device_info *);
-+ int (*drive_status) (struct cdrom_device_info *, int);
-+ int (*media_changed) (struct cdrom_device_info *, int);
-+ int (*tray_move) (struct cdrom_device_info *, int);
-+ int (*lock_door) (struct cdrom_device_info *, int);
-+ int (*select_speed) (struct cdrom_device_info *, int);
-+ int (*select_disc) (struct cdrom_device_info *, int);
-+ int (*get_last_session) (struct cdrom_device_info *,
-+ struct cdrom_multisession *);
-+ int (*get_mcn) (struct cdrom_device_info *,
-+ struct cdrom_mcn *);
-+ /* hard reset device */
-+ int (*reset) (struct cdrom_device_info *);
-+ /* play stuff */
-+ int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
-+ /* dev-specific */
-+ int (*dev_ioctl) (struct cdrom_device_info *,
-+ unsigned int, unsigned long);
-+/* driver specifications */
-+ const int capability; /* capability flags */
-+ int n_minors; /* number of active minor devices */
-+ /* handle uniform packets for scsi type devices (scsi,atapi) */
-+ int (*generic_packet) (struct cdrom_device_info *,
-+ struct cdrom_generic_command *);
-+};
-+
-+/* the general block_device operations structure: */
-+extern int cdrom_open(struct cdrom_device_info *, struct block_device *, struct file *);
-+extern int cdrom_release(struct cdrom_device_info *);
-+extern int cdrom_ioctl(struct cdrom_device_info *, struct block_device *, unsigned, unsigned long);
-+extern int cdrom_media_changed(struct cdrom_device_info *);
-+
-+extern int register_cdrom(struct cdrom_device_info *cdi);
-+extern int unregister_cdrom(struct cdrom_device_info *cdi);
-+
-+typedef struct {
-+ int data;
-+ int audio;
-+ int cdi;
-+ int xa;
-+ long error;
-+} tracktype;
-+
-+extern int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written);
-+extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);
-+extern int cdrom_mode_select(struct cdrom_device_info *cdi,
-+ struct cdrom_generic_command *cgc);
-+extern int cdrom_mode_sense(struct cdrom_device_info *cdi,
-+ struct cdrom_generic_command *cgc,
-+ int page_code, int page_control);
-+extern void init_cdrom_command(struct cdrom_generic_command *cgc,
-+ void *buffer, int len, int type);
-+
- /* The SCSI spec says there could be 256 slots. */
- #define CDROM_MAX_SLOTS 256
-
-@@ -934,15 +1004,6 @@ typedef enum {
- mechtype_cartridge_changer = 5
- } mechtype_t;
-
--struct mode_page_header {
-- __u16 mode_data_length;
-- __u8 medium_type;
-- __u8 reserved1;
-- __u8 reserved2;
-- __u8 reserved3;
-- __u16 desc_length;
--};
--
- typedef struct {
- #if defined(__BIG_ENDIAN_BITFIELD)
- __u8 ps : 1;
-@@ -1032,6 +1093,41 @@ typedef struct {
- __u8 reserved3;
- } rpc_state_t;
-
-+struct event_header {
-+ __u16 data_len;
-+#if defined(__BIG_ENDIAN_BITFIELD)
-+ __u8 nea : 1;
-+ __u8 reserved1 : 4;
-+ __u8 notification_class : 3;
-+#elif defined(__LITTLE_ENDIAN_BITFIELD)
-+ __u8 notification_class : 3;
-+ __u8 reserved1 : 4;
-+ __u8 nea : 1;
-+#endif
-+ __u8 supp_event_class;
-+};
-+
-+struct media_event_desc {
-+#if defined(__BIG_ENDIAN_BITFIELD)
-+ __u8 reserved1 : 4;
-+ __u8 media_event_code : 4;
-+ __u8 reserved2 : 6;
-+ __u8 media_present : 1;
-+ __u8 door_open : 1;
-+#elif defined(__LITTLE_ENDIAN_BITFIELD)
-+ __u8 media_event_code : 4;
-+ __u8 reserved1 : 4;
-+ __u8 door_open : 1;
-+ __u8 media_present : 1;
-+ __u8 reserved2 : 6;
-+#endif
-+ __u8 start_slot;
-+ __u8 end_slot;
-+};
-+
-+extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
-+extern int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write);
-+
- #endif /* End of kernel only stuff */
-
- #endif /* _LINUX_CDROM_H */
---- linux-2.6.0/include/linux/com20020.h 2003-06-14 12:18:25.000000000 -0700
-+++ 25/include/linux/com20020.h 2003-12-28 23:21:01.000000000 -0800
-@@ -29,7 +29,6 @@
-
- int com20020_check(struct net_device *dev);
- int com20020_found(struct net_device *dev, int shared);
--void com20020_remove(struct net_device *dev);
-
- /* The number of low I/O ports used by the card. */
- #define ARCNET_TOTAL_SIZE 8
---- linux-2.6.0/include/linux/compat.h 2003-10-08 15:07:10.000000000 -0700
-+++ 25/include/linux/compat.h 2003-12-28 23:22:22.000000000 -0800
-@@ -44,8 +44,8 @@ typedef struct {
- } compat_sigset_t;
-
- extern int cp_compat_stat(struct kstat *, struct compat_stat *);
--extern int get_compat_timespec(struct timespec *, struct compat_timespec *);
--extern int put_compat_timespec(struct timespec *, struct compat_timespec *);
-+extern int get_compat_timespec(struct timespec *, const struct compat_timespec *);
-+extern int put_compat_timespec(struct timespec *, const struct compat_timespec *);
-
- struct compat_iovec {
- compat_uptr_t iov_base;
-@@ -76,20 +76,6 @@ struct compat_rusage {
- compat_long_t ru_nivcsw;
- };
-
--struct compat_statfs64 {
-- __u32 f_type;
-- __u32 f_bsize;
-- __u64 f_blocks;
-- __u64 f_bfree;
-- __u64 f_bavail;
-- __u64 f_files;
-- __u64 f_ffree;
-- __kernel_fsid_t f_fsid;
-- __u32 f_namelen;
-- __u32 f_frsize;
-- __u32 f_spare[5];
--};
--
- struct compat_dirent {
- u32 d_ino;
- compat_off_t d_off;
---- linux-2.6.0/include/linux/compat_ioctl.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/compat_ioctl.h 2003-12-28 23:21:48.000000000 -0800
-@@ -678,3 +678,10 @@ COMPATIBLE_IOCTL(NBD_CLEAR_QUE)
- COMPATIBLE_IOCTL(NBD_PRINT_DEBUG)
- COMPATIBLE_IOCTL(NBD_SET_SIZE_BLOCKS)
- COMPATIBLE_IOCTL(NBD_DISCONNECT)
-+/* i2c */
-+COMPATIBLE_IOCTL(I2C_SLAVE)
-+COMPATIBLE_IOCTL(I2C_SLAVE_FORCE)
-+COMPATIBLE_IOCTL(I2C_TENBIT)
-+COMPATIBLE_IOCTL(I2C_PEC)
-+COMPATIBLE_IOCTL(I2C_RETRIES)
-+COMPATIBLE_IOCTL(I2C_TIMEOUT)
---- linux-2.6.0/include/linux/compiler-gcc2.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/compiler-gcc2.h 2003-12-28 23:22:55.000000000 -0800
-@@ -20,4 +20,5 @@
- */
- #if __GNUC_MINOR__ >= 96
- # define __attribute_pure__ __attribute__((pure))
-+# define __attribute_const__ __attribute__((__const__))
- #endif
---- linux-2.6.0/include/linux/compiler-gcc3.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/compiler-gcc3.h 2003-12-28 23:22:55.000000000 -0800
-@@ -20,3 +20,4 @@
- #endif
-
- #define __attribute_pure__ __attribute__((pure))
-+#define __attribute_const__ __attribute__((__const__))
---- linux-2.6.0/include/linux/compiler-gcc.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/compiler-gcc.h 2003-12-28 23:21:36.000000000 -0800
-@@ -13,5 +13,5 @@
- shouldn't recognize the original var, and make assumptions about it */
- #define RELOC_HIDE(ptr, off) \
- ({ unsigned long __ptr; \
-- __asm__ ("" : "=g"(__ptr) : "0"(ptr)); \
-+ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
- (typeof(ptr)) (__ptr + (off)); })
---- linux-2.6.0/include/linux/compiler-gcc+.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/compiler-gcc+.h 2003-12-28 23:22:55.000000000 -0800
-@@ -12,3 +12,4 @@
- #define __deprecated __attribute__((deprecated))
- #define __attribute_used__ __attribute__((__used__))
- #define __attribute_pure__ __attribute__((pure))
-+#define __attribute_const__ __attribute__((__const__))
---- linux-2.6.0/include/linux/compiler.h 2003-11-23 19:03:02.000000000 -0800
-+++ 25/include/linux/compiler.h 2003-12-28 23:22:55.000000000 -0800
-@@ -76,6 +76,24 @@
- # define __attribute_pure__ /* unimplemented */
- #endif
-
-+/*
-+ * From the GCC manual:
-+ *
-+ * Many functions do not examine any values except their arguments,
-+ * and have no effects except the return value. Basically this is
-+ * just slightly more strict class than the `pure' attribute above,
-+ * since function is not allowed to read global memory.
-+ *
-+ * Note that a function that has pointer arguments and examines the
-+ * data pointed to must _not_ be declared `const'. Likewise, a
-+ * function that calls a non-`const' function usually must not be
-+ * `const'. It does not make sense for a `const' function to return
-+ * `void'.
-+ */
-+#ifndef __attribute_const__
-+# define __attribute_const__ /* unimplemented */
-+#endif
-+
- /* Optimization barrier */
- #ifndef barrier
- # define barrier() __memory_barrier()
---- linux-2.6.0/include/linux/config.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/config.h 2003-12-28 23:21:09.000000000 -0800
-@@ -2,5 +2,8 @@
- #define _LINUX_CONFIG_H
-
- #include <linux/autoconf.h>
-+#if defined(__i386__) && !defined(IN_BOOTLOADER)
-+#include <asm/kgdb.h>
-+#endif
-
- #endif
---- linux-2.6.0/include/linux/cpumask.h 2003-08-22 19:23:42.000000000 -0700
-+++ 25/include/linux/cpumask.h 2003-12-28 23:22:10.000000000 -0800
-@@ -1,42 +1,9 @@
- #ifndef __LINUX_CPUMASK_H
- #define __LINUX_CPUMASK_H
-
--#include <linux/config.h>
--#include <linux/kernel.h>
- #include <linux/threads.h>
--#include <linux/types.h>
--#include <linux/bitmap.h>
--
--#if NR_CPUS > BITS_PER_LONG && NR_CPUS != 1
--#define CPU_ARRAY_SIZE BITS_TO_LONGS(NR_CPUS)
--
--struct cpumask
--{
-- unsigned long mask[CPU_ARRAY_SIZE];
--};
--
--typedef struct cpumask cpumask_t;
--
--#else
--typedef unsigned long cpumask_t;
--#endif
--
--#ifdef CONFIG_SMP
--#if NR_CPUS > BITS_PER_LONG
--#include <asm-generic/cpumask_array.h>
--#else
--#include <asm-generic/cpumask_arith.h>
--#endif
--#else
--#include <asm-generic/cpumask_up.h>
--#endif
--
--#if NR_CPUS <= 4*BITS_PER_LONG
--#include <asm-generic/cpumask_const_value.h>
--#else
--#include <asm-generic/cpumask_const_reference.h>
--#endif
--
-+#include <asm/cpumask.h>
-+#include <asm/bug.h>
-
- #ifdef CONFIG_SMP
-
-@@ -53,19 +20,31 @@ extern cpumask_t cpu_online_map;
- static inline int next_online_cpu(int cpu, cpumask_t map)
- {
- do
-- cpu = next_cpu_const(cpu, map);
-+ cpu = next_cpu_const(cpu, mk_cpumask_const(map));
- while (cpu < NR_CPUS && !cpu_online(cpu));
- return cpu;
- }
-
- #define for_each_cpu(cpu, map) \
-- for (cpu = first_cpu_const(map); \
-+ for (cpu = first_cpu_const(mk_cpumask_const(map)); \
- cpu < NR_CPUS; \
-- cpu = next_cpu_const(cpu,map))
-+ cpu = next_cpu_const(cpu,mk_cpumask_const(map)))
-
- #define for_each_online_cpu(cpu, map) \
-- for (cpu = first_cpu_const(map); \
-+ for (cpu = first_cpu_const(mk_cpumask_const(map)); \
- cpu < NR_CPUS; \
- cpu = next_online_cpu(cpu,map))
-
-+extern int __mask_snprintf_len(char *buf, unsigned int buflen,
-+ const unsigned long *maskp, unsigned int maskbytes);
-+
-+#define cpumask_snprintf(buf, buflen, map) \
-+ __mask_snprintf_len(buf, buflen, cpus_addr(map), sizeof(map))
-+
-+extern int __mask_parse_len(const char __user *ubuf, unsigned int ubuflen,
-+ unsigned long *maskp, unsigned int maskbytes);
-+
-+#define cpumask_parse(buf, buflen, map) \
-+ __mask_parse_len(buf, buflen, cpus_addr(map), sizeof(map))
-+
- #endif /* __LINUX_CPUMASK_H */
---- linux-2.6.0/include/linux/device.h 2003-10-17 15:58:04.000000000 -0700
-+++ 25/include/linux/device.h 2003-12-28 23:22:59.000000000 -0800
-@@ -246,6 +246,11 @@ struct class_interface {
- extern int class_interface_register(struct class_interface *);
- extern void class_interface_unregister(struct class_interface *);
-
-+/* interface for simple class devices */
-+extern struct class_device *simple_add_class_device(struct class *class, dev_t dev, struct device *device, const char *fmt, ...)
-+ __attribute__((format(printf,4,5)));
-+extern void simple_remove_class_device(dev_t dev);
-+
-
- struct device {
- struct list_head node; /* node in sibling list */
-@@ -372,7 +377,7 @@ extern int platform_device_register(stru
- extern void platform_device_unregister(struct platform_device *);
-
- extern struct bus_type platform_bus_type;
--extern struct device legacy_bus;
-+extern struct device platform_bus;
-
- /* drivers/base/power.c */
- extern void device_shutdown(void);
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/linux/dwarf2.h 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,738 @@
-+/* Declarations and definitions of codes relating to the DWARF2 symbolic
-+ debugging information format.
-+ Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002
-+ Free Software Foundation, Inc.
-+
-+ Written by Gary Funck (gary@intrepid.com) The Ada Joint Program
-+ Office (AJPO), Florida State Unviversity and Silicon Graphics Inc.
-+ provided support for this effort -- June 21, 1995.
-+
-+ Derived from the DWARF 1 implementation written by Ron Guilmette
-+ (rfg@netcom.com), November 1990.
-+
-+ This file is part of GCC.
-+
-+ GCC is free software; you can redistribute it and/or modify it under
-+ the terms of the GNU General Public License as published by the Free
-+ Software Foundation; either version 2, or (at your option) any later
-+ version.
-+
-+ GCC is distributed in the hope that it will be useful, but WITHOUT
-+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-+ License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with GCC; see the file COPYING. If not, write to the Free
-+ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-+ 02111-1307, USA. */
-+
-+/* This file is derived from the DWARF specification (a public document)
-+ Revision 2.0.0 (July 27, 1993) developed by the UNIX International
-+ Programming Languages Special Interest Group (UI/PLSIG) and distributed
-+ by UNIX International. Copies of this specification are available from
-+ UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054.
-+
-+ This file also now contains definitions from the DWARF 3 specification. */
-+
-+/* This file is shared between GCC and GDB, and should not contain
-+ prototypes. */
-+
-+#ifndef _ELF_DWARF2_H
-+#define _ELF_DWARF2_H
-+
-+/* Structure found in the .debug_line section. */
-+#ifndef __ASSEMBLY__
-+typedef struct
-+{
-+ unsigned char li_length [4];
-+ unsigned char li_version [2];
-+ unsigned char li_prologue_length [4];
-+ unsigned char li_min_insn_length [1];
-+ unsigned char li_default_is_stmt [1];
-+ unsigned char li_line_base [1];
-+ unsigned char li_line_range [1];
-+ unsigned char li_opcode_base [1];
-+}
-+DWARF2_External_LineInfo;
-+
-+typedef struct
-+{
-+ unsigned long li_length;
-+ unsigned short li_version;
-+ unsigned int li_prologue_length;
-+ unsigned char li_min_insn_length;
-+ unsigned char li_default_is_stmt;
-+ int li_line_base;
-+ unsigned char li_line_range;
-+ unsigned char li_opcode_base;
-+}
-+DWARF2_Internal_LineInfo;
-+
-+/* Structure found in .debug_pubnames section. */
-+typedef struct
-+{
-+ unsigned char pn_length [4];
-+ unsigned char pn_version [2];
-+ unsigned char pn_offset [4];
-+ unsigned char pn_size [4];
-+}
-+DWARF2_External_PubNames;
-+
-+typedef struct
-+{
-+ unsigned long pn_length;
-+ unsigned short pn_version;
-+ unsigned long pn_offset;
-+ unsigned long pn_size;
-+}
-+DWARF2_Internal_PubNames;
-+
-+/* Structure found in .debug_info section. */
-+typedef struct
-+{
-+ unsigned char cu_length [4];
-+ unsigned char cu_version [2];
-+ unsigned char cu_abbrev_offset [4];
-+ unsigned char cu_pointer_size [1];
-+}
-+DWARF2_External_CompUnit;
-+
-+typedef struct
-+{
-+ unsigned long cu_length;
-+ unsigned short cu_version;
-+ unsigned long cu_abbrev_offset;
-+ unsigned char cu_pointer_size;
-+}
-+DWARF2_Internal_CompUnit;
-+
-+typedef struct
-+{
-+ unsigned char ar_length [4];
-+ unsigned char ar_version [2];
-+ unsigned char ar_info_offset [4];
-+ unsigned char ar_pointer_size [1];
-+ unsigned char ar_segment_size [1];
-+}
-+DWARF2_External_ARange;
-+
-+typedef struct
-+{
-+ unsigned long ar_length;
-+ unsigned short ar_version;
-+ unsigned long ar_info_offset;
-+ unsigned char ar_pointer_size;
-+ unsigned char ar_segment_size;
-+}
-+DWARF2_Internal_ARange;
-+
-+#define ENUM(name) enum name {
-+#define IF_NOT_ASM(a) a
-+#define COMMA ,
-+#else
-+#define ENUM(name)
-+#define IF_NOT_ASM(a)
-+#define COMMA
-+
-+#endif
-+
-+/* Tag names and codes. */
-+ENUM(dwarf_tag)
-+
-+ DW_TAG_padding = 0x00 COMMA
-+ DW_TAG_array_type = 0x01 COMMA
-+ DW_TAG_class_type = 0x02 COMMA
-+ DW_TAG_entry_point = 0x03 COMMA
-+ DW_TAG_enumeration_type = 0x04 COMMA
-+ DW_TAG_formal_parameter = 0x05 COMMA
-+ DW_TAG_imported_declaration = 0x08 COMMA
-+ DW_TAG_label = 0x0a COMMA
-+ DW_TAG_lexical_block = 0x0b COMMA
-+ DW_TAG_member = 0x0d COMMA
-+ DW_TAG_pointer_type = 0x0f COMMA
-+ DW_TAG_reference_type = 0x10 COMMA
-+ DW_TAG_compile_unit = 0x11 COMMA
-+ DW_TAG_string_type = 0x12 COMMA
-+ DW_TAG_structure_type = 0x13 COMMA
-+ DW_TAG_subroutine_type = 0x15 COMMA
-+ DW_TAG_typedef = 0x16 COMMA
-+ DW_TAG_union_type = 0x17 COMMA
-+ DW_TAG_unspecified_parameters = 0x18 COMMA
-+ DW_TAG_variant = 0x19 COMMA
-+ DW_TAG_common_block = 0x1a COMMA
-+ DW_TAG_common_inclusion = 0x1b COMMA
-+ DW_TAG_inheritance = 0x1c COMMA
-+ DW_TAG_inlined_subroutine = 0x1d COMMA
-+ DW_TAG_module = 0x1e COMMA
-+ DW_TAG_ptr_to_member_type = 0x1f COMMA
-+ DW_TAG_set_type = 0x20 COMMA
-+ DW_TAG_subrange_type = 0x21 COMMA
-+ DW_TAG_with_stmt = 0x22 COMMA
-+ DW_TAG_access_declaration = 0x23 COMMA
-+ DW_TAG_base_type = 0x24 COMMA
-+ DW_TAG_catch_block = 0x25 COMMA
-+ DW_TAG_const_type = 0x26 COMMA
-+ DW_TAG_constant = 0x27 COMMA
-+ DW_TAG_enumerator = 0x28 COMMA
-+ DW_TAG_file_type = 0x29 COMMA
-+ DW_TAG_friend = 0x2a COMMA
-+ DW_TAG_namelist = 0x2b COMMA
-+ DW_TAG_namelist_item = 0x2c COMMA
-+ DW_TAG_packed_type = 0x2d COMMA
-+ DW_TAG_subprogram = 0x2e COMMA
-+ DW_TAG_template_type_param = 0x2f COMMA
-+ DW_TAG_template_value_param = 0x30 COMMA
-+ DW_TAG_thrown_type = 0x31 COMMA
-+ DW_TAG_try_block = 0x32 COMMA
-+ DW_TAG_variant_part = 0x33 COMMA
-+ DW_TAG_variable = 0x34 COMMA
-+ DW_TAG_volatile_type = 0x35 COMMA
-+ /* DWARF 3. */
-+ DW_TAG_dwarf_procedure = 0x36 COMMA
-+ DW_TAG_restrict_type = 0x37 COMMA
-+ DW_TAG_interface_type = 0x38 COMMA
-+ DW_TAG_namespace = 0x39 COMMA
-+ DW_TAG_imported_module = 0x3a COMMA
-+ DW_TAG_unspecified_type = 0x3b COMMA
-+ DW_TAG_partial_unit = 0x3c COMMA
-+ DW_TAG_imported_unit = 0x3d COMMA
-+ /* SGI/MIPS Extensions. */
-+ DW_TAG_MIPS_loop = 0x4081 COMMA
-+ /* GNU extensions. */
-+ DW_TAG_format_label = 0x4101 COMMA /* For FORTRAN 77 and Fortran 90. */
-+ DW_TAG_function_template = 0x4102 COMMA /* For C++. */
-+ DW_TAG_class_template = 0x4103 COMMA /* For C++. */
-+ DW_TAG_GNU_BINCL = 0x4104 COMMA
-+ DW_TAG_GNU_EINCL = 0x4105 COMMA
-+ /* Extensions for UPC. See: http://upc.gwu.edu/~upc. */
-+ DW_TAG_upc_shared_type = 0x8765 COMMA
-+ DW_TAG_upc_strict_type = 0x8766 COMMA
-+ DW_TAG_upc_relaxed_type = 0x8767
-+IF_NOT_ASM(};)
-+
-+#define DW_TAG_lo_user 0x4080
-+#define DW_TAG_hi_user 0xffff
-+
-+/* Flag that tells whether entry has a child or not. */
-+#define DW_children_no 0
-+#define DW_children_yes 1
-+
-+/* Form names and codes. */
-+ENUM(dwarf_form)
-+
-+ DW_FORM_addr = 0x01 COMMA
-+ DW_FORM_block2 = 0x03 COMMA
-+ DW_FORM_block4 = 0x04 COMMA
-+ DW_FORM_data2 = 0x05 COMMA
-+ DW_FORM_data4 = 0x06 COMMA
-+ DW_FORM_data8 = 0x07 COMMA
-+ DW_FORM_string = 0x08 COMMA
-+ DW_FORM_block = 0x09 COMMA
-+ DW_FORM_block1 = 0x0a COMMA
-+ DW_FORM_data1 = 0x0b COMMA
-+ DW_FORM_flag = 0x0c COMMA
-+ DW_FORM_sdata = 0x0d COMMA
-+ DW_FORM_strp = 0x0e COMMA
-+ DW_FORM_udata = 0x0f COMMA
-+ DW_FORM_ref_addr = 0x10 COMMA
-+ DW_FORM_ref1 = 0x11 COMMA
-+ DW_FORM_ref2 = 0x12 COMMA
-+ DW_FORM_ref4 = 0x13 COMMA
-+ DW_FORM_ref8 = 0x14 COMMA
-+ DW_FORM_ref_udata = 0x15 COMMA
-+ DW_FORM_indirect = 0x16
-+IF_NOT_ASM(};)
-+
-+/* Attribute names and codes. */
-+
-+ENUM(dwarf_attribute)
-+
-+ DW_AT_sibling = 0x01 COMMA
-+ DW_AT_location = 0x02 COMMA
-+ DW_AT_name = 0x03 COMMA
-+ DW_AT_ordering = 0x09 COMMA
-+ DW_AT_subscr_data = 0x0a COMMA
-+ DW_AT_byte_size = 0x0b COMMA
-+ DW_AT_bit_offset = 0x0c COMMA
-+ DW_AT_bit_size = 0x0d COMMA
-+ DW_AT_element_list = 0x0f COMMA
-+ DW_AT_stmt_list = 0x10 COMMA
-+ DW_AT_low_pc = 0x11 COMMA
-+ DW_AT_high_pc = 0x12 COMMA
-+ DW_AT_language = 0x13 COMMA
-+ DW_AT_member = 0x14 COMMA
-+ DW_AT_discr = 0x15 COMMA
-+ DW_AT_discr_value = 0x16 COMMA
-+ DW_AT_visibility = 0x17 COMMA
-+ DW_AT_import = 0x18 COMMA
-+ DW_AT_string_length = 0x19 COMMA
-+ DW_AT_common_reference = 0x1a COMMA
-+ DW_AT_comp_dir = 0x1b COMMA
-+ DW_AT_const_value = 0x1c COMMA
-+ DW_AT_containing_type = 0x1d COMMA
-+ DW_AT_default_value = 0x1e COMMA
-+ DW_AT_inline = 0x20 COMMA
-+ DW_AT_is_optional = 0x21 COMMA
-+ DW_AT_lower_bound = 0x22 COMMA
-+ DW_AT_producer = 0x25 COMMA
-+ DW_AT_prototyped = 0x27 COMMA
-+ DW_AT_return_addr = 0x2a COMMA
-+ DW_AT_start_scope = 0x2c COMMA
-+ DW_AT_stride_size = 0x2e COMMA
-+ DW_AT_upper_bound = 0x2f COMMA
-+ DW_AT_abstract_origin = 0x31 COMMA
-+ DW_AT_accessibility = 0x32 COMMA
-+ DW_AT_address_class = 0x33 COMMA
-+ DW_AT_artificial = 0x34 COMMA
-+ DW_AT_base_types = 0x35 COMMA
-+ DW_AT_calling_convention = 0x36 COMMA
-+ DW_AT_count = 0x37 COMMA
-+ DW_AT_data_member_location = 0x38 COMMA
-+ DW_AT_decl_column = 0x39 COMMA
-+ DW_AT_decl_file = 0x3a COMMA
-+ DW_AT_decl_line = 0x3b COMMA
-+ DW_AT_declaration = 0x3c COMMA
-+ DW_AT_discr_list = 0x3d COMMA
-+ DW_AT_encoding = 0x3e COMMA
-+ DW_AT_external = 0x3f COMMA
-+ DW_AT_frame_base = 0x40 COMMA
-+ DW_AT_friend = 0x41 COMMA
-+ DW_AT_identifier_case = 0x42 COMMA
-+ DW_AT_macro_info = 0x43 COMMA
-+ DW_AT_namelist_items = 0x44 COMMA
-+ DW_AT_priority = 0x45 COMMA
-+ DW_AT_segment = 0x46 COMMA
-+ DW_AT_specification = 0x47 COMMA
-+ DW_AT_static_link = 0x48 COMMA
-+ DW_AT_type = 0x49 COMMA
-+ DW_AT_use_location = 0x4a COMMA
-+ DW_AT_variable_parameter = 0x4b COMMA
-+ DW_AT_virtuality = 0x4c COMMA
-+ DW_AT_vtable_elem_location = 0x4d COMMA
-+ /* DWARF 3 values. */
-+ DW_AT_allocated = 0x4e COMMA
-+ DW_AT_associated = 0x4f COMMA
-+ DW_AT_data_location = 0x50 COMMA
-+ DW_AT_stride = 0x51 COMMA
-+ DW_AT_entry_pc = 0x52 COMMA
-+ DW_AT_use_UTF8 = 0x53 COMMA
-+ DW_AT_extension = 0x54 COMMA
-+ DW_AT_ranges = 0x55 COMMA
-+ DW_AT_trampoline = 0x56 COMMA
-+ DW_AT_call_column = 0x57 COMMA
-+ DW_AT_call_file = 0x58 COMMA
-+ DW_AT_call_line = 0x59 COMMA
-+ /* SGI/MIPS extensions. */
-+ DW_AT_MIPS_fde = 0x2001 COMMA
-+ DW_AT_MIPS_loop_begin = 0x2002 COMMA
-+ DW_AT_MIPS_tail_loop_begin = 0x2003 COMMA
-+ DW_AT_MIPS_epilog_begin = 0x2004 COMMA
-+ DW_AT_MIPS_loop_unroll_factor = 0x2005 COMMA
-+ DW_AT_MIPS_software_pipeline_depth = 0x2006 COMMA
-+ DW_AT_MIPS_linkage_name = 0x2007 COMMA
-+ DW_AT_MIPS_stride = 0x2008 COMMA
-+ DW_AT_MIPS_abstract_name = 0x2009 COMMA
-+ DW_AT_MIPS_clone_origin = 0x200a COMMA
-+ DW_AT_MIPS_has_inlines = 0x200b COMMA
-+ /* GNU extensions. */
-+ DW_AT_sf_names = 0x2101 COMMA
-+ DW_AT_src_info = 0x2102 COMMA
-+ DW_AT_mac_info = 0x2103 COMMA
-+ DW_AT_src_coords = 0x2104 COMMA
-+ DW_AT_body_begin = 0x2105 COMMA
-+ DW_AT_body_end = 0x2106 COMMA
-+ DW_AT_GNU_vector = 0x2107 COMMA
-+ /* VMS extensions. */
-+ DW_AT_VMS_rtnbeg_pd_address = 0x2201 COMMA
-+ /* UPC extension. */
-+ DW_AT_upc_threads_scaled = 0x3210
-+IF_NOT_ASM(};)
-+
-+#define DW_AT_lo_user 0x2000 /* Implementation-defined range start. */
-+#define DW_AT_hi_user 0x3ff0 /* Implementation-defined range end. */
-+
-+/* Location atom names and codes. */
-+ENUM(dwarf_location_atom)
-+
-+ DW_OP_addr = 0x03 COMMA
-+ DW_OP_deref = 0x06 COMMA
-+ DW_OP_const1u = 0x08 COMMA
-+ DW_OP_const1s = 0x09 COMMA
-+ DW_OP_const2u = 0x0a COMMA
-+ DW_OP_const2s = 0x0b COMMA
-+ DW_OP_const4u = 0x0c COMMA
-+ DW_OP_const4s = 0x0d COMMA
-+ DW_OP_const8u = 0x0e COMMA
-+ DW_OP_const8s = 0x0f COMMA
-+ DW_OP_constu = 0x10 COMMA
-+ DW_OP_consts = 0x11 COMMA
-+ DW_OP_dup = 0x12 COMMA
-+ DW_OP_drop = 0x13 COMMA
-+ DW_OP_over = 0x14 COMMA
-+ DW_OP_pick = 0x15 COMMA
-+ DW_OP_swap = 0x16 COMMA
-+ DW_OP_rot = 0x17 COMMA
-+ DW_OP_xderef = 0x18 COMMA
-+ DW_OP_abs = 0x19 COMMA
-+ DW_OP_and = 0x1a COMMA
-+ DW_OP_div = 0x1b COMMA
-+ DW_OP_minus = 0x1c COMMA
-+ DW_OP_mod = 0x1d COMMA
-+ DW_OP_mul = 0x1e COMMA
-+ DW_OP_neg = 0x1f COMMA
-+ DW_OP_not = 0x20 COMMA
-+ DW_OP_or = 0x21 COMMA
-+ DW_OP_plus = 0x22 COMMA
-+ DW_OP_plus_uconst = 0x23 COMMA
-+ DW_OP_shl = 0x24 COMMA
-+ DW_OP_shr = 0x25 COMMA
-+ DW_OP_shra = 0x26 COMMA
-+ DW_OP_xor = 0x27 COMMA
-+ DW_OP_bra = 0x28 COMMA
-+ DW_OP_eq = 0x29 COMMA
-+ DW_OP_ge = 0x2a COMMA
-+ DW_OP_gt = 0x2b COMMA
-+ DW_OP_le = 0x2c COMMA
-+ DW_OP_lt = 0x2d COMMA
-+ DW_OP_ne = 0x2e COMMA
-+ DW_OP_skip = 0x2f COMMA
-+ DW_OP_lit0 = 0x30 COMMA
-+ DW_OP_lit1 = 0x31 COMMA
-+ DW_OP_lit2 = 0x32 COMMA
-+ DW_OP_lit3 = 0x33 COMMA
-+ DW_OP_lit4 = 0x34 COMMA
-+ DW_OP_lit5 = 0x35 COMMA
-+ DW_OP_lit6 = 0x36 COMMA
-+ DW_OP_lit7 = 0x37 COMMA
-+ DW_OP_lit8 = 0x38 COMMA
-+ DW_OP_lit9 = 0x39 COMMA
-+ DW_OP_lit10 = 0x3a COMMA
-+ DW_OP_lit11 = 0x3b COMMA
-+ DW_OP_lit12 = 0x3c COMMA
-+ DW_OP_lit13 = 0x3d COMMA
-+ DW_OP_lit14 = 0x3e COMMA
-+ DW_OP_lit15 = 0x3f COMMA
-+ DW_OP_lit16 = 0x40 COMMA
-+ DW_OP_lit17 = 0x41 COMMA
-+ DW_OP_lit18 = 0x42 COMMA
-+ DW_OP_lit19 = 0x43 COMMA
-+ DW_OP_lit20 = 0x44 COMMA
-+ DW_OP_lit21 = 0x45 COMMA
-+ DW_OP_lit22 = 0x46 COMMA
-+ DW_OP_lit23 = 0x47 COMMA
-+ DW_OP_lit24 = 0x48 COMMA
-+ DW_OP_lit25 = 0x49 COMMA
-+ DW_OP_lit26 = 0x4a COMMA
-+ DW_OP_lit27 = 0x4b COMMA
-+ DW_OP_lit28 = 0x4c COMMA
-+ DW_OP_lit29 = 0x4d COMMA
-+ DW_OP_lit30 = 0x4e COMMA
-+ DW_OP_lit31 = 0x4f COMMA
-+ DW_OP_reg0 = 0x50 COMMA
-+ DW_OP_reg1 = 0x51 COMMA
-+ DW_OP_reg2 = 0x52 COMMA
-+ DW_OP_reg3 = 0x53 COMMA
-+ DW_OP_reg4 = 0x54 COMMA
-+ DW_OP_reg5 = 0x55 COMMA
-+ DW_OP_reg6 = 0x56 COMMA
-+ DW_OP_reg7 = 0x57 COMMA
-+ DW_OP_reg8 = 0x58 COMMA
-+ DW_OP_reg9 = 0x59 COMMA
-+ DW_OP_reg10 = 0x5a COMMA
-+ DW_OP_reg11 = 0x5b COMMA
-+ DW_OP_reg12 = 0x5c COMMA
-+ DW_OP_reg13 = 0x5d COMMA
-+ DW_OP_reg14 = 0x5e COMMA
-+ DW_OP_reg15 = 0x5f COMMA
-+ DW_OP_reg16 = 0x60 COMMA
-+ DW_OP_reg17 = 0x61 COMMA
-+ DW_OP_reg18 = 0x62 COMMA
-+ DW_OP_reg19 = 0x63 COMMA
-+ DW_OP_reg20 = 0x64 COMMA
-+ DW_OP_reg21 = 0x65 COMMA
-+ DW_OP_reg22 = 0x66 COMMA
-+ DW_OP_reg23 = 0x67 COMMA
-+ DW_OP_reg24 = 0x68 COMMA
-+ DW_OP_reg25 = 0x69 COMMA
-+ DW_OP_reg26 = 0x6a COMMA
-+ DW_OP_reg27 = 0x6b COMMA
-+ DW_OP_reg28 = 0x6c COMMA
-+ DW_OP_reg29 = 0x6d COMMA
-+ DW_OP_reg30 = 0x6e COMMA
-+ DW_OP_reg31 = 0x6f COMMA
-+ DW_OP_breg0 = 0x70 COMMA
-+ DW_OP_breg1 = 0x71 COMMA
-+ DW_OP_breg2 = 0x72 COMMA
-+ DW_OP_breg3 = 0x73 COMMA
-+ DW_OP_breg4 = 0x74 COMMA
-+ DW_OP_breg5 = 0x75 COMMA
-+ DW_OP_breg6 = 0x76 COMMA
-+ DW_OP_breg7 = 0x77 COMMA
-+ DW_OP_breg8 = 0x78 COMMA
-+ DW_OP_breg9 = 0x79 COMMA
-+ DW_OP_breg10 = 0x7a COMMA
-+ DW_OP_breg11 = 0x7b COMMA
-+ DW_OP_breg12 = 0x7c COMMA
-+ DW_OP_breg13 = 0x7d COMMA
-+ DW_OP_breg14 = 0x7e COMMA
-+ DW_OP_breg15 = 0x7f COMMA
-+ DW_OP_breg16 = 0x80 COMMA
-+ DW_OP_breg17 = 0x81 COMMA
-+ DW_OP_breg18 = 0x82 COMMA
-+ DW_OP_breg19 = 0x83 COMMA
-+ DW_OP_breg20 = 0x84 COMMA
-+ DW_OP_breg21 = 0x85 COMMA
-+ DW_OP_breg22 = 0x86 COMMA
-+ DW_OP_breg23 = 0x87 COMMA
-+ DW_OP_breg24 = 0x88 COMMA
-+ DW_OP_breg25 = 0x89 COMMA
-+ DW_OP_breg26 = 0x8a COMMA
-+ DW_OP_breg27 = 0x8b COMMA
-+ DW_OP_breg28 = 0x8c COMMA
-+ DW_OP_breg29 = 0x8d COMMA
-+ DW_OP_breg30 = 0x8e COMMA
-+ DW_OP_breg31 = 0x8f COMMA
-+ DW_OP_regx = 0x90 COMMA
-+ DW_OP_fbreg = 0x91 COMMA
-+ DW_OP_bregx = 0x92 COMMA
-+ DW_OP_piece = 0x93 COMMA
-+ DW_OP_deref_size = 0x94 COMMA
-+ DW_OP_xderef_size = 0x95 COMMA
-+ DW_OP_nop = 0x96 COMMA
-+ /* DWARF 3 extensions. */
-+ DW_OP_push_object_address = 0x97 COMMA
-+ DW_OP_call2 = 0x98 COMMA
-+ DW_OP_call4 = 0x99 COMMA
-+ DW_OP_call_ref = 0x9a COMMA
-+ /* GNU extensions. */
-+ DW_OP_GNU_push_tls_address = 0xe0
-+IF_NOT_ASM(};)
-+
-+#define DW_OP_lo_user 0xe0 /* Implementation-defined range start. */
-+#define DW_OP_hi_user 0xff /* Implementation-defined range end. */
-+
-+/* Type encodings. */
-+ENUM(dwarf_type)
-+
-+ DW_ATE_void = 0x0 COMMA
-+ DW_ATE_address = 0x1 COMMA
-+ DW_ATE_boolean = 0x2 COMMA
-+ DW_ATE_complex_float = 0x3 COMMA
-+ DW_ATE_float = 0x4 COMMA
-+ DW_ATE_signed = 0x5 COMMA
-+ DW_ATE_signed_char = 0x6 COMMA
-+ DW_ATE_unsigned = 0x7 COMMA
-+ DW_ATE_unsigned_char = 0x8 COMMA
-+ /* DWARF 3. */
-+ DW_ATE_imaginary_float = 0x9
-+IF_NOT_ASM(};)
-+
-+#define DW_ATE_lo_user 0x80
-+#define DW_ATE_hi_user 0xff
-+
-+/* Array ordering names and codes. */
-+ENUM(dwarf_array_dim_ordering)
-+
-+ DW_ORD_row_major = 0 COMMA
-+ DW_ORD_col_major = 1
-+IF_NOT_ASM(};)
-+
-+/* Access attribute. */
-+ENUM(dwarf_access_attribute)
-+
-+ DW_ACCESS_public = 1 COMMA
-+ DW_ACCESS_protected = 2 COMMA
-+ DW_ACCESS_private = 3
-+IF_NOT_ASM(};)
-+
-+/* Visibility. */
-+ENUM(dwarf_visibility_attribute)
-+
-+ DW_VIS_local = 1 COMMA
-+ DW_VIS_exported = 2 COMMA
-+ DW_VIS_qualified = 3
-+IF_NOT_ASM(};)
-+
-+/* Virtuality. */
-+ENUM(dwarf_virtuality_attribute)
-+
-+ DW_VIRTUALITY_none = 0 COMMA
-+ DW_VIRTUALITY_virtual = 1 COMMA
-+ DW_VIRTUALITY_pure_virtual = 2
-+IF_NOT_ASM(};)
-+
-+/* Case sensitivity. */
-+ENUM(dwarf_id_case)
-+
-+ DW_ID_case_sensitive = 0 COMMA
-+ DW_ID_up_case = 1 COMMA
-+ DW_ID_down_case = 2 COMMA
-+ DW_ID_case_insensitive = 3
-+IF_NOT_ASM(};)
-+
-+/* Calling convention. */
-+ENUM(dwarf_calling_convention)
-+
-+ DW_CC_normal = 0x1 COMMA
-+ DW_CC_program = 0x2 COMMA
-+ DW_CC_nocall = 0x3
-+IF_NOT_ASM(};)
-+
-+#define DW_CC_lo_user 0x40
-+#define DW_CC_hi_user 0xff
-+
-+/* Inline attribute. */
-+ENUM(dwarf_inline_attribute)
-+
-+ DW_INL_not_inlined = 0 COMMA
-+ DW_INL_inlined = 1 COMMA
-+ DW_INL_declared_not_inlined = 2 COMMA
-+ DW_INL_declared_inlined = 3
-+IF_NOT_ASM(};)
-+
-+/* Discriminant lists. */
-+ENUM(dwarf_discrim_list)
-+
-+ DW_DSC_label = 0 COMMA
-+ DW_DSC_range = 1
-+IF_NOT_ASM(};)
-+
-+/* Line number opcodes. */
-+ENUM(dwarf_line_number_ops)
-+
-+ DW_LNS_extended_op = 0 COMMA
-+ DW_LNS_copy = 1 COMMA
-+ DW_LNS_advance_pc = 2 COMMA
-+ DW_LNS_advance_line = 3 COMMA
-+ DW_LNS_set_file = 4 COMMA
-+ DW_LNS_set_column = 5 COMMA
-+ DW_LNS_negate_stmt = 6 COMMA
-+ DW_LNS_set_basic_block = 7 COMMA
-+ DW_LNS_const_add_pc = 8 COMMA
-+ DW_LNS_fixed_advance_pc = 9 COMMA
-+ /* DWARF 3. */
-+ DW_LNS_set_prologue_end = 10 COMMA
-+ DW_LNS_set_epilogue_begin = 11 COMMA
-+ DW_LNS_set_isa = 12
-+IF_NOT_ASM(};)
-+
-+/* Line number extended opcodes. */
-+ENUM(dwarf_line_number_x_ops)
-+
-+ DW_LNE_end_sequence = 1 COMMA
-+ DW_LNE_set_address = 2 COMMA
-+ DW_LNE_define_file = 3
-+IF_NOT_ASM(};)
-+
-+/* Call frame information. */
-+ENUM(dwarf_call_frame_info)
-+
-+ DW_CFA_advance_loc = 0x40 COMMA
-+ DW_CFA_offset = 0x80 COMMA
-+ DW_CFA_restore = 0xc0 COMMA
-+ DW_CFA_nop = 0x00 COMMA
-+ DW_CFA_set_loc = 0x01 COMMA
-+ DW_CFA_advance_loc1 = 0x02 COMMA
-+ DW_CFA_advance_loc2 = 0x03 COMMA
-+ DW_CFA_advance_loc4 = 0x04 COMMA
-+ DW_CFA_offset_extended = 0x05 COMMA
-+ DW_CFA_restore_extended = 0x06 COMMA
-+ DW_CFA_undefined = 0x07 COMMA
-+ DW_CFA_same_value = 0x08 COMMA
-+ DW_CFA_register = 0x09 COMMA
-+ DW_CFA_remember_state = 0x0a COMMA
-+ DW_CFA_restore_state = 0x0b COMMA
-+ DW_CFA_def_cfa = 0x0c COMMA
-+ DW_CFA_def_cfa_register = 0x0d COMMA
-+ DW_CFA_def_cfa_offset = 0x0e COMMA
-+
-+ /* DWARF 3. */
-+ DW_CFA_def_cfa_expression = 0x0f COMMA
-+ DW_CFA_expression = 0x10 COMMA
-+ DW_CFA_offset_extended_sf = 0x11 COMMA
-+ DW_CFA_def_cfa_sf = 0x12 COMMA
-+ DW_CFA_def_cfa_offset_sf = 0x13 COMMA
-+
-+ /* SGI/MIPS specific. */
-+ DW_CFA_MIPS_advance_loc8 = 0x1d COMMA
-+
-+ /* GNU extensions. */
-+ DW_CFA_GNU_window_save = 0x2d COMMA
-+ DW_CFA_GNU_args_size = 0x2e COMMA
-+ DW_CFA_GNU_negative_offset_extended = 0x2f
-+IF_NOT_ASM(};)
-+
-+#define DW_CIE_ID 0xffffffff
-+#define DW_CIE_VERSION 1
-+
-+#define DW_CFA_extended 0
-+#define DW_CFA_lo_user 0x1c
-+#define DW_CFA_hi_user 0x3f
-+
-+#define DW_CHILDREN_no 0x00
-+#define DW_CHILDREN_yes 0x01
-+
-+#define DW_ADDR_none 0
-+
-+/* Source language names and codes. */
-+ENUM(dwarf_source_language)
-+
-+ DW_LANG_C89 = 0x0001 COMMA
-+ DW_LANG_C = 0x0002 COMMA
-+ DW_LANG_Ada83 = 0x0003 COMMA
-+ DW_LANG_C_plus_plus = 0x0004 COMMA
-+ DW_LANG_Cobol74 = 0x0005 COMMA
-+ DW_LANG_Cobol85 = 0x0006 COMMA
-+ DW_LANG_Fortran77 = 0x0007 COMMA
-+ DW_LANG_Fortran90 = 0x0008 COMMA
-+ DW_LANG_Pascal83 = 0x0009 COMMA
-+ DW_LANG_Modula2 = 0x000a COMMA
-+ DW_LANG_Java = 0x000b COMMA
-+ /* DWARF 3. */
-+ DW_LANG_C99 = 0x000c COMMA
-+ DW_LANG_Ada95 = 0x000d COMMA
-+ DW_LANG_Fortran95 = 0x000e COMMA
-+ /* MIPS. */
-+ DW_LANG_Mips_Assembler = 0x8001 COMMA
-+ /* UPC. */
-+ DW_LANG_Upc = 0x8765
-+IF_NOT_ASM(};)
-+
-+#define DW_LANG_lo_user 0x8000 /* Implementation-defined range start. */
-+#define DW_LANG_hi_user 0xffff /* Implementation-defined range start. */
-+
-+/* Names and codes for macro information. */
-+ENUM(dwarf_macinfo_record_type)
-+
-+ DW_MACINFO_define = 1 COMMA
-+ DW_MACINFO_undef = 2 COMMA
-+ DW_MACINFO_start_file = 3 COMMA
-+ DW_MACINFO_end_file = 4 COMMA
-+ DW_MACINFO_vendor_ext = 255
-+IF_NOT_ASM(};)
-+\f
-+/* @@@ For use with GNU frame unwind information. */
-+
-+#define DW_EH_PE_absptr 0x00
-+#define DW_EH_PE_omit 0xff
-+
-+#define DW_EH_PE_uleb128 0x01
-+#define DW_EH_PE_udata2 0x02
-+#define DW_EH_PE_udata4 0x03
-+#define DW_EH_PE_udata8 0x04
-+#define DW_EH_PE_sleb128 0x09
-+#define DW_EH_PE_sdata2 0x0A
-+#define DW_EH_PE_sdata4 0x0B
-+#define DW_EH_PE_sdata8 0x0C
-+#define DW_EH_PE_signed 0x08
-+
-+#define DW_EH_PE_pcrel 0x10
-+#define DW_EH_PE_textrel 0x20
-+#define DW_EH_PE_datarel 0x30
-+#define DW_EH_PE_funcrel 0x40
-+#define DW_EH_PE_aligned 0x50
-+
-+#define DW_EH_PE_indirect 0x80
-+
-+#endif /* _ELF_DWARF2_H */
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/linux/dwarf2-lang.h 2003-12-28 23:21:07.000000000 -0800
-@@ -0,0 +1,132 @@
-+#ifndef DWARF2_LANG
-+#define DWARF2_LANG
-+#include <linux/dwarf2.h>
-+
-+/*
-+ * This is free software; you can redistribute it and/or modify it under
-+ * the terms of the GNU General Public License as published by the Free
-+ * Software Foundation; either version 2, or (at your option) any later
-+ * version.
-+ */
-+/*
-+ * This file defines macros that allow generation of DWARF debug records
-+ * for asm files. This file is platform independent. Register numbers
-+ * (which are about the only thing that is platform dependent) are to be
-+ * supplied by a platform defined file.
-+ */
-+#define DWARF_preamble() .section .debug_frame,"",@progbits
-+/*
-+ * This macro starts a debug frame section. The debug_frame describes
-+ * where to find the registers that the enclosing function saved on
-+ * entry.
-+ *
-+ * ORD is use by the label generator and should be the same as what is
-+ * passed to CFI_postamble.
-+ *
-+ * pc, pc register gdb ordinal.
-+ *
-+ * code_align this is the factor used to define locations or regions
-+ * where the given definitions apply. If you use labels to define these
-+ * this should be 1.
-+ *
-+ * data_align this is the factor used to define register offsets. If
-+ * you use struct offset, this should be the size of the register in
-+ * bytes or the negative of that. This is how it is used: you will
-+ * define a register as the reference register, say the stack pointer,
-+ * then you will say where a register is located relative to this
-+ * reference registers value, say 40 for register 3 (the gdb register
-+ * number). The <40> will be multiplied by <data_align> to define the
-+ * byte offset of the given register (3, in this example). So if your
-+ * <40> is the byte offset and the reference register points at the
-+ * begining, you would want 1 for the data_offset. If <40> was the 40th
-+ * 4-byte element in that structure you would want 4. And if your
-+ * reference register points at the end of the structure you would want
-+ * a negative data_align value(and you would have to do other math as
-+ * well).
-+ */
-+
-+#define CFI_preamble(ORD, pc, code_align, data_align) \
-+.section .debug_frame,"",@progbits ; \
-+frame/**/_/**/ORD: \
-+ .long end/**/_/**/ORD-start/**/_/**/ORD; \
-+start/**/_/**/ORD: \
-+ .long DW_CIE_ID; \
-+ .byte DW_CIE_VERSION; \
-+ .byte 0 ; \
-+ .uleb128 code_align; \
-+ .sleb128 data_align; \
-+ .byte pc;
-+
-+/*
-+ * After the above macro and prior to the CFI_postamble, you need to
-+ * define the initial state. This starts with defining the reference
-+ * register and, usually the pc. Here are some helper macros:
-+ */
-+
-+#define CFA_define_reference(reg, offset) \
-+ .byte DW_CFA_def_cfa; \
-+ .uleb128 reg; \
-+ .uleb128 (offset);
-+
-+#define CFA_define_offset(reg, offset) \
-+ .byte (DW_CFA_offset + reg); \
-+ .uleb128 (offset);
-+
-+#define CFI_postamble(ORD) \
-+ .align 4; \
-+end/**/_/**/ORD:
-+/*
-+ * So now your code pushs stuff on the stack, you need a new location
-+ * and the rules for what to do. This starts a running description of
-+ * the call frame. You need to describe what changes with respect to
-+ * the call registers as the location of the pc moves through the code.
-+ * The following builds an FDE (fram descriptor entry?). Like the
-+ * above, it has a preamble and a postamble. It also is tied to the CFI
-+ * above.
-+ * The first entry after the preamble must be the location in the code
-+ * that the call frame is being described for.
-+ */
-+#define FDE_preamble(ORD, fde_no, initial_address, length) \
-+ .long FDE_end/**/_/**/fde_no-FDE_start/**/_/**/fde_no; \
-+FDE_start/**/_/**/fde_no: \
-+ .long frame/**/_/**/ORD; \
-+ .long initial_address; \
-+ .long length;
-+
-+#define FDE_postamble(fde_no) \
-+ .align 4; \
-+FDE_end/**/_/**/fde_no:
-+/*
-+ * That done, you can now add registers, subtract registers, move the
-+ * reference and even change the reference. You can also define a new
-+ * area of code the info applies to. For discontinuous bits you should
-+ * start a new FDE. You may have as many as you like.
-+ */
-+
-+/*
-+ * To advance the address by <bytes>
-+ */
-+
-+#define FDE_advance(bytes) \
-+ .byte DW_CFA_advance_loc4 \
-+ .long bytes
-+
-+
-+
-+/*
-+ * With the above you can define all the register locations. But
-+ * suppose the reference register moves... Takes the new offset NOT an
-+ * increment. This is how esp is tracked if it is not saved.
-+ */
-+
-+#define CFA_define_cfa_offset(offset) \
-+ .byte $DW_CFA_def_cfa_offset; \
-+ .uleb128 (offset);
-+/*
-+ * Or suppose you want to use a different reference register...
-+ */
-+#define CFA_define_cfa_register(reg) \
-+ .byte DW_CFA_def_cfa_register; \
-+ .uleb128 reg;
-+
-+#endif
---- linux-2.6.0/include/linux/efi.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/efi.h 2003-12-28 23:21:45.000000000 -0800
-@@ -16,6 +16,8 @@
- #include <linux/time.h>
- #include <linux/types.h>
- #include <linux/proc_fs.h>
-+#include <linux/rtc.h>
-+#include <linux/ioport.h>
-
- #include <asm/page.h>
- #include <asm/system.h>
-@@ -77,18 +79,23 @@ typedef struct {
- #define EFI_MAX_MEMORY_TYPE 14
-
- /* Attribute values: */
--#define EFI_MEMORY_UC 0x0000000000000001 /* uncached */
--#define EFI_MEMORY_WC 0x0000000000000002 /* write-coalescing */
--#define EFI_MEMORY_WT 0x0000000000000004 /* write-through */
--#define EFI_MEMORY_WB 0x0000000000000008 /* write-back */
--#define EFI_MEMORY_WP 0x0000000000001000 /* write-protect */
--#define EFI_MEMORY_RP 0x0000000000002000 /* read-protect */
--#define EFI_MEMORY_XP 0x0000000000004000 /* execute-protect */
--#define EFI_MEMORY_RUNTIME 0x8000000000000000 /* range requires runtime mapping */
-+#define EFI_MEMORY_UC ((u64)0x0000000000000001ULL) /* uncached */
-+#define EFI_MEMORY_WC ((u64)0x0000000000000002ULL) /* write-coalescing */
-+#define EFI_MEMORY_WT ((u64)0x0000000000000004ULL) /* write-through */
-+#define EFI_MEMORY_WB ((u64)0x0000000000000008ULL) /* write-back */
-+#define EFI_MEMORY_WP ((u64)0x0000000000001000ULL) /* write-protect */
-+#define EFI_MEMORY_RP ((u64)0x0000000000002000ULL) /* read-protect */
-+#define EFI_MEMORY_XP ((u64)0x0000000000004000ULL) /* execute-protect */
-+#define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */
- #define EFI_MEMORY_DESCRIPTOR_VERSION 1
-
- #define EFI_PAGE_SHIFT 12
-
-+/*
-+ * For current x86 implementations of EFI, there is
-+ * additional padding in the mem descriptors. This is not
-+ * the case in ia64. Need to have this fixed in the f/w.
-+ */
- typedef struct {
- u32 type;
- u32 pad;
-@@ -96,6 +103,9 @@ typedef struct {
- u64 virt_addr;
- u64 num_pages;
- u64 attribute;
-+#if defined (__i386__)
-+ u64 pad1;
-+#endif
- } efi_memory_desc_t;
-
- typedef int efi_freemem_callback_t (unsigned long start, unsigned long end, void *arg);
-@@ -132,11 +142,12 @@ typedef struct {
- */
- #define EFI_RESET_COLD 0
- #define EFI_RESET_WARM 1
-+#define EFI_RESET_SHUTDOWN 2
-
- /*
- * EFI Runtime Services table
- */
--#define EFI_RUNTIME_SERVICES_SIGNATURE 0x5652453544e5552
-+#define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL)
- #define EFI_RUNTIME_SERVICES_REVISION 0x00010000
-
- typedef struct {
-@@ -169,6 +180,10 @@ typedef efi_status_t efi_set_variable_t
- typedef efi_status_t efi_get_next_high_mono_count_t (u32 *count);
- typedef void efi_reset_system_t (int reset_type, efi_status_t status,
- unsigned long data_size, efi_char16_t *data);
-+typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_size,
-+ unsigned long descriptor_size,
-+ u32 descriptor_version,
-+ efi_memory_desc_t *virtual_map);
-
- /*
- * EFI Configuration Table and GUID definitions
-@@ -194,12 +209,15 @@ typedef void efi_reset_system_t (int res
- #define HCDP_TABLE_GUID \
- EFI_GUID( 0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 )
-
-+#define UGA_IO_PROTOCOL_GUID \
-+ EFI_GUID( 0x61a4d49e, 0x6f68, 0x4f1b, 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0xb, 0x7, 0xa2 )
-+
- typedef struct {
- efi_guid_t guid;
- unsigned long table;
- } efi_config_table_t;
-
--#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
-+#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL)
- #define EFI_SYSTEM_TABLE_REVISION ((1 << 16) | 00)
-
- typedef struct {
-@@ -218,6 +236,13 @@ typedef struct {
- unsigned long tables;
- } efi_system_table_t;
-
-+struct efi_memory_map {
-+ efi_memory_desc_t *phys_map;
-+ efi_memory_desc_t *map;
-+ int nr_map;
-+ unsigned long desc_version;
-+};
-+
- /*
- * All runtime access to EFI goes through this structure:
- */
-@@ -230,6 +255,7 @@ extern struct efi {
- void *sal_systab; /* SAL system table */
- void *boot_info; /* boot info table */
- void *hcdp; /* HCDP table */
-+ void *uga; /* UGA table */
- efi_get_time_t *get_time;
- efi_set_time_t *set_time;
- efi_get_wakeup_time_t *get_wakeup_time;
-@@ -239,6 +265,7 @@ extern struct efi {
- efi_set_variable_t *set_variable;
- efi_get_next_high_mono_count_t *get_next_high_mono_count;
- efi_reset_system_t *reset_system;
-+ efi_set_virtual_address_map_t *set_virtual_address_map;
- } efi;
-
- static inline int
-@@ -260,12 +287,25 @@ efi_guid_unparse(efi_guid_t *guid, char
-
- extern void efi_init (void);
- extern void efi_map_pal_code (void);
-+extern void efi_map_memmap(void);
- extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
- extern void efi_gettimeofday (struct timespec *ts);
- extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */
- extern u64 efi_get_iobase (void);
- extern u32 efi_mem_type (unsigned long phys_addr);
- extern u64 efi_mem_attributes (unsigned long phys_addr);
-+extern void efi_initialize_iomem_resources(struct resource *code_resource,
-+ struct resource *data_resource);
-+extern efi_status_t phys_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc);
-+extern unsigned long inline __init efi_get_time(void);
-+extern int inline __init efi_set_rtc_mmss(unsigned long nowtime);
-+extern struct efi_memory_map memmap;
-+
-+#ifdef CONFIG_EFI
-+extern int efi_enabled;
-+#else
-+#define efi_enabled 0
-+#endif
-
- /*
- * Variable Attributes
---- linux-2.6.0/include/linux/elevator.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/elevator.h 2003-12-28 23:21:35.000000000 -0800
-@@ -94,6 +94,11 @@ extern elevator_t iosched_deadline;
- */
- extern elevator_t iosched_as;
-
-+/*
-+ * completely fair queueing I/O scheduler
-+ */
-+extern elevator_t iosched_cfq;
-+
- extern int elevator_init(request_queue_t *, elevator_t *);
- extern void elevator_exit(request_queue_t *);
- extern inline int elv_rq_merge_ok(struct request *, struct bio *);
---- linux-2.6.0/include/linux/errno.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/errno.h 2003-12-28 23:26:39.000000000 -0800
-@@ -22,6 +22,7 @@
- #define EBADTYPE 527 /* Type not supported by server */
- #define EJUKEBOX 528 /* Request initiated, but will not complete before timeout */
- #define EIOCBQUEUED 529 /* iocb queued, will get completion event */
-+#define EIOCBRETRY 530 /* iocb queued, will trigger a retry */
-
- #endif
-
---- linux-2.6.0/include/linux/eventpoll.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/eventpoll.h 2003-12-28 23:23:06.000000000 -0800
-@@ -22,6 +22,9 @@
- #define EPOLL_CTL_DEL 2
- #define EPOLL_CTL_MOD 3
-
-+/* Set the One Shot behaviour for the target file descriptor */
-+#define EPOLLONESHOT (1 << 30)
-+
- /* Set the Edge Triggered behaviour for the target file descriptor */
- #define EPOLLET (1 << 31)
-
---- linux-2.6.0/include/linux/fb.h 2003-06-14 12:18:06.000000000 -0700
-+++ 25/include/linux/fb.h 2003-12-28 23:23:00.000000000 -0800
-@@ -352,6 +352,7 @@ struct fb_pixmap {
- struct fb_info;
- struct vm_area_struct;
- struct file;
-+struct device;
-
- /*
- * Frame buffer operations
-@@ -412,6 +413,7 @@ struct fb_info {
- struct vc_data *display_fg; /* Console visible on this display */
- int currcon; /* Current VC. */
- void *pseudo_palette; /* Fake palette of 16 colors */
-+ struct device *dev; /* pointer to the device for this fb */
- /* From here on everything is device dependent */
- void *par;
- };
---- linux-2.6.0/include/linux/fs.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/fs.h 2003-12-28 23:26:42.000000000 -0800
-@@ -369,6 +369,7 @@ struct block_device {
- struct inode {
- struct hlist_node i_hash;
- struct list_head i_list;
-+ struct list_head i_sb_list;
- struct list_head i_dentry;
- unsigned long i_ino;
- atomic_t i_count;
-@@ -388,6 +389,7 @@ struct inode {
- unsigned short i_bytes;
- spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
- struct semaphore i_sem;
-+ struct rw_semaphore i_alloc_sem;
- struct inode_operations *i_op;
- struct file_operations *i_fop; /* former ->i_op->default_file_ops */
- struct super_block *i_sb;
-@@ -480,6 +482,8 @@ static inline unsigned imajor(struct ino
- return MAJOR(inode->i_rdev);
- }
-
-+extern struct block_device *I_BDEV(struct inode *inode);
-+
- struct fown_struct {
- rwlock_t lock; /* protects pid, uid, euid fields */
- int pid; /* pid or -pgrp where SIGIO should be sent */
-@@ -523,9 +527,12 @@ struct file {
- /* needed for tty driver, and maybe others */
- void *private_data;
-
-+#ifdef CONFIG_EPOLL
- /* Used by fs/eventpoll.c to link all the hooks to this file */
- struct list_head f_ep_links;
- spinlock_t f_ep_lock;
-+#endif /* #ifdef CONFIG_EPOLL */
-+ struct address_space *f_mapping;
- };
- extern spinlock_t files_lock;
- #define file_list_lock() spin_lock(&files_lock);
-@@ -630,6 +637,7 @@ extern int __break_lease(struct inode *i
- extern void lease_get_mtime(struct inode *, struct timespec *time);
- extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
- extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
-+extern void steal_locks(fl_owner_t from);
-
- struct fasync_struct {
- int magic;
-@@ -687,6 +695,7 @@ struct super_block {
- atomic_t s_active;
- void *s_security;
-
-+ struct list_head s_inodes; /* all inodes */
- struct list_head s_dirty; /* dirty inodes */
- struct list_head s_io; /* parked for writeback */
- struct hlist_head s_anon; /* anonymous dentries for (nfs) exporting */
-@@ -749,6 +758,11 @@ extern int vfs_rename(struct inode *, st
- #define DT_SOCK 12
- #define DT_WHT 14
-
-+#define OSYNC_METADATA (1<<0)
-+#define OSYNC_DATA (1<<1)
-+#define OSYNC_INODE (1<<2)
-+int generic_osync_inode(struct inode *, struct address_space *, int);
-+
- /*
- * This is the "filldir" function type, used by readdir() to let
- * the kernel specify what kind of dirent layout it wants to have.
-@@ -758,9 +772,9 @@ extern int vfs_rename(struct inode *, st
- typedef int (*filldir_t)(void *, const char *, int, loff_t, ino_t, unsigned);
-
- struct block_device_operations {
-- int (*open) (struct inode *, struct file *);
-- int (*release) (struct inode *, struct file *);
-- int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);
-+ int (*open) (struct block_device *, struct file *);
-+ int (*release) (struct gendisk *);
-+ int (*ioctl) (struct block_device *, struct file *, unsigned, unsigned long);
- int (*media_changed) (struct gendisk *);
- int (*revalidate_disk) (struct gendisk *);
- struct module *owner;
-@@ -1123,11 +1137,9 @@ enum {BDEV_FILE, BDEV_SWAP, BDEV_FS, BDE
- extern int register_blkdev(unsigned int, const char *);
- extern int unregister_blkdev(unsigned int, const char *);
- extern struct block_device *bdget(dev_t);
--extern int bd_acquire(struct inode *inode);
- extern void bd_forget(struct inode *inode);
- extern void bdput(struct block_device *);
- extern int blkdev_open(struct inode *, struct file *);
--extern int blkdev_close(struct inode *, struct file *);
- extern struct block_device *open_by_devnum(dev_t, unsigned, int);
- extern struct file_operations def_blk_fops;
- extern struct address_space_operations def_blk_aops;
-@@ -1135,7 +1147,7 @@ extern struct file_operations def_chr_fo
- extern struct file_operations bad_sock_fops;
- extern struct file_operations def_fifo_fops;
- extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
--extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
-+extern int blkdev_ioctl(struct block_device *, struct file *, unsigned, unsigned long);
- extern int blkdev_get(struct block_device *, mode_t, unsigned, int);
- extern int blkdev_put(struct block_device *, int);
- extern int bd_claim(struct block_device *, void *);
-@@ -1202,6 +1214,7 @@ extern void write_inode_now(struct inode
- extern int filemap_fdatawrite(struct address_space *);
- extern int filemap_flush(struct address_space *);
- extern int filemap_fdatawait(struct address_space *);
-+extern int filemap_write_and_wait(struct address_space *mapping);
- extern void sync_supers(void);
- extern void sync_filesystems(int wait);
- extern void emergency_sync(void);
-@@ -1295,8 +1308,7 @@ extern int generic_file_readonly_mmap(st
- extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
- extern int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
- extern ssize_t generic_file_read(struct file *, char __user *, size_t, loff_t *);
--int generic_write_checks(struct inode *inode, struct file *file,
-- loff_t *pos, size_t *count, int isblk);
-+int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk);
- extern ssize_t generic_file_write(struct file *, const char __user *, size_t, loff_t *);
- extern ssize_t generic_file_aio_read(struct kiocb *, char __user *, size_t, loff_t);
- extern ssize_t __generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t *);
-@@ -1314,9 +1326,6 @@ extern void
- file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping);
- extern ssize_t generic_file_direct_IO(int rw, struct kiocb *iocb,
- const struct iovec *iov, loff_t offset, unsigned long nr_segs);
--extern int blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
-- struct block_device *bdev, const struct iovec *iov, loff_t offset,
-- unsigned long nr_segs, get_blocks_t *get_blocks, dio_iodone_t *end_io);
- extern ssize_t generic_file_readv(struct file *filp, const struct iovec *iov,
- unsigned long nr_segs, loff_t *ppos);
- ssize_t generic_file_writev(struct file *filp, const struct iovec *iov,
-@@ -1330,7 +1339,7 @@ static inline void do_generic_file_read(
- read_descriptor_t * desc,
- read_actor_t actor)
- {
-- do_generic_mapping_read(filp->f_dentry->d_inode->i_mapping,
-+ do_generic_mapping_read(filp->f_mapping,
- &filp->f_ra,
- filp,
- ppos,
-@@ -1338,6 +1347,32 @@ static inline void do_generic_file_read(
- actor);
- }
-
-+int __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
-+ struct block_device *bdev, const struct iovec *iov, loff_t offset,
-+ unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io,
-+ int needs_special_locking);
-+
-+/*
-+ * For filesystems which need locking between buffered and direct access
-+ */
-+static inline int blockdev_direct_IO(int rw, struct kiocb *iocb,
-+ struct inode *inode, struct block_device *bdev, const struct iovec *iov,
-+ loff_t offset, unsigned long nr_segs, get_blocks_t get_blocks,
-+ dio_iodone_t end_io)
-+{
-+ return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
-+ nr_segs, get_blocks, end_io, 1);
-+}
-+
-+static inline int blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb,
-+ struct inode *inode, struct block_device *bdev, const struct iovec *iov,
-+ loff_t offset, unsigned long nr_segs, get_blocks_t get_blocks,
-+ dio_iodone_t end_io)
-+{
-+ return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
-+ nr_segs, get_blocks, end_io, 0);
-+}
-+
- extern struct file_operations generic_ro_fops;
-
- #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
-@@ -1408,5 +1443,8 @@ static inline ino_t parent_ino(struct de
- return res;
- }
-
-+/* kernel/fork.c */
-+extern int unshare_files(void);
-+
- #endif /* __KERNEL__ */
- #endif /* _LINUX_FS_H */
---- linux-2.6.0/include/linux/hugetlb.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/hugetlb.h 2003-12-28 23:22:58.000000000 -0800
-@@ -39,6 +39,7 @@ mark_mm_hugetlb(struct mm_struct *mm, st
-
- #ifndef ARCH_HAS_HUGEPAGE_ONLY_RANGE
- #define is_hugepage_only_range(addr, len) 0
-+#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
- #endif
-
- #else /* !CONFIG_HUGETLB_PAGE */
-@@ -63,6 +64,7 @@ static inline int is_vm_hugetlb_page(str
- #define is_aligned_hugepage_range(addr, len) 0
- #define pmd_huge(x) 0
- #define is_hugepage_only_range(addr, len) 0
-+#define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
-
- #ifndef HPAGE_MASK
- #define HPAGE_MASK 0 /* Keep the compiler happy */
---- linux-2.6.0/include/linux/i2c-dev.h 2003-06-14 12:18:04.000000000 -0700
-+++ 25/include/linux/i2c-dev.h 2003-12-28 23:21:48.000000000 -0800
-@@ -43,4 +43,6 @@ struct i2c_rdwr_ioctl_data {
- __u32 nmsgs; /* number of i2c_msgs */
- };
-
-+#define I2C_RDRW_IOCTL_MAX_MSGS 42
-+
- #endif /* _LINUX_I2C_DEV_H */
---- linux-2.6.0/include/linux/ide.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/ide.h 2003-12-28 23:26:29.000000000 -0800
-@@ -51,9 +51,6 @@
- #ifndef SUPPORT_VLB_SYNC /* 1 to support weird 32-bit chips */
- #define SUPPORT_VLB_SYNC 1 /* 0 to reduce kernel size */
- #endif
--#ifndef DISK_RECOVERY_TIME /* off=0; on=access_delay_time */
--#define DISK_RECOVERY_TIME 0 /* for hardware that needs it */
--#endif
- #ifndef OK_TO_RESET_CONTROLLER /* 1 needed for good error recovery */
- #define OK_TO_RESET_CONTROLLER 1 /* 0 for use with AH2372A/B interface */
- #endif
-@@ -999,10 +996,6 @@ typedef struct hwif_s {
- unsigned dma_extra; /* extra addr for dma ports */
- unsigned long config_data; /* for use by chipset-specific code */
- unsigned long select_data; /* for use by chipset-specific code */
--#if (DISK_RECOVERY_TIME > 0)
-- unsigned long last_time; /* time when previous rq was done */
--#endif
--
-
- unsigned noprobe : 1; /* don't probe for this interface */
- unsigned present : 1; /* this interface exists */
-@@ -1693,6 +1686,8 @@ extern void ide_setup_pci_devices(struct
- #define GOOD_DMA_DRIVE 1
-
- #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
-+extern int ide_build_sglist(ide_drive_t *, struct request *);
-+extern int ide_raw_build_sglist(ide_drive_t *, struct request *);
- extern int ide_build_dmatable(ide_drive_t *, struct request *);
- extern void ide_destroy_dmatable(ide_drive_t *);
- extern ide_startstop_t ide_dma_intr(ide_drive_t *);
---- linux-2.6.0/include/linux/if_bonding.h 2003-06-14 12:18:30.000000000 -0700
-+++ 25/include/linux/if_bonding.h 2003-12-28 23:21:01.000000000 -0800
-@@ -1,7 +1,7 @@
- /*
- * Bond several ethernet interfaces into a Cisco, running 'Etherchannel'.
- *
-- *
-+ *
- * Portions are (c) Copyright 1995 Simon "Guru Aleph-Null" Janes
- * NCM: Network and Communications Management, Inc.
- *
-@@ -10,11 +10,11 @@
- *
- * This software may be used and distributed according to the terms
- * of the GNU Public License, incorporated herein by reference.
-- *
-+ *
- * 2003/03/18 - Amir Noam <amir.noam at intel dot com>
- * - Added support for getting slave's speed and duplex via ethtool.
- * Needed for 802.3ad and other future modes.
-- *
-+ *
- * 2003/03/18 - Tsippy Mendelson <tsippy.mendelson at intel dot com> and
- * Shmulik Hen <shmulik.hen at intel dot com>
- * - Enable support of modes that need to use the unique mac address of
-@@ -42,7 +42,7 @@
- #include <linux/if_ether.h>
-
- /* userland - kernel ABI version (2003/05/08) */
--#define BOND_ABI_VERSION 1
-+#define BOND_ABI_VERSION 2
-
- /*
- * We can remove these ioctl definitions in 2.5. People should use the
-@@ -77,10 +77,6 @@
-
- #define BOND_DEFAULT_MAX_BONDS 1 /* Default maximum number of devices to support */
-
--#define BOND_MULTICAST_DISABLED 0
--#define BOND_MULTICAST_ACTIVE 1
--#define BOND_MULTICAST_ALL 2
--
- typedef struct ifbond {
- __s32 bond_mode;
- __s32 num_slaves;
-@@ -90,9 +86,9 @@ typedef struct ifbond {
- typedef struct ifslave
- {
- __s32 slave_id; /* Used as an IN param to the BOND_SLAVE_INFO_QUERY ioctl */
-- char slave_name[IFNAMSIZ];
-- char link;
-- char state;
-+ __s8 slave_name[IFNAMSIZ];
-+ __s8 link;
-+ __s8 state;
- __u32 link_failure_count;
- } ifslave;
-
-@@ -115,3 +111,4 @@ struct ad_info {
- * tab-width: 8
- * End:
- */
-+
---- linux-2.6.0/include/linux/init_task.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/init_task.h 2003-12-28 23:26:39.000000000 -0800
-@@ -108,6 +108,7 @@
- .proc_lock = SPIN_LOCK_UNLOCKED, \
- .switch_lock = SPIN_LOCK_UNLOCKED, \
- .journal_info = NULL, \
-+ .io_wait = NULL, \
- }
-
-
---- linux-2.6.0/include/linux/input.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/input.h 2003-12-28 23:21:26.000000000 -0800
-@@ -870,6 +870,7 @@ struct input_handler {
- char *name;
-
- struct input_device_id *id_table;
-+ struct input_device_id *blacklist;
-
- struct list_head h_list;
- struct list_head node;
---- linux-2.6.0/include/linux/jiffies.h 2003-06-14 12:17:56.000000000 -0700
-+++ 25/include/linux/jiffies.h 2003-12-28 23:22:24.000000000 -0800
-@@ -10,7 +10,7 @@
-
- /*
- * The 64-bit value is not volatile - you MUST NOT read it
-- * without holding read_lock_irq(&xtime_lock).
-+ * without sampling the sequence number in xtime_lock.
- * get_jiffies_64() will do this for you as appropriate.
- */
- extern u64 jiffies_64;
---- linux-2.6.0/include/linux/kernel.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/kernel.h 2003-12-28 23:21:48.000000000 -0800
-@@ -87,6 +87,8 @@ extern int session_of_pgrp(int pgrp);
- asmlinkage int printk(const char * fmt, ...)
- __attribute__ ((format (printf, 1, 2)));
-
-+unsigned long int_sqrt(unsigned long);
-+
- static inline void console_silent(void)
- {
- console_loglevel = 0;
---- linux-2.6.0/include/linux/keyboard.h 2003-06-14 12:17:58.000000000 -0700
-+++ 25/include/linux/keyboard.h 2003-12-28 23:21:28.000000000 -0800
-@@ -2,7 +2,6 @@
- #define __LINUX_KEYBOARD_H
-
- #include <linux/wait.h>
--#include <linux/input.h>
-
- #define KG_SHIFT 0
- #define KG_CTRL 2
-@@ -17,7 +16,7 @@
-
- #define NR_SHIFT 9
-
--#define NR_KEYS (KEY_MAX+1)
-+#define NR_KEYS 255
- #define MAX_NR_KEYMAPS 256
- /* This means 128Kb if all keymaps are allocated. Only the superuser
- may increase the number of keymaps beyond MAX_NR_OF_USER_KEYMAPS. */
---- linux-2.6.0/include/linux/kmod.h 2003-09-08 13:58:59.000000000 -0700
-+++ 25/include/linux/kmod.h 2003-12-28 23:21:42.000000000 -0800
-@@ -24,6 +24,8 @@
- #include <linux/compiler.h>
-
- #ifdef CONFIG_KMOD
-+/* modprobe exit status on success, -ve on error. Return value
-+ * usually useless though. */
- extern int request_module(const char * name, ...) __attribute__ ((format (printf, 1, 2)));
- #else
- static inline int request_module(const char * name, ...) { return -ENOSYS; }
---- linux-2.6.0/include/linux/list.h 2003-12-17 21:20:03.000000000 -0800
-+++ 25/include/linux/list.h 2003-12-28 23:26:32.000000000 -0800
-@@ -142,8 +142,11 @@ static inline void __list_del(struct lis
- * Note: list_empty on entry does not return true after this, the entry is
- * in an undefined state.
- */
-+#include <linux/kernel.h> /* BUG_ON */
- static inline void list_del(struct list_head *entry)
- {
-+ BUG_ON(entry->prev->next != entry);
-+ BUG_ON(entry->next->prev != entry);
- __list_del(entry->prev, entry->next);
- entry->next = LIST_POISON1;
- entry->prev = LIST_POISON2;
-@@ -212,6 +215,12 @@ static inline int list_empty(const struc
- * list_empty_careful - tests whether a list is
- * empty _and_ checks that no other CPU might be
- * in the process of still modifying either member
-+ *
-+ * NOTE: using list_empty_careful() without synchronization
-+ * can only be safe if the only activity that can happen
-+ * to the list entry is list_del_init(). Eg. it cannot be used
-+ * if another CPU could re-list_add() it.
-+ *
- * @head: the list to test.
- */
- static inline int list_empty_careful(const struct list_head *head)
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/linux/lockmeter.h 2003-12-28 23:26:33.000000000 -0800
-@@ -0,0 +1,320 @@
-+/*
-+ * Copyright (C) 1999-2002 Silicon Graphics, Inc.
-+ *
-+ * Written by John Hawkes (hawkes@sgi.com)
-+ * Based on klstat.h by Jack Steiner (steiner@sgi.com)
-+ *
-+ * Modified by Ray Bryant (raybry@us.ibm.com) Feb-Apr 2000
-+ * Changes Copyright (C) 2000 IBM, Inc.
-+ * Added save of index in spinlock_t to improve efficiency
-+ * of "hold" time reporting for spinlocks
-+ * Added support for hold time statistics for read and write
-+ * locks.
-+ * Moved machine dependent code to include/asm/lockmeter.h.
-+ *
-+ */
-+
-+#ifndef _LINUX_LOCKMETER_H
-+#define _LINUX_LOCKMETER_H
-+
-+
-+/*---------------------------------------------------
-+ * architecture-independent lockmeter.h
-+ *-------------------------------------------------*/
-+
-+/*
-+ * raybry -- version 2: added efficient hold time statistics
-+ * requires lstat recompile, so flagged as new version
-+ * raybry -- version 3: added global reader lock data
-+ * hawkes -- version 4: removed some unnecessary fields to simplify mips64 port
-+ */
-+#define LSTAT_VERSION 5
-+
-+int lstat_update(void*, void*, int);
-+int lstat_update_time(void*, void*, int, uint32_t);
-+
-+/*
-+ * Currently, the mips64 and sparc64 kernels talk to a 32-bit lockstat, so we
-+ * need to force compatibility in the inter-communication data structure.
-+ */
-+
-+#if defined(CONFIG_MIPS32_COMPAT)
-+#define TIME_T uint32_t
-+#elif defined(CONFIG_SPARC) || defined(CONFIG_SPARC64)
-+#define TIME_T uint64_t
-+#else
-+#define TIME_T time_t
-+#endif
-+
-+#if defined(__KERNEL__) || (!defined(CONFIG_MIPS32_COMPAT) && !defined(CONFIG_SPARC) && !defined(CONFIG_SPARC64)) || (_MIPS_SZLONG==32)
-+#define POINTER void *
-+#else
-+#define POINTER int64_t
-+#endif
-+
-+/*
-+ * Values for the "action" parameter passed to lstat_update.
-+ * ZZZ - do we want a try-success status here???
-+ */
-+#define LSTAT_ACT_NO_WAIT 0
-+#define LSTAT_ACT_SPIN 1
-+#define LSTAT_ACT_REJECT 2
-+#define LSTAT_ACT_WW_SPIN 3
-+#define LSTAT_ACT_SLEPT 4 /* UNUSED */
-+
-+#define LSTAT_ACT_MAX_VALUES 4 /* NOTE: Increase to 5 if use ACT_SLEPT */
-+
-+/*
-+ * Special values for the low 2 bits of an RA passed to
-+ * lstat_update.
-+ */
-+/* we use these values to figure out what kind of lock data */
-+/* is stored in the statistics table entry at index ....... */
-+#define LSTAT_RA_SPIN 0 /* spin lock data */
-+#define LSTAT_RA_READ 1 /* read lock statistics */
-+#define LSTAT_RA_SEMA 2 /* RESERVED */
-+#define LSTAT_RA_WRITE 3 /* write lock statistics*/
-+
-+#define LSTAT_RA(n) \
-+ ((void*)( ((unsigned long)__builtin_return_address(0) & ~3) | n) )
-+
-+/*
-+ * Constants used for lock addresses in the lstat_directory
-+ * to indicate special values of the lock address.
-+ */
-+#define LSTAT_MULTI_LOCK_ADDRESS NULL
-+
-+/*
-+ * Maximum size of the lockstats tables. Increase this value
-+ * if its not big enough. (Nothing bad happens if its not
-+ * big enough although some locks will not be monitored.)
-+ * We record overflows of this quantity in lstat_control.dir_overflows
-+ *
-+ * Note: The max value here must fit into the field set
-+ * and obtained by the macro's PUT_INDEX() and GET_INDEX().
-+ * This value depends on how many bits are available in the
-+ * lock word in the particular machine implementation we are on.
-+ */
-+#define LSTAT_MAX_STAT_INDEX 2000
-+
-+/*
-+ * Size and mask for the hash table into the directory.
-+ */
-+#define LSTAT_HASH_TABLE_SIZE 4096 /* must be 2**N */
-+#define LSTAT_HASH_TABLE_MASK (LSTAT_HASH_TABLE_SIZE-1)
-+
-+#define DIRHASH(ra) ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
-+
-+/*
-+ * This defines an entry in the lockstat directory. It contains
-+ * information about a lock being monitored.
-+ * A directory entry only contains the lock identification -
-+ * counts on usage of the lock are kept elsewhere in a per-cpu
-+ * data structure to minimize cache line pinging.
-+ */
-+typedef struct {
-+ POINTER caller_ra; /* RA of code that set lock */
-+ POINTER lock_ptr; /* lock address */
-+ ushort next_stat_index; /* Used to link multiple locks that have the same hash table value */
-+} lstat_directory_entry_t;
-+
-+/*
-+ * A multi-dimensioned array used to contain counts for lock accesses.
-+ * The array is 3-dimensional:
-+ * - CPU number. Keep from thrashing cache lines between CPUs
-+ * - Directory entry index. Identifies the lock
-+ * - Action. Indicates what kind of contention occurred on an
-+ * access to the lock.
-+ *
-+ * The index of an entry in the directory is the same as the 2nd index
-+ * of the entry in the counts array.
-+ */
-+/*
-+ * This table contains data for spin_locks, write locks, and read locks
-+ * Not all data is used for all cases. In particular, the hold time
-+ * information is not stored here for read locks since that is a global
-+ * (e. g. cannot be separated out by return address) quantity.
-+ * See the lstat_read_lock_counts_t structure for the global read lock
-+ * hold time.
-+ */
-+typedef struct {
-+ uint64_t cum_wait_ticks; /* sum of wait times */
-+ /* for write locks, sum of time a */
-+ /* writer is waiting for a reader */
-+ int64_t cum_hold_ticks; /* cumulative sum of holds */
-+ /* not used for read mode locks */
-+ /* must be signed. ............... */
-+ uint32_t max_wait_ticks; /* max waiting time */
-+ uint32_t max_hold_ticks; /* max holding time */
-+ uint64_t cum_wait_ww_ticks; /* sum times writer waits on writer*/
-+ uint32_t max_wait_ww_ticks; /* max wait time writer vs writer */
-+ /* prev 2 only used for write locks*/
-+ uint32_t acquire_time; /* time lock acquired this CPU */
-+ uint32_t count[LSTAT_ACT_MAX_VALUES];
-+} lstat_lock_counts_t;
-+
-+typedef lstat_lock_counts_t lstat_cpu_counts_t[LSTAT_MAX_STAT_INDEX];
-+
-+/*
-+ * User request to:
-+ * - turn statistic collection on/off, or to reset
-+ */
-+#define LSTAT_OFF 0
-+#define LSTAT_ON 1
-+#define LSTAT_RESET 2
-+#define LSTAT_RELEASE 3
-+
-+#define LSTAT_MAX_READ_LOCK_INDEX 1000
-+typedef struct {
-+ POINTER lock_ptr; /* address of lock for output stats */
-+ uint32_t read_lock_count;
-+ int64_t cum_hold_ticks; /* sum of read lock hold times over */
-+ /* all callers. ....................*/
-+ uint32_t write_index; /* last write lock hash table index */
-+ uint32_t busy_periods; /* count of busy periods ended this */
-+ uint64_t start_busy; /* time this busy period started. ..*/
-+ uint64_t busy_ticks; /* sum of busy periods this lock. ..*/
-+ uint64_t max_busy; /* longest busy period for this lock*/
-+ uint32_t max_readers; /* maximum number of readers ...... */
-+#ifdef USER_MODE_TESTING
-+ rwlock_t entry_lock; /* lock for this read lock entry... */
-+ /* avoid having more than one rdr at*/
-+ /* needed for user space testing... */
-+ /* not needed for kernel 'cause it */
-+ /* is non-preemptive. ............. */
-+#endif
-+} lstat_read_lock_counts_t;
-+typedef lstat_read_lock_counts_t lstat_read_lock_cpu_counts_t[LSTAT_MAX_READ_LOCK_INDEX];
-+
-+#if defined(__KERNEL__) || defined(USER_MODE_TESTING)
-+
-+#ifndef USER_MODE_TESTING
-+#include <asm/lockmeter.h>
-+#else
-+#include "asm_newlockmeter.h"
-+#endif
-+
-+/*
-+ * Size and mask for the hash table into the directory.
-+ */
-+#define LSTAT_HASH_TABLE_SIZE 4096 /* must be 2**N */
-+#define LSTAT_HASH_TABLE_MASK (LSTAT_HASH_TABLE_SIZE-1)
-+
-+#define DIRHASH(ra) ((unsigned long)(ra)>>2 & LSTAT_HASH_TABLE_MASK)
-+
-+/*
-+ * This version eliminates the per processor lock stack. What we do is to
-+ * store the index of the lock hash structure in unused bits in the lock
-+ * itself. Then on unlock we can find the statistics record without doing
-+ * any additional hash or lock stack lookup. This works for spin_locks.
-+ * Hold time reporting is now basically as cheap as wait time reporting
-+ * so we ignore the difference between LSTAT_ON_HOLD and LSTAT_ON_WAIT
-+ * as in version 1.1.* of lockmeter.
-+ *
-+ * For rw_locks, we store the index of a global reader stats structure in
-+ * the lock and the writer index is stored in the latter structure.
-+ * For read mode locks we hash at the time of the lock to find an entry
-+ * in the directory for reader wait time and the like.
-+ * At unlock time for read mode locks, we update just the global structure
-+ * so we don't need to know the reader directory index value at unlock time.
-+ *
-+ */
-+
-+/*
-+ * Protocol to change lstat_control.state
-+ * This is complicated because we don't want the cum_hold_time for
-+ * a rw_lock to be decremented in _read_lock_ without making sure it
-+ * is incremented in _read_lock_ and vice versa. So here is the
-+ * way we change the state of lstat_control.state:
-+ * I. To Turn Statistics On
-+ * After allocating storage, set lstat_control.state non-zero.
-+ * This works because we don't start updating statistics for in use
-+ * locks until the reader lock count goes to zero.
-+ * II. To Turn Statistics Off:
-+ * (0) Disable interrupts on this CPU
-+ * (1) Seize the lstat_control.directory_lock
-+ * (2) Obtain the current value of lstat_control.next_free_read_lock_index
-+ * (3) Store a zero in lstat_control.state.
-+ * (4) Release the lstat_control.directory_lock
-+ * (5) For each lock in the read lock list up to the saved value
-+ * (well, -1) of the next_free_read_lock_index, do the following:
-+ * (a) Check validity of the stored lock address
-+ * by making sure that the word at the saved addr
-+ * has an index that matches this entry. If not
-+ * valid, then skip this entry.
-+ * (b) If there is a write lock already set on this lock,
-+ * skip to (d) below.
-+ * (c) Set a non-metered write lock on the lock
-+ * (d) set the cached INDEX in the lock to zero
-+ * (e) Release the non-metered write lock.
-+ * (6) Re-enable interrupts
-+ *
-+ * These rules ensure that a read lock will not have its statistics
-+ * partially updated even though the global lock recording state has
-+ * changed. See put_lockmeter_info() for implementation.
-+ *
-+ * The reason for (b) is that there may be write locks set on the
-+ * syscall path to put_lockmeter_info() from user space. If we do
-+ * not do this check, then we can deadlock. A similar problem would
-+ * occur if the lock was read locked by the current CPU. At the
-+ * moment this does not appear to happen.
-+ */
-+
-+/*
-+ * Main control structure for lockstat. Used to turn statistics on/off
-+ * and to maintain directory info.
-+ */
-+typedef struct {
-+ int state;
-+ spinlock_t control_lock; /* used to serialize turning statistics on/off */
-+ spinlock_t directory_lock; /* for serialize adding entries to directory */
-+ volatile int next_free_dir_index;/* next free entry in the directory */
-+ /* FIXME not all of these fields are used / needed .............. */
-+ /* the following fields represent data since */
-+ /* first "lstat on" or most recent "lstat reset" */
-+ TIME_T first_started_time; /* time when measurement first enabled */
-+ TIME_T started_time; /* time when measurement last started */
-+ TIME_T ending_time; /* time when measurement last disabled */
-+ uint64_t started_cycles64; /* cycles when measurement last started */
-+ uint64_t ending_cycles64; /* cycles when measurement last disabled */
-+ uint64_t enabled_cycles64; /* total cycles with measurement enabled */
-+ int intervals; /* number of measurement intervals recorded */
-+ /* i. e. number of times did lstat on;lstat off */
-+ lstat_directory_entry_t *dir; /* directory */
-+ int dir_overflow; /* count of times ran out of space in directory */
-+ int rwlock_overflow; /* count of times we couldn't allocate a rw block*/
-+ ushort *hashtab; /* hash table for quick dir scans */
-+ lstat_cpu_counts_t *counts[NR_CPUS]; /* Array of pointers to per-cpu stats */
-+ int next_free_read_lock_index; /* next rwlock reader (global) stats block */
-+ lstat_read_lock_cpu_counts_t *read_lock_counts[NR_CPUS]; /* per cpu read lock stats */
-+} lstat_control_t;
-+
-+#endif /* defined(__KERNEL__) || defined(USER_MODE_TESTING) */
-+
-+typedef struct {
-+ short lstat_version; /* version of the data */
-+ short state; /* the current state is returned */
-+ int maxcpus; /* Number of cpus present */
-+ int next_free_dir_index; /* index of the next free directory entry */
-+ TIME_T first_started_time; /* when measurement enabled for first time */
-+ TIME_T started_time; /* time in secs since 1969 when stats last turned on */
-+ TIME_T ending_time; /* time in secs since 1969 when stats last turned off */
-+ uint32_t cycleval; /* cycles per second */
-+#ifdef notyet
-+ void *kernel_magic_addr; /* address of kernel_magic */
-+ void *kernel_end_addr; /* contents of kernel magic (points to "end") */
-+#endif
-+ int next_free_read_lock_index; /* index of next (global) read lock stats struct */
-+ uint64_t started_cycles64; /* cycles when measurement last started */
-+ uint64_t ending_cycles64; /* cycles when stats last turned off */
-+ uint64_t enabled_cycles64; /* total cycles with measurement enabled */
-+ int intervals; /* number of measurement intervals recorded */
-+ /* i.e. number of times we did lstat on;lstat off*/
-+ int dir_overflow; /* number of times we wanted more space in directory */
-+ int rwlock_overflow; /* # of times we wanted more space in read_locks_count */
-+ struct new_utsname uts; /* info about machine where stats are measured */
-+ /* -T option of lockstat allows data to be */
-+ /* moved to another machine. ................. */
-+} lstat_user_request_t;
-+
-+#endif /* _LINUX_LOCKMETER_H */
---- linux-2.6.0/include/linux/loop.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/loop.h 2003-12-28 23:21:53.000000000 -0800
-@@ -34,8 +34,9 @@ struct loop_device {
- loff_t lo_sizelimit;
- int lo_flags;
- int (*transfer)(struct loop_device *, int cmd,
-- char *raw_buf, char *loop_buf, int size,
-- sector_t real_block);
-+ struct page *raw_page, unsigned raw_off,
-+ struct page *loop_page, unsigned loop_off,
-+ int size, sector_t real_block);
- char lo_file_name[LO_NAME_SIZE];
- char lo_crypt_name[LO_NAME_SIZE];
- char lo_encrypt_key[LO_KEY_SIZE];
-@@ -70,8 +71,7 @@ struct loop_device {
- /*
- * Loop flags
- */
--#define LO_FLAGS_DO_BMAP 1
--#define LO_FLAGS_READ_ONLY 2
-+#define LO_FLAGS_READ_ONLY 1
-
- #include <asm/posix_types.h> /* for __kernel_old_dev_t */
- #include <asm/types.h> /* for __u64 */
-@@ -128,8 +128,10 @@ struct loop_info64 {
- /* Support for loadable transfer modules */
- struct loop_func_table {
- int number; /* filter type */
-- int (*transfer)(struct loop_device *lo, int cmd, char *raw_buf,
-- char *loop_buf, int size, sector_t real_block);
-+ int (*transfer)(struct loop_device *lo, int cmd,
-+ struct page *raw_page, unsigned raw_off,
-+ struct page *loop_page, unsigned loop_off,
-+ int size, sector_t real_block);
- int (*init)(struct loop_device *, const struct loop_info64 *);
- /* release is called from loop_unregister_transfer or clr_fd */
- int (*release)(struct loop_device *);
---- linux-2.6.0/include/linux/miscdevice.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/miscdevice.h 2003-12-28 23:23:00.000000000 -0800
-@@ -36,12 +36,15 @@
-
- #define TUN_MINOR 200
-
-+struct device;
-+
- struct miscdevice
- {
- int minor;
- const char *name;
- struct file_operations *fops;
- struct list_head list;
-+ struct device *dev;
- char devfs_name[64];
- };
-
---- linux-2.6.0/include/linux/mm.h 2003-10-08 15:07:10.000000000 -0700
-+++ 25/include/linux/mm.h 2003-12-28 23:22:12.000000000 -0800
-@@ -143,7 +143,7 @@ extern pgprot_t protection_map[16];
- struct vm_operations_struct {
- void (*open)(struct vm_area_struct * area);
- void (*close)(struct vm_area_struct * area);
-- struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused);
-+ struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type);
- int (*populate)(struct vm_area_struct * area, unsigned long address, unsigned long len, pgprot_t prot, unsigned long pgoff, int nonblock);
- };
-
-@@ -322,8 +322,10 @@ static inline void put_page(struct page
- /*
- * The zone field is never updated after free_area_init_core()
- * sets it, so none of the operations on it need to be atomic.
-+ * We'll have up to log2(MAX_NUMNODES * MAX_NR_ZONES) zones
-+ * total, so we use NODES_SHIFT here to get enough bits.
- */
--#define ZONE_SHIFT (BITS_PER_LONG - 8)
-+#define ZONE_SHIFT (BITS_PER_LONG - NODES_SHIFT - MAX_NR_ZONES_SHIFT)
-
- struct zone;
- extern struct zone *zone_table[];
-@@ -405,7 +407,7 @@ static inline int page_mapped(struct pag
- extern void show_free_areas(void);
-
- struct page *shmem_nopage(struct vm_area_struct * vma,
-- unsigned long address, int unused);
-+ unsigned long address, int *type);
- struct file *shmem_file_setup(char * name, loff_t size, unsigned long flags);
- void shmem_lock(struct file * file, int lock);
- int shmem_zero_setup(struct vm_area_struct *);
-@@ -563,7 +565,7 @@ extern unsigned long page_unuse(struct p
- extern void truncate_inode_pages(struct address_space *, loff_t);
-
- /* generic vm_area_ops exported for stackable file systems */
--extern struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int);
-+struct page *filemap_nopage(struct vm_area_struct *, unsigned long, int *);
-
- /* mm/page-writeback.c */
- int write_one_page(struct page *page, int wait);
---- linux-2.6.0/include/linux/mmzone.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/mmzone.h 2003-12-28 23:22:02.000000000 -0800
-@@ -159,7 +159,10 @@ struct zone {
- #define ZONE_DMA 0
- #define ZONE_NORMAL 1
- #define ZONE_HIGHMEM 2
--#define MAX_NR_ZONES 3
-+
-+#define MAX_NR_ZONES 3 /* Sync this with MAX_NR_ZONES_SHIFT */
-+#define MAX_NR_ZONES_SHIFT 2 /* ceil(log2(MAX_NR_ZONES)) */
-+
- #define GFP_ZONEMASK 0x03
-
- /*
-@@ -284,8 +287,6 @@ struct ctl_table;
- struct file;
- int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *,
- void *, size_t *);
--extern void setup_per_zone_pages_min(void);
--
-
- #ifdef CONFIG_NUMA
- #define MAX_NR_MEMBLKS BITS_PER_LONG /* Max number of Memory Blocks */
---- linux-2.6.0/include/linux/msdos_fs.h 2003-08-08 22:55:14.000000000 -0700
-+++ 25/include/linux/msdos_fs.h 2003-12-28 23:22:51.000000000 -0800
-@@ -4,13 +4,8 @@
- /*
- * The MS-DOS filesystem constants/structures
- */
--#include <linux/buffer_head.h>
--#include <linux/string.h>
- #include <asm/byteorder.h>
-
--struct statfs;
--
--
- #define SECTOR_SIZE 512 /* sector size (bytes) */
- #define SECTOR_BITS 9 /* log2(SECTOR_SIZE) */
- #define MSDOS_DPB (MSDOS_DPS) /* dir entries per block */
-@@ -18,6 +13,9 @@ struct statfs;
- #define MSDOS_DPS (SECTOR_SIZE / sizeof(struct msdos_dir_entry))
- #define MSDOS_DPS_BITS 4 /* log2(MSDOS_DPS) */
-
-+
-+#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
-+
- #define MSDOS_ROOT_INO 1 /* == MINIX_ROOT_INO */
- #define MSDOS_DIR_BITS 5 /* log2(sizeof(struct msdos_dir_entry)) */
-
-@@ -25,8 +23,6 @@ struct statfs;
- #define FAT_MAX_DIR_ENTRIES (65536)
- #define FAT_MAX_DIR_SIZE (FAT_MAX_DIR_ENTRIES << MSDOS_DIR_BITS)
-
--#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */
--
- #define ATTR_NONE 0 /* no attribute bits */
- #define ATTR_RO 1 /* read-only */
- #define ATTR_HIDDEN 2 /* hidden */
-@@ -35,10 +31,10 @@ struct statfs;
- #define ATTR_DIR 16 /* directory */
- #define ATTR_ARCH 32 /* archived */
-
-+/* attribute bits that are copied "as is" */
- #define ATTR_UNUSED (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
-- /* attribute bits that are copied "as is" */
-+/* bits that are used by the Windows 95/Windows NT extended FAT */
- #define ATTR_EXT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
-- /* bits that are used by the Windows 95/Windows NT extended FAT */
-
- #define CASE_LOWER_BASE 8 /* base is lower case */
- #define CASE_LOWER_EXT 16 /* extension is lower case */
-@@ -46,8 +42,12 @@ struct statfs;
- #define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */
- #define IS_FREE(n) (!*(n) || *(n) == DELETED_FLAG)
-
-+/* valid file mode bits */
- #define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
-- /* valid file mode bits */
-+/* Convert attribute bits and a mask to the UNIX mode. */
-+#define MSDOS_MKMODE(a, m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
-+/* Convert the UNIX mode to MS-DOS attribute bits. */
-+#define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
-
- #define MSDOS_NAME 11 /* maximum name length */
- #define MSDOS_LONGNAME 256 /* maximum name length */
-@@ -55,24 +55,29 @@ struct statfs;
- #define MSDOS_DOT ". " /* ".", padded to MSDOS_NAME chars */
- #define MSDOS_DOTDOT ".. " /* "..", padded to MSDOS_NAME chars */
-
--#define MSDOS_FAT12 4084 /* maximum number of clusters in a 12 bit FAT */
--
- /* media of boot sector */
- #define FAT_VALID_MEDIA(x) ((0xF8 <= (x) && (x) <= 0xFF) || (x) == 0xF0)
- #define FAT_FIRST_ENT(s, x) ((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
- MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))
-
-+/* maximum number of clusters */
-+#define MAX_FAT12 0xFF4
-+#define MAX_FAT16 0xFFF4
-+#define MAX_FAT32 0x0FFFFFF6
-+#define MAX_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? MAX_FAT32 : \
-+ MSDOS_SB(s)->fat_bits == 16 ? MAX_FAT16 : MAX_FAT12)
-+
- /* bad cluster mark */
- #define BAD_FAT12 0xFF7
- #define BAD_FAT16 0xFFF7
--#define BAD_FAT32 0xFFFFFF7
-+#define BAD_FAT32 0x0FFFFFF7
- #define BAD_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? BAD_FAT32 : \
- MSDOS_SB(s)->fat_bits == 16 ? BAD_FAT16 : BAD_FAT12)
-
- /* standard EOF */
- #define EOF_FAT12 0xFFF
- #define EOF_FAT16 0xFFFF
--#define EOF_FAT32 0xFFFFFFF
-+#define EOF_FAT32 0x0FFFFFFF
- #define EOF_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? EOF_FAT32 : \
- MSDOS_SB(s)->fat_bits == 16 ? EOF_FAT16 : EOF_FAT12)
-
-@@ -80,8 +85,8 @@ struct statfs;
- #define FAT_ENT_BAD (BAD_FAT32)
- #define FAT_ENT_EOF (EOF_FAT32)
-
--#define FAT_FSINFO_SIG1 0x41615252
--#define FAT_FSINFO_SIG2 0x61417272
-+#define FAT_FSINFO_SIG1 0x41615252
-+#define FAT_FSINFO_SIG2 0x61417272
- #define IS_FSINFO(x) (CF_LE_L((x)->signature1) == FAT_FSINFO_SIG1 \
- && CF_LE_L((x)->signature2) == FAT_FSINFO_SIG2)
-
-@@ -179,15 +184,10 @@ struct vfat_slot_info {
- loff_t i_pos; /* on-disk position of directory entry */
- };
-
--/* Convert attribute bits and a mask to the UNIX mode. */
--#define MSDOS_MKMODE(a,m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
--
--/* Convert the UNIX mode to MS-DOS attribute bits. */
--#define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
--
--
- #ifdef __KERNEL__
-
-+#include <linux/buffer_head.h>
-+#include <linux/string.h>
- #include <linux/nls.h>
- #include <linux/msdos_fs_i.h>
- #include <linux/msdos_fs_sb.h>
---- linux-2.6.0/include/linux/msdos_fs_sb.h 2003-07-27 12:14:40.000000000 -0700
-+++ 25/include/linux/msdos_fs_sb.h 2003-12-28 23:22:51.000000000 -0800
-@@ -47,9 +47,9 @@ struct msdos_sb_info {
- unsigned long data_start; /* first data sector */
- unsigned long clusters; /* number of clusters */
- unsigned long root_cluster; /* first cluster of the root directory */
-- unsigned long fsinfo_sector; /* FAT32 fsinfo offset from start of disk */
-+ unsigned long fsinfo_sector; /* sector number of FAT32 fsinfo */
- struct semaphore fat_lock;
-- int prev_free; /* previously returned free cluster number */
-+ int prev_free; /* previously allocated cluster number */
- int free_clusters; /* -1 if undefined */
- struct fat_mount_options options;
- struct nls_table *nls_disk; /* Codepage used on disk */
---- linux-2.6.0/include/linux/nbd.h 2003-07-13 21:44:35.000000000 -0700
-+++ 25/include/linux/nbd.h 2003-12-28 23:22:28.000000000 -0800
-@@ -35,6 +35,9 @@ enum {
- /* Define PARANOIA to include extra sanity checking code in here & driver */
- #define PARANOIA
-
-+/* userspace doesn't need the nbd_device structure */
-+#ifdef __KERNEL__
-+
- struct nbd_device {
- int flags;
- int harderror; /* Code of hard error */
-@@ -53,6 +56,8 @@ struct nbd_device {
- u64 bytesize;
- };
-
-+#endif
-+
- /* This now IS in some kind of include file... */
-
- /* These are send over network in request/reply magic field */
---- linux-2.6.0/include/linux/netdevice.h 2003-11-23 19:03:02.000000000 -0800
-+++ 25/include/linux/netdevice.h 2003-12-28 23:21:01.000000000 -0800
-@@ -452,6 +452,12 @@ struct net_device
- unsigned char *haddr);
- int (*neigh_setup)(struct net_device *dev, struct neigh_parms *);
- int (*accept_fastpath)(struct net_device *, struct dst_entry*);
-+#ifdef CONFIG_NETPOLL_RX
-+ int netpoll_rx;
-+#endif
-+#ifdef CONFIG_NET_POLL_CONTROLLER
-+ void (*poll_controller)(struct net_device *dev);
-+#endif
-
- /* bridge stuff */
- struct net_bridge_port *br_port;
-@@ -470,8 +476,15 @@ struct net_device
- /* class/net/name entry */
- struct class_device class_dev;
- struct net_device_stats* (*last_stats)(struct net_device *);
-+ /* how much padding had been added by alloc_netdev() */
-+ int padded;
- };
-
-+static inline void *netdev_priv(struct net_device *dev)
-+{
-+ return (char *)dev + ((sizeof(struct net_device) + 31) & ~31);
-+}
-+
- #define SET_MODULE_OWNER(dev) do { } while (0)
- /* Set the sysfs physical device reference for the network logical device
- * if set prior to registration will cause a symlink during initialization.
-@@ -496,6 +509,7 @@ extern rwlock_t dev_base_lock; /* De
-
- extern int netdev_boot_setup_add(char *name, struct ifmap *map);
- extern int netdev_boot_setup_check(struct net_device *dev);
-+extern unsigned long netdev_boot_base(const char *prefix, int unit);
- extern struct net_device *dev_getbyhwaddr(unsigned short type, char *hwaddr);
- extern struct net_device *__dev_getfirstbyhwtype(unsigned short type);
- extern struct net_device *dev_getfirstbyhwtype(unsigned short type);
-@@ -533,6 +547,9 @@ extern int dev_new_index(void);
- extern struct net_device *dev_get_by_index(int ifindex);
- extern struct net_device *__dev_get_by_index(int ifindex);
- extern int dev_restart(struct net_device *dev);
-+#ifdef CONFIG_NETPOLL_TRAP
-+extern int netpoll_trap(void);
-+#endif
-
- typedef int gifconf_func_t(struct net_device * dev, char * bufptr, int len);
- extern int register_gifconf(unsigned int family, gifconf_func_t * gifconf);
-@@ -591,12 +608,20 @@ static inline void netif_start_queue(str
-
- static inline void netif_wake_queue(struct net_device *dev)
- {
-+#ifdef CONFIG_NETPOLL_TRAP
-+ if (netpoll_trap())
-+ return;
-+#endif
- if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state))
- __netif_schedule(dev);
- }
-
- static inline void netif_stop_queue(struct net_device *dev)
- {
-+#ifdef CONFIG_NETPOLL_TRAP
-+ if (netpoll_trap())
-+ return;
-+#endif
- set_bit(__LINK_STATE_XOFF, &dev->state);
- }
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/linux/netpoll.h 2003-12-28 23:21:01.000000000 -0800
-@@ -0,0 +1,38 @@
-+/*
-+ * Common code for low-level network console, dump, and debugger code
-+ *
-+ * Derived from netconsole, kgdb-over-ethernet, and netdump patches
-+ */
-+
-+#ifndef _LINUX_NETPOLL_H
-+#define _LINUX_NETPOLL_H
-+
-+#include <linux/netdevice.h>
-+#include <linux/interrupt.h>
-+#include <linux/irq.h>
-+#include <linux/list.h>
-+
-+struct netpoll;
-+
-+struct netpoll {
-+ struct net_device *dev;
-+ char dev_name[16], *name;
-+ void (*rx_hook)(struct netpoll *, int, char *, int);
-+ u32 local_ip, remote_ip;
-+ u16 local_port, remote_port;
-+ unsigned char local_mac[6], remote_mac[6];
-+ struct list_head rx_list;
-+};
-+
-+void netpoll_poll(struct netpoll *np);
-+void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb);
-+void netpoll_send_udp(struct netpoll *np, const char *msg, int len);
-+int netpoll_parse_options(struct netpoll *np, char *opt);
-+int netpoll_setup(struct netpoll *np);
-+int netpoll_trap(void);
-+void netpoll_set_trap(int trap);
-+void netpoll_cleanup(struct netpoll *np);
-+int netpoll_rx(struct sk_buff *skb);
-+
-+
-+#endif
---- linux-2.6.0/include/linux/page-flags.h 2003-09-08 13:58:59.000000000 -0700
-+++ 25/include/linux/page-flags.h 2003-12-28 23:22:25.000000000 -0800
-@@ -133,6 +133,7 @@ extern void get_full_page_state(struct p
-
- #define inc_page_state(member) mod_page_state(member, 1UL)
- #define dec_page_state(member) mod_page_state(member, 0UL - 1)
-+#define add_page_state(member,delta) mod_page_state(member, (delta))
- #define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta))
-
-
---- linux-2.6.0/include/linux/pagemap.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/pagemap.h 2003-12-28 23:26:43.000000000 -0800
-@@ -8,7 +8,6 @@
- #include <linux/fs.h>
- #include <linux/list.h>
- #include <linux/highmem.h>
--#include <linux/pagemap.h>
- #include <asm/uaccess.h>
- #include <linux/gfp.h>
-
-@@ -71,7 +70,7 @@ extern struct page * find_trylock_page(s
- extern struct page * find_or_create_page(struct address_space *mapping,
- unsigned long index, unsigned int gfp_mask);
- extern unsigned int find_get_pages(struct address_space *mapping,
-- pgoff_t start, unsigned int nr_pages,
-+ pgoff_t *next, unsigned int nr_pages,
- struct page **pages);
-
- /*
-@@ -153,17 +152,27 @@ static inline void ___add_to_page_cache(
- extern void FASTCALL(__lock_page(struct page *page));
- extern void FASTCALL(unlock_page(struct page *page));
-
--static inline void lock_page(struct page *page)
-+
-+extern int FASTCALL(__lock_page_wq(struct page *page, wait_queue_t *wait));
-+static inline int lock_page_wq(struct page *page, wait_queue_t *wait)
- {
- if (TestSetPageLocked(page))
-- __lock_page(page);
-+ return __lock_page_wq(page, wait);
-+ else
-+ return 0;
-+}
-+
-+static inline void lock_page(struct page *page)
-+{
-+ lock_page_wq(page, NULL);
- }
-
- /*
- * This is exported only for wait_on_page_locked/wait_on_page_writeback.
- * Never use this directly!
- */
--extern void FASTCALL(wait_on_page_bit(struct page *page, int bit_nr));
-+extern int FASTCALL(wait_on_page_bit_wq(struct page *page, int bit_nr,
-+ wait_queue_t *wait));
-
- /*
- * Wait for a page to be unlocked.
-@@ -172,19 +181,33 @@ extern void FASTCALL(wait_on_page_bit(st
- * ie with increased "page->count" so that the page won't
- * go away during the wait..
- */
--static inline void wait_on_page_locked(struct page *page)
-+static inline int wait_on_page_locked_wq(struct page *page, wait_queue_t *wait)
- {
- if (PageLocked(page))
-- wait_on_page_bit(page, PG_locked);
-+ return wait_on_page_bit_wq(page, PG_locked, wait);
-+ return 0;
-+}
-+
-+static inline int wait_on_page_writeback_wq(struct page *page,
-+ wait_queue_t *wait)
-+{
-+ if (PageWriteback(page))
-+ return wait_on_page_bit_wq(page, PG_writeback, wait);
-+ return 0;
-+}
-+
-+static inline void wait_on_page_locked(struct page *page)
-+{
-+ wait_on_page_locked_wq(page, NULL);
- }
-
- /*
- * Wait for a page to complete writeback
- */
-+
- static inline void wait_on_page_writeback(struct page *page)
- {
-- if (PageWriteback(page))
-- wait_on_page_bit(page, PG_writeback);
-+ wait_on_page_writeback_wq(page, NULL);
- }
-
- extern void end_page_writeback(struct page *page);
---- linux-2.6.0/include/linux/pagevec.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/pagevec.h 2003-12-28 23:26:43.000000000 -0800
-@@ -23,7 +23,7 @@ void __pagevec_lru_add(struct pagevec *p
- void __pagevec_lru_add_active(struct pagevec *pvec);
- void pagevec_strip(struct pagevec *pvec);
- unsigned int pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
-- pgoff_t start, unsigned int nr_pages);
-+ pgoff_t *next, unsigned int nr_pages);
-
- static inline void pagevec_init(struct pagevec *pvec, int cold)
- {
---- linux-2.6.0/include/linux/parser.h 2003-10-08 15:07:10.000000000 -0700
-+++ 25/include/linux/parser.h 2003-12-28 23:22:09.000000000 -0800
-@@ -1,3 +1,14 @@
-+/*
-+ * linux/include/linux/parser.h
-+ *
-+ * Header for lib/parser.c
-+ * Intended use of these functions is parsing filesystem argument lists,
-+ * but could potentially be used anywhere else that simple option=arg
-+ * parsing is required.
-+ */
-+
-+
-+/* associates an integer enumerator with a pattern string. */
- struct match_token {
- int token;
- char *pattern;
-@@ -5,15 +16,16 @@ struct match_token {
-
- typedef struct match_token match_table_t[];
-
-+/* Maximum number of arguments that match_token will find in a pattern */
- enum {MAX_OPT_ARGS = 3};
-
-+/* Describe the location within a string of a substring */
- typedef struct {
- char *from;
- char *to;
- } substring_t;
-
--int match_token(char *s, match_table_t table, substring_t args[]);
--
-+int match_token(char *, match_table_t table, substring_t args[]);
- int match_int(substring_t *, int *result);
- int match_octal(substring_t *, int *result);
- int match_hex(substring_t *, int *result);
---- linux-2.6.0/include/linux/pci.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/pci.h 2003-12-28 23:21:44.000000000 -0800
-@@ -36,6 +36,7 @@
- #define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */
- #define PCI_COMMAND_SERR 0x100 /* Enable SERR */
- #define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */
-+#define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */
-
- #define PCI_STATUS 0x06 /* 16 bits */
- #define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */
-@@ -198,6 +199,8 @@
- #define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */
- #define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */
- #define PCI_CAP_ID_PCIX 0x07 /* PCI-X */
-+#define PCI_CAP_ID_EXP 0x10 /* PCI Express */
-+#define PCI_CAP_ID_MSIX 0x11 /* MSI-X */
- #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */
- #define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */
- #define PCI_CAP_SIZEOF 4
-@@ -275,11 +278,13 @@
- #define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */
- #define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */
- #define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */
-+#define PCI_MSI_FLAGS_MASKBIT 0x100 /* 64-bit mask bits allowed */
- #define PCI_MSI_RFU 3 /* Rest of capability flags */
- #define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */
- #define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
- #define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */
- #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */
-+#define PCI_MSI_MASK_BIT 16 /* Mask bits register */
-
- /* CompactPCI Hotswap Register */
-
-@@ -695,6 +700,18 @@ void pci_pool_free (struct pci_pool *poo
- extern struct pci_dev *isa_bridge;
- #endif
-
-+#ifndef CONFIG_PCI_USE_VECTOR
-+static inline void pci_scan_msi_device(struct pci_dev *dev) {}
-+static inline int pci_enable_msi(struct pci_dev *dev) {return -1;}
-+static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) {}
-+#else
-+extern void pci_scan_msi_device(struct pci_dev *dev);
-+extern int pci_enable_msi(struct pci_dev *dev);
-+extern void msi_remove_pci_irq_vectors(struct pci_dev *dev);
-+extern int msi_alloc_vectors(struct pci_dev* dev, int *vector, int nvec);
-+extern int msi_free_vectors(struct pci_dev* dev, int *vector, int nvec);
-+#endif
-+
- #endif /* CONFIG_PCI */
-
- /* Include architecture-dependent settings and functions */
---- linux-2.6.0/include/linux/pci_ids.h 2003-11-23 19:03:02.000000000 -0800
-+++ 25/include/linux/pci_ids.h 2003-12-28 23:26:27.000000000 -0800
-@@ -630,6 +630,8 @@
- #define PCI_DEVICE_ID_HP_TACHLITE 0x1029
- #define PCI_DEVICE_ID_HP_J2585A 0x1030
- #define PCI_DEVICE_ID_HP_J2585B 0x1031
-+#define PCI_DEVICE_ID_HP_J2973A 0x1040
-+#define PCI_DEVICE_ID_HP_J2970A 0x1042
- #define PCI_DEVICE_ID_HP_DIVA 0x1048
- #define PCI_DEVICE_ID_HP_DIVA_TOSCA1 0x1049
- #define PCI_DEVICE_ID_HP_DIVA_TOSCA2 0x104A
-@@ -882,6 +884,7 @@
-
- #define PCI_DEVICE_ID_SII_680 0x0680
- #define PCI_DEVICE_ID_SII_3112 0x3112
-+#define PCI_DEVICE_ID_SII_3114 0x3114
- #define PCI_DEVICE_ID_SII_1210SA 0x0240
-
- #define PCI_VENDOR_ID_VISION 0x1098
-@@ -900,6 +903,7 @@
-
- #define PCI_VENDOR_ID_SGI 0x10a9
- #define PCI_DEVICE_ID_SGI_IOC3 0x0003
-+#define PCI_DEVICE_ID_SGI_IOC4 0x100a
- #define PCI_VENDOR_ID_SGI_LITHIUM 0x1002
-
- #define PCI_VENDOR_ID_ACC 0x10aa
-@@ -1784,11 +1788,13 @@
- #define PCI_DEVICE_ID_TIGON3_5702 0x1646
- #define PCI_DEVICE_ID_TIGON3_5703 0x1647
- #define PCI_DEVICE_ID_TIGON3_5704 0x1648
-+#define PCI_DEVICE_ID_TIGON3_5704S_2 0x1649
- #define PCI_DEVICE_ID_TIGON3_5702FE 0x164d
- #define PCI_DEVICE_ID_TIGON3_5705 0x1653
- #define PCI_DEVICE_ID_TIGON3_5705_2 0x1654
- #define PCI_DEVICE_ID_TIGON3_5705M 0x165d
- #define PCI_DEVICE_ID_TIGON3_5705M_2 0x165e
-+#define PCI_DEVICE_ID_TIGON3_5705F 0x166e
- #define PCI_DEVICE_ID_TIGON3_5782 0x1696
- #define PCI_DEVICE_ID_TIGON3_5788 0x169c
- #define PCI_DEVICE_ID_TIGON3_5702X 0x16a6
-@@ -2052,6 +2058,7 @@
- #define PCI_DEVICE_ID_INTEL_82443MX_3 0x719b
- #define PCI_DEVICE_ID_INTEL_82443GX_0 0x71a0
- #define PCI_DEVICE_ID_INTEL_82443GX_1 0x71a1
-+#define PCI_DEVICE_ID_INTEL_82443GX_2 0x71a2
- #define PCI_DEVICE_ID_INTEL_82372FB_0 0x7600
- #define PCI_DEVICE_ID_INTEL_82372FB_1 0x7601
- #define PCI_DEVICE_ID_INTEL_82372FB_2 0x7602
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/include/linux/pci_msi.h 2003-12-28 23:21:44.000000000 -0800
-@@ -0,0 +1,193 @@
-+/*
-+ * ../include/linux/pci_msi.h
-+ *
-+ */
-+
-+#ifndef _ASM_PCI_MSI_H
-+#define _ASM_PCI_MSI_H
-+
-+#include <linux/pci.h>
-+
-+#define MSI_AUTO -1
-+#define NR_REPEATS 23
-+#define NR_RESERVED_VECTORS 3 /*FIRST_DEVICE_VECTOR,FIRST_SYSTEM_VECTOR,0x80 */
-+
-+/*
-+ * Assume the maximum number of hot plug slots supported by the system is about
-+ * ten. The worstcase is that each of these slots is hot-added with a device,
-+ * which has two MSI/MSI-X capable functions. To avoid any MSI-X driver, which
-+ * attempts to request all available vectors, NR_HP_RESERVED_VECTORS is defined
-+ * as below to ensure at least one message is assigned to each detected MSI/
-+ * MSI-X device function.
-+ */
-+#define NR_HP_RESERVED_VECTORS 20
-+
-+extern int vector_irq[NR_IRQS];
-+extern cpumask_t pending_irq_balance_cpumask[NR_IRQS];
-+extern void (*interrupt[NR_IRQS])(void);
-+
-+#ifdef CONFIG_SMP
-+#define set_msi_irq_affinity set_msi_affinity
-+#else
-+#define set_msi_irq_affinity NULL
-+static inline void move_msi(int vector) {}
-+#endif
-+
-+#ifndef CONFIG_X86_IO_APIC
-+static inline int get_ioapic_vector(struct pci_dev *dev) { return -1;}
-+static inline void restore_ioapic_irq_handler(int irq) {}
-+#else
-+extern void restore_ioapic_irq_handler(int irq);
-+#endif
-+
-+/*
-+ * MSI-X Address Register
-+ */
-+#define PCI_MSIX_FLAGS_QSIZE 0x7FF
-+#define PCI_MSIX_FLAGS_ENABLE (1 << 15)
-+#define PCI_MSIX_FLAGS_BIRMASK (7 << 0)
-+#define PCI_MSIX_FLAGS_BITMASK (1 << 0)
-+
-+#define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET 0
-+#define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET 4
-+#define PCI_MSIX_ENTRY_DATA_OFFSET 8
-+#define PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET 12
-+#define PCI_MSIX_ENTRY_SIZE 16
-+
-+#define msi_control_reg(base) (base + PCI_MSI_FLAGS)
-+#define msi_lower_address_reg(base) (base + PCI_MSI_ADDRESS_LO)
-+#define msi_upper_address_reg(base) (base + PCI_MSI_ADDRESS_HI)
-+#define msi_data_reg(base, is64bit) \
-+ ( (is64bit == 1) ? base+PCI_MSI_DATA_64 : base+PCI_MSI_DATA_32 )
-+#define msi_mask_bits_reg(base, is64bit) \
-+ ( (is64bit == 1) ? base+PCI_MSI_MASK_BIT : base+PCI_MSI_MASK_BIT-4)
-+#define msi_disable(control) control &= ~PCI_MSI_FLAGS_ENABLE
-+#define multi_msi_capable(control) \
-+ (1 << ((control & PCI_MSI_FLAGS_QMASK) >> 1))
-+#define multi_msi_enable(control, num) \
-+ control |= (((num >> 1) << 4) & PCI_MSI_FLAGS_QSIZE);
-+#define is_64bit_address(control) (control & PCI_MSI_FLAGS_64BIT)
-+#define is_mask_bit_support(control) (control & PCI_MSI_FLAGS_MASKBIT)
-+#define msi_enable(control, num) multi_msi_enable(control, num); \
-+ control |= PCI_MSI_FLAGS_ENABLE
-+
-+#define msix_control_reg msi_control_reg
-+#define msix_table_offset_reg(base) (base + 0x04)
-+#define msix_pba_offset_reg(base) (base + 0x08)
-+#define msix_enable(control) control |= PCI_MSIX_FLAGS_ENABLE
-+#define msix_disable(control) control &= ~PCI_MSIX_FLAGS_ENABLE
-+#define msix_table_size(control) ((control & PCI_MSIX_FLAGS_QSIZE)+1)
-+#define multi_msix_capable msix_table_size
-+#define msix_unmask(address) (address & ~PCI_MSIX_FLAGS_BITMASK)
-+#define msix_mask(address) (address | PCI_MSIX_FLAGS_BITMASK)
-+#define msix_is_pending(address) (address & PCI_MSIX_FLAGS_PENDMASK)
-+
-+extern char __dbg_str_buf[256];
-+#define _DEFINE_DBG_BUFFER char __dbg_str_buf[256];
-+#define _DBG_K_TRACE_ENTRY ((unsigned int)0x00000001)
-+#define _DBG_K_TRACE_EXIT ((unsigned int)0x00000002)
-+#define _DBG_K_INFO ((unsigned int)0x00000004)
-+#define _DBG_K_ERROR ((unsigned int)0x00000008)
-+#define _DBG_K_TRACE (_DBG_K_TRACE_ENTRY | _DBG_K_TRACE_EXIT)
-+
-+#define _DEBUG_LEVEL (_DBG_K_INFO | _DBG_K_ERROR | _DBG_K_TRACE)
-+#define _DBG_PRINT( dbg_flags, args... ) \
-+if ( _DEBUG_LEVEL & (dbg_flags) ) \
-+{ \
-+ int len; \
-+ len = sprintf(__dbg_str_buf, "%s:%d: %s ", \
-+ __FILE__, __LINE__, __FUNCTION__ ); \
-+ sprintf(__dbg_str_buf + len, args); \
-+ printk(KERN_INFO "%s\n", __dbg_str_buf); \
-+}
-+
-+#define MSI_FUNCTION_TRACE_ENTER \
-+ _DBG_PRINT (_DBG_K_TRACE_ENTRY, "%s", "[Entry]");
-+#define MSI_FUNCTION_TRACE_EXIT \
-+ _DBG_PRINT (_DBG_K_TRACE_EXIT, "%s", "[Entry]");
-+
-+/*
-+ * MSI Defined Data Structures
-+ */
-+#define MSI_ADDRESS_HEADER 0xfee
-+#define MSI_ADDRESS_HEADER_SHIFT 12
-+#define MSI_ADDRESS_HEADER_MASK 0xfff000
-+#define MSI_TARGET_CPU_SHIFT 4
-+#define MSI_TARGET_CPU_MASK 0xff
-+#define MSI_DELIVERY_MODE 0
-+#define MSI_LEVEL_MODE 1 /* Edge always assert */
-+#define MSI_TRIGGER_MODE 0 /* MSI is edge sensitive */
-+#define MSI_LOGICAL_MODE 1
-+#define MSI_REDIRECTION_HINT_MODE 0
-+#ifdef CONFIG_SMP
-+#define MSI_TARGET_CPU logical_smp_processor_id()
-+#else
-+#define MSI_TARGET_CPU TARGET_CPUS
-+#endif
-+
-+struct msg_data {
-+#if defined(__LITTLE_ENDIAN_BITFIELD)
-+ __u32 vector : 8;
-+ __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */
-+ __u32 reserved_1 : 3;
-+ __u32 level : 1; /* 0: deassert | 1: assert */
-+ __u32 trigger : 1; /* 0: edge | 1: level */
-+ __u32 reserved_2 : 16;
-+#elif defined(__BIG_ENDIAN_BITFIELD)
-+ __u32 reserved_2 : 16;
-+ __u32 trigger : 1; /* 0: edge | 1: level */
-+ __u32 level : 1; /* 0: deassert | 1: assert */
-+ __u32 reserved_1 : 3;
-+ __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */
-+ __u32 vector : 8;
-+#else
-+#error "Bitfield endianness not defined! Check your byteorder.h"
-+#endif
-+} __attribute__ ((packed));
-+
-+struct msg_address {
-+ union {
-+ struct {
-+#if defined(__LITTLE_ENDIAN_BITFIELD)
-+ __u32 reserved_1 : 2;
-+ __u32 dest_mode : 1; /*0:physic | 1:logic */
-+ __u32 redirection_hint: 1; /*0: dedicated CPU
-+ 1: lowest priority */
-+ __u32 reserved_2 : 4;
-+ __u32 dest_id : 24; /* Destination ID */
-+#elif defined(__BIG_ENDIAN_BITFIELD)
-+ __u32 dest_id : 24; /* Destination ID */
-+ __u32 reserved_2 : 4;
-+ __u32 redirection_hint: 1; /*0: dedicated CPU
-+ 1: lowest priority */
-+ __u32 dest_mode : 1; /*0:physic | 1:logic */
-+ __u32 reserved_1 : 2;
-+#else
-+#error "Bitfield endianness not defined! Check your byteorder.h"
-+#endif
-+ }u;
-+ __u32 value;
-+ }lo_address;
-+ __u32 hi_address;
-+} __attribute__ ((packed));
-+
-+struct msi_desc {
-+ struct {
-+ __u8 type : 5; /* {0: unused, 5h:MSI, 11h:MSI-X} */
-+ __u8 maskbit : 1; /* mask-pending bit supported ? */
-+ __u8 reserved: 2; /* reserved */
-+ __u8 entry_nr; /* specific enabled entry */
-+ __u8 default_vector; /* default pre-assigned vector */
-+ __u8 current_cpu; /* current destination cpu */
-+ }msi_attrib;
-+
-+ struct {
-+ __u16 head;
-+ __u16 tail;
-+ }link;
-+
-+ unsigned long mask_base;
-+ struct pci_dev *dev;
-+};
-+
-+#endif /* _ASM_PCI_MSI_H */
---- linux-2.6.0/include/linux/percpu_counter.h 2003-06-14 12:18:22.000000000 -0700
-+++ 25/include/linux/percpu_counter.h 2003-12-28 23:22:03.000000000 -0800
-@@ -8,17 +8,14 @@
- #include <linux/spinlock.h>
- #include <linux/smp.h>
- #include <linux/threads.h>
-+#include <linux/percpu.h>
-
- #ifdef CONFIG_SMP
-
--struct __percpu_counter {
-- long count;
--} ____cacheline_aligned;
--
- struct percpu_counter {
- spinlock_t lock;
- long count;
-- struct __percpu_counter counters[NR_CPUS];
-+ long *counters;
- };
-
- #if NR_CPUS >= 16
-@@ -29,12 +26,14 @@ struct percpu_counter {
-
- static inline void percpu_counter_init(struct percpu_counter *fbc)
- {
-- int i;
--
- spin_lock_init(&fbc->lock);
- fbc->count = 0;
-- for (i = 0; i < NR_CPUS; i++)
-- fbc->counters[i].count = 0;
-+ fbc->counters = alloc_percpu(long);
-+}
-+
-+static inline void percpu_counter_destroy(struct percpu_counter *fbc)
-+{
-+ free_percpu(fbc->counters);
- }
-
- void percpu_counter_mod(struct percpu_counter *fbc, long amount);
-@@ -69,6 +68,10 @@ static inline void percpu_counter_init(s
- fbc->count = 0;
- }
-
-+static inline void percpu_counter_destroy(struct percpu_counter *fbc)
-+{
-+}
-+
- static inline void
- percpu_counter_mod(struct percpu_counter *fbc, long amount)
- {
---- linux-2.6.0/include/linux/proc_fs.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/proc_fs.h 2003-12-28 23:21:25.000000000 -0800
-@@ -141,6 +141,8 @@ extern void proc_rtas_init(void);
- extern struct proc_dir_entry *proc_symlink(const char *,
- struct proc_dir_entry *, const char *);
- extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
-+extern struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
-+ struct proc_dir_entry *parent);
-
- static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
- mode_t mode, struct proc_dir_entry *base,
---- linux-2.6.0/include/linux/quota.h 2003-08-08 22:55:14.000000000 -0700
-+++ 25/include/linux/quota.h 2003-12-28 23:22:17.000000000 -0800
-@@ -250,7 +250,7 @@ struct dquot_operations {
- void (*free_space) (struct inode *, qsize_t);
- void (*free_inode) (const struct inode *, unsigned long);
- int (*transfer) (struct inode *, struct iattr *);
-- int (*sync_dquot) (struct dquot *);
-+ int (*write_dquot) (struct dquot *);
- };
-
- /* Operations handling requests from userspace */
---- linux-2.6.0/include/linux/reiserfs_fs.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/linux/reiserfs_fs.h 2003-12-28 23:23:05.000000000 -0800
-@@ -1719,7 +1719,7 @@ void reiserfs_allow_writes(struct super_
- void reiserfs_check_lock_depth(char *caller) ;
- void reiserfs_prepare_for_journal(struct super_block *, struct buffer_head *bh, int wait) ;
- void reiserfs_restore_prepared_buffer(struct super_block *, struct buffer_head *bh) ;
--int journal_init(struct super_block *, const char * j_dev_name, int old_format) ;
-+int journal_init(struct super_block *, const char * j_dev_name, int old_format, unsigned int) ;
- int journal_release(struct reiserfs_transaction_handle*, struct super_block *) ;
- int journal_release_error(struct reiserfs_transaction_handle*, struct super_block *) ;
- int journal_end(struct reiserfs_transaction_handle *, struct super_block *, unsigned long) ;
---- linux-2.6.0/include/linux/sched.h 2003-11-23 19:03:02.000000000 -0800
-+++ 25/include/linux/sched.h 2003-12-28 23:26:39.000000000 -0800
-@@ -151,6 +151,7 @@ extern void init_idle(task_t *idle, int
-
- extern void show_state(void);
- extern void show_regs(struct pt_regs *);
-+extern void show_trace_task(task_t *tsk);
-
- /*
- * TASK is a pointer to the task whose backtrace we want to see (or NULL for current
-@@ -205,7 +206,6 @@ struct mm_struct {
- unsigned long rss, total_vm, locked_vm;
- unsigned long def_flags;
- cpumask_t cpu_vm_mask;
-- unsigned long swap_address;
-
- unsigned long saved_auxv[40]; /* for /proc/PID/auxv */
-
-@@ -464,6 +464,13 @@ struct task_struct {
-
- unsigned long ptrace_message;
- siginfo_t *last_siginfo; /* For ptrace use. */
-+/*
-+ * current io wait handle: wait queue entry to use for io waits
-+ * If this thread is processing aio, this points at the waitqueue
-+ * inside the currently handled kiocb. It may be NULL (i.e. default
-+ * to a stack based synchronous wait) if its doing sync IO.
-+ */
-+ wait_queue_t *io_wait;
- };
-
- static inline pid_t process_group(struct task_struct *tsk)
-@@ -580,6 +587,7 @@ extern int FASTCALL(wake_up_process(stru
- static inline void kick_process(struct task_struct *tsk) { }
- #endif
- extern void FASTCALL(wake_up_forked_process(struct task_struct * tsk));
-+extern void FASTCALL(sched_fork(task_t * p));
- extern void FASTCALL(sched_exit(task_t * p));
-
- asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struct rusage * ru);
---- linux-2.6.0/include/linux/serial_core.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/serial_core.h 2003-12-28 23:21:07.000000000 -0800
-@@ -158,7 +158,9 @@ struct uart_port {
- unsigned char x_char; /* xon/xoff char */
- unsigned char regshift; /* reg offset shift */
- unsigned char iotype; /* io access style */
--
-+#ifdef CONFIG_KGDB
-+ int kgdb; /* in use by kgdb */
-+#endif
- #define UPIO_PORT (0)
- #define UPIO_HUB6 (1)
- #define UPIO_MEM (2)
---- linux-2.6.0/include/linux/serio.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/serio.h 2003-12-28 23:21:30.000000000 -0800
-@@ -49,6 +49,7 @@ struct serio_dev {
- irqreturn_t (*interrupt)(struct serio *, unsigned char,
- unsigned int, struct pt_regs *);
- void (*connect)(struct serio *, struct serio_dev *dev);
-+ int (*reconnect)(struct serio *);
- void (*disconnect)(struct serio *);
- void (*cleanup)(struct serio *);
-
-@@ -58,12 +59,15 @@ struct serio_dev {
- int serio_open(struct serio *serio, struct serio_dev *dev);
- void serio_close(struct serio *serio);
- void serio_rescan(struct serio *serio);
-+void serio_reconnect(struct serio *serio);
- irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs);
-
- void serio_register_port(struct serio *serio);
--void serio_register_slave_port(struct serio *serio);
-+void serio_register_port_delayed(struct serio *serio);
-+void __serio_register_port(struct serio *serio);
- void serio_unregister_port(struct serio *serio);
--void serio_unregister_slave_port(struct serio *serio);
-+void serio_unregister_port_delayed(struct serio *serio);
-+void __serio_unregister_port(struct serio *serio);
- void serio_register_device(struct serio_dev *dev);
- void serio_unregister_device(struct serio_dev *dev);
-
---- linux-2.6.0/include/linux/spinlock.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/spinlock.h 2003-12-28 23:26:33.000000000 -0800
-@@ -15,6 +15,12 @@
-
- #include <asm/processor.h> /* for cpu relax */
- #include <asm/system.h>
-+#ifdef CONFIG_KGDB
-+#include <asm/current.h>
-+#define SET_WHO(x, him) (x)->who = him;
-+#else
-+#define SET_WHO(x, him)
-+#endif
-
- /*
- * Must define these before including other files, inline functions need them
-@@ -55,6 +61,9 @@ typedef struct {
- const char *module;
- char *owner;
- int oline;
-+#ifdef CONFIG_KGDB
-+ struct task_struct *who;
-+#endif
- } spinlock_t;
- #define SPIN_LOCK_UNLOCKED (spinlock_t) { SPINLOCK_MAGIC, 0, 10, __FILE__ , NULL, 0}
-
-@@ -66,6 +75,7 @@ typedef struct {
- (x)->module = __FILE__; \
- (x)->owner = NULL; \
- (x)->oline = 0; \
-+ SET_WHO(x, NULL) \
- } while (0)
-
- #define CHECK_LOCK(x) \
-@@ -88,6 +98,7 @@ typedef struct {
- (x)->lock = 1; \
- (x)->owner = __FILE__; \
- (x)->oline = __LINE__; \
-+ SET_WHO(x, current) \
- } while (0)
-
- /* without debugging, spin_is_locked on UP always says
-@@ -118,6 +129,7 @@ typedef struct {
- (x)->lock = 1; \
- (x)->owner = __FILE__; \
- (x)->oline = __LINE__; \
-+ SET_WHO(x, current) \
- 1; \
- })
-
-@@ -184,6 +196,17 @@ typedef struct {
-
- #endif /* !SMP */
-
-+#ifdef CONFIG_LOCKMETER
-+extern void _metered_spin_lock (spinlock_t *lock);
-+extern void _metered_spin_unlock (spinlock_t *lock);
-+extern int _metered_spin_trylock(spinlock_t *lock);
-+extern void _metered_read_lock (rwlock_t *lock);
-+extern void _metered_read_unlock (rwlock_t *lock);
-+extern void _metered_write_lock (rwlock_t *lock);
-+extern void _metered_write_unlock (rwlock_t *lock);
-+extern int _metered_write_trylock(rwlock_t *lock);
-+#endif
-+
- /*
- * Define the various spin_lock and rw_lock methods. Note we define these
- * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
-@@ -389,6 +412,141 @@ do { \
- _raw_spin_trylock(lock) ? 1 : \
- ({preempt_enable(); local_bh_enable(); 0;});})
-
-+#ifdef CONFIG_LOCKMETER
-+#undef spin_lock
-+#undef spin_trylock
-+#undef spin_unlock
-+#undef spin_lock_irqsave
-+#undef spin_lock_irq
-+#undef spin_lock_bh
-+#undef read_lock
-+#undef read_unlock
-+#undef write_lock
-+#undef write_unlock
-+#undef write_trylock
-+#undef spin_unlock_bh
-+#undef read_lock_irqsave
-+#undef read_lock_irq
-+#undef read_lock_bh
-+#undef read_unlock_bh
-+#undef write_lock_irqsave
-+#undef write_lock_irq
-+#undef write_lock_bh
-+#undef write_unlock_bh
-+
-+#define spin_lock(lock) \
-+do { \
-+ preempt_disable(); \
-+ _metered_spin_lock(lock); \
-+} while(0)
-+
-+#define spin_trylock(lock) ({preempt_disable(); _metered_spin_trylock(lock) ? \
-+ 1 : ({preempt_enable(); 0;});})
-+#define spin_unlock(lock) \
-+do { \
-+ _metered_spin_unlock(lock); \
-+ preempt_enable(); \
-+} while (0)
-+
-+#define spin_lock_irqsave(lock, flags) \
-+do { \
-+ local_irq_save(flags); \
-+ preempt_disable(); \
-+ _metered_spin_lock(lock); \
-+} while (0)
-+
-+#define spin_lock_irq(lock) \
-+do { \
-+ local_irq_disable(); \
-+ preempt_disable(); \
-+ _metered_spin_lock(lock); \
-+} while (0)
-+
-+#define spin_lock_bh(lock) \
-+do { \
-+ local_bh_disable(); \
-+ preempt_disable(); \
-+ _metered_spin_lock(lock); \
-+} while (0)
-+
-+#define spin_unlock_bh(lock) \
-+do { \
-+ _metered_spin_unlock(lock); \
-+ preempt_enable(); \
-+ local_bh_enable(); \
-+} while (0)
-+
-+
-+#define read_lock(lock) ({preempt_disable(); _metered_read_lock(lock);})
-+#define read_unlock(lock) ({_metered_read_unlock(lock); preempt_enable();})
-+#define write_lock(lock) ({preempt_disable(); _metered_write_lock(lock);})
-+#define write_unlock(lock) ({_metered_write_unlock(lock); preempt_enable();})
-+#define write_trylock(lock) ({preempt_disable();_metered_write_trylock(lock) ? \
-+ 1 : ({preempt_enable(); 0;});})
-+#define spin_unlock_no_resched(lock) \
-+do { \
-+ _metered_spin_unlock(lock); \
-+ preempt_enable_no_resched(); \
-+} while (0)
-+
-+#define read_lock_irqsave(lock, flags) \
-+do { \
-+ local_irq_save(flags); \
-+ preempt_disable(); \
-+ _metered_read_lock(lock); \
-+} while (0)
-+
-+#define read_lock_irq(lock) \
-+do { \
-+ local_irq_disable(); \
-+ preempt_disable(); \
-+ _metered_read_lock(lock); \
-+} while (0)
-+
-+#define read_lock_bh(lock) \
-+do { \
-+ local_bh_disable(); \
-+ preempt_disable(); \
-+ _metered_read_lock(lock); \
-+} while (0)
-+
-+#define read_unlock_bh(lock) \
-+do { \
-+ _metered_read_unlock(lock); \
-+ preempt_enable(); \
-+ local_bh_enable(); \
-+} while (0)
-+
-+#define write_lock_irqsave(lock, flags) \
-+do { \
-+ local_irq_save(flags); \
-+ preempt_disable(); \
-+ _metered_write_lock(lock); \
-+} while (0)
-+
-+#define write_lock_irq(lock) \
-+do { \
-+ local_irq_disable(); \
-+ preempt_disable(); \
-+ _metered_write_lock(lock); \
-+} while (0)
-+
-+#define write_lock_bh(lock) \
-+do { \
-+ local_bh_disable(); \
-+ preempt_disable(); \
-+ _metered_write_lock(lock); \
-+} while (0)
-+
-+#define write_unlock_bh(lock) \
-+do { \
-+ _metered_write_unlock(lock); \
-+ preempt_enable(); \
-+ local_bh_enable(); \
-+} while (0)
-+
-+#endif /* !CONFIG_LOCKMETER */
-+
- /* "lock on reference count zero" */
- #ifndef ATOMIC_DEC_AND_LOCK
- #include <asm/atomic.h>
---- linux-2.6.0/include/linux/swap.h 2003-10-08 15:07:10.000000000 -0700
-+++ 25/include/linux/swap.h 2003-12-28 23:22:46.000000000 -0800
-@@ -173,7 +173,7 @@ extern int rotate_reclaimable_page(struc
- extern void swap_setup(void);
-
- /* linux/mm/vmscan.c */
--extern int try_to_free_pages(struct zone *, unsigned int, unsigned int);
-+extern int try_to_free_pages(struct zone **, unsigned int, unsigned int);
- extern int shrink_all_memory(int);
- extern int vm_swappiness;
-
---- linux-2.6.0/include/linux/sysctl.h 2003-11-23 19:03:02.000000000 -0800
-+++ 25/include/linux/sysctl.h 2003-12-28 23:26:39.000000000 -0800
-@@ -601,6 +601,8 @@ enum
- FS_LEASE_TIME=15, /* int: maximum time to wait for a lease break */
- FS_DQSTATS=16, /* disc quota usage statistics */
- FS_XFS=17, /* struct: control xfs parameters */
-+ FS_AIO_NR=18, /* current system-wide number of aio requests */
-+ FS_AIO_MAX_NR=19, /* system-wide maximum number of aio requests */
- };
-
- /* /proc/sys/fs/quota/ */
---- linux-2.6.0/include/linux/sysfs.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/sysfs.h 2003-12-28 23:21:50.000000000 -0800
-@@ -18,6 +18,12 @@ struct attribute {
- mode_t mode;
- };
-
-+struct attribute_group {
-+ char * name;
-+ struct attribute ** attrs;
-+};
-+
-+
- struct bin_attribute {
- struct attribute attr;
- size_t size;
-@@ -25,14 +31,13 @@ struct bin_attribute {
- ssize_t (*write)(struct kobject *, char *, loff_t, size_t);
- };
-
--int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr);
--int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr);
--
- struct sysfs_ops {
- ssize_t (*show)(struct kobject *, struct attribute *,char *);
- ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
- };
-
-+#ifdef CONFIG_SYSFS
-+
- extern int
- sysfs_create_dir(struct kobject *);
-
-@@ -57,13 +62,75 @@ sysfs_create_link(struct kobject * kobj,
- extern void
- sysfs_remove_link(struct kobject *, char * name);
-
--
--struct attribute_group {
-- char * name;
-- struct attribute ** attrs;
--};
-+int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr);
-+int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr);
-
- int sysfs_create_group(struct kobject *, const struct attribute_group *);
- void sysfs_remove_group(struct kobject *, const struct attribute_group *);
-
-+#else /* CONFIG_SYSFS */
-+
-+static inline int sysfs_create_dir(struct kobject * k)
-+{
-+ return 0;
-+}
-+
-+static inline void sysfs_remove_dir(struct kobject * k)
-+{
-+ ;
-+}
-+
-+static inline void sysfs_rename_dir(struct kobject * k, const char *new_name)
-+{
-+ ;
-+}
-+
-+static inline int sysfs_create_file(struct kobject * k, const struct attribute * a)
-+{
-+ return 0;
-+}
-+
-+static inline int sysfs_update_file(struct kobject * k, const struct attribute * a)
-+{
-+ return 0;
-+}
-+
-+static inline void sysfs_remove_file(struct kobject * k, const struct attribute * a)
-+{
-+ ;
-+}
-+
-+static inline int sysfs_create_link(struct kobject * k, struct kobject * t, char * n)
-+{
-+ return 0;
-+}
-+
-+static inline void sysfs_remove_link(struct kobject * k, char * name)
-+{
-+ ;
-+}
-+
-+
-+static inline int sysfs_create_bin_file(struct kobject * k, struct bin_attribute * a)
-+{
-+ return 0;
-+}
-+
-+static inline int sysfs_remove_bin_file(struct kobject * k, struct bin_attribute * a)
-+{
-+ return 0;
-+}
-+
-+static inline int sysfs_create_group(struct kobject * k, const struct attribute_group *g)
-+{
-+ return 0;
-+}
-+
-+static inline void sysfs_remove_group(struct kobject * k, const struct attribute_group * g)
-+{
-+ ;
-+}
-+
-+#endif /* CONFIG_SYSFS */
-+
- #endif /* _SYSFS_H_ */
---- linux-2.6.0/include/linux/wait.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/wait.h 2003-12-28 23:26:39.000000000 -0800
-@@ -80,6 +80,15 @@ static inline int waitqueue_active(wait_
- return !list_empty(&q->task_list);
- }
-
-+/*
-+ * Used to distinguish between sync and async io wait context:
-+ * sync i/o typically specifies a NULL wait queue entry or a wait
-+ * queue entry bound to a task (current task) to wake up.
-+ * aio specifies a wait queue entry with an async notification
-+ * callback routine, not associated with any task.
-+ */
-+#define is_sync_wait(wait) (!(wait) || ((wait)->task))
-+
- extern void FASTCALL(add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
- extern void FASTCALL(add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait));
- extern void FASTCALL(remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait));
---- linux-2.6.0/include/linux/writeback.h 2003-11-09 16:45:05.000000000 -0800
-+++ 25/include/linux/writeback.h 2003-12-28 23:26:42.000000000 -0800
-@@ -84,9 +84,13 @@ int dirty_writeback_centisecs_handler(st
- void __user *, size_t *);
-
- void page_writeback_init(void);
--void balance_dirty_pages_ratelimited(struct address_space *mapping);
-+int balance_dirty_pages_ratelimited(struct address_space *mapping);
- int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0);
- int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
-+ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
-+ loff_t pos, size_t count);
-+ssize_t sync_page_range_nolock(struct inode *inode, struct address_space
-+ *mapping, loff_t pos, size_t count);
-
- /* pdflush.c */
- extern int nr_pdflush_threads; /* Global so it can be exported to sysctl
---- linux-2.6.0/include/media/saa7146.h 2003-07-27 12:14:40.000000000 -0700
-+++ 25/include/media/saa7146.h 2003-12-28 23:22:37.000000000 -0800
-@@ -87,6 +87,7 @@ struct saa7146_extension
- {
- char name[32]; /* name of the device */
- #define SAA7146_USE_I2C_IRQ 0x1
-+#define SAA7146_I2C_SHORT_DELAY 0x2
- int flags;
-
- /* pairs of subvendor and subdevice ids for
-@@ -162,9 +163,10 @@ int saa7146_unregister_extension(struct
- struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc);
- int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt);
- void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt);
--void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
-+int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
- char *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt);
- void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data);
-+int saa7146_wait_for_debi_done(struct saa7146_dev *dev);
-
- /* some memory sizes */
- #define SAA7146_I2C_MEM ( 1*PAGE_SIZE)
-@@ -187,6 +189,9 @@ void saa7146_setgpio(struct saa7146_dev
- #define SAA7146_GPIO_OUTLO 0x40
- #define SAA7146_GPIO_OUTHI 0x50
-
-+/* debi defines */
-+#define DEBINOSWAP 0x000e0000
-+
- /* define for the register programming sequencer (rps) */
- #define CMD_NOP 0x00000000 /* No operation */
- #define CMD_CLR_EVENT 0x00000000 /* Clear event */
---- linux-2.6.0/include/media/saa7146_vv.h 2003-10-17 15:58:04.000000000 -0700
-+++ 25/include/media/saa7146_vv.h 2003-12-28 23:22:37.000000000 -0800
-@@ -149,7 +149,7 @@ struct saa7146_extension_ioctls
- };
-
- /* flags */
--#define SAA7146_EXT_SWAP_ODD_EVEN 0x1 /* needs odd/even fields swapped */
-+// #define SAA7146_EXT_SWAP_ODD_EVEN 0x1 /* needs odd/even fields swapped */
- #define SAA7146_USE_PORT_B_FOR_VBI 0x2 /* use input port b for vbi hardware bug workaround */
-
- struct saa7146_ext_vv
-@@ -171,12 +171,10 @@ struct saa7146_ext_vv
-
- struct saa7146_use_ops {
- void (*init)(struct saa7146_dev *, struct saa7146_vv *);
-- void(*open)(struct saa7146_dev *, struct saa7146_fh *);
-- void (*release)(struct saa7146_dev *, struct saa7146_fh *,struct file *);
-+ void(*open)(struct saa7146_dev *, struct file *);
-+ void (*release)(struct saa7146_dev *, struct file *);
- void (*irq_done)(struct saa7146_dev *, unsigned long status);
- ssize_t (*read)(struct file *, char *, size_t, loff_t *);
-- int (*capture_begin)(struct saa7146_fh *);
-- int (*capture_end)(struct saa7146_fh *);
- };
-
- /* from saa7146_fops.c */
---- linux-2.6.0/include/net/atmclip.h 2003-09-27 18:57:47.000000000 -0700
-+++ 25/include/net/atmclip.h 2003-12-28 23:21:01.000000000 -0800
-@@ -44,7 +44,7 @@ struct atmarp_entry {
- };
-
-
--#define PRIV(dev) ((struct clip_priv *) ((struct net_device *) (dev)+1))
-+#define PRIV(dev) ((struct clip_priv *) netdev_priv(dev))
-
-
- struct clip_priv {
---- linux-2.6.0/include/pcmcia/cs.h 2003-10-08 15:07:10.000000000 -0700
-+++ 25/include/pcmcia/cs.h 2003-12-28 23:22:54.000000000 -0800
-@@ -421,12 +421,6 @@ enum service {
- GetFirstWindow, GetNextWindow, GetMemPage
- };
-
--#ifdef IN_CARD_SERVICES
--extern int CardServices(int func, void *a1, void *a2, void *a3);
--#else
--extern int CardServices(int func, ...);
--#endif
--
- int pcmcia_access_configuration_register(client_handle_t handle, conf_reg_t *reg);
- int pcmcia_bind_device(bind_req_t *req);
- int pcmcia_bind_mtd(mtd_bind_t *req);
---- linux-2.6.0/include/sound/i2c.h 2003-06-14 12:18:00.000000000 -0700
-+++ 25/include/sound/i2c.h 2003-12-28 23:22:19.000000000 -0800
-@@ -58,7 +58,7 @@ struct _snd_i2c_bus {
- snd_card_t *card; /* card which I2C belongs to */
- char name[32]; /* some useful label */
-
-- spinlock_t lock;
-+ struct semaphore lock_mutex;
-
- snd_i2c_bus_t *master; /* master bus when SCK/SCL is shared */
- struct list_head buses; /* master: slave buses sharing SCK/SCL, slave: link list */
-@@ -84,15 +84,15 @@ int snd_i2c_device_free(snd_i2c_device_t
-
- static inline void snd_i2c_lock(snd_i2c_bus_t *bus) {
- if (bus->master)
-- spin_lock(&bus->master->lock);
-+ down(&bus->master->lock_mutex);
- else
-- spin_lock(&bus->lock);
-+ down(&bus->lock_mutex);
- }
- static inline void snd_i2c_unlock(snd_i2c_bus_t *bus) {
- if (bus->master)
-- spin_unlock(&bus->master->lock);
-+ up(&bus->master->lock_mutex);
- else
-- spin_unlock(&bus->lock);
-+ up(&bus->lock_mutex);
- }
-
- int snd_i2c_sendbytes(snd_i2c_device_t *device, unsigned char *bytes, int count);
---- linux-2.6.0/init/do_mounts.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/init/do_mounts.c 2003-12-28 23:22:34.000000000 -0800
-@@ -130,20 +130,22 @@ fail:
- * Driverfs is used to check if something is a disk name - it has
- * all known disks under bus/block/devices. If the disk name
- * contains slashes, name of driverfs node has them replaced with
-- * dots. try_name() does the actual checks, assuming that driverfs
-+ * bangs. try_name() does the actual checks, assuming that driverfs
- * is mounted on rootfs /sys.
- */
-
--dev_t name_to_dev_t(char *name)
-+dev_t __init name_to_dev_t(char *name)
- {
- char s[32];
- char *p;
- dev_t res = 0;
- int part;
-
-+#ifdef CONFIG_SYSFS
- sys_mkdir("/sys", 0700);
- if (sys_mount("sysfs", "/sys", "sysfs", 0, NULL) < 0)
- goto out;
-+#endif
-
- if (strncmp(name, "/dev/", 5) != 0) {
- unsigned maj, min;
-@@ -169,7 +171,7 @@ dev_t name_to_dev_t(char *name)
- strcpy(s, name);
- for (p = s; *p; p++)
- if (*p == '/')
-- *p = '.';
-+ *p = '!';
- res = try_name(s, 0);
- if (res)
- goto done;
---- linux-2.6.0/init/Kconfig 2003-11-09 16:45:05.000000000 -0800
-+++ 25/init/Kconfig 2003-12-28 23:21:55.000000000 -0800
-@@ -43,7 +43,7 @@ config CLEAN_COMPILE
-
- config STANDALONE
- bool "Select only drivers that don't need compile-time external firmware" if EXPERIMENTAL
-- default y
-+ default n
- help
- Select this option if you don't have magic firmware for drivers that
- need it.
-@@ -196,6 +196,19 @@ config EPOLL
-
- source "drivers/block/Kconfig.iosched"
-
-+config CC_OPTIMIZE_FOR_SIZE
-+ bool "Optimize for size" if EMBEDDED
-+ default y if ARM || H8300
-+ default n
-+ help
-+ Enabling this option will pass "-Os" instead of "-O2" to gcc
-+ resulting in a smaller kernel.
-+
-+ WARNING: some versions of gcc may generate incorrect code with this
-+ option. If problems are observed, a gcc upgrade may be needed.
-+
-+ If unsure, say N.
-+
- endmenu # General setup
-
-
---- linux-2.6.0/init/main.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/init/main.c 2003-12-28 23:22:49.000000000 -0800
-@@ -38,6 +38,7 @@
- #include <linux/moduleparam.h>
- #include <linux/writeback.h>
- #include <linux/cpu.h>
-+#include <linux/efi.h>
-
- #include <asm/io.h>
- #include <asm/bugs.h>
-@@ -107,9 +108,7 @@ extern void time_init(void);
- void (*late_time_init)(void) = NULL;
- extern void softirq_init(void);
-
--int rows, cols;
--
--char *execute_command;
-+static char *execute_command;
-
- /* Setup configured maximum number of CPUs to activate */
- static unsigned int max_cpus = NR_CPUS;
-@@ -374,7 +373,7 @@ static void __init smp_init(void)
-
- static void rest_init(void)
- {
-- kernel_thread(init, NULL, CLONE_KERNEL);
-+ kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);
- unlock_kernel();
- cpu_idle();
- }
-@@ -395,7 +394,6 @@ asmlinkage void __init start_kernel(void
- lock_kernel();
- printk(linux_banner);
- setup_arch(&command_line);
-- setup_per_zone_pages_min();
- setup_per_cpu_areas();
-
- /*
-@@ -443,6 +441,10 @@ asmlinkage void __init start_kernel(void
- pidmap_init();
- pgtable_cache_init();
- pte_chain_init();
-+#ifdef CONFIG_X86
-+ if (efi_enabled)
-+ efi_enter_virtual_mode();
-+#endif
- fork_init(num_physpages);
- proc_caches_init();
- buffer_init();
-@@ -470,7 +472,7 @@ asmlinkage void __init start_kernel(void
- rest_init();
- }
-
--int __initdata initcall_debug;
-+static int __initdata initcall_debug;
-
- static int __init initcall_debug_setup(char *str)
- {
---- linux-2.6.0/ipc/sem.c 2003-09-27 18:57:47.000000000 -0700
-+++ 25/ipc/sem.c 2003-12-28 23:22:03.000000000 -0800
-@@ -59,6 +59,8 @@
- * (c) 1999 Manfred Spraul <manfreds@colorfullife.com>
- * Enforced range limit on SEM_UNDO
- * (c) 2001 Red Hat Inc <alan@redhat.com>
-+ * Lockless wakeup
-+ * (c) 2003 Manfred Spraul <manfred@colorfullife.com>
- */
-
- #include <linux/config.h>
-@@ -118,6 +120,40 @@ void __init sem_init (void)
- #endif
- }
-
-+/*
-+ * Lockless wakeup algorithm:
-+ * Without the check/retry algorithm a lockless wakeup is possible:
-+ * - queue.status is initialized to -EINTR before blocking.
-+ * - wakeup is performed by
-+ * * unlinking the queue entry from sma->sem_pending
-+ * * setting queue.status to IN_WAKEUP
-+ * This is the notification for the blocked thread that a
-+ * result value is imminent.
-+ * * call wake_up_process
-+ * * set queue.status to the final value.
-+ * - the previously blocked thread checks queue.status:
-+ * * if it's IN_WAKEUP, then it must wait until the value changes
-+ * * if it's not -EINTR, then the operation was completed by
-+ * update_queue. semtimedop can return queue.status without
-+ * performing any operation on the semaphore array.
-+ * * otherwise it must acquire the spinlock and check what's up.
-+ *
-+ * The two-stage algorithm is necessary to protect against the following
-+ * races:
-+ * - if queue.status is set after wake_up_process, then the woken up idle
-+ * thread could race forward and try (and fail) to acquire sma->lock
-+ * before update_queue had a chance to set queue.status
-+ * - if queue.status is written before wake_up_process and if the
-+ * blocked process is woken up by a signal between writing
-+ * queue.status and the wake_up_process, then the woken up
-+ * process could return from semtimedop and die by calling
-+ * sys_exit before wake_up_process is called. Then wake_up_process
-+ * will oops, because the task structure is already invalid.
-+ * (yes, this happened on s390 with sysv msg).
-+ *
-+ */
-+#define IN_WAKEUP 1
-+
- static int newary (key_t key, int nsems, int semflg)
- {
- int id;
-@@ -331,16 +367,25 @@ static void update_queue (struct sem_arr
- int error;
- struct sem_queue * q;
-
-- for (q = sma->sem_pending; q; q = q->next) {
--
-+ q = sma->sem_pending;
-+ while(q) {
- error = try_atomic_semop(sma, q->sops, q->nsops,
- q->undo, q->pid);
-
- /* Does q->sleeper still need to sleep? */
- if (error <= 0) {
-- q->status = error;
-+ struct sem_queue *n;
- remove_from_queue(sma,q);
-+ n = q->next;
-+ q->status = IN_WAKEUP;
- wake_up_process(q->sleeper);
-+ /* hands-off: q will disappear immediately after
-+ * writing q->status.
-+ */
-+ q->status = error;
-+ q = n;
-+ } else {
-+ q = q->next;
- }
- }
- }
-@@ -409,10 +454,16 @@ static void freeary (struct sem_array *s
- un->semid = -1;
-
- /* Wake up all pending processes and let them fail with EIDRM. */
-- for (q = sma->sem_pending; q; q = q->next) {
-- q->status = -EIDRM;
-+ q = sma->sem_pending;
-+ while(q) {
-+ struct sem_queue *n;
-+ /* lazy remove_from_queue: we are killing the whole queue */
- q->prev = NULL;
-+ n = q->next;
-+ q->status = IN_WAKEUP;
- wake_up_process(q->sleeper); /* doesn't sleep */
-+ q->status = -EIDRM; /* hands-off q */
-+ q = n;
- }
-
- /* Remove the semaphore set from the ID array*/
-@@ -1083,6 +1134,18 @@ retry_undos:
- else
- schedule();
-
-+ error = queue.status;
-+ while(unlikely(error == IN_WAKEUP)) {
-+ cpu_relax();
-+ error = queue.status;
-+ }
-+
-+ if (error != -EINTR) {
-+ /* fast path: update_queue already obtained all requested
-+ * resources */
-+ goto out_free;
-+ }
-+
- sma = sem_lock(semid);
- if(sma==NULL) {
- if(queue.prev != NULL)
-@@ -1095,7 +1158,7 @@ retry_undos:
- * If queue.status != -EINTR we are woken up by another process
- */
- error = queue.status;
-- if (queue.status != -EINTR) {
-+ if (error != -EINTR) {
- goto out_unlock_free;
- }
-
---- linux-2.6.0/kernel/compat.c 2003-09-08 13:58:59.000000000 -0700
-+++ 25/kernel/compat.c 2003-12-28 23:22:22.000000000 -0800
-@@ -22,14 +22,14 @@
-
- #include <asm/uaccess.h>
-
--int get_compat_timespec(struct timespec *ts, struct compat_timespec *cts)
-+int get_compat_timespec(struct timespec *ts, const struct compat_timespec *cts)
- {
- return (verify_area(VERIFY_READ, cts, sizeof(*cts)) ||
- __get_user(ts->tv_sec, &cts->tv_sec) ||
- __get_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
- }
-
--int put_compat_timespec(struct timespec *ts, struct compat_timespec *cts)
-+int put_compat_timespec(struct timespec *ts, const struct compat_timespec *cts)
- {
- return (verify_area(VERIFY_WRITE, cts, sizeof(*cts)) ||
- __put_user(ts->tv_sec, &cts->tv_sec) ||
-@@ -204,7 +204,8 @@ asmlinkage long compat_sys_sigprocmask(i
- ret = sys_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL);
- set_fs(old_fs);
- if (ret == 0)
-- ret = put_user(s, oset);
-+ if (oset)
-+ ret = put_user(s, oset);
- return ret;
- }
-
---- linux-2.6.0/kernel/exit.c 2003-12-17 21:20:03.000000000 -0800
-+++ 25/kernel/exit.c 2003-12-28 23:22:30.000000000 -0800
-@@ -472,21 +472,29 @@ static inline void __exit_mm(struct task
- if (!mm)
- return;
- /*
-- * Serialize with any possible pending coredump:
-+ * Serialize with any possible pending coredump.
-+ * We must hold mmap_sem around checking core_waiters
-+ * and clearing tsk->mm. The core-inducing thread
-+ * will increment core_waiters for each thread in the
-+ * group with ->mm != NULL.
- */
-+ down_read(&mm->mmap_sem);
- if (mm->core_waiters) {
-+ up_read(&mm->mmap_sem);
- down_write(&mm->mmap_sem);
- if (!--mm->core_waiters)
- complete(mm->core_startup_done);
- up_write(&mm->mmap_sem);
-
- wait_for_completion(&mm->core_done);
-+ down_read(&mm->mmap_sem);
- }
- atomic_inc(&mm->mm_count);
- if (mm != tsk->active_mm) BUG();
- /* more a memory barrier than a real lock */
- task_lock(tsk);
- tsk->mm = NULL;
-+ up_read(&mm->mmap_sem);
- enter_lazy_tlb(mm, current);
- task_unlock(tsk);
- mmput(mm);
---- linux-2.6.0/kernel/fork.c 2003-12-17 21:20:03.000000000 -0800
-+++ 25/kernel/fork.c 2003-12-28 23:26:39.000000000 -0800
-@@ -146,7 +146,12 @@ void prepare_to_wait(wait_queue_head_t *
- spin_lock_irqsave(&q->lock, flags);
- if (list_empty(&wait->task_list))
- __add_wait_queue(q, wait);
-- set_current_state(state);
-+ /*
-+ * don't alter the task state if this is just going to
-+ * queue an async wait queue callback
-+ */
-+ if (is_sync_wait(wait))
-+ set_current_state(state);
- spin_unlock_irqrestore(&q->lock, flags);
- }
-
-@@ -161,7 +166,12 @@ prepare_to_wait_exclusive(wait_queue_hea
- spin_lock_irqsave(&q->lock, flags);
- if (list_empty(&wait->task_list))
- __add_wait_queue_tail(q, wait);
-- set_current_state(state);
-+ /*
-+ * don't alter the task state if this is just going to
-+ * queue an async wait queue callback
-+ */
-+ if (is_sync_wait(wait))
-+ set_current_state(state);
- spin_unlock_irqrestore(&q->lock, flags);
- }
-
-@@ -316,9 +326,9 @@ static inline int dup_mmap(struct mm_str
- atomic_dec(&inode->i_writecount);
-
- /* insert tmp into the share list, just after mpnt */
-- down(&inode->i_mapping->i_shared_sem);
-+ down(&file->f_mapping->i_shared_sem);
- list_add_tail(&tmp->shared, &mpnt->shared);
-- up(&inode->i_mapping->i_shared_sem);
-+ up(&file->f_mapping->i_shared_sem);
- }
-
- /*
-@@ -642,6 +652,11 @@ static int copy_files(unsigned long clon
- goto out;
- }
-
-+ /*
-+ * Note: we may be using current for both targets (See exec.c)
-+ * This works because we cache current->files (old) as oldf. Don't
-+ * break this.
-+ */
- tsk->files = NULL;
- error = -ENOMEM;
- newf = kmem_cache_alloc(files_cachep, SLAB_KERNEL);
-@@ -731,6 +746,35 @@ out_release:
- goto out;
- }
-
-+/*
-+ * Helper to unshare the files of the current task.
-+ * We don't want to expose copy_files internals to
-+ * the exec layer of the kernel.
-+ */
-+
-+int unshare_files(void)
-+{
-+ struct files_struct *files = current->files;
-+ int rc;
-+
-+ if(!files)
-+ BUG();
-+
-+ /* This can race but the race causes us to copy when we don't
-+ need to and drop the copy */
-+ if(atomic_read(&files->count) == 1)
-+ {
-+ atomic_inc(&files->count);
-+ return 0;
-+ }
-+ rc = copy_files(0, current);
-+ if(rc)
-+ current->files = files;
-+ return rc;
-+}
-+
-+EXPORT_SYMBOL(unshare_files);
-+
- static inline int copy_sighand(unsigned long clone_flags, struct task_struct * tsk)
- {
- struct sighand_struct *sig;
-@@ -876,15 +920,7 @@ struct task_struct *copy_process(unsigne
- if (p->binfmt && !try_module_get(p->binfmt->module))
- goto bad_fork_cleanup_put_domain;
-
--#ifdef CONFIG_PREEMPT
-- /*
-- * schedule_tail drops this_rq()->lock so we compensate with a count
-- * of 1. Also, we want to start with kernel preemption disabled.
-- */
-- p->thread_info->preempt_count = 1;
--#endif
- p->did_exec = 0;
-- p->state = TASK_UNINTERRUPTIBLE;
-
- copy_flags(clone_flags, p);
- if (clone_flags & CLONE_IDLETASK)
-@@ -901,15 +937,12 @@ struct task_struct *copy_process(unsigne
-
- p->proc_dentry = NULL;
-
-- INIT_LIST_HEAD(&p->run_list);
--
- INIT_LIST_HEAD(&p->children);
- INIT_LIST_HEAD(&p->sibling);
- INIT_LIST_HEAD(&p->posix_timers);
- init_waitqueue_head(&p->wait_chldexit);
- p->vfork_done = NULL;
- spin_lock_init(&p->alloc_lock);
-- spin_lock_init(&p->switch_lock);
- spin_lock_init(&p->proc_lock);
-
- clear_tsk_thread_flag(p, TIF_SIGPENDING);
-@@ -924,11 +957,11 @@ struct task_struct *copy_process(unsigne
- p->tty_old_pgrp = 0;
- p->utime = p->stime = 0;
- p->cutime = p->cstime = 0;
-- p->array = NULL;
- p->lock_depth = -1; /* -1 = no lock */
- p->start_time = get_jiffies_64();
- p->security = NULL;
- p->io_context = NULL;
-+ p->io_wait = NULL;
-
- retval = -ENOMEM;
- if ((retval = security_task_alloc(p)))
-@@ -973,38 +1006,12 @@ struct task_struct *copy_process(unsigne
- p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL);
- p->pdeath_signal = 0;
-
-+ /* Perform scheduler related setup */
-+ sched_fork(p);
-+
- /*
-- * Share the timeslice between parent and child, thus the
-- * total amount of pending timeslices in the system doesn't change,
-- * resulting in more scheduling fairness.
-- */
-- local_irq_disable();
-- p->time_slice = (current->time_slice + 1) >> 1;
-- /*
-- * The remainder of the first timeslice might be recovered by
-- * the parent if the child exits early enough.
-- */
-- p->first_time_slice = 1;
-- current->time_slice >>= 1;
-- p->timestamp = sched_clock();
-- if (!current->time_slice) {
-- /*
-- * This case is rare, it happens when the parent has only
-- * a single jiffy left from its timeslice. Taking the
-- * runqueue lock is not a problem.
-- */
-- current->time_slice = 1;
-- preempt_disable();
-- scheduler_tick(0, 0);
-- local_irq_enable();
-- preempt_enable();
-- } else
-- local_irq_enable();
-- /*
-- * Ok, add it to the run-queues and make it
-- * visible to the rest of the system.
-- *
-- * Let it rip!
-+ * Ok, make it visible to the rest of the system.
-+ * We dont wake it up yet.
- */
- p->tgid = p->pid;
- p->group_leader = p;
---- linux-2.6.0/kernel/futex.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/kernel/futex.c 2003-12-28 23:21:42.000000000 -0800
-@@ -246,7 +246,7 @@ static inline void get_key_refs(union fu
- * Drop a reference to the resource addressed by a key.
- * The hash bucket spinlock must not be held.
- */
--static inline void drop_key_refs(union futex_key *key)
-+static void drop_key_refs(union futex_key *key)
- {
- if (key->both.ptr != 0) {
- if (key->both.offset & 1)
-@@ -260,7 +260,7 @@ static inline void drop_key_refs(union f
- * The hash bucket lock must be held when this is called.
- * Afterwards, the futex_q must not be accessed.
- */
--static inline void wake_futex(struct futex_q *q)
-+static void wake_futex(struct futex_q *q)
- {
- list_del_init(&q->list);
- if (q->filp)
-@@ -384,7 +384,7 @@ out:
- */
-
- /* The key must be already stored in q->key. */
--static inline void queue_me(struct futex_q *q, int fd, struct file *filp)
-+static void queue_me(struct futex_q *q, int fd, struct file *filp)
- {
- struct futex_hash_bucket *bh;
-
-@@ -577,6 +577,7 @@ static int futex_fd(unsigned long uaddr,
- filp->f_op = &futex_fops;
- filp->f_vfsmnt = mntget(futex_mnt);
- filp->f_dentry = dget(futex_mnt->mnt_root);
-+ filp->f_mapping = filp->f_dentry->d_inode->i_mapping;
-
- if (signal) {
- int err;
---- linux-2.6.0/kernel/kmod.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/kernel/kmod.c 2003-12-28 23:21:42.000000000 -0800
-@@ -182,16 +182,21 @@ static int wait_for_helper(void *data)
- {
- struct subprocess_info *sub_info = data;
- pid_t pid;
-+ struct k_sigaction sa;
-+
-+ /* Install a handler: if SIGCLD isn't handled sys_wait4 won't
-+ * populate the status, but will return -ECHILD. */
-+ sa.sa.sa_handler = SIG_IGN;
-+ sa.sa.sa_flags = 0;
-+ siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD));
-+ do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0);
-+ allow_signal(SIGCHLD);
-
-- sub_info->retval = 0;
- pid = kernel_thread(____call_usermodehelper, sub_info, SIGCHLD);
- if (pid < 0)
- sub_info->retval = pid;
- else
-- /* We don't have a SIGCHLD signal handler, so this
-- * always returns -ECHILD, but the important thing is
-- * that it blocks. */
-- sys_wait4(pid, NULL, 0, NULL);
-+ sys_wait4(pid, &sub_info->retval, 0, NULL);
-
- complete(sub_info->complete);
- return 0;
-@@ -210,7 +215,7 @@ static void __call_usermodehelper(void *
- * until that is done. */
- if (sub_info->wait)
- pid = kernel_thread(wait_for_helper, sub_info,
-- CLONE_KERNEL | SIGCHLD);
-+ CLONE_FS | CLONE_FILES | SIGCHLD);
- else
- pid = kernel_thread(____call_usermodehelper, sub_info,
- CLONE_VFORK | SIGCHLD);
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/kernel/lockmeter.c 2003-12-28 23:26:34.000000000 -0800
-@@ -0,0 +1,1178 @@
-+/*
-+ * Copyright (C) 1999,2000 Silicon Graphics, Inc.
-+ *
-+ * Written by John Hawkes (hawkes@sgi.com)
-+ * Based on klstat.c by Jack Steiner (steiner@sgi.com)
-+ *
-+ * Modified by Ray Bryant (raybry@us.ibm.com)
-+ * Changes Copyright (C) 2000 IBM, Inc.
-+ * Added save of index in spinlock_t to improve efficiency
-+ * of "hold" time reporting for spinlocks
-+ * Added support for hold time statistics for read and write
-+ * locks.
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/sched.h>
-+#include <linux/smp.h>
-+#include <linux/threads.h>
-+#include <linux/version.h>
-+#include <linux/vmalloc.h>
-+#include <linux/spinlock.h>
-+#include <linux/utsname.h>
-+#include <linux/module.h>
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+
-+#include <linux/lockmeter.h>
-+
-+#define ASSERT(cond)
-+#define bzero(loc,size) memset(loc,0,size)
-+
-+/*<---------------------------------------------------*/
-+/* lockmeter.c */
-+/*>---------------------------------------------------*/
-+
-+static lstat_control_t lstat_control __cacheline_aligned =
-+ { LSTAT_OFF, SPIN_LOCK_UNLOCKED, SPIN_LOCK_UNLOCKED,
-+ 19 * 0, NR_CPUS * 0, 0, NR_CPUS * 0 };
-+
-+static ushort lstat_make_dir_entry(void *, void *);
-+
-+/*
-+ * lstat_lookup
-+ *
-+ * Given a RA, locate the directory entry for the lock.
-+ */
-+static ushort
-+lstat_lookup(void *lock_ptr, void *caller_ra)
-+{
-+ ushort index;
-+ lstat_directory_entry_t *dirp;
-+
-+ dirp = lstat_control.dir;
-+
-+ index = lstat_control.hashtab[DIRHASH(caller_ra)];
-+ while (dirp[index].caller_ra != caller_ra) {
-+ if (index == 0) {
-+ return lstat_make_dir_entry(lock_ptr, caller_ra);
-+ }
-+ index = dirp[index].next_stat_index;
-+ }
-+
-+ if (dirp[index].lock_ptr != NULL && dirp[index].lock_ptr != lock_ptr) {
-+ dirp[index].lock_ptr = NULL;
-+ }
-+
-+ return index;
-+}
-+
-+/*
-+ * lstat_make_dir_entry
-+ * Called to add a new lock to the lock directory.
-+ */
-+static ushort
-+lstat_make_dir_entry(void *lock_ptr, void *caller_ra)
-+{
-+ lstat_directory_entry_t *dirp;
-+ ushort index, hindex;
-+ unsigned long flags;
-+
-+ /* lock the table without recursively reentering this metering code */
-+ local_irq_save(flags);
-+ _raw_spin_lock(&lstat_control.directory_lock);
-+
-+ hindex = DIRHASH(caller_ra);
-+ index = lstat_control.hashtab[hindex];
-+ dirp = lstat_control.dir;
-+ while (index && dirp[index].caller_ra != caller_ra)
-+ index = dirp[index].next_stat_index;
-+
-+ if (index == 0) {
-+ if (lstat_control.next_free_dir_index < LSTAT_MAX_STAT_INDEX) {
-+ index = lstat_control.next_free_dir_index++;
-+ lstat_control.dir[index].caller_ra = caller_ra;
-+ lstat_control.dir[index].lock_ptr = lock_ptr;
-+ lstat_control.dir[index].next_stat_index =
-+ lstat_control.hashtab[hindex];
-+ lstat_control.hashtab[hindex] = index;
-+ } else {
-+ lstat_control.dir_overflow++;
-+ }
-+ }
-+ _raw_spin_unlock(&lstat_control.directory_lock);
-+ local_irq_restore(flags);
-+ return index;
-+}
-+
-+int
-+lstat_update(void *lock_ptr, void *caller_ra, int action)
-+{
-+ int index;
-+ int cpu;
-+
-+ ASSERT(action < LSTAT_ACT_MAX_VALUES);
-+
-+ if (lstat_control.state == LSTAT_OFF)
-+ return 0;
-+
-+ index = lstat_lookup(lock_ptr, caller_ra);
-+ cpu = THIS_CPU_NUMBER;
-+ (*lstat_control.counts[cpu])[index].count[action]++;
-+ (*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
-+
-+ return index;
-+}
-+
-+int
-+lstat_update_time(void *lock_ptr, void *caller_ra, int action, uint32_t ticks)
-+{
-+ ushort index;
-+ int cpu;
-+
-+ ASSERT(action < LSTAT_ACT_MAX_VALUES);
-+
-+ if (lstat_control.state == LSTAT_OFF)
-+ return 0;
-+
-+ index = lstat_lookup(lock_ptr, caller_ra);
-+ cpu = THIS_CPU_NUMBER;
-+ (*lstat_control.counts[cpu])[index].count[action]++;
-+ (*lstat_control.counts[cpu])[index].cum_wait_ticks += (uint64_t) ticks;
-+ if ((*lstat_control.counts[cpu])[index].max_wait_ticks < ticks)
-+ (*lstat_control.counts[cpu])[index].max_wait_ticks = ticks;
-+
-+ (*lstat_control.counts[cpu])[index].acquire_time = get_cycles();
-+
-+ return index;
-+}
-+
-+void
-+_metered_spin_lock(spinlock_t * lock_ptr)
-+{
-+ if (lstat_control.state == LSTAT_OFF) {
-+ _raw_spin_lock(lock_ptr); /* do the real lock */
-+ PUT_INDEX(lock_ptr, 0); /* clean index in case lockmetering */
-+ /* gets turned on before unlock */
-+ } else {
-+ void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
-+ int index;
-+
-+ if (_raw_spin_trylock(lock_ptr)) {
-+ index = lstat_update(lock_ptr, this_pc,
-+ LSTAT_ACT_NO_WAIT);
-+ } else {
-+ uint32_t start_cycles = get_cycles();
-+ _raw_spin_lock(lock_ptr); /* do the real lock */
-+ index = lstat_update_time(lock_ptr, this_pc,
-+ LSTAT_ACT_SPIN, get_cycles() - start_cycles);
-+ }
-+ /* save the index in the lock itself for use in spin unlock */
-+ PUT_INDEX(lock_ptr, index);
-+ }
-+}
-+
-+int
-+_metered_spin_trylock(spinlock_t * lock_ptr)
-+{
-+ if (lstat_control.state == LSTAT_OFF) {
-+ return _raw_spin_trylock(lock_ptr);
-+ } else {
-+ int retval;
-+ void *this_pc = LSTAT_RA(LSTAT_RA_SPIN);
-+
-+ if ((retval = _raw_spin_trylock(lock_ptr))) {
-+ int index = lstat_update(lock_ptr, this_pc,
-+ LSTAT_ACT_NO_WAIT);
-+ /*
-+ * save the index in the lock itself for use in spin
-+ * unlock
-+ */
-+ PUT_INDEX(lock_ptr, index);
-+ } else {
-+ lstat_update(lock_ptr, this_pc, LSTAT_ACT_REJECT);
-+ }
-+
-+ return retval;
-+ }
-+}
-+
-+void
-+_metered_spin_unlock(spinlock_t * lock_ptr)
-+{
-+ int index = -1;
-+
-+ if (lstat_control.state != LSTAT_OFF) {
-+ index = GET_INDEX(lock_ptr);
-+ /*
-+ * If statistics were turned off when we set the lock,
-+ * then the index can be zero. If that is the case,
-+ * then collect no stats on this call.
-+ */
-+ if (index > 0) {
-+ uint32_t hold_time;
-+ int cpu = THIS_CPU_NUMBER;
-+ hold_time = get_cycles() -
-+ (*lstat_control.counts[cpu])[index].acquire_time;
-+ (*lstat_control.counts[cpu])[index].cum_hold_ticks +=
-+ (uint64_t) hold_time;
-+ if ((*lstat_control.counts[cpu])[index].max_hold_ticks <
-+ hold_time)
-+ (*lstat_control.counts[cpu])[index].
-+ max_hold_ticks = hold_time;
-+ }
-+ }
-+
-+ /* make sure we don't have a stale index value saved */
-+ PUT_INDEX(lock_ptr, 0);
-+ _raw_spin_unlock(lock_ptr); /* do the real unlock */
-+}
-+
-+/*
-+ * allocate the next global read lock structure and store its index
-+ * in the rwlock at "lock_ptr".
-+ */
-+uint32_t
-+alloc_rwlock_struct(rwlock_t * rwlock_ptr)
-+{
-+ int index;
-+ unsigned long flags;
-+ int cpu = THIS_CPU_NUMBER;
-+
-+ /* If we've already overflowed, then do a quick exit */
-+ if (lstat_control.next_free_read_lock_index >
-+ LSTAT_MAX_READ_LOCK_INDEX) {
-+ lstat_control.rwlock_overflow++;
-+ return 0;
-+ }
-+
-+ local_irq_save(flags);
-+ _raw_spin_lock(&lstat_control.directory_lock);
-+
-+ /* It is possible this changed while we were waiting for the directory_lock */
-+ if (lstat_control.state == LSTAT_OFF) {
-+ index = 0;
-+ goto unlock;
-+ }
-+
-+ /* It is possible someone else got here first and set the index */
-+ if ((index = GET_RWINDEX(rwlock_ptr)) == 0) {
-+ /*
-+ * we can't turn on read stats for this lock while there are
-+ * readers (this would mess up the running hold time sum at
-+ * unlock time)
-+ */
-+ if (RWLOCK_READERS(rwlock_ptr) != 0) {
-+ index = 0;
-+ goto unlock;
-+ }
-+
-+ /*
-+ * if stats are turned on after being off, we may need to
-+ * return an old index from when the statistics were on last
-+ * time.
-+ */
-+ for (index = 1; index < lstat_control.next_free_read_lock_index;
-+ index++)
-+ if ((*lstat_control.read_lock_counts[cpu])[index].
-+ lock_ptr == rwlock_ptr)
-+ goto put_index_and_unlock;
-+
-+ /* allocate the next global read lock structure */
-+ if (lstat_control.next_free_read_lock_index >=
-+ LSTAT_MAX_READ_LOCK_INDEX) {
-+ lstat_control.rwlock_overflow++;
-+ index = 0;
-+ goto unlock;
-+ }
-+ index = lstat_control.next_free_read_lock_index++;
-+
-+ /*
-+ * initialize the global read stats data structure for each
-+ * cpu
-+ */
-+ for (cpu = 0; cpu < num_online_cpus(); cpu++) {
-+ (*lstat_control.read_lock_counts[cpu])[index].lock_ptr =
-+ rwlock_ptr;
-+ }
-+put_index_and_unlock:
-+ /* store the index for the read lock structure into the lock */
-+ PUT_RWINDEX(rwlock_ptr, index);
-+ }
-+
-+unlock:
-+ _raw_spin_unlock(&lstat_control.directory_lock);
-+ local_irq_restore(flags);
-+ return index;
-+}
-+
-+void
-+_metered_read_lock(rwlock_t * rwlock_ptr)
-+{
-+ void *this_pc;
-+ uint32_t start_cycles;
-+ int index;
-+ int cpu;
-+ unsigned long flags;
-+ int readers_before, readers_after;
-+ uint64_t cycles64;
-+
-+ if (lstat_control.state == LSTAT_OFF) {
-+ _raw_read_lock(rwlock_ptr);
-+ /* clean index in case lockmetering turns on before an unlock */
-+ PUT_RWINDEX(rwlock_ptr, 0);
-+ return;
-+ }
-+
-+ this_pc = LSTAT_RA(LSTAT_RA_READ);
-+ cpu = THIS_CPU_NUMBER;
-+ index = GET_RWINDEX(rwlock_ptr);
-+
-+ /* allocate the global stats entry for this lock, if needed */
-+ if (index == 0)
-+ index = alloc_rwlock_struct(rwlock_ptr);
-+
-+ readers_before = RWLOCK_READERS(rwlock_ptr);
-+ if (_raw_read_trylock(rwlock_ptr)) {
-+ /*
-+ * We have decremented the lock to count a new reader,
-+ * and have confirmed that no writer has it locked.
-+ */
-+ /* update statistics if enabled */
-+ if (index > 0) {
-+ local_irq_save(flags);
-+ lstat_update((void *) rwlock_ptr, this_pc,
-+ LSTAT_ACT_NO_WAIT);
-+ /* preserve value of TSC so cum_hold_ticks and start_busy use same value */
-+ cycles64 = get_cycles64();
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ cum_hold_ticks -= cycles64;
-+
-+ /* record time and cpu of start of busy period */
-+ /* this is not perfect (some race conditions are possible) */
-+ if (readers_before == 0) {
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ start_busy = cycles64;
-+ PUT_RW_CPU(rwlock_ptr, cpu);
-+ }
-+ readers_after = RWLOCK_READERS(rwlock_ptr);
-+ if (readers_after >
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ max_readers)
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ max_readers = readers_after;
-+ local_irq_restore(flags);
-+ }
-+
-+ return;
-+ }
-+ /* If we get here, then we could not quickly grab the read lock */
-+
-+ start_cycles = get_cycles(); /* start counting the wait time */
-+
-+ /* Now spin until read_lock is successful */
-+ _raw_read_lock(rwlock_ptr);
-+
-+ lstat_update_time((void *) rwlock_ptr, this_pc, LSTAT_ACT_SPIN,
-+ get_cycles() - start_cycles);
-+
-+ /* update statistics if they are enabled for this lock */
-+ if (index > 0) {
-+ local_irq_save(flags);
-+ cycles64 = get_cycles64();
-+ (*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks -=
-+ cycles64;
-+
-+ /* this is not perfect (some race conditions are possible) */
-+ if (readers_before == 0) {
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ start_busy = cycles64;
-+ PUT_RW_CPU(rwlock_ptr, cpu);
-+ }
-+ readers_after = RWLOCK_READERS(rwlock_ptr);
-+ if (readers_after >
-+ (*lstat_control.read_lock_counts[cpu])[index].max_readers)
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ max_readers = readers_after;
-+ local_irq_restore(flags);
-+ }
-+}
-+
-+void
-+_metered_read_unlock(rwlock_t * rwlock_ptr)
-+{
-+ int index;
-+ int cpu;
-+ unsigned long flags;
-+ uint64_t busy_length;
-+ uint64_t cycles64;
-+
-+ if (lstat_control.state == LSTAT_OFF) {
-+ _raw_read_unlock(rwlock_ptr);
-+ return;
-+ }
-+
-+ index = GET_RWINDEX(rwlock_ptr);
-+ cpu = THIS_CPU_NUMBER;
-+
-+ if (index > 0) {
-+ local_irq_save(flags);
-+ /*
-+ * preserve value of TSC so cum_hold_ticks and busy_ticks are
-+ * consistent.
-+ */
-+ cycles64 = get_cycles64();
-+ (*lstat_control.read_lock_counts[cpu])[index].cum_hold_ticks +=
-+ cycles64;
-+ (*lstat_control.read_lock_counts[cpu])[index].read_lock_count++;
-+
-+ /*
-+ * once again, this is not perfect (some race conditions are
-+ * possible)
-+ */
-+ if (RWLOCK_READERS(rwlock_ptr) == 1) {
-+ int cpu1 = GET_RW_CPU(rwlock_ptr);
-+ uint64_t last_start_busy =
-+ (*lstat_control.read_lock_counts[cpu1])[index].
-+ start_busy;
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ busy_periods++;
-+ if (cycles64 > last_start_busy) {
-+ busy_length = cycles64 - last_start_busy;
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ busy_ticks += busy_length;
-+ if (busy_length >
-+ (*lstat_control.
-+ read_lock_counts[cpu])[index].
-+ max_busy)
-+ (*lstat_control.
-+ read_lock_counts[cpu])[index].
-+ max_busy = busy_length;
-+ }
-+ }
-+ local_irq_restore(flags);
-+ }
-+ _raw_read_unlock(rwlock_ptr);
-+}
-+
-+void
-+_metered_write_lock(rwlock_t * rwlock_ptr)
-+{
-+ uint32_t start_cycles;
-+ void *this_pc;
-+ uint32_t spin_ticks = 0; /* in anticipation of a potential wait */
-+ int index;
-+ int write_index = 0;
-+ int cpu;
-+ enum {
-+ writer_writer_conflict,
-+ writer_reader_conflict
-+ } why_wait = writer_writer_conflict;
-+
-+ if (lstat_control.state == LSTAT_OFF) {
-+ _raw_write_lock(rwlock_ptr);
-+ /* clean index in case lockmetering turns on before an unlock */
-+ PUT_RWINDEX(rwlock_ptr, 0);
-+ return;
-+ }
-+
-+ this_pc = LSTAT_RA(LSTAT_RA_WRITE);
-+ cpu = THIS_CPU_NUMBER;
-+ index = GET_RWINDEX(rwlock_ptr);
-+
-+ /* allocate the global stats entry for this lock, if needed */
-+ if (index == 0) {
-+ index = alloc_rwlock_struct(rwlock_ptr);
-+ }
-+
-+ if (_raw_write_trylock(rwlock_ptr)) {
-+ /* We acquired the lock on the first try */
-+ write_index = lstat_update((void *) rwlock_ptr, this_pc,
-+ LSTAT_ACT_NO_WAIT);
-+ /* save the write_index for use in unlock if stats enabled */
-+ if (index > 0)
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ write_index = write_index;
-+ return;
-+ }
-+
-+ /* If we get here, then we could not quickly grab the write lock */
-+ start_cycles = get_cycles(); /* start counting the wait time */
-+
-+ why_wait = RWLOCK_READERS(rwlock_ptr) ?
-+ writer_reader_conflict : writer_writer_conflict;
-+
-+ /* Now set the lock and wait for conflicts to disappear */
-+ _raw_write_lock(rwlock_ptr);
-+
-+ spin_ticks = get_cycles() - start_cycles;
-+
-+ /* update stats -- if enabled */
-+ if (index > 0 && spin_ticks) {
-+ if (why_wait == writer_reader_conflict) {
-+ /* waited due to a reader holding the lock */
-+ write_index = lstat_update_time((void *)rwlock_ptr,
-+ this_pc, LSTAT_ACT_SPIN, spin_ticks);
-+ } else {
-+ /*
-+ * waited due to another writer holding the lock
-+ */
-+ write_index = lstat_update_time((void *)rwlock_ptr,
-+ this_pc, LSTAT_ACT_WW_SPIN, spin_ticks);
-+ (*lstat_control.counts[cpu])[write_index].
-+ cum_wait_ww_ticks += spin_ticks;
-+ if (spin_ticks >
-+ (*lstat_control.counts[cpu])[write_index].
-+ max_wait_ww_ticks) {
-+ (*lstat_control.counts[cpu])[write_index].
-+ max_wait_ww_ticks = spin_ticks;
-+ }
-+ }
-+
-+ /* save the directory index for use on write_unlock */
-+ (*lstat_control.read_lock_counts[cpu])[index].
-+ write_index = write_index;
-+ }
-+}
-+
-+void
-+_metered_write_unlock(rwlock_t * rwlock_ptr)
-+{
-+ int index;
-+ int cpu;
-+ int write_index;
-+ uint32_t hold_time;
-+
-+ if (lstat_control.state == LSTAT_OFF) {
-+ _raw_write_unlock(rwlock_ptr);
-+ return;
-+ }
-+
-+ cpu = THIS_CPU_NUMBER;
-+ index = GET_RWINDEX(rwlock_ptr);
-+
-+ /* update statistics if stats enabled for this lock */
-+ if (index > 0) {
-+ write_index =
-+ (*lstat_control.read_lock_counts[cpu])[index].write_index;
-+
-+ hold_time = get_cycles() -
-+ (*lstat_control.counts[cpu])[write_index].acquire_time;
-+ (*lstat_control.counts[cpu])[write_index].cum_hold_ticks +=
-+ (uint64_t) hold_time;
-+ if ((*lstat_control.counts[cpu])[write_index].max_hold_ticks <
-+ hold_time)
-+ (*lstat_control.counts[cpu])[write_index].
-+ max_hold_ticks = hold_time;
-+ }
-+ _raw_write_unlock(rwlock_ptr);
-+}
-+
-+int
-+_metered_write_trylock(rwlock_t * rwlock_ptr)
-+{
-+ int retval;
-+ void *this_pc = LSTAT_RA(LSTAT_RA_WRITE);
-+
-+ if ((retval = _raw_write_trylock(rwlock_ptr))) {
-+ lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_NO_WAIT);
-+ } else {
-+ lstat_update(rwlock_ptr, this_pc, LSTAT_ACT_REJECT);
-+ }
-+
-+ return retval;
-+}
-+
-+static void
-+init_control_space(void)
-+{
-+ /* Set all control space pointers to null and indices to "empty" */
-+ int cpu;
-+
-+ /*
-+ * Access CPU_CYCLE_FREQUENCY at the outset, which in some
-+ * architectures may trigger a runtime calculation that uses a
-+ * spinlock. Let's do this before lockmetering is turned on.
-+ */
-+ if (CPU_CYCLE_FREQUENCY == 0)
-+ BUG();
-+
-+ lstat_control.hashtab = NULL;
-+ lstat_control.dir = NULL;
-+ for (cpu = 0; cpu < NR_CPUS; cpu++) {
-+ lstat_control.counts[cpu] = NULL;
-+ lstat_control.read_lock_counts[cpu] = NULL;
-+ }
-+}
-+
-+static int
-+reset_lstat_data(void)
-+{
-+ int cpu, flags;
-+
-+ flags = 0;
-+ lstat_control.next_free_dir_index = 1; /* 0 is for overflows */
-+ lstat_control.next_free_read_lock_index = 1;
-+ lstat_control.dir_overflow = 0;
-+ lstat_control.rwlock_overflow = 0;
-+
-+ lstat_control.started_cycles64 = 0;
-+ lstat_control.ending_cycles64 = 0;
-+ lstat_control.enabled_cycles64 = 0;
-+ lstat_control.first_started_time = 0;
-+ lstat_control.started_time = 0;
-+ lstat_control.ending_time = 0;
-+ lstat_control.intervals = 0;
-+
-+ /*
-+ * paranoia -- in case someone does a "lockstat reset" before
-+ * "lockstat on"
-+ */
-+ if (lstat_control.hashtab) {
-+ bzero(lstat_control.hashtab,
-+ LSTAT_HASH_TABLE_SIZE * sizeof (short));
-+ bzero(lstat_control.dir, LSTAT_MAX_STAT_INDEX *
-+ sizeof (lstat_directory_entry_t));
-+
-+ for (cpu = 0; cpu < num_online_cpus(); cpu++) {
-+ bzero(lstat_control.counts[cpu],
-+ sizeof (lstat_cpu_counts_t));
-+ bzero(lstat_control.read_lock_counts[cpu],
-+ sizeof (lstat_read_lock_cpu_counts_t));
-+ }
-+ }
-+#ifdef NOTDEF
-+ _raw_spin_unlock(&lstat_control.directory_lock);
-+ local_irq_restore(flags);
-+#endif
-+ return 1;
-+}
-+
-+static void
-+release_control_space(void)
-+{
-+ /*
-+ * Called when either (1) allocation of kmem
-+ * or (2) when user writes LSTAT_RELEASE to /pro/lockmeter.
-+ * Assume that all pointers have been initialized to zero,
-+ * i.e., nonzero pointers are valid addresses.
-+ */
-+ int cpu;
-+
-+ if (lstat_control.hashtab) {
-+ kfree(lstat_control.hashtab);
-+ lstat_control.hashtab = NULL;
-+ }
-+
-+ if (lstat_control.dir) {
-+ vfree(lstat_control.dir);
-+ lstat_control.dir = NULL;
-+ }
-+
-+ for (cpu = 0; cpu < NR_CPUS; cpu++) {
-+ if (lstat_control.counts[cpu]) {
-+ vfree(lstat_control.counts[cpu]);
-+ lstat_control.counts[cpu] = NULL;
-+ }
-+ if (lstat_control.read_lock_counts[cpu]) {
-+ kfree(lstat_control.read_lock_counts[cpu]);
-+ lstat_control.read_lock_counts[cpu] = NULL;
-+ }
-+ }
-+}
-+
-+int
-+get_lockmeter_info_size(void)
-+{
-+ return sizeof (lstat_user_request_t)
-+ + num_online_cpus() * sizeof (lstat_cpu_counts_t)
-+ + num_online_cpus() * sizeof (lstat_read_lock_cpu_counts_t)
-+ + (LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t));
-+}
-+
-+ssize_t
-+get_lockmeter_info(char *buffer, size_t max_len, loff_t * last_index)
-+{
-+ lstat_user_request_t req;
-+ struct timeval tv;
-+ ssize_t next_ret_bcount;
-+ ssize_t actual_ret_bcount = 0;
-+ int cpu;
-+
-+ *last_index = 0; /* a one-shot read */
-+
-+ req.lstat_version = LSTAT_VERSION;
-+ req.state = lstat_control.state;
-+ req.maxcpus = num_online_cpus();
-+ req.cycleval = CPU_CYCLE_FREQUENCY;
-+#ifdef notyet
-+ req.kernel_magic_addr = (void *) &_etext;
-+ req.kernel_end_addr = (void *) &_etext;
-+#endif
-+ req.uts = system_utsname;
-+ req.intervals = lstat_control.intervals;
-+
-+ req.first_started_time = lstat_control.first_started_time;
-+ req.started_time = lstat_control.started_time;
-+ req.started_cycles64 = lstat_control.started_cycles64;
-+
-+ req.next_free_dir_index = lstat_control.next_free_dir_index;
-+ req.next_free_read_lock_index = lstat_control.next_free_read_lock_index;
-+ req.dir_overflow = lstat_control.dir_overflow;
-+ req.rwlock_overflow = lstat_control.rwlock_overflow;
-+
-+ if (lstat_control.state == LSTAT_OFF) {
-+ if (req.intervals == 0) {
-+ /* mesasurement is off and no valid data present */
-+ next_ret_bcount = sizeof (lstat_user_request_t);
-+ req.enabled_cycles64 = 0;
-+
-+ if ((actual_ret_bcount + next_ret_bcount) > max_len)
-+ return actual_ret_bcount;
-+
-+ copy_to_user(buffer, (void *) &req, next_ret_bcount);
-+ actual_ret_bcount += next_ret_bcount;
-+ return actual_ret_bcount;
-+ } else {
-+ /*
-+ * measurement is off but valid data present
-+ * fetch time info from lstat_control
-+ */
-+ req.ending_time = lstat_control.ending_time;
-+ req.ending_cycles64 = lstat_control.ending_cycles64;
-+ req.enabled_cycles64 = lstat_control.enabled_cycles64;
-+ }
-+ } else {
-+ /*
-+ * this must be a read while data active--use current time,
-+ * etc
-+ */
-+ do_gettimeofday(&tv);
-+ req.ending_time = tv.tv_sec;
-+ req.ending_cycles64 = get_cycles64();
-+ req.enabled_cycles64 = req.ending_cycles64 -
-+ req.started_cycles64 + lstat_control.enabled_cycles64;
-+ }
-+
-+ next_ret_bcount = sizeof (lstat_user_request_t);
-+ if ((actual_ret_bcount + next_ret_bcount) > max_len)
-+ return actual_ret_bcount;
-+
-+ copy_to_user(buffer, (void *) &req, next_ret_bcount);
-+ actual_ret_bcount += next_ret_bcount;
-+
-+ if (!lstat_control.counts[0]) /* not initialized? */
-+ return actual_ret_bcount;
-+
-+ next_ret_bcount = sizeof (lstat_cpu_counts_t);
-+ for (cpu = 0; cpu < num_online_cpus(); cpu++) {
-+ if ((actual_ret_bcount + next_ret_bcount) > max_len)
-+ return actual_ret_bcount; /* leave early */
-+ copy_to_user(buffer + actual_ret_bcount,
-+ lstat_control.counts[cpu], next_ret_bcount);
-+ actual_ret_bcount += next_ret_bcount;
-+ }
-+
-+ next_ret_bcount = LSTAT_MAX_STAT_INDEX *
-+ sizeof (lstat_directory_entry_t);
-+ if (((actual_ret_bcount + next_ret_bcount) > max_len)
-+ || !lstat_control.dir)
-+ return actual_ret_bcount; /* leave early */
-+
-+ copy_to_user(buffer + actual_ret_bcount, lstat_control.dir,
-+ next_ret_bcount);
-+ actual_ret_bcount += next_ret_bcount;
-+
-+ next_ret_bcount = sizeof (lstat_read_lock_cpu_counts_t);
-+ for (cpu = 0; cpu < num_online_cpus(); cpu++) {
-+ if (actual_ret_bcount + next_ret_bcount > max_len)
-+ return actual_ret_bcount;
-+ copy_to_user(buffer + actual_ret_bcount,
-+ lstat_control.read_lock_counts[cpu],
-+ next_ret_bcount);
-+ actual_ret_bcount += next_ret_bcount;
-+ }
-+
-+ return actual_ret_bcount;
-+}
-+
-+/*
-+ * Writing to the /proc lockmeter node enables or disables metering.
-+ * based upon the first byte of the "written" data.
-+ * The following values are defined:
-+ * LSTAT_ON: 1st call: allocates storage, intializes and turns on measurement
-+ * subsequent calls just turn on measurement
-+ * LSTAT_OFF: turns off measurement
-+ * LSTAT_RESET: resets statistics
-+ * LSTAT_RELEASE: releases statistics storage
-+ *
-+ * This allows one to accumulate statistics over several lockstat runs:
-+ *
-+ * lockstat on
-+ * lockstat off
-+ * ...repeat above as desired...
-+ * lockstat get
-+ * ...now start a new set of measurements...
-+ * lockstat reset
-+ * lockstat on
-+ * ...
-+ *
-+ */
-+ssize_t
-+put_lockmeter_info(const char *buffer, size_t len)
-+{
-+ int error = 0;
-+ int dirsize, countsize, read_lock_countsize, hashsize;
-+ int cpu;
-+ char put_char;
-+ int i, read_lock_blocks;
-+ unsigned long flags;
-+ rwlock_t *lock_ptr;
-+ struct timeval tv;
-+
-+ if (len <= 0)
-+ return -EINVAL;
-+
-+ _raw_spin_lock(&lstat_control.control_lock);
-+
-+ get_user(put_char, buffer);
-+ switch (put_char) {
-+
-+ case LSTAT_OFF:
-+ if (lstat_control.state != LSTAT_OFF) {
-+ /*
-+ * To avoid seeing read lock hold times in an
-+ * inconsisent state, we have to follow this protocol
-+ * to turn off statistics
-+ */
-+ local_irq_save(flags);
-+ /*
-+ * getting this lock will stop any read lock block
-+ * allocations
-+ */
-+ _raw_spin_lock(&lstat_control.directory_lock);
-+ /*
-+ * keep any more read lock blocks from being
-+ * allocated
-+ */
-+ lstat_control.state = LSTAT_OFF;
-+ /* record how may read lock blocks there are */
-+ read_lock_blocks =
-+ lstat_control.next_free_read_lock_index;
-+ _raw_spin_unlock(&lstat_control.directory_lock);
-+ /* now go through the list of read locks */
-+ cpu = THIS_CPU_NUMBER;
-+ for (i = 1; i < read_lock_blocks; i++) {
-+ lock_ptr =
-+ (*lstat_control.read_lock_counts[cpu])[i].
-+ lock_ptr;
-+ /* is this saved lock address still valid? */
-+ if (GET_RWINDEX(lock_ptr) == i) {
-+ /*
-+ * lock address appears to still be
-+ * valid because we only hold one lock
-+ * at a time, this can't cause a
-+ * deadlock unless this is a lock held
-+ * as part of the current system call
-+ * path. At the moment there
-+ * are no READ mode locks held to get
-+ * here from user space, so we solve
-+ * this by skipping locks held in
-+ * write mode.
-+ */
-+ if (RWLOCK_IS_WRITE_LOCKED(lock_ptr)) {
-+ PUT_RWINDEX(lock_ptr, 0);
-+ continue;
-+ }
-+ /*
-+ * now we know there are no read
-+ * holders of this lock! stop
-+ * statistics collection for this
-+ * lock
-+ */
-+ _raw_write_lock(lock_ptr);
-+ PUT_RWINDEX(lock_ptr, 0);
-+ _raw_write_unlock(lock_ptr);
-+ }
-+ /*
-+ * it may still be possible for the hold time
-+ * sum to be negative e.g. if a lock is
-+ * reallocated while "busy" we will have to fix
-+ * this up in the data reduction program.
-+ */
-+ }
-+ local_irq_restore(flags);
-+ lstat_control.intervals++;
-+ lstat_control.ending_cycles64 = get_cycles64();
-+ lstat_control.enabled_cycles64 +=
-+ lstat_control.ending_cycles64 -
-+ lstat_control.started_cycles64;
-+ do_gettimeofday(&tv);
-+ lstat_control.ending_time = tv.tv_sec;
-+ /*
-+ * don't deallocate the structures -- we may do a
-+ * lockstat on to add to the data that is already
-+ * there. Use LSTAT_RELEASE to release storage
-+ */
-+ } else {
-+ error = -EBUSY; /* already OFF */
-+ }
-+ break;
-+
-+ case LSTAT_ON:
-+ if (lstat_control.state == LSTAT_OFF) {
-+#ifdef DEBUG_LOCKMETER
-+ printk("put_lockmeter_info(cpu=%d): LSTAT_ON\n",
-+ THIS_CPU_NUMBER);
-+#endif
-+ lstat_control.next_free_dir_index = 1; /* 0 is for overflows */
-+
-+ dirsize = LSTAT_MAX_STAT_INDEX *
-+ sizeof (lstat_directory_entry_t);
-+ hashsize =
-+ (1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
-+ countsize = sizeof (lstat_cpu_counts_t);
-+ read_lock_countsize =
-+ sizeof (lstat_read_lock_cpu_counts_t);
-+#ifdef DEBUG_LOCKMETER
-+ printk(" dirsize:%d", dirsize);
-+ printk(" hashsize:%d", hashsize);
-+ printk(" countsize:%d", countsize);
-+ printk(" read_lock_countsize:%d\n",
-+ read_lock_countsize);
-+#endif
-+#ifdef DEBUG_LOCKMETER
-+ {
-+ int secs;
-+ unsigned long cycles;
-+ uint64_t cycles64;
-+
-+ do_gettimeofday(&tv);
-+ secs = tv.tv_sec;
-+ do {
-+ do_gettimeofday(&tv);
-+ } while (secs == tv.tv_sec);
-+ cycles = get_cycles();
-+ cycles64 = get_cycles64();
-+ secs = tv.tv_sec;
-+ do {
-+ do_gettimeofday(&tv);
-+ } while (secs == tv.tv_sec);
-+ cycles = get_cycles() - cycles;
-+ cycles64 = get_cycles64() - cycles;
-+ printk("lockmeter: cycleFrequency:%d "
-+ "cycles:%d cycles64:%d\n",
-+ CPU_CYCLE_FREQUENCY, cycles, cycles64);
-+ }
-+#endif
-+
-+ /*
-+ * if this is the first call, allocate storage and
-+ * initialize
-+ */
-+ if (!lstat_control.hashtab) {
-+
-+ spin_lock_init(&lstat_control.directory_lock);
-+
-+ /* guarantee all pointers at zero */
-+ init_control_space();
-+
-+ lstat_control.hashtab =
-+ kmalloc(hashsize, GFP_KERNEL);
-+ if (!lstat_control.hashtab) {
-+ error = -ENOSPC;
-+#ifdef DEBUG_LOCKMETER
-+ printk("!!error kmalloc of hashtab\n");
-+#endif
-+ }
-+ lstat_control.dir = vmalloc(dirsize);
-+ if (!lstat_control.dir) {
-+ error = -ENOSPC;
-+#ifdef DEBUG_LOCKMETER
-+ printk("!!error kmalloc of dir\n");
-+#endif
-+ }
-+
-+ for (cpu = 0; cpu < num_online_cpus(); cpu++) {
-+ lstat_control.counts[cpu] =
-+ vmalloc(countsize);
-+ if (!lstat_control.counts[cpu]) {
-+ error = -ENOSPC;
-+#ifdef DEBUG_LOCKMETER
-+ printk("!!error vmalloc of "
-+ "counts[%d]\n", cpu);
-+#endif
-+ }
-+ lstat_control.read_lock_counts[cpu] =
-+ (lstat_read_lock_cpu_counts_t *)
-+ kmalloc(read_lock_countsize,
-+ GFP_KERNEL);
-+ if (!lstat_control.
-+ read_lock_counts[cpu]) {
-+ error = -ENOSPC;
-+#ifdef DEBUG_LOCKMETER
-+ printk("!!error kmalloc of "
-+ "read_lock_counts[%d]\n",
-+ cpu);
-+#endif
-+ }
-+ }
-+ }
-+
-+ if (error) {
-+ /*
-+ * One or more kmalloc failures -- free
-+ * everything
-+ */
-+ release_control_space();
-+ } else {
-+
-+ if (!reset_lstat_data()) {
-+ error = -EINVAL;
-+ break;
-+ };
-+
-+ /*
-+ * record starting and ending times and the
-+ * like
-+ */
-+ if (lstat_control.intervals == 0) {
-+ do_gettimeofday(&tv);
-+ lstat_control.first_started_time =
-+ tv.tv_sec;
-+ }
-+ lstat_control.started_cycles64 = get_cycles64();
-+ do_gettimeofday(&tv);
-+ lstat_control.started_time = tv.tv_sec;
-+
-+ lstat_control.state = LSTAT_ON;
-+ }
-+ } else {
-+ error = -EBUSY; /* already ON */
-+ }
-+ break;
-+
-+ case LSTAT_RESET:
-+ if (lstat_control.state == LSTAT_OFF) {
-+ if (!reset_lstat_data())
-+ error = -EINVAL;
-+ } else {
-+ error = -EBUSY; /* still on; can't reset */
-+ }
-+ break;
-+
-+ case LSTAT_RELEASE:
-+ if (lstat_control.state == LSTAT_OFF) {
-+ release_control_space();
-+ lstat_control.intervals = 0;
-+ lstat_control.enabled_cycles64 = 0;
-+ } else {
-+ error = -EBUSY;
-+ }
-+ break;
-+
-+ default:
-+ error = -EINVAL;
-+ } /* switch */
-+
-+ _raw_spin_unlock(&lstat_control.control_lock);
-+ return error ? error : len;
-+}
-+
-+#ifdef USER_MODE_TESTING
-+/* following used for user mode testing */
-+void
-+lockmeter_init()
-+{
-+ int dirsize, hashsize, countsize, read_lock_countsize, cpu;
-+
-+ printf("lstat_control is at %x size=%d\n", &lstat_control,
-+ sizeof (lstat_control));
-+ printf("sizeof(spinlock_t)=%d\n", sizeof (spinlock_t));
-+ lstat_control.state = LSTAT_ON;
-+
-+ lstat_control.directory_lock = SPIN_LOCK_UNLOCKED;
-+ lstat_control.next_free_dir_index = 1; /* 0 is for overflows */
-+ lstat_control.next_free_read_lock_index = 1;
-+
-+ dirsize = LSTAT_MAX_STAT_INDEX * sizeof (lstat_directory_entry_t);
-+ hashsize = (1 + LSTAT_HASH_TABLE_SIZE) * sizeof (ushort);
-+ countsize = sizeof (lstat_cpu_counts_t);
-+ read_lock_countsize = sizeof (lstat_read_lock_cpu_counts_t);
-+
-+ lstat_control.hashtab = (ushort *) malloc(hashsize);
-+
-+ if (lstat_control.hashtab == 0) {
-+ printf("malloc failure for at line %d in lockmeter.c\n",
-+ __LINE__);
-+ exit(0);
-+ }
-+
-+ lstat_control.dir = (lstat_directory_entry_t *) malloc(dirsize);
-+
-+ if (lstat_control.dir == 0) {
-+ printf("malloc failure for at line %d in lockmeter.c\n", cpu,
-+ __LINE__);
-+ exit(0);
-+ }
-+
-+ for (cpu = 0; cpu < num_online_cpus(); cpu++) {
-+ int j, k;
-+ j = (int) (lstat_control.counts[cpu] =
-+ (lstat_cpu_counts_t *) malloc(countsize));
-+ k = (int) (lstat_control.read_lock_counts[cpu] =
-+ (lstat_read_lock_cpu_counts_t *)
-+ malloc(read_lock_countsize));
-+ if (j * k == 0) {
-+ printf("malloc failure for cpu=%d at line %d in "
-+ "lockmeter.c\n", cpu, __LINE__);
-+ exit(0);
-+ }
-+ }
-+
-+ memset(lstat_control.hashtab, 0, hashsize);
-+ memset(lstat_control.dir, 0, dirsize);
-+
-+ for (cpu = 0; cpu < num_online_cpus(); cpu++) {
-+ memset(lstat_control.counts[cpu], 0, countsize);
-+ memset(lstat_control.read_lock_counts[cpu], 0,
-+ read_lock_countsize);
-+ }
-+}
-+
-+asm(" \
-+.align 4 \
-+.globl __write_lock_failed \
-+__write_lock_failed: \
-+ " LOCK "addl $" RW_LOCK_BIAS_STR ",(%eax) \
-+1: cmpl $" RW_LOCK_BIAS_STR ",(%eax) \
-+ jne 1b \
-+\
-+ " LOCK "subl $" RW_LOCK_BIAS_STR ",(%eax) \
-+ jnz __write_lock_failed \
-+ ret \
-+\
-+\
-+.align 4 \
-+.globl __read_lock_failed \
-+__read_lock_failed: \
-+ lock ; incl (%eax) \
-+1: cmpl $1,(%eax) \
-+ js 1b \
-+\
-+ lock ; decl (%eax) \
-+ js __read_lock_failed \
-+ ret \
-+");
-+#endif
-+
-+EXPORT_SYMBOL(_metered_spin_lock);
-+EXPORT_SYMBOL(_metered_spin_unlock);
-+EXPORT_SYMBOL(_metered_spin_trylock);
-+EXPORT_SYMBOL(_metered_read_lock);
-+EXPORT_SYMBOL(_metered_read_unlock);
-+EXPORT_SYMBOL(_metered_write_lock);
-+EXPORT_SYMBOL(_metered_write_unlock);
---- linux-2.6.0/kernel/Makefile 2003-11-09 16:45:05.000000000 -0800
-+++ 25/kernel/Makefile 2003-12-28 23:26:33.000000000 -0800
-@@ -11,6 +11,7 @@ obj-y = sched.o fork.o exec_domain.o
- obj-$(CONFIG_FUTEX) += futex.o
- obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
- obj-$(CONFIG_SMP) += cpu.o
-+obj-$(CONFIG_LOCKMETER) += lockmeter.o
- obj-$(CONFIG_UID16) += uid16.o
- obj-$(CONFIG_MODULES) += module.o
- obj-$(CONFIG_KALLSYMS) += kallsyms.o
---- linux-2.6.0/kernel/pid.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/kernel/pid.c 2003-12-28 23:21:08.000000000 -0800
-@@ -268,6 +268,9 @@ void switch_exec_pids(task_t *leader, ta
- * machine. From a minimum of 16 slots up to 4096 slots at one gigabyte or
- * more.
- */
-+#ifdef CONFIG_KGDB
-+int kgdb_pid_init_done; /* so we don't call prior to... */
-+#endif
- void __init pidhash_init(void)
- {
- int i, j, pidhash_size;
-@@ -289,6 +292,9 @@ void __init pidhash_init(void)
- for (j = 0; j < pidhash_size; j++)
- INIT_LIST_HEAD(&pid_hash[i][j]);
- }
-+#ifdef CONFIG_KGDB
-+ kgdb_pid_init_done++;
-+#endif
- }
-
- void __init pidmap_init(void)
---- linux-2.6.0/kernel/power/Kconfig 2003-09-27 18:57:47.000000000 -0700
-+++ 25/kernel/power/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -40,7 +40,7 @@ config SOFTWARE_SUSPEND
- involved in suspending. Also in this case there is a risk that buffers
- on disk won't match with saved ones.
-
-- For more information take a look at Documentation/swsusp.txt.
-+ For more information take a look at Documentation/power/swsusp.txt.
-
- config PM_DISK
- bool "Suspend-to-Disk Support"
---- linux-2.6.0/kernel/power/swsusp.c 2003-10-17 15:58:04.000000000 -0700
-+++ 25/kernel/power/swsusp.c 2003-12-28 23:23:06.000000000 -0800
-@@ -33,7 +33,7 @@
- *
- * More state savers are welcome. Especially for the scsi layer...
- *
-- * For TODOs,FIXMEs also look in Documentation/swsusp.txt
-+ * For TODOs,FIXMEs also look in Documentation/power/swsusp.txt
- */
-
- #include <linux/module.h>
---- linux-2.6.0/kernel/printk.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/kernel/printk.c 2003-12-28 23:26:35.000000000 -0800
-@@ -150,6 +150,7 @@ __setup("console=", console_setup);
- static int __init log_buf_len_setup(char *str)
- {
- unsigned long size = memparse(str, &str);
-+ unsigned long flags;
-
- if (size > log_buf_len) {
- unsigned long start, dest_idx, offset;
-@@ -161,7 +162,7 @@ static int __init log_buf_len_setup(char
- goto out;
- }
-
-- spin_lock_irq(&logbuf_lock);
-+ spin_lock_irqsave(&logbuf_lock, flags);
- log_buf_len = size;
- log_buf = new_log_buf;
-
-@@ -175,7 +176,7 @@ static int __init log_buf_len_setup(char
- log_start -= offset;
- con_start -= offset;
- log_end -= offset;
-- spin_unlock_irq(&logbuf_lock);
-+ spin_unlock_irqrestore(&logbuf_lock, flags);
-
- printk("log_buf_len: %d\n", log_buf_len);
- }
-@@ -447,9 +448,13 @@ asmlinkage int printk(const char *fmt, .
- char *p;
- static char printk_buf[1024];
- static int log_level_unknown = 1;
-+ static int printk_cpu = -1;
-
-- if (oops_in_progress) {
-- /* If a crash is occurring, make sure we can't deadlock */
-+ if (oops_in_progress && printk_cpu == smp_processor_id()) {
-+ /*
-+ * If a crash is occurring during printk() on this CPU, make
-+ * sure we can't deadlock
-+ */
- spin_lock_init(&logbuf_lock);
- /* And make sure that we print immediately */
- init_MUTEX(&console_sem);
-@@ -457,6 +462,7 @@ asmlinkage int printk(const char *fmt, .
-
- /* This stops the holder of console_sem just where we want him */
- spin_lock_irqsave(&logbuf_lock, flags);
-+ printk_cpu = smp_processor_id();
-
- /* Emit the output into the temporary buffer */
- va_start(args, fmt);
---- linux-2.6.0/kernel/sched.c 2003-12-17 21:20:03.000000000 -0800
-+++ 25/kernel/sched.c 2003-12-28 23:26:33.000000000 -0800
-@@ -79,13 +79,13 @@
- */
- #define MIN_TIMESLICE ( 10 * HZ / 1000)
- #define MAX_TIMESLICE (200 * HZ / 1000)
--#define ON_RUNQUEUE_WEIGHT 30
--#define CHILD_PENALTY 95
-+#define ON_RUNQUEUE_WEIGHT 30
-+#define CHILD_PENALTY 95
- #define PARENT_PENALTY 100
--#define EXIT_WEIGHT 3
--#define PRIO_BONUS_RATIO 25
-+#define EXIT_WEIGHT 3
-+#define PRIO_BONUS_RATIO 25
- #define MAX_BONUS (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100)
--#define INTERACTIVE_DELTA 2
-+#define INTERACTIVE_DELTA 2
- #define MAX_SLEEP_AVG (AVG_TIMESLICE * MAX_BONUS)
- #define STARVATION_LIMIT (MAX_SLEEP_AVG)
- #define NS_MAX_SLEEP_AVG (JIFFIES_TO_NS(MAX_SLEEP_AVG))
-@@ -143,7 +143,7 @@
- #define TASK_INTERACTIVE(p) \
- ((p)->prio <= (p)->static_prio - DELTA(p))
-
--#define JUST_INTERACTIVE_SLEEP(p) \
-+#define INTERACTIVE_SLEEP(p) \
- (JIFFIES_TO_NS(MAX_SLEEP_AVG * \
- (MAX_BONUS / 2 + DELTA((p)) + 1) / MAX_BONUS - 1))
-
-@@ -168,7 +168,8 @@
- */
-
- #define BASE_TIMESLICE(p) (MIN_TIMESLICE + \
-- ((MAX_TIMESLICE - MIN_TIMESLICE) * (MAX_PRIO-1-(p)->static_prio)/(MAX_USER_PRIO - 1)))
-+ ((MAX_TIMESLICE - MIN_TIMESLICE) * \
-+ (MAX_PRIO-1 - (p)->static_prio) / (MAX_USER_PRIO-1)))
-
- static inline unsigned int task_timeslice(task_t *p)
- {
-@@ -199,11 +200,11 @@ struct prio_array {
- struct runqueue {
- spinlock_t lock;
- unsigned long nr_running, nr_switches, expired_timestamp,
-- nr_uninterruptible;
-+ nr_uninterruptible, timestamp_last_tick;
- task_t *curr, *idle;
- struct mm_struct *prev_mm;
- prio_array_t *active, *expired, arrays[2];
-- int prev_cpu_load[NR_CPUS];
-+ int best_expired_prio, prev_cpu_load[NR_CPUS];
- #ifdef CONFIG_NUMA
- atomic_t *node_nr_running;
- int prev_node_load[MAX_NUMNODES];
-@@ -225,7 +226,7 @@ static DEFINE_PER_CPU(struct runqueue, r
- * Default context-switch locking:
- */
- #ifndef prepare_arch_switch
--# define prepare_arch_switch(rq, next) do { } while(0)
-+# define prepare_arch_switch(rq, next) do { } while (0)
- # define finish_arch_switch(rq, next) spin_unlock_irq(&(rq)->lock)
- # define task_running(rq, p) ((rq)->curr == (p))
- #endif
-@@ -269,9 +270,9 @@ __init void node_nr_running_init(void)
-
- #else /* !CONFIG_NUMA */
-
--# define nr_running_init(rq) do { } while (0)
--# define nr_running_inc(rq) do { (rq)->nr_running++; } while (0)
--# define nr_running_dec(rq) do { (rq)->nr_running--; } while (0)
-+# define nr_running_init(rq) do { } while (0)
-+# define nr_running_inc(rq) do { (rq)->nr_running++; } while (0)
-+# define nr_running_dec(rq) do { (rq)->nr_running--; } while (0)
-
- #endif /* CONFIG_NUMA */
-
-@@ -396,7 +397,7 @@ static void recalc_task_prio(task_t *p,
- * other processes.
- */
- if (p->mm && p->activated != -1 &&
-- sleep_time > JUST_INTERACTIVE_SLEEP(p)){
-+ sleep_time > INTERACTIVE_SLEEP(p)) {
- p->sleep_avg = JIFFIES_TO_NS(MAX_SLEEP_AVG -
- AVG_TIMESLICE);
- if (!HIGH_CREDIT(p))
-@@ -413,37 +414,35 @@ static void recalc_task_prio(task_t *p,
- * one timeslice worth of sleep avg bonus.
- */
- if (LOW_CREDIT(p) &&
-- sleep_time > JIFFIES_TO_NS(task_timeslice(p)))
-- sleep_time =
-- JIFFIES_TO_NS(task_timeslice(p));
-+ sleep_time > JIFFIES_TO_NS(task_timeslice(p)))
-+ sleep_time = JIFFIES_TO_NS(task_timeslice(p));
-
- /*
- * Non high_credit tasks waking from uninterruptible
- * sleep are limited in their sleep_avg rise as they
- * are likely to be cpu hogs waiting on I/O
- */
-- if (p->activated == -1 && !HIGH_CREDIT(p) && p->mm){
-- if (p->sleep_avg >= JUST_INTERACTIVE_SLEEP(p))
-+ if (p->activated == -1 && !HIGH_CREDIT(p) && p->mm) {
-+ if (p->sleep_avg >= INTERACTIVE_SLEEP(p))
- sleep_time = 0;
- else if (p->sleep_avg + sleep_time >=
-- JUST_INTERACTIVE_SLEEP(p)){
-- p->sleep_avg =
-- JUST_INTERACTIVE_SLEEP(p);
-- sleep_time = 0;
-- }
-+ INTERACTIVE_SLEEP(p)) {
-+ p->sleep_avg = INTERACTIVE_SLEEP(p);
-+ sleep_time = 0;
-+ }
- }
-
- /*
- * This code gives a bonus to interactive tasks.
- *
- * The boost works by updating the 'average sleep time'
-- * value here, based on ->timestamp. The more time a task
-- * spends sleeping, the higher the average gets - and the
-- * higher the priority boost gets as well.
-+ * value here, based on ->timestamp. The more time a
-+ * task spends sleeping, the higher the average gets -
-+ * and the higher the priority boost gets as well.
- */
- p->sleep_avg += sleep_time;
-
-- if (p->sleep_avg > NS_MAX_SLEEP_AVG){
-+ if (p->sleep_avg > NS_MAX_SLEEP_AVG) {
- p->sleep_avg = NS_MAX_SLEEP_AVG;
- if (!HIGH_CREDIT(p))
- p->interactive_credit++;
-@@ -470,7 +469,7 @@ static inline void activate_task(task_t
- * This checks to make sure it's not an uninterruptible task
- * that is now waking up.
- */
-- if (!p->activated){
-+ if (!p->activated) {
- /*
- * Tasks which were woken up by interrupts (ie. hw events)
- * are most likely of interactive nature. So we give them
-@@ -480,13 +479,14 @@ static inline void activate_task(task_t
- */
- if (in_interrupt())
- p->activated = 2;
-- else
-- /*
-- * Normal first-time wakeups get a credit too for on-runqueue
-- * time, but it will be weighted down:
-- */
-+ else {
-+ /*
-+ * Normal first-time wakeups get a credit too for
-+ * on-runqueue time, but it will be weighted down:
-+ */
- p->activated = 1;
- }
-+ }
- p->timestamp = now;
-
- __activate_task(p, rq);
-@@ -632,13 +632,14 @@ repeat_lock_task:
- */
- if (unlikely(sync && !task_running(rq, p) &&
- (task_cpu(p) != smp_processor_id()) &&
-- cpu_isset(smp_processor_id(), p->cpus_allowed))) {
-+ cpu_isset(smp_processor_id(),
-+ p->cpus_allowed))) {
-
- set_task_cpu(p, smp_processor_id());
- task_rq_unlock(rq, &flags);
- goto repeat_lock_task;
- }
-- if (old_state == TASK_UNINTERRUPTIBLE){
-+ if (old_state == TASK_UNINTERRUPTIBLE) {
- rq->nr_uninterruptible--;
- /*
- * Tasks on involuntary sleep don't earn
-@@ -663,7 +664,8 @@ repeat_lock_task:
- }
- int wake_up_process(task_t * p)
- {
-- return try_to_wake_up(p, TASK_STOPPED | TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0);
-+ return try_to_wake_up(p, TASK_STOPPED |
-+ TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0);
- }
-
- EXPORT_SYMBOL(wake_up_process);
-@@ -674,6 +676,54 @@ int wake_up_state(task_t *p, unsigned in
- }
-
- /*
-+ * Perform scheduler related setup for a newly forked process p.
-+ * p is forked by current.
-+ */
-+void sched_fork(task_t *p)
-+{
-+ p->state = TASK_UNINTERRUPTIBLE;
-+ INIT_LIST_HEAD(&p->run_list);
-+ p->array = NULL;
-+ spin_lock_init(&p->switch_lock);
-+#ifdef CONFIG_PREEMPT
-+ /*
-+ * During context-switch we hold precisely one spinlock, which
-+ * schedule_tail drops. (in the common case it's this_rq()->lock,
-+ * but it also can be p->switch_lock.) So we compensate with a count
-+ * of 1. Also, we want to start with kernel preemption disabled.
-+ */
-+ p->thread_info->preempt_count = 1;
-+#endif
-+ /*
-+ * Share the timeslice between parent and child, thus the
-+ * total amount of pending timeslices in the system doesn't change,
-+ * resulting in more scheduling fairness.
-+ */
-+ local_irq_disable();
-+ p->time_slice = (current->time_slice + 1) >> 1;
-+ /*
-+ * The remainder of the first timeslice might be recovered by
-+ * the parent if the child exits early enough.
-+ */
-+ p->first_time_slice = 1;
-+ current->time_slice >>= 1;
-+ p->timestamp = sched_clock();
-+ if (!current->time_slice) {
-+ /*
-+ * This case is rare, it happens when the parent has only
-+ * a single jiffy left from its timeslice. Taking the
-+ * runqueue lock is not a problem.
-+ */
-+ current->time_slice = 1;
-+ preempt_disable();
-+ scheduler_tick(0, 0);
-+ local_irq_enable();
-+ preempt_enable();
-+ } else
-+ local_irq_enable();
-+}
-+
-+/*
- * wake_up_forked_process - wake up a freshly forked process.
- *
- * This function will do some initial scheduler statistics housekeeping
-@@ -799,7 +849,8 @@ asmlinkage void schedule_tail(task_t *pr
- * context_switch - switch to the new MM and the new
- * thread's register state.
- */
--static inline task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next)
-+static inline
-+task_t * context_switch(runqueue_t *rq, task_t *prev, task_t *next)
- {
- struct mm_struct *mm = next->mm;
- struct mm_struct *oldmm = prev->active_mm;
-@@ -947,10 +998,10 @@ static int sched_best_cpu(struct task_st
- minload = 10000000;
- for_each_node_with_cpus(i) {
- /*
-- * Node load is always divided by nr_cpus_node to normalise
-+ * Node load is always divided by nr_cpus_node to normalise
- * load values in case cpu count differs from node to node.
- * We first multiply node_nr_running by 10 to get a little
-- * better resolution.
-+ * better resolution.
- */
- load = 10 * atomic_read(&node_nr_running[i]) / nr_cpus_node(i);
- if (load < minload) {
-@@ -989,7 +1040,7 @@ void sched_balance_exec(void)
- * load_{t} = load_{t-1}/2 + nr_node_running_{t}
- * This way sudden load peaks are flattened out a bit.
- * Node load is divided by nr_cpus_node() in order to compare nodes
-- * of different cpu count but also [first] multiplied by 10 to
-+ * of different cpu count but also [first] multiplied by 10 to
- * provide better resolution.
- */
- static int find_busiest_node(int this_node)
-@@ -1027,8 +1078,10 @@ static int find_busiest_node(int this_no
- * this_rq is locked already. Recalculate nr_running if we have to
- * drop the runqueue lock.
- */
--static inline unsigned int double_lock_balance(runqueue_t *this_rq,
-- runqueue_t *busiest, int this_cpu, int idle, unsigned int nr_running)
-+static inline
-+unsigned int double_lock_balance(runqueue_t *this_rq, runqueue_t *busiest,
-+ int this_cpu, int idle,
-+ unsigned int nr_running)
- {
- if (unlikely(!spin_trylock(&busiest->lock))) {
- if (busiest < this_rq) {
-@@ -1036,7 +1089,8 @@ static inline unsigned int double_lock_b
- spin_lock(&busiest->lock);
- spin_lock(&this_rq->lock);
- /* Need to recalculate nr_running */
-- if (idle || (this_rq->nr_running > this_rq->prev_cpu_load[this_cpu]))
-+ if (idle || (this_rq->nr_running >
-+ this_rq->prev_cpu_load[this_cpu]))
- nr_running = this_rq->nr_running;
- else
- nr_running = this_rq->prev_cpu_load[this_cpu];
-@@ -1049,7 +1103,9 @@ static inline unsigned int double_lock_b
- /*
- * find_busiest_queue - find the busiest runqueue among the cpus in cpumask.
- */
--static inline runqueue_t *find_busiest_queue(runqueue_t *this_rq, int this_cpu, int idle, int *imbalance, cpumask_t cpumask)
-+static inline
-+runqueue_t *find_busiest_queue(runqueue_t *this_rq, int this_cpu, int idle,
-+ int *imbalance, cpumask_t cpumask)
- {
- int nr_running, load, max_load, i;
- runqueue_t *busiest, *rq_src;
-@@ -1061,10 +1117,11 @@ static inline runqueue_t *find_busiest_q
- * the lock held.
- *
- * We fend off statistical fluctuations in runqueue lengths by
-- * saving the runqueue length during the previous load-balancing
-- * operation and using the smaller one the current and saved lengths.
-- * If a runqueue is long enough for a longer amount of time then
-- * we recognize it and pull tasks from it.
-+ * saving the runqueue length (as seen by the balancing CPU) during
-+ * the previous load-balancing operation and using the smaller one
-+ * of the current and saved lengths. If a runqueue is long enough
-+ * for a longer amount of time then we recognize it and pull tasks
-+ * from it.
- *
- * The 'current runqueue length' is a statistical maximum variable,
- * for that one we take the longer one - to avoid fluctuations in
-@@ -1111,7 +1168,8 @@ static inline runqueue_t *find_busiest_q
- goto out;
- }
-
-- nr_running = double_lock_balance(this_rq, busiest, this_cpu, idle, nr_running);
-+ nr_running = double_lock_balance(this_rq, busiest, this_cpu,
-+ idle, nr_running);
- /*
- * Make sure nothing changed since we checked the
- * runqueue length.
-@@ -1128,13 +1186,17 @@ out:
- * pull_task - move a task from a remote runqueue to the local runqueue.
- * Both runqueues must be locked.
- */
--static inline void pull_task(runqueue_t *src_rq, prio_array_t *src_array, task_t *p, runqueue_t *this_rq, int this_cpu)
-+static inline
-+void pull_task(runqueue_t *src_rq, prio_array_t *src_array, task_t *p,
-+ runqueue_t *this_rq, int this_cpu)
- {
- dequeue_task(p, src_array);
- nr_running_dec(src_rq);
- set_task_cpu(p, this_cpu);
- nr_running_inc(this_rq);
- enqueue_task(p, this_rq->active);
-+ p->timestamp = sched_clock() -
-+ (src_rq->timestamp_last_tick - p->timestamp);
- /*
- * Note that idle threads have a prio of MAX_PRIO, for this test
- * to be always true for them.
-@@ -1144,25 +1206,25 @@ static inline void pull_task(runqueue_t
- }
-
- /*
-- * Previously:
-- *
-- * #define CAN_MIGRATE_TASK(p,rq,this_cpu) \
-- * ((!idle || (NS_TO_JIFFIES(now - (p)->timestamp) > \
-- * cache_decay_ticks)) && !task_running(rq, p) && \
-- * cpu_isset(this_cpu, (p)->cpus_allowed))
-+ * can_migrate_task - may task p from runqueue rq be migrated to this_cpu?
- */
--
--static inline int
--can_migrate_task(task_t *tsk, runqueue_t *rq, int this_cpu, int idle)
-+static inline
-+int can_migrate_task(task_t *tsk, runqueue_t *rq, int this_cpu, int idle)
- {
-- unsigned long delta = sched_clock() - tsk->timestamp;
-+ unsigned long delta = rq->timestamp_last_tick - tsk->timestamp;
-
-- if (!idle && (delta <= JIFFIES_TO_NS(cache_decay_ticks)))
-- return 0;
-+ /*
-+ * We do not migrate tasks that are:
-+ * 1) running (obviously), or
-+ * 2) cannot be migrated to this CPU due to cpus_allowed, or
-+ * 3) are cache-hot on their current CPU.
-+ */
- if (task_running(rq, tsk))
- return 0;
- if (!cpu_isset(this_cpu, tsk->cpus_allowed))
- return 0;
-+ if (!idle && (delta <= JIFFIES_TO_NS(cache_decay_ticks)))
-+ return 0;
- return 1;
- }
-
-@@ -1182,7 +1244,8 @@ static void load_balance(runqueue_t *thi
- struct list_head *head, *curr;
- task_t *tmp;
-
-- busiest = find_busiest_queue(this_rq, this_cpu, idle, &imbalance, cpumask);
-+ busiest = find_busiest_queue(this_rq, this_cpu, idle,
-+ &imbalance, cpumask);
- if (!busiest)
- goto out;
-
-@@ -1224,13 +1287,6 @@ skip_bitmap:
- skip_queue:
- tmp = list_entry(curr, task_t, run_list);
-
-- /*
-- * We do not migrate tasks that are:
-- * 1) running (obviously), or
-- * 2) cannot be migrated to this CPU due to cpus_allowed, or
-- * 3) are cache-hot on their current CPU.
-- */
--
- curr = curr->prev;
-
- if (!can_migrate_task(tmp, busiest, this_cpu, idle)) {
-@@ -1240,6 +1296,8 @@ skip_queue:
- goto skip_bitmap;
- }
- pull_task(busiest, array, tmp, this_rq, this_cpu);
-+
-+ /* Only migrate one task if we are idle */
- if (!idle && --imbalance) {
- if (curr != head)
- goto skip_queue;
-@@ -1329,7 +1387,7 @@ static inline void rebalance_tick(runque
- }
- #endif
-
--DEFINE_PER_CPU(struct kernel_stat, kstat) = { { 0 } };
-+DEFINE_PER_CPU(struct kernel_stat, kstat);
-
- EXPORT_PER_CPU_SYMBOL(kstat);
-
-@@ -1340,12 +1398,14 @@ EXPORT_PER_CPU_SYMBOL(kstat);
- * interactivity of a task if the first expired task had to wait more
- * than a 'reasonable' amount of time. This deadline timeout is
- * load-dependent, as the frequency of array switched decreases with
-- * increasing number of running tasks:
-+ * increasing number of running tasks. We also ignore the interactivity
-+ * if a better static_prio task has expired:
- */
- #define EXPIRED_STARVING(rq) \
-- (STARVATION_LIMIT && ((rq)->expired_timestamp && \
-+ ((STARVATION_LIMIT && ((rq)->expired_timestamp && \
- (jiffies - (rq)->expired_timestamp >= \
-- STARVATION_LIMIT * ((rq)->nr_running) + 1)))
-+ STARVATION_LIMIT * ((rq)->nr_running) + 1))) || \
-+ ((rq)->curr->static_prio > (rq)->best_expired_prio))
-
- /*
- * This function gets called by the timer code, with HZ frequency.
-@@ -1361,6 +1421,8 @@ void scheduler_tick(int user_ticks, int
- runqueue_t *rq = this_rq();
- task_t *p = current;
-
-+ rq->timestamp_last_tick = sched_clock();
-+
- if (rcu_pending(cpu))
- rcu_check_callbacks(cpu, user_ticks);
-
-@@ -1427,6 +1489,8 @@ void scheduler_tick(int user_ticks, int
- rq->expired_timestamp = jiffies;
- if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) {
- enqueue_task(p, rq->expired);
-+ if (p->static_prio < rq->best_expired_prio)
-+ rq->best_expired_prio = p->static_prio;
- } else
- enqueue_task(p, rq->active);
- } else {
-@@ -1470,6 +1534,7 @@ void scheduling_functions_start_here(voi
- */
- asmlinkage void schedule(void)
- {
-+ long *switch_count;
- task_t *prev, *next;
- runqueue_t *rq;
- prio_array_t *array;
-@@ -1516,32 +1581,25 @@ need_resched:
- * if entering off of a kernel preemption go straight
- * to picking the next task.
- */
-- if (unlikely(preempt_count() & PREEMPT_ACTIVE))
-- goto pick_next_task;
--
-- switch (prev->state) {
-- case TASK_INTERRUPTIBLE:
-- if (unlikely(signal_pending(prev))) {
-+ switch_count = &prev->nivcsw;
-+ if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
-+ switch_count = &prev->nvcsw;
-+ if (unlikely((prev->state & TASK_INTERRUPTIBLE) &&
-+ unlikely(signal_pending(prev))))
- prev->state = TASK_RUNNING;
-- break;
-- }
-- default:
-- deactivate_task(prev, rq);
-- prev->nvcsw++;
-- break;
-- case TASK_RUNNING:
-- prev->nivcsw++;
-+ else
-+ deactivate_task(prev, rq);
- }
--pick_next_task:
-+
- if (unlikely(!rq->nr_running)) {
- #ifdef CONFIG_SMP
- load_balance(rq, 1, cpu_to_node_mask(smp_processor_id()));
-- if (rq->nr_running)
-- goto pick_next_task;
- #endif
-- next = rq->idle;
-- rq->expired_timestamp = 0;
-- goto switch_tasks;
-+ if (!rq->nr_running) {
-+ next = rq->idle;
-+ rq->expired_timestamp = 0;
-+ goto switch_tasks;
-+ }
- }
-
- array = rq->active;
-@@ -1553,6 +1611,7 @@ pick_next_task:
- rq->expired = array;
- array = rq->active;
- rq->expired_timestamp = 0;
-+ rq->best_expired_prio = MAX_PRIO;
- }
-
- idx = sched_find_first_bit(array->bitmap);
-@@ -1577,7 +1636,7 @@ switch_tasks:
- RCU_qsctr(task_cpu(prev))++;
-
- prev->sleep_avg -= run_time;
-- if ((long)prev->sleep_avg <= 0){
-+ if ((long)prev->sleep_avg <= 0) {
- prev->sleep_avg = 0;
- if (!(HIGH_CREDIT(prev) || LOW_CREDIT(prev)))
- prev->interactive_credit--;
-@@ -1588,6 +1647,7 @@ switch_tasks:
- next->timestamp = now;
- rq->nr_switches++;
- rq->curr = next;
-+ ++*switch_count;
-
- prepare_arch_switch(rq, next);
- prev = context_switch(rq, prev, next);
-@@ -1653,7 +1713,8 @@ EXPORT_SYMBOL(default_wake_function);
- * started to run but is not in state TASK_RUNNING. try_to_wake_up() returns
- * zero in this (rare) case, and we handle it by continuing to scan the queue.
- */
--static void __wake_up_common(wait_queue_head_t *q, unsigned int mode, int nr_exclusive, int sync)
-+static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
-+ int nr_exclusive, int sync)
- {
- struct list_head *tmp, *next;
-
-@@ -1730,7 +1791,8 @@ void complete(struct completion *x)
-
- spin_lock_irqsave(&x->wait.lock, flags);
- x->done++;
-- __wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, 0);
-+ __wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE,
-+ 1, 0);
- spin_unlock_irqrestore(&x->wait.lock, flags);
- }
-
-@@ -1742,7 +1804,8 @@ void complete_all(struct completion *x)
-
- spin_lock_irqsave(&x->wait.lock, flags);
- x->done += UINT_MAX/2;
-- __wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0, 0);
-+ __wake_up_common(&x->wait, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE,
-+ 0, 0);
- spin_unlock_irqrestore(&x->wait.lock, flags);
- }
-
-@@ -1769,9 +1832,9 @@ void wait_for_completion(struct completi
-
- EXPORT_SYMBOL(wait_for_completion);
-
--#define SLEEP_ON_VAR \
-- unsigned long flags; \
-- wait_queue_t wait; \
-+#define SLEEP_ON_VAR \
-+ unsigned long flags; \
-+ wait_queue_t wait; \
- init_waitqueue_entry(&wait, current);
-
- #define SLEEP_ON_HEAD \
-@@ -1779,9 +1842,9 @@ EXPORT_SYMBOL(wait_for_completion);
- __add_wait_queue(q, &wait); \
- spin_unlock(&q->lock);
-
--#define SLEEP_ON_TAIL \
-- spin_lock_irq(&q->lock); \
-- __remove_wait_queue(q, &wait); \
-+#define SLEEP_ON_TAIL \
-+ spin_lock_irq(&q->lock); \
-+ __remove_wait_queue(q, &wait); \
- spin_unlock_irqrestore(&q->lock, flags);
-
- void interruptible_sleep_on(wait_queue_head_t *q)
-@@ -1891,6 +1954,13 @@ out_unlock:
-
- EXPORT_SYMBOL(set_user_nice);
-
-+#if defined( CONFIG_KGDB)
-+struct task_struct * kgdb_get_idle(int this_cpu)
-+{
-+ return cpu_rq(this_cpu)->idle;
-+}
-+#endif
-+
- #ifndef __alpha__
-
- /*
-@@ -1906,9 +1976,9 @@ asmlinkage long sys_nice(int increment)
- long nice;
-
- /*
-- * Setpriority might change our priority at the same moment.
-- * We don't have to worry. Conceptually one call occurs first
-- * and we have a single winner.
-+ * Setpriority might change our priority at the same moment.
-+ * We don't have to worry. Conceptually one call occurs first
-+ * and we have a single winner.
- */
- if (increment < 0) {
- if (!capable(CAP_SYS_NICE))
-@@ -2088,7 +2158,7 @@ out_nounlock:
- * @param: structure containing the new RT priority.
- */
- asmlinkage long sys_sched_setscheduler(pid_t pid, int policy,
-- struct sched_param __user *param)
-+ struct sched_param __user *param)
- {
- return setscheduler(pid, policy, param);
- }
-@@ -2395,7 +2465,8 @@ asmlinkage long sys_sched_get_priority_m
- * this syscall writes the default timeslice value of a given process
- * into the user-space timespec buffer. A value of '0' means infinity.
- */
--asmlinkage long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval)
-+asmlinkage
-+long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval)
- {
- int retval = -EINVAL;
- struct timespec t;
-@@ -2445,17 +2516,16 @@ static inline struct task_struct *younge
-
- static void show_task(task_t * p)
- {
-- unsigned long free = 0;
- task_t *relative;
-- int state;
-- static const char * stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
-+ unsigned state;
-+ static const char *stat_nam[] = { "R", "S", "D", "T", "Z", "W" };
-
- printk("%-13.13s ", p->comm);
- state = p->state ? __ffs(p->state) + 1 : 0;
-- if (((unsigned) state) < sizeof(stat_nam)/sizeof(char *))
-+ if (state < ARRAY_SIZE(stat_nam))
- printk(stat_nam[state]);
- else
-- printk(" ");
-+ printk("?");
- #if (BITS_PER_LONG == 32)
- if (p == current)
- printk(" current ");
-@@ -2467,13 +2537,7 @@ static void show_task(task_t * p)
- else
- printk(" %016lx ", thread_saved_pc(p));
- #endif
-- {
-- unsigned long * n = (unsigned long *) (p->thread_info+1);
-- while (!*n)
-- n++;
-- free = (unsigned long) n - (unsigned long)(p->thread_info+1);
-- }
-- printk("%5lu %5d %6d ", free, p->pid, p->parent->pid);
-+ printk("%5d %6d ", p->pid, p->parent->pid);
- if ((relative = eldest_child(p)))
- printk("%5d ", relative->pid);
- else
-@@ -2500,12 +2564,12 @@ void show_state(void)
-
- #if (BITS_PER_LONG == 32)
- printk("\n"
-- " free sibling\n");
-- printk(" task PC stack pid father child younger older\n");
-+ " sibling\n");
-+ printk(" task PC pid father child younger older\n");
- #else
- printk("\n"
-- " free sibling\n");
-- printk(" task PC stack pid father child younger older\n");
-+ " sibling\n");
-+ printk(" task PC pid father child younger older\n");
- #endif
- read_lock(&tasklist_lock);
- do_each_thread(g, p) {
-@@ -2639,7 +2703,9 @@ static void move_task_away(struct task_s
- if (p->prio < rq_dest->curr->prio)
- resched_task(rq_dest->curr);
- }
-- out:
-+ p->timestamp = rq_dest->timestamp_last_tick;
-+
-+out:
- double_rq_unlock(this_rq(), rq_dest);
- local_irq_restore(flags);
- }
-@@ -2708,11 +2774,10 @@ static int migration_thread(void * data)
- * migration_call - callback that gets triggered when a CPU is added.
- * Here we can start up the necessary migration thread for the new CPU.
- */
--static int migration_call(struct notifier_block *nfb,
-- unsigned long action,
-+static int migration_call(struct notifier_block *nfb, unsigned long action,
- void *hcpu)
- {
-- long cpu = (long) hcpu;
-+ long cpu = (long)hcpu;
- migration_startup_t startup;
-
- switch (action) {
-@@ -2741,7 +2806,8 @@ static int migration_call(struct notifie
- return NOTIFY_OK;
- }
-
--static struct notifier_block migration_notifier = { &migration_call, NULL, 0 };
-+static struct notifier_block migration_notifier
-+ = { .notifier_call = &migration_call };
-
- __init int migration_init(void)
- {
-@@ -2777,7 +2843,7 @@ static void kstat_init_cpu(int cpu)
- }
-
- static int __devinit kstat_cpu_notify(struct notifier_block *self,
-- unsigned long action, void *hcpu)
-+ unsigned long action, void *hcpu)
- {
- int cpu = (unsigned long)hcpu;
- switch(action) {
-@@ -2791,13 +2857,14 @@ static int __devinit kstat_cpu_notify(st
- }
-
- static struct notifier_block __devinitdata kstat_nb = {
-- .notifier_call = kstat_cpu_notify,
-- .next = NULL,
-+ .notifier_call = kstat_cpu_notify,
-+ .next = NULL,
- };
-
--__init static void init_kstat(void) {
-+__init static void init_kstat(void)
-+{
- kstat_cpu_notify(&kstat_nb, (unsigned long)CPU_UP_PREPARE,
-- (void *)(long)smp_processor_id());
-+ (void *)(long)smp_processor_id());
- register_cpu_notifier(&kstat_nb);
- }
-
-@@ -2814,6 +2881,8 @@ void __init sched_init(void)
- rq = cpu_rq(i);
- rq->active = rq->arrays;
- rq->expired = rq->arrays + 1;
-+ rq->best_expired_prio = MAX_PRIO;
-+
- spin_lock_init(&rq->lock);
- INIT_LIST_HEAD(&rq->migration_queue);
- atomic_set(&rq->nr_iowait, 0);
-@@ -2861,7 +2930,7 @@ void __might_sleep(char *file, int line)
- printk(KERN_ERR "Debug: sleeping function called from invalid"
- " context at %s:%d\n", file, line);
- printk("in_atomic():%d, irqs_disabled():%d\n",
-- in_atomic(), irqs_disabled());
-+ in_atomic(), irqs_disabled());
- dump_stack();
- }
- #endif
---- linux-2.6.0/kernel/softirq.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/kernel/softirq.c 2003-12-28 23:22:00.000000000 -0800
-@@ -117,11 +117,22 @@ EXPORT_SYMBOL(do_softirq);
-
- void local_bh_enable(void)
- {
-+ if (in_irq()) {
-+ printk("local_bh_enable() was called in hard irq context. "
-+ "This is probably a bug\n");
-+ dump_stack();
-+ }
-+
- __local_bh_enable();
-- WARN_ON(irqs_disabled());
-- if (unlikely(!in_interrupt() &&
-- local_softirq_pending()))
-+ if (unlikely(!in_interrupt() && local_softirq_pending())) {
-+ if (irqs_disabled()) {
-+ printk("local_bh_enable() was called with local "
-+ "interrupts disabled. This is probably a"
-+ " bug\n");
-+ dump_stack();
-+ }
- invoke_softirq();
-+ }
- preempt_check_resched();
- }
- EXPORT_SYMBOL(local_bh_enable);
---- linux-2.6.0/kernel/sys.c 2003-10-25 14:45:46.000000000 -0700
-+++ 25/kernel/sys.c 2003-12-28 23:22:12.000000000 -0800
-@@ -1323,8 +1323,6 @@ asmlinkage long sys_setrlimit(unsigned i
- * either stopped or zombied. In the zombied case the task won't get
- * reaped till shortly after the call to getrusage(), in both cases the
- * task being examined is in a frozen state so the counters won't change.
-- *
-- * FIXME! Get the fault counts properly!
- */
- int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
- {
---- linux-2.6.0/kernel/sysctl.c 2003-11-09 16:45:05.000000000 -0800
-+++ 25/kernel/sysctl.c 2003-12-28 23:26:39.000000000 -0800
-@@ -794,6 +794,22 @@ static ctl_table fs_table[] = {
- .mode = 0644,
- .proc_handler = &proc_dointvec,
- },
-+ {
-+ .ctl_name = FS_AIO_NR,
-+ .procname = "aio-nr",
-+ .data = &aio_nr,
-+ .maxlen = sizeof(aio_nr),
-+ .mode = 0444,
-+ .proc_handler = &proc_dointvec,
-+ },
-+ {
-+ .ctl_name = FS_AIO_MAX_NR,
-+ .procname = "aio-max-nr",
-+ .data = &aio_max_nr,
-+ .maxlen = sizeof(aio_max_nr),
-+ .mode = 0644,
-+ .proc_handler = &proc_dointvec,
-+ },
- { .ctl_name = 0 }
- };
-
---- linux-2.6.0/lib/inflate.c 2003-09-27 18:57:47.000000000 -0700
-+++ 25/lib/inflate.c 2003-12-28 23:22:52.000000000 -0800
-@@ -221,7 +221,7 @@ STATIC const ush mask_bits[] = {
- 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
- };
-
--#define NEXTBYTE() (uch)get_byte()
-+#define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; })
- #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}}
- #define DUMPBITS(n) {b>>=(n);k-=(n);}
-
-@@ -620,6 +620,9 @@ STATIC int inflate_codes(
-
- /* done */
- return 0;
-+
-+ underrun:
-+ return 4; /* Input underrun */
- }
-
-
-@@ -676,6 +679,9 @@ DEBG("<stor");
-
- DEBG(">");
- return 0;
-+
-+ underrun:
-+ return 4; /* Input underrun */
- }
-
-
-@@ -908,6 +914,9 @@ DEBG("dyn7 ");
-
- DEBG(">");
- return 0;
-+
-+ underrun:
-+ return 4; /* Input underrun */
- }
-
-
-@@ -956,6 +965,9 @@ STATIC int inflate_block(
-
- /* bad block type */
- return 2;
-+
-+ underrun:
-+ return 4; /* Input underrun */
- }
-
-
-@@ -1079,9 +1091,9 @@ static int gunzip(void)
- ulg orig_len = 0; /* original uncompressed length */
- int res;
-
-- magic[0] = (unsigned char)get_byte();
-- magic[1] = (unsigned char)get_byte();
-- method = (unsigned char)get_byte();
-+ magic[0] = NEXTBYTE();
-+ magic[1] = NEXTBYTE();
-+ method = NEXTBYTE();
-
- if (magic[0] != 037 ||
- ((magic[1] != 0213) && (magic[1] != 0236))) {
-@@ -1108,29 +1120,29 @@ static int gunzip(void)
- error("Input has invalid flags");
- return -1;
- }
-- (ulg)get_byte(); /* Get timestamp */
-- ((ulg)get_byte()) << 8;
-- ((ulg)get_byte()) << 16;
-- ((ulg)get_byte()) << 24;
-+ NEXTBYTE(); /* Get timestamp */
-+ NEXTBYTE();
-+ NEXTBYTE();
-+ NEXTBYTE();
-
-- (void)get_byte(); /* Ignore extra flags for the moment */
-- (void)get_byte(); /* Ignore OS type for the moment */
-+ (void)NEXTBYTE(); /* Ignore extra flags for the moment */
-+ (void)NEXTBYTE(); /* Ignore OS type for the moment */
-
- if ((flags & EXTRA_FIELD) != 0) {
-- unsigned len = (unsigned)get_byte();
-- len |= ((unsigned)get_byte())<<8;
-- while (len--) (void)get_byte();
-+ unsigned len = (unsigned)NEXTBYTE();
-+ len |= ((unsigned)NEXTBYTE())<<8;
-+ while (len--) (void)NEXTBYTE();
- }
-
- /* Get original file name if it was truncated */
- if ((flags & ORIG_NAME) != 0) {
- /* Discard the old name */
-- while (get_byte() != 0) /* null */ ;
-+ while (NEXTBYTE() != 0) /* null */ ;
- }
-
- /* Discard file comment if any */
- if ((flags & COMMENT) != 0) {
-- while (get_byte() != 0) /* null */ ;
-+ while (NEXTBYTE() != 0) /* null */ ;
- }
-
- /* Decompress */
-@@ -1147,6 +1159,9 @@ static int gunzip(void)
- case 3:
- error("out of memory");
- break;
-+ case 4:
-+ error("out of input data");
-+ break;
- default:
- error("invalid compressed format (other)");
- }
-@@ -1157,15 +1172,15 @@ static int gunzip(void)
- /* crc32 (see algorithm.doc)
- * uncompressed input size modulo 2^32
- */
-- orig_crc = (ulg) get_byte();
-- orig_crc |= (ulg) get_byte() << 8;
-- orig_crc |= (ulg) get_byte() << 16;
-- orig_crc |= (ulg) get_byte() << 24;
-+ orig_crc = (ulg) NEXTBYTE();
-+ orig_crc |= (ulg) NEXTBYTE() << 8;
-+ orig_crc |= (ulg) NEXTBYTE() << 16;
-+ orig_crc |= (ulg) NEXTBYTE() << 24;
-
-- orig_len = (ulg) get_byte();
-- orig_len |= (ulg) get_byte() << 8;
-- orig_len |= (ulg) get_byte() << 16;
-- orig_len |= (ulg) get_byte() << 24;
-+ orig_len = (ulg) NEXTBYTE();
-+ orig_len |= (ulg) NEXTBYTE() << 8;
-+ orig_len |= (ulg) NEXTBYTE() << 16;
-+ orig_len |= (ulg) NEXTBYTE() << 24;
-
- /* Validate decompression */
- if (orig_crc != CRC_VALUE) {
-@@ -1177,6 +1192,10 @@ static int gunzip(void)
- return -1;
- }
- return 0;
-+
-+ underrun: /* NEXTBYTE() goto's here if needed */
-+ error("out of input data");
-+ return -1;
- }
-
-
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/lib/int_sqrt.c 2003-12-28 23:21:48.000000000 -0800
-@@ -0,0 +1,32 @@
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+
-+/**
-+ * int_sqrt - rough approximation to sqrt
-+ * @x: integer of which to calculate the sqrt
-+ *
-+ * A very rough approximation to the sqrt() function.
-+ */
-+unsigned long int_sqrt(unsigned long x)
-+{
-+ unsigned long op, res, one;
-+
-+ op = x;
-+ res = 0;
-+
-+ one = 1 << 30;
-+ while (one > op)
-+ one >>= 2;
-+
-+ while (one != 0) {
-+ if (op >= res + one) {
-+ op = op - (res + one);
-+ res = res + 2 * one;
-+ }
-+ res /= 2;
-+ one /= 4;
-+ }
-+ return res;
-+}
-+EXPORT_SYMBOL(int_sqrt);
---- linux-2.6.0/lib/Makefile 2003-11-23 19:03:02.000000000 -0800
-+++ 25/lib/Makefile 2003-12-28 23:22:10.000000000 -0800
-@@ -5,7 +5,7 @@
-
- lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \
- bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
-- kobject.o idr.o div64.o parser.o
-+ kobject.o idr.o div64.o parser.o int_sqrt.o mask.o
-
- lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
- lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/lib/mask.c 2003-12-28 23:22:10.000000000 -0800
-@@ -0,0 +1,178 @@
-+/*
-+ * lib/mask.c
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2003 Silicon Graphics, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * Routines to manipulate multi-word bit masks, such as cpumasks.
-+ *
-+ * The ascii representation of multi-word bit masks displays each
-+ * 32bit word in hex (not zero filled), and for masks longer than
-+ * one word, uses a comma separator between words. Words are
-+ * displayed in big-endian order most significant first. And hex
-+ * digits within a word are also in big-endian order, of course.
-+ *
-+ * Examples:
-+ * A mask with just bit 0 set displays as "1".
-+ * A mask with just bit 127 set displays as "80000000,0,0,0".
-+ * A mask with just bit 64 set displays as "1,0,0".
-+ * A mask with bits 0, 1, 2, 4, 8, 16, 32 and 64 set displays
-+ * as "1,1,10117". The first "1" is for bit 64, the second
-+ * for bit 32, the third for bit 16, and so forth, to the
-+ * "7", which is for bits 2, 1 and 0.
-+ * A mask with bits 32 through 39 set displays as "ff,0".
-+ *
-+ * The internal binary representation of masks is as one or
-+ * an array of unsigned longs, perhaps wrapped in a struct for
-+ * convenient use as an lvalue. The following code doesn't know
-+ * about any such struct details, relying on inline macros in
-+ * files such as cpumask.h to pass in an unsigned long pointer
-+ * and a length (in bytes), describing the mask contents.
-+ * The 32bit words in the array are in little-endian order,
-+ * low order word first. Beware that this is the reverse order
-+ * of the ascii representation.
-+ *
-+ * Even though the size of the input mask is provided in bytes,
-+ * the following code may assume that the mask is a multiple of
-+ * 32 or 64 bit words long, and ignore any fractional portion
-+ * of a word at the end. The main reason the size is passed in
-+ * bytes is because it is so easy to write 'sizeof(somemask_t)'
-+ * in the macros.
-+ *
-+ * Masks are not a single,simple type, like classic 'C'
-+ * nul-term strings. Rather they are a family of types, one
-+ * for each different length. Inline macros are used to pick
-+ * up the actual length, where it is known to the compiler, and
-+ * pass it down to these routines, which work on any specified
-+ * length array of unsigned longs. Poor man's templates.
-+ *
-+ * Many of the inline macros don't call into the following
-+ * routines. Some of them call into other kernel routines,
-+ * such as memset(), set_bit() or ffs(). Some of them can
-+ * accomplish their task right inline, such as returning the
-+ * size or address of the unsigned long array, or optimized
-+ * versions of the macros for the most common case of an array
-+ * of a single unsigned long.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/ctype.h>
-+#include <linux/slab.h>
-+#include <linux/errno.h>
-+#include <linux/gfp.h>
-+#include <asm/uaccess.h>
-+
-+#define MAX_HEX_PER_BYTE 4 /* dont need > 4 hex chars to encode byte */
-+#define BASE 16 /* masks are input in hex (base 16) */
-+#define NUL ((char)'\0') /* nul-terminator */
-+
-+/**
-+ * __mask_snprintf_len - represent multi-word bit mask as string.
-+ * @buf: The buffer to place the result into
-+ * @buflen: The size of the buffer, including the trailing null space
-+ * @maskp: Points to beginning of multi-word bit mask.
-+ * @maskbytes: Number of bytes in bit mask at maskp.
-+ *
-+ * This routine is expected to be called from a macro such as:
-+ *
-+ * #define cpumask_snprintf(buf, buflen, mask) \
-+ * __mask_snprintf_len(buf, buflen, cpus_addr(mask), sizeof(mask))
-+ */
-+
-+int __mask_snprintf_len(char *buf, unsigned int buflen,
-+ const unsigned long *maskp, unsigned int maskbytes)
-+{
-+ u32 *wordp = (u32 *)maskp;
-+ int i = maskbytes/sizeof(u32) - 1;
-+ int len = 0;
-+ char *sep = "";
-+
-+ while (i >= 1 && wordp[i] == 0)
-+ i--;
-+ while (i >= 0) {
-+ len += snprintf(buf+len, buflen-len, "%s%x", sep, wordp[i]);
-+ sep = ",";
-+ i--;
-+ }
-+ return len;
-+}
-+
-+/**
-+ * __mask_parse_len - parse user string into maskbytes mask at maskp
-+ * @ubuf: The user buffer from which to take the string
-+ * @ubuflen: The size of this buffer, including the terminating char
-+ * @maskp: Place resulting mask (array of unsigned longs) here
-+ * @masklen: Construct mask at @maskp to have exactly @masklen bytes
-+ *
-+ * @masklen is a multiple of sizeof(unsigned long). A mask of
-+ * @masklen bytes is constructed starting at location @maskp.
-+ * The value of this mask is specified by the user provided
-+ * string starting at address @ubuf. Only bytes in the range
-+ * [@ubuf, @ubuf+@ubuflen) can be read from user space, and
-+ * reading will stop after the first byte that is not a comma
-+ * or valid hex digit in the characters [,0-9a-fA-F], or at
-+ * the point @ubuf+@ubuflen, whichever comes first.
-+ *
-+ * Since the user only needs about 2.25 chars per byte to encode
-+ * a mask (one char per nibble plus one comma separator or nul
-+ * terminator per byte), we blow them off with -EINVAL if they
-+ * claim a @ubuflen more than 4 (MAX_HEX_PER_BYTE) times maskbytes.
-+ * An empty word (delimited by two consecutive commas, for example)
-+ * is taken as zero. If @buflen is zero, the entire @maskp is set
-+ * to zero.
-+ *
-+ * If the user provides fewer comma-separated ascii words
-+ * than there are 32 bit words in maskbytes, we zero fill the
-+ * remaining high order words. If they provide more, they fail
-+ * with -EINVAL. Each comma-separate ascii word is taken as
-+ * a hex representation; leading zeros are ignored, and do not
-+ * imply octal. '00e1', 'e1', '00E1', 'E1' are all the same.
-+ * If user passes a word that is larger than fits in a u32,
-+ * they fail with -EOVERFLOW.
-+ */
-+
-+int __mask_parse_len(const char __user *ubuf, unsigned int ubuflen,
-+ unsigned long *maskp, unsigned int maskbytes)
-+{
-+ char buf[maskbytes * MAX_HEX_PER_BYTE + sizeof(NUL)];
-+ char *bp = buf;
-+ u32 *wordp = (u32 *)maskp;
-+ char *p;
-+ int i, j;
-+
-+ if (ubuflen > maskbytes * MAX_HEX_PER_BYTE)
-+ return -EINVAL;
-+ if (copy_from_user(buf, ubuf, ubuflen))
-+ return -EFAULT;
-+ buf[ubuflen] = NUL;
-+
-+ /*
-+ * Put the words into wordp[] in big-endian order,
-+ * then go back and reverse them.
-+ */
-+ memset(wordp, 0, maskbytes);
-+ i = j = 0;
-+ while ((p = strsep(&bp, ",")) != NULL) {
-+ unsigned long long t;
-+ if (j == maskbytes/sizeof(u32))
-+ return -EINVAL;
-+ t = simple_strtoull(p, 0, BASE);
-+ if (t != (u32)t)
-+ return -EOVERFLOW;
-+ wordp[j++] = t;
-+ }
-+ --j;
-+ while (i < j) {
-+ u32 t = wordp[i];
-+ wordp[i] = wordp[j];
-+ wordp[j] = t;
-+ i++, --j;
-+ }
-+ return 0;
-+}
---- linux-2.6.0/lib/parser.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/lib/parser.c 2003-12-28 23:22:09.000000000 -0800
-@@ -11,6 +11,17 @@
- #include <linux/slab.h>
- #include <linux/string.h>
-
-+/**
-+ * match_one: - Determines if a string matches a simple pattern
-+ * @s: the string to examine for presense of the pattern
-+ * @p: the string containing the pattern
-+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
-+ * locations.
-+ *
-+ * Description: Determines if the pattern @p is present in string @s. Can only
-+ * match extremely simple token=arg style patterns. If the pattern is found,
-+ * the location(s) of the arguments will be returned in the @args array.
-+ */
- static int match_one(char *s, char *p, substring_t args[])
- {
- char *meta;
-@@ -74,6 +85,20 @@ static int match_one(char *s, char *p, s
- }
- }
-
-+/**
-+ * match_token: - Find a token (and optional args) in a string
-+ * @s: the string to examine for token/argument pairs
-+ * @table: match_table_t describing the set of allowed option tokens and the
-+ * arguments that may be associated with them. Must be terminated with a
-+ * &struct match_token whose pattern is set to the NULL pointer.
-+ * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
-+ * locations.
-+ *
-+ * Description: Detects which if any of a set of token strings has been passed
-+ * to it. Tokens can include up to MAX_OPT_ARGS instances of basic c-style
-+ * format identifiers which will be taken into account when matching the
-+ * tokens, and whose locations will be returned in the @args array.
-+ */
- int match_token(char *s, match_table_t table, substring_t args[])
- {
- struct match_token *p;
-@@ -84,6 +109,16 @@ int match_token(char *s, match_table_t t
- return p->token;
- }
-
-+/**
-+ * match_number: scan a number in the given base from a substring_t
-+ * @s: substring to be scanned
-+ * @result: resulting integer on success
-+ * @base: base to use when converting string
-+ *
-+ * Description: Given a &substring_t and a base, attempts to parse the substring
-+ * as a number in that base. On success, sets @result to the integer represented
-+ * by the string and returns 0. Returns either -ENOMEM or -EINVAL on failure.
-+ */
- static int match_number(substring_t *s, int *result, int base)
- {
- char *endp;
-@@ -103,27 +138,71 @@ static int match_number(substring_t *s,
- return ret;
- }
-
-+/**
-+ * match_int: - scan a decimal representation of an integer from a substring_t
-+ * @s: substring_t to be scanned
-+ * @result: resulting integer on success
-+ *
-+ * Description: Attempts to parse the &substring_t @s as a decimal integer. On
-+ * success, sets @result to the integer represented by the string and returns 0.
-+ * Returns either -ENOMEM or -EINVAL on failure.
-+ */
- int match_int(substring_t *s, int *result)
- {
- return match_number(s, result, 0);
- }
-
-+/**
-+ * match_octal: - scan an octal representation of an integer from a substring_t
-+ * @s: substring_t to be scanned
-+ * @result: resulting integer on success
-+ *
-+ * Description: Attempts to parse the &substring_t @s as an octal integer. On
-+ * success, sets @result to the integer represented by the string and returns
-+ * 0. Returns either -ENOMEM or -EINVAL on failure.
-+ */
- int match_octal(substring_t *s, int *result)
- {
- return match_number(s, result, 8);
- }
-
-+/**
-+ * match_hex: - scan a hex representation of an integer from a substring_t
-+ * @s: substring_t to be scanned
-+ * @result: resulting integer on success
-+ *
-+ * Description: Attempts to parse the &substring_t @s as a hexadecimal integer.
-+ * On success, sets @result to the integer represented by the string and
-+ * returns 0. Returns either -ENOMEM or -EINVAL on failure.
-+ */
- int match_hex(substring_t *s, int *result)
- {
- return match_number(s, result, 16);
- }
-
-+/**
-+ * match_strcpy: - copies the characters from a substring_t to a string
-+ * @to: string to copy characters to.
-+ * @s: &substring_t to copy
-+ *
-+ * Description: Copies the set of characters represented by the given
-+ * &substring_t @s to the c-style string @to. Caller guarantees that @to is
-+ * large enough to hold the characters of @s.
-+ */
- void match_strcpy(char *to, substring_t *s)
- {
- memcpy(to, s->from, s->to - s->from);
- to[s->to - s->from] = '\0';
- }
-
-+/**
-+ * match_strdup: - allocate a new string with the contents of a substring_t
-+ * @s: &substring_t to copy
-+ *
-+ * Description: Allocates and returns a string filled with the contents of
-+ * the &substring_t @s. The caller is responsible for freeing the returned
-+ * string with kfree().
-+ */
- char *match_strdup(substring_t *s)
- {
- char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL);
---- linux-2.6.0/MAINTAINERS 2003-11-23 19:03:00.000000000 -0800
-+++ 25/MAINTAINERS 2003-12-28 23:22:47.000000000 -0800
-@@ -73,7 +73,7 @@ S: Status, one of the following:
- 3C359 NETWORK DRIVER
- P: Mike Phillips
- M: mikep@linuxtr.net
--L: linux-net@vger.rutgers.edu
-+L: linux-net@vger.kernel.org
- L: linux-tr@linuxtr.net
- W: http://www.linuxtr.net
- S: Maintained
-@@ -929,8 +929,9 @@ W: http://www.linuxia64.org/
- S: Maintained
-
- SN-IA64 (Itanium) SUB-PLATFORM
--P: John Hesterberg
--M: jh@sgi.com
-+P: Jesse Barnes
-+M: jbarnes@sgi.com
-+L: linux-altix@sgi.com
- L: linux-ia64@linuxia64.org
- W: http://www.sgi.com/altix
- S: Maintained
-@@ -1154,6 +1155,12 @@ W: http://sf.net/projects/kernel-janitor
- W: http://developer.osdl.org/rddunlap/kj-patches/
- S: Maintained
-
-+KGDB FOR I386 PLATFORM
-+P: George Anzinger
-+M: george@mvista.com
-+L: linux-net@vger.kernel.org
-+S: Supported
-+
- KERNEL NFSD
- P: Neil Brown
- M: neilb@cse.unsw.edu.au
-@@ -1234,8 +1241,8 @@ W: http://ldm.sourceforge.net
- S: Maintained
-
- LSILOGIC/SYMBIOS/NCR 53C8XX and 53C1010 PCI-SCSI drivers
--P: Gerard Roudier
--M: groudier@free.fr
-+P: Matthew Wilcox
-+M: matthew@wil.cx
- L: linux-scsi@vger.kernel.org
- S: Maintained
-
-@@ -1468,7 +1475,7 @@ ONSTREAM SCSI TAPE DRIVER
- P: Willem Riede
- M: osst@riede.org
- L: osst@linux1.onstream.nl
--L: linux-scsi@vger.rutgers.edu
-+L: linux-scsi@vger.kernel.org
- S: Maintained
-
- OPL3-SA2, SA3, and SAx DRIVER
-@@ -1556,11 +1563,8 @@ M: greg@kroah.com
- S: Maintained
-
- PCMCIA SUBSYSTEM
--P: David Hinds
--M: dahinds@users.sourceforge.net
--L: linux-kernel@vger.kernel.org
--W: http://pcmcia-cs.sourceforge.net
--S: Maintained
-+L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia
-+S: Unmaintained
-
- PCNET32 NETWORK DRIVER
- P: Thomas Bogendörfer
---- linux-2.6.0/Makefile 2003-12-17 21:20:01.000000000 -0800
-+++ 25/Makefile 2003-12-28 23:23:07.000000000 -0800
-@@ -1,7 +1,7 @@
- VERSION = 2
- PATCHLEVEL = 6
- SUBLEVEL = 0
--EXTRAVERSION =
-+EXTRAVERSION = -mm2
-
- # *DOCUMENTATION*
- # To see a list of typical targets execute "make help"
-@@ -275,7 +275,7 @@ NOSTDINC_FLAGS = -nostdinc -iwithprefix
- CPPFLAGS := -D__KERNEL__ -Iinclude \
- $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
-
--CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
-+CFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs \
- -fno-strict-aliasing -fno-common
- AFLAGS := -D__ASSEMBLY__
-
-@@ -431,6 +431,12 @@ libs-y := $(libs-y1) $(libs-y2)
- # ---------------------------------------------------------------------------
-
-
-+ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
-+CFLAGS += -Os
-+else
-+CFLAGS += -O2
-+endif
-+
- ifndef CONFIG_FRAME_POINTER
- CFLAGS += -fomit-frame-pointer
- endif
-@@ -872,7 +878,7 @@ rpm: clean spec
- $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version;\
- mv -f $(objtree)/.tmp_version $(objtree)/.version;
-
-- $(RPM) -ta ../$(KERNELPATH).tar.gz
-+ $(RPM) --target $(UTS_MACHINE) -ta ../$(KERNELPATH).tar.gz
- rm ../$(KERNELPATH).tar.gz
-
- # Brief documentation of the typical targets used
---- linux-2.6.0/mm/fadvise.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/fadvise.c 2003-12-28 23:21:20.000000000 -0800
-@@ -23,7 +23,6 @@
- asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
- {
- struct file *file = fget(fd);
-- struct inode *inode;
- struct address_space *mapping;
- struct backing_dev_info *bdi;
- pgoff_t start_index;
-@@ -33,8 +32,7 @@ asmlinkage long sys_fadvise64_64(int fd,
- if (!file)
- return -EBADF;
-
-- inode = file->f_dentry->d_inode;
-- mapping = inode->i_mapping;
-+ mapping = file->f_mapping;
- if (!mapping) {
- ret = -EINVAL;
- goto out;
---- linux-2.6.0/mm/filemap.c 2003-11-23 19:03:02.000000000 -0800
-+++ 25/mm/filemap.c 2003-12-28 23:26:44.000000000 -0800
-@@ -73,6 +73,9 @@
- * ->mmap_sem
- * ->i_sem (msync)
- *
-+ * ->i_sem
-+ * ->i_alloc_sem (various)
-+ *
- * ->inode_lock
- * ->sb_lock (fs/fs-writeback.c)
- * ->mapping->page_lock (__sync_single_inode)
-@@ -226,6 +229,18 @@ restart:
-
- EXPORT_SYMBOL(filemap_fdatawait);
-
-+int filemap_write_and_wait(struct address_space *mapping)
-+{
-+ int retval = 0;
-+
-+ if (mapping->nrpages) {
-+ retval = filemap_fdatawrite(mapping);
-+ if (retval == 0)
-+ retval = filemap_fdatawait(mapping);
-+ }
-+ return retval;
-+}
-+
- /*
- * This adds a page to the page cache, starting out as locked, unreferenced,
- * not uptodate and with no errors.
-@@ -292,22 +307,42 @@ static wait_queue_head_t *page_waitqueue
- return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)];
- }
-
--void wait_on_page_bit(struct page *page, int bit_nr)
-+/*
-+ * wait for the specified page bit to be cleared
-+ * this could be a synchronous wait or could just queue an async
-+ * notification callback depending on the wait queue entry parameter
-+ *
-+ * A NULL wait queue parameter defaults to sync behaviour
-+ */
-+int wait_on_page_bit_wq(struct page *page, int bit_nr, wait_queue_t *wait)
- {
- wait_queue_head_t *waitqueue = page_waitqueue(page);
-- DEFINE_WAIT(wait);
-+ DEFINE_WAIT(local_wait);
-+
-+ if (!wait)
-+ wait = &local_wait; /* default to a sync wait entry */
-
- do {
-- prepare_to_wait(waitqueue, &wait, TASK_UNINTERRUPTIBLE);
-+ prepare_to_wait(waitqueue, wait, TASK_UNINTERRUPTIBLE);
- if (test_bit(bit_nr, &page->flags)) {
- sync_page(page);
-+ if (!is_sync_wait(wait)) {
-+ /*
-+ * if we've queued an async wait queue
-+ * callback do not block; just tell the
-+ * caller to return and retry later when
-+ * the callback is notified
-+ */
-+ return -EIOCBRETRY;
-+ }
- io_schedule();
- }
- } while (test_bit(bit_nr, &page->flags));
-- finish_wait(waitqueue, &wait);
--}
-+ finish_wait(waitqueue, wait);
-
--EXPORT_SYMBOL(wait_on_page_bit);
-+ return 0;
-+}
-+EXPORT_SYMBOL(wait_on_page_bit_wq);
-
- /**
- * unlock_page() - unlock a locked page
-@@ -317,7 +352,9 @@ EXPORT_SYMBOL(wait_on_page_bit);
- * Unlocks the page and wakes up sleepers in ___wait_on_page_locked().
- * Also wakes sleepers in wait_on_page_writeback() because the wakeup
- * mechananism between PageLocked pages and PageWriteback pages is shared.
-- * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep.
-+ * But that's OK - sleepers in wait_on_page_writeback() just go back to sleep,
-+ * or in case the wakeup notifies async wait queue entries, as in the case
-+ * of aio, retries would be triggered and may re-queue their callbacks.
- *
- * The first mb is necessary to safely close the critical section opened by the
- * TestSetPageLocked(), the second mb is necessary to enforce ordering between
-@@ -358,26 +395,51 @@ void end_page_writeback(struct page *pag
- EXPORT_SYMBOL(end_page_writeback);
-
- /*
-- * Get a lock on the page, assuming we need to sleep to get it.
-+ * Get a lock on the page, assuming we need to either sleep to get it
-+ * or to queue an async notification callback to try again when its
-+ * available.
-+ *
-+ * A NULL wait queue parameter defaults to sync behaviour. Otherwise
-+ * it specifies the wait queue entry to be used for async notification
-+ * or waiting.
- *
- * Ugly: running sync_page() in state TASK_UNINTERRUPTIBLE is scary. If some
- * random driver's requestfn sets TASK_RUNNING, we could busywait. However
- * chances are that on the second loop, the block layer's plug list is empty,
- * so sync_page() will then return in state TASK_UNINTERRUPTIBLE.
- */
--void __lock_page(struct page *page)
-+int __lock_page_wq(struct page *page, wait_queue_t *wait)
- {
- wait_queue_head_t *wqh = page_waitqueue(page);
-- DEFINE_WAIT(wait);
-+ DEFINE_WAIT(local_wait);
-+
-+ if (!wait)
-+ wait = &local_wait;
-
- while (TestSetPageLocked(page)) {
-- prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
-+ prepare_to_wait(wqh, wait, TASK_UNINTERRUPTIBLE);
- if (PageLocked(page)) {
- sync_page(page);
-+ if (!is_sync_wait(wait)) {
-+ /*
-+ * if we've queued an async wait queue
-+ * callback do not block; just tell the
-+ * caller to return and retry later when
-+ * the callback is notified
-+ */
-+ return -EIOCBRETRY;
-+ }
- io_schedule();
- }
- }
-- finish_wait(wqh, &wait);
-+ finish_wait(wqh, wait);
-+ return 0;
-+}
-+EXPORT_SYMBOL(__lock_page_wq);
-+
-+void __lock_page(struct page *page)
-+{
-+ __lock_page_wq(page, NULL);
- }
-
- EXPORT_SYMBOL(__lock_page);
-@@ -432,8 +494,8 @@ EXPORT_SYMBOL(find_trylock_page);
- *
- * Returns zero if the page was not present. find_lock_page() may sleep.
- */
--struct page *find_lock_page(struct address_space *mapping,
-- unsigned long offset)
-+struct page *find_lock_page_wq(struct address_space *mapping,
-+ unsigned long offset, wait_queue_t *wait)
- {
- struct page *page;
-
-@@ -444,7 +506,10 @@ repeat:
- page_cache_get(page);
- if (TestSetPageLocked(page)) {
- spin_unlock(&mapping->page_lock);
-- lock_page(page);
-+ if (-EIOCBRETRY == lock_page_wq(page, wait)) {
-+ page_cache_release(page);
-+ return ERR_PTR(-EIOCBRETRY);
-+ }
- spin_lock(&mapping->page_lock);
-
- /* Has the page been truncated while we slept? */
-@@ -461,6 +526,12 @@ repeat:
-
- EXPORT_SYMBOL(find_lock_page);
-
-+struct page *find_lock_page(struct address_space *mapping,
-+ unsigned long offset)
-+{
-+ return find_lock_page_wq(mapping, offset, NULL);
-+}
-+
- /**
- * find_or_create_page - locate or add a pagecache page
- *
-@@ -521,9 +592,12 @@ EXPORT_SYMBOL(find_or_create_page);
- * The search returns a group of mapping-contiguous pages with ascending
- * indexes. There may be holes in the indices due to not-present pages.
- *
-- * find_get_pages() returns the number of pages which were found.
-+ * find_get_pages() returns the number of pages which were found
-+ * and also atomically sets the next offset to continue looking up
-+ * mapping contiguous pages from (useful when doing a range of
-+ * pagevec lookups in chunks of PAGEVEC_SIZE).
- */
--unsigned int find_get_pages(struct address_space *mapping, pgoff_t start,
-+unsigned int find_get_pages(struct address_space *mapping, pgoff_t *next,
- unsigned int nr_pages, struct page **pages)
- {
- unsigned int i;
-@@ -531,9 +605,12 @@ unsigned int find_get_pages(struct addre
-
- spin_lock(&mapping->page_lock);
- ret = radix_tree_gang_lookup(&mapping->page_tree,
-- (void **)pages, start, nr_pages);
-+ (void **)pages, *next, nr_pages);
- for (i = 0; i < ret; i++)
- page_cache_get(pages[i]);
-+ if (ret)
-+ *next = pages[ret - 1]->index + 1;
-+
- spin_unlock(&mapping->page_lock);
- return ret;
- }
-@@ -587,21 +664,46 @@ void do_generic_mapping_read(struct addr
- read_actor_t actor)
- {
- struct inode *inode = mapping->host;
-- unsigned long index, offset;
-+ unsigned long index, offset, first, last, end_index;
-+ loff_t isize = i_size_read(inode);
- struct page *cached_page;
- int error;
-
- cached_page = NULL;
-- index = *ppos >> PAGE_CACHE_SHIFT;
-+ first = *ppos >> PAGE_CACHE_SHIFT;
- offset = *ppos & ~PAGE_CACHE_MASK;
-+ last = (*ppos + desc->count) >> PAGE_CACHE_SHIFT;
-+ end_index = isize >> PAGE_CACHE_SHIFT;
-+ if (last > end_index)
-+ last = end_index;
-
-+ /* Don't repeat the readahead if we are executing aio retries */
-+ if (in_aio()) {
-+ if (is_retried_kiocb(io_wait_to_kiocb(current->io_wait)))
-+ goto done_readahead;
-+ }
-+
-+ /*
-+ * Let the readahead logic know upfront about all
-+ * the pages we'll need to satisfy this request
-+ */
-+ for (index = first; index < last; index++)
-+ page_cache_readahead(mapping, ra, filp, index);
-+
-+ if (ra->next_size == -1UL) {
-+ /* the readahead window was maximally shrunk */
-+ /* explicitly readahead at least what is needed now */
-+ for (index = first; index < last; index++)
-+ handle_ra_miss(mapping, ra, index);
-+ do_page_cache_readahead(mapping, filp, first, last - first);
-+ }
-+
-+done_readahead:
-+ index = first;
- for (;;) {
- struct page *page;
-- unsigned long end_index, nr, ret;
-- loff_t isize = i_size_read(inode);
-+ unsigned long nr, ret;
-
-- end_index = isize >> PAGE_CACHE_SHIFT;
--
- if (index > end_index)
- break;
- nr = PAGE_CACHE_SIZE;
-@@ -612,7 +714,6 @@ void do_generic_mapping_read(struct addr
- }
-
- cond_resched();
-- page_cache_readahead(mapping, ra, filp, index);
-
- nr = nr - offset;
- find_page:
-@@ -662,7 +763,12 @@ page_not_up_to_date:
- goto page_ok;
-
- /* Get exclusive access to the page ... */
-- lock_page(page);
-+
-+ if (lock_page_wq(page, current->io_wait)) {
-+ pr_debug("queued lock page \n");
-+ error = -EIOCBRETRY;
-+ goto sync_error;
-+ }
-
- /* Did it get unhashed before we got the lock? */
- if (!page->mapping) {
-@@ -684,13 +790,23 @@ readpage:
- if (!error) {
- if (PageUptodate(page))
- goto page_ok;
-- wait_on_page_locked(page);
-+ if (wait_on_page_locked_wq(page, current->io_wait)) {
-+ pr_debug("queued wait_on_page \n");
-+ error = -EIOCBRETRY;
-+ goto sync_error;
-+ }
-+
- if (PageUptodate(page))
- goto page_ok;
- error = -EIO;
- }
-
-- /* UHHUH! A synchronous read error occurred. Report it */
-+sync_error:
-+ /* We don't have uptodate data in the page yet */
-+ /* Could be due to an error or because we need to
-+ * retry when we get an async i/o notification.
-+ * Report the reason.
-+ */
- desc->error = error;
- page_cache_release(page);
- break;
-@@ -804,7 +920,7 @@ __generic_file_aio_read(struct kiocb *io
- struct address_space *mapping;
- struct inode *inode;
-
-- mapping = filp->f_dentry->d_inode->i_mapping;
-+ mapping = filp->f_mapping;
- inode = mapping->host;
- retval = 0;
- if (!count)
-@@ -844,22 +960,19 @@ __generic_file_aio_read(struct kiocb *io
- out:
- return retval;
- }
--
- EXPORT_SYMBOL(__generic_file_aio_read);
-
--ssize_t
--generic_file_aio_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t pos)
-+ssize_t generic_file_aio_read(struct kiocb *iocb, char __user *buf,
-+ size_t count, loff_t pos)
- {
- struct iovec local_iov = { .iov_base = buf, .iov_len = count };
-
-- BUG_ON(iocb->ki_pos != pos);
- return __generic_file_aio_read(iocb, &local_iov, 1, &iocb->ki_pos);
- }
--
- EXPORT_SYMBOL(generic_file_aio_read);
-
--ssize_t
--generic_file_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
-+ssize_t generic_file_read(struct file *filp, char __user *buf,
-+ size_t count, loff_t *ppos)
- {
- struct iovec local_iov = { .iov_base = buf, .iov_len = count };
- struct kiocb kiocb;
-@@ -871,10 +984,10 @@ generic_file_read(struct file *filp, cha
- ret = wait_on_sync_kiocb(&kiocb);
- return ret;
- }
--
- EXPORT_SYMBOL(generic_file_read);
-
--int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size)
-+int file_send_actor(read_descriptor_t * desc, struct page *page,
-+ unsigned long offset, unsigned long size)
- {
- ssize_t written;
- unsigned long count = desc->count;
-@@ -936,7 +1049,7 @@ asmlinkage ssize_t sys_readahead(int fd,
- file = fget(fd);
- if (file) {
- if (file->f_mode & FMODE_READ) {
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- unsigned long start = offset >> PAGE_CACHE_SHIFT;
- unsigned long end = (offset + count - 1) >> PAGE_CACHE_SHIFT;
- unsigned long len = end - start + 1;
-@@ -955,7 +1068,7 @@ asmlinkage ssize_t sys_readahead(int fd,
- static int FASTCALL(page_cache_read(struct file * file, unsigned long offset));
- static int page_cache_read(struct file * file, unsigned long offset)
- {
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- struct page *page;
- int error;
-
-@@ -990,16 +1103,16 @@ static int page_cache_read(struct file *
- * it in the page cache, and handles the special cases reasonably without
- * having a lot of duplicated code.
- */
--struct page * filemap_nopage(struct vm_area_struct * area, unsigned long address, int unused)
-+struct page * filemap_nopage(struct vm_area_struct * area, unsigned long address, int *type)
- {
- int error;
- struct file *file = area->vm_file;
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- struct file_ra_state *ra = &file->f_ra;
- struct inode *inode = mapping->host;
- struct page *page;
- unsigned long size, pgoff, endoff;
-- int did_readaround = 0;
-+ int did_readaround = 0, majmin = VM_FAULT_MINOR;
-
- pgoff = ((address - area->vm_start) >> PAGE_CACHE_SHIFT) + area->vm_pgoff;
- endoff = ((area->vm_end - area->vm_start) >> PAGE_CACHE_SHIFT) + area->vm_pgoff;
-@@ -1048,6 +1161,14 @@ retry_find:
- if (ra->mmap_miss > ra->mmap_hit + MMAP_LOTSAMISS)
- goto no_cached_page;
-
-+ /*
-+ * To keep the pgmajfault counter straight, we need to
-+ * check did_readaround, as this is an inner loop.
-+ */
-+ if (!did_readaround) {
-+ majmin = VM_FAULT_MAJOR;
-+ inc_page_state(pgmajfault);
-+ }
- did_readaround = 1;
- do_page_cache_readahead(mapping, file,
- pgoff & ~(MMAP_READAROUND-1), MMAP_READAROUND);
-@@ -1069,6 +1190,8 @@ success:
- * Found the page and have a reference on it.
- */
- mark_page_accessed(page);
-+ if (type)
-+ *type = majmin;
- return page;
-
- outside_data_content:
-@@ -1104,7 +1227,10 @@ no_cached_page:
- return NULL;
-
- page_not_uptodate:
-- inc_page_state(pgmajfault);
-+ if (!did_readaround) {
-+ majmin = VM_FAULT_MAJOR;
-+ inc_page_state(pgmajfault);
-+ }
- lock_page(page);
-
- /* Did it get unhashed while we waited for it? */
-@@ -1166,7 +1292,7 @@ EXPORT_SYMBOL(filemap_nopage);
- static struct page * filemap_getpage(struct file *file, unsigned long pgoff,
- int nonblock)
- {
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- struct page *page;
- int error;
-
-@@ -1278,7 +1404,7 @@ static int filemap_populate(struct vm_ar
- int nonblock)
- {
- struct file *file = vma->vm_file;
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- struct inode *inode = mapping->host;
- unsigned long size;
- struct mm_struct *mm = vma->vm_mm;
-@@ -1337,7 +1463,7 @@ static struct vm_operations_struct gener
-
- int generic_file_mmap(struct file * file, struct vm_area_struct * vma)
- {
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- struct inode *inode = mapping->host;
-
- if (!mapping->a_ops->readpage)
-@@ -1460,7 +1586,9 @@ __grab_cache_page(struct address_space *
- int err;
- struct page *page;
- repeat:
-- page = find_lock_page(mapping, index);
-+ page = find_lock_page_wq(mapping, index, current->io_wait);
-+ if (IS_ERR(page))
-+ return page;
- if (!page) {
- if (!*cached_page) {
- *cached_page = page_cache_alloc(mapping);
-@@ -1605,9 +1733,9 @@ filemap_set_next_iovec(const struct iove
- * Returns appropriate error code that caller should return or
- * zero in case that write should be allowed.
- */
--inline int generic_write_checks(struct inode *inode,
-- struct file *file, loff_t *pos, size_t *count, int isblk)
-+inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk)
- {
-+ struct inode *inode = file->f_mapping->host;
- unsigned long limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
-
- if (unlikely(*pos < 0))
-@@ -1669,7 +1797,7 @@ inline int generic_write_checks(struct i
- *count = inode->i_sb->s_maxbytes - *pos;
- } else {
- loff_t isize;
-- if (bdev_read_only(inode->i_bdev))
-+ if (bdev_read_only(I_BDEV(inode)))
- return -EPERM;
- isize = i_size_read(inode);
- if (*pos >= isize) {
-@@ -1687,6 +1815,7 @@ EXPORT_SYMBOL(generic_write_checks);
-
- /*
- * Write to a file through the page cache.
-+ * Called under i_sem for S_ISREG files.
- *
- * We put everything into the page cache prior to writing it. This is not a
- * problem when writing full pages. With partial pages, however, we first have
-@@ -1695,11 +1824,11 @@ EXPORT_SYMBOL(generic_write_checks);
- * okir@monad.swb.de
- */
- ssize_t
--generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
-+__generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
- unsigned long nr_segs, loff_t *ppos)
- {
- struct file *file = iocb->ki_filp;
-- struct address_space * mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space * mapping = file->f_mapping;
- struct address_space_operations *a_ops = mapping->a_ops;
- size_t ocount; /* original count */
- size_t count; /* after file limit checks */
-@@ -1746,11 +1875,10 @@ generic_file_aio_write_nolock(struct kio
- current->backing_dev_info = mapping->backing_dev_info;
- written = 0;
-
-- err = generic_write_checks(inode, file, &pos, &count, isblk);
-+ err = generic_write_checks(file, &pos, &count, isblk);
- if (err)
- goto out;
-
--
- if (count == 0)
- goto out;
-
-@@ -1775,12 +1903,19 @@ generic_file_aio_write_nolock(struct kio
- /*
- * Sync the fs metadata but not the minor inode changes and
- * of course not the data as we did direct DMA for the IO.
-+ * i_sem is held, which protects generic_osync_inode() from
-+ * livelocking.
- */
- if (written >= 0 && file->f_flags & O_SYNC)
-- status = generic_osync_inode(inode, OSYNC_METADATA);
-+ status = generic_osync_inode(inode, mapping, OSYNC_METADATA);
- if (written >= 0 && !is_sync_kiocb(iocb))
- written = -EIOCBQUEUED;
-- goto out_status;
-+ if (written != -ENOTBLK)
-+ goto out_status;
-+ /*
-+ * direct-io write to a hole: fall through to buffered I/O
-+ */
-+ written = 0;
- }
-
- buf = iov->iov_base;
-@@ -1804,6 +1939,10 @@ generic_file_aio_write_nolock(struct kio
- fault_in_pages_readable(buf, bytes);
-
- page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
-+ if (IS_ERR(page)) {
-+ status = PTR_ERR(page);
-+ break;
-+ }
- if (!page) {
- status = -ENOMEM;
- break;
-@@ -1852,7 +1991,11 @@ generic_file_aio_write_nolock(struct kio
- page_cache_release(page);
- if (status < 0)
- break;
-- balance_dirty_pages_ratelimited(mapping);
-+ status = balance_dirty_pages_ratelimited(mapping);
-+ if (status < 0) {
-+ pr_debug("async balance_dirty_pages\n");
-+ break;
-+ }
- cond_resched();
- } while (count);
- *ppos = pos;
-@@ -1863,12 +2006,22 @@ generic_file_aio_write_nolock(struct kio
- /*
- * For now, when the user asks for O_SYNC, we'll actually give O_DSYNC
- */
-- if (status >= 0) {
-- if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
-- status = generic_osync_inode(inode,
-- OSYNC_METADATA|OSYNC_DATA);
-- }
-+ if (likely(status >= 0)) {
-+ if (unlikely((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
-+ if (!a_ops->writepage)
-+ status = generic_osync_inode(inode, mapping,
-+ OSYNC_METADATA|OSYNC_DATA);
-+ }
-+ }
-
-+ /*
-+ * If we get here for O_DIRECT writes then we must have fallen through
-+ * to buffered writes (block instantiation inside i_size). So we sync
-+ * the file data here, to try to honour O_DIRECT expectations.
-+ */
-+ if (unlikely(file->f_flags & O_DIRECT) && written)
-+ status = filemap_write_and_wait(mapping);
-+
- out_status:
- err = written ? written : status;
- out:
-@@ -1880,6 +2033,55 @@ out:
- EXPORT_SYMBOL(generic_file_aio_write_nolock);
-
- ssize_t
-+generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
-+ unsigned long nr_segs, loff_t *ppos)
-+{
-+ struct file *file = iocb->ki_filp;
-+ struct address_space *mapping = file->f_mapping;
-+ struct inode *inode = mapping->host;
-+ ssize_t ret;
-+ loff_t pos = *ppos;
-+
-+ if (!iov->iov_base && !is_sync_kiocb(iocb)) {
-+ /* nothing to transfer, may just need to sync data */
-+ ret = iov->iov_len; /* vector AIO not supported yet */
-+ goto osync;
-+ }
-+
-+ ret = __generic_file_aio_write_nolock(iocb, iov, nr_segs, ppos);
-+
-+ /*
-+ * Avoid doing a sync in parts for aio - its more efficient to
-+ * call in again after all the data has been copied
-+ */
-+ if (!is_sync_kiocb(iocb))
-+ return ret;
-+
-+osync:
-+ if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
-+ ret = sync_page_range_nolock(inode, mapping, pos, ret);
-+ if (ret >= 0)
-+ *ppos = pos + ret;
-+ }
-+ return ret;
-+}
-+
-+
-+ssize_t
-+__generic_file_write_nolock(struct file *file, const struct iovec *iov,
-+ unsigned long nr_segs, loff_t *ppos)
-+{
-+ struct kiocb kiocb;
-+ ssize_t ret;
-+
-+ init_sync_kiocb(&kiocb, file);
-+ ret = __generic_file_aio_write_nolock(&kiocb, iov, nr_segs, ppos);
-+ if (-EIOCBQUEUED == ret)
-+ ret = wait_on_sync_kiocb(&kiocb);
-+ return ret;
-+}
-+
-+ssize_t
- generic_file_write_nolock(struct file *file, const struct iovec *iov,
- unsigned long nr_segs, loff_t *ppos)
- {
-@@ -1899,36 +2101,62 @@ ssize_t generic_file_aio_write(struct ki
- size_t count, loff_t pos)
- {
- struct file *file = iocb->ki_filp;
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-- ssize_t err;
-- struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
-+ struct address_space *mapping = file->f_mapping;
-+ struct inode *inode = mapping->host;
-+ ssize_t ret;
-+ struct iovec local_iov = { .iov_base = (void __user *)buf,
-+ .iov_len = count };
-
-- BUG_ON(iocb->ki_pos != pos);
-+ if (!buf && !is_sync_kiocb(iocb)) {
-+ /* nothing to transfer, may just need to sync data */
-+ ret = count;
-+ goto osync;
-+ }
-
- down(&inode->i_sem);
-- err = generic_file_aio_write_nolock(iocb, &local_iov, 1,
-+ ret = __generic_file_aio_write_nolock(iocb, &local_iov, 1,
- &iocb->ki_pos);
- up(&inode->i_sem);
-
-- return err;
--}
-+ /*
-+ * Avoid doing a sync in parts for aio - its more efficient to
-+ * call in again after all the data has been copied
-+ */
-+ if (!is_sync_kiocb(iocb))
-+ return ret;
-
-+osync:
-+ if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
-+ ret = sync_page_range(inode, mapping, pos, ret);
-+ if (ret >= 0)
-+ iocb->ki_pos = pos + ret;
-+ }
-+ return ret;
-+}
- EXPORT_SYMBOL(generic_file_aio_write);
-
- ssize_t generic_file_write(struct file *file, const char __user *buf,
- size_t count, loff_t *ppos)
- {
-- struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
-- ssize_t err;
-- struct iovec local_iov = { .iov_base = (void __user *)buf, .iov_len = count };
-+ struct address_space *mapping = file->f_mapping;
-+ struct inode *inode = mapping->host;
-+ ssize_t ret;
-+ struct iovec local_iov = { .iov_base = (void __user *)buf,
-+ .iov_len = count };
-
- down(&inode->i_sem);
-- err = generic_file_write_nolock(file, &local_iov, 1, ppos);
-+ ret = __generic_file_write_nolock(file, &local_iov, 1, ppos);
- up(&inode->i_sem);
-
-- return err;
--}
-+ if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
-+ ssize_t err;
-
-+ err = sync_page_range(inode, mapping, *ppos - ret, ret);
-+ if (err < 0)
-+ ret = err;
-+ }
-+ return ret;
-+}
- EXPORT_SYMBOL(generic_file_write);
-
- ssize_t generic_file_readv(struct file *filp, const struct iovec *iov,
-@@ -1947,39 +2175,46 @@ ssize_t generic_file_readv(struct file *
- EXPORT_SYMBOL(generic_file_readv);
-
- ssize_t generic_file_writev(struct file *file, const struct iovec *iov,
-- unsigned long nr_segs, loff_t * ppos)
-+ unsigned long nr_segs, loff_t *ppos)
- {
-- struct inode *inode = file->f_dentry->d_inode;
-+ struct address_space *mapping = file->f_mapping;
-+ struct inode *inode = mapping->host;
- ssize_t ret;
-
- down(&inode->i_sem);
-- ret = generic_file_write_nolock(file, iov, nr_segs, ppos);
-+ ret = __generic_file_write_nolock(file, iov, nr_segs, ppos);
- up(&inode->i_sem);
-+
-+ if (ret > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) {
-+ ssize_t err;
-+
-+ err = sync_page_range(inode, mapping, *ppos - ret, ret);
-+ if (err < 0)
-+ ret = err;
-+ }
- return ret;
- }
-
- EXPORT_SYMBOL(generic_file_writev);
-
-+/*
-+ * Called under i_sem for writes to S_ISREG files
-+ */
- ssize_t
- generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
- loff_t offset, unsigned long nr_segs)
- {
- struct file *file = iocb->ki_filp;
-- struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
- ssize_t retval;
-
-- if (mapping->nrpages) {
-- retval = filemap_fdatawrite(mapping);
-- if (retval == 0)
-- retval = filemap_fdatawait(mapping);
-- if (retval)
-- goto out;
-+ retval = filemap_write_and_wait(mapping);
-+ if (retval == 0) {
-+ retval = mapping->a_ops->direct_IO(rw, iocb, iov,
-+ offset, nr_segs);
-+ if (rw == WRITE && mapping->nrpages)
-+ invalidate_inode_pages2(mapping);
- }
--
-- retval = mapping->a_ops->direct_IO(rw, iocb, iov, offset, nr_segs);
-- if (rw == WRITE && mapping->nrpages)
-- invalidate_inode_pages2(mapping);
--out:
- return retval;
- }
-
---- linux-2.6.0/mm/highmem.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/mm/highmem.c 2003-12-28 23:22:14.000000000 -0800
-@@ -285,7 +285,7 @@ static void copy_to_high_bio_irq(struct
- struct bio_vec *tovec, *fromvec;
- int i;
-
-- __bio_for_each_segment(tovec, to, i, 0) {
-+ bio_for_each_segment(tovec, to, i) {
- fromvec = from->bi_io_vec + i;
-
- /*
-@@ -314,7 +314,7 @@ static void bounce_end_io(struct bio *bi
- /*
- * free up bounce indirect pages used
- */
-- __bio_for_each_segment(bvec, bio, i, 0) {
-+ bio_for_each_segment(bvec, bio, i) {
- org_vec = bio_orig->bi_io_vec + i;
- if (bvec->bv_page == org_vec->bv_page)
- continue;
-@@ -437,7 +437,7 @@ static void __blk_queue_bounce(request_q
- bio->bi_rw = (*bio_orig)->bi_rw;
-
- bio->bi_vcnt = (*bio_orig)->bi_vcnt;
-- bio->bi_idx = 0;
-+ bio->bi_idx = (*bio_orig)->bi_idx;
- bio->bi_size = (*bio_orig)->bi_size;
-
- if (pool == page_pool) {
---- linux-2.6.0/mm/madvise.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/madvise.c 2003-12-28 23:21:19.000000000 -0800
-@@ -65,7 +65,7 @@ static long madvise_willneed(struct vm_a
- end = vma->vm_end;
- end = ((end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
-
-- force_page_cache_readahead(file->f_dentry->d_inode->i_mapping,
-+ force_page_cache_readahead(file->f_mapping,
- file, start, max_sane_readahead(end - start));
- return 0;
- }
---- linux-2.6.0/mm/Makefile 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/Makefile 2003-12-28 23:26:36.000000000 -0800
-@@ -12,3 +12,6 @@ obj-y := bootmem.o filemap.o mempool.o
- slab.o swap.o truncate.o vmscan.o $(mmu-y)
-
- obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o
-+
-+obj-$(CONFIG_X86_4G) += usercopy.o
-+
---- linux-2.6.0/mm/memory.c 2003-11-23 19:03:02.000000000 -0800
-+++ 25/mm/memory.c 2003-12-28 23:26:36.000000000 -0800
-@@ -107,7 +107,8 @@ static inline void free_one_pmd(struct m
- pte_free_tlb(tlb, page);
- }
-
--static inline void free_one_pgd(struct mmu_gather *tlb, pgd_t * dir)
-+static inline void free_one_pgd(struct mmu_gather *tlb, pgd_t * dir,
-+ int pgd_idx)
- {
- int j;
- pmd_t * pmd;
-@@ -121,8 +122,11 @@ static inline void free_one_pgd(struct m
- }
- pmd = pmd_offset(dir, 0);
- pgd_clear(dir);
-- for (j = 0; j < PTRS_PER_PMD ; j++)
-+ for (j = 0; j < PTRS_PER_PMD ; j++) {
-+ if (pgd_idx * PGDIR_SIZE + j * PMD_SIZE >= TASK_SIZE)
-+ break;
- free_one_pmd(tlb, pmd+j);
-+ }
- pmd_free_tlb(tlb, pmd);
- }
-
-@@ -135,11 +139,13 @@ static inline void free_one_pgd(struct m
- void clear_page_tables(struct mmu_gather *tlb, unsigned long first, int nr)
- {
- pgd_t * page_dir = tlb->mm->pgd;
-+ int pgd_idx = first;
-
- page_dir += first;
- do {
-- free_one_pgd(tlb, page_dir);
-+ free_one_pgd(tlb, page_dir, pgd_idx);
- page_dir++;
-+ pgd_idx++;
- } while (--nr);
- }
-
-@@ -437,7 +443,7 @@ zap_pmd_range(struct mmu_gather *tlb, pg
- unsigned long address, unsigned long size)
- {
- pmd_t * pmd;
-- unsigned long end;
-+ unsigned long end, pgd_boundary;
-
- if (pgd_none(*dir))
- return;
-@@ -448,8 +454,9 @@ zap_pmd_range(struct mmu_gather *tlb, pg
- }
- pmd = pmd_offset(dir, address);
- end = address + size;
-- if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
-- end = ((address + PGDIR_SIZE) & PGDIR_MASK);
-+ pgd_boundary = ((address + PGDIR_SIZE) & PGDIR_MASK);
-+ if (pgd_boundary && (end > pgd_boundary))
-+ end = pgd_boundary;
- do {
- zap_pte_range(tlb, pmd, address, end - address);
- address = (address + PMD_SIZE) & PMD_MASK;
-@@ -603,6 +610,11 @@ void zap_page_range(struct vm_area_struc
- might_sleep();
-
- if (is_vm_hugetlb_page(vma)) {
-+ static int x;
-+ if (x < 10) {
-+ x++;
-+ dump_stack();
-+ }
- zap_hugepage_range(vma, address, size);
- return;
- }
-@@ -685,6 +697,7 @@ int get_user_pages(struct task_struct *t
- struct page **pages, struct vm_area_struct **vmas)
- {
- int i;
-+ int vm_io;
- unsigned int flags;
-
- /*
-@@ -741,8 +754,10 @@ int get_user_pages(struct task_struct *t
- }
- #endif
-
-- if (!vma || (pages && (vma->vm_flags & VM_IO))
-- || !(flags & vma->vm_flags))
-+ if (!vma)
-+ return i ? : -EFAULT;
-+ vm_io = vma->vm_flags & VM_IO;
-+ if ((pages && vm_io) || !(flags & vma->vm_flags))
- return i ? : -EFAULT;
-
- if (is_vm_hugetlb_page(vma)) {
-@@ -750,9 +765,17 @@ int get_user_pages(struct task_struct *t
- &start, &len, i);
- continue;
- }
-+
- spin_lock(&mm->page_table_lock);
- do {
-- struct page *map;
-+ struct page *map = NULL;
-+
-+ /*
-+ * We don't follow pagetables for VM_IO regions - they
-+ * may have no pageframes.
-+ */
-+ if (vm_io)
-+ goto no_follow;
- while (!(map = follow_page(mm, start, write))) {
- spin_unlock(&mm->page_table_lock);
- switch (handle_mm_fault(mm,vma,start,write)) {
-@@ -784,6 +807,7 @@ int get_user_pages(struct task_struct *t
- if (!PageReserved(pages[i]))
- page_cache_get(pages[i]);
- }
-+no_follow:
- if (vmas)
- vmas[i] = vma;
- i++;
-@@ -1147,7 +1171,7 @@ void invalidate_mmap_range(struct addres
- invalidate_mmap_range_list(&mapping->i_mmap_shared, hba, hlen);
- up(&mapping->i_shared_sem);
- }
--EXPORT_SYMBOL_GPL(invalidate_mmap_range);
-+EXPORT_SYMBOL(invalidate_mmap_range);
-
- /*
- * Handle all mappings that got truncated by a "truncate()"
-@@ -1400,7 +1424,7 @@ do_no_page(struct mm_struct *mm, struct
- pte_t entry;
- struct pte_chain *pte_chain;
- int sequence = 0;
-- int ret;
-+ int ret = VM_FAULT_MINOR;
-
- if (!vma->vm_ops || !vma->vm_ops->nopage)
- return do_anonymous_page(mm, vma, page_table,
-@@ -1409,12 +1433,12 @@ do_no_page(struct mm_struct *mm, struct
- spin_unlock(&mm->page_table_lock);
-
- if (vma->vm_file) {
-- mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
-+ mapping = vma->vm_file->f_mapping;
- sequence = atomic_read(&mapping->truncate_count);
- }
- smp_rmb(); /* Prevent CPU from reordering lock-free ->nopage() */
- retry:
-- new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
-+ new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, &ret);
-
- /* no page was available -- either SIGBUS or OOM */
- if (new_page == NOPAGE_SIGBUS)
-@@ -1483,14 +1507,12 @@ retry:
- pte_unmap(page_table);
- page_cache_release(new_page);
- spin_unlock(&mm->page_table_lock);
-- ret = VM_FAULT_MINOR;
- goto out;
- }
-
- /* no need to invalidate: a not-present page shouldn't be cached */
- update_mmu_cache(vma, address, entry);
- spin_unlock(&mm->page_table_lock);
-- ret = VM_FAULT_MAJOR;
- goto out;
- oom:
- ret = VM_FAULT_OOM;
---- linux-2.6.0/mm/mincore.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/mincore.c 2003-12-28 23:21:19.000000000 -0800
-@@ -26,7 +26,7 @@ static unsigned char mincore_page(struct
- unsigned long pgoff)
- {
- unsigned char present = 0;
-- struct address_space * as = vma->vm_file->f_dentry->d_inode->i_mapping;
-+ struct address_space * as = vma->vm_file->f_mapping;
- struct page * page;
-
- page = find_get_page(as, pgoff);
---- linux-2.6.0/mm/mmap.c 2003-12-17 21:20:03.000000000 -0800
-+++ 25/mm/mmap.c 2003-12-28 23:22:58.000000000 -0800
-@@ -80,11 +80,10 @@ static void remove_shared_vm_struct(stru
- struct file *file = vma->vm_file;
-
- if (file) {
-- struct inode *inode = file->f_dentry->d_inode;
--
-- down(&inode->i_mapping->i_shared_sem);
-- __remove_shared_vm_struct(vma, inode);
-- up(&inode->i_mapping->i_shared_sem);
-+ struct address_space *mapping = file->f_mapping;
-+ down(&mapping->i_shared_sem);
-+ __remove_shared_vm_struct(vma, file->f_dentry->d_inode);
-+ up(&mapping->i_shared_sem);
- }
- }
-
-@@ -235,11 +234,10 @@ static inline void __vma_link_file(struc
-
- file = vma->vm_file;
- if (file) {
-- struct inode * inode = file->f_dentry->d_inode;
-- struct address_space *mapping = inode->i_mapping;
-+ struct address_space *mapping = file->f_mapping;
-
- if (vma->vm_flags & VM_DENYWRITE)
-- atomic_dec(&inode->i_writecount);
-+ atomic_dec(&file->f_dentry->d_inode->i_writecount);
-
- if (vma->vm_flags & VM_SHARED)
- list_add_tail(&vma->shared, &mapping->i_mmap_shared);
-@@ -265,7 +263,7 @@ static void vma_link(struct mm_struct *m
- struct address_space *mapping = NULL;
-
- if (vma->vm_file)
-- mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
-+ mapping = vma->vm_file->f_mapping;
-
- if (mapping)
- down(&mapping->i_shared_sem);
-@@ -383,7 +381,7 @@ static int vma_merge(struct mm_struct *m
- if (vm_flags & VM_SPECIAL)
- return 0;
-
-- i_shared_sem = file ? &inode->i_mapping->i_shared_sem : NULL;
-+ i_shared_sem = file ? &file->f_mapping->i_shared_sem : NULL;
-
- if (!prev) {
- prev = rb_entry(rb_parent, struct vm_area_struct, vm_rb);
-@@ -1138,7 +1136,11 @@ static void unmap_region(struct mm_struc
- tlb = tlb_gather_mmu(mm, 0);
- unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted);
- vm_unacct_memory(nr_accounted);
-- free_pgtables(tlb, prev, start, end);
-+
-+ if (is_hugepage_only_range(start, end - start))
-+ hugetlb_free_pgtables(tlb, prev, start, end);
-+ else
-+ free_pgtables(tlb, prev, start, end);
- tlb_finish_mmu(tlb, start, end);
- }
-
-@@ -1203,7 +1205,7 @@ int split_vma(struct mm_struct * mm, str
- new->vm_ops->open(new);
-
- if (vma->vm_file)
-- mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
-+ mapping = vma->vm_file->f_mapping;
-
- if (mapping)
- down(&mapping->i_shared_sem);
---- linux-2.6.0/mm/msync.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/msync.c 2003-12-28 23:21:20.000000000 -0800
-@@ -146,20 +146,20 @@ static int msync_interval(struct vm_area
- ret = filemap_sync(vma, start, end-start, flags);
-
- if (!ret && (flags & MS_SYNC)) {
-- struct inode *inode = file->f_dentry->d_inode;
-+ struct address_space *mapping = file->f_mapping;
- int err;
-
-- down(&inode->i_sem);
-- ret = filemap_fdatawrite(inode->i_mapping);
-+ down(&mapping->host->i_sem);
-+ ret = filemap_fdatawrite(mapping);
- if (file->f_op && file->f_op->fsync) {
- err = file->f_op->fsync(file,file->f_dentry,1);
- if (err && !ret)
- ret = err;
- }
-- err = filemap_fdatawait(inode->i_mapping);
-+ err = filemap_fdatawait(mapping);
- if (!ret)
- ret = err;
-- up(&inode->i_sem);
-+ up(&mapping->host->i_sem);
- }
- }
- return ret;
---- linux-2.6.0/mm/oom_kill.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/oom_kill.c 2003-12-28 23:21:48.000000000 -0800
-@@ -24,20 +24,6 @@
- /* #define DEBUG */
-
- /**
-- * int_sqrt - oom_kill.c internal function, rough approximation to sqrt
-- * @x: integer of which to calculate the sqrt
-- *
-- * A very rough approximation to the sqrt() function.
-- */
--static unsigned int int_sqrt(unsigned int x)
--{
-- unsigned int out = x;
-- while (x & ~(unsigned int)1) x >>=2, out >>=1;
-- if (x) out -= out >> 2;
-- return (out ? out : 1);
--}
--
--/**
- * oom_badness - calculate a numeric value for how bad this task has been
- * @p: task struct of which task we should calculate
- *
-@@ -57,7 +43,7 @@ static unsigned int int_sqrt(unsigned in
-
- static int badness(struct task_struct *p)
- {
-- int points, cpu_time, run_time;
-+ int points, cpu_time, run_time, s;
-
- if (!p->mm)
- return 0;
-@@ -77,8 +63,12 @@ static int badness(struct task_struct *p
- cpu_time = (p->utime + p->stime) >> (SHIFT_HZ + 3);
- run_time = (get_jiffies_64() - p->start_time) >> (SHIFT_HZ + 10);
-
-- points /= int_sqrt(cpu_time);
-- points /= int_sqrt(int_sqrt(run_time));
-+ s = int_sqrt(cpu_time);
-+ if (s)
-+ points /= s;
-+ s = int_sqrt(int_sqrt(run_time));
-+ if (s)
-+ points /= s;
-
- /*
- * Niced processes are most likely less important, so double
---- linux-2.6.0/mm/page_alloc.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/page_alloc.c 2003-12-28 23:22:46.000000000 -0800
-@@ -267,9 +267,11 @@ free_pages_bulk(struct zone *zone, int c
- void __free_pages_ok(struct page *page, unsigned int order)
- {
- LIST_HEAD(list);
-+ int i;
-
- mod_page_state(pgfree, 1 << order);
-- free_pages_check(__FUNCTION__, page);
-+ for (i = 0 ; i < (1 << order) ; ++i)
-+ free_pages_check(__FUNCTION__, page + i);
- list_add(&page->list, &list);
- kernel_map_pages(page, 1<<order, 0);
- free_pages_bulk(page_zone(page), 1, &list, order);
-@@ -537,7 +539,7 @@ __alloc_pages(unsigned int gfp_mask, uns
- {
- const int wait = gfp_mask & __GFP_WAIT;
- unsigned long min;
-- struct zone **zones, *classzone;
-+ struct zone **zones;
- struct page *page;
- struct reclaim_state reclaim_state;
- struct task_struct *p = current;
-@@ -552,8 +554,7 @@ __alloc_pages(unsigned int gfp_mask, uns
- cold = 1;
-
- zones = zonelist->zones; /* the list of zones suitable for gfp_mask */
-- classzone = zones[0];
-- if (classzone == NULL) /* no zones in the zonelist */
-+ if (zones[0] == NULL) /* no zones in the zonelist */
- return NULL;
-
- /* Go through the zonelist once, looking for a zone with enough free */
-@@ -628,7 +629,7 @@ rebalance:
- reclaim_state.reclaimed_slab = 0;
- p->reclaim_state = &reclaim_state;
-
-- try_to_free_pages(classzone, gfp_mask, order);
-+ try_to_free_pages(zones, gfp_mask, order);
-
- p->reclaim_state = NULL;
- p->flags &= ~PF_MEMALLOC;
-@@ -672,6 +673,7 @@ nopage:
- printk("%s: page allocation failure."
- " order:%d, mode:0x%x\n",
- p->comm, order, gfp_mask);
-+ dump_stack();
- }
- return NULL;
- got_pg:
-@@ -1589,7 +1591,7 @@ void __init page_alloc_init(void)
- * that the pages_{min,low,high} values for each zone are set correctly
- * with respect to min_free_kbytes.
- */
--void setup_per_zone_pages_min(void)
-+static void setup_per_zone_pages_min(void)
- {
- unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
- unsigned long lowmem_pages = 0;
-@@ -1633,6 +1635,45 @@ void setup_per_zone_pages_min(void)
- }
-
- /*
-+ * Initialise min_free_kbytes.
-+ *
-+ * For small machines we want it small (128k min). For large machines
-+ * we want it large (16MB max). But it is not linear, because network
-+ * bandwidth does not increase linearly with machine size. We use
-+ *
-+ * min_free_kbytes = sqrt(lowmem_kbytes)
-+ *
-+ * which yields
-+ *
-+ * 16MB: 128k
-+ * 32MB: 181k
-+ * 64MB: 256k
-+ * 128MB: 362k
-+ * 256MB: 512k
-+ * 512MB: 724k
-+ * 1024MB: 1024k
-+ * 2048MB: 1448k
-+ * 4096MB: 2048k
-+ * 8192MB: 2896k
-+ * 16384MB: 4096k
-+ */
-+static int __init init_per_zone_pages_min(void)
-+{
-+ unsigned long lowmem_kbytes;
-+
-+ lowmem_kbytes = nr_free_buffer_pages() * (PAGE_SIZE >> 10);
-+
-+ min_free_kbytes = int_sqrt(lowmem_kbytes);
-+ if (min_free_kbytes < 128)
-+ min_free_kbytes = 128;
-+ if (min_free_kbytes > 16384)
-+ min_free_kbytes = 16384;
-+ setup_per_zone_pages_min();
-+ return 0;
-+}
-+module_init(init_per_zone_pages_min)
-+
-+/*
- * min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so
- * that we can call setup_per_zone_pages_min() whenever min_free_kbytes
- * changes.
---- linux-2.6.0/mm/page-writeback.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/page-writeback.c 2003-12-28 23:26:44.000000000 -0800
-@@ -28,6 +28,7 @@
- #include <linux/smp.h>
- #include <linux/sysctl.h>
- #include <linux/cpu.h>
-+#include <linux/pagevec.h>
-
- /*
- * The maximum number of pages to writeout in a single bdflush/kupdate
-@@ -146,7 +147,7 @@ get_dirty_limits(struct page_state *ps,
- * If we're over `background_thresh' then pdflush is woken to perform some
- * writeout.
- */
--static void balance_dirty_pages(struct address_space *mapping)
-+static int balance_dirty_pages(struct address_space *mapping)
- {
- struct page_state ps;
- long nr_reclaimable;
-@@ -163,6 +164,7 @@ static void balance_dirty_pages(struct a
- .sync_mode = WB_SYNC_NONE,
- .older_than_this = NULL,
- .nr_to_write = write_chunk,
-+ .nonblocking = !is_sync_wait(current->io_wait)
- };
-
- get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
-@@ -189,7 +191,11 @@ static void balance_dirty_pages(struct a
- if (pages_written >= write_chunk)
- break; /* We've done our duty */
- }
-- blk_congestion_wait(WRITE, HZ/10);
-+ if (-EIOCBRETRY == blk_congestion_wait_wq(WRITE, HZ/10,
-+ current->io_wait)) {
-+ pr_debug("async blk congestion wait\n");
-+ return -EIOCBRETRY;
-+ }
- }
-
- if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
-@@ -197,6 +203,8 @@ static void balance_dirty_pages(struct a
-
- if (!writeback_in_progress(bdi) && nr_reclaimable > background_thresh)
- pdflush_operation(background_writeout, 0);
-+
-+ return 0;
- }
-
- /**
-@@ -212,7 +220,7 @@ static void balance_dirty_pages(struct a
- * decrease the ratelimiting by a lot, to prevent individual processes from
- * overshooting the limit by (ratelimit_pages) each.
- */
--void balance_dirty_pages_ratelimited(struct address_space *mapping)
-+int balance_dirty_pages_ratelimited(struct address_space *mapping)
- {
- static DEFINE_PER_CPU(int, ratelimits) = 0;
- long ratelimit;
-@@ -228,10 +236,10 @@ void balance_dirty_pages_ratelimited(str
- if (get_cpu_var(ratelimits)++ >= ratelimit) {
- __get_cpu_var(ratelimits) = 0;
- put_cpu_var(ratelimits);
-- balance_dirty_pages(mapping);
-- return;
-+ return balance_dirty_pages(mapping);
- }
- put_cpu_var(ratelimits);
-+ return 0;
- }
-
- /*
-@@ -567,3 +575,152 @@ int test_clear_page_dirty(struct page *p
- return 0;
- }
- EXPORT_SYMBOL(test_clear_page_dirty);
-+
-+
-+static ssize_t operate_on_page_range(struct address_space *mapping,
-+ loff_t pos, size_t count, int (*operator)(struct page *))
-+{
-+ pgoff_t first = pos >> PAGE_CACHE_SHIFT;
-+ pgoff_t last = (pos + count - 1) >> PAGE_CACHE_SHIFT; /* inclusive */
-+ pgoff_t next = first, curr = first;
-+ struct pagevec pvec;
-+ ssize_t ret = 0, bytes = 0;
-+ int i, nr;
-+
-+ if (count == 0)
-+ return 0;
-+
-+ pagevec_init(&pvec, 0);
-+ while ((nr = pagevec_lookup(&pvec, mapping, &next,
-+ min((pgoff_t)PAGEVEC_SIZE, last - next + 1)))) {
-+ for (i = 0; i < pagevec_count(&pvec); i++) {
-+ struct page *page = pvec.pages[i];
-+
-+ curr = page->index;
-+ if (page->mapping != mapping) /* truncated ?*/ {
-+ curr = next;
-+ break;
-+ } else {
-+ ret = (*operator)(page);
-+ if (ret == -EIOCBRETRY)
-+ break;
-+ if (PageError(page)) {
-+ if (!ret)
-+ ret = -EIO;
-+ } else
-+ curr++;
-+ }
-+ }
-+ pagevec_release(&pvec);
-+ if ((ret == -EIOCBRETRY) || (next > last))
-+ break;
-+ }
-+ if (!nr)
-+ curr = last + 1;
-+
-+ bytes = (curr << PAGE_CACHE_SHIFT) - pos;
-+ if (bytes > count)
-+ bytes = count;
-+ return (bytes && (!ret || (ret == -EIOCBRETRY))) ? bytes : ret;
-+}
-+
-+static int page_waiter(struct page *page)
-+{
-+ return wait_on_page_writeback_wq(page, current->io_wait);
-+}
-+
-+static size_t
-+wait_on_page_range(struct address_space *mapping, loff_t pos, size_t count)
-+{
-+ return operate_on_page_range(mapping, pos, count, page_waiter);
-+}
-+
-+static int page_writer(struct page *page)
-+{
-+ struct writeback_control wbc = {
-+ .sync_mode = WB_SYNC_ALL,
-+ .nr_to_write = 1,
-+ };
-+
-+ lock_page(page);
-+ if (!page->mapping) { /* truncated */
-+ unlock_page(page);
-+ return 0;
-+ }
-+ if (!test_clear_page_dirty(page)) {
-+ unlock_page(page);
-+ return 0;
-+ }
-+ wait_on_page_writeback(page);
-+ return page->mapping->a_ops->writepage(page, &wbc);
-+}
-+
-+static ssize_t
-+write_out_page_range(struct address_space *mapping, loff_t pos, size_t count)
-+{
-+ return operate_on_page_range(mapping, pos, count, page_writer);
-+}
-+
-+/*
-+ * Write and wait upon all the pages in the passed range. This is a "data
-+ * integrity" operation. It waits upon in-flight writeout before starting and
-+ * waiting upon new writeout. If there was an IO error, return it.
-+ *
-+ * We need to re-take i_sem during the generic_osync_inode list walk because
-+ * it is otherwise livelockable.
-+ */
-+ssize_t sync_page_range(struct inode *inode, struct address_space *mapping,
-+ loff_t pos, size_t count)
-+{
-+ int ret = 0;
-+
-+ if (in_aio()) {
-+ /* Already issued writeouts for this iocb ? */
-+ if (kiocbTrySync(io_wait_to_kiocb(current->io_wait)))
-+ goto do_wait; /* just need to check if done */
-+ }
-+ if (!mapping->a_ops->writepage)
-+ return 0;
-+ if (mapping->backing_dev_info->memory_backed)
-+ return 0;
-+ ret = write_out_page_range(mapping, pos, count);
-+ if (ret >= 0) {
-+ down(&inode->i_sem);
-+ ret = generic_osync_inode(inode, mapping, OSYNC_METADATA);
-+ up(&inode->i_sem);
-+ }
-+do_wait:
-+ if (ret >= 0)
-+ ret = wait_on_page_range(mapping, pos, count);
-+ return ret;
-+}
-+
-+/*
-+ * It is really better to use sync_page_range, rather than call
-+ * sync_page_range_nolock while holding i_sem, if you don't
-+ * want to block parallel O_SYNC writes until the pages in this
-+ * range are written out.
-+ */
-+ssize_t sync_page_range_nolock(struct inode *inode, struct address_space
-+ *mapping, loff_t pos, size_t count)
-+{
-+ ssize_t ret = 0;
-+
-+ if (in_aio()) {
-+ /* Already issued writeouts for this iocb ? */
-+ if (kiocbTrySync(io_wait_to_kiocb(current->io_wait)))
-+ goto do_wait; /* just need to check if done */
-+ }
-+ if (!mapping->a_ops->writepage)
-+ return 0;
-+ if (mapping->backing_dev_info->memory_backed)
-+ return 0;
-+ ret = write_out_page_range(mapping, pos, count);
-+ if (ret >= 0) {
-+ ret = generic_osync_inode(inode, mapping, OSYNC_METADATA);
-+ }
-+do_wait:
-+ if (ret >= 0)
-+ ret = wait_on_page_range(mapping, pos, count);
-+ return ret;
-+}
---- linux-2.6.0/mm/pdflush.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/pdflush.c 2003-12-28 23:21:42.000000000 -0800
-@@ -84,6 +84,8 @@ struct pdflush_work {
- unsigned long when_i_went_to_sleep;
- };
-
-+static int wakeup_count = 100;
-+
- static int __pdflush(struct pdflush_work *my_work)
- {
- daemonize("pdflush");
-@@ -112,7 +114,10 @@ static int __pdflush(struct pdflush_work
-
- spin_lock_irq(&pdflush_lock);
- if (!list_empty(&my_work->list)) {
-- printk("pdflush: bogus wakeup!\n");
-+ if (wakeup_count > 0) {
-+ wakeup_count--;
-+ printk("pdflush: bogus wakeup!\n");
-+ }
- my_work->fn = NULL;
- continue;
- }
-@@ -182,6 +187,7 @@ int pdflush_operation(void (*fn)(unsigne
- {
- unsigned long flags;
- int ret = 0;
-+ static int poke_count = 0;
-
- if (fn == NULL)
- BUG(); /* Hard to diagnose if it's deferred */
-@@ -190,9 +196,19 @@ int pdflush_operation(void (*fn)(unsigne
- if (list_empty(&pdflush_list)) {
- spin_unlock_irqrestore(&pdflush_lock, flags);
- ret = -1;
-+ if (wakeup_count < 100 && poke_count < 10) {
-+ printk("%s: no threads\n", __FUNCTION__);
-+ dump_stack();
-+ poke_count++;
-+ }
- } else {
- struct pdflush_work *pdf;
-
-+ if (wakeup_count < 100 && poke_count < 10) {
-+ printk("%s: found a thread\n", __FUNCTION__);
-+ dump_stack();
-+ poke_count++;
-+ }
- pdf = list_entry(pdflush_list.next, struct pdflush_work, list);
- list_del_init(&pdf->list);
- if (list_empty(&pdflush_list))
---- linux-2.6.0/mm/readahead.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/readahead.c 2003-12-28 23:26:38.000000000 -0800
-@@ -347,6 +347,8 @@ page_cache_readahead(struct address_spac
- unsigned min;
- unsigned orig_next_size;
- unsigned actual;
-+ int first_access=0;
-+ unsigned long preoffset=0;
-
- /*
- * Here we detect the case where the application is performing
-@@ -370,16 +372,18 @@ page_cache_readahead(struct address_spac
- min = get_min_readahead(ra);
- orig_next_size = ra->next_size;
-
-- if (ra->next_size == 0 && offset == 0) {
-+ if (ra->next_size == 0) {
- /*
-- * Special case - first read from first page.
-+ * Special case - first read.
- * We'll assume it's a whole-file read, and
- * grow the window fast.
- */
-+ first_access=1;
- ra->next_size = max / 2;
- goto do_io;
- }
-
-+ preoffset = ra->prev_page;
- ra->prev_page = offset;
-
- if (offset >= ra->start && offset <= (ra->start + ra->size)) {
-@@ -439,20 +443,44 @@ do_io:
- * ahead window and get some I/O underway for the new
- * current window.
- */
-+ if (!first_access && preoffset >= ra->start &&
-+ preoffset < (ra->start + ra->size)) {
-+ /* Heuristic: If 'n' pages were
-+ * accessed in the current window, there
-+ * is a high probability that around 'n' pages
-+ * shall be used in the next current window.
-+ *
-+ * To minimize lazy-readahead triggered
-+ * in the next current window, read in
-+ * an extra page.
-+ */
-+ ra->next_size = preoffset - ra->start + 2;
-+ }
- ra->start = offset;
- ra->size = ra->next_size;
- ra->ahead_start = 0; /* Invalidate these */
- ra->ahead_size = 0;
- actual = do_page_cache_readahead(mapping, filp, offset,
- ra->size);
-- check_ra_success(ra, ra->size, actual, orig_next_size);
-+ if(!first_access) {
-+ /*
-+ * do not adjust the readahead window size the first
-+ * time, the ahead window might get closed if all
-+ * the pages are already in the cache.
-+ */
-+ check_ra_success(ra, ra->size, actual, orig_next_size);
-+ }
- } else {
- /*
- * This read request is within the current window. It is time
- * to submit I/O for the ahead window while the application is
-- * crunching through the current window.
-+ * about to step into the ahead window.
-+ * Heuristic: Defer reading the ahead window till we hit
-+ * the last page in the current window. (lazy readahead)
-+ * If we read in earlier we run the risk of wasting
-+ * the ahead window.
- */
-- if (ra->ahead_start == 0) {
-+ if (ra->ahead_start == 0 && offset == (ra->start + ra->size -1)) {
- ra->ahead_start = ra->start + ra->size;
- ra->ahead_size = ra->next_size;
- actual = do_page_cache_readahead(mapping, filp,
-@@ -488,7 +516,7 @@ void handle_ra_miss(struct address_space
- const unsigned long max = get_max_readahead(ra);
-
- if (offset != ra->prev_page + 1) {
-- ra->size = 0; /* Not sequential */
-+ ra->size = ra->size?ra->size-1:0; /* Not sequential */
- } else {
- ra->size++; /* A sequential read */
- if (ra->size >= max) { /* Resume readahead */
---- linux-2.6.0/mm/shmem.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/shmem.c 2003-12-28 23:22:12.000000000 -0800
-@@ -71,7 +71,7 @@ enum sgp_type {
- };
-
- static int shmem_getpage(struct inode *inode, unsigned long idx,
-- struct page **pagep, enum sgp_type sgp);
-+ struct page **pagep, enum sgp_type sgp, int *type);
-
- static inline struct page *shmem_dir_alloc(unsigned int gfp_mask)
- {
-@@ -540,7 +540,7 @@ static int shmem_notify_change(struct de
- if (attr->ia_size & (PAGE_CACHE_SIZE-1)) {
- (void) shmem_getpage(inode,
- attr->ia_size>>PAGE_CACHE_SHIFT,
-- &page, SGP_READ);
-+ &page, SGP_READ, NULL);
- }
- /*
- * Reset SHMEM_PAGEIN flag so that shmem_truncate can
-@@ -765,7 +765,7 @@ redirty:
- * vm. If we swap it in we mark it dirty since we also free the swap
- * entry since a page cannot live in both the swap and page cache
- */
--static int shmem_getpage(struct inode *inode, unsigned long idx, struct page **pagep, enum sgp_type sgp)
-+static int shmem_getpage(struct inode *inode, unsigned long idx, struct page **pagep, enum sgp_type sgp, int *type)
- {
- struct address_space *mapping = inode->i_mapping;
- struct shmem_inode_info *info = SHMEM_I(inode);
-@@ -774,7 +774,7 @@ static int shmem_getpage(struct inode *i
- struct page *swappage;
- swp_entry_t *entry;
- swp_entry_t swap;
-- int error;
-+ int error, majmin = VM_FAULT_MINOR;
-
- if (idx >= SHMEM_MAX_INDEX)
- return -EFBIG;
-@@ -811,6 +811,10 @@ repeat:
- if (!swappage) {
- shmem_swp_unmap(entry);
- spin_unlock(&info->lock);
-+ /* here we actually do the io */
-+ if (majmin == VM_FAULT_MINOR && type)
-+ inc_page_state(pgmajfault);
-+ majmin = VM_FAULT_MAJOR;
- swapin_readahead(swap);
- swappage = read_swap_cache_async(swap);
- if (!swappage) {
-@@ -959,6 +963,8 @@ done:
- } else
- *pagep = ZERO_PAGE(0);
- }
-+ if (type)
-+ *type = majmin;
- return 0;
-
- failed:
-@@ -969,7 +975,7 @@ failed:
- return error;
- }
-
--struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int unused)
-+struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int *type)
- {
- struct inode *inode = vma->vm_file->f_dentry->d_inode;
- struct page *page = NULL;
-@@ -980,7 +986,7 @@ struct page *shmem_nopage(struct vm_area
- idx += vma->vm_pgoff;
- idx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
-
-- error = shmem_getpage(inode, idx, &page, SGP_CACHE);
-+ error = shmem_getpage(inode, idx, &page, SGP_CACHE, type);
- if (error)
- return (error == -ENOMEM)? NOPAGE_OOM: NOPAGE_SIGBUS;
-
-@@ -1007,7 +1013,7 @@ static int shmem_populate(struct vm_area
- /*
- * Will need changing if PAGE_CACHE_SIZE != PAGE_SIZE
- */
-- err = shmem_getpage(inode, pgoff, &page, sgp);
-+ err = shmem_getpage(inode, pgoff, &page, sgp, NULL);
- if (err)
- return err;
- if (page) {
-@@ -1157,7 +1163,7 @@ static int
- shmem_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to)
- {
- struct inode *inode = page->mapping->host;
-- return shmem_getpage(inode, page->index, &page, SGP_WRITE);
-+ return shmem_getpage(inode, page->index, &page, SGP_WRITE, NULL);
- }
-
- static ssize_t
-@@ -1180,7 +1186,7 @@ shmem_file_write(struct file *file, cons
- pos = *ppos;
- written = 0;
-
-- err = generic_write_checks(inode, file, &pos, &count, 0);
-+ err = generic_write_checks(file, &pos, &count, 0);
- if (err || !count)
- goto out;
-
-@@ -1214,7 +1220,7 @@ shmem_file_write(struct file *file, cons
- * But it still may be a good idea to prefault below.
- */
-
-- err = shmem_getpage(inode, index, &page, SGP_WRITE);
-+ err = shmem_getpage(inode, index, &page, SGP_WRITE, NULL);
- if (err)
- break;
-
-@@ -1296,7 +1302,7 @@ static void do_shmem_file_read(struct fi
- break;
- }
-
-- desc->error = shmem_getpage(inode, index, &page, SGP_READ);
-+ desc->error = shmem_getpage(inode, index, &page, SGP_READ, NULL);
- if (desc->error) {
- if (desc->error == -EINVAL)
- desc->error = 0;
-@@ -1552,7 +1558,7 @@ static int shmem_symlink(struct inode *d
- iput(inode);
- return -ENOMEM;
- }
-- error = shmem_getpage(inode, 0, &page, SGP_WRITE);
-+ error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
- if (error) {
- vm_unacct_memory(VM_ACCT(1));
- iput(inode);
-@@ -1590,7 +1596,7 @@ static int shmem_follow_link_inline(stru
- static int shmem_readlink(struct dentry *dentry, char __user *buffer, int buflen)
- {
- struct page *page = NULL;
-- int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ);
-+ int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
- if (res)
- return res;
- res = vfs_readlink(dentry, buffer, buflen, kmap(page));
-@@ -1603,7 +1609,7 @@ static int shmem_readlink(struct dentry
- static int shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
- {
- struct page *page = NULL;
-- int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ);
-+ int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
- if (res)
- return res;
- res = vfs_follow_link(nd, kmap(page));
-@@ -1972,6 +1978,7 @@ struct file *shmem_file_setup(char *name
- inode->i_nlink = 0; /* It is unlinked */
- file->f_vfsmnt = mntget(shm_mnt);
- file->f_dentry = dentry;
-+ file->f_mapping = inode->i_mapping;
- file->f_op = &shmem_file_operations;
- file->f_mode = FMODE_WRITE | FMODE_READ;
- return(file);
---- linux-2.6.0/mm/slab.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/slab.c 2003-12-28 23:26:36.000000000 -0800
-@@ -805,13 +805,14 @@ static inline void *kmem_getpages(kmem_c
- void *addr;
-
- flags |= cachep->gfpflags;
-- if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
-- atomic_add(1<<cachep->gfporder, &slab_reclaim_pages);
- addr = (void*)__get_free_pages(flags, cachep->gfporder);
- if (addr) {
- int i = (1 << cachep->gfporder);
- struct page *page = virt_to_page(addr);
-
-+ if (cachep->flags & SLAB_RECLAIM_ACCOUNT)
-+ atomic_add(i, &slab_reclaim_pages);
-+ add_page_state(nr_slab, i);
- while (i--) {
- SetPageSlab(page);
- page++;
-@@ -1180,7 +1181,8 @@ next:
- cachep = NULL;
- goto opps;
- }
-- slab_size = L1_CACHE_ALIGN(cachep->num*sizeof(kmem_bufctl_t)+sizeof(struct slab));
-+ slab_size = L1_CACHE_ALIGN(cachep->num*sizeof(kmem_bufctl_t) +
-+ sizeof(struct slab));
-
- /*
- * If the slab has been placed off-slab, and we have enough space then
-@@ -1224,10 +1226,13 @@ next:
- * the cache that's used by kmalloc(24), otherwise
- * the creation of further caches will BUG().
- */
-- cachep->array[smp_processor_id()] = &initarray_generic.cache;
-+ cachep->array[smp_processor_id()] =
-+ &initarray_generic.cache;
- g_cpucache_up = PARTIAL;
- } else {
-- cachep->array[smp_processor_id()] = kmalloc(sizeof(struct arraycache_init),GFP_KERNEL);
-+ cachep->array[smp_processor_id()] =
-+ kmalloc(sizeof(struct arraycache_init),
-+ GFP_KERNEL);
- }
- BUG_ON(!ac_data(cachep));
- ac_data(cachep)->avail = 0;
-@@ -1241,7 +1246,7 @@ next:
- }
-
- cachep->lists.next_reap = jiffies + REAPTIMEOUT_LIST3 +
-- ((unsigned long)cachep)%REAPTIMEOUT_LIST3;
-+ ((unsigned long)cachep)%REAPTIMEOUT_LIST3;
-
- /* Need the semaphore to access the chain. */
- down(&cache_chain_sem);
-@@ -1254,16 +1259,24 @@ next:
- list_for_each(p, &cache_chain) {
- kmem_cache_t *pc = list_entry(p, kmem_cache_t, next);
- char tmp;
-- /* This happens when the module gets unloaded and doesn't
-- destroy its slab cache and noone else reuses the vmalloc
-- area of the module. Print a warning. */
-- if (__get_user(tmp,pc->name)) {
-- printk("SLAB: cache with size %d has lost its name\n",
-- pc->objsize);
-+
-+ /*
-+ * This happens when the module gets unloaded and
-+ * doesn't destroy its slab cache and noone else reuses
-+ * the vmalloc area of the module. Print a warning.
-+ */
-+#ifdef CONFIG_X86_UACCESS_INDIRECT
-+ if (__direct_get_user(tmp,pc->name)) {
-+#else
-+ if (__get_user(tmp,pc->name)) {
-+#endif
-+ printk("SLAB: cache with size %d has lost its "
-+ "name\n", pc->objsize);
- continue;
- }
- if (!strcmp(pc->name,name)) {
-- printk("kmem_cache_create: duplicate cache %s\n",name);
-+ printk("kmem_cache_create: duplicate "
-+ "cache %s\n",name);
- up(&cache_chain_sem);
- BUG();
- }
-@@ -1608,7 +1621,6 @@ static int cache_grow (kmem_cache_t * ca
- do {
- SET_PAGE_CACHE(page, cachep);
- SET_PAGE_SLAB(page, slabp);
-- inc_page_state(nr_slab);
- page++;
- } while (--i);
-
-@@ -1890,6 +1902,15 @@ cache_alloc_debugcheck_after(kmem_cache_
- *dbg_redzone1(cachep, objp) = RED_ACTIVE;
- *dbg_redzone2(cachep, objp) = RED_ACTIVE;
- }
-+ {
-+ int objnr;
-+ struct slab *slabp;
-+
-+ slabp = GET_PAGE_SLAB(virt_to_page(objp));
-+
-+ objnr = (objp - slabp->s_mem) / cachep->objsize;
-+ slab_bufctl(slabp)[objnr] = (int)caller;
-+ }
- objp += obj_dbghead(cachep);
- if (cachep->ctor && cachep->flags & SLAB_POISON) {
- unsigned long ctor_flags = SLAB_CTOR_CONSTRUCTOR;
-@@ -1951,12 +1972,14 @@ static void free_block(kmem_cache_t *cac
- objnr = (objp - slabp->s_mem) / cachep->objsize;
- check_slabp(cachep, slabp);
- #if DEBUG
-+#if 0
- if (slab_bufctl(slabp)[objnr] != BUFCTL_FREE) {
- printk(KERN_ERR "slab: double free detected in cache '%s', objp %p.\n",
- cachep->name, objp);
- BUG();
- }
- #endif
-+#endif
- slab_bufctl(slabp)[objnr] = slabp->free;
- slabp->free = objnr;
- STATS_DEC_ACTIVE(cachep);
-@@ -2693,6 +2716,29 @@ struct seq_operations slabinfo_op = {
- .show = s_show,
- };
-
-+static void do_dump_slabp(kmem_cache_t *cachep)
-+{
-+#if DEBUG
-+ struct list_head *q;
-+
-+ check_irq_on();
-+ spin_lock_irq(&cachep->spinlock);
-+ list_for_each(q,&cachep->lists.slabs_full) {
-+ struct slab *slabp;
-+ int i;
-+ slabp = list_entry(q, struct slab, list);
-+ for (i = 0; i < cachep->num; i++) {
-+ unsigned long sym = slab_bufctl(slabp)[i];
-+
-+ printk("obj %p/%d: %p", slabp, i, (void *)sym);
-+ print_symbol(" <%s>", sym);
-+ printk("\n");
-+ }
-+ }
-+ spin_unlock_irq(&cachep->spinlock);
-+#endif
-+}
-+
- #define MAX_SLABINFO_WRITE 128
- /**
- * slabinfo_write - Tuning for the slab allocator
-@@ -2733,9 +2779,11 @@ ssize_t slabinfo_write(struct file *file
- batchcount < 1 ||
- batchcount > limit ||
- shared < 0) {
-- res = -EINVAL;
-+ do_dump_slabp(cachep);
-+ res = 0;
- } else {
-- res = do_tune_cpucache(cachep, limit, batchcount, shared);
-+ res = do_tune_cpucache(cachep, limit,
-+ batchcount, shared);
- }
- break;
- }
---- linux-2.6.0/mm/swap.c 2003-11-23 19:03:02.000000000 -0800
-+++ 25/mm/swap.c 2003-12-28 23:26:43.000000000 -0800
-@@ -348,12 +348,15 @@ void pagevec_strip(struct pagevec *pvec)
- * The search returns a group of mapping-contiguous pages with ascending
- * indexes. There may be holes in the indices due to not-present pages.
- *
-- * pagevec_lookup() returns the number of pages which were found.
-+ * pagevec_lookup() returns the number of pages which were found
-+ * and also atomically sets the next offset to continue looking up
-+ * mapping contiguous pages from (useful when doing a range of
-+ * pagevec lookups in chunks of PAGEVEC_SIZE).
- */
- unsigned int pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
-- pgoff_t start, unsigned int nr_pages)
-+ pgoff_t *next, unsigned int nr_pages)
- {
-- pvec->nr = find_get_pages(mapping, start, nr_pages, pvec->pages);
-+ pvec->nr = find_get_pages(mapping, next, nr_pages, pvec->pages);
- return pagevec_count(pvec);
- }
-
-@@ -386,17 +389,19 @@ EXPORT_SYMBOL(vm_acct_memory);
- #ifdef CONFIG_SMP
- void percpu_counter_mod(struct percpu_counter *fbc, long amount)
- {
-+ long count;
-+ long *pcount;
- int cpu = get_cpu();
-- long count = fbc->counters[cpu].count;
-
-- count += amount;
-+ pcount = per_cpu_ptr(fbc->counters, cpu);
-+ count = *pcount + amount;
- if (count >= FBC_BATCH || count <= -FBC_BATCH) {
- spin_lock(&fbc->lock);
- fbc->count += count;
- spin_unlock(&fbc->lock);
- count = 0;
- }
-- fbc->counters[cpu].count = count;
-+ *pcount = count;
- put_cpu();
- }
- EXPORT_SYMBOL(percpu_counter_mod);
---- linux-2.6.0/mm/swapfile.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/swapfile.c 2003-12-28 23:21:22.000000000 -0800
-@@ -912,7 +912,7 @@ static int setup_swap_extents(struct swa
- sector_t last_block;
- int ret;
-
-- inode = sis->swap_file->f_dentry->d_inode;
-+ inode = sis->swap_file->f_mapping->host;
- if (S_ISBLK(inode->i_mode)) {
- ret = add_swap_extent(sis, 0, sis->max, 0);
- goto done;
-@@ -1031,13 +1031,13 @@ asmlinkage long sys_swapoff(const char _
- if (IS_ERR(victim))
- goto out;
-
-- mapping = victim->f_dentry->d_inode->i_mapping;
-+ mapping = victim->f_mapping;
- prev = -1;
- swap_list_lock();
- for (type = swap_list.head; type >= 0; type = swap_info[type].next) {
- p = swap_info + type;
- if ((p->flags & SWP_ACTIVE) == SWP_ACTIVE) {
-- if (p->swap_file->f_dentry->d_inode->i_mapping==mapping)
-+ if (p->swap_file->f_mapping == mapping)
- break;
- }
- prev = type;
-@@ -1099,13 +1099,12 @@ asmlinkage long sys_swapoff(const char _
- swap_device_unlock(p);
- swap_list_unlock();
- vfree(swap_map);
-- if (S_ISBLK(swap_file->f_dentry->d_inode->i_mode)) {
-- struct block_device *bdev;
-- bdev = swap_file->f_dentry->d_inode->i_bdev;
-+ if (S_ISBLK(mapping->host->i_mode)) {
-+ struct block_device *bdev = I_BDEV(mapping->host);
- set_blocksize(bdev, p->old_block_size);
- bd_release(bdev);
- } else {
-- up(&swap_file->f_dentry->d_inode->i_mapping->host->i_sem);
-+ up(&mapping->host->i_sem);
- }
- filp_close(swap_file, NULL);
- err = 0;
-@@ -1231,8 +1230,8 @@ asmlinkage long sys_swapon(const char __
- int swapfilesize;
- unsigned short *swap_map;
- struct page *page = NULL;
-- struct inode *inode;
-- struct inode *downed_inode = NULL;
-+ struct inode *inode = NULL;
-+ int did_down = 0;
-
- if (!capable(CAP_SYS_ADMIN))
- return -EPERM;
-@@ -1279,8 +1278,8 @@ asmlinkage long sys_swapon(const char __
- }
-
- p->swap_file = swap_file;
-- inode = swap_file->f_dentry->d_inode;
-- mapping = swap_file->f_dentry->d_inode->i_mapping;
-+ mapping = swap_file->f_mapping;
-+ inode = mapping->host;
-
- error = -EBUSY;
- for (i = 0; i < nr_swapfiles; i++) {
-@@ -1288,32 +1287,32 @@ asmlinkage long sys_swapon(const char __
-
- if (i == type || !q->swap_file)
- continue;
-- if (mapping == q->swap_file->f_dentry->d_inode->i_mapping)
-+ if (mapping == q->swap_file->f_mapping)
- goto bad_swap;
- }
-
- error = -EINVAL;
- if (S_ISBLK(inode->i_mode)) {
-- bdev = inode->i_bdev;
-+ bdev = I_BDEV(inode);
- error = bd_claim(bdev, sys_swapon);
- if (error < 0) {
- bdev = NULL;
- goto bad_swap;
- }
- p->old_block_size = block_size(bdev);
-- error = set_blocksize(inode->i_bdev, PAGE_SIZE);
-+ error = set_blocksize(bdev, PAGE_SIZE);
- if (error < 0)
- goto bad_swap;
- p->bdev = bdev;
- } else if (S_ISREG(inode->i_mode)) {
- p->bdev = inode->i_sb->s_bdev;
-- downed_inode = mapping->host;
-- down(&downed_inode->i_sem);
-+ down(&inode->i_sem);
-+ did_down = 1;
- } else {
- goto bad_swap;
- }
-
-- swapfilesize = i_size_read(mapping->host) >> PAGE_SHIFT;
-+ swapfilesize = i_size_read(inode) >> PAGE_SHIFT;
-
- /*
- * Read the swap header.
-@@ -1465,8 +1464,8 @@ out:
- }
- if (name)
- putname(name);
-- if (error && downed_inode)
-- up(&downed_inode->i_sem);
-+ if (error && did_down)
-+ up(&inode->i_sem);
- return error;
- }
-
---- linux-2.6.0/mm/truncate.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/truncate.c 2003-12-28 23:26:43.000000000 -0800
-@@ -122,14 +122,10 @@ void truncate_inode_pages(struct address
-
- pagevec_init(&pvec, 0);
- next = start;
-- while (pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
-+ while (pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
- for (i = 0; i < pagevec_count(&pvec); i++) {
- struct page *page = pvec.pages[i];
-- pgoff_t page_index = page->index;
-
-- if (page_index > next)
-- next = page_index;
-- next++;
- if (TestSetPageLocked(page))
- continue;
- if (PageWriteback(page)) {
-@@ -155,7 +151,7 @@ void truncate_inode_pages(struct address
-
- next = start;
- for ( ; ; ) {
-- if (!pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
-+ if (!pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
- if (next == start)
- break;
- next = start;
-@@ -166,14 +162,19 @@ void truncate_inode_pages(struct address
-
- lock_page(page);
- wait_on_page_writeback(page);
-- if (page->index > next)
-- next = page->index;
-- next++;
- truncate_complete_page(mapping, page);
- unlock_page(page);
- }
- pagevec_release(&pvec);
- }
-+
-+ if (lstart == 0) {
-+ WARN_ON(mapping->nrpages);
-+ WARN_ON(!list_empty(&mapping->clean_pages));
-+ WARN_ON(!list_empty(&mapping->dirty_pages));
-+ WARN_ON(!list_empty(&mapping->locked_pages));
-+ WARN_ON(!list_empty(&mapping->io_pages));
-+ }
- }
-
- EXPORT_SYMBOL(truncate_inode_pages);
-@@ -201,17 +202,13 @@ unsigned long invalidate_mapping_pages(s
-
- pagevec_init(&pvec, 0);
- while (next <= end &&
-- pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
-+ pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
- for (i = 0; i < pagevec_count(&pvec); i++) {
- struct page *page = pvec.pages[i];
-
- if (TestSetPageLocked(page)) {
-- next++;
- continue;
- }
-- if (page->index > next)
-- next = page->index;
-- next++;
- if (PageDirty(page) || PageWriteback(page))
- goto unlock;
- if (page_mapped(page))
-@@ -250,14 +247,13 @@ void invalidate_inode_pages2(struct addr
- int i;
-
- pagevec_init(&pvec, 0);
-- while (pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE)) {
-+ while (pagevec_lookup(&pvec, mapping, &next, PAGEVEC_SIZE)) {
- for (i = 0; i < pagevec_count(&pvec); i++) {
- struct page *page = pvec.pages[i];
-
- lock_page(page);
- if (page->mapping == mapping) { /* truncate race? */
- wait_on_page_writeback(page);
-- next = page->index + 1;
- if (page_mapped(page))
- clear_page_dirty(page);
- else
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/mm/usercopy.c 2003-12-28 23:26:37.000000000 -0800
-@@ -0,0 +1,291 @@
-+/*
-+ * linux/mm/usercopy.c
-+ *
-+ * (C) Copyright 2003 Ingo Molnar
-+ *
-+ * Generic implementation of all the user-VM access functions, without
-+ * relying on being able to access the VM directly.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/highmem.h>
-+#include <linux/pagemap.h>
-+#include <linux/smp_lock.h>
-+#include <linux/ptrace.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/pgtable.h>
-+#include <asm/uaccess.h>
-+#include <asm/atomic_kmap.h>
-+
-+/*
-+ * Get kernel address of the user page and pin it.
-+ */
-+static inline struct page *pin_page(unsigned long addr, int write)
-+{
-+ struct mm_struct *mm = current->mm ? : &init_mm;
-+ struct page *page = NULL;
-+ int ret;
-+
-+ /*
-+ * Do a quick atomic lookup first - this is the fastpath.
-+ */
-+retry:
-+ page = follow_page(mm, addr, write);
-+ if (likely(page != NULL)) {
-+ if (!PageReserved(page))
-+ get_page(page);
-+ return page;
-+ }
-+
-+ /*
-+ * No luck - bad address or need to fault in the page:
-+ */
-+
-+ /* Release the lock so get_user_pages can sleep */
-+ spin_unlock(&mm->page_table_lock);
-+
-+ /*
-+ * In the context of filemap_copy_from_user(), we are not allowed
-+ * to sleep. We must fail this usercopy attempt and allow
-+ * filemap_copy_from_user() to recover: drop its atomic kmap and use
-+ * a sleeping kmap instead.
-+ */
-+ if (in_atomic()) {
-+ spin_lock(&mm->page_table_lock);
-+ return NULL;
-+ }
-+
-+ down_read(&mm->mmap_sem);
-+ ret = get_user_pages(current, mm, addr, 1, write, 0, NULL, NULL);
-+ up_read(&mm->mmap_sem);
-+ spin_lock(&mm->page_table_lock);
-+
-+ if (ret <= 0)
-+ return NULL;
-+
-+ /*
-+ * Go try the follow_page again.
-+ */
-+ goto retry;
-+}
-+
-+static inline void unpin_page(struct page *page)
-+{
-+ put_page(page);
-+}
-+
-+/*
-+ * Access another process' address space.
-+ * Source/target buffer must be kernel space,
-+ * Do not walk the page table directly, use get_user_pages
-+ */
-+static int rw_vm(unsigned long addr, void *buf, int len, int write)
-+{
-+ struct mm_struct *mm = current->mm ? : &init_mm;
-+
-+ if (!len)
-+ return 0;
-+
-+ spin_lock(&mm->page_table_lock);
-+
-+ /* ignore errors, just check how much was sucessfully transfered */
-+ while (len) {
-+ struct page *page = NULL;
-+ int bytes, offset;
-+ void *maddr;
-+
-+ page = pin_page(addr, write);
-+ if (!page)
-+ break;
-+
-+ bytes = len;
-+ offset = addr & (PAGE_SIZE-1);
-+ if (bytes > PAGE_SIZE-offset)
-+ bytes = PAGE_SIZE-offset;
-+
-+ maddr = kmap_atomic(page, KM_USER_COPY);
-+
-+#define HANDLE_TYPE(type) \
-+ case sizeof(type): *(type *)(maddr+offset) = *(type *)(buf); break;
-+
-+ if (write) {
-+ switch (bytes) {
-+ HANDLE_TYPE(char);
-+ HANDLE_TYPE(int);
-+ HANDLE_TYPE(long long);
-+ default:
-+ memcpy(maddr + offset, buf, bytes);
-+ }
-+ } else {
-+#undef HANDLE_TYPE
-+#define HANDLE_TYPE(type) \
-+ case sizeof(type): *(type *)(buf) = *(type *)(maddr+offset); break;
-+ switch (bytes) {
-+ HANDLE_TYPE(char);
-+ HANDLE_TYPE(int);
-+ HANDLE_TYPE(long long);
-+ default:
-+ memcpy(buf, maddr + offset, bytes);
-+ }
-+#undef HANDLE_TYPE
-+ }
-+ kunmap_atomic(maddr, KM_USER_COPY);
-+ unpin_page(page);
-+ len -= bytes;
-+ buf += bytes;
-+ addr += bytes;
-+ }
-+ spin_unlock(&mm->page_table_lock);
-+
-+ return len;
-+}
-+
-+static int str_vm(unsigned long addr, void *buf0, int len, int copy)
-+{
-+ struct mm_struct *mm = current->mm ? : &init_mm;
-+ struct page *page;
-+ void *buf = buf0;
-+
-+ if (!len)
-+ return len;
-+
-+ spin_lock(&mm->page_table_lock);
-+
-+ /* ignore errors, just check how much was sucessfully transfered */
-+ while (len) {
-+ int bytes, offset, left, copied;
-+ char *maddr;
-+
-+ page = pin_page(addr, copy == 2);
-+ if (!page) {
-+ spin_unlock(&mm->page_table_lock);
-+ return -EFAULT;
-+ }
-+ bytes = len;
-+ offset = addr & (PAGE_SIZE-1);
-+ if (bytes > PAGE_SIZE-offset)
-+ bytes = PAGE_SIZE-offset;
-+
-+ maddr = kmap_atomic(page, KM_USER_COPY);
-+ if (copy == 2) {
-+ memset(maddr + offset, 0, bytes);
-+ copied = bytes;
-+ left = 0;
-+ } else if (copy == 1) {
-+ left = strncpy_count(buf, maddr + offset, bytes);
-+ copied = bytes - left;
-+ } else {
-+ copied = strnlen(maddr + offset, bytes);
-+ left = bytes - copied;
-+ }
-+ BUG_ON(bytes < 0 || copied < 0);
-+ kunmap_atomic(maddr, KM_USER_COPY);
-+ unpin_page(page);
-+ len -= copied;
-+ buf += copied;
-+ addr += copied;
-+ if (left)
-+ break;
-+ }
-+ spin_unlock(&mm->page_table_lock);
-+
-+ return len;
-+}
-+
-+/*
-+ * Copies memory from userspace (ptr) into kernelspace (val).
-+ *
-+ * returns # of bytes not copied.
-+ */
-+int get_user_size(unsigned int size, void *val, const void *ptr)
-+{
-+ int ret;
-+
-+ if (unlikely(segment_eq(get_fs(), KERNEL_DS)))
-+ ret = __direct_copy_from_user(val, ptr, size);
-+ else
-+ ret = rw_vm((unsigned long)ptr, val, size, 0);
-+ if (ret)
-+ /*
-+ * Zero the rest:
-+ */
-+ memset(val + size - ret, 0, ret);
-+ return ret;
-+}
-+
-+/*
-+ * Copies memory from kernelspace (val) into userspace (ptr).
-+ *
-+ * returns # of bytes not copied.
-+ */
-+int put_user_size(unsigned int size, const void *val, void *ptr)
-+{
-+ if (unlikely(segment_eq(get_fs(), KERNEL_DS)))
-+ return __direct_copy_to_user(ptr, val, size);
-+ else
-+ return rw_vm((unsigned long)ptr, (void *)val, size, 1);
-+}
-+
-+int copy_str_fromuser_size(unsigned int size, void *val, const void *ptr)
-+{
-+ int copied, left;
-+
-+ if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
-+ left = strncpy_count(val, ptr, size);
-+ copied = size - left;
-+ BUG_ON(copied < 0);
-+
-+ return copied;
-+ }
-+ left = str_vm((unsigned long)ptr, val, size, 1);
-+ if (left < 0)
-+ return left;
-+ copied = size - left;
-+ BUG_ON(copied < 0);
-+
-+ return copied;
-+}
-+
-+int strlen_fromuser_size(unsigned int size, const void *ptr)
-+{
-+ int copied, left;
-+
-+ if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
-+ copied = strnlen(ptr, size) + 1;
-+ BUG_ON(copied < 0);
-+
-+ return copied;
-+ }
-+ left = str_vm((unsigned long)ptr, NULL, size, 0);
-+ if (left < 0)
-+ return 0;
-+ copied = size - left + 1;
-+ BUG_ON(copied < 0);
-+
-+ return copied;
-+}
-+
-+int zero_user_size(unsigned int size, void *ptr)
-+{
-+ int left;
-+
-+ if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
-+ memset(ptr, 0, size);
-+ return 0;
-+ }
-+ left = str_vm((unsigned long)ptr, NULL, size, 2);
-+ if (left < 0)
-+ return size;
-+ return left;
-+}
-+
-+EXPORT_SYMBOL(get_user_size);
-+EXPORT_SYMBOL(put_user_size);
-+EXPORT_SYMBOL(zero_user_size);
-+EXPORT_SYMBOL(copy_str_fromuser_size);
-+EXPORT_SYMBOL(strlen_fromuser_size);
-+
---- linux-2.6.0/mm/vmscan.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/mm/vmscan.c 2003-12-28 23:23:03.000000000 -0800
-@@ -154,7 +154,7 @@ static int shrink_slab(long scanned, uns
- list_for_each_entry(shrinker, &shrinker_list, list) {
- unsigned long long delta;
-
-- delta = scanned * shrinker->seeks;
-+ delta = 4 * (scanned / shrinker->seeks);
- delta *= (*shrinker->shrinker)(0, gfp_mask);
- do_div(delta, pages + 1);
- shrinker->nr += delta;
-@@ -779,7 +779,7 @@ shrink_zone(struct zone *zone, int max_s
- count = atomic_read(&zone->refill_counter);
- if (count > SWAP_CLUSTER_MAX * 4)
- count = SWAP_CLUSTER_MAX * 4;
-- atomic_sub(count, &zone->refill_counter);
-+ atomic_set(&zone->refill_counter, 0);
- refill_inactive_zone(zone, count, ps, priority);
- }
- return shrink_cache(nr_pages, zone, gfp_mask,
-@@ -803,16 +803,15 @@ shrink_zone(struct zone *zone, int max_s
- * scan then give up on it.
- */
- static int
--shrink_caches(struct zone *classzone, int priority, int *total_scanned,
-+shrink_caches(struct zone **zones, int priority, int *total_scanned,
- int gfp_mask, int nr_pages, struct page_state *ps)
- {
-- struct zone *first_classzone;
-- struct zone *zone;
- int ret = 0;
-+ int i;
-
-- first_classzone = classzone->zone_pgdat->node_zones;
-- for (zone = classzone; zone >= first_classzone; zone--) {
-+ for (i = 0; zones[i] != NULL; i++) {
- int to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX);
-+ struct zone *zone = zones[i];
- int nr_mapped = 0;
- int max_scan;
-
-@@ -855,27 +854,27 @@ shrink_caches(struct zone *classzone, in
- * excessive rotation of the inactive list, which is _supposed_ to be an LRU,
- * yes?
- */
--int try_to_free_pages(struct zone *cz,
-+int try_to_free_pages(struct zone **zones,
- unsigned int gfp_mask, unsigned int order)
- {
- int priority;
- int ret = 0;
- const int nr_pages = SWAP_CLUSTER_MAX;
- int nr_reclaimed = 0;
-- struct zone *zone;
- struct reclaim_state *reclaim_state = current->reclaim_state;
-+ int i;
-
- inc_page_state(allocstall);
-
-- for (zone = cz; zone >= cz->zone_pgdat->node_zones; --zone)
-- zone->temp_priority = DEF_PRIORITY;
-+ for (i = 0; zones[i] != 0; i++)
-+ zones[i]->temp_priority = DEF_PRIORITY;
-
- for (priority = DEF_PRIORITY; priority >= 0; priority--) {
- int total_scanned = 0;
- struct page_state ps;
-
- get_page_state(&ps);
-- nr_reclaimed += shrink_caches(cz, priority, &total_scanned,
-+ nr_reclaimed += shrink_caches(zones, priority, &total_scanned,
- gfp_mask, nr_pages, &ps);
- if (nr_reclaimed >= nr_pages) {
- ret = 1;
-@@ -892,7 +891,7 @@ int try_to_free_pages(struct zone *cz,
-
- /* Take a nap, wait for some writeback to complete */
- blk_congestion_wait(WRITE, HZ/10);
-- if (cz - cz->zone_pgdat->node_zones < ZONE_HIGHMEM) {
-+ if (zones[0] - zones[0]->zone_pgdat->node_zones < ZONE_HIGHMEM) {
- shrink_slab(total_scanned, gfp_mask);
- if (reclaim_state) {
- nr_reclaimed += reclaim_state->reclaimed_slab;
-@@ -903,8 +902,8 @@ int try_to_free_pages(struct zone *cz,
- if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY))
- out_of_memory();
- out:
-- for (zone = cz; zone >= cz->zone_pgdat->node_zones; --zone)
-- zone->prev_priority = zone->temp_priority;
-+ for (i = 0; zones[i] != 0; i++)
-+ zones[i]->prev_priority = zones[i]->temp_priority;
- return ret;
- }
-
---- linux-2.6.0/net/atm/clip.c 2003-10-17 15:58:05.000000000 -0700
-+++ 25/net/atm/clip.c 2003-12-28 23:21:01.000000000 -0800
-@@ -563,32 +563,20 @@ static int clip_setentry(struct atm_vcc
- }
-
-
--static int clip_init(struct net_device *dev)
-+static void clip_setup(struct net_device *dev)
- {
-- DPRINTK("clip_init %s\n",dev->name);
- dev->hard_start_xmit = clip_start_xmit;
- /* sg_xmit ... */
-- dev->hard_header = NULL;
-- dev->rebuild_header = NULL;
-- dev->set_mac_address = NULL;
-- dev->hard_header_parse = NULL;
-- dev->hard_header_cache = NULL;
-- dev->header_cache_update = NULL;
-- dev->change_mtu = NULL;
-- dev->do_ioctl = NULL;
- dev->get_stats = clip_get_stats;
- dev->type = ARPHRD_ATM;
- dev->hard_header_len = RFC1483LLC_LEN;
- dev->mtu = RFC1626_MTU;
-- dev->addr_len = 0;
- dev->tx_queue_len = 100; /* "normal" queue (packets) */
- /* When using a "real" qdisc, the qdisc determines the queue */
- /* length. tx_queue_len is only used for the default case, */
- /* without any more elaborate queuing. 100 is a reasonable */
- /* compromise between decent burst-tolerance and protection */
- /* against memory hogs. */
-- dev->flags = 0;
-- return 0;
- }
-
-
-@@ -608,18 +596,16 @@ static int clip_create(int number)
- if (PRIV(dev)->number >= number)
- number = PRIV(dev)->number+1;
- }
-- dev = kmalloc(sizeof(struct net_device)+sizeof(struct clip_priv),
-- GFP_KERNEL);
-- if (!dev) return -ENOMEM;
-- memset(dev,0,sizeof(struct net_device)+sizeof(struct clip_priv));
-+ dev = alloc_netdev(sizeof(struct clip_priv), "", clip_setup);
-+ if (!dev)
-+ return -ENOMEM;
- clip_priv = PRIV(dev);
- sprintf(dev->name,"atm%d",number);
-- dev->init = clip_init;
- spin_lock_init(&clip_priv->xoff_lock);
- clip_priv->number = number;
- error = register_netdev(dev);
- if (error) {
-- kfree(dev);
-+ free_netdev(dev);
- return error;
- }
- clip_priv->next = clip_devs;
-@@ -634,7 +620,7 @@ static int clip_device_event(struct noti
- {
- /* ignore non-CLIP devices */
- if (((struct net_device *) dev)->type != ARPHRD_ATM ||
-- ((struct net_device *) dev)->init != clip_init)
-+ ((struct net_device *) dev)->hard_start_xmit != clip_start_xmit)
- return NOTIFY_DONE;
- switch (event) {
- case NETDEV_UP:
---- linux-2.6.0/net/bridge/br_if.c 2003-07-27 12:14:40.000000000 -0700
-+++ 25/net/bridge/br_if.c 2003-12-28 23:21:01.000000000 -0800
-@@ -172,7 +172,7 @@ int br_add_bridge(const char *name)
-
- ret = register_netdev(br->dev);
- if (ret)
-- kfree(br->dev);
-+ free_netdev(br->dev);
- return ret;
- }
-
---- linux-2.6.0/net/bridge/netfilter/Kconfig 2003-10-17 15:58:05.000000000 -0700
-+++ 25/net/bridge/netfilter/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -92,7 +92,7 @@ config BRIDGE_EBT_LIMIT
- equivalent of the iptables limit match.
-
- If you want to compile it as a module, say M here and read
-- <file:Documentation/modules.txt>. If unsure, say `N'.
-+ <file:Documentation/kbuild/modules.txt>. If unsure, say `N'.
-
- config BRIDGE_EBT_MARK
- tristate "ebt: mark filter support"
---- linux-2.6.0/net/core/dev.c 2003-11-23 19:03:03.000000000 -0800
-+++ 25/net/core/dev.c 2003-12-28 23:21:10.000000000 -0800
-@@ -105,6 +105,7 @@
- #include <linux/kmod.h>
- #include <linux/module.h>
- #include <linux/kallsyms.h>
-+#include <linux/netpoll.h>
- #ifdef CONFIG_NET_RADIO
- #include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
- #include <net/iw_handler.h>
-@@ -371,6 +372,30 @@ int netdev_boot_setup_check(struct net_d
- return 0;
- }
-
-+
-+/**
-+ * netdev_boot_base - get address from boot time settings
-+ * @prefix: prefix for network device
-+ * @unit: id for network device
-+ *
-+ * Check boot time settings for the base address of device.
-+ * The found settings are set for the device to be used
-+ * later in the device probing.
-+ * Returns 0 if no settings found.
-+ */
-+unsigned long netdev_boot_base(const char *prefix, int unit)
-+{
-+ const struct netdev_boot_setup *s = dev_boot_setup;
-+ char name[IFNAMSIZ];
-+ int i;
-+
-+ sprintf(name, "%s%d", prefix, unit);
-+ for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++)
-+ if (!strcmp(name, s[i].name))
-+ return s[i].map.base_addr;
-+ return 0;
-+}
-+
- /*
- * Saves at boot time configured settings for any netdevice.
- */
-@@ -1380,7 +1405,6 @@ static void sample_queue(unsigned long d
- }
- #endif
-
--
- /**
- * netif_rx - post buffer to the network code
- * @skb: buffer to post
-@@ -1405,6 +1429,13 @@ int netif_rx(struct sk_buff *skb)
- struct softnet_data *queue;
- unsigned long flags;
-
-+#ifdef CONFIG_NETPOLL_RX
-+ if (skb->dev->netpoll_rx && netpoll_rx(skb)) {
-+ kfree_skb(skb);
-+ return NET_RX_DROP;
-+ }
-+#endif
-+
- if (!skb->stamp.tv_sec)
- do_gettimeofday(&skb->stamp);
-
-@@ -1560,6 +1591,13 @@ int netif_receive_skb(struct sk_buff *sk
- int ret = NET_RX_DROP;
- unsigned short type = skb->protocol;
-
-+#ifdef CONFIG_NETPOLL_RX
-+ if (skb->dev->netpoll_rx && skb->dev->poll && netpoll_rx(skb)) {
-+ kfree_skb(skb);
-+ return NET_RX_DROP;
-+ }
-+#endif
-+
- if (!skb->stamp.tv_sec)
- do_gettimeofday(&skb->stamp);
-
-@@ -1684,7 +1722,6 @@ static void net_rx_action(struct softirq
- unsigned long start_time = jiffies;
- int budget = netdev_max_backlog;
-
--
- preempt_disable();
- local_irq_disable();
-
-@@ -1711,6 +1748,10 @@ static void net_rx_action(struct softirq
- dev_put(dev);
- local_irq_disable();
- }
-+
-+#ifdef CONFIG_KGDBOE
-+ kgdb_process_breakpoint();
-+#endif
- }
- out:
- local_irq_enable();
-@@ -2875,7 +2916,7 @@ void free_netdev(struct net_device *dev)
- {
- /* Compatiablity with error handling in drivers */
- if (dev->reg_state == NETREG_UNINITIALIZED) {
-- kfree(dev);
-+ kfree((char *)dev - dev->padded);
- return;
- }
-
---- linux-2.6.0/net/core/Makefile 2003-09-08 13:58:59.000000000 -0700
-+++ 25/net/core/Makefile 2003-12-28 23:21:01.000000000 -0800
-@@ -13,3 +13,4 @@ obj-$(CONFIG_NETFILTER) += netfilter.o
- obj-$(CONFIG_NET_DIVERT) += dv.o
- obj-$(CONFIG_NET_PKTGEN) += pktgen.o
- obj-$(CONFIG_NET_RADIO) += wireless.o
-+obj-$(CONFIG_NETPOLL) += netpoll.o
---- /dev/null 2002-08-30 16:31:37.000000000 -0700
-+++ 25/net/core/netpoll.c 2003-12-28 23:21:01.000000000 -0800
-@@ -0,0 +1,642 @@
-+/*
-+ * Common framework for low-level network console, dump, and debugger code
-+ *
-+ * Sep 8 2003 Matt Mackall <mpm@selenic.com>
-+ */
-+
-+#include <linux/smp_lock.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/string.h>
-+#include <linux/inetdevice.h>
-+#include <linux/inet.h>
-+#include <linux/interrupt.h>
-+#include <linux/netpoll.h>
-+#include <linux/sched.h>
-+#include <net/tcp.h>
-+#include <net/udp.h>
-+
-+/*
-+ * We maintain a small pool of fully-sized skbs, to make sure the
-+ * message gets out even in extreme OOM situations.
-+ */
-+
-+#define MAX_SKBS 32
-+#define MAX_UDP_CHUNK 1460
-+
-+static spinlock_t skb_list_lock = SPIN_LOCK_UNLOCKED;
-+static int nr_skbs;
-+static struct sk_buff *skbs;
-+
-+static spinlock_t rx_list_lock = SPIN_LOCK_UNLOCKED;
-+static LIST_HEAD(rx_list);
-+
-+static int trapped;
-+
-+#define MAX_SKB_SIZE \
-+ (MAX_UDP_CHUNK + sizeof(struct udphdr) + \
-+ sizeof(struct iphdr) + sizeof(struct ethhdr))
-+
-+static void zap_completion_queue(void);
-+
-+static int checksum_udp(struct sk_buff *skb, struct udphdr *uh,
-+ unsigned short ulen, u32 saddr, u32 daddr)
-+{
-+ if (uh->check == 0)
-+ return 0;
-+
-+ if (skb->ip_summed == CHECKSUM_HW)
-+ return csum_tcpudp_magic(
-+ saddr, daddr, ulen, IPPROTO_UDP, skb->csum);
-+
-+ skb->csum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
-+
-+ return csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
-+}
-+
-+void netpoll_poll(struct netpoll *np)
-+{
-+ int budget = 1;
-+
-+ if(!np->dev || !netif_running(np->dev) || !np->dev->poll_controller)
-+ return;
-+
-+ /* Process pending work on NIC */
-+ np->dev->poll_controller(np->dev);
-+
-+ /* If scheduling is stopped, tickle NAPI bits */
-+ if(trapped && np->dev->poll &&
-+ test_bit(__LINK_STATE_RX_SCHED, &np->dev->state))
-+ np->dev->poll(np->dev, &budget);
-+ zap_completion_queue();
-+}
-+
-+static void refill_skbs(void)
-+{
-+ struct sk_buff *skb;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&skb_list_lock, flags);
-+ while (nr_skbs < MAX_SKBS) {
-+ skb = alloc_skb(MAX_SKB_SIZE, GFP_ATOMIC);
-+ if (!skb)
-+ break;
-+
-+ skb->next = skbs;
-+ skbs = skb;
-+ nr_skbs++;
-+ }
-+ spin_unlock_irqrestore(&skb_list_lock, flags);
-+}
-+
-+static void zap_completion_queue(void)
-+{
-+ unsigned long flags;
-+ struct softnet_data *sd = &get_cpu_var(softnet_data);
-+
-+ if (sd->completion_queue) {
-+ struct sk_buff *clist;
-+
-+ local_irq_save(flags);
-+ clist = sd->completion_queue;
-+ sd->completion_queue = NULL;
-+ local_irq_restore(flags);
-+
-+ while (clist != NULL) {
-+ struct sk_buff *skb = clist;
-+ clist = clist->next;
-+ __kfree_skb(skb);
-+ }
-+ }
-+
-+ put_cpu_var(softnet_data);
-+}
-+
-+static struct sk_buff * find_skb(struct netpoll *np, int len, int reserve)
-+{
-+ int once = 1, count = 0;
-+ unsigned long flags;
-+ struct sk_buff *skb = NULL;
-+
-+ zap_completion_queue();
-+repeat:
-+ if (nr_skbs < MAX_SKBS)
-+ refill_skbs();
-+
-+ skb = alloc_skb(len, GFP_ATOMIC);
-+
-+ if (!skb) {
-+ spin_lock_irqsave(&skb_list_lock, flags);
-+ skb = skbs;
-+ if (skb)
-+ skbs = skb->next;
-+ skb->next = NULL;
-+ nr_skbs--;
-+ spin_unlock_irqrestore(&skb_list_lock, flags);
-+ }
-+
-+ if(!skb) {
-+ count++;
-+ if (once && (count == 1000000)) {
-+ printk("out of netpoll skbs!\n");
-+ once = 0;
-+ }
-+ netpoll_poll(np);
-+ goto repeat;
-+ }
-+
-+ atomic_set(&skb->users, 1);
-+ skb_reserve(skb, reserve);
-+ return skb;
-+}
-+
-+void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
-+{
-+ int status;
-+
-+repeat:
-+ if(!np || !np->dev || !netif_running(np->dev)) {
-+ __kfree_skb(skb);
-+ return;
-+ }
-+
-+ spin_lock(&np->dev->xmit_lock);
-+ np->dev->xmit_lock_owner = smp_processor_id();
-+
-+ if (netif_queue_stopped(np->dev)) {
-+ np->dev->xmit_lock_owner = -1;
-+ spin_unlock(&np->dev->xmit_lock);
-+
-+ netpoll_poll(np);
-+ goto repeat;
-+ }
-+
-+ status = np->dev->hard_start_xmit(skb, np->dev);
-+ np->dev->xmit_lock_owner = -1;
-+ spin_unlock(&np->dev->xmit_lock);
-+
-+ /* transmit busy */
-+ if(status)
-+ goto repeat;
-+}
-+
-+void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
-+{
-+ int total_len, eth_len, ip_len, udp_len;
-+ struct sk_buff *skb;
-+ struct udphdr *udph;
-+ struct iphdr *iph;
-+ struct ethhdr *eth;
-+
-+ udp_len = len + sizeof(*udph);
-+ ip_len = eth_len = udp_len + sizeof(*iph);
-+ total_len = eth_len + ETH_HLEN;
-+
-+ skb = find_skb(np, total_len, total_len - len);
-+ if (!skb)
-+ return;
-+
-+ memcpy(skb->data, msg, len);
-+ skb->len += len;
-+
-+ udph = (struct udphdr *) skb_push(skb, sizeof(*udph));
-+ udph->source = htons(np->local_port);
-+ udph->dest = htons(np->remote_port);
-+ udph->len = htons(udp_len);
-+ udph->check = 0;
-+
-+ iph = (struct iphdr *)skb_push(skb, sizeof(*iph));
-+
-+ iph->version = 4;
-+ iph->ihl = 5;
-+ iph->tos = 0;
-+ iph->tot_len = htons(ip_len);
-+ iph->id = 0;
-+ iph->frag_off = 0;
-+ iph->ttl = 64;
-+ iph->protocol = IPPROTO_UDP;
-+ iph->check = 0;
-+ iph->saddr = htonl(np->local_ip);
-+ iph->daddr = htonl(np->remote_ip);
-+ iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
-+
-+ eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
-+
-+ eth->h_proto = htons(ETH_P_IP);
-+ memcpy(eth->h_source, np->local_mac, 6);
-+ memcpy(eth->h_dest, np->remote_mac, 6);
-+
-+ netpoll_send_skb(np, skb);
-+}
-+
-+static void arp_reply(struct sk_buff *skb)
-+{
-+ struct in_device *in_dev = (struct in_device *) skb->dev->ip_ptr;
-+ struct arphdr *arp;
-+ unsigned char *arp_ptr, *sha, *tha;
-+ int size, type = ARPOP_REPLY, ptype = ETH_P_ARP;
-+ u32 sip, tip;
-+ struct sk_buff *send_skb;
-+ unsigned long flags;
-+ struct list_head *p;
-+ struct netpoll *np = 0;
-+
-+ spin_lock_irqsave(&rx_list_lock, flags);
-+ list_for_each(p, &rx_list) {
-+ np = list_entry(p, struct netpoll, rx_list);
-+ if ( np->dev == skb->dev )
-+ break;
-+ np = 0;
-+ }
-+ spin_unlock_irqrestore(&rx_list_lock, flags);
-+
-+ if (!np) return;
-+
-+ /* No arp on this interface */
-+ if (!in_dev || skb->dev->flags & IFF_NOARP)
-+ return;
-+
-+ if (!pskb_may_pull(skb, (sizeof(struct arphdr) +
-+ (2 * skb->dev->addr_len) +
-+ (2 * sizeof(u32)))))
-+ return;
-+
-+ skb->h.raw = skb->nh.raw = skb->data;
-+ arp = skb->nh.arph;
-+
-+ if ((arp->ar_hrd != htons(ARPHRD_ETHER) &&
-+ arp->ar_hrd != htons(ARPHRD_IEEE802)) ||
-+ arp->ar_pro != htons(ETH_P_IP) ||
-+ arp->ar_op != htons(ARPOP_REQUEST))
-+ return;
-+
-+ arp_ptr= (unsigned char *)(arp+1);
-+ sha = arp_ptr;
-+ arp_ptr += skb->dev->addr_len;
-+ memcpy(&sip, arp_ptr, 4);
-+ arp_ptr += 4;
-+ tha = arp_ptr;
-+ arp_ptr += skb->dev->addr_len;
-+ memcpy(&tip, arp_ptr, 4);
-+
-+ /* Should we ignore arp? */
-+ if (tip != in_dev->ifa_list->ifa_address ||
-+ LOOPBACK(tip) || MULTICAST(tip))
-+ return;
-+
-+
-+ size = sizeof(struct arphdr) + 2 * (skb->dev->addr_len + 4);
-+ send_skb = find_skb(np, size + LL_RESERVED_SPACE(np->dev),
-+ LL_RESERVED_SPACE(np->dev));
-+
-+ if (!send_skb)
-+ return;
-+
-+ send_skb->nh.raw = send_skb->data;
-+ arp = (struct arphdr *) skb_put(send_skb, size);
-+ send_skb->dev = skb->dev;
-+ send_skb->protocol = htons(ETH_P_ARP);
-+
-+ /* Fill the device header for the ARP frame */
-+
-+ if (np->dev->hard_header &&
-+ np->dev->hard_header(send_skb, skb->dev, ptype,
-+ np->remote_mac, np->local_mac,
-+ send_skb->len) < 0) {
-+ kfree_skb(send_skb);
-+ return;
-+ }
-+
-+ /*
-+ * Fill out the arp protocol part.
-+ *
-+ * we only support ethernet device type,
-+ * which (according to RFC 1390) should always equal 1 (Ethernet).
-+ */
-+
-+ arp->ar_hrd = htons(np->dev->type);
-+ arp->ar_pro = htons(ETH_P_IP);
-+ arp->ar_hln = np->dev->addr_len;
-+ arp->ar_pln = 4;
-+ arp->ar_op = htons(type);
-+
-+ arp_ptr=(unsigned char *)(arp + 1);
-+ memcpy(arp_ptr, np->dev->dev_addr, np->dev->addr_len);
-+ arp_ptr += np->dev->addr_len;
-+ memcpy(arp_ptr, &tip, 4);
-+ arp_ptr += 4;
-+ memcpy(arp_ptr, np->local_mac, np->dev->addr_len);
-+ arp_ptr += np->dev->addr_len;
-+ memcpy(arp_ptr, &sip, 4);
-+
-+ netpoll_send_skb(np, send_skb);
-+}
-+
-+int netpoll_rx(struct sk_buff *skb)
-+{
-+ int proto, len, ulen;
-+ struct iphdr *iph;
-+ struct udphdr *uh;
-+ struct netpoll *np;
-+ struct list_head *p;
-+ unsigned long flags;
-+
-+ if (skb->dev->type != ARPHRD_ETHER)
-+ goto out;
-+
-+ /* check if netpoll clients need ARP */
-+ if (skb->protocol == __constant_htons(ETH_P_ARP) && trapped) {
-+ arp_reply(skb);
-+ return 1;
-+ }
-+
-+ proto = ntohs(skb->mac.ethernet->h_proto);
-+ if (proto != ETH_P_IP)
-+ goto out;
-+ if (skb->pkt_type == PACKET_OTHERHOST)
-+ goto out;
-+ if (skb_shared(skb))
-+ goto out;
-+
-+ iph = (struct iphdr *)skb->data;
-+ if (!pskb_may_pull(skb, sizeof(struct iphdr)))
-+ goto out;
-+ if (iph->ihl < 5 || iph->version != 4)
-+ goto out;
-+ if (!pskb_may_pull(skb, iph->ihl*4))
-+ goto out;
-+ if (ip_fast_csum((u8 *)iph, iph->ihl) != 0)
-+ goto out;
-+
-+ len = ntohs(iph->tot_len);
-+ if (skb->len < len || len < iph->ihl*4)
-+ goto out;
-+
-+ if (iph->protocol != IPPROTO_UDP)
-+ goto out;
-+
-+ len -= iph->ihl*4;
-+ uh = (struct udphdr *)(((char *)iph) + iph->ihl*4);
-+ ulen = ntohs(uh->len);
-+
-+ if (ulen != len)
-+ goto out;
-+ if (checksum_udp(skb, uh, ulen, iph->saddr, iph->daddr) < 0)
-+ goto out;
-+
-+ spin_lock_irqsave(&rx_list_lock, flags);
-+ list_for_each(p, &rx_list) {
-+ np = list_entry(p, struct netpoll, rx_list);
-+ if (np->dev && np->dev != skb->dev)
-+ continue;
-+ if (np->local_ip && np->local_ip != ntohl(iph->daddr))
-+ continue;
-+ if (np->remote_ip && np->remote_ip != ntohl(iph->saddr))
-+ continue;
-+ if (np->local_port && np->local_port != ntohs(uh->dest))
-+ continue;
-+
-+ spin_unlock_irqrestore(&rx_list_lock, flags);
-+
-+ if (np->rx_hook)
-+ np->rx_hook(np, ntohs(uh->source),
-+ (char *)(uh+1), ulen-sizeof(uh)-4);
-+
-+ return 1;
-+ }
-+ spin_unlock_irqrestore(&rx_list_lock, flags);
-+
-+out:
-+ return trapped;
-+}
-+
-+int netpoll_parse_options(struct netpoll *np, char *opt)
-+{
-+ char *cur=opt, *delim;
-+
-+ if(*cur != '@') {
-+ if ((delim = strchr(cur, '@')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->local_port=simple_strtol(cur, 0, 10);
-+ cur=delim;
-+ }
-+ cur++;
-+ printk(KERN_INFO "%s: local port %d\n", np->name, np->local_port);
-+
-+ if(*cur != '/') {
-+ if ((delim = strchr(cur, '/')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->local_ip=ntohl(in_aton(cur));
-+ cur=delim;
-+
-+ printk(KERN_INFO "%s: local IP %d.%d.%d.%d\n",
-+ np->name, HIPQUAD(np->local_ip));
-+ }
-+ cur++;
-+
-+ if ( *cur != ',') {
-+ /* parse out dev name */
-+ if ((delim = strchr(cur, ',')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ strlcpy(np->dev_name, cur, sizeof(np->dev_name));
-+ cur=delim;
-+ }
-+ cur++;
-+
-+ printk(KERN_INFO "%s: interface %s\n", np->name, np->dev_name);
-+
-+ if ( *cur != '@' ) {
-+ /* dst port */
-+ if ((delim = strchr(cur, '@')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->remote_port=simple_strtol(cur, 0, 10);
-+ cur=delim;
-+ }
-+ cur++;
-+ printk(KERN_INFO "%s: remote port %d\n", np->name, np->remote_port);
-+
-+ /* dst ip */
-+ if ((delim = strchr(cur, '/')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->remote_ip=ntohl(in_aton(cur));
-+ cur=delim+1;
-+
-+ printk(KERN_INFO "%s: remote IP %d.%d.%d.%d\n",
-+ np->name, HIPQUAD(np->remote_ip));
-+
-+ if( *cur != 0 )
-+ {
-+ /* MAC address */
-+ if ((delim = strchr(cur, ':')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->remote_mac[0]=simple_strtol(cur, 0, 16);
-+ cur=delim+1;
-+ if ((delim = strchr(cur, ':')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->remote_mac[1]=simple_strtol(cur, 0, 16);
-+ cur=delim+1;
-+ if ((delim = strchr(cur, ':')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->remote_mac[2]=simple_strtol(cur, 0, 16);
-+ cur=delim+1;
-+ if ((delim = strchr(cur, ':')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->remote_mac[3]=simple_strtol(cur, 0, 16);
-+ cur=delim+1;
-+ if ((delim = strchr(cur, ':')) == NULL)
-+ goto parse_failed;
-+ *delim=0;
-+ np->remote_mac[4]=simple_strtol(cur, 0, 16);
-+ cur=delim+1;
-+ np->remote_mac[5]=simple_strtol(cur, 0, 16);
-+ }
-+
-+ printk(KERN_INFO "%s: remote ethernet address "
-+ "%02x:%02x:%02x:%02x:%02x:%02x\n",
-+ np->name,
-+ np->remote_mac[0],
-+ np->remote_mac[1],
-+ np->remote_mac[2],
-+ np->remote_mac[3],
-+ np->remote_mac[4],
-+ np->remote_mac[5]);
-+
-+ return 0;
-+
-+ parse_failed:
-+ printk(KERN_INFO "%s: couldn't parse config at %s!\n",
-+ np->name, cur);
-+ return -1;
-+}
-+
-+int netpoll_setup(struct netpoll *np)
-+{
-+ struct net_device *ndev = NULL;
-+ struct in_device *in_dev;
-+
-+ if (np->dev_name)
-+ ndev = dev_get_by_name(np->dev_name);
-+ if (!ndev) {
-+ printk(KERN_ERR "%s: %s doesn't exist, aborting.\n",
-+ np->name, np->dev_name);
-+ goto release;
-+ }
-+ if (!ndev->poll_controller) {
-+ printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",
-+ np->name, np->dev_name);
-+ goto release;
-+ }
-+
-+ if (!(ndev->flags & IFF_UP)) {
-+ unsigned short oflags;
-+ unsigned long jiff;
-+
-+ printk(KERN_INFO "%s: device %s not up yet, forcing it\n",
-+ np->name, np->dev_name);
-+
-+ oflags = ndev->flags;
-+
-+ rtnl_shlock();
-+ if (dev_change_flags(ndev, oflags | IFF_UP) < 0) {
-+ printk(KERN_ERR "%s: failed to open %s\n",
-+ np->name, np->dev_name);
-+ rtnl_shunlock();
-+ goto release;
-+ }
-+ rtnl_shunlock();
-+
-+ jiff = jiffies + 6*HZ;
-+ while(!netif_carrier_ok(ndev)) {
-+ if (!time_before(jiffies, jiff)) {
-+ printk(KERN_NOTICE
-+ "%s: timeout waiting for carrier\n",
-+ np->name);
-+ break;
-+ }
-+ cond_resched();
-+ }
-+
-+ }
-+
-+ if (!memcmp(np->local_mac, "\0\0\0\0\0\0", 6) && ndev->dev_addr)
-+ memcpy(np->local_mac, ndev->dev_addr, 6);
-+
-+ if (!np->local_ip) {
-+ in_dev = in_dev_get(ndev);
-+
-+ if (!in_dev) {
-+ printk(KERN_ERR "%s: no IP address for %s, aborting\n",
-+ np->name, np->dev_name);
-+ goto release;
-+ }
-+
-+ np->local_ip = ntohl(in_dev->ifa_list->ifa_local);
-+ in_dev_put(in_dev);
-+ printk(KERN_INFO "%s: local IP %d.%d.%d.%d\n",
-+ np->name, HIPQUAD(np->local_ip));
-+ }
-+
-+ np->dev = ndev;
-+
-+ if(np->rx_hook) {
-+ unsigned long flags;
-+
-+#ifdef CONFIG_NETPOLL_RX
-+ np->dev->netpoll_rx = 1;
-+#endif
-+
-+ spin_lock_irqsave(&rx_list_lock, flags);
-+ list_add(&np->rx_list, &rx_list);
-+ spin_unlock_irqrestore(&rx_list_lock, flags);
-+ }
-+
-+ return 0;
-+ release:
-+ dev_put(ndev);
-+ return -1;
-+}
-+
-+void netpoll_cleanup(struct netpoll *np)
-+{
-+ if(np->rx_hook) {
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&rx_list_lock, flags);
-+ list_del(&np->rx_list);
-+#ifdef CONFIG_NETPOLL_RX
-+ np->dev->netpoll_rx = 0;
-+#endif
-+ spin_unlock_irqrestore(&rx_list_lock, flags);
-+ }
-+
-+ dev_put(np->dev);
-+ np->dev = 0;
-+}
-+
-+int netpoll_trap()
-+{
-+ return trapped;
-+}
-+
-+void netpoll_set_trap(int trap)
-+{
-+ trapped = trap;
-+}
-+
-+EXPORT_SYMBOL(netpoll_set_trap);
-+EXPORT_SYMBOL(netpoll_trap);
-+EXPORT_SYMBOL(netpoll_parse_options);
-+EXPORT_SYMBOL(netpoll_setup);
-+EXPORT_SYMBOL(netpoll_cleanup);
-+EXPORT_SYMBOL(netpoll_send_skb);
-+EXPORT_SYMBOL(netpoll_send_udp);
-+EXPORT_SYMBOL(netpoll_poll);
---- linux-2.6.0/net/core/net-sysfs.c 2003-10-25 14:45:46.000000000 -0700
-+++ 25/net/core/net-sysfs.c 2003-12-28 23:21:01.000000000 -0800
-@@ -372,7 +372,7 @@ static void netdev_release(struct class_
-
- BUG_ON(dev->reg_state != NETREG_RELEASED);
-
-- kfree(dev);
-+ kfree((char *)dev - dev->padded);
- }
-
- static struct class net_class = {
---- linux-2.6.0/net/Kconfig 2003-11-23 19:03:02.000000000 -0800
-+++ 25/net/Kconfig 2003-12-28 23:21:09.000000000 -0800
-@@ -664,4 +664,19 @@ source "net/irda/Kconfig"
-
- source "net/bluetooth/Kconfig"
-
-+config KGDBOE
-+ def_bool X86 && KGDB
-+
-+config NETPOLL
-+ def_bool NETCONSOLE || KGDBOE
-+
-+config NETPOLL_RX
-+ def_bool KGDBOE
-+
-+config NETPOLL_TRAP
-+ def_bool KGDBOE
-+
-+config NET_POLL_CONTROLLER
-+ def_bool NETPOLL
-+
- endmenu
---- linux-2.6.0/net/socket.c 2003-11-23 19:03:03.000000000 -0800
-+++ 25/net/socket.c 2003-12-28 23:21:18.000000000 -0800
-@@ -394,6 +394,7 @@ int sock_map_fd(struct socket *sock)
- file->f_dentry->d_op = &sockfs_dentry_operations;
- d_add(file->f_dentry, SOCK_INODE(sock));
- file->f_vfsmnt = mntget(sock_mnt);
-+ file->f_mapping = file->f_dentry->d_inode->i_mapping;
-
- sock->file = file;
- file->f_op = SOCK_INODE(sock)->i_fop = &socket_file_ops;
---- linux-2.6.0/net/wanrouter/wanmain.c 2003-09-27 18:57:47.000000000 -0700
-+++ 25/net/wanrouter/wanmain.c 2003-12-28 23:21:01.000000000 -0800
-@@ -726,8 +726,6 @@ static int wanrouter_device_new_if(struc
-
- if (dev->name == NULL) {
- err = -EINVAL;
-- } else if (dev_get(dev->name)) {
-- err = -EEXIST; /* name already exists */
- } else {
-
- #ifdef WANDEBUG
---- linux-2.6.0/README 2003-10-08 15:07:08.000000000 -0700
-+++ 25/README 2003-12-28 23:22:44.000000000 -0800
-@@ -119,7 +119,7 @@ BUILD directory for the kernel:
- cd /usr/src/linux-2.6.N
- make O=/home/name/build/kernel menuconfig
- make O=/home/name/build/kernel
-- sudo make O=/home/name/build/kernel install_modules install
-+ sudo make O=/home/name/build/kernel modules_install install
-
- Please note: If the 'O=output/dir' option is used then it must be
- used for all invocations of make.
---- linux-2.6.0/scripts/kconfig/gconf.c 2003-08-08 22:55:14.000000000 -0700
-+++ 25/scripts/kconfig/gconf.c 2003-12-28 23:22:45.000000000 -0800
-@@ -1172,7 +1172,7 @@ on_treeview1_button_press_event(GtkWidge
-
- gtk_widget_realize(tree2_w);
- gtk_tree_view_set_cursor(view, path, NULL, FALSE);
-- gtk_widget_grab_focus(GTK_TREE_VIEW(tree2_w));
-+ gtk_widget_grab_focus(GTK_WIDGET(tree2_w));
-
- return FALSE;
- }
---- linux-2.6.0/scripts/mkspec 2003-09-27 18:57:47.000000000 -0700
-+++ 25/scripts/mkspec 2003-12-28 23:23:07.000000000 -0800
-@@ -9,7 +9,7 @@
- # Patched for non-x86 by Opencon (L) 2002 <opencon@rio.skydome.net>
- #
- # That's the voodoo to see if it's a x86.
--ISX86=`arch | grep -ie i.86`
-+ISX86=`echo ${ARCH:=\`arch\`} | grep -ie i.86`
- if [ ! -z $ISX86 ]; then
- PC=1
- else
---- linux-2.6.0/scripts/modpost.c 2003-09-27 18:57:47.000000000 -0700
-+++ 25/scripts/modpost.c 2003-12-28 23:22:29.000000000 -0800
-@@ -324,6 +324,19 @@ handle_modversions(struct module *mod, s
- }
- }
-
-+int
-+is_vmlinux(const char *modname)
-+{
-+ const char *myname;
-+
-+ if ((myname = strrchr(modname, '/')))
-+ myname++;
-+ else
-+ myname = modname;
-+
-+ return strcmp(myname, "vmlinux") == 0;
-+}
-+
- void
- read_symbols(char *modname)
- {
-@@ -335,8 +348,7 @@ read_symbols(char *modname)
-
- /* When there's no vmlinux, don't print warnings about
- * unresolved symbols (since there'll be too many ;) */
-- if (strcmp(modname, "vmlinux") == 0)
-- have_vmlinux = 1;
-+ have_vmlinux = is_vmlinux(modname);
-
- parse_elf(&info, modname);
-
-@@ -460,10 +472,7 @@ add_depends(struct buffer *b, struct mod
- int first = 1;
-
- for (m = modules; m; m = m->next) {
-- if (strcmp(m->name, "vmlinux") == 0)
-- m->seen = 1;
-- else
-- m->seen = 0;
-+ m->seen = is_vmlinux(m->name);
- }
-
- buf_printf(b, "\n");
-@@ -543,7 +552,7 @@ main(int argc, char **argv)
- }
-
- for (mod = modules; mod; mod = mod->next) {
-- if (strcmp(mod->name, "vmlinux") == 0)
-+ if (is_vmlinux(mod->name))
- continue;
-
- buf.pos = 0;
---- linux-2.6.0/security/selinux/hooks.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/security/selinux/hooks.c 2003-12-28 23:22:42.000000000 -0800
-@@ -1515,7 +1515,8 @@ static void selinux_bprm_compute_creds(s
- struct bprm_security_struct *bsec;
- u32 sid;
- struct av_decision avd;
-- int rc;
-+ struct itimerval itimer;
-+ int rc, i;
-
- secondary_ops->bprm_compute_creds(bprm);
-
-@@ -1565,6 +1566,26 @@ static void selinux_bprm_compute_creds(s
- /* Close files for which the new task SID is not authorized. */
- flush_unauthorized_files(current->files);
-
-+ /* Check whether the new SID can inherit signal state
-+ from the old SID. If not, clear itimers to avoid
-+ subsequent signal generation and flush and unblock
-+ signals. This must occur _after_ the task SID has
-+ been updated so that any kill done after the flush
-+ will be checked against the new SID. */
-+ rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
-+ PROCESS__SIGINH, NULL, NULL);
-+ if (rc) {
-+ memset(&itimer, 0, sizeof itimer);
-+ for (i = 0; i < 3; i++)
-+ do_setitimer(i, &itimer, NULL);
-+ flush_signals(current);
-+ spin_lock_irq(¤t->sighand->siglock);
-+ flush_signal_handlers(current, 1);
-+ sigemptyset(¤t->blocked);
-+ recalc_sigpending();
-+ spin_unlock_irq(¤t->sighand->siglock);
-+ }
-+
- /* Wake up the parent if it is waiting so that it can
- recheck wait permission to the new task SID. */
- wake_up_interruptible(¤t->parent->wait_chldexit);
-@@ -1738,10 +1759,6 @@ static int selinux_inode_permission(stru
- return 0;
- }
-
-- if (nd && nd->dentry)
-- return dentry_has_perm(current, nd->mnt, nd->dentry,
-- file_mask_to_av(inode->i_mode, mask));
--
- return inode_has_perm(current, inode,
- file_mask_to_av(inode->i_mode, mask), NULL, NULL);
- }
-@@ -1992,8 +2009,7 @@ static int selinux_file_ioctl(struct fil
-
- case KDSKBENT:
- case KDSKBSENT:
-- if (!capable(CAP_SYS_TTY_CONFIG))
-- error = -EPERM;
-+ error = task_has_capability(current,CAP_SYS_TTY_CONFIG);
- break;
-
- /* default case assumes that the command will go
---- linux-2.6.0/security/selinux/include/av_permissions.h 2003-08-08 22:55:14.000000000 -0700
-+++ 25/security/selinux/include/av_permissions.h 2003-12-28 23:22:42.000000000 -0800
-@@ -450,6 +450,7 @@
- #define PROCESS__SETEXEC 0x00020000UL
- #define PROCESS__SETFSCREATE 0x00040000UL
- #define PROCESS__NOATSECURE 0x00080000UL
-+#define PROCESS__SIGINH 0x00100000UL
-
- #define IPC__SETATTR 0x00000008UL
- #define IPC__READ 0x00000010UL
---- linux-2.6.0/security/selinux/include/av_perm_to_string.h 2003-08-08 22:55:14.000000000 -0700
-+++ 25/security/selinux/include/av_perm_to_string.h 2003-12-28 23:22:42.000000000 -0800
-@@ -66,6 +66,7 @@ static struct av_perm_to_string av_perm_
- { SECCLASS_PROCESS, PROCESS__SETEXEC, "setexec" },
- { SECCLASS_PROCESS, PROCESS__SETFSCREATE, "setfscreate" },
- { SECCLASS_PROCESS, PROCESS__NOATSECURE, "noatsecure" },
-+ { SECCLASS_PROCESS, PROCESS__SIGINH, "siginh" },
- { SECCLASS_MSGQ, MSGQ__ENQUEUE, "enqueue" },
- { SECCLASS_MSG, MSG__SEND, "send" },
- { SECCLASS_MSG, MSG__RECEIVE, "receive" },
---- linux-2.6.0/security/selinux/ss/avtab.c 2003-09-08 13:58:59.000000000 -0700
-+++ 25/security/selinux/ss/avtab.c 2003-12-28 23:22:41.000000000 -0800
-@@ -3,6 +3,10 @@
- *
- * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/errno.h>
- #include "avtab.h"
- #include "policydb.h"
-
---- linux-2.6.0/security/selinux/ss/ebitmap.c 2003-09-08 13:58:59.000000000 -0700
-+++ 25/security/selinux/ss/ebitmap.c 2003-12-28 23:22:41.000000000 -0800
-@@ -3,6 +3,9 @@
- *
- * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/errno.h>
- #include "ebitmap.h"
- #include "policydb.h"
-
---- linux-2.6.0/security/selinux/ss/global.h 2003-09-08 13:58:59.000000000 -0700
-+++ 25/security/selinux/ss/global.h 2003-12-28 23:22:41.000000000 -0800
-@@ -1,18 +0,0 @@
--#ifndef _SS_GLOBAL_H_
--#define _SS_GLOBAL_H_
--
--#include <linux/kernel.h>
--#include <linux/slab.h>
--#include <linux/string.h>
--#include <linux/ctype.h>
--#include <linux/in.h>
--#include <linux/spinlock.h>
--#include <linux/sched.h>
--#include <linux/vmalloc.h>
--
--#include "flask.h"
--#include "avc.h"
--#include "avc_ss.h"
--#include "security.h"
--
--#endif /* _SS_GLOBAL_H_ */
---- linux-2.6.0/security/selinux/ss/hashtab.c 2003-08-08 22:55:14.000000000 -0700
-+++ 25/security/selinux/ss/hashtab.c 2003-12-28 23:22:41.000000000 -0800
-@@ -3,6 +3,9 @@
- *
- * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/errno.h>
- #include "hashtab.h"
-
- struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, void *key),
---- linux-2.6.0/security/selinux/ss/Makefile 2003-08-08 22:55:14.000000000 -0700
-+++ 25/security/selinux/ss/Makefile 2003-12-28 23:22:41.000000000 -0800
-@@ -2,8 +2,7 @@
- # Makefile for building the SELinux security server as part of the kernel tree.
- #
-
--EXTRA_CFLAGS += -Isecurity/selinux/include -include security/selinux/ss/global.h
--
-+EXTRA_CFLAGS += -Isecurity/selinux/include
- obj-y := ss.o
-
- ss-objs := ebitmap.o hashtab.o symtab.o sidtab.o avtab.o policydb.o services.o
---- linux-2.6.0/security/selinux/ss/mls.c 2003-09-27 18:57:47.000000000 -0700
-+++ 25/security/selinux/ss/mls.c 2003-12-28 23:22:41.000000000 -0800
-@@ -3,6 +3,10 @@
- *
- * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
- #include "mls.h"
- #include "policydb.h"
- #include "services.h"
---- linux-2.6.0/security/selinux/ss/policydb.c 2003-09-27 18:57:47.000000000 -0700
-+++ 25/security/selinux/ss/policydb.c 2003-12-28 23:22:41.000000000 -0800
-@@ -3,6 +3,11 @@
- *
- * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include "security.h"
- #include "policydb.h"
- #include "mls.h"
-
---- linux-2.6.0/security/selinux/ss/services.c 2003-10-08 15:07:10.000000000 -0700
-+++ 25/security/selinux/ss/services.c 2003-12-28 23:22:41.000000000 -0800
-@@ -10,6 +10,17 @@
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/spinlock.h>
-+#include <linux/errno.h>
-+#include <linux/in.h>
-+#include <asm/semaphore.h>
-+#include "flask.h"
-+#include "avc.h"
-+#include "avc_ss.h"
-+#include "security.h"
- #include "context.h"
- #include "policydb.h"
- #include "sidtab.h"
---- linux-2.6.0/security/selinux/ss/sidtab.c 2003-08-08 22:55:14.000000000 -0700
-+++ 25/security/selinux/ss/sidtab.c 2003-12-28 23:22:41.000000000 -0800
-@@ -3,6 +3,12 @@
- *
- * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/spinlock.h>
-+#include <linux/errno.h>
-+#include "flask.h"
-+#include "security.h"
- #include "sidtab.h"
-
- #define SIDTAB_HASH(sid) \
---- linux-2.6.0/security/selinux/ss/symtab.c 2003-08-08 22:55:14.000000000 -0700
-+++ 25/security/selinux/ss/symtab.c 2003-12-28 23:22:41.000000000 -0800
-@@ -3,6 +3,10 @@
- *
- * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
- */
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
- #include "symtab.h"
-
- static unsigned int symhash(struct hashtab *h, void *key)
---- linux-2.6.0/sound/core/pcm_native.c 2003-10-25 14:45:46.000000000 -0700
-+++ 25/sound/core/pcm_native.c 2003-12-28 23:22:12.000000000 -0800
-@@ -2779,7 +2779,7 @@ unsigned int snd_pcm_capture_poll(struct
- return mask;
- }
-
--static struct page * snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
-+static struct page * snd_pcm_mmap_status_nopage(struct vm_area_struct *area, unsigned long address, int *type)
- {
- snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
- snd_pcm_runtime_t *runtime;
-@@ -2791,6 +2791,8 @@ static struct page * snd_pcm_mmap_status
- page = virt_to_page(runtime->status);
- if (!PageReserved(page))
- get_page(page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return page;
- }
-
-@@ -2817,7 +2819,7 @@ int snd_pcm_mmap_status(snd_pcm_substrea
- return 0;
- }
-
--static struct page * snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
-+static struct page * snd_pcm_mmap_control_nopage(struct vm_area_struct *area, unsigned long address, int *type)
- {
- snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
- snd_pcm_runtime_t *runtime;
-@@ -2829,6 +2831,8 @@ static struct page * snd_pcm_mmap_contro
- page = virt_to_page(runtime->control);
- if (!PageReserved(page))
- get_page(page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return page;
- }
-
-@@ -2867,7 +2871,7 @@ static void snd_pcm_mmap_data_close(stru
- atomic_dec(&substream->runtime->mmap_count);
- }
-
--static struct page * snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int no_share)
-+static struct page * snd_pcm_mmap_data_nopage(struct vm_area_struct *area, unsigned long address, int *type)
- {
- snd_pcm_substream_t *substream = (snd_pcm_substream_t *)area->vm_private_data;
- snd_pcm_runtime_t *runtime;
-@@ -2895,6 +2899,8 @@ static struct page * snd_pcm_mmap_data_n
- }
- if (!PageReserved(page))
- get_page(page);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return page;
- }
-
---- linux-2.6.0/sound/core/sound.c 2003-09-27 18:57:47.000000000 -0700
-+++ 25/sound/core/sound.c 2003-12-28 23:22:25.000000000 -0800
-@@ -31,6 +31,7 @@
- #include <sound/initval.h>
- #include <linux/kmod.h>
- #include <linux/devfs_fs_kernel.h>
-+#include <linux/device.h>
-
- #define SNDRV_OS_MINORS 256
-
-@@ -52,6 +53,7 @@ MODULE_PARM_SYNTAX(major, "default:116,s
- MODULE_PARM(cards_limit, "i");
- MODULE_PARM_DESC(cards_limit, "Count of soundcards installed in the system.");
- MODULE_PARM_SYNTAX(cards_limit, "default:8,skill:advanced");
-+MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR);
- #ifdef CONFIG_DEVFS_FS
- MODULE_PARM(device_mode, "i");
- MODULE_PARM_DESC(device_mode, "Device file permission mask for devfs.");
---- linux-2.6.0/sound/i2c/i2c.c 2003-06-14 12:18:09.000000000 -0700
-+++ 25/sound/i2c/i2c.c 2003-12-28 23:22:19.000000000 -0800
-@@ -84,7 +84,7 @@ int snd_i2c_bus_create(snd_card_t *card,
- bus = (snd_i2c_bus_t *)snd_magic_kcalloc(snd_i2c_bus_t, 0, GFP_KERNEL);
- if (bus == NULL)
- return -ENOMEM;
-- spin_lock_init(&bus->lock);
-+ init_MUTEX(&bus->lock_mutex);
- INIT_LIST_HEAD(&bus->devices);
- INIT_LIST_HEAD(&bus->buses);
- bus->card = card;
---- linux-2.6.0/sound/isa/gus/gus_pcm.c 2003-06-14 12:18:08.000000000 -0700
-+++ 25/sound/isa/gus/gus_pcm.c 2003-12-28 23:22:44.000000000 -0800
-@@ -334,9 +334,11 @@ static int snd_gf1_pcm_poke_block(snd_gu
- snd_gf1_poke(gus, pos++, *buf++ ^ invert);
- }
- }
-- schedule_timeout(1);
-- if (signal_pending(current))
-- return -EAGAIN;
-+ if (count > 0 && !in_interrupt()) {
-+ schedule_timeout(1);
-+ if (signal_pending(current))
-+ return -EAGAIN;
-+ }
- }
- return 0;
- }
---- linux-2.6.0/sound/oss/cmpci.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/sound/oss/cmpci.c 2003-12-28 23:21:54.000000000 -0800
-@@ -2876,7 +2876,6 @@ MODULE_DEVICE_TABLE(pci, cmpci_pci_tbl);
- void initialize_chip(struct pci_dev *pcidev)
- {
- struct cm_state *s;
-- mm_segment_t fs;
- int i, val;
- #if defined(CONFIG_SOUND_CMPCI_MIDI) || defined(CONFIG_SOUND_CMPCI_FM)
- unsigned char reg_mask = 0;
-@@ -3038,8 +3037,6 @@ void initialize_chip(struct pci_dev *pci
- #endif
- pci_set_master(pcidev); /* enable bus mastering */
- /* initialize the chips */
-- fs = get_fs();
-- set_fs(KERNEL_DS);
- /* set mixer output */
- frobindir(s, DSP_MIX_OUTMIXIDX, 0x1f, 0x1f);
- /* set mixer input */
---- linux-2.6.0/sound/oss/dmasound/Kconfig 2003-10-08 15:07:10.000000000 -0700
-+++ 25/sound/oss/dmasound/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -10,7 +10,7 @@ config DMASOUND_ATARI
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you
- want). If you want to compile it as a module, say M here and read
-- <file:Documentation/modules.txt>.
-+ <file:Documentation/kbuild/modules.txt>.
-
- config DMASOUND_PMAC
- tristate "PowerMac DMA sound support"
-@@ -24,7 +24,7 @@ config DMASOUND_PMAC
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you
- want). If you want to compile it as a module, say M here and read
-- <file:Documentation/modules.txt>.
-+ <file:Documentation/kbuild/modules.txt>.
-
- config DMASOUND_PAULA
- tristate "Amiga DMA sound support"
-@@ -38,7 +38,7 @@ config DMASOUND_PAULA
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you
- want). If you want to compile it as a module, say M here and read
-- <file:Documentation/modules.txt>.
-+ <file:Documentation/kbuild/modules.txt>.
-
- config DMASOUND_Q40
- tristate "Q40 sound support"
-@@ -52,7 +52,7 @@ config DMASOUND_Q40
- This driver is also available as a module ( = code which can be
- inserted in and removed from the running kernel whenever you
- want). If you want to compile it as a module, say M here and read
-- <file:Documentation/modules.txt>.
-+ <file:Documentation/kbuild/modules.txt>.
-
- config DMASOUND
- tristate
---- linux-2.6.0/sound/oss/emu10k1/audio.c 2003-09-08 13:58:59.000000000 -0700
-+++ 25/sound/oss/emu10k1/audio.c 2003-12-28 23:22:12.000000000 -0800
-@@ -989,7 +989,7 @@ static int emu10k1_audio_ioctl(struct in
- return 0;
- }
-
--static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int write_access)
-+static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int *type)
- {
- struct emu10k1_wavedevice *wave_dev = vma->vm_private_data;
- struct woinst *woinst = wave_dev->woinst;
-@@ -1032,6 +1032,8 @@ static struct page *emu10k1_mm_nopage (s
- get_page (dmapage);
-
- DPD(3, "page: %#lx\n", (unsigned long) dmapage);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return dmapage;
- }
-
---- linux-2.6.0/sound/oss/Kconfig 2003-10-17 15:58:05.000000000 -0700
-+++ 25/sound/oss/Kconfig 2003-12-28 23:23:06.000000000 -0800
-@@ -25,7 +25,7 @@ config SOUND_CMPCI
- depends on SOUND_PRIME!=n && SOUND && PCI
- help
- Say Y or M if you have a PCI sound card using the CMI8338
-- or the CMI8378 chipset. Data on these chips are available at
-+ or the CMI8738 chipset. Data on these chips are available at
- <http://www.cmedia.com.tw/>.
-
- A userspace utility to control some internal registers of these
-@@ -195,7 +195,7 @@ config SOUND_ES1371
- Ensoniq was bought by Creative Labs, Sound Blaster 64/PCI
- models are either ES1370 or ES1371 based. This driver differs
- slightly from OSS/Free, so PLEASE READ
-- <file:Documentation/sound/es1371>.
-+ <file:Documentation/sound/oss/es1371>.
-
- config SOUND_ESSSOLO1
- tristate "ESS Technology Solo1"
---- linux-2.6.0/sound/oss/via82cxxx_audio.c 2003-10-17 15:58:05.000000000 -0700
-+++ 25/sound/oss/via82cxxx_audio.c 2003-12-28 23:22:33.000000000 -0800
-@@ -15,7 +15,7 @@
- */
-
-
--#define VIA_VERSION "1.9.1-ac3-2.5"
-+#define VIA_VERSION "1.9.1-ac4-2.5"
-
-
- #include <linux/config.h>
-@@ -1237,7 +1237,6 @@ static int via_chan_set_stereo (struct v
- }
- /* unknown */
- default:
-- printk (KERN_WARNING PFX "unknown number of channels\n");
- val = -EINVAL;
- break;
- }
-@@ -2116,7 +2115,7 @@ static void via_dsp_cleanup (struct via_
-
-
- static struct page * via_mm_nopage (struct vm_area_struct * vma,
-- unsigned long address, int write_access)
-+ unsigned long address, int *type)
- {
- struct via_info *card = vma->vm_private_data;
- struct via_channel *chan = &card->ch_out;
-@@ -2124,12 +2123,11 @@ static struct page * via_mm_nopage (stru
- unsigned long pgoff;
- int rd, wr;
-
-- DPRINTK ("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh, wr %d\n",
-+ DPRINTK ("ENTER, start %lXh, ofs %lXh, pgoff %ld, addr %lXh\n",
- vma->vm_start,
- address - vma->vm_start,
- (address - vma->vm_start) >> PAGE_SHIFT,
-- address,
-- write_access);
-+ address);
-
- if (address > vma->vm_end) {
- DPRINTK ("EXIT, returning NOPAGE_SIGBUS\n");
-@@ -2167,6 +2165,8 @@ static struct page * via_mm_nopage (stru
- DPRINTK ("EXIT, returning page %p for cpuaddr %lXh\n",
- dmapage, (unsigned long) chan->pgtbl[pgoff].cpuaddr);
- get_page (dmapage);
-+ if (type)
-+ *type = VM_FAULT_MINOR;
- return dmapage;
- }
-
-@@ -3367,7 +3367,7 @@ static int via_dsp_release(struct inode
-
- if (file->f_mode & FMODE_WRITE) {
- rc = via_dsp_drain_playback (card, &card->ch_out, nonblock);
-- if (rc && rc != ERESTARTSYS) /* Nobody needs to know about ^C */
-+ if (rc && rc != -ERESTARTSYS) /* Nobody needs to know about ^C */
- printk (KERN_DEBUG "via_audio: ignoring drain playback error %d\n", rc);
-
- via_chan_free (card, &card->ch_out);
---- linux-2.6.0/sound/oss/vwsnd.c 2003-09-27 18:57:48.000000000 -0700
-+++ 25/sound/oss/vwsnd.c 2003-12-28 23:23:06.000000000 -0800
-@@ -1,6 +1,6 @@
- /*
- * Sound driver for Silicon Graphics 320 and 540 Visual Workstations'
-- * onboard audio. See notes in ../../Documentation/sound/vwsnd .
-+ * onboard audio. See notes in ../../Documentation/sound/oss/vwsnd .
- *
- * Copyright 1999 Silicon Graphics, Inc. All rights reserved.
- *
---- linux-2.6.0/sound/pci/intel8x0.c 2003-11-09 16:45:06.000000000 -0800
-+++ 25/sound/pci/intel8x0.c 2003-12-28 23:21:41.000000000 -0800
-@@ -2271,10 +2271,8 @@ static void __devinit intel8x0_measure_a
-
- t = stop_time.tv_sec - start_time.tv_sec;
- t *= 1000000;
-- if (stop_time.tv_usec < start_time.tv_usec)
-- t -= start_time.tv_usec - stop_time.tv_usec;
-- else
-- t += stop_time.tv_usec - start_time.tv_usec;
-+ t += stop_time.tv_usec - start_time.tv_usec;
-+ printk(KERN_INFO "%s: measured %lu usecs\n", __FUNCTION__, t);
- if (t == 0) {
- snd_printk(KERN_ERR "?? calculation error..\n");
- return;
---- linux-2.6.0/sound/pcmcia/vx/vx_entry.c 2003-09-27 18:57:48.000000000 -0700
-+++ 25/sound/pcmcia/vx/vx_entry.c 2003-12-28 23:22:54.000000000 -0800
-@@ -38,9 +38,9 @@ static void vxpocket_release(dev_link_t
- {
- if (link->state & DEV_CONFIG) {
- /* release cs resources */
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- link->state &= ~DEV_CONFIG;
- }
- }
-@@ -58,7 +58,7 @@ static int snd_vxpocket_free(vx_core_t *
-
- /* Break the link with Card Services */
- if (link->handle)
-- CardServices(DeregisterClient, link->handle);
-+ pcmcia_deregister_client(link->handle);
-
- hw = vxp->hw_entry;
- if (hw)
-@@ -170,7 +170,7 @@ dev_link_t *snd_vxpocket_attach(struct s
- client_reg.Version = 0x0210;
- client_reg.event_callback_args.client_data = link;
-
-- ret = CardServices(RegisterClient, &link->handle, &client_reg);
-+ ret = pcmcia_register_client(&link->handle, &client_reg);
- if (ret != CS_SUCCESS) {
- cs_error(link->handle, RegisterClient, ret);
- snd_vxpocket_detach(hw, link);
-@@ -253,8 +253,8 @@ void snd_vxpocket_detach_all(struct snd_
- * configuration callback
- */
-
--#define CS_CHECK(fn, args...) \
--while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
- static void vxpocket_config(dev_link_t *link)
- {
-@@ -274,21 +274,21 @@ static void vxpocket_config(dev_link_t *
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
- tuple.DesiredTuple = CISTPL_CONFIG;
-- CS_CHECK(GetFirstTuple, handle, &tuple);
-- CS_CHECK(GetTupleData, handle, &tuple);
-- CS_CHECK(ParseTuple, handle, &tuple, &parse);
-+ CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
-+ CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
-+ CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
- link->conf.ConfigBase = parse.config.base;
- link->conf.ConfigIndex = 1;
-
-- CS_CHECK(GetConfigurationInfo, handle, &conf);
-+ CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));
- link->conf.Vcc = conf.Vcc;
-
- /* Configure card */
- link->state |= DEV_CONFIG;
-
-- CS_CHECK(RequestIO, handle, &link->io);
-- CS_CHECK(RequestIRQ, link->handle, &link->irq);
-- CS_CHECK(RequestConfiguration, link->handle, &link->conf);
-+ CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io));
-+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
-+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
-
- if (snd_vxpocket_assign_resources(chip, link->io.BasePort1, link->irq.AssignedIRQ) < 0)
- goto failed;
-@@ -300,9 +300,9 @@ static void vxpocket_config(dev_link_t *
- cs_failed:
- cs_error(link->handle, last_fn, last_ret);
- failed:
-- CardServices(ReleaseConfiguration, link->handle);
-- CardServices(ReleaseIO, link->handle, &link->io);
-- CardServices(ReleaseIRQ, link->handle, &link->irq);
-+ pcmcia_release_configuration(link->handle);
-+ pcmcia_release_io(link->handle, &link->io);
-+ pcmcia_release_irq(link->handle, &link->irq);
- }
-
-
-@@ -339,7 +339,7 @@ static int vxpocket_event(event_t event,
- case CS_EVENT_RESET_PHYSICAL:
- snd_printdd(KERN_DEBUG "RESET_PHYSICAL\n");
- if (link->state & DEV_CONFIG)
-- CardServices(ReleaseConfiguration, link->handle);
-+ pcmcia_release_configuration(link->handle);
- break;
- case CS_EVENT_PM_RESUME:
- snd_printdd(KERN_DEBUG "RESUME\n");
-@@ -350,7 +350,7 @@ static int vxpocket_event(event_t event,
- if (DEV_OK(link)) {
- //struct snd_vxpocket *vxp = (struct snd_vxpocket *)chip;
- snd_printdd(KERN_DEBUG "requestconfig...\n");
-- CardServices(RequestConfiguration, link->handle, &link->conf);
-+ pcmcia_request_configuration(link->handle, &link->conf);
- if (chip) {
- snd_printdd(KERN_DEBUG "calling snd_vx_resume\n");
- snd_vx_resume(chip);
---- linux-2.6.0/sound/sound_core.c 2003-09-08 13:58:59.000000000 -0700
-+++ 25/sound/sound_core.c 2003-12-28 23:22:25.000000000 -0800
-@@ -45,6 +45,7 @@
- #include <linux/major.h>
- #include <linux/kmod.h>
- #include <linux/devfs_fs_kernel.h>
-+#include <linux/device.h>
-
- #define SOUND_STEP 16
-
-@@ -547,6 +548,7 @@ EXPORT_SYMBOL(mod_firmware_load);
- MODULE_DESCRIPTION("Core sound module");
- MODULE_AUTHOR("Alan Cox");
- MODULE_LICENSE("GPL");
-+MODULE_ALIAS_CHARDEV_MAJOR(SOUND_MAJOR);
-
- static void __exit cleanup_soundcore(void)
- {
---- linux-2.6.0/usr/gen_init_cpio.c 2003-09-27 18:57:48.000000000 -0700
-+++ 25/usr/gen_init_cpio.c 2003-12-28 23:22:09.000000000 -0800
-@@ -197,6 +197,7 @@ void cpio_mkfile(const char *filename, c
-
- for (i = 0; i < buf.st_size; ++i)
- fputc(filebuf[i], stdout);
-+ offset += buf.st_size;
- close(file);
- free(filebuf);
- push_pad();