From a4a7ce901ae4d6b396452049016e8ce7b9f3bfd8 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Fri, 23 Nov 2007 15:19:59 -0500 Subject: [PATCH] Linux 2.2.13pre15 o Symbios 1510D SCSI added to sym driver (Charles White) o Cyclades update (Ivan Passos) o Fix SMC ultra oops on unload (Paul Gortmaker) o Small SX serial driver fix (Rogier Wolff) o Quota fix (Jan Kara) o ISDN update (Karsten Keil) o Driver for NCR 53c710 PC controllers (Richard Hirst) o Fix int v long warnings (Mikael Pettersson) o ESS solo1 claimed excess resources (Thomas Sailer) o Fix missing \n in CPU info (Petri Kaukasoina) o Sparc updates (Dave Miller) o Network small fixes (Dave Miller) o Clean up DVD/Ghost handling (Rogier Wolff) o PCSP has moved site (David Woodhouse) o Hopefully fix SMP/IDE hang (Alan Cox) --- Documentation/Configure.help | 9 +- Documentation/isdn/CREDITS | 5 +- Documentation/isdn/README | 12 +- Makefile | 2 +- arch/i386/kernel/setup.c | 2 + arch/sparc/config.in | 3 +- arch/sparc/defconfig | 1 + arch/sparc/kernel/Makefile | 12 +- arch/sparc/kernel/entry.S | 27 +- arch/sparc/kernel/head.S | 24 +- arch/sparc/kernel/sparc_ksyms.c | 6 +- arch/sparc/kernel/sys_solaris.c | 14 + arch/sparc/kernel/systbls.S | 7 +- arch/sparc/mm/srmmu.c | 6 +- arch/sparc64/config.in | 3 +- arch/sparc64/defconfig | 1 + arch/sparc64/kernel/Makefile | 13 +- arch/sparc64/kernel/ebus.c | 6 +- arch/sparc64/kernel/entry.S | 5 +- arch/sparc64/kernel/ioctl32.c | 5 +- arch/sparc64/kernel/sparc64_ksyms.c | 6 +- arch/sparc64/kernel/sys_sparc.c | 17 +- arch/sparc64/kernel/systbls.S | 8 +- drivers/block/ide.c | 5 +- drivers/char/cyclades.c | 1691 +++++++------ drivers/char/sx.c | 14 +- drivers/isdn/avmb1/Makefile | 19 +- drivers/isdn/avmb1/b1.c | 12 +- drivers/isdn/avmb1/capidrv.c | 9 +- drivers/isdn/avmb1/capiutil.h | 11 +- drivers/isdn/avmb1/t1isa.c | 12 +- drivers/isdn/divert/divert_procfs.c | 164 +- drivers/isdn/hisax/callc.c | 63 +- drivers/isdn/hisax/config.c | 6 +- drivers/isdn/hisax/diva.c | 2 - drivers/isdn/hisax/hfc_2bds0.c | 2 - drivers/isdn/hisax/hfc_2bs0.c | 1 - drivers/isdn/hisax/hfc_pci.c | 3 - drivers/isdn/hisax/hscx_irq.c | 2 - drivers/isdn/hisax/isac.c | 1 - drivers/isdn/hisax/isar.c | 2 - drivers/isdn/hisax/isdnl2.c | 3 - drivers/isdn/hisax/isdnl3.c | 1 - drivers/isdn/hisax/jade_irq.c | 2 - drivers/isdn/hisax/md5sums.asc | 22 +- drivers/isdn/hisax/netjet.c | 1 - drivers/isdn/hisax/tei.c | 1 - drivers/isdn/hisax/w6692.c | 3 - drivers/isdn/isdn_tty.h | 7 +- drivers/isdn/isdn_ttyfax.c | 10 +- drivers/net/smc-ultra.c | 8 +- drivers/net/syncppp.c | 6 +- drivers/sbus/audio/amd7930.c | 4 +- drivers/sbus/audio/cs4231.c | 12 +- drivers/sbus/audio/dbri.c | 1734 ++++++++++---- drivers/sbus/audio/dbri.h | 26 +- drivers/sbus/char/openprom.c | 75 +- drivers/sbus/char/zs.c | 15 +- drivers/scsi/Config.in | 1 + drivers/scsi/Makefile | 20 + drivers/scsi/eata.c | 2 +- drivers/scsi/esp.c | 29 +- drivers/scsi/fcal.c | 2 +- drivers/scsi/hosts.c | 7 + drivers/scsi/ncr53c8xx.c | 1 + drivers/scsi/pluto.c | 6 +- drivers/scsi/qlogicpti.c | 220 +- drivers/scsi/qlogicpti.h | 20 +- drivers/scsi/qlogicpti_asm.c | 3414 +++++++++------------------ drivers/scsi/scsi.c | 83 +- drivers/scsi/sim710.c | 1605 +++++++++++++ drivers/scsi/sim710.h | 845 +++++++ drivers/scsi/sim710.scr | 554 +++++ drivers/scsi/sim710_d.h | 2360 ++++++++++++++++++ drivers/scsi/sim710_u.h | 67 + drivers/scsi/sym53c8xx.c | 1 + drivers/scsi/sym53c8xx_defs.h | 11 +- drivers/sound/esssolo1.c | 8 +- fs/lockd/mon.c | 2 +- fs/lockd/svcproc.c | 18 +- fs/lockd/svcsubs.c | 2 +- fs/nfsd/export.c | 2 +- fs/nfsd/nfsfh.c | 2 +- fs/nfsd/nfsproc.c | 2 +- fs/nfsd/vfs.c | 2 +- fs/qnx4/dir.c | 2 +- include/asm-sparc/head.h | 8 +- include/asm-sparc/ipc.h | 3 + include/asm-sparc/openpromio.h | 4 + include/asm-sparc64/ipc.h | 3 + include/asm-sparc64/openpromio.h | 4 + include/asm-sparc64/ttable.h | 6 +- include/linux/cyclades.h | 65 +- include/linux/pci.h | 1 + include/linux/proc_fs.h | 1 + include/linux/quotaops.h | 3 +- init/main.c | 4 + net/ipv4/icmp.c | 4 +- net/ipv4/ip_fw.c | 4 +- net/ipv4/ip_masq.c | 2 +- net/ipv4/ip_masq_autofw.c | 4 +- net/ipv4/ip_masq_mfw.c | 2 +- net/ipv4/ip_masq_portfw.c | 6 +- net/ipv4/ip_masq_user.c | 2 +- net/ipv4/ip_output.c | 2 +- net/ipv4/route.c | 4 +- net/ipv4/sysctl_net_ipv4.c | 2 +- net/ipv4/tcp_ipv4.c | 2 +- net/sunrpc/svc.c | 2 +- net/sunrpc/svcsock.c | 2 +- net/sunrpc/xprt.c | 2 +- 111 files changed, 9476 insertions(+), 4097 deletions(-) create mode 100644 drivers/scsi/sim710.c create mode 100644 drivers/scsi/sim710.h create mode 100644 drivers/scsi/sim710.scr create mode 100644 drivers/scsi/sim710_d.h create mode 100644 drivers/scsi/sim710_u.h diff --git a/Documentation/Configure.help b/Documentation/Configure.help index 22d064600c53..67b37841ff9f 100644 --- a/Documentation/Configure.help +++ b/Documentation/Configure.help @@ -9350,7 +9350,7 @@ CONFIG_SOUND I'm told that even without a sound card, you can make your computer say more than an occasional beep, by programming the PC speaker. Kernel patches and supporting utilities to do that are in the pcsp - package, available at http://www.imladris.demon.co.uk/pcsp/. + package, available at ftp://ftp.infradead.org/pub/pcsp/. OSS sound modules CONFIG_SOUND_OSS @@ -11740,6 +11740,13 @@ CONFIG_BVME6000_SCSI SCSI controller chip. Almost everyone using one of these boards will want to say Y to this question. +Simple 53c710 SCSI support (Compaq, NCR machines) +CONFIG_SCSI_SIM710 + This is a driver for the NCR53C710 chip commonly found in Compaq and + NCR machines. If you are looking for 53C710 support for an Amiga or + some 680x0 based VME card then you probably want the other NCR53C710 + driver. + MVME16x Ethernet support CONFIG_MVME16x_NET This is the driver for the Ethernet interface on the Motorola diff --git a/Documentation/isdn/CREDITS b/Documentation/isdn/CREDITS index 31da77e3b1e4..beef990bab6b 100644 --- a/Documentation/isdn/CREDITS +++ b/Documentation/isdn/CREDITS @@ -15,8 +15,11 @@ Volker G For contribution of man-pages, the imontty-tool and a perfect maintaining of the mailing-list at hub-wue. +Matthias Hessler (hessler@isdn4linux.de) + For creating and maintaining the FAQ. + Bernhard Hailer (Bernhard.Hailer@lrz.uni-muenchen.de) - For maintaining the FAQ. + For creating the FAQ, and the leafsite HOWTO. Michael 'Ghandi' Herold (michael@abadonna.franken.de) For contribution of the vbox answering machine. diff --git a/Documentation/isdn/README b/Documentation/isdn/README index 28b177a86fe4..1c91909d84aa 100644 --- a/Documentation/isdn/README +++ b/Documentation/isdn/README @@ -32,9 +32,13 @@ README for the ISDN-subsystem de.alt.comm.isdn4linux - There is also a well maintained FAQ (both english and german) available - at ftp.franken.de in /pub/isdn4linux/FAQ/ - This FAQ is also available at http://www.lrz-muenchen.de/~ui161ab/www/isdn/ + There is also a well maintained FAQ in English available at + http://www.mhessler.de/i4lfaq/ + It can be viewed online, or downloaded in sgml/text/html format. + The FAQ can also be viewed online at + http://www.isdn4inux.de/faq/ + or downloaded from + ftp://ftp.isdn4linux.de/pub/isdn4linux/FAQ/ 1.1 Technical details @@ -266,6 +270,8 @@ README for the ISDN-subsystem 23 0 Bit coded register: Bit 0: 0 = Add CPN to RING message off 1 = Add CPN to RING message on + Bit 1: 0 = Add CPN to FCON message off + 1 = Add CPN to FCON message on Last but not least a (at the moment fairly primitive) device to request the line-status (/dev/isdninfo) is made available. diff --git a/Makefile b/Makefile index 2a62dfed2551..59b484c6f8be 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 2 SUBLEVEL = 13 -EXTRAVERSION = pre14 +EXTRAVERSION = pre15 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index dc761c098dc3..8fc4a0a958f6 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c @@ -893,6 +893,8 @@ __initfunc(void print_cpu_info(struct cpuinfo_x86 *c)) if (c->x86_mask || c->cpuid_level>=0) printk(" stepping %02x\n", c->x86_mask); + else + printk("\n"); if(c->x86_vendor == X86_VENDOR_CENTAUR) { u32 hv,lv; diff --git a/arch/sparc/config.in b/arch/sparc/config.in index 1fc89b977346..a0688a893895 100644 --- a/arch/sparc/config.in +++ b/arch/sparc/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.68 1999/03/14 03:12:42 anton Exp $ +# $Id: config.in,v 1.68.2.1 1999/09/22 11:37:34 jj Exp $ # For a description of the syntax of this configuration file, # see the Configure script. # @@ -75,6 +75,7 @@ tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then tristate 'Kernel support for JAVA binaries (obsolete)' CONFIG_BINFMT_JAVA fi +bool 'SunOS binary emulation' CONFIG_SUNOS_EMUL endmenu mainmenu_option next_comment diff --git a/arch/sparc/defconfig b/arch/sparc/defconfig index 7dcbd88ac9cd..b6afe289772e 100644 --- a/arch/sparc/defconfig +++ b/arch/sparc/defconfig @@ -81,6 +81,7 @@ CONFIG_BINFMT_AOUT=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=m CONFIG_BINFMT_JAVA=m +CONFIG_SUNOS_EMUL=y # # Floppy, IDE, and other block devices diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index f4d5e3f67af7..cfc6e7b09cde 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.49 1999/01/02 16:45:37 davem Exp $ +# $Id: Makefile,v 1.49.2.1 1999/09/22 11:37:25 jj Exp $ # Makefile for the linux kernel. # # Note! Dependencies are done automagically by 'make dep', which also @@ -19,9 +19,9 @@ O_TARGET := kernel.o IRQ_OBJS := irq.o sun4m_irq.o sun4c_irq.o sun4d_irq.o O_OBJS := entry.o wof.o wuf.o etrap.o rtrap.o traps.o ${IRQ_OBJS} \ process.o signal.o ioport.o setup.o idprom.o \ - sys_sparc.o sunos_asm.o sparc-stub.o systbls.o sys_sunos.o \ - sunos_ioctl.o time.o windows.o cpu.o devices.o \ - sclow.o solaris.o tadpole.o tick14.o ptrace.o sys_solaris.o \ + sys_sparc.o sunos_asm.o sparc-stub.o systbls.o \ + time.o windows.o cpu.o devices.o sclow.o solaris.o \ + tadpole.o tick14.o ptrace.o sys_solaris.o \ unaligned.o muldiv.o pcic.o OX_OBJS := sparc_ksyms.o @@ -30,6 +30,10 @@ ifdef CONFIG_SUN4 O_OBJS += sun4setup.o endif +ifdef CONFIG_SUNOS_EMUL +O_OBJS += sys_sunos.o sunos_ioctl.o +endif + ifdef CONFIG_SMP O_OBJS += trampoline.o smp.o sun4m_smp.o sun4d_smp.o endif diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 8eeac72b0cd2..9ceaf859172c 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S @@ -1,4 +1,4 @@ -/* $Id: entry.S,v 1.159 1999/05/08 03:00:03 davem Exp $ +/* $Id: entry.S,v 1.159.2.2 1999/09/22 11:37:29 jj Exp $ * arch/sparc/kernel/entry.S: Sparc trap low-level entry points. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -488,10 +488,13 @@ linux_trap_ipi15_sun4d: .globl bad_instruction bad_instruction: sethi %hi(0xc1f80000), %l4 - ld [%l1], %l5 + ld [%l1], %l6 sethi %hi(0x81d80000), %l7 - and %l5, %l4, %l5 + and %l6, %l4, %l5 cmp %l5, %l7 + sethi %hi(0x8143c000), %l4 + be 1f + cmp %l6, %l4 be 1f SAVE_ALL @@ -506,7 +509,7 @@ bad_instruction: RESTORE_ALL -1: /* unimplemented flush - just skip */ +1: /* unimplemented flush/stbar - just skip */ jmpl %l2, %g0 rett %l2 + 4 @@ -1199,6 +1202,7 @@ C_LABEL(srmmu_fault): RESTORE_ALL +#ifdef CONFIG_SUNOS_EMUL /* SunOS uses syscall zero as the 'indirect syscall' it looks * like indir_syscall(scall_num, arg0, arg1, arg2...); etc. * This is complete brain damage. @@ -1226,6 +1230,7 @@ C_LABEL(sunos_indir): mov %o5, %o4 call %l6 mov %l4, %o7 +#endif .align 4 .globl C_LABEL(sys_nis_syscall) @@ -1639,6 +1644,20 @@ solaris_syscall: b ret_trap_entry st %l1, [%sp + REGWIN_SZ + PT_NPC] +#ifndef CONFIG_SUNOS_EMUL + .align 4 + .globl sunos_syscall +sunos_syscall: + SAVE_ALL_HEAD + rd %wim, %l3 + wr %l0, PSR_ET, %psr + nop + nop + mov %i0, %l5 + call C_LABEL(do_sunos_syscall) + add %sp, REGWIN_SZ, %o0 +#endif + /* {net, open}bsd system calls enter here... */ .align 4 .globl bsd_syscall diff --git a/arch/sparc/kernel/head.S b/arch/sparc/kernel/head.S index 0020770e090b..aa0816a6810a 100644 --- a/arch/sparc/kernel/head.S +++ b/arch/sparc/kernel/head.S @@ -1,4 +1,4 @@ -/* $Id: head.S,v 1.95 1999/04/13 07:40:34 anton Exp $ +/* $Id: head.S,v 1.95.2.2 1999/09/23 09:53:18 anton Exp $ * head.S: The initial boot code for the Sparc port of Linux. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -151,7 +151,11 @@ t_bad6f:BAD_TRAP(0x6f) BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x7 t_bad74:BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) t_bad79:BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) t_bad7e:BAD_TRAP(0x7e) BAD_TRAP(0x7f) +#ifdef CONFIG_SUNOS_EMUL t_sunos:SUNOS_SYSCALL_TRAP /* SunOS System Call */ +#else +t_sunos:SUNOS_NO_SYSCALL_TRAP /* No SunOS emulation */ +#endif t_sbkpt:BREAKPOINT_TRAP /* Software Breakpoint/KGDB */ t_divz: BAD_TRAP(0x82) /* Divide by zero trap */ t_flwin:TRAP_ENTRY(0x83, do_flush_windows) /* Flush Windows Trap */ @@ -235,7 +239,11 @@ C_LABEL(trapbase_cpu1): BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) BAD_TRAP(0x7e) BAD_TRAP(0x7f) - SUNOS_SYSCALL_TRAP +#ifdef CONFIG_SUNOS_EMUL + SUNOS_SYSCALL_TRAP /* SunOS System Call */ +#else + SUNOS_NO_SYSCALL_TRAP /* No SunOS emulation */ +#endif BREAKPOINT_TRAP BAD_TRAP(0x82) TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85) @@ -303,7 +311,11 @@ C_LABEL(trapbase_cpu2): BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) BAD_TRAP(0x7e) BAD_TRAP(0x7f) - SUNOS_SYSCALL_TRAP +#ifdef CONFIG_SUNOS_EMUL + SUNOS_SYSCALL_TRAP /* SunOS System Call */ +#else + SUNOS_NO_SYSCALL_TRAP /* No SunOS emulation */ +#endif BREAKPOINT_TRAP BAD_TRAP(0x82) TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85) @@ -371,7 +383,11 @@ C_LABEL(trapbase_cpu3): BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78) BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d) BAD_TRAP(0x7e) BAD_TRAP(0x7f) - SUNOS_SYSCALL_TRAP +#ifdef CONFIG_SUNOS_EMUL + SUNOS_SYSCALL_TRAP /* SunOS System Call */ +#else + SUNOS_NO_SYSCALL_TRAP /* No SunOS emulation */ +#endif BREAKPOINT_TRAP BAD_TRAP(0x82) TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85) diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c index b11e3b90345f..46b57cbb6193 100644 --- a/arch/sparc/kernel/sparc_ksyms.c +++ b/arch/sparc/kernel/sparc_ksyms.c @@ -1,4 +1,4 @@ -/* $Id: sparc_ksyms.c,v 1.77.2.1 1999/08/07 10:42:47 davem Exp $ +/* $Id: sparc_ksyms.c,v 1.77.2.3 1999/09/22 17:06:50 jj Exp $ * arch/sparc/kernel/ksyms.c: Sparc specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -50,8 +50,6 @@ struct poll { extern int svr4_getcontext (svr4_ucontext_t *, struct pt_regs *); extern int svr4_setcontext (svr4_ucontext_t *, struct pt_regs *); -extern unsigned long sunos_mmap(unsigned long, unsigned long, unsigned long, - unsigned long, unsigned long, unsigned long); void _sigpause_common (unsigned int set, struct pt_regs *); extern void (*__copy_1page)(void *, const void *); extern void __memmove(void *, const void *, __kernel_size_t); @@ -192,7 +190,6 @@ EXPORT_SYMBOL(dma_chain); EXPORT_SYMBOL(svr4_setcontext); EXPORT_SYMBOL(svr4_getcontext); EXPORT_SYMBOL(_sigpause_common); -EXPORT_SYMBOL(sunos_mmap); /* Should really be in linux/kernel/ksyms.c */ EXPORT_SYMBOL(dump_thread); @@ -211,6 +208,7 @@ EXPORT_SYMBOL(prom_node_has_property); EXPORT_SYMBOL(prom_setprop); EXPORT_SYMBOL(saved_command_line); EXPORT_SYMBOL(prom_apply_obio_ranges); +EXPORT_SYMBOL(prom_finddevice); EXPORT_SYMBOL(prom_getname); EXPORT_SYMBOL(prom_feval); EXPORT_SYMBOL(prom_getbool); diff --git a/arch/sparc/kernel/sys_solaris.c b/arch/sparc/kernel/sys_solaris.c index 6bef6e5232db..c8e337afe1d1 100644 --- a/arch/sparc/kernel/sys_solaris.c +++ b/arch/sparc/kernel/sys_solaris.c @@ -4,6 +4,7 @@ * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) */ +#include #include #include #include @@ -39,3 +40,16 @@ do_solaris_syscall (struct pt_regs *regs) unlock_kernel(); return ret; } + +#ifndef CONFIG_SUNOS_EMUL +asmlinkage int +do_sunos_syscall (struct pt_regs *regs) +{ + static int cnt = 0; + if (++cnt < 10) printk ("SunOS binary emulation not compiled in\n"); + lock_kernel(); + force_sig (SIGSEGV, current); + unlock_kernel(); + return 0; +} +#endif diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index 4d0dfff5fc49..80ec4e7088f7 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S @@ -1,4 +1,4 @@ -/* $Id: systbls.S,v 1.83 1999/04/07 17:14:06 davem Exp $ +/* $Id: systbls.S,v 1.83.2.1 1999/09/22 11:37:27 jj Exp $ * systbls.S: System call entry point tables for OS compatibility. * The native Linux system call table lives here also. * @@ -9,6 +9,8 @@ * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu) */ +#include + .data .align 4 @@ -70,6 +72,7 @@ sys_call_table: /*250*/ .long sys_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl /*255*/ .long sys_aplib, sys_nis_syscall +#ifdef CONFIG_SUNOS_EMUL /* Now the SunOS syscall table. */ .align 4 @@ -162,3 +165,5 @@ sunos_sys_table: .long sunos_nosys, sunos_nosys /*250*/ .long sunos_nosys, sunos_nosys, sunos_nosys .long sunos_nosys, sunos_nosys, sys_aplib + +#endif diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 740c3e8f2852..68a2dae914fb 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c @@ -1,4 +1,4 @@ -/* $Id: srmmu.c,v 1.187.2.1 1999/08/07 10:42:55 davem Exp $ +/* $Id: srmmu.c,v 1.187.2.2 1999/09/21 11:24:15 anton Exp $ * srmmu.c: SRMMU specific routines for memory management. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -2060,7 +2060,9 @@ static void srmmu_destroy_context(struct mm_struct *mm) flush_cache_mm(mm); ctxd_set(&srmmu_context_table[mm->context], swapper_pg_dir); flush_tlb_mm(mm); + spin_lock(&srmmu_context_spinlock); free_context(mm->context); + spin_unlock(&srmmu_context_spinlock); mm->context = NO_CONTEXT; } } @@ -2149,7 +2151,9 @@ static void hypersparc_destroy_context(struct mm_struct *mm) hypersparc_flush_page_to_ram((unsigned long)ctxp); flush_tlb_mm(mm); + spin_lock(&srmmu_context_spinlock); free_context(mm->context); + spin_unlock(&srmmu_context_spinlock); mm->context = NO_CONTEXT; } } diff --git a/arch/sparc64/config.in b/arch/sparc64/config.in index 65bf0c66e0b0..eaed97933896 100644 --- a/arch/sparc64/config.in +++ b/arch/sparc64/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.67.2.1 1999/09/04 17:49:25 davem Exp $ +# $Id: config.in,v 1.67.2.2 1999/09/22 11:37:42 jj Exp $ # For a description of the syntax of this configuration file, # see the Configure script. # @@ -66,6 +66,7 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC tristate 'Kernel support for JAVA binaries (obsolete)' CONFIG_BINFMT_JAVA fi +bool 'SunOS binary emulation' CONFIG_SUNOS_EMUL if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then tristate 'Solaris binary emulation' CONFIG_SOLARIS_EMUL fi diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index 565b81eddc24..5f5a5ce3f77c 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/defconfig @@ -90,6 +90,7 @@ CONFIG_BINFMT_ELF32=y # CONFIG_BINFMT_AOUT32 is not set CONFIG_BINFMT_MISC=m CONFIG_BINFMT_JAVA=m +# CONFIG_SUNOS_EMUL is not set CONFIG_SOLARIS_EMUL=m CONFIG_PARPORT=m CONFIG_PARPORT_AX=m diff --git a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile index f1ab213117ab..5f4c3034ee36 100644 --- a/arch/sparc64/kernel/Makefile +++ b/arch/sparc64/kernel/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.43.2.1 1999/08/31 18:21:15 davem Exp $ +# $Id: Makefile,v 1.43.2.2 1999/09/22 11:37:40 jj Exp $ # Makefile for the linux kernel. # # Note! Dependencies are done automagically by 'make dep', which also @@ -19,8 +19,7 @@ O_TARGET := kernel.o O_OBJS := process.o setup.o cpu.o idprom.o \ traps.o devices.o auxio.o ioport.o \ irq.o ptrace.o time.o sys_sparc.o signal.o \ - unaligned.o sys_sunos32.o sunos_ioctl32.o \ - central.o psycho.o starfire.o power.o + unaligned.o central.o psycho.o starfire.o power.o OX_OBJS := sparc64_ksyms.o ifdef CONFIG_PCI @@ -43,6 +42,14 @@ ifdef CONFIG_BINFMT_AOUT32 O_OBJS += binfmt_aout32.o endif +ifdef CONFIG_SUNOS_EMUL + O_OBJS += sys_sunos32.o sunos_ioctl32.o +else + ifdef CONFIG_SOLARIS_EMUL + O_OBJS += sys_sunos32.o sunos_ioctl32.o + endif +endif + head.o: head.S ttable.S itlb_base.S dtlb_base.S dtlb_backend.S dtlb_prot.S \ etrap.S rtrap.S winfixup.S entry.S $(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $*.S -o $*.o diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c index e20e4f0c8cfb..43a2843a15f1 100644 --- a/arch/sparc64/kernel/ebus.c +++ b/arch/sparc64/kernel/ebus.c @@ -1,4 +1,4 @@ -/* $Id: ebus.c,v 1.36.2.2 1999/09/07 01:45:57 davem Exp $ +/* $Id: ebus.c,v 1.36.2.3 1999/09/21 15:45:37 davem Exp $ * ebus.c: PCI to EBus bridge device. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -100,9 +100,13 @@ __initfunc(void fill_ebus_child(int node, struct linux_prom_registers *preg, for (i = 0; i < dev->num_addrs; i++) { if (regs[i] >= dev->parent->num_addrs) { +#if 1 + continue; +#else prom_printf("UGH: property for %s was %d, need < %d\n", dev->prom_name, len, dev->parent->num_addrs); panic(__FUNCTION__); +#endif } dev->base_address[i] = dev->parent->base_address[regs[i]]; } diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index ec150a6865ec..24eb4f64fedb 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S @@ -1,4 +1,4 @@ -/* $Id: entry.S,v 1.103.2.1 1999/08/19 01:11:15 davem Exp $ +/* $Id: entry.S,v 1.103.2.2 1999/09/22 11:37:37 jj Exp $ * arch/sparc64/kernel/entry.S: Sparc64 trap low-level entry points. * * Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu) @@ -652,6 +652,8 @@ breakpoint_trap: ba,pt %xcc, rtrap nop +#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ + defined(CONFIG_SOLARIS_EMUL_MODULE) /* SunOS uses syscall zero as the 'indirect syscall' it looks * like indir_syscall(scall_num, arg0, arg1, arg2...); etc. * This is complete brain damage. @@ -705,6 +707,7 @@ sunos_getgid: stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I1] b,pt %xcc, ret_sys_call stx %o0, [%sp + STACK_BIAS + REGWIN_SZ + PT_V9_I0] +#endif /* SunOS's execv() call only specifies the argv argument, the * environment settings are the same as the calling processes. diff --git a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c index 0f4997da7e53..b6faa61ae7a6 100644 --- a/arch/sparc64/kernel/ioctl32.c +++ b/arch/sparc64/kernel/ioctl32.c @@ -1,4 +1,4 @@ -/* $Id: ioctl32.c,v 1.62.2.3 1999/09/10 05:57:01 davem Exp $ +/* $Id: ioctl32.c,v 1.62.2.4 1999/09/22 17:06:56 jj Exp $ * ioctl32.c: Conversion between 32bit and 64bit native ioctls. * * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) @@ -2136,6 +2136,9 @@ asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) case OPROMGETCONS: case OPROMGETFBNAME: case OPROMGETBOOTARGS: + case OPROMSETCUR: + case OPROMPCI2NODE: + case OPROMPATH2NODE: /* Socket level stuff */ case FIOSETOWN: diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index 6e8d475ece47..95376a54df8d 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c @@ -1,4 +1,4 @@ -/* $Id: sparc64_ksyms.c,v 1.58.2.1 1999/06/28 11:27:57 davem Exp $ +/* $Id: sparc64_ksyms.c,v 1.58.2.3 1999/09/22 17:07:00 jj Exp $ * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -56,8 +56,6 @@ struct poll { extern unsigned prom_cpu_nodes[64]; extern void die_if_kernel(char *str, struct pt_regs *regs); extern pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); -extern unsigned long sunos_mmap(unsigned long, unsigned long, unsigned long, - unsigned long, unsigned long, unsigned long); void _sigpause_common (unsigned int set, struct pt_regs *); extern void *__bzero(void *, size_t); extern void *__bzero_noasi(void *, size_t); @@ -196,7 +194,6 @@ EXPORT_SYMBOL(insl); /* Solaris/SunOS binary compatibility */ EXPORT_SYMBOL(_sigpause_common); -EXPORT_SYMBOL(sunos_mmap); /* Should really be in linux/kernel/ksyms.c */ EXPORT_SYMBOL(dump_thread); @@ -222,6 +219,7 @@ EXPORT_SYMBOL(prom_node_has_property); EXPORT_SYMBOL(prom_setprop); EXPORT_SYMBOL(saved_command_line); EXPORT_SYMBOL(prom_getname); +EXPORT_SYMBOL(prom_finddevice); EXPORT_SYMBOL(prom_feval); EXPORT_SYMBOL(prom_getbool); EXPORT_SYMBOL(prom_getstring); diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index 8d11f10b8fbc..f60addd562d7 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c @@ -1,4 +1,4 @@ -/* $Id: sys_sparc.c,v 1.26 1999/01/07 19:07:01 jj Exp $ +/* $Id: sys_sparc.c,v 1.26.2.1 1999/09/22 11:37:38 jj Exp $ * linux/arch/sparc64/kernel/sys_sparc.c * * This file contains various random system calls that @@ -273,6 +273,21 @@ asmlinkage int solaris_syscall(struct pt_regs *regs) return -ENOSYS; } +#ifndef CONFIG_SUNOS_EMUL +asmlinkage int sunos_syscall(struct pt_regs *regs) +{ + static int count = 0; + lock_kernel(); + regs->tpc = regs->tnpc; + regs->tnpc += 4; + if(++count <= 20) + printk ("SunOS binary emulation not compiled in\n"); + force_sig(SIGSEGV, current); + unlock_kernel(); + return -ENOSYS; +} +#endif + asmlinkage int sys_utrap_install(utrap_entry_t type, utrap_handler_t new_p, utrap_handler_t new_d, utrap_handler_t *old_p, utrap_handler_t *old_d) diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index d2a75033abd0..0e73485dd866 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S @@ -1,4 +1,4 @@ -/* $Id: systbls.S,v 1.53 1999/04/07 17:14:11 davem Exp $ +/* $Id: systbls.S,v 1.53.2.1 1999/09/22 11:37:39 jj Exp $ * systbls.S: System call entry point tables for OS compatibility. * The native Linux system call table lives here also. * @@ -10,6 +10,8 @@ * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu) */ +#include + .text .align 1024 @@ -129,6 +131,8 @@ sys_call_table: /*250*/ .word sys_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl .word sys_aplib +#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ + defined(CONFIG_SOLARIS_EMUL_MODULE) /* Now the 32-bit SunOS syscall table. */ .align 1024 @@ -221,3 +225,5 @@ sunos_sys_table: .word sunos_nosys, sunos_nosys /*250*/ .word sunos_nosys, sunos_nosys, sunos_nosys .word sunos_nosys, sunos_nosys, sys_aplib + +#endif diff --git a/drivers/block/ide.c b/drivers/block/ide.c index 6367dcfead9d..45847e116a66 100644 --- a/drivers/block/ide.c +++ b/drivers/block/ide.c @@ -1170,13 +1170,13 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, unsigned long *hwgroup_flags bdev->current_request = hwgroup->rq = drive->queue; spin_unlock_irqrestore(&io_request_lock, io_flags); + spin_unlock_irqrestore(&hwgroup->spinlock, *hwgroup_flags); if (hwif->irq != masked_irq) disable_irq(hwif->irq); - spin_unlock_irqrestore(&hwgroup->spinlock, *hwgroup_flags); start_request(drive); - spin_lock_irqsave(&hwgroup->spinlock, *hwgroup_flags); if (hwif->irq != masked_irq) enable_irq(hwif->irq); + spin_lock_irqsave(&hwgroup->spinlock, *hwgroup_flags); } } @@ -1544,7 +1544,6 @@ int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t actio if (action == ide_wait) { down(&sem); /* wait for it to be serviced */ - rq->sem = NULL; } restore_flags(flags); /* all CPUs; overkill? */ return rq->errors ? -EIO : 0; /* return -EIO if errors */ diff --git a/drivers/char/cyclades.c b/drivers/char/cyclades.c index f99a5a45fbee..542fc41ead8a 100644 --- a/drivers/char/cyclades.c +++ b/drivers/char/cyclades.c @@ -1,7 +1,7 @@ -#define BLOCKMOVE +#undef BLOCKMOVE #define Z_WAKE static char rcsid[] = -"$Revision: 2.2.2.3 $$Date: 1999/06/28 11:13:29 $"; +"$Revision: 2.3.2.2 $$Date: 1999/10/01 11:27:43 $"; /* * linux/drivers/char/cyclades.c @@ -9,9 +9,8 @@ static char rcsid[] = * This file contains the driver for the Cyclades Cyclom-Y multiport * serial boards. * - * Maintained by Ivan Passos (ivan@cyclades.com), - * Marcio Saito (marcio@cyclades.com) and - * Randolph Bentson (bentson@grieg.seaslug.org). + * Initially written by Randolph Bentson (bentson@grieg.seaslug.org). + * Maintained by Ivan Passos (ivan@cyclades.com). * * For Technical support and installation problems, please send e-mail * to support@cyclades.com. @@ -31,6 +30,39 @@ static char rcsid[] = * void cleanup_module(void); * * $Log: cyclades.c,v $ + * Revision 2.3.2.2 1999/10/01 11:27:43 ivan + * Fixed bug in cyz_poll that would make all ports but port 0 + * unable to transmit/receive data (Cyclades-Z only); + * Implemented logic to prevent the RX buffer from being stuck with data + * due to a driver / firmware race condition in interrupt op mode + * (Cyclades-Z only); + * Fixed bug in block_til_ready logic that would lead to a system crash; + * Revisited cy_close spinlock usage; + * + * Revision 2.3.2.1 1999/09/28 11:01:22 ivan + * Revisited CONFIG_PCI conditional compilation for PCI board support; + * Implemented TIOCGICOUNT and TIOCMIWAIT ioctl support; + * _Major_ cleanup on the Cyclades-Z interrupt support code / logic; + * Removed CTS handling from the driver -- this is now completely handled + * by the firmware (Cyclades-Z only); + * Flush RX on-board buffers on a port open (Cyclades-Z only); + * Fixed handling of ASYNC_SPD_* TTY flags; + * Module unload now unmaps all memory area allocated by ioremap; + * + * Revision 2.3.1.1 1999/07/15 16:45:53 ivan + * Removed CY_PROC conditional compilation; + * Implemented SMP-awareness for the driver; + * Implemented a new ISA IRQ autoprobe that uses the irq_probe_[on|off] + * functions; + * The driver now accepts memory addresses (maddr=0xMMMMM) and IRQs + * (irq=NN) as parameters (only for ISA boards); + * Fixed bug in set_line_char that would prevent the Cyclades-Z + * ports from being configured at speeds above 115.2Kbps; + * Fixed bug in cy_set_termios that would prevent XON/XOFF flow control + * switching from working properly; + * The driver now only prints IRQ info for the Cyclades-Z if it's + * configured to work in interrupt mode; + * * Revision 2.2.2.3 1999/06/28 11:13:29 ivan * Added support for interrupt mode operation for the Z cards; * Removed the driver inactivity control for the Z; @@ -557,7 +589,6 @@ static char rcsid[] = #undef CY_16Y_HACK #undef CY_ENABLE_MONITORING #undef CY_PCI_DEBUG -#undef CY_PROC #if 0 #define PAUSE __asm__("nop"); @@ -613,6 +644,18 @@ static char rcsid[] = #include #include +#include + +#define CY_LOCK(info,flags) \ + do { \ + spin_lock_irqsave(&cy_card[info->card].card_lock, flags); \ + } while (0) + +#define CY_UNLOCK(info,flags) \ + do { \ + spin_unlock_irqrestore(&cy_card[info->card].card_lock, flags); \ + } while (0) + #include #include #include @@ -631,7 +674,8 @@ static char rcsid[] = #define cy_put_user put_user -static unsigned long cy_get_user(unsigned long *addr) +static unsigned long +cy_get_user(unsigned long *addr) { unsigned long result = 0; int error = get_user (result, addr); @@ -668,11 +712,6 @@ static struct tty_driver cy_serial_driver, cy_callout_driver; static int serial_refcount; #ifndef CONFIG_COBALT_27 -static volatile int cy_irq_triggered; -static volatile int cy_triggered; -static int cy_wild_int_mask; -static volatile ucchar *intr_base_addr; - /* This is the address lookup table. The driver will probe for Cyclom-Y/ISA boards at all addresses in here. If you want the driver to probe addresses at a different address, add it to @@ -695,6 +734,14 @@ static unsigned char *cy_isa_addresses[] = { }; #define NR_ISA_ADDRS (sizeof(cy_isa_addresses)/sizeof(unsigned char*)) +#ifdef MODULE +static int maddr[NR_CARDS] = { 0, }; +static int irq[NR_CARDS] = { 0, }; + +MODULE_PARM(maddr, "1-" __MODULE_STRING(NR_CARDS) "l"); +MODULE_PARM(irq, "1-" __MODULE_STRING(NR_CARDS) "i"); +#endif + #endif /* CONFIG_COBALT_27 */ /* This is the per-card data structure containing address, irq, number of @@ -802,6 +849,7 @@ static int cy_chip_offset [] = static unsigned short cy_pci_nboard = 0; static unsigned short cy_isa_nboard = 0; static unsigned short cy_nboard = 0; +#ifdef CONFIG_PCI static unsigned short cy_pci_dev_id[] = { PCI_DEVICE_ID_CYCLOM_Y_Lo, /* PCI < 1Mb */ PCI_DEVICE_ID_CYCLOM_Y_Hi, /* PCI > 1Mb */ @@ -813,12 +861,13 @@ static unsigned short cy_pci_dev_id[] = { PCI_DEVICE_ID_CYCLOM_Z_Hi, /* Z PCI > 1Mb */ 0 /* end of table */ }; - +#endif static void cy_start(struct tty_struct *); static void set_line_char(struct cyclades_port *); +static int cyz_issue_cmd(struct cyclades_card *, uclong, ucchar, uclong); #ifndef CONFIG_COBALT_27 -static void cy_probe(int, void *, struct pt_regs *); +static unsigned detect_isa_irq (volatile ucchar *); #endif /* CONFIG_COBALT_27 */ #ifdef CYCLOM_SHOW_STATUS static void show_status(int); @@ -837,6 +886,9 @@ static struct timer_list cyz_timerlist = { NULL, NULL, 0, 0, cyz_poll }; +#else /* CONFIG_CYZ_INTR */ +static void cyz_rx_restart(unsigned long); +static struct timer_list cyz_rx_full_timer[NR_PORTS]; #endif /* CONFIG_CYZ_INTR */ /************************************************** @@ -941,6 +993,17 @@ do_softint(void *private_) if (test_and_clear_bit(Cy_EVENT_OPEN_WAKEUP, &info->event)) { wake_up_interruptible(&info->open_wait); } +#ifdef CONFIG_CYZ_INTR + if (test_and_clear_bit(Cy_EVENT_Z_RX_FULL, &info->event)) { + cyz_rx_full_timer[info->line].expires = jiffies + 1; + cyz_rx_full_timer[info->line].function = cyz_rx_restart; + cyz_rx_full_timer[info->line].data = (unsigned long)info; + add_timer(&cyz_rx_full_timer[info->line]); + } +#endif + if (test_and_clear_bit(Cy_EVENT_DELTA_WAKEUP, &info->event)) { + wake_up_interruptible(&info->delta_msr_wait); + } if (test_and_clear_bit(Cy_EVENT_WRITE_WAKEUP, &info->event)) { if((tty->flags & (1<< TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup){ @@ -963,226 +1026,80 @@ do_softint(void *private_) command to the Cirrus chip to complete and then issues the new command. An error is returned if the previous command didn't finish within the time limit. + + This function is only called from inside spinlock-protected code. */ static int cyy_issue_cmd(volatile ucchar *base_addr, u_char cmd, int index) { - unsigned long flags; volatile int i; - save_flags(flags); cli(); - /* Check to see that the previous command has completed */ - for(i = 0 ; i < 100 ; i++){ - if (cy_readb(base_addr+(CyCCR< 0)? irq : 0; +} #endif /* CONFIG_COBALT_27 */ /* The real interrupt service routine is called @@ -1245,6 +1162,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) printk("cyy_interrupt: rcvd intr, chip %d\n\r", chip); #endif /* determine the channel & change to that context */ + spin_lock(&cinfo->card_lock); save_xir = (u_char) cy_readb(base_addr+(CyRIR<first_line; @@ -1252,6 +1170,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) info->last_active = jiffies; save_car = cy_readb(base_addr+(CyCAR<card_lock); /* if there is nowhere to put the data, discard it */ if(info->tty == 0){ @@ -1269,7 +1188,19 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) j = (cy_readb(base_addr+(CyRIVR<icount.brk++; + else if(data & CyFRAME) + info->icount.frame++; + else if(data & CyPARITY) + info->icount.parity++; + else if(data & CyOVERRUN) + info->icount.overrun++; + if(data & info->ignore_status_mask){ + info->icount.rx++; continue; } if (tty->flip.count < TTY_FLIPBUF_SIZE){ @@ -1277,9 +1208,10 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) if (data & info->read_status_mask){ if(data & CyBREAK){ *tty->flip.flag_buf_ptr++ = - TTY_BREAK; + TTY_BREAK; *tty->flip.char_buf_ptr++ = cy_readb(base_addr+(CyRDSR<icount.rx++; if (info->flags & ASYNC_SAK){ do_SAK(tty); } @@ -1288,17 +1220,20 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) TTY_FRAME; *tty->flip.char_buf_ptr++ = cy_readb(base_addr+(CyRDSR<icount.rx++; info->idle_stats.frame_errs++; }else if(data & CyPARITY){ *tty->flip.flag_buf_ptr++ = TTY_PARITY; *tty->flip.char_buf_ptr++ = cy_readb(base_addr+(CyRDSR<icount.rx++; info->idle_stats.parity_errs++; }else if(data & CyOVERRUN){ *tty->flip.flag_buf_ptr++ = TTY_OVERRUN; *tty->flip.char_buf_ptr++ = 0; + info->icount.rx++; /* If the flip buffer itself is overflowing, we still lose the next incoming character. @@ -1310,6 +1245,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) TTY_NORMAL; *tty->flip.char_buf_ptr++ = cy_readb(base_addr+(CyRDSR<icount.rx++; } info->idle_stats.overruns++; /* These two conditions may imply */ @@ -1319,15 +1255,18 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) }else{ *tty->flip.flag_buf_ptr++ = 0; *tty->flip.char_buf_ptr++ = 0; + info->icount.rx++; } }else{ *tty->flip.flag_buf_ptr++ = 0; *tty->flip.char_buf_ptr++ = 0; + info->icount.rx++; } }else{ /* there was a software buffer overrun and nothing could be done about it!!! */ + info->icount.buf_overrun++; info->idle_stats.overruns++; } } else { /* normal character reception */ @@ -1351,6 +1290,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) data = cy_readb(base_addr+(CyRDSR<flip.flag_buf_ptr++ = TTY_NORMAL; *tty->flip.char_buf_ptr++ = data; + info->icount.rx++; #ifdef CY_16Y_HACK udelay(10L); #endif @@ -1359,8 +1299,10 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) queue_task(&tty->flip.tqueue, &tq_timer); } /* end of service */ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CyRIR<card_lock); } @@ -1373,34 +1315,40 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) #endif /* determine the channel & change to that context */ + spin_lock(&cinfo->card_lock); save_xir = (u_char) cy_readb(base_addr+(CyTIR<first_line; save_car = cy_readb(base_addr+(CyCAR<card_lock); /* validate the port# (as configured and open) */ if( (i < 0) || (NR_PORTS <= i) ){ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CySRER<card_lock); goto txend; } info = &cy_port[i]; info->last_active = jiffies; if(info->tty == 0){ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CySRER<card_lock); goto txdone; } /* load the on-chip space for outbound data */ char_count = info->xmit_fifo_size; - if(info->x_char) { /* send special char */ outch = info->x_char; cy_writeb((u_long)base_addr+(CyTDR<icount.tx++; info->x_char = 0; } @@ -1421,21 +1369,27 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) while (char_count-- > 0){ if (!info->xmit_cnt){ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CySRER<card_lock); goto txdone; } if (info->xmit_buf == 0){ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CySRER<card_lock); goto txdone; } if (info->tty->stopped || info->tty->hw_stopped){ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CySRER<card_lock); goto txdone; } /* Because the Embedded Transmit Commands have @@ -1455,6 +1409,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) info->xmit_tail = (info->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); cy_writeb((u_long)base_addr+(CyTDR<icount.tx++; }else{ if(char_count > 1){ info->xmit_cnt--; @@ -1463,6 +1418,7 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) cy_writeb((u_long)base_addr+(CyTDR<icount.tx++; char_count--; }else{ } @@ -1475,14 +1431,17 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) } txend: /* end of service */ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CyTIR<card_lock); } if (status & CySRModem) { /* modem interrupt */ /* determine the channel & change to that context */ + spin_lock(&cinfo->card_lock); save_xir = (u_char) cy_readb(base_addr+(CyMIR<card_lock); if(info->tty == 0){/* no place for data, ignore it*/ ; }else{ + if (mdm_change & CyANY_DELTA) { + /* For statistics only */ + if (mdm_change & CyDCD) info->icount.dcd++; + if (mdm_change & CyCTS) info->icount.cts++; + if (mdm_change & CyDSR) info->icount.dsr++; + if (mdm_change & CyRI) info->icount.rng++; + + cy_sched_event(info, Cy_EVENT_DELTA_WAKEUP); + } + if((mdm_change & CyDCD) && (info->flags & ASYNC_CHECK_CD)){ if(mdm_status & CyDCD){ @@ -1517,9 +1487,11 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* cy_start isn't used because... !!! */ info->tty->hw_stopped = 0; + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CySRER<card_lock); cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP); } @@ -1528,29 +1500,35 @@ cyy_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* cy_stop isn't used because ... !!! */ info->tty->hw_stopped = 1; + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CySRER<card_lock); } } } - if(mdm_status & CyDSR){ + if(mdm_change & CyDSR){ } - if(mdm_status & CyRI){ + if(mdm_change & CyRI){ } } /* end of service */ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)base_addr+(CyMIR<card_lock); } } /* end while status != 0 */ } /* end loop for chips... */ } while(had_work); /* clear interrupts */ + spin_lock(&cinfo->card_lock); cy_writeb((u_long)card_base_addr + (Cy_ClrIntr<card_lock); } /* cyy_interrupt */ /***********************************************************/ @@ -1624,37 +1602,184 @@ cyz_issue_cmd( struct cyclades_card *cinfo, return(0); } /* cyz_issue_cmd */ +static void +cyz_handle_rx(struct cyclades_port *info, volatile struct BUF_CTRL *buf_ctrl) +{ + struct cyclades_card *cinfo = &cy_card[info->card]; + struct tty_struct *tty = info->tty; + volatile int char_count; +#ifdef BLOCKMOVE + int small_count; +#else + char data; +#endif + volatile uclong rx_put, rx_get, rx_bufsize; + +/* Removed due to compilation problems in Alpha systems */ +// if ((char_count = CHARS_IN_BUF(buf_ctrl))){ -#if 0 -static int -cyz_update_channel( struct cyclades_card *cinfo, - u_long channel, u_char mode, u_char cmd) -{ - struct FIRM_ID *firm_id = - (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); - struct ZFW_CTRL *zfw_ctrl; - struct CH_CTRL *ch_ctrl; + rx_get = cy_readl(&buf_ctrl->rx_get); + rx_put = cy_readl(&buf_ctrl->rx_put); + rx_bufsize = cy_readl(&buf_ctrl->rx_bufsize); + if (rx_put >= rx_get) + char_count = rx_put - rx_get; + else + char_count = rx_put - rx_get + rx_bufsize; - if (!ISZLOADED(*cinfo)){ - return (-1); + if ( char_count ) { + info->last_active = jiffies; + info->jiffies[1] = jiffies; + +#ifdef CY_ENABLE_MONITORING + info->mon.int_count++; + info->mon.char_count += char_count; + if (char_count > info->mon.char_max) + info->mon.char_max = char_count; + info->mon.char_last = char_count; +#endif + if(tty == 0){ + /* flush received characters */ + rx_get = (rx_get + char_count) & (rx_bufsize - 1); + info->rflush_count++; + }else{ +#ifdef BLOCKMOVE + /* we'd like to use memcpy(t, f, n) and memset(s, c, count) + for performance, but because of buffer boundaries, there + may be several steps to the operation */ + while(0 < (small_count = + cy_min((rx_bufsize - rx_get), + cy_min((TTY_FLIPBUF_SIZE - tty->flip.count), char_count)) + )) { + memcpy_fromio(tty->flip.char_buf_ptr, + (char *)(cinfo->base_addr + + cy_readl(&buf_ctrl->rx_bufaddr) + + rx_get), + small_count); + + tty->flip.char_buf_ptr += small_count; + memset(tty->flip.flag_buf_ptr, TTY_NORMAL, small_count); + tty->flip.flag_buf_ptr += small_count; + rx_get = (rx_get + small_count) & (rx_bufsize - 1); + char_count -= small_count; + info->icount.rx += small_count; + info->idle_stats.recv_bytes += small_count; + tty->flip.count += small_count; + } +#else + while(char_count--){ + if (tty->flip.count >= TTY_FLIPBUF_SIZE){ +#ifdef CONFIG_CYZ_INTR + cy_sched_event(info, Cy_EVENT_Z_RX_FULL); +#endif + break; + } + data = cy_readb(cinfo->base_addr + + cy_readl(&buf_ctrl->rx_bufaddr) + rx_get); + rx_get = (rx_get + 1) & (rx_bufsize - 1); + tty->flip.count++; + *tty->flip.flag_buf_ptr++ = TTY_NORMAL; + *tty->flip.char_buf_ptr++ = data; + info->idle_stats.recv_bytes++; + info->icount.rx++; + } +#endif + info->idle_stats.recv_idle = jiffies; + queue_task(&tty->flip.tqueue, &tq_timer); + } + /* Update rx_get */ + cy_writel(&buf_ctrl->rx_get, rx_get); } - zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); - ch_ctrl = zfw_ctrl->ch_ctrl; +} - cy_writel(&ch_ctrl[channel].op_mode, (uclong)mode); +static void +cyz_handle_tx(struct cyclades_port *info, volatile struct BUF_CTRL *buf_ctrl) +{ + struct cyclades_card *cinfo = &cy_card[info->card]; + struct tty_struct *tty = info->tty; + char data; + volatile int char_count; +#ifdef BLOCKMOVE + int small_count; +#endif + volatile uclong tx_put, tx_get, tx_bufsize; + +/* Removed due to compilation problems in Alpha systems */ +// if ((char_count = SPACE_IN_BUF(buf_ctrl))){ - return cyz_issue_cmd(cinfo, channel, cmd, 0L); + tx_get = cy_readl(&buf_ctrl->tx_get); + tx_put = cy_readl(&buf_ctrl->tx_put); + tx_bufsize = cy_readl(&buf_ctrl->tx_bufsize); + if (tx_put >= tx_get) + char_count = tx_get - tx_put - 1 + tx_bufsize; + else + char_count = tx_get - tx_put - 1; -} /* cyz_update_channel */ + if ( char_count ) { + + if( tty == 0 ){ + goto ztxdone; + } + + if(info->x_char) { /* send special char */ + data = info->x_char; + + cy_writeb((cinfo->base_addr + + cy_readl(&buf_ctrl->tx_bufaddr) + tx_put), data); + tx_put = (tx_put + 1) & (tx_bufsize - 1); + info->x_char = 0; + char_count--; + info->icount.tx++; + info->last_active = jiffies; + info->jiffies[2] = jiffies; + } +#ifdef BLOCKMOVE + while(0 < (small_count = + cy_min((tx_bufsize - tx_put), + cy_min ((SERIAL_XMIT_SIZE - info->xmit_tail), + cy_min(info->xmit_cnt, char_count))))){ + + memcpy_toio((char *)(cinfo->base_addr + + cy_readl(&buf_ctrl->tx_bufaddr) + tx_put), + &info->xmit_buf[info->xmit_tail], + small_count); + + tx_put = (tx_put + small_count) & (tx_bufsize - 1); + char_count -= small_count; + info->icount.tx += small_count; + info->xmit_cnt -= small_count; + info->xmit_tail = + (info->xmit_tail + small_count) & (SERIAL_XMIT_SIZE - 1); + info->last_active = jiffies; + info->jiffies[2] = jiffies; + } +#else + while (info->xmit_cnt && char_count){ + data = info->xmit_buf[info->xmit_tail]; + info->xmit_cnt--; + info->xmit_tail = (info->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); + + cy_writeb(cinfo->base_addr + + cy_readl(&buf_ctrl->tx_bufaddr) + tx_put, data); + tx_put = (tx_put + 1) & (tx_bufsize - 1); + char_count--; + info->icount.tx++; + info->last_active = jiffies; + info->jiffies[2] = jiffies; + } #endif + ztxdone: + if (info->xmit_cnt < WAKEUP_CHARS) { + cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP); + } + /* Update tx_put */ + cy_writel(&buf_ctrl->tx_put, tx_put); + } +} -#ifdef CONFIG_CYZ_INTR static void -cyz_interrupt(int irq, void *dev_id, struct pt_regs *regs) +cyz_handle_cmd(struct cyclades_card *cinfo) { struct tty_struct *tty; - struct cyclades_card *cinfo; struct cyclades_port *info; static volatile struct FIRM_ID *firm_id; static volatile struct ZFW_CTRL *zfw_ctrl; @@ -1665,541 +1790,200 @@ cyz_interrupt(int irq, void *dev_id, struct pt_regs *regs) ucchar cmd; uclong param; uclong hw_ver, fw_ver; - char data; - volatile int char_count, special_count; -#ifdef BLOCKMOVE - int small_count; -#endif - volatile uclong tx_put, tx_get, tx_bufsize; - volatile uclong rx_put, rx_get, rx_bufsize; + int special_count; + int delta_count; - if((cinfo = (struct cyclades_card *)dev_id) == 0){ -#ifdef CY_DEBUG_INTERRUPTS - printk("cyz_interrupt: spurious interrupt %d\n\r", irq); -#endif - return; /* spurious interrupt */ - } - - firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); - if (!ISZLOADED(*cinfo)) { -#ifdef CY_DEBUG_INTERRUPTS - printk("cyz_interrupt: board not yet loaded (INT %d).\n\r", irq); -#endif - return; + firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); + zfw_ctrl = (struct ZFW_CTRL *) + (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + board_ctrl = &(zfw_ctrl->board_ctrl); + fw_ver = cy_readl(&board_ctrl->fw_version); + hw_ver = cy_readl(&((struct RUNTIME_9060 *)(cinfo->ctl_addr))->mail_box_0); + + while(cyz_fetch_msg(cinfo, &channel, &cmd, ¶m) == 1) { + special_count = 0; + delta_count = 0; + info = &cy_port[channel + cinfo->first_line]; + if((tty = info->tty) == 0) { + continue; } + ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]); + buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]); - zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); - board_ctrl = &(zfw_ctrl->board_ctrl); - fw_ver = cy_readl(&board_ctrl->fw_version); - hw_ver = cy_readl(&((struct RUNTIME_9060 *) - (cinfo->ctl_addr))->mail_box_0); - - while(cyz_fetch_msg(cinfo, &channel, &cmd, ¶m) == 1) { - special_count = 0; - info = &cy_port[channel + cinfo->first_line]; - if((tty = info->tty) == 0) continue; - ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]); - buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]); - - switch(cmd){ + switch(cmd) { case C_CM_PR_ERROR: tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_PARITY; *tty->flip.char_buf_ptr++ = 0; + info->icount.rx++; special_count++; - break; + break; case C_CM_FR_ERROR: tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_FRAME; *tty->flip.char_buf_ptr++ = 0; + info->icount.rx++; special_count++; - break; + break; case C_CM_RXBRK: tty->flip.count++; *tty->flip.flag_buf_ptr++ = TTY_BREAK; *tty->flip.char_buf_ptr++ = 0; + info->icount.rx++; special_count++; - break; + break; case C_CM_MDCD: + info->icount.dcd++; + delta_count++; if (info->flags & ASYNC_CHECK_CD){ if ((fw_ver > 241 ? - ((u_long)param) : - cy_readl(&ch_ctrl[channel].rs_status)) & C_RS_DCD) { - /* SP("Open Wakeup\n"); */ - cy_sched_event(info, - Cy_EVENT_OPEN_WAKEUP); - }else if(!((info->flags - & ASYNC_CALLOUT_ACTIVE) - &&(info->flags - & ASYNC_CALLOUT_NOHUP))){ - /* SP("Hangup\n"); */ - cy_sched_event(info, - Cy_EVENT_HANGUP); + ((u_long)param) : + cy_readl(&ch_ctrl->rs_status)) & C_RS_DCD) { + cy_sched_event(info, Cy_EVENT_OPEN_WAKEUP); + }else if(!((info->flags & ASYNC_CALLOUT_ACTIVE) + &&(info->flags & ASYNC_CALLOUT_NOHUP))){ + cy_sched_event(info, Cy_EVENT_HANGUP); } } - break; + break; case C_CM_MCTS: - if (info->flags & ASYNC_CTS_FLOW) { - if(info->tty->hw_stopped){ - if( cy_readl(&ch_ctrl[channel].rs_status) & C_RS_DCD){ - /* cy_start isn't used because... - HW flow is handled by the board */ - /* SP("Write Wakeup\n"); */ - cy_sched_event(info, - Cy_EVENT_WRITE_WAKEUP); - } - }else{ - if(!(cy_readl(&ch_ctrl[channel].rs_status) & C_RS_CTS)){ - /* cy_stop isn't used because - HW flow is handled by the board */ - /* SP("Write stop\n"); */ - } - } - } - break; + info->icount.cts++; + delta_count++; + break; case C_CM_MRI: - break; + info->icount.rng++; + delta_count++; + break; case C_CM_MDSR: - break; + info->icount.dsr++; + delta_count++; + break; #ifdef Z_WAKE case C_CM_IOCTLW: cy_sched_event(info, Cy_EVENT_SHUTDOWN_WAKEUP); - break; + break; #endif +#ifdef CONFIG_CYZ_INTR case C_CM_RXHIWM: case C_CM_RXNNDT: + case C_CM_INTBACK2: /* Reception Interrupt */ #ifdef CY_DEBUG_INTERRUPTS - printk("cyz_interrupt: rcvd intr, card %d, port %ld\n\r", - info->card, channel); + printk("cyz_interrupt: rcvd intr, card %d, port %ld\n\r", + info->card, channel); #endif - - rx_get = cy_readl(&buf_ctrl->rx_get); - rx_put = cy_readl(&buf_ctrl->rx_put); - rx_bufsize = cy_readl(&buf_ctrl->rx_bufsize); - if (rx_put >= rx_get) - char_count = rx_put - rx_get; - else - char_count = rx_put - rx_get + rx_bufsize; - - if ( char_count ){ - -#ifdef CY_ENABLE_MONITORING - info->mon.int_count++; - info->mon.char_count += char_count; - if (char_count > info->mon.char_max) - info->mon.char_max = char_count; - info->mon.char_last = char_count; -#endif - info->idle_stats.recv_bytes += char_count; - info->idle_stats.recv_idle = jiffies; - if( tty == 0){ - /* flush received characters */ - rx_get = (rx_get + char_count) & (rx_bufsize - 1); - /* SP("-"); */ - info->rflush_count++; - }else{ -#ifdef BLOCKMOVE - /* we'd like to use memcpy(t, f, n) and memset(s, c, count) - for performance, but because of buffer boundaries, there - may be several steps to the operation */ - while(0 < (small_count - = cy_min((rx_bufsize - rx_get), - cy_min((TTY_FLIPBUF_SIZE - tty->flip.count), - char_count)))){ - - memcpy_fromio(tty->flip.char_buf_ptr, - (char *)(cinfo->base_addr - + cy_readl(&buf_ctrl->rx_bufaddr) - + rx_get), - small_count); - - tty->flip.char_buf_ptr += small_count; - memset(tty->flip.flag_buf_ptr, - TTY_NORMAL, - small_count); - tty->flip.flag_buf_ptr += small_count; - rx_get = (rx_get + small_count) & (rx_bufsize - 1); - char_count -= small_count; - tty->flip.count += small_count; - } -#else - while(char_count--){ - if (tty->flip.count >= TTY_FLIPBUF_SIZE){ - break; - } - data = cy_readb(cinfo->base_addr + - cy_readl(&buf_ctrl->rx_bufaddr) + rx_get); - rx_get = (rx_get + 1) & (rx_bufsize - 1); - tty->flip.count++; - *tty->flip.flag_buf_ptr++ = TTY_NORMAL; - *tty->flip.char_buf_ptr++ = data; - } -#endif - queue_task(&tty->flip.tqueue, &tq_timer); - } - /* Update rx_get */ - cy_writel(&buf_ctrl->rx_get, rx_get); - } + cyz_handle_rx(info, buf_ctrl); break; case C_CM_TXBEMPTY: case C_CM_TXLOWWM: case C_CM_INTBACK: /* Transmission Interrupt */ #ifdef CY_DEBUG_INTERRUPTS - printk("cyz_interrupt: xmit intr, card %d, port %ld\n\r", - info->card, channel); + printk("cyz_interrupt: xmit intr, card %d, port %ld\n\r", + info->card, channel); #endif - - tx_get = cy_readl(&buf_ctrl->tx_get); - tx_put = cy_readl(&buf_ctrl->tx_put); - tx_bufsize = cy_readl(&buf_ctrl->tx_bufsize); - if (tx_put >= tx_get) - char_count = tx_get - tx_put - 1 + tx_bufsize; - else - char_count = tx_get - tx_put - 1; - - if ( char_count ){ - - if( tty == 0 ){ - goto ztxdone; - } - - if(info->x_char) { /* send special char */ - data = info->x_char; - - cy_writeb((cinfo->base_addr + - cy_readl(&buf_ctrl->tx_bufaddr) + tx_put), data); - tx_put = (tx_put + 1) & (tx_bufsize - 1); - info->x_char = 0; - char_count--; - } -#ifdef BLOCKMOVE - while(0 < (small_count - = cy_min((tx_bufsize - tx_put), - cy_min ((SERIAL_XMIT_SIZE - info->xmit_tail), - cy_min(info->xmit_cnt, char_count))))){ - - memcpy_toio((char *)(cinfo->base_addr - + cy_readl(&buf_ctrl->tx_bufaddr) + tx_put), - &info->xmit_buf[info->xmit_tail], - small_count); - - tx_put = (tx_put + small_count) & (tx_bufsize - 1); - char_count -= small_count; - info->xmit_cnt -= small_count; - info->xmit_tail = - (info->xmit_tail + small_count) & (SERIAL_XMIT_SIZE - 1); - } -#else - while (info->xmit_cnt && char_count){ - data = info->xmit_buf[info->xmit_tail]; - info->xmit_cnt--; - info->xmit_tail = - (info->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); - - cy_writeb(cinfo->base_addr + - cy_readl(&buf_ctrl->tx_bufaddr) + tx_put, - data); - tx_put = (tx_put + 1) & (tx_bufsize - 1); - char_count--; - } - -#endif - ztxdone: - if (info->xmit_cnt < WAKEUP_CHARS) { - cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP); - } - /* Update tx_put */ - cy_writel(&buf_ctrl->tx_put, tx_put); - } + cyz_handle_tx(info, buf_ctrl); break; +#endif /* CONFIG_CYZ_INTR */ case C_CM_FATAL: /* should do something with this !!! */ - break; - } - if(special_count){ - queue_task(&tty->flip.tqueue, &tq_timer); - } + break; + default: + break; } + if(delta_count) + cy_sched_event(info, Cy_EVENT_DELTA_WAKEUP); + if(special_count) + queue_task(&tty->flip.tqueue, &tq_timer); + } +} + +#ifdef CONFIG_CYZ_INTR +static void +cyz_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct cyclades_card *cinfo; + + if((cinfo = (struct cyclades_card *)dev_id) == 0){ +#ifdef CY_DEBUG_INTERRUPTS + printk("cyz_interrupt: spurious interrupt %d\n\r", irq); +#endif + return; /* spurious interrupt */ + } + + if (!ISZLOADED(*cinfo)) { +#ifdef CY_DEBUG_INTERRUPTS + printk("cyz_interrupt: board not yet loaded (IRQ%d).\n\r", irq); +#endif + return; + } + + /* Handle the interrupts */ + cyz_handle_cmd(cinfo); return; } /* cyz_interrupt */ +static void +cyz_rx_restart(unsigned long arg) +{ + struct cyclades_port *info = (struct cyclades_port *)arg; + int retval; + int card = info->card; + uclong channel = (info->line) - (cy_card[card].first_line); + + cyz_rx_full_timer[info->card].expires = jiffies + HZ; + retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_INTBACK2, 0L); + if (retval != 0){ + printk("cyc:cyz_rx_restart retval was %x\n", retval); + } +} + #else /* CONFIG_CYZ_INTR */ static void cyz_poll(unsigned long arg) { + struct cyclades_card *cinfo; + struct cyclades_port *info; + struct tty_struct *tty; static volatile struct FIRM_ID *firm_id; static volatile struct ZFW_CTRL *zfw_ctrl; static volatile struct BOARD_CTRL *board_ctrl; static volatile struct CH_CTRL *ch_ctrl; static volatile struct BUF_CTRL *buf_ctrl; - struct cyclades_card *cinfo; - struct cyclades_port *info; - struct tty_struct *tty; int card, port; - int char_count; -#ifdef BLOCKMOVE - int small_count; -#endif - char data; - uclong channel; - ucchar cmd; - uclong param; - uclong hw_ver, fw_ver; - volatile uclong tx_put, tx_get, tx_bufsize; - volatile uclong rx_put, rx_get, rx_bufsize; cyz_timerlist.expires = jiffies + (HZ); for (card = 0 ; card < NR_CARDS ; card++){ cinfo = &cy_card[card]; - if (!IS_CYC_Z(*cinfo)) continue; + if (!IS_CYC_Z(*cinfo)) continue; + if (!ISZLOADED(*cinfo)) continue; - firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); - if (!ISZLOADED(*cinfo)) { + /* Skip first polling cycle to avoid racing conditions with the FW */ + if (!cinfo->intr_enabled) { + cinfo->intr_enabled = 1; continue; } + firm_id = (struct FIRM_ID *)(cinfo->base_addr + ID_ADDRESS); zfw_ctrl = (struct ZFW_CTRL *) - (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); + (cinfo->base_addr + cy_readl(&firm_id->zfwctrl_addr)); board_ctrl = &(zfw_ctrl->board_ctrl); - fw_ver = cy_readl(&board_ctrl->fw_version); - hw_ver = cy_readl(&((struct RUNTIME_9060 *) - (cinfo->ctl_addr))->mail_box_0); - - while(cyz_fetch_msg(cinfo, &channel, &cmd, ¶m) == 1){ - char_count = 0; - info = &cy_port[ channel + cinfo->first_line ]; - if((tty = info->tty) == 0) continue; - ch_ctrl = &(zfw_ctrl->ch_ctrl[channel]); - buf_ctrl = &(zfw_ctrl->buf_ctrl[channel]); - info->jiffies[0] = jiffies; - - switch(cmd){ - case C_CM_PR_ERROR: - tty->flip.count++; - *tty->flip.flag_buf_ptr++ = TTY_PARITY; - *tty->flip.char_buf_ptr++ = 0; - char_count++; - break; - case C_CM_FR_ERROR: - tty->flip.count++; - *tty->flip.flag_buf_ptr++ = TTY_FRAME; - *tty->flip.char_buf_ptr++ = 0; - char_count++; - break; - case C_CM_RXBRK: - tty->flip.count++; - *tty->flip.flag_buf_ptr++ = TTY_BREAK; - *tty->flip.char_buf_ptr++ = 0; - char_count++; - break; - case C_CM_MDCD: - if (info->flags & ASYNC_CHECK_CD){ - if ((fw_ver > 241 ? - ((u_long)param) : - cy_readl(&ch_ctrl[channel].rs_status)) & C_RS_DCD) { - cy_sched_event(info, - Cy_EVENT_OPEN_WAKEUP); - }else if(!((info->flags - & ASYNC_CALLOUT_ACTIVE) - &&(info->flags - & ASYNC_CALLOUT_NOHUP))){ - cy_sched_event(info, - Cy_EVENT_HANGUP); - } - } - break; - case C_CM_MCTS: - if (info->flags & ASYNC_CTS_FLOW) { - if(info->tty->hw_stopped){ - if( cy_readl(&ch_ctrl[channel].rs_status) & C_RS_DCD){ - /* cy_start isn't used because... - HW flow is handled by the board */ - cy_sched_event(info, - Cy_EVENT_WRITE_WAKEUP); - } - }else{ - if(!(cy_readl(&ch_ctrl[channel].rs_status) & C_RS_CTS)){ - /* cy_stop isn't used because - HW flow is handled by the board */ - } - } - } - break; - case C_CM_MRI: - break; - case C_CM_MDSR: - break; -#ifdef Z_WAKE - case C_CM_IOCTLW: - cy_sched_event(info, Cy_EVENT_SHUTDOWN_WAKEUP); - break; -#endif - case C_CM_FATAL: - /* should do something with this !!! */ - break; - } - if(char_count){ - queue_task(&tty->flip.tqueue, &tq_timer); - } - } + + cyz_handle_cmd(cinfo); + for (port = 0; port < cy_readl(&board_ctrl->n_channel); port++){ info = &cy_port[ port + cinfo->first_line ]; tty = info->tty; ch_ctrl = &(zfw_ctrl->ch_ctrl[port]); buf_ctrl = &(zfw_ctrl->buf_ctrl[port]); -/* Removed due to compilation problems in Alpha systems */ -// if ((char_count = CHARS_IN_BUF(buf_ctrl))){ - - rx_get = cy_readl(&buf_ctrl->rx_get); - rx_put = cy_readl(&buf_ctrl->rx_put); - rx_bufsize = cy_readl(&buf_ctrl->rx_bufsize); - if (rx_put >= rx_get) - char_count = rx_put - rx_get; - else - char_count = rx_put - rx_get + rx_bufsize; - - if ( char_count ){ - - info->last_active = jiffies; - info->jiffies[1] = jiffies; - -#ifdef CY_ENABLE_MONITORING - info->mon.int_count++; - info->mon.char_count += char_count; - if (char_count > info->mon.char_max) - info->mon.char_max = char_count; - info->mon.char_last = char_count; -#endif - info->idle_stats.recv_bytes += char_count; - info->idle_stats.recv_idle = jiffies; - if( tty == 0){ - /* flush received characters */ - rx_get = (rx_get + char_count) & (rx_bufsize - 1); - info->rflush_count++; - }else{ -#ifdef BLOCKMOVE - /* we'd like to use memcpy(t, f, n) and memset(s, c, count) - for performance, but because of buffer boundaries, there - may be several steps to the operation */ - while(0 < (small_count - = cy_min((rx_bufsize - rx_get), - cy_min((TTY_FLIPBUF_SIZE - tty->flip.count), - char_count)))){ - - memcpy_fromio(tty->flip.char_buf_ptr, - (char *)(cinfo->base_addr - + cy_readl(&buf_ctrl->rx_bufaddr) - + rx_get), - small_count); - - tty->flip.char_buf_ptr += small_count; - memset(tty->flip.flag_buf_ptr, - TTY_NORMAL, - small_count); - tty->flip.flag_buf_ptr += small_count; - rx_get = (rx_get + small_count) & (rx_bufsize - 1); - char_count -= small_count; - tty->flip.count += small_count; - } -#else - while(char_count--){ - if (tty->flip.count >= TTY_FLIPBUF_SIZE){ - break; - } - data = cy_readb(cinfo->base_addr + - cy_readl(&buf_ctrl->rx_bufaddr) + rx_get); - rx_get = (rx_get + 1) & (rx_bufsize - 1); - tty->flip.count++; - *tty->flip.flag_buf_ptr++ = TTY_NORMAL; - *tty->flip.char_buf_ptr++ = data; - } -#endif - queue_task(&tty->flip.tqueue, &tq_timer); - } - /* Update rx_get */ - cy_writel(&buf_ctrl->rx_get, rx_get); - } - -/* Removed due to compilation problems in Alpha systems */ -// if ((char_count = SPACE_IN_BUF(buf_ctrl))){ - - tx_get = cy_readl(&buf_ctrl->tx_get); - tx_put = cy_readl(&buf_ctrl->tx_put); - tx_bufsize = cy_readl(&buf_ctrl->tx_bufsize); - if (tx_put >= tx_get) - char_count = tx_get - tx_put - 1 + tx_bufsize; - else - char_count = tx_get - tx_put - 1; - - if ( char_count ){ - - if( tty == 0 ){ - goto ztxdone; - } - - if(info->x_char) { /* send special char */ - data = info->x_char; - - cy_writeb((cinfo->base_addr + - cy_readl(&buf_ctrl->tx_bufaddr) + tx_put), data); - tx_put = (tx_put + 1) & (tx_bufsize - 1); - info->x_char = 0; - char_count--; - info->last_active = jiffies; - info->jiffies[2] = jiffies; - } -#ifdef BLOCKMOVE - while(0 < (small_count - = cy_min((tx_bufsize - tx_put), - cy_min ((SERIAL_XMIT_SIZE - info->xmit_tail), - cy_min(info->xmit_cnt, char_count))))){ - - memcpy_toio((char *)(cinfo->base_addr - + cy_readl(&buf_ctrl->tx_bufaddr) + tx_put), - &info->xmit_buf[info->xmit_tail], - small_count); - - tx_put = (tx_put + small_count) & (tx_bufsize - 1); - char_count -= small_count; - info->xmit_cnt -= small_count; - info->xmit_tail = - (info->xmit_tail + small_count) & (SERIAL_XMIT_SIZE - 1); - info->last_active = jiffies; - info->jiffies[2] = jiffies; - } -#else - while (info->xmit_cnt && char_count){ - data = info->xmit_buf[info->xmit_tail]; - info->xmit_cnt--; - info->xmit_tail = - (info->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); - - cy_writeb(cinfo->base_addr + - cy_readl(&buf_ctrl->tx_bufaddr) + tx_put, - data); - tx_put = (tx_put + 1) & (tx_bufsize - 1); - char_count--; - info->last_active = jiffies; - info->jiffies[2] = jiffies; - } - -#endif - ztxdone: - if (info->xmit_cnt < WAKEUP_CHARS) { - cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP); - } - /* Update tx_put */ - cy_writel(&buf_ctrl->tx_put, tx_put); - } + cyz_handle_rx(info, buf_ctrl); + cyz_handle_tx(info, buf_ctrl); } - /* poll every 40 ms */ + /* poll every 'cyz_polling_cycle' period */ cyz_timerlist.expires = jiffies + cyz_polling_cycle; } add_timer(&cyz_timerlist); @@ -2225,11 +2009,14 @@ startup(struct cyclades_port * info) int card,chip,channel,index; unsigned long page; + card = info->card; + channel = (info->line) - (cy_card[card].first_line); + page = get_free_page(GFP_KERNEL); if (!page) return -ENOMEM; - save_flags(flags); cli(); + CY_LOCK(info, flags); if (info->flags & ASYNC_INITIALIZED){ free_page(page); @@ -2249,10 +2036,10 @@ startup(struct cyclades_port * info) else info->xmit_buf = (unsigned char *) page; + CY_UNLOCK(info, flags); + set_line_char(info); - card = info->card; - channel = (info->line) - (cy_card[card].first_line); if (!IS_CYC_Z(cy_card[card])) { chip = channel>>2; channel &= 0x03; @@ -2265,6 +2052,8 @@ startup(struct cyclades_port * info) card, chip, channel, (long)base_addr);/**/ #endif + CY_LOCK(info, flags); + cy_writeb((ulong)base_addr+(CyCAR<default_timeout @@ -2297,7 +2086,7 @@ startup(struct cyclades_port * info) info->idle_stats.recv_idle = info->idle_stats.xmit_idle = jiffies; - restore_flags(flags); + CY_UNLOCK(info, flags); } else { struct FIRM_ID *firm_id; @@ -2306,8 +2095,6 @@ startup(struct cyclades_port * info) struct CH_CTRL *ch_ctrl; int retval; - restore_flags(flags); - base_addr = (unsigned char*) (cy_card[card].base_addr); firm_id = (struct FIRM_ID *) (base_addr + ID_ADDRESS); @@ -2326,35 +2113,42 @@ startup(struct cyclades_port * info) card, channel, (long)base_addr);/**/ #endif + CY_LOCK(info, flags); + cy_writel(&ch_ctrl[channel].op_mode, C_CH_ENABLE); #ifdef Z_WAKE #ifdef CONFIG_CYZ_INTR cy_writel(&ch_ctrl[channel].intr_enable, C_IN_TXBEMPTY|C_IN_TXLOWWM|C_IN_RXHIWM|C_IN_RXNNDT| C_IN_IOCTLW| - C_IN_MDCD|C_IN_MCTS); + C_IN_MDCD); #else cy_writel(&ch_ctrl[channel].intr_enable, C_IN_IOCTLW| - C_IN_MDCD|C_IN_MCTS); + C_IN_MDCD); #endif /* CONFIG_CYZ_INTR */ #else #ifdef CONFIG_CYZ_INTR cy_writel(&ch_ctrl[channel].intr_enable, C_IN_TXBEMPTY|C_IN_TXLOWWM|C_IN_RXHIWM|C_IN_RXNNDT| - C_IN_MDCD|C_IN_MCTS); + C_IN_MDCD); #else cy_writel(&ch_ctrl[channel].intr_enable, - C_IN_MDCD|C_IN_MCTS); + C_IN_MDCD); #endif /* CONFIG_CYZ_INTR */ #endif /* Z_WAKE */ - retval = cyz_issue_cmd( &cy_card[card], - channel, C_CM_IOCTL, 0L); /* was C_CM_RESET */ + retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_IOCTL, 0L); if (retval != 0){ printk("cyc:startup(1) retval was %x\n", retval); } + /* Flush RX buffers before raising DTR and RTS */ + retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_FLUSH_RX, 0L); + if (retval != 0){ + printk("cyc:startup(2) retval was %x\n", retval); + } + /* set timeout !!! */ /* set RTS and DTR !!! */ cy_writel(&ch_ctrl[channel].rs_control, @@ -2362,7 +2156,7 @@ startup(struct cyclades_port * info) retval = cyz_issue_cmd(&cy_card[info->card], channel, C_CM_IOCTLM, 0L); if (retval != 0){ - printk("cyc:startup(2) retval was %x\n", retval); + printk("cyc:startup(3) retval was %x\n", retval); } #ifdef CY_DEBUG_DTR printk("cyc:startup raising Z DTR\n"); @@ -2380,6 +2174,8 @@ startup(struct cyclades_port * info) info->idle_stats.in_use = info->idle_stats.recv_idle = info->idle_stats.xmit_idle = jiffies; + + CY_UNLOCK(info, flags); } #ifdef CY_DEBUG_OPEN @@ -2388,7 +2184,7 @@ startup(struct cyclades_port * info) return 0; errout: - restore_flags(flags); + CY_UNLOCK(info, flags); return retval; } /* startup */ @@ -2410,21 +2206,21 @@ start_xmit( struct cyclades_port *info ) (cy_card[card].base_addr + (cy_chip_offset[chip]<delta_msr_wait); if (info->xmit_buf){ unsigned char * temp; @@ -2488,7 +2287,7 @@ shutdown(struct cyclades_port * info) set_bit(TTY_IO_ERROR, &info->tty->flags); } info->flags &= ~ASYNC_INITIALIZED; - restore_flags(flags); + CY_UNLOCK(info, flags); } else { struct FIRM_ID *firm_id; struct ZFW_CTRL *zfw_ctrl; @@ -2513,7 +2312,7 @@ shutdown(struct cyclades_port * info) board_ctrl = &(zfw_ctrl->board_ctrl); ch_ctrl = zfw_ctrl->ch_ctrl; - save_flags(flags); cli(); + CY_LOCK(info, flags); if (info->xmit_buf){ unsigned char * temp; @@ -2529,7 +2328,7 @@ shutdown(struct cyclades_port * info) retval = cyz_issue_cmd(&cy_card[info->card], channel, C_CM_IOCTLM, 0L); if (retval != 0){ - printk("cyc:shutdown retval (2) was %x\n", retval); + printk("cyc:shutdown retval was %x\n", retval); } #ifdef CY_DEBUG_DTR printk("cyc:shutdown dropping Z DTR\n"); @@ -2541,7 +2340,7 @@ shutdown(struct cyclades_port * info) } info->flags &= ~ASYNC_INITIALIZED; - restore_flags(flags); + CY_UNLOCK(info, flags); } #ifdef CY_DEBUG_OPEN @@ -2568,6 +2367,9 @@ block_til_ready(struct tty_struct *tty, struct file * filp, int retval; char *base_addr; + cinfo = &cy_card[info->card]; + channel = info->line - cinfo->first_line; + /* * If the device is in the middle of being closed, then block * until it's done, and then try again. @@ -2627,18 +2429,16 @@ block_til_ready(struct tty_struct *tty, struct file * filp, printk("cyc block_til_ready before block: ttyC%d, count = %d\n", info->line, info->count);/**/ #endif - save_flags(flags); cli(); + CY_LOCK(info, flags); if (!tty_hung_up_p(filp)) info->count--; - restore_flags(flags); + CY_UNLOCK(info, flags); #ifdef CY_DEBUG_COUNT printk("cyc block_til_ready: (%d): decrementing count to %d\n", current->pid, info->count); #endif info->blocked_open++; - cinfo = &cy_card[info->card]; - channel = info->line - cinfo->first_line; if (!IS_CYC_Z(*cinfo)) { chip = channel>>2; channel &= 0x03; @@ -2647,7 +2447,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp, + (cy_chip_offset[chip]<flags & ASYNC_CALLOUT_ACTIVE) && (tty->termios->c_cflag & CBAUD)){ cy_writeb((u_long)base_addr+(CyCAR<state = TASK_INTERRUPTIBLE; if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED) ){ - return ((info->flags & ASYNC_HUP_NOTIFY) ? + retval = ((info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS); break; } - save_flags(flags); cli(); + + CY_LOCK(info, flags); cy_writeb((u_long)base_addr+(CyCAR<flags & ASYNC_CALLOUT_ACTIVE) && !(info->flags & ASYNC_CLOSING) && (C_CLOCAL(tty) || (cy_readb(base_addr+(CyMSVR1<state = TASK_INTERRUPTIBLE; if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED) ){ - return ((info->flags & ASYNC_HUP_NOTIFY) ? + retval = ((info->flags & ASYNC_HUP_NOTIFY) ? -EAGAIN : -ERESTARTSYS); break; } @@ -2813,6 +2616,10 @@ cy_open(struct tty_struct *tty, struct file * filp) interrupts should be enabled as soon as the first open happens to one of its ports. */ if (!cy_card[info->card].intr_enabled) { + /* Enable interrupts on the PLX chip */ + cy_writew(cy_card[info->card].ctl_addr+0x68, + cy_readw(cy_card[info->card].ctl_addr+0x68)|0x0900); + /* Enable interrupts on the FW */ retval = cyz_issue_cmd(&cy_card[info->card], 0, C_CM_IRQ_ENBL, 0L); if (retval != 0){ @@ -2897,7 +2704,8 @@ cy_open(struct tty_struct *tty, struct file * filp) /* * cy_wait_until_sent() --- wait until the transmitter is empty */ -static void cy_wait_until_sent(struct tty_struct *tty, int timeout) +static void +cy_wait_until_sent(struct tty_struct *tty, int timeout) { struct cyclades_port * info = (struct cyclades_port *)tty->driver_data; unsigned char *base_addr; @@ -2981,9 +2789,9 @@ static void cy_wait_until_sent(struct tty_struct *tty, int timeout) * This routine is called when a particular tty device is closed. */ static void -cy_close(struct tty_struct * tty, struct file * filp) +cy_close(struct tty_struct *tty, struct file *filp) { - struct cyclades_port * info = (struct cyclades_port *)tty->driver_data; + struct cyclades_port *info = (struct cyclades_port *)tty->driver_data; unsigned long flags; #ifdef CY_DEBUG_OTHER @@ -2994,12 +2802,11 @@ cy_close(struct tty_struct * tty, struct file * filp) return; } - save_flags(flags); cli(); - + CY_LOCK(info, flags); /* If the TTY is being hung up, nothing to do */ if (tty_hung_up_p(filp)) { MOD_DEC_USE_COUNT; - restore_flags(flags); + CY_UNLOCK(info, flags); return; } @@ -3030,7 +2837,7 @@ cy_close(struct tty_struct * tty, struct file * filp) } if (info->count) { MOD_DEC_USE_COUNT; - restore_flags(flags); + CY_UNLOCK(info, flags); return; } info->flags |= ASYNC_CLOSING; @@ -3048,9 +2855,11 @@ cy_close(struct tty_struct * tty, struct file * filp) * the line discipline to only process XON/XOFF characters. */ tty->closing = 1; + CY_UNLOCK(info, flags); if (info->closing_wait != CY_CLOSING_WAIT_NONE) { tty_wait_until_sent(tty, info->closing_wait); } + CY_LOCK(info, flags); if (!IS_CYC_Z(cy_card[info->card])) { int channel = info->line - cy_card[info->card].first_line; @@ -3066,7 +2875,9 @@ cy_close(struct tty_struct * tty, struct file * filp) if (info->flags & ASYNC_INITIALIZED) { /* Waiting for on-board buffers to be empty before closing the port */ + CY_UNLOCK(info, flags); cy_wait_until_sent(tty, info->timeout); + CY_LOCK(info, flags); } } else { #ifdef Z_WAKE @@ -3084,27 +2895,34 @@ cy_close(struct tty_struct * tty, struct file * filp) retval = cyz_issue_cmd(&cy_card[info->card], channel, C_CM_IOCTLW, 0L); if (retval != 0){ - printk("cyc:shutdown retval (1) was %x\n", retval); + printk("cyc:cy_close retval was %x\n", retval); } + CY_UNLOCK(info, flags); interruptible_sleep_on(&info->shutdown_wait); + CY_LOCK(info, flags); } #endif } + CY_UNLOCK(info, flags); shutdown(info); if (tty->driver.flush_buffer) tty->driver.flush_buffer(tty); if (tty->ldisc.flush_buffer) tty->ldisc.flush_buffer(tty); + CY_LOCK(info, flags); + tty->closing = 0; info->event = 0; info->tty = 0; if (info->blocked_open) { + CY_UNLOCK(info, flags); if (info->close_delay) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(info->close_delay); } wake_up_interruptible(&info->open_wait); + CY_LOCK(info, flags); } info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE| ASYNC_CLOSING); @@ -3115,7 +2933,7 @@ cy_close(struct tty_struct * tty, struct file * filp) #endif MOD_DEC_USE_COUNT; - restore_flags(flags); + CY_UNLOCK(info, flags); return; } /* cy_close */ @@ -3153,8 +2971,7 @@ cy_write(struct tty_struct * tty, int from_user, return 0; } - save_flags(flags); - + CY_LOCK(info, flags); if (from_user) { down(&tmp_buf_sem); while (1) { @@ -3170,13 +2987,11 @@ cy_write(struct tty_struct * tty, int from_user, } break; } - cli(); c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, SERIAL_XMIT_SIZE - info->xmit_head)); memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c); info->xmit_head = ((info->xmit_head + c) & (SERIAL_XMIT_SIZE-1)); info->xmit_cnt += c; - restore_flags(flags); buf += c; count -= c; ret += c; @@ -3184,22 +2999,20 @@ cy_write(struct tty_struct * tty, int from_user, up(&tmp_buf_sem); } else { while (1) { - cli(); c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, SERIAL_XMIT_SIZE - info->xmit_head)); if (c <= 0) { - restore_flags(flags); break; } memcpy(info->xmit_buf + info->xmit_head, buf, c); info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1); info->xmit_cnt += c; - restore_flags(flags); buf += c; count -= c; ret += c; } } + CY_UNLOCK(info, flags); info->idle_stats.xmit_bytes += ret; info->idle_stats.xmit_idle = jiffies; @@ -3234,9 +3047,9 @@ cy_put_char(struct tty_struct *tty, unsigned char ch) if (!tty || !info->xmit_buf) return; - save_flags(flags); cli(); + CY_LOCK(info, flags); if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1) { - restore_flags(flags); + CY_UNLOCK(info, flags); return; } @@ -3245,7 +3058,7 @@ cy_put_char(struct tty_struct *tty, unsigned char ch) info->xmit_cnt++; info->idle_stats.xmit_bytes++; info->idle_stats.xmit_idle = jiffies; - restore_flags(flags); + CY_UNLOCK(info, flags); } /* cy_put_char */ @@ -3257,9 +3070,6 @@ static void cy_flush_chars(struct tty_struct *tty) { struct cyclades_port *info = (struct cyclades_port *)tty->driver_data; - unsigned long flags; - unsigned char *base_addr; - int card,chip,channel,index; #ifdef CY_DEBUG_IO printk("cyc:cy_flush_chars ttyC%d\n", info->line); /* */ @@ -3272,25 +3082,7 @@ cy_flush_chars(struct tty_struct *tty) || tty->hw_stopped || !info->xmit_buf) return; - card = info->card; - channel = info->line - cy_card[card].first_line; - if (!IS_CYC_Z(cy_card[card])) { - chip = channel>>2; - channel &= 0x03; - index = cy_card[card].bus_index; - base_addr = (unsigned char*) - (cy_card[card].base_addr - + (cy_chip_offset[chip]<tty->termios->c_cflag; iflag = info->tty->termios->c_iflag; + /* + * Set up the tty->alt_speed kludge + */ + if (info->tty) { + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) + info->tty->alt_speed = 57600; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) + info->tty->alt_speed = 115200; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) + info->tty->alt_speed = 230400; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) + info->tty->alt_speed = 460800; + } + card = info->card; channel = (info->line) - (cy_card[card].first_line); chip_number = channel / 4; @@ -3408,7 +3214,11 @@ set_line_char(struct cyclades_port * info) index = cy_card[card].bus_index; /* baud rate */ - baud = tty_get_baud_rate(info->tty); + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) { + baud = info->baud; + } else { + baud = tty_get_baud_rate(info->tty); + } if (baud > CD1400_MAX_SPEED) { baud = CD1400_MAX_SPEED; } @@ -3511,7 +3321,7 @@ set_line_char(struct cyclades_port * info) (cy_card[card].base_addr + (cy_chip_offset[chip]<tty){ clear_bit(TTY_IO_ERROR, &info->tty->flags); } + CY_UNLOCK(info, flags); - restore_flags(flags); } else { struct FIRM_ID *firm_id; struct ZFW_CTRL *zfw_ctrl; struct BOARD_CTRL *board_ctrl; struct CH_CTRL *ch_ctrl; struct BUF_CTRL *buf_ctrl; + uclong sw_flow; int retval; firm_id = (struct FIRM_ID *) @@ -3624,9 +3435,13 @@ set_line_char(struct cyclades_port * info) buf_ctrl = &zfw_ctrl->buf_ctrl[channel]; /* baud rate */ - baud = tty_get_baud_rate(info->tty); - if (baud > CD1400_MAX_SPEED) { - baud = CD1400_MAX_SPEED; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) { + baud = info->baud; + } else { + baud = tty_get_baud_rate(info->tty); + } + if (baud > CYZ_MAX_SPEED) { + baud = CYZ_MAX_SPEED; } cy_writel(&ch_ctrl->comm_baud , baud); @@ -3666,14 +3481,24 @@ set_line_char(struct cyclades_port * info) /* CTS flow control flag */ if (cflag & CRTSCTS){ - info->flags |= ASYNC_CTS_FLOW; cy_writel(&ch_ctrl->hw_flow, cy_readl(&ch_ctrl->hw_flow) | C_RS_CTS | C_RS_RTS); }else{ - info->flags &= ~ASYNC_CTS_FLOW; cy_writel(&ch_ctrl->hw_flow, cy_readl(&ch_ctrl->hw_flow) & ~(C_RS_CTS | C_RS_RTS)); } + /* As the HW flow control is done in firmware, the driver doesn't + need to care about it */ + info->flags &= ~ASYNC_CTS_FLOW; + + /* XON/XOFF/XANY flow control flags */ + sw_flow = 0; + if (iflag & IXON){ + sw_flow |= C_FL_OXX; + if (iflag & IXANY) + sw_flow |= C_FL_OIXANY; + } + cy_writel(&ch_ctrl->sw_flow, sw_flow); retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_IOCTL, 0L); if (retval != 0){ @@ -3688,14 +3513,6 @@ set_line_char(struct cyclades_port * info) info->flags |= ASYNC_CHECK_CD; } - if (iflag & IXON){ - cy_writel(&ch_ctrl->sw_flow, - cy_readl(&ch_ctrl->sw_flow) | C_FL_OXX); - } else { - cy_writel(&ch_ctrl->sw_flow, - cy_readl(&ch_ctrl->sw_flow) & ~C_FL_OXX); - } - if(baud == 0){ /* baud rate is zero, turn off line */ cy_writel(&ch_ctrl->rs_control, cy_readl(&ch_ctrl->rs_control) & ~C_RS_DTR); @@ -3721,20 +3538,6 @@ set_line_char(struct cyclades_port * info) } } - /* - * Set up the tty->alt_speed kludge - */ - if (info->tty) { - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) - info->tty->alt_speed = 57600; - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) - info->tty->alt_speed = 115200; - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) - info->tty->alt_speed = 230400; - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) - info->tty->alt_speed = 460800; - } - } /* set_line_char */ @@ -3831,12 +3634,11 @@ get_modem_info(struct cyclades_port * info, unsigned int *value) (cy_card[card].base_addr + (cy_chip_offset[chip]<rtsdtr_inv) { result = ((status & CyRTS) ? TIOCM_DTR : 0) @@ -3907,17 +3709,17 @@ set_modem_info(struct cyclades_port * info, unsigned int cmd, switch (cmd) { case TIOCMBIS: if (arg & TIOCM_RTS){ - save_flags(flags); cli(); + CY_LOCK(info, flags); cy_writeb((u_long)base_addr+(CyCAR<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR2<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR1<rtsdtr_inv) { @@ -3943,10 +3745,10 @@ set_modem_info(struct cyclades_port * info, unsigned int cmd, } else { cy_writeb((u_long)base_addr+(CyMSVR1<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR1<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR2<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR2<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR1<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR1<card], channel, C_CM_IOCTLM,0L); if (retval != 0){ printk("cyc:set_modem_info retval at %d was %x\n", __LINE__, retval); } + CY_UNLOCK(info, flags); } return 0; } /* set_modem_info */ @@ -4106,7 +3926,7 @@ cy_break(struct tty_struct *tty, int break_state) if (serial_paranoia_check(info, tty->device, "cy_break")) return; - save_flags(flags); cli(); + CY_LOCK(info, flags); if (!IS_CYC_Z(cy_card[info->card])) { /* Let the transmit ISR take care of this (since it requires stuffing characters into the output stream). @@ -4115,14 +3935,18 @@ cy_break(struct tty_struct *tty, int break_state) if (!info->breakon) { info->breakon = 1; if (!info->xmit_cnt) { + CY_UNLOCK(info, flags); start_xmit(info); + CY_LOCK(info, flags); } } } else { if (!info->breakoff) { info->breakoff = 1; if (!info->xmit_cnt) { + CY_UNLOCK(info, flags); start_xmit(info); + CY_LOCK(info, flags); } } } @@ -4147,8 +3971,7 @@ cy_break(struct tty_struct *tty, int break_state) } } } - restore_flags(flags); - + CY_UNLOCK(info, flags); } /* cy_break */ static int @@ -4170,6 +3993,7 @@ set_threshold(struct cyclades_port * info, unsigned long value) { unsigned char *base_addr; int card,channel,chip,index; + unsigned long flags; card = info->card; channel = info->line - cy_card[card].first_line; @@ -4183,8 +4007,11 @@ set_threshold(struct cyclades_port * info, unsigned long value) info->cor3 &= ~CyREC_FIFO; info->cor3 |= value & CyREC_FIFO; - cy_writeb((u_long)base_addr+(CyCOR3<cor3); - cyy_issue_cmd(base_addr,CyCOR_CHANGE|CyCOR3ch,index); + + CY_LOCK(info, flags); + cy_writeb((u_long)base_addr+(CyCOR3<cor3); + cyy_issue_cmd(base_addr,CyCOR_CHANGE|CyCOR3ch,index); + CY_UNLOCK(info, flags); } else { // Nothing to do! } @@ -4238,6 +4065,7 @@ set_timeout(struct cyclades_port * info, unsigned long value) { unsigned char *base_addr; int card,channel,chip,index; + unsigned long flags; card = info->card; channel = info->line - cy_card[card].first_line; @@ -4249,7 +4077,9 @@ set_timeout(struct cyclades_port * info, unsigned long value) (cy_card[card].base_addr + (cy_chip_offset[chip]<driver_data; + struct cyclades_icount cprev, cnow; /* kernel counter temps */ + struct serial_icounter_struct *p_cuser; /* user space */ int ret_val = 0; + unsigned long flags; if (serial_paranoia_check(info, tty->device, "cy_ioctl")) return -ENODEV; @@ -4363,6 +4196,7 @@ cy_ioctl(struct tty_struct *tty, struct file * file, if (copy_to_user((void *)arg, (void *)&cy_card[info->card], sizeof (struct cyclades_card))) { ret_val = -EFAULT; + break; } ret_val = 0; break; @@ -4399,6 +4233,77 @@ cy_ioctl(struct tty_struct *tty, struct file * file, case TIOCSSERIAL: ret_val = set_serial_info(info, (struct serial_struct *) arg); break; + /* + * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change + * - mask passed in arg for lines of interest + * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) + * Caller should use TIOCGICOUNT to see which one it was + */ + case TIOCMIWAIT: + CY_LOCK(info, flags); + /* note the counters on entry */ + cprev = info->icount; + CY_UNLOCK(info, flags); + while (1) { + interruptible_sleep_on(&info->delta_msr_wait); + /* see if a signal did it */ + if (signal_pending(current)) { + return -ERESTARTSYS; + } + + CY_LOCK(info, flags); + cnow = info->icount; /* atomic copy */ + CY_UNLOCK(info, flags); + + if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && + cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) { + return -EIO; /* no change => error */ + } + if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || + ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || + ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || + ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) { + return 0; + } + cprev = cnow; + } + /* NOTREACHED */ + + /* + * Get counter of input serial line interrupts (DCD,RI,DSR,CTS) + * Return: write counters to the user passed counter struct + * NB: both 1->0 and 0->1 transitions are counted except for + * RI where only 0->1 is counted. + */ + case TIOCGICOUNT: + CY_LOCK(info, flags); + cnow = info->icount; + CY_UNLOCK(info, flags); + p_cuser = (struct serial_icounter_struct *) arg; + ret_val = put_user(cnow.cts, &p_cuser->cts); + if (ret_val) return ret_val; + ret_val = put_user(cnow.dsr, &p_cuser->dsr); + if (ret_val) return ret_val; + ret_val = put_user(cnow.rng, &p_cuser->rng); + if (ret_val) return ret_val; + ret_val = put_user(cnow.dcd, &p_cuser->dcd); + if (ret_val) return ret_val; + ret_val = put_user(cnow.rx, &p_cuser->rx); + if (ret_val) return ret_val; + ret_val = put_user(cnow.tx, &p_cuser->tx); + if (ret_val) return ret_val; + ret_val = put_user(cnow.frame, &p_cuser->frame); + if (ret_val) return ret_val; + ret_val = put_user(cnow.overrun, &p_cuser->overrun); + if (ret_val) return ret_val; + ret_val = put_user(cnow.parity, &p_cuser->parity); + if (ret_val) return ret_val; + ret_val = put_user(cnow.brk, &p_cuser->brk); + if (ret_val) return ret_val; + ret_val = put_user(cnow.buf_overrun, &p_cuser->buf_overrun); + if (ret_val) return ret_val; + ret_val = 0; + break; default: ret_val = -ENOIOCTLCMD; } @@ -4426,7 +4331,9 @@ cy_set_termios(struct tty_struct *tty, struct termios * old_termios) printk("cyc:cy_set_termios ttyC%d\n", info->line); #endif - if (tty->termios->c_cflag == old_termios->c_cflag) + if ((tty->termios->c_cflag == old_termios->c_cflag) && + ((tty->termios->c_iflag & (IXON|IXANY)) == + (old_termios->c_iflag & (IXON|IXANY)))) return; set_line_char(info); @@ -4489,14 +4396,14 @@ cy_throttle(struct tty_struct * tty) (cy_card[card].base_addr + (cy_chip_offset[chip]<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR2<rtsdtr_inv) { cy_writeb((u_long)base_addr+(CyMSVR2<card].base_addr + (cy_chip_offset[chip]<card].base_addr + (cy_chip_offset[chip]<device, "cy_flush_buffer")) return; - save_flags(flags); cli(); - info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; - restore_flags(flags); card = info->card; channel = (info->line) - (cy_card[card].first_line); + CY_LOCK(info, flags); + info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; + CY_UNLOCK(info, flags); + if (IS_CYC_Z(cy_card[card])) { /* If it is a Z card, flush the on-board buffers as well */ + CY_LOCK(info, flags); retval = cyz_issue_cmd(&cy_card[card], channel, C_CM_FLUSH_TX, 0L); if (retval != 0) { printk("cyc: flush_buffer retval was %x\n", retval); } + CY_UNLOCK(info, flags); } wake_up_interruptible(&tty->write_wait); if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) @@ -4811,9 +4721,24 @@ cy_detect_isa(void)) unsigned short cy_isa_irq,nboard; volatile ucchar *cy_isa_address; unsigned short i,j,cy_isa_nchan; +#ifdef MODULE + int isparam = 0; +#endif nboard = 0; +#ifdef MODULE + /* Check for module parameters */ + for(i = 0 ; i < NR_CARDS; i++) { + if (maddr[i] || i) { + isparam = 1; + cy_isa_addresses[i] = (ucchar *)maddr[i]; + } + if (!maddr[i]) + break; + } +#endif + /* scan the address table probing for Cyclom-Y/ISA boards */ for (i = 0 ; i < NR_ISA_ADDRS ; i++) { cy_isa_address = cy_isa_addresses[i]; @@ -4832,8 +4757,13 @@ cy_detect_isa(void)) continue; } +#ifdef MODULE + if (isparam && irq[i]) + cy_isa_irq = irq[i]; + else +#endif /* find out the board's irq by probing */ - cy_isa_irq = do_auto_irq(cy_isa_address); + cy_isa_irq = detect_isa_irq(cy_isa_address); if (cy_isa_irq == 0) { printk("Cyclom-Y/ISA found at 0x%lx ", (unsigned long) cy_isa_address); @@ -4894,7 +4824,8 @@ cy_detect_isa(void)) } /* cy_detect_isa */ #endif /* CONFIG_COBALT_27 */ -static void plx_init(uclong addr, uclong initctl) +static void +plx_init(uclong addr, uclong initctl) { /* Reset PLX */ cy_writel(addr + initctl, cy_readl(addr + initctl) | 0x40000000); @@ -4926,6 +4857,7 @@ cy_detect_pci(void)) unsigned short device_id,dev_index = 0; uclong mailbox; uclong Ze_addr0[NR_CARDS], Ze_addr2[NR_CARDS], ZeIndex = 0; + unsigned char Ze_irq[NR_CARDS]; if(pci_present() == 0) { /* PCI bus not present */ return(0); @@ -5057,6 +4989,11 @@ cy_detect_pci(void)) default: /* Old boards, use PLX_9060 */ plx_init(cy_pci_addr0, 0x6c); + /* For some yet unknown reason, once the PLX9060 reloads + the EEPROM, the IRQ is lost and, thus, we have to + re-write it to the PCI config. registers. + This will remain here until we find a permanent fix. */ + pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, cy_pci_irq); cy_writew(cy_pci_addr0+0x68, cy_readw(cy_pci_addr0+0x68)|0x0900); @@ -5097,7 +5034,16 @@ cy_detect_pci(void)) cy_pci_addr0 = (ulong)ioremap(cy_pci_addr0, CyPCI_Zctl); #endif + /* Disable interrupts on the PLX before resetting it */ + cy_writew(cy_pci_addr0+0x68, + cy_readw(cy_pci_addr0+0x68) & ~0x0900); + plx_init(cy_pci_addr0, 0x6c); + /* For some yet unknown reason, once the PLX9060 reloads + the EEPROM, the IRQ is lost and, thus, we have to + re-write it to the PCI config. registers. + This will remain here until we find a permanent fix. */ + pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, cy_pci_irq); mailbox = (uclong)cy_readl(&((struct RUNTIME_9060 *) cy_pci_addr0)->mail_box_0); @@ -5120,6 +5066,7 @@ cy_detect_pci(void)) } else { Ze_addr0[ZeIndex] = cy_pci_addr0; Ze_addr2[ZeIndex] = cy_pci_addr2; + Ze_irq[ZeIndex] = cy_pci_irq; ZeIndex++; } i--; @@ -5206,24 +5153,21 @@ cy_detect_pci(void)) cy_card[j].num_chips = -1; /* print message */ +#ifdef CONFIG_CYZ_INTR /* don't report IRQ if board is no IRQ */ - if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) { + if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", j+1,(ulong)cy_pci_addr2, (ulong)(cy_pci_addr2 + CyPCI_Zwin - 1), (int)cy_pci_irq); - }else{ + else +#endif /* CONFIG_CYZ_INTR */ printk("Cyclades-8Zo/PCI #%d: 0x%lx-0x%lx, ", j+1,(ulong)cy_pci_addr2, (ulong)(cy_pci_addr2 + CyPCI_Zwin - 1)); - } + printk("%d channels starting from port %d.\n", cy_pci_nchan,cy_next_channel); -#ifdef CONFIG_CYZ_INTR - /* Enable interrupts on the PLX chip */ - cy_writew(cy_pci_addr0+0x68, - cy_readw(cy_pci_addr0+0x68)|0x0900); -#endif /* CONFIG_CYZ_INTR */ cy_next_channel += cy_pci_nchan; } } @@ -5231,9 +5175,11 @@ cy_detect_pci(void)) for (; ZeIndex != 0 && i < NR_CARDS; i++) { cy_pci_addr0 = Ze_addr0[0]; cy_pci_addr2 = Ze_addr2[0]; + cy_pci_irq = Ze_irq[0]; for (j = 0 ; j < ZeIndex-1 ; j++) { Ze_addr0[j] = Ze_addr0[j+1]; Ze_addr2[j] = Ze_addr2[j+1]; + Ze_irq[j] = Ze_irq[j+1]; } ZeIndex--; mailbox = (uclong)cy_readl(&((struct RUNTIME_9060 *) @@ -5291,24 +5237,21 @@ cy_detect_pci(void)) cy_card[j].num_chips = -1; /* print message */ +#ifdef CONFIG_CYZ_INTR /* don't report IRQ if board is no IRQ */ - if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) { + if( (cy_pci_irq != 0) && (cy_pci_irq != 255) ) printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, IRQ%d, ", j+1,(ulong)cy_pci_addr2, (ulong)(cy_pci_addr2 + CyPCI_Ze_win - 1), (int)cy_pci_irq); - }else{ + else +#endif /* CONFIG_CYZ_INTR */ printk("Cyclades-Ze/PCI #%d: 0x%lx-0x%lx, ", j+1,(ulong)cy_pci_addr2, (ulong)(cy_pci_addr2 + CyPCI_Ze_win - 1)); - } + printk("%d channels starting from port %d.\n", cy_pci_nchan,cy_next_channel); -#ifdef CONFIG_CYZ_INTR - /* Enable interrupts on the PLX chip */ - cy_writew(cy_pci_addr0+0x68, - cy_readw(cy_pci_addr0+0x68)|0x0900); -#endif /* CONFIG_CYZ_INTR */ cy_next_channel += cy_pci_nchan; } if (ZeIndex != 0) { @@ -5427,9 +5370,6 @@ cy_init(void)) unsigned long mailbox; unsigned short chip_number; int nports; -#ifdef CY_PROC - struct proc_dir_entry *ent; -#endif init_bh(CYCLADES_BH, do_cyclades_bh); @@ -5533,12 +5473,13 @@ cy_init(void)) /* initialize per-port data structures for each valid board found */ for (board = 0 ; board < cy_nboard ; board++) { cinfo = &cy_card[board]; - if (cinfo->num_chips == -1){ /* Cyclades-Z */ + if (cinfo->num_chips == -1) { /* Cyclades-Z */ number_z_boards++; mailbox = cy_readl(&((struct RUNTIME_9060 *) cy_card[board].ctl_addr)->mail_box_0); nports = (mailbox == ZE_V1) ? ZE_V1_NPORTS : 8; cinfo->intr_enabled = 0; + spin_lock_init(&cinfo->card_lock); for (port = cinfo->first_line ; port < cinfo->first_line + nports; port++) @@ -5566,6 +5507,11 @@ cy_init(void)) info->rco = 0; info->close_delay = 5*HZ/10; info->closing_wait = CLOSING_WAIT_DELAY; + info->icount.cts = info->icount.dsr = + info->icount.rng = info->icount.dcd = 0; + info->icount.rx = info->icount.tx = 0; + info->icount.frame = info->icount.parity = 0; + info->icount.overrun = info->icount.brk = 0; info->x_char = 0; info->event = 0; info->count = 0; @@ -5584,6 +5530,7 @@ cy_init(void)) info->open_wait = 0; info->close_wait = 0; info->shutdown_wait = 0; + info->delta_msr_wait = 0; /* info->session */ /* info->pgrp */ info->read_status_mask = 0; @@ -5597,6 +5544,7 @@ cy_init(void)) continue; }else{ /* Cyclom-Y of some kind*/ index = cinfo->bus_index; + spin_lock_init(&cinfo->card_lock); for (port = cinfo->first_line ; port < cinfo->first_line + 4*cinfo->num_chips ; port++) @@ -5616,6 +5564,11 @@ cy_init(void)) info->cor5 = 0; info->close_delay = 5*HZ/10; info->closing_wait = CLOSING_WAIT_DELAY; + info->icount.cts = info->icount.dsr = + info->icount.rng = info->icount.dcd = 0; + info->icount.rx = info->icount.tx = 0; + info->icount.frame = info->icount.parity = 0; + info->icount.overrun = info->icount.brk = 0; chip_number = (port - cinfo->first_line) / 4; if ((info->chip_rev = cy_readb(cinfo->base_addr + (cy_chip_offset[chip_number]<open_wait = 0; info->close_wait = 0; info->shutdown_wait = 0; + info->delta_msr_wait = 0; /* info->session */ /* info->pgrp */ info->read_status_mask = @@ -5674,11 +5628,6 @@ cy_init(void)) } #endif /* CONFIG_CYZ_INTR */ -#ifdef CY_PROC - ent = create_proc_entry("cyclades", S_IFREG | S_IRUGO, 0); - ent->read_proc = cyclades_get_proc_info; -#endif - return 0; } /* cy_init */ @@ -5719,23 +5668,22 @@ cleanup_module(void) restore_flags(flags); for (i = 0; i < NR_CARDS; i++) { - if (cy_card[i].base_addr != 0 + if (cy_card[i].base_addr != 0) { + iounmap((void *)cy_card[i].base_addr); + if (cy_card[i].ctl_addr != 0) + iounmap((void *)cy_card[i].ctl_addr); + if (cy_card[i].irq #ifndef CONFIG_CYZ_INTR - && cy_card[i].num_chips != -1 /* not a Z card */ + && cy_card[i].num_chips != -1 /* not a Z card */ #endif /* CONFIG_CYZ_INTR */ - && cy_card[i].irq) - { - free_irq(cy_card[i].irq, &cy_card[i]); + ) + free_irq(cy_card[i].irq, &cy_card[i]); } } if (tmp_buf) { free_page((unsigned long) tmp_buf); tmp_buf = NULL; } -#ifdef CY_PROC - remove_proc_entry("cyclades", 0); -#endif - } /* cleanup_module */ #else /* called by linux/init/main.c to parse command line options */ @@ -5799,8 +5747,7 @@ show_status(int line_num) printk(" session pgrp open_wait = %lx %lx %lx\n", info->session, info->pgrp, (long)info->open_wait); - - save_flags(flags); cli(); + CY_LOCK(info, flags); base_addr = (unsigned char*) (cy_card[card].base_addr @@ -5857,7 +5804,7 @@ show_status(int line_num) printk(" CyTBPR %x\n", cy_readb(base_addr + CyTBPR< 06\n", t); - writeb (0x06, rebase + CNTRL_REG_OFFSET*4+2); + t = readl (rebase + CNTRL_REG_OFFSET); + if (t != CNTRL_REG_GOODVALUE) { + printk (KERN_DEBUG "sx: performing cntrl reg fix: %08x -> %08x\n", t, CNTRL_REG_GOODVALUE); + writel (CNTRL_REG_GOODVALUE, rebase + CNTRL_REG_OFFSET); } my_iounmap (hwbase, rebase); - } #endif diff --git a/drivers/isdn/avmb1/Makefile b/drivers/isdn/avmb1/Makefile index 9f73ea2e3699..111c39466fb9 100644 --- a/drivers/isdn/avmb1/Makefile +++ b/drivers/isdn/avmb1/Makefile @@ -1,5 +1,5 @@ # -# $Id: Makefile,v 1.6 1999/07/20 06:41:44 calle Exp $ +# $Id: Makefile,v 1.7 1999/09/15 08:16:03 calle Exp $ # # Makefile for the CAPI and AVM-B1 device drivers. # @@ -11,6 +11,9 @@ # parent makes.. # # $Log: Makefile,v $ +# Revision 1.7 1999/09/15 08:16:03 calle +# Implementation of 64Bit extention complete. +# # Revision 1.6 1999/07/20 06:41:44 calle # Bugfix: After the redesign of the AVM B1 driver, the driver didn't even # compile, if not selected as modules. @@ -90,6 +93,12 @@ ifeq ($(CONFIG_ISDN_DRV_AVMB1),y) ifdef CONFIG_ISDN_DRV_AVMB1_B1PCMCIA OX_OBJS += b1pcmcia.o endif + ifdef CONFIG_ISDN_DRV_AVMB1_T1PCI + O_OBJS += t1pci.o + endif + ifdef CONFIG_ISDN_DRV_AVMB1_C4 + O_OBJS += c4.o + endif OX_OBJS += capiutil.o capidrv.o b1.o else ifeq ($(CONFIG_ISDN_DRV_AVMB1),m) @@ -105,10 +114,16 @@ else ifdef CONFIG_ISDN_DRV_AVMB1_T1ISA M_OBJS += t1isa.o endif - MX_OBJS += capiutil.o capidrv.o b1.o ifdef CONFIG_ISDN_DRV_AVMB1_B1PCMCIA MX_OBJS += b1pcmcia.o endif + ifdef CONFIG_ISDN_DRV_AVMB1_T1PCI + M_OBJS += t1pci.o + endif + ifdef CONFIG_ISDN_DRV_AVMB1_C4 + M_OBJS += c4.o + endif + MX_OBJS += capiutil.o capidrv.o b1.o endif endif diff --git a/drivers/isdn/avmb1/b1.c b/drivers/isdn/avmb1/b1.c index fd12bad56099..85206685c9be 100644 --- a/drivers/isdn/avmb1/b1.c +++ b/drivers/isdn/avmb1/b1.c @@ -1,11 +1,14 @@ /* - * $Id: b1.c,v 1.9 1999/09/07 09:02:53 calle Exp $ + * $Id: b1.c,v 1.10 1999/09/15 08:16:03 calle Exp $ * * Common module for AVM B1 cards. * * (c) Copyright 1999 by Carsten Paeth (calle@calle.in-berlin.de) * * $Log: b1.c,v $ + * Revision 1.10 1999/09/15 08:16:03 calle + * Implementation of 64Bit extention complete. + * * Revision 1.9 1999/09/07 09:02:53 calle * SETDATA removed. Now inside the kernel the datapart of DATA_B3_REQ and * DATA_B3_IND is always directly after the CAPI message. The "Data" member @@ -73,7 +76,7 @@ #include "capicmd.h" #include "capiutil.h" -static char *revision = "$Revision: 1.9 $"; +static char *revision = "$Revision: 1.10 $"; /* ------------------------------------------------------------- */ @@ -486,6 +489,11 @@ void b1_handle_interrupt(avmcard * card) MsgLen = b1_get_slice(card->port, card->msgbuf); DataB3Len = b1_get_slice(card->port, card->databuf); + if (MsgLen < 30) { /* not CAPI 64Bit */ + memset(card->msgbuf+MsgLen, 0, 30-MsgLen); + MsgLen = 30; + CAPIMSG_SETLEN(card->msgbuf, 30); + } if (!(skb = alloc_skb(DataB3Len + MsgLen, GFP_ATOMIC))) { printk(KERN_ERR "%s: incoming packet dropped\n", card->name); diff --git a/drivers/isdn/avmb1/capidrv.c b/drivers/isdn/avmb1/capidrv.c index f53ffeeae1e6..19c8d717da96 100644 --- a/drivers/isdn/avmb1/capidrv.c +++ b/drivers/isdn/avmb1/capidrv.c @@ -1,11 +1,14 @@ /* - * $Id: capidrv.c,v 1.26 1999/08/06 07:41:16 calle Exp $ + * $Id: capidrv.c,v 1.27 1999/09/16 15:13:04 calle Exp $ * * ISDN4Linux Driver, using capi20 interface (kernelcapi) * * Copyright 1997 by Carsten Paeth (calle@calle.in-berlin.de) * * $Log: capidrv.c,v $ + * Revision 1.27 1999/09/16 15:13:04 calle + * forgot to change paramter type of contr for lower_callback ... + * * Revision 1.26 1999/08/06 07:41:16 calle * Added the "vbox patch". if (si1 == 1) si2 = 0; * @@ -162,7 +165,7 @@ #include "capicmd.h" #include "capidrv.h" -static char *revision = "$Revision: 1.26 $"; +static char *revision = "$Revision: 1.27 $"; int debugmode = 0; MODULE_AUTHOR("Carsten Paeth "); @@ -2302,7 +2305,7 @@ static int capidrv_delcontr(__u16 contr) } -static void lower_callback(unsigned int cmd, __u16 contr, void *data) +static void lower_callback(unsigned int cmd, __u32 contr, void *data) { switch (cmd) { diff --git a/drivers/isdn/avmb1/capiutil.h b/drivers/isdn/avmb1/capiutil.h index 54ca5f50f17c..3825ac308378 100644 --- a/drivers/isdn/avmb1/capiutil.h +++ b/drivers/isdn/avmb1/capiutil.h @@ -1,5 +1,5 @@ /* - * $Id: capiutil.h,v 1.3 1999/09/07 09:02:53 calle Exp $ + * $Id: capiutil.h,v 1.4 1999/09/15 08:16:03 calle Exp $ * * CAPI 2.0 defines & types * @@ -7,6 +7,9 @@ * Rewritten for Linux 1996 by Carsten Paeth (calle@calle.in-berlin.de) * * $Log: capiutil.h,v $ + * Revision 1.4 1999/09/15 08:16:03 calle + * Implementation of 64Bit extention complete. + * * Revision 1.3 1999/09/07 09:02:53 calle * SETDATA removed. Now inside the kernel the datapart of DATA_B3_REQ and * DATA_B3_IND is always directly after the CAPI message. The "Data" member @@ -50,6 +53,12 @@ ((__u8 *)m)[3] = ((__u16)(applid) >> 8) & 0xff; \ } while (0) +#define CAPIMSG_SETLEN(m, len) \ + do { \ + ((__u8 *)m)[0] = (__u16)(len) & 0xff; \ + ((__u8 *)m)[1] = ((__u16)(len) >> 8) & 0xff; \ + } while (0) + /*----- basic-type definitions -----*/ typedef __u8 *_cstruct; diff --git a/drivers/isdn/avmb1/t1isa.c b/drivers/isdn/avmb1/t1isa.c index 8458d8e21cf5..e574bda17332 100644 --- a/drivers/isdn/avmb1/t1isa.c +++ b/drivers/isdn/avmb1/t1isa.c @@ -1,11 +1,14 @@ /* - * $Id: t1isa.c,v 1.6 1999/09/07 09:02:53 calle Exp $ + * $Id: t1isa.c,v 1.7 1999/09/15 08:16:03 calle Exp $ * * Module for AVM T1 HEMA-card. * * (c) Copyright 1999 by Carsten Paeth (calle@calle.in-berlin.de) * * $Log: t1isa.c,v $ + * Revision 1.7 1999/09/15 08:16:03 calle + * Implementation of 64Bit extention complete. + * * Revision 1.6 1999/09/07 09:02:53 calle * SETDATA removed. Now inside the kernel the datapart of DATA_B3_REQ and * DATA_B3_IND is always directly after the CAPI message. The "Data" member @@ -63,7 +66,7 @@ #include "capilli.h" #include "avmcard.h" -static char *revision = "$Revision: 1.6 $"; +static char *revision = "$Revision: 1.7 $"; /* ------------------------------------------------------------- */ @@ -188,6 +191,11 @@ static void t1_handle_interrupt(avmcard * card) MsgLen = t1_get_slice(card->port, card->msgbuf); DataB3Len = t1_get_slice(card->port, card->databuf); + if (MsgLen < 30) { /* not CAPI 64Bit */ + memset(card->msgbuf+MsgLen, 0, 30-MsgLen); + MsgLen = 30; + CAPIMSG_SETLEN(card->msgbuf, 30); + } if (!(skb = alloc_skb(DataB3Len+MsgLen, GFP_ATOMIC))) { printk(KERN_ERR "t1isa: incoming packet dropped\n"); } else { diff --git a/drivers/isdn/divert/divert_procfs.c b/drivers/isdn/divert/divert_procfs.c index b17da2313fbb..850170f6c887 100644 --- a/drivers/isdn/divert/divert_procfs.c +++ b/drivers/isdn/divert/divert_procfs.c @@ -1,5 +1,5 @@ /* - * $Id: divert_procfs.c,v 1.4 1999/08/06 07:42:48 calle Exp $ + * $Id: divert_procfs.c,v 1.5 1999/09/14 20:31:01 werner Exp $ * * Filesystem handling for the diversion supplementary services. * @@ -20,6 +20,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: divert_procfs.c,v $ + * Revision 1.5 1999/09/14 20:31:01 werner + * + * Removed obsoleted functions for proc fs and synced with new ones. + * * Revision 1.4 1999/08/06 07:42:48 calle * Added COMPAT_HAS_NEW_WAITQ for rd_queue for newer kernels. * @@ -38,9 +42,7 @@ #define __NO_VERSION__ #include #include -#if (LINUX_VERSION_CODE >= 0x020117) #include -#endif #ifdef CONFIG_PROC_FS #include #else @@ -96,11 +98,7 @@ void put_info_buffer(char *cp) /**********************************/ /* deflection device read routine */ /**********************************/ -#if (LINUX_VERSION_CODE < 0x020117) -static int isdn_divert_read(struct inode *inode, struct file *file, char *buf, unsigned long count) -#else static ssize_t isdn_divert_read(struct file *file, char *buf, size_t count, loff_t *off) -#endif { struct divert_info *inf; int len; @@ -125,11 +123,7 @@ static ssize_t isdn_divert_read(struct file *file, char *buf, size_t count, loff /**********************************/ /* deflection device write routine */ /**********************************/ -#if (LINUX_VERSION_CODE < 0x020117) -static int isdn_divert_write(struct inode *inode, struct file *file, const char *buf, unsigned long count) -#else static ssize_t isdn_divert_write(struct file *file, const char *buf, size_t count, loff_t *off) -#endif { return(-ENODEV); } /* isdn_divert_write */ @@ -138,17 +132,6 @@ static ssize_t isdn_divert_write(struct file *file, const char *buf, size_t coun /***************************************/ /* select routines for various kernels */ /***************************************/ -#if (LINUX_VERSION_CODE < 0x020117) -static int isdn_divert_select(struct inode *inode, struct file *file, int type, select_table * st) -{ - if (*((struct divert_info **)file->private_data)) - return 1; - else - { if (st) select_wait(&(rd_queue), st); - return 0; - } -} /* isdn_divert_select */ -#else static unsigned int isdn_divert_poll(struct file *file, poll_table * wait) { unsigned int mask = 0; @@ -159,7 +142,6 @@ static unsigned int isdn_divert_poll(struct file *file, poll_table * wait) } return mask; } /* isdn_divert_poll */ -#endif /****************/ /* Open routine */ @@ -183,11 +165,7 @@ static int isdn_divert_open(struct inode *ino, struct file *filep) /*******************/ /* close routine */ /*******************/ -#if (LINUX_VERSION_CODE < 0x020117) -static void isdn_divert_close(struct inode *ino, struct file *filep) -#else static int isdn_divert_close(struct inode *ino, struct file *filep) -#endif { struct divert_info *inf; int flags; @@ -207,10 +185,7 @@ static int isdn_divert_close(struct inode *ino, struct file *filep) kfree(inf); } MOD_DEC_USE_COUNT; -#if (LINUX_VERSION_CODE < 0x020117) -#else return(0); -#endif } /* isdn_divert_close */ /*********/ @@ -296,34 +271,12 @@ static int isdn_divert_ioctl(struct inode *inode, struct file *file, #ifdef CONFIG_PROC_FS -#if (LINUX_VERSION_CODE < 0x020117) -static long long -isdn_divert_lseek(struct inode *inode, struct file *file, long long offset, int orig) -#else static loff_t isdn_divert_lseek(struct file *file, loff_t offset, int orig) -#endif { return -ESPIPE; } -#if (LINUX_VERSION_CODE < 0x020117) -static struct file_operations isdn_fops = -{ - isdn_divert_lseek, - isdn_divert_read, - isdn_divert_write, - NULL, /* isdn_readdir */ - isdn_divert_select, /* isdn_select */ - isdn_divert_ioctl, /* isdn_ioctl */ - NULL, /* isdn_mmap */ - isdn_divert_open, - isdn_divert_close, - NULL /* fsync */ -}; - -#else - static struct file_operations isdn_fops = { isdn_divert_lseek, @@ -338,51 +291,33 @@ static struct file_operations isdn_fops = isdn_divert_close, NULL /* fsync */ }; -#endif /* kernel >= 2.1 */ - -/* - * proc directories can do almost nothing.. - */ -struct inode_operations proc_isdn_inode_ops = { - &isdn_fops, /* isdn divert special file-ops */ - NULL, /* create */ - NULL, /* lookup */ - NULL, /* link */ - NULL, /* unlink */ - NULL, /* symlink */ - NULL, /* mkdir */ - NULL, /* rmdir */ - NULL, /* mknod */ - NULL, /* rename */ - NULL, /* readlink */ - NULL, /* follow_link */ - NULL, /* readpage */ - NULL, /* writepage */ - NULL, /* bmap */ - NULL, /* truncate */ - NULL /* permission */ +struct inode_operations divert_file_inode_operations = { + &isdn_fops, /* default proc file-ops */ + NULL, /* create */ + NULL, /* lookup */ + NULL, /* link */ + NULL, /* unlink */ + NULL, /* symlink */ + NULL, /* mkdir */ + NULL, /* rmdir */ + NULL, /* mknod */ + NULL, /* rename */ + NULL, /* readlink */ + NULL, /* follow_link */ + NULL, /* readpage */ + NULL, /* writepage */ + NULL, /* bmap */ + NULL, /* truncate */ + NULL /* permission */ }; + /****************************/ /* isdn subdir in /proc/net */ /****************************/ -static struct proc_dir_entry isdn_proc_entry = - { 0, 4, "isdn", S_IFDIR | S_IRUGO | S_IXUGO, 2, 0, 0, 0, - &proc_dir_inode_operations,NULL,NULL,NULL,NULL,NULL - }; - -static struct proc_dir_entry isdn_divert_entry = -{ 0, 6, "divert",S_IFREG | S_IRUGO, 1, 0, 0, 0, &proc_isdn_inode_ops, - NULL - }; - -/*****************************************************************/ -/* variables used for automatic determining existence of proc fs */ -/*****************************************************************/ -static int (*proc_reg_dynamic)(struct proc_dir_entry *, struct proc_dir_entry *) = NULL; -static int (*proc_unreg)(struct proc_dir_entry *, int) = NULL; - +static struct proc_dir_entry *isdn_proc_entry = NULL; +static struct proc_dir_entry *isdn_divert_entry = NULL; #endif CONFIG_PROC_FS /***************************************************************************/ @@ -393,31 +328,16 @@ int divert_dev_init(void) #ifdef CONFIG_PROC_FS -#if (LINUX_VERSION_CODE < 0x020117) - (void *) proc_reg_dynamic = get_module_symbol("","proc_register_dynamic"); - (void *) proc_unreg = get_module_symbol("","proc_unregister"); - if (proc_unreg) - { i = proc_reg_dynamic(&proc_net,&isdn_proc_entry); - if (i) return(i); - i = proc_reg_dynamic(&isdn_proc_entry,&isdn_divert_entry); - if (i) - { proc_unreg(&proc_net,isdn_proc_entry.low_ino); - return(i); - } - } /* proc exists */ -#else - (void *) proc_reg_dynamic = get_module_symbol("","proc_register"); - (void *) proc_unreg = get_module_symbol("","proc_unregister"); - if (proc_unreg) - { i = proc_reg_dynamic(proc_net,&isdn_proc_entry); - if (i) return(i); - i = proc_reg_dynamic(&isdn_proc_entry,&isdn_divert_entry); - if (i) - { proc_unreg(proc_net,isdn_proc_entry.low_ino); - return(i); - } - } /* proc exists */ -#endif + isdn_proc_entry = create_proc_entry("isdn", S_IFDIR | S_IRUGO | S_IXUGO ,proc_net); + if (!isdn_proc_entry) + return(-1); + isdn_divert_entry = create_proc_entry("divert",S_IFREG | S_IRUGO,isdn_proc_entry); + if (!isdn_divert_entry) + { + remove_proc_entry("isdn",proc_net); + return(-1); + } + isdn_divert_entry->ops = &divert_file_inode_operations; #endif CONFIG_PROC_FS return(0); @@ -431,16 +351,8 @@ int divert_dev_deinit(void) { int i; #ifdef CONFIG_PROC_FS - if (proc_unreg) - { i = proc_unreg(&isdn_proc_entry,isdn_divert_entry.low_ino); - if (i) return(i); -#if (LINUX_VERSION_CODE < 0x020117) - i = proc_unreg(&proc_net,isdn_proc_entry.low_ino); -#else - i = proc_unreg(proc_net,isdn_proc_entry.low_ino); -#endif - if (i) return(i); - } /* proc exists */ + remove_proc_entry("divert",isdn_proc_entry); + remove_proc_entry("isdn",proc_net); #endif CONFIG_PROC_FS return(0); diff --git a/drivers/isdn/hisax/callc.c b/drivers/isdn/hisax/callc.c index c18c6a5db667..3bd1ffa69922 100644 --- a/drivers/isdn/hisax/callc.c +++ b/drivers/isdn/hisax/callc.c @@ -1,4 +1,4 @@ -/* $Id: callc.c,v 2.35 1999/09/04 06:20:05 keil Exp $ +/* $Id: callc.c,v 2.37 1999/09/20 19:49:47 keil Exp $ * Author Karsten Keil (keil@isdn4linux.de) * based on the teles driver from Jan den Ouden @@ -11,6 +11,12 @@ * Fritz Elfert * * $Log: callc.c,v $ + * Revision 2.37 1999/09/20 19:49:47 keil + * Fix wrong init of PStack + * + * Revision 2.36 1999/09/20 12:13:13 keil + * Fix hang if no protocol was selected + * * Revision 2.35 1999/09/04 06:20:05 keil * Changes from kernel set_current_state() * @@ -151,7 +157,7 @@ #define MOD_USE_COUNT ( GET_USE_COUNT (&__this_module)) #endif /* MODULE */ -const char *lli_revision = "$Revision: 2.35 $"; +const char *lli_revision = "$Revision: 2.37 $"; extern struct IsdnCard cards[]; extern int nrcards; @@ -1119,13 +1125,38 @@ dchan_l3l4(struct PStack *st, int pr, void *arg) } } +static void +dummy_pstack(struct PStack *st, int pr, void *arg) { + printk(KERN_WARNING"call to dummy_pstack pr=%04x arg %lx\n", pr, (long)arg); +} + +static void +init_PStack(struct PStack **stp) { + *stp = kmalloc(sizeof(struct PStack), GFP_ATOMIC); + (*stp)->next = NULL; + (*stp)->l1.l1l2 = dummy_pstack; + (*stp)->l1.l1hw = dummy_pstack; + (*stp)->l1.l1tei = dummy_pstack; + (*stp)->l2.l2tei = dummy_pstack; + (*stp)->l2.l2l1 = dummy_pstack; + (*stp)->l2.l2l3 = dummy_pstack; + (*stp)->l3.l3l2 = dummy_pstack; + (*stp)->l3.l3ml3 = dummy_pstack; + (*stp)->l3.l3l4 = dummy_pstack; + (*stp)->lli.l4l3 = dummy_pstack; + (*stp)->ma.layer = dummy_pstack; +} + static void init_d_st(struct Channel *chanp) { - struct PStack *st = chanp->d_st; + struct PStack *st; struct IsdnCardState *cs = chanp->cs; char tmp[16]; + init_PStack(&chanp->d_st); + st = chanp->d_st; + st->next = NULL; HiSax_addlist(cs, st); setstack_HiSax(st, cs); st->l2.sap = 0; @@ -1163,28 +1194,6 @@ callc_debug(struct FsmInst *fi, char *fmt, ...) va_end(args); } -static void -dummy_pstack(struct PStack *st, int pr, void *arg) { - printk(KERN_WARNING"call to dummy_pstack pr=%04x arg %lx\n", pr, (long)arg); -} - -static void -init_PStack(struct PStack **stp) { - *stp = kmalloc(sizeof(struct PStack), GFP_ATOMIC); - (*stp)->next = NULL; - (*stp)->l1.l1l2 = dummy_pstack; - (*stp)->l1.l1hw = dummy_pstack; - (*stp)->l1.l1tei = dummy_pstack; - (*stp)->l2.l2tei = dummy_pstack; - (*stp)->l2.l2l1 = dummy_pstack; - (*stp)->l2.l2l3 = dummy_pstack; - (*stp)->l3.l3l2 = dummy_pstack; - (*stp)->l3.l3ml3 = dummy_pstack; - (*stp)->l3.l3l4 = dummy_pstack; - (*stp)->lli.l4l3 = dummy_pstack; - (*stp)->ma.layer = dummy_pstack; -} - static void init_chan(int chan, struct IsdnCardState *csta) { @@ -1207,10 +1216,6 @@ init_chan(int chan, struct IsdnCardState *csta) FsmInitTimer(&chanp->fi, &chanp->dial_timer); FsmInitTimer(&chanp->fi, &chanp->drel_timer); if (!chan || test_bit(FLG_TWO_DCHAN, &csta->HW_Flags)) { - init_PStack(&chanp->d_st); - if (chan) - csta->channel->d_st->next = chanp->d_st; - chanp->d_st->next = NULL; init_d_st(chanp); } else { chanp->d_st = csta->channel->d_st; diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c index 6b7d42b523d2..700708c07a66 100644 --- a/drivers/isdn/hisax/config.c +++ b/drivers/isdn/hisax/config.c @@ -1,10 +1,13 @@ -/* $Id: config.c,v 2.36 1999/09/07 05:43:58 werner Exp $ +/* $Id: config.c,v 2.37 1999/09/20 12:11:08 keil Exp $ * Author Karsten Keil (keil@isdn4linux.de) * based on the teles driver from Jan den Ouden * * * $Log: config.c,v $ + * Revision 2.37 1999/09/20 12:11:08 keil + * Fix hang if no protocol was selected + * * Revision 2.36 1999/09/07 05:43:58 werner * * Added io as parameter 0 for HFC-PCI cards, if manual selection needed. @@ -1335,6 +1338,7 @@ HiSax_inithardware(int *busy_flag)) kfree((void *) cards[i].cs); cards[i].cs = NULL; HiSax_shiftcards(i); + nrcards--; } } return foundcards; diff --git a/drivers/isdn/hisax/diva.c b/drivers/isdn/hisax/diva.c index 37f0382b786b..52d0de65e1e2 100644 --- a/drivers/isdn/hisax/diva.c +++ b/drivers/isdn/hisax/diva.c @@ -550,7 +550,6 @@ Memhscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx) if (!(skb = dev_alloc_skb(count))) printk(KERN_WARNING "HSCX: receive out of memory\n"); else { - ; memcpy(skb_put(skb, count), bcs->hw.hscx.rcvbuf, count); skb_queue_tail(&bcs->rqueue, skb); } @@ -566,7 +565,6 @@ Memhscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx) if (!(skb = dev_alloc_skb(fifo_size))) printk(KERN_WARNING "HiSax: receive out of memory\n"); else { - ; memcpy(skb_put(skb, fifo_size), bcs->hw.hscx.rcvbuf, fifo_size); skb_queue_tail(&bcs->rqueue, skb); } diff --git a/drivers/isdn/hisax/hfc_2bds0.c b/drivers/isdn/hisax/hfc_2bds0.c index da6d93397e42..5a1a9b03f808 100644 --- a/drivers/isdn/hisax/hfc_2bds0.c +++ b/drivers/isdn/hisax/hfc_2bds0.c @@ -267,7 +267,6 @@ static struct sk_buff } else if (!(skb = dev_alloc_skb(count - 3))) printk(KERN_WARNING "HFC: receive out of memory\n"); else { - ; ptr = skb_put(skb, count - 3); idx = 0; cip = HFCB_FIFO | HFCB_FIFO_OUT | HFCB_REC | HFCB_CHANNEL(bcs->channel); @@ -726,7 +725,6 @@ int receive_dmsg(struct IsdnCardState *cs) while ((idx++ < rcnt) && WaitNoBusy(cs)) ReadReg(cs, HFCD_DATA_NODEB, cip); } else if ((skb = dev_alloc_skb(rcnt - 3))) { - ; ptr = skb_put(skb, rcnt - 3); while (idx < (rcnt - 3)) { cli(); diff --git a/drivers/isdn/hisax/hfc_2bs0.c b/drivers/isdn/hisax/hfc_2bs0.c index d9c1a99b63c5..877eac7cfaac 100644 --- a/drivers/isdn/hisax/hfc_2bs0.c +++ b/drivers/isdn/hisax/hfc_2bs0.c @@ -222,7 +222,6 @@ hfc_empty_fifo(struct BCState *bcs, int count) if (!(skb = dev_alloc_skb(count - 3))) printk(KERN_WARNING "HFC: receive out of memory\n"); else { - ; ptr = skb_put(skb, count - 3); idx = 0; cip = HFC_CIP | HFC_FIFO_OUT | HFC_REC | HFC_CHANNEL(bcs->channel); diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c index d61016b0e5da..c7bd5b013bbd 100644 --- a/drivers/isdn/hisax/hfc_pci.c +++ b/drivers/isdn/hisax/hfc_pci.c @@ -322,7 +322,6 @@ hfcpci_empty_fifo(struct BCState *bcs, bzfifo_type * bz, u_char * bdata, int cou } else if (!(skb = dev_alloc_skb(count - 3))) printk(KERN_WARNING "HFCPCI: receive out of memory\n"); else { - ; total = count; count -= 3; ptr = skb_put(skb, count); @@ -386,7 +385,6 @@ receive_dmsg(struct IsdnCardState *cs) df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) | (MAX_D_FRAMES + 1); /* next buffer */ df->za[df->f2 & D_FREG_MASK].z2 = (zp->z2 + rcnt) & (D_FIFO_SIZE - 1); } else if ((skb = dev_alloc_skb(rcnt - 3))) { - ; total = rcnt; rcnt -= 3; ptr = skb_put(skb, rcnt); @@ -444,7 +442,6 @@ int hfcpci_empty_fifo_trans(struct BCState *bcs, bzfifo_type *bz, u_char *bdata) if (!(skb = dev_alloc_skb(fcnt))) printk(KERN_WARNING "HFCPCI: receive out of memory\n"); else { - ; ptr = skb_put(skb, fcnt); if (*z2r + fcnt <= B_FIFO_SIZE + B_SUB_VAL) maxlen = fcnt; /* complete transfer */ diff --git a/drivers/isdn/hisax/hscx_irq.c b/drivers/isdn/hisax/hscx_irq.c index 0147209f71a7..e0681c43b785 100644 --- a/drivers/isdn/hisax/hscx_irq.c +++ b/drivers/isdn/hisax/hscx_irq.c @@ -204,7 +204,6 @@ hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx) if (!(skb = dev_alloc_skb(count))) printk(KERN_WARNING "HSCX: receive out of memory\n"); else { - ; memcpy(skb_put(skb, count), bcs->hw.hscx.rcvbuf, count); skb_queue_tail(&bcs->rqueue, skb); } @@ -220,7 +219,6 @@ hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx) if (!(skb = dev_alloc_skb(fifo_size))) printk(KERN_WARNING "HiSax: receive out of memory\n"); else { - ; memcpy(skb_put(skb, fifo_size), bcs->hw.hscx.rcvbuf, fifo_size); skb_queue_tail(&bcs->rqueue, skb); } diff --git a/drivers/isdn/hisax/isac.c b/drivers/isdn/hisax/isac.c index 5e37f852f3de..140ebca942e6 100644 --- a/drivers/isdn/hisax/isac.c +++ b/drivers/isdn/hisax/isac.c @@ -300,7 +300,6 @@ isac_interrupt(struct IsdnCardState *cs, u_char val) if (!(skb = alloc_skb(count, GFP_ATOMIC))) printk(KERN_WARNING "HiSax: D receive out of memory\n"); else { - ; memcpy(skb_put(skb, count), cs->rcvbuf, count); skb_queue_tail(&cs->rq, skb); } diff --git a/drivers/isdn/hisax/isar.c b/drivers/isdn/hisax/isar.c index 1e61a348ef88..64a78156b508 100644 --- a/drivers/isdn/hisax/isar.c +++ b/drivers/isdn/hisax/isar.c @@ -462,7 +462,6 @@ isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs) case L1_MODE_TRANS: case L1_MODE_V32: if ((skb = dev_alloc_skb(ireg->clsb))) { - ; rcv_mbox(cs, ireg, (u_char *)skb_put(skb, ireg->clsb)); skb_queue_tail(&bcs->rqueue, skb); isar_sched_event(bcs, B_RCVBUFREADY); @@ -496,7 +495,6 @@ isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs) } else if (!(skb = dev_alloc_skb(bcs->hw.isar.rcvidx-2))) { printk(KERN_WARNING "ISAR: receive out of memory\n"); } else { - ; memcpy(skb_put(skb, bcs->hw.isar.rcvidx-2), bcs->hw.isar.rcvbuf, bcs->hw.isar.rcvidx-2); skb_queue_tail(&bcs->rqueue, skb); diff --git a/drivers/isdn/hisax/isdnl2.c b/drivers/isdn/hisax/isdnl2.c index 6dfd28e7eaed..69e320262ccd 100644 --- a/drivers/isdn/hisax/isdnl2.c +++ b/drivers/isdn/hisax/isdnl2.c @@ -501,7 +501,6 @@ send_uframe(struct PStack *st, u_char cmd, u_char cr) printk(KERN_WARNING "isdl2 can't alloc sbbuff for send_uframe\n"); return; } - ; memcpy(skb_put(skb, i), tmp, i); enqueue_super(st, skb); } @@ -970,7 +969,6 @@ enquiry_cr(struct PStack *st, u_char typ, u_char cr, u_char pf) printk(KERN_WARNING "isdl2 can't alloc sbbuff for enquiry_cr\n"); return; } - ; memcpy(skb_put(skb, i), tmp, i); enqueue_super(st, skb); } @@ -1367,7 +1365,6 @@ l2_pull_iqueue(struct FsmInst *fi, int event, void *arg) "isdl2 pull_iqueue skb header(%d/%d) too short\n", i, p1); oskb = skb; skb = alloc_skb(oskb->len + i, GFP_ATOMIC); - ; memcpy(skb_put(skb, i), header, i); memcpy(skb_put(skb, oskb->len), oskb->data, oskb->len); FreeSkb(oskb); diff --git a/drivers/isdn/hisax/isdnl3.c b/drivers/isdn/hisax/isdnl3.c index 8fdfb43d4b8d..6dc8bd9d06c8 100644 --- a/drivers/isdn/hisax/isdnl3.c +++ b/drivers/isdn/hisax/isdnl3.c @@ -260,7 +260,6 @@ l3_alloc_skb(int len) printk(KERN_WARNING "HiSax: No skb for D-channel\n"); return (NULL); } - ; skb_reserve(skb, MAX_HEADER_LEN); return (skb); } diff --git a/drivers/isdn/hisax/jade_irq.c b/drivers/isdn/hisax/jade_irq.c index c2f56a85eb0b..e54c80c1a082 100644 --- a/drivers/isdn/hisax/jade_irq.c +++ b/drivers/isdn/hisax/jade_irq.c @@ -161,7 +161,6 @@ jade_interrupt(struct IsdnCardState *cs, u_char val, u_char jade) if (!(skb = dev_alloc_skb(count))) printk(KERN_WARNING "JADE %s receive out of memory\n", (jade ? "B":"A")); else { - ; memcpy(skb_put(skb, count), bcs->hw.hscx.rcvbuf, count); skb_queue_tail(&bcs->rqueue, skb); } @@ -177,7 +176,6 @@ jade_interrupt(struct IsdnCardState *cs, u_char val, u_char jade) if (!(skb = dev_alloc_skb(fifo_size))) printk(KERN_WARNING "HiSax: receive out of memory\n"); else { - ; memcpy(skb_put(skb, fifo_size), bcs->hw.hscx.rcvbuf, fifo_size); skb_queue_tail(&bcs->rqueue, skb); } diff --git a/drivers/isdn/hisax/md5sums.asc b/drivers/isdn/hisax/md5sums.asc index f0939f7714a8..e21f7d102603 100644 --- a/drivers/isdn/hisax/md5sums.asc +++ b/drivers/isdn/hisax/md5sums.asc @@ -6,26 +6,26 @@ # Eicon Technology Diva 2.01 PCI cards in the moment. # Read ../../../Documentation/isdn/HiSax.cert for more informations. # -e99c0a0111a10aa88daa3f3f453f1e73 isac.c +2760872030085b2d36aa203b44e9570e isac.c a9a15d069dbacb383cc24c238cb5ebbe isdnl1.c -7ce53a4b9f78722fe5498a20067bcb3a isdnl2.c -978120723f9beb6c97c288584e2896c9 isdnl3.c -ff2691458dd2b8b3b6504d25a60381fa tei.c -b002c28266bb3b111995140b86b61023 callc.c +bb51bd223040b511c18f091da5ab6456 isdnl2.c +b7aa7f97b2374967a4aca7c52991142c isdnl3.c +a23fbf8879c1432b04640b8b04bdf419 tei.c +c07fd0729b93ebffc3dbfc88cc334be1 callc.c bf9605b36429898f7be6630034e83230 cert.c 3fe91ac7175e1c15ad5f15b6d71b2756 l3dss1.c 2d748ced0eea375b21fe7ea91ca7917c l3_1tr6.c 72ee065c70473949a676f06f8ce83ebf elsa.c -21515518209e7048dd887d8a60102598 diva.c +1b26dd9b0f132744a7be2ce2ab1eda83 diva.c # end of md5sums -----BEGIN PGP SIGNATURE----- Version: 2.6.3i Charset: noconv -iQCVAwUBN955dTpxHvX/mS9tAQHS5wP8Cqlr9EKFJD8nmgSNsGJxxweY4OSM0xNH -3CEhDd5sm/7bAk4id+UH/KQjtRpNoV9CJCLPyW9ADc1m/Y0oFZdhdNSfYjcdfXXo -1eR3NK1TAO3WKabhIw7Shyh5aryrriTRBN19uFhsxsyPsxkVsk0A8JGZqwWiAxW2 -9ZoGxGJsGp8= -=IjAL +iQCVAwUBN+/NfDpxHvX/mS9tAQEC4gQAlAfRvVnILSrDUtH83RzPd6nCLONiHpKn +nmyE3BkGk2DO1D8azCjx3X/9x7ozEm8pL5UN2kZuu5p9EO0ISzM5ZmcCi0jxAOq5 +c493UJmnWWOw02G0pNw+EsmRH9mUh1t7IyUEL+UpUMNyAEQRqq66k764YyUkKF88 +fup3c64mSKw= +=bmv8 -----END PGP SIGNATURE----- diff --git a/drivers/isdn/hisax/netjet.c b/drivers/isdn/hisax/netjet.c index e25cdc1902b7..0f0bfc2e9949 100644 --- a/drivers/isdn/hisax/netjet.c +++ b/drivers/isdn/hisax/netjet.c @@ -409,7 +409,6 @@ static void got_frame(struct BCState *bcs, int count) { if (!(skb = dev_alloc_skb(count))) printk(KERN_WARNING "TIGER: receive out of memory\n"); else { - ; memcpy(skb_put(skb, count), bcs->hw.tiger.rcvbuf, count); skb_queue_tail(&bcs->rqueue, skb); } diff --git a/drivers/isdn/hisax/tei.c b/drivers/isdn/hisax/tei.c index e7b7c0de8d22..8454f1554ac5 100644 --- a/drivers/isdn/hisax/tei.c +++ b/drivers/isdn/hisax/tei.c @@ -169,7 +169,6 @@ put_tei_msg(struct PStack *st, u_char m_id, unsigned int ri, u_char tei) printk(KERN_WARNING "HiSax: No skb for TEI manager\n"); return; } - ; bp = skb_put(skb, 3); bp[0] = (TEI_SAPI << 2); bp[1] = (GROUP_TEI << 1) | 0x1; diff --git a/drivers/isdn/hisax/w6692.c b/drivers/isdn/hisax/w6692.c index ed7e40eda1e9..0b75d7fc5bd7 100644 --- a/drivers/isdn/hisax/w6692.c +++ b/drivers/isdn/hisax/w6692.c @@ -347,7 +347,6 @@ W6692B_interrupt(struct IsdnCardState *cs, u_char bchan) if (!(skb = dev_alloc_skb(count))) printk(KERN_WARNING "W6692: Bchan receive out of memory\n"); else { - ; memcpy(skb_put(skb, count), bcs->hw.w6692.rcvbuf, count); skb_queue_tail(&bcs->rqueue, skb); } @@ -363,7 +362,6 @@ W6692B_interrupt(struct IsdnCardState *cs, u_char bchan) if (!(skb = dev_alloc_skb(W_B_FIFO_THRESH))) printk(KERN_WARNING "HiSax: receive out of memory\n"); else { - ; memcpy(skb_put(skb, W_B_FIFO_THRESH), bcs->hw.w6692.rcvbuf, W_B_FIFO_THRESH); skb_queue_tail(&bcs->rqueue, skb); } @@ -458,7 +456,6 @@ W6692_interrupt(int intno, void *dev_id, struct pt_regs *regs) if (!(skb = alloc_skb(count, GFP_ATOMIC))) printk(KERN_WARNING "HiSax: D receive out of memory\n"); else { - ; memcpy(skb_put(skb, count), cs->rcvbuf, count); skb_queue_tail(&cs->rq, skb); } diff --git a/drivers/isdn/isdn_tty.h b/drivers/isdn/isdn_tty.h index 87acd7be2fd3..1c27b83009c9 100644 --- a/drivers/isdn/isdn_tty.h +++ b/drivers/isdn/isdn_tty.h @@ -1,4 +1,4 @@ -/* $Id: isdn_tty.h,v 1.16 1999/08/22 20:26:10 calle Exp $ +/* $Id: isdn_tty.h,v 1.17 1999/09/21 19:00:35 armin Exp $ * header for Linux ISDN subsystem, tty related functions (linklevel). * @@ -20,6 +20,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: isdn_tty.h,v $ + * Revision 1.17 1999/09/21 19:00:35 armin + * Extended FCON message with added CPN + * can now be activated with Bit 1 of Reg 23. + * * Revision 1.16 1999/08/22 20:26:10 calle * backported changes from kernel 2.3.14: * - several #include "config.h" gone, others come. @@ -154,6 +158,7 @@ #define REG_CPN 23 #define BIT_CPN 1 +#define BIT_CPNFCON 2 extern void isdn_tty_modem_escape(void); extern void isdn_tty_modem_ring(void); diff --git a/drivers/isdn/isdn_ttyfax.c b/drivers/isdn/isdn_ttyfax.c index b08014d95c82..9b7268b32c5c 100644 --- a/drivers/isdn/isdn_ttyfax.c +++ b/drivers/isdn/isdn_ttyfax.c @@ -1,4 +1,4 @@ -/* $Id: isdn_ttyfax.c,v 1.3 1999/08/22 20:26:12 calle Exp $ +/* $Id: isdn_ttyfax.c,v 1.4 1999/09/21 19:00:35 armin Exp $ * Linux ISDN subsystem, tty_fax AT-command emulator (linklevel). * * Copyright 1999 by Armin Schindler (mac@melware.de) @@ -20,6 +20,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Log: isdn_ttyfax.c,v $ + * Revision 1.4 1999/09/21 19:00:35 armin + * Extended FCON message with added CPN + * can now be activated with Bit 1 of Reg 23. + * * Revision 1.3 1999/08/22 20:26:12 calle * backported changes from kernel 2.3.14: * - several #include "config.h" gone, others come. @@ -46,7 +50,7 @@ #include "isdn_ttyfax.h" -static char *isdn_tty_fax_revision = "$Revision: 1.3 $"; +static char *isdn_tty_fax_revision = "$Revision: 1.4 $"; #define PARSE_ERROR1 { isdn_tty_fax_modem_result(1, info); return 1; } @@ -98,7 +102,7 @@ static void isdn_tty_fax_modem_result(int code, modem_info * info) break; case 2: /* +FCON */ /* Append CPN, if enabled */ - if ((m->mdmreg[REG_CPN] & BIT_CPN) && + if ((m->mdmreg[REG_CPN] & BIT_CPNFCON) && (!(dev->usage[info->isdn_channel] & ISDN_USAGE_OUTGOING))) { sprintf(rs, "/%s", m->cpn); isdn_tty_at_cout(rs, info); diff --git a/drivers/net/smc-ultra.c b/drivers/net/smc-ultra.c index ea3712c7e9da..bdc0cb733f08 100644 --- a/drivers/net/smc-ultra.c +++ b/drivers/net/smc-ultra.c @@ -480,14 +480,14 @@ cleanup_module(void) for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) { struct device *dev = &dev_ultra[this_dev]; if (dev->priv != NULL) { - /* NB: ultra_close_card() does free_irq + irq2dev */ + /* NB: ultra_close_card() does free_irq */ int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; - kfree(dev->priv); - release_region(ioaddr, ULTRA_IO_EXTENT); unregister_netdev(dev); - dev->priv = NULL; + release_region(ioaddr, ULTRA_IO_EXTENT); + kfree(dev->priv); } } + unlock_8390_module(); } #endif /* MODULE */ diff --git a/drivers/net/syncppp.c b/drivers/net/syncppp.c index 6f0a678cb0ef..3388f10c3de1 100644 --- a/drivers/net/syncppp.c +++ b/drivers/net/syncppp.c @@ -660,14 +660,14 @@ static void sppp_cisco_input (struct sppp *sp, struct sk_buff *skb) h = (struct cisco_packet *)skb->data; skb_pull(skb, sizeof(struct cisco_packet*)); if (sp->pp_flags & PP_DEBUG) - printk (KERN_WARNING "%s: cisco input: %d bytes <%lxh %xh %xh %xh %xh-%xh>\n", + printk (KERN_WARNING "%s: cisco input: %d bytes <%xh %xh %xh %xh %xh-%xh>\n", dev->name, skb->len, ntohl (h->type), h->par1, h->par2, h->rel, h->time0, h->time1); switch (ntohl (h->type)) { default: if (sp->pp_flags & PP_DEBUG) - printk (KERN_WARNING "%s: unknown cisco packet type: 0x%lx\n", + printk (KERN_WARNING "%s: unknown cisco packet type: 0x%x\n", dev->name, ntohl (h->type)); break; case CISCO_ADDR_REPLY: @@ -810,7 +810,7 @@ static void sppp_cisco_send (struct sppp *sp, int type, long par1, long par2) ch->time1 = htons ((u16) t); if (sp->pp_flags & PP_DEBUG) - printk (KERN_WARNING "%s: cisco output: <%lxh %xh %xh %xh %xh-%xh>\n", + printk (KERN_WARNING "%s: cisco output: <%xh %xh %xh %xh %xh-%xh>\n", dev->name, ntohl (ch->type), ch->par1, ch->par2, ch->rel, ch->time0, ch->time1); sp->obytes += skb->len; diff --git a/drivers/sbus/audio/amd7930.c b/drivers/sbus/audio/amd7930.c index 9b71e0a80995..5c515755e538 100644 --- a/drivers/sbus/audio/amd7930.c +++ b/drivers/sbus/audio/amd7930.c @@ -102,7 +102,7 @@ #include #include "amd7930.h" -#if defined (AMD79C30_ISDN) || defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined (AMD79C30_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff #include "../../isdn/hisax/hisax.h" #include "../../isdn/hisax/isdnl1.h" #include "../../isdn/hisax/foreign.h" @@ -1072,7 +1072,7 @@ static int amd7930_ioctl(struct inode * inode, struct file * file, * */ -#if defined (AMD79C30_ISDN) || defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined (AMD79C30_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff static int amd7930_get_irqnum(int dev) { struct amd7930_info *info; diff --git a/drivers/sbus/audio/cs4231.c b/drivers/sbus/audio/cs4231.c index a1c700205f62..a5ffefcc2386 100644 --- a/drivers/sbus/audio/cs4231.c +++ b/drivers/sbus/audio/cs4231.c @@ -719,13 +719,13 @@ static int cs4231_set_monitor_volume(struct sparcaudio_driver *drv, int value) else CS4231_WRITE8(cs4231_chip, &(cs4231_chip->regs->idr), ((a << 2) | LOOPB_ON)); - if (value == AUDIO_MAX_GAIN) - CS4231_WRITE8(cs4231_chip, &(cs4231_chip->perchip_info.monitor_gain), AUDIO_MAX_GAIN); + if (value == AUDIO_MAX_GAIN) + cs4231_chip->perchip_info.monitor_gain = AUDIO_MAX_GAIN; else - CS4231_WRITE8(cs4231_chip, &(cs4231_chip->perchip_info.monitor_gain), - ((CS4231_MAX_DEV_ATEN - a) * - (AUDIO_MAX_GAIN + 1) / - (CS4231_MAX_DEV_ATEN + 1))); + cs4231_chip->perchip_info.monitor_gain = + ((CS4231_MAX_DEV_ATEN - a) * + (AUDIO_MAX_GAIN + 1) / + (CS4231_MAX_DEV_ATEN + 1)); return 0; } diff --git a/drivers/sbus/audio/dbri.c b/drivers/sbus/audio/dbri.c index 23afc72b4455..59bca71ae5e9 100644 --- a/drivers/sbus/audio/dbri.c +++ b/drivers/sbus/audio/dbri.c @@ -21,10 +21,24 @@ * Interfaces: CHI, Audio In & Out, 2 bits parallel * Documentation: from the Crystal Semiconductor home page. * + * Conceptionally, the DBRI can be visualized as: + * + * +-------------------------------------+ + * | | + * | +---------+ | + * |==] Sbus | |------|--- CHI + * CPU -------| ] Interface | 32 |------|--- ISDN 1 (NT) + * | ] | "pipes" |------|--- ISDN 2 (TE) + * Memory -----|--]-----------------| | | + * |==] +---------+ | + * | | + * +-------------------------------------+ + * * The DBRI is a 32 pipe machine, each pipe can transfer some bits between * memory and a serial device (long pipes, nr 0-15) or between two serial * devices (short pipes, nr 16-31), or simply send a fixed data to a serial * device (short pipes). + * * A timeslot defines the bit-offset and nr of bits read from a serial device. * The timeslots are linked to 6 circular lists, one for each direction for * each serial device (NT,TE,CHI). A timeslot is associated to 1 or 2 pipes @@ -59,11 +73,12 @@ #include #include #include +#include #include #include "dbri.h" -#if defined(DBRI_ISDN) || defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined(DBRI_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff #include "../../isdn/hisax/hisax.h" #include "../../isdn/hisax/isdnl1.h" #include "../../isdn/hisax/foreign.h" @@ -79,25 +94,25 @@ #define D_CMD (1<<2) #define D_MM (1<<3) #define D_USR (1<<4) +#define D_DESC (1<<5) -/* static int dbri_debug = D_GEN|D_INT|D_CMD|D_MM|D_USR; */ static int dbri_debug = 0; MODULE_PARM(dbri_debug, "i"); +static int dbri_trace = 0; +MODULE_PARM(dbri_trace, "i"); +#define tprintk(x) if(dbri_trace) printk x + static char *cmds[] = { "WAIT", "PAUSE", "JUMP", "IIQ", "REX", "SDP", "CDP", "DTS", "SSP", "CHI", "NT", "TE", "CDEC", "TEST", "CDM", "RESRV" }; -/* Bit hunting */ -#define dumpcmd {int i; for(i=0; idma->cmd[i]); } - #define DBRI_CMD(cmd, intr, value) ((cmd << 28) | (1 << 27) | value) #else #define dprintk(a, x) -#define dumpcmd #define DBRI_CMD(cmd, intr, value) ((cmd << 28) | (intr << 27) | value) #endif /* DBRI_DEBUG */ @@ -110,74 +125,99 @@ static struct sparcaudio_driver drivers[MAX_DRIVERS]; static int num_drivers = 0; +/* + * Short data pipes transmit LSB first. The CS4215 receives MSB first. Grrr. + * So we have to reverse the bits. Note: not all bit lengths are supported + */ +static __u32 reverse_bytes(__u32 b, int len) +{ + switch(len) { + case 32: + b = ((b & 0xffff0000) >> 16) | ((b & 0x0000ffff) << 16); + case 16: + b = ((b & 0xff00ff00) >> 8) | ((b & 0x00ff00ff) << 8); + case 8: + b = ((b & 0xf0f0f0f0) >> 4) | ((b & 0x0f0f0f0f) << 4); + case 4: + b = ((b & 0xcccccccc) >> 2) | ((b & 0x33333333) << 2); + case 2: + b = ((b & 0xaaaaaaaa) >> 1) | ((b & 0x55555555) << 1); + case 1: + break; + default: + printk("DBRI reverse_bytes: unsupported length\n"); + } + return b; +} + /* **************************************************************************** ************** DBRI initialization and command synchronization ************* **************************************************************************** -*/ +Commands are sent to the DBRI by building a list of them in memory, +then writing the address of the first list item to DBRI register 8. +The list is terminated with a WAIT command, which can generate a +CPU interrupt if required. + +Since the DBRI can run in parallel with the CPU, several means of +synchronization present themselves. The original scheme (Rudolf's) +was to set a flag when we "cmdlock"ed the DBRI, clear the flag when +an interrupt signaled completion, and wait on a wait_queue if a routine +attempted to cmdlock while the flag was set. The problems arose when +we tried to cmdlock from inside an interrupt handler, which might +cause scheduling in an interrupt (if we waited), etc, etc + +A more sophisticated scheme might involve a circular command buffer +or an array of command buffers. A routine could fill one with +commands and link it onto a list. When a interrupt signaled +completion of the current command buffer, look on the list for +the next one. + +I've decided to implement something much simpler - after each set of +commands, the CPU waits for the DBRI to finish by polling the P bit in +DBRI register 0. I've tried to implement this in such a way that +might make implementing a more sophisticated scheme easier. + +Every time a routine wants to write commands to the DBRI, it must +first call dbri_cmdlock() and get an initial pointer into dbri->dma->cmd +in return. After the commands have been writen, dbri_cmdsend() is +called with the final pointer value. + +For SMP systems, a spinlock insures that only one CPU at a time can +lock the command buffer. -/* - * Commands are sent to the DBRI by building a list of them in memory, - * then writing the address of the first list item to DBRI register 8. - * The list is terminated with a WAIT command, which can generate a - * CPU interrupt if required. - * - * Since the DBRI can run asynchronously to the CPU, several means of - * synchronization present themselves. The original scheme (Rudolf's) - * was to set a flag when we "cmdlock"ed the DBRI, clear the flag when - * an interrupt signaled completion, and wait on a wait_queue if a routine - * attempted to cmdlock while the flag was set. The problems arose when - * we tried to cmdlock from inside an interrupt handler, which might - * cause scheduling in an interrupt (if we waited), etc, etc - * - * A more sophisticated scheme might involve a circular command buffer - * or an array of command buffers. A routine could fill one with - * commands and link it onto a list. When a interrupt signaled - * completion of the current command buffer, look on the list for - * the next one. - * - * I've decided to implement something much simpler - after each command, - * the CPU waits for the DBRI to finish the command by polling the P bit - * in DBRI register 0. I've tried to implement this in such a way - * that might make implementing a more sophisticated scheme easier. - * - * Every time a routine wants to write commands to the DBRI, it must - * first call dbri_cmdlock() and get an initial pointer into dbri->dma->cmd - * in return. After the commands have been writen, dbri_cmdsend() is - * called with the final pointer value. - */ - -static int dbri_locked = 0; /* XXX not SMP safe! XXX */ +*/ static volatile int * dbri_cmdlock(struct dbri *dbri) { - if (dbri_locked) { - printk("DBRI: Command buffer locked! (bug in driver)\n"); - } - dbri_locked ++; + spin_lock(&dbri->cmd_spinlock); return dbri->dma->cmd; } static void dbri_cmdsend(struct dbri *dbri, volatile int * cmd) { - int maxloops = 1000000; +#define MAXLOOPS 1000000 + int maxloops = MAXLOOPS; + volatile int * ptr; - dbri_locked --; - if (dbri_locked != 0) { - printk("DBRI: Command buffer improperly locked! (bug in driver)\n"); - } else if ((cmd - dbri->dma->cmd) >= DBRI_NO_CMDS-1) { + for (ptr = dbri->dma->cmd; ptr < cmd; ptr ++) { + dprintk(D_CMD, ("DBRI cmd: %08x\n", *ptr)); + } + + if ((cmd - dbri->dma->cmd) >= DBRI_NO_CMDS-3) { printk("DBRI: Command buffer overflow! (bug in driver)\n"); } else { *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0); - *(cmd++) = DBRI_CMD(D_WAIT, 0, 0); + *(cmd++) = DBRI_CMD(D_WAIT, 1, 0); dbri->regs->reg8 = (int)dbri->dma_dvma->cmd; - while ((maxloops--) > 0 && (dbri->regs->reg0 & D_P)); + while ((--maxloops) > 0 && (dbri->regs->reg0 & D_P)); + if (maxloops == 0) { + printk("DBRI: Chip never completed command buffer\n"); + } } - if (maxloops == 0) { - printk("DBRI: Chip never completed command buffer\n"); - } + spin_unlock(&dbri->cmd_spinlock); } static void dbri_reset(struct dbri *dbri) @@ -185,8 +225,8 @@ static void dbri_reset(struct dbri *dbri) int i; dprintk(D_GEN, ("DBRI: reset 0:%x 2:%x 8:%x 9:%x\n", - dbri->regs->reg0, dbri->regs->reg2, - dbri->regs->reg8, dbri->regs->reg9)); + dbri->regs->reg0, dbri->regs->reg2, + dbri->regs->reg8, dbri->regs->reg9)); dbri->regs->reg0 = D_R; /* Soft Reset */ for(i = 0; (dbri->regs->reg0 & D_R) && i < 10; i++) @@ -198,11 +238,13 @@ static void dbri_detach(struct dbri *dbri) dbri_reset(dbri); free_irq(dbri->irq, dbri); sparc_free_io(dbri->regs, dbri->regs_size); - /* Should we release the DMA structure dbri->dma here? */ + release_region((unsigned long) dbri->dma, sizeof(struct dbri_dma)); kfree(dbri); } +static void dbri_process_interrupt_buffer(struct dbri *); + static void dbri_initialize(struct dbri *dbri) { int n; @@ -222,6 +264,10 @@ static void dbri_initialize(struct dbri *dbri) dbri->dma->intr[n * DBRI_INT_BLK] = (int)(dbri->dma_dvma->intr); dbri->dbri_irqp = 1; + dbri->process_interrupt_buffer_task.routine = + (void (*)(void *)) dbri_process_interrupt_buffer; + dbri->process_interrupt_buffer_task.data = (void *)dbri; + /* We should query the openprom to see what burst sizes this * SBus supports. For now, just disable all SBus bursts */ dbri->regs->reg0 &= ~(D_G|D_S|D_E); @@ -242,68 +288,57 @@ static void dbri_initialize(struct dbri *dbri) **************************************************************************** *************************** DBRI interrupt handler ************************* **************************************************************************** -*/ +The DBRI communicates with the CPU mainly via a circular interrupt +buffer. dbri_process_interrupt_buffer() walks through the buffer and +calls dbri_process_one_interrupt() to dispatch each interrupt word. +Complicated interrupts are handled by dedicated functions (which +appear first in this file). + +*/ -/* - * Short data pipes transmit LSB first. The CS4215 receives MSB first. Grrr. - * So we have to reverse the bits. Note: not all bit lengths are supported - */ -static __u32 reverse_bytes(__u32 b, int len) -{ - switch(len) { - case 32: - b = ((b & 0xffff0000) >> 16) | ((b & 0x0000ffff) << 16); - case 16: - b = ((b & 0xff00ff00) >> 8) | ((b & 0x00ff00ff) << 8); - case 8: - b = ((b & 0xf0f0f0f0) >> 4) | ((b & 0x0f0f0f0f) << 4); - case 4: - b = ((b & 0xcccccccc) >> 2) | ((b & 0x33333333) << 2); - case 2: - b = ((b & 0xaaaaaaaa) >> 1) | ((b & 0x55555555) << 1); - case 1: - break; - default: - printk("DBRI reverse_bytes: unsupported length\n"); - } - return b; -} /* transmission_complete_intr() * * Called by main interrupt handler when DBRI signals transmission complete - * on a pipe. + * on a pipe (interrupt triggered by the B bit in a transmit descriptor). * * Walks through the pipe's list of transmit buffer descriptors, releasing - * each one's DMA buffer (if present) and signaling its callback routine - * (if present), before flaging the descriptor available and proceeding - * to the next one. - * - * Assumes that only the last in a chain of descriptors will have FINT - * sent to signal an interrupt, so that the chain will be completely - * transmitted by the time we get here, and there's no need to save - * any of the descriptors. In particular, use of the DBRI's CDP command - * is precluded, but I've not been able to get CDP working reliably anyway. + * each one's DMA buffer (if present), flagging the descriptor available, + * and signaling its callback routine (if present), before proceeding + * to the next one. Stops when the first descriptor is found without + * TBC (Transmit Buffer Complete) set, or we've run through them all. */ static void transmission_complete_intr(struct dbri *dbri, int pipe) { - int td = dbri->pipes[pipe].desc; + int td; int status; void *buffer; void (*callback)(void *, int); + void *callback_arg; - dbri->pipes[pipe].desc = -1; + if ((pipe < 0) || (pipe > 15)) { + printk("DBRI: invalid pipe in transmission_complete_intr\n"); + return; + } - for (; td >= 0; td = dbri->descs[td].next) { + spin_lock(&dbri->pipes[pipe].spinlock); + + while ((td = dbri->pipes[pipe].desc) >= 0) { if (td >= DBRI_NO_DESCS) { printk("DBRI: invalid td on pipe %d\n", pipe); - return; + break; } - status = dbri->dma->desc[td].word4; + status = DBRI_TD_STATUS(dbri->dma->desc[td].word4); + + if (! (status & DBRI_TD_TBC)) { + break; + } + + dprintk(D_DESC, ("DBRI: TD %d, status 0x%02x\n", td, status)); buffer = dbri->descs[td].buffer; if (buffer) { @@ -313,124 +348,228 @@ static void transmission_complete_intr(struct dbri *dbri, int pipe) } callback = dbri->descs[td].output_callback; - if (callback != NULL) { - callback(dbri->descs[td].output_callback_arg, - DBRI_TD_STATUS(status) & 0xe); - } + callback_arg = dbri->descs[td].output_callback_arg; + + dbri->pipes[pipe].desc = dbri->descs[td].next; dbri->descs[td].inuse = 0; + + if (callback != NULL) { + spin_unlock(&dbri->pipes[pipe].spinlock); + dprintk(D_USR, ("DBRI: xmit callback %08x(%08x)\n", + (int)callback, (int)callback_arg)); + callback(callback_arg, status & 0xe); + spin_lock(&dbri->pipes[pipe].spinlock); + } } + spin_unlock(&dbri->pipes[pipe].spinlock); } static void reception_complete_intr(struct dbri *dbri, int pipe) { - int rd = dbri->pipes[pipe].desc; + int rd; int status; void *buffer; - void (*callback)(void *, int, unsigned int); + int count; + void (*callback)(void *, int, unsigned int) = NULL; + void *callback_arg; + + if ((pipe < 0) || (pipe > 15)) { + printk("DBRI: invalid pipe in reception_complete_intr\n"); + return; + } + + spin_lock(&dbri->pipes[pipe].spinlock); + + rd = dbri->pipes[pipe].desc; if (rd < 0 || rd >= DBRI_NO_DESCS) { printk("DBRI: invalid rd on pipe %d\n", pipe); + spin_unlock(&dbri->pipes[pipe].spinlock); return; } - dbri->descs[rd].inuse = 0; - dbri->pipes[pipe].desc = -1; status = dbri->dma->desc[rd].word1; - buffer = dbri->descs[rd].buffer; - if (buffer) { - mmu_release_scsi_one(sbus_dvma_addr(buffer), - dbri->descs[rd].len, - dbri->sdev->my_bus); + if (status & DBRI_RD_C) { + callback = dbri->descs[rd].input_callback; + callback_arg = dbri->descs[rd].input_callback_arg; + buffer = dbri->descs[rd].buffer; + count = DBRI_RD_CNT(status); + + /* Throw away HDLC CRC bytes */ + if ((D_SDP_MODE(dbri->pipes[pipe].sdp) == D_SDP_HDLC) + && (count >= 2)) count -= 2; + + if (buffer) { + mmu_release_scsi_one(sbus_dvma_addr(buffer), + dbri->descs[rd].len, + dbri->sdev->my_bus); + } + + + dprintk(D_DESC, ("DBRI: RD %d, status 0x%02x, len %d\n", + rd, DBRI_RD_STATUS(status), + DBRI_RD_CNT(status))); + + dbri->pipes[pipe].desc = dbri->descs[rd].next; + dbri->descs[rd].inuse = 0; + } + spin_unlock(&dbri->pipes[pipe].spinlock); - callback = dbri->descs[rd].input_callback; if (callback != NULL) { - callback(dbri->descs[rd].input_callback_arg, - DBRI_RD_STATUS(status), - DBRI_RD_CNT(status)-2); + dprintk(D_USR, ("DBRI: recv callback %08x(%08x)\n", + (int)callback, (int)callback_arg)); + + callback(callback_arg, DBRI_RD_STATUS(status), count); } } -static void dbri_intr(int irq, void *opaque, struct pt_regs *regs) +static void dbri_process_one_interrupt(struct dbri *dbri, int x) { - struct dbri *dbri = (struct dbri *)opaque; - int x; - - /* - * Read it, so the interrupt goes away. - */ - x = dbri->regs->reg1; + int val = D_INTR_GETVAL(x); + int channel = D_INTR_GETCHAN(x); + int command = D_INTR_GETCMD(x); + int code = D_INTR_GETCODE(x); + int rval = D_INTR_GETRVAL(x); - if ( x & (D_MRR|D_MLE|D_LBG|D_MBE) ) { - /* - * What should I do here ? - */ - if(x & D_MRR) printk("DBRI: Multiple Error Ack on SBus\n"); - if(x & D_MLE) printk("DBRI: Multiple Late Error on SBus\n"); - if(x & D_LBG) printk("DBRI: Lost Bus Grant on SBus\n"); - if(x & D_MBE) printk("DBRI: Burst Error on SBus\n"); - } + if (channel == D_INTR_CMD) { + dprintk(D_INT,("DBRI: INTR: Command: %-5s Value:%d\n", + cmds[command], val)); + } else { + dprintk(D_INT,("DBRI: INTR: Chan:%d Code:%d Val:%#x\n", + channel, code, rval)); + } - if (!(x & D_IR)) /* Not for us */ - return; + if (code == D_INTR_SBRI) { - x = dbri->dma->intr[dbri->dbri_irqp]; - while (x != 0) { - int val = D_INTR_GETVAL(x); - int channel = D_INTR_GETCHAN(x); + /* SBRI - BRI status change */ - dbri->dma->intr[dbri->dbri_irqp] = 0; + int liu_states[] = {1, 0, 8, 3, 4, 5, 6, 7}; + dbri->liu_state = liu_states[val & 0x7]; + if (dbri->liu_callback) + dbri->liu_callback(dbri->liu_callback_arg); + } - if(D_INTR_GETCHAN(x) == D_INTR_CMD) { - dprintk(D_INT,("DBRI: INTR: Command: %-5s Value:%d\n", - cmds[D_INTR_GETCMD(x)], D_INTR_GETVAL(x))); - } else { - dprintk(D_INT,("DBRI: INTR: Chan:%d Code:%d Val:%#x\n", - D_INTR_GETCHAN(x), D_INTR_GETCODE(x), - D_INTR_GETRVAL(x))); - } + if (code == D_INTR_BRDY) { + reception_complete_intr(dbri, channel); + } - if (D_INTR_GETCODE(x) == D_INTR_SBRI) { + if (code == D_INTR_XCMP) { + transmission_complete_intr(dbri, channel); + } + + if (code == D_INTR_EOL) { + reception_complete_intr(dbri, channel); + } - /* SBRI - BRI status change */ + if (code == D_INTR_UNDR) { - int liu_states[] = {1, 0, 8, 3, 4, 5, 6, 7}; - dbri->liu_state = liu_states[val & 0x7]; - if (dbri->liu_callback) - dbri->liu_callback(dbri->liu_callback_arg); - } + /* UNDR - Transmission underrun + * resend SDP command with clear pipe bit (C) set + */ + + volatile int *cmd; + int pipe = channel; + int td = dbri->pipes[pipe].desc; + + dbri->dma->desc[td].word4 = 0; + + cmd = dbri_cmdlock(dbri); + *(cmd++) = DBRI_CMD(D_SDP, 0, + dbri->pipes[pipe].sdp + | D_SDP_P | D_SDP_C | D_SDP_2SAME); + *(cmd++) = (int) & dbri->dma_dvma->desc[td]; + dbri_cmdsend(dbri, cmd); + } + + if (code == D_INTR_FXDT) { + + /* FXDT - Fixed data change */ - if (D_INTR_GETCODE(x) == D_INTR_BRDY) { - reception_complete_intr(dbri, channel); + if (dbri->pipes[channel].sdp & D_SDP_MSB) { + val = reverse_bytes(val, dbri->pipes[channel].length); } - if (D_INTR_GETCODE(x) == D_INTR_XCMP) { - transmission_complete_intr(dbri, channel); + if (dbri->pipes[channel].recv_fixed_ptr) { + * dbri->pipes[channel].recv_fixed_ptr = val; } + } +} - if (D_INTR_GETCODE(x) == D_INTR_FXDT) { +/* dbri_process_interrupt_buffer() + * + * Bottom half interrupt handler. Run through the DBRI's interrupt + * buffer, looking for the non-zero interrupt words that the DBRI + * wrote and send each one to dbri_process_one_interrupt() after + * advancing the interrupt pointer. We lock the DBRI to make sure + * nobody else is fiddling the interrupt pointer at the same time. + */ - /* FXDT - Fixed data change */ +static void dbri_process_interrupt_buffer(struct dbri *dbri) +{ + int x; - if (dbri->pipes[D_INTR_GETCHAN(x)].sdp & D_SDP_MSB) { - val = reverse_bytes(val, dbri->pipes[channel].length); - } + spin_lock(&dbri->intr_spinlock); - if (dbri->pipes[D_INTR_GETCHAN(x)].recv_fixed_ptr) { - * dbri->pipes[channel].recv_fixed_ptr = val; - } - } + while ((x = dbri->dma->intr[dbri->dbri_irqp]) != 0) { + dbri->dma->intr[dbri->dbri_irqp] = 0; dbri->dbri_irqp++; if (dbri->dbri_irqp == (DBRI_NO_INTS * DBRI_INT_BLK)) dbri->dbri_irqp = 1; else if ((dbri->dbri_irqp & (DBRI_INT_BLK-1)) == 0) dbri->dbri_irqp++; - x = dbri->dma->intr[dbri->dbri_irqp]; + + dbri_process_one_interrupt(dbri, x); + } + + spin_unlock(&dbri->intr_spinlock); +} + +/* dbri_intr() + * + * Our registered interrupt handler. Defers most work to a bottom + * half, as all good interrupt handlers should. + */ + +static void dbri_intr(int irq, void *opaque, struct pt_regs *regs) +{ + struct dbri *dbri = (struct dbri *)opaque; + int x; + + /* + * Read it, so the interrupt goes away. + */ + x = dbri->regs->reg1; + + if ( x & (D_MRR|D_MLE|D_LBG|D_MBE) ) { + + if(x & D_MRR) printk("DBRI: Multiple Error Ack on SBus\n"); + if(x & D_MLE) printk("DBRI: Multiple Late Error on SBus\n"); + if(x & D_LBG) printk("DBRI: Lost Bus Grant on SBus\n"); + if(x & D_MBE) printk("DBRI: Burst Error on SBus\n"); + + /* Some of these SBus errors cause the chip's SBus circuitry + * to be disabled, so just re-enable and try to keep going. + * + * The only one I've seen is MRR, which will be triggered + * if you let a transmit pipe underrun, then try to CDP it. + * + * If these things persist, we should probably reset + * and re-init the chip. + */ + + dbri->regs->reg0 &= ~D_D; } + + if (x & D_IR) { + queue_task(&dbri->process_interrupt_buffer_task, + &tq_immediate); + mark_bh(IMMEDIATE_BH); + } } @@ -438,8 +577,21 @@ static void dbri_intr(int irq, void *opaque, struct pt_regs *regs) **************************************************************************** ************************** DBRI data pipe management *********************** **************************************************************************** + +While DBRI control functions use the command and interrupt buffers, +the main data path takes the form of data pipes, which can be short +(command and interrupt driven), or long (attached to DMA buffers). +These functions provide a rudimentary means of setting up and managing +the DBRI's pipes. The transmit and receive functions here interface +closely with the transmit and receive interrupt code. + */ +static int pipe_active(struct dbri *dbri, int pipe) +{ + return (dbri->pipes[pipe].desc != -1); +} + /* reset_pipe(dbri, pipe) * @@ -449,6 +601,7 @@ static void dbri_intr(int irq, void *opaque, struct pt_regs *regs) static void reset_pipe(struct dbri *dbri, int pipe) { int sdp; + int desc; volatile int *cmd; if (pipe < 0 || pipe > 31) { @@ -467,9 +620,64 @@ static void reset_pipe(struct dbri *dbri, int pipe) *(cmd++) = 0; dbri_cmdsend(dbri, cmd); + desc = dbri->pipes[pipe].desc; + while (desc != -1) { + void *buffer = dbri->descs[desc].buffer; + void (*output_callback) (void *, int) + = dbri->descs[desc].output_callback; + void *output_callback_arg + = dbri->descs[desc].output_callback_arg; + void (*input_callback) (void *, int, unsigned int) + = dbri->descs[desc].input_callback; + void *input_callback_arg + = dbri->descs[desc].input_callback_arg; + int nextdesc = dbri->descs[desc].next; + + if (buffer) { + mmu_release_scsi_one(sbus_dvma_addr(buffer), + dbri->descs[desc].len, + dbri->sdev->my_bus); + } + + dbri->descs[desc].inuse = 0; + + if (output_callback) { + output_callback(output_callback_arg, -1); + } + if (input_callback) { + input_callback(input_callback_arg, -1, 0); + } + + desc = nextdesc; + } + dbri->pipes[pipe].desc = -1; } +/* setup_pipe(dbri, pipe, sdp) + * + * Called to perform initial setup on a pipe, before any other functions + * use the pipe. + * + * Third argument, "sdp", is formed by bitwise or: + * + * Pipe data mode, one of: + * D_SDP_MEM to/from memory via DMA (long pipes 0-15 only) + * D_SDP_HDLC HDLC via DMA (ISDN B channel, or D channel receive) + * D_SDP_HDLC_D HDLC via DMA (ISDN D channel transmit) + * D_SDP_SER serial to serial + * D_SDP_FIXED "fixed" data (short pipes 16-31 only) + * used for slowly varying data + * + * Pipe direction, one of: + * D_SDP_TO_SER + * D_SDP_FROM_SER + * + * Bit order within pipe, one of: + * D_SDP_MSB + * D_SDP_LSB + */ + static void setup_pipe(struct dbri *dbri, int pipe, int sdp) { if (pipe < 0 || pipe > 31) { @@ -482,140 +690,218 @@ static void setup_pipe(struct dbri *dbri, int pipe, int sdp) /* sdp &= 0xf800; */ } + if ((D_SDP_MODE(sdp) == D_SDP_FIXED) && !(sdp & D_SDP_TO_SER)) { + sdp |= D_SDP_CHANGE; + } + sdp |= D_PIPE(pipe); dbri->pipes[pipe].sdp = sdp; + dbri->pipes[pipe].desc = -1; + dbri->pipes[pipe].recv_fixed_ptr = NULL; reset_pipe(dbri, pipe); } -enum master_or_slave { CHImaster, CHIslave }; +/* link_time_slot() links a pipe, previously defined via setup_pipe(), + * to an interface and a timeslot, defined by its length (in bits) + * and its cycle (bit offset from frame sync). It searches through + * the linked list of all pipes on the interface, finds the right place + * to insert this pipe (based on the cycle, which must remain sorted + * in ascending order), and does so. I didn't make this up... it's + * how the DBRI works! + */ -static void reset_chi(struct dbri *dbri, enum master_or_slave master_or_slave, - int bits_per_frame) +static void link_time_slot(struct dbri *dbri, int pipe, + enum in_or_out direction, int startpipe, + int length, int cycle) { volatile int *cmd; int val; + int prevpipe; + int nextpipe; - cmd = dbri_cmdlock(dbri); + if (pipe < 0 || pipe > 31 || startpipe < 0 || startpipe > 31) { + printk("DBRI: link_time_slot called with illegal pipe number\n"); + return; + } - /* Set CHI Anchor: Pipe 16 */ + if (dbri->pipes[pipe].sdp == 0 || dbri->pipes[startpipe].sdp == 0) { + printk("DBRI: link_time_slot called on uninitialized pipe\n"); + return; + } - val = D_DTS_VI | D_DTS_VO | D_DTS_INS | - D_DTS_PRVIN(D_P_16) | D_DTS_PRVOUT(D_P_16) | D_PIPE(D_P_16); - *(cmd++) = DBRI_CMD(D_DTS, 0, val); - *(cmd++) = D_TS_ANCHOR | D_TS_NEXT(D_P_16); - *(cmd++) = D_TS_ANCHOR | D_TS_NEXT(D_P_16); + /* "If transmission on [CHI] edges 0 or 1 is desired, then cycle n + * (where n = # bit times per frame) must be used." + * - DBRI data sheet, page 11 + */ - dbri->pipes[16].sdp = 1; - dbri->pipes[16].nextpipe = 16; + if (startpipe == 16 && direction == PIPEoutput && cycle == 0) { + cycle = dbri->chi_bpf; + } - if (master_or_slave == CHIslave) { - /* Setup DBRI for CHI Slave - receive clock, frame sync (FS) - * - * CHICM = 0 (slave mode, 8 kHz frame rate) - * IR = give immediate CHI status interrupt - * EN = give CHI status interrupt upon change + if (startpipe == pipe) { + + /* Special case - we're linking to ourself, so this is + * the first pipe on the interface and there's no linked + * list to search (yet). */ - *(cmd++) = DBRI_CMD(D_CHI, 0, D_CHI_CHICM(0) - | D_CHI_IR | D_CHI_EN); + + nextpipe = pipe; + prevpipe = pipe; + } else { - /* Setup DBRI for CHI Master - generate clock, FS - * - * BPF = bits per 8 kHz frame - * 12.288 MHz / CHICM_divisor = clock rate - * FD = 1 - drive CHIFS on rising edge of CHICK - */ - int clockrate = bits_per_frame * 8; - int divisor = 12288 / clockrate; + if (startpipe == 16) { - if (divisor > 255 || divisor * clockrate != 12288) { - printk("DBRI: illegal bits_per_frame in setup_chi\n"); + /* CHI is also a special case - there are two linked + * lists starting on the same pipe number (16). + */ + + if (direction == PIPEinput) { + nextpipe = dbri->chi_in_pipe; + } else { + nextpipe = dbri->chi_out_pipe; + } + + } else { + nextpipe = dbri->pipes[startpipe].nextpipe; } - *(cmd++) = DBRI_CMD(D_CHI, 0, D_CHI_CHICM(divisor) | D_CHI_FD - | D_CHI_IR | D_CHI_EN - | D_CHI_BPF(bits_per_frame)); + prevpipe = startpipe; + while (nextpipe != startpipe + && dbri->pipes[nextpipe].cycle < cycle) { + prevpipe = nextpipe; + nextpipe = dbri->pipes[prevpipe].nextpipe; + } } - /* CHI Data Mode - * - * RCE = 0 - receive on falling edge of CHICK - * XCE = 1 - transmit on rising edge of CHICK - * XEN = 1 - enable transmitter - * REN = 1 - enable receiver - */ + if (prevpipe != 16) { + dbri->pipes[prevpipe].nextpipe = pipe; + } else if (direction == PIPEinput) { + dbri->chi_in_pipe = pipe; + } else { + dbri->chi_out_pipe = pipe; + } - *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0); + dbri->pipes[pipe].nextpipe = nextpipe; + dbri->pipes[pipe].cycle = cycle; + dbri->pipes[pipe].length = length; - *(cmd++) = DBRI_CMD(D_CDM, 0, D_CDM_XCE|D_CDM_XEN|D_CDM_REN); + cmd = dbri_cmdlock(dbri); + + if (direction == PIPEinput) { + val = D_DTS_VI | D_DTS_INS | D_DTS_PRVIN(prevpipe) | pipe; + *(cmd++) = DBRI_CMD(D_DTS, 0, val); + *(cmd++) = D_TS_LEN(length) | D_TS_CYCLE(cycle) | D_TS_NEXT(nextpipe); + *(cmd++) = 0; + } else { + val = D_DTS_VO | D_DTS_INS | D_DTS_PRVOUT(prevpipe) | pipe; + *(cmd++) = DBRI_CMD(D_DTS, 0, val); + *(cmd++) = 0; + *(cmd++) = D_TS_LEN(length) | D_TS_CYCLE(cycle) | D_TS_NEXT(nextpipe); + } dbri_cmdsend(dbri, cmd); } -enum in_or_out { PIPEinput, PIPEoutput }; +/* unlink_time_slot() + * + * I don't use this function, so it's basically untested. + */ -static void link_time_slot(struct dbri *dbri, int pipe, - enum in_or_out direction, int prevpipe, - int length, int cycle) +static void unlink_time_slot(struct dbri *dbri, int pipe, + enum in_or_out direction, int startpipe) { volatile int *cmd; int val; + int prevpipe; int nextpipe; - if (pipe < 0 || pipe > 31 || prevpipe < 0 || prevpipe > 31) { - printk("DBRI: link_time_slot called with illegal pipe number\n"); + if (pipe < 0 || pipe > 31 || startpipe < 0 || startpipe > 31) { + printk("DBRI: unlink_time_slot called with illegal pipe number\n"); return; } - if (dbri->pipes[pipe].sdp == 0 || dbri->pipes[prevpipe].sdp == 0) { - printk("DBRI: link_time_slot called on uninitialized pipe\n"); - return; - } + if (startpipe == 16) { + + /* CHI is also a special case - there are two linked + * lists starting on the same pipe number (16). + */ + + if (direction == PIPEinput) { + nextpipe = dbri->chi_in_pipe; + } else { + nextpipe = dbri->chi_out_pipe; + } - if (pipe == prevpipe) { - nextpipe = pipe; } else { + nextpipe = dbri->pipes[startpipe].nextpipe; + } + + prevpipe = startpipe; + while (nextpipe != startpipe && nextpipe != pipe) { + prevpipe = nextpipe; nextpipe = dbri->pipes[prevpipe].nextpipe; } - dbri->pipes[pipe].nextpipe = nextpipe; - dbri->pipes[pipe].cycle = cycle; - dbri->pipes[pipe].length = length; + if (nextpipe == startpipe) { + printk("DBRI: unlink_time_slot couldn't find pipe on list\n"); + return; + } cmd = dbri_cmdlock(dbri); if (direction == PIPEinput) { - val = D_DTS_VI | D_DTS_INS | D_DTS_PRVIN(prevpipe) | pipe; + val = D_DTS_VI | D_DTS_DEL | D_DTS_PRVIN(prevpipe) | pipe; *(cmd++) = DBRI_CMD(D_DTS, 0, val); - *(cmd++) = D_TS_LEN(length) | D_TS_CYCLE(cycle) | D_TS_NEXT(nextpipe); + *(cmd++) = D_TS_NEXT(nextpipe); *(cmd++) = 0; } else { - val = D_DTS_VO | D_DTS_INS | D_DTS_PRVOUT(prevpipe) | pipe; + val = D_DTS_VO | D_DTS_DEL | D_DTS_PRVOUT(prevpipe) | pipe; *(cmd++) = DBRI_CMD(D_DTS, 0, val); *(cmd++) = 0; - *(cmd++) = D_TS_LEN(length) | D_TS_CYCLE(cycle) | D_TS_NEXT(nextpipe); + *(cmd++) = D_TS_NEXT(nextpipe); } dbri_cmdsend(dbri, cmd); } +/* xmit_fixed() / recv_fixed() + * + * Transmit/receive data on a "fixed" pipe - i.e, one whose contents are not + * expected to change much, and which we don't need to buffer. + * The DBRI only interrupts us when the data changes (receive pipes), + * or only changes the data when this function is called (transmit pipes). + * Only short pipes (numbers 16-31) can be used in fixed data mode. + * + * These function operate on a 32-bit field, no matter how large + * the actual time slot is. The interrupt handler takes care of bit + * ordering and alignment. An 8-bit time slot will always end up + * in the low-order 8 bits, filled either MSB-first or LSB-first, + * depending on the settings passed to setup_pipe() + */ + static void xmit_fixed(struct dbri *dbri, int pipe, unsigned int data) { volatile int *cmd; if (pipe < 16 || pipe > 31) { - printk("DBRI: xmit_fixed called with illegal pipe number\n"); + printk("DBRI: xmit_fixed: Illegal pipe number\n"); + return; + } + + if (D_SDP_MODE(dbri->pipes[pipe].sdp) == 0) { + printk("DBRI: xmit_fixed: Uninitialized pipe\n"); return; } if (D_SDP_MODE(dbri->pipes[pipe].sdp) != D_SDP_FIXED) { - printk("DBRI: xmit_fixed called on non-fixed pipe\n"); + printk("DBRI: xmit_fixed: Non-fixed pipe\n"); return; } if (! dbri->pipes[pipe].sdp & D_SDP_TO_SER) { - printk("DBRI: xmit_fixed called on receive pipe\n"); + printk("DBRI: xmit_fixed: Called on receive pipe\n"); return; } @@ -633,21 +919,7 @@ static void xmit_fixed(struct dbri *dbri, int pipe, unsigned int data) dbri_cmdsend(dbri, cmd); } -/* recv_fixed() - * - * Receive data on a "fixed" pipe - i.e, one whose contents are not - * expected to change much, and which we don't need to read constantly - * into a buffer. The DBRI only interrupts us when the data changes. - * Only short pipes (numbers 16-31) can be used in fixed data mode. - * - * Pass this function a pointer to a 32-bit field, no matter how large - * the actual time slot is. The interrupt handler takes care of bit - * ordering and alignment. An 8-bit time slot will always end up - * in the low-order 8 bits, filled either MSB-first or LSB-first, - * depending on the settings passed to setup_pipe() - */ - -static void recv_fixed(struct dbri *dbri, int pipe, __u32 *ptr) +static void recv_fixed(struct dbri *dbri, int pipe, __volatile__ __u32 *ptr) { if (pipe < 16 || pipe > 31) { printk("DBRI: recv_fixed called with illegal pipe number\n"); @@ -668,6 +940,23 @@ static void recv_fixed(struct dbri *dbri, int pipe, __u32 *ptr) } +/* xmit_on_pipe() / recv_on_pipe() + * + * Transmit/receive data on a "long" pipe - i.e, one associated + * with a DMA buffer. + * + * Only pipe numbers 0-15 can be used in this mode. + * + * Both functions take pointer/len arguments pointing to a data buffer, + * and both provide callback functions (may be NULL) to notify higher + * level code when transmission/reception is complete. + * + * Both work by building chains of descriptors which identify the + * data buffers. Each descriptor's Octet Count field is 13 bits, + * so buffers too large for a single descriptor will be spread + * across multiple descriptors, based on an average length. + */ + static void xmit_on_pipe(struct dbri *dbri, int pipe, void * buffer, unsigned int len, void (*callback)(void *, int), void * callback_arg) @@ -675,52 +964,44 @@ static void xmit_on_pipe(struct dbri *dbri, int pipe, volatile int *cmd; int td = 0; int first_td = -1; - int last_td; + int last_td = -1; + unsigned int avglen; __u32 dvma_buffer; if (pipe < 0 || pipe > 15) { - printk("DBRI: xmit_on_pipe called with illegal pipe number\n"); + printk("DBRI: xmit_on_pipe: Illegal pipe number\n"); return; } if (dbri->pipes[pipe].sdp == 0) { - printk("DBRI: xmit_on_pipe called on uninitialized pipe\n"); + printk("DBRI: xmit_on_pipe: Uninitialized pipe\n"); return; } if (! dbri->pipes[pipe].sdp & D_SDP_TO_SER) { - printk("DBRI: xmit_on_pipe called on receive pipe\n"); - return; - } - - /* XXX Fix this XXX - * Should be able to queue multiple buffers to send on a pipe - */ - - if (dbri->pipes[pipe].desc != -1) { - printk("DBRI: xmit_on_pipe called on active pipe\n"); + printk("DBRI: xmit_on_pipe: Called on receive pipe\n"); return; } dvma_buffer = mmu_get_scsi_one(buffer, len, dbri->sdev->my_bus); + avglen = len / ((len >> 13) + 1); + while (len > 0) { - int mylen; - for (td; td < DBRI_NO_DESCS; td ++) { - if (! dbri->descs[td].inuse) break; + int mylen = (len < (1 << 13)) ? len : avglen; + + /* Atomically acquire a transmit descriptor (TD) */ + + for (; td < DBRI_NO_DESCS; td ++) { + if (! test_and_set_bit(0, &dbri->descs[td].inuse)) + break; } if (td == DBRI_NO_DESCS) { + printk("DBRI: xmit_on_pipe: No descriptors\n"); break; } - if (len > (1 << 13) - 1) { - mylen = (1 << 13) - 1; - } else { - mylen = len; - } - - dbri->descs[td].inuse = 1; dbri->descs[td].next = -1; dbri->descs[td].buffer = NULL; dbri->descs[td].output_callback = NULL; @@ -744,15 +1025,10 @@ static void xmit_on_pipe(struct dbri *dbri, int pipe, len -= mylen; } - if (first_td == -1) { - printk("xmit_on_pipe: No descriptors available\n"); + if (first_td == -1 || last_td == -1) { return; } - if (len > 0) { - printk("xmit_on_pipe: Insufficient descriptors; data truncated\n"); - } - dbri->dma->desc[last_td].word1 |= DBRI_TD_I | DBRI_TD_F | DBRI_TD_B; dbri->descs[last_td].buffer = buffer; @@ -760,14 +1036,52 @@ static void xmit_on_pipe(struct dbri *dbri, int pipe, dbri->descs[last_td].output_callback = callback; dbri->descs[last_td].output_callback_arg = callback_arg; - dbri->pipes[pipe].desc = first_td; + for (td=first_td; td != -1; td = dbri->descs[td].next) { + dprintk(D_DESC, ("DBRI TD %d: %08x %08x %08x %08x\n", + td, + dbri->dma->desc[td].word1, + dbri->dma->desc[td].ba, + dbri->dma->desc[td].nda, + dbri->dma->desc[td].word4)); + } + spin_lock(&dbri->pipes[pipe].spinlock); cmd = dbri_cmdlock(dbri); - *(cmd++) = DBRI_CMD(D_SDP, 0, dbri->pipes[pipe].sdp | D_SDP_P | D_SDP_C); - *(cmd++) = (int) & dbri->dma_dvma->desc[first_td]; + if (pipe_active(dbri, pipe)) { - dbri_cmdsend(dbri, cmd); + /* Pipe is already active - find last TD in use + * and link our first TD onto its end. Then issue + * a CDP command to let the DBRI know there's more data. + */ + + last_td = dbri->pipes[pipe].desc; + while (dbri->descs[last_td].next != -1) + last_td = dbri->descs[last_td].next; + + dbri->descs[last_td].next = first_td; + dbri->dma->desc[last_td].nda = + (int) & dbri->dma_dvma->desc[first_td]; + + *(cmd++) = DBRI_CMD(D_CDP, 0, pipe); + + } else { + + /* Pipe isn't active - issue an SDP command to start + * our chain of TDs running. + */ + + dbri->pipes[pipe].desc = first_td; + + *(cmd++) = DBRI_CMD(D_SDP, 0, + dbri->pipes[pipe].sdp + | D_SDP_P | D_SDP_EVERY | D_SDP_C); + *(cmd++) = (int) & dbri->dma_dvma->desc[first_td]; + + } + + dbri_cmdsend(dbri,cmd); + spin_unlock(&dbri->pipes[pipe].spinlock); } static void recv_on_pipe(struct dbri *dbri, int pipe, @@ -776,229 +1090,464 @@ static void recv_on_pipe(struct dbri *dbri, int pipe, void * callback_arg) { volatile int *cmd; + int first_rd = -1; + int last_rd = -1; int rd; + __u32 bus_buffer; if (pipe < 0 || pipe > 15) { - printk("DBRI: recv_on_pipe called with illegal pipe number\n"); + printk("DBRI: recv_on_pipe: Illegal pipe number\n"); return; } if (dbri->pipes[pipe].sdp == 0) { - printk("DBRI: recv_on_pipe called on uninitialized pipe\n"); + printk("DBRI: recv_on_pipe: Uninitialized pipe\n"); return; } if (dbri->pipes[pipe].sdp & D_SDP_TO_SER) { - printk("DBRI: recv_on_pipe called on transmit pipe\n"); + printk("DBRI: recv_on_pipe: Called on transmit pipe\n"); return; } /* XXX Fix this XXX - * Should be able to queue multiple buffers to send on a pipe + * Should be able to queue multiple buffers to receive on a pipe */ + spin_lock(&dbri->pipes[pipe].spinlock); + if (dbri->pipes[pipe].desc != -1) { - printk("DBRI: recv_on_pipe called on active pipe\n"); + printk("DBRI: recv_on_pipe: Called on active pipe\n"); + spin_unlock(&dbri->pipes[pipe].spinlock); return; } - /* XXX Fix this XXX - * Use multiple descriptors, if needed, to fit in all the data - */ - - if (len > (1 << 13) - 1) { - printk("recv_on_pipe called with len=%d; truncated\n", len); - len = (1 << 13) - 1; - } - /* Make sure buffer size is multiple of four */ len &= ~3; - for (rd = 0; rd < DBRI_NO_DESCS; rd ++) { - if (! dbri->descs[rd].inuse) break; + bus_buffer = mmu_get_scsi_one(buffer, len, dbri->sdev->my_bus); + + while (len > 0) { + int rd; + int mylen; + + if (len > (1 << 13) - 4) { + mylen = (1 << 13) - 4; + } else { + mylen = len; + } + + /* Atomically acquire a receive descriptor */ + + for (rd = 0; rd < DBRI_NO_DESCS; rd ++) { + if (! test_and_set_bit(0, &dbri->descs[rd].inuse)) + break; + } + if (rd == DBRI_NO_DESCS) { + printk("DBRI recv_on_pipe: No descriptors\n"); + break; + } + + dbri->dma->desc[rd].word1 = 0; + dbri->dma->desc[rd].ba = bus_buffer; + dbri->dma->desc[rd].nda = 0; + dbri->dma->desc[rd].word4 = DBRI_RD_B | DBRI_RD_BCNT(mylen); + + dbri->descs[rd].buffer = NULL; + dbri->descs[rd].len = 0; + dbri->descs[rd].input_callback = NULL; + dbri->descs[rd].output_callback = NULL; + dbri->descs[rd].next = -1; + + if (first_rd == -1) first_rd = rd; + if (last_rd != -1) { + dbri->dma->desc[last_rd].nda = + (int) & dbri->dma_dvma->desc[rd]; + dbri->descs[last_rd].next = rd; + } + last_rd = rd; + + bus_buffer += mylen; + len -= mylen; } - if (rd == DBRI_NO_DESCS) { - printk("DBRI xmit_on_pipe: No descriptors available\n"); + + if (last_rd == -1 || first_rd == -1) { + spin_unlock(&dbri->pipes[pipe].spinlock); return; } - dbri->dma->desc[rd].word1 = 0; - dbri->dma->desc[rd].ba = mmu_get_scsi_one(buffer, len, - dbri->sdev->my_bus); - dbri->dma->desc[rd].nda = 0; - dbri->dma->desc[rd].word4 = DBRI_RD_B | DBRI_RD_BCNT(len); + for (rd=first_rd; rd != -1; rd = dbri->descs[rd].next) { + dprintk(D_DESC, ("DBRI RD %d: %08x %08x %08x %08x\n", + rd, + dbri->dma->desc[rd].word1, + dbri->dma->desc[rd].ba, + dbri->dma->desc[rd].nda, + dbri->dma->desc[rd].word4)); + } - dbri->descs[rd].buffer = buffer; - dbri->descs[rd].len = len; - dbri->descs[rd].input_callback = callback; - dbri->descs[rd].input_callback_arg = callback_arg; + dbri->descs[last_rd].buffer = buffer; + dbri->descs[last_rd].len = len; + dbri->descs[last_rd].input_callback = callback; + dbri->descs[last_rd].input_callback_arg = callback_arg; - dbri->pipes[pipe].desc = rd; + dbri->pipes[pipe].desc = first_rd; cmd = dbri_cmdlock(dbri); *(cmd++) = DBRI_CMD(D_SDP, 0, dbri->pipes[pipe].sdp | D_SDP_P); - *(cmd++) = (int) & dbri->dma_dvma->desc[rd]; + *(cmd++) = (int) & dbri->dma_dvma->desc[first_rd]; dbri_cmdsend(dbri, cmd); + + spin_unlock(&dbri->pipes[pipe].spinlock); } +/* +**************************************************************************** +************************** DBRI - CHI interface **************************** +**************************************************************************** + +The CHI is a four-wire (clock, frame sync, data in, data out) time-division +multiplexed serial interface which the DBRI can operate in either master +(give clock/frame sync) or slave (take clock/frame sync) mode. + +*/ + +enum master_or_slave { CHImaster, CHIslave }; + +static void reset_chi(struct dbri *dbri, enum master_or_slave master_or_slave, + int bits_per_frame) +{ + volatile int *cmd; + int val; + + dbri->regs->reg0 &= ~D_C; /* Disable CHI */ + + cmd = dbri_cmdlock(dbri); + + /* Set CHI Anchor: Pipe 16 */ + + val = D_DTS_VI | D_DTS_INS | D_DTS_PRVIN(16) | D_PIPE(16); + *(cmd++) = DBRI_CMD(D_DTS, 0, val); + *(cmd++) = D_TS_ANCHOR | D_TS_NEXT(16); + *(cmd++) = 0; + + val = D_DTS_VO | D_DTS_INS | D_DTS_PRVOUT(16) | D_PIPE(16); + *(cmd++) = DBRI_CMD(D_DTS, 0, val); + *(cmd++) = 0; + *(cmd++) = D_TS_ANCHOR | D_TS_NEXT(16); + + dbri->pipes[16].sdp = 1; + dbri->pipes[16].nextpipe = 16; + dbri->chi_in_pipe = 16; + dbri->chi_out_pipe = 16; + + dbri->chi_bpf = bits_per_frame; + + if (master_or_slave == CHIslave) { + /* Setup DBRI for CHI Slave - receive clock, frame sync (FS) + * + * CHICM = 0 (slave mode, 8 kHz frame rate) + * IR = give immediate CHI status interrupt + * EN = give CHI status interrupt upon change + */ + *(cmd++) = DBRI_CMD(D_CHI, 0, D_CHI_CHICM(0)); + } else { + /* Setup DBRI for CHI Master - generate clock, FS + * + * BPF = bits per 8 kHz frame + * 12.288 MHz / CHICM_divisor = clock rate + * FD = 1 - drive CHIFS on rising edge of CHICK + */ + + int clockrate = bits_per_frame * 8; + int divisor = 12288 / clockrate; + + if (divisor > 255 || divisor * clockrate != 12288) { + printk("DBRI: illegal bits_per_frame in setup_chi\n"); + } + + *(cmd++) = DBRI_CMD(D_CHI, 0, D_CHI_CHICM(divisor) | D_CHI_FD + | D_CHI_BPF(bits_per_frame)); + } + + /* CHI Data Mode + * + * RCE = 0 - receive on falling edge of CHICK + * XCE = 1 - transmit on rising edge of CHICK + * XEN = 1 - enable transmitter + * REN = 1 - enable receiver + */ + + *(cmd++) = DBRI_CMD(D_PAUSE, 0, 0); + + *(cmd++) = DBRI_CMD(D_CDM, 0, D_CDM_XCE|D_CDM_XEN|D_CDM_REN); + + dbri_cmdsend(dbri, cmd); +} + /* **************************************************************************** *********************** CS4215 audio codec management ********************** **************************************************************************** + +In the standard SPARC audio configuration, the CS4215 codec is attached +to the DBRI via the CHI interface and a few of the DBRI's PIO pins. +In particular, the DBRI's PIO3 pin is attached to the 4215's D/~C. + +On a SPARCStation 20 (and maybe others?), the addressing of the +CS4215's time slots is offset by eight bits, so we need to add eight +to all the "cycle" values in the Define Time Slot (DTS) commands. +This is done in hardware by a TI 248 that delays the frame sync signal +by eight clock cycles. Of course, on the SPARCstation LX, there's no +such delay, so that's why we have an "offset" variable in our mmcodec +structure. + +The CS4215 has two operating modes - Control and Data. In Control +mode, the CS4215 is a slave device, so the DBRI must operate as CHI +master, supplying clocking and frame synchronization. In Data mode, +however, the CS4215 must be CHI master to insure that its data stream +is synchronous with its codec. + +The upshot of all this? We start by putting the DBRI into master +mode, program the CS4215 in Control mode, then switch the CS4215 into +Data mode and put the DBRI into slave mode. If the user requests +something like a format change from 8-bit ulaw to 16-bit linear, we +have to switch back to control mode to make the change, then come back +to data mode to actually play the audio. Various timing requirements +must be observed along the way. + +DBRI pipe assignments (CS4215 Data mode): + + Pipe 4: Send timeslots 1-4 (audio data) + Pipe 20: Send timeslots 5-8 (part of ctrl data) + Pipe 6: Receive timeslots 1-4 (audio data) + Pipe 21: Receive timeslots 6-7 (A/D valid, overrange indicator) + +DBRI pipe assignments (CS4215 Control mode): + + Pipe 17: Send timeslots 1-4 (slots 5-8 are readonly) + Pipe 18: Receive timeslot 1 (clb). + Pipe 19: Receive timeslot 7 (version). + */ +static void mmcodec_setup_pipes(struct dbri *dbri) +{ + setup_pipe(dbri, 4, D_SDP_MEM | D_SDP_TO_SER | D_SDP_MSB); + setup_pipe(dbri, 20, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); + setup_pipe(dbri, 6, D_SDP_MEM | D_SDP_FROM_SER | D_SDP_MSB); + setup_pipe(dbri, 21, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); + + setup_pipe(dbri, 17, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); + setup_pipe(dbri, 18, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); + setup_pipe(dbri, 19, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); +} + +/* mmcodec_default(dbri) + * + * No DBRI action; just resets various CS4215 fields: + * + * Data Time Slots 5-8 + * Speaker,Line and Headphone enable. Gain set to the half. + * Input is mike. + * + * Control Time Slots 1-4 + * 0: Default I/O voltage scale + * 1: 8 bit ulaw, 8kHz, mono, high pass filter disabled + * 2: Serial enable, CHI master, 128 bits per frame, clock 1 + * 3: Tests disabled + */ + -static void mmcodec_default(struct cs4215 *mm) +static void mmcodec_default(struct dbri *dbri) { - /* - * No action, memory resetting only. - * - * Data Time Slot 5-8 - * Speaker,Line and Headphone enable. Gain set to the half. - * Input is mike. - */ + struct cs4215 *mm = &dbri->mm; + mm->data[0] = CS4215_LO(0x20) | CS4215_HE|CS4215_LE; mm->data[1] = CS4215_RO(0x20) | CS4215_SE; mm->data[2] = CS4215_LG( 0x8) | CS4215_IS | CS4215_PIO0 | CS4215_PIO1; mm->data[3] = CS4215_RG( 0x8) | CS4215_MA(0xf); - /* - * Control Time Slot 1-4 - * 0: Default I/O voltage scale - * 1: 8 bit ulaw, 8kHz, mono, high pass filter disabled - * 2: Serial enable, CHI master, 128 bits per frame, clock 1 - * 3: Tests disabled - */ - mm->ctrl[0] = CS4215_RSRVD_1; + mm->ctrl[0] = CS4215_RSRVD_1 | CS4215_MLB; mm->ctrl[1] = CS4215_DFR_ULAW | CS4215_FREQ[0].csval; mm->ctrl[2] = CS4215_XCLK | CS4215_BSEL_128 | CS4215_FREQ[0].xtal; mm->ctrl[3] = 0; -} - -static void mmcodec_init_data(struct dbri *dbri) -{ - /* - * Data mode: - * Pipe 4: Send timeslots 1-4 (audio data) - * Pipe 17: Send timeslots 5-8 (part of ctrl data) - * Pipe 6: Receive timeslots 1-4 (audio data) - * Pipe 20: Receive timeslots 6-7. We can only receive 20 bits via - * interrupt, and the rest of the data (slot 5 and 8) is - * not relevant for us (only for doublechecking). - * - * Just like in control mode, the time slots are all offset by eight - * bits. The CS4215, it seems, observes TSIN (the delayed signal) - * even if it's the CHI master. Don't ask me... - */ + dbri->perchip_info.play.channels = 1; + dbri->perchip_info.play.precision = 8; + dbri->perchip_info.play.gain = 128; + dbri->perchip_info.play.balance = AUDIO_MID_BALANCE; +} - /* Switch CS4215 to data mode - set PIO3 to 1 */ - dbri->regs->reg2 = D_ENPIO | D_PIO1 | D_PIO3 | - (dbri->mm.onboard ? D_PIO0 : D_PIO2); +/* mmcodec_setgain(dbri, int muted) + * + * Sets the DBRI gain levels, which can be done from Data mode without + * going to Control mode. + * + * If we're not in Data mode, skip it, since mmcodec_setdata always + * calls this function as it enters Data mode. + * + */ - reset_chi(dbri, CHIslave, 0); +static void mmcodec_setgain(struct dbri *dbri, int muted) +{ + if (! dbri->mm.datamode) return; - setup_pipe(dbri, 4, D_SDP_MEM | D_SDP_TO_SER | D_SDP_MSB); - setup_pipe(dbri, 17, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); - setup_pipe(dbri, 6, D_SDP_MEM | D_SDP_FROM_SER | D_SDP_MSB); - setup_pipe(dbri, 20, D_SDP_FIXED | D_SDP_FROM_SER | D_SDP_MSB); + if (muted || dbri->perchip_info.output_muted) { + dbri->mm.data[0] = 63; + dbri->mm.data[1] = 63; + } else { + int left_gain = (dbri->perchip_info.play.gain / 4) % 64; + int right_gain = (dbri->perchip_info.play.gain / 4) % 64; - /* Pipes 4 and 6 - Single time slot, 8 bit mono */ + if (dbri->perchip_info.play.balance < AUDIO_MID_BALANCE) { + right_gain *= dbri->perchip_info.play.balance; + right_gain /= AUDIO_MID_BALANCE; + } else { + left_gain *= AUDIO_RIGHT_BALANCE + - dbri->perchip_info.play.balance; + left_gain /= AUDIO_MID_BALANCE; + } - link_time_slot(dbri, 17, PIPEoutput, 16, 32, 32); - link_time_slot(dbri, 4, PIPEoutput, 17, 8, 128); - link_time_slot(dbri, 6, PIPEinput, 16, 8, 0); - link_time_slot(dbri, 20, PIPEinput, 6, 16, 40); + dbri->mm.data[0] = CS4215_LE | CS4215_HE | (63 - left_gain); + dbri->mm.data[1] = CS4215_SE | (63 - right_gain); + } - xmit_fixed(dbri, 17, *(int *)dbri->mm.data); + xmit_fixed(dbri, 20, *(int *)dbri->mm.data); } - -/* - * Send the control information (i.e. audio format) +/* mmcodec_setctrl(dbri) + * + * Enter control mode and send the control information (i.e. audio format). + * Returns true if the codec was present and responded correctly. */ -static void mmcodec_setctrl(struct dbri *dbri) + +static int mmcodec_setctrl(struct dbri *dbri) { int i, val; + if (dbri->mm.ctrlmode) { + xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); + return 1; + } + + if (dbri->mm.datamode) { + + /* Temporarily mute outputs, and wait 1/8000 sec (125 us) + * to make sure this takes. This avoids clicking noises. + */ + + mmcodec_setgain(dbri, 1); + udelay(125); + } + /* * Enable Control mode: Set DBRI's PIO3 (4215's D/~C) to 0, then wait * 12 cycles <= 12/(5512.5*64) sec = 34.01 usec */ + val = D_ENPIO | D_PIO1 | (dbri->mm.onboard ? D_PIO0 : D_PIO2); dbri->regs->reg2 = val; udelay(34); - /* In Control mode, the CS4215 is a slave device, so the DBRI must - * operate as CHI master, supplying clocking and frame synchronization. - * - * In Data mode, however, the CS4215 must be CHI master to insure - * that its data stream is synchronous with its codec. - * - * The upshot of all this? We start by putting the DBRI into master - * mode, program the CS4215 in Control mode, then switch the CS4215 - * into Data mode and put the DBRI into slave mode. Various timing - * requirements must be observed along the way. - * - * Oh, and one more thing, on a SPARCStation 20 (and maybe - * others?), the addressing of the CS4215's time slots is - * offset by eight bits, so we add eight to all the "cycle" - * values in the Define Time Slot (DTS) commands. This is - * done in hardware by a TI 248 that delays the DBRI->4215 - * frame sync signal by eight clock cycles. Anybody know why? - */ - reset_chi(dbri, CHImaster, 128); - /* - * Control mode: - * Pipe 17: Send timeslots 1-4 (slots 5-8 are readonly) - * Pipe 18: Receive timeslot 1 (clb). - * Pipe 19: Receive timeslot 7 (version). - */ - - setup_pipe(dbri, 17, D_SDP_FIXED | D_SDP_TO_SER | D_SDP_MSB); - setup_pipe(dbri, 18, D_SDP_FIXED | D_SDP_CHANGE | D_SDP_MSB); - setup_pipe(dbri, 19, D_SDP_FIXED | D_SDP_CHANGE | D_SDP_MSB); + dbri->mm.status = 0; - link_time_slot(dbri, 17, PIPEoutput, 16, 32, 128); - link_time_slot(dbri, 18, PIPEinput, 16, 8, 0); - link_time_slot(dbri, 19, PIPEinput, 18, 8, 48); + link_time_slot(dbri, 17, PIPEoutput, 16, 32, dbri->mm.offset); + link_time_slot(dbri, 18, PIPEinput, 16, 8, dbri->mm.offset); + link_time_slot(dbri, 19, PIPEinput, 16, 8, dbri->mm.offset + 48); recv_fixed(dbri, 18, & dbri->mm.status); recv_fixed(dbri, 19, & dbri->mm.version); - /* Wait for the chip to echo back CLB (Control Latch Bit) as zero */ - dbri->mm.ctrl[0] &= ~CS4215_CLB; xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); - i = 1000000; - while ((! dbri->mm.status & CS4215_CLB) && i--); + dbri->regs->reg0 |= D_C; /* Enable CHI */ + + /* Wait for the chip to echo back CLB (Control Latch Bit) as zero. + * Also check the status for reasonable values. If the bits + * don't come back correctly after a while, there's probably no + * codec at this location on the CHI, so return false. + */ + + i = 10; + while (((dbri->mm.status & 0xe4) != 0x20) && --i) udelay(125); if (i == 0) { - printk("CS4215 didn't respond to CLB\n"); - return; + return 0; + } + + dbri->mm.ctrlmode = 1; + dbri->mm.datamode = 0; + + return 1; +} + +/* mmcodec_setdata(dbri) + * + * Enter data mode. + */ + +static void mmcodec_setdata(struct dbri *dbri) +{ + int data_width; + + if (dbri->mm.datamode) return; + + if (dbri->mm.ctrlmode) { + + /* Terminate CS4215 control mode - data sheet says + * "Set CLB=1 and send two more frames of valid control info" + */ + + dbri->mm.ctrl[0] |= CS4215_CLB; + xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); + + /* Two frames @ 8kHz frame rate = 250 us delay */ + udelay(250); + } else { + printk("DBRI: Entering data mode without control mode\n"); } - /* Terminate CS4215 control mode - data sheet says - * "Set CLB=1 and send two more frames of valid control info" + reset_chi(dbri, CHIslave, 128); + + /* Switch CS4215 to data mode - set PIO3 to 1 */ + dbri->regs->reg2 = D_ENPIO | D_PIO1 | D_PIO3 | + (dbri->mm.onboard ? D_PIO0 : D_PIO2); + + /* Note: this next doesn't work for 8-bit stereo, because the two + * channels would be on timeslots 1 and 3, with 2 and 4 idle. + * (See CS4215 datasheet Fig 15) + * + * DBRI non-contiguous mode would be required to make this work. */ - dbri->mm.ctrl[0] |= CS4215_CLB; - xmit_fixed(dbri, 17, *(int *)dbri->mm.ctrl); + data_width = dbri->perchip_info.play.channels + * dbri->perchip_info.play.precision; + + link_time_slot(dbri, 20, PIPEoutput, 16, 32, dbri->mm.offset + 32); + link_time_slot(dbri, 4, PIPEoutput, 16, data_width, dbri->mm.offset); + link_time_slot(dbri, 6, PIPEinput, 16, data_width, dbri->mm.offset); + link_time_slot(dbri, 21, PIPEinput, 16, 16, dbri->mm.offset + 40); + + dbri->mm.ctrlmode = 0; + dbri->mm.datamode = 1; + + mmcodec_setgain(dbri, 0); - /* Two frames of control info @ 8kHz frame rate = 250 us delay */ - udelay(250); + dbri->regs->reg0 |= D_C; /* Enable CHI */ } static int mmcodec_init(struct sparcaudio_driver *drv) { struct dbri *dbri = (struct dbri *)drv->private; int reg2 = dbri->regs->reg2; + int chi_offsets[] = {0, 8}; + int i; /* Look for the cs4215 chips */ @@ -1024,19 +1573,20 @@ static int mmcodec_init(struct sparcaudio_driver *drv) } - /* Now talk to our baby */ - dbri->regs->reg0 |= D_C; /* Enable CHI */ - - mmcodec_default(&dbri->mm); - - dbri->mm.version = 0xff; - mmcodec_setctrl(dbri); - if(dbri->mm.version == 0xff) - return -EIO; + mmcodec_default(dbri); + mmcodec_setup_pipes(dbri); - mmcodec_init_data(dbri); + for (i=0; i < (sizeof(chi_offsets)/sizeof(chi_offsets[0])); i++) { + dbri->mm.version = 0xff; + dbri->mm.offset = chi_offsets[i]; + if (mmcodec_setctrl(dbri) && dbri->mm.version != 0xff) { + dbri->perchip_info.play.balance = AUDIO_MID_BALANCE; + dbri->perchip_info.play.gain = AUDIO_MAX_GAIN/2; + return 0; + } + } - return 0; + return -EIO; } @@ -1044,37 +1594,25 @@ static int mmcodec_init(struct sparcaudio_driver *drv) **************************************************************************** ******************** Interface with sparcaudio midlevel ******************** **************************************************************************** -*/ - - -static int dbri_open(struct inode * inode, struct file * file, - struct sparcaudio_driver *drv) -{ - struct dbri *dbri = (struct dbri *)drv->private; - MOD_INC_USE_COUNT; +The sparcaudio midlevel is contained in the file audio.c. It interfaces +to the user process and performs buffering, intercepts SunOS-style ioctl's, +etc. It interfaces to a abstract audio device via a struct sparcaudio_driver. +This code presents such an interface for the DBRI with an attached CS4215. +All our routines are defined, and then comes our struct sparcaudio_driver. - return 0; -} +*/ -static void dbri_release(struct inode * inode, struct file * file, - struct sparcaudio_driver *drv) -{ - MOD_DEC_USE_COUNT; -} +/******************* sparcaudio midlevel - audio output *******************/ -static int dbri_ioctl(struct inode * inode, struct file * file, - unsigned int x, unsigned long y, - struct sparcaudio_driver *drv) -{ - return 0; -} static void dbri_audio_output_callback(void * callback_arg, int status) { struct sparcaudio_driver *drv = callback_arg; - sparcaudio_output_done(drv, 1); + if (status != -1) { + sparcaudio_output_done(drv, 1); + } } static void dbri_start_output(struct sparcaudio_driver *drv, @@ -1082,8 +1620,26 @@ static void dbri_start_output(struct sparcaudio_driver *drv, { struct dbri *dbri = (struct dbri *)drv->private; + dprintk(D_USR, ("DBRI: start audio output buf=%x/%ld\n", + (int) buffer, count)); + + mmcodec_setdata(dbri); + /* Pipe 4 is audio transmit */ - xmit_on_pipe(dbri, 4, buffer, count, &dbri_audio_output_callback, drv); + + xmit_on_pipe(dbri, 4, buffer, count, + &dbri_audio_output_callback, drv); + + /* Notify midlevel that we're a DMA-capable driver that + * can accept another buffer immediately. We should probably + * check that we've got enough resources (i.e, descriptors) + * available before doing this, but the default midlevel + * settings only buffer 64KB, which we can handle with 16 + * of our DBRI_NO_DESCS (64) descriptors. + */ + + sparcaudio_output_done(drv, 2); + } static void dbri_stop_output(struct sparcaudio_driver *drv) @@ -1093,28 +1649,57 @@ static void dbri_stop_output(struct sparcaudio_driver *drv) reset_pipe(dbri, 4); } +/******************* sparcaudio midlevel - audio input ********************/ + +static void dbri_audio_input_callback(void * callback_arg, int status, + unsigned int len) +{ + struct sparcaudio_driver * drv = + (struct sparcaudio_driver *) callback_arg; + + if (status != -1) { + sparcaudio_input_done(drv, 3); + } +} + static void dbri_start_input(struct sparcaudio_driver *drv, __u8 * buffer, unsigned long len) { + struct dbri *dbri = (struct dbri *)drv->private; + + mmcodec_setdata(dbri); + + /* Pipe 6 is audio receive */ + recv_on_pipe(dbri, 6, buffer, len, + &dbri_audio_input_callback, (void *)drv); + dprintk(D_USR, ("DBRI: start audio input buf=%x/%ld\n", + (int)buffer, len)); } static void dbri_stop_input(struct sparcaudio_driver *drv) { -} + struct dbri *dbri = (struct dbri *)drv->private; -static void dbri_audio_getdev(struct sparcaudio_driver *drv, - audio_device_t *devptr) -{ + reset_pipe(dbri, 6); } +/******************* sparcaudio midlevel - volume & balance ***************/ + static int dbri_set_output_volume(struct sparcaudio_driver *drv, int volume) { + struct dbri *dbri = (struct dbri *)drv->private; + + dbri->perchip_info.play.gain = volume; + mmcodec_setgain(dbri, 0); + return 0; } static int dbri_get_output_volume(struct sparcaudio_driver *drv) { - return 0; + struct dbri *dbri = (struct dbri *)drv->private; + + return dbri->perchip_info.play.gain; } static int dbri_set_input_volume(struct sparcaudio_driver *drv, int volume) @@ -1139,12 +1724,19 @@ static int dbri_get_monitor_volume(struct sparcaudio_driver *drv) static int dbri_set_output_balance(struct sparcaudio_driver *drv, int balance) { + struct dbri *dbri = (struct dbri *)drv->private; + + dbri->perchip_info.play.balance = balance; + mmcodec_setgain(dbri, 0); + return 0; } static int dbri_get_output_balance(struct sparcaudio_driver *drv) { - return 0; + struct dbri *dbri = (struct dbri *)drv->private; + + return dbri->perchip_info.play.balance; } static int dbri_set_input_balance(struct sparcaudio_driver *drv, int balance) @@ -1157,107 +1749,203 @@ static int dbri_get_input_balance(struct sparcaudio_driver *drv) return 0; } +static int dbri_set_output_muted(struct sparcaudio_driver *drv, int mute) +{ + struct dbri *dbri = (struct dbri *)drv->private; + + dbri->perchip_info.output_muted = mute; + mmcodec_setgain(dbri, 0); + + return 0; +} + +static int dbri_get_output_muted(struct sparcaudio_driver *drv) +{ + struct dbri *dbri = (struct dbri *)drv->private; + + return dbri->perchip_info.output_muted; +} + +/******************* sparcaudio midlevel - encoding format ****************/ + static int dbri_set_output_channels(struct sparcaudio_driver *drv, int chan) { + struct dbri *dbri = (struct dbri *)drv->private; + + switch (chan) { + case 0: + return 0; + case 1: + dbri->mm.ctrl[1] &= ~CS4215_DFR_STEREO; + break; + case 2: + dbri->mm.ctrl[1] |= CS4215_DFR_STEREO; + break; + default: + return -1; + } + + dbri->perchip_info.play.channels = chan; + mmcodec_setctrl(dbri); return 0; } static int dbri_get_output_channels(struct sparcaudio_driver *drv) { - return 0; + struct dbri *dbri = (struct dbri *)drv->private; + + return dbri->perchip_info.play.channels; } static int dbri_set_input_channels(struct sparcaudio_driver *drv, int chan) { - return 0; + return dbri_set_output_channels(drv, chan); } static int dbri_get_input_channels(struct sparcaudio_driver *drv) { - return 0; + return dbri_get_output_channels(drv); } static int dbri_set_output_precision(struct sparcaudio_driver *drv, int prec) { - return 8; + return 0; } static int dbri_get_output_precision(struct sparcaudio_driver *drv) { - return 8; + struct dbri *dbri = (struct dbri *)drv->private; + + return dbri->perchip_info.play.precision; } static int dbri_set_input_precision(struct sparcaudio_driver *drv, int prec) { - return 8; + return 0; } static int dbri_get_input_precision(struct sparcaudio_driver *drv) { - return 8; -} + struct dbri *dbri = (struct dbri *)drv->private; -static int dbri_set_output_port(struct sparcaudio_driver *drv, int port) -{ - return 0; + return dbri->perchip_info.play.precision; } -static int dbri_get_output_port(struct sparcaudio_driver *drv) +static int dbri_set_output_encoding(struct sparcaudio_driver *drv, int enc) { + struct dbri *dbri = (struct dbri *)drv->private; + + /* For ULAW and ALAW, audio.c enforces precision = 8, + * for LINEAR, precision must be 16 + */ + + switch (enc) { + case AUDIO_ENCODING_NONE: + return 0; + case AUDIO_ENCODING_ULAW: + dbri->mm.ctrl[1] &= ~3; + dbri->mm.ctrl[1] |= CS4215_DFR_ULAW; + dbri->perchip_info.play.encoding = enc; + dbri->perchip_info.play.precision = 8; + break; + case AUDIO_ENCODING_ALAW: + dbri->mm.ctrl[1] &= ~3; + dbri->mm.ctrl[1] |= CS4215_DFR_ALAW; + dbri->perchip_info.play.encoding = enc; + dbri->perchip_info.play.precision = 8; + break; + case AUDIO_ENCODING_LINEAR: + dbri->mm.ctrl[1] &= ~3; + dbri->mm.ctrl[1] |= CS4215_DFR_LINEAR16; + dbri->perchip_info.play.encoding = enc; + dbri->perchip_info.play.precision = 16; + break; + default: + return -1; + } + mmcodec_setctrl(dbri); return 0; } -static int dbri_set_input_port(struct sparcaudio_driver *drv, int port) +static int dbri_get_output_encoding(struct sparcaudio_driver *drv) { - return 0; + struct dbri *dbri = (struct dbri *)drv->private; + + return dbri->perchip_info.play.encoding; } -static int dbri_get_input_port(struct sparcaudio_driver *drv) +static int dbri_set_input_encoding(struct sparcaudio_driver *drv, int enc) { - return 0; + return dbri_set_output_encoding(drv, enc); } -static int dbri_set_output_encoding(struct sparcaudio_driver *drv, int enc) +static int dbri_get_input_encoding(struct sparcaudio_driver *drv) { - return 0; + return dbri_get_output_encoding(drv); } -static int dbri_get_output_encoding(struct sparcaudio_driver *drv) +static int dbri_set_output_rate(struct sparcaudio_driver *drv, int rate) { + struct dbri *dbri = (struct dbri *)drv->private; + int i; + + if (rate == 0) { + return 0; + } + + for (i=0; CS4215_FREQ[i].freq; i++) { + if (CS4215_FREQ[i].freq == rate) break; + } + if (CS4215_FREQ[i].freq == 0) { + return -1; + } + + dbri->mm.ctrl[1] &= ~ 0x38; + dbri->mm.ctrl[1] |= CS4215_FREQ[i].csval; + dbri->mm.ctrl[2] &= ~ 0x70; + dbri->mm.ctrl[2] |= CS4215_FREQ[i].xtal; + + dbri->perchip_info.play.sample_rate = rate; + + mmcodec_setctrl(dbri); return 0; } -static int dbri_set_input_encoding(struct sparcaudio_driver *drv, int enc) +static int dbri_get_output_rate(struct sparcaudio_driver *drv) { - return 0; + struct dbri *dbri = (struct dbri *)drv->private; + + return dbri->perchip_info.play.sample_rate; } -static int dbri_get_input_encoding(struct sparcaudio_driver *drv) +static int dbri_set_input_rate(struct sparcaudio_driver *drv, int rate) { - return 0; + return dbri_set_output_rate(drv, rate); } -static int dbri_set_output_rate(struct sparcaudio_driver *drv, int rate) +static int dbri_get_input_rate(struct sparcaudio_driver *drv) { - return 0; + return dbri_get_output_rate(drv); } -static int dbri_get_output_rate(struct sparcaudio_driver *drv) +/******************* sparcaudio midlevel - ports ***********************/ + +static int dbri_set_output_port(struct sparcaudio_driver *drv, int port) { return 0; } -static int dbri_set_input_rate(struct sparcaudio_driver *drv, int rate) +static int dbri_get_output_port(struct sparcaudio_driver *drv) { return 0; } -static int dbri_get_input_rate(struct sparcaudio_driver *drv) +static int dbri_set_input_port(struct sparcaudio_driver *drv, int port) { return 0; } -static int dbri_sunaudio_getdev_sunos(struct sparcaudio_driver *drv) +static int dbri_get_input_port(struct sparcaudio_driver *drv) { return 0; } @@ -1272,17 +1960,50 @@ static int dbri_get_input_ports(struct sparcaudio_driver *drv) return 0; } -static int dbri_set_output_muted(struct sparcaudio_driver *drv, int mute) +/******************* sparcaudio midlevel - driver ID ********************/ + +static void dbri_audio_getdev(struct sparcaudio_driver *drv, + audio_device_t *audinfo) { - return 0; + struct dbri *dbri = (struct dbri *)drv->private; + + strncpy(audinfo->name, "SUNW,DBRI", sizeof(audinfo->name) - 1); + + audinfo->version[0] = dbri->dbri_version; + audinfo->version[1] = '\0'; + + strncpy(audinfo->config, "onboard1", sizeof(audinfo->config) - 1); } -static int dbri_get_output_muted(struct sparcaudio_driver *drv) +static int dbri_sunaudio_getdev_sunos(struct sparcaudio_driver *drv) { - return 0; + return AUDIO_DEV_CODEC; +} + +/******************* sparcaudio midlevel - open & close ******************/ + +static int dbri_open(struct inode * inode, struct file * file, + struct sparcaudio_driver *drv) +{ + MOD_INC_USE_COUNT; + + return 0; +} + +static void dbri_release(struct inode * inode, struct file * file, + struct sparcaudio_driver *drv) +{ + MOD_DEC_USE_COUNT; } +static int dbri_ioctl(struct inode * inode, struct file * file, + unsigned int x, unsigned long y, + struct sparcaudio_driver *drv) +{ + return -EINVAL; +} +/*********** sparcaudio midlevel - struct sparcaudio_driver ************/ static struct sparcaudio_operations dbri_ops = { dbri_open, @@ -1348,21 +2069,21 @@ void dbri_isdn_init(struct dbri *dbri) * Pipe 11: Transmit B2 channel */ - setup_pipe(dbri, 0, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB); - setup_pipe(dbri, 8, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB); - setup_pipe(dbri, 9, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB); + setup_pipe(dbri, 0, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB | D_SDP_EOL); + setup_pipe(dbri, 8, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB | D_SDP_EOL); + setup_pipe(dbri, 9, D_SDP_HDLC | D_SDP_FROM_SER | D_SDP_LSB | D_SDP_EOL); setup_pipe(dbri, 1, D_SDP_HDLC_D | D_SDP_TO_SER | D_SDP_LSB); setup_pipe(dbri,10, D_SDP_HDLC | D_SDP_TO_SER | D_SDP_LSB); setup_pipe(dbri,11, D_SDP_HDLC | D_SDP_TO_SER | D_SDP_LSB); link_time_slot(dbri, 0, PIPEinput, 0, 2, 17); - link_time_slot(dbri, 8, PIPEinput, 8, 8, 0); - link_time_slot(dbri, 9, PIPEinput, 9, 8, 8); + link_time_slot(dbri, 8, PIPEinput, 0, 8, 0); + link_time_slot(dbri, 9, PIPEinput, 0, 8, 8); link_time_slot(dbri, 1, PIPEoutput, 1, 2, 17); link_time_slot(dbri, 10, PIPEoutput, 1, 8, 0); - link_time_slot(dbri, 11, PIPEoutput, 10, 8, 8); + link_time_slot(dbri, 11, PIPEoutput, 1, 8, 8); } int dbri_get_irqnum(int dev) @@ -1375,6 +2096,8 @@ int dbri_get_irqnum(int dev) dbri = (struct dbri *) drivers[dev].private; + tprintk(("dbri_get_irqnum()\n")); + /* On the sparc, the cpu's irq number is only part of the "irq" */ return (dbri->irq & NR_IRQS); } @@ -1389,6 +2112,8 @@ int dbri_get_liu_state(int dev) dbri = (struct dbri *) drivers[dev].private; + tprintk(("dbri_get_liu_state() returns %d\n", dbri->liu_state)); + return dbri->liu_state; } @@ -1404,12 +2129,14 @@ void dbri_liu_init(int dev, void (*callback)(void *), void *callback_arg) dbri = (struct dbri *) drivers[dev].private; + tprintk(("dbri_liu_init()\n")); + /* Set callback for LIU state change */ - dbri->liu_callback = callback; + dbri->liu_callback = callback; dbri->liu_callback_arg = callback_arg; - dbri_isdn_init(dbri); - dbri_liu_activate(dev, 0); + dbri_isdn_init(dbri); + dbri_liu_activate(dev, 0); } void dbri_liu_activate(int dev, int priority) @@ -1424,16 +2151,28 @@ void dbri_liu_activate(int dev, int priority) dbri = (struct dbri *) drivers[dev].private; - cmd = dbri_cmdlock(dbri); + tprintk(("dbri_liu_activate()\n")); + + if (dbri->liu_state <= 3) { + + cmd = dbri_cmdlock(dbri); - /* Turn on the ISDN TE interface and request activation */ - val = D_NT_IRM_IMM | D_NT_IRM_EN | D_NT_ACT; - *(cmd++) = DBRI_CMD(D_TE, 0, val); + /* Turn on the ISDN TE interface and request activation */ + val = D_NT_IRM_IMM | D_NT_IRM_EN | D_NT_ACT; +#ifdef LOOPBACK_D + val |= D_NT_LLB(4); +#endif + *(cmd++) = DBRI_CMD(D_TE, 0, val); + + dbri_cmdsend(dbri, cmd); - dbri_cmdsend(dbri, cmd); + /* Activate the interface */ + dbri->regs->reg0 |= D_T; + } - /* Activate the interface */ - dbri->regs->reg0 |= D_T; + if (dbri->liu_callback) { + dbri->liu_callback(dbri->liu_callback_arg); + } } void dbri_liu_deactivate(int dev) @@ -1446,8 +2185,14 @@ void dbri_liu_deactivate(int dev) dbri = (struct dbri *) drivers[dev].private; + tprintk(("dbri_liu_deactivate()\n")); + +#if 0 /* Turn off the ISDN TE interface */ dbri->regs->reg0 &= ~D_T; + + dbri->liu_state = 0; +#endif } void dbri_dxmit(int dev, __u8 *buffer, unsigned int count, @@ -1485,7 +2230,6 @@ int dbri_bopen(int dev, unsigned int chan, int hdlcmode, u_char xmit_idle_char) { struct dbri *dbri; - int val; if (dev >= num_drivers || chan > 1) { return -1; @@ -1563,7 +2307,7 @@ void dbri_brecv(int dev, unsigned int chan, recv_on_pipe(dbri, 8+chan, buffer, size, callback, callback_arg); } -#if defined(DBRI_ISDN) || defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff +#if defined(DBRI_ISDN) && defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x200ff struct foreign_interface dbri_foreign_interface = { dbri_get_irqnum, dbri_get_liu_state, @@ -1625,6 +2369,8 @@ static int dbri_attach(struct sparcaudio_driver *drv, "DBRI Registers", sdev->reg_addrs[0].which_io, 0); if (!dbri->regs) { printk(KERN_ERR "DBRI: could not allocate registers\n"); + release_region((unsigned long) dbri->dma, + sizeof(struct dbri_dma)); kfree(drv->private); return -EIO; } @@ -1637,6 +2383,8 @@ static int dbri_attach(struct sparcaudio_driver *drv, if (err) { printk(KERN_ERR "DBRI: Can't get irq %d\n", dbri->irq); sparc_free_io(dbri->regs, dbri->regs_size); + release_region((unsigned long) dbri->dma, + sizeof(struct dbri_dma)); kfree(drv->private); return err; } diff --git a/drivers/sbus/audio/dbri.h b/drivers/sbus/audio/dbri.h index 8a3dab4f7cdd..d27c0edf53e8 100644 --- a/drivers/sbus/audio/dbri.h +++ b/drivers/sbus/audio/dbri.h @@ -46,13 +46,20 @@ struct dbri_dma { struct dbri_mem desc[DBRI_NO_DESCS]; /* Xmit/receive descriptors */ }; +enum in_or_out { PIPEinput, PIPEoutput }; + +enum direction { in, out }; + struct dbri_pipe { + spinlock_t spinlock; u32 sdp; /* SDP command word */ + enum direction direction; int nextpipe; /* Next pipe in linked list */ + int prevpipe; int cycle; /* Offset of timeslot (bits) */ int length; /* Length of timeslot (bits) */ int desc; /* Index of active descriptor*/ - __u32 *recv_fixed_ptr; /* Ptr to receive fixed data */ + volatile __u32 *recv_fixed_ptr; /* Ptr to receive fixed data */ }; struct dbri_desc { @@ -79,13 +86,22 @@ struct dbri { int dbri_version; /* 'e' and up is OK */ int dbri_irqp; /* intr queue pointer */ + spinlock_t cmd_spinlock; + spinlock_t intr_spinlock; + + struct tq_struct process_interrupt_buffer_task; + struct dbri_pipe pipes[32]; /* DBRI's 32 data pipes */ struct dbri_desc descs[DBRI_NO_DESCS]; + int chi_in_pipe; + int chi_out_pipe; + int chi_bpf; + struct cs4215 mm; /* mmcodec special info */ #if 0 - struct wait_queue *wait, *int_wait; /* Where to sleep if busy */ + wait_queue_head_t wait, int_wait; /* Where to sleep if busy */ #endif struct audio_info perchip_info; @@ -190,7 +206,7 @@ struct dbri { /* Time Slot defines */ #define D_TS_LEN(v) ((v)<<24) /* Number of bits in this time slot */ #define D_TS_CYCLE(v) ((v)<<14) /* Bit Count at start of TS */ -#define D_TS_DI(v) (1<<13) /* Data Invert */ +#define D_TS_DI (1<<13) /* Data Invert */ #define D_TS_1CHANNEL (0<<10) /* Single Channel / Normal mode */ #define D_TS_MONITOR (2<<10) /* Monitor pipe */ #define D_TS_NONCONTIG (3<<10) /* Non contiguous mode */ @@ -218,8 +234,8 @@ struct dbri { #define D_NT_IFA (1<<10) /* Inhibit Final Activation */ #define D_NT_ACT (1<<9) /* Activate Interface */ #define D_NT_MFE (1<<8) /* Multiframe Enable */ -#define D_NT_RLB(v) (1<<5) /* Remote Loopback */ -#define D_NT_LLB(v) (1<<2) /* Local Loopback */ +#define D_NT_RLB(v) ((v)<<5) /* Remote Loopback */ +#define D_NT_LLB(v) ((v)<<2) /* Local Loopback */ #define D_NT_FACT (1<<1) /* Force Activation */ #define D_NT_ABV (1<<0) /* Activate Bipolar Violation */ diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c index 7d17e08ea4d8..598f3b1917ff 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c @@ -31,6 +31,7 @@ #define PROMLIB_INTERNAL +#include #include #include #include @@ -43,7 +44,10 @@ #include #include #include - +#ifdef CONFIG_PCI +#include +#include +#endif /* Private data kept by the driver for each descriptor. */ typedef struct openprom_private_data @@ -53,7 +57,7 @@ typedef struct openprom_private_data } DATA; /* ID of the PROM node containing all of the EEPROM options. */ -static int options_node = 0; +static int options_node; /* * Copy an openpromio structure into kernel space from user space. @@ -138,6 +142,7 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, unsigned long flags; int bufsize, len, error = 0; extern char saved_command_line[]; + static int cnt; if (cmd == OPROMSETOPT) bufsize = getstrings((void *)arg, &opp); @@ -194,8 +199,10 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, buf = opp->oprom_array + strlen(opp->oprom_array) + 1; len = opp->oprom_array + bufsize - buf; - printk(KERN_DEBUG "OPROMSETOPT%s %s='%s'\n", - (cmd == OPROMSETOPT) ? "" : "2", opp->oprom_array, buf); + if (cnt++ < 10) + printk(KERN_DEBUG "OPROMSETOPT%s %s='%s'\n", + (cmd == OPROMSETOPT) ? "" : "2", + opp->oprom_array, buf); save_and_cli(flags); error = prom_setprop(options_node, opp->oprom_array, @@ -208,6 +215,7 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, case OPROMNEXT: case OPROMCHILD: + case OPROMSETCUR: if (bufsize < sizeof(int)) { error = -EINVAL; break; @@ -216,10 +224,11 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, node = *((int *) opp->oprom_array); save_and_cli(flags); - if (cmd == OPROMNEXT) - node = __prom_getsibling(node); - else - node = __prom_getchild(node); + switch (cmd) { + case OPROMNEXT: node = __prom_getsibling(node); break; + case OPROMCHILD: node = __prom_getchild(node); break; + case OPROMSETCUR: break; + } restore_flags(flags); data->current_node = node; @@ -229,6 +238,39 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, error = copyout((void *)arg, opp, bufsize + sizeof(int)); break; + case OPROMPCI2NODE: + error = -EINVAL; + + if (bufsize >= 2*sizeof(int)) { +#ifdef CONFIG_PCI + struct pci_dev *pdev; + struct pcidev_cookie *pcp; + pdev = pci_find_slot (((int *) opp->oprom_array)[0], + ((int *) opp->oprom_array)[1]); + + pcp = pdev->sysdata; + if (pcp != NULL && pcp->prom_node != -1 && pcp->prom_node) { + node = pcp->prom_node; + data->current_node = node; + *((int *)opp->oprom_array) = node; + opp->oprom_size = sizeof(int); + error = copyout((void *)arg, opp, bufsize + sizeof(int)); + } +#endif + } + break; + + case OPROMPATH2NODE: + save_and_cli(flags); + node = prom_finddevice(opp->oprom_array); + restore_flags(flags); + data->current_node = node; + *((int *)opp->oprom_array) = node; + opp->oprom_size = sizeof(int); + + error = copyout((void *)arg, opp, bufsize + sizeof(int)); + break; + case OPROMGETBOOTARGS: buf = saved_command_line; @@ -248,11 +290,13 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file, case OPROMU2P: case OPROMGETCONS: case OPROMGETFBNAME: - printk(KERN_INFO "openprom_sunos_ioctl: unimplemented ioctl\n"); + if (cnt++ < 10) + printk(KERN_INFO "openprom_sunos_ioctl: unimplemented ioctl\n"); error = -EINVAL; break; default: - printk(KERN_INFO "openprom_sunos_ioctl: cmd 0x%X, arg 0x%lX\n", cmd, arg); + if (cnt++ < 10) + printk(KERN_INFO "openprom_sunos_ioctl: cmd 0x%X, arg 0x%lX\n", cmd, arg); error = -EINVAL; break; } @@ -315,6 +359,7 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file, int error, node, len; char *str, *tmp; char buffer[64]; + static int cnt; switch (cmd) { case OPIOCGET: @@ -459,7 +504,8 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file, return 0; default: - printk(KERN_INFO "openprom_bsd_ioctl: cmd 0x%X\n", cmd); + if (cnt++ < 10) + printk(KERN_INFO "openprom_bsd_ioctl: cmd 0x%X\n", cmd); return -EINVAL; } @@ -473,6 +519,7 @@ static int openprom_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg) { DATA *data = (DATA *) file->private_data; + static int cnt; switch (cmd) { case OPROMGETOPT: @@ -502,6 +549,9 @@ static int openprom_ioctl(struct inode * inode, struct file * file, case OPROMGETCONS: case OPROMGETFBNAME: case OPROMGETBOOTARGS: + case OPROMSETCUR: + case OPROMPCI2NODE: + case OPROMPATH2NODE: if ((file->f_mode & FMODE_READ) == 0) return -EPERM; return openprom_sunos_ioctl(inode, file, cmd, arg, 0); @@ -521,7 +571,8 @@ static int openprom_ioctl(struct inode * inode, struct file * file, return openprom_bsd_ioctl(inode,file,cmd,arg); default: - printk("openprom_ioctl: cmd 0x%X, arg 0x%lX\n", cmd, arg); + if (cnt++ < 10) + printk("openprom_ioctl: cmd 0x%X, arg 0x%lX\n", cmd, arg); return -EINVAL; } } diff --git a/drivers/sbus/char/zs.c b/drivers/sbus/char/zs.c index 9195f5a0e036..31cce21f5101 100644 --- a/drivers/sbus/char/zs.c +++ b/drivers/sbus/char/zs.c @@ -1,4 +1,4 @@ -/* $Id: zs.c,v 1.41 1999/04/16 16:22:27 jj Exp $ +/* $Id: zs.c,v 1.41.2.2 1999/09/21 15:50:45 davem Exp $ * zs.c: Zilog serial port driver for the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -439,6 +439,7 @@ static _INLINE_ void receive_chars(struct sun_serial *info, struct pt_regs *regs { struct tty_struct *tty = info->tty; unsigned char ch, stat; + int do_queue_task = 1; do { ch = (info->zs_channel->data) & info->parity_mask; @@ -466,11 +467,13 @@ static _INLINE_ void receive_chars(struct sun_serial *info, struct pt_regs *regs return; } sunkbd_inchar(ch, regs); - return; + do_queue_task = 0; + goto next_char; } if(info->cons_mouse) { sun_mouse_inbyte(ch); - return; + do_queue_task = 0; + goto next_char; } if(info->is_cons) { if(ch==0) { @@ -502,6 +505,7 @@ static _INLINE_ void receive_chars(struct sun_serial *info, struct pt_regs *regs *tty->flip.flag_buf_ptr++ = 0; *tty->flip.char_buf_ptr++ = ch; + next_char: /* Check if we have another character... */ stat = info->zs_channel->control; ZSDELAY(); @@ -512,7 +516,8 @@ static _INLINE_ void receive_chars(struct sun_serial *info, struct pt_regs *regs stat = read_zsreg(info->zs_channel, R1); } while (!(stat & (PAR_ERR | Rx_OVR | CRC_ERR))); - queue_task(&tty->flip.tqueue, &tq_timer); + if (do_queue_task != 0) + queue_task(&tty->flip.tqueue, &tq_timer); } static _INLINE_ void transmit_chars(struct sun_serial *info) @@ -1844,7 +1849,7 @@ int zs_open(struct tty_struct *tty, struct file * filp) static void show_serial_version(void) { - char *revision = "$Revision: 1.41 $"; + char *revision = "$Revision: 1.41.2.2 $"; char *version, *p; version = strchr(revision, ' '); diff --git a/drivers/scsi/Config.in b/drivers/scsi/Config.in index 40518b03b598..3460ab7430ef 100644 --- a/drivers/scsi/Config.in +++ b/drivers/scsi/Config.in @@ -75,6 +75,7 @@ if [ "$CONFIG_PARPORT" != "n" ]; then fi dep_tristate 'NCR53c406a SCSI support' CONFIG_SCSI_NCR53C406A $CONFIG_SCSI dep_tristate 'symbios 53c416 SCSI support' CONFIG_SCSI_SYM53C416 $CONFIG_SCSI +dep_tristate 'Simple 53c710 SCSI support (Compaq, NCR machines)' CONFIG_SCSI_SIM710 $CONFIG_SCSI if [ "$CONFIG_PCI" = "y" ]; then dep_tristate 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI if [ "$CONFIG_SCSI_NCR53C7xx" != "n" ]; then diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 2dbb8b70895f..c77a6ea63605 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -129,6 +129,14 @@ else endif endif +ifeq ($(CONFIG_SCSI_SIM710),y) +L_OBJS += sim710.o +else + ifeq ($(CONFIG_SCSI_SIM710),m) + M_OBJS += sim710.o + endif +endif + ifeq ($(CONFIG_A4000T_SCSI),y) L_OBJS += amiga7xx.o 53c7xx.o else @@ -654,6 +662,18 @@ include $(TOPDIR)/Rules.make 53c7xx.o : 53c7xx_d.h 53c7xx.c $(CC) $(CFLAGS) -c 53c7xx.c +sim710_d.h: sim710.scr script_asm.pl + ln -sf sim710.scr fake7.c +# $(CPP) -traditional -DCHIP=810 fake7.c | grep -v '^#' | perl -s script_asm.pl + $(CPP) -traditional -DCHIP=710 fake7.c | grep -v '^#' | perl -s script_asm.pl -ncr7x0_family + mv script.h sim710_d.h + mv scriptu.h sim710_u.h + rm fake7.c + +sim710_u.h: sim710_d.h + +sim710.o : sim710_d.h + initio.o: ini9100u.c i91uscsi.c $(CC) $(CFLAGS) -c ini9100u.c -o ini9100u.o $(CC) $(CFLAGS) -c i91uscsi.c -o i91uscsi.o diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c index 4893d61682ad..1c50e1fbf2a7 100644 --- a/drivers/scsi/eata.c +++ b/drivers/scsi/eata.c @@ -913,7 +913,7 @@ static inline int port_detect \ if (info.sign != EATA_SIGNATURE) return FALSE; if (DEV2H(info.data_len) < EATA_2_0A_SIZE) { - printk("%s: config structure size (%ld bytes) too short, detaching.\n", + printk("%s: config structure size (%d bytes) too short, detaching.\n", name, DEV2H(info.data_len)); return FALSE; } diff --git a/drivers/scsi/esp.c b/drivers/scsi/esp.c index 9f1ecba0d6da..969ca8d0e343 100644 --- a/drivers/scsi/esp.c +++ b/drivers/scsi/esp.c @@ -494,10 +494,10 @@ static void esp_reset_dma(struct Sparc_ESP *esp) esp->prev_hme_dmacsr = (DMA_PARITY_OFF|DMA_2CLKS|DMA_SCSI_DISAB|DMA_INT_ENAB); esp->prev_hme_dmacsr &= ~(DMA_ENABLE|DMA_ST_WRITE|DMA_BRST_SZ); - if(can_do_burst32) - esp->prev_hme_dmacsr |= DMA_BRST32; - else if(can_do_burst64) + if(can_do_burst64) esp->prev_hme_dmacsr |= DMA_BRST64; + else if(can_do_burst32) + esp->prev_hme_dmacsr |= DMA_BRST32; if(can_do_sbus64) esp->prev_hme_dmacsr |= DMA_SCSI_SBUS64; @@ -610,7 +610,7 @@ static void esp_reset_esp(struct Sparc_ESP *esp, struct Sparc_ESP_regs *eregs) case fas236: /* Fast 236 or HME */ eregs->esp_cfg2 = esp->config2; - for(i=0; i<8; i++) { + for(i=0; i<16; i++) { if(esp->erev == fashme) { unsigned char cfg3; @@ -635,7 +635,7 @@ static void esp_reset_esp(struct Sparc_ESP *esp, struct Sparc_ESP_regs *eregs) case fas100a: /* Fast 100a */ eregs->esp_cfg2 = esp->config2; - for(i=0; i<8; i++) + for(i=0; i<16; i++) esp->config3[i] |= ESP_CONFIG3_FCLOCK; eregs->esp_cfg3 = esp->prev_cfg3 = esp->config3[0]; esp->radelay = 32; @@ -968,7 +968,7 @@ esp_irq_acquired: } else { int target; - for(target=0; target<8; target++) + for(target=0; target<16; target++) esp->config3[target] = 0; eregs->esp_cfg3 = esp->prev_cfg3 = 0; if(ccf > ESP_CCF_F5) { @@ -1178,7 +1178,7 @@ static int esp_host_info(struct Sparc_ESP *esp, char *ptr, off_t offset, int len info.pos = 0; copy_info(&info, "Sparc ESP Host Adapter:\n"); - copy_info(&info, "\tPROM node\t\t%08lx\n", (unsigned long) esp->prom_node); + copy_info(&info, "\tPROM node\t\t%08x\n", (unsigned int) esp->prom_node); copy_info(&info, "\tPROM name\t\t%s\n", esp->prom_name); copy_info(&info, "\tESP Model\t\t"); switch(esp->erev) { @@ -3587,14 +3587,21 @@ static int check_multibyte_msg(struct Sparc_ESP *esp, bit = ESP_CONFIG3_FAST; else bit = ESP_CONFIG3_FSCSI; - if(period < 50) + if(period < 50) { + /* On FAS366, if using fast-20 synchronous transfers + * we need to make sure the REQ/ACK assert/deassert + * control bits are clear. + */ + if (esp->erev == fashme) + SDptr->sync_max_offset &= ~esp->radelay; esp->config3[SCptr->target] |= bit; - else + } else { esp->config3[SCptr->target] &= ~bit; + } eregs->esp_cfg3 = esp->prev_cfg3 = esp->config3[SCptr->target]; } - eregs->esp_soff = esp->prev_soff = SDptr->sync_min_period; - eregs->esp_stp = esp->prev_stp = SDptr->sync_max_offset; + eregs->esp_soff = esp->prev_soff = SDptr->sync_max_offset; + eregs->esp_stp = esp->prev_stp = SDptr->sync_min_period; ESPSDTR(("soff=%2x stp=%2x cfg3=%2x\n", SDptr->sync_max_offset, diff --git a/drivers/scsi/fcal.c b/drivers/scsi/fcal.c index 1979e5b366da..9239f1ff3430 100644 --- a/drivers/scsi/fcal.c +++ b/drivers/scsi/fcal.c @@ -223,7 +223,7 @@ int fcal_proc_info (char *buffer, char **start, off_t offset, int length, int ho fc = fcal->fc; #ifdef __sparc__ - SPRINTF ("Sun Enterprise Network Array (A5000 or E?500) on %s\n", fc->name); + SPRINTF ("Sun Enterprise Network Array (A5000 or E?500) on %s PROM node %x\n", fc->name, fc->dev->prom_node); #else SPRINTF ("Fibre Channel Arbitrated Loop on %s\n", fc->name); #endif diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index c4b5be3f16e5..557cb6594629 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -63,6 +63,10 @@ #include "bvme6000.h" #endif +#ifdef CONFIG_SCSI_SIM710 +#include "sim710.h" +#endif + #ifdef CONFIG_A3000_SCSI #include "a3000.h" #endif @@ -436,6 +440,9 @@ static Scsi_Host_Template builtin_scsi_hosts[] = #ifdef CONFIG_BVME6000_SCSI BVME6000_SCSI, #endif +#ifdef CONFIG_SCSI_SIM710 + SIM710_SCSI, +#endif #ifdef CONFIG_SCSI_ADVANSYS ADVANSYS, #endif diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index c7b95d337d39..ea201aca9173 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -93,6 +93,7 @@ ** 53C895 (Wide, Fast 40, on board rom BIOS) ** 53C895A (Wide, Fast 40, on board rom BIOS) ** 53C896 (Wide, Fast 40, on board rom BIOS) +** 53C1510D (Wide, Fast 40, on board rom BIOS) ** ** Other features: ** Memory mapped IO (linux-1.3.X and above only) diff --git a/drivers/scsi/pluto.c b/drivers/scsi/pluto.c index 09cfbeb876e1..eef8e234e32f 100644 --- a/drivers/scsi/pluto.c +++ b/drivers/scsi/pluto.c @@ -292,12 +292,16 @@ int pluto_release(struct Scsi_Host *host) const char *pluto_info(struct Scsi_Host *host) { - static char buf[80]; + static char buf[128], *p; struct pluto *pluto = (struct pluto *) host->hostdata; sprintf(buf, "SUN SparcSTORAGE Array %s fw %s serial %s %dx%d on %s", pluto->rev_str, pluto->fw_rev_str, pluto->serial_str, host->max_channel, host->max_id, pluto->fc->name); +#ifdef __sparc__ + p = strchr(buf, 0); + sprintf(p, " PROM node %x", pluto->fc->dev->prom_node); +#endif return buf; } diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c index 6def71bcb82b..bfb544475100 100644 --- a/drivers/scsi/qlogicpti.c +++ b/drivers/scsi/qlogicpti.c @@ -45,7 +45,7 @@ #define MAX_TARGETS 16 #define MAX_LUNS 8 -#define DEFAULT_LOOP_COUNT 1000000 +#define DEFAULT_LOOP_COUNT 10000 #include "qlogicpti_asm.c" @@ -129,11 +129,11 @@ const u_char mbox_param[] = { /* queue length's _must_ be power of two: */ #define QUEUE_DEPTH(in, out, ql) ((in - out) & (ql)) #define REQ_QUEUE_DEPTH(in, out) QUEUE_DEPTH(in, out, \ - QLOGICISP_REQ_QUEUE_LEN) + QLOGICPTI_REQ_QUEUE_LEN) #define RES_QUEUE_DEPTH(in, out) QUEUE_DEPTH(in, out, RES_QUEUE_LEN) static struct proc_dir_entry proc_scsi_qlogicpti = { - PROC_SCSI_QLOGICPTI, 7, "qlogicpti", + PROC_SCSI_QLOGICPTI, 9, "qlogicpti", S_IFDIR | S_IRUGO | S_IXUGO, 2 }; @@ -169,12 +169,17 @@ static int qlogicpti_mbox_command(struct qlogicpti *qpti, u_short param[], int f if(mbox_param[param[0]] == 0) return 1; + /* Set SBUS semaphore. */ + qpti->qregs->sbus_semaphore |= SBUS_SEMAPHORE_LCK; + + /* Wait for host IRQ bit to clear. */ loop_count = DEFAULT_LOOP_COUNT; while(--loop_count && (qregs->hcctrl & HCCTRL_HIRQ)) barrier(); if(!loop_count) printk(KERN_EMERG "qlogicpti: mbox_command loop timeout #1\n"); + /* Write mailbox command registers. */ switch(mbox_param[param[0]] >> 4) { case 6: qregs->mbox5 = param[5]; case 5: qregs->mbox4 = param[4]; @@ -184,27 +189,42 @@ static int qlogicpti_mbox_command(struct qlogicpti *qpti, u_short param[], int f case 1: qregs->mbox0 = param[0]; } + /* Clear RISC interrupt. */ + qpti->qregs->hcctrl |= HCCTRL_CRIRQ; + + /* Clear SBUS semaphore. */ + qpti->qregs->sbus_semaphore = 0; + + /* Set HOST interrupt. */ qregs->hcctrl |= HCCTRL_SHIRQ; + /* Wait for HOST interrupt clears. */ loop_count = DEFAULT_LOOP_COUNT; - while(--loop_count && !(qregs->sbus_semaphore & SBUS_SEMAPHORE_LCK)) + while(--loop_count && (qregs->hcctrl & HCCTRL_CRIRQ)) udelay(20); if(!loop_count) printk(KERN_EMERG "qlogicpti: mbox_command loop timeout #2\n"); + /* Wait for SBUS semaphore to get set. */ loop_count = DEFAULT_LOOP_COUNT; - while(--loop_count && (qregs->mbox0 == 0x04)) + while(--loop_count && !(qregs->sbus_semaphore & SBUS_SEMAPHORE_LCK)) { udelay(20); + + /* Workaround for some buggy chips. */ + if (qpti->qregs->mbox0 & 0x4000) + break; + } if(!loop_count) printk(KERN_EMERG "qlogicpti: mbox_command loop timeout #3\n"); - if(force) { - qregs->hcctrl = HCCTRL_CRIRQ; - } else { - if((qregs->mbox5 - qpti->res_out_ptr) == 0) - qregs->hcctrl = HCCTRL_CRIRQ; - } + /* Wait for MBOX busy condition to go away. */ + loop_count = DEFAULT_LOOP_COUNT; + while(--loop_count && (qregs->mbox0 == 0x04)) + udelay(20); + if(!loop_count) + printk(KERN_EMERG "qlogicpti: mbox_command loop timeout #4\n"); + /* Read back output parameters. */ switch(mbox_param[param[0]] & 0xf) { case 6: param[5] = qregs->mbox5; case 5: param[4] = qregs->mbox4; @@ -214,7 +234,13 @@ static int qlogicpti_mbox_command(struct qlogicpti *qpti, u_short param[], int f case 1: param[0] = qregs->mbox0; } + /* Clear RISC interrupt. */ + qregs->hcctrl |= HCCTRL_CRIRQ; + + /* Release SBUS semaphore. */ qregs->sbus_semaphore &= ~(SBUS_SEMAPHORE_LCK); + + /* We're done. */ return 0; } @@ -227,10 +253,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host) int loop_count, i; unsigned long flags; - if(qpti->is_pti != 0) - risc_code_addr = pti_risc_code_addr01; - else - risc_code_addr = sbus_risc_code_addr01; + risc_code_addr = 0x1000; /* all load addresses are at 0x1000 */ save_flags(flags); cli(); @@ -305,7 +328,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host) } param[0] = MBOX_INIT_REQ_QUEUE; - param[1] = QLOGICISP_REQ_QUEUE_LEN + 1; + param[1] = QLOGICPTI_REQ_QUEUE_LEN + 1; param[2] = (u_short) (qpti->req_dvma >> 16); param[3] = (u_short) (qpti->req_dvma & 0xffff); param[4] = param[5] = 0; @@ -342,11 +365,20 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host) param[0] = MBOX_SET_TARGET_PARAMS; param[1] = (i << 8); param[2] = (qpti->dev_param[i].device_flags << 8); - param[3] = (qpti->dev_param[i].synchronous_offset << 8) | - qpti->dev_param[i].synchronous_period; + if (qpti->is_pti == 0) /* really, is it 1.31 f/w or later? */ + param[2] |= 0xc0; + param[3] = 0; /* no sync mode at first */ qlogicpti_mbox_command(qpti, param, 0); } + /* + * Always (sigh) do an initial bus reset (kicks f/w). + */ + param[0] = MBOX_BUS_RESET; + param[1] = qpti->host_param.bus_reset_delay; + qlogicpti_mbox_command(qpti, param, 0); + qpti->send_marker = 1; + restore_flags(flags); return 0; } @@ -365,15 +397,9 @@ __initfunc(static int qlogicpti_load_firmware(struct qlogicpti *qpti)) #endif int i, timeout; - if(qpti->is_pti != 0) { - risc_code = &pti_risc_code01[0]; - risc_code_addr = pti_risc_code_addr01; - risc_code_length = pti_risc_code_length01; - } else { - risc_code = &sbus_risc_code01[0]; - risc_code_addr = sbus_risc_code_addr01; - risc_code_length = sbus_risc_code_length01; - } + risc_code = &sbus_risc_code01[0]; + risc_code_addr = 0x1000; /* all f/w modules load at 0x1000 */ + risc_code_length = sbus_risc_code_length01; save_flags(flags); cli(); @@ -502,6 +528,7 @@ __initfunc(static int qlogicpti_load_firmware(struct qlogicpti *qpti)) /* Snag the major and minor revisions from the result. */ qpti->fware_majrev = param[1]; qpti->fware_minrev = param[2]; + qpti->fware_micrev = param[3]; if(qpti->is_pti != 0) { /* Load scsi initiator ID and interrupt level into sbus static ram. */ @@ -569,12 +596,19 @@ static inline void qlogicpti_set_hostdev_defaults(struct qlogicpti *qpti) qpti->host_param.max_queue_depth = 256; for(i = 0; i < MAX_TARGETS; i++) { - qpti->dev_param[i].device_flags = 0xf9; + /* disconnect, parity, arq, reneg on reset */ + qpti->dev_param[i].device_flags = 0xc5; qpti->dev_param[i].execution_throttle = 16; - qpti->dev_param[i].synchronous_period = 16; - qpti->dev_param[i].synchronous_offset = 12; + if (qpti->ultra) { + qpti->dev_param[i].synchronous_period = 12; + qpti->dev_param[i].synchronous_offset = 8; + } else { + qpti->dev_param[i].synchronous_period = 16; + qpti->dev_param[i].synchronous_offset = 12; + } qpti->dev_param[i].device_enable = 1; } + qpti->sbits = 1 << qpti->host_param.initiator_scsi_id; } static void do_qlogicpti_intr_handler(int irq, void *dev_id, struct pt_regs *regs); @@ -656,6 +690,15 @@ __initfunc(int qlogicpti_detect(Scsi_Host_Template *tpnt)) sizeof(qpti->prom_name)); qpti->prom_node = qpti_node; + /* + * This is not correct, actually. There's a switch + * on the PTI cards that put them into "emulation" + * mode- i.e., report themselves as QLGC,isp + * instead of PTI,ptisp. The only real substantive + * difference between non-pti and pti cards is + * the tmon register. Which is possibly even + * there for Qlogic cards, but non-functional. + */ qpti->is_pti = is_pti = (strcmp (qpti->prom_name, "QLGC,isp") != 0); @@ -759,7 +802,7 @@ qpti_irq_acquired: qpti->res_cpu = sparc_dvma_malloc(QSIZE(RES_QUEUE_LEN), "PTISP Response Queue", &qpti->res_dvma); - qpti->req_cpu = sparc_dvma_malloc(QSIZE(QLOGICISP_REQ_QUEUE_LEN), + qpti->req_cpu = sparc_dvma_malloc(QSIZE(QLOGICPTI_REQ_QUEUE_LEN), "PTISP Request Queue", &qpti->req_dvma); @@ -770,9 +813,7 @@ qpti_irq_acquired: qlogicpti_set_hostdev_defaults(qpti); /* Load the firmware. */ - /* XXX Find out where is it possible to download - our sbus_risc_code on non-PTI ISP1000. */ - if(is_pti && qlogicpti_load_firmware(qpti)) + if(qlogicpti_load_firmware(qpti)) panic("SBUS Qlogic/ISP firmware load failed"); if (is_pti) { @@ -785,10 +826,9 @@ qpti_irq_acquired: if(qlogicpti_reset_hardware(qpti_host)) panic("PTI Qlogic/ISP cannot be reset"); - if (is_pti) { - printk("(Firmware v%d.%d)", - qpti->fware_majrev, qpti->fware_minrev); - } else { + printk("(Firmware v%d.%d.%d)", qpti->fware_majrev, + qpti->fware_minrev, qpti->fware_micrev); + { char buffer[60]; prom_getstring (qpti_node, "isp-fcode", buffer, 60); @@ -821,7 +861,7 @@ int qlogicpti_release(struct Scsi_Host *host) qregs->sbus_ctrl = 0; /* Free IRQ handler and unmap Qlogic,ISP and PTI status regs. */ - free_irq(host->irq, NULL); + free_irq(host->irq, qpti); unmapioaddr((unsigned long)qregs); /* QLGC,isp doesn't have status reg */ if (strcmp (qpti->prom_name, "QLGC,isp")) @@ -832,11 +872,11 @@ int qlogicpti_release(struct Scsi_Host *host) const char *qlogicpti_info(struct Scsi_Host *host) { - static char buf[80]; + static char buf[100]; struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; - sprintf(buf, "PTI Qlogic,ISP SBUS SCSI irq %s regs at %08lx", - __irq_itoa(qpti->qhost->irq), (unsigned long) qpti->qregs); + sprintf(buf, "PTI Qlogic,ISP SBUS SCSI irq %s regs at %08lx PROM node %x", + __irq_itoa(qpti->qhost->irq), (unsigned long) qpti->qregs, qpti->prom_node); return buf; } @@ -882,9 +922,9 @@ static inline void cmd_frob(struct Command_Entry *cmd, Scsi_Cmnd *Cmnd, } /* Do it to it baby. */ -static inline u_int load_cmd(Scsi_Cmnd *Cmnd, struct Command_Entry *cmd, - struct qlogicpti *qpti, struct qlogicpti_regs *qregs, - u_int in_ptr, u_int out_ptr) +static inline int load_cmd(Scsi_Cmnd *Cmnd, struct Command_Entry *cmd, + struct qlogicpti *qpti, struct qlogicpti_regs *qregs, + int in_ptr, u_int out_ptr) { struct dataseg * ds; struct scatterlist *sg; @@ -962,9 +1002,77 @@ static inline void update_can_queue(struct Scsi_Host *host, u_int in_ptr, u_int { /* Temporary workaround until bug is found and fixed (one bug has been found already, but fixing it makes things even worse) -jj */ - int num_free = QLOGICISP_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr) - 64; + int num_free = QLOGICPTI_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr) - 64; host->can_queue = host->host_busy + num_free; - host->sg_tablesize = QLOGICISP_MAX_SG(num_free); + host->sg_tablesize = QLOGICPTI_MAX_SG(num_free); +} + +/* + * Until we scan the entire bus with inquiries, go throught this fella... + */ +static void ourdone(Scsi_Cmnd *Cmnd) +{ + struct qlogicpti *qpti = (struct qlogicpti *) Cmnd->host->hostdata; + int tgt = Cmnd->target; + void (*done) (Scsi_Cmnd *); + done = (void (*)(Scsi_Cmnd *)) Cmnd->host_scribble; + Cmnd->host_scribble = NULL; + + if ((qpti->sbits & (1 << tgt)) == 0) { + if (Cmnd->cmnd[0] == 0x12 && host_byte(Cmnd->result) == DID_OK) { + unsigned char *iqd; + if (Cmnd->use_sg == 0) { + iqd = ((unsigned char *)Cmnd->buffer); + } else { + iqd = ((struct scatterlist *) Cmnd->request_buffer)->address; + } + /* Tags? */ + if (iqd[7] & 0x2) { + qpti->dev_param[tgt].device_flags |= 0x8; + } + /* Sync Mode? */ + if (iqd[7] & 0x10) { + qpti->dev_param[tgt].device_flags |= 0x10; + } else { + qpti->dev_param[tgt].synchronous_offset = 0; + qpti->dev_param[tgt].synchronous_period = 0; + } + /* Wide Capable? */ + if (iqd[7] & 0x20) { + qpti->dev_param[tgt].device_flags |= 0x20; + } + qpti->sbits |= (1 << tgt); + } else if (host_byte(Cmnd->result) != DID_OK) { + qpti->sbits |= (1 << tgt); + } + } + done(Cmnd); +} + +int qlogicpti_queuecommand_slow(Scsi_Cmnd *Cmnd, void (*done)(Scsi_Cmnd *)) +{ + struct qlogicpti *qpti = (struct qlogicpti *) Cmnd->host->hostdata; + /* check to see if we're done scanning */ + if (qpti->sbits == 0xffff) { + int i; + unsigned long flags; + save_flags(flags); cli(); + for(i = 0; i < MAX_TARGETS; i++) { + u_short param[6]; + param[0] = MBOX_SET_TARGET_PARAMS; + param[1] = (i << 8); + param[2] = (qpti->dev_param[i].device_flags << 8); + param[3] = (qpti->dev_param[i].synchronous_offset << 8)| + qpti->dev_param[i].synchronous_period; + qlogicpti_mbox_command(qpti, param, 0); + } + restore_flags(flags); + Cmnd->host->hostt->queuecommand = qlogicpti_queuecommand; + return qlogicpti_queuecommand(Cmnd, done); + } else { + Cmnd->host_scribble = (char *) done; + return qlogicpti_queuecommand(Cmnd, ourdone); + } } /* @@ -975,12 +1083,13 @@ static inline void update_can_queue(struct Scsi_Host *host, u_int in_ptr, u_int * * "This code must fly." -davem */ + int qlogicpti_queuecommand(Scsi_Cmnd *Cmnd, void (*done)(Scsi_Cmnd *)) { struct Scsi_Host *host = Cmnd->host; struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; struct qlogicpti_regs *qregs = qpti->qregs; - u_int in_ptr = qpti->req_in_ptr; + int in_ptr = qpti->req_in_ptr; u_int out_ptr = qregs->mbox4; struct Command_Entry *cmd = (struct Command_Entry *) &qpti->req_cpu[in_ptr]; @@ -1206,14 +1315,25 @@ int qlogicpti_abort(Scsi_Cmnd *Cmnd) struct Scsi_Host *host = Cmnd->host; struct qlogicpti *qpti = (struct qlogicpti *) host->hostdata; int return_status = SCSI_ABORT_SUCCESS; + u32 cmd_cookie; + int i; printk(KERN_WARNING "qlogicpti : Aborting cmd for tgt[%d] lun[%d]\n", (int)Cmnd->target, (int)Cmnd->lun); qlogicpti_disable_irqs(qpti->qregs); + + /* Find the 32-bit cookie we gave to the firmware for + * this command. + */ + for (i = 0; i < QLOGICPTI_REQ_QUEUE_LEN + 1; i++) + if (qpti->cmd_slots[i] == Cmnd) + break; + cmd_cookie = i; + param[0] = MBOX_ABORT; param[1] = (((u_short) Cmnd->target) << 8) | Cmnd->lun; - param[2] = ((unsigned int)((unsigned long)Cmnd)) >> 16; - param[3] = ((unsigned int)((unsigned long)Cmnd)) & 0xffff; + param[2] = cmd_cookie >> 16; + param[3] = cmd_cookie & 0xffff; if(qlogicpti_mbox_command(qpti, param, 0) || (param[0] != MBOX_COMMAND_COMPLETE)) { printk(KERN_EMERG "qlogicpti : scsi abort failure: %x\n", param[0]); diff --git a/drivers/scsi/qlogicpti.h b/drivers/scsi/qlogicpti.h index b58f4e28b025..8c920fd04273 100644 --- a/drivers/scsi/qlogicpti.h +++ b/drivers/scsi/qlogicpti.h @@ -149,8 +149,8 @@ struct qlogicpti_regs { * requests are queued serially and the scatter/gather limit is * determined for each queue request anew. */ -#define QLOGICISP_REQ_QUEUE_LEN 255 /* must be power of two - 1 */ -#define QLOGICISP_MAX_SG(ql) (4 + ((ql) > 0) ? 7*((ql) - 1) : 0) +#define QLOGICPTI_REQ_QUEUE_LEN 255 /* must be power of two - 1 */ +#define QLOGICPTI_MAX_SG(ql) (4 + ((ql) > 0) ? 7*((ql) - 1) : 0) #ifndef NULL #define NULL (0) @@ -160,6 +160,7 @@ int qlogicpti_detect(Scsi_Host_Template *); int qlogicpti_release(struct Scsi_Host *); const char * qlogicpti_info(struct Scsi_Host *); int qlogicpti_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); +int qlogicpti_queuecommand_slow(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); int qlogicpti_abort(Scsi_Cmnd *); int qlogicpti_reset(Scsi_Cmnd *, unsigned int); @@ -441,9 +442,9 @@ struct dev_param { #define RES_QUEUE_LEN 255 /* Must be power of two - 1 */ #define QUEUE_ENTRY_LEN 64 -#define NEXT_REQ_PTR(wheee) (((wheee) + 1) & QLOGICISP_REQ_QUEUE_LEN) +#define NEXT_REQ_PTR(wheee) (((wheee) + 1) & QLOGICPTI_REQ_QUEUE_LEN) #define NEXT_RES_PTR(wheee) (((wheee) + 1) & RES_QUEUE_LEN) -#define PREV_REQ_PTR(wheee) (((wheee) - 1) & QLOGICISP_REQ_QUEUE_LEN) +#define PREV_REQ_PTR(wheee) (((wheee) - 1) & QLOGICPTI_REQ_QUEUE_LEN) #define PREV_RES_PTR(wheee) (((wheee) - 1) & RES_QUEUE_LEN) struct pti_queue_entry { @@ -471,10 +472,10 @@ struct qlogicpti { * Ex000 sparc64 machines with >4GB of ram we just keep track of the * scsi command pointers here. This is essentially what Matt Jacob does. -DaveM */ - Scsi_Cmnd *cmd_slots[QLOGICISP_REQ_QUEUE_LEN + 1]; + Scsi_Cmnd *cmd_slots[QLOGICPTI_REQ_QUEUE_LEN + 1]; /* The rest of the elements are unimportant for performance. */ - u_char fware_majrev, fware_minrev; + u_char fware_majrev, fware_minrev, fware_micrev; struct Scsi_Host *qhost; struct linux_sbus_device *qdev; int qpti_id; @@ -496,6 +497,7 @@ struct qlogicpti { #define SREG_SPMASK 0x03 /* Mask for switch pack */ unsigned char swsreg; unsigned char is_pti; /* Non-zero if this is a PTI board. */ + unsigned short sbits; }; /* How to twiddle them bits... */ @@ -726,12 +728,12 @@ struct qlogicpti { detect: qlogicpti_detect, \ release: qlogicpti_release, \ info: qlogicpti_info, \ - queuecommand: qlogicpti_queuecommand, \ + queuecommand: qlogicpti_queuecommand_slow, \ abort: qlogicpti_abort, \ reset: qlogicpti_reset, \ - can_queue: QLOGICISP_REQ_QUEUE_LEN, \ + can_queue: QLOGICPTI_REQ_QUEUE_LEN, \ this_id: 7, \ - sg_tablesize: QLOGICISP_MAX_SG(QLOGICISP_REQ_QUEUE_LEN), \ + sg_tablesize: QLOGICPTI_MAX_SG(QLOGICPTI_REQ_QUEUE_LEN), \ cmd_per_lun: 1, \ use_clustering: DISABLE_CLUSTERING, \ use_new_eh_code: 0 \ diff --git a/drivers/scsi/qlogicpti_asm.c b/drivers/scsi/qlogicpti_asm.c index 0e82ea024300..1545b30681b4 100644 --- a/drivers/scsi/qlogicpti_asm.c +++ b/drivers/scsi/qlogicpti_asm.c @@ -1,2298 +1,1160 @@ -/* Version 1.24 Initiator Firmware (Aug 8, 1996) */ - -unsigned short pti_risc_code_addr01 = 0x1000; - -unsigned short pti_risc_code01[] __initdata = { - 0x0078, 0x1030, 0x0000, 0x231f, 0x0000, 0x12ff, 0x2043, 0x4f50, +/* Version 1.31.00 ISP1000 Initiator RISC firmware */ +unsigned short sbus_risc_code01[] __initdata = { + 0x0078, 0x1030, 0x0000, 0x2419, 0x0000, 0x12ff, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31, 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320, 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350, 0x3130, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, - 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3234, 0x2020, + 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3331, 0x2020, 0x20b9, 0x1212, 0x20c1, 0x0008, 0x2071, 0x0010, 0x70c3, 0x0004, - 0x20c9, 0x3eff, 0x2089, 0x10c5, 0x70c7, 0x4953, 0x70cb, 0x5020, + 0x20c9, 0x3fff, 0x2089, 0x10c8, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2031, 0x0030, - 0x2079, 0x3400, 0x7863, 0x0000, 0x2fa0, 0x2009, 0x032b, 0x2011, + 0x2079, 0x3500, 0x7863, 0x0000, 0x2fa0, 0x2009, 0x0327, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x1051, 0x789b, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0bb8, 0x2069, - 0x3440, 0x00a8, 0x1067, 0x681b, 0x003c, 0x0078, 0x1069, 0x681b, - 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, 0x680f, 0x0008, 0x6813, - 0x0005, 0x681f, 0x0000, 0x6823, 0x0006, 0x6817, 0x0008, 0x6827, - 0x0000, 0x2069, 0x3500, 0x2011, 0x0020, 0x2009, 0x0010, 0x680b, - 0x0c19, 0x680f, 0x0019, 0x6803, 0xdd00, 0x6807, 0x001a, 0x6a1a, - 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004, 0x8109, 0x00c0, 0x107f, - 0x2069, 0x3580, 0x20a9, 0x0080, 0x6837, 0x0000, 0x680b, 0x0040, - 0x6817, 0x0100, 0x681f, 0x0064, 0xade8, 0x0010, 0x0070, 0x10a2, - 0x0078, 0x1094, 0x1078, 0x1a17, 0x1078, 0x2e4c, 0x1078, 0x1670, - 0x1078, 0x32c0, 0x3200, 0xa085, 0x000d, 0x2090, 0x70c3, 0x0000, - 0x0090, 0x10b9, 0x70c0, 0xa086, 0x0002, 0x00c0, 0x10b9, 0x1078, - 0x11b8, 0x1078, 0x10e9, 0x1078, 0x17f8, 0x1078, 0x1989, 0x1078, - 0x3187, 0x1078, 0x1766, 0x0078, 0x10b9, 0x10cd, 0x10cf, 0x1b6c, - 0x1b6c, 0x2ea6, 0x2ea6, 0x1b6c, 0x1b6c, 0x0078, 0x10cd, 0x0078, - 0x10cf, 0x0078, 0x10d1, 0x0078, 0x10d3, 0x7008, 0x800c, 0x00c8, - 0x10e4, 0x7007, 0x0002, 0xa08c, 0x000c, 0x00c0, 0x10e5, 0x8004, - 0x8004, 0x00c8, 0x10e4, 0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, - 0x11bb, 0x0068, 0x1135, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, - 0x00c0, 0x1135, 0x7814, 0xa005, 0x00c0, 0x10fa, 0x0010, 0x1136, - 0x0078, 0x1135, 0x2009, 0x3468, 0x2104, 0xa005, 0x00c0, 0x1135, - 0x7814, 0xa086, 0x0001, 0x00c0, 0x1107, 0x1078, 0x1529, 0x7817, - 0x0000, 0x2009, 0x346f, 0x2104, 0xa065, 0x0040, 0x1123, 0x2009, - 0x346a, 0x211c, 0x8108, 0x2114, 0x8108, 0x2104, 0xa210, 0xa399, - 0x0000, 0x2009, 0x001c, 0x6083, 0x0103, 0x1078, 0x1600, 0x00c0, - 0x112f, 0x1078, 0x1667, 0x2009, 0x346f, 0x200b, 0x0000, 0x2009, - 0x3469, 0x2104, 0x200b, 0x0000, 0xa005, 0x0040, 0x1133, 0x2001, - 0x4005, 0x0078, 0x11ba, 0x0078, 0x11b8, 0x007c, 0x70c3, 0x0000, - 0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000, 0x70c0, 0xa0bc, - 0xffc0, 0x00c0, 0x1186, 0x2038, 0x0079, 0x1146, 0x11b8, 0x1203, - 0x11d1, 0x1203, 0x1254, 0x1254, 0x11c8, 0x157f, 0x125f, 0x11c4, - 0x11d5, 0x11d7, 0x11d9, 0x11db, 0x1584, 0x11c4, 0x1265, 0x1281, - 0x1537, 0x1579, 0x11dd, 0x1468, 0x148a, 0x14a2, 0x14c5, 0x1421, - 0x142f, 0x1443, 0x1457, 0x12ed, 0x11c4, 0x129d, 0x12a4, 0x12a9, - 0x12ae, 0x12b4, 0x12b9, 0x12be, 0x12c3, 0x12c8, 0x12cc, 0x12e1, - 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x12f9, 0x1302, 0x1311, - 0x1337, 0x1341, 0x1348, 0x136e, 0x137d, 0x138c, 0x139e, 0x1406, - 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x1416, 0xa0bc, 0xffa0, - 0x00c0, 0x11c4, 0x2038, 0xa084, 0x001f, 0x0079, 0x118f, 0x11c4, - 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, - 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, - 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, 0x11c4, - 0x11c4, 0x15dc, 0x15e6, 0x15ea, 0x15f8, 0x11c4, 0x11c4, 0x72ca, - 0x71c6, 0x2001, 0x4006, 0x0078, 0x11ba, 0x73ce, 0x72ca, 0x71c6, - 0x2001, 0x4000, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, - 0x5000, 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x11bb, - 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078, - 0x11b8, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x11b8, 0x0078, - 0x11b8, 0x0078, 0x11b8, 0x0078, 0x11b8, 0x2091, 0x8000, 0x70c3, - 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, - 0x0001, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031, - 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061, - 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091, - 0x4080, 0x0078, 0x0455, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, - 0x2098, 0x2031, 0x0030, 0x81ff, 0x0040, 0x11b8, 0x7007, 0x0004, - 0x731a, 0x721e, 0x2051, 0x0012, 0x2049, 0x1232, 0x2041, 0x11b8, - 0x7003, 0x0002, 0xa786, 0x0001, 0x00c0, 0x1224, 0x2049, 0x1240, - 0x2041, 0x124c, 0x7003, 0x0003, 0x7017, 0x0000, 0x810b, 0x7112, - 0x00c8, 0x122c, 0x7017, 0x0001, 0x7007, 0x0001, 0xa786, 0x0001, - 0x0040, 0x1240, 0x700c, 0xa084, 0x007f, 0x8004, 0x2009, 0x0020, - 0xa102, 0x0942, 0x094a, 0x20a8, 0x26a0, 0x53a6, 0x0078, 0x10d5, - 0x700c, 0xa084, 0x007f, 0x0040, 0x1240, 0x80ac, 0x0048, 0x1240, - 0x2698, 0x53a5, 0x0078, 0x10d5, 0x700c, 0xa084, 0x007f, 0x80ac, - 0x2698, 0x53a5, 0x0078, 0x11b8, 0x71c4, 0x70c8, 0x2114, 0xa79e, - 0x0004, 0x00c0, 0x125c, 0x200a, 0x72ca, 0x0078, 0x11b7, 0x70c7, - 0x0001, 0x70cb, 0x0018, 0x0078, 0x11b8, 0x70c4, 0x72c8, 0x73cc, - 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x127b, - 0x8001, 0x7872, 0x7a7a, 0x7b7e, 0x7c76, 0x7898, 0xa084, 0xfffc, - 0x789a, 0x0078, 0x127f, 0x7898, 0xa085, 0x0001, 0x789a, 0x0078, - 0x11b8, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, - 0x74d6, 0xa005, 0x0040, 0x1297, 0x8001, 0x7886, 0x7a8e, 0x7b92, - 0x7c8a, 0x7898, 0xa084, 0xfcff, 0x789a, 0x0078, 0x129b, 0x7898, - 0xa085, 0x0100, 0x789a, 0x0078, 0x11b8, 0x2009, 0x3459, 0x210c, - 0x2011, 0x042c, 0x0078, 0x11b6, 0x2009, 0x3441, 0x210c, 0x0078, - 0x11b7, 0x2009, 0x3442, 0x210c, 0x0078, 0x11b7, 0x2061, 0x3440, - 0x610c, 0x6210, 0x0078, 0x11b6, 0x2009, 0x3445, 0x210c, 0x0078, - 0x11b7, 0x2009, 0x3446, 0x210c, 0x0078, 0x11b7, 0x2009, 0x3447, - 0x210c, 0x0078, 0x11b7, 0x2009, 0x3448, 0x210c, 0x0078, 0x11b7, - 0x7908, 0x7a0c, 0x0078, 0x11b6, 0x71c4, 0x8107, 0xa084, 0x000f, - 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3500, 0x6a00, 0x6804, 0xa084, - 0x0008, 0x0040, 0x12de, 0x6b08, 0x0078, 0x12df, 0x6b0c, 0x0078, - 0x11b5, 0x77c4, 0x1078, 0x1681, 0x2091, 0x8000, 0x6b1c, 0x6a14, - 0x2091, 0x8001, 0x2708, 0x0078, 0x11b5, 0x77c4, 0x1078, 0x1681, - 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078, - 0x11b5, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11b0, 0x1078, 0x1a9b, - 0x0078, 0x11b5, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11b0, 0x2011, - 0x3441, 0x2204, 0x007e, 0x2112, 0x1078, 0x1a54, 0x017f, 0x0078, - 0x11b7, 0x71c4, 0x2011, 0x132f, 0x20a9, 0x0008, 0x2204, 0xa106, - 0x0040, 0x1321, 0x8210, 0x0070, 0x131f, 0x0078, 0x1316, 0x0078, - 0x11b0, 0xa292, 0x132f, 0x027e, 0x2011, 0x3442, 0x2204, 0x2112, - 0x017f, 0x007e, 0x1078, 0x1a60, 0x017f, 0x0078, 0x11b7, 0x03e8, - 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, - 0x3440, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078, - 0x11b6, 0x2061, 0x3440, 0x6114, 0x70c4, 0x6016, 0x0078, 0x11b7, - 0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, - 0x1361, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040, - 0x1361, 0x2011, 0x0006, 0x2019, 0x2323, 0xa186, 0x003c, 0x00c0, - 0x11b0, 0x2061, 0x3440, 0x6018, 0x007e, 0x611a, 0x23b8, 0x1078, - 0x1a71, 0x1078, 0x32c0, 0x017f, 0x0078, 0x11b7, 0x71c4, 0xa184, - 0xffcf, 0x00c0, 0x11b0, 0x2011, 0x3447, 0x2204, 0x2112, 0x007e, - 0x1078, 0x1a93, 0x017f, 0x0078, 0x11b7, 0x71c4, 0xa182, 0x0010, - 0x00c8, 0x11b0, 0x2011, 0x3448, 0x2204, 0x007e, 0x2112, 0x1078, - 0x1a82, 0x017f, 0x0078, 0x11b7, 0x71c4, 0x72c8, 0xa184, 0xfffd, - 0x00c0, 0x11af, 0xa284, 0xfffd, 0x00c0, 0x11af, 0x2100, 0x7908, - 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x11b6, 0x71c4, 0x8107, - 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3500, 0x2019, - 0x0000, 0x72c8, 0x6800, 0x007e, 0xa226, 0x0040, 0x13cd, 0x6a02, - 0xa484, 0x2000, 0x0040, 0x13b6, 0xa39d, 0x0010, 0xa484, 0x1000, - 0x0040, 0x13bc, 0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x13cd, - 0x810f, 0xa284, 0x4000, 0x0040, 0x13c9, 0x1078, 0x1ab5, 0x0078, - 0x13cd, 0x1078, 0x1aa7, 0x0078, 0x13cd, 0x72cc, 0x82ff, 0x0040, - 0x13ff, 0x6808, 0xa206, 0x0040, 0x13ff, 0xa2a4, 0x00ff, 0x2061, - 0x3440, 0x6118, 0xa186, 0x0028, 0x0040, 0x13e6, 0xa186, 0x0032, - 0x0040, 0x13ec, 0xa186, 0x003c, 0x0040, 0x13f2, 0xa482, 0x0064, - 0x0048, 0x13fc, 0x0078, 0x13f6, 0xa482, 0x0050, 0x0048, 0x13fc, - 0x0078, 0x13f6, 0xa482, 0x0043, 0x0048, 0x13fc, 0x71c4, 0x71c6, - 0x027f, 0x72ca, 0x0078, 0x11b1, 0x6a0a, 0xa39d, 0x000a, 0x6804, - 0xa305, 0x6806, 0x027f, 0x6b0c, 0x0078, 0x11b5, 0x77c4, 0x1078, - 0x1681, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, - 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x11b5, 0x71c4, 0x72c8, - 0x73cc, 0xa182, 0x0010, 0x00c8, 0x11b0, 0x1078, 0x1ac3, 0x0078, - 0x11b5, 0x77c4, 0x1078, 0x1681, 0x2091, 0x8000, 0x6a08, 0xa295, - 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x11b6, 0x77c4, - 0x1078, 0x1681, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, - 0x6804, 0xa005, 0x0040, 0x143e, 0x1078, 0x19f8, 0x2091, 0x8001, - 0x2708, 0x0078, 0x11b6, 0x77c4, 0x1078, 0x1681, 0x2091, 0x8000, - 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1452, - 0x1078, 0x19f8, 0x2091, 0x8001, 0x2708, 0x0078, 0x11b6, 0x77c4, - 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, - 0x1078, 0x168e, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x11b6, - 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca, 0x73ce, 0x1078, 0x1707, - 0x00c0, 0x1486, 0x6818, 0xa005, 0x0040, 0x1480, 0x2708, 0x1078, - 0x1ad3, 0x00c0, 0x1480, 0x7817, 0xffff, 0x2091, 0x8001, 0x007c, - 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x11ba, 0x2091, 0x8001, - 0x0078, 0x11b8, 0x77c4, 0x77c6, 0x2061, 0x3440, 0x60a3, 0x0003, - 0x67b6, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, - 0x8000, 0x1078, 0x168e, 0x2091, 0x8001, 0x7817, 0xffff, 0x1078, - 0x19f8, 0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, - 0x2061, 0x3440, 0x60a3, 0x0002, 0x67b6, 0x7817, 0xffff, 0x1078, - 0x19f8, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x2091, - 0x8000, 0x1078, 0x168e, 0x70c8, 0x6836, 0x8738, 0xa784, 0x0007, - 0x00c0, 0x14b9, 0x2091, 0x8001, 0x007c, 0x7898, 0xa084, 0x0003, - 0x00c0, 0x14e9, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, - 0x2051, 0x0008, 0x1078, 0x1681, 0x2091, 0x8000, 0x6808, 0xa80d, - 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x0007, 0x00c0, 0x14d2, - 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, - 0x14d2, 0x2091, 0x8000, 0x2069, 0x0100, 0x6830, 0xa084, 0x0040, - 0x0040, 0x1512, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, - 0x0004, 0x0040, 0x14ff, 0x0070, 0x14ff, 0x0078, 0x14f6, 0x684b, - 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x150c, - 0x0070, 0x150c, 0x0078, 0x1503, 0x20a9, 0x00fa, 0x0070, 0x1512, - 0x0078, 0x150e, 0x2079, 0x3400, 0x7817, 0x0001, 0x2061, 0x3440, - 0x60a3, 0x0001, 0x60c3, 0x000f, 0x7898, 0xa085, 0x0002, 0x789a, - 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0046, 0x2091, 0x8001, - 0x007c, 0x7898, 0xa084, 0xfffd, 0x789a, 0xa084, 0x0001, 0x00c0, - 0x1533, 0x1078, 0x1749, 0x71c4, 0x71c6, 0x794a, 0x007c, 0x74c4, - 0x73c8, 0x72cc, 0x74c6, 0x73ca, 0x72ce, 0x2079, 0x3400, 0x2009, - 0x0040, 0x1078, 0x165e, 0x0040, 0x1575, 0x1078, 0x162e, 0x0040, - 0x154d, 0x1078, 0x1667, 0x0078, 0x1575, 0x6010, 0x7817, 0xffff, - 0x2009, 0x3468, 0x200b, 0x0005, 0x8108, 0x200b, 0x0000, 0x8108, - 0x230a, 0x8108, 0x220a, 0x8108, 0x240a, 0x8108, 0x200a, 0x8108, - 0x200b, 0x0000, 0x8108, 0x2c0a, 0xa02e, 0x2530, 0x0e7e, 0x1078, - 0x2e25, 0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000, - 0x60af, 0x0000, 0x1078, 0x19f8, 0x007c, 0x70c3, 0x4005, 0x0078, - 0x11bb, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x11b8, 0x71c4, - 0x71c6, 0x2168, 0x0078, 0x1586, 0x2069, 0x1000, 0x690c, 0xa016, - 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1588, 0xa285, 0x0000, - 0x00c0, 0x1596, 0x70c3, 0x4000, 0x0078, 0x1598, 0x70c3, 0x4003, - 0x70ca, 0x0078, 0x11bb, 0x71c4, 0x72c8, 0x73cc, 0x2100, 0xa184, - 0xfffc, 0x00c0, 0x11c4, 0x2100, 0x0079, 0x15a6, 0x15bd, 0x15d2, - 0x15d4, 0x15d6, 0x70c3, 0x4003, 0x71ce, 0x72d2, 0x73d6, 0x0078, - 0x15b9, 0x70c3, 0x4000, 0x70cf, 0x0000, 0x70d3, 0x0000, 0x70d7, - 0x0000, 0x77c6, 0x71ca, 0x0078, 0x11b8, 0x2031, 0x15d8, 0x2624, - 0x8630, 0x2412, 0x2204, 0xa446, 0x00c0, 0x15aa, 0xa484, 0xffff, - 0x00c0, 0x15bf, 0x2031, 0x15d8, 0x8210, 0x8319, 0xa384, 0xffff, - 0x00c0, 0x15bf, 0x0078, 0x15b1, 0x0078, 0x15b1, 0x0078, 0x15b1, - 0x5555, 0xaaaa, 0xffff, 0x0000, 0x7960, 0x71c6, 0x71c4, 0xa182, - 0x0003, 0x00c8, 0x11b0, 0x7962, 0x0078, 0x11b8, 0x7960, 0x71c6, - 0x0078, 0x11b8, 0x7954, 0x71c6, 0x71c4, 0x7956, 0x7958, 0x71ca, - 0x71c8, 0x795a, 0x795c, 0x71ce, 0x71cc, 0x795e, 0x0078, 0x11b8, - 0x7954, 0x71c6, 0x7958, 0x71ca, 0x795c, 0x71ce, 0x0078, 0x11b8, - 0x700c, 0xa084, 0x007f, 0x0040, 0x160c, 0x7007, 0x0004, 0x7004, - 0xa084, 0x0004, 0x00c0, 0x1607, 0x7017, 0x0000, 0x7112, 0x721a, - 0x731e, 0x8108, 0x810c, 0x81a9, 0x8c98, 0x20a1, 0x0030, 0x6080, - 0x20a2, 0x53a6, 0x780c, 0xa085, 0x0000, 0x7002, 0x7007, 0x0001, - 0x7108, 0x8104, 0x00c8, 0x1620, 0x7007, 0x0002, 0xa184, 0x000c, - 0x710c, 0xa184, 0x0300, 0x7003, 0x0000, 0x007c, 0x700c, 0xa084, - 0x007f, 0x0040, 0x163a, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, - 0x00c0, 0x1635, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e, 0x2099, - 0x0030, 0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, - 0x0001, 0x7008, 0x800c, 0x00c8, 0x1649, 0x7007, 0x0002, 0xa08c, - 0x000c, 0x00c0, 0x165b, 0x710c, 0xa184, 0x0300, 0x00c0, 0x165b, - 0x2ca0, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x7850, 0xa065, - 0x0040, 0x1666, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, 0x0f7e, - 0x2079, 0x3400, 0x7850, 0x2062, 0x2c00, 0x7852, 0x0f7f, 0x007c, - 0x2011, 0x3f00, 0x7a52, 0x2019, 0x042c, 0x8319, 0x0040, 0x167e, - 0xa280, 0x002e, 0x2012, 0x2010, 0x0078, 0x1675, 0x2013, 0x0000, - 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, 0x0007, 0x8003, 0x8003, - 0x8003, 0x8003, 0xa105, 0xa0e8, 0x3580, 0x007c, 0x1078, 0x1681, - 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, - 0x690a, 0x2009, 0x344f, 0x210c, 0x6804, 0xa005, 0x0040, 0x16ab, - 0xa116, 0x00c0, 0x16ab, 0x2060, 0x6000, 0x6806, 0x017e, 0x200b, - 0x0000, 0x0078, 0x16ae, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, - 0x0040, 0x16bd, 0x6000, 0x6806, 0x1078, 0x16ce, 0x1078, 0x17ac, - 0x6810, 0x8001, 0x6812, 0x00c0, 0x16ae, 0x017f, 0x6902, 0x6906, - 0x007c, 0xa065, 0x0040, 0x16cd, 0x6098, 0x609b, 0x0000, 0x2008, - 0x1078, 0x1667, 0x2100, 0x0078, 0x16c1, 0x007c, 0x6003, 0x0103, - 0x20a9, 0x001c, 0xac80, 0x0004, 0x20a0, 0x2001, 0x0000, 0x40a4, - 0x6828, 0x6016, 0x682c, 0x601e, 0x007c, 0x0e7e, 0x2071, 0x3440, - 0x7040, 0xa08c, 0x0080, 0x00c0, 0x16eb, 0xa088, 0x3480, 0x2d0a, - 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x3440, - 0x2009, 0x3480, 0x7240, 0x8221, 0x8211, 0x0048, 0x1705, 0x2104, - 0x8108, 0xad06, 0x00c0, 0x16f4, 0x8119, 0x211e, 0x8108, 0x8318, - 0x8211, 0x00c8, 0x16fd, 0x7442, 0xa006, 0x0e7f, 0x007c, 0x1078, - 0x1681, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040, 0x1748, - 0x0078, 0x1718, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040, 0x1748, - 0x600c, 0xa306, 0x00c0, 0x1712, 0x6008, 0xa206, 0x00c0, 0x1712, - 0x2c28, 0x6804, 0xac06, 0x00c0, 0x172f, 0x6000, 0x2060, 0x6806, - 0xa005, 0x00c0, 0x172f, 0x6803, 0x0000, 0x0078, 0x1739, 0x6400, - 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1739, 0x2c00, - 0x6802, 0x2560, 0x1078, 0x16ce, 0x6017, 0x0005, 0x601f, 0x0020, - 0x1078, 0x17ac, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff, 0xa005, - 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, - 0x0008, 0x2091, 0x8000, 0x1078, 0x168e, 0x8738, 0xa784, 0x0007, - 0x00c0, 0x1753, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, - 0x0f00, 0x00c0, 0x1753, 0x2091, 0x8001, 0x007c, 0x2061, 0x0000, - 0x6018, 0xa084, 0x0001, 0x00c0, 0x1773, 0x78ac, 0x78af, 0x0000, - 0xa005, 0x00c0, 0x1774, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x177a, - 0x1078, 0x1b4e, 0x0079, 0x177c, 0x178c, 0x178e, 0x1794, 0x1798, - 0x178c, 0x179c, 0x178c, 0x178c, 0x178c, 0x178c, 0x17a2, 0x17a6, - 0x178c, 0x178c, 0x178c, 0x178c, 0x1078, 0x1b4e, 0x1078, 0x1749, - 0x2001, 0x8001, 0x0078, 0x11ba, 0x2001, 0x8003, 0x0078, 0x11ba, - 0x2001, 0x8004, 0x0078, 0x11ba, 0x1078, 0x1749, 0x2001, 0x8006, - 0x0078, 0x11ba, 0x2001, 0x800c, 0x0078, 0x11ba, 0x1078, 0x1749, - 0x2001, 0x800d, 0x0078, 0x11ba, 0x2c04, 0x6082, 0x2c08, 0x2063, - 0x0000, 0x7864, 0x8000, 0x7866, 0x7868, 0xa005, 0x796a, 0x0040, - 0x17bc, 0x2c02, 0x0078, 0x17bd, 0x796e, 0x007c, 0x0c7e, 0x2061, - 0x3400, 0x6883, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6064, 0x8000, - 0x6066, 0x6068, 0xa005, 0x616a, 0x0040, 0x17d1, 0x2d02, 0x0078, - 0x17d2, 0x616e, 0x0c7f, 0x007c, 0x1078, 0x17e5, 0x0040, 0x17e4, - 0x0c7e, 0x6098, 0xa065, 0x0040, 0x17df, 0x1078, 0x16c1, 0x0c7f, - 0x609b, 0x0000, 0x1078, 0x1667, 0x007c, 0x786c, 0xa065, 0x0040, - 0x17f7, 0x2091, 0x8000, 0x7864, 0x8001, 0x7866, 0x2c04, 0x786e, - 0xa005, 0x00c0, 0x17f5, 0x786a, 0x8000, 0x2091, 0x8001, 0x007c, - 0x7898, 0xa005, 0x00c0, 0x1846, 0x7974, 0x70d0, 0x0005, 0x0005, - 0x72d0, 0xa206, 0x00c0, 0x17fd, 0x2200, 0xa106, 0x00c0, 0x1814, - 0x7804, 0xa005, 0x0040, 0x1846, 0x7807, 0x0000, 0x0068, 0x1846, - 0x2091, 0x4080, 0x0078, 0x1846, 0x1078, 0x165e, 0x0040, 0x1846, - 0x7a7c, 0x7b78, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, 0x0000, - 0x2009, 0x0040, 0x1078, 0x162e, 0x0040, 0x183d, 0x1078, 0x1667, - 0x7880, 0x8000, 0x7882, 0xa086, 0x0002, 0x00c0, 0x1846, 0x2091, - 0x8000, 0x78af, 0x0002, 0x7883, 0x0000, 0x7898, 0xa085, 0x0003, - 0x789a, 0x2091, 0x8001, 0x0078, 0x1846, 0x7883, 0x0000, 0x1078, - 0x1973, 0x6000, 0xa084, 0x0007, 0x0079, 0x1847, 0x007c, 0x184f, - 0x185e, 0x187e, 0x184f, 0x1890, 0x184f, 0x184f, 0x184f, 0x2039, - 0x0400, 0x78a8, 0xa705, 0x78aa, 0x6004, 0xa705, 0x6006, 0x1078, - 0x18ce, 0x6018, 0x78a6, 0x1078, 0x195b, 0x007c, 0x78a8, 0xa084, - 0x0100, 0x0040, 0x1865, 0x0078, 0x184f, 0x78ab, 0x0000, 0x6000, - 0x8007, 0xa084, 0x00ff, 0x789e, 0x8001, 0x609b, 0x0000, 0x0040, - 0x187b, 0x1078, 0x18ce, 0x0040, 0x187b, 0x78a8, 0xa085, 0x0100, - 0x78aa, 0x0078, 0x187d, 0x1078, 0x18f2, 0x007c, 0x78a8, 0xa08c, - 0x0e00, 0x00c0, 0x1887, 0xa084, 0x0100, 0x00c0, 0x1889, 0x0078, - 0x184f, 0x1078, 0x18ce, 0x00c0, 0x188f, 0x1078, 0x18f2, 0x007c, - 0x78a8, 0xa084, 0x0100, 0x0040, 0x1897, 0x0078, 0x184f, 0x78ab, - 0x0000, 0x6710, 0x20a9, 0x0001, 0x6014, 0xa084, 0x00ff, 0xa005, - 0x0040, 0x18b4, 0xa7bc, 0xff00, 0x20a9, 0x0008, 0xa08e, 0x0001, - 0x0040, 0x18b4, 0x2039, 0x0000, 0x20a9, 0x0080, 0xa08e, 0x0002, - 0x0040, 0x18b4, 0x0078, 0x18cb, 0x1078, 0x1681, 0x2d00, 0x2091, - 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde, - 0x680a, 0x2d00, 0xa080, 0x0010, 0x2068, 0x2091, 0x8001, 0x0070, - 0x18cb, 0x0078, 0x18b7, 0x1078, 0x1667, 0x007c, 0x78a0, 0xa06d, - 0x00c0, 0x18d9, 0x2c00, 0x78a2, 0x78a6, 0x609b, 0x0000, 0x0078, - 0x18e5, 0x2c00, 0x689a, 0x609b, 0x0000, 0x78a2, 0x2d00, 0x6002, - 0x78a4, 0xad06, 0x00c0, 0x18e5, 0x6002, 0x789c, 0x8001, 0x789e, - 0x00c0, 0x18f1, 0x78a8, 0xa084, 0x0000, 0x78aa, 0x78a4, 0x2060, - 0xa006, 0x007c, 0xa02e, 0x2530, 0x6118, 0xa184, 0x0060, 0x619e, - 0x0040, 0x18fe, 0x0e7e, 0x1078, 0x2e25, 0x0e7f, 0x6592, 0x65a2, - 0x6696, 0x66a6, 0x60ab, 0x0000, 0x60af, 0x0000, 0x6710, 0x1078, - 0x1681, 0x2091, 0x8000, 0x6808, 0xa084, 0x0001, 0x0040, 0x1920, - 0x2091, 0x8001, 0x1078, 0x16ce, 0x2091, 0x8000, 0x1078, 0x17ac, - 0x2091, 0x8001, 0x78a3, 0x0000, 0x78a7, 0x0000, 0x0078, 0x195a, - 0x6020, 0xa096, 0x0001, 0x00c0, 0x1927, 0x8000, 0x6022, 0x6a10, - 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x1936, 0x0040, 0x1936, - 0x2039, 0x0200, 0x1078, 0x195b, 0x0078, 0x195a, 0x2c08, 0x2091, - 0x8000, 0x6800, 0xa065, 0x0040, 0x193e, 0x6102, 0x6902, 0x00c0, - 0x1942, 0x6906, 0x2160, 0x6003, 0x0000, 0x6810, 0x8000, 0x6812, - 0x2091, 0x8001, 0x6808, 0xa08c, 0x0040, 0x0040, 0x1954, 0xa086, - 0x0040, 0x680a, 0x1078, 0x16dd, 0x1078, 0x19f8, 0x78a7, 0x0000, - 0x78a3, 0x0000, 0x007c, 0x6004, 0xa705, 0x6006, 0x2091, 0x8000, - 0x1078, 0x17ac, 0x2091, 0x8001, 0x78a4, 0xa065, 0x0040, 0x196e, - 0x6098, 0x78a6, 0x609b, 0x0000, 0x0078, 0x195e, 0x78a3, 0x0000, - 0x78a7, 0x0000, 0x007c, 0x7970, 0x7874, 0x8000, 0xa10a, 0x00c8, - 0x197a, 0xa006, 0x7876, 0x70d2, 0x7804, 0xa005, 0x0040, 0x1988, - 0x8001, 0x7806, 0x00c0, 0x1988, 0x0068, 0x1988, 0x2091, 0x4080, - 0x007c, 0x0068, 0x19a1, 0x2029, 0x0000, 0x786c, 0xa065, 0x0040, - 0x199c, 0x1078, 0x19a2, 0x0040, 0x199c, 0x1078, 0x19b8, 0x00c0, - 0x199c, 0x8528, 0x0078, 0x198d, 0x85ff, 0x0040, 0x19a1, 0x2091, - 0x4080, 0x007c, 0x7b84, 0x7988, 0x72d4, 0x0005, 0x0005, 0x70d4, - 0xa206, 0x00c0, 0x19a4, 0x2200, 0xa102, 0x00c0, 0x19b2, 0x2300, - 0xa005, 0x007c, 0x0048, 0x19b6, 0xa302, 0x007c, 0x8002, 0x007c, - 0x1078, 0x19ea, 0x2009, 0x001c, 0x6024, 0xa005, 0x0040, 0x19c2, - 0x2009, 0x0040, 0x1078, 0x1600, 0x0040, 0x19db, 0x7894, 0x8000, - 0x7896, 0xa086, 0x0002, 0x00c0, 0x19e9, 0x2091, 0x8000, 0x78af, - 0x0003, 0x7897, 0x0000, 0x7898, 0xa085, 0x0300, 0x789a, 0x2091, - 0x8001, 0x0078, 0x19e9, 0x7897, 0x0000, 0x1078, 0x17d4, 0x7984, - 0x7888, 0x8000, 0xa10a, 0x00c8, 0x19e6, 0xa006, 0x788a, 0x70d6, - 0xa006, 0x007c, 0x8107, 0x8004, 0x8004, 0x7a90, 0x7b8c, 0xa210, - 0xa399, 0x0000, 0x007c, 0x2009, 0x3468, 0x2091, 0x8000, 0x200a, - 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3440, 0x2091, 0x8000, 0x2104, - 0xa086, 0x0000, 0x00c0, 0x1a13, 0x2009, 0x3412, 0x2104, 0xa005, - 0x00c0, 0x1a13, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1a13, 0x0018, - 0x1a13, 0x781b, 0x0044, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x127e, - 0x2091, 0x2300, 0x2071, 0x3440, 0x2079, 0x0100, 0x2019, 0x2d1f, - 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040, 0x1a2f, 0x789a, 0x8318, - 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318, 0x0078, 0x1a22, 0x789b, - 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x0220, 0x0070, - 0x1a3b, 0x0078, 0x1a33, 0x7003, 0x0000, 0x1078, 0x1b3a, 0x7004, - 0xa084, 0x000f, 0xa085, 0x6280, 0x7806, 0x780f, 0x9200, 0x7843, - 0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7047, 0x347f, 0x7043, - 0x0000, 0x127f, 0x2000, 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, - 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x1b3a, 0x007c, - 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x1a69, 0x0078, - 0x1a64, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, - 0x007c, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, 0x1a7a, - 0x0078, 0x1a75, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, - 0x200a, 0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, - 0x1a8b, 0x0078, 0x1a86, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, - 0xa105, 0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, - 0xa105, 0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, - 0x2061, 0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, - 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, - 0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, - 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, - 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, - 0x2061, 0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, - 0x2018, 0x0c7f, 0x007c, 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, - 0x1b16, 0x2061, 0x3e80, 0x1078, 0x1b1c, 0x0040, 0x1b04, 0x20a9, - 0x0000, 0x2061, 0x3d80, 0x0c7e, 0x1078, 0x1b1c, 0x0040, 0x1af0, - 0x0c7f, 0x8c60, 0x0070, 0x1aee, 0x0078, 0x1ae3, 0x0078, 0x1b16, - 0x007f, 0xa082, 0x3d80, 0x2071, 0x3440, 0x70ba, 0x601c, 0xa085, - 0x0800, 0x601e, 0x2091, 0x8001, 0x71b6, 0x2001, 0x0004, 0x70a2, - 0x1078, 0x19f3, 0x0078, 0x1b12, 0x2071, 0x3440, 0x601c, 0xa085, - 0x0800, 0x601e, 0x2091, 0x8001, 0x71b6, 0x2001, 0x0006, 0x70a2, - 0x1078, 0x19f3, 0x2001, 0x0000, 0x0078, 0x1b18, 0x2001, 0x0001, - 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x2c04, 0xa005, - 0x0040, 0x1b35, 0x2060, 0x600c, 0xa306, 0x00c0, 0x1b32, 0x6008, - 0xa206, 0x00c0, 0x1b32, 0x6010, 0xa106, 0x00c0, 0x1b32, 0xa006, - 0x0078, 0x1b39, 0x6000, 0x0078, 0x1b1f, 0xa085, 0x0001, 0x2091, - 0x8001, 0x007c, 0x2011, 0x3441, 0x220c, 0xa18c, 0x000f, 0x2011, - 0x013b, 0x2204, 0xa084, 0x0100, 0x0040, 0x1b4d, 0x2019, 0x0112, - 0x201b, 0x1000, 0x2021, 0xff80, 0x2122, 0x007c, 0x0068, 0x1b4e, - 0x007e, 0x2071, 0x0000, 0x7018, 0xa084, 0x0001, 0x00c0, 0x1b53, - 0x007f, 0x2e08, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, - 0x8002, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x007f, - 0x2070, 0x007f, 0x0078, 0x1b6a, 0x107e, 0x007e, 0x127e, 0x2091, - 0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0xa594, 0x003f, 0xa484, - 0x4000, 0x0040, 0x1b81, 0xa784, 0x007c, 0x00c0, 0x2ceb, 0x1078, - 0x1b4e, 0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x1b89, 0x1078, - 0x1b4e, 0x8507, 0xa084, 0x000f, 0x0079, 0x1b8e, 0x1f8e, 0x202f, - 0x2055, 0x226e, 0x24d4, 0x251c, 0x2555, 0x25d0, 0x262a, 0x26ae, - 0x1bb4, 0x1b9e, 0x1df7, 0x1ec1, 0x24b3, 0x1b9e, 0x1078, 0x1b4e, - 0x0018, 0x1b71, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, - 0x7003, 0x0000, 0x703f, 0x0000, 0x7030, 0xa005, 0x0040, 0x1bb2, - 0x7033, 0x0000, 0x0018, 0x1b71, 0x705c, 0xa005, 0x00c0, 0x1c5b, - 0x70a0, 0xa084, 0x0007, 0x0079, 0x1bbd, 0x1c7a, 0x1bc5, 0x1bd3, - 0x1bf4, 0x1c1a, 0x1c46, 0x1c44, 0x1bc5, 0x7808, 0xa084, 0xfffd, - 0x780a, 0x2009, 0x0046, 0x1078, 0x2393, 0x00c0, 0x1bd1, 0x7003, - 0x0004, 0x0078, 0x1ba0, 0x1078, 0x2cad, 0x00c0, 0x1bf2, 0x70b4, - 0x8007, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0x78ab, 0x000c, - 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009, 0x00f7, - 0x1078, 0x2391, 0x00c0, 0x1bf2, 0x7003, 0x0004, 0x70c3, 0x000f, - 0x7033, 0x3470, 0x0078, 0x1ba0, 0x1078, 0x2cad, 0x00c0, 0x1c18, - 0x71b4, 0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, - 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, - 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078, 0x2391, - 0x00c0, 0x1c18, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033, 0x3470, - 0x0078, 0x1ba0, 0x1078, 0x2cad, 0x00c0, 0x1c42, 0x71b4, 0x8107, - 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, - 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d, - 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00f7, - 0x1078, 0x2391, 0x00c0, 0x1c42, 0x7003, 0x0004, 0x70c3, 0x000f, - 0x7033, 0x3470, 0x0078, 0x1ba0, 0x0078, 0x1bf4, 0x1078, 0x2cad, - 0x00c0, 0x1ba0, 0x70bc, 0x2068, 0x789b, 0x0010, 0x6810, 0xa084, - 0x0007, 0xa085, 0x0080, 0x78aa, 0x6e18, 0x2041, 0x0001, 0x2001, - 0x0004, 0x0078, 0x1d82, 0x1078, 0x2cad, 0x00c0, 0x1ba0, 0x789b, - 0x0010, 0x705c, 0x2068, 0x6f10, 0x1078, 0x2bfc, 0x6008, 0xa085, - 0x0010, 0x600a, 0x6810, 0xa084, 0x0007, 0xa085, 0x0080, 0x78aa, - 0x2031, 0x0020, 0x2041, 0x0001, 0x1078, 0x2d0c, 0x2001, 0x0003, - 0x0078, 0x1d6d, 0x0018, 0x1b71, 0x7440, 0xa485, 0x0000, 0x0040, - 0x1c94, 0xa080, 0x3480, 0x2030, 0x7144, 0x8108, 0xa12a, 0x0048, - 0x1c8b, 0x2009, 0x3480, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x1ca1, - 0x8421, 0x00c0, 0x1c85, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000, - 0x0078, 0x1ba0, 0x7640, 0xa6b0, 0x3480, 0x7144, 0x2600, 0x0078, - 0x1c90, 0x7146, 0x2568, 0x2558, 0x753e, 0x2c50, 0x6034, 0xa085, - 0x0000, 0x00c0, 0x1c9e, 0x6708, 0x7736, 0xa784, 0x013f, 0x0040, - 0x1cd3, 0xa784, 0x0021, 0x00c0, 0x1c9e, 0xa784, 0x0002, 0x0040, - 0x1cc0, 0xa784, 0x0004, 0x0040, 0x1c9e, 0xa7bc, 0xfffb, 0x670a, - 0xa784, 0x0008, 0x00c0, 0x1c9e, 0xa784, 0x0010, 0x00c0, 0x1c9e, - 0xa784, 0x0100, 0x0040, 0x1cd3, 0x6018, 0xa005, 0x00c0, 0x1c9e, - 0xa7bc, 0xfeff, 0x670a, 0x681f, 0x0000, 0x6e18, 0xa684, 0x000e, - 0x6118, 0x0040, 0x1ce3, 0x601c, 0xa102, 0x0048, 0x1ce6, 0x0040, - 0x1ce6, 0x0078, 0x1c9a, 0x81ff, 0x00c0, 0x1c9a, 0xa784, 0x0080, - 0x00c0, 0x1cec, 0x700c, 0x6022, 0xa7bc, 0xff7f, 0x670a, 0x6b10, - 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3500, - 0x2060, 0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x2a60, - 0x0018, 0x1b71, 0x789b, 0x0010, 0xa046, 0x1078, 0x2cad, 0x00c0, - 0x1ba0, 0x6b10, 0xa39c, 0x0007, 0xa39d, 0x00c0, 0x704c, 0xa084, - 0x8000, 0x0040, 0x1d17, 0xa684, 0x0001, 0x0040, 0x1d19, 0xa39c, - 0xffbf, 0xa684, 0x0010, 0x0040, 0x1d1f, 0xa39d, 0x0020, 0x7baa, - 0x8840, 0xa684, 0x000e, 0x00c0, 0x1d2a, 0xa7bd, 0x0010, 0x670a, - 0x0078, 0x1d6b, 0x714c, 0xa18c, 0x0800, 0x0040, 0x2870, 0x2011, - 0x0021, 0x8004, 0x8004, 0x0048, 0x1d41, 0x2011, 0x0022, 0x8004, - 0x0048, 0x1d41, 0x2011, 0x0020, 0x8004, 0x0048, 0x1d41, 0x0040, - 0x1d6b, 0x7aaa, 0x8840, 0x1078, 0x2cc6, 0x6a10, 0x610c, 0x8108, - 0xa18c, 0x00ff, 0xa1e0, 0x3d80, 0x2c64, 0x8cff, 0x0040, 0x1d62, - 0x6010, 0xa206, 0x00c0, 0x1d4c, 0x60b4, 0x8001, 0x60b6, 0x00c0, - 0x1d47, 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, - 0x0078, 0x1c7a, 0x1078, 0x2cad, 0x00c0, 0x1ba0, 0x2a60, 0x610e, - 0x79aa, 0x8840, 0x712e, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184, - 0x0018, 0x0040, 0x1d81, 0xa184, 0x0010, 0x0040, 0x1d7b, 0x1078, - 0x2a33, 0x00c0, 0x1d81, 0xa184, 0x0008, 0x0040, 0x1d81, 0x1078, - 0x294d, 0x007f, 0x7002, 0xa68c, 0x0060, 0x88ff, 0x0040, 0x1d8a, - 0xa18d, 0x0004, 0x795a, 0x69b2, 0x789b, 0x0060, 0x2800, 0x78aa, - 0x789b, 0x0061, 0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, 0x157e, - 0x137e, 0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, - 0xad80, 0x000a, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6810, - 0x8007, 0x789b, 0x007e, 0x78aa, 0x6d90, 0x7dd6, 0x7dde, 0x6e94, - 0x7ed2, 0x7eda, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1db9, 0x0098, - 0x1dc1, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2cc6, 0x0078, - 0x1ba8, 0x7200, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1dce, - 0x781b, 0x0049, 0x1078, 0x2cc6, 0x0078, 0x1ddf, 0x6ab0, 0xa295, - 0x2000, 0x7a5a, 0x781b, 0x0049, 0x1078, 0x2cc6, 0x7200, 0x2500, - 0xa605, 0x0040, 0x1ddf, 0xa284, 0x0007, 0x1079, 0x1ded, 0xad80, - 0x0008, 0x7032, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1deb, - 0x6018, 0x8000, 0x601a, 0x0078, 0x1ba0, 0x1df5, 0x2ffc, 0x2ffc, - 0x2feb, 0x2ffc, 0x1df5, 0x1df5, 0x1df5, 0x1078, 0x1b4e, 0x7808, - 0xa084, 0xfffd, 0x780a, 0x0f7e, 0x2079, 0x3400, 0x7898, 0x0f7f, - 0xa084, 0x0001, 0x0040, 0x1e1d, 0x70a0, 0xa086, 0x0001, 0x00c0, - 0x1e0c, 0x70a2, 0x0078, 0x1ea5, 0x70a0, 0xa086, 0x0005, 0x00c0, - 0x1e1b, 0x70bc, 0x2068, 0x6817, 0x0004, 0x6813, 0x0000, 0x681c, - 0xa085, 0x0008, 0x681e, 0x70a3, 0x0000, 0x157e, 0x2011, 0x0004, - 0x71a0, 0xa186, 0x0001, 0x0040, 0x1e3f, 0xa186, 0x0007, 0x00c0, - 0x1e2f, 0x2009, 0x342b, 0x200b, 0x0005, 0x0078, 0x1e3f, 0x2009, - 0x3413, 0x2104, 0x2009, 0x3412, 0x200a, 0x2009, 0x342b, 0x200b, - 0x0001, 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x1e41, 0x70a3, - 0x0000, 0x1078, 0x2e0e, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078, - 0x2b01, 0xa7b8, 0x0100, 0x0070, 0x1e4f, 0x0078, 0x1e47, 0x7000, - 0x2020, 0x0079, 0x1e53, 0x1e81, 0x1e6a, 0x1e6a, 0x1e5d, 0x1e81, - 0x1e81, 0x1e5b, 0x1e5b, 0x1078, 0x1b4e, 0x2021, 0x3457, 0x2404, - 0xa005, 0x0040, 0x1e6a, 0xad06, 0x00c0, 0x1e6a, 0x6800, 0x2022, - 0x0078, 0x1e7a, 0x681c, 0xa084, 0x0001, 0x00c0, 0x1e76, 0x6f10, - 0x1078, 0x2bfc, 0x1078, 0x283d, 0x0078, 0x1e7a, 0x7054, 0x2060, - 0x6800, 0x6002, 0x6a16, 0x681c, 0xa085, 0x0008, 0x681e, 0x1078, - 0x17be, 0x2021, 0x3e80, 0x1078, 0x1eab, 0x2021, 0x3457, 0x1078, - 0x1eab, 0x20a9, 0x0000, 0x2021, 0x3d80, 0x1078, 0x1eab, 0x8420, - 0x0070, 0x1e94, 0x0078, 0x1e8d, 0x20a9, 0x0080, 0x2061, 0x3580, - 0x6018, 0x6110, 0xa102, 0x6012, 0x601b, 0x0000, 0xace0, 0x0010, - 0x0070, 0x1ea4, 0x0078, 0x1e98, 0x157f, 0x7003, 0x0000, 0x703f, - 0x0000, 0x0078, 0x1ba0, 0x047e, 0x2404, 0xa005, 0x0040, 0x1ebd, - 0x2068, 0x6800, 0x007e, 0x6a16, 0x681c, 0xa085, 0x0008, 0x681e, - 0x1078, 0x17be, 0x007f, 0x0078, 0x1ead, 0x047f, 0x2023, 0x0000, - 0x007c, 0xa282, 0x0003, 0x0050, 0x1ec7, 0x1078, 0x1b4e, 0x2300, - 0x0079, 0x1eca, 0x1ecd, 0x1f40, 0x1f4e, 0xa282, 0x0002, 0x0040, - 0x1ed3, 0x1078, 0x1b4e, 0x70a0, 0x70a3, 0x0000, 0x70c3, 0x0000, - 0x0079, 0x1eda, 0x1ee2, 0x1ee2, 0x1ee4, 0x1f18, 0x287b, 0x1ee2, - 0x1f18, 0x1ee2, 0x1078, 0x1b4e, 0x77b4, 0x1078, 0x2b01, 0x77b4, - 0xa7bc, 0x0f00, 0x1078, 0x2bfc, 0x6018, 0xa005, 0x0040, 0x1f0f, - 0x2021, 0x3e80, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x1f69, - 0x0040, 0x1f0f, 0x157e, 0x20a9, 0x0000, 0x2021, 0x3d80, 0x047e, - 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x1f69, 0x047f, 0x0040, - 0x1f0e, 0x8420, 0x0070, 0x1f0e, 0x0078, 0x1eff, 0x157f, 0x8738, - 0xa784, 0x0007, 0x00c0, 0x1eea, 0x0078, 0x1ba8, 0x0078, 0x1ba8, - 0x77b4, 0x1078, 0x2bfc, 0x6018, 0xa005, 0x0040, 0x1f3e, 0x2021, - 0x3e80, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x1f69, 0x0040, - 0x1f3e, 0x157e, 0x20a9, 0x0000, 0x2021, 0x3d80, 0x047e, 0x2009, - 0x0005, 0x2011, 0x0020, 0x1078, 0x1f69, 0x047f, 0x0040, 0x1f3d, - 0x8420, 0x0070, 0x1f3d, 0x0078, 0x1f2e, 0x157f, 0x0078, 0x1ba8, - 0x2200, 0x0079, 0x1f43, 0x1f46, 0x1f48, 0x1f48, 0x1078, 0x1b4e, - 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x1ba0, 0x2200, 0x0079, - 0x1f51, 0x1f56, 0x1f48, 0x1f54, 0x1078, 0x1b4e, 0x1078, 0x23a0, - 0x7000, 0xa086, 0x0001, 0x00c0, 0x2813, 0x1078, 0x2853, 0x6008, - 0xa084, 0xffef, 0x600a, 0x1078, 0x2806, 0x0040, 0x2813, 0x0078, - 0x1c7a, 0x2404, 0xa005, 0x0040, 0x1f8a, 0x2068, 0x2d04, 0x007e, - 0x6810, 0xa706, 0x0040, 0x1f78, 0x2d20, 0x007f, 0x0078, 0x1f6a, - 0x007f, 0x2022, 0x6916, 0x681c, 0xa205, 0x681e, 0x1078, 0x17be, - 0x6010, 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, - 0x2853, 0x007c, 0xa085, 0x0001, 0x0078, 0x1f89, 0x2300, 0x0079, - 0x1f91, 0x1f96, 0x1f94, 0x1fd5, 0x1078, 0x1b4e, 0x78e4, 0xa005, - 0x00d0, 0x1fb9, 0x0018, 0x1fb9, 0x2008, 0xa084, 0x0030, 0x00c0, - 0x1fa5, 0x781b, 0x0049, 0x0078, 0x1ba0, 0x78ec, 0xa084, 0x0003, - 0x0040, 0x1fa1, 0x2100, 0xa084, 0x0007, 0x0079, 0x1faf, 0x1fc3, - 0x1fc9, 0x1fbd, 0x1fb7, 0x2ca7, 0x2ca7, 0x1fb7, 0x1fcf, 0x1078, - 0x1b4e, 0x2001, 0x0003, 0x0078, 0x2282, 0x1078, 0x2ae4, 0x781b, - 0x0055, 0x0078, 0x1ba0, 0x1078, 0x2ae4, 0x781b, 0x00dc, 0x0078, - 0x1ba0, 0x1078, 0x2ae4, 0x781b, 0x00e3, 0x0078, 0x1ba0, 0x1078, - 0x2ae4, 0x781b, 0x009d, 0x0078, 0x1ba0, 0xa584, 0x000f, 0x00c0, - 0x1ff4, 0x1078, 0x23a0, 0x7000, 0x0079, 0x1fde, 0x1fe6, 0x1fe8, - 0x1fe6, 0x2813, 0x2813, 0x2813, 0x1fe6, 0x1fe6, 0x1078, 0x1b4e, - 0x1078, 0x2853, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2806, - 0x0040, 0x2813, 0x0078, 0x1c7a, 0x78e4, 0xa005, 0x00d0, 0x1fb9, - 0x0018, 0x1fb9, 0x2008, 0xa084, 0x0030, 0x00c0, 0x2003, 0x781b, - 0x0049, 0x0078, 0x1ba0, 0x78ec, 0xa084, 0x0003, 0x0040, 0x1fff, - 0x2100, 0xa184, 0x0007, 0x0079, 0x200d, 0x201d, 0x2023, 0x2017, - 0x2015, 0x2ca7, 0x2ca7, 0x2015, 0x2c9f, 0x1078, 0x1b4e, 0x1078, - 0x2aec, 0x781b, 0x0055, 0x0078, 0x1ba0, 0x1078, 0x2aec, 0x781b, - 0x00dc, 0x0078, 0x1ba0, 0x1078, 0x2aec, 0x781b, 0x00e3, 0x0078, - 0x1ba0, 0x1078, 0x2aec, 0x781b, 0x009d, 0x0078, 0x1ba0, 0x2300, - 0x0079, 0x2032, 0x2037, 0x2035, 0x2039, 0x1078, 0x1b4e, 0x0078, - 0x25d0, 0x6817, 0x0008, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, - 0x0040, 0x25d0, 0x78ec, 0xa084, 0x0003, 0x0040, 0x25d0, 0xa184, - 0x0007, 0x0079, 0x204b, 0x1fc3, 0x1fc9, 0x1fbd, 0x2c7f, 0x2ca7, - 0x2ca7, 0x2053, 0x2c9f, 0x1078, 0x1b4e, 0xa282, 0x0005, 0x0050, - 0x205b, 0x1078, 0x1b4e, 0x2300, 0x0079, 0x205e, 0x2061, 0x2256, - 0x2262, 0x2200, 0x0079, 0x2064, 0x2069, 0x206b, 0x207e, 0x2069, - 0x223b, 0x1078, 0x1b4e, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, - 0xa082, 0x0020, 0x0048, 0x2ac5, 0xa08a, 0x0004, 0x00c8, 0x2ac5, - 0x0079, 0x207a, 0x2ac5, 0x2ac5, 0x2ac5, 0x2a73, 0x789b, 0x0018, - 0x79a8, 0xa184, 0x0080, 0x0040, 0x2093, 0xa184, 0x0018, 0x0040, - 0x208f, 0x0078, 0x2ac5, 0x7000, 0xa005, 0x00c0, 0x2089, 0x2011, - 0x0003, 0x0078, 0x26bc, 0xa184, 0x00ff, 0xa08a, 0x0010, 0x00c8, - 0x2ac5, 0x0079, 0x209b, 0x20ad, 0x20ab, 0x20c3, 0x20c5, 0x214a, - 0x2ac5, 0x2ac5, 0x214c, 0x2ac5, 0x2ac5, 0x2237, 0x2237, 0x2ac5, - 0x2ac5, 0x2ac5, 0x2239, 0x1078, 0x1b4e, 0xa684, 0x1000, 0x0040, - 0x20ba, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, 0x781b, 0x009a, - 0x0078, 0x1ba0, 0x6814, 0xa084, 0x8000, 0x0040, 0x20c1, 0x6817, - 0x0003, 0x0078, 0x2c7f, 0x1078, 0x1b4e, 0x691c, 0x691e, 0xa684, - 0x1800, 0x00c0, 0x20df, 0x681c, 0xa084, 0x0001, 0x00c0, 0x20e7, - 0x6814, 0xa086, 0x0008, 0x00c0, 0x20d7, 0x6817, 0x0000, 0xa684, - 0x0400, 0x0040, 0x2146, 0x781b, 0x0058, 0x0078, 0x1ba0, 0xa684, - 0x1000, 0x0040, 0x20e7, 0x781b, 0x0058, 0x0078, 0x1ba0, 0xa684, - 0x0060, 0x0040, 0x2142, 0xa684, 0x0800, 0x0040, 0x2142, 0xa684, - 0x8000, 0x00c0, 0x20f5, 0x0078, 0x210f, 0xa6b4, 0x7fff, 0x7e5a, - 0x6eb2, 0x789b, 0x0074, 0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, - 0x2102, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b94, - 0x2100, 0xa302, 0x68ae, 0x6b90, 0x2200, 0xa303, 0x68aa, 0xa684, - 0x4000, 0x0040, 0x2117, 0xa6b4, 0xbfff, 0x7e5a, 0x6eb2, 0xa006, - 0x1078, 0x30a0, 0x6aac, 0x69a8, 0x6c94, 0x6b90, 0x2200, 0xa105, - 0x0040, 0x2126, 0x2200, 0xa422, 0x2100, 0xa31b, 0x7cd2, 0x7bd6, - 0x2300, 0xa405, 0x00c0, 0x2134, 0xa6b5, 0x4000, 0x7e5a, 0x6eb2, - 0x781b, 0x0067, 0x0078, 0x1ba0, 0x781b, 0x0067, 0x2200, 0xa115, - 0x00c0, 0x213e, 0x1078, 0x2ffc, 0x0078, 0x1ba0, 0x1078, 0x3029, - 0x0078, 0x1ba0, 0x781b, 0x006a, 0x0078, 0x1ba0, 0x781b, 0x0058, - 0x0078, 0x1ba0, 0x1078, 0x1b4e, 0x0078, 0x21a9, 0x691c, 0xa184, - 0x0100, 0x0040, 0x2164, 0xa18c, 0xfeff, 0x691e, 0x0c7e, 0x7048, + 0x3540, 0x00a8, 0x106a, 0x681b, 0x003c, 0x2009, 0x1313, 0x21b8, + 0x0078, 0x106c, 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, + 0x680f, 0x0008, 0x6813, 0x0005, 0x681f, 0x0000, 0x6823, 0x0006, + 0x6817, 0x0008, 0x6827, 0x0000, 0x2069, 0x3600, 0x2011, 0x0020, + 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f, 0x0019, 0x6803, 0xdd00, + 0x6807, 0x001a, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004, + 0x8109, 0x00c0, 0x1082, 0x2069, 0x3680, 0x20a9, 0x0080, 0x6837, + 0x0000, 0x680b, 0x0040, 0x6817, 0x0100, 0x681f, 0x0064, 0xade8, + 0x0010, 0x0070, 0x10a5, 0x0078, 0x1097, 0x1078, 0x1a38, 0x1078, + 0x2f3a, 0x1078, 0x1681, 0x1078, 0x33ba, 0x3200, 0xa085, 0x000d, + 0x2090, 0x70c3, 0x0000, 0x0090, 0x10bc, 0x70c0, 0xa086, 0x0002, + 0x00c0, 0x10bc, 0x1078, 0x11ba, 0x1078, 0x10ec, 0x1078, 0x1817, + 0x1078, 0x19a8, 0x1078, 0x327d, 0x1078, 0x177d, 0x0078, 0x10bc, + 0x10d0, 0x10d2, 0x1bc3, 0x1bc3, 0x2f98, 0x2f98, 0x1bc3, 0x1bc3, + 0x0078, 0x10d0, 0x0078, 0x10d2, 0x0078, 0x10d4, 0x0078, 0x10d6, + 0x7008, 0x800c, 0x00c8, 0x10e7, 0x7007, 0x0002, 0xa08c, 0x000c, + 0x00c0, 0x10e8, 0x8004, 0x8004, 0x00c8, 0x10e7, 0x087a, 0x097a, + 0x70c3, 0x4002, 0x0078, 0x11bd, 0x7814, 0xa005, 0x00c0, 0x10f4, + 0x0010, 0x1130, 0x0078, 0x112f, 0x2009, 0x3568, 0x2104, 0xa005, + 0x00c0, 0x112f, 0x7814, 0xa086, 0x0001, 0x00c0, 0x1101, 0x1078, + 0x1536, 0x7817, 0x0000, 0x2009, 0x356f, 0x2104, 0xa065, 0x0040, + 0x111d, 0x2009, 0x356a, 0x211c, 0x8108, 0x2114, 0x8108, 0x2104, + 0xa210, 0xa399, 0x0000, 0x2009, 0x001c, 0x6083, 0x0103, 0x1078, + 0x1611, 0x00c0, 0x1129, 0x1078, 0x1678, 0x2009, 0x356f, 0x200b, + 0x0000, 0x2009, 0x3569, 0x2104, 0x200b, 0x0000, 0xa005, 0x0040, + 0x112d, 0x2001, 0x4005, 0x0078, 0x11bc, 0x0078, 0x11ba, 0x007c, + 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, 0x0040, 0x1138, 0x007c, + 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000, + 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1188, 0x2038, 0x0079, 0x1148, + 0x11ba, 0x1205, 0x11d3, 0x1205, 0x1256, 0x1256, 0x11ca, 0x1590, + 0x1261, 0x11c6, 0x11d7, 0x11d9, 0x11db, 0x11dd, 0x1595, 0x11c6, + 0x1267, 0x1283, 0x1544, 0x158a, 0x11df, 0x146b, 0x148d, 0x14a7, + 0x14d0, 0x1424, 0x1432, 0x1446, 0x145a, 0x12ef, 0x11c6, 0x129f, + 0x12a6, 0x12ab, 0x12b0, 0x12b6, 0x12bb, 0x12c0, 0x12c5, 0x12ca, + 0x12ce, 0x12e3, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x12fb, + 0x1304, 0x1313, 0x1339, 0x1343, 0x134a, 0x1370, 0x137f, 0x138e, + 0x13a0, 0x1409, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x1419, + 0xa0bc, 0xffa0, 0x00c0, 0x11c6, 0x2038, 0xa084, 0x001f, 0x0079, + 0x1191, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, + 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, + 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, 0x11c6, + 0x11c6, 0x11c6, 0x11c6, 0x15ed, 0x15f7, 0x15fb, 0x1609, 0x11c6, + 0x11c6, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x11bc, 0x73ce, + 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x2061, 0x0000, 0x601b, + 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001, + 0x0078, 0x11bd, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, + 0x53a3, 0x0078, 0x11ba, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, + 0x11ba, 0x0078, 0x11ba, 0x0078, 0x11ba, 0x0078, 0x11ba, 0x2091, + 0x8000, 0x70c3, 0x0000, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, + 0x2020, 0x70d3, 0x0001, 0x3f00, 0x70d6, 0x2079, 0x0000, 0x781b, + 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x0457, 0x2051, + 0x0470, 0x2061, 0x0472, 0x20b9, 0xffff, 0x20c1, 0x0000, 0x2091, + 0x5000, 0x2091, 0x4080, 0x0078, 0x0455, 0x71d0, 0x72c8, 0x73cc, + 0x70c4, 0x20a0, 0x2098, 0x2031, 0x0030, 0x81ff, 0x0040, 0x11ba, + 0x7007, 0x0004, 0x731a, 0x721e, 0x2051, 0x0012, 0x2049, 0x1234, + 0x2041, 0x11ba, 0x7003, 0x0002, 0xa786, 0x0001, 0x00c0, 0x1226, + 0x2049, 0x1242, 0x2041, 0x124e, 0x7003, 0x0003, 0x7017, 0x0000, + 0x810b, 0x7112, 0x00c8, 0x122e, 0x7017, 0x0001, 0x7007, 0x0001, + 0xa786, 0x0001, 0x0040, 0x1242, 0x700c, 0xa084, 0x007f, 0x8004, + 0x2009, 0x0020, 0xa102, 0x0942, 0x094a, 0x20a8, 0x26a0, 0x53a6, + 0x0078, 0x10d8, 0x700c, 0xa084, 0x007f, 0x0040, 0x1242, 0x80ac, + 0x0048, 0x1242, 0x2698, 0x53a5, 0x0078, 0x10d8, 0x700c, 0xa084, + 0x007f, 0x80ac, 0x2698, 0x53a5, 0x0078, 0x11ba, 0x71c4, 0x70c8, + 0x2114, 0xa79e, 0x0004, 0x00c0, 0x125e, 0x200a, 0x72ca, 0x0078, + 0x11b9, 0x70c7, 0x0001, 0x70cb, 0x001f, 0x0078, 0x11ba, 0x70c4, + 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, + 0x0040, 0x127d, 0x8001, 0x7872, 0x7a7a, 0x7b7e, 0x7c76, 0x7898, + 0xa084, 0xfffc, 0x789a, 0x0078, 0x1281, 0x7898, 0xa085, 0x0001, + 0x789a, 0x0078, 0x11ba, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, + 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1299, 0x8001, 0x7886, + 0x7a8e, 0x7b92, 0x7c8a, 0x7898, 0xa084, 0xfcff, 0x789a, 0x0078, + 0x129d, 0x7898, 0xa085, 0x0100, 0x789a, 0x0078, 0x11ba, 0x2009, + 0x3559, 0x210c, 0x2011, 0x0410, 0x0078, 0x11b8, 0x2009, 0x3541, + 0x210c, 0x0078, 0x11b9, 0x2009, 0x3542, 0x210c, 0x0078, 0x11b9, + 0x2061, 0x3540, 0x610c, 0x6210, 0x0078, 0x11b8, 0x2009, 0x3545, + 0x210c, 0x0078, 0x11b9, 0x2009, 0x3546, 0x210c, 0x0078, 0x11b9, + 0x2009, 0x3547, 0x210c, 0x0078, 0x11b9, 0x2009, 0x3548, 0x210c, + 0x0078, 0x11b9, 0x7908, 0x7a0c, 0x0078, 0x11b8, 0x71c4, 0x8107, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3600, 0x6a00, + 0x6804, 0xa084, 0x0008, 0x0040, 0x12e0, 0x6b08, 0x0078, 0x12e1, + 0x6b0c, 0x0078, 0x11b7, 0x77c4, 0x1078, 0x1692, 0x2091, 0x8000, + 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x11b7, 0x77c4, + 0x1078, 0x1692, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, + 0x8001, 0x0078, 0x11b7, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11b2, + 0x1078, 0x1abc, 0x0078, 0x11b7, 0x71c4, 0xa182, 0x0010, 0x00c8, + 0x11b2, 0x2011, 0x3541, 0x2204, 0x007e, 0x2112, 0x1078, 0x1a75, + 0x017f, 0x0078, 0x11b9, 0x71c4, 0x2011, 0x1331, 0x20a9, 0x0008, + 0x2204, 0xa106, 0x0040, 0x1323, 0x8210, 0x0070, 0x1321, 0x0078, + 0x1318, 0x0078, 0x11b2, 0xa292, 0x1331, 0x027e, 0x2011, 0x3542, + 0x2204, 0x2112, 0x017f, 0x007e, 0x1078, 0x1a81, 0x017f, 0x0078, + 0x11b9, 0x03e8, 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, + 0x004b, 0x2061, 0x3540, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, + 0x6012, 0x0078, 0x11b8, 0x2061, 0x3540, 0x6114, 0x70c4, 0x6016, + 0x0078, 0x11b9, 0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186, + 0x0028, 0x0040, 0x1363, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186, + 0x0032, 0x0040, 0x1363, 0x2011, 0x0006, 0x2019, 0x1313, 0xa186, + 0x003c, 0x00c0, 0x11b2, 0x2061, 0x3540, 0x6018, 0x007e, 0x611a, + 0x23b8, 0x1078, 0x1a92, 0x1078, 0x33ba, 0x017f, 0x0078, 0x11b9, + 0x71c4, 0xa184, 0xffcf, 0x00c0, 0x11b2, 0x2011, 0x3547, 0x2204, + 0x2112, 0x007e, 0x1078, 0x1ab4, 0x017f, 0x0078, 0x11b9, 0x71c4, + 0xa182, 0x0010, 0x00c8, 0x11b2, 0x2011, 0x3548, 0x2204, 0x007e, + 0x2112, 0x1078, 0x1aa3, 0x017f, 0x0078, 0x11b9, 0x71c4, 0x72c8, + 0xa184, 0xfffd, 0x00c0, 0x11b1, 0xa284, 0xfffd, 0x00c0, 0x11b1, + 0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x11b8, + 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, + 0x3600, 0x2019, 0x0000, 0x72c8, 0x6800, 0x007e, 0xa226, 0x0040, + 0x13cf, 0x6a02, 0xa484, 0x2000, 0x0040, 0x13b8, 0xa39d, 0x0010, + 0xa484, 0x1000, 0x0040, 0x13be, 0xa39d, 0x0008, 0xa484, 0x4000, + 0x0040, 0x13cf, 0x810f, 0xa284, 0x4000, 0x0040, 0x13cb, 0x1078, + 0x1ad6, 0x0078, 0x13cf, 0x1078, 0x1ac8, 0x0078, 0x13cf, 0x72cc, + 0x82ff, 0x0040, 0x1401, 0x6808, 0xa206, 0x0040, 0x1401, 0xa2a4, + 0x00ff, 0x2061, 0x3540, 0x6118, 0xa186, 0x0028, 0x0040, 0x13e8, + 0xa186, 0x0032, 0x0040, 0x13ee, 0xa186, 0x003c, 0x0040, 0x13f4, + 0xa482, 0x0064, 0x0048, 0x13fe, 0x0078, 0x13f8, 0xa482, 0x0050, + 0x0048, 0x13fe, 0x0078, 0x13f8, 0xa482, 0x0043, 0x0048, 0x13fe, + 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x11b3, 0x6a0a, 0xa39d, + 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x0078, + 0x11b7, 0x77c4, 0x1078, 0x1692, 0x2091, 0x8000, 0x6a14, 0x6b1c, + 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, + 0x11b7, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x11b2, + 0x1078, 0x1ae4, 0x0078, 0x11b7, 0x77c4, 0x1078, 0x1692, 0x2091, + 0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091, 0x8001, 0x2708, + 0x0078, 0x11b8, 0x77c4, 0x1078, 0x1692, 0x2091, 0x8000, 0x6a08, + 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1441, 0x1078, + 0x1a19, 0x2091, 0x8001, 0x2708, 0x0078, 0x11b8, 0x77c4, 0x1078, + 0x1692, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0004, 0x6a0a, 0x6804, + 0xa005, 0x0040, 0x1455, 0x1078, 0x1a19, 0x2091, 0x8001, 0x2708, + 0x0078, 0x11b8, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, + 0x0020, 0x2091, 0x8000, 0x1078, 0x169f, 0x2091, 0x8001, 0x2708, + 0x6a08, 0x0078, 0x11b8, 0x77c4, 0x72c8, 0x73cc, 0x77c6, 0x72ca, + 0x73ce, 0x1078, 0x1718, 0x00c0, 0x1489, 0x6818, 0xa005, 0x0040, + 0x1483, 0x2708, 0x1078, 0x1af4, 0x00c0, 0x1483, 0x7817, 0xffff, + 0x2091, 0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, + 0x11bc, 0x2091, 0x8001, 0x0078, 0x11ba, 0x77c4, 0x77c6, 0x2041, + 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, + 0x169f, 0x2061, 0x3540, 0x60a3, 0x0003, 0x67b6, 0x60a7, 0x0000, + 0x7817, 0xffff, 0x2091, 0x8001, 0x1078, 0x1a19, 0x007c, 0x77c8, + 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2061, + 0x3540, 0x60a3, 0x0002, 0x60a7, 0x0000, 0x67b6, 0x7817, 0xffff, + 0x1078, 0x1a19, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0004, + 0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x169f, 0x70c8, 0x6836, + 0x8738, 0xa784, 0x0007, 0x00c0, 0x14c4, 0x2091, 0x8001, 0x007c, + 0x7898, 0xa084, 0x0003, 0x00c0, 0x14f4, 0x2039, 0x0000, 0x2041, + 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x1692, 0x2091, + 0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, + 0x0007, 0x00c0, 0x14dd, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, + 0xa784, 0x0f00, 0x00c0, 0x14dd, 0x2091, 0x8000, 0x2069, 0x0100, + 0x6830, 0xa084, 0x0040, 0x0040, 0x151d, 0x684b, 0x0004, 0x20a9, + 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x150a, 0x0070, 0x150a, + 0x0078, 0x1501, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, + 0x0001, 0x0040, 0x1517, 0x0070, 0x1517, 0x0078, 0x150e, 0x20a9, + 0x00fa, 0x0070, 0x151d, 0x0078, 0x1519, 0x2079, 0x3500, 0x7817, + 0x0001, 0x2061, 0x3540, 0x60a3, 0x0001, 0x60a7, 0x0000, 0x60c3, + 0x000f, 0x7898, 0xa085, 0x0002, 0x789a, 0x6808, 0xa084, 0xfffd, + 0x680a, 0x681b, 0x0046, 0x2091, 0x8001, 0x007c, 0x7898, 0xa084, + 0xfffd, 0x789a, 0xa084, 0x0001, 0x00c0, 0x1540, 0x1078, 0x1760, + 0x71c4, 0x71c6, 0x794a, 0x007c, 0x74c4, 0x73c8, 0x72cc, 0x74c6, + 0x73ca, 0x72ce, 0x2079, 0x3500, 0x2009, 0x0040, 0x1078, 0x166f, + 0x0040, 0x1586, 0x1078, 0x163f, 0x0040, 0x155a, 0x1078, 0x1678, + 0x0078, 0x1586, 0x6010, 0x2091, 0x8001, 0x7817, 0xffff, 0x2009, + 0x3568, 0x200b, 0x0005, 0x8108, 0x200b, 0x0000, 0x8108, 0x230a, + 0x8108, 0x220a, 0x8108, 0x240a, 0x8108, 0x200a, 0x8108, 0x200b, + 0x0000, 0x8108, 0x2c0a, 0xa02e, 0x2530, 0x0e7e, 0x1078, 0x2f13, + 0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000, 0x60af, + 0x0000, 0x2091, 0x8001, 0x1078, 0x1a19, 0x007c, 0x70c3, 0x4005, + 0x0078, 0x11bd, 0x71c4, 0x70c7, 0x0000, 0x7906, 0x0078, 0x11ba, + 0x71c4, 0x71c6, 0x2168, 0x0078, 0x1597, 0x2069, 0x1000, 0x690c, + 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1599, 0xa285, + 0x0000, 0x00c0, 0x15a7, 0x70c3, 0x4000, 0x0078, 0x15a9, 0x70c3, + 0x4003, 0x70ca, 0x0078, 0x11bd, 0x71c4, 0x72c8, 0x73cc, 0x2100, + 0xa184, 0xfffc, 0x00c0, 0x11c6, 0x2100, 0x0079, 0x15b7, 0x15ce, + 0x15e3, 0x15e5, 0x15e7, 0x70c3, 0x4003, 0x71ce, 0x72d2, 0x73d6, + 0x0078, 0x15ca, 0x70c3, 0x4000, 0x70cf, 0x0000, 0x70d3, 0x0000, + 0x70d7, 0x0000, 0x77c6, 0x71ca, 0x0078, 0x11ba, 0x2031, 0x15e9, + 0x2624, 0x8630, 0x2412, 0x2204, 0xa446, 0x00c0, 0x15bb, 0xa484, + 0xffff, 0x00c0, 0x15d0, 0x2031, 0x15e9, 0x8210, 0x8319, 0xa384, + 0xffff, 0x00c0, 0x15d0, 0x0078, 0x15c2, 0x0078, 0x15c2, 0x0078, + 0x15c2, 0x5555, 0xaaaa, 0xffff, 0x0000, 0x7960, 0x71c6, 0x71c4, + 0xa182, 0x0003, 0x00c8, 0x11b2, 0x7962, 0x0078, 0x11ba, 0x7960, + 0x71c6, 0x0078, 0x11ba, 0x7954, 0x71c6, 0x71c4, 0x7956, 0x7958, + 0x71ca, 0x71c8, 0x795a, 0x795c, 0x71ce, 0x71cc, 0x795e, 0x0078, + 0x11ba, 0x7954, 0x71c6, 0x7958, 0x71ca, 0x795c, 0x71ce, 0x0078, + 0x11ba, 0x700c, 0xa084, 0x007f, 0x0040, 0x161d, 0x7007, 0x0004, + 0x7004, 0xa084, 0x0004, 0x00c0, 0x1618, 0x7017, 0x0000, 0x7112, + 0x721a, 0x731e, 0x8108, 0x810c, 0x81a9, 0x8c98, 0x20a1, 0x0030, + 0x6080, 0x20a2, 0x53a6, 0x780c, 0xa085, 0x0000, 0x7002, 0x7007, + 0x0001, 0x7108, 0x8104, 0x00c8, 0x1631, 0x7007, 0x0002, 0xa184, + 0x000c, 0x710c, 0xa184, 0x0300, 0x7003, 0x0000, 0x007c, 0x700c, + 0xa084, 0x007f, 0x0040, 0x164b, 0x7007, 0x0004, 0x7004, 0xa084, + 0x0004, 0x00c0, 0x1646, 0x7017, 0x0000, 0x7112, 0x721a, 0x731e, + 0x2099, 0x0030, 0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, + 0x7007, 0x0001, 0x7008, 0x800c, 0x00c8, 0x165a, 0x7007, 0x0002, + 0xa08c, 0x000c, 0x00c0, 0x166c, 0x710c, 0xa184, 0x0300, 0x00c0, + 0x166c, 0x2ca0, 0x53a5, 0xa006, 0x7003, 0x0000, 0x007c, 0x7850, + 0xa065, 0x0040, 0x1677, 0x2c04, 0x7852, 0x2063, 0x0000, 0x007c, + 0x0f7e, 0x2079, 0x3500, 0x7850, 0x2062, 0x2c00, 0x7852, 0x0f7f, + 0x007c, 0x2011, 0x4000, 0x7a52, 0x2019, 0x0410, 0x8319, 0x0040, + 0x168f, 0xa280, 0x002f, 0x2012, 0x2010, 0x0078, 0x1686, 0x2013, + 0x0000, 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, 0x0007, 0x8003, + 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8, 0x3680, 0x007c, 0x1078, + 0x1692, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, + 0xa80d, 0x690a, 0x2009, 0x354f, 0x210c, 0x6804, 0xa005, 0x0040, + 0x16bc, 0xa116, 0x00c0, 0x16bc, 0x2060, 0x6000, 0x6806, 0x017e, + 0x200b, 0x0000, 0x0078, 0x16bf, 0x2009, 0x0000, 0x017e, 0x6804, + 0xa065, 0x0040, 0x16ce, 0x6000, 0x6806, 0x1078, 0x16df, 0x1078, + 0x17cb, 0x6810, 0x8001, 0x6812, 0x00c0, 0x16bf, 0x017f, 0x6902, + 0x6906, 0x007c, 0xa065, 0x0040, 0x16de, 0x6098, 0x609b, 0x0000, + 0x2008, 0x1078, 0x1678, 0x2100, 0x0078, 0x16d2, 0x007c, 0x6003, + 0x0103, 0x20a9, 0x001c, 0xac80, 0x0004, 0x20a0, 0x2001, 0x0000, + 0x40a4, 0x6828, 0x6016, 0x682c, 0x601e, 0x007c, 0x0e7e, 0x2071, + 0x3540, 0x7040, 0xa08c, 0x0080, 0x00c0, 0x16fc, 0xa088, 0x3580, + 0x2d0a, 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071, + 0x3540, 0x2009, 0x3580, 0x7240, 0x8221, 0x8211, 0x0048, 0x1716, + 0x2104, 0x8108, 0xad06, 0x00c0, 0x1705, 0x8119, 0x211e, 0x8108, + 0x8318, 0x8211, 0x00c8, 0x170e, 0x7442, 0xa006, 0x0e7f, 0x007c, + 0x1078, 0x1692, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040, + 0x175f, 0x0078, 0x1729, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040, + 0x175f, 0x600c, 0xa306, 0x00c0, 0x1723, 0x6008, 0xa206, 0x00c0, + 0x1723, 0x2c28, 0x2001, 0x354f, 0x2004, 0xac06, 0x0040, 0x175f, + 0x6804, 0xac06, 0x00c0, 0x1746, 0x6000, 0x2060, 0x6806, 0xa005, + 0x00c0, 0x1746, 0x6803, 0x0000, 0x0078, 0x1750, 0x6400, 0x781c, + 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1750, 0x2c00, 0x6802, + 0x2560, 0x1078, 0x16df, 0x6017, 0x0005, 0x601f, 0x0020, 0x1078, + 0x17cb, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff, 0xa005, 0x007c, + 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, + 0x2091, 0x8000, 0x1078, 0x169f, 0x8738, 0xa784, 0x0007, 0x00c0, + 0x176a, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, + 0x00c0, 0x176a, 0x2091, 0x8001, 0x007c, 0x2061, 0x0000, 0x6018, + 0xa084, 0x0001, 0x00c0, 0x178a, 0x78ac, 0x78af, 0x0000, 0xa005, + 0x00c0, 0x178b, 0x007c, 0xa08c, 0xfff0, 0x0040, 0x1791, 0x1078, + 0x1ba5, 0x0079, 0x1793, 0x17a3, 0x17a5, 0x17ab, 0x17af, 0x17a3, + 0x17b3, 0x17a3, 0x17a3, 0x17a3, 0x17a3, 0x17b9, 0x17bd, 0x17a3, + 0x17a3, 0x17a3, 0x17a3, 0x1078, 0x1ba5, 0x1078, 0x1760, 0x2001, + 0x8001, 0x0078, 0x17c3, 0x2001, 0x8003, 0x0078, 0x17c3, 0x2001, + 0x8004, 0x0078, 0x17c3, 0x1078, 0x1760, 0x2001, 0x8006, 0x0078, + 0x17c3, 0x2001, 0x800c, 0x0078, 0x17c3, 0x1078, 0x1760, 0x2001, + 0x800d, 0x0078, 0x17c3, 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001, + 0x2091, 0x4080, 0x007c, 0x2c04, 0x6082, 0x2c08, 0x2063, 0x0000, + 0x7864, 0x8000, 0x7866, 0x7868, 0xa005, 0x796a, 0x0040, 0x17db, + 0x2c02, 0x0078, 0x17dc, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x3500, + 0x6883, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6064, 0x8000, 0x6066, + 0x6068, 0xa005, 0x616a, 0x0040, 0x17f0, 0x2d02, 0x0078, 0x17f1, + 0x616e, 0x0c7f, 0x007c, 0x1078, 0x1804, 0x0040, 0x1803, 0x0c7e, + 0x6098, 0xa065, 0x0040, 0x17fe, 0x1078, 0x16d2, 0x0c7f, 0x609b, + 0x0000, 0x1078, 0x1678, 0x007c, 0x786c, 0xa065, 0x0040, 0x1816, + 0x2091, 0x8000, 0x7864, 0x8001, 0x7866, 0x2c04, 0x786e, 0xa005, + 0x00c0, 0x1814, 0x786a, 0x8000, 0x2091, 0x8001, 0x007c, 0x7898, + 0xa005, 0x00c0, 0x1865, 0x7974, 0x70d0, 0x0005, 0x0005, 0x72d0, + 0xa206, 0x00c0, 0x181c, 0x2200, 0xa106, 0x00c0, 0x1833, 0x7804, + 0xa005, 0x0040, 0x1865, 0x7807, 0x0000, 0x0068, 0x1865, 0x2091, + 0x4080, 0x0078, 0x1865, 0x1078, 0x166f, 0x0040, 0x1865, 0x7a7c, + 0x7b78, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0x2009, + 0x0040, 0x1078, 0x163f, 0x0040, 0x185c, 0x1078, 0x1678, 0x7880, + 0x8000, 0x7882, 0xa086, 0x0002, 0x00c0, 0x1865, 0x2091, 0x8000, + 0x78af, 0x0002, 0x7883, 0x0000, 0x7898, 0xa085, 0x0003, 0x789a, + 0x2091, 0x8001, 0x0078, 0x1865, 0x7883, 0x0000, 0x1078, 0x1992, + 0x6000, 0xa084, 0x0007, 0x0079, 0x1866, 0x007c, 0x186e, 0x187d, + 0x189d, 0x186e, 0x18af, 0x186e, 0x186e, 0x186e, 0x2039, 0x0400, + 0x78a8, 0xa705, 0x78aa, 0x6004, 0xa705, 0x6006, 0x1078, 0x18ed, + 0x6018, 0x78a6, 0x1078, 0x197a, 0x007c, 0x78a8, 0xa084, 0x0100, + 0x0040, 0x1884, 0x0078, 0x186e, 0x78ab, 0x0000, 0x6000, 0x8007, + 0xa084, 0x00ff, 0x789e, 0x8001, 0x609b, 0x0000, 0x0040, 0x189a, + 0x1078, 0x18ed, 0x0040, 0x189a, 0x78a8, 0xa085, 0x0100, 0x78aa, + 0x0078, 0x189c, 0x1078, 0x1911, 0x007c, 0x78a8, 0xa08c, 0x0e00, + 0x00c0, 0x18a6, 0xa084, 0x0100, 0x00c0, 0x18a8, 0x0078, 0x186e, + 0x1078, 0x18ed, 0x00c0, 0x18ae, 0x1078, 0x1911, 0x007c, 0x78a8, + 0xa084, 0x0100, 0x0040, 0x18b6, 0x0078, 0x186e, 0x78ab, 0x0000, + 0x6710, 0x20a9, 0x0001, 0x6014, 0xa084, 0x00ff, 0xa005, 0x0040, + 0x18d3, 0xa7bc, 0xff00, 0x20a9, 0x0008, 0xa08e, 0x0001, 0x0040, + 0x18d3, 0x2039, 0x0000, 0x20a9, 0x0080, 0xa08e, 0x0002, 0x0040, + 0x18d3, 0x0078, 0x18ea, 0x1078, 0x1692, 0x2d00, 0x2091, 0x8000, + 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, + 0x2d00, 0xa080, 0x0010, 0x2068, 0x2091, 0x8001, 0x0070, 0x18ea, + 0x0078, 0x18d6, 0x1078, 0x1678, 0x007c, 0x78a0, 0xa06d, 0x00c0, + 0x18f8, 0x2c00, 0x78a2, 0x78a6, 0x609b, 0x0000, 0x0078, 0x1904, + 0x2c00, 0x689a, 0x609b, 0x0000, 0x78a2, 0x2d00, 0x6002, 0x78a4, + 0xad06, 0x00c0, 0x1904, 0x6002, 0x789c, 0x8001, 0x789e, 0x00c0, + 0x1910, 0x78a8, 0xa084, 0x0000, 0x78aa, 0x78a4, 0x2060, 0xa006, + 0x007c, 0xa02e, 0x2530, 0x6118, 0xa184, 0x0060, 0x619e, 0x0040, + 0x191d, 0x0e7e, 0x1078, 0x2f13, 0x0e7f, 0x6592, 0x65a2, 0x6696, + 0x66a6, 0x60ab, 0x0000, 0x60af, 0x0000, 0x6710, 0x1078, 0x1692, + 0x2091, 0x8000, 0x6808, 0xa084, 0x0001, 0x0040, 0x193f, 0x2091, + 0x8001, 0x1078, 0x16df, 0x2091, 0x8000, 0x1078, 0x17cb, 0x2091, + 0x8001, 0x78a3, 0x0000, 0x78a7, 0x0000, 0x0078, 0x1979, 0x6020, + 0xa096, 0x0001, 0x00c0, 0x1946, 0x8000, 0x6022, 0x6a10, 0x6814, + 0x2091, 0x8001, 0xa202, 0x0048, 0x1955, 0x0040, 0x1955, 0x2039, + 0x0200, 0x1078, 0x197a, 0x0078, 0x1979, 0x2c08, 0x2091, 0x8000, + 0x6800, 0xa065, 0x0040, 0x195d, 0x6102, 0x6902, 0x00c0, 0x1961, + 0x6906, 0x2160, 0x6003, 0x0000, 0x6810, 0x8000, 0x6812, 0x2091, + 0x8001, 0x6808, 0xa08c, 0x0040, 0x0040, 0x1973, 0xa086, 0x0040, + 0x680a, 0x1078, 0x16ee, 0x1078, 0x1a19, 0x78a7, 0x0000, 0x78a3, + 0x0000, 0x007c, 0x6004, 0xa705, 0x6006, 0x2091, 0x8000, 0x1078, + 0x17cb, 0x2091, 0x8001, 0x78a4, 0xa065, 0x0040, 0x198d, 0x6098, + 0x78a6, 0x609b, 0x0000, 0x0078, 0x197d, 0x78a3, 0x0000, 0x78a7, + 0x0000, 0x007c, 0x7970, 0x7874, 0x8000, 0xa10a, 0x00c8, 0x1999, + 0xa006, 0x7876, 0x70d2, 0x7804, 0xa005, 0x0040, 0x19a7, 0x8001, + 0x7806, 0x00c0, 0x19a7, 0x0068, 0x19a7, 0x2091, 0x4080, 0x007c, + 0x0068, 0x19c2, 0x2029, 0x0000, 0x786c, 0xa065, 0x0040, 0x19bd, + 0x1078, 0x19c3, 0x0040, 0x19bd, 0x057e, 0x1078, 0x19d9, 0x057f, + 0x00c0, 0x19bd, 0x8528, 0x0078, 0x19ac, 0x85ff, 0x0040, 0x19c2, + 0x2091, 0x4080, 0x007c, 0x7b84, 0x7988, 0x72d4, 0x0005, 0x0005, + 0x70d4, 0xa206, 0x00c0, 0x19c5, 0x2200, 0xa102, 0x00c0, 0x19d3, + 0x2300, 0xa005, 0x007c, 0x0048, 0x19d7, 0xa302, 0x007c, 0x8002, + 0x007c, 0x1078, 0x1a0b, 0x2009, 0x001c, 0x6024, 0xa005, 0x0040, + 0x19e3, 0x2009, 0x0040, 0x1078, 0x1611, 0x0040, 0x19fc, 0x7894, + 0x8000, 0x7896, 0xa086, 0x0002, 0x00c0, 0x1a0a, 0x2091, 0x8000, + 0x78af, 0x0003, 0x7897, 0x0000, 0x7898, 0xa085, 0x0300, 0x789a, + 0x2091, 0x8001, 0x0078, 0x1a0a, 0x7897, 0x0000, 0x1078, 0x17f3, + 0x7984, 0x7888, 0x8000, 0xa10a, 0x00c8, 0x1a07, 0xa006, 0x788a, + 0x70d6, 0xa006, 0x007c, 0x8107, 0x8004, 0x8004, 0x7a90, 0x7b8c, + 0xa210, 0xa399, 0x0000, 0x007c, 0x2009, 0x3568, 0x2091, 0x8000, + 0x200a, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3540, 0x2091, 0x8000, + 0x2104, 0xa086, 0x0000, 0x00c0, 0x1a34, 0x2009, 0x3512, 0x2104, + 0xa005, 0x00c0, 0x1a34, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1a34, + 0x0018, 0x1a34, 0x781b, 0x0044, 0x2091, 0x8001, 0x0f7f, 0x007c, + 0x127e, 0x2091, 0x2300, 0x2071, 0x3540, 0x2079, 0x0100, 0x2019, + 0x2dd8, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040, 0x1a50, 0x789a, + 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318, 0x0078, 0x1a43, + 0x789b, 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x0220, + 0x0070, 0x1a5c, 0x0078, 0x1a54, 0x7003, 0x0000, 0x1078, 0x1b5b, + 0x7004, 0xa084, 0x000f, 0xa085, 0x6280, 0x7806, 0x780f, 0x9200, + 0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x0038, 0x7047, 0x357f, + 0x7043, 0x0000, 0x127f, 0x2000, 0x007c, 0xa18c, 0x000f, 0x2011, + 0x0101, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x1078, 0x1b5b, + 0x007c, 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x0070, 0x1a8a, + 0x0078, 0x1a85, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, + 0x2012, 0x007c, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x0070, + 0x1a9b, 0x0078, 0x1a96, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, + 0xa205, 0x200a, 0x007c, 0x2011, 0x0101, 0x20a9, 0x000c, 0x810b, + 0x0070, 0x1aac, 0x0078, 0x1aa7, 0xa18c, 0xf000, 0x2204, 0xa084, + 0x0fff, 0xa105, 0x2012, 0x007c, 0x2011, 0x0102, 0x2204, 0xa084, + 0xffcf, 0xa105, 0x2012, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, + 0x0c7e, 0x2061, 0x0100, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, + 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, + 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, + 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa085, + 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0020, + 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0x62ae, 0x2010, 0x60a4, + 0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, + 0x6818, 0xa005, 0x0040, 0x1b39, 0x2061, 0x3f80, 0x1078, 0x1b41, + 0x0040, 0x1b27, 0x20a9, 0x0000, 0x2061, 0x3e80, 0x0c7e, 0x1078, + 0x1b41, 0x0040, 0x1b13, 0x0c7f, 0x8c60, 0x0070, 0x1b11, 0x0078, + 0x1b06, 0x0078, 0x1b39, 0x007f, 0xa082, 0x3e80, 0x2071, 0x3540, + 0x70ba, 0x601c, 0xa085, 0x0800, 0x601e, 0x71b6, 0x60a7, 0x0000, + 0x2001, 0x0004, 0x70a2, 0x1078, 0x1a14, 0x0078, 0x1b35, 0x2071, + 0x3540, 0x601c, 0xa085, 0x0800, 0x601e, 0x71b6, 0x60a7, 0x0000, + 0x2001, 0x0006, 0x70a2, 0x1078, 0x1a14, 0x2001, 0x0000, 0x0078, + 0x1b3b, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, + 0x007c, 0x2c04, 0xa005, 0x0040, 0x1b58, 0x2060, 0x600c, 0xa306, + 0x00c0, 0x1b55, 0x6008, 0xa206, 0x00c0, 0x1b55, 0x6010, 0xa106, + 0x00c0, 0x1b55, 0xa006, 0x0078, 0x1b5a, 0x6000, 0x0078, 0x1b42, + 0xa085, 0x0001, 0x007c, 0x2011, 0x3541, 0x220c, 0xa18c, 0x000f, + 0x2011, 0x013b, 0x2204, 0xa084, 0x0100, 0x0040, 0x1b6a, 0x2021, + 0xff80, 0x2122, 0x007c, 0x0e7e, 0x68e4, 0xa08c, 0x0020, 0x0040, + 0x1ba3, 0xa084, 0x0006, 0x00c0, 0x1ba3, 0x6010, 0x8007, 0xa084, + 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x3600, 0x7004, 0xa084, + 0x000a, 0x00c0, 0x1ba3, 0x7108, 0xa194, 0xff00, 0x0040, 0x1ba3, + 0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x1b96, 0x2001, + 0x0032, 0xa106, 0x0040, 0x1b9a, 0x0078, 0x1b9e, 0x2009, 0x0020, + 0x0078, 0x1ba0, 0x2009, 0x003f, 0x0078, 0x1ba0, 0x2011, 0x0000, + 0x2100, 0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068, 0x1ba5, 0x007e, + 0x2071, 0x0000, 0x7018, 0xa084, 0x0001, 0x00c0, 0x1baa, 0x007f, + 0x2e08, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, + 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x007f, 0x2070, + 0x007f, 0x0078, 0x1bc1, 0x107e, 0x007e, 0x127e, 0x2091, 0x2300, + 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0xa594, 0x003f, 0xa484, 0x4000, + 0x0040, 0x1bd8, 0xa784, 0x007c, 0x00c0, 0x2d9c, 0x1078, 0x1ba5, + 0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x1be0, 0x1078, 0x1ba5, + 0x8507, 0xa084, 0x000f, 0x0079, 0x1be5, 0x1fea, 0x209a, 0x20c0, + 0x22e6, 0x256b, 0x25b3, 0x25ea, 0x2665, 0x26bf, 0x2744, 0x1c0b, + 0x1bf5, 0x1e53, 0x1f1d, 0x254a, 0x1bf5, 0x1078, 0x1ba5, 0x0018, + 0x1bc8, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7003, + 0x0000, 0x703f, 0x0000, 0x7030, 0xa005, 0x0040, 0x1c09, 0x7033, + 0x0000, 0x0018, 0x1bc8, 0x705c, 0xa005, 0x00c0, 0x1cb6, 0x70a0, + 0xa084, 0x0007, 0x0079, 0x1c14, 0x1cd6, 0x1c1c, 0x1c2a, 0x1c4b, + 0x1c71, 0x1c9d, 0x1c9b, 0x1c1c, 0x7808, 0xa084, 0xfffd, 0x780a, + 0x2009, 0x0046, 0x1078, 0x2412, 0x00c0, 0x1c28, 0x7003, 0x0004, + 0x0078, 0x1bf7, 0x1078, 0x2d5e, 0x00c0, 0x1c49, 0x70b4, 0x8007, + 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b, + 0x0060, 0x78ab, 0x0001, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078, + 0x2410, 0x00c0, 0x1c49, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033, + 0x3570, 0x0078, 0x1bf7, 0x1078, 0x2d5e, 0x00c0, 0x1c6f, 0x71b4, + 0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x0007, + 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, + 0x0002, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078, 0x2410, 0x00c0, + 0x1c6f, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033, 0x3570, 0x0078, + 0x1bf7, 0x1078, 0x2d5e, 0x00c0, 0x1c99, 0x71b4, 0x8107, 0x789b, + 0x007e, 0x78aa, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, 0x00c0, + 0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d, 0x789b, + 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00f7, 0x1078, + 0x2410, 0x00c0, 0x1c99, 0x7003, 0x0004, 0x70c3, 0x000f, 0x7033, + 0x3570, 0x0078, 0x1bf7, 0x0078, 0x1c4b, 0x1078, 0x2d5e, 0x00c0, + 0x1bf7, 0x70bc, 0x2068, 0x789b, 0x0010, 0x6f10, 0x1078, 0x2ca1, + 0x2c50, 0x6810, 0xa084, 0x0007, 0xa085, 0x0080, 0x78aa, 0x6e18, + 0x2041, 0x0001, 0x2001, 0x0004, 0x0078, 0x1dde, 0x1078, 0x2d5e, + 0x00c0, 0x1bf7, 0x789b, 0x0010, 0x705c, 0x2068, 0x6f10, 0x1078, + 0x2ca1, 0x2c50, 0x6008, 0xa085, 0x0010, 0x600a, 0x6810, 0xa084, + 0x0007, 0xa085, 0x0080, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, + 0x1078, 0x2dc5, 0x2001, 0x0003, 0x0078, 0x1dc9, 0x0018, 0x1bc8, + 0x7440, 0xa485, 0x0000, 0x0040, 0x1cf0, 0xa080, 0x3580, 0x2030, + 0x7144, 0x8108, 0xa12a, 0x0048, 0x1ce7, 0x2009, 0x3580, 0x2164, + 0x6504, 0x85ff, 0x00c0, 0x1cfd, 0x8421, 0x00c0, 0x1ce1, 0x7146, + 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1bf7, 0x7640, 0xa6b0, + 0x3580, 0x7144, 0x2600, 0x0078, 0x1cec, 0x7146, 0x2568, 0x2558, + 0x753e, 0x2c50, 0x6034, 0xa085, 0x0000, 0x00c0, 0x1cfa, 0x6708, + 0x7736, 0xa784, 0x013f, 0x0040, 0x1d2f, 0xa784, 0x0021, 0x00c0, + 0x1cfa, 0xa784, 0x0002, 0x0040, 0x1d1c, 0xa784, 0x0004, 0x0040, + 0x1cfa, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0008, 0x00c0, 0x1cfa, + 0xa784, 0x0010, 0x00c0, 0x1cfa, 0xa784, 0x0100, 0x0040, 0x1d2f, + 0x6018, 0xa005, 0x00c0, 0x1cfa, 0xa7bc, 0xfeff, 0x670a, 0x681f, + 0x0000, 0x6e18, 0xa684, 0x000e, 0x6118, 0x0040, 0x1d3f, 0x601c, + 0xa102, 0x0048, 0x1d42, 0x0040, 0x1d42, 0x0078, 0x1cf6, 0x81ff, + 0x00c0, 0x1cf6, 0xa784, 0x0080, 0x00c0, 0x1d48, 0x700c, 0x6022, + 0xa7bc, 0xff7f, 0x670a, 0x6b10, 0x8307, 0xa084, 0x000f, 0x8003, + 0x8003, 0x8003, 0xa080, 0x3600, 0x2060, 0x2048, 0x704a, 0x6000, + 0x704e, 0x6004, 0x7052, 0x2a60, 0x0018, 0x1bc8, 0x789b, 0x0010, + 0xa046, 0x1078, 0x2d5e, 0x00c0, 0x1bf7, 0x6b10, 0xa39c, 0x0007, + 0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000, 0x0040, 0x1d73, 0xa684, + 0x0001, 0x0040, 0x1d75, 0xa39c, 0xffbf, 0xa684, 0x0010, 0x0040, + 0x1d7b, 0xa39d, 0x0020, 0x7baa, 0x8840, 0xa684, 0x000e, 0x00c0, + 0x1d86, 0xa7bd, 0x0010, 0x670a, 0x0078, 0x1dc7, 0x714c, 0xa18c, + 0x0800, 0x0040, 0x2902, 0x2011, 0x0021, 0x8004, 0x8004, 0x0048, + 0x1d9d, 0x2011, 0x0022, 0x8004, 0x0048, 0x1d9d, 0x2011, 0x0020, + 0x8004, 0x0048, 0x1d9d, 0x0040, 0x1dc7, 0x7aaa, 0x8840, 0x1078, + 0x2d77, 0x6a10, 0x610c, 0x8108, 0xa18c, 0x00ff, 0xa1e0, 0x3e80, + 0x2c64, 0x8cff, 0x0040, 0x1dbe, 0x6010, 0xa206, 0x00c0, 0x1da8, + 0x60b4, 0x8001, 0x60b6, 0x00c0, 0x1da3, 0x0c7e, 0x2a60, 0x6008, + 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078, 0x1cd6, 0x1078, 0x2d5e, + 0x00c0, 0x1bf7, 0x2a60, 0x610e, 0x79aa, 0x8840, 0x712e, 0x2001, + 0x0001, 0x007e, 0x7150, 0xa184, 0x0018, 0x0040, 0x1ddd, 0xa184, + 0x0010, 0x0040, 0x1dd7, 0x1078, 0x2acc, 0x00c0, 0x1ddd, 0xa184, + 0x0008, 0x0040, 0x1ddd, 0x1078, 0x29e6, 0x007f, 0x7002, 0xa68c, + 0x0060, 0x88ff, 0x0040, 0x1de6, 0xa18d, 0x0004, 0x795a, 0x69b2, + 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061, 0x6814, 0xa085, + 0x8000, 0x6816, 0x78aa, 0x157e, 0x137e, 0x147e, 0x20a1, 0x012c, + 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000a, 0x2098, 0x53a6, + 0x147f, 0x137f, 0x157f, 0x6810, 0x8007, 0x789b, 0x007e, 0x78aa, + 0x6d90, 0x7dd6, 0x7dde, 0x6e94, 0x7ed2, 0x7eda, 0x7830, 0xa084, + 0x00c0, 0x00c0, 0x1e15, 0x0098, 0x1e1d, 0x6008, 0xa084, 0xffef, + 0x600a, 0x1078, 0x2d77, 0x0078, 0x1bff, 0x7200, 0xa284, 0x0007, + 0xa086, 0x0001, 0x00c0, 0x1e2a, 0x781b, 0x0049, 0x1078, 0x2d77, + 0x0078, 0x1e3b, 0x6ab0, 0xa295, 0x2000, 0x7a5a, 0x781b, 0x0049, + 0x1078, 0x2d77, 0x7200, 0x2500, 0xa605, 0x0040, 0x1e3b, 0xa284, + 0x0007, 0x1079, 0x1e49, 0xad80, 0x0008, 0x7032, 0xa284, 0x0007, + 0xa086, 0x0001, 0x00c0, 0x1e47, 0x6018, 0x8000, 0x601a, 0x0078, + 0x1bf7, 0x1e51, 0x30f0, 0x30f0, 0x30df, 0x30f0, 0x1e51, 0x1e51, + 0x1e51, 0x1078, 0x1ba5, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e, + 0x2079, 0x3500, 0x7898, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x1e79, + 0x70a0, 0xa086, 0x0001, 0x00c0, 0x1e68, 0x70a2, 0x0078, 0x1f01, + 0x70a0, 0xa086, 0x0005, 0x00c0, 0x1e77, 0x70bc, 0x2068, 0x6817, + 0x0004, 0x6813, 0x0000, 0x681c, 0xa085, 0x0008, 0x681e, 0x70a3, + 0x0000, 0x157e, 0x2011, 0x0004, 0x71a0, 0xa186, 0x0001, 0x0040, + 0x1e9b, 0xa186, 0x0007, 0x00c0, 0x1e8b, 0x2009, 0x352b, 0x200b, + 0x0005, 0x0078, 0x1e9b, 0x2009, 0x3513, 0x2104, 0x2009, 0x3512, + 0x200a, 0x2009, 0x352b, 0x200b, 0x0001, 0x70a3, 0x0000, 0x70a7, + 0x0001, 0x0078, 0x1e9d, 0x70a3, 0x0000, 0x1078, 0x2ec7, 0x20a9, + 0x0010, 0x2039, 0x0000, 0x1078, 0x2ba6, 0xa7b8, 0x0100, 0x0070, + 0x1eab, 0x0078, 0x1ea3, 0x7000, 0x2020, 0x0079, 0x1eaf, 0x1edd, + 0x1ec6, 0x1ec6, 0x1eb9, 0x1edd, 0x1edd, 0x1eb7, 0x1eb7, 0x1078, + 0x1ba5, 0x2021, 0x3557, 0x2404, 0xa005, 0x0040, 0x1ec6, 0xad06, + 0x00c0, 0x1ec6, 0x6800, 0x2022, 0x0078, 0x1ed6, 0x681c, 0xa084, + 0x0001, 0x00c0, 0x1ed2, 0x6f10, 0x1078, 0x2ca1, 0x1078, 0x28d9, + 0x0078, 0x1ed6, 0x7054, 0x2060, 0x6800, 0x6002, 0x6a16, 0x681c, + 0xa085, 0x0008, 0x681e, 0x1078, 0x17dd, 0x2021, 0x3f80, 0x1078, + 0x1f07, 0x2021, 0x3557, 0x1078, 0x1f07, 0x20a9, 0x0000, 0x2021, + 0x3e80, 0x1078, 0x1f07, 0x8420, 0x0070, 0x1ef0, 0x0078, 0x1ee9, + 0x20a9, 0x0080, 0x2061, 0x3680, 0x6018, 0x6110, 0xa102, 0x6012, + 0x601b, 0x0000, 0xace0, 0x0010, 0x0070, 0x1f00, 0x0078, 0x1ef4, + 0x157f, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, 0x1bf7, 0x047e, + 0x2404, 0xa005, 0x0040, 0x1f19, 0x2068, 0x6800, 0x007e, 0x6a16, + 0x681c, 0xa085, 0x0008, 0x681e, 0x1078, 0x17dd, 0x007f, 0x0078, + 0x1f09, 0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, + 0x1f23, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x1f26, 0x1f29, 0x1f9c, + 0x1faa, 0xa282, 0x0002, 0x0040, 0x1f2f, 0x1078, 0x1ba5, 0x70a0, + 0x70a3, 0x0000, 0x70c3, 0x0000, 0x0079, 0x1f36, 0x1f3e, 0x1f3e, + 0x1f40, 0x1f74, 0x2908, 0x1f3e, 0x1f74, 0x1f3e, 0x1078, 0x1ba5, + 0x77b4, 0x1078, 0x2ba6, 0x77b4, 0xa7bc, 0x0f00, 0x1078, 0x2ca1, + 0x6018, 0xa005, 0x0040, 0x1f6b, 0x2021, 0x3f80, 0x2009, 0x0004, + 0x2011, 0x0010, 0x1078, 0x1fc5, 0x0040, 0x1f6b, 0x157e, 0x20a9, + 0x0000, 0x2021, 0x3e80, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010, + 0x1078, 0x1fc5, 0x047f, 0x0040, 0x1f6a, 0x8420, 0x0070, 0x1f6a, + 0x0078, 0x1f5b, 0x157f, 0x8738, 0xa784, 0x0007, 0x00c0, 0x1f46, + 0x0078, 0x1bff, 0x0078, 0x1bff, 0x77b4, 0x1078, 0x2ca1, 0x6018, + 0xa005, 0x0040, 0x1f9a, 0x2021, 0x3f80, 0x2009, 0x0005, 0x2011, + 0x0020, 0x1078, 0x1fc5, 0x0040, 0x1f9a, 0x157e, 0x20a9, 0x0000, + 0x2021, 0x3e80, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, + 0x1fc5, 0x047f, 0x0040, 0x1f99, 0x8420, 0x0070, 0x1f99, 0x0078, + 0x1f8a, 0x157f, 0x0078, 0x1bff, 0x2200, 0x0079, 0x1f9f, 0x1fa2, + 0x1fa4, 0x1fa4, 0x1078, 0x1ba5, 0x70a3, 0x0000, 0x70a7, 0x0001, + 0x0078, 0x1bf7, 0x2200, 0x0079, 0x1fad, 0x1fb2, 0x1fa4, 0x1fb0, + 0x1078, 0x1ba5, 0x1078, 0x241f, 0x7000, 0xa086, 0x0001, 0x00c0, + 0x28af, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, + 0x28a2, 0x0040, 0x28af, 0x0078, 0x1cd6, 0x2404, 0xa005, 0x0040, + 0x1fe6, 0x2068, 0x2d04, 0x007e, 0x6810, 0xa706, 0x0040, 0x1fd4, + 0x2d20, 0x007f, 0x0078, 0x1fc6, 0x007f, 0x2022, 0x6916, 0x681c, + 0xa205, 0x681e, 0x1078, 0x17dd, 0x6010, 0x8001, 0x6012, 0x6008, + 0xa084, 0xffef, 0x600a, 0x1078, 0x28ef, 0x007c, 0xa085, 0x0001, + 0x0078, 0x1fe5, 0x2300, 0x0079, 0x1fed, 0x1ff2, 0x1ff0, 0x2035, + 0x1078, 0x1ba5, 0x78e4, 0xa005, 0x00d0, 0x2015, 0x0018, 0x2015, + 0x2008, 0xa084, 0x0030, 0x00c0, 0x2001, 0x781b, 0x0049, 0x0078, + 0x1bf7, 0x78ec, 0xa084, 0x0003, 0x0040, 0x1ffd, 0x2100, 0xa084, + 0x0007, 0x0079, 0x200b, 0x2023, 0x2029, 0x201d, 0x2013, 0x2d58, + 0x2d58, 0x2013, 0x202f, 0x1078, 0x1ba5, 0x7000, 0xa005, 0x0040, + 0x1bff, 0x2001, 0x0003, 0x0078, 0x22fa, 0x1078, 0x2b89, 0x781b, + 0x0055, 0x0078, 0x1bf7, 0x1078, 0x2b89, 0x781b, 0x00dc, 0x0078, + 0x1bf7, 0x1078, 0x2b89, 0x781b, 0x00e3, 0x0078, 0x1bf7, 0x1078, + 0x2b89, 0x781b, 0x009d, 0x0078, 0x1bf7, 0xa584, 0x000f, 0x00c0, + 0x205f, 0x1078, 0x241f, 0x7000, 0x0079, 0x203e, 0x2046, 0x2053, + 0x2046, 0x28af, 0x2048, 0x28af, 0x2046, 0x2046, 0x1078, 0x1ba5, + 0x71a0, 0x70a3, 0x0000, 0xa186, 0x0004, 0x00c0, 0x2051, 0x0078, + 0x2908, 0x0078, 0x28af, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef, + 0x600a, 0x1078, 0x28a2, 0x0040, 0x28af, 0x0078, 0x1cd6, 0x78e4, + 0xa005, 0x00d0, 0x2015, 0x0018, 0x2015, 0x2008, 0xa084, 0x0030, + 0x00c0, 0x206e, 0x781b, 0x0049, 0x0078, 0x1bf7, 0x78ec, 0xa084, + 0x0003, 0x0040, 0x206a, 0x2100, 0xa184, 0x0007, 0x0079, 0x2078, + 0x2088, 0x208e, 0x2082, 0x2080, 0x2d58, 0x2d58, 0x2080, 0x2d50, + 0x1078, 0x1ba5, 0x1078, 0x2b91, 0x781b, 0x0055, 0x0078, 0x1bf7, + 0x1078, 0x2b91, 0x781b, 0x00dc, 0x0078, 0x1bf7, 0x1078, 0x2b91, + 0x781b, 0x00e3, 0x0078, 0x1bf7, 0x1078, 0x2b91, 0x781b, 0x009d, + 0x0078, 0x1bf7, 0x2300, 0x0079, 0x209d, 0x20a2, 0x20a0, 0x20a4, + 0x1078, 0x1ba5, 0x0078, 0x2665, 0x6817, 0x0008, 0x78a3, 0x0000, + 0x79e4, 0xa184, 0x0030, 0x0040, 0x2665, 0x78ec, 0xa084, 0x0003, + 0x0040, 0x2665, 0xa184, 0x0007, 0x0079, 0x20b6, 0x2023, 0x2029, + 0x201d, 0x2d30, 0x2d58, 0x2d58, 0x20be, 0x2d50, 0x1078, 0x1ba5, + 0xa282, 0x0005, 0x0050, 0x20c6, 0x1078, 0x1ba5, 0x2300, 0x0079, + 0x20c9, 0x20cc, 0x22ce, 0x22da, 0x2200, 0x0079, 0x20cf, 0x20d4, + 0x20d6, 0x20e9, 0x20d4, 0x22b3, 0x1078, 0x1ba5, 0x789b, 0x0018, + 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0048, 0x2b6a, 0xa08a, + 0x0004, 0x00c8, 0x2b6a, 0x0079, 0x20e5, 0x2b6a, 0x2b6a, 0x2b6a, + 0x2b0c, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x20fe, + 0xa184, 0x0018, 0x0040, 0x20fa, 0x0078, 0x2b6a, 0x7000, 0xa005, + 0x00c0, 0x20f4, 0x2011, 0x0003, 0x0078, 0x2752, 0xa184, 0x00ff, + 0xa08a, 0x0010, 0x00c8, 0x2b6a, 0x0079, 0x2106, 0x2118, 0x2116, + 0x212e, 0x2130, 0x21c2, 0x2b6a, 0x2b6a, 0x21c4, 0x2b6a, 0x2b6a, + 0x22af, 0x22af, 0x2b6a, 0x2b6a, 0x2b6a, 0x22b1, 0x1078, 0x1ba5, + 0xa684, 0x1000, 0x0040, 0x2125, 0x2001, 0x0300, 0x8000, 0x8000, + 0x783a, 0x781b, 0x009a, 0x0078, 0x1bf7, 0x6814, 0xa084, 0x8000, + 0x0040, 0x212c, 0x6817, 0x0003, 0x0078, 0x2d30, 0x1078, 0x1ba5, + 0x691c, 0x691e, 0xa684, 0x1800, 0x00c0, 0x214a, 0x681c, 0xa084, + 0x0001, 0x00c0, 0x2152, 0x6814, 0xa086, 0x0008, 0x00c0, 0x2142, + 0x6817, 0x0000, 0xa684, 0x0400, 0x0040, 0x21be, 0x781b, 0x0058, + 0x0078, 0x1bf7, 0xa684, 0x1000, 0x0040, 0x2152, 0x781b, 0x0058, + 0x0078, 0x1bf7, 0xa684, 0x0060, 0x0040, 0x21ba, 0xa684, 0x0800, + 0x0040, 0x21ba, 0xa684, 0x8000, 0x00c0, 0x2160, 0x0078, 0x217a, + 0xa6b4, 0x7fff, 0x7e5a, 0x6eb2, 0x789b, 0x0074, 0x7aac, 0x79ac, + 0x78ac, 0x801b, 0x00c8, 0x216d, 0x8000, 0xa084, 0x003f, 0xa108, + 0xa291, 0x0000, 0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90, 0x2200, + 0xa303, 0x68aa, 0xa684, 0x4000, 0x0040, 0x2182, 0xa6b4, 0xbfff, + 0x7e5a, 0x6eb2, 0x7000, 0xa086, 0x0003, 0x00c0, 0x218f, 0x1078, + 0x2f3a, 0x1078, 0x30df, 0x781b, 0x0067, 0x0078, 0x1bf7, 0xa006, + 0x1078, 0x3194, 0x6aac, 0x69a8, 0x6c94, 0x6b90, 0x2200, 0xa105, + 0x0040, 0x219e, 0x2200, 0xa422, 0x2100, 0xa31b, 0x7cd2, 0x7bd6, + 0x2300, 0xa405, 0x00c0, 0x21ac, 0xa6b5, 0x4000, 0x7e5a, 0x6eb2, + 0x781b, 0x0067, 0x0078, 0x1bf7, 0x781b, 0x0067, 0x2200, 0xa115, + 0x00c0, 0x21b6, 0x1078, 0x30f0, 0x0078, 0x1bf7, 0x1078, 0x311d, + 0x0078, 0x1bf7, 0x781b, 0x006a, 0x0078, 0x1bf7, 0x781b, 0x0058, + 0x0078, 0x1bf7, 0x1078, 0x1ba5, 0x0078, 0x2221, 0x691c, 0xa184, + 0x0100, 0x0040, 0x21dc, 0xa18c, 0xfeff, 0x691e, 0x0c7e, 0x7048, 0x2060, 0x6000, 0xa084, 0xefff, 0x6002, 0x6004, 0xa084, 0xfff5, - 0x6006, 0x0c7f, 0x0078, 0x2198, 0xa184, 0x0200, 0x0040, 0x2198, + 0x6006, 0x0c7f, 0x0078, 0x2210, 0xa184, 0x0200, 0x0040, 0x2210, 0xa18c, 0xfdff, 0x691e, 0x0c7e, 0x7048, 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef, 0x6006, 0x2008, 0x2c48, - 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2198, 0x1078, 0x2bf8, 0x1078, - 0x294d, 0x88ff, 0x0040, 0x2198, 0x789b, 0x0060, 0x2800, 0x78aa, - 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2194, - 0x781b, 0x0055, 0x0078, 0x1ba0, 0x781b, 0x0069, 0x0078, 0x1ba0, - 0x7e58, 0xa684, 0x0400, 0x00c0, 0x21a1, 0x781b, 0x0058, 0x0078, - 0x1ba0, 0x781b, 0x006a, 0x0078, 0x1ba0, 0x0078, 0x2acb, 0x0078, - 0x2acb, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040, 0x21a7, + 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2210, 0x1078, 0x2c9d, 0x1078, + 0x29e6, 0x88ff, 0x0040, 0x2210, 0x789b, 0x0060, 0x2800, 0x78aa, + 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x220c, + 0x781b, 0x0055, 0x0078, 0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7, + 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2219, 0x781b, 0x0058, 0x0078, + 0x1bf7, 0x781b, 0x006a, 0x0078, 0x1bf7, 0x0078, 0x2b70, 0x0078, + 0x2b70, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040, 0x221f, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0, - 0x21cc, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x21c4, - 0x0048, 0x21c4, 0x0078, 0x21c6, 0x0078, 0x214e, 0x24a8, 0x7aa8, - 0x00f0, 0x21c6, 0x0078, 0x21b2, 0xa284, 0x00f0, 0xa086, 0x0020, - 0x00c0, 0x2228, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x21dc, - 0x0048, 0x21dc, 0x0078, 0x2225, 0xa286, 0x0023, 0x0040, 0x21a7, + 0x2244, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x223c, + 0x0048, 0x223c, 0x0078, 0x223e, 0x0078, 0x21c6, 0x24a8, 0x7aa8, + 0x00f0, 0x223e, 0x0078, 0x222a, 0xa284, 0x00f0, 0xa086, 0x0020, + 0x00c0, 0x22a0, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x2254, + 0x0048, 0x2254, 0x0078, 0x229d, 0xa286, 0x0023, 0x0040, 0x221f, 0x6818, 0xa084, 0xfff1, 0x681a, 0x7e58, 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010, 0x600a, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0010, - 0x0040, 0x2200, 0x1078, 0x2bf8, 0x1078, 0x2a33, 0x0078, 0x220f, + 0x0040, 0x2278, 0x1078, 0x2c9d, 0x1078, 0x2acc, 0x0078, 0x2287, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184, - 0x0008, 0x0040, 0x2198, 0x1078, 0x2bf8, 0x1078, 0x294d, 0x88ff, - 0x0040, 0x2198, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5, 0x0004, - 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2221, 0x781b, 0x0055, 0x0078, - 0x1ba0, 0x781b, 0x0069, 0x0078, 0x1ba0, 0x7aa8, 0x0078, 0x21b2, - 0x8318, 0x2300, 0xa102, 0x0040, 0x2231, 0x0048, 0x2231, 0x0078, - 0x21b2, 0xa284, 0x0080, 0x00c0, 0x2ad1, 0x0078, 0x2acb, 0x0078, - 0x2ad1, 0x0078, 0x2ac5, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, - 0xa08e, 0x0001, 0x0040, 0x2246, 0x1078, 0x1b4e, 0x7aa8, 0xa294, - 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x2ac5, - 0x0079, 0x2252, 0x2ac5, 0x28a0, 0x2ac5, 0x29ce, 0xa282, 0x0000, - 0x00c0, 0x225c, 0x1078, 0x1b4e, 0x1078, 0x2ae4, 0x781b, 0x0069, - 0x0078, 0x1ba0, 0xa282, 0x0003, 0x00c0, 0x2268, 0x1078, 0x1b4e, - 0x1078, 0x2af4, 0x781b, 0x0069, 0x0078, 0x1ba0, 0xa282, 0x0004, - 0x0050, 0x2274, 0x1078, 0x1b4e, 0x2300, 0x0079, 0x2277, 0x227a, - 0x2351, 0x237b, 0xa286, 0x0003, 0x0040, 0x2280, 0x1078, 0x1b4e, - 0x2001, 0x0000, 0x703a, 0x7000, 0xa084, 0x0007, 0x0079, 0x2288, - 0x2290, 0x2292, 0x2292, 0x2471, 0x2499, 0x243b, 0x2290, 0x2290, - 0x1078, 0x1b4e, 0xa684, 0x1000, 0x00c0, 0x229a, 0x1078, 0x2e0e, - 0x0040, 0x232b, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x22e2, 0xa186, - 0x0008, 0x00c0, 0x22b1, 0x1078, 0x2853, 0x6008, 0xa084, 0xffef, - 0x600a, 0x1078, 0x2806, 0x0040, 0x22e2, 0x1078, 0x2e0e, 0x0078, - 0x22c9, 0xa186, 0x0028, 0x00c0, 0x22e2, 0x1078, 0x2e0e, 0x6008, - 0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x22c9, 0x8001, - 0x601a, 0xa005, 0x0040, 0x22c9, 0x8001, 0xa005, 0x0040, 0x22c9, - 0x601e, 0x681c, 0xa084, 0x0001, 0x0040, 0x1ba8, 0x681c, 0xa084, + 0x0008, 0x0040, 0x2210, 0x1078, 0x2c9d, 0x1078, 0x29e6, 0x88ff, + 0x0040, 0x2210, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5, 0x0004, + 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2299, 0x781b, 0x0055, 0x0078, + 0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x7aa8, 0x0078, 0x222a, + 0x8318, 0x2300, 0xa102, 0x0040, 0x22a9, 0x0048, 0x22a9, 0x0078, + 0x222a, 0xa284, 0x0080, 0x00c0, 0x2b76, 0x0078, 0x2b70, 0x0078, + 0x2b76, 0x0078, 0x2b6a, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, + 0xa08e, 0x0001, 0x0040, 0x22be, 0x1078, 0x1ba5, 0x7aa8, 0xa294, + 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x2b6a, + 0x0079, 0x22ca, 0x2b6a, 0x2939, 0x2b6a, 0x2a67, 0xa282, 0x0000, + 0x00c0, 0x22d4, 0x1078, 0x1ba5, 0x1078, 0x2b89, 0x781b, 0x0069, + 0x0078, 0x1bf7, 0xa282, 0x0003, 0x00c0, 0x22e0, 0x1078, 0x1ba5, + 0x1078, 0x2b99, 0x781b, 0x0069, 0x0078, 0x1bf7, 0xa282, 0x0004, + 0x0050, 0x22ec, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x22ef, 0x22f2, + 0x23c9, 0x23fa, 0xa286, 0x0003, 0x0040, 0x22f8, 0x1078, 0x1ba5, + 0x2001, 0x0000, 0x703a, 0x7000, 0xa084, 0x0007, 0x0079, 0x2300, + 0x2308, 0x230a, 0x230a, 0x2508, 0x2530, 0x24d2, 0x2308, 0x2308, + 0x1078, 0x1ba5, 0xa684, 0x1000, 0x00c0, 0x2312, 0x1078, 0x2ec7, + 0x0040, 0x23a3, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x235a, 0xa186, + 0x0008, 0x00c0, 0x2329, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef, + 0x600a, 0x1078, 0x28a2, 0x0040, 0x235a, 0x1078, 0x2ec7, 0x0078, + 0x2341, 0xa186, 0x0028, 0x00c0, 0x235a, 0x1078, 0x2ec7, 0x6008, + 0xa084, 0xffef, 0x600a, 0x6018, 0xa005, 0x0040, 0x2341, 0x8001, + 0x601a, 0xa005, 0x0040, 0x2341, 0x8001, 0xa005, 0x0040, 0x2341, + 0x601e, 0x681c, 0xa084, 0x0001, 0x0040, 0x1bff, 0x681c, 0xa084, 0xfffe, 0x681e, 0x7054, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, - 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x22df, 0x6002, 0x6006, - 0x0078, 0x1ba8, 0x017e, 0x1078, 0x23a0, 0x017f, 0xa684, 0xdf00, - 0x681a, 0x6827, 0x0000, 0x6f10, 0x81ff, 0x0040, 0x232b, 0xa186, - 0x0002, 0x00c0, 0x2323, 0xa684, 0x0800, 0x00c0, 0x22ff, 0xa684, - 0x0060, 0x0040, 0x22ff, 0x78d8, 0x7adc, 0x682e, 0x6a2a, 0x8717, - 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xa290, 0x3500, 0xa290, - 0x0000, 0x221c, 0xa384, 0x0100, 0x00c0, 0x2310, 0x0078, 0x2316, + 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, 0x2357, 0x6002, 0x6006, + 0x0078, 0x1bff, 0x017e, 0x1078, 0x241f, 0x017f, 0xa684, 0xdf00, + 0x681a, 0x6827, 0x0000, 0x6f10, 0x81ff, 0x0040, 0x23a3, 0xa186, + 0x0002, 0x00c0, 0x239b, 0xa684, 0x0800, 0x00c0, 0x2377, 0xa684, + 0x0060, 0x0040, 0x2377, 0x78d8, 0x7adc, 0x682e, 0x6a2a, 0x8717, + 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xa290, 0x3600, 0xa290, + 0x0000, 0x221c, 0xa384, 0x0100, 0x00c0, 0x2388, 0x0078, 0x238e, 0x8210, 0x2204, 0xa085, 0x0018, 0x2012, 0x8211, 0xa384, 0x0400, - 0x0040, 0x2323, 0x689c, 0xa084, 0x0100, 0x00c0, 0x2323, 0x1078, - 0x23fa, 0x0078, 0x1ba8, 0xa186, 0x0018, 0x0040, 0x232b, 0xa186, - 0x0014, 0x0040, 0x1ba8, 0x6912, 0x6814, 0xa084, 0x8000, 0x0040, - 0x2333, 0x7038, 0x6816, 0xa68c, 0xdf00, 0x691a, 0x1078, 0x2844, - 0x1078, 0x2853, 0x00c0, 0x2340, 0x6008, 0xa084, 0xffef, 0x600a, - 0x681c, 0xa084, 0x0001, 0x00c0, 0x2349, 0x1078, 0x283d, 0x0078, - 0x234d, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078, 0x17be, 0x0078, - 0x1ba8, 0xa282, 0x0004, 0x0048, 0x2357, 0x1078, 0x1b4e, 0x2200, - 0x0079, 0x235a, 0x235e, 0x2360, 0x2366, 0x2360, 0x1078, 0x1b4e, - 0x1078, 0x2ae4, 0x781b, 0x0069, 0x0078, 0x1ba0, 0x7890, 0x8007, - 0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, - 0x00ff, 0xa186, 0x0003, 0x0040, 0x2377, 0x0078, 0x2ac5, 0x781b, - 0x006a, 0x0078, 0x1ba0, 0x681c, 0xa085, 0x0004, 0x681e, 0x82ff, - 0x00c0, 0x2386, 0x1078, 0x2ae4, 0x0078, 0x238d, 0x8211, 0x0040, - 0x238b, 0x1078, 0x1b4e, 0x1078, 0x2af4, 0x781b, 0x0069, 0x0078, - 0x1ba0, 0x1078, 0x2cc6, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x239d, - 0x0018, 0x239d, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, - 0xa684, 0x0060, 0x00c0, 0x23aa, 0x682f, 0x0000, 0x682b, 0x0000, - 0x0078, 0x23f9, 0xa684, 0x0800, 0x00c0, 0x23b1, 0x1078, 0x2e0e, - 0x007c, 0xa684, 0x0020, 0x0040, 0x23d3, 0x78d0, 0x8003, 0x00c8, - 0x23bf, 0xa006, 0x1078, 0x30a0, 0x78d4, 0x1078, 0x3103, 0xa684, - 0x4000, 0x0040, 0x23c9, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078, - 0x23ae, 0x7038, 0xa005, 0x00c0, 0x23cd, 0x79d8, 0x7adc, 0x692e, - 0x6a2a, 0x0078, 0x23ae, 0xa684, 0x4000, 0x0040, 0x23dd, 0x682f, - 0x0000, 0x682b, 0x0000, 0x0078, 0x23ae, 0x7038, 0xa005, 0x00c0, - 0x23e3, 0x703b, 0x0007, 0x79d8, 0x7adc, 0x78d0, 0x80f3, 0x00c8, - 0x23ea, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e, - 0x6a2a, 0x2100, 0xa205, 0x00c0, 0x23f7, 0x0078, 0x23ae, 0x1078, - 0x30a0, 0x007c, 0xa384, 0x0200, 0x0040, 0x2402, 0x6008, 0xa085, - 0x0002, 0x600a, 0x6817, 0x0006, 0x6a28, 0x692c, 0x6a3a, 0x693e, - 0x682b, 0x0300, 0x682f, 0x0000, 0x6833, 0x2000, 0x6893, 0x0000, - 0x6897, 0x0020, 0x7000, 0x0079, 0x2415, 0x241d, 0x241f, 0x2428, - 0x241d, 0x241d, 0x241d, 0x241d, 0x241d, 0x1078, 0x1b4e, 0x681c, - 0xa084, 0x0001, 0x00c0, 0x2428, 0x1078, 0x283d, 0x0078, 0x242e, - 0x7054, 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, 0x2021, 0x3457, - 0x2404, 0xa005, 0x0040, 0x2437, 0x2020, 0x0078, 0x2430, 0x2d22, - 0x206b, 0x0000, 0x007c, 0x77b4, 0x1078, 0x2b01, 0xa7bc, 0x0f00, - 0x1078, 0x2bfc, 0x6018, 0xa005, 0x0040, 0x246a, 0x0d7e, 0x2001, - 0x3e90, 0x2068, 0x0d7f, 0x2021, 0x3e80, 0x2009, 0x0004, 0x2011, - 0x0010, 0x1078, 0x1f69, 0x0040, 0x246a, 0x157e, 0x20a9, 0x0000, - 0x2021, 0x3d80, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, - 0x1f69, 0x047f, 0x0040, 0x2469, 0x8420, 0x0070, 0x2469, 0x0078, - 0x245a, 0x157f, 0x8738, 0xa784, 0x0007, 0x00c0, 0x2440, 0x0078, - 0x1ba8, 0x1078, 0x2844, 0x1078, 0x2853, 0x6827, 0x0000, 0x789b, - 0x000e, 0x6f10, 0x6813, 0x0002, 0x1078, 0x30d4, 0xa684, 0x0800, - 0x0040, 0x2486, 0x6918, 0xa18d, 0x2000, 0x691a, 0x6814, 0xa084, - 0x8000, 0x0040, 0x248d, 0x6817, 0x0000, 0x2021, 0x3457, 0x6800, - 0x2022, 0x6a38, 0x693c, 0x6a2a, 0x692e, 0x1078, 0x17be, 0x0078, - 0x1ba8, 0x1078, 0x23a0, 0x6827, 0x0000, 0x789b, 0x000e, 0x6f10, - 0x1078, 0x2ccb, 0xa08c, 0x00ff, 0x6912, 0x6814, 0xa084, 0x8000, - 0x0040, 0x24ac, 0x7038, 0x6816, 0xa68c, 0xdf00, 0x691a, 0x70a3, - 0x0000, 0x0078, 0x1ba8, 0xa006, 0x1078, 0x2e0e, 0x6813, 0x0000, - 0x6817, 0x0001, 0xa68c, 0xdf00, 0x691a, 0x6827, 0x0000, 0x7000, - 0x0079, 0x24c2, 0x24ca, 0x24cc, 0x24cc, 0x24ce, 0x24ce, 0x24ce, - 0x24ca, 0x24ca, 0x1078, 0x1b4e, 0x1078, 0x2853, 0x6008, 0xa084, - 0xffef, 0x600a, 0x0078, 0x281e, 0x2300, 0x0079, 0x24d7, 0x24da, - 0x24dc, 0x251a, 0x1078, 0x1b4e, 0x7000, 0x0079, 0x24df, 0x24e7, - 0x24e9, 0x24e9, 0x24f4, 0x24e9, 0x24fb, 0x24e7, 0x24e7, 0x1078, - 0x1b4e, 0xa684, 0x2000, 0x00c0, 0x24f4, 0xa6b5, 0x2000, 0x7e5a, - 0x1078, 0x2ffc, 0x0078, 0x2c7f, 0x6814, 0xa084, 0x8000, 0x0040, - 0x24fb, 0x6817, 0x0007, 0x2009, 0x3418, 0x210c, 0xa186, 0x0000, - 0x0040, 0x2510, 0xa186, 0x0001, 0x0040, 0x2514, 0x2009, 0x342b, - 0x200b, 0x000b, 0x70a3, 0x0001, 0x781b, 0x0046, 0x0078, 0x1ba0, - 0x781b, 0x00dd, 0x0078, 0x1ba0, 0x2009, 0x342b, 0x200b, 0x000a, - 0x0078, 0x1ba0, 0x1078, 0x1b4e, 0x2300, 0x0079, 0x251f, 0x2522, - 0x2524, 0x2547, 0x1078, 0x1b4e, 0x7000, 0x0079, 0x2527, 0x252f, - 0x2531, 0x2531, 0x253c, 0x2531, 0x2543, 0x252f, 0x252f, 0x1078, - 0x1b4e, 0xa684, 0x2000, 0x00c0, 0x253c, 0xa6b5, 0x2000, 0x7e5a, - 0x1078, 0x2ffc, 0x0078, 0x2c7f, 0x6814, 0xa084, 0x8000, 0x0040, - 0x2543, 0x6817, 0x0007, 0x781b, 0x00e4, 0x0078, 0x1ba0, 0x681c, - 0xa085, 0x0004, 0x681e, 0x1078, 0x2c4a, 0xa6b5, 0x0800, 0x1078, - 0x2ae4, 0x781b, 0x0069, 0x0078, 0x1ba0, 0x2300, 0x0079, 0x2558, - 0x255b, 0x255d, 0x255f, 0x1078, 0x1b4e, 0x1078, 0x1b4e, 0xa684, - 0x0400, 0x00c0, 0x257e, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, - 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xa184, 0x0020, 0x0040, - 0x2576, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x257a, 0x2001, 0x0014, - 0x0078, 0x2282, 0xa184, 0x0007, 0x0079, 0x25b6, 0x7a90, 0xa294, - 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0040, 0x25b4, 0x789b, - 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, 0x25a5, 0x7ba8, 0x7ba8, - 0xa386, 0x0001, 0x00c0, 0x2598, 0x2009, 0xfff7, 0x0078, 0x259e, - 0xa386, 0x0003, 0x00c0, 0x25a5, 0x2009, 0xffef, 0x0c7e, 0x7048, - 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, - 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x691c, 0xa18c, - 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2c7f, 0x1fc3, 0x1fc9, - 0x25c0, 0x25c8, 0x25be, 0x25be, 0x25be, 0x2c7f, 0x1078, 0x1b4e, - 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2c87, - 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2c7f, - 0x79e4, 0xa184, 0x0030, 0x0040, 0x25da, 0x78ec, 0xa084, 0x0003, - 0x00c0, 0x25e2, 0x6814, 0xa085, 0x8000, 0x6816, 0x2001, 0x0014, - 0x0078, 0x2282, 0xa184, 0x0007, 0x0079, 0x25e6, 0x2c7f, 0x2c7f, - 0x25ee, 0x2c7f, 0x2ca7, 0x2ca7, 0x2c7f, 0x2c7f, 0xa684, 0x0400, - 0x00c0, 0x261f, 0x681c, 0xa084, 0x0001, 0x0040, 0x2c87, 0xa68c, - 0x2060, 0xa18c, 0xfffb, 0x795a, 0x69b2, 0x789b, 0x0060, 0x78ab, - 0x0000, 0x789b, 0x0061, 0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, - 0x157e, 0x137e, 0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, - 0x80ac, 0xad80, 0x000a, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, - 0x6810, 0x8007, 0x789b, 0x007e, 0x78aa, 0x0078, 0x2c87, 0x6814, - 0xa084, 0x8000, 0x0040, 0x2626, 0x6817, 0x0008, 0x781b, 0x00d8, - 0x0078, 0x1ba0, 0x2300, 0x0079, 0x262d, 0x2632, 0x26ac, 0x2630, - 0x1078, 0x1b4e, 0x7000, 0xa084, 0x0007, 0x0079, 0x2637, 0x263f, - 0x2641, 0x265d, 0x263f, 0x263f, 0x243b, 0x263f, 0x263f, 0x1078, - 0x1b4e, 0x691c, 0xa18d, 0x0001, 0x691e, 0x6800, 0x6006, 0xa005, - 0x00c0, 0x264b, 0x6002, 0x6818, 0xa084, 0x000e, 0x0040, 0x2657, - 0x7014, 0x68b6, 0x712c, 0xa188, 0x3d80, 0x0078, 0x2659, 0x2009, - 0x3e80, 0x2104, 0x6802, 0x2d0a, 0x7156, 0x691c, 0x691e, 0x6eb2, - 0xa684, 0x0060, 0x0040, 0x26aa, 0xa684, 0x0800, 0x00c0, 0x266e, - 0x6890, 0x6894, 0x1078, 0x2e0e, 0x0078, 0x26aa, 0xa684, 0x0020, - 0x0040, 0x2680, 0xa006, 0x1078, 0x30a0, 0x78d0, 0x8003, 0x00c8, - 0x267c, 0x78d4, 0x1078, 0x3103, 0x79d8, 0x7adc, 0x0078, 0x2684, - 0x1078, 0x2c09, 0x1078, 0x30a0, 0xa684, 0x8000, 0x0040, 0x26aa, - 0xa684, 0x7fff, 0x68b2, 0x789b, 0x0074, 0x1078, 0x2ccb, 0x2010, - 0x1078, 0x2ccb, 0x2008, 0xa684, 0x0020, 0x00c0, 0x26a2, 0x1078, - 0x2ccb, 0x801b, 0x00c8, 0x269d, 0x8000, 0xa084, 0x003f, 0xa108, - 0xa291, 0x0000, 0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90, 0x2200, - 0xa303, 0x68aa, 0x0078, 0x1ba8, 0x0078, 0x2ad1, 0x7033, 0x0000, - 0xa282, 0x0005, 0x0050, 0x26b6, 0x1078, 0x1b4e, 0x2300, 0x0079, - 0x26b9, 0x26bc, 0x26c6, 0x26e9, 0x2200, 0x0079, 0x26bf, 0x26c4, - 0x2ad1, 0x26c4, 0x2712, 0x2763, 0x1078, 0x1b4e, 0x7000, 0xa086, - 0x0001, 0x00c0, 0x26d3, 0x1078, 0x2853, 0x1078, 0x2e0e, 0x7034, - 0x600a, 0x0078, 0x26d8, 0x7000, 0xa086, 0x0003, 0x0040, 0x26cd, - 0x7003, 0x0005, 0x2001, 0x3e90, 0x2068, 0x703e, 0x7032, 0x2200, - 0x0079, 0x26e2, 0x2ad1, 0x26e7, 0x2712, 0x26e7, 0x2ad1, 0x1078, - 0x1b4e, 0x7000, 0xa086, 0x0001, 0x00c0, 0x26f6, 0x1078, 0x2853, - 0x1078, 0x2e0e, 0x7034, 0x600a, 0x0078, 0x26fb, 0x7000, 0xa086, - 0x0003, 0x0040, 0x26f0, 0x7003, 0x0005, 0x2001, 0x3e90, 0x2068, - 0x703e, 0x7032, 0x2200, 0x0079, 0x2705, 0x270c, 0x270a, 0x270c, - 0x270a, 0x270c, 0x1078, 0x1b4e, 0x1078, 0x2af4, 0x781b, 0x0069, - 0x0078, 0x1ba0, 0x7000, 0xa086, 0x0001, 0x00c0, 0x271f, 0x1078, - 0x2853, 0x1078, 0x2e0e, 0x7034, 0x600a, 0x0078, 0x2724, 0x7000, - 0xa086, 0x0003, 0x0040, 0x2719, 0x7003, 0x0002, 0x7a80, 0xa294, - 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, 0x2069, - 0x3e80, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040, 0x273f, - 0x6810, 0xa206, 0x0040, 0x2758, 0x6800, 0x0078, 0x2732, 0x7003, - 0x0005, 0x2001, 0x3e90, 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, - 0x002e, 0x2003, 0x0000, 0x8000, 0x0070, 0x2750, 0x0078, 0x2749, - 0x157f, 0x6a12, 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823, 0x0003, - 0x6eb0, 0x7e5a, 0x681c, 0xa084, 0x0c00, 0x0040, 0x27b9, 0x1078, - 0x2aec, 0x0078, 0x27b9, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2770, - 0x1078, 0x2853, 0x1078, 0x2e0e, 0x7034, 0x600a, 0x0078, 0x2775, - 0x7000, 0xa086, 0x0003, 0x0040, 0x276a, 0x7003, 0x0002, 0x7a80, - 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, - 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0xa1e8, 0x3d80, 0x2d04, 0x2d08, - 0x7156, 0x2068, 0xa005, 0x0040, 0x2794, 0x6810, 0xa206, 0x0040, - 0x27ad, 0x6800, 0x0078, 0x2787, 0x7003, 0x0005, 0x2001, 0x3e90, - 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002e, 0x2003, 0x0000, - 0x8000, 0x0070, 0x27a5, 0x0078, 0x279e, 0x157f, 0x6a12, 0x68b3, - 0x0700, 0x681f, 0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a, 0x681c, - 0xa084, 0x0c00, 0x0040, 0x27b9, 0x1078, 0x2ae8, 0x7e58, 0x0078, - 0x27b9, 0x027e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, - 0xa080, 0x3500, 0x2060, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, - 0xa684, 0x0060, 0x0040, 0x27ea, 0x6b94, 0x6c90, 0x69a8, 0x68ac, - 0xa105, 0x00c0, 0x27db, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x1078, - 0x2ffc, 0x0078, 0x27ea, 0x68ac, 0xa31a, 0x2100, 0xa423, 0x2400, - 0xa305, 0x0040, 0x27ea, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68ac, - 0x1078, 0x3029, 0x077f, 0x1078, 0x2bfc, 0x2009, 0x006a, 0xa684, - 0x0008, 0x0040, 0x27f5, 0x2009, 0x0069, 0xa6b5, 0x2000, 0x7e5a, - 0x791a, 0x2d00, 0x703e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, - 0x8003, 0xa080, 0x3500, 0x2048, 0x0078, 0x1ba0, 0x6020, 0xa005, - 0x0040, 0x2812, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, - 0x7010, 0x6026, 0x007c, 0xa006, 0x1078, 0x2e0e, 0x6813, 0x0000, - 0x6817, 0x0001, 0x681f, 0x0040, 0x681b, 0x0100, 0x7000, 0xa084, - 0x0007, 0x0079, 0x2823, 0x282b, 0x282d, 0x282d, 0x2839, 0x2835, - 0x282b, 0x282b, 0x282b, 0x1078, 0x1b4e, 0x1078, 0x2844, 0x1078, - 0x283d, 0x1078, 0x17be, 0x0078, 0x1ba8, 0x70a3, 0x0000, 0x0078, - 0x1ba8, 0x6817, 0x0000, 0x0078, 0x2471, 0x6800, 0xa005, 0x00c0, - 0x2842, 0x6002, 0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x284d, - 0x8001, 0x00d0, 0x284d, 0x1078, 0x1b4e, 0x6012, 0x6008, 0xa084, - 0xffef, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x2859, 0x8001, - 0x601a, 0x007c, 0x1078, 0x2cc6, 0x6814, 0xa084, 0x8000, 0x0040, - 0x2863, 0x6817, 0x0018, 0x0078, 0x2894, 0x1078, 0x2cc6, 0x6814, - 0xa084, 0x8000, 0x0040, 0x286e, 0x6817, 0x0019, 0x0078, 0x2894, - 0x1078, 0x2cc6, 0x6814, 0xa084, 0x8000, 0x0040, 0x2879, 0x6817, - 0x001a, 0x0078, 0x2894, 0x71b8, 0xa18c, 0x00ff, 0xa1e8, 0x3d80, - 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x2888, 0x0078, 0x1ba8, - 0x6810, 0x72b4, 0xa206, 0x0040, 0x2890, 0x6800, 0x0078, 0x2881, - 0x6800, 0x200a, 0x6817, 0x0005, 0x681b, 0x0000, 0x681f, 0x0020, - 0x1078, 0x2844, 0x1078, 0x283d, 0x1078, 0x17be, 0x0078, 0x1ba8, - 0xa282, 0x0003, 0x00c0, 0x2ac5, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8, - 0xa6b4, 0x00ff, 0x691c, 0xa18d, 0x0080, 0x691e, 0xa184, 0x0100, - 0x0040, 0x2900, 0xa18c, 0xfeff, 0x691e, 0xa6b4, 0x00ff, 0x0040, - 0x28ea, 0xa682, 0x000f, 0x0048, 0x28c1, 0x0040, 0x28c1, 0x2031, - 0x000f, 0x852b, 0x852b, 0x1078, 0x2b7f, 0x0040, 0x28cb, 0x1078, - 0x299a, 0x0078, 0x28f3, 0x1078, 0x2b3a, 0x0c7e, 0x2960, 0x6004, - 0xa084, 0xfff5, 0x6006, 0x1078, 0x29be, 0x0c7f, 0x691c, 0xa18d, - 0x0100, 0x691e, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, - 0x00c0, 0x28e6, 0x781b, 0x0055, 0x0078, 0x1ba0, 0x781b, 0x0069, - 0x0078, 0x1ba0, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, - 0x1078, 0x29be, 0x0c7f, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x28fc, - 0x781b, 0x0058, 0x0078, 0x1ba0, 0x781b, 0x006a, 0x0078, 0x1ba0, - 0x0c7e, 0x7048, 0x2060, 0x6100, 0xa18c, 0x1000, 0x0040, 0x2940, - 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000f, 0x0048, 0x2914, - 0x0040, 0x2914, 0x2011, 0x000f, 0x2600, 0xa202, 0x00c8, 0x2919, - 0x2230, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, - 0x2929, 0xa282, 0x0019, 0x00c8, 0x292f, 0x2011, 0x0019, 0x0078, - 0x292f, 0xa282, 0x000c, 0x00c8, 0x292f, 0x2011, 0x000c, 0x2200, - 0xa502, 0x00c8, 0x2934, 0x2228, 0x1078, 0x2b3e, 0x852b, 0x852b, - 0x1078, 0x2b7f, 0x0040, 0x2940, 0x1078, 0x299a, 0x0078, 0x2944, - 0x1078, 0x2b3a, 0x1078, 0x29be, 0x7858, 0xa085, 0x0004, 0x785a, - 0x0c7f, 0x781b, 0x0069, 0x0078, 0x1ba0, 0x0c7e, 0x2960, 0x6000, - 0xa084, 0x1000, 0x00c0, 0x2968, 0x6010, 0xa084, 0x000f, 0x00c0, - 0x2962, 0xa18c, 0x0002, 0x00c0, 0x2962, 0xa18c, 0xfff5, 0x6106, - 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x298a, - 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x2978, - 0xa282, 0x0019, 0x00c8, 0x297e, 0x2011, 0x0019, 0x0078, 0x297e, - 0xa282, 0x000c, 0x00c8, 0x297e, 0x2011, 0x000c, 0x6308, 0x831f, - 0xa39c, 0x00ff, 0xa382, 0x000f, 0x0048, 0x298a, 0x0040, 0x298a, - 0x2019, 0x000f, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, - 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x681c, 0xa085, 0x0100, 0x681e, - 0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008, 0xa084, 0xfff0, - 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084, - 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, 0x788a, 0xa6b4, - 0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, 0x600e, - 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, 0x7048, - 0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012, - 0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c, 0xa282, 0x0002, - 0x00c0, 0x2ac5, 0x7aa8, 0x691c, 0xa18d, 0x0080, 0x691e, 0xa184, - 0x0200, 0x0040, 0x2a13, 0xa18c, 0xfdff, 0x691e, 0xa294, 0x00ff, - 0xa282, 0x0002, 0x00c8, 0x2ac5, 0x1078, 0x2a5a, 0x1078, 0x29be, - 0xa980, 0x0001, 0x200c, 0x1078, 0x2bf8, 0x1078, 0x294d, 0x88ff, - 0x0040, 0x2a06, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, - 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2a02, 0x781b, 0x0055, - 0x0078, 0x1ba0, 0x781b, 0x0069, 0x0078, 0x1ba0, 0x7e58, 0xa684, - 0x0400, 0x00c0, 0x2a0f, 0x781b, 0x0058, 0x0078, 0x1ba0, 0x781b, - 0x006a, 0x0078, 0x1ba0, 0xa282, 0x0002, 0x00c8, 0x2a1b, 0xa284, - 0x0001, 0x0040, 0x2a25, 0x7148, 0xa188, 0x0000, 0x210c, 0xa18c, - 0x2000, 0x00c0, 0x2a25, 0x2011, 0x0000, 0x1078, 0x2b2c, 0x1078, - 0x2a5a, 0x1078, 0x29be, 0x7858, 0xa085, 0x0004, 0x785a, 0x781b, - 0x0069, 0x0078, 0x1ba0, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, - 0x0001, 0xa084, 0x2000, 0x00c0, 0x2a4a, 0x6014, 0xa084, 0x0040, - 0x00c0, 0x2a48, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, 0x2a57, - 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, - 0x7aaa, 0xa8c0, 0x0004, 0x681c, 0xa085, 0x0200, 0x681e, 0x027f, - 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, 0x0040, 0x2a62, - 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, - 0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, 0xffef, - 0x6006, 0x0c7f, 0x007c, 0xa684, 0x0020, 0x0040, 0x2ac1, 0x7888, - 0xa084, 0x0040, 0x0040, 0x2ac1, 0x78a8, 0x8001, 0x0040, 0x2a80, - 0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x2a87, 0x8000, 0xa005, - 0x0040, 0x2aa8, 0x831b, 0x00c8, 0x2a90, 0x8001, 0x0040, 0x2abd, - 0xa006, 0x1078, 0x30a0, 0x78b4, 0x1078, 0x3103, 0x0078, 0x2ac1, - 0xa684, 0x4000, 0x0040, 0x2aa8, 0x78b8, 0x801b, 0x00c8, 0x2aa1, - 0x8000, 0xa084, 0x003f, 0x00c0, 0x2abd, 0xa6b4, 0xbfff, 0x7e5a, - 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x2ab1, 0xa291, - 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x30a0, 0x781b, - 0x0067, 0x1078, 0x2f6a, 0x0078, 0x1ba0, 0x781b, 0x0067, 0x0078, - 0x1ba0, 0x781b, 0x006a, 0x0078, 0x1ba0, 0x1078, 0x2af8, 0x781b, - 0x0069, 0x0078, 0x1ba0, 0x1078, 0x2ae4, 0x781b, 0x0069, 0x0078, - 0x1ba0, 0x6823, 0x0002, 0x1078, 0x2aec, 0x691c, 0xa18d, 0x0020, - 0x691e, 0x6814, 0xa084, 0x8000, 0x0040, 0x2ae0, 0x6817, 0x0005, - 0x781b, 0x0069, 0x0078, 0x1ba0, 0x2001, 0x0005, 0x0078, 0x2afa, - 0x2001, 0x000c, 0x0078, 0x2afa, 0x2001, 0x0006, 0x0078, 0x2afa, - 0x2001, 0x000d, 0x0078, 0x2afa, 0x2001, 0x0009, 0x0078, 0x2afa, - 0x2001, 0x0007, 0x789b, 0x007f, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, - 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, - 0xa0e0, 0x3500, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, - 0x0040, 0x2b1a, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, - 0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, - 0x0040, 0x2b2a, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, - 0x0010, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, - 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, - 0x0004, 0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, - 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, - 0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, - 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, - 0xfff0, 0x2001, 0x3446, 0x2004, 0xa082, 0x0028, 0x0040, 0x2b68, - 0x2021, 0x2bdf, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x2b6e, - 0x2021, 0x2beb, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, - 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, 0x2b7d, 0x8420, 0x2300, - 0xa210, 0x0070, 0x2b7d, 0x0078, 0x2b70, 0x157f, 0x007c, 0x157e, - 0x2011, 0x3446, 0x2214, 0xa282, 0x0032, 0x0048, 0x2b93, 0x0040, - 0x2b97, 0x2021, 0x2bd1, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, - 0x0032, 0x0078, 0x2ba7, 0xa282, 0x0028, 0x0040, 0x2b9f, 0x2021, - 0x2bdf, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x2ba5, 0x2021, - 0x2beb, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, - 0xa502, 0x0040, 0x2bb7, 0x0048, 0x2bb7, 0x8420, 0x2300, 0xa210, - 0x0070, 0x2bb4, 0x0078, 0x2ba7, 0x157f, 0xa006, 0x007c, 0x157f, - 0xa582, 0x0064, 0x00c8, 0x2bc0, 0x7808, 0xa085, 0x0040, 0x780a, - 0x78ec, 0xa084, 0x0300, 0x0040, 0x2bce, 0x2404, 0xa09e, 0x2002, - 0x00c0, 0x2bce, 0x2001, 0x2101, 0x0078, 0x2bcf, 0x2404, 0xa005, - 0x007c, 0x2002, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, 0x5604, - 0x6605, 0x6805, 0x7806, 0x7a06, 0x0a07, 0x0c07, 0x0e07, 0x3202, - 0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, - 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202, 0x5404, - 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, - 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, - 0x0007, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0, 0x3580, - 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x2c10, 0x8000, - 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, - 0x0100, 0x2009, 0x3440, 0x2091, 0x8000, 0x2104, 0x0079, 0x2c20, - 0x2c46, 0x2c2a, 0x2c2a, 0x2c2a, 0x2c2a, 0x2c2a, 0x2c28, 0x2c28, - 0x1078, 0x1b4e, 0x784b, 0x0004, 0x68b0, 0xa085, 0x4000, 0x68b2, - 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080, 0x00c0, - 0x2c46, 0x0018, 0x2c46, 0x6818, 0xa084, 0x0020, 0x00c0, 0x2c44, - 0x781b, 0x00dd, 0x0078, 0x2c46, 0x781b, 0x00e4, 0x2091, 0x8001, - 0x0f7f, 0x007c, 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f, 0x8003, - 0x8003, 0x8003, 0xa0e0, 0x3500, 0x6004, 0xa084, 0x000a, 0x00c0, - 0x2c7d, 0x6108, 0xa194, 0xff00, 0x0040, 0x2c7d, 0xa18c, 0x00ff, - 0x2001, 0x0019, 0xa106, 0x0040, 0x2c6c, 0x2001, 0x0032, 0xa106, - 0x0040, 0x2c70, 0x0078, 0x2c74, 0x2009, 0x0020, 0x0078, 0x2c76, - 0x2009, 0x003f, 0x0078, 0x2c76, 0x2011, 0x0000, 0x2100, 0xa205, - 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c, 0x781b, - 0x006a, 0x0078, 0x1ba0, 0x781b, 0x0069, 0x0078, 0x1ba0, 0x781b, - 0x0058, 0x0078, 0x1ba0, 0x781b, 0x0055, 0x0078, 0x1ba0, 0x781b, - 0x00dd, 0x0078, 0x1ba0, 0x781b, 0x00dc, 0x0078, 0x1ba0, 0x781b, - 0x00e4, 0x0078, 0x1ba0, 0x781b, 0x00e3, 0x0078, 0x1ba0, 0x781b, - 0x009e, 0x0078, 0x1ba0, 0x781b, 0x009d, 0x0078, 0x1ba0, 0x70a3, - 0x0001, 0x781b, 0x0046, 0x0078, 0x1ba0, 0x007e, 0x7830, 0xa084, - 0x00c0, 0x00c0, 0x2cc4, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, - 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x2cc4, - 0x7808, 0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0x7808, 0xa085, - 0x0002, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, 0x2ccb, - 0x0098, 0x2cd4, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, + 0x0040, 0x239b, 0x689c, 0xa084, 0x0100, 0x00c0, 0x239b, 0x1078, + 0x2491, 0x0078, 0x1bff, 0xa186, 0x0018, 0x0040, 0x23a3, 0xa186, + 0x0014, 0x0040, 0x1bff, 0x6912, 0x6814, 0xa084, 0x8000, 0x0040, + 0x23ab, 0x7038, 0x6816, 0xa68c, 0xdf00, 0x691a, 0x1078, 0x28e0, + 0x1078, 0x28ef, 0x00c0, 0x23b8, 0x6008, 0xa084, 0xffef, 0x600a, + 0x681c, 0xa084, 0x0001, 0x00c0, 0x23c1, 0x1078, 0x28d9, 0x0078, + 0x23c5, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078, 0x17dd, 0x0078, + 0x1bff, 0xa282, 0x0004, 0x0048, 0x23cf, 0x1078, 0x1ba5, 0x2200, + 0x0079, 0x23d2, 0x23d6, 0x23d8, 0x23e5, 0x23d8, 0x1078, 0x1ba5, + 0x7000, 0xa086, 0x0005, 0x0040, 0x23e1, 0x1078, 0x2b89, 0x781b, + 0x0069, 0x781b, 0x006a, 0x0078, 0x1bf7, 0x7890, 0x8007, 0x8001, + 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, + 0xa186, 0x0003, 0x0040, 0x23f6, 0x0078, 0x2b6a, 0x781b, 0x006a, + 0x0078, 0x1bf7, 0x681c, 0xa085, 0x0004, 0x681e, 0x82ff, 0x00c0, + 0x2405, 0x1078, 0x2b89, 0x0078, 0x240c, 0x8211, 0x0040, 0x240a, + 0x1078, 0x1ba5, 0x1078, 0x2b99, 0x781b, 0x0069, 0x0078, 0x1bf7, + 0x1078, 0x2d77, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x241c, 0x0018, + 0x241c, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, + 0x0060, 0x00c0, 0x2429, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078, + 0x2490, 0xa684, 0x0800, 0x00c0, 0x2438, 0x68b0, 0xa084, 0x4800, + 0xa635, 0xa684, 0x0800, 0x00c0, 0x2438, 0x1078, 0x2ec7, 0x007c, + 0xa684, 0x0020, 0x0040, 0x2462, 0x78d0, 0x8003, 0x00c8, 0x2446, + 0xa006, 0x1078, 0x3194, 0x78d4, 0x1078, 0x31f9, 0xa684, 0x4000, + 0x0040, 0x2450, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078, 0x2435, + 0x68b0, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x244a, + 0x7038, 0xa005, 0x00c0, 0x245c, 0x79d8, 0x7adc, 0x692e, 0x6a2a, + 0x0078, 0x2435, 0xa684, 0x4000, 0x0040, 0x246c, 0x682f, 0x0000, + 0x682b, 0x0000, 0x0078, 0x2435, 0x68b0, 0xa084, 0x4800, 0xa635, + 0xa684, 0x4000, 0x00c0, 0x2466, 0x7038, 0xa005, 0x00c0, 0x247a, + 0x703b, 0x0007, 0x79d8, 0x7adc, 0x78d0, 0x80f3, 0x00c8, 0x2481, + 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a2a, + 0x2100, 0xa205, 0x00c0, 0x248e, 0x0078, 0x2435, 0x1078, 0x3194, + 0x007c, 0xa384, 0x0200, 0x0040, 0x2499, 0x6008, 0xa085, 0x0002, + 0x600a, 0x6817, 0x0006, 0x6a28, 0x692c, 0x6a3a, 0x693e, 0x682b, + 0x0300, 0x682f, 0x0000, 0x6833, 0x2000, 0x6893, 0x0000, 0x6897, + 0x0020, 0x7000, 0x0079, 0x24ac, 0x24b4, 0x24b6, 0x24bf, 0x24b4, + 0x24b4, 0x24b4, 0x24b4, 0x24b4, 0x1078, 0x1ba5, 0x681c, 0xa084, + 0x0001, 0x00c0, 0x24bf, 0x1078, 0x28d9, 0x0078, 0x24c5, 0x7054, + 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, 0x2021, 0x3557, 0x2404, + 0xa005, 0x0040, 0x24ce, 0x2020, 0x0078, 0x24c7, 0x2d22, 0x206b, + 0x0000, 0x007c, 0x77b4, 0x1078, 0x2ba6, 0xa7bc, 0x0f00, 0x1078, + 0x2ca1, 0x6018, 0xa005, 0x0040, 0x2501, 0x0d7e, 0x2001, 0x3f90, + 0x2068, 0x0d7f, 0x2021, 0x3f80, 0x2009, 0x0004, 0x2011, 0x0010, + 0x1078, 0x1fc5, 0x0040, 0x2501, 0x157e, 0x20a9, 0x0000, 0x2021, + 0x3e80, 0x047e, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x1fc5, + 0x047f, 0x0040, 0x2500, 0x8420, 0x0070, 0x2500, 0x0078, 0x24f1, + 0x157f, 0x8738, 0xa784, 0x0007, 0x00c0, 0x24d7, 0x0078, 0x1bff, + 0x1078, 0x28e0, 0x1078, 0x28ef, 0x6827, 0x0000, 0x789b, 0x000e, + 0x6f10, 0x6813, 0x0002, 0x1078, 0x31ca, 0xa684, 0x0800, 0x0040, + 0x251d, 0x6918, 0xa18d, 0x2000, 0x691a, 0x6814, 0xa084, 0x8000, + 0x0040, 0x2524, 0x6817, 0x0000, 0x2021, 0x3557, 0x6800, 0x2022, + 0x6a38, 0x693c, 0x6a2a, 0x692e, 0x1078, 0x17dd, 0x0078, 0x1bff, + 0x1078, 0x241f, 0x6827, 0x0000, 0x789b, 0x000e, 0x6f10, 0x1078, + 0x2d7c, 0xa08c, 0x00ff, 0x6912, 0x6814, 0xa084, 0x8000, 0x0040, + 0x2543, 0x7038, 0x6816, 0xa68c, 0xdf00, 0x691a, 0x70a3, 0x0000, + 0x0078, 0x1bff, 0xa006, 0x1078, 0x2ec7, 0x6813, 0x0000, 0x6817, + 0x0001, 0xa68c, 0xdf00, 0x691a, 0x6827, 0x0000, 0x7000, 0x0079, + 0x2559, 0x2561, 0x2563, 0x2563, 0x2565, 0x2565, 0x2565, 0x2561, + 0x2561, 0x1078, 0x1ba5, 0x1078, 0x28ef, 0x6008, 0xa084, 0xffef, + 0x600a, 0x0078, 0x28ba, 0x2300, 0x0079, 0x256e, 0x2571, 0x2573, + 0x25b1, 0x1078, 0x1ba5, 0x7000, 0x0079, 0x2576, 0x257e, 0x2580, + 0x2580, 0x258b, 0x2580, 0x2592, 0x257e, 0x257e, 0x1078, 0x1ba5, + 0xa684, 0x2000, 0x00c0, 0x258b, 0xa6b5, 0x2000, 0x7e5a, 0x1078, + 0x30f0, 0x0078, 0x2d30, 0x6814, 0xa084, 0x8000, 0x0040, 0x2592, + 0x6817, 0x0007, 0x2009, 0x3518, 0x210c, 0xa186, 0x0000, 0x0040, + 0x25a7, 0xa186, 0x0001, 0x0040, 0x25ab, 0x2009, 0x352b, 0x200b, + 0x000b, 0x70a3, 0x0001, 0x781b, 0x0046, 0x0078, 0x1bf7, 0x781b, + 0x00dd, 0x0078, 0x1bf7, 0x2009, 0x352b, 0x200b, 0x000a, 0x0078, + 0x1bf7, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x25b6, 0x25b9, 0x25bb, + 0x25de, 0x1078, 0x1ba5, 0x7000, 0x0079, 0x25be, 0x25c6, 0x25c8, + 0x25c8, 0x25d3, 0x25c8, 0x25da, 0x25c6, 0x25c6, 0x1078, 0x1ba5, + 0xa684, 0x2000, 0x00c0, 0x25d3, 0xa6b5, 0x2000, 0x7e5a, 0x1078, + 0x30f0, 0x0078, 0x2d30, 0x6814, 0xa084, 0x8000, 0x0040, 0x25da, + 0x6817, 0x0007, 0x781b, 0x00e4, 0x0078, 0x1bf7, 0x681c, 0xa085, + 0x0004, 0x681e, 0xa6b5, 0x0800, 0x1078, 0x2b89, 0x781b, 0x0069, + 0x0078, 0x1bf7, 0x2300, 0x0079, 0x25ed, 0x25f0, 0x25f2, 0x25f4, + 0x1078, 0x1ba5, 0x1078, 0x1ba5, 0xa684, 0x0400, 0x00c0, 0x2613, + 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, + 0x785a, 0x79e4, 0xa184, 0x0020, 0x0040, 0x260b, 0x78ec, 0xa084, + 0x0003, 0x00c0, 0x260f, 0x2001, 0x0014, 0x0078, 0x22fa, 0xa184, + 0x0007, 0x0079, 0x264b, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, + 0x79a8, 0x81ff, 0x0040, 0x2649, 0x789b, 0x0010, 0x7ba8, 0xa384, + 0x0001, 0x00c0, 0x263a, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, + 0x262d, 0x2009, 0xfff7, 0x0078, 0x2633, 0xa386, 0x0003, 0x00c0, + 0x263a, 0x2009, 0xffef, 0x0c7e, 0x7048, 0x2060, 0x6004, 0xa104, + 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, + 0x785a, 0x782b, 0x3009, 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff, + 0x691e, 0x0078, 0x2d30, 0x2023, 0x2029, 0x2655, 0x265d, 0x2653, + 0x2653, 0x2653, 0x2d30, 0x1078, 0x1ba5, 0x691c, 0xa18c, 0xfdff, + 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2d38, 0x691c, 0xa18c, 0xfdff, + 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2d30, 0x79e4, 0xa184, 0x0030, + 0x0040, 0x266f, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x2677, 0x6814, + 0xa085, 0x8000, 0x6816, 0x2001, 0x0014, 0x0078, 0x22fa, 0xa184, + 0x0007, 0x0079, 0x267b, 0x2d30, 0x2d30, 0x2683, 0x2d30, 0x2d58, + 0x2d58, 0x2d30, 0x2d30, 0xa684, 0x0400, 0x00c0, 0x26b4, 0x681c, + 0xa084, 0x0001, 0x0040, 0x2d38, 0xa68c, 0x2060, 0xa18c, 0xfffb, + 0x795a, 0x69b2, 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, + 0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, 0x157e, 0x137e, 0x147e, + 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000a, + 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6810, 0x8007, 0x789b, + 0x007e, 0x78aa, 0x0078, 0x2d38, 0x6814, 0xa084, 0x8000, 0x0040, + 0x26bb, 0x6817, 0x0008, 0x781b, 0x00d8, 0x0078, 0x1bf7, 0x2300, + 0x0079, 0x26c2, 0x26c7, 0x2742, 0x26c5, 0x1078, 0x1ba5, 0x7000, + 0xa084, 0x0007, 0x0079, 0x26cc, 0x26d4, 0x26d6, 0x26f2, 0x26d4, + 0x26d4, 0x24d2, 0x26d4, 0x26d4, 0x1078, 0x1ba5, 0x691c, 0xa18d, + 0x0001, 0x691e, 0x6800, 0x6006, 0xa005, 0x00c0, 0x26e0, 0x6002, + 0x6818, 0xa084, 0x000e, 0x0040, 0x26ec, 0x7014, 0x68b6, 0x712c, + 0xa188, 0x3e80, 0x0078, 0x26ee, 0x2009, 0x3f80, 0x2104, 0x6802, + 0x2d0a, 0x7156, 0x6eb2, 0xa684, 0x0060, 0x0040, 0x2740, 0xa684, + 0x0800, 0x00c0, 0x2704, 0xa684, 0x7fff, 0x68b2, 0x6890, 0x6894, + 0x1078, 0x2ec7, 0x0078, 0x2740, 0xa684, 0x0020, 0x0040, 0x2716, + 0xa006, 0x1078, 0x3194, 0x78d0, 0x8003, 0x00c8, 0x2712, 0x78d4, + 0x1078, 0x31f9, 0x79d8, 0x7adc, 0x0078, 0x271a, 0x1078, 0x2cae, + 0x1078, 0x3194, 0xa684, 0x8000, 0x0040, 0x2740, 0xa684, 0x7fff, + 0x68b2, 0x789b, 0x0074, 0x1078, 0x2d7c, 0x2010, 0x1078, 0x2d7c, + 0x2008, 0xa684, 0x0020, 0x00c0, 0x2738, 0x1078, 0x2d7c, 0x801b, + 0x00c8, 0x2733, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, + 0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90, 0x2200, 0xa303, 0x68aa, + 0x0078, 0x1bff, 0x0078, 0x2b76, 0x7033, 0x0000, 0xa282, 0x0005, + 0x0050, 0x274c, 0x1078, 0x1ba5, 0x2300, 0x0079, 0x274f, 0x2752, + 0x275c, 0x277f, 0x2200, 0x0079, 0x2755, 0x275a, 0x2b76, 0x275a, + 0x27a8, 0x27f9, 0x1078, 0x1ba5, 0x7000, 0xa086, 0x0001, 0x00c0, + 0x2769, 0x1078, 0x28ef, 0x1078, 0x2ec7, 0x7034, 0x600a, 0x0078, + 0x276e, 0x7000, 0xa086, 0x0003, 0x0040, 0x2763, 0x7003, 0x0005, + 0x2001, 0x3f90, 0x2068, 0x703e, 0x7032, 0x2200, 0x0079, 0x2778, + 0x2b76, 0x277d, 0x27a8, 0x277d, 0x2b76, 0x1078, 0x1ba5, 0x7000, + 0xa086, 0x0001, 0x00c0, 0x278c, 0x1078, 0x28ef, 0x1078, 0x2ec7, + 0x7034, 0x600a, 0x0078, 0x2791, 0x7000, 0xa086, 0x0003, 0x0040, + 0x2786, 0x7003, 0x0005, 0x2001, 0x3f90, 0x2068, 0x703e, 0x7032, + 0x2200, 0x0079, 0x279b, 0x27a2, 0x27a0, 0x27a2, 0x27a0, 0x27a2, + 0x1078, 0x1ba5, 0x1078, 0x2b99, 0x781b, 0x0069, 0x0078, 0x1bf7, + 0x7000, 0xa086, 0x0001, 0x00c0, 0x27b5, 0x1078, 0x28ef, 0x1078, + 0x2ec7, 0x7034, 0x600a, 0x0078, 0x27ba, 0x7000, 0xa086, 0x0003, + 0x0040, 0x27af, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, + 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, 0x2069, 0x3f80, 0x2d04, + 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040, 0x27d5, 0x6810, 0xa206, + 0x0040, 0x27ee, 0x6800, 0x0078, 0x27c8, 0x7003, 0x0005, 0x2001, + 0x3f90, 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, + 0x0000, 0x8000, 0x0070, 0x27e6, 0x0078, 0x27df, 0x157f, 0x6a12, + 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a, + 0x681c, 0xa084, 0x0c00, 0x0040, 0x284f, 0x1078, 0x2b91, 0x0078, + 0x284f, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2806, 0x1078, 0x28ef, + 0x1078, 0x2ec7, 0x7034, 0x600a, 0x0078, 0x280b, 0x7000, 0xa086, + 0x0003, 0x0040, 0x2800, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, + 0x789b, 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, 0x79a8, 0x79a8, + 0xa18c, 0x00ff, 0xa1e8, 0x3e80, 0x2d04, 0x2d08, 0x7156, 0x2068, + 0xa005, 0x0040, 0x282a, 0x6810, 0xa206, 0x0040, 0x2843, 0x6800, + 0x0078, 0x281d, 0x7003, 0x0005, 0x2001, 0x3f90, 0x2068, 0x703e, + 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, + 0x283b, 0x0078, 0x2834, 0x157f, 0x6a12, 0x68b3, 0x0700, 0x681f, + 0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a, 0x681c, 0xa084, 0x0c00, + 0x0040, 0x284f, 0x1078, 0x2b8d, 0x7e58, 0x0078, 0x284f, 0x027e, + 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600, + 0x2060, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0xa684, 0x0060, + 0x0040, 0x2886, 0x6b94, 0x6c90, 0x69a8, 0x68ac, 0xa105, 0x00c0, + 0x2874, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0x7e5a, + 0x1078, 0x30f0, 0x0078, 0x2886, 0x68ac, 0xa31a, 0x2100, 0xa423, + 0x2400, 0xa305, 0x0040, 0x2886, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, + 0x68ac, 0xa6b4, 0xbfff, 0x7e5a, 0x1078, 0x311d, 0x077f, 0x1078, + 0x2ca1, 0x2009, 0x006a, 0xa684, 0x0008, 0x0040, 0x2891, 0x2009, + 0x0069, 0xa6b5, 0x2000, 0x7e5a, 0x791a, 0x2d00, 0x703e, 0x8207, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600, 0x2048, + 0x0078, 0x1bf7, 0x6020, 0xa005, 0x0040, 0x28ae, 0x8001, 0x6022, + 0x6008, 0xa085, 0x0008, 0x600a, 0x7010, 0x6026, 0x007c, 0xa006, + 0x1078, 0x2ec7, 0x6813, 0x0000, 0x6817, 0x0001, 0x681f, 0x0040, + 0x681b, 0x0100, 0x7000, 0xa084, 0x0007, 0x0079, 0x28bf, 0x28c7, + 0x28c9, 0x28c9, 0x28d5, 0x28d1, 0x28c7, 0x28c7, 0x28c7, 0x1078, + 0x1ba5, 0x1078, 0x28e0, 0x1078, 0x28d9, 0x1078, 0x17dd, 0x0078, + 0x1bff, 0x70a3, 0x0000, 0x0078, 0x1bff, 0x6817, 0x0000, 0x0078, + 0x2508, 0x6800, 0xa005, 0x00c0, 0x28de, 0x6002, 0x6006, 0x007c, + 0x6010, 0xa005, 0x0040, 0x28e9, 0x8001, 0x00d0, 0x28e9, 0x1078, + 0x1ba5, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x007c, 0x6018, + 0xa005, 0x0040, 0x28f5, 0x8001, 0x601a, 0x007c, 0x1078, 0x2d77, + 0x6817, 0x0018, 0x0078, 0x2926, 0x1078, 0x2d77, 0x6817, 0x0019, + 0x0078, 0x2926, 0x1078, 0x2d77, 0x6817, 0x001a, 0x0078, 0x2926, + 0x77b4, 0x1078, 0x2ca1, 0x71b8, 0xa18c, 0x00ff, 0xa1e8, 0x3e80, + 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x2918, 0x0078, 0x1bff, + 0x6810, 0x72b4, 0xa206, 0x0040, 0x2920, 0x6800, 0x0078, 0x2911, + 0x6800, 0x200a, 0x6817, 0x0005, 0x70bf, 0x0000, 0x1078, 0x28e0, + 0x681c, 0xa084, 0x0001, 0x00c0, 0x292f, 0x1078, 0x28d9, 0x1078, + 0x28ef, 0x681b, 0x0000, 0x681f, 0x0020, 0x1078, 0x17dd, 0x0078, + 0x1bff, 0xa282, 0x0003, 0x00c0, 0x2b6a, 0x7da8, 0xa5ac, 0x00ff, + 0x7ea8, 0xa6b4, 0x00ff, 0x691c, 0xa18d, 0x0080, 0x691e, 0xa184, + 0x0100, 0x0040, 0x2999, 0xa18c, 0xfeff, 0x691e, 0xa6b4, 0x00ff, + 0x0040, 0x2983, 0xa682, 0x000f, 0x0048, 0x295a, 0x0040, 0x295a, + 0x2031, 0x000f, 0x852b, 0x852b, 0x1078, 0x2c24, 0x0040, 0x2964, + 0x1078, 0x2a33, 0x0078, 0x298c, 0x1078, 0x2bdf, 0x0c7e, 0x2960, + 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x2a57, 0x0c7f, 0x691c, + 0xa18d, 0x0100, 0x691e, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, + 0x0400, 0x00c0, 0x297f, 0x781b, 0x0055, 0x0078, 0x1bf7, 0x781b, + 0x0069, 0x0078, 0x1bf7, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, + 0x6006, 0x1078, 0x2a57, 0x0c7f, 0x7e58, 0xa684, 0x0400, 0x00c0, + 0x2995, 0x781b, 0x0058, 0x0078, 0x1bf7, 0x781b, 0x006a, 0x0078, + 0x1bf7, 0x0c7e, 0x7048, 0x2060, 0x6100, 0xa18c, 0x1000, 0x0040, + 0x29d9, 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000f, 0x0048, + 0x29ad, 0x0040, 0x29ad, 0x2011, 0x000f, 0x2600, 0xa202, 0x00c8, + 0x29b2, 0x2230, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, + 0x00c0, 0x29c2, 0xa282, 0x0019, 0x00c8, 0x29c8, 0x2011, 0x0019, + 0x0078, 0x29c8, 0xa282, 0x000c, 0x00c8, 0x29c8, 0x2011, 0x000c, + 0x2200, 0xa502, 0x00c8, 0x29cd, 0x2228, 0x1078, 0x2be3, 0x852b, + 0x852b, 0x1078, 0x2c24, 0x0040, 0x29d9, 0x1078, 0x2a33, 0x0078, + 0x29dd, 0x1078, 0x2bdf, 0x1078, 0x2a57, 0x7858, 0xa085, 0x0004, + 0x785a, 0x0c7f, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x0c7e, 0x2960, + 0x6000, 0xa084, 0x1000, 0x00c0, 0x2a01, 0x6010, 0xa084, 0x000f, + 0x00c0, 0x29fb, 0xa18c, 0x0002, 0x00c0, 0x29fb, 0xa18c, 0xfff5, + 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, + 0x2a23, 0x6208, 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, + 0x2a11, 0xa282, 0x0019, 0x00c8, 0x2a17, 0x2011, 0x0019, 0x0078, + 0x2a17, 0xa282, 0x000c, 0x00c8, 0x2a17, 0x2011, 0x000c, 0x6308, + 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000f, 0x0048, 0x2a23, 0x0040, + 0x2a23, 0x2019, 0x000f, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, + 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x681c, 0xa085, 0x0100, + 0x681e, 0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008, 0xa084, + 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, + 0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, 0x788a, + 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, + 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, + 0x7048, 0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, + 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c, 0xa282, + 0x0002, 0x00c0, 0x2b6a, 0x7aa8, 0x691c, 0xa18d, 0x0080, 0x691e, + 0xa184, 0x0200, 0x0040, 0x2aac, 0xa18c, 0xfdff, 0x691e, 0xa294, + 0x00ff, 0xa282, 0x0002, 0x00c8, 0x2b6a, 0x1078, 0x2af3, 0x1078, + 0x2a57, 0xa980, 0x0001, 0x200c, 0x1078, 0x2c9d, 0x1078, 0x29e6, + 0x88ff, 0x0040, 0x2a9f, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, + 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2a9b, 0x781b, + 0x0055, 0x0078, 0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x7e58, + 0xa684, 0x0400, 0x00c0, 0x2aa8, 0x781b, 0x0058, 0x0078, 0x1bf7, + 0x781b, 0x006a, 0x0078, 0x1bf7, 0xa282, 0x0002, 0x00c8, 0x2ab4, + 0xa284, 0x0001, 0x0040, 0x2abe, 0x7148, 0xa188, 0x0000, 0x210c, + 0xa18c, 0x2000, 0x00c0, 0x2abe, 0x2011, 0x0000, 0x1078, 0x2bd1, + 0x1078, 0x2af3, 0x1078, 0x2a57, 0x7858, 0xa085, 0x0004, 0x785a, + 0x781b, 0x0069, 0x0078, 0x1bf7, 0x0c7e, 0x027e, 0x2960, 0x6000, + 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x2ae3, 0x6014, 0xa084, + 0x0040, 0x00c0, 0x2ae1, 0xa18c, 0xffef, 0x6106, 0xa006, 0x0078, + 0x2af0, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, + 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x681c, 0xa085, 0x0200, 0x681e, + 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, 0x0040, + 0x2afb, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, + 0xa084, 0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, + 0xffef, 0x6006, 0x0c7f, 0x007c, 0x007e, 0x7000, 0xa086, 0x0003, + 0x0040, 0x2b15, 0x007f, 0x0078, 0x2b18, 0x007f, 0x0078, 0x2b66, + 0xa684, 0x0020, 0x0040, 0x2b66, 0x7888, 0xa084, 0x0040, 0x0040, + 0x2b66, 0x78a8, 0x8001, 0x0040, 0x2b25, 0x7bb8, 0xa384, 0x003f, + 0x831b, 0x00c8, 0x2b2c, 0x8000, 0xa005, 0x0040, 0x2b4d, 0x831b, + 0x00c8, 0x2b35, 0x8001, 0x0040, 0x2b62, 0xa006, 0x1078, 0x3194, + 0x78b4, 0x1078, 0x31f9, 0x0078, 0x2b66, 0xa684, 0x4000, 0x0040, + 0x2b4d, 0x78b8, 0x801b, 0x00c8, 0x2b46, 0x8000, 0xa084, 0x003f, + 0x00c0, 0x2b62, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc, 0x2001, + 0x0001, 0xa108, 0x00c8, 0x2b56, 0xa291, 0x0000, 0x79d2, 0x79da, + 0x7ad6, 0x7ade, 0x1078, 0x3194, 0x781b, 0x0067, 0x1078, 0x305e, + 0x0078, 0x1bf7, 0x781b, 0x0067, 0x0078, 0x1bf7, 0x781b, 0x006a, + 0x0078, 0x1bf7, 0x1078, 0x2b9d, 0x781b, 0x0069, 0x0078, 0x1bf7, + 0x1078, 0x2b89, 0x781b, 0x0069, 0x0078, 0x1bf7, 0x6823, 0x0002, + 0x1078, 0x2b91, 0x691c, 0xa18d, 0x0020, 0x691e, 0x6814, 0xa084, + 0x8000, 0x0040, 0x2b85, 0x6817, 0x0005, 0x781b, 0x0069, 0x0078, + 0x1bf7, 0x2001, 0x0005, 0x0078, 0x2b9f, 0x2001, 0x000c, 0x0078, + 0x2b9f, 0x2001, 0x0006, 0x0078, 0x2b9f, 0x2001, 0x000d, 0x0078, + 0x2b9f, 0x2001, 0x0009, 0x0078, 0x2b9f, 0x2001, 0x0007, 0x789b, + 0x007f, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, 0x007c, 0x077e, 0x873f, + 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x3600, 0xa7b8, + 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040, 0x2bbf, 0xa184, + 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, 0x0008, 0x6006, 0x8738, + 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, 0x0040, 0x2bcf, 0xa184, + 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0010, 0x6006, 0x077f, + 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, + 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, 0x007c, 0x2031, + 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, + 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, + 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, + 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0, 0x2001, 0x3546, + 0x2004, 0xa082, 0x0028, 0x0040, 0x2c0d, 0x2021, 0x2c84, 0x2019, + 0x0014, 0x20a9, 0x000c, 0x0078, 0x2c13, 0x2021, 0x2c90, 0x2019, + 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2404, 0xa084, 0xfff0, + 0xa106, 0x0040, 0x2c22, 0x8420, 0x2300, 0xa210, 0x0070, 0x2c22, + 0x0078, 0x2c15, 0x157f, 0x007c, 0x157e, 0x2011, 0x3546, 0x2214, + 0xa282, 0x0032, 0x0048, 0x2c38, 0x0040, 0x2c3c, 0x2021, 0x2c76, + 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x0078, 0x2c4c, + 0xa282, 0x0028, 0x0040, 0x2c44, 0x2021, 0x2c84, 0x2019, 0x0014, + 0x20a9, 0x000c, 0x0078, 0x2c4a, 0x2021, 0x2c90, 0x2019, 0x0019, + 0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x2c5c, + 0x0048, 0x2c5c, 0x8420, 0x2300, 0xa210, 0x0070, 0x2c59, 0x0078, + 0x2c4c, 0x157f, 0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8, + 0x2c65, 0x7808, 0xa085, 0x0070, 0x780a, 0x78ec, 0xa084, 0x0300, + 0x0040, 0x2c73, 0x2404, 0xa09e, 0x1201, 0x00c0, 0x2c73, 0x2001, + 0x2101, 0x0078, 0x2c74, 0x2404, 0xa005, 0x007c, 0x1201, 0x3002, + 0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, + 0x7a06, 0x0a07, 0x0c07, 0x0e07, 0x3202, 0x4202, 0x5202, 0x6202, + 0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, 0x7c05, 0x7e05, 0x7f05, + 0x2202, 0x3202, 0x4202, 0x5202, 0x5404, 0x6404, 0x7404, 0x7604, + 0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, 0x789b, 0x0010, 0xa046, + 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, 0x0007, 0x8003, 0x8003, + 0x8003, 0x8003, 0xa105, 0xa0e0, 0x3680, 0x007c, 0x79d8, 0x7adc, + 0x78d0, 0x801b, 0x00c8, 0x2cb5, 0x8000, 0xa084, 0x003f, 0xa108, + 0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3540, + 0x2091, 0x8000, 0x2104, 0x0079, 0x2cc5, 0x2cf7, 0x2ccf, 0x2ccf, + 0x2ccf, 0x2ccf, 0x2ccf, 0x2ccd, 0x2ccd, 0x1078, 0x1ba5, 0x784b, + 0x0004, 0x7848, 0xa084, 0x0004, 0x00c0, 0x2cd1, 0x784b, 0x0008, + 0x7848, 0xa084, 0x0008, 0x00c0, 0x2cd8, 0x68b0, 0xa085, 0x4000, + 0x68b2, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080, + 0x00c0, 0x2cf7, 0x0018, 0x2cf7, 0x6818, 0xa084, 0x0020, 0x00c0, + 0x2cf5, 0x781b, 0x00dd, 0x0078, 0x2cf7, 0x781b, 0x00e4, 0x2091, + 0x8001, 0x0f7f, 0x007c, 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f, + 0x8003, 0x8003, 0x8003, 0xa0e0, 0x3600, 0x6004, 0xa084, 0x000a, + 0x00c0, 0x2d2e, 0x6108, 0xa194, 0xff00, 0x0040, 0x2d2e, 0xa18c, + 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x2d1d, 0x2001, 0x0032, + 0xa106, 0x0040, 0x2d21, 0x0078, 0x2d25, 0x2009, 0x0020, 0x0078, + 0x2d27, 0x2009, 0x003f, 0x0078, 0x2d27, 0x2011, 0x0000, 0x2100, + 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c, + 0x781b, 0x006a, 0x0078, 0x1bf7, 0x781b, 0x0069, 0x0078, 0x1bf7, + 0x781b, 0x0058, 0x0078, 0x1bf7, 0x781b, 0x0055, 0x0078, 0x1bf7, + 0x781b, 0x00dd, 0x0078, 0x1bf7, 0x781b, 0x00dc, 0x0078, 0x1bf7, + 0x781b, 0x00e4, 0x0078, 0x1bf7, 0x781b, 0x00e3, 0x0078, 0x1bf7, + 0x781b, 0x009e, 0x0078, 0x1bf7, 0x781b, 0x009d, 0x0078, 0x1bf7, + 0x70a3, 0x0001, 0x781b, 0x0046, 0x0078, 0x1bf7, 0x007e, 0x7830, + 0xa084, 0x00c0, 0x00c0, 0x2d75, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, - 0x2ce3, 0x0098, 0x2ce1, 0x78ac, 0x007e, 0x7808, 0xa085, 0x0002, - 0x780a, 0x007f, 0x007c, 0xa784, 0x0070, 0x0040, 0x2cef, 0x6817, - 0x0003, 0x7858, 0xa084, 0x3f00, 0x681a, 0x682f, 0x0000, 0x682b, - 0x0000, 0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x1fb9, 0xa084, - 0x0020, 0x0040, 0x1fb9, 0x78ec, 0xa084, 0x0003, 0x0040, 0x1fb9, - 0x0018, 0x1fb9, 0x0078, 0x2acb, 0x0c7e, 0x6810, 0x8007, 0xa084, - 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3500, 0x2060, 0x2048, - 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x0c7f, 0x007c, 0x0020, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9847, 0x0014, 0x0014, - 0x98f5, 0x98e7, 0x0014, 0x0014, 0x0080, 0x00bf, 0x0100, 0x0402, - 0x2008, 0xf880, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0xa200, - 0x8838, 0x817e, 0x842a, 0x84a0, 0x3806, 0x8839, 0x28c2, 0x9cc3, - 0xa805, 0x0864, 0xa83b, 0x3008, 0x28c1, 0x9cc3, 0xa201, 0x300c, - 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, - 0x28e2, 0x9ca0, 0xa8f3, 0x0864, 0xa829, 0x300c, 0xa801, 0x3008, - 0x28e1, 0x9ca0, 0x280d, 0xa204, 0x64c0, 0x67a0, 0x6fc0, 0x1814, - 0x883b, 0x7023, 0x8576, 0x8677, 0xa80f, 0x786e, 0x883e, 0xa80c, - 0x282b, 0xa205, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, - 0x8576, 0x8677, 0xa801, 0x883e, 0x2069, 0x28c1, 0x9cc3, 0x2044, - 0x2103, 0x20a2, 0x2081, 0xa8dc, 0xa207, 0x0014, 0xa203, 0x8000, - 0x84a8, 0x85a4, 0x1872, 0x849a, 0x883c, 0x1fe2, 0xf601, 0xa208, - 0x856e, 0x866f, 0x0704, 0x3008, 0x9ca0, 0x0014, 0xa202, 0x8000, - 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf848, 0x8174, 0x86eb, 0x85eb, - 0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f1, 0xf861, 0xa8e8, 0xf801, - 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, - 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, - 0x0014, 0xa206, 0x6865, 0x817f, 0x842a, 0x1dc1, 0x8823, 0x0016, - 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf021, - 0x3008, 0x84a8, 0x1dc6, 0x20d7, 0x8822, 0x0016, 0x8000, 0x2848, - 0x1011, 0xa8fc, 0x3008, 0x8000, 0xa000, 0x2802, 0x1011, 0xa8fd, - 0xa887, 0x3008, 0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017, 0x300c, - 0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0x26e0, 0x873a, 0xfaa2, - 0x19f2, 0x1fe2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x817e, 0x842a, - 0x84a0, 0x3806, 0x0210, 0x9ccd, 0x0704, 0x0000, 0x127e, 0x2091, - 0x2200, 0x2049, 0x2e0e, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215, - 0x7008, 0xa084, 0xfffd, 0xa205, 0x0040, 0x2e20, 0x1078, 0x2e68, - 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x6424, 0x84ff, 0x0040, - 0x2e42, 0x2c70, 0x2039, 0x2e47, 0x2704, 0xae68, 0x680c, 0xa630, - 0x6808, 0xa529, 0x8421, 0x0040, 0x2e42, 0x8738, 0x2704, 0xa005, - 0x00c0, 0x2e2d, 0x7098, 0xa075, 0x0040, 0x2e42, 0x2039, 0x2e44, - 0x0078, 0x2e2c, 0x007c, 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, - 0x0014, 0x0018, 0x001c, 0x0000, 0x127e, 0x2091, 0x2200, 0x2079, - 0x3400, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, - 0x0000, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, - 0x0000, 0x2049, 0x0000, 0x78b3, 0x0000, 0x127f, 0x2000, 0x007c, - 0x2049, 0x2e68, 0x7004, 0x8004, 0x00c8, 0x2e90, 0x7007, 0x0012, - 0x7108, 0x7008, 0xa106, 0x00c0, 0x2e70, 0xa184, 0x0030, 0x0040, - 0x2e7d, 0xa086, 0x0030, 0x00c0, 0x2e70, 0x7000, 0xa084, 0x0001, - 0x00c0, 0x2e90, 0x7008, 0xa084, 0x000c, 0x00c0, 0x2e90, 0x710c, - 0xa184, 0x0300, 0x00c0, 0x2e90, 0xa184, 0x007f, 0x00c0, 0x2e68, - 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, - 0x2e94, 0x7007, 0x0012, 0x7108, 0x8104, 0x0048, 0x2e99, 0x78b3, - 0x0000, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, 0x007e, - 0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x2eb6, 0x157f, - 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, 0x2118, - 0x7108, 0x700c, 0xa084, 0x0300, 0x00c0, 0x2ef8, 0xa184, 0x000c, - 0x00c0, 0x2ef8, 0x8213, 0x8213, 0x8213, 0x8213, 0xa284, 0x0100, - 0xa10d, 0x810b, 0x810b, 0x810f, 0xa184, 0x0007, 0x0079, 0x2ed0, - 0x2eda, 0x2eea, 0x2ef8, 0x2eea, 0x2f0c, 0x2f0c, 0x2ef8, 0x2f0a, - 0x1078, 0x1b4e, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x2ee3, 0x2049, - 0x0000, 0x0078, 0x2ee7, 0x1078, 0x3077, 0x00c0, 0x2ee3, 0x78b3, - 0x0000, 0x007c, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x2ef1, 0x0078, - 0x2ef5, 0x1078, 0x3077, 0x00c0, 0x2ef1, 0x78b3, 0x0000, 0x007c, - 0x7007, 0x0002, 0x1078, 0x2e68, 0x1078, 0x2c16, 0x6814, 0xa084, - 0x8000, 0x0040, 0x2f05, 0x6817, 0x0002, 0x007c, 0x1078, 0x1b4e, - 0x1078, 0x1b4e, 0x1078, 0x2f5c, 0x7210, 0x7114, 0x700c, 0xa09c, - 0x007f, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x78b0, 0xa005, - 0x0040, 0x2f1e, 0x78b3, 0x0000, 0x0078, 0x2f41, 0x1078, 0x2f5c, - 0x2704, 0x2c58, 0xac60, 0x630c, 0x2200, 0xa322, 0x6308, 0x2100, - 0xa31b, 0x2400, 0xa305, 0x0040, 0x2f37, 0x00c8, 0x2f37, 0x8412, - 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x2f1e, 0x2b60, - 0x8a07, 0xa7ba, 0x2e44, 0xa73d, 0x2c00, 0x6882, 0x6f86, 0x6c8e, - 0x6b8a, 0x1078, 0x2e68, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, - 0x2f50, 0x6098, 0xa005, 0x0040, 0x2f59, 0x2060, 0x2039, 0x2e44, - 0x8a51, 0x0040, 0x2f58, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0, - 0x007c, 0x2051, 0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, - 0x00c0, 0x2f69, 0x2039, 0x2e4a, 0x6000, 0xa064, 0x00c0, 0x2f69, - 0x2d60, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6880, - 0x2060, 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4, 0x00ff, 0xa084, - 0x00ff, 0xa0b8, 0x2e44, 0x7e08, 0xa6b5, 0x000c, 0x6818, 0xa084, - 0x0040, 0x0040, 0x2f85, 0xa6b5, 0x0001, 0x0f7e, 0x2079, 0x0100, - 0x7858, 0x0f7f, 0xa084, 0x0040, 0x0040, 0x2f94, 0xa684, 0x0001, - 0x00c0, 0x2f94, 0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004, 0xa084, - 0x0004, 0x00c0, 0x2f96, 0x7000, 0xa005, 0x0040, 0x2fa1, 0x1078, - 0x1b4e, 0x2400, 0xa305, 0x00c0, 0x2fa7, 0x0078, 0x2fe4, 0x2c58, - 0x2704, 0xac60, 0x6004, 0xa400, 0x007e, 0x701a, 0x6000, 0xa301, - 0x701e, 0x2009, 0x04fd, 0x2104, 0xa086, 0x04fd, 0x007f, 0x00c0, - 0x2fd4, 0xa084, 0x0001, 0x0040, 0x2fd4, 0xa684, 0x0001, 0x00c0, - 0x2fd4, 0x7013, 0x0001, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, - 0x78b3, 0x0001, 0xa4a0, 0x0001, 0xa399, 0x0000, 0x6004, 0xa400, - 0x701a, 0x6000, 0xa301, 0x701e, 0x620c, 0x2400, 0xa202, 0x7012, - 0x6208, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, - 0x1078, 0x2f44, 0x0078, 0x2fe6, 0x1078, 0x3077, 0x00c0, 0x2fe4, - 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, - 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x2ff2, 0x7003, - 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, - 0x0d7f, 0x2049, 0x2ffc, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, - 0x00c0, 0x3005, 0x7000, 0xa005, 0x0040, 0x3010, 0x1078, 0x1b4e, - 0x7e08, 0xa6b5, 0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x301a, - 0xa6b5, 0x0001, 0x6824, 0xa005, 0x0040, 0x3026, 0x2050, 0x2039, - 0x2e47, 0x2d60, 0x1078, 0x3077, 0x00c0, 0x3022, 0x127f, 0x2000, - 0x007c, 0x127e, 0x007e, 0x017e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, - 0x037f, 0x047f, 0x7e08, 0xa6b5, 0x000c, 0x6818, 0xa084, 0x0040, - 0x0040, 0x303c, 0xa6b5, 0x0001, 0x2049, 0x3029, 0x6824, 0xa055, - 0x0040, 0x3074, 0x2d70, 0x2e60, 0x2039, 0x2e47, 0x2704, 0xae68, - 0x680c, 0xa422, 0x6808, 0xa31b, 0x0048, 0x3061, 0x8a51, 0x00c0, - 0x3053, 0x1078, 0x1b4e, 0x8738, 0x2704, 0xa005, 0x00c0, 0x3047, - 0x7098, 0xa075, 0x2060, 0x0040, 0x3074, 0x2039, 0x2e44, 0x0078, - 0x3046, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x690c, 0x2400, - 0xa122, 0x6908, 0x2300, 0xa11b, 0x00c8, 0x3070, 0x1078, 0x1b4e, - 0x2071, 0x0020, 0x0078, 0x2f94, 0x127f, 0x2000, 0x007c, 0x7008, - 0xa084, 0x00c0, 0xa086, 0x00c0, 0x0040, 0x309f, 0x2704, 0xac08, - 0x2104, 0x701e, 0x8108, 0x2104, 0x701a, 0x8108, 0x2104, 0x7016, - 0x8108, 0x2104, 0x7012, 0x0f7e, 0x2079, 0x0100, 0x7858, 0x0f7f, - 0xa084, 0x0040, 0x0040, 0x309a, 0xa684, 0x0001, 0x00c0, 0x309a, - 0xa6b5, 0x0001, 0x7602, 0x7007, 0x0001, 0x1078, 0x2f44, 0x007c, - 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x30a0, 0x0d7f, - 0x087f, 0x7108, 0xa184, 0x00c0, 0x00c0, 0x30b6, 0x6824, 0xa005, - 0x0040, 0x30c6, 0x1078, 0x2f0c, 0x0078, 0x30c6, 0x7108, 0x8104, - 0x00c8, 0x30be, 0x1078, 0x2eb6, 0x0078, 0x30a9, 0x7007, 0x0010, - 0x7108, 0x8104, 0x00c8, 0x30c0, 0x1078, 0x2eb6, 0x7008, 0xa086, - 0x0002, 0x00c0, 0x30a9, 0x7000, 0xa005, 0x00c0, 0x30a9, 0x2049, - 0x0000, 0x127f, 0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e, - 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x30d4, 0xad80, 0x0010, - 0x20a0, 0x2099, 0x0031, 0x700c, 0xa084, 0x007f, 0x6826, 0x7007, - 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040, 0x30f2, 0x8000, - 0x80ac, 0x53a5, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, - 0x30f4, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, - 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, - 0x0d7f, 0x2049, 0x3103, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, - 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x2e44, 0x7e08, - 0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, - 0x311c, 0x2c58, 0x2704, 0xac60, 0x6004, 0xa400, 0x701a, 0x6000, - 0xa301, 0x701e, 0x7013, 0x0001, 0x7017, 0x0000, 0x7602, 0x7007, - 0x0001, 0x007f, 0x8007, 0x2009, 0x0031, 0x200a, 0x00a0, 0x3136, - 0x7108, 0x7007, 0x0002, 0x810c, 0x00c8, 0x3136, 0x810c, 0x0048, - 0x3143, 0x0078, 0x2ef8, 0xa4a0, 0x0001, 0xa399, 0x0000, 0x6b8a, - 0x6c8e, 0x7007, 0x0004, 0x2049, 0x0000, 0x7003, 0x0000, 0x127f, - 0x2000, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, - 0x00c8, 0x315b, 0xa200, 0x00f0, 0x3156, 0x8086, 0x818e, 0x007c, - 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x3181, 0xa11a, 0x00c8, - 0x3181, 0x8213, 0x818d, 0x0048, 0x3174, 0xa11a, 0x00c8, 0x3175, - 0x00f0, 0x3169, 0x0078, 0x3179, 0xa11a, 0x2308, 0x8210, 0x00f0, - 0x3169, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, - 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x317d, 0x00e0, - 0x31c1, 0x2091, 0x6000, 0x7820, 0x8001, 0x7822, 0x00c0, 0x31bb, - 0x7824, 0x7822, 0x2091, 0x8000, 0x2069, 0x3440, 0x6800, 0xa084, - 0x0007, 0x0040, 0x31ab, 0xa086, 0x0002, 0x0040, 0x31ab, 0x6830, - 0xa00d, 0x0040, 0x31ab, 0x2104, 0xa005, 0x0040, 0x31ab, 0x8001, - 0x200a, 0x0040, 0x3277, 0x2061, 0x3580, 0x20a9, 0x0080, 0x6034, - 0xa005, 0x0040, 0x31b5, 0x8001, 0x6036, 0xace0, 0x0010, 0x0070, - 0x31bb, 0x0078, 0x31af, 0x1078, 0x31dc, 0x1078, 0x31c4, 0x1078, - 0x3201, 0x2091, 0x8001, 0x007c, 0x783c, 0x8001, 0x783e, 0x00c0, - 0x31db, 0x7840, 0x783e, 0x7848, 0xa005, 0x0040, 0x31db, 0x8001, - 0x784a, 0x00c0, 0x31db, 0x0f7e, 0x2079, 0x0100, 0x1078, 0x2cc6, - 0x0f7f, 0x1078, 0x19f8, 0x007c, 0x7834, 0x8001, 0x7836, 0x00c0, - 0x3200, 0x7838, 0x7836, 0x2091, 0x8000, 0x7844, 0xa005, 0x00c0, - 0x31eb, 0x2001, 0x0101, 0x8001, 0x7846, 0xa080, 0x3d80, 0x2040, - 0x2004, 0xa065, 0x0040, 0x3200, 0x6020, 0xa005, 0x0040, 0x31fc, - 0x8001, 0x6022, 0x0040, 0x3230, 0x6000, 0x2c40, 0x0078, 0x31f1, - 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, 0x322f, 0x782c, 0x782a, - 0x7830, 0xa005, 0x00c0, 0x320e, 0x2001, 0x0080, 0x8001, 0x7832, - 0x8003, 0x8003, 0x8003, 0x8003, 0xa090, 0x3580, 0xa298, 0x0002, - 0x2304, 0xa084, 0x0008, 0x0040, 0x322f, 0xa290, 0x0009, 0x2204, - 0xa005, 0x0040, 0x3227, 0x8001, 0x2012, 0x00c0, 0x322f, 0x2304, - 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, 0x1078, 0x19f8, 0x007c, - 0x2069, 0x3440, 0x6800, 0xa005, 0x0040, 0x323a, 0x683c, 0xac06, - 0x0040, 0x3277, 0x6017, 0x0006, 0x60b0, 0xa084, 0x3f00, 0x601a, + 0x2d75, 0x7808, 0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0x7808, + 0xa085, 0x0002, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, + 0x2d7c, 0x0098, 0x2d85, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, + 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, + 0x0040, 0x2d94, 0x0098, 0x2d92, 0x78ac, 0x007e, 0x7808, 0xa085, + 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0070, 0x0040, 0x2da8, + 0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x1b6b, 0x2d78, 0x2c68, 0x0c7f, + 0x6817, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681a, 0x682f, 0x0000, + 0x682b, 0x0000, 0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x2015, + 0xa084, 0x0020, 0x0040, 0x2015, 0x78ec, 0xa084, 0x0003, 0x0040, + 0x2015, 0x0018, 0x2015, 0x0078, 0x2b70, 0x0c7e, 0x6810, 0x8007, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600, 0x2060, + 0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x0c7f, 0x007c, + 0x0020, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, + 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, + 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, + 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, + 0x0000, 0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9847, 0x0014, + 0x0014, 0x98f5, 0x98e7, 0x0014, 0x0014, 0x0080, 0x00bf, 0x0100, + 0x0402, 0x2008, 0xf880, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, + 0xa200, 0x8838, 0x817e, 0x842a, 0x84a0, 0x3806, 0x8839, 0x28c2, + 0x9cc3, 0xa805, 0x0864, 0xa83b, 0x3008, 0x28c1, 0x9cc3, 0xa201, + 0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, + 0xa808, 0x28e2, 0x9ca0, 0xa8f3, 0x0864, 0xa829, 0x300c, 0xa801, + 0x3008, 0x28e1, 0x9ca0, 0x280d, 0xa204, 0x64c0, 0x67a0, 0x6fc0, + 0x1814, 0x883b, 0x7023, 0x8576, 0x8677, 0xa80f, 0x786e, 0x883e, + 0xa80c, 0x282b, 0xa205, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, + 0x7023, 0x8576, 0x8677, 0xa801, 0x883e, 0x2069, 0x28c1, 0x9cc3, + 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8dc, 0xa207, 0x0014, 0xa203, + 0x8000, 0x84a8, 0x85a4, 0x1872, 0x849a, 0x883c, 0x1fe2, 0xf601, + 0xa208, 0x856e, 0x866f, 0x0704, 0x3008, 0x9ca0, 0x0014, 0xa202, + 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf848, 0x8174, 0x86eb, + 0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f1, 0xf861, 0xa8e8, + 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, + 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, + 0x1fe6, 0x0014, 0xa206, 0x6865, 0x817f, 0x842a, 0x1dc1, 0x8823, + 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, + 0xf021, 0x3008, 0x84a8, 0x1dc6, 0x20d7, 0x8822, 0x0016, 0x8000, + 0x2848, 0x1011, 0xa8fc, 0x3008, 0x8000, 0xa000, 0x2802, 0x1011, + 0xa8fd, 0xa887, 0x3008, 0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017, + 0x300c, 0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0x26e0, 0x873a, + 0xfaa2, 0x19f2, 0x1fe2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x817e, + 0x842a, 0x84a0, 0x3806, 0x0210, 0x9ccd, 0x0704, 0x0000, 0x127e, + 0x2091, 0x2200, 0x2049, 0x2ec7, 0x7000, 0x7204, 0xa205, 0x720c, + 0xa215, 0x7008, 0xa084, 0xfffd, 0xa205, 0x0040, 0x2ed9, 0x0078, + 0x2ede, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084, + 0x0001, 0x00c0, 0x2f0c, 0x7108, 0x8104, 0x00c8, 0x2eeb, 0x1078, + 0x2fa8, 0x0078, 0x2ee3, 0x700c, 0xa08c, 0x007f, 0x0040, 0x2f0c, + 0x7004, 0x8004, 0x00c8, 0x2f03, 0x7014, 0xa005, 0x00c0, 0x2eff, + 0x7010, 0xa005, 0x0040, 0x2f03, 0xa102, 0x00c8, 0x2ee3, 0x7007, + 0x0010, 0x0078, 0x2f0c, 0x8aff, 0x0040, 0x2f0c, 0x1078, 0x316b, + 0x00c0, 0x2f06, 0x0040, 0x2ee3, 0x1078, 0x2f56, 0x7003, 0x0000, + 0x127f, 0x2000, 0x007c, 0x6424, 0x84ff, 0x0040, 0x2f30, 0x2c70, + 0x2039, 0x2f35, 0x2704, 0xae68, 0x680c, 0xa630, 0x6808, 0xa529, + 0x8421, 0x0040, 0x2f30, 0x8738, 0x2704, 0xa005, 0x00c0, 0x2f1b, + 0x7098, 0xa075, 0x0040, 0x2f30, 0x2039, 0x2f32, 0x0078, 0x2f1a, + 0x007c, 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018, + 0x001c, 0x0000, 0x127e, 0x2091, 0x2200, 0x2079, 0x3500, 0x2071, + 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, + 0x0020, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, + 0x0000, 0x78b3, 0x0000, 0x127f, 0x2000, 0x007c, 0x2049, 0x2f56, + 0x7004, 0x8004, 0x00c8, 0x2f82, 0x7007, 0x0012, 0x7108, 0x7008, + 0xa106, 0x00c0, 0x2f5e, 0xa184, 0x0030, 0x0040, 0x2f6b, 0xa086, + 0x0030, 0x00c0, 0x2f5e, 0x7000, 0xa084, 0x0001, 0x00c0, 0x2f82, + 0x7008, 0xa084, 0x000c, 0x00c0, 0x2f80, 0x710c, 0xa184, 0x0300, + 0x00c0, 0x2f80, 0xa184, 0x007f, 0x00c0, 0x2f56, 0x0078, 0x2f82, + 0x6817, 0x0003, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xa084, + 0x0008, 0x00c0, 0x2f86, 0x7007, 0x0012, 0x7108, 0x8104, 0x0048, + 0x2f8b, 0x78b3, 0x0000, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, + 0x107e, 0x007e, 0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, + 0x2fa8, 0x157f, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, + 0x7204, 0x2118, 0x7108, 0x700c, 0xa084, 0x0300, 0x00c0, 0x2fea, + 0xa184, 0x000c, 0x00c0, 0x2fea, 0x8213, 0x8213, 0x8213, 0x8213, + 0xa284, 0x0100, 0xa10d, 0x810b, 0x810b, 0x810f, 0xa184, 0x0007, + 0x0079, 0x2fc2, 0x2fcc, 0x2fdc, 0x2fea, 0x2fdc, 0x2ffe, 0x2ffe, + 0x2fea, 0x2ffc, 0x1078, 0x1ba5, 0x7007, 0x0002, 0x8aff, 0x00c0, + 0x2fd5, 0x2049, 0x0000, 0x0078, 0x2fd9, 0x1078, 0x316b, 0x00c0, + 0x2fd5, 0x78b3, 0x0000, 0x007c, 0x7007, 0x0002, 0x8aff, 0x00c0, + 0x2fe3, 0x0078, 0x2fe7, 0x1078, 0x316b, 0x00c0, 0x2fe3, 0x78b3, + 0x0000, 0x007c, 0x7007, 0x0002, 0x1078, 0x2f56, 0x1078, 0x2cbb, + 0x6814, 0xa084, 0x8000, 0x0040, 0x2ff7, 0x6817, 0x0002, 0x007c, + 0x1078, 0x1ba5, 0x1078, 0x1ba5, 0x1078, 0x3050, 0x7210, 0x7114, + 0x700c, 0xa09c, 0x007f, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, + 0x78b0, 0xa005, 0x0040, 0x3010, 0x78b3, 0x0000, 0x0078, 0x3033, + 0x1078, 0x3050, 0x2704, 0x2c58, 0xac60, 0x630c, 0x2200, 0xa322, + 0x6308, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x3029, 0x00c8, + 0x3029, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, + 0x3010, 0x2b60, 0x8a07, 0xa7ba, 0x2f32, 0xa73d, 0x2c00, 0x6882, + 0x6f86, 0x6c8e, 0x6b8a, 0x7007, 0x0012, 0x1078, 0x2f56, 0x007c, + 0x8738, 0x2704, 0xa005, 0x00c0, 0x3044, 0x6098, 0xa005, 0x0040, + 0x304d, 0x2060, 0x2039, 0x2f32, 0x8a51, 0x0040, 0x304c, 0x7008, + 0xa084, 0x00c0, 0xa086, 0x00c0, 0x007c, 0x2051, 0x0000, 0x007c, + 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x305d, 0x2039, 0x2f38, + 0x6000, 0xa064, 0x00c0, 0x305d, 0x2d60, 0x007c, 0x127e, 0x0d7e, + 0x2091, 0x2200, 0x0d7f, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, + 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x2f32, 0x7e08, + 0xa6b5, 0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x3079, 0xa6b5, + 0x0001, 0x0f7e, 0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040, + 0x0040, 0x3088, 0xa684, 0x0001, 0x00c0, 0x3088, 0xa6b5, 0x0001, + 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x308a, 0x7000, + 0xa005, 0x0040, 0x3095, 0x1078, 0x1ba5, 0x2400, 0xa305, 0x00c0, + 0x309b, 0x0078, 0x30d8, 0x2c58, 0x2704, 0xac60, 0x6004, 0xa400, + 0x007e, 0x701a, 0x6000, 0xa301, 0x701e, 0x2009, 0x04fd, 0x2104, + 0xa086, 0x04fd, 0x007f, 0x00c0, 0x30c8, 0xa084, 0x0001, 0x0040, + 0x30c8, 0xa684, 0x0001, 0x00c0, 0x30c8, 0x7013, 0x0001, 0x7017, + 0x0000, 0x7602, 0x7007, 0x0001, 0x78b3, 0x0001, 0xa4a0, 0x0001, + 0xa399, 0x0000, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e, + 0x620c, 0x2400, 0xa202, 0x7012, 0x6208, 0x2300, 0xa203, 0x7016, + 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, 0x3038, 0x0078, 0x30da, + 0x1078, 0x316b, 0x00c0, 0x30d8, 0x127f, 0x2000, 0x007c, 0x127e, + 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, + 0x0004, 0x00c0, 0x30e6, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, + 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x30f0, 0x7007, + 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x30f9, 0x7000, 0xa005, + 0x0040, 0x3104, 0x1078, 0x1ba5, 0x7e08, 0xa6b5, 0x000c, 0x6818, + 0xa084, 0x0040, 0x0040, 0x310e, 0xa6b5, 0x0001, 0x6824, 0xa005, + 0x0040, 0x311a, 0x2050, 0x2039, 0x2f35, 0x2d60, 0x1078, 0x316b, + 0x00c0, 0x3116, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e, + 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5, + 0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x3130, 0xa6b5, 0x0001, + 0x2049, 0x311d, 0x6824, 0xa055, 0x0040, 0x3168, 0x2d70, 0x2e60, + 0x2039, 0x2f35, 0x2704, 0xae68, 0x680c, 0xa422, 0x6808, 0xa31b, + 0x0048, 0x3155, 0x8a51, 0x00c0, 0x3147, 0x1078, 0x1ba5, 0x8738, + 0x2704, 0xa005, 0x00c0, 0x313b, 0x7098, 0xa075, 0x2060, 0x0040, + 0x3168, 0x2039, 0x2f32, 0x0078, 0x313a, 0x8422, 0x8420, 0x831a, + 0xa399, 0x0000, 0x690c, 0x2400, 0xa122, 0x6908, 0x2300, 0xa11b, + 0x00c8, 0x3164, 0x1078, 0x1ba5, 0x2071, 0x0020, 0x0078, 0x3088, + 0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0, + 0x0040, 0x3193, 0x2704, 0xac08, 0x2104, 0x701e, 0x8108, 0x2104, + 0x701a, 0x8108, 0x2104, 0x7016, 0x8108, 0x2104, 0x7012, 0x0f7e, + 0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, 0x0040, 0x0040, 0x318e, + 0xa684, 0x0001, 0x00c0, 0x318e, 0xa6b5, 0x0001, 0x7602, 0x7007, + 0x0001, 0x1078, 0x3038, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, + 0x2200, 0x2049, 0x3194, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x00c0, + 0x00c0, 0x31aa, 0x6824, 0xa005, 0x0040, 0x31ba, 0x0078, 0x2ede, + 0x0078, 0x31ba, 0x7108, 0x8104, 0x00c8, 0x31b2, 0x1078, 0x2fa8, + 0x0078, 0x319d, 0x7007, 0x0010, 0x7108, 0x8104, 0x00c8, 0x31b4, + 0x1078, 0x2fa8, 0x7008, 0xa086, 0x0002, 0x00c0, 0x319d, 0x7000, + 0xa005, 0x00c0, 0x319d, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, + 0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0d7e, 0x2091, + 0x2200, 0x0d7f, 0x2049, 0x31ca, 0xad80, 0x0010, 0x20a0, 0x2099, + 0x0031, 0x700c, 0xa084, 0x007f, 0x6826, 0x7007, 0x0008, 0x7007, + 0x0002, 0x7003, 0x0001, 0x0040, 0x31e8, 0x8000, 0x80ac, 0x53a5, + 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x31ea, 0x2049, + 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, 0x127f, 0x2000, + 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, + 0x31f9, 0x6880, 0x2060, 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4, + 0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x2f32, 0x7e08, 0xa6b5, 0x0004, + 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x3212, 0x2c58, + 0x2704, 0xac60, 0x6004, 0xa400, 0x701a, 0x6000, 0xa301, 0x701e, + 0x7013, 0x0001, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x007f, + 0x8007, 0x2009, 0x0031, 0x200a, 0x00a0, 0x322c, 0x7108, 0x7007, + 0x0002, 0x810c, 0x00c8, 0x322c, 0x810c, 0x0048, 0x3239, 0x0078, + 0x2fea, 0xa4a0, 0x0001, 0xa399, 0x0000, 0x6b8a, 0x6c8e, 0x7007, + 0x0004, 0x2049, 0x0000, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, + 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x00c8, 0x3251, + 0xa200, 0x00f0, 0x324c, 0x8086, 0x818e, 0x007c, 0x157e, 0x20a9, + 0x0010, 0xa005, 0x0040, 0x3277, 0xa11a, 0x00c8, 0x3277, 0x8213, + 0x818d, 0x0048, 0x326a, 0xa11a, 0x00c8, 0x326b, 0x00f0, 0x325f, + 0x0078, 0x326f, 0xa11a, 0x2308, 0x8210, 0x00f0, 0x325f, 0x007e, + 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, 0x007c, 0x007e, + 0x3200, 0xa085, 0x0800, 0x0078, 0x3273, 0x00e0, 0x32bf, 0x2091, + 0x6000, 0x7820, 0x8001, 0x7822, 0x00c0, 0x32b9, 0x7824, 0x7822, + 0x2091, 0x8000, 0x2069, 0x3540, 0x6800, 0xa084, 0x0007, 0x0040, + 0x32a1, 0xa086, 0x0002, 0x0040, 0x32a1, 0x6830, 0xa00d, 0x0040, + 0x32a1, 0x2104, 0xa005, 0x0040, 0x32a1, 0x8001, 0x200a, 0x0040, + 0x336f, 0x2061, 0x3680, 0x20a9, 0x0080, 0x6034, 0xa005, 0x0040, + 0x32b3, 0x8001, 0x6036, 0x00c0, 0x32b3, 0x6010, 0xa005, 0x0040, + 0x32b3, 0x1078, 0x1a19, 0xace0, 0x0010, 0x0070, 0x32b9, 0x0078, + 0x32a5, 0x1078, 0x32d4, 0x1078, 0x32c2, 0x1078, 0x32f9, 0x2091, + 0x8001, 0x007c, 0x783c, 0x8001, 0x783e, 0x00c0, 0x32d3, 0x7840, + 0x783e, 0x7848, 0xa005, 0x0040, 0x32d3, 0x8001, 0x784a, 0x00c0, + 0x32d3, 0x1078, 0x1a19, 0x007c, 0x7834, 0x8001, 0x7836, 0x00c0, + 0x32f8, 0x7838, 0x7836, 0x2091, 0x8000, 0x7844, 0xa005, 0x00c0, + 0x32e3, 0x2001, 0x0101, 0x8001, 0x7846, 0xa080, 0x3e80, 0x2040, + 0x2004, 0xa065, 0x0040, 0x32f8, 0x6020, 0xa005, 0x0040, 0x32f4, + 0x8001, 0x6022, 0x0040, 0x3328, 0x6000, 0x2c40, 0x0078, 0x32e9, + 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, 0x3327, 0x782c, 0x782a, + 0x7830, 0xa005, 0x00c0, 0x3306, 0x2001, 0x0080, 0x8001, 0x7832, + 0x8003, 0x8003, 0x8003, 0x8003, 0xa090, 0x3680, 0xa298, 0x0002, + 0x2304, 0xa084, 0x0008, 0x0040, 0x3327, 0xa290, 0x0009, 0x2204, + 0xa005, 0x0040, 0x331f, 0x8001, 0x2012, 0x00c0, 0x3327, 0x2304, + 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, 0x1078, 0x1a19, 0x007c, + 0x2069, 0x3540, 0x6800, 0xa005, 0x0040, 0x3332, 0x683c, 0xac06, + 0x0040, 0x336f, 0x6017, 0x0006, 0x60b0, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, 0xa085, 0x0060, 0x601e, 0x6000, 0x2042, - 0x6710, 0x6fb6, 0x1078, 0x1681, 0x6818, 0xa005, 0x0040, 0x3252, + 0x6710, 0x6fb6, 0x1078, 0x1692, 0x6818, 0xa005, 0x0040, 0x334a, 0x8001, 0x681a, 0x6808, 0xa084, 0xffef, 0x680a, 0x6810, 0x8001, - 0x00d0, 0x325c, 0x1078, 0x1b4e, 0x6812, 0x602f, 0x0000, 0x602b, - 0x0000, 0x2c68, 0x1078, 0x17be, 0x2069, 0x3440, 0x2001, 0x0006, - 0x68a2, 0x7944, 0xa184, 0x0100, 0x00c0, 0x3272, 0x69ba, 0x2001, - 0x0004, 0x68a2, 0x1078, 0x19f3, 0x2091, 0x8001, 0x007c, 0x2009, - 0x344f, 0x2164, 0x2069, 0x0100, 0x6017, 0x0006, 0x6858, 0xa084, - 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, 0xa085, 0x0048, 0x601e, - 0x602f, 0x0000, 0x602b, 0x0000, 0x6830, 0xa084, 0x0040, 0x0040, - 0x32b1, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, - 0x0040, 0x329e, 0x0070, 0x329e, 0x0078, 0x3295, 0x684b, 0x0009, - 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, 0x32ab, 0x0070, - 0x32ab, 0x0078, 0x32a2, 0x20a9, 0x00fa, 0x0070, 0x32b1, 0x0078, - 0x32ad, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0046, 0x2009, - 0x3468, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091, 0x8001, 0x007c, - 0x2079, 0x3400, 0x1078, 0x3309, 0x1078, 0x32d1, 0x1078, 0x32e6, - 0x1078, 0x32fb, 0x7833, 0x0000, 0x7847, 0x0000, 0x784b, 0x0000, - 0x007c, 0x2019, 0x000a, 0x2011, 0x3446, 0x2204, 0xa086, 0x0032, - 0x0040, 0x32e3, 0x2019, 0x000c, 0x2204, 0xa086, 0x003c, 0x0040, - 0x32e3, 0x2019, 0x0008, 0x7b2a, 0x7b2e, 0x007c, 0x2019, 0x0030, - 0x2011, 0x3446, 0x2204, 0xa086, 0x0032, 0x0040, 0x32f8, 0x2019, - 0x0039, 0x2204, 0xa086, 0x003c, 0x0040, 0x32f8, 0x2019, 0x0027, - 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x000d, 0x2011, 0x3446, 0x2204, - 0xa086, 0x003c, 0x0040, 0x3306, 0x2019, 0x000a, 0x7b3e, 0x7b42, - 0x007c, 0x2019, 0x2faf, 0x2011, 0x3446, 0x2204, 0xa086, 0x0032, - 0x0040, 0x331b, 0x2019, 0x3971, 0x2204, 0xa086, 0x003c, 0x0040, - 0x331b, 0x2019, 0x2626, 0x7b22, 0x7b26, 0x007c, 0xae5b -}; - -unsigned short pti_risc_code_length01 = 0x231f; - -/* Version 1.31.00 ISP1000 Initiator RISC firmware - * We use this for all non-PTI SBUS boards. - */ -unsigned short sbus_risc_code_addr01 = 0x1000; - -unsigned short sbus_risc_code01[] __initdata = { - 0x0078, 0x1030, 0xa5e3, 0x241a, 0x0001, 0x12ff, 0x2043, 0x4f50, - 0x5952, 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, - 0x2c31, 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, - 0x4320, 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, - 0x5350, 0x3130, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, - 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3331, 0x2020, - 0x2071, 0x0010, 0x70c3, 0x0004, 0x20c9, 0x3fff, 0x2089, 0x10ca, - 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0001, - 0x3f00, 0x70d6, 0x2031, 0x0030, 0x2079, 0x3500, 0x7863, 0x0000, - 0x2fa0, 0x2009, 0x012b, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, - 0x8109, 0x00c0, 0x104d, 0x789b, 0x0101, 0x780b, 0x0002, 0x780f, - 0x0002, 0x784f, 0x0bb8, 0x2069, 0x3540, 0x00a8, 0x106c, 0x681b, - 0x003c, 0x2009, 0x1313, 0xa18c, 0xff00, 0x3700, 0xa084, 0x00ff, - 0xa105, 0x20b8, 0x0078, 0x106e, 0x681b, 0x0028, 0x6807, 0x0007, - 0x680b, 0x00fa, 0x680f, 0x0008, 0x6813, 0x0005, 0x681f, 0x0000, - 0x6823, 0x0006, 0x6817, 0x0008, 0x6827, 0x0000, 0x2069, 0x3600, - 0x2011, 0x0020, 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f, 0x0019, - 0x6803, 0xdd00, 0x6807, 0x001a, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, - 0xa290, 0x0004, 0x8109, 0x00c0, 0x1084, 0x2069, 0x3680, 0x20a9, - 0x0080, 0x6837, 0x0000, 0x680b, 0x0040, 0x6817, 0x0064, 0x681f, - 0x0002, 0xade8, 0x0010, 0x0070, 0x10a7, 0x0078, 0x1099, 0x1078, - 0x1a42, 0x1078, 0x2f3d, 0x1078, 0x168b, 0x1078, 0x33bb, 0x3200, - 0xa085, 0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x10be, 0x70c0, - 0xa086, 0x0002, 0x00c0, 0x10be, 0x1078, 0x11be, 0x1078, 0x10ee, - 0x1078, 0x1821, 0x1078, 0x19b2, 0x1078, 0x3280, 0x1078, 0x1787, - 0x0078, 0x10be, 0x10d2, 0x10d4, 0x1b9f, 0x1b9f, 0x2f9b, 0x2f9b, - 0x1b9f, 0x1b9f, 0x0078, 0x10d2, 0x0078, 0x10d4, 0x0078, 0x10d6, - 0x0078, 0x10d8, 0x7008, 0x800c, 0x00c8, 0x10e9, 0x7007, 0x0002, - 0xa08c, 0x000c, 0x00c0, 0x10ea, 0x8004, 0x8004, 0x00c8, 0x10e9, - 0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x11c1, 0x0068, 0x1133, - 0x7814, 0xa005, 0x00c0, 0x10f8, 0x0010, 0x1134, 0x0078, 0x1133, - 0x2009, 0x3568, 0x2104, 0xa005, 0x00c0, 0x1133, 0x7814, 0xa086, - 0x0001, 0x00c0, 0x1105, 0x1078, 0x1540, 0x7817, 0x0000, 0x2009, - 0x356f, 0x2104, 0xa065, 0x0040, 0x1121, 0x2009, 0x356a, 0x211c, - 0x8108, 0x2114, 0x8108, 0x2104, 0xa210, 0xa399, 0x0000, 0x2009, - 0x001c, 0x6083, 0x0103, 0x1078, 0x161b, 0x00c0, 0x112d, 0x1078, - 0x1682, 0x2009, 0x356f, 0x200b, 0x0000, 0x2009, 0x3569, 0x2104, - 0x200b, 0x0000, 0xa005, 0x0040, 0x1131, 0x2001, 0x4005, 0x0078, - 0x11c0, 0x0078, 0x11be, 0x007c, 0x2061, 0x0000, 0x6018, 0xa084, - 0x0001, 0x0040, 0x113c, 0x007c, 0x70c3, 0x0000, 0x70c7, 0x0000, - 0x70cb, 0x0000, 0x70cf, 0x0000, 0x70c0, 0xa0bc, 0xffc0, 0x00c0, - 0x118c, 0x2038, 0x0079, 0x114c, 0x11be, 0x1209, 0x11d7, 0x1209, - 0x125a, 0x125a, 0x11ce, 0x159a, 0x1265, 0x11ca, 0x11db, 0x11dd, - 0x11df, 0x11e1, 0x159f, 0x11ca, 0x126b, 0x1287, 0x154e, 0x1594, - 0x11e3, 0x1475, 0x1497, 0x14b1, 0x14da, 0x142e, 0x143c, 0x1450, - 0x1464, 0x12f3, 0x11ca, 0x12a3, 0x12aa, 0x12af, 0x12b4, 0x12ba, - 0x12bf, 0x12c4, 0x12c9, 0x12ce, 0x12d2, 0x12e7, 0x11ca, 0x11ca, - 0x11ca, 0x11ca, 0x11ca, 0x12ff, 0x1308, 0x1317, 0x133d, 0x1347, - 0x134e, 0x137a, 0x1389, 0x1398, 0x13aa, 0x1413, 0x11ca, 0x11ca, - 0x11ca, 0x11ca, 0x11ca, 0x1423, 0xa0bc, 0xffa0, 0x00c0, 0x11ca, - 0x2038, 0xa084, 0x001f, 0x0079, 0x1195, 0x11ca, 0x11ca, 0x11ca, - 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, - 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, - 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x11ca, 0x15f7, - 0x1601, 0x1605, 0x1613, 0x11ca, 0x11ca, 0x72ca, 0x71c6, 0x2001, - 0x4006, 0x0078, 0x11c0, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, - 0x70c2, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, - 0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x11c1, 0x2099, 0x0041, - 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078, 0x11be, 0x70c4, - 0x70c3, 0x0004, 0x007a, 0x0078, 0x11be, 0x0078, 0x11be, 0x0078, - 0x11be, 0x0078, 0x11be, 0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, - 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, - 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, - 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061, 0x0472, 0x20b9, - 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091, 0x4080, 0x0078, - 0x0455, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, 0x2098, 0x2031, - 0x0030, 0x81ff, 0x0040, 0x11be, 0x7007, 0x0004, 0x731a, 0x721e, - 0x2051, 0x0012, 0x2049, 0x1238, 0x2041, 0x11be, 0x7003, 0x0002, - 0xa786, 0x0001, 0x00c0, 0x122a, 0x2049, 0x1246, 0x2041, 0x1252, - 0x7003, 0x0003, 0x7017, 0x0000, 0x810b, 0x7112, 0x00c8, 0x1232, - 0x7017, 0x0001, 0x7007, 0x0001, 0xa786, 0x0001, 0x0040, 0x1246, - 0x700c, 0xa084, 0x007f, 0x8004, 0x2009, 0x0020, 0xa102, 0x0942, - 0x094a, 0x20a8, 0x26a0, 0x53a6, 0x0078, 0x10da, 0x700c, 0xa084, - 0x007f, 0x0040, 0x1246, 0x80ac, 0x0048, 0x1246, 0x2698, 0x53a5, - 0x0078, 0x10da, 0x700c, 0xa084, 0x007f, 0x80ac, 0x2698, 0x53a5, - 0x0078, 0x11be, 0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, - 0x1262, 0x200a, 0x72ca, 0x0078, 0x11bd, 0x70c7, 0x0001, 0x70cb, - 0x001f, 0x0078, 0x11be, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, - 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x1281, 0x8001, 0x7872, - 0x7a7a, 0x7b7e, 0x7c76, 0x7898, 0xa084, 0xfffc, 0x789a, 0x0078, - 0x1285, 0x7898, 0xa085, 0x0001, 0x789a, 0x0078, 0x11be, 0x70c4, - 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, - 0x0040, 0x129d, 0x8001, 0x7886, 0x7a8e, 0x7b92, 0x7c8a, 0x7898, - 0xa084, 0xfcff, 0x789a, 0x0078, 0x12a1, 0x7898, 0xa085, 0x0100, - 0x789a, 0x0078, 0x11be, 0x2009, 0x3559, 0x210c, 0x2011, 0x015c, - 0x0078, 0x11bc, 0x2009, 0x3541, 0x210c, 0x0078, 0x11bd, 0x2009, - 0x3542, 0x210c, 0x0078, 0x11bd, 0x2061, 0x3540, 0x610c, 0x6210, - 0x0078, 0x11bc, 0x2009, 0x3545, 0x210c, 0x0078, 0x11bd, 0x2009, - 0x3546, 0x210c, 0x0078, 0x11bd, 0x2009, 0x3547, 0x210c, 0x0078, - 0x11bd, 0x2009, 0x3548, 0x210c, 0x0078, 0x11bd, 0x7908, 0x7a0c, - 0x0078, 0x11bc, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, - 0x8003, 0xa0e8, 0x3600, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, - 0x12e4, 0x6b08, 0x0078, 0x12e5, 0x6b0c, 0x0078, 0x11bb, 0x77c4, - 0x1078, 0x169c, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, - 0x2708, 0x0078, 0x11bb, 0x77c4, 0x1078, 0x169c, 0x2091, 0x8000, - 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078, 0x11bb, 0x71c4, - 0xa182, 0x0010, 0x00c8, 0x11b6, 0x1078, 0x1ac6, 0x0078, 0x11bb, - 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11b6, 0x2011, 0x3541, 0x2204, - 0x007e, 0x2112, 0x1078, 0x1a7f, 0x017f, 0x0078, 0x11bd, 0x71c4, - 0x2011, 0x1335, 0x20a9, 0x0008, 0x2204, 0xa106, 0x0040, 0x1327, - 0x8210, 0x0070, 0x1325, 0x0078, 0x131c, 0x0078, 0x11b6, 0xa292, - 0x1335, 0x027e, 0x2011, 0x3542, 0x2204, 0x2112, 0x017f, 0x007e, - 0x1078, 0x1a8b, 0x017f, 0x0078, 0x11bd, 0x03e8, 0x00fa, 0x01f4, - 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, 0x3540, 0x610c, - 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078, 0x11bc, 0x2061, - 0x3540, 0x6114, 0x70c4, 0x6016, 0x0078, 0x11bd, 0x71c4, 0x2011, - 0x0004, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, 0x1367, 0x2011, - 0x0005, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040, 0x1367, 0x2011, - 0x0006, 0x2019, 0x1313, 0xa186, 0x003c, 0x00c0, 0x11b6, 0x2061, - 0x3540, 0x6018, 0x007e, 0x611a, 0xa39c, 0xff00, 0x3700, 0xa084, - 0x00ff, 0xa305, 0x20b8, 0x1078, 0x1a9c, 0x1078, 0x33bb, 0x017f, - 0x0078, 0x11bd, 0x71c4, 0xa184, 0xffcf, 0x00c0, 0x11b6, 0x2011, - 0x3547, 0x2204, 0x2112, 0x007e, 0x1078, 0x1abe, 0x017f, 0x0078, - 0x11bd, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x11b6, 0x2011, 0x3548, - 0x2204, 0x007e, 0x2112, 0x1078, 0x1aad, 0x017f, 0x0078, 0x11bd, - 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x11b5, 0xa284, 0xfffd, - 0x00c0, 0x11b5, 0x2100, 0x7908, 0x780a, 0x2200, 0x7a0c, 0x780e, - 0x0078, 0x11bc, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, - 0x8003, 0xa0e8, 0x3600, 0x2019, 0x0000, 0x72c8, 0x6800, 0x007e, - 0xa226, 0x0040, 0x13d9, 0x6a02, 0xa484, 0x2000, 0x0040, 0x13c2, - 0xa39d, 0x0010, 0xa484, 0x1000, 0x0040, 0x13c8, 0xa39d, 0x0008, - 0xa484, 0x4000, 0x0040, 0x13d9, 0x810f, 0xa284, 0x4000, 0x0040, - 0x13d5, 0x1078, 0x1ae0, 0x0078, 0x13d9, 0x1078, 0x1ad2, 0x0078, - 0x13d9, 0x72cc, 0x82ff, 0x0040, 0x140b, 0x6808, 0xa206, 0x0040, - 0x140b, 0xa2a4, 0x00ff, 0x2061, 0x3540, 0x6118, 0xa186, 0x0028, - 0x0040, 0x13f2, 0xa186, 0x0032, 0x0040, 0x13f8, 0xa186, 0x003c, - 0x0040, 0x13fe, 0xa482, 0x0064, 0x0048, 0x1408, 0x0078, 0x1402, - 0xa482, 0x0050, 0x0048, 0x1408, 0x0078, 0x1402, 0xa482, 0x0043, - 0x0048, 0x1408, 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x11b7, - 0x6a0a, 0xa39d, 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, - 0x71c4, 0x0078, 0x11bb, 0x77c4, 0x1078, 0x169c, 0x2091, 0x8000, - 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, - 0x2708, 0x0078, 0x11bb, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, - 0x00c8, 0x11b6, 0x1078, 0x1aee, 0x0078, 0x11bb, 0x77c4, 0x1078, - 0x169c, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a, 0x2091, - 0x8001, 0x2708, 0x0078, 0x11bc, 0x77c4, 0x1078, 0x169c, 0x2091, - 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0040, - 0x144b, 0x1078, 0x1a23, 0x2091, 0x8001, 0x2708, 0x0078, 0x11bc, - 0x77c4, 0x1078, 0x169c, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0004, - 0x6a0a, 0x6804, 0xa005, 0x0040, 0x145f, 0x1078, 0x1a23, 0x2091, - 0x8001, 0x2708, 0x0078, 0x11bc, 0x77c4, 0x2041, 0x0001, 0x2049, - 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x16a9, 0x2091, - 0x8001, 0x2708, 0x6a08, 0x0078, 0x11bc, 0x77c4, 0x72c8, 0x73cc, - 0x77c6, 0x72ca, 0x73ce, 0x1078, 0x1722, 0x00c0, 0x1493, 0x6818, - 0xa005, 0x0040, 0x148d, 0x2708, 0x1078, 0x1afe, 0x00c0, 0x148d, - 0x7817, 0xffff, 0x2091, 0x8001, 0x007c, 0x2091, 0x8001, 0x2001, - 0x4005, 0x0078, 0x11c0, 0x2091, 0x8001, 0x0078, 0x11be, 0x77c4, - 0x77c6, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, - 0x8000, 0x1078, 0x16a9, 0x2061, 0x3540, 0x60a3, 0x0003, 0x67b6, - 0x60a7, 0x0000, 0x7817, 0xffff, 0x2091, 0x8001, 0x1078, 0x1a23, - 0x007c, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2091, - 0x8000, 0x2061, 0x3540, 0x60a3, 0x0002, 0x60a7, 0x0000, 0x67b6, - 0x7817, 0xffff, 0x1078, 0x1a23, 0x2091, 0x8001, 0x2041, 0x0021, - 0x2049, 0x0004, 0x2051, 0x0010, 0x2091, 0x8000, 0x1078, 0x16a9, - 0x70c8, 0x6836, 0x8738, 0xa784, 0x0007, 0x00c0, 0x14ce, 0x2091, - 0x8001, 0x007c, 0x7898, 0xa084, 0x0003, 0x00c0, 0x14fe, 0x2039, - 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, - 0x169c, 0x2091, 0x8000, 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, - 0x8738, 0xa784, 0x0007, 0x00c0, 0x14e7, 0xa7bc, 0xff00, 0x873f, - 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x14e7, 0x2091, 0x8000, - 0x2069, 0x0100, 0x6830, 0xa084, 0x0040, 0x0040, 0x1527, 0x684b, - 0x0004, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x1514, - 0x0070, 0x1514, 0x0078, 0x150b, 0x684b, 0x0009, 0x20a9, 0x0014, - 0x6848, 0xa084, 0x0001, 0x0040, 0x1521, 0x0070, 0x1521, 0x0078, - 0x1518, 0x20a9, 0x00fa, 0x0070, 0x1527, 0x0078, 0x1523, 0x2079, - 0x3500, 0x7817, 0x0001, 0x2061, 0x3540, 0x60a3, 0x0001, 0x60a7, - 0x0000, 0x60c3, 0x000f, 0x7898, 0xa085, 0x0002, 0x789a, 0x6808, - 0xa084, 0xfffd, 0x680a, 0x681b, 0x0046, 0x2091, 0x8001, 0x007c, - 0x7898, 0xa084, 0xfffd, 0x789a, 0xa084, 0x0001, 0x00c0, 0x154a, - 0x1078, 0x176a, 0x71c4, 0x71c6, 0x794a, 0x007c, 0x74c4, 0x73c8, - 0x72cc, 0x74c6, 0x73ca, 0x72ce, 0x2079, 0x3500, 0x2009, 0x0040, - 0x1078, 0x1679, 0x0040, 0x1590, 0x1078, 0x1649, 0x0040, 0x1564, - 0x1078, 0x1682, 0x0078, 0x1590, 0x6010, 0x2091, 0x8001, 0x7817, - 0xffff, 0x2009, 0x3568, 0x200b, 0x0005, 0x8108, 0x200b, 0x0000, - 0x8108, 0x230a, 0x8108, 0x220a, 0x8108, 0x240a, 0x8108, 0x200a, - 0x8108, 0x200b, 0x0000, 0x8108, 0x2c0a, 0xa02e, 0x2530, 0x0e7e, - 0x1078, 0x2f16, 0x0e7f, 0x6592, 0x65a2, 0x6696, 0x66a6, 0x60ab, - 0x0000, 0x60af, 0x0000, 0x2091, 0x8001, 0x1078, 0x1a23, 0x007c, - 0x70c3, 0x4005, 0x0078, 0x11c1, 0x71c4, 0x70c7, 0x0000, 0x7906, - 0x0078, 0x11be, 0x71c4, 0x71c6, 0x2168, 0x0078, 0x15a1, 0x2069, - 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, - 0x15a3, 0xa285, 0x0000, 0x00c0, 0x15b1, 0x70c3, 0x4000, 0x0078, - 0x15b3, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x11c1, 0x71c4, 0x72c8, - 0x73cc, 0x2100, 0xa184, 0xfffc, 0x00c0, 0x11ca, 0x2100, 0x0079, - 0x15c1, 0x15d8, 0x15ed, 0x15ef, 0x15f1, 0x70c3, 0x4003, 0x71ce, - 0x72d2, 0x73d6, 0x0078, 0x15d4, 0x70c3, 0x4000, 0x70cf, 0x0000, - 0x70d3, 0x0000, 0x70d7, 0x0000, 0x77c6, 0x71ca, 0x0078, 0x11be, - 0x2031, 0x15f3, 0x2624, 0x8630, 0x2412, 0x2204, 0xa446, 0x00c0, - 0x15c5, 0xa484, 0xffff, 0x00c0, 0x15da, 0x2031, 0x15f3, 0x8210, - 0x8319, 0xa384, 0xffff, 0x00c0, 0x15da, 0x0078, 0x15cc, 0x0078, - 0x15cc, 0x0078, 0x15cc, 0x5555, 0xaaaa, 0xffff, 0x0000, 0x7960, - 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x11b6, 0x7962, 0x0078, - 0x11be, 0x7960, 0x71c6, 0x0078, 0x11be, 0x7954, 0x71c6, 0x71c4, - 0x7956, 0x7958, 0x71ca, 0x71c8, 0x795a, 0x795c, 0x71ce, 0x71cc, - 0x795e, 0x0078, 0x11be, 0x7954, 0x71c6, 0x7958, 0x71ca, 0x795c, - 0x71ce, 0x0078, 0x11be, 0x700c, 0xa084, 0x007f, 0x0040, 0x1627, - 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x1622, 0x7017, - 0x0000, 0x7112, 0x721a, 0x731e, 0x8108, 0x810c, 0x81a9, 0x8c98, - 0x20a1, 0x0030, 0x6080, 0x20a2, 0x53a6, 0x780c, 0xa085, 0x0000, - 0x7002, 0x7007, 0x0001, 0x7108, 0x8104, 0x00c8, 0x163b, 0x7007, - 0x0002, 0xa184, 0x000c, 0x710c, 0xa184, 0x0300, 0x7003, 0x0000, - 0x007c, 0x700c, 0xa084, 0x007f, 0x0040, 0x1655, 0x7007, 0x0004, - 0x7004, 0xa084, 0x0004, 0x00c0, 0x1650, 0x7017, 0x0000, 0x7112, - 0x721a, 0x731e, 0x2099, 0x0030, 0x8108, 0x81ac, 0x780c, 0xa085, - 0x0001, 0x7002, 0x7007, 0x0001, 0x7008, 0x800c, 0x00c8, 0x1664, - 0x7007, 0x0002, 0xa08c, 0x000c, 0x00c0, 0x1676, 0x710c, 0xa184, - 0x0300, 0x00c0, 0x1676, 0x2ca0, 0x53a5, 0xa006, 0x7003, 0x0000, - 0x007c, 0x7850, 0xa065, 0x0040, 0x1681, 0x2c04, 0x7852, 0x2063, - 0x0000, 0x007c, 0x0f7e, 0x2079, 0x3500, 0x7850, 0x2062, 0x2c00, - 0x7852, 0x0f7f, 0x007c, 0x2011, 0x4000, 0x7a52, 0x2019, 0x015c, - 0x8319, 0x0040, 0x1699, 0xa280, 0x002f, 0x2012, 0x2010, 0x0078, - 0x1690, 0x2013, 0x0000, 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, - 0x0007, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e8, 0x3680, - 0x007c, 0x1078, 0x169c, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, - 0xa084, 0xffef, 0xa80d, 0x690a, 0x2009, 0x354f, 0x210c, 0x6804, - 0xa005, 0x0040, 0x16c6, 0xa116, 0x00c0, 0x16c6, 0x2060, 0x6000, - 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x16c9, 0x2009, 0x0000, - 0x017e, 0x6804, 0xa065, 0x0040, 0x16d8, 0x6000, 0x6806, 0x1078, - 0x16e9, 0x1078, 0x17d5, 0x6810, 0x8001, 0x6812, 0x00c0, 0x16c9, - 0x017f, 0x6902, 0x6906, 0x007c, 0xa065, 0x0040, 0x16e8, 0x6098, - 0x609b, 0x0000, 0x2008, 0x1078, 0x1682, 0x2100, 0x0078, 0x16dc, - 0x007c, 0x6003, 0x0103, 0x20a9, 0x001c, 0xac80, 0x0004, 0x20a0, - 0x2001, 0x0000, 0x40a4, 0x6828, 0x6016, 0x682c, 0x601e, 0x007c, - 0x0e7e, 0x2071, 0x3540, 0x7040, 0xa08c, 0x0080, 0x00c0, 0x1706, - 0xa088, 0x3580, 0x2d0a, 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, - 0x0e7e, 0x2071, 0x3540, 0x2009, 0x3580, 0x7240, 0x8221, 0x8211, - 0x0048, 0x1720, 0x2104, 0x8108, 0xad06, 0x00c0, 0x170f, 0x8119, - 0x211e, 0x8108, 0x8318, 0x8211, 0x00c8, 0x1718, 0x7442, 0xa006, - 0x0e7f, 0x007c, 0x1078, 0x169c, 0x2091, 0x8000, 0x6804, 0x781e, - 0xa065, 0x0040, 0x1769, 0x0078, 0x1733, 0x2c00, 0x781e, 0x6000, - 0xa065, 0x0040, 0x1769, 0x600c, 0xa306, 0x00c0, 0x172d, 0x6008, - 0xa206, 0x00c0, 0x172d, 0x2c28, 0x2001, 0x354f, 0x2004, 0xac06, - 0x0040, 0x1769, 0x6804, 0xac06, 0x00c0, 0x1750, 0x6000, 0x2060, - 0x6806, 0xa005, 0x00c0, 0x1750, 0x6803, 0x0000, 0x0078, 0x175a, - 0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x175a, - 0x2c00, 0x6802, 0x2560, 0x1078, 0x16e9, 0x6017, 0x0005, 0x601f, - 0x0020, 0x1078, 0x17d5, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff, - 0xa005, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, - 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x16a9, 0x8738, 0xa784, - 0x0007, 0x00c0, 0x1774, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, - 0xa784, 0x0f00, 0x00c0, 0x1774, 0x2091, 0x8001, 0x007c, 0x2061, - 0x0000, 0x6018, 0xa084, 0x0001, 0x00c0, 0x1794, 0x78ac, 0x78af, - 0x0000, 0xa005, 0x00c0, 0x1795, 0x007c, 0xa08c, 0xfff0, 0x0040, - 0x179b, 0x1078, 0x1b81, 0x0079, 0x179d, 0x17ad, 0x17af, 0x17b5, - 0x17b9, 0x17ad, 0x17bd, 0x17ad, 0x17ad, 0x17ad, 0x17ad, 0x17c3, - 0x17c7, 0x17ad, 0x17ad, 0x17ad, 0x17ad, 0x1078, 0x1b81, 0x1078, - 0x176a, 0x2001, 0x8001, 0x0078, 0x17cd, 0x2001, 0x8003, 0x0078, - 0x17cd, 0x2001, 0x8004, 0x0078, 0x17cd, 0x1078, 0x176a, 0x2001, - 0x8006, 0x0078, 0x17cd, 0x2001, 0x800c, 0x0078, 0x17cd, 0x1078, - 0x176a, 0x2001, 0x800d, 0x0078, 0x17cd, 0x70c2, 0x2061, 0x0000, - 0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0x2c04, 0x6082, 0x2c08, - 0x2063, 0x0000, 0x7864, 0x8000, 0x7866, 0x7868, 0xa005, 0x796a, - 0x0040, 0x17e5, 0x2c02, 0x0078, 0x17e6, 0x796e, 0x007c, 0x0c7e, - 0x2061, 0x3500, 0x6883, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6064, - 0x8000, 0x6066, 0x6068, 0xa005, 0x616a, 0x0040, 0x17fa, 0x2d02, - 0x0078, 0x17fb, 0x616e, 0x0c7f, 0x007c, 0x1078, 0x180e, 0x0040, - 0x180d, 0x0c7e, 0x6098, 0xa065, 0x0040, 0x1808, 0x1078, 0x16dc, - 0x0c7f, 0x609b, 0x0000, 0x1078, 0x1682, 0x007c, 0x786c, 0xa065, - 0x0040, 0x1820, 0x2091, 0x8000, 0x7864, 0x8001, 0x7866, 0x2c04, - 0x786e, 0xa005, 0x00c0, 0x181e, 0x786a, 0x8000, 0x2091, 0x8001, - 0x007c, 0x7898, 0xa005, 0x00c0, 0x186f, 0x7974, 0x70d0, 0x0005, - 0x0005, 0x72d0, 0xa206, 0x00c0, 0x1826, 0x2200, 0xa106, 0x00c0, - 0x183d, 0x7804, 0xa005, 0x0040, 0x186f, 0x7807, 0x0000, 0x0068, - 0x186f, 0x2091, 0x4080, 0x0078, 0x186f, 0x1078, 0x1679, 0x0040, - 0x186f, 0x7a7c, 0x7b78, 0x8107, 0x8004, 0x8004, 0xa210, 0xa399, - 0x0000, 0x2009, 0x0040, 0x1078, 0x1649, 0x0040, 0x1866, 0x1078, - 0x1682, 0x7880, 0x8000, 0x7882, 0xa086, 0x0002, 0x00c0, 0x186f, - 0x2091, 0x8000, 0x78af, 0x0002, 0x7883, 0x0000, 0x7898, 0xa085, - 0x0003, 0x789a, 0x2091, 0x8001, 0x0078, 0x186f, 0x7883, 0x0000, - 0x1078, 0x199c, 0x6000, 0xa084, 0x0007, 0x0079, 0x1870, 0x007c, - 0x1878, 0x1887, 0x18a7, 0x1878, 0x18b9, 0x1878, 0x1878, 0x1878, - 0x2039, 0x0400, 0x78a8, 0xa705, 0x78aa, 0x6004, 0xa705, 0x6006, - 0x1078, 0x18f7, 0x6018, 0x78a6, 0x1078, 0x1984, 0x007c, 0x78a8, - 0xa084, 0x0100, 0x0040, 0x188e, 0x0078, 0x1878, 0x78ab, 0x0000, - 0x6000, 0x8007, 0xa084, 0x00ff, 0x789e, 0x8001, 0x609b, 0x0000, - 0x0040, 0x18a4, 0x1078, 0x18f7, 0x0040, 0x18a4, 0x78a8, 0xa085, - 0x0100, 0x78aa, 0x0078, 0x18a6, 0x1078, 0x191b, 0x007c, 0x78a8, - 0xa08c, 0x0e00, 0x00c0, 0x18b0, 0xa084, 0x0100, 0x00c0, 0x18b2, - 0x0078, 0x1878, 0x1078, 0x18f7, 0x00c0, 0x18b8, 0x1078, 0x191b, - 0x007c, 0x78a8, 0xa084, 0x0100, 0x0040, 0x18c0, 0x0078, 0x1878, - 0x78ab, 0x0000, 0x6710, 0x20a9, 0x0001, 0x6014, 0xa084, 0x00ff, - 0xa005, 0x0040, 0x18dd, 0xa7bc, 0xff00, 0x20a9, 0x0008, 0xa08e, - 0x0001, 0x0040, 0x18dd, 0x2039, 0x0000, 0x20a9, 0x0080, 0xa08e, - 0x0002, 0x0040, 0x18dd, 0x0078, 0x18f4, 0x1078, 0x169c, 0x2d00, - 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, - 0xffde, 0x680a, 0x2d00, 0xa080, 0x0010, 0x2068, 0x2091, 0x8001, - 0x0070, 0x18f4, 0x0078, 0x18e0, 0x1078, 0x1682, 0x007c, 0x78a0, - 0xa06d, 0x00c0, 0x1902, 0x2c00, 0x78a2, 0x78a6, 0x609b, 0x0000, - 0x0078, 0x190e, 0x2c00, 0x689a, 0x609b, 0x0000, 0x78a2, 0x2d00, - 0x6002, 0x78a4, 0xad06, 0x00c0, 0x190e, 0x6002, 0x789c, 0x8001, - 0x789e, 0x00c0, 0x191a, 0x78a8, 0xa084, 0x0000, 0x78aa, 0x78a4, - 0x2060, 0xa006, 0x007c, 0xa02e, 0x2530, 0x6118, 0xa184, 0x0060, - 0x619e, 0x0040, 0x1927, 0x0e7e, 0x1078, 0x2f16, 0x0e7f, 0x6592, - 0x65a2, 0x6696, 0x66a6, 0x60ab, 0x0000, 0x60af, 0x0000, 0x6710, - 0x1078, 0x169c, 0x2091, 0x8000, 0x6808, 0xa084, 0x0001, 0x0040, - 0x1949, 0x2091, 0x8001, 0x1078, 0x16e9, 0x2091, 0x8000, 0x1078, - 0x17d5, 0x2091, 0x8001, 0x78a3, 0x0000, 0x78a7, 0x0000, 0x0078, - 0x1983, 0x6020, 0xa096, 0x0001, 0x00c0, 0x1950, 0x8000, 0x6022, - 0x6a10, 0x6814, 0x2091, 0x8001, 0xa202, 0x0048, 0x195f, 0x0040, - 0x195f, 0x2039, 0x0200, 0x1078, 0x1984, 0x0078, 0x1983, 0x2c08, - 0x2091, 0x8000, 0x6800, 0xa065, 0x0040, 0x1967, 0x6102, 0x6902, - 0x00c0, 0x196b, 0x6906, 0x2160, 0x6003, 0x0000, 0x6810, 0x8000, - 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c, 0x0040, 0x0040, 0x197d, - 0xa086, 0x0040, 0x680a, 0x1078, 0x16f8, 0x1078, 0x1a23, 0x78a7, - 0x0000, 0x78a3, 0x0000, 0x007c, 0x6004, 0xa705, 0x6006, 0x2091, - 0x8000, 0x1078, 0x17d5, 0x2091, 0x8001, 0x78a4, 0xa065, 0x0040, - 0x1997, 0x6098, 0x78a6, 0x609b, 0x0000, 0x0078, 0x1987, 0x78a3, - 0x0000, 0x78a7, 0x0000, 0x007c, 0x7970, 0x7874, 0x8000, 0xa10a, - 0x00c8, 0x19a3, 0xa006, 0x7876, 0x70d2, 0x7804, 0xa005, 0x0040, - 0x19b1, 0x8001, 0x7806, 0x00c0, 0x19b1, 0x0068, 0x19b1, 0x2091, - 0x4080, 0x007c, 0x0068, 0x19cc, 0x2029, 0x0000, 0x786c, 0xa065, - 0x0040, 0x19c7, 0x1078, 0x19cd, 0x0040, 0x19c7, 0x057e, 0x1078, - 0x19e3, 0x057f, 0x00c0, 0x19c7, 0x8528, 0x0078, 0x19b6, 0x85ff, - 0x0040, 0x19cc, 0x2091, 0x4080, 0x007c, 0x7b84, 0x7988, 0x72d4, - 0x0005, 0x0005, 0x70d4, 0xa206, 0x00c0, 0x19cf, 0x2200, 0xa102, - 0x00c0, 0x19dd, 0x2300, 0xa005, 0x007c, 0x0048, 0x19e1, 0xa302, - 0x007c, 0x8002, 0x007c, 0x1078, 0x1a15, 0x2009, 0x001c, 0x6024, - 0xa005, 0x0040, 0x19ed, 0x2009, 0x0040, 0x1078, 0x161b, 0x0040, - 0x1a06, 0x7894, 0x8000, 0x7896, 0xa086, 0x0002, 0x00c0, 0x1a14, - 0x2091, 0x8000, 0x78af, 0x0003, 0x7897, 0x0000, 0x7898, 0xa085, - 0x0300, 0x789a, 0x2091, 0x8001, 0x0078, 0x1a14, 0x7897, 0x0000, - 0x1078, 0x17fd, 0x7984, 0x7888, 0x8000, 0xa10a, 0x00c8, 0x1a11, - 0xa006, 0x788a, 0x70d6, 0xa006, 0x007c, 0x8107, 0x8004, 0x8004, - 0x7a90, 0x7b8c, 0xa210, 0xa399, 0x0000, 0x007c, 0x2009, 0x3568, - 0x2091, 0x8000, 0x200a, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3540, - 0x2091, 0x8000, 0x2104, 0xa086, 0x0000, 0x00c0, 0x1a3e, 0x2009, - 0x3512, 0x2104, 0xa005, 0x00c0, 0x1a3e, 0x7830, 0xa084, 0x00c0, - 0x00c0, 0x1a3e, 0x0018, 0x1a3e, 0x781b, 0x0044, 0x2091, 0x8001, - 0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x3540, 0x2079, - 0x0100, 0x2019, 0x2ddb, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040, - 0x1a5a, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318, - 0x0078, 0x1a4d, 0x789b, 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, - 0x78af, 0x0220, 0x0070, 0x1a66, 0x0078, 0x1a5e, 0x7003, 0x0000, - 0x1078, 0x1b65, 0x7004, 0xa084, 0x000f, 0xa085, 0x6280, 0x7806, - 0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, - 0x7047, 0x357f, 0x7043, 0x0000, 0x127f, 0x2000, 0x007c, 0xa18c, - 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, - 0x1078, 0x1b65, 0x007c, 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, - 0x0070, 0x1a94, 0x0078, 0x1a8f, 0xa18c, 0x0e00, 0x2204, 0xa084, - 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101, 0x20a9, 0x0005, - 0x8213, 0x0070, 0x1aa5, 0x0078, 0x1aa0, 0xa294, 0x00e0, 0x2104, - 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011, 0x0101, 0x20a9, - 0x000c, 0x810b, 0x0070, 0x1ab6, 0x0078, 0x1ab1, 0xa18c, 0xf000, - 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c, 0x2011, 0x0102, - 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x8103, 0x8003, - 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x62ac, 0x63ac, - 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, - 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f, 0x007c, - 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, 0x0100, 0x609a, - 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x8103, 0x8003, - 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0x62ae, - 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, - 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x1b43, 0x2061, 0x3f80, - 0x1078, 0x1b4b, 0x0040, 0x1b31, 0x20a9, 0x0000, 0x2061, 0x3e80, - 0x0c7e, 0x1078, 0x1b4b, 0x0040, 0x1b1d, 0x0c7f, 0x8c60, 0x0070, - 0x1b1b, 0x0078, 0x1b10, 0x0078, 0x1b43, 0x007f, 0xa082, 0x3e80, - 0x2071, 0x3540, 0x70ba, 0x601c, 0xa085, 0x0800, 0x601e, 0x71b6, - 0x60a7, 0x0000, 0x2001, 0x0004, 0x70a2, 0x1078, 0x1a1e, 0x0078, - 0x1b3f, 0x2071, 0x3540, 0x601c, 0xa085, 0x0800, 0x601e, 0x71b6, - 0x60a7, 0x0000, 0x2001, 0x0006, 0x70a2, 0x1078, 0x1a1e, 0x2001, - 0x0000, 0x0078, 0x1b45, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, - 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040, 0x1b62, 0x2060, - 0x600c, 0xa306, 0x00c0, 0x1b5f, 0x6008, 0xa206, 0x00c0, 0x1b5f, - 0x6010, 0xa106, 0x00c0, 0x1b5f, 0xa006, 0x0078, 0x1b64, 0x6000, - 0x0078, 0x1b4c, 0xa085, 0x0001, 0x007c, 0x2011, 0x3541, 0x220c, - 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084, 0x0100, 0x0040, - 0x1b80, 0x2019, 0x0112, 0x201b, 0x1000, 0x2021, 0x013a, 0x2122, - 0x2013, 0x0080, 0x2013, 0x008c, 0x2013, 0x0000, 0x201b, 0x0000, - 0x007c, 0x0068, 0x1b81, 0x007e, 0x2071, 0x0000, 0x7018, 0xa084, - 0x0001, 0x00c0, 0x1b86, 0x007f, 0x2e08, 0x2071, 0x0010, 0x70ca, - 0x007f, 0x70c6, 0x70c3, 0x8002, 0x2071, 0x0000, 0x701b, 0x0001, - 0x2091, 0x4080, 0x007f, 0x2070, 0x007f, 0x0078, 0x1b9d, 0x107e, - 0x007e, 0x127e, 0x2091, 0x2300, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, - 0xa594, 0x003f, 0xa484, 0x4000, 0x0040, 0x1bb4, 0xa784, 0x007c, - 0x00c0, 0x2da7, 0x1078, 0x1b81, 0xa49c, 0x000f, 0xa382, 0x0004, - 0x0050, 0x1bbc, 0x1078, 0x1b81, 0x8507, 0xa084, 0x000f, 0x0079, - 0x1bc1, 0x1fed, 0x209d, 0x20c3, 0x22e9, 0x2576, 0x25be, 0x25f5, - 0x2670, 0x26ca, 0x274f, 0x1be7, 0x1bd1, 0x1e56, 0x1f20, 0x2555, - 0x1bd1, 0x1078, 0x1b81, 0x0018, 0x1ba4, 0x127f, 0x2091, 0x8001, - 0x007f, 0x107f, 0x007c, 0x7003, 0x0000, 0x703f, 0x0000, 0x7030, - 0xa005, 0x0040, 0x1be5, 0x7033, 0x0000, 0x0018, 0x1ba4, 0x705c, - 0xa005, 0x00c0, 0x1ca5, 0x70a0, 0xa084, 0x0007, 0x0079, 0x1bf0, - 0x1cd1, 0x1bf8, 0x1c06, 0x1c27, 0x1c4d, 0x1c79, 0x1c77, 0x1bf8, - 0x7808, 0xa084, 0xfffd, 0x780a, 0x2009, 0x0046, 0x1078, 0x241b, - 0x00c0, 0x1c04, 0x7003, 0x0004, 0x0078, 0x1bd3, 0x1078, 0x2d69, - 0x00c0, 0x1c25, 0x70b4, 0x8007, 0x789b, 0x007e, 0x78aa, 0x789b, - 0x0010, 0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, 0x785b, - 0x0004, 0x2009, 0x00f7, 0x1078, 0x2419, 0x00c0, 0x1c25, 0x7003, - 0x0004, 0x70c3, 0x000f, 0x7033, 0x3570, 0x0078, 0x1bd3, 0x1078, - 0x2d69, 0x00c0, 0x1c4b, 0x71b4, 0x8107, 0x789b, 0x007e, 0x78aa, - 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab, - 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009, - 0x00f7, 0x1078, 0x2419, 0x00c0, 0x1c4b, 0x7003, 0x0004, 0x70c3, - 0x000f, 0x7033, 0x3570, 0x0078, 0x1bd3, 0x1078, 0x2d69, 0x00c0, - 0x1c75, 0x71b4, 0x8107, 0x789b, 0x007e, 0x78aa, 0x789b, 0x0010, - 0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x71b8, - 0x79aa, 0x78ab, 0x000d, 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, - 0x0004, 0x2009, 0x00f7, 0x1078, 0x2419, 0x00c0, 0x1c75, 0x7003, - 0x0004, 0x70c3, 0x000f, 0x7033, 0x3570, 0x0078, 0x1bd3, 0x0078, - 0x1c27, 0x1078, 0x2d69, 0x00c0, 0x1bd3, 0x70bc, 0x2068, 0x789b, - 0x0010, 0x6f10, 0x1078, 0x2cac, 0x2c50, 0x6810, 0x007e, 0x8007, - 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600, 0x2048, - 0x0c7e, 0x2060, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x0c7f, - 0x007f, 0xa084, 0x0007, 0xa085, 0x0080, 0x78aa, 0x6e18, 0x2041, - 0x0001, 0x2001, 0x0004, 0x0078, 0x1dcc, 0x1078, 0x2d69, 0x00c0, - 0x1bd3, 0x789b, 0x0010, 0x705c, 0x2068, 0x6f10, 0x1078, 0x2cac, - 0x2c50, 0x6008, 0xa085, 0x0010, 0x600a, 0x6820, 0xa005, 0x0040, - 0x1cc1, 0xa082, 0x0006, 0x0048, 0x1cbf, 0x0078, 0x1cc1, 0x6823, - 0x0005, 0x6810, 0xa084, 0x0007, 0xa085, 0x0080, 0x78aa, 0x2031, - 0x0020, 0x2041, 0x0001, 0x1078, 0x2dc8, 0x2001, 0x0003, 0x0078, - 0x1dcc, 0x0018, 0x1ba4, 0x7440, 0xa485, 0x0000, 0x0040, 0x1ceb, - 0xa080, 0x3580, 0x2030, 0x7144, 0x8108, 0xa12a, 0x0048, 0x1ce2, - 0x2009, 0x3580, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x1cf8, 0x8421, - 0x00c0, 0x1cdc, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, - 0x1bd3, 0x7640, 0xa6b0, 0x3580, 0x7144, 0x2600, 0x0078, 0x1ce7, - 0x7146, 0x2568, 0x2558, 0x753e, 0x2c50, 0x6034, 0xa085, 0x0000, - 0x00c0, 0x1cf5, 0x6708, 0x7736, 0xa784, 0x013f, 0x0040, 0x1d2a, - 0xa784, 0x0021, 0x00c0, 0x1cf5, 0xa784, 0x0002, 0x0040, 0x1d17, - 0xa784, 0x0004, 0x0040, 0x1cf5, 0xa7bc, 0xfffb, 0x670a, 0xa784, - 0x0008, 0x00c0, 0x1cf5, 0xa784, 0x0010, 0x00c0, 0x1cf5, 0xa784, - 0x0100, 0x0040, 0x1d2a, 0x6018, 0xa005, 0x00c0, 0x1cf5, 0xa7bc, - 0xfeff, 0x670a, 0x681f, 0x0000, 0x6e18, 0xa684, 0x000e, 0x6118, - 0x0040, 0x1d3a, 0x601c, 0xa102, 0x0048, 0x1d3d, 0x0040, 0x1d3d, - 0x0078, 0x1cf1, 0x81ff, 0x00c0, 0x1cf1, 0xa784, 0x0080, 0x00c0, - 0x1d43, 0x700c, 0x6022, 0xa7bc, 0xff7f, 0x670a, 0x6b10, 0x8307, - 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3600, 0x2060, - 0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x2a60, 0x0018, - 0x1ba4, 0x789b, 0x0010, 0xa046, 0x1078, 0x2d69, 0x00c0, 0x1bd3, - 0x6b10, 0xa39c, 0x0007, 0xa39d, 0x00c0, 0x704c, 0xa084, 0x8000, - 0x0040, 0x1d6e, 0xa684, 0x0001, 0x0040, 0x1d74, 0xa39c, 0xffbf, - 0xa684, 0x000e, 0x00c0, 0x2901, 0xa684, 0x0010, 0x0040, 0x1d7e, - 0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2907, 0x7baa, 0x8840, - 0xa684, 0x000e, 0x00c0, 0x1d89, 0xa7bd, 0x0010, 0x670a, 0x0078, - 0x1dca, 0x714c, 0xa18c, 0x0800, 0x0040, 0x290d, 0x2011, 0x0021, - 0x8004, 0x8004, 0x0048, 0x1da0, 0x2011, 0x0022, 0x8004, 0x0048, - 0x1da0, 0x2011, 0x0020, 0x8004, 0x0048, 0x1da0, 0x0040, 0x1dca, - 0x7aaa, 0x8840, 0x1078, 0x2d82, 0x6a10, 0x610c, 0x8108, 0xa18c, - 0x00ff, 0xa1e0, 0x3e80, 0x2c64, 0x8cff, 0x0040, 0x1dc1, 0x6010, - 0xa206, 0x00c0, 0x1dab, 0x60b4, 0x8001, 0x60b6, 0x00c0, 0x1da6, - 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, 0x0078, - 0x1cd1, 0x1078, 0x2d69, 0x00c0, 0x1bd3, 0x2a60, 0x610e, 0x79aa, - 0x8840, 0x712e, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184, 0x0018, - 0x0040, 0x1de0, 0xa184, 0x0010, 0x0040, 0x1dda, 0x1078, 0x2ad7, - 0x00c0, 0x1de0, 0xa184, 0x0008, 0x0040, 0x1de0, 0x1078, 0x29f1, - 0x007f, 0x7002, 0xa68c, 0x0060, 0x88ff, 0x0040, 0x1de9, 0xa18d, - 0x0004, 0x795a, 0x69b2, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, - 0x0061, 0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, 0x157e, 0x137e, - 0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, - 0x000a, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6810, 0x8007, - 0x789b, 0x007e, 0x78aa, 0x6d90, 0x7dd6, 0x7dde, 0x6e94, 0x7ed2, - 0x7eda, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x1e18, 0x0098, 0x1e20, - 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2d82, 0x0078, 0x1bdb, - 0x7200, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1e2d, 0x781b, - 0x0049, 0x1078, 0x2d82, 0x0078, 0x1e3e, 0x6ab0, 0xa295, 0x2000, - 0x7a5a, 0x781b, 0x0049, 0x1078, 0x2d82, 0x7200, 0x2500, 0xa605, - 0x0040, 0x1e3e, 0xa284, 0x0007, 0x1079, 0x1e4c, 0xad80, 0x0008, - 0x7032, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, 0x1e4a, 0x6018, - 0x8000, 0x601a, 0x0078, 0x1bd3, 0x1e54, 0x30f3, 0x30f3, 0x30e2, - 0x30f3, 0x1e54, 0x1e54, 0x1e54, 0x1078, 0x1b81, 0x7808, 0xa084, - 0xfffd, 0x780a, 0x0f7e, 0x2079, 0x3500, 0x7898, 0x0f7f, 0xa084, - 0x0001, 0x0040, 0x1e7c, 0x70a0, 0xa086, 0x0001, 0x00c0, 0x1e6b, - 0x70a2, 0x0078, 0x1f04, 0x70a0, 0xa086, 0x0005, 0x00c0, 0x1e7a, - 0x70bc, 0x2068, 0x6817, 0x0004, 0x6813, 0x0000, 0x681c, 0xa085, - 0x0008, 0x681e, 0x70a3, 0x0000, 0x157e, 0x2011, 0x0004, 0x71a0, - 0xa186, 0x0001, 0x0040, 0x1e9e, 0xa186, 0x0007, 0x00c0, 0x1e8e, - 0x2009, 0x352b, 0x200b, 0x0005, 0x0078, 0x1e9e, 0x2009, 0x3513, - 0x2104, 0x2009, 0x3512, 0x200a, 0x2009, 0x352b, 0x200b, 0x0001, - 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x1ea0, 0x70a3, 0x0000, - 0x1078, 0x2eca, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078, 0x2bb1, - 0xa7b8, 0x0100, 0x0070, 0x1eae, 0x0078, 0x1ea6, 0x7000, 0x2020, - 0x0079, 0x1eb2, 0x1ee0, 0x1ec9, 0x1ec9, 0x1ebc, 0x1ee0, 0x1ee0, - 0x1eba, 0x1eba, 0x1078, 0x1b81, 0x2021, 0x3557, 0x2404, 0xa005, - 0x0040, 0x1ec9, 0xad06, 0x00c0, 0x1ec9, 0x6800, 0x2022, 0x0078, - 0x1ed9, 0x681c, 0xa084, 0x0001, 0x00c0, 0x1ed5, 0x6f10, 0x1078, - 0x2cac, 0x1078, 0x28e4, 0x0078, 0x1ed9, 0x7054, 0x2060, 0x6800, - 0x6002, 0x6a16, 0x681c, 0xa085, 0x0008, 0x681e, 0x1078, 0x17e7, - 0x2021, 0x3f80, 0x1078, 0x1f0a, 0x2021, 0x3557, 0x1078, 0x1f0a, - 0x20a9, 0x0000, 0x2021, 0x3e80, 0x1078, 0x1f0a, 0x8420, 0x0070, - 0x1ef3, 0x0078, 0x1eec, 0x20a9, 0x0080, 0x2061, 0x3680, 0x6018, - 0x6110, 0xa102, 0x6012, 0x601b, 0x0000, 0xace0, 0x0010, 0x0070, - 0x1f03, 0x0078, 0x1ef7, 0x157f, 0x7003, 0x0000, 0x703f, 0x0000, - 0x0078, 0x1bd3, 0x047e, 0x2404, 0xa005, 0x0040, 0x1f1c, 0x2068, - 0x6800, 0x007e, 0x6a16, 0x681c, 0xa085, 0x0008, 0x681e, 0x1078, - 0x17e7, 0x007f, 0x0078, 0x1f0c, 0x047f, 0x2023, 0x0000, 0x007c, - 0xa282, 0x0003, 0x0050, 0x1f26, 0x1078, 0x1b81, 0x2300, 0x0079, - 0x1f29, 0x1f2c, 0x1f9f, 0x1fad, 0xa282, 0x0002, 0x0040, 0x1f32, - 0x1078, 0x1b81, 0x70a0, 0x70a3, 0x0000, 0x70c3, 0x0000, 0x0079, - 0x1f39, 0x1f41, 0x1f41, 0x1f43, 0x1f77, 0x2913, 0x1f41, 0x1f77, - 0x1f41, 0x1078, 0x1b81, 0x77b4, 0x1078, 0x2bb1, 0x77b4, 0xa7bc, - 0x0f00, 0x1078, 0x2cac, 0x6018, 0xa005, 0x0040, 0x1f6e, 0x2021, - 0x3f80, 0x2009, 0x0004, 0x2011, 0x0010, 0x1078, 0x1fc8, 0x0040, - 0x1f6e, 0x157e, 0x20a9, 0x0000, 0x2021, 0x3e80, 0x047e, 0x2009, - 0x0004, 0x2011, 0x0010, 0x1078, 0x1fc8, 0x047f, 0x0040, 0x1f6d, - 0x8420, 0x0070, 0x1f6d, 0x0078, 0x1f5e, 0x157f, 0x8738, 0xa784, - 0x0007, 0x00c0, 0x1f49, 0x0078, 0x1bdb, 0x0078, 0x1bdb, 0x77b4, - 0x1078, 0x2cac, 0x6018, 0xa005, 0x0040, 0x1f9d, 0x2021, 0x3f80, - 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, 0x1fc8, 0x0040, 0x1f9d, - 0x157e, 0x20a9, 0x0000, 0x2021, 0x3e80, 0x047e, 0x2009, 0x0005, - 0x2011, 0x0020, 0x1078, 0x1fc8, 0x047f, 0x0040, 0x1f9c, 0x8420, - 0x0070, 0x1f9c, 0x0078, 0x1f8d, 0x157f, 0x0078, 0x1bdb, 0x2200, - 0x0079, 0x1fa2, 0x1fa5, 0x1fa7, 0x1fa7, 0x1078, 0x1b81, 0x70a3, - 0x0000, 0x70a7, 0x0001, 0x0078, 0x1bd3, 0x2200, 0x0079, 0x1fb0, - 0x1fb5, 0x1fa7, 0x1fb3, 0x1078, 0x1b81, 0x1078, 0x2428, 0x7000, - 0xa086, 0x0001, 0x00c0, 0x28ba, 0x1078, 0x28fa, 0x6008, 0xa084, - 0xffef, 0x600a, 0x1078, 0x28ad, 0x0040, 0x28ba, 0x0078, 0x1cd1, - 0x2404, 0xa005, 0x0040, 0x1fe9, 0x2068, 0x2d04, 0x007e, 0x6810, - 0xa706, 0x0040, 0x1fd7, 0x2d20, 0x007f, 0x0078, 0x1fc9, 0x007f, - 0x2022, 0x6916, 0x681c, 0xa205, 0x681e, 0x1078, 0x17e7, 0x6010, - 0x8001, 0x6012, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x28fa, - 0x007c, 0xa085, 0x0001, 0x0078, 0x1fe8, 0x2300, 0x0079, 0x1ff0, - 0x1ff5, 0x1ff3, 0x2038, 0x1078, 0x1b81, 0x78e4, 0xa005, 0x00d0, - 0x2018, 0x0018, 0x2018, 0x2008, 0xa084, 0x0030, 0x00c0, 0x2004, - 0x781b, 0x0049, 0x0078, 0x1bd3, 0x78ec, 0xa084, 0x0003, 0x0040, - 0x2000, 0x2100, 0xa084, 0x0007, 0x0079, 0x200e, 0x2026, 0x202c, - 0x2020, 0x2016, 0x2d63, 0x2d63, 0x2016, 0x2032, 0x1078, 0x1b81, - 0x7000, 0xa005, 0x0040, 0x1bdb, 0x2001, 0x0003, 0x0078, 0x22fd, - 0x1078, 0x2b94, 0x781b, 0x0055, 0x0078, 0x1bd3, 0x1078, 0x2b94, - 0x781b, 0x00dc, 0x0078, 0x1bd3, 0x1078, 0x2b94, 0x781b, 0x00e3, - 0x0078, 0x1bd3, 0x1078, 0x2b94, 0x781b, 0x009d, 0x0078, 0x1bd3, - 0xa584, 0x000f, 0x00c0, 0x2062, 0x1078, 0x2428, 0x7000, 0x0079, - 0x2041, 0x2049, 0x2056, 0x2049, 0x28ba, 0x204b, 0x28ba, 0x2049, - 0x2049, 0x1078, 0x1b81, 0x71a0, 0x70a3, 0x0000, 0xa186, 0x0004, - 0x00c0, 0x2054, 0x0078, 0x2913, 0x0078, 0x28ba, 0x1078, 0x28fa, - 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x28ad, 0x0040, 0x28ba, - 0x0078, 0x1cd1, 0x78e4, 0xa005, 0x00d0, 0x2018, 0x0018, 0x2018, - 0x2008, 0xa084, 0x0030, 0x00c0, 0x2071, 0x781b, 0x0049, 0x0078, - 0x1bd3, 0x78ec, 0xa084, 0x0003, 0x0040, 0x206d, 0x2100, 0xa184, - 0x0007, 0x0079, 0x207b, 0x208b, 0x2091, 0x2085, 0x2083, 0x2d63, - 0x2d63, 0x2083, 0x2d5b, 0x1078, 0x1b81, 0x1078, 0x2b9c, 0x781b, - 0x0055, 0x0078, 0x1bd3, 0x1078, 0x2b9c, 0x781b, 0x00dc, 0x0078, - 0x1bd3, 0x1078, 0x2b9c, 0x781b, 0x00e3, 0x0078, 0x1bd3, 0x1078, - 0x2b9c, 0x781b, 0x009d, 0x0078, 0x1bd3, 0x2300, 0x0079, 0x20a0, - 0x20a5, 0x20a3, 0x20a7, 0x1078, 0x1b81, 0x0078, 0x2670, 0x6817, - 0x0008, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x2670, - 0x78ec, 0xa084, 0x0003, 0x0040, 0x2670, 0xa184, 0x0007, 0x0079, - 0x20b9, 0x2026, 0x202c, 0x2020, 0x2d3b, 0x2d63, 0x2d63, 0x20c1, - 0x2d5b, 0x1078, 0x1b81, 0xa282, 0x0005, 0x0050, 0x20c9, 0x1078, - 0x1b81, 0x2300, 0x0079, 0x20cc, 0x20cf, 0x22d1, 0x22dd, 0x2200, - 0x0079, 0x20d2, 0x20d7, 0x20d9, 0x20ec, 0x20d7, 0x22b6, 0x1078, - 0x1b81, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020, - 0x0048, 0x2b75, 0xa08a, 0x0004, 0x00c8, 0x2b75, 0x0079, 0x20e8, - 0x2b75, 0x2b75, 0x2b75, 0x2b17, 0x789b, 0x0018, 0x79a8, 0xa184, - 0x0080, 0x0040, 0x2101, 0xa184, 0x0018, 0x0040, 0x20fd, 0x0078, - 0x2b75, 0x7000, 0xa005, 0x00c0, 0x20f7, 0x2011, 0x0003, 0x0078, - 0x275d, 0xa184, 0x00ff, 0xa08a, 0x0010, 0x00c8, 0x2b75, 0x0079, - 0x2109, 0x211b, 0x2119, 0x2131, 0x2133, 0x21c5, 0x2b75, 0x2b75, - 0x21c7, 0x2b75, 0x2b75, 0x22b2, 0x22b2, 0x2b75, 0x2b75, 0x2b75, - 0x22b4, 0x1078, 0x1b81, 0xa684, 0x1000, 0x0040, 0x2128, 0x2001, - 0x0300, 0x8000, 0x8000, 0x783a, 0x781b, 0x009a, 0x0078, 0x1bd3, - 0x6814, 0xa084, 0x8000, 0x0040, 0x212f, 0x6817, 0x0003, 0x0078, - 0x2d3b, 0x1078, 0x1b81, 0x691c, 0x691e, 0xa684, 0x1800, 0x00c0, - 0x214d, 0x681c, 0xa084, 0x0001, 0x00c0, 0x2155, 0x6814, 0xa086, - 0x0008, 0x00c0, 0x2145, 0x6817, 0x0000, 0xa684, 0x0400, 0x0040, - 0x21c1, 0x781b, 0x0058, 0x0078, 0x1bd3, 0xa684, 0x1000, 0x0040, - 0x2155, 0x781b, 0x0058, 0x0078, 0x1bd3, 0xa684, 0x0060, 0x0040, - 0x21bd, 0xa684, 0x0800, 0x0040, 0x21bd, 0xa684, 0x8000, 0x00c0, - 0x2163, 0x0078, 0x217d, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb2, 0x789b, - 0x0074, 0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x2170, 0x8000, - 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b94, 0x2100, 0xa302, - 0x68ae, 0x6b90, 0x2200, 0xa303, 0x68aa, 0xa684, 0x4000, 0x0040, - 0x2185, 0xa6b4, 0xbfff, 0x7e5a, 0x6eb2, 0x7000, 0xa086, 0x0003, - 0x00c0, 0x2192, 0x1078, 0x2f3d, 0x1078, 0x30e2, 0x781b, 0x0067, - 0x0078, 0x1bd3, 0xa006, 0x1078, 0x3197, 0x6aac, 0x69a8, 0x6c94, - 0x6b90, 0x2200, 0xa105, 0x0040, 0x21a1, 0x2200, 0xa422, 0x2100, - 0xa31b, 0x7cd2, 0x7bd6, 0x2300, 0xa405, 0x00c0, 0x21af, 0xa6b5, - 0x4000, 0x7e5a, 0x6eb2, 0x781b, 0x0067, 0x0078, 0x1bd3, 0x781b, - 0x0067, 0x2200, 0xa115, 0x00c0, 0x21b9, 0x1078, 0x30f3, 0x0078, - 0x1bd3, 0x1078, 0x3120, 0x0078, 0x1bd3, 0x781b, 0x006a, 0x0078, - 0x1bd3, 0x781b, 0x0058, 0x0078, 0x1bd3, 0x1078, 0x1b81, 0x0078, - 0x2224, 0x691c, 0xa184, 0x0100, 0x0040, 0x21df, 0xa18c, 0xfeff, - 0x691e, 0x0c7e, 0x7048, 0x2060, 0x6000, 0xa084, 0xefff, 0x6002, - 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x2213, 0xa184, - 0x0200, 0x0040, 0x2213, 0xa18c, 0xfdff, 0x691e, 0x0c7e, 0x7048, - 0x2060, 0x6000, 0xa084, 0xdfff, 0x6002, 0x6004, 0xa084, 0xffef, - 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2213, - 0x1078, 0x2ca8, 0x1078, 0x29f1, 0x88ff, 0x0040, 0x2213, 0x789b, - 0x0060, 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, - 0x0400, 0x00c0, 0x220f, 0x781b, 0x0055, 0x0078, 0x1bd3, 0x781b, - 0x0069, 0x0078, 0x1bd3, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x221c, - 0x781b, 0x0058, 0x0078, 0x1bd3, 0x781b, 0x006a, 0x0078, 0x1bd3, - 0x0078, 0x2b7b, 0x0078, 0x2b7b, 0x2019, 0x0000, 0x7990, 0xa18c, - 0x0007, 0x0040, 0x2222, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, - 0xa286, 0x0001, 0x00c0, 0x2247, 0x2300, 0x7ca8, 0xa400, 0x2018, - 0xa102, 0x0040, 0x223f, 0x0048, 0x223f, 0x0078, 0x2241, 0x0078, - 0x21c9, 0x24a8, 0x7aa8, 0x00f0, 0x2241, 0x0078, 0x222d, 0xa284, - 0x00f0, 0xa086, 0x0020, 0x00c0, 0x22a3, 0x8318, 0x8318, 0x2300, - 0xa102, 0x0040, 0x2257, 0x0048, 0x2257, 0x0078, 0x22a0, 0xa286, - 0x0023, 0x0040, 0x2222, 0x6818, 0xa084, 0xfff1, 0x681a, 0x7e58, - 0xa684, 0xfff1, 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, - 0x0010, 0x600a, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, - 0x0c7f, 0xa184, 0x0010, 0x0040, 0x227b, 0x1078, 0x2ca8, 0x1078, - 0x2ad7, 0x0078, 0x228a, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, - 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2213, 0x1078, 0x2ca8, - 0x1078, 0x29f1, 0x88ff, 0x0040, 0x2213, 0x789b, 0x0060, 0x2800, - 0x78aa, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x229c, - 0x781b, 0x0055, 0x0078, 0x1bd3, 0x781b, 0x0069, 0x0078, 0x1bd3, - 0x7aa8, 0x0078, 0x222d, 0x8318, 0x2300, 0xa102, 0x0040, 0x22ac, - 0x0048, 0x22ac, 0x0078, 0x222d, 0xa284, 0x0080, 0x00c0, 0x2b81, - 0x0078, 0x2b7b, 0x0078, 0x2b81, 0x0078, 0x2b75, 0x789b, 0x0018, - 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, 0x22c1, 0x1078, - 0x1b81, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, - 0x0004, 0x00c8, 0x2b75, 0x0079, 0x22cd, 0x2b75, 0x2944, 0x2b75, - 0x2a72, 0xa282, 0x0000, 0x00c0, 0x22d7, 0x1078, 0x1b81, 0x1078, - 0x2b94, 0x781b, 0x0069, 0x0078, 0x1bd3, 0xa282, 0x0003, 0x00c0, - 0x22e3, 0x1078, 0x1b81, 0x1078, 0x2ba4, 0x781b, 0x0069, 0x0078, - 0x1bd3, 0xa282, 0x0004, 0x0050, 0x22ef, 0x1078, 0x1b81, 0x2300, - 0x0079, 0x22f2, 0x22f5, 0x23d2, 0x2403, 0xa286, 0x0003, 0x0040, - 0x22fb, 0x1078, 0x1b81, 0x2001, 0x0000, 0x703a, 0x7000, 0xa084, - 0x0007, 0x0079, 0x2303, 0x230b, 0x230d, 0x230d, 0x2513, 0x253b, - 0x24dd, 0x230b, 0x230b, 0x1078, 0x1b81, 0xa684, 0x1000, 0x00c0, - 0x2315, 0x1078, 0x2eca, 0x0040, 0x23ac, 0x7868, 0xa08c, 0x00ff, - 0x0040, 0x235d, 0xa186, 0x0008, 0x00c0, 0x232c, 0x1078, 0x28fa, - 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x28ad, 0x0040, 0x235d, - 0x1078, 0x2eca, 0x0078, 0x2344, 0xa186, 0x0028, 0x00c0, 0x235d, - 0x1078, 0x2eca, 0x6008, 0xa084, 0xffef, 0x600a, 0x6018, 0xa005, - 0x0040, 0x2344, 0x8001, 0x601a, 0xa005, 0x0040, 0x2344, 0x8001, - 0xa005, 0x0040, 0x2344, 0x601e, 0x681c, 0xa084, 0x0001, 0x0040, - 0x1bdb, 0x681c, 0xa084, 0xfffe, 0x681e, 0x7054, 0x0c7e, 0x2060, - 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, 0x00c0, - 0x235a, 0x6002, 0x6006, 0x0078, 0x1bdb, 0x017e, 0x1078, 0x2428, - 0x017f, 0xa684, 0xdf00, 0x681a, 0x6827, 0x0000, 0x6f10, 0x81ff, - 0x0040, 0x23ac, 0xa186, 0x0002, 0x00c0, 0x23a4, 0xa684, 0x0800, - 0x00c0, 0x237a, 0xa684, 0x0060, 0x0040, 0x237a, 0x78d8, 0x7adc, - 0x682e, 0x6a2a, 0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, - 0xa290, 0x3600, 0xa290, 0x0000, 0x221c, 0xa384, 0x0100, 0x00c0, - 0x238b, 0x0078, 0x2391, 0x8210, 0x2204, 0xa085, 0x0018, 0x2012, - 0x8211, 0xa384, 0x0400, 0x0040, 0x239e, 0x689c, 0xa084, 0x0100, - 0x00c0, 0x239e, 0x1078, 0x249c, 0x0078, 0x1bdb, 0x6008, 0xa085, - 0x0002, 0x600a, 0x0078, 0x23ac, 0xa186, 0x0018, 0x0040, 0x23ac, - 0xa186, 0x0014, 0x0040, 0x1bdb, 0x6912, 0x6814, 0xa084, 0x8000, - 0x0040, 0x23b4, 0x7038, 0x6816, 0xa68c, 0xdf00, 0x691a, 0x1078, - 0x28eb, 0x1078, 0x28fa, 0x00c0, 0x23c1, 0x6008, 0xa084, 0xffef, - 0x600a, 0x681c, 0xa084, 0x0001, 0x00c0, 0x23ca, 0x1078, 0x28e4, - 0x0078, 0x23ce, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078, 0x17e7, - 0x0078, 0x1bdb, 0xa282, 0x0004, 0x0048, 0x23d8, 0x1078, 0x1b81, - 0x2200, 0x0079, 0x23db, 0x23df, 0x23e1, 0x23ee, 0x23e1, 0x1078, - 0x1b81, 0x7000, 0xa086, 0x0005, 0x0040, 0x23ea, 0x1078, 0x2b94, - 0x781b, 0x0069, 0x781b, 0x006a, 0x0078, 0x1bd3, 0x7890, 0x8007, - 0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, - 0x00ff, 0xa186, 0x0003, 0x0040, 0x23ff, 0x0078, 0x2b75, 0x781b, - 0x006a, 0x0078, 0x1bd3, 0x681c, 0xa085, 0x0004, 0x681e, 0x82ff, - 0x00c0, 0x240e, 0x1078, 0x2b94, 0x0078, 0x2415, 0x8211, 0x0040, - 0x2413, 0x1078, 0x1b81, 0x1078, 0x2ba4, 0x781b, 0x0069, 0x0078, - 0x1bd3, 0x1078, 0x2d82, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2425, - 0x0018, 0x2425, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, - 0xa684, 0x0060, 0x00c0, 0x2432, 0x682f, 0x0000, 0x682b, 0x0000, - 0x0078, 0x249b, 0xa684, 0x0800, 0x00c0, 0x2441, 0x68b0, 0xa084, - 0x4800, 0xa635, 0xa684, 0x0800, 0x00c0, 0x2441, 0x1078, 0x2eca, - 0x007c, 0xa684, 0x0020, 0x0040, 0x246d, 0x78d0, 0x8003, 0x00c8, - 0x244f, 0xa006, 0x1078, 0x3197, 0x78d4, 0x1078, 0x31fc, 0xa684, - 0x4000, 0x0040, 0x2459, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078, - 0x243e, 0x68b0, 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, - 0x2453, 0x7038, 0xa005, 0x00c0, 0x2467, 0x703b, 0x0007, 0x79d8, - 0x7adc, 0x692e, 0x6a2a, 0x0078, 0x243e, 0xa684, 0x4000, 0x0040, - 0x2477, 0x682f, 0x0000, 0x682b, 0x0000, 0x0078, 0x243e, 0x68b0, - 0xa084, 0x4800, 0xa635, 0xa684, 0x4000, 0x00c0, 0x2471, 0x7038, - 0xa005, 0x00c0, 0x2485, 0x703b, 0x0007, 0x79d8, 0x7adc, 0x78d0, - 0x80f3, 0x00c8, 0x248c, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, - 0x0000, 0x692e, 0x6a2a, 0x2100, 0xa205, 0x00c0, 0x2499, 0x0078, - 0x243e, 0x1078, 0x3197, 0x007c, 0xa384, 0x0200, 0x0040, 0x24a4, - 0x6008, 0xa085, 0x0002, 0x600a, 0x6817, 0x0006, 0x6a28, 0x692c, - 0x6a3a, 0x693e, 0x682b, 0x0300, 0x682f, 0x0000, 0x6833, 0x2000, - 0x6893, 0x0000, 0x6897, 0x0020, 0x7000, 0x0079, 0x24b7, 0x24bf, - 0x24c1, 0x24ca, 0x24bf, 0x24bf, 0x24bf, 0x24bf, 0x24bf, 0x1078, - 0x1b81, 0x681c, 0xa084, 0x0001, 0x00c0, 0x24ca, 0x1078, 0x28e4, - 0x0078, 0x24d0, 0x7054, 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, - 0x2021, 0x3557, 0x2404, 0xa005, 0x0040, 0x24d9, 0x2020, 0x0078, - 0x24d2, 0x2d22, 0x206b, 0x0000, 0x007c, 0x77b4, 0x1078, 0x2bb1, - 0xa7bc, 0x0f00, 0x1078, 0x2cac, 0x6018, 0xa005, 0x0040, 0x250c, - 0x0d7e, 0x2001, 0x3f90, 0x2068, 0x0d7f, 0x2021, 0x3f80, 0x2009, - 0x0004, 0x2011, 0x0010, 0x1078, 0x1fc8, 0x0040, 0x250c, 0x157e, - 0x20a9, 0x0000, 0x2021, 0x3e80, 0x047e, 0x2009, 0x0004, 0x2011, - 0x0010, 0x1078, 0x1fc8, 0x047f, 0x0040, 0x250b, 0x8420, 0x0070, - 0x250b, 0x0078, 0x24fc, 0x157f, 0x8738, 0xa784, 0x0007, 0x00c0, - 0x24e2, 0x0078, 0x1bdb, 0x1078, 0x28eb, 0x1078, 0x28fa, 0x6827, - 0x0000, 0x789b, 0x000e, 0x6f10, 0x6813, 0x0002, 0x1078, 0x31cd, - 0xa684, 0x0800, 0x0040, 0x2528, 0x6918, 0xa18d, 0x2000, 0x691a, - 0x6814, 0xa084, 0x8000, 0x0040, 0x252f, 0x6817, 0x0000, 0x2021, - 0x3557, 0x6800, 0x2022, 0x6a38, 0x693c, 0x6a2a, 0x692e, 0x1078, - 0x17e7, 0x0078, 0x1bdb, 0x1078, 0x2428, 0x6827, 0x0000, 0x789b, - 0x000e, 0x6f10, 0x1078, 0x2d87, 0xa08c, 0x00ff, 0x6912, 0x6814, - 0xa084, 0x8000, 0x0040, 0x254e, 0x7038, 0x6816, 0xa68c, 0xdf00, - 0x691a, 0x70a3, 0x0000, 0x0078, 0x1bdb, 0xa006, 0x1078, 0x2eca, - 0x6813, 0x0000, 0x6817, 0x0001, 0xa68c, 0xdf00, 0x691a, 0x6827, - 0x0000, 0x7000, 0x0079, 0x2564, 0x256c, 0x256e, 0x256e, 0x2570, - 0x2570, 0x2570, 0x256c, 0x256c, 0x1078, 0x1b81, 0x1078, 0x28fa, - 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x28c5, 0x2300, 0x0079, - 0x2579, 0x257c, 0x257e, 0x25bc, 0x1078, 0x1b81, 0x7000, 0x0079, - 0x2581, 0x2589, 0x258b, 0x258b, 0x2596, 0x258b, 0x259d, 0x2589, - 0x2589, 0x1078, 0x1b81, 0xa684, 0x2000, 0x00c0, 0x2596, 0xa6b5, - 0x2000, 0x7e5a, 0x1078, 0x30f3, 0x0078, 0x2d3b, 0x6814, 0xa084, - 0x8000, 0x0040, 0x259d, 0x6817, 0x0007, 0x2009, 0x3518, 0x210c, - 0xa186, 0x0000, 0x0040, 0x25b2, 0xa186, 0x0001, 0x0040, 0x25b6, - 0x2009, 0x352b, 0x200b, 0x000b, 0x70a3, 0x0001, 0x781b, 0x0046, - 0x0078, 0x1bd3, 0x781b, 0x00dd, 0x0078, 0x1bd3, 0x2009, 0x352b, - 0x200b, 0x000a, 0x0078, 0x1bd3, 0x1078, 0x1b81, 0x2300, 0x0079, - 0x25c1, 0x25c4, 0x25c6, 0x25e9, 0x1078, 0x1b81, 0x7000, 0x0079, - 0x25c9, 0x25d1, 0x25d3, 0x25d3, 0x25de, 0x25d3, 0x25e5, 0x25d1, - 0x25d1, 0x1078, 0x1b81, 0xa684, 0x2000, 0x00c0, 0x25de, 0xa6b5, - 0x2000, 0x7e5a, 0x1078, 0x30f3, 0x0078, 0x2d3b, 0x6814, 0xa084, - 0x8000, 0x0040, 0x25e5, 0x6817, 0x0007, 0x781b, 0x00e4, 0x0078, - 0x1bd3, 0x681c, 0xa085, 0x0004, 0x681e, 0xa6b5, 0x0800, 0x1078, - 0x2b94, 0x781b, 0x0069, 0x0078, 0x1bd3, 0x2300, 0x0079, 0x25f8, - 0x25fb, 0x25fd, 0x25ff, 0x1078, 0x1b81, 0x1078, 0x1b81, 0xa684, - 0x0400, 0x00c0, 0x261e, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, - 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xa184, 0x0020, 0x0040, - 0x2616, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x261a, 0x2001, 0x0014, - 0x0078, 0x22fd, 0xa184, 0x0007, 0x0079, 0x2656, 0x7a90, 0xa294, - 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0040, 0x2654, 0x789b, - 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, 0x2645, 0x7ba8, 0x7ba8, - 0xa386, 0x0001, 0x00c0, 0x2638, 0x2009, 0xfff7, 0x0078, 0x263e, - 0xa386, 0x0003, 0x00c0, 0x2645, 0x2009, 0xffef, 0x0c7e, 0x7048, - 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, - 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x691c, 0xa18c, - 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2d3b, 0x2026, 0x202c, - 0x2660, 0x2668, 0x265e, 0x265e, 0x265e, 0x2d3b, 0x1078, 0x1b81, - 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2d43, - 0x691c, 0xa18c, 0xfdff, 0xa18c, 0xfeff, 0x691e, 0x0078, 0x2d3b, - 0x79e4, 0xa184, 0x0030, 0x0040, 0x267a, 0x78ec, 0xa084, 0x0003, - 0x00c0, 0x2682, 0x6814, 0xa085, 0x8000, 0x6816, 0x2001, 0x0014, - 0x0078, 0x22fd, 0xa184, 0x0007, 0x0079, 0x2686, 0x2d3b, 0x2d3b, - 0x268e, 0x2d3b, 0x2d63, 0x2d63, 0x2d3b, 0x2d3b, 0xa684, 0x0400, - 0x00c0, 0x26bf, 0x681c, 0xa084, 0x0001, 0x0040, 0x2d43, 0xa68c, - 0x2060, 0xa18c, 0xfffb, 0x795a, 0x69b2, 0x789b, 0x0060, 0x78ab, - 0x0000, 0x789b, 0x0061, 0x6814, 0xa085, 0x8000, 0x6816, 0x78aa, - 0x157e, 0x137e, 0x147e, 0x20a1, 0x012c, 0x789b, 0x0000, 0x8000, - 0x80ac, 0xad80, 0x000a, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, - 0x6810, 0x8007, 0x789b, 0x007e, 0x78aa, 0x0078, 0x2d43, 0x6814, - 0xa084, 0x8000, 0x0040, 0x26c6, 0x6817, 0x0008, 0x781b, 0x00d8, - 0x0078, 0x1bd3, 0x2300, 0x0079, 0x26cd, 0x26d2, 0x274d, 0x26d0, - 0x1078, 0x1b81, 0x7000, 0xa084, 0x0007, 0x0079, 0x26d7, 0x26df, - 0x26e1, 0x26fd, 0x26df, 0x26df, 0x24dd, 0x26df, 0x26df, 0x1078, - 0x1b81, 0x691c, 0xa18d, 0x0001, 0x691e, 0x6800, 0x6006, 0xa005, - 0x00c0, 0x26eb, 0x6002, 0x6818, 0xa084, 0x000e, 0x0040, 0x26f7, - 0x7014, 0x68b6, 0x712c, 0xa188, 0x3e80, 0x0078, 0x26f9, 0x2009, - 0x3f80, 0x2104, 0x6802, 0x2d0a, 0x7156, 0x6eb2, 0xa684, 0x0060, - 0x0040, 0x274b, 0xa684, 0x0800, 0x00c0, 0x270f, 0xa684, 0x7fff, - 0x68b2, 0x6890, 0x6894, 0x1078, 0x2eca, 0x0078, 0x274b, 0xa684, - 0x0020, 0x0040, 0x2721, 0xa006, 0x1078, 0x3197, 0x78d0, 0x8003, - 0x00c8, 0x271d, 0x78d4, 0x1078, 0x31fc, 0x79d8, 0x7adc, 0x0078, - 0x2725, 0x1078, 0x2cb9, 0x1078, 0x3197, 0xa684, 0x8000, 0x0040, - 0x274b, 0xa684, 0x7fff, 0x68b2, 0x789b, 0x0074, 0x1078, 0x2d87, - 0x2010, 0x1078, 0x2d87, 0x2008, 0xa684, 0x0020, 0x00c0, 0x2743, - 0x1078, 0x2d87, 0x801b, 0x00c8, 0x273e, 0x8000, 0xa084, 0x003f, - 0xa108, 0xa291, 0x0000, 0x6b94, 0x2100, 0xa302, 0x68ae, 0x6b90, - 0x2200, 0xa303, 0x68aa, 0x0078, 0x1bdb, 0x0078, 0x2b81, 0x7033, - 0x0000, 0xa282, 0x0005, 0x0050, 0x2757, 0x1078, 0x1b81, 0x2300, - 0x0079, 0x275a, 0x275d, 0x2767, 0x278a, 0x2200, 0x0079, 0x2760, - 0x2765, 0x2b81, 0x2765, 0x27b3, 0x2804, 0x1078, 0x1b81, 0x7000, - 0xa086, 0x0001, 0x00c0, 0x2774, 0x1078, 0x28fa, 0x1078, 0x2eca, - 0x7034, 0x600a, 0x0078, 0x2779, 0x7000, 0xa086, 0x0003, 0x0040, - 0x276e, 0x7003, 0x0005, 0x2001, 0x3f90, 0x2068, 0x703e, 0x7032, - 0x2200, 0x0079, 0x2783, 0x2b81, 0x2788, 0x27b3, 0x2788, 0x2b81, - 0x1078, 0x1b81, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2797, 0x1078, - 0x28fa, 0x1078, 0x2eca, 0x7034, 0x600a, 0x0078, 0x279c, 0x7000, - 0xa086, 0x0003, 0x0040, 0x2791, 0x7003, 0x0005, 0x2001, 0x3f90, - 0x2068, 0x703e, 0x7032, 0x2200, 0x0079, 0x27a6, 0x27ad, 0x27ab, - 0x27ad, 0x27ab, 0x27ad, 0x1078, 0x1b81, 0x1078, 0x2ba4, 0x781b, - 0x0069, 0x0078, 0x1bd3, 0x7000, 0xa086, 0x0001, 0x00c0, 0x27c0, - 0x1078, 0x28fa, 0x1078, 0x2eca, 0x7034, 0x600a, 0x0078, 0x27c5, - 0x7000, 0xa086, 0x0003, 0x0040, 0x27ba, 0x7003, 0x0002, 0x7a80, - 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, - 0x2069, 0x3f80, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040, - 0x27e0, 0x6810, 0xa206, 0x0040, 0x27f9, 0x6800, 0x0078, 0x27d3, - 0x7003, 0x0005, 0x2001, 0x3f90, 0x2068, 0x703e, 0x7032, 0x157e, - 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x27f1, 0x0078, - 0x27ea, 0x157f, 0x6a12, 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823, - 0x0003, 0x6eb0, 0x7e5a, 0x681c, 0xa084, 0x0c00, 0x0040, 0x285a, - 0x1078, 0x2b9c, 0x0078, 0x285a, 0x7000, 0xa086, 0x0001, 0x00c0, - 0x2811, 0x1078, 0x28fa, 0x1078, 0x2eca, 0x7034, 0x600a, 0x0078, - 0x2816, 0x7000, 0xa086, 0x0003, 0x0040, 0x280b, 0x7003, 0x0002, - 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x0007, - 0xa215, 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0xa1e8, 0x3e80, 0x2d04, - 0x2d08, 0x7156, 0x2068, 0xa005, 0x0040, 0x2835, 0x6810, 0xa206, - 0x0040, 0x284e, 0x6800, 0x0078, 0x2828, 0x7003, 0x0005, 0x2001, - 0x3f90, 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, - 0x0000, 0x8000, 0x0070, 0x2846, 0x0078, 0x283f, 0x157f, 0x6a12, - 0x68b3, 0x0700, 0x681f, 0x0800, 0x6823, 0x0003, 0x6eb0, 0x7e5a, - 0x681c, 0xa084, 0x0c00, 0x0040, 0x285a, 0x1078, 0x2b98, 0x7e58, - 0x0078, 0x285a, 0x027e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, - 0x8003, 0xa080, 0x3600, 0x2060, 0x704a, 0x6000, 0x704e, 0x6004, - 0x7052, 0xa684, 0x0060, 0x0040, 0x2891, 0x6b94, 0x6c90, 0x69a8, - 0x68ac, 0xa105, 0x00c0, 0x287f, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, - 0xa6b4, 0xb7ff, 0x7e5a, 0x1078, 0x30f3, 0x0078, 0x2891, 0x68ac, - 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x2891, 0x7bd2, - 0x7bda, 0x7cd6, 0x7cde, 0x68ac, 0xa6b4, 0xbfff, 0x7e5a, 0x1078, - 0x3120, 0x077f, 0x1078, 0x2cac, 0x2009, 0x006a, 0xa684, 0x0008, - 0x0040, 0x289c, 0x2009, 0x0069, 0xa6b5, 0x2000, 0x7e5a, 0x791a, - 0x2d00, 0x703e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, - 0xa080, 0x3600, 0x2048, 0x0078, 0x1bd3, 0x6020, 0xa005, 0x0040, - 0x28b9, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, 0x7010, - 0x6026, 0x007c, 0xa006, 0x1078, 0x2eca, 0x6813, 0x0000, 0x6817, - 0x0001, 0x681f, 0x0040, 0x681b, 0x0100, 0x7000, 0xa084, 0x0007, - 0x0079, 0x28ca, 0x28d2, 0x28d4, 0x28d4, 0x28e0, 0x28dc, 0x28d2, - 0x28d2, 0x28d2, 0x1078, 0x1b81, 0x1078, 0x28eb, 0x1078, 0x28e4, - 0x1078, 0x17e7, 0x0078, 0x1bdb, 0x70a3, 0x0000, 0x0078, 0x1bdb, - 0x6817, 0x0000, 0x0078, 0x2513, 0x6800, 0xa005, 0x00c0, 0x28e9, - 0x6002, 0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x28f4, 0x8001, - 0x00d0, 0x28f4, 0x1078, 0x1b81, 0x6012, 0x6008, 0xa084, 0xffef, - 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x2900, 0x8001, 0x601a, - 0x007c, 0x1078, 0x2d82, 0x6817, 0x0018, 0x0078, 0x2931, 0x1078, - 0x2d82, 0x6817, 0x0019, 0x0078, 0x2931, 0x1078, 0x2d82, 0x6817, - 0x001a, 0x0078, 0x2931, 0x77b4, 0x1078, 0x2cac, 0x71b8, 0xa18c, - 0x00ff, 0xa1e8, 0x3e80, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, - 0x2923, 0x0078, 0x1bdb, 0x6810, 0x72b4, 0xa206, 0x0040, 0x292b, - 0x6800, 0x0078, 0x291c, 0x6800, 0x200a, 0x6817, 0x0005, 0x70bf, - 0x0000, 0x1078, 0x28eb, 0x681c, 0xa084, 0x0001, 0x00c0, 0x293a, - 0x1078, 0x28e4, 0x1078, 0x28fa, 0x681b, 0x0000, 0x681f, 0x0020, - 0x1078, 0x17e7, 0x0078, 0x1bdb, 0xa282, 0x0003, 0x00c0, 0x2b75, - 0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x691c, 0xa18d, - 0x0080, 0x691e, 0xa184, 0x0100, 0x0040, 0x29a4, 0xa18c, 0xfeff, - 0x691e, 0xa6b4, 0x00ff, 0x0040, 0x298e, 0xa682, 0x000f, 0x0048, - 0x2965, 0x0040, 0x2965, 0x2031, 0x000f, 0x852b, 0x852b, 0x1078, - 0x2c2f, 0x0040, 0x296f, 0x1078, 0x2a3e, 0x0078, 0x2997, 0x1078, - 0x2bea, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, - 0x2a62, 0x0c7f, 0x691c, 0xa18d, 0x0100, 0x691e, 0x7e58, 0xa6b5, - 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x298a, 0x781b, 0x0055, - 0x0078, 0x1bd3, 0x781b, 0x0069, 0x0078, 0x1bd3, 0x0c7e, 0x2960, - 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x2a62, 0x0c7f, 0x7e58, - 0xa684, 0x0400, 0x00c0, 0x29a0, 0x781b, 0x0058, 0x0078, 0x1bd3, - 0x781b, 0x006a, 0x0078, 0x1bd3, 0x0c7e, 0x7048, 0x2060, 0x6100, - 0xa18c, 0x1000, 0x0040, 0x29e4, 0x6208, 0x8217, 0xa294, 0x00ff, - 0xa282, 0x000f, 0x0048, 0x29b8, 0x0040, 0x29b8, 0x2011, 0x000f, - 0x2600, 0xa202, 0x00c8, 0x29bd, 0x2230, 0x6208, 0xa294, 0x00ff, - 0x7018, 0xa086, 0x0028, 0x00c0, 0x29cd, 0xa282, 0x0019, 0x00c8, - 0x29d3, 0x2011, 0x0019, 0x0078, 0x29d3, 0xa282, 0x000c, 0x00c8, - 0x29d3, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x29d8, 0x2228, - 0x1078, 0x2bee, 0x852b, 0x852b, 0x1078, 0x2c2f, 0x0040, 0x29e4, - 0x1078, 0x2a3e, 0x0078, 0x29e8, 0x1078, 0x2bea, 0x1078, 0x2a62, - 0x7858, 0xa085, 0x0004, 0x785a, 0x0c7f, 0x781b, 0x0069, 0x0078, - 0x1bd3, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, 0x00c0, 0x2a0c, - 0x6010, 0xa084, 0x000f, 0x00c0, 0x2a06, 0xa18c, 0x0002, 0x00c0, - 0x2a06, 0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, - 0x2019, 0x0000, 0x0078, 0x2a2e, 0x6208, 0xa294, 0x00ff, 0x7018, - 0xa086, 0x0028, 0x00c0, 0x2a1c, 0xa282, 0x0019, 0x00c8, 0x2a22, - 0x2011, 0x0019, 0x0078, 0x2a22, 0xa282, 0x000c, 0x00c8, 0x2a22, - 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000f, - 0x0048, 0x2a2e, 0x0040, 0x2a2e, 0x2019, 0x000f, 0x78ab, 0x0001, - 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, - 0x681c, 0xa085, 0x0100, 0x681e, 0x0c7f, 0x007c, 0x0c7e, 0x7148, - 0x2160, 0x2008, 0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, - 0x7eae, 0x6612, 0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, - 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, - 0xa084, 0x00ff, 0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, - 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x6018, 0x789a, 0x78a4, - 0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, - 0x0c7f, 0x007c, 0xa282, 0x0002, 0x00c0, 0x2b75, 0x7aa8, 0x691c, - 0xa18d, 0x0080, 0x691e, 0xa184, 0x0200, 0x0040, 0x2ab7, 0xa18c, - 0xfdff, 0x691e, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x2b75, - 0x1078, 0x2afe, 0x1078, 0x2a62, 0xa980, 0x0001, 0x200c, 0x1078, - 0x2ca8, 0x1078, 0x29f1, 0x88ff, 0x0040, 0x2aaa, 0x789b, 0x0060, - 0x2800, 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, - 0x00c0, 0x2aa6, 0x781b, 0x0055, 0x0078, 0x1bd3, 0x781b, 0x0069, - 0x0078, 0x1bd3, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2ab3, 0x781b, - 0x0058, 0x0078, 0x1bd3, 0x781b, 0x006a, 0x0078, 0x1bd3, 0xa282, - 0x0002, 0x00c8, 0x2abf, 0xa284, 0x0001, 0x0040, 0x2ac9, 0x7148, - 0xa188, 0x0000, 0x210c, 0xa18c, 0x2000, 0x00c0, 0x2ac9, 0x2011, - 0x0000, 0x1078, 0x2bdc, 0x1078, 0x2afe, 0x1078, 0x2a62, 0x7858, - 0xa085, 0x0004, 0x785a, 0x781b, 0x0069, 0x0078, 0x1bd3, 0x0c7e, - 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, - 0x2aee, 0x6014, 0xa084, 0x0040, 0x00c0, 0x2aec, 0xa18c, 0xffef, - 0x6106, 0xa006, 0x0078, 0x2afb, 0x2011, 0x0000, 0x78ab, 0x0001, - 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x681c, - 0xa085, 0x0200, 0x681e, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7048, - 0x2060, 0x82ff, 0x0040, 0x2b06, 0x2011, 0x0040, 0x6018, 0xa080, - 0x0002, 0x789a, 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6, 0x6016, - 0x788a, 0x6004, 0xa084, 0xffef, 0x6006, 0x0c7f, 0x007c, 0x007e, - 0x7000, 0xa086, 0x0003, 0x0040, 0x2b20, 0x007f, 0x0078, 0x2b23, - 0x007f, 0x0078, 0x2b71, 0xa684, 0x0020, 0x0040, 0x2b71, 0x7888, - 0xa084, 0x0040, 0x0040, 0x2b71, 0x78a8, 0x8001, 0x0040, 0x2b30, - 0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, 0x2b37, 0x8000, 0xa005, - 0x0040, 0x2b58, 0x831b, 0x00c8, 0x2b40, 0x8001, 0x0040, 0x2b6d, - 0xa006, 0x1078, 0x3197, 0x78b4, 0x1078, 0x31fc, 0x0078, 0x2b71, - 0xa684, 0x4000, 0x0040, 0x2b58, 0x78b8, 0x801b, 0x00c8, 0x2b51, - 0x8000, 0xa084, 0x003f, 0x00c0, 0x2b6d, 0xa6b4, 0xbfff, 0x7e5a, - 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x2b61, 0xa291, - 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x3197, 0x781b, - 0x0067, 0x1078, 0x3061, 0x0078, 0x1bd3, 0x781b, 0x0067, 0x0078, - 0x1bd3, 0x781b, 0x006a, 0x0078, 0x1bd3, 0x1078, 0x2ba8, 0x781b, - 0x0069, 0x0078, 0x1bd3, 0x1078, 0x2b94, 0x781b, 0x0069, 0x0078, - 0x1bd3, 0x6823, 0x0002, 0x1078, 0x2b9c, 0x691c, 0xa18d, 0x0020, - 0x691e, 0x6814, 0xa084, 0x8000, 0x0040, 0x2b90, 0x6817, 0x0005, - 0x781b, 0x0069, 0x0078, 0x1bd3, 0x2001, 0x0005, 0x0078, 0x2baa, - 0x2001, 0x000c, 0x0078, 0x2baa, 0x2001, 0x0006, 0x0078, 0x2baa, - 0x2001, 0x000d, 0x0078, 0x2baa, 0x2001, 0x0009, 0x0078, 0x2baa, - 0x2001, 0x0007, 0x789b, 0x007f, 0x78aa, 0xa6b5, 0x0008, 0x7e5a, - 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, - 0xa0e0, 0x3600, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x000f, - 0x0040, 0x2bca, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, 0xa085, - 0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, - 0x0040, 0x2bda, 0xa184, 0xffbf, 0x78a6, 0x6016, 0x6004, 0xa085, - 0x0010, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, - 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, - 0x0004, 0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, 0x0010, - 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, - 0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, 0x157e, 0x8007, 0xa084, - 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, - 0xfff0, 0x2001, 0x3546, 0x2004, 0xa082, 0x0028, 0x0040, 0x2c18, - 0x2021, 0x2c8f, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x2c1e, - 0x2021, 0x2c9b, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, - 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, 0x2c2d, 0x8420, 0x2300, - 0xa210, 0x0070, 0x2c2d, 0x0078, 0x2c20, 0x157f, 0x007c, 0x157e, - 0x2011, 0x3546, 0x2214, 0xa282, 0x0032, 0x0048, 0x2c43, 0x0040, - 0x2c47, 0x2021, 0x2c81, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, - 0x0032, 0x0078, 0x2c57, 0xa282, 0x0028, 0x0040, 0x2c4f, 0x2021, - 0x2c8f, 0x2019, 0x0014, 0x20a9, 0x000c, 0x0078, 0x2c55, 0x2021, - 0x2c9b, 0x2019, 0x0019, 0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, - 0xa502, 0x0040, 0x2c67, 0x0048, 0x2c67, 0x8420, 0x2300, 0xa210, - 0x0070, 0x2c64, 0x0078, 0x2c57, 0x157f, 0xa006, 0x007c, 0x157f, - 0xa582, 0x0064, 0x00c8, 0x2c70, 0x7808, 0xa085, 0x0070, 0x780a, - 0x78ec, 0xa084, 0x0300, 0x0040, 0x2c7e, 0x2404, 0xa09e, 0x1201, - 0x00c0, 0x2c7e, 0x2001, 0x2101, 0x0078, 0x2c7f, 0x2404, 0xa005, - 0x007c, 0x1201, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, 0x5604, - 0x6605, 0x6805, 0x7806, 0x7a06, 0x0a07, 0x0c07, 0x0e07, 0x3202, - 0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805, 0x7a05, - 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202, 0x5404, - 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04, 0x7f04, - 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800c, 0xa784, - 0x0007, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0, 0x3680, - 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x2cc0, 0x8000, - 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e, 0x2079, - 0x0100, 0x2009, 0x3540, 0x2091, 0x8000, 0x2104, 0x0079, 0x2cd0, - 0x2d02, 0x2cda, 0x2cda, 0x2cda, 0x2cda, 0x2cda, 0x2cd8, 0x2cd8, - 0x1078, 0x1b81, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x00c0, - 0x2cdc, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0, 0x2ce3, - 0x68b0, 0xa085, 0x4000, 0x68b2, 0x7858, 0xa085, 0x4000, 0x785a, - 0x7830, 0xa084, 0x0080, 0x00c0, 0x2d02, 0x0018, 0x2d02, 0x6818, - 0xa084, 0x0020, 0x00c0, 0x2d00, 0x781b, 0x00dd, 0x0078, 0x2d02, - 0x781b, 0x00e4, 0x2091, 0x8001, 0x0f7f, 0x007c, 0x0c7e, 0x6810, - 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e0, 0x3600, - 0x6004, 0xa084, 0x000a, 0x00c0, 0x2d39, 0x6108, 0xa194, 0xff00, - 0x0040, 0x2d39, 0xa18c, 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, - 0x2d28, 0x2001, 0x0032, 0xa106, 0x0040, 0x2d2c, 0x0078, 0x2d30, - 0x2009, 0x0020, 0x0078, 0x2d32, 0x2009, 0x003f, 0x0078, 0x2d32, - 0x2011, 0x0000, 0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, - 0x6006, 0x0c7f, 0x007c, 0x781b, 0x006a, 0x0078, 0x1bd3, 0x781b, - 0x0069, 0x0078, 0x1bd3, 0x781b, 0x0058, 0x0078, 0x1bd3, 0x781b, - 0x0055, 0x0078, 0x1bd3, 0x781b, 0x00dd, 0x0078, 0x1bd3, 0x781b, - 0x00dc, 0x0078, 0x1bd3, 0x781b, 0x00e4, 0x0078, 0x1bd3, 0x781b, - 0x00e3, 0x0078, 0x1bd3, 0x781b, 0x009e, 0x0078, 0x1bd3, 0x781b, - 0x009d, 0x0078, 0x1bd3, 0x70a3, 0x0001, 0x781b, 0x0046, 0x0078, - 0x1bd3, 0x007e, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2d80, 0x7808, - 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, - 0xa084, 0x0021, 0x0040, 0x2d80, 0x7808, 0xa085, 0x0002, 0x780a, - 0x007f, 0x007c, 0x7808, 0xa085, 0x0002, 0x780a, 0x007c, 0x7830, - 0xa084, 0x0040, 0x00c0, 0x2d87, 0x0098, 0x2d90, 0x78ac, 0x007c, - 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, - 0x78ec, 0xa084, 0x0021, 0x0040, 0x2d9f, 0x0098, 0x2d9d, 0x78ac, - 0x007e, 0x7808, 0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, - 0x0070, 0x0040, 0x2dab, 0x6817, 0x0003, 0x7858, 0xa084, 0x3f00, - 0x681a, 0x682f, 0x0000, 0x682b, 0x0000, 0x784b, 0x0008, 0x78e4, - 0xa005, 0x00d0, 0x2018, 0xa084, 0x0020, 0x0040, 0x2018, 0x78ec, - 0xa084, 0x0003, 0x0040, 0x2018, 0x0018, 0x2018, 0x0078, 0x2b7b, - 0x0c7e, 0x6810, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, - 0xa080, 0x3600, 0x2060, 0x2048, 0x704a, 0x6000, 0x704e, 0x6004, - 0x7052, 0x0c7f, 0x007c, 0x0020, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0062, 0x0009, 0x0014, - 0x0014, 0x9847, 0x0014, 0x0014, 0x98f5, 0x98e7, 0x0014, 0x0014, - 0x0080, 0x00bf, 0x0100, 0x0402, 0x2008, 0xf880, 0xa20a, 0x0014, - 0x300b, 0xa20c, 0x0014, 0xa200, 0x8838, 0x817e, 0x842a, 0x84a0, - 0x3806, 0x8839, 0x28c2, 0x9cc3, 0xa805, 0x0864, 0xa83b, 0x3008, - 0x28c1, 0x9cc3, 0xa201, 0x300c, 0x2847, 0x8161, 0x846a, 0x8000, - 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2, 0x9ca0, 0xa8f3, 0x0864, - 0xa829, 0x300c, 0xa801, 0x3008, 0x28e1, 0x9ca0, 0x280d, 0xa204, - 0x64c0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677, - 0xa80f, 0x786e, 0x883e, 0xa80c, 0x282b, 0xa205, 0x64a0, 0x67a0, - 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677, 0xa801, 0x883e, - 0x2069, 0x28c1, 0x9cc3, 0x2044, 0x2103, 0x20a2, 0x2081, 0xa8dc, - 0xa207, 0x0014, 0xa203, 0x8000, 0x84a8, 0x85a4, 0x1872, 0x849a, - 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e, 0x866f, 0x0704, 0x3008, - 0x9ca0, 0x0014, 0xa202, 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, - 0xf848, 0x8174, 0x86eb, 0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6, - 0xa8f1, 0xf861, 0xa8e8, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, - 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, - 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014, 0xa206, 0x6865, 0x817f, - 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, - 0x84a4, 0x8160, 0x842a, 0xf021, 0x3008, 0x84a8, 0x1dc6, 0x20d7, - 0x8822, 0x0016, 0x8000, 0x2848, 0x1011, 0xa8fc, 0x3008, 0x8000, - 0xa000, 0x2802, 0x1011, 0xa8fd, 0xa887, 0x3008, 0x283d, 0x1011, - 0xa8fd, 0xa209, 0x0017, 0x300c, 0x8000, 0x85a4, 0x1de2, 0xdac1, - 0x0014, 0x26e0, 0x873a, 0xfaa2, 0x19f2, 0x1fe2, 0x0014, 0xa20b, - 0x0014, 0xa20d, 0x817e, 0x842a, 0x84a0, 0x3806, 0x0210, 0x9ccd, - 0x0704, 0x0000, 0x127e, 0x2091, 0x2200, 0x2049, 0x2eca, 0x7000, - 0x7204, 0xa205, 0x720c, 0xa215, 0x7008, 0xa084, 0xfffd, 0xa205, - 0x0040, 0x2edc, 0x0078, 0x2ee1, 0x7003, 0x0000, 0x127f, 0x2000, - 0x007c, 0x7000, 0xa084, 0x0001, 0x00c0, 0x2f0f, 0x7108, 0x8104, - 0x00c8, 0x2eee, 0x1078, 0x2fab, 0x0078, 0x2ee6, 0x700c, 0xa08c, - 0x007f, 0x0040, 0x2f0f, 0x7004, 0x8004, 0x00c8, 0x2f06, 0x7014, - 0xa005, 0x00c0, 0x2f02, 0x7010, 0xa005, 0x0040, 0x2f06, 0xa102, - 0x00c8, 0x2ee6, 0x7007, 0x0010, 0x0078, 0x2f0f, 0x8aff, 0x0040, - 0x2f0f, 0x1078, 0x316e, 0x00c0, 0x2f09, 0x0040, 0x2ee6, 0x1078, - 0x2f59, 0x7003, 0x0000, 0x127f, 0x2000, 0x007c, 0x6424, 0x84ff, - 0x0040, 0x2f33, 0x2c70, 0x2039, 0x2f38, 0x2704, 0xae68, 0x680c, - 0xa630, 0x6808, 0xa529, 0x8421, 0x0040, 0x2f33, 0x8738, 0x2704, - 0xa005, 0x00c0, 0x2f1e, 0x7098, 0xa075, 0x0040, 0x2f33, 0x2039, - 0x2f35, 0x0078, 0x2f1d, 0x007c, 0x0000, 0x0004, 0x0008, 0x000c, - 0x0010, 0x0014, 0x0018, 0x001c, 0x0000, 0x127e, 0x2091, 0x2200, - 0x2079, 0x3500, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, - 0x7003, 0x0000, 0x2071, 0x0020, 0x7007, 0x000a, 0x7007, 0x0002, - 0x7003, 0x0000, 0x2049, 0x0000, 0x78b3, 0x0000, 0x127f, 0x2000, - 0x007c, 0x2049, 0x2f59, 0x7004, 0x8004, 0x00c8, 0x2f85, 0x7007, - 0x0012, 0x7108, 0x7008, 0xa106, 0x00c0, 0x2f61, 0xa184, 0x0030, - 0x0040, 0x2f6e, 0xa086, 0x0030, 0x00c0, 0x2f61, 0x7000, 0xa084, - 0x0001, 0x00c0, 0x2f85, 0x7008, 0xa084, 0x000c, 0x00c0, 0x2f83, - 0x710c, 0xa184, 0x0300, 0x00c0, 0x2f83, 0xa184, 0x007f, 0x00c0, - 0x2f59, 0x0078, 0x2f85, 0x6817, 0x0003, 0x7007, 0x0012, 0x7007, - 0x0008, 0x7004, 0xa084, 0x0008, 0x00c0, 0x2f89, 0x7007, 0x0012, - 0x7108, 0x8104, 0x0048, 0x2f8e, 0x78b3, 0x0000, 0x7003, 0x0000, - 0x2049, 0x0000, 0x007c, 0x107e, 0x007e, 0x127e, 0x157e, 0x2091, - 0x2200, 0x7108, 0x1078, 0x2fab, 0x157f, 0x127f, 0x2091, 0x8001, - 0x007f, 0x107f, 0x007c, 0x7204, 0x2118, 0x7108, 0x700c, 0xa084, - 0x0300, 0x00c0, 0x2fed, 0xa184, 0x000c, 0x00c0, 0x2fed, 0x8213, - 0x8213, 0x8213, 0x8213, 0xa284, 0x0100, 0xa10d, 0x810b, 0x810b, - 0x810f, 0xa184, 0x0007, 0x0079, 0x2fc5, 0x2fcf, 0x2fdf, 0x2fed, - 0x2fdf, 0x3001, 0x3001, 0x2fed, 0x2fff, 0x1078, 0x1b81, 0x7007, - 0x0002, 0x8aff, 0x00c0, 0x2fd8, 0x2049, 0x0000, 0x0078, 0x2fdc, - 0x1078, 0x316e, 0x00c0, 0x2fd8, 0x78b3, 0x0000, 0x007c, 0x7007, - 0x0002, 0x8aff, 0x00c0, 0x2fe6, 0x0078, 0x2fea, 0x1078, 0x316e, - 0x00c0, 0x2fe6, 0x78b3, 0x0000, 0x007c, 0x7007, 0x0002, 0x1078, - 0x2f59, 0x1078, 0x2cc6, 0x6814, 0xa084, 0x8000, 0x0040, 0x2ffa, - 0x6817, 0x0002, 0x007c, 0x1078, 0x1b81, 0x1078, 0x1b81, 0x1078, - 0x3053, 0x7210, 0x7114, 0x700c, 0xa09c, 0x007f, 0x2800, 0xa300, - 0xa211, 0xa189, 0x0000, 0x78b0, 0xa005, 0x0040, 0x3013, 0x78b3, - 0x0000, 0x0078, 0x3036, 0x1078, 0x3053, 0x2704, 0x2c58, 0xac60, - 0x630c, 0x2200, 0xa322, 0x6308, 0x2100, 0xa31b, 0x2400, 0xa305, - 0x0040, 0x302c, 0x00c8, 0x302c, 0x8412, 0x8210, 0x830a, 0xa189, - 0x0000, 0x2b60, 0x0078, 0x3013, 0x2b60, 0x8a07, 0xa7ba, 0x2f35, - 0xa73d, 0x2c00, 0x6882, 0x6f86, 0x6c8e, 0x6b8a, 0x7007, 0x0012, - 0x1078, 0x2f59, 0x007c, 0x8738, 0x2704, 0xa005, 0x00c0, 0x3047, - 0x6098, 0xa005, 0x0040, 0x3050, 0x2060, 0x2039, 0x2f35, 0x8a51, - 0x0040, 0x304f, 0x7008, 0xa084, 0x00c0, 0xa086, 0x00c0, 0x007c, - 0x2051, 0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, - 0x3060, 0x2039, 0x2f3b, 0x6000, 0xa064, 0x00c0, 0x3060, 0x2d60, - 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6880, 0x2060, - 0x6884, 0x6b88, 0x6c8c, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, - 0xa0b8, 0x2f35, 0x7e08, 0xa6b5, 0x000c, 0x6818, 0xa084, 0x0040, - 0x0040, 0x307c, 0xa6b5, 0x0001, 0x0f7e, 0x2079, 0x0100, 0x7858, - 0x0f7f, 0xa084, 0x0040, 0x0040, 0x308b, 0xa684, 0x0001, 0x00c0, - 0x308b, 0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, - 0x00c0, 0x308d, 0x7000, 0xa005, 0x0040, 0x3098, 0x1078, 0x1b81, - 0x2400, 0xa305, 0x00c0, 0x309e, 0x0078, 0x30db, 0x2c58, 0x2704, - 0xac60, 0x6004, 0xa400, 0x007e, 0x701a, 0x6000, 0xa301, 0x701e, - 0x2009, 0x04fd, 0x2104, 0xa086, 0x04fd, 0x007f, 0x00c0, 0x30cb, - 0xa084, 0x0001, 0x0040, 0x30cb, 0xa684, 0x0001, 0x00c0, 0x30cb, - 0x7013, 0x0001, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x78b3, - 0x0001, 0xa4a0, 0x0001, 0xa399, 0x0000, 0x6004, 0xa400, 0x701a, - 0x6000, 0xa301, 0x701e, 0x620c, 0x2400, 0xa202, 0x7012, 0x6208, - 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, - 0x303b, 0x0078, 0x30dd, 0x1078, 0x316e, 0x00c0, 0x30db, 0x127f, - 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x7007, - 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x30e9, 0x7003, 0x0008, - 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, - 0x2049, 0x30f3, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, - 0x30fc, 0x7000, 0xa005, 0x0040, 0x3107, 0x1078, 0x1b81, 0x7e08, - 0xa6b5, 0x000c, 0x6818, 0xa084, 0x0040, 0x0040, 0x3111, 0xa6b5, - 0x0001, 0x6824, 0xa005, 0x0040, 0x311d, 0x2050, 0x2039, 0x2f38, - 0x2d60, 0x1078, 0x316e, 0x00c0, 0x3119, 0x127f, 0x2000, 0x007c, - 0x127e, 0x007e, 0x017e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x037f, - 0x047f, 0x7e08, 0xa6b5, 0x000c, 0x6818, 0xa084, 0x0040, 0x0040, - 0x3133, 0xa6b5, 0x0001, 0x2049, 0x3120, 0x6824, 0xa055, 0x0040, - 0x316b, 0x2d70, 0x2e60, 0x2039, 0x2f38, 0x2704, 0xae68, 0x680c, - 0xa422, 0x6808, 0xa31b, 0x0048, 0x3158, 0x8a51, 0x00c0, 0x314a, - 0x1078, 0x1b81, 0x8738, 0x2704, 0xa005, 0x00c0, 0x313e, 0x7098, - 0xa075, 0x2060, 0x0040, 0x316b, 0x2039, 0x2f35, 0x0078, 0x313d, - 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x690c, 0x2400, 0xa122, - 0x6908, 0x2300, 0xa11b, 0x00c8, 0x3167, 0x1078, 0x1b81, 0x2071, - 0x0020, 0x0078, 0x308b, 0x127f, 0x2000, 0x007c, 0x7008, 0xa084, - 0x00c0, 0xa086, 0x00c0, 0x0040, 0x3196, 0x2704, 0xac08, 0x2104, - 0x701e, 0x8108, 0x2104, 0x701a, 0x8108, 0x2104, 0x7016, 0x8108, - 0x2104, 0x7012, 0x0f7e, 0x2079, 0x0100, 0x7858, 0x0f7f, 0xa084, - 0x0040, 0x0040, 0x3191, 0xa684, 0x0001, 0x00c0, 0x3191, 0xa6b5, - 0x0001, 0x7602, 0x7007, 0x0001, 0x1078, 0x303b, 0x007c, 0x127e, - 0x007e, 0x0d7e, 0x2091, 0x2200, 0x2049, 0x3197, 0x0d7f, 0x087f, - 0x7108, 0xa184, 0x00c0, 0x00c0, 0x31ad, 0x6824, 0xa005, 0x0040, - 0x31bd, 0x0078, 0x2ee1, 0x0078, 0x31bd, 0x7108, 0x8104, 0x00c8, - 0x31b5, 0x1078, 0x2fab, 0x0078, 0x31a0, 0x7007, 0x0010, 0x7108, - 0x8104, 0x00c8, 0x31b7, 0x1078, 0x2fab, 0x7008, 0xa086, 0x0002, - 0x00c0, 0x31a0, 0x7000, 0xa005, 0x00c0, 0x31a0, 0x7003, 0x0000, - 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, 0x127e, 0x147e, 0x137e, - 0x157e, 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x31cd, 0xad80, - 0x0010, 0x20a0, 0x2099, 0x0031, 0x700c, 0xa084, 0x007f, 0x6826, - 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040, 0x31eb, - 0x8000, 0x80ac, 0x53a5, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, - 0x00c0, 0x31ed, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, - 0x147f, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, - 0x2200, 0x0d7f, 0x2049, 0x31fc, 0x6880, 0x2060, 0x6884, 0x6b88, - 0x6c8c, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0xa0b8, 0x2f35, - 0x7e08, 0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, - 0x00c0, 0x3215, 0x2c58, 0x2704, 0xac60, 0x6004, 0xa400, 0x701a, - 0x6000, 0xa301, 0x701e, 0x7013, 0x0001, 0x7017, 0x0000, 0x7602, - 0x7007, 0x0001, 0x007f, 0x8007, 0x2009, 0x0031, 0x200a, 0x00a0, - 0x322f, 0x7108, 0x7007, 0x0002, 0x810c, 0x00c8, 0x322f, 0x810c, - 0x0048, 0x323c, 0x0078, 0x2fed, 0xa4a0, 0x0001, 0xa399, 0x0000, - 0x6b8a, 0x6c8e, 0x7007, 0x0004, 0x2049, 0x0000, 0x7003, 0x0000, - 0x127f, 0x2000, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, - 0x818e, 0x00c8, 0x3254, 0xa200, 0x00f0, 0x324f, 0x8086, 0x818e, - 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x327a, 0xa11a, - 0x00c8, 0x327a, 0x8213, 0x818d, 0x0048, 0x326d, 0xa11a, 0x00c8, - 0x326e, 0x00f0, 0x3262, 0x0078, 0x3272, 0xa11a, 0x2308, 0x8210, - 0x00f0, 0x3262, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, - 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x3276, - 0x00e0, 0x32c2, 0x2091, 0x6000, 0x7820, 0x8001, 0x7822, 0x00c0, - 0x32bc, 0x7824, 0x7822, 0x2091, 0x8000, 0x2069, 0x3540, 0x6800, - 0xa084, 0x0007, 0x0040, 0x32a4, 0xa086, 0x0002, 0x0040, 0x32a4, - 0x6830, 0xa00d, 0x0040, 0x32a4, 0x2104, 0xa005, 0x0040, 0x32a4, - 0x8001, 0x200a, 0x0040, 0x3372, 0x2061, 0x3680, 0x20a9, 0x0080, - 0x6034, 0xa005, 0x0040, 0x32b6, 0x8001, 0x6036, 0x00c0, 0x32b6, - 0x6010, 0xa005, 0x0040, 0x32b6, 0x1078, 0x1a23, 0xace0, 0x0010, - 0x0070, 0x32bc, 0x0078, 0x32a8, 0x1078, 0x32d7, 0x1078, 0x32c5, - 0x1078, 0x32fc, 0x2091, 0x8001, 0x007c, 0x783c, 0x8001, 0x783e, - 0x00c0, 0x32d6, 0x7840, 0x783e, 0x7848, 0xa005, 0x0040, 0x32d6, - 0x8001, 0x784a, 0x00c0, 0x32d6, 0x1078, 0x1a23, 0x007c, 0x7834, - 0x8001, 0x7836, 0x00c0, 0x32fb, 0x7838, 0x7836, 0x2091, 0x8000, - 0x7844, 0xa005, 0x00c0, 0x32e6, 0x2001, 0x0101, 0x8001, 0x7846, - 0xa080, 0x3e80, 0x2040, 0x2004, 0xa065, 0x0040, 0x32fb, 0x6020, - 0xa005, 0x0040, 0x32f7, 0x8001, 0x6022, 0x0040, 0x332b, 0x6000, - 0x2c40, 0x0078, 0x32ec, 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, - 0x332a, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x3309, 0x2001, - 0x0080, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003, 0xa090, - 0x3680, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040, 0x332a, - 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x3322, 0x8001, 0x2012, - 0x00c0, 0x332a, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, - 0x1078, 0x1a23, 0x007c, 0x2069, 0x3540, 0x6800, 0xa005, 0x0040, - 0x3335, 0x683c, 0xac06, 0x0040, 0x3372, 0x6017, 0x0006, 0x60b0, - 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, 0xa085, 0x0060, - 0x601e, 0x6000, 0x2042, 0x6710, 0x6fb6, 0x1078, 0x169c, 0x6818, - 0xa005, 0x0040, 0x334d, 0x8001, 0x681a, 0x6808, 0xa084, 0xffef, - 0x680a, 0x6810, 0x8001, 0x00d0, 0x3357, 0x1078, 0x1b81, 0x6812, - 0x602f, 0x0000, 0x602b, 0x0000, 0x2c68, 0x1078, 0x17e7, 0x2069, - 0x3540, 0x2001, 0x0006, 0x68a2, 0x7944, 0xa184, 0x0100, 0x00c0, - 0x336d, 0x69ba, 0x2001, 0x0004, 0x68a2, 0x1078, 0x1a1e, 0x2091, - 0x8001, 0x007c, 0x2009, 0x354f, 0x2164, 0x2069, 0x0100, 0x6017, - 0x0006, 0x6858, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, - 0xa085, 0x0048, 0x601e, 0x602f, 0x0000, 0x602b, 0x0000, 0x6830, - 0xa084, 0x0040, 0x0040, 0x33ac, 0x684b, 0x0004, 0x20a9, 0x0014, - 0x6848, 0xa084, 0x0004, 0x0040, 0x3399, 0x0070, 0x3399, 0x0078, - 0x3390, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, - 0x0040, 0x33a6, 0x0070, 0x33a6, 0x0078, 0x339d, 0x20a9, 0x00fa, - 0x0070, 0x33ac, 0x0078, 0x33a8, 0x6808, 0xa084, 0xfffd, 0x680a, - 0x681b, 0x0046, 0x2009, 0x3568, 0x200b, 0x0007, 0x784c, 0x784a, - 0x2091, 0x8001, 0x007c, 0x2079, 0x3500, 0x1078, 0x3404, 0x1078, - 0x33cc, 0x1078, 0x33e1, 0x1078, 0x33f6, 0x7833, 0x0000, 0x7847, - 0x0000, 0x784b, 0x0000, 0x007c, 0x2019, 0x000a, 0x2011, 0x3546, - 0x2204, 0xa086, 0x0032, 0x0040, 0x33de, 0x2019, 0x000c, 0x2204, - 0xa086, 0x003c, 0x0040, 0x33de, 0x2019, 0x0008, 0x7b2a, 0x7b2e, - 0x007c, 0x2019, 0x0030, 0x2011, 0x3546, 0x2204, 0xa086, 0x0032, - 0x0040, 0x33f3, 0x2019, 0x0039, 0x2204, 0xa086, 0x003c, 0x0040, - 0x33f3, 0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x000d, - 0x2011, 0x3546, 0x2204, 0xa086, 0x003c, 0x0040, 0x3401, 0x2019, - 0x000a, 0x7b3e, 0x7b42, 0x007c, 0x2019, 0x2faf, 0x2011, 0x3546, - 0x2204, 0xa086, 0x0032, 0x0040, 0x3416, 0x2019, 0x3971, 0x2204, - 0xa086, 0x003c, 0x0040, 0x3416, 0x2019, 0x2626, 0x7b22, 0x7b26, - 0x007c, 0xda3e + 0x00d0, 0x3354, 0x1078, 0x1ba5, 0x6812, 0x602f, 0x0000, 0x602b, + 0x0000, 0x2c68, 0x1078, 0x17dd, 0x2069, 0x3540, 0x2001, 0x0006, + 0x68a2, 0x7944, 0xa184, 0x0100, 0x00c0, 0x336a, 0x69ba, 0x2001, + 0x0004, 0x68a2, 0x1078, 0x1a14, 0x2091, 0x8001, 0x007c, 0x2009, + 0x354f, 0x2164, 0x2069, 0x0100, 0x1078, 0x1b6b, 0x6017, 0x0006, + 0x6858, 0xa084, 0x3f00, 0x601a, 0x601c, 0xa084, 0x00ff, 0xa085, + 0x0048, 0x601e, 0x602f, 0x0000, 0x602b, 0x0000, 0x6830, 0xa084, + 0x0040, 0x0040, 0x33ab, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, + 0xa084, 0x0004, 0x0040, 0x3398, 0x0070, 0x3398, 0x0078, 0x338f, + 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xa084, 0x0001, 0x0040, + 0x33a5, 0x0070, 0x33a5, 0x0078, 0x339c, 0x20a9, 0x00fa, 0x0070, + 0x33ab, 0x0078, 0x33a7, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, + 0x0046, 0x2009, 0x3568, 0x200b, 0x0007, 0x784c, 0x784a, 0x2091, + 0x8001, 0x007c, 0x2079, 0x3500, 0x1078, 0x3403, 0x1078, 0x33cb, + 0x1078, 0x33e0, 0x1078, 0x33f5, 0x7833, 0x0000, 0x7847, 0x0000, + 0x784b, 0x0000, 0x007c, 0x2019, 0x000a, 0x2011, 0x3546, 0x2204, + 0xa086, 0x0032, 0x0040, 0x33dd, 0x2019, 0x000c, 0x2204, 0xa086, + 0x003c, 0x0040, 0x33dd, 0x2019, 0x0008, 0x7b2a, 0x7b2e, 0x007c, + 0x2019, 0x0030, 0x2011, 0x3546, 0x2204, 0xa086, 0x0032, 0x0040, + 0x33f2, 0x2019, 0x0039, 0x2204, 0xa086, 0x003c, 0x0040, 0x33f2, + 0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, 0x2019, 0x000d, 0x2011, + 0x3546, 0x2204, 0xa086, 0x003c, 0x0040, 0x3400, 0x2019, 0x000a, + 0x7b3e, 0x7b42, 0x007c, 0x2019, 0x2faf, 0x2011, 0x3546, 0x2204, + 0xa086, 0x0032, 0x0040, 0x3415, 0x2019, 0x3971, 0x2204, 0xa086, + 0x003c, 0x0040, 0x3415, 0x2019, 0x2626, 0x7b22, 0x7b26, 0x007c, + 0x92a7 }; - -unsigned short sbus_risc_code_length01 = 0x241a; +unsigned short sbus_risc_code_length01 = 0x2419; diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index ff2b0f49ff9b..5fd5e80f04bb 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -104,14 +104,17 @@ static const char RCSid[] = "$Header: /vger/u4/cvs/linux/drivers/scsi/scsi.c,v 1 * lock up. */ -#define BLIST_NOLUN 0x01 -#define BLIST_FORCELUN 0x02 -#define BLIST_BORKEN 0x04 -#define BLIST_KEY 0x08 -#define BLIST_SINGLELUN 0x10 -#define BLIST_NOTQ 0x20 -#define BLIST_SPARSELUN 0x40 -#define BLIST_MAX5LUN 0x80 +#define BLIST_NOLUN 0x001 +#define BLIST_FORCELUN 0x002 +#define BLIST_BORKEN 0x004 +#define BLIST_KEY 0x008 +#define BLIST_SINGLELUN 0x010 +#define BLIST_NOTQ 0x020 +#define BLIST_SPARSELUN 0x040 +#define BLIST_MAX5LUN 0x080 +#define BLIST_ISDISK 0x100 +#define BLIST_ISROM 0x200 +#define BLIST_GHOST 0x400 /* * Data declarations. @@ -288,10 +291,14 @@ static struct dev_info device_list[] = {"CANON","IPUBJD","*", BLIST_SPARSELUN}, {"nCipher","Fastness Crypto","*", BLIST_FORCELUN}, {"NEC","PD-1 ODX654P","*", BLIST_FORCELUN | BLIST_SINGLELUN}, -{"MATSHITA","PD","*", BLIST_FORCELUN | BLIST_SINGLELUN}, +{"MATSHITA","PD-1","*", BLIST_FORCELUN | BLIST_SINGLELUN}, {"YAMAHA","CDR100","1.00", BLIST_NOLUN}, /* Locks up if polled for lun != 0 */ {"YAMAHA","CDR102","1.00", BLIST_NOLUN}, /* Locks up if polled for lun != 0 */ {"iomega","jaz 1GB","J.86", BLIST_NOTQ | BLIST_NOLUN}, +{"CREATIVE","DVD-RAM RAM","*", BLIST_GHOST}, +{"MATSHITA","PD-2 LF-D100","*", BLIST_GHOST}, +{"YAMAHA","CRW4416S","*", BLIST_GHOST}, +{"TOSHIBA","CDROM","*", BLIST_ISROM}, /* * Must be at end of list... */ @@ -654,6 +661,8 @@ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun, struct Scsi_Device_Template *sdtpnt; Scsi_Device * SDtail, *SDpnt=*SDpnt2; int bflags, type=-1; + static int ghost_channel=-1, ghost_dev=-1; + int org_lun = lun; SDpnt->host = shpnt; SDpnt->id = dev; @@ -661,6 +670,12 @@ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun, SDpnt->channel = channel; SDpnt->online = TRUE; + if ((channel == ghost_channel) && (dev == ghost_dev) && (lun == 1)) { + SDpnt->lun = 0; + } else { + ghost_channel = ghost_dev = -1; + } + /* Some low level driver could use device->type (DB) */ SDpnt->type = -1; @@ -753,26 +768,37 @@ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun, } /* - * It would seem some TOSHIBA CDROM gets things wrong + * Get any flags for this device. */ - if (!strncmp (scsi_result + 8, "TOSHIBA", 7) && - !strncmp (scsi_result + 16, "CD-ROM", 6) && - scsi_result[0] == TYPE_DISK) { - scsi_result[0] = TYPE_ROM; + bflags = get_device_flags (scsi_result); + + /* The Toshiba ROM was "gender-changed" here as an inline hack. + This is now much more generic. + This is a mess: What we really want is to leave the scsi_result + alone, and just change the SDpnt structure. And the SDpnt is what + we want print_inquiry to print. -- REW + */ + if (bflags & BLIST_ISDISK) { + scsi_result[0] = TYPE_DISK; scsi_result[1] |= 0x80; /* removable */ } - /* - * It would seem the Panasonic DVD-RAM is backwards too - * If DVD-RAM or PD media used, it seems to function - * as Direct-Access - */ - if (!strncmp (scsi_result + 8, "MATSHITA", 7) && - !strncmp (scsi_result + 16, "PD-2 LF-D100", 12)) { - scsi_result[0] = TYPE_DISK; + if (bflags & BLIST_ISROM) { + scsi_result[0] = TYPE_ROM; scsi_result[1] |= 0x80; /* removable */ } + if (bflags & BLIST_GHOST) { + if ((ghost_channel == channel) && (ghost_dev == dev) && (org_lun == 1)) { + lun=1; + } else { + ghost_channel = channel; + ghost_dev = dev; + scsi_result[0] = TYPE_MOD; + scsi_result[1] |= 0x80; /* removable */ + } + } + memcpy (SDpnt->vendor, scsi_result + 8, 8); memcpy (SDpnt->model, scsi_result + 16, 16); memcpy (SDpnt->rev, scsi_result + 32, 4); @@ -835,10 +861,6 @@ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun, */ SDpnt->disconnect = 0; - /* - * Get any flags for this device. - */ - bflags = get_device_flags (scsi_result); /* * Set the tagged_queue flag for SCSI-II devices that purport to support @@ -964,6 +986,15 @@ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun, return 1; } + /* + * If this device is Ghosted, scan upto two luns. (It physically only + * has one). -- REW + */ + if (bflags & BLIST_GHOST) { + *max_dev_lun = 2; + return 1; + } + /* * REGAL CDC-4X: avoid hang after LUN 4 */ diff --git a/drivers/scsi/sim710.c b/drivers/scsi/sim710.c new file mode 100644 index 000000000000..68785fea6282 --- /dev/null +++ b/drivers/scsi/sim710.c @@ -0,0 +1,1605 @@ +/* + * sim710.c - Copyright (C) 1999 Richard Hirst + * + *---------------------------------------------------------------------------- + * 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. + *---------------------------------------------------------------------------- + * + * MCA card detection code by Trent McNair. + * + * Various bits of code in this driver have been copied from 53c7,8xx,c, + * which is coyright Drew Eckhardt. The scripts for the SCSI chip are + * compiled with the script compiler written by Drew. + * + * This is a simple driver for the NCR53c710. More complex drivers + * for this chip (e.g. 53c7xx.c) require that the scsi chip be able to + * do DMA block moves between memory and on-chip registers, which can + * be a problem if those registers are in the I/O address space. There + * can also be problems on hardware where the registers are memory + * mapped, if the design is such that memory-to-memory transfers initiated + * by the scsi chip cannot access the chip registers. + * + * This driver is designed to avoid these problems and is intended to + * work with any Intel machines using 53c710 chips, including various + * Compaq and NCR machines. It was initially written for the Tadpole + * TP34V VME board which is 68030 based. + * + * The driver supports boot-time parameters similar to + * sim710=addr:0x9000,irq:15 + * and insmod parameters similar to + * sim710="addr:0x9000 irq:15" + * + * The complete list of options are: + * + * addr:0x9000 Specifies the base I/O port (or address) of the 53C710. + * irq:15 Specifies the IRQ number used by the 53c710. + * debug:0xffff Generates lots of debug output. + * ignore:0x0a Makes the driver ignore SCSI IDs 0 and 2. + * nodisc:0x70 Prevents disconnects from IDs 6, 5 and 4. + * noneg:0x10 Prevents SDTR negotiation on ID 4. + * + * Current limitations: + * + * o Async only + * o Severely lacking in error recovery + * o Auto detection of IRQs and chip addresses only on MCA architectures + * + */ + +#define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s)) + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,17) +#include +#elif LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93) +#include +#endif +#include +#include +#include +#include + +#ifdef CONFIG_TP34V_SCSI + +#include +#define MEM_MAPPED + +#elif defined(CONFIG_MCA) + +#define IO_MAPPED + +/* + * For each known microchannel card using the 53c710 we need a list + * of possible IRQ and IO settings, as well as their corresponding + * bit assignment in pos[]. This might get cumbersome if there + * are more than a few cards (I only know of 2 at this point). + */ + +#define MCA_53C710_IDS { 0x01bb, 0x01ba, 0x004f } + +/* CARD ID 01BB and 01BA use the same pos values */ + +#define MCA_01BB_IO_PORTS { 0x0000, 0x0000, 0x0800, 0x0C00, 0x1000, 0x1400, \ + 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, \ + 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00, \ + 0x4000, 0x4400, 0x4800, 0x4C00, 0x5000 } + +#define MCA_01BB_IRQS { 3, 5, 11, 14 } + +/* CARD ID 004f */ + +#define MCA_004F_IO_PORTS { 0x0000, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600 } + +#define MCA_004F_IRQS { 5, 9, 14 } + +#else + +/* Assume an Intel platform */ + +#define IO_MAPPED + +#endif + +#include "scsi.h" +#include "hosts.h" +#include "sim710.h" + +#include + +#define DEBUG +#undef DEBUG_LIMIT_INTS /* Define to 10 to hang driver after 10 ints */ + +/* Debug options available via the "debug:0x1234" parameter */ + +#define DEB_NONE 0x0000 /* Nothing */ +#define DEB_HALT 0x0001 /* Detailed trace of chip halt funtion */ +#define DEB_REGS 0x0002 /* All chip register read/writes */ +#define DEB_SYNC 0x0004 /* Sync/async negotiation */ +#define DEB_PMM 0x0008 /* Phase mis-match handling */ +#define DEB_INTS 0x0010 /* General interrupt trace */ +#define DEB_TOUT 0x0020 /* Selection timeouts */ +#define DEB_RESUME 0x0040 /* Resume addresses for the script */ +#define DEB_CMND 0x0080 /* Commands and status returned */ +#define DEB_FIXUP 0x0100 /* Fixup of scsi addresses */ +#define DEB_DISC 0x0200 /* Disconnect/reselect handling */ + +#define DEB_ANY 0xffff /* Any and all debug options */ + +#ifdef DEBUG +#define DEB(m,x) if (sim710_debug & m) x +int sim710_debug = 0; +#else +#define DEB(m,x) +#endif + +/* Redefine scsi_done to force renegotiation of (a)sync transfers + * following any failed command. + */ + +#define SCSI_DONE(cmd) { \ + DEB(DEB_CMND, printk("scsi%d: Complete %08x\n", \ + host->host_no, cmd->result)); \ + if (cmd->result) \ + hostdata->negotiate |= (1 << cmd->target); \ + cmd->scsi_done(cmd); \ + } + +#ifndef offsetof +#define offsetof(t, m) ((size_t) (&((t *)0)->m)) +#endif + + +struct proc_dir_entry proc_scsi_sim710 = { + PROC_SCSI_SIM710, 6, "sim710", + S_IFDIR | S_IRUGO | S_IXUGO, 2 +}; + +#define STATE_INITIALISED 0 +#define STATE_HALTED 1 +#define STATE_IDLE 2 +#define STATE_BUSY 3 +#define STATE_DISABLED 4 + +#define MAXBOARDS 2 /* Increase this and the sizes of the + arrays below, if you need more.. */ + +#ifdef MODULE + +char *sim710; /* command line passed by insmod */ + +MODULE_AUTHOR("Richard Hirst"); +MODULE_DESCRIPTION("Simple NCR53C710 driver"); +MODULE_PARM(sim710, "s"); + +#endif + +static int sim710_errors = 0; /* Count of error interrupts */ +static int sim710_intrs = 0; /* Count of all interrupts */ +static int ignore_ids = 0; /* Accept all SCSI IDs */ +static int opt_nodisc = 0; /* Allow disconnect on all IDs */ +static int opt_noneg = 0; /* Allow SDTR negotiation on all IDs */ + +#ifdef CONFIG_TP34V_SCSI + +/* Special hardwired case for Tadpole TP34V at the moment, otherwise + * boot parameters 'sim710=addr:0x8000,irq:15' (for example) must be given. + */ + +static int no_of_boards = 2; + +static unsigned int bases[MAXBOARDS] = { + TP34V_SCSI0_BASE, TP34V_SCSI1_BASE +}; +static unsigned int irq_vectors[MAXBOARDS] = { + TP34V_SCSI0_VECTOR, TP34V_SCSI1_VECTOR +}; +static unsigned int irq_index[MAXBOARDS] = { + TP34V_SCSI0_IRQ_INDEX, TP34V_SCSI1_IRQ_INDEX +}; + +#else + +/* All other cases use boot/module params, or auto-detect */ + +static int no_of_boards = 0; + +static unsigned int bases[MAXBOARDS] = { + 0 +}; +static unsigned int irq_vectors[MAXBOARDS] = { + 0 +}; + +#endif + +/* The SCSI Script!!! */ + +#include "sim710_d.h" + +/* Now define offsets in the DSA, as (A_dsa_xxx/4) */ + +#define DSA_SELECT (A_dsa_select/4) +#define DSA_MSGOUT (A_dsa_msgout/4) +#define DSA_CMND (A_dsa_cmnd/4) +#define DSA_STATUS (A_dsa_status/4) +#define DSA_MSGIN (A_dsa_msgin/4) +#define DSA_DATAIN (A_dsa_datain/4) +#define DSA_DATAOUT (A_dsa_dataout/4) +#define DSA_SIZE (A_dsa_size/4) + +#define MAX_SG 128 /* Scatter/Gather elements */ + + +#define MAX_MSGOUT 8 +#define MAX_MSGIN 8 +#define MAX_CMND 12 +#define MAX_STATUS 1 + +struct sim710_hostdata{ + int state; + Scsi_Cmnd * issue_queue; + Scsi_Cmnd * running; + int chip; + u8 negotiate; + u8 reselected_identify; + u8 msgin_buf[MAX_MSGIN]; + + struct sim710_target { + Scsi_Cmnd *cur_cmd; + u32 resume_offset; + u32 data_in_jump; + u32 data_out_jump; + u32 dsa[DSA_SIZE]; /* SCSI Script DSA area */ + u8 dsa_msgout[MAX_MSGOUT]; + u8 dsa_msgin[MAX_MSGIN]; + u8 dsa_cdb[MAX_CMND]; + u8 dsa_status[MAX_STATUS]; + } target[8]; + + u32 script[sizeof(SCRIPT)/4] __attribute__ ((aligned (4))); +}; + + +/* Template to request asynchronous transfers */ + +static const unsigned char async_message[] = { + EXTENDED_MESSAGE, 3 /* length */, EXTENDED_SDTR, 0, 0 /* asynchronous */}; + + +static void sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs); +static void do_sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs); +static __inline__ void run_process_issue_queue(struct sim710_hostdata *); +static void process_issue_queue (struct sim710_hostdata *, unsigned long flags); +static int full_reset(struct Scsi_Host * host); + +/* + * Function: void sim710_setup(char *str, int *ints) + */ + +#ifdef MODULE +#define ARG_SEP ' ' +#else +#define ARG_SEP ',' +#endif + +void +sim710_setup(char *str, int *ints) +{ + char *cur = str; + char *pc, *pv; + int val; + int base; + int c; + + no_of_boards = 0; + while (cur != NULL && (pc = strchr(cur, ':')) != NULL) { + char *pe; + + val = 0; + pv = pc; + c = *++pv; + + if (c == 'n') + val = 0; + else if (c == 'y') + val = 1; + else { + base = 0; + val = (int) simple_strtoul(pv, &pe, base); + } + if (!strncmp(cur, "addr:", 5)) { + bases[0] = val; + no_of_boards = 1; + } + else if (!strncmp(cur, "irq:", 4)) + irq_vectors[0] = val; + else if (!strncmp(cur, "ignore:", 7)) + ignore_ids = val; + else if (!strncmp(cur, "nodisc:", 7)) + opt_nodisc = val; + else if (!strncmp(cur, "noneg:", 6)) + opt_noneg = val; + else if (!strncmp(cur, "disabled:", 5)) { + no_of_boards = -1; + return; + } +#ifdef DEBUG + else if (!strncmp(cur, "debug:", 6)) { + sim710_debug = val; + } +#endif + else + printk("sim710_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur); + + if ((cur = strchr(cur, ARG_SEP)) != NULL) + ++cur; + } +} + +#if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,13) +#ifndef MODULE +__setup("sim710=", sim710_setup); +#endif +#endif + +/* + * Function: static const char *sbcl_to_phase (int sbcl) + */ + +static const char * +sbcl_to_phase (int sbcl) { + switch (sbcl & SBCL_PHASE_MASK) { + case SBCL_PHASE_DATAIN: + return "DATAIN"; + case SBCL_PHASE_DATAOUT: + return "DATAOUT"; + case SBCL_PHASE_MSGIN: + return "MSGIN"; + case SBCL_PHASE_MSGOUT: + return "MSGOUT"; + case SBCL_PHASE_CMDOUT: + return "CMDOUT"; + case SBCL_PHASE_STATIN: + return "STATUSIN"; + default: + return "unknown"; + } +} + + +/* + * Function: static void disable (struct Scsi_Host *host) + */ + +static void +disable (struct Scsi_Host *host) +{ + struct sim710_hostdata *hostdata = (struct sim710_hostdata *) + host->hostdata[0]; + + hostdata->state = STATE_DISABLED; + printk (KERN_ALERT "scsi%d : disabled. Unload and reload\n", + host->host_no); +} + + +/* + * Function : static int ncr_halt (struct Scsi_Host *host) + * + * Purpose : halts the SCSI SCRIPTS(tm) processor on the NCR chip + * + * Inputs : host - SCSI chip to halt + * + * Returns : 0 on success + */ + +static int +ncr_halt (struct Scsi_Host *host) +{ + unsigned long flags; + unsigned char istat, tmp; + struct sim710_hostdata *hostdata = (struct sim710_hostdata *) + host->hostdata[0]; + int stage; + + save_flags(flags); + cli(); + /* Stage 0 : eat all interrupts + Stage 1 : set ABORT + Stage 2 : eat all but abort interrupts + Stage 3 : eat all interrupts + */ + for (stage = 0;;) { + if (stage == 1) { + DEB(DEB_HALT, printk("ncr_halt: writing ISTAT_ABRT\n")); + NCR_write8(ISTAT_REG, ISTAT_ABRT); + ++stage; + } + istat = NCR_read8 (ISTAT_REG); + if (istat & ISTAT_SIP) { + DEB(DEB_HALT, printk("ncr_halt: got ISTAT_SIP, istat=%02x\n", istat)); + tmp = NCR_read8(SSTAT0_REG); + DEB(DEB_HALT, printk("ncr_halt: got SSTAT0_REG=%02x\n", tmp)); + } else if (istat & ISTAT_DIP) { + DEB(DEB_HALT, printk("ncr_halt: got ISTAT_DIP, istat=%02x\n", istat)); + tmp = NCR_read8(DSTAT_REG); + DEB(DEB_HALT, printk("ncr_halt: got DSTAT_REG=%02x\n", tmp)); + if (stage == 2) { + if (tmp & DSTAT_ABRT) { + DEB(DEB_HALT, printk("ncr_halt: got DSTAT_ABRT, clearing istat\n")); + NCR_write8(ISTAT_REG, 0); + ++stage; + } else { + printk(KERN_ALERT "scsi%d : could not halt NCR chip\n", + host->host_no); + disable (host); + } + } + } + if (!(istat & (ISTAT_SIP|ISTAT_DIP))) { + if (stage == 0) + ++stage; + else if (stage == 3) + break; + } + } + hostdata->state = STATE_HALTED; + restore_flags(flags); + return 0; +} + +/* + * Function : static void sim710_soft_reset (struct Scsi_Host *host) + * + * Purpose : perform a soft reset of the NCR53c7xx chip + * + * Inputs : host - pointer to this host adapter's structure + * + * Preconditions : sim710_init must have been called for this + * host. + * + */ + +static void +sim710_soft_reset (struct Scsi_Host *host) +{ + unsigned long flags; +#ifdef CONFIG_TP34V_SCSI + struct sim710_hostdata *hostdata = (struct sim710_hostdata *) + host->hostdata[0]; +#endif + + save_flags(flags); + cli(); +#ifdef CONFIG_TP34V_SCSI + tpvic.loc_icr[irq_index[hostdata->chip]].icr = 0x80; +#endif + /* + * Do a soft reset of the chip so that everything is + * reinitialized to the power-on state. + * + * Basically follow the procedure outlined in the NCR53c700 + * data manual under Chapter Six, How to Use, Steps Necessary to + * Start SCRIPTS, with the exception of actually starting the + * script and setting up the synchronous transfer gunk. + */ + + /* XXX Should we reset the scsi bus here? */ + + NCR_write8(SCNTL1_REG, SCNTL1_RST); /* Reset the bus */ + udelay(50); + NCR_write8(SCNTL1_REG, 0); + + udelay(500); + + NCR_write8(ISTAT_REG, ISTAT_10_SRST); /* Reset the chip */ + udelay(50); + NCR_write8(ISTAT_REG, 0); + + mdelay(1000); /* Let devices recover */ + + NCR_write8(DCNTL_REG, DCNTL_10_COM | DCNTL_700_CF_3); + NCR_write8(CTEST7_REG, CTEST7_10_CDIS|CTEST7_STD); + NCR_write8(DMODE_REG, DMODE_10_BL_8 | DMODE_10_FC2); + NCR_write8(SCID_REG, 1 << host->this_id); + NCR_write8(SBCL_REG, 0); + NCR_write8(SXFER_REG, 0); + NCR_write8(SCNTL1_REG, SCNTL1_ESR_700); + NCR_write8(SCNTL0_REG, SCNTL0_EPC | SCNTL0_EPG_700 | SCNTL0_ARB1 | + SCNTL0_ARB2); + + NCR_write8(DIEN_REG, DIEN_700_BF | + DIEN_ABRT | DIEN_SSI | DIEN_SIR | DIEN_700_OPC); + + NCR_write8(SIEN_REG_700, + SIEN_PAR | SIEN_700_STO | SIEN_RST | SIEN_UDC | SIEN_SGE | SIEN_MA); + + +#ifdef CONFIG_TP34V_SCSI + tpvic.loc_icr[irq_index[hostdata->chip]].icr = 0x30 | TP34V_SCSI0n1_IPL; +#endif + + restore_flags(flags); +} + + +/* + * Function : static void sim710_driver_init (struct Scsi_Host *host) + * + * Purpose : Initialize internal structures, as required on startup, or + * after a SCSI bus reset. + * + * Inputs : host - pointer to this host adapter's structure + */ + +static void +sim710_driver_init (struct Scsi_Host *host) +{ + struct sim710_hostdata *hostdata = (struct sim710_hostdata *) + host->hostdata[0]; + int i; + + hostdata->running = NULL; + memcpy (hostdata->script, SCRIPT, sizeof(SCRIPT)); + for (i = 0; i < PATCHES; i++) + hostdata->script[LABELPATCHES[i]] += virt_to_bus(hostdata->script); + patch_abs_32 (hostdata->script, 0, reselected_identify, + virt_to_bus((void *)&(hostdata->reselected_identify))); + patch_abs_32 (hostdata->script, 0, msgin_buf, + virt_to_bus((void *)&(hostdata->msgin_buf[0]))); + hostdata->state = STATE_INITIALISED; + hostdata->negotiate = 0xff; +} + + +/* Handle incoming Synchronous data transfer request. If our negotiate + * flag is set then this is a response to our request, otherwise it is + * spurious request from the target. Don't really expect target initiated + * SDTRs, because we always negotiate on the first command. Could still + * get them though.. + * The chip is currently paused with ACK asserted o the last byte of the + * SDTR. + * resa is the resume address if the message is in response to our outgoing + * SDTR. Only possible on initial identify. + * resb is the resume address if the message exchange is initiated by the + * target. + */ + +static u32 +handle_sdtr (struct Scsi_Host * host, Scsi_Cmnd * cmd, u32 resa, u32 resb) +{ + struct sim710_hostdata *hostdata = (struct sim710_hostdata *)host->hostdata[0]; + struct sim710_target *targdata = hostdata->target + cmd->target; + u32 resume_offset; + + if (resa && hostdata->negotiate & (1 << cmd->target)) { + DEB(DEB_SYNC, printk("scsi%d: Response to host SDTR = %02x %02x\n", + host->host_no, hostdata->msgin_buf[3], hostdata->msgin_buf[4])); + /* We always issue an SDTR with the identify, so we must issue + * the CDB next. + */ + resume_offset = resa; + hostdata->negotiate &= ~(1 << cmd->target); + } + else { + DEB(DEB_SYNC, printk("scsi%d: Target initiated SDTR = %02x %02x\n", + host->host_no, hostdata->msgin_buf[3], hostdata->msgin_buf[4])); + memcpy(targdata->dsa_msgout, async_message, sizeof(async_message)); + targdata->dsa[DSA_MSGOUT] = sizeof(async_message); + /* I guess the target could do this anytime; we have to send our + * response, and then continue (sending the CDB if not already done). + */ + resume_offset = resb; + } + return resume_offset; +} + + +/* + * Function : static int datapath_residual (Scsi_Host *host) + * + * Purpose : return residual data count of what's in the chip. + * + * Inputs : host - SCSI host + */ + +static int +datapath_residual (struct Scsi_Host *host) { + int count, synchronous, sstat; + unsigned int ddir; + + count = ((NCR_read8 (DFIFO_REG) & DFIFO_10_BO_MASK) - + (NCR_read32 (DBC_REG) & DFIFO_10_BO_MASK)) & DFIFO_10_BO_MASK; + synchronous = NCR_read8 (SXFER_REG) & SXFER_MO_MASK; + ddir = NCR_read8 (CTEST0_REG_700) & CTEST0_700_DDIR; + + if (ddir) { + /* Receive */ + if (synchronous) + count += (NCR_read8 (SSTAT2_REG) & SSTAT2_FF_MASK) >> SSTAT2_FF_SHIFT; + else + if (NCR_read8 (SSTAT1_REG) & SSTAT1_ILF) + ++count; + } else { + /* Send */ + sstat = NCR_read8 (SSTAT1_REG); + if (sstat & SSTAT1_OLF) + ++count; + if (synchronous && (sstat & SSTAT1_ORF)) + ++count; + } + return count; +} + + +static u32 +handle_idd (struct Scsi_Host * host, Scsi_Cmnd * cmd) +{ + struct sim710_hostdata *hostdata = + (struct sim710_hostdata *)host->hostdata[0]; + struct sim710_target *targdata = hostdata->target + cmd->target; + u32 resume_offset = 0, index; + + index = (u32)((u32 *)(bus_to_virt(NCR_read32(DSP_REG))) - hostdata->script); + + switch (index) { + case Ent_wait_disc_complete/4 + 2: + cmd->result = targdata->dsa_status[0]; + SCSI_DONE(cmd); + targdata->cur_cmd = NULL; + resume_offset = Ent_reselect; + break; + case Ent_wait_disc2/4 + 2: + /* Disconnect after command - just wait for a reselect */ + targdata->resume_offset = Ent_resume_msgin2a; + resume_offset = Ent_reselect; + break; + case Ent_wait_disc3/4 + 2: + /* Disconnect after the data phase */ + targdata->resume_offset = Ent_resume_msgin3a; + resume_offset = Ent_reselect; + break; + case Ent_wait_disc1/4 + 2: + /* Disconnect before command - not expected */ + targdata->resume_offset = Ent_resume_msgin1a; + resume_offset = Ent_reselect; + break; + default: + printk("scsi%d: Unexpected Illegal Instruction, script[%04x]\n", + host->host_no, index); + sim710_errors++; + /* resume_offset is zero, which will cause host reset */ + } + return resume_offset; +} + + +/* Handle a phase mismatch. + */ + +static u32 +handle_phase_mismatch (struct Scsi_Host * host, Scsi_Cmnd * cmd) +{ + struct sim710_hostdata *hostdata = + (struct sim710_hostdata *)host->hostdata[0]; + struct sim710_target *targdata = hostdata->target + cmd->target; + u32 resume_offset = 0, index; + unsigned char sbcl; + + sbcl = NCR_read8(SBCL_REG) & SBCL_PHASE_MASK; + index = (u32)((u32 *)(bus_to_virt(NCR_read32(DSP_REG))) - hostdata->script); + + DEB(DEB_PMM, printk("scsi%d: Phase mismatch, phase %s (%x) at script[0x%x]\n", + host->host_no, sbcl_to_phase(sbcl), sbcl, index)); + DEB(DEB_PMM, print_command(cmd->cmnd)); + + if (index == Ent_done_ident/4) { + /* Sending initial message out - probably rejecting our sync + * negotiation request. + */ + NCR_write8(SOCL_REG, 0); /* Negate ATN */ + if (sbcl == SBCL_PHASE_MSGIN) + resume_offset = Ent_resume_rej_ident; + else if (sbcl == SBCL_PHASE_CMDOUT) { + /* Some old devices (SQ555) switch to cmdout after the first + * byte of an identify message, regardless of whether we + * have more bytes to send! + */ + printk("scsi%d: Unexpected switch to CMDOUT during IDENTIFY\n", + host->host_no); + resume_offset = Ent_resume_cmd; + } + else { + printk("scsi%d: Unexpected phase change to %s on initial msgout\n", + host->host_no, sbcl_to_phase(sbcl)); + /* resume_offset is zero, which will cause a host reset */ + } + hostdata->negotiate &= ~(1 << cmd->target); + } + else if (index > Ent_patch_input_data/4 && + index < Ent_patch_output_data/4) { + /* DataIn transfer phase */ + u32 sg_id, oaddr, olen, naddr, nlen; + int residual; + + sg_id = (index - Ent_patch_input_data/4 - 4) / 2; + targdata->data_in_jump = hostdata->script[Ent_patch_input_data/4+1] = + virt_to_bus(hostdata->script + Ent_patch_input_data/4 + sg_id * 2 + 2); + olen = targdata->dsa[DSA_DATAIN + sg_id * 2]; + oaddr = targdata->dsa[DSA_DATAIN + sg_id * 2 + 1]; + residual = datapath_residual (host); + if (residual) + printk("scsi%d: Residual count %d on DataIn - NOT expected!!!", + host->host_no, residual); + naddr = NCR_read32(DNAD_REG) - residual; + nlen = (NCR_read32(DBC_REG) & 0x00ffffff) + residual; + DEB(DEB_PMM, printk("scsi%d: DIN sg %d, old %08x/%08x, new %08x/%08x (%d)\n", + host->host_no, sg_id, oaddr, olen, naddr, nlen, residual)); + if (oaddr+olen != naddr+nlen) { + printk("scsi%d: PMM DIN counts error: 0x%x + 0x%x != 0x%x + 0x%x", + host->host_no, oaddr, olen, naddr, nlen); + } + else { + targdata->dsa[DSA_DATAIN + sg_id * 2] = nlen; + targdata->dsa[DSA_DATAIN + sg_id * 2 + 1] = naddr; + resume_offset = Ent_resume_pmm; + } + } + else if (index > Ent_patch_output_data/4 && + index <= Ent_end_data_trans/4) { + /* Dataout transfer phase */ + u32 sg_id, oaddr, olen, naddr, nlen; + int residual; + + sg_id = (index - Ent_patch_output_data/4 - 4) / 2; + targdata->data_out_jump = hostdata->script[Ent_patch_output_data/4+1] = + virt_to_bus(hostdata->script + Ent_patch_output_data/4 + sg_id * 2 + 2); + olen = targdata->dsa[DSA_DATAOUT + sg_id * 2]; + oaddr = targdata->dsa[DSA_DATAOUT + sg_id * 2 + 1]; + residual = datapath_residual (host); + naddr = NCR_read32(DNAD_REG) - residual; + nlen = (NCR_read32(DBC_REG) & 0x00ffffff) + residual; + DEB(DEB_PMM, printk("scsi%d: DOUT sg %d, old %08x/%08x, new %08x/%08x (%d)\n", + host->host_no, sg_id, oaddr, olen, naddr, nlen, residual)); + if (oaddr+olen != naddr+nlen) { + printk("scsi%d: PMM DOUT counts error: 0x%x + 0x%x != 0x%x + 0x%x", + host->host_no, oaddr, olen, naddr, nlen); + } + else { + targdata->dsa[DSA_DATAOUT + sg_id * 2] = nlen; + targdata->dsa[DSA_DATAOUT + sg_id * 2 + 1] = naddr; + resume_offset = Ent_resume_pmm; + } + } + else { + printk("scsi%d: Unexpected phase change to %s at index 0x%x\n", + host->host_no, sbcl_to_phase(sbcl), index); + /* resume_offset is zero, which will cause a host reset */ + } + /* Flush DMA FIFO */ + NCR_write8 (CTEST8_REG, CTEST8_10_CLF); + while (NCR_read8 (CTEST8_REG) & CTEST8_10_CLF); + + return resume_offset; +} + + +static u32 +handle_script_int(struct Scsi_Host * host, Scsi_Cmnd * cmd) +{ + struct sim710_hostdata *hostdata = + (struct sim710_hostdata *)host->hostdata[0]; + struct sim710_target *targdata = hostdata->target + cmd->target; + u32 dsps, resume_offset = 0; + unsigned char sbcl; + + dsps = NCR_read32(DSPS_REG); + + switch (dsps) { + case A_int_cmd_complete: + cmd->result = targdata->dsa_status[0]; + SCSI_DONE(cmd); + targdata->cur_cmd = NULL; + resume_offset = Ent_reselect; + break; + case A_int_msg_sdtr1: + resume_offset = handle_sdtr(host, cmd, + Ent_resume_msgin1a, Ent_resume_msgin1b); + break; + case A_int_msg_sdtr2: + resume_offset = handle_sdtr(host, cmd, 0, Ent_resume_msgin2b); + break; + case A_int_msg_sdtr3: + resume_offset = handle_sdtr(host, cmd, 0, Ent_resume_msgin3b); + break; + case A_int_disc1: + /* Disconnect before command - not expected */ + targdata->resume_offset = Ent_resume_msgin1a; + resume_offset = Ent_reselect; + break; + case A_int_disc2: + /* Disconnect after command - just wait for a reselect */ + targdata->resume_offset = Ent_resume_msgin2a; + resume_offset = Ent_reselect; + break; + case A_int_disc3: + /* Disconnect after the data phase */ + targdata->resume_offset = Ent_resume_msgin3a; + resume_offset = Ent_reselect; + break; + case A_int_reselected: + hostdata->script[Ent_patch_output_data/4+1] = targdata->data_out_jump; + hostdata->script[Ent_patch_input_data/4+1] = targdata->data_in_jump; + NCR_write32(DSA_REG, virt_to_bus(targdata->dsa)); + resume_offset = targdata->resume_offset; + break; + case A_int_data_bad_phase: + sbcl = NCR_read8(SBCL_REG) & SBCL_PHASE_MASK; + printk("scsi%d: int_data_bad_phase, phase %s (%x)\n", + host->host_no, sbcl_to_phase(sbcl), sbcl); + break; + case A_int_bad_extmsg1a: + case A_int_bad_extmsg1b: + case A_int_bad_extmsg2a: + case A_int_bad_extmsg2b: + case A_int_bad_extmsg3a: + case A_int_bad_extmsg3b: + case A_int_bad_msg1: + case A_int_bad_msg2: + case A_int_bad_msg3: + case A_int_cmd_bad_phase: + case A_int_no_msgout1: + case A_int_no_msgout2: + case A_int_no_msgout3: + case A_int_not_cmd_complete: + case A_int_sel_no_ident: + case A_int_sel_not_cmd: + case A_int_status_not_msgin: + case A_int_resel_not_msgin: + case A_int_selected: + case A_int_not_rej: + default: + sbcl = NCR_read8(SBCL_REG) & SBCL_PHASE_MASK; + printk("scsi%d: Unimplemented script interrupt: %08x, phase %s\n", + host->host_no, dsps, sbcl_to_phase(sbcl)); + sim710_errors++; + /* resume_offset is zero, which will cause a host reset */ + } + return resume_offset; +} + + +/* A quick wrapper for sim710_intr_handle to grab the spin lock */ + +static void +do_sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs) +{ + unsigned long flags; + + spin_lock_irqsave(&io_request_lock, flags); + sim710_intr_handle(irq, dev_id, regs); + spin_unlock_irqrestore(&io_request_lock, flags); +} + + +/* A "high" level interrupt handler */ + +static void +sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs) +{ + unsigned int flags; + struct Scsi_Host * host = (struct Scsi_Host *)dev_id; + struct sim710_hostdata *hostdata = (struct sim710_hostdata *)host->hostdata[0]; + Scsi_Cmnd * cmd; + unsigned char istat, dstat; + unsigned char sstat0; + u32 dsps, resume_offset = 0; + + save_flags(flags); + cli(); + sim710_intrs++; + while ((istat = NCR_read8(ISTAT_REG)) & (ISTAT_SIP|ISTAT_DIP)) { + dsps = NCR_read32(DSPS_REG); + hostdata->state = STATE_HALTED; + sstat0 = dstat = 0; + if (istat & ISTAT_SIP) { + sstat0 = NCR_read8(SSTAT0_REG); + } + if (istat & ISTAT_DIP) { + udelay(10); /* Some comment somewhere about 10cycles + * between accesses to sstat0 and dstat ??? */ + dstat = NCR_read8(DSTAT_REG); + } + DEB(DEB_INTS, printk("scsi%d: Int %d, istat %02x, sstat0 %02x " + "dstat %02x, dsp [%04x], scratch %02x\n", + host->host_no, sim710_intrs, istat, sstat0, dstat, + (u32 *)(bus_to_virt(NCR_read32(DSP_REG))) - hostdata->script, + NCR_read32(SCRATCH_REG))); + if ((dstat & DSTAT_SIR) && dsps == A_int_reselected) { + /* Reselected. Identify the target from LCRC_REG, and + * update current command. If we were trying to select + * a device, then that command needs to go back on the + * issue_queue for later. + */ + unsigned char lcrc = NCR_read8(LCRC_REG_10); + int id = 0; + + if (!(lcrc & 0x7f)) { + printk("scsi%d: Reselected with LCRC = %02x\n", + host->host_no, lcrc); + cmd = NULL; + } + else { + while (!(lcrc & 1)) { + id++; + lcrc >>= 1; + } + DEB(DEB_DISC, printk("scsi%d: Reselected by ID %d\n", + host->host_no, id)); + if (hostdata->running) { + /* Clear SIGP */ + (void)NCR_read8(CTEST2_REG_700); + + DEB(DEB_DISC, printk("scsi%d: Select of %d interrupted " + "by reselect from %d (%p)\n", + host->host_no, hostdata->running->target, + id, hostdata->target[id].cur_cmd)); + cmd = hostdata->running; + hostdata->target[cmd->target].cur_cmd = NULL; + cmd->SCp.ptr = (unsigned char *) hostdata->issue_queue; + hostdata->issue_queue = cmd; + } + cmd = hostdata->running = hostdata->target[id].cur_cmd; + } + } + else + cmd = hostdata->running; + + if (!cmd) { + printk("scsi%d: No active command!\n", host->host_no); + printk("scsi%d: Int %d, istat %02x, sstat0 %02x " + "dstat %02x, dsp [%04x], scratch %02x, dsps %08x\n", + host->host_no, sim710_intrs, istat, sstat0, dstat, + (u32 *)(bus_to_virt(NCR_read32(DSP_REG))) - hostdata->script, + NCR_read32(SCRATCH_REG), dsps); + /* resume_offset is zero, which will cause a host reset */ + } + else if (sstat0 & SSTAT0_700_STO) { + DEB(DEB_TOUT, printk("scsi%d: Selection timeout\n", host->host_no)); + cmd->result = DID_NO_CONNECT << 16; + SCSI_DONE(cmd); + hostdata->target[cmd->target].cur_cmd = NULL; + resume_offset = Ent_reselect; + } + else if (dstat & DSTAT_SIR) + resume_offset = handle_script_int(host, cmd); + else if (sstat0 & SSTAT0_MA) { + resume_offset = handle_phase_mismatch(host, cmd); + } + else if (sstat0 & (SSTAT0_MA|SSTAT0_SGE|SSTAT0_UDC|SSTAT0_RST|SSTAT0_PAR)) { + printk("scsi%d: Serious error, sstat0 = %02x\n", host->host_no, + sstat0); + sim710_errors++; + /* resume_offset is zero, which will cause a host reset */ + } + else if (dstat & (DSTAT_BF|DSTAT_ABRT|DSTAT_SSI|DSTAT_WTD)) { + printk("scsi%d: Serious error, dstat = %02x\n", host->host_no, + dstat); + sim710_errors++; + /* resume_offset is zero, which will cause a host reset */ + } + else if (dstat & DSTAT_IID) { + /* This can be due to a quick reselect while doing a WAIT + * DISCONNECT. + */ + resume_offset = handle_idd(host, cmd); + } + else { + sim710_errors++; + printk("scsi%d: Spurious interrupt!\n", host->host_no); + /* resume_offset is zero, which will cause a host reset */ + } + } + + if (resume_offset) { + if (resume_offset == Ent_reselect) { + hostdata->running = NULL; + hostdata->state = STATE_IDLE; + } + else + hostdata->state = STATE_BUSY; + DEB(DEB_RESUME, printk("scsi%d: Resuming at script[0x%x]\n", + host->host_no, resume_offset/4)); +#ifdef DEBUG_LIMIT_INTS + if (sim710_intrs < DEBUG_LIMIT_INTS) +#endif + NCR_write32(DSP_REG, virt_to_bus(hostdata->script+resume_offset/4)); + if (resume_offset == Ent_reselect) + run_process_issue_queue(hostdata); + } + else { + printk("scsi%d: Failed to handle interrupt. Failing commands " + "and resetting SCSI bus and chip\n", host->host_no); + mdelay(4000); /* Give chance to read screen!! */ + full_reset(host); + } + + restore_flags(flags); +} + + +static void +run_command (struct sim710_hostdata *hostdata, Scsi_Cmnd *cmd) +{ + struct Scsi_Host *host = cmd->host; + struct sim710_target *targdata = hostdata->target + cmd->target; + int i, datain, dataout, sg_start; + u32 *dip, *dop, dsa; + + DEB(DEB_CMND, printk("scsi%d: id%d starting ", host->host_no, + cmd->target)); + DEB(DEB_CMND, print_command(cmd->cmnd)); + + switch (cmd->cmnd[0]) { + case INQUIRY: + case MODE_SENSE: + case READ_6: + case READ_10: + case READ_CAPACITY: + case REQUEST_SENSE: + case READ_BLOCK_LIMITS: + case READ_TOC: + datain = 1; + dataout = 0; + break; + case MODE_SELECT: + case WRITE_6: + case WRITE_10: + datain = 0; + dataout = 1; + break; + case TEST_UNIT_READY: + case ALLOW_MEDIUM_REMOVAL: + case START_STOP: + datain = dataout = 0; + break; + default: + datain = dataout = 1; + } + + memcpy(targdata->dsa_cdb, cmd->cmnd, MAX_CMND); + + targdata->dsa_msgout[0] = + IDENTIFY((opt_nodisc & (1<target)) ? 0 : 1 ,0); + if (hostdata->negotiate & (1 << cmd->target)) { + if (opt_noneg & (1 << cmd->target)) { + hostdata->negotiate ^= (1 << cmd->target); + targdata->dsa[DSA_MSGOUT] = 1; + } + else { + DEB(DEB_SYNC, printk("scsi%d: Negotiating async transfers " + "for ID %d\n", + host->host_no, cmd->target)); + memcpy(targdata->dsa_msgout+1, async_message, sizeof(async_message)); + targdata->dsa[DSA_MSGOUT] = sizeof(async_message) + 1; + } + } + else + targdata->dsa[DSA_MSGOUT] = 1; + + targdata->dsa_msgin[0] = 0xff; + targdata->dsa_status[0] = 0xff; + + targdata->dsa[DSA_SELECT] = (1 << cmd->target) << 16; + targdata->dsa[DSA_MSGOUT+1] = virt_to_bus(targdata->dsa_msgout); + targdata->dsa[DSA_CMND] = cmd->cmd_len; + targdata->dsa[DSA_CMND+1] = virt_to_bus(targdata->dsa_cdb); + targdata->dsa[DSA_STATUS] = 1; + targdata->dsa[DSA_STATUS+1] = virt_to_bus(targdata->dsa_status); + targdata->dsa[DSA_MSGIN] = 1; + targdata->dsa[DSA_MSGIN+1] = virt_to_bus(targdata->dsa_msgin); + + sg_start = (MAX_SG - (cmd->use_sg ? cmd->use_sg : 1)) * 2; + dip = targdata->dsa + DSA_DATAIN + sg_start; + dop = targdata->dsa + DSA_DATAOUT + sg_start; + + for (i = 0; cmd->use_sg ? (i < cmd->use_sg) : !i; i++) { + u32 vbuf = cmd->use_sg ? + (u32)(((struct scatterlist *)cmd->buffer)[i].address) : + (u32)(cmd->request_buffer); + u32 bbuf = virt_to_bus((void *)vbuf); + u32 cnt = cmd->use_sg ? + ((struct scatterlist *)cmd->buffer)[i].length : + cmd->request_bufflen; + + if (datain) { +#ifdef CONFIG_TP34V_SCSI + cache_clear(virt_to_phys((void *)vbuf), cnt); +#endif + *dip++ = cnt; + *dip++ = bbuf; + } + if (dataout) { +#ifdef CONFIG_TP34V_SCSI + cache_push(virt_to_phys((void *)vbuf), cnt); +#endif + *dop++ = cnt; + *dop++ = bbuf; + } + } + targdata->data_out_jump = hostdata->script[Ent_patch_output_data/4+1] = + virt_to_bus(hostdata->script + Ent_patch_output_data/4 + sg_start + 2); + targdata->data_in_jump = hostdata->script[Ent_patch_input_data/4+1] = + virt_to_bus(hostdata->script + Ent_patch_input_data/4 + sg_start + 2); + + for (i = 0, dsa = virt_to_bus(targdata->dsa); i < 4; i++) { + u32 v = hostdata->script[Ent_patch_new_dsa/4 + i * 2]; + + v &= ~0x0000ff00; + v |= (dsa & 0xff) << 8; + hostdata->script[Ent_patch_new_dsa/4 + i * 2] = v; + dsa >>= 8; + } + hostdata->running = targdata->cur_cmd = cmd; + hostdata->state = STATE_BUSY; + + NCR_write8(ISTAT_REG, ISTAT_10_SIGP); +} + + +static volatile int process_issue_queue_running = 0; + +static __inline__ void +run_process_issue_queue(struct sim710_hostdata *hostdata) +{ + unsigned long flags; + save_flags (flags); + cli(); + if (!process_issue_queue_running) { + process_issue_queue_running = 1; + process_issue_queue(hostdata, flags); + /* + * process_issue_queue_running is cleared in process_issue_queue + * once it can't do more work, and process_issue_queue exits with + * interrupts disabled. + */ + } + restore_flags (flags); +} + + +/* + * Function : process_issue_queue (hostdata, flags) + * + * Purpose : Start next command for any idle target. + * + * NOTE : process_issue_queue exits with interrupts *disabled*, so the + * caller must reenable them if it desires. + * + * NOTE : process_issue_queue should be called from both + * sim710_queue_command() and from the interrupt handler + * after command completion. + */ + +static void +process_issue_queue (struct sim710_hostdata *hostdata, unsigned long flags) +{ + Scsi_Cmnd *tmp, *prev; + int done; + + /* + * We run (with interrupts disabled) until we're sure that none of + * the host adapters have anything that can be done, at which point + * we set process_issue_queue_running to 0 and exit. + * + * Interrupts are enabled before doing various other internal + * instructions, after we've decided that we need to run through + * the loop again. + * + */ + + do { + cli(); /* Freeze request queues */ + done = 1; + if (hostdata->issue_queue) { + if (hostdata->state == STATE_DISABLED) { + tmp = (Scsi_Cmnd *) hostdata->issue_queue; + hostdata->issue_queue = (Scsi_Cmnd *) tmp->SCp.ptr; + tmp->result = (DID_BAD_TARGET << 16); + tmp->scsi_done (tmp); + done = 0; + } + else if (hostdata->state == STATE_IDLE) { + for (tmp = hostdata->issue_queue, prev = NULL; tmp; + prev = tmp, tmp = (Scsi_Cmnd *) tmp->SCp.ptr) { + if (hostdata->target[tmp->target].cur_cmd == NULL) { + if (prev) + prev->SCp.ptr = tmp->SCp.ptr; + else + hostdata->issue_queue = (Scsi_Cmnd *) tmp->SCp.ptr; + tmp->SCp.ptr = NULL; + run_command (hostdata, tmp); + done = 0; + } /* if target/lun is not busy */ + } /* scan issue queue for work */ + } /* host is idle */ + } /* if hostdata->issue_queue */ + if (!done) + restore_flags (flags); + } while (!done); + process_issue_queue_running = 0; +} + + +int +sim710_queuecommand(Scsi_Cmnd * cmd, void (*done)(Scsi_Cmnd *)) +{ + struct Scsi_Host *host = cmd->host; + struct sim710_hostdata *hostdata = (struct sim710_hostdata *)host->hostdata[0]; + Scsi_Cmnd *tmp; + unsigned long flags; + + if (cmd->lun) { + /* Silently ignore luns other than zero! */ + cmd->result = (DID_BAD_TARGET << 16); + done(cmd); + return 0; + } + + DEB(DEB_CMND, printk("scsi%d: id%d queuing ", host->host_no, + cmd->target)); + DEB(DEB_CMND, print_command(cmd->cmnd)); + + cmd->scsi_done = done; + cmd->host_scribble = NULL; + cmd->SCp.ptr = NULL; + cmd->SCp.buffer = NULL; + + save_flags(flags); + cli(); + + if (ignore_ids & (1 << cmd->target)) { + printk("scsi%d: ignoring target %d\n", host->host_no, cmd->target); + cmd->result = (DID_BAD_TARGET << 16); + done(cmd); + restore_flags (flags); + return 0; + } +#ifdef DEBUG_LIMIT_INTS + if (sim710_intrs > DEBUG_LIMIT_INTS) { + cmd->result = (DID_BAD_TARGET << 16); + done(cmd); + restore_flags (flags); + return 0; + } +#endif + if (cmd->use_sg > MAX_SG) + panic ("cmd->use_sg = %d\n", cmd->use_sg); + + if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) { + cmd->SCp.ptr = (unsigned char *) hostdata->issue_queue; + hostdata->issue_queue = cmd; + } else { + for (tmp = hostdata->issue_queue; tmp->SCp.ptr; + tmp = (Scsi_Cmnd *) tmp->SCp.ptr); + tmp->SCp.ptr = (unsigned char *) cmd; + } + restore_flags (flags); + run_process_issue_queue(hostdata); + return 0; +} + + +int +sim710_detect(Scsi_Host_Template * tpnt) +{ + unsigned char irq_vector; + unsigned char scsi_id; + unsigned int base_addr; + struct Scsi_Host * host = NULL; + struct sim710_hostdata *hostdata; + int chips = 0; + int indx; + int revision; + int order, size; + +#ifdef MODULE + if (sim710) + sim710_setup(sim710, (int *)0); +#endif + + if (no_of_boards < 0) { + printk("sim710: NCR53C710 driver disabled\n"); + return 0; + } + +#ifdef CONFIG_MCA + /* If board details have been specified via boot/module parameters, + * then don't bother probing. + */ + if (no_of_boards == 0) { + int slot; + int pos[3]; + int mca_53c710_ids[] = MCA_53C710_IDS; + int *id_to_check = mca_53c710_ids; + static int io_004f_by_pos[] = MCA_004F_IO_PORTS; + static int irq_004f_by_pos[] = MCA_004F_IRQS; + static int io_01bb_by_pos[] = MCA_01BB_IO_PORTS; + static int irq_01bb_by_pos[] = MCA_01BB_IRQS; + + while ( *id_to_check && no_of_boards < MAXBOARDS) { + if (!MCA_bus) + return 0; + + if ((slot = mca_find_adapter(*id_to_check, 0)) != MCA_NOTFOUND) { + + pos[0] = mca_read_stored_pos(slot, 2); + pos[1] = mca_read_stored_pos(slot, 3); + pos[2] = mca_read_stored_pos(slot, 4); + + /* + * 01BB & 01BA port base by bits 7,6,5,4,3,2 in pos[2] + * + * 000000 001010 0x2800 + * 000001 001011 0x2C00 + * 000010 0x0800 001100 0x3000 + * 000011 0x0C00 001101 0x3400 + * 000100 0x1000 001110 0x3800 + * 000101 0x1400 001111 0x3C00 + * 000110 0x1800 010000 0x4000 + * 000111 0x1C00 010001 0x4400 + * 001000 0x2000 010010 0x4800 + * 001001 0x2400 010011 0x4C00 + * 010100 0x5000 + * + * 00F4 port base by bits 3,2,1 in pos[0] + * + * 000 001 0x200 + * 010 0x300 011 0x400 + * 100 0x500 101 0x600 + * + * 01BB & 01BA IRQ is specified in pos[0] bits 7 and 6: + * + * 00 3 10 11 + * 01 5 11 14 + * + * 00F4 IRQ specified by bits 6,5,4 in pos[0] + * + * 100 5 101 9 + * 110 14 + */ + + if ( *id_to_check == 0x01bb || *id_to_check == 0x01ba ) { + bases[no_of_boards] = io_01bb_by_pos[(pos[2] & 0xFC) >> 2]; + irq_vectors[no_of_boards] = + irq_01bb_by_pos[((pos[0] & 0xC0) >> 6)]; + if (bases[no_of_boards] == 0x0000) + printk("sim710: NCR53C710 Adapter ID 0x01bb is disabled.\n"); + else { + no_of_boards++; + if ( *id_to_check == 0x01bb ) + mca_set_adapter_name( slot, + "NCR 3360/3430 SCSI SubSystem" ); + else + mca_set_adapter_name(slot, + "NCR Dual SIOP SCSI Host Adapter Board"); + } + } + else if ( *id_to_check == 0x004f ) { + bases[no_of_boards] = io_004f_by_pos[((pos[0] & 0x0E) >> 1)]; + irq_vectors[no_of_boards] = + irq_004f_by_pos[((pos[0] & 0x70) >> 4) - 4]; + if (bases[no_of_boards] == 0x0000) + printk("sim710: NCR53C710 Adapter ID 0x004f is disabled.\n"); + else { + no_of_boards++; + mca_set_adapter_name(slot, + "NCR 53c710 SCSI Host Adapter Board"); + } + } + } + id_to_check++; + } + } +#endif + + if (!no_of_boards) { + printk("sim710: No NCR53C710 adapter found.\n"); + return 0; + } + + size = sizeof(struct sim710_hostdata); + order = 0; + while (size > (PAGE_SIZE << order)) + order++; + size = PAGE_SIZE << order; + + DEB(DEB_ANY, printk("sim710: hostdata %d bytes, size %d, order %d\n", + sizeof(struct sim710_hostdata), size, order)); + + tpnt->proc_dir = &proc_scsi_sim710; + + for(indx = 0; indx < no_of_boards; indx++) { + host = scsi_register(tpnt, 4); + host->hostdata[0] = __get_free_pages(GFP_ATOMIC, order); + if (host->hostdata[0] == 0) + panic ("sim710: Couldn't get hostdata memory"); + hostdata = (struct sim710_hostdata *)host->hostdata[0]; + memset(hostdata, 0, size); +#ifdef CONFIG_TP34V_SCSI + cache_push(virt_to_phys(hostdata), size); + cache_clear(virt_to_phys(hostdata), size); + kernel_set_cachemode((void *)hostdata,size,IOMAP_NOCACHE_SER); +#endif + scsi_id = 7; + base_addr = bases[indx]; + irq_vector = irq_vectors[indx]; + printk("sim710: Configuring Sim710 (SCSI-ID %d) at %x, IRQ %d\n", + scsi_id, base_addr, irq_vector); + DEB(DEB_ANY, printk("sim710: hostdata = %p (%d bytes), dsa0 = %p\n", + hostdata, sizeof(struct sim710_hostdata), + hostdata->target[0].dsa)); + hostdata->chip = indx; + host->irq = irq_vector; + host->this_id = scsi_id; + host->unique_id = base_addr; + host->base = (char *)base_addr; + + ncr_halt(host); + + revision = (NCR_read8(CTEST8_REG) & 0xF0) >> 4; + printk("scsi%d: Revision 0x%x\n",host->host_no,revision); + + sim710_soft_reset(host); + + sim710_driver_init(host); + +#ifdef CONFIG_TP34V_SCSI + if (request_irq(irq_vector,do_sim710_intr_handle, 0, "sim710", host)) +#else + if (request_irq(irq_vector,do_sim710_intr_handle, SA_INTERRUPT, "sim710", host)) +#endif + { + printk("scsi%d : IRQ%d not free, detaching\n", + host->host_no, host->irq); + + scsi_unregister (host); + } + else { +#ifdef IO_MAPPED + request_region((u32)host->base, 64, "sim710"); +#endif + chips++; + } + NCR_write32(DSP_REG, virt_to_bus(hostdata->script+Ent_reselect/4)); + hostdata->state = STATE_IDLE; + } + return chips; +} + +int +sim710_abort(Scsi_Cmnd * cmd) +{ + struct Scsi_Host * host = cmd->host; + + printk("scsi%d: Unable to abort command for target %d\n", + host->host_no, cmd->target); + return FAILED; +} + +/* + * This is a device reset. Need to select and send a Bus Device Reset msg. + */ + +int +sim710_dev_reset(Scsi_Cmnd * SCpnt) +{ + struct Scsi_Host * host = SCpnt->host; + + printk("scsi%d: Unable to send Bus Device Reset for target %d\n", + host->host_no, SCpnt->target); + return FAILED; +} + +/* + * This is bus reset. We need to reset the bus and fail any active commands. + */ + +int +sim710_bus_reset(Scsi_Cmnd * SCpnt) +{ + struct Scsi_Host * host = SCpnt->host; + + printk("scsi%d: Unable to do SCSI bus reset\n", host->host_no); + return FAILED; +} + +static int +full_reset(struct Scsi_Host * host) +{ + struct sim710_hostdata *hostdata = (struct sim710_hostdata *) + host->hostdata[0]; + int target; + Scsi_Cmnd *cmd; + + ncr_halt(host); + printk("scsi%d: dsp = %08x (script[0x%04x]), scratch = %08x\n", + host->host_no, NCR_read32(DSP_REG), + ((u32)bus_to_virt(NCR_read32(DSP_REG)) - (u32)hostdata->script)/4, + NCR_read32(SCRATCH_REG)); + + for (target = 0; target < 7; target++) { + if ((cmd = hostdata->target[target].cur_cmd)) { + printk("scsi%d: Failing command for ID%d\n", + host->host_no, target); + cmd->result = DID_RESET << 16; + cmd->scsi_done(cmd); + hostdata->target[target].cur_cmd = NULL; + } + } + + sim710_soft_reset(host); + sim710_driver_init(host); + + NCR_write32(DSP_REG, virt_to_bus(hostdata->script+Ent_reselect/4)); + hostdata->state = STATE_IDLE; + + run_process_issue_queue(hostdata); + + return SUCCESS; +} + +/* + * This is host reset. We need to reset the chip and the bus. + */ + +int +sim710_host_reset(Scsi_Cmnd * SCpnt) +{ + struct Scsi_Host * host = SCpnt->host; + + printk("scsi%d: >>>>>>>>>>>> Host reset <<<<<<<<<<<<\n", host->host_no); + + return full_reset(host); +} + +#ifdef MODULE + +int +sim710_release(struct Scsi_Host *host) +{ + free_irq(host->irq, host); +#ifdef IO_MAPPED + release_region((u32)host->base, 64); +#endif + return 1; +} + +Scsi_Host_Template driver_template = SIM710_SCSI; + +#include "scsi_module.c" +#endif diff --git a/drivers/scsi/sim710.h b/drivers/scsi/sim710.h new file mode 100644 index 000000000000..5511ed455777 --- /dev/null +++ b/drivers/scsi/sim710.h @@ -0,0 +1,845 @@ +#ifndef _SIM710_H +#define _SIM710_H + +/* + * sim710.h - Copyright (C) 1999 Richard Hirst + */ + +#include + +int sim710_detect(Scsi_Host_Template *); +int sim710_command(Scsi_Cmnd *); +int sim710_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +int sim710_abort(Scsi_Cmnd * SCpnt); +int sim710_bus_reset(Scsi_Cmnd * SCpnt); +int sim710_dev_reset(Scsi_Cmnd * SCpnt); +int sim710_host_reset(Scsi_Cmnd * SCpnt); +int sim710_biosparam(Disk *, kdev_t, int*); +#ifdef MODULE +int sim710_release(struct Scsi_Host *); +#else +#define sim710_release NULL +#endif + +#if defined(HOSTS_C) || defined(MODULE) +#include + +extern struct proc_dir_entry proc_scsi_sim710; + +#define SIM710_SCSI { proc_dir: &proc_scsi_sim710, \ + name: "Simple 53c710", \ + detect: sim710_detect, \ + release: sim710_release, \ + queuecommand: sim710_queuecommand, \ + eh_abort_handler: sim710_abort, \ + eh_device_reset_handler: sim710_dev_reset, \ + eh_bus_reset_handler: sim710_bus_reset, \ + eh_host_reset_handler: sim710_host_reset, \ + bios_param: scsicam_bios_param, \ + can_queue: 8, \ + this_id: 7, \ + sg_tablesize: 128, \ + cmd_per_lun: 1, \ + use_clustering: DISABLE_CLUSTERING, \ + use_new_eh_code: 1} + +#endif + +#ifndef HOSTS_C + +#ifdef __BIG_ENDIAN +#define bE 3 /* 0 for little endian, 3 for big endian */ +#else +#define bE 0 +#endif + +/* SCSI control 0 rw, default = 0xc0 */ +#define SCNTL0_REG (0x00^bE) +#define SCNTL0_ARB1 0x80 /* 0 0 = simple arbitration */ +#define SCNTL0_ARB2 0x40 /* 1 1 = full arbitration */ +#define SCNTL0_STRT 0x20 /* Start Sequence */ +#define SCNTL0_WATN 0x10 /* Select with ATN */ +#define SCNTL0_EPC 0x08 /* Enable parity checking */ +/* Bit 2 is reserved on 800 series chips */ +#define SCNTL0_EPG_700 0x04 /* Enable parity generation */ +#define SCNTL0_AAP 0x02 /* ATN/ on parity error */ +#define SCNTL0_TRG 0x01 /* Target mode */ + +/* SCSI control 1 rw, default = 0x00 */ + +#define SCNTL1_REG (0x01^bE) +#define SCNTL1_EXC 0x80 /* Extra Clock Cycle of Data setup */ +#define SCNTL1_ADB 0x40 /* contents of SODL on bus */ +#define SCNTL1_ESR_700 0x20 /* Enable SIOP response to selection + and reselection */ +#define SCNTL1_CON 0x10 /* Connected */ +#define SCNTL1_RST 0x08 /* SCSI RST/ */ +#define SCNTL1_AESP 0x04 /* Force bad parity */ +#define SCNTL1_SND_700 0x02 /* Start SCSI send */ +#define SCNTL1_IARB_800 0x02 /* Immediate Arbitration, start + arbitration immediately after + busfree is detected */ +#define SCNTL1_RCV_700 0x01 /* Start SCSI receive */ +#define SCNTL1_SST_800 0x01 /* Start SCSI transfer */ + +/* SCSI control 2 rw, */ + +#define SCNTL2_REG_800 (0x02^bE) +#define SCNTL2_800_SDU 0x80 /* SCSI disconnect unexpected */ + +/* SCSI control 3 rw */ + +#define SCNTL3_REG_800 (0x03^bE) +#define SCNTL3_800_SCF_SHIFT 4 +#define SCNTL3_800_SCF_MASK 0x70 +#define SCNTL3_800_SCF2 0x40 /* Synchronous divisor */ +#define SCNTL3_800_SCF1 0x20 /* 0x00 = SCLK/3 */ +#define SCNTL3_800_SCF0 0x10 /* 0x10 = SCLK/1 */ + /* 0x20 = SCLK/1.5 + 0x30 = SCLK/2 + 0x40 = SCLK/3 */ + +#define SCNTL3_800_CCF_SHIFT 0 +#define SCNTL3_800_CCF_MASK 0x07 +#define SCNTL3_800_CCF2 0x04 /* 0x00 50.01 to 66 */ +#define SCNTL3_800_CCF1 0x02 /* 0x01 16.67 to 25 */ +#define SCNTL3_800_CCF0 0x01 /* 0x02 25.01 - 37.5 + 0x03 37.51 - 50 + 0x04 50.01 - 66 */ + +/* + * SCSI destination ID rw - the appropriate bit is set for the selected + * target ID. This is written by the SCSI SCRIPTS processor. + * default = 0x00 + */ +#define SDID_REG_700 (0x02^bE) +#define SDID_REG_800 (0x06^bE) + +#define GP_REG_800 (0x07^bE) /* General purpose IO */ +#define GP_800_IO1 0x02 +#define GP_800_IO2 0x01 + +/* SCSI interrupt enable rw, default = 0x00 */ +#define SIEN_REG_700 (0x03^bE) +#define SIEN0_REG_800 (0x40^bE) +#define SIEN_MA 0x80 /* Phase mismatch (ini) or ATN (tgt) */ +#define SIEN_FC 0x40 /* Function complete */ +#define SIEN_700_STO 0x20 /* Selection or reselection timeout */ +#define SIEN_800_SEL 0x20 /* Selected */ +#define SIEN_700_SEL 0x10 /* Selected or reselected */ +#define SIEN_800_RESEL 0x10 /* Reselected */ +#define SIEN_SGE 0x08 /* SCSI gross error */ +#define SIEN_UDC 0x04 /* Unexpected disconnect */ +#define SIEN_RST 0x02 /* SCSI RST/ received */ +#define SIEN_PAR 0x01 /* Parity error */ + +/* + * SCSI chip ID rw + * NCR53c700 : + * When arbitrating, the highest bit is used, when reselection or selection + * occurs, the chip responds to all IDs for which a bit is set. + * default = 0x00 + */ +#define SCID_REG (0x04^bE) +/* Bit 7 is reserved on 800 series chips */ +#define SCID_800_RRE 0x40 /* Enable response to reselection */ +#define SCID_800_SRE 0x20 /* Enable response to selection */ +/* Bits four and three are reserved on 800 series chips */ +#define SCID_800_ENC_MASK 0x07 /* Encoded SCSI ID */ + +/* SCSI transfer rw, default = 0x00 */ +#define SXFER_REG (0x05^bE) +#define SXFER_DHP 0x80 /* Disable halt on parity */ + +#define SXFER_TP2 0x40 /* Transfer period msb */ +#define SXFER_TP1 0x20 +#define SXFER_TP0 0x10 /* lsb */ +#define SXFER_TP_MASK 0x70 +/* FIXME : SXFER_TP_SHIFT == 5 is right for '8xx chips */ +#define SXFER_TP_SHIFT 5 +#define SXFER_TP_4 0x00 /* Divisors */ +#define SXFER_TP_5 0x10<<1 +#define SXFER_TP_6 0x20<<1 +#define SXFER_TP_7 0x30<<1 +#define SXFER_TP_8 0x40<<1 +#define SXFER_TP_9 0x50<<1 +#define SXFER_TP_10 0x60<<1 +#define SXFER_TP_11 0x70<<1 + +#define SXFER_MO3 0x08 /* Max offset msb */ +#define SXFER_MO2 0x04 +#define SXFER_MO1 0x02 +#define SXFER_MO0 0x01 /* lsb */ +#define SXFER_MO_MASK 0x0f +#define SXFER_MO_SHIFT 0 + +/* + * SCSI output data latch rw + * The contents of this register are driven onto the SCSI bus when + * the Assert Data Bus bit of the SCNTL1 register is set and + * the CD, IO, and MSG bits of the SOCL register match the SCSI phase + */ +#define SODL_REG_700 (0x06^bE) +#define SODL_REG_800 (0x54^bE) + + +/* + * SCSI output control latch rw, default = 0 + * Note that when the chip is being manually programmed as an initiator, + * the MSG, CD, and IO bits must be set correctly for the phase the target + * is driving the bus in. Otherwise no data transfer will occur due to + * phase mismatch. + */ + +#define SOCL_REG (0x07^bE) +#define SOCL_REQ 0x80 /* REQ */ +#define SOCL_ACK 0x40 /* ACK */ +#define SOCL_BSY 0x20 /* BSY */ +#define SOCL_SEL 0x10 /* SEL */ +#define SOCL_ATN 0x08 /* ATN */ +#define SOCL_MSG 0x04 /* MSG */ +#define SOCL_CD 0x02 /* C/D */ +#define SOCL_IO 0x01 /* I/O */ + +/* + * SCSI first byte received latch ro + * This register contains the first byte received during a block MOVE + * SCSI SCRIPTS instruction, including + * + * Initiator mode Target mode + * Message in Command + * Status Message out + * Data in Data out + * + * It also contains the selecting or reselecting device's ID and our + * ID. + * + * Note that this is the register the various IF conditionals can + * operate on. + */ +#define SFBR_REG (0x08^bE) + +/* + * SCSI input data latch ro + * In initiator mode, data is latched into this register on the rising + * edge of REQ/. In target mode, data is latched on the rising edge of + * ACK/ + */ +#define SIDL_REG_700 (0x09^bE) +#define SIDL_REG_800 (0x50^bE) + +/* + * SCSI bus data lines ro + * This register reflects the instantaneous status of the SCSI data + * lines. Note that SCNTL0 must be set to disable parity checking, + * otherwise reading this register will latch new parity. + */ +#define SBDL_REG_700 (0x0a^bE) +#define SBDL_REG_800 (0x58^bE) + +#define SSID_REG_800 (0x0a^bE) +#define SSID_800_VAL 0x80 /* Exactly two bits asserted at sel */ +#define SSID_800_ENCID_MASK 0x07 /* Device which performed operation */ + + + +/* + * SCSI bus control lines rw, + * instantaneous readout of control lines + */ +#define SBCL_REG (0x0b^bE) +#define SBCL_REQ 0x80 /* REQ ro */ +#define SBCL_ACK 0x40 /* ACK ro */ +#define SBCL_BSY 0x20 /* BSY ro */ +#define SBCL_SEL 0x10 /* SEL ro */ +#define SBCL_ATN 0x08 /* ATN ro */ +#define SBCL_MSG 0x04 /* MSG ro */ +#define SBCL_CD 0x02 /* C/D ro */ +#define SBCL_IO 0x01 /* I/O ro */ +#define SBCL_PHASE_CMDOUT SBCL_CD +#define SBCL_PHASE_DATAIN SBCL_IO +#define SBCL_PHASE_DATAOUT 0 +#define SBCL_PHASE_MSGIN (SBCL_CD|SBCL_IO|SBCL_MSG) +#define SBCL_PHASE_MSGOUT (SBCL_CD|SBCL_MSG) +#define SBCL_PHASE_STATIN (SBCL_CD|SBCL_IO) +#define SBCL_PHASE_MASK (SBCL_CD|SBCL_IO|SBCL_MSG) +/* + * Synchronous SCSI Clock Control bits + * 0 - set by DCNTL + * 1 - SCLK / 1.0 + * 2 - SCLK / 1.5 + * 3 - SCLK / 2.0 + */ +#define SBCL_SSCF1 0x02 /* wo, -66 only */ +#define SBCL_SSCF0 0x01 /* wo, -66 only */ +#define SBCL_SSCF_MASK 0x03 + +/* + * XXX note : when reading the DSTAT and STAT registers to clear interrupts, + * insure that 10 clocks elapse between the two + */ +/* DMA status ro */ +#define DSTAT_REG (0x0c^bE) +#define DSTAT_DFE 0x80 /* DMA FIFO empty */ +#define DSTAT_800_MDPE 0x40 /* Master Data Parity Error */ +#define DSTAT_BF 0x20 /* Bus Fault */ +#define DSTAT_ABRT 0x10 /* Aborted - set on error */ +#define DSTAT_SSI 0x08 /* SCRIPTS single step interrupt */ +#define DSTAT_SIR 0x04 /* SCRIPTS interrupt received - + set when INT instruction is + executed */ +#define DSTAT_WTD 0x02 /* Watchdog timeout detected */ +#define DSTAT_OPC 0x01 /* Illegal instruction */ +#define DSTAT_IID 0x01 /* Same thing, different name */ + + +#define SSTAT0_REG (0x0d^bE) /* SCSI status 0 ro */ +#define SIST0_REG_800 (0x42^bE) /* SCSI status 0 ro */ +#define SSTAT0_MA 0x80 /* ini : phase mismatch, + * tgt : ATN/ asserted + */ +#define SSTAT0_CMP 0x40 /* function complete */ +#define SSTAT0_700_STO 0x20 /* Selection or reselection timeout */ +#define SSTAT0_800_SEL 0x20 /* Selected */ +#define SSTAT0_700_SEL 0x10 /* Selected or reselected */ +#define SIST0_800_RSL 0x10 /* Reselected */ +#define SSTAT0_SGE 0x08 /* SCSI gross error */ +#define SSTAT0_UDC 0x04 /* Unexpected disconnect */ +#define SSTAT0_RST 0x02 /* SCSI RST/ received */ +#define SSTAT0_PAR 0x01 /* Parity error */ + +#define SSTAT1_REG (0x0e^bE) /* SCSI status 1 ro */ +#define SSTAT1_ILF 0x80 /* SIDL full */ +#define SSTAT1_ORF 0x40 /* SODR full */ +#define SSTAT1_OLF 0x20 /* SODL full */ +#define SSTAT1_AIP 0x10 /* Arbitration in progress */ +#define SSTAT1_LOA 0x08 /* Lost arbitration */ +#define SSTAT1_WOA 0x04 /* Won arbitration */ +#define SSTAT1_RST 0x02 /* Instant readout of RST/ */ +#define SSTAT1_SDP 0x01 /* Instant readout of SDP/ */ + +#define SSTAT2_REG (0x0f^bE) /* SCSI status 2 ro */ +#define SSTAT2_FF3 0x80 /* number of bytes in synchronous */ +#define SSTAT2_FF2 0x40 /* data FIFO */ +#define SSTAT2_FF1 0x20 +#define SSTAT2_FF0 0x10 +#define SSTAT2_FF_MASK 0xf0 +#define SSTAT2_FF_SHIFT 4 + +/* + * Latched signals, latched on the leading edge of REQ/ for initiators, + * ACK/ for targets. + */ +#define SSTAT2_SDP 0x08 /* SDP */ +#define SSTAT2_MSG 0x04 /* MSG */ +#define SSTAT2_CD 0x02 /* C/D */ +#define SSTAT2_IO 0x01 /* I/O */ +#define SSTAT2_PHASE_CMDOUT SSTAT2_CD +#define SSTAT2_PHASE_DATAIN SSTAT2_IO +#define SSTAT2_PHASE_DATAOUT 0 +#define SSTAT2_PHASE_MSGIN (SSTAT2_CD|SSTAT2_IO|SSTAT2_MSG) +#define SSTAT2_PHASE_MSGOUT (SSTAT2_CD|SSTAT2_MSG) +#define SSTAT2_PHASE_STATIN (SSTAT2_CD|SSTAT2_IO) +#define SSTAT2_PHASE_MASK (SSTAT2_CD|SSTAT2_IO|SSTAT2_MSG) + + +#define DSA_REG 0x10 /* DATA structure address */ + +#define CTEST0_REG_700 (0x14^bE) /* Chip test 0 ro */ +#define CTEST0_REG_800 (0x18^bE) /* Chip test 0 ro */ +/* 0x80 - 0x04 are reserved */ +#define CTEST0_700_RTRG 0x02 /* Real target mode */ +#define CTEST0_700_DDIR 0x01 /* Data direction, 1 = + * SCSI bus to host, 0 = + * host to SCSI. + */ + +#define CTEST1_REG_700 (0x15^bE) /* Chip test 1 ro */ +#define CTEST1_REG_800 (0x19^bE) /* Chip test 1 ro */ +#define CTEST1_FMT3 0x80 /* Identify which byte lanes are empty */ +#define CTEST1_FMT2 0x40 /* in the DMA FIFO */ +#define CTEST1_FMT1 0x20 +#define CTEST1_FMT0 0x10 + +#define CTEST1_FFL3 0x08 /* Identify which bytes lanes are full */ +#define CTEST1_FFL2 0x04 /* in the DMA FIFO */ +#define CTEST1_FFL1 0x02 +#define CTEST1_FFL0 0x01 + +#define CTEST2_REG_700 (0x16^bE) /* Chip test 2 ro */ +#define CTEST2_REG_800 (0x1a^bE) /* Chip test 2 ro */ + +#define CTEST2_800_DDIR 0x80 /* 1 = SCSI->host */ +#define CTEST2_800_SIGP 0x40 /* A copy of SIGP in ISTAT. + Reading this register clears */ +#define CTEST2_800_CIO 0x20 /* Configured as IO */. +#define CTEST2_800_CM 0x10 /* Configured as memory */ + +/* 0x80 - 0x40 are reserved on 700 series chips */ +#define CTEST2_700_SOFF 0x20 /* SCSI Offset Compare, + * As an initiator, this bit is + * one when the synchronous offset + * is zero, as a target this bit + * is one when the synchronous + * offset is at the maximum + * defined in SXFER + */ +#define CTEST2_700_SFP 0x10 /* SCSI FIFO parity bit, + * reading CTEST3 unloads a byte + * from the FIFO and sets this + */ +#define CTEST2_700_DFP 0x08 /* DMA FIFO parity bit, + * reading CTEST6 unloads a byte + * from the FIFO and sets this + */ +#define CTEST2_TEOP 0x04 /* SCSI true end of process, + * indicates a totally finished + * transfer + */ +#define CTEST2_DREQ 0x02 /* Data request signal */ +/* 0x01 is reserved on 700 series chips */ +#define CTEST2_800_DACK 0x01 + +/* + * Chip test 3 ro + * Unloads the bottom byte of the eight deep SCSI synchronous FIFO, + * check SSTAT2 FIFO full bits to determine size. Note that a GROSS + * error results if a read is attempted on this register. Also note + * that 16 and 32 bit reads of this register will cause corruption. + */ +#define CTEST3_REG_700 (0x17^bE) +/* Chip test 3 rw */ +#define CTEST3_REG_800 (0x1b^bE) +#define CTEST3_800_V3 0x80 /* Chip revision */ +#define CTEST3_800_V2 0x40 +#define CTEST3_800_V1 0x20 +#define CTEST3_800_V0 0x10 +#define CTEST3_800_FLF 0x08 /* Flush DMA FIFO */ +#define CTEST3_800_CLF 0x04 /* Clear DMA FIFO */ +#define CTEST3_800_FM 0x02 /* Fetch mode pin */ +/* bit 0 is reserved on 800 series chips */ + +#define CTEST4_REG_400 (0x18^bE) /* Chip test 4 rw */ +#define CTEST4_REG_800 (0x21^bE) /* Chip test 4 rw */ +/* 0x80 is reserved on 700 series chips */ +#define CTEST4_800_BDIS 0x80 /* Burst mode disable */ +#define CTEST4_ZMOD 0x40 /* High impedance mode */ +#define CTEST4_SZM 0x20 /* SCSI bus high impedance */ +#define CTEST4_700_SLBE 0x10 /* SCSI loopback enabled */ +#define CTEST4_800_SRTM 0x10 /* Shadow Register Test Mode */ +#define CTEST4_700_SFWR 0x08 /* SCSI FIFO write enable, + * redirects writes from SODL + * to the SCSI FIFO. + */ +#define CTEST4_800_MPEE 0x08 /* Enable parity checking + during master cycles on PCI + bus */ + +/* + * These bits send the contents of the CTEST6 register to the appropriate + * byte lane of the 32 bit DMA FIFO. Normal operation is zero, otherwise + * the high bit means the low two bits select the byte lane. + */ +#define CTEST4_FBL2 0x04 +#define CTEST4_FBL1 0x02 +#define CTEST4_FBL0 0x01 +#define CTEST4_FBL_MASK 0x07 +#define CTEST4_FBL_0 0x04 /* Select DMA FIFO byte lane 0 */ +#define CTEST4_FBL_1 0x05 /* Select DMA FIFO byte lane 1 */ +#define CTEST4_FBL_2 0x06 /* Select DMA FIFO byte lane 2 */ +#define CTEST4_FBL_3 0x07 /* Select DMA FIFO byte lane 3 */ +#define CTEST4_800_SAVE (CTEST4_800_BDIS) + + +#define CTEST5_REG_700 (0x19^bE) /* Chip test 5 rw */ +#define CTEST5_REG_800 (0x22^bE) /* Chip test 5 rw */ +/* + * Clock Address Incrementor. When set, it increments the + * DNAD register to the next bus size boundary. It automatically + * resets itself when the operation is complete. + */ +#define CTEST5_ADCK 0x80 +/* + * Clock Byte Counter. When set, it decrements the DBC register to + * the next bus size boundary. + */ +#define CTEST5_BBCK 0x40 +/* + * Reset SCSI Offset. Setting this bit to 1 clears the current offset + * pointer in the SCSI synchronous offset counter (SSTAT). This bit + * is set to 1 if a SCSI Gross Error Condition occurs. The offset should + * be cleared when a synchronous transfer fails. When written, it is + * automatically cleared after the SCSI synchronous offset counter is + * reset. + */ +/* Bit 5 is reserved on 800 series chips */ +#define CTEST5_700_ROFF 0x20 +/* + * Master Control for Set or Reset pulses. When 1, causes the low + * four bits of register to set when set, 0 causes the low bits to + * clear when set. + */ +#define CTEST5_MASR 0x10 +#define CTEST5_DDIR 0x08 /* DMA direction */ +/* + * Bits 2-0 are reserved on 800 series chips + */ +#define CTEST5_700_EOP 0x04 /* End of process */ +#define CTEST5_700_DREQ 0x02 /* Data request */ +#define CTEST5_700_DACK 0x01 /* Data acknowledge */ + +/* + * Chip test 6 rw - writing to this register writes to the byte + * lane in the DMA FIFO as determined by the FBL bits in the CTEST4 + * register. + */ +#define CTEST6_REG_700 (0x1a^bE) +#define CTEST6_REG_800 (0x23^bE) + +#define CTEST7_REG (0x1b^bE) /* Chip test 7 rw */ +#define CTEST7_10_CDIS 0x80 /* Cache burst disable */ +#define CTEST7_10_SC1 0x40 /* Snoop control bits */ +#define CTEST7_10_SC0 0x20 +#define CTEST7_10_SC_MASK 0x60 +#define CTEST7_STD 0x10 /* Selection timeout disable */ +#define CTEST7_DFP 0x08 /* DMA FIFO parity bit for CTEST6 */ +#define CTEST7_EVP 0x04 /* 1 = host bus even parity, 0 = odd */ +#define CTEST7_10_TT1 0x02 /* Transfer type */ +#define CTEST7_DIFF 0x01 /* Differential mode */ + +#define CTEST7_SAVE ( CTEST7_EVP | CTEST7_DIFF ) + + +#define TEMP_REG 0x1c /* through 0x1f Temporary stack rw */ + +#define DFIFO_REG (0x20^bE) /* DMA FIFO rw */ +/* + * 0x80 is reserved on the NCR53c710, the CLF and FLF bits have been + * moved into the CTEST8 register. + */ +#define DFIFO_BO6 0x40 +#define DFIFO_BO5 0x20 +#define DFIFO_BO4 0x10 +#define DFIFO_BO3 0x08 +#define DFIFO_BO2 0x04 +#define DFIFO_BO1 0x02 +#define DFIFO_BO0 0x01 +#define DFIFO_10_BO_MASK 0x7f /* 7 bit counter */ + +/* + * Interrupt status rw + * Note that this is the only register which can be read while SCSI + * SCRIPTS are being executed. + */ +#define ISTAT_REG_700 (0x21^bE) +#define ISTAT_REG_800 (0x14^bE) +#define ISTAT_ABRT 0x80 /* Software abort, write + *1 to abort, wait for interrupt. */ +#define ISTAT_10_SRST 0x40 /* software reset */ +#define ISTAT_10_SIGP 0x20 /* signal script */ +#define ISTAT_CON 0x08 /* 1 when connected */ +#define ISTAT_800_INTF 0x04 /* Interrupt on the fly */ +#define ISTAT_700_PRE 0x04 /* Pointer register empty. + * Set to 1 when DSPS and DSP + * registers are empty in pipeline + * mode, always set otherwise. + */ +#define ISTAT_SIP 0x02 /* SCSI interrupt pending from + * SCSI portion of SIOP see + * SSTAT0 + */ +#define ISTAT_DIP 0x01 /* DMA interrupt pending + * see DSTAT + */ + +#define CTEST8_REG (0x22^bE) /* Chip test 8 rw */ +#define CTEST8_10_V3 0x80 /* Chip revision */ +#define CTEST8_10_V2 0x40 +#define CTEST8_10_V1 0x20 +#define CTEST8_10_V0 0x10 +#define CTEST8_10_V_MASK 0xf0 +#define CTEST8_10_FLF 0x08 /* Flush FIFOs */ +#define CTEST8_10_CLF 0x04 /* Clear FIFOs */ +#define CTEST8_10_FM 0x02 /* Fetch pin mode */ +#define CTEST8_10_SM 0x01 /* Snoop pin mode */ + + +#define LCRC_REG_10 (0x23^bE) + +/* + * 0x24 through 0x27 are the DMA byte counter register. Instructions + * write their high 8 bits into the DCMD register, the low 24 bits into + * the DBC register. + * + * Function is dependent on the command type being executed. + */ + + +#define DBC_REG 0x24 +/* + * For Block Move Instructions, DBC is a 24 bit quantity representing + * the number of bytes to transfer. + * For Transfer Control Instructions, DBC is bit fielded as follows : + */ +/* Bits 20 - 23 should be clear */ +#define DBC_TCI_TRUE (1 << 19) /* Jump when true */ +#define DBC_TCI_COMPARE_DATA (1 << 18) /* Compare data */ +#define DBC_TCI_COMPARE_PHASE (1 << 17) /* Compare phase with DCMD field */ +#define DBC_TCI_WAIT_FOR_VALID (1 << 16) /* Wait for REQ */ +/* Bits 8 - 15 are reserved on some implementations ? */ +#define DBC_TCI_MASK_MASK 0xff00 /* Mask for data compare */ +#define DBC_TCI_MASK_SHIFT 8 +#define DBC_TCI_DATA_MASK 0xff /* Data to be compared */ +#define DBC_TCI_DATA_SHIFT 0 + +#define DBC_RWRI_IMMEDIATE_MASK 0xff00 /* Immediate data */ +#define DBC_RWRI_IMMEDIATE_SHIFT 8 /* Amount to shift */ +#define DBC_RWRI_ADDRESS_MASK 0x3f0000 /* Register address */ +#define DBC_RWRI_ADDRESS_SHIFT 16 + + +/* + * DMA command r/w + */ +#define DCMD_REG (0x27^bE) +#define DCMD_TYPE_MASK 0xc0 /* Masks off type */ +#define DCMD_TYPE_BMI 0x00 /* Indicates a Block Move instruction */ +#define DCMD_BMI_IO 0x01 /* I/O, CD, and MSG bits selecting */ +#define DCMD_BMI_CD 0x02 /* the phase for the block MOVE */ +#define DCMD_BMI_MSG 0x04 /* instruction */ + +#define DCMD_BMI_OP_MASK 0x18 /* mask for opcode */ +#define DCMD_BMI_OP_MOVE_T 0x00 /* MOVE */ +#define DCMD_BMI_OP_MOVE_I 0x08 /* MOVE Initiator */ + +#define DCMD_BMI_INDIRECT 0x20 /* Indirect addressing */ + +#define DCMD_TYPE_TCI 0x80 /* Indicates a Transfer Control + instruction */ +#define DCMD_TCI_IO 0x01 /* I/O, CD, and MSG bits selecting */ +#define DCMD_TCI_CD 0x02 /* the phase for the block MOVE */ +#define DCMD_TCI_MSG 0x04 /* instruction */ +#define DCMD_TCI_OP_MASK 0x38 /* mask for opcode */ +#define DCMD_TCI_OP_JUMP 0x00 /* JUMP */ +#define DCMD_TCI_OP_CALL 0x08 /* CALL */ +#define DCMD_TCI_OP_RETURN 0x10 /* RETURN */ +#define DCMD_TCI_OP_INT 0x18 /* INT */ + +#define DCMD_TYPE_RWRI 0x40 /* Indicates I/O or register Read/Write + instruction */ +#define DCMD_RWRI_OPC_MASK 0x38 /* Opcode mask */ +#define DCMD_RWRI_OPC_WRITE 0x28 /* Write SFBR to register */ +#define DCMD_RWRI_OPC_READ 0x30 /* Read register to SFBR */ +#define DCMD_RWRI_OPC_MODIFY 0x38 /* Modify in place */ + +#define DCMD_RWRI_OP_MASK 0x07 +#define DCMD_RWRI_OP_MOVE 0x00 +#define DCMD_RWRI_OP_SHL 0x01 +#define DCMD_RWRI_OP_OR 0x02 +#define DCMD_RWRI_OP_XOR 0x03 +#define DCMD_RWRI_OP_AND 0x04 +#define DCMD_RWRI_OP_SHR 0x05 +#define DCMD_RWRI_OP_ADD 0x06 +#define DCMD_RWRI_OP_ADDC 0x07 + +#define DCMD_TYPE_MMI 0xc0 /* Indicates a Memory Move instruction + (three words) */ + + +#define DNAD_REG 0x28 /* through 0x2b DMA next address for + data */ +#define DSP_REG 0x2c /* through 0x2f DMA SCRIPTS pointer rw */ +#define DSPS_REG 0x30 /* through 0x33 DMA SCRIPTS pointer + save rw */ +#define DMODE_BL1 0x80 /* Burst length bits */ +#define DMODE_BL0 0x40 +#define DMODE_BL_MASK 0xc0 +/* Burst lengths (800) */ +#define DMODE_BL_2 0x00 /* 2 transfer */ +#define DMODE_BL_4 0x40 /* 4 transfers */ +#define DMODE_BL_8 0x80 /* 8 transfers */ +#define DMODE_BL_16 0xc0 /* 16 transfers */ + +#define DMODE_10_BL_1 0x00 /* 1 transfer */ +#define DMODE_10_BL_2 0x40 /* 2 transfers */ +#define DMODE_10_BL_4 0x80 /* 4 transfers */ +#define DMODE_10_BL_8 0xc0 /* 8 transfers */ +#define DMODE_10_FC2 0x20 /* Driven to FC2 pin */ +#define DMODE_10_FC1 0x10 /* Driven to FC1 pin */ +#define DMODE_710_PD 0x08 /* Program/data on FC0 pin */ +#define DMODE_710_UO 0x02 /* User prog. output */ + +#define DMODE_MAN 0x01 /* Manual start mode, + * requires a 1 to be written + * to the start DMA bit in the DCNTL + * register to run scripts + */ + +/* NCR53c800 series only */ +#define SCRATCHA_REG_800 0x34 /* through 0x37 Scratch A rw */ +/* NCR53c710 only */ +#define SCRATCHB_REG_10 0x34 /* through 0x37 scratch rw */ + +#define DMODE_REG (0x38^bE) /* DMA mode rw, NCR53c710 and newer */ +#define DMODE_800_SIOM 0x20 /* Source IO = 1 */ +#define DMODE_800_DIOM 0x10 /* Destination IO = 1 */ +#define DMODE_800_ERL 0x08 /* Enable Read Line */ + +#define DIEN_REG (0x39^bE) /* DMA interrupt enable rw */ +/* 0x80, 0x40, and 0x20 are reserved on 700-series chips */ +#define DIEN_800_MDPE 0x40 /* Master data parity error */ +#define DIEN_800_BF 0x20 /* BUS fault */ +#define DIEN_700_BF 0x20 /* BUS fault */ +#define DIEN_ABRT 0x10 /* Enable aborted interrupt */ +#define DIEN_SSI 0x08 /* Enable single step interrupt */ +#define DIEN_SIR 0x04 /* Enable SCRIPTS INT command + * interrupt + */ +#define DIEN_700_WTD 0x02 /* Enable watchdog timeout interrupt */ +#define DIEN_700_OPC 0x01 /* Enable illegal instruction + * interrupt + */ +#define DIEN_800_IID 0x01 /* Same meaning, different name */ + +/* + * DMA watchdog timer rw + * set in 16 CLK input periods. + */ +#define DWT_REG (0x3a^bE) + +/* DMA control rw */ +#define DCNTL_REG (0x3b^bE) +#define DCNTL_700_CF1 0x80 /* Clock divisor bits */ +#define DCNTL_700_CF0 0x40 +#define DCNTL_700_CF_MASK 0xc0 +/* Clock divisors Divisor SCLK range (MHZ) */ +#define DCNTL_700_CF_2 0x00 /* 2.0 37.51-50.00 */ +#define DCNTL_700_CF_1_5 0x40 /* 1.5 25.01-37.50 */ +#define DCNTL_700_CF_1 0x80 /* 1.0 16.67-25.00 */ +#define DCNTL_700_CF_3 0xc0 /* 3.0 50.01-66.67 (53c700-66) */ + +#define DCNTL_700_S16 0x20 /* Load scripts 16 bits at a time */ +#define DCNTL_SSM 0x10 /* Single step mode */ +#define DCNTL_700_LLM 0x08 /* Low level mode, can only be set + * after selection */ +#define DCNTL_800_IRQM 0x08 /* Totem pole IRQ pin */ +#define DCNTL_STD 0x04 /* Start DMA / SCRIPTS */ +/* 0x02 is reserved */ +#define DCNTL_10_COM 0x01 /* 700 software compatibility mode */ +#define DCNTL_10_EA 0x20 /* Enable Ack - needed for MVME16x */ + +#define SCRATCHB_REG_800 0x5c /* through 0x5f scratch b rw */ +/* NCR53c710 only */ +#define ADDER_REG_10 0x3c /* Adder, NCR53c710 only */ + +#define SIEN1_REG_800 (0x41^bE) +#define SIEN1_800_STO 0x04 /* selection/reselection timeout */ +#define SIEN1_800_GEN 0x02 /* general purpose timer */ +#define SIEN1_800_HTH 0x01 /* handshake to handshake */ + +#define SIST1_REG_800 (0x43^bE) +#define SIST1_800_STO 0x04 /* selection/reselection timeout */ +#define SIST1_800_GEN 0x02 /* general purpose timer */ +#define SIST1_800_HTH 0x01 /* handshake to handshake */ + +#define SLPAR_REG_800 (0x44^bE) /* Parity */ + +#define MACNTL_REG_800 (0x46^bE) /* Memory access control */ +#define MACNTL_800_TYP3 0x80 +#define MACNTL_800_TYP2 0x40 +#define MACNTL_800_TYP1 0x20 +#define MACNTL_800_TYP0 0x10 +#define MACNTL_800_DWR 0x08 +#define MACNTL_800_DRD 0x04 +#define MACNTL_800_PSCPT 0x02 +#define MACNTL_800_SCPTS 0x01 + +#define GPCNTL_REG_800 (0x47^bE) /* General Purpose Pin Control */ + +/* Timeouts are expressed such that 0=off, 1=100us, doubling after that */ +#define STIME0_REG_800 (0x48^bE) /* SCSI Timer Register 0 */ +#define STIME0_800_HTH_MASK 0xf0 /* Handshake to Handshake timeout */ +#define STIME0_800_HTH_SHIFT 4 +#define STIME0_800_SEL_MASK 0x0f /* Selection timeout */ +#define STIME0_800_SEL_SHIFT 0 + +#define STIME1_REG_800 (0x49^bE) +#define STIME1_800_GEN_MASK 0x0f /* General purpose timer */ + +#define RESPID_REG_800 (0x4a^bE) /* Response ID, bit fielded. 8 + bits on narrow chips, 16 on WIDE */ + +#define STEST0_REG_800 (0x4c^bE) +#define STEST0_800_SLT 0x08 /* Selection response logic test */ +#define STEST0_800_ART 0x04 /* Arbitration priority encoder test */ +#define STEST0_800_SOZ 0x02 /* Synchronous offset zero */ +#define STEST0_800_SOM 0x01 /* Synchronous offset maximum */ + +#define STEST1_REG_800 (0x4d^bE) +#define STEST1_800_SCLK 0x80 /* Disable SCSI clock */ + +#define STEST2_REG_800 (0x4e^bE) +#define STEST2_800_SCE 0x80 /* Enable SOCL/SODL */ +#define STEST2_800_ROF 0x40 /* Reset SCSI sync offset */ +#define STEST2_800_SLB 0x10 /* Enable SCSI loopback mode */ +#define STEST2_800_SZM 0x08 /* SCSI high impedance mode */ +#define STEST2_800_EXT 0x02 /* Extend REQ/ACK filter 30 to 60ns */ +#define STEST2_800_LOW 0x01 /* SCSI low level mode */ + +#define STEST3_REG_800 (0x4f^bE) +#define STEST3_800_TE 0x80 /* Enable active negation */ +#define STEST3_800_STR 0x40 /* SCSI FIFO test read */ +#define STEST3_800_HSC 0x20 /* Halt SCSI clock */ +#define STEST3_800_DSI 0x10 /* Disable single initiator response */ +#define STEST3_800_TTM 0x04 /* Time test mode */ +#define STEST3_800_CSF 0x02 /* Clear SCSI FIFO */ +#define STEST3_800_STW 0x01 /* SCSI FIFO test write */ + +#define ISTAT_REG ISTAT_REG_700 +#define SCRATCH_REG SCRATCHB_REG_10 + +#ifdef MEM_MAPPED +#define NCR_read8(address) \ + (unsigned int)readb((u32)(host->base) + ((u32)(address))) + +#define NCR_read32(address) \ + (unsigned int) readl((u32)(host->base) + (u32)(address)) + +#define NCR_write8(address,value) \ + { DEB(DEB_REGS, printk("NCR: %02x => %08x\n", (u32)(value), ((u32)(host->base) + (u32)(address)))); \ + *(volatile unsigned char *) \ + ((u32)(host->base) + (u32)(address)) = (value); } + +#define NCR_write32(address,value) \ + { DEB(DEB_REGS, printk("NCR: %08x => %08x\n", (u32)(value), ((u32)(host->base) + (u32)(address)))); \ + *(volatile unsigned long *) \ + ((u32)(host->base) + (u32)(address)) = (value); } +#else +#define NCR_read8(address) \ + inb((u32)(host->base) + (address)) + +#define NCR_read32(address) \ + inl((u32)(host->base) + (address)) + +#define NCR_write8(address,value) \ + { DEB(DEB_REGS, printk("NCR: %02x => %08x\n", (u32)(value), ((u32)(host->base) + (u32)(address)))); \ + outb((value), (u32)(host->base) + (u32)(address)); } + +#define NCR_write32(address,value) \ + { DEB(DEB_REGS, printk("NCR: %08x => %08x\n", (u32)(value), ((u32)(host->base) + (u32)(address)))); \ + outl((value), (u32)(host->base) + (u32)(address)); } +#endif + +/* Patch arbitrary 32 bit words in the script */ +#define patch_abs_32(script, offset, symbol, value) \ + for (i = 0; i < (sizeof (A_##symbol##_used) / sizeof \ + (u32)); ++i) { \ + (script)[A_##symbol##_used[i] - (offset)] += (value); \ + DEB(DEB_FIXUP, printk("scsi%d: %s reference %d at 0x%x in %s is now 0x%x\n",\ + host->host_no, #symbol, i, A_##symbol##_used[i] - \ + (int)(offset), #script, (script)[A_##symbol##_used[i] - \ + (offset)])); \ + } + +#endif +#endif diff --git a/drivers/scsi/sim710.scr b/drivers/scsi/sim710.scr new file mode 100644 index 000000000000..60893a662366 --- /dev/null +++ b/drivers/scsi/sim710.scr @@ -0,0 +1,554 @@ +/* + * sim710.scr - Copyright (C) 1999 Richard Hirst + */ + +/* Offsets from DSA, allow 128 elements of scatter/gather */ + +ABSOLUTE dsa_select = 0 +ABSOLUTE dsa_msgout = 8 +ABSOLUTE dsa_cmnd = 16 +ABSOLUTE dsa_status = 24 +ABSOLUTE dsa_msgin = 32 +ABSOLUTE dsa_datain = 40 /* 8 * 128 = 1024 bytes */ +ABSOLUTE dsa_dataout = 1064 /* 8 * 128 = 1024 bytes */ +ABSOLUTE dsa_size = 2088 + +ABSOLUTE reselected_identify = 0 +ABSOLUTE msgin_buf = 0 + +/* Interrupt values passed back to driver */ + +ABSOLUTE int_bad_extmsg1a = 0xab930000 +ABSOLUTE int_bad_extmsg1b = 0xab930001 +ABSOLUTE int_bad_extmsg2a = 0xab930002 +ABSOLUTE int_bad_extmsg2b = 0xab930003 +ABSOLUTE int_bad_extmsg3a = 0xab930004 +ABSOLUTE int_bad_extmsg3b = 0xab930005 +ABSOLUTE int_bad_msg1 = 0xab930006 +ABSOLUTE int_bad_msg2 = 0xab930007 +ABSOLUTE int_bad_msg3 = 0xab930008 +ABSOLUTE int_cmd_bad_phase = 0xab930009 +ABSOLUTE int_cmd_complete = 0xab93000a +ABSOLUTE int_data_bad_phase = 0xab93000b +ABSOLUTE int_msg_sdtr1 = 0xab93000c +ABSOLUTE int_msg_sdtr2 = 0xab93000d +ABSOLUTE int_msg_sdtr3 = 0xab93000e +ABSOLUTE int_no_msgout1 = 0xab93000f +ABSOLUTE int_no_msgout2 = 0xab930010 +ABSOLUTE int_no_msgout3 = 0xab930011 +ABSOLUTE int_not_cmd_complete = 0xab930012 +ABSOLUTE int_sel_no_ident = 0xab930013 +ABSOLUTE int_sel_not_cmd = 0xab930014 +ABSOLUTE int_status_not_msgin = 0xab930015 +ABSOLUTE int_resel_not_msgin = 0xab930016 +ABSOLUTE int_reselected = 0xab930017 +ABSOLUTE int_selected = 0xab930018 +ABSOLUTE int_disc1 = 0xab930019 +ABSOLUTE int_disc2 = 0xab93001a +ABSOLUTE int_disc3 = 0xab93001b +ABSOLUTE int_not_rej = 0xab93001c + + +/* Bit field settings used to record status in SCRATCH */ + +ABSOLUTE had_select = 0x01 +ABSOLUTE had_msgout = 0x02 +ABSOLUTE had_cmdout = 0x04 +ABSOLUTE had_datain = 0x08 +ABSOLUTE had_dataout = 0x10 +ABSOLUTE had_status = 0x20 +ABSOLUTE had_msgin = 0x40 +ABSOLUTE had_extmsg = 0x80 + + +/* These scripts are heavily based on the examples in the NCR 53C710 + * Programmer's Guide (Preliminary). + */ + +ENTRY do_select +do_select: + CLEAR TARGET + MOVE SCRATCH0 & 0 TO SCRATCH0 + ; Enable selection timer + MOVE CTEST7 & 0xef TO CTEST7 + SELECT ATN FROM dsa_select, reselect + JUMP get_status, WHEN STATUS + ; Disable selection timer + MOVE CTEST7 | 0x10 TO CTEST7 + MOVE SCRATCH0 | had_select TO SCRATCH0 + INT int_sel_no_ident, IF NOT MSG_OUT + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + MOVE FROM dsa_msgout, when MSG_OUT +ENTRY done_ident +done_ident: + JUMP get_status, IF STATUS +redo_msgin1: + JUMP get_msgin1, WHEN MSG_IN + INT int_sel_not_cmd, IF NOT CMD +ENTRY resume_cmd +resume_cmd: + MOVE SCRATCH0 | had_cmdout TO SCRATCH0 + MOVE FROM dsa_cmnd, WHEN CMD +ENTRY resume_pmm +resume_pmm: +redo_msgin2: + JUMP get_msgin2, WHEN MSG_IN + JUMP get_status, IF STATUS + JUMP input_data, IF DATA_IN + JUMP output_data, IF DATA_OUT + INT int_cmd_bad_phase + +get_status: + ; Disable selection timer + MOVE CTEST7 | 0x10 TO CTEST7 + MOVE FROM dsa_status, WHEN STATUS + INT int_status_not_msgin, WHEN NOT MSG_IN + MOVE FROM dsa_msgin, WHEN MSG_IN + INT int_not_cmd_complete, IF NOT 0x00 + CLEAR ACK +ENTRY wait_disc_complete +wait_disc_complete: + WAIT DISCONNECT + INT int_cmd_complete + +input_data: + MOVE SCRATCH0 | had_datain TO SCRATCH0 +ENTRY patch_input_data +patch_input_data: + JUMP 0 + MOVE FROM dsa_datain+0x0000, WHEN DATA_IN + MOVE FROM dsa_datain+0x0008, WHEN DATA_IN + MOVE FROM dsa_datain+0x0010, WHEN DATA_IN + MOVE FROM dsa_datain+0x0018, WHEN DATA_IN + MOVE FROM dsa_datain+0x0020, WHEN DATA_IN + MOVE FROM dsa_datain+0x0028, WHEN DATA_IN + MOVE FROM dsa_datain+0x0030, WHEN DATA_IN + MOVE FROM dsa_datain+0x0038, WHEN DATA_IN + MOVE FROM dsa_datain+0x0040, WHEN DATA_IN + MOVE FROM dsa_datain+0x0048, WHEN DATA_IN + MOVE FROM dsa_datain+0x0050, WHEN DATA_IN + MOVE FROM dsa_datain+0x0058, WHEN DATA_IN + MOVE FROM dsa_datain+0x0060, WHEN DATA_IN + MOVE FROM dsa_datain+0x0068, WHEN DATA_IN + MOVE FROM dsa_datain+0x0070, WHEN DATA_IN + MOVE FROM dsa_datain+0x0078, WHEN DATA_IN + MOVE FROM dsa_datain+0x0080, WHEN DATA_IN + MOVE FROM dsa_datain+0x0088, WHEN DATA_IN + MOVE FROM dsa_datain+0x0090, WHEN DATA_IN + MOVE FROM dsa_datain+0x0098, WHEN DATA_IN + MOVE FROM dsa_datain+0x00a0, WHEN DATA_IN + MOVE FROM dsa_datain+0x00a8, WHEN DATA_IN + MOVE FROM dsa_datain+0x00b0, WHEN DATA_IN + MOVE FROM dsa_datain+0x00b8, WHEN DATA_IN + MOVE FROM dsa_datain+0x00c0, WHEN DATA_IN + MOVE FROM dsa_datain+0x00c8, WHEN DATA_IN + MOVE FROM dsa_datain+0x00d0, WHEN DATA_IN + MOVE FROM dsa_datain+0x00d8, WHEN DATA_IN + MOVE FROM dsa_datain+0x00e0, WHEN DATA_IN + MOVE FROM dsa_datain+0x00e8, WHEN DATA_IN + MOVE FROM dsa_datain+0x00f0, WHEN DATA_IN + MOVE FROM dsa_datain+0x00f8, WHEN DATA_IN + MOVE FROM dsa_datain+0x0100, WHEN DATA_IN + MOVE FROM dsa_datain+0x0108, WHEN DATA_IN + MOVE FROM dsa_datain+0x0110, WHEN DATA_IN + MOVE FROM dsa_datain+0x0118, WHEN DATA_IN + MOVE FROM dsa_datain+0x0120, WHEN DATA_IN + MOVE FROM dsa_datain+0x0128, WHEN DATA_IN + MOVE FROM dsa_datain+0x0130, WHEN DATA_IN + MOVE FROM dsa_datain+0x0138, WHEN DATA_IN + MOVE FROM dsa_datain+0x0140, WHEN DATA_IN + MOVE FROM dsa_datain+0x0148, WHEN DATA_IN + MOVE FROM dsa_datain+0x0150, WHEN DATA_IN + MOVE FROM dsa_datain+0x0158, WHEN DATA_IN + MOVE FROM dsa_datain+0x0160, WHEN DATA_IN + MOVE FROM dsa_datain+0x0168, WHEN DATA_IN + MOVE FROM dsa_datain+0x0170, WHEN DATA_IN + MOVE FROM dsa_datain+0x0178, WHEN DATA_IN + MOVE FROM dsa_datain+0x0180, WHEN DATA_IN + MOVE FROM dsa_datain+0x0188, WHEN DATA_IN + MOVE FROM dsa_datain+0x0190, WHEN DATA_IN + MOVE FROM dsa_datain+0x0198, WHEN DATA_IN + MOVE FROM dsa_datain+0x01a0, WHEN DATA_IN + MOVE FROM dsa_datain+0x01a8, WHEN DATA_IN + MOVE FROM dsa_datain+0x01b0, WHEN DATA_IN + MOVE FROM dsa_datain+0x01b8, WHEN DATA_IN + MOVE FROM dsa_datain+0x01c0, WHEN DATA_IN + MOVE FROM dsa_datain+0x01c8, WHEN DATA_IN + MOVE FROM dsa_datain+0x01d0, WHEN DATA_IN + MOVE FROM dsa_datain+0x01d8, WHEN DATA_IN + MOVE FROM dsa_datain+0x01e0, WHEN DATA_IN + MOVE FROM dsa_datain+0x01e8, WHEN DATA_IN + MOVE FROM dsa_datain+0x01f0, WHEN DATA_IN + MOVE FROM dsa_datain+0x01f8, WHEN DATA_IN + MOVE FROM dsa_datain+0x0200, WHEN DATA_IN + MOVE FROM dsa_datain+0x0208, WHEN DATA_IN + MOVE FROM dsa_datain+0x0210, WHEN DATA_IN + MOVE FROM dsa_datain+0x0218, WHEN DATA_IN + MOVE FROM dsa_datain+0x0220, WHEN DATA_IN + MOVE FROM dsa_datain+0x0228, WHEN DATA_IN + MOVE FROM dsa_datain+0x0230, WHEN DATA_IN + MOVE FROM dsa_datain+0x0238, WHEN DATA_IN + MOVE FROM dsa_datain+0x0240, WHEN DATA_IN + MOVE FROM dsa_datain+0x0248, WHEN DATA_IN + MOVE FROM dsa_datain+0x0250, WHEN DATA_IN + MOVE FROM dsa_datain+0x0258, WHEN DATA_IN + MOVE FROM dsa_datain+0x0260, WHEN DATA_IN + MOVE FROM dsa_datain+0x0268, WHEN DATA_IN + MOVE FROM dsa_datain+0x0270, WHEN DATA_IN + MOVE FROM dsa_datain+0x0278, WHEN DATA_IN + MOVE FROM dsa_datain+0x0280, WHEN DATA_IN + MOVE FROM dsa_datain+0x0288, WHEN DATA_IN + MOVE FROM dsa_datain+0x0290, WHEN DATA_IN + MOVE FROM dsa_datain+0x0298, WHEN DATA_IN + MOVE FROM dsa_datain+0x02a0, WHEN DATA_IN + MOVE FROM dsa_datain+0x02a8, WHEN DATA_IN + MOVE FROM dsa_datain+0x02b0, WHEN DATA_IN + MOVE FROM dsa_datain+0x02b8, WHEN DATA_IN + MOVE FROM dsa_datain+0x02c0, WHEN DATA_IN + MOVE FROM dsa_datain+0x02c8, WHEN DATA_IN + MOVE FROM dsa_datain+0x02d0, WHEN DATA_IN + MOVE FROM dsa_datain+0x02d8, WHEN DATA_IN + MOVE FROM dsa_datain+0x02e0, WHEN DATA_IN + MOVE FROM dsa_datain+0x02e8, WHEN DATA_IN + MOVE FROM dsa_datain+0x02f0, WHEN DATA_IN + MOVE FROM dsa_datain+0x02f8, WHEN DATA_IN + MOVE FROM dsa_datain+0x0300, WHEN DATA_IN + MOVE FROM dsa_datain+0x0308, WHEN DATA_IN + MOVE FROM dsa_datain+0x0310, WHEN DATA_IN + MOVE FROM dsa_datain+0x0318, WHEN DATA_IN + MOVE FROM dsa_datain+0x0320, WHEN DATA_IN + MOVE FROM dsa_datain+0x0328, WHEN DATA_IN + MOVE FROM dsa_datain+0x0330, WHEN DATA_IN + MOVE FROM dsa_datain+0x0338, WHEN DATA_IN + MOVE FROM dsa_datain+0x0340, WHEN DATA_IN + MOVE FROM dsa_datain+0x0348, WHEN DATA_IN + MOVE FROM dsa_datain+0x0350, WHEN DATA_IN + MOVE FROM dsa_datain+0x0358, WHEN DATA_IN + MOVE FROM dsa_datain+0x0360, WHEN DATA_IN + MOVE FROM dsa_datain+0x0368, WHEN DATA_IN + MOVE FROM dsa_datain+0x0370, WHEN DATA_IN + MOVE FROM dsa_datain+0x0378, WHEN DATA_IN + MOVE FROM dsa_datain+0x0380, WHEN DATA_IN + MOVE FROM dsa_datain+0x0388, WHEN DATA_IN + MOVE FROM dsa_datain+0x0390, WHEN DATA_IN + MOVE FROM dsa_datain+0x0398, WHEN DATA_IN + MOVE FROM dsa_datain+0x03a0, WHEN DATA_IN + MOVE FROM dsa_datain+0x03a8, WHEN DATA_IN + MOVE FROM dsa_datain+0x03b0, WHEN DATA_IN + MOVE FROM dsa_datain+0x03b8, WHEN DATA_IN + MOVE FROM dsa_datain+0x03c0, WHEN DATA_IN + MOVE FROM dsa_datain+0x03c8, WHEN DATA_IN + MOVE FROM dsa_datain+0x03d0, WHEN DATA_IN + MOVE FROM dsa_datain+0x03d8, WHEN DATA_IN + MOVE FROM dsa_datain+0x03e0, WHEN DATA_IN + MOVE FROM dsa_datain+0x03e8, WHEN DATA_IN + MOVE FROM dsa_datain+0x03f0, WHEN DATA_IN + MOVE FROM dsa_datain+0x03f8, WHEN DATA_IN + JUMP end_data_trans + +output_data: + MOVE SCRATCH0 | had_dataout TO SCRATCH0 +ENTRY patch_output_data +patch_output_data: + JUMP 0 + MOVE FROM dsa_dataout+0x0000, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0008, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0010, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0018, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0020, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0028, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0030, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0038, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0040, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0048, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0050, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0058, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0060, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0068, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0070, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0078, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0080, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0088, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0090, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0098, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00a0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00a8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00b0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00b8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00c0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00c8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00d0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00d8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00e0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00e8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00f0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x00f8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0100, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0108, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0110, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0118, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0120, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0128, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0130, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0138, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0140, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0148, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0150, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0158, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0160, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0168, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0170, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0178, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0180, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0188, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0190, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0198, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01a0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01a8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01b0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01b8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01c0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01c8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01d0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01d8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01e0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01e8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01f0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x01f8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0200, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0208, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0210, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0218, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0220, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0228, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0230, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0238, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0240, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0248, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0250, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0258, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0260, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0268, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0270, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0278, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0280, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0288, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0290, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0298, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02a0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02a8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02b0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02b8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02c0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02c8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02d0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02d8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02e0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02e8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02f0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x02f8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0300, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0308, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0310, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0318, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0320, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0328, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0330, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0338, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0340, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0348, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0350, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0358, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0360, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0368, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0370, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0378, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0380, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0388, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0390, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x0398, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03a0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03a8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03b0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03b8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03c0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03c8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03d0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03d8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03e0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03e8, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03f0, WHEN DATA_OUT + MOVE FROM dsa_dataout+0x03f8, WHEN DATA_OUT +ENTRY end_data_trans +end_data_trans: +redo_msgin3: + JUMP get_status, WHEN STATUS + JUMP get_msgin3, WHEN MSG_IN + INT int_data_bad_phase + +get_msgin1: + MOVE SCRATCH0 | had_msgin TO SCRATCH0 + MOVE 1, msgin_buf, WHEN MSG_IN + JUMP ext_msg1, IF 0x01 ; Extended Message + JUMP ignore_msg1, IF 0x02 ; Save Data Pointers + JUMP ignore_msg1, IF 0x03 ; Save Restore Pointers + JUMP disc1, IF 0x04 ; Disconnect + INT int_bad_msg1 +ignore_msg1: + CLEAR ACK + JUMP redo_msgin1 +ext_msg1: + MOVE SCRATCH0 | had_extmsg TO SCRATCH0 + CLEAR ACK + MOVE 1, msgin_buf + 1, WHEN MSG_IN + JUMP ext_msg1a, IF 0x03 + INT int_bad_extmsg1a +ext_msg1a: + CLEAR ACK + MOVE 1, msgin_buf + 2, WHEN MSG_IN + JUMP ext_msg1b, IF 0x01 ; Must be SDTR + INT int_bad_extmsg1b +ext_msg1b: + CLEAR ACK + MOVE 2, msgin_buf + 3, WHEN MSG_IN + INT int_msg_sdtr1 +disc1: + CLEAR ACK +ENTRY wait_disc1 +wait_disc1: + WAIT DISCONNECT + INT int_disc1 +ENTRY resume_msgin1a +resume_msgin1a: + CLEAR ACK + JUMP redo_msgin1 +ENTRY resume_msgin1b +resume_msgin1b: + SET ATN + CLEAR ACK + INT int_no_msgout1, WHEN NOT MSG_OUT + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + MOVE FROM dsa_msgout, when MSG_OUT + JUMP redo_msgin1 + +get_msgin2: + MOVE SCRATCH0 | had_msgin TO SCRATCH0 + MOVE 1, msgin_buf, WHEN MSG_IN + JUMP ext_msg2, IF 0x01 ; Extended Message + JUMP ignore_msg2, IF 0x02 ; Save Data Pointers + JUMP ignore_msg2, IF 0x03 ; Save Restore Pointers + JUMP disc2, IF 0x04 ; Disconnect + INT int_bad_msg2 +ignore_msg2: + CLEAR ACK + JUMP redo_msgin2 +ext_msg2: + MOVE SCRATCH0 | had_extmsg TO SCRATCH0 + CLEAR ACK + MOVE 1, msgin_buf + 1, WHEN MSG_IN + JUMP ext_msg2a, IF 0x03 + INT int_bad_extmsg2a +ext_msg2a: + CLEAR ACK + MOVE 1, msgin_buf + 2, WHEN MSG_IN + JUMP ext_msg2b, IF 0x01 ; Must be SDTR + INT int_bad_extmsg2b +ext_msg2b: + CLEAR ACK + MOVE 2, msgin_buf + 3, WHEN MSG_IN + INT int_msg_sdtr2 +disc2: + CLEAR ACK +ENTRY wait_disc2 +wait_disc2: + WAIT DISCONNECT + INT int_disc2 +ENTRY resume_msgin2a +resume_msgin2a: + CLEAR ACK + JUMP redo_msgin2 +ENTRY resume_msgin2b +resume_msgin2b: + SET ATN + CLEAR ACK + INT int_no_msgout2, WHEN NOT MSG_OUT + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + MOVE FROM dsa_msgout, when MSG_OUT + JUMP redo_msgin2 + +get_msgin3: + MOVE SCRATCH0 | had_msgin TO SCRATCH0 + MOVE 1, msgin_buf, WHEN MSG_IN + JUMP ext_msg3, IF 0x01 ; Extended Message + JUMP ignore_msg3, IF 0x02 ; Save Data Pointers + JUMP ignore_msg3, IF 0x03 ; Save Restore Pointers + JUMP disc3, IF 0x04 ; Disconnect + INT int_bad_msg3 +ignore_msg3: + CLEAR ACK + JUMP redo_msgin3 +ext_msg3: + MOVE SCRATCH0 | had_extmsg TO SCRATCH0 + CLEAR ACK + MOVE 1, msgin_buf + 1, WHEN MSG_IN + JUMP ext_msg3a, IF 0x03 + INT int_bad_extmsg3a +ext_msg3a: + CLEAR ACK + MOVE 1, msgin_buf + 2, WHEN MSG_IN + JUMP ext_msg3b, IF 0x01 ; Must be SDTR + INT int_bad_extmsg3b +ext_msg3b: + CLEAR ACK + MOVE 2, msgin_buf + 3, WHEN MSG_IN + INT int_msg_sdtr3 +disc3: + CLEAR ACK +ENTRY wait_disc3 +wait_disc3: + WAIT DISCONNECT + INT int_disc3 +ENTRY resume_msgin3a +resume_msgin3a: + CLEAR ACK + JUMP redo_msgin3 +ENTRY resume_msgin3b +resume_msgin3b: + SET ATN + CLEAR ACK + INT int_no_msgout3, WHEN NOT MSG_OUT + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + MOVE FROM dsa_msgout, when MSG_OUT + JUMP redo_msgin3 + +ENTRY resume_rej_ident +resume_rej_ident: + CLEAR ATN + MOVE 1, msgin_buf, WHEN MSG_IN + INT int_not_rej, IF NOT 0x07 ; Reject + CLEAR ACK + JUMP done_ident + +ENTRY reselect +reselect: + ; Disable selection timer + MOVE CTEST7 | 0x10 TO CTEST7 + WAIT RESELECT resel_err + INT int_resel_not_msgin, WHEN NOT MSG_IN + MOVE 1, reselected_identify, WHEN MSG_IN + INT int_reselected +resel_err: + MOVE CTEST2 & 0x40 TO SFBR + JUMP selected, IF 0x00 + MOVE SFBR & 0 TO SFBR +ENTRY patch_new_dsa +patch_new_dsa: + MOVE SFBR | 0x11 TO DSA0 + MOVE SFBR | 0x22 TO DSA1 + MOVE SFBR | 0x33 TO DSA2 + MOVE SFBR | 0x44 TO DSA3 + JUMP do_select + +selected: + INT int_selected + diff --git a/drivers/scsi/sim710_d.h b/drivers/scsi/sim710_d.h new file mode 100644 index 000000000000..22e0464786c2 --- /dev/null +++ b/drivers/scsi/sim710_d.h @@ -0,0 +1,2360 @@ +u32 SCRIPT[] = { +/* + + + + + + +ABSOLUTE dsa_select = 0 +ABSOLUTE dsa_msgout = 8 +ABSOLUTE dsa_cmnd = 16 +ABSOLUTE dsa_status = 24 +ABSOLUTE dsa_msgin = 32 +ABSOLUTE dsa_datain = 40 +ABSOLUTE dsa_dataout = 1064 +ABSOLUTE dsa_size = 2088 + +ABSOLUTE reselected_identify = 0 +ABSOLUTE msgin_buf = 0 + + + +ABSOLUTE int_bad_extmsg1a = 0xab930000 +ABSOLUTE int_bad_extmsg1b = 0xab930001 +ABSOLUTE int_bad_extmsg2a = 0xab930002 +ABSOLUTE int_bad_extmsg2b = 0xab930003 +ABSOLUTE int_bad_extmsg3a = 0xab930004 +ABSOLUTE int_bad_extmsg3b = 0xab930005 +ABSOLUTE int_bad_msg1 = 0xab930006 +ABSOLUTE int_bad_msg2 = 0xab930007 +ABSOLUTE int_bad_msg3 = 0xab930008 +ABSOLUTE int_cmd_bad_phase = 0xab930009 +ABSOLUTE int_cmd_complete = 0xab93000a +ABSOLUTE int_data_bad_phase = 0xab93000b +ABSOLUTE int_msg_sdtr1 = 0xab93000c +ABSOLUTE int_msg_sdtr2 = 0xab93000d +ABSOLUTE int_msg_sdtr3 = 0xab93000e +ABSOLUTE int_no_msgout1 = 0xab93000f +ABSOLUTE int_no_msgout2 = 0xab930010 +ABSOLUTE int_no_msgout3 = 0xab930011 +ABSOLUTE int_not_cmd_complete = 0xab930012 +ABSOLUTE int_sel_no_ident = 0xab930013 +ABSOLUTE int_sel_not_cmd = 0xab930014 +ABSOLUTE int_status_not_msgin = 0xab930015 +ABSOLUTE int_resel_not_msgin = 0xab930016 +ABSOLUTE int_reselected = 0xab930017 +ABSOLUTE int_selected = 0xab930018 +ABSOLUTE int_disc1 = 0xab930019 +ABSOLUTE int_disc2 = 0xab93001a +ABSOLUTE int_disc3 = 0xab93001b +ABSOLUTE int_not_rej = 0xab93001c + + + + +ABSOLUTE had_select = 0x01 +ABSOLUTE had_msgout = 0x02 +ABSOLUTE had_cmdout = 0x04 +ABSOLUTE had_datain = 0x08 +ABSOLUTE had_dataout = 0x10 +ABSOLUTE had_status = 0x20 +ABSOLUTE had_msgin = 0x40 +ABSOLUTE had_extmsg = 0x80 + + + + + + +ENTRY do_select +do_select: + CLEAR TARGET + +at 0x00000000 : */ 0x60000200,0x00000000, +/* + MOVE SCRATCH0 & 0 TO SCRATCH0 + +at 0x00000002 : */ 0x7c340000,0x00000000, +/* + ; Enable selection timer + MOVE CTEST7 & 0xef TO CTEST7 + +at 0x00000004 : */ 0x7c1bef00,0x00000000, +/* + SELECT ATN FROM dsa_select, reselect + +at 0x00000006 : */ 0x43000000,0x00000c48, +/* + JUMP get_status, WHEN STATUS + +at 0x00000008 : */ 0x830b0000,0x000000a0, +/* + ; Disable selection timer + MOVE CTEST7 | 0x10 TO CTEST7 + +at 0x0000000a : */ 0x7a1b1000,0x00000000, +/* + MOVE SCRATCH0 | had_select TO SCRATCH0 + +at 0x0000000c : */ 0x7a340100,0x00000000, +/* + INT int_sel_no_ident, IF NOT MSG_OUT + +at 0x0000000e : */ 0x9e020000,0xab930013, +/* + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + +at 0x00000010 : */ 0x7a340200,0x00000000, +/* + MOVE FROM dsa_msgout, when MSG_OUT + +at 0x00000012 : */ 0x1e000000,0x00000008, +/* +ENTRY done_ident +done_ident: + JUMP get_status, IF STATUS + +at 0x00000014 : */ 0x830a0000,0x000000a0, +/* +redo_msgin1: + JUMP get_msgin1, WHEN MSG_IN + +at 0x00000016 : */ 0x870b0000,0x00000920, +/* + INT int_sel_not_cmd, IF NOT CMD + +at 0x00000018 : */ 0x9a020000,0xab930014, +/* +ENTRY resume_cmd +resume_cmd: + MOVE SCRATCH0 | had_cmdout TO SCRATCH0 + +at 0x0000001a : */ 0x7a340400,0x00000000, +/* + MOVE FROM dsa_cmnd, WHEN CMD + +at 0x0000001c : */ 0x1a000000,0x00000010, +/* +ENTRY resume_pmm +resume_pmm: +redo_msgin2: + JUMP get_msgin2, WHEN MSG_IN + +at 0x0000001e : */ 0x870b0000,0x00000a20, +/* + JUMP get_status, IF STATUS + +at 0x00000020 : */ 0x830a0000,0x000000a0, +/* + JUMP input_data, IF DATA_IN + +at 0x00000022 : */ 0x810a0000,0x000000e0, +/* + JUMP output_data, IF DATA_OUT + +at 0x00000024 : */ 0x800a0000,0x000004f8, +/* + INT int_cmd_bad_phase + +at 0x00000026 : */ 0x98080000,0xab930009, +/* + +get_status: + ; Disable selection timer + MOVE CTEST7 | 0x10 TO CTEST7 + +at 0x00000028 : */ 0x7a1b1000,0x00000000, +/* + MOVE FROM dsa_status, WHEN STATUS + +at 0x0000002a : */ 0x1b000000,0x00000018, +/* + INT int_status_not_msgin, WHEN NOT MSG_IN + +at 0x0000002c : */ 0x9f030000,0xab930015, +/* + MOVE FROM dsa_msgin, WHEN MSG_IN + +at 0x0000002e : */ 0x1f000000,0x00000020, +/* + INT int_not_cmd_complete, IF NOT 0x00 + +at 0x00000030 : */ 0x98040000,0xab930012, +/* + CLEAR ACK + +at 0x00000032 : */ 0x60000040,0x00000000, +/* +ENTRY wait_disc_complete +wait_disc_complete: + WAIT DISCONNECT + +at 0x00000034 : */ 0x48000000,0x00000000, +/* + INT int_cmd_complete + +at 0x00000036 : */ 0x98080000,0xab93000a, +/* + +input_data: + MOVE SCRATCH0 | had_datain TO SCRATCH0 + +at 0x00000038 : */ 0x7a340800,0x00000000, +/* +ENTRY patch_input_data +patch_input_data: + JUMP 0 + +at 0x0000003a : */ 0x80080000,0x00000000, +/* + MOVE FROM dsa_datain+0x0000, WHEN DATA_IN + +at 0x0000003c : */ 0x19000000,0x00000028, +/* + MOVE FROM dsa_datain+0x0008, WHEN DATA_IN + +at 0x0000003e : */ 0x19000000,0x00000030, +/* + MOVE FROM dsa_datain+0x0010, WHEN DATA_IN + +at 0x00000040 : */ 0x19000000,0x00000038, +/* + MOVE FROM dsa_datain+0x0018, WHEN DATA_IN + +at 0x00000042 : */ 0x19000000,0x00000040, +/* + MOVE FROM dsa_datain+0x0020, WHEN DATA_IN + +at 0x00000044 : */ 0x19000000,0x00000048, +/* + MOVE FROM dsa_datain+0x0028, WHEN DATA_IN + +at 0x00000046 : */ 0x19000000,0x00000050, +/* + MOVE FROM dsa_datain+0x0030, WHEN DATA_IN + +at 0x00000048 : */ 0x19000000,0x00000058, +/* + MOVE FROM dsa_datain+0x0038, WHEN DATA_IN + +at 0x0000004a : */ 0x19000000,0x00000060, +/* + MOVE FROM dsa_datain+0x0040, WHEN DATA_IN + +at 0x0000004c : */ 0x19000000,0x00000068, +/* + MOVE FROM dsa_datain+0x0048, WHEN DATA_IN + +at 0x0000004e : */ 0x19000000,0x00000070, +/* + MOVE FROM dsa_datain+0x0050, WHEN DATA_IN + +at 0x00000050 : */ 0x19000000,0x00000078, +/* + MOVE FROM dsa_datain+0x0058, WHEN DATA_IN + +at 0x00000052 : */ 0x19000000,0x00000080, +/* + MOVE FROM dsa_datain+0x0060, WHEN DATA_IN + +at 0x00000054 : */ 0x19000000,0x00000088, +/* + MOVE FROM dsa_datain+0x0068, WHEN DATA_IN + +at 0x00000056 : */ 0x19000000,0x00000090, +/* + MOVE FROM dsa_datain+0x0070, WHEN DATA_IN + +at 0x00000058 : */ 0x19000000,0x00000098, +/* + MOVE FROM dsa_datain+0x0078, WHEN DATA_IN + +at 0x0000005a : */ 0x19000000,0x000000a0, +/* + MOVE FROM dsa_datain+0x0080, WHEN DATA_IN + +at 0x0000005c : */ 0x19000000,0x000000a8, +/* + MOVE FROM dsa_datain+0x0088, WHEN DATA_IN + +at 0x0000005e : */ 0x19000000,0x000000b0, +/* + MOVE FROM dsa_datain+0x0090, WHEN DATA_IN + +at 0x00000060 : */ 0x19000000,0x000000b8, +/* + MOVE FROM dsa_datain+0x0098, WHEN DATA_IN + +at 0x00000062 : */ 0x19000000,0x000000c0, +/* + MOVE FROM dsa_datain+0x00a0, WHEN DATA_IN + +at 0x00000064 : */ 0x19000000,0x000000c8, +/* + MOVE FROM dsa_datain+0x00a8, WHEN DATA_IN + +at 0x00000066 : */ 0x19000000,0x000000d0, +/* + MOVE FROM dsa_datain+0x00b0, WHEN DATA_IN + +at 0x00000068 : */ 0x19000000,0x000000d8, +/* + MOVE FROM dsa_datain+0x00b8, WHEN DATA_IN + +at 0x0000006a : */ 0x19000000,0x000000e0, +/* + MOVE FROM dsa_datain+0x00c0, WHEN DATA_IN + +at 0x0000006c : */ 0x19000000,0x000000e8, +/* + MOVE FROM dsa_datain+0x00c8, WHEN DATA_IN + +at 0x0000006e : */ 0x19000000,0x000000f0, +/* + MOVE FROM dsa_datain+0x00d0, WHEN DATA_IN + +at 0x00000070 : */ 0x19000000,0x000000f8, +/* + MOVE FROM dsa_datain+0x00d8, WHEN DATA_IN + +at 0x00000072 : */ 0x19000000,0x00000100, +/* + MOVE FROM dsa_datain+0x00e0, WHEN DATA_IN + +at 0x00000074 : */ 0x19000000,0x00000108, +/* + MOVE FROM dsa_datain+0x00e8, WHEN DATA_IN + +at 0x00000076 : */ 0x19000000,0x00000110, +/* + MOVE FROM dsa_datain+0x00f0, WHEN DATA_IN + +at 0x00000078 : */ 0x19000000,0x00000118, +/* + MOVE FROM dsa_datain+0x00f8, WHEN DATA_IN + +at 0x0000007a : */ 0x19000000,0x00000120, +/* + MOVE FROM dsa_datain+0x0100, WHEN DATA_IN + +at 0x0000007c : */ 0x19000000,0x00000128, +/* + MOVE FROM dsa_datain+0x0108, WHEN DATA_IN + +at 0x0000007e : */ 0x19000000,0x00000130, +/* + MOVE FROM dsa_datain+0x0110, WHEN DATA_IN + +at 0x00000080 : */ 0x19000000,0x00000138, +/* + MOVE FROM dsa_datain+0x0118, WHEN DATA_IN + +at 0x00000082 : */ 0x19000000,0x00000140, +/* + MOVE FROM dsa_datain+0x0120, WHEN DATA_IN + +at 0x00000084 : */ 0x19000000,0x00000148, +/* + MOVE FROM dsa_datain+0x0128, WHEN DATA_IN + +at 0x00000086 : */ 0x19000000,0x00000150, +/* + MOVE FROM dsa_datain+0x0130, WHEN DATA_IN + +at 0x00000088 : */ 0x19000000,0x00000158, +/* + MOVE FROM dsa_datain+0x0138, WHEN DATA_IN + +at 0x0000008a : */ 0x19000000,0x00000160, +/* + MOVE FROM dsa_datain+0x0140, WHEN DATA_IN + +at 0x0000008c : */ 0x19000000,0x00000168, +/* + MOVE FROM dsa_datain+0x0148, WHEN DATA_IN + +at 0x0000008e : */ 0x19000000,0x00000170, +/* + MOVE FROM dsa_datain+0x0150, WHEN DATA_IN + +at 0x00000090 : */ 0x19000000,0x00000178, +/* + MOVE FROM dsa_datain+0x0158, WHEN DATA_IN + +at 0x00000092 : */ 0x19000000,0x00000180, +/* + MOVE FROM dsa_datain+0x0160, WHEN DATA_IN + +at 0x00000094 : */ 0x19000000,0x00000188, +/* + MOVE FROM dsa_datain+0x0168, WHEN DATA_IN + +at 0x00000096 : */ 0x19000000,0x00000190, +/* + MOVE FROM dsa_datain+0x0170, WHEN DATA_IN + +at 0x00000098 : */ 0x19000000,0x00000198, +/* + MOVE FROM dsa_datain+0x0178, WHEN DATA_IN + +at 0x0000009a : */ 0x19000000,0x000001a0, +/* + MOVE FROM dsa_datain+0x0180, WHEN DATA_IN + +at 0x0000009c : */ 0x19000000,0x000001a8, +/* + MOVE FROM dsa_datain+0x0188, WHEN DATA_IN + +at 0x0000009e : */ 0x19000000,0x000001b0, +/* + MOVE FROM dsa_datain+0x0190, WHEN DATA_IN + +at 0x000000a0 : */ 0x19000000,0x000001b8, +/* + MOVE FROM dsa_datain+0x0198, WHEN DATA_IN + +at 0x000000a2 : */ 0x19000000,0x000001c0, +/* + MOVE FROM dsa_datain+0x01a0, WHEN DATA_IN + +at 0x000000a4 : */ 0x19000000,0x000001c8, +/* + MOVE FROM dsa_datain+0x01a8, WHEN DATA_IN + +at 0x000000a6 : */ 0x19000000,0x000001d0, +/* + MOVE FROM dsa_datain+0x01b0, WHEN DATA_IN + +at 0x000000a8 : */ 0x19000000,0x000001d8, +/* + MOVE FROM dsa_datain+0x01b8, WHEN DATA_IN + +at 0x000000aa : */ 0x19000000,0x000001e0, +/* + MOVE FROM dsa_datain+0x01c0, WHEN DATA_IN + +at 0x000000ac : */ 0x19000000,0x000001e8, +/* + MOVE FROM dsa_datain+0x01c8, WHEN DATA_IN + +at 0x000000ae : */ 0x19000000,0x000001f0, +/* + MOVE FROM dsa_datain+0x01d0, WHEN DATA_IN + +at 0x000000b0 : */ 0x19000000,0x000001f8, +/* + MOVE FROM dsa_datain+0x01d8, WHEN DATA_IN + +at 0x000000b2 : */ 0x19000000,0x00000200, +/* + MOVE FROM dsa_datain+0x01e0, WHEN DATA_IN + +at 0x000000b4 : */ 0x19000000,0x00000208, +/* + MOVE FROM dsa_datain+0x01e8, WHEN DATA_IN + +at 0x000000b6 : */ 0x19000000,0x00000210, +/* + MOVE FROM dsa_datain+0x01f0, WHEN DATA_IN + +at 0x000000b8 : */ 0x19000000,0x00000218, +/* + MOVE FROM dsa_datain+0x01f8, WHEN DATA_IN + +at 0x000000ba : */ 0x19000000,0x00000220, +/* + MOVE FROM dsa_datain+0x0200, WHEN DATA_IN + +at 0x000000bc : */ 0x19000000,0x00000228, +/* + MOVE FROM dsa_datain+0x0208, WHEN DATA_IN + +at 0x000000be : */ 0x19000000,0x00000230, +/* + MOVE FROM dsa_datain+0x0210, WHEN DATA_IN + +at 0x000000c0 : */ 0x19000000,0x00000238, +/* + MOVE FROM dsa_datain+0x0218, WHEN DATA_IN + +at 0x000000c2 : */ 0x19000000,0x00000240, +/* + MOVE FROM dsa_datain+0x0220, WHEN DATA_IN + +at 0x000000c4 : */ 0x19000000,0x00000248, +/* + MOVE FROM dsa_datain+0x0228, WHEN DATA_IN + +at 0x000000c6 : */ 0x19000000,0x00000250, +/* + MOVE FROM dsa_datain+0x0230, WHEN DATA_IN + +at 0x000000c8 : */ 0x19000000,0x00000258, +/* + MOVE FROM dsa_datain+0x0238, WHEN DATA_IN + +at 0x000000ca : */ 0x19000000,0x00000260, +/* + MOVE FROM dsa_datain+0x0240, WHEN DATA_IN + +at 0x000000cc : */ 0x19000000,0x00000268, +/* + MOVE FROM dsa_datain+0x0248, WHEN DATA_IN + +at 0x000000ce : */ 0x19000000,0x00000270, +/* + MOVE FROM dsa_datain+0x0250, WHEN DATA_IN + +at 0x000000d0 : */ 0x19000000,0x00000278, +/* + MOVE FROM dsa_datain+0x0258, WHEN DATA_IN + +at 0x000000d2 : */ 0x19000000,0x00000280, +/* + MOVE FROM dsa_datain+0x0260, WHEN DATA_IN + +at 0x000000d4 : */ 0x19000000,0x00000288, +/* + MOVE FROM dsa_datain+0x0268, WHEN DATA_IN + +at 0x000000d6 : */ 0x19000000,0x00000290, +/* + MOVE FROM dsa_datain+0x0270, WHEN DATA_IN + +at 0x000000d8 : */ 0x19000000,0x00000298, +/* + MOVE FROM dsa_datain+0x0278, WHEN DATA_IN + +at 0x000000da : */ 0x19000000,0x000002a0, +/* + MOVE FROM dsa_datain+0x0280, WHEN DATA_IN + +at 0x000000dc : */ 0x19000000,0x000002a8, +/* + MOVE FROM dsa_datain+0x0288, WHEN DATA_IN + +at 0x000000de : */ 0x19000000,0x000002b0, +/* + MOVE FROM dsa_datain+0x0290, WHEN DATA_IN + +at 0x000000e0 : */ 0x19000000,0x000002b8, +/* + MOVE FROM dsa_datain+0x0298, WHEN DATA_IN + +at 0x000000e2 : */ 0x19000000,0x000002c0, +/* + MOVE FROM dsa_datain+0x02a0, WHEN DATA_IN + +at 0x000000e4 : */ 0x19000000,0x000002c8, +/* + MOVE FROM dsa_datain+0x02a8, WHEN DATA_IN + +at 0x000000e6 : */ 0x19000000,0x000002d0, +/* + MOVE FROM dsa_datain+0x02b0, WHEN DATA_IN + +at 0x000000e8 : */ 0x19000000,0x000002d8, +/* + MOVE FROM dsa_datain+0x02b8, WHEN DATA_IN + +at 0x000000ea : */ 0x19000000,0x000002e0, +/* + MOVE FROM dsa_datain+0x02c0, WHEN DATA_IN + +at 0x000000ec : */ 0x19000000,0x000002e8, +/* + MOVE FROM dsa_datain+0x02c8, WHEN DATA_IN + +at 0x000000ee : */ 0x19000000,0x000002f0, +/* + MOVE FROM dsa_datain+0x02d0, WHEN DATA_IN + +at 0x000000f0 : */ 0x19000000,0x000002f8, +/* + MOVE FROM dsa_datain+0x02d8, WHEN DATA_IN + +at 0x000000f2 : */ 0x19000000,0x00000300, +/* + MOVE FROM dsa_datain+0x02e0, WHEN DATA_IN + +at 0x000000f4 : */ 0x19000000,0x00000308, +/* + MOVE FROM dsa_datain+0x02e8, WHEN DATA_IN + +at 0x000000f6 : */ 0x19000000,0x00000310, +/* + MOVE FROM dsa_datain+0x02f0, WHEN DATA_IN + +at 0x000000f8 : */ 0x19000000,0x00000318, +/* + MOVE FROM dsa_datain+0x02f8, WHEN DATA_IN + +at 0x000000fa : */ 0x19000000,0x00000320, +/* + MOVE FROM dsa_datain+0x0300, WHEN DATA_IN + +at 0x000000fc : */ 0x19000000,0x00000328, +/* + MOVE FROM dsa_datain+0x0308, WHEN DATA_IN + +at 0x000000fe : */ 0x19000000,0x00000330, +/* + MOVE FROM dsa_datain+0x0310, WHEN DATA_IN + +at 0x00000100 : */ 0x19000000,0x00000338, +/* + MOVE FROM dsa_datain+0x0318, WHEN DATA_IN + +at 0x00000102 : */ 0x19000000,0x00000340, +/* + MOVE FROM dsa_datain+0x0320, WHEN DATA_IN + +at 0x00000104 : */ 0x19000000,0x00000348, +/* + MOVE FROM dsa_datain+0x0328, WHEN DATA_IN + +at 0x00000106 : */ 0x19000000,0x00000350, +/* + MOVE FROM dsa_datain+0x0330, WHEN DATA_IN + +at 0x00000108 : */ 0x19000000,0x00000358, +/* + MOVE FROM dsa_datain+0x0338, WHEN DATA_IN + +at 0x0000010a : */ 0x19000000,0x00000360, +/* + MOVE FROM dsa_datain+0x0340, WHEN DATA_IN + +at 0x0000010c : */ 0x19000000,0x00000368, +/* + MOVE FROM dsa_datain+0x0348, WHEN DATA_IN + +at 0x0000010e : */ 0x19000000,0x00000370, +/* + MOVE FROM dsa_datain+0x0350, WHEN DATA_IN + +at 0x00000110 : */ 0x19000000,0x00000378, +/* + MOVE FROM dsa_datain+0x0358, WHEN DATA_IN + +at 0x00000112 : */ 0x19000000,0x00000380, +/* + MOVE FROM dsa_datain+0x0360, WHEN DATA_IN + +at 0x00000114 : */ 0x19000000,0x00000388, +/* + MOVE FROM dsa_datain+0x0368, WHEN DATA_IN + +at 0x00000116 : */ 0x19000000,0x00000390, +/* + MOVE FROM dsa_datain+0x0370, WHEN DATA_IN + +at 0x00000118 : */ 0x19000000,0x00000398, +/* + MOVE FROM dsa_datain+0x0378, WHEN DATA_IN + +at 0x0000011a : */ 0x19000000,0x000003a0, +/* + MOVE FROM dsa_datain+0x0380, WHEN DATA_IN + +at 0x0000011c : */ 0x19000000,0x000003a8, +/* + MOVE FROM dsa_datain+0x0388, WHEN DATA_IN + +at 0x0000011e : */ 0x19000000,0x000003b0, +/* + MOVE FROM dsa_datain+0x0390, WHEN DATA_IN + +at 0x00000120 : */ 0x19000000,0x000003b8, +/* + MOVE FROM dsa_datain+0x0398, WHEN DATA_IN + +at 0x00000122 : */ 0x19000000,0x000003c0, +/* + MOVE FROM dsa_datain+0x03a0, WHEN DATA_IN + +at 0x00000124 : */ 0x19000000,0x000003c8, +/* + MOVE FROM dsa_datain+0x03a8, WHEN DATA_IN + +at 0x00000126 : */ 0x19000000,0x000003d0, +/* + MOVE FROM dsa_datain+0x03b0, WHEN DATA_IN + +at 0x00000128 : */ 0x19000000,0x000003d8, +/* + MOVE FROM dsa_datain+0x03b8, WHEN DATA_IN + +at 0x0000012a : */ 0x19000000,0x000003e0, +/* + MOVE FROM dsa_datain+0x03c0, WHEN DATA_IN + +at 0x0000012c : */ 0x19000000,0x000003e8, +/* + MOVE FROM dsa_datain+0x03c8, WHEN DATA_IN + +at 0x0000012e : */ 0x19000000,0x000003f0, +/* + MOVE FROM dsa_datain+0x03d0, WHEN DATA_IN + +at 0x00000130 : */ 0x19000000,0x000003f8, +/* + MOVE FROM dsa_datain+0x03d8, WHEN DATA_IN + +at 0x00000132 : */ 0x19000000,0x00000400, +/* + MOVE FROM dsa_datain+0x03e0, WHEN DATA_IN + +at 0x00000134 : */ 0x19000000,0x00000408, +/* + MOVE FROM dsa_datain+0x03e8, WHEN DATA_IN + +at 0x00000136 : */ 0x19000000,0x00000410, +/* + MOVE FROM dsa_datain+0x03f0, WHEN DATA_IN + +at 0x00000138 : */ 0x19000000,0x00000418, +/* + MOVE FROM dsa_datain+0x03f8, WHEN DATA_IN + +at 0x0000013a : */ 0x19000000,0x00000420, +/* + JUMP end_data_trans + +at 0x0000013c : */ 0x80080000,0x00000908, +/* + +output_data: + MOVE SCRATCH0 | had_dataout TO SCRATCH0 + +at 0x0000013e : */ 0x7a341000,0x00000000, +/* +ENTRY patch_output_data +patch_output_data: + JUMP 0 + +at 0x00000140 : */ 0x80080000,0x00000000, +/* + MOVE FROM dsa_dataout+0x0000, WHEN DATA_OUT + +at 0x00000142 : */ 0x18000000,0x00000428, +/* + MOVE FROM dsa_dataout+0x0008, WHEN DATA_OUT + +at 0x00000144 : */ 0x18000000,0x00000430, +/* + MOVE FROM dsa_dataout+0x0010, WHEN DATA_OUT + +at 0x00000146 : */ 0x18000000,0x00000438, +/* + MOVE FROM dsa_dataout+0x0018, WHEN DATA_OUT + +at 0x00000148 : */ 0x18000000,0x00000440, +/* + MOVE FROM dsa_dataout+0x0020, WHEN DATA_OUT + +at 0x0000014a : */ 0x18000000,0x00000448, +/* + MOVE FROM dsa_dataout+0x0028, WHEN DATA_OUT + +at 0x0000014c : */ 0x18000000,0x00000450, +/* + MOVE FROM dsa_dataout+0x0030, WHEN DATA_OUT + +at 0x0000014e : */ 0x18000000,0x00000458, +/* + MOVE FROM dsa_dataout+0x0038, WHEN DATA_OUT + +at 0x00000150 : */ 0x18000000,0x00000460, +/* + MOVE FROM dsa_dataout+0x0040, WHEN DATA_OUT + +at 0x00000152 : */ 0x18000000,0x00000468, +/* + MOVE FROM dsa_dataout+0x0048, WHEN DATA_OUT + +at 0x00000154 : */ 0x18000000,0x00000470, +/* + MOVE FROM dsa_dataout+0x0050, WHEN DATA_OUT + +at 0x00000156 : */ 0x18000000,0x00000478, +/* + MOVE FROM dsa_dataout+0x0058, WHEN DATA_OUT + +at 0x00000158 : */ 0x18000000,0x00000480, +/* + MOVE FROM dsa_dataout+0x0060, WHEN DATA_OUT + +at 0x0000015a : */ 0x18000000,0x00000488, +/* + MOVE FROM dsa_dataout+0x0068, WHEN DATA_OUT + +at 0x0000015c : */ 0x18000000,0x00000490, +/* + MOVE FROM dsa_dataout+0x0070, WHEN DATA_OUT + +at 0x0000015e : */ 0x18000000,0x00000498, +/* + MOVE FROM dsa_dataout+0x0078, WHEN DATA_OUT + +at 0x00000160 : */ 0x18000000,0x000004a0, +/* + MOVE FROM dsa_dataout+0x0080, WHEN DATA_OUT + +at 0x00000162 : */ 0x18000000,0x000004a8, +/* + MOVE FROM dsa_dataout+0x0088, WHEN DATA_OUT + +at 0x00000164 : */ 0x18000000,0x000004b0, +/* + MOVE FROM dsa_dataout+0x0090, WHEN DATA_OUT + +at 0x00000166 : */ 0x18000000,0x000004b8, +/* + MOVE FROM dsa_dataout+0x0098, WHEN DATA_OUT + +at 0x00000168 : */ 0x18000000,0x000004c0, +/* + MOVE FROM dsa_dataout+0x00a0, WHEN DATA_OUT + +at 0x0000016a : */ 0x18000000,0x000004c8, +/* + MOVE FROM dsa_dataout+0x00a8, WHEN DATA_OUT + +at 0x0000016c : */ 0x18000000,0x000004d0, +/* + MOVE FROM dsa_dataout+0x00b0, WHEN DATA_OUT + +at 0x0000016e : */ 0x18000000,0x000004d8, +/* + MOVE FROM dsa_dataout+0x00b8, WHEN DATA_OUT + +at 0x00000170 : */ 0x18000000,0x000004e0, +/* + MOVE FROM dsa_dataout+0x00c0, WHEN DATA_OUT + +at 0x00000172 : */ 0x18000000,0x000004e8, +/* + MOVE FROM dsa_dataout+0x00c8, WHEN DATA_OUT + +at 0x00000174 : */ 0x18000000,0x000004f0, +/* + MOVE FROM dsa_dataout+0x00d0, WHEN DATA_OUT + +at 0x00000176 : */ 0x18000000,0x000004f8, +/* + MOVE FROM dsa_dataout+0x00d8, WHEN DATA_OUT + +at 0x00000178 : */ 0x18000000,0x00000500, +/* + MOVE FROM dsa_dataout+0x00e0, WHEN DATA_OUT + +at 0x0000017a : */ 0x18000000,0x00000508, +/* + MOVE FROM dsa_dataout+0x00e8, WHEN DATA_OUT + +at 0x0000017c : */ 0x18000000,0x00000510, +/* + MOVE FROM dsa_dataout+0x00f0, WHEN DATA_OUT + +at 0x0000017e : */ 0x18000000,0x00000518, +/* + MOVE FROM dsa_dataout+0x00f8, WHEN DATA_OUT + +at 0x00000180 : */ 0x18000000,0x00000520, +/* + MOVE FROM dsa_dataout+0x0100, WHEN DATA_OUT + +at 0x00000182 : */ 0x18000000,0x00000528, +/* + MOVE FROM dsa_dataout+0x0108, WHEN DATA_OUT + +at 0x00000184 : */ 0x18000000,0x00000530, +/* + MOVE FROM dsa_dataout+0x0110, WHEN DATA_OUT + +at 0x00000186 : */ 0x18000000,0x00000538, +/* + MOVE FROM dsa_dataout+0x0118, WHEN DATA_OUT + +at 0x00000188 : */ 0x18000000,0x00000540, +/* + MOVE FROM dsa_dataout+0x0120, WHEN DATA_OUT + +at 0x0000018a : */ 0x18000000,0x00000548, +/* + MOVE FROM dsa_dataout+0x0128, WHEN DATA_OUT + +at 0x0000018c : */ 0x18000000,0x00000550, +/* + MOVE FROM dsa_dataout+0x0130, WHEN DATA_OUT + +at 0x0000018e : */ 0x18000000,0x00000558, +/* + MOVE FROM dsa_dataout+0x0138, WHEN DATA_OUT + +at 0x00000190 : */ 0x18000000,0x00000560, +/* + MOVE FROM dsa_dataout+0x0140, WHEN DATA_OUT + +at 0x00000192 : */ 0x18000000,0x00000568, +/* + MOVE FROM dsa_dataout+0x0148, WHEN DATA_OUT + +at 0x00000194 : */ 0x18000000,0x00000570, +/* + MOVE FROM dsa_dataout+0x0150, WHEN DATA_OUT + +at 0x00000196 : */ 0x18000000,0x00000578, +/* + MOVE FROM dsa_dataout+0x0158, WHEN DATA_OUT + +at 0x00000198 : */ 0x18000000,0x00000580, +/* + MOVE FROM dsa_dataout+0x0160, WHEN DATA_OUT + +at 0x0000019a : */ 0x18000000,0x00000588, +/* + MOVE FROM dsa_dataout+0x0168, WHEN DATA_OUT + +at 0x0000019c : */ 0x18000000,0x00000590, +/* + MOVE FROM dsa_dataout+0x0170, WHEN DATA_OUT + +at 0x0000019e : */ 0x18000000,0x00000598, +/* + MOVE FROM dsa_dataout+0x0178, WHEN DATA_OUT + +at 0x000001a0 : */ 0x18000000,0x000005a0, +/* + MOVE FROM dsa_dataout+0x0180, WHEN DATA_OUT + +at 0x000001a2 : */ 0x18000000,0x000005a8, +/* + MOVE FROM dsa_dataout+0x0188, WHEN DATA_OUT + +at 0x000001a4 : */ 0x18000000,0x000005b0, +/* + MOVE FROM dsa_dataout+0x0190, WHEN DATA_OUT + +at 0x000001a6 : */ 0x18000000,0x000005b8, +/* + MOVE FROM dsa_dataout+0x0198, WHEN DATA_OUT + +at 0x000001a8 : */ 0x18000000,0x000005c0, +/* + MOVE FROM dsa_dataout+0x01a0, WHEN DATA_OUT + +at 0x000001aa : */ 0x18000000,0x000005c8, +/* + MOVE FROM dsa_dataout+0x01a8, WHEN DATA_OUT + +at 0x000001ac : */ 0x18000000,0x000005d0, +/* + MOVE FROM dsa_dataout+0x01b0, WHEN DATA_OUT + +at 0x000001ae : */ 0x18000000,0x000005d8, +/* + MOVE FROM dsa_dataout+0x01b8, WHEN DATA_OUT + +at 0x000001b0 : */ 0x18000000,0x000005e0, +/* + MOVE FROM dsa_dataout+0x01c0, WHEN DATA_OUT + +at 0x000001b2 : */ 0x18000000,0x000005e8, +/* + MOVE FROM dsa_dataout+0x01c8, WHEN DATA_OUT + +at 0x000001b4 : */ 0x18000000,0x000005f0, +/* + MOVE FROM dsa_dataout+0x01d0, WHEN DATA_OUT + +at 0x000001b6 : */ 0x18000000,0x000005f8, +/* + MOVE FROM dsa_dataout+0x01d8, WHEN DATA_OUT + +at 0x000001b8 : */ 0x18000000,0x00000600, +/* + MOVE FROM dsa_dataout+0x01e0, WHEN DATA_OUT + +at 0x000001ba : */ 0x18000000,0x00000608, +/* + MOVE FROM dsa_dataout+0x01e8, WHEN DATA_OUT + +at 0x000001bc : */ 0x18000000,0x00000610, +/* + MOVE FROM dsa_dataout+0x01f0, WHEN DATA_OUT + +at 0x000001be : */ 0x18000000,0x00000618, +/* + MOVE FROM dsa_dataout+0x01f8, WHEN DATA_OUT + +at 0x000001c0 : */ 0x18000000,0x00000620, +/* + MOVE FROM dsa_dataout+0x0200, WHEN DATA_OUT + +at 0x000001c2 : */ 0x18000000,0x00000628, +/* + MOVE FROM dsa_dataout+0x0208, WHEN DATA_OUT + +at 0x000001c4 : */ 0x18000000,0x00000630, +/* + MOVE FROM dsa_dataout+0x0210, WHEN DATA_OUT + +at 0x000001c6 : */ 0x18000000,0x00000638, +/* + MOVE FROM dsa_dataout+0x0218, WHEN DATA_OUT + +at 0x000001c8 : */ 0x18000000,0x00000640, +/* + MOVE FROM dsa_dataout+0x0220, WHEN DATA_OUT + +at 0x000001ca : */ 0x18000000,0x00000648, +/* + MOVE FROM dsa_dataout+0x0228, WHEN DATA_OUT + +at 0x000001cc : */ 0x18000000,0x00000650, +/* + MOVE FROM dsa_dataout+0x0230, WHEN DATA_OUT + +at 0x000001ce : */ 0x18000000,0x00000658, +/* + MOVE FROM dsa_dataout+0x0238, WHEN DATA_OUT + +at 0x000001d0 : */ 0x18000000,0x00000660, +/* + MOVE FROM dsa_dataout+0x0240, WHEN DATA_OUT + +at 0x000001d2 : */ 0x18000000,0x00000668, +/* + MOVE FROM dsa_dataout+0x0248, WHEN DATA_OUT + +at 0x000001d4 : */ 0x18000000,0x00000670, +/* + MOVE FROM dsa_dataout+0x0250, WHEN DATA_OUT + +at 0x000001d6 : */ 0x18000000,0x00000678, +/* + MOVE FROM dsa_dataout+0x0258, WHEN DATA_OUT + +at 0x000001d8 : */ 0x18000000,0x00000680, +/* + MOVE FROM dsa_dataout+0x0260, WHEN DATA_OUT + +at 0x000001da : */ 0x18000000,0x00000688, +/* + MOVE FROM dsa_dataout+0x0268, WHEN DATA_OUT + +at 0x000001dc : */ 0x18000000,0x00000690, +/* + MOVE FROM dsa_dataout+0x0270, WHEN DATA_OUT + +at 0x000001de : */ 0x18000000,0x00000698, +/* + MOVE FROM dsa_dataout+0x0278, WHEN DATA_OUT + +at 0x000001e0 : */ 0x18000000,0x000006a0, +/* + MOVE FROM dsa_dataout+0x0280, WHEN DATA_OUT + +at 0x000001e2 : */ 0x18000000,0x000006a8, +/* + MOVE FROM dsa_dataout+0x0288, WHEN DATA_OUT + +at 0x000001e4 : */ 0x18000000,0x000006b0, +/* + MOVE FROM dsa_dataout+0x0290, WHEN DATA_OUT + +at 0x000001e6 : */ 0x18000000,0x000006b8, +/* + MOVE FROM dsa_dataout+0x0298, WHEN DATA_OUT + +at 0x000001e8 : */ 0x18000000,0x000006c0, +/* + MOVE FROM dsa_dataout+0x02a0, WHEN DATA_OUT + +at 0x000001ea : */ 0x18000000,0x000006c8, +/* + MOVE FROM dsa_dataout+0x02a8, WHEN DATA_OUT + +at 0x000001ec : */ 0x18000000,0x000006d0, +/* + MOVE FROM dsa_dataout+0x02b0, WHEN DATA_OUT + +at 0x000001ee : */ 0x18000000,0x000006d8, +/* + MOVE FROM dsa_dataout+0x02b8, WHEN DATA_OUT + +at 0x000001f0 : */ 0x18000000,0x000006e0, +/* + MOVE FROM dsa_dataout+0x02c0, WHEN DATA_OUT + +at 0x000001f2 : */ 0x18000000,0x000006e8, +/* + MOVE FROM dsa_dataout+0x02c8, WHEN DATA_OUT + +at 0x000001f4 : */ 0x18000000,0x000006f0, +/* + MOVE FROM dsa_dataout+0x02d0, WHEN DATA_OUT + +at 0x000001f6 : */ 0x18000000,0x000006f8, +/* + MOVE FROM dsa_dataout+0x02d8, WHEN DATA_OUT + +at 0x000001f8 : */ 0x18000000,0x00000700, +/* + MOVE FROM dsa_dataout+0x02e0, WHEN DATA_OUT + +at 0x000001fa : */ 0x18000000,0x00000708, +/* + MOVE FROM dsa_dataout+0x02e8, WHEN DATA_OUT + +at 0x000001fc : */ 0x18000000,0x00000710, +/* + MOVE FROM dsa_dataout+0x02f0, WHEN DATA_OUT + +at 0x000001fe : */ 0x18000000,0x00000718, +/* + MOVE FROM dsa_dataout+0x02f8, WHEN DATA_OUT + +at 0x00000200 : */ 0x18000000,0x00000720, +/* + MOVE FROM dsa_dataout+0x0300, WHEN DATA_OUT + +at 0x00000202 : */ 0x18000000,0x00000728, +/* + MOVE FROM dsa_dataout+0x0308, WHEN DATA_OUT + +at 0x00000204 : */ 0x18000000,0x00000730, +/* + MOVE FROM dsa_dataout+0x0310, WHEN DATA_OUT + +at 0x00000206 : */ 0x18000000,0x00000738, +/* + MOVE FROM dsa_dataout+0x0318, WHEN DATA_OUT + +at 0x00000208 : */ 0x18000000,0x00000740, +/* + MOVE FROM dsa_dataout+0x0320, WHEN DATA_OUT + +at 0x0000020a : */ 0x18000000,0x00000748, +/* + MOVE FROM dsa_dataout+0x0328, WHEN DATA_OUT + +at 0x0000020c : */ 0x18000000,0x00000750, +/* + MOVE FROM dsa_dataout+0x0330, WHEN DATA_OUT + +at 0x0000020e : */ 0x18000000,0x00000758, +/* + MOVE FROM dsa_dataout+0x0338, WHEN DATA_OUT + +at 0x00000210 : */ 0x18000000,0x00000760, +/* + MOVE FROM dsa_dataout+0x0340, WHEN DATA_OUT + +at 0x00000212 : */ 0x18000000,0x00000768, +/* + MOVE FROM dsa_dataout+0x0348, WHEN DATA_OUT + +at 0x00000214 : */ 0x18000000,0x00000770, +/* + MOVE FROM dsa_dataout+0x0350, WHEN DATA_OUT + +at 0x00000216 : */ 0x18000000,0x00000778, +/* + MOVE FROM dsa_dataout+0x0358, WHEN DATA_OUT + +at 0x00000218 : */ 0x18000000,0x00000780, +/* + MOVE FROM dsa_dataout+0x0360, WHEN DATA_OUT + +at 0x0000021a : */ 0x18000000,0x00000788, +/* + MOVE FROM dsa_dataout+0x0368, WHEN DATA_OUT + +at 0x0000021c : */ 0x18000000,0x00000790, +/* + MOVE FROM dsa_dataout+0x0370, WHEN DATA_OUT + +at 0x0000021e : */ 0x18000000,0x00000798, +/* + MOVE FROM dsa_dataout+0x0378, WHEN DATA_OUT + +at 0x00000220 : */ 0x18000000,0x000007a0, +/* + MOVE FROM dsa_dataout+0x0380, WHEN DATA_OUT + +at 0x00000222 : */ 0x18000000,0x000007a8, +/* + MOVE FROM dsa_dataout+0x0388, WHEN DATA_OUT + +at 0x00000224 : */ 0x18000000,0x000007b0, +/* + MOVE FROM dsa_dataout+0x0390, WHEN DATA_OUT + +at 0x00000226 : */ 0x18000000,0x000007b8, +/* + MOVE FROM dsa_dataout+0x0398, WHEN DATA_OUT + +at 0x00000228 : */ 0x18000000,0x000007c0, +/* + MOVE FROM dsa_dataout+0x03a0, WHEN DATA_OUT + +at 0x0000022a : */ 0x18000000,0x000007c8, +/* + MOVE FROM dsa_dataout+0x03a8, WHEN DATA_OUT + +at 0x0000022c : */ 0x18000000,0x000007d0, +/* + MOVE FROM dsa_dataout+0x03b0, WHEN DATA_OUT + +at 0x0000022e : */ 0x18000000,0x000007d8, +/* + MOVE FROM dsa_dataout+0x03b8, WHEN DATA_OUT + +at 0x00000230 : */ 0x18000000,0x000007e0, +/* + MOVE FROM dsa_dataout+0x03c0, WHEN DATA_OUT + +at 0x00000232 : */ 0x18000000,0x000007e8, +/* + MOVE FROM dsa_dataout+0x03c8, WHEN DATA_OUT + +at 0x00000234 : */ 0x18000000,0x000007f0, +/* + MOVE FROM dsa_dataout+0x03d0, WHEN DATA_OUT + +at 0x00000236 : */ 0x18000000,0x000007f8, +/* + MOVE FROM dsa_dataout+0x03d8, WHEN DATA_OUT + +at 0x00000238 : */ 0x18000000,0x00000800, +/* + MOVE FROM dsa_dataout+0x03e0, WHEN DATA_OUT + +at 0x0000023a : */ 0x18000000,0x00000808, +/* + MOVE FROM dsa_dataout+0x03e8, WHEN DATA_OUT + +at 0x0000023c : */ 0x18000000,0x00000810, +/* + MOVE FROM dsa_dataout+0x03f0, WHEN DATA_OUT + +at 0x0000023e : */ 0x18000000,0x00000818, +/* + MOVE FROM dsa_dataout+0x03f8, WHEN DATA_OUT + +at 0x00000240 : */ 0x18000000,0x00000820, +/* +ENTRY end_data_trans +end_data_trans: +redo_msgin3: + JUMP get_status, WHEN STATUS + +at 0x00000242 : */ 0x830b0000,0x000000a0, +/* + JUMP get_msgin3, WHEN MSG_IN + +at 0x00000244 : */ 0x870b0000,0x00000b20, +/* + INT int_data_bad_phase + +at 0x00000246 : */ 0x98080000,0xab93000b, +/* + +get_msgin1: + MOVE SCRATCH0 | had_msgin TO SCRATCH0 + +at 0x00000248 : */ 0x7a344000,0x00000000, +/* + MOVE 1, msgin_buf, WHEN MSG_IN + +at 0x0000024a : */ 0x0f000001,0x00000000, +/* + JUMP ext_msg1, IF 0x01 ; Extended Message + +at 0x0000024c : */ 0x800c0001,0x00000968, +/* + JUMP ignore_msg1, IF 0x02 ; Save Data Pointers + +at 0x0000024e : */ 0x800c0002,0x00000958, +/* + JUMP ignore_msg1, IF 0x03 ; Save Restore Pointers + +at 0x00000250 : */ 0x800c0003,0x00000958, +/* + JUMP disc1, IF 0x04 ; Disconnect + +at 0x00000252 : */ 0x800c0004,0x000009c8, +/* + INT int_bad_msg1 + +at 0x00000254 : */ 0x98080000,0xab930006, +/* +ignore_msg1: + CLEAR ACK + +at 0x00000256 : */ 0x60000040,0x00000000, +/* + JUMP redo_msgin1 + +at 0x00000258 : */ 0x80080000,0x00000058, +/* +ext_msg1: + MOVE SCRATCH0 | had_extmsg TO SCRATCH0 + +at 0x0000025a : */ 0x7a348000,0x00000000, +/* + CLEAR ACK + +at 0x0000025c : */ 0x60000040,0x00000000, +/* + MOVE 1, msgin_buf + 1, WHEN MSG_IN + +at 0x0000025e : */ 0x0f000001,0x00000001, +/* + JUMP ext_msg1a, IF 0x03 + +at 0x00000260 : */ 0x800c0003,0x00000990, +/* + INT int_bad_extmsg1a + +at 0x00000262 : */ 0x98080000,0xab930000, +/* +ext_msg1a: + CLEAR ACK + +at 0x00000264 : */ 0x60000040,0x00000000, +/* + MOVE 1, msgin_buf + 2, WHEN MSG_IN + +at 0x00000266 : */ 0x0f000001,0x00000002, +/* + JUMP ext_msg1b, IF 0x01 ; Must be SDTR + +at 0x00000268 : */ 0x800c0001,0x000009b0, +/* + INT int_bad_extmsg1b + +at 0x0000026a : */ 0x98080000,0xab930001, +/* +ext_msg1b: + CLEAR ACK + +at 0x0000026c : */ 0x60000040,0x00000000, +/* + MOVE 2, msgin_buf + 3, WHEN MSG_IN + +at 0x0000026e : */ 0x0f000002,0x00000003, +/* + INT int_msg_sdtr1 + +at 0x00000270 : */ 0x98080000,0xab93000c, +/* +disc1: + CLEAR ACK + +at 0x00000272 : */ 0x60000040,0x00000000, +/* +ENTRY wait_disc1 +wait_disc1: + WAIT DISCONNECT + +at 0x00000274 : */ 0x48000000,0x00000000, +/* + INT int_disc1 + +at 0x00000276 : */ 0x98080000,0xab930019, +/* +ENTRY resume_msgin1a +resume_msgin1a: + CLEAR ACK + +at 0x00000278 : */ 0x60000040,0x00000000, +/* + JUMP redo_msgin1 + +at 0x0000027a : */ 0x80080000,0x00000058, +/* +ENTRY resume_msgin1b +resume_msgin1b: + SET ATN + +at 0x0000027c : */ 0x58000008,0x00000000, +/* + CLEAR ACK + +at 0x0000027e : */ 0x60000040,0x00000000, +/* + INT int_no_msgout1, WHEN NOT MSG_OUT + +at 0x00000280 : */ 0x9e030000,0xab93000f, +/* + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + +at 0x00000282 : */ 0x7a340200,0x00000000, +/* + MOVE FROM dsa_msgout, when MSG_OUT + +at 0x00000284 : */ 0x1e000000,0x00000008, +/* + JUMP redo_msgin1 + +at 0x00000286 : */ 0x80080000,0x00000058, +/* + +get_msgin2: + MOVE SCRATCH0 | had_msgin TO SCRATCH0 + +at 0x00000288 : */ 0x7a344000,0x00000000, +/* + MOVE 1, msgin_buf, WHEN MSG_IN + +at 0x0000028a : */ 0x0f000001,0x00000000, +/* + JUMP ext_msg2, IF 0x01 ; Extended Message + +at 0x0000028c : */ 0x800c0001,0x00000a68, +/* + JUMP ignore_msg2, IF 0x02 ; Save Data Pointers + +at 0x0000028e : */ 0x800c0002,0x00000a58, +/* + JUMP ignore_msg2, IF 0x03 ; Save Restore Pointers + +at 0x00000290 : */ 0x800c0003,0x00000a58, +/* + JUMP disc2, IF 0x04 ; Disconnect + +at 0x00000292 : */ 0x800c0004,0x00000ac8, +/* + INT int_bad_msg2 + +at 0x00000294 : */ 0x98080000,0xab930007, +/* +ignore_msg2: + CLEAR ACK + +at 0x00000296 : */ 0x60000040,0x00000000, +/* + JUMP redo_msgin2 + +at 0x00000298 : */ 0x80080000,0x00000078, +/* +ext_msg2: + MOVE SCRATCH0 | had_extmsg TO SCRATCH0 + +at 0x0000029a : */ 0x7a348000,0x00000000, +/* + CLEAR ACK + +at 0x0000029c : */ 0x60000040,0x00000000, +/* + MOVE 1, msgin_buf + 1, WHEN MSG_IN + +at 0x0000029e : */ 0x0f000001,0x00000001, +/* + JUMP ext_msg2a, IF 0x03 + +at 0x000002a0 : */ 0x800c0003,0x00000a90, +/* + INT int_bad_extmsg2a + +at 0x000002a2 : */ 0x98080000,0xab930002, +/* +ext_msg2a: + CLEAR ACK + +at 0x000002a4 : */ 0x60000040,0x00000000, +/* + MOVE 1, msgin_buf + 2, WHEN MSG_IN + +at 0x000002a6 : */ 0x0f000001,0x00000002, +/* + JUMP ext_msg2b, IF 0x01 ; Must be SDTR + +at 0x000002a8 : */ 0x800c0001,0x00000ab0, +/* + INT int_bad_extmsg2b + +at 0x000002aa : */ 0x98080000,0xab930003, +/* +ext_msg2b: + CLEAR ACK + +at 0x000002ac : */ 0x60000040,0x00000000, +/* + MOVE 2, msgin_buf + 3, WHEN MSG_IN + +at 0x000002ae : */ 0x0f000002,0x00000003, +/* + INT int_msg_sdtr2 + +at 0x000002b0 : */ 0x98080000,0xab93000d, +/* +disc2: + CLEAR ACK + +at 0x000002b2 : */ 0x60000040,0x00000000, +/* +ENTRY wait_disc2 +wait_disc2: + WAIT DISCONNECT + +at 0x000002b4 : */ 0x48000000,0x00000000, +/* + INT int_disc2 + +at 0x000002b6 : */ 0x98080000,0xab93001a, +/* +ENTRY resume_msgin2a +resume_msgin2a: + CLEAR ACK + +at 0x000002b8 : */ 0x60000040,0x00000000, +/* + JUMP redo_msgin2 + +at 0x000002ba : */ 0x80080000,0x00000078, +/* +ENTRY resume_msgin2b +resume_msgin2b: + SET ATN + +at 0x000002bc : */ 0x58000008,0x00000000, +/* + CLEAR ACK + +at 0x000002be : */ 0x60000040,0x00000000, +/* + INT int_no_msgout2, WHEN NOT MSG_OUT + +at 0x000002c0 : */ 0x9e030000,0xab930010, +/* + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + +at 0x000002c2 : */ 0x7a340200,0x00000000, +/* + MOVE FROM dsa_msgout, when MSG_OUT + +at 0x000002c4 : */ 0x1e000000,0x00000008, +/* + JUMP redo_msgin2 + +at 0x000002c6 : */ 0x80080000,0x00000078, +/* + +get_msgin3: + MOVE SCRATCH0 | had_msgin TO SCRATCH0 + +at 0x000002c8 : */ 0x7a344000,0x00000000, +/* + MOVE 1, msgin_buf, WHEN MSG_IN + +at 0x000002ca : */ 0x0f000001,0x00000000, +/* + JUMP ext_msg3, IF 0x01 ; Extended Message + +at 0x000002cc : */ 0x800c0001,0x00000b68, +/* + JUMP ignore_msg3, IF 0x02 ; Save Data Pointers + +at 0x000002ce : */ 0x800c0002,0x00000b58, +/* + JUMP ignore_msg3, IF 0x03 ; Save Restore Pointers + +at 0x000002d0 : */ 0x800c0003,0x00000b58, +/* + JUMP disc3, IF 0x04 ; Disconnect + +at 0x000002d2 : */ 0x800c0004,0x00000bc8, +/* + INT int_bad_msg3 + +at 0x000002d4 : */ 0x98080000,0xab930008, +/* +ignore_msg3: + CLEAR ACK + +at 0x000002d6 : */ 0x60000040,0x00000000, +/* + JUMP redo_msgin3 + +at 0x000002d8 : */ 0x80080000,0x00000908, +/* +ext_msg3: + MOVE SCRATCH0 | had_extmsg TO SCRATCH0 + +at 0x000002da : */ 0x7a348000,0x00000000, +/* + CLEAR ACK + +at 0x000002dc : */ 0x60000040,0x00000000, +/* + MOVE 1, msgin_buf + 1, WHEN MSG_IN + +at 0x000002de : */ 0x0f000001,0x00000001, +/* + JUMP ext_msg3a, IF 0x03 + +at 0x000002e0 : */ 0x800c0003,0x00000b90, +/* + INT int_bad_extmsg3a + +at 0x000002e2 : */ 0x98080000,0xab930004, +/* +ext_msg3a: + CLEAR ACK + +at 0x000002e4 : */ 0x60000040,0x00000000, +/* + MOVE 1, msgin_buf + 2, WHEN MSG_IN + +at 0x000002e6 : */ 0x0f000001,0x00000002, +/* + JUMP ext_msg3b, IF 0x01 ; Must be SDTR + +at 0x000002e8 : */ 0x800c0001,0x00000bb0, +/* + INT int_bad_extmsg3b + +at 0x000002ea : */ 0x98080000,0xab930005, +/* +ext_msg3b: + CLEAR ACK + +at 0x000002ec : */ 0x60000040,0x00000000, +/* + MOVE 2, msgin_buf + 3, WHEN MSG_IN + +at 0x000002ee : */ 0x0f000002,0x00000003, +/* + INT int_msg_sdtr3 + +at 0x000002f0 : */ 0x98080000,0xab93000e, +/* +disc3: + CLEAR ACK + +at 0x000002f2 : */ 0x60000040,0x00000000, +/* +ENTRY wait_disc3 +wait_disc3: + WAIT DISCONNECT + +at 0x000002f4 : */ 0x48000000,0x00000000, +/* + INT int_disc3 + +at 0x000002f6 : */ 0x98080000,0xab93001b, +/* +ENTRY resume_msgin3a +resume_msgin3a: + CLEAR ACK + +at 0x000002f8 : */ 0x60000040,0x00000000, +/* + JUMP redo_msgin3 + +at 0x000002fa : */ 0x80080000,0x00000908, +/* +ENTRY resume_msgin3b +resume_msgin3b: + SET ATN + +at 0x000002fc : */ 0x58000008,0x00000000, +/* + CLEAR ACK + +at 0x000002fe : */ 0x60000040,0x00000000, +/* + INT int_no_msgout3, WHEN NOT MSG_OUT + +at 0x00000300 : */ 0x9e030000,0xab930011, +/* + MOVE SCRATCH0 | had_msgout TO SCRATCH0 + +at 0x00000302 : */ 0x7a340200,0x00000000, +/* + MOVE FROM dsa_msgout, when MSG_OUT + +at 0x00000304 : */ 0x1e000000,0x00000008, +/* + JUMP redo_msgin3 + +at 0x00000306 : */ 0x80080000,0x00000908, +/* + +ENTRY resume_rej_ident +resume_rej_ident: + CLEAR ATN + +at 0x00000308 : */ 0x60000008,0x00000000, +/* + MOVE 1, msgin_buf, WHEN MSG_IN + +at 0x0000030a : */ 0x0f000001,0x00000000, +/* + INT int_not_rej, IF NOT 0x07 ; Reject + +at 0x0000030c : */ 0x98040007,0xab93001c, +/* + CLEAR ACK + +at 0x0000030e : */ 0x60000040,0x00000000, +/* + JUMP done_ident + +at 0x00000310 : */ 0x80080000,0x00000050, +/* + +ENTRY reselect +reselect: + ; Disable selection timer + MOVE CTEST7 | 0x10 TO CTEST7 + +at 0x00000312 : */ 0x7a1b1000,0x00000000, +/* + WAIT RESELECT resel_err + +at 0x00000314 : */ 0x50000000,0x00000c70, +/* + INT int_resel_not_msgin, WHEN NOT MSG_IN + +at 0x00000316 : */ 0x9f030000,0xab930016, +/* + MOVE 1, reselected_identify, WHEN MSG_IN + +at 0x00000318 : */ 0x0f000001,0x00000000, +/* + INT int_reselected + +at 0x0000031a : */ 0x98080000,0xab930017, +/* +resel_err: + MOVE CTEST2 & 0x40 TO SFBR + +at 0x0000031c : */ 0x74164000,0x00000000, +/* + JUMP selected, IF 0x00 + +at 0x0000031e : */ 0x800c0000,0x00000cb0, +/* + MOVE SFBR & 0 TO SFBR + +at 0x00000320 : */ 0x7c080000,0x00000000, +/* +ENTRY patch_new_dsa +patch_new_dsa: + MOVE SFBR | 0x11 TO DSA0 + +at 0x00000322 : */ 0x6a101100,0x00000000, +/* + MOVE SFBR | 0x22 TO DSA1 + +at 0x00000324 : */ 0x6a112200,0x00000000, +/* + MOVE SFBR | 0x33 TO DSA2 + +at 0x00000326 : */ 0x6a123300,0x00000000, +/* + MOVE SFBR | 0x44 TO DSA3 + +at 0x00000328 : */ 0x6a134400,0x00000000, +/* + JUMP do_select + +at 0x0000032a : */ 0x80080000,0x00000000, +/* + +selected: + INT int_selected + +at 0x0000032c : */ 0x98080000,0xab930018, +}; + +#define A_dsa_cmnd 0x00000010 +u32 A_dsa_cmnd_used[] = { + 0x0000001d, +}; + +#define A_dsa_datain 0x00000028 +u32 A_dsa_datain_used[] = { + 0x0000003d, + 0x0000003f, + 0x00000041, + 0x00000043, + 0x00000045, + 0x00000047, + 0x00000049, + 0x0000004b, + 0x0000004d, + 0x0000004f, + 0x00000051, + 0x00000053, + 0x00000055, + 0x00000057, + 0x00000059, + 0x0000005b, + 0x0000005d, + 0x0000005f, + 0x00000061, + 0x00000063, + 0x00000065, + 0x00000067, + 0x00000069, + 0x0000006b, + 0x0000006d, + 0x0000006f, + 0x00000071, + 0x00000073, + 0x00000075, + 0x00000077, + 0x00000079, + 0x0000007b, + 0x0000007d, + 0x0000007f, + 0x00000081, + 0x00000083, + 0x00000085, + 0x00000087, + 0x00000089, + 0x0000008b, + 0x0000008d, + 0x0000008f, + 0x00000091, + 0x00000093, + 0x00000095, + 0x00000097, + 0x00000099, + 0x0000009b, + 0x0000009d, + 0x0000009f, + 0x000000a1, + 0x000000a3, + 0x000000a5, + 0x000000a7, + 0x000000a9, + 0x000000ab, + 0x000000ad, + 0x000000af, + 0x000000b1, + 0x000000b3, + 0x000000b5, + 0x000000b7, + 0x000000b9, + 0x000000bb, + 0x000000bd, + 0x000000bf, + 0x000000c1, + 0x000000c3, + 0x000000c5, + 0x000000c7, + 0x000000c9, + 0x000000cb, + 0x000000cd, + 0x000000cf, + 0x000000d1, + 0x000000d3, + 0x000000d5, + 0x000000d7, + 0x000000d9, + 0x000000db, + 0x000000dd, + 0x000000df, + 0x000000e1, + 0x000000e3, + 0x000000e5, + 0x000000e7, + 0x000000e9, + 0x000000eb, + 0x000000ed, + 0x000000ef, + 0x000000f1, + 0x000000f3, + 0x000000f5, + 0x000000f7, + 0x000000f9, + 0x000000fb, + 0x000000fd, + 0x000000ff, + 0x00000101, + 0x00000103, + 0x00000105, + 0x00000107, + 0x00000109, + 0x0000010b, + 0x0000010d, + 0x0000010f, + 0x00000111, + 0x00000113, + 0x00000115, + 0x00000117, + 0x00000119, + 0x0000011b, + 0x0000011d, + 0x0000011f, + 0x00000121, + 0x00000123, + 0x00000125, + 0x00000127, + 0x00000129, + 0x0000012b, + 0x0000012d, + 0x0000012f, + 0x00000131, + 0x00000133, + 0x00000135, + 0x00000137, + 0x00000139, + 0x0000013b, +}; + +#define A_dsa_dataout 0x00000428 +u32 A_dsa_dataout_used[] = { + 0x00000143, + 0x00000145, + 0x00000147, + 0x00000149, + 0x0000014b, + 0x0000014d, + 0x0000014f, + 0x00000151, + 0x00000153, + 0x00000155, + 0x00000157, + 0x00000159, + 0x0000015b, + 0x0000015d, + 0x0000015f, + 0x00000161, + 0x00000163, + 0x00000165, + 0x00000167, + 0x00000169, + 0x0000016b, + 0x0000016d, + 0x0000016f, + 0x00000171, + 0x00000173, + 0x00000175, + 0x00000177, + 0x00000179, + 0x0000017b, + 0x0000017d, + 0x0000017f, + 0x00000181, + 0x00000183, + 0x00000185, + 0x00000187, + 0x00000189, + 0x0000018b, + 0x0000018d, + 0x0000018f, + 0x00000191, + 0x00000193, + 0x00000195, + 0x00000197, + 0x00000199, + 0x0000019b, + 0x0000019d, + 0x0000019f, + 0x000001a1, + 0x000001a3, + 0x000001a5, + 0x000001a7, + 0x000001a9, + 0x000001ab, + 0x000001ad, + 0x000001af, + 0x000001b1, + 0x000001b3, + 0x000001b5, + 0x000001b7, + 0x000001b9, + 0x000001bb, + 0x000001bd, + 0x000001bf, + 0x000001c1, + 0x000001c3, + 0x000001c5, + 0x000001c7, + 0x000001c9, + 0x000001cb, + 0x000001cd, + 0x000001cf, + 0x000001d1, + 0x000001d3, + 0x000001d5, + 0x000001d7, + 0x000001d9, + 0x000001db, + 0x000001dd, + 0x000001df, + 0x000001e1, + 0x000001e3, + 0x000001e5, + 0x000001e7, + 0x000001e9, + 0x000001eb, + 0x000001ed, + 0x000001ef, + 0x000001f1, + 0x000001f3, + 0x000001f5, + 0x000001f7, + 0x000001f9, + 0x000001fb, + 0x000001fd, + 0x000001ff, + 0x00000201, + 0x00000203, + 0x00000205, + 0x00000207, + 0x00000209, + 0x0000020b, + 0x0000020d, + 0x0000020f, + 0x00000211, + 0x00000213, + 0x00000215, + 0x00000217, + 0x00000219, + 0x0000021b, + 0x0000021d, + 0x0000021f, + 0x00000221, + 0x00000223, + 0x00000225, + 0x00000227, + 0x00000229, + 0x0000022b, + 0x0000022d, + 0x0000022f, + 0x00000231, + 0x00000233, + 0x00000235, + 0x00000237, + 0x00000239, + 0x0000023b, + 0x0000023d, + 0x0000023f, + 0x00000241, +}; + +#define A_dsa_msgin 0x00000020 +u32 A_dsa_msgin_used[] = { + 0x0000002f, +}; + +#define A_dsa_msgout 0x00000008 +u32 A_dsa_msgout_used[] = { + 0x00000013, + 0x00000285, + 0x000002c5, + 0x00000305, +}; + +#define A_dsa_select 0x00000000 +u32 A_dsa_select_used[] = { + 0x00000006, +}; + +#define A_dsa_size 0x00000828 +u32 A_dsa_size_used[] = { +}; + +#define A_dsa_status 0x00000018 +u32 A_dsa_status_used[] = { + 0x0000002b, +}; + +#define A_had_cmdout 0x00000004 +u32 A_had_cmdout_used[] = { + 0x0000001a, +}; + +#define A_had_datain 0x00000008 +u32 A_had_datain_used[] = { + 0x00000038, +}; + +#define A_had_dataout 0x00000010 +u32 A_had_dataout_used[] = { + 0x0000013e, +}; + +#define A_had_extmsg 0x00000080 +u32 A_had_extmsg_used[] = { + 0x0000025a, + 0x0000029a, + 0x000002da, +}; + +#define A_had_msgin 0x00000040 +u32 A_had_msgin_used[] = { + 0x00000248, + 0x00000288, + 0x000002c8, +}; + +#define A_had_msgout 0x00000002 +u32 A_had_msgout_used[] = { + 0x00000010, + 0x00000282, + 0x000002c2, + 0x00000302, +}; + +#define A_had_select 0x00000001 +u32 A_had_select_used[] = { + 0x0000000c, +}; + +#define A_had_status 0x00000020 +u32 A_had_status_used[] = { +}; + +#define A_int_bad_extmsg1a 0xab930000 +u32 A_int_bad_extmsg1a_used[] = { + 0x00000263, +}; + +#define A_int_bad_extmsg1b 0xab930001 +u32 A_int_bad_extmsg1b_used[] = { + 0x0000026b, +}; + +#define A_int_bad_extmsg2a 0xab930002 +u32 A_int_bad_extmsg2a_used[] = { + 0x000002a3, +}; + +#define A_int_bad_extmsg2b 0xab930003 +u32 A_int_bad_extmsg2b_used[] = { + 0x000002ab, +}; + +#define A_int_bad_extmsg3a 0xab930004 +u32 A_int_bad_extmsg3a_used[] = { + 0x000002e3, +}; + +#define A_int_bad_extmsg3b 0xab930005 +u32 A_int_bad_extmsg3b_used[] = { + 0x000002eb, +}; + +#define A_int_bad_msg1 0xab930006 +u32 A_int_bad_msg1_used[] = { + 0x00000255, +}; + +#define A_int_bad_msg2 0xab930007 +u32 A_int_bad_msg2_used[] = { + 0x00000295, +}; + +#define A_int_bad_msg3 0xab930008 +u32 A_int_bad_msg3_used[] = { + 0x000002d5, +}; + +#define A_int_cmd_bad_phase 0xab930009 +u32 A_int_cmd_bad_phase_used[] = { + 0x00000027, +}; + +#define A_int_cmd_complete 0xab93000a +u32 A_int_cmd_complete_used[] = { + 0x00000037, +}; + +#define A_int_data_bad_phase 0xab93000b +u32 A_int_data_bad_phase_used[] = { + 0x00000247, +}; + +#define A_int_disc1 0xab930019 +u32 A_int_disc1_used[] = { + 0x00000277, +}; + +#define A_int_disc2 0xab93001a +u32 A_int_disc2_used[] = { + 0x000002b7, +}; + +#define A_int_disc3 0xab93001b +u32 A_int_disc3_used[] = { + 0x000002f7, +}; + +#define A_int_msg_sdtr1 0xab93000c +u32 A_int_msg_sdtr1_used[] = { + 0x00000271, +}; + +#define A_int_msg_sdtr2 0xab93000d +u32 A_int_msg_sdtr2_used[] = { + 0x000002b1, +}; + +#define A_int_msg_sdtr3 0xab93000e +u32 A_int_msg_sdtr3_used[] = { + 0x000002f1, +}; + +#define A_int_no_msgout1 0xab93000f +u32 A_int_no_msgout1_used[] = { + 0x00000281, +}; + +#define A_int_no_msgout2 0xab930010 +u32 A_int_no_msgout2_used[] = { + 0x000002c1, +}; + +#define A_int_no_msgout3 0xab930011 +u32 A_int_no_msgout3_used[] = { + 0x00000301, +}; + +#define A_int_not_cmd_complete 0xab930012 +u32 A_int_not_cmd_complete_used[] = { + 0x00000031, +}; + +#define A_int_not_rej 0xab93001c +u32 A_int_not_rej_used[] = { + 0x0000030d, +}; + +#define A_int_resel_not_msgin 0xab930016 +u32 A_int_resel_not_msgin_used[] = { + 0x00000317, +}; + +#define A_int_reselected 0xab930017 +u32 A_int_reselected_used[] = { + 0x0000031b, +}; + +#define A_int_sel_no_ident 0xab930013 +u32 A_int_sel_no_ident_used[] = { + 0x0000000f, +}; + +#define A_int_sel_not_cmd 0xab930014 +u32 A_int_sel_not_cmd_used[] = { + 0x00000019, +}; + +#define A_int_selected 0xab930018 +u32 A_int_selected_used[] = { + 0x0000032d, +}; + +#define A_int_status_not_msgin 0xab930015 +u32 A_int_status_not_msgin_used[] = { + 0x0000002d, +}; + +#define A_msgin_buf 0x00000000 +u32 A_msgin_buf_used[] = { + 0x0000024b, + 0x0000025f, + 0x00000267, + 0x0000026f, + 0x0000028b, + 0x0000029f, + 0x000002a7, + 0x000002af, + 0x000002cb, + 0x000002df, + 0x000002e7, + 0x000002ef, + 0x0000030b, +}; + +#define A_reselected_identify 0x00000000 +u32 A_reselected_identify_used[] = { + 0x00000319, +}; + +#define Ent_do_select 0x00000000 +#define Ent_done_ident 0x00000050 +#define Ent_end_data_trans 0x00000908 +#define Ent_patch_input_data 0x000000e8 +#define Ent_patch_new_dsa 0x00000c88 +#define Ent_patch_output_data 0x00000500 +#define Ent_reselect 0x00000c48 +#define Ent_resume_cmd 0x00000068 +#define Ent_resume_msgin1a 0x000009e0 +#define Ent_resume_msgin1b 0x000009f0 +#define Ent_resume_msgin2a 0x00000ae0 +#define Ent_resume_msgin2b 0x00000af0 +#define Ent_resume_msgin3a 0x00000be0 +#define Ent_resume_msgin3b 0x00000bf0 +#define Ent_resume_pmm 0x00000078 +#define Ent_resume_rej_ident 0x00000c20 +#define Ent_wait_disc1 0x000009d0 +#define Ent_wait_disc2 0x00000ad0 +#define Ent_wait_disc3 0x00000bd0 +#define Ent_wait_disc_complete 0x000000d0 +u32 LABELPATCHES[] = { + 0x00000007, + 0x00000009, + 0x00000015, + 0x00000017, + 0x0000001f, + 0x00000021, + 0x00000023, + 0x00000025, + 0x0000013d, + 0x00000243, + 0x00000245, + 0x0000024d, + 0x0000024f, + 0x00000251, + 0x00000253, + 0x00000259, + 0x00000261, + 0x00000269, + 0x0000027b, + 0x00000287, + 0x0000028d, + 0x0000028f, + 0x00000291, + 0x00000293, + 0x00000299, + 0x000002a1, + 0x000002a9, + 0x000002bb, + 0x000002c7, + 0x000002cd, + 0x000002cf, + 0x000002d1, + 0x000002d3, + 0x000002d9, + 0x000002e1, + 0x000002e9, + 0x000002fb, + 0x00000307, + 0x00000311, + 0x00000315, + 0x0000031f, + 0x0000032b, +}; + +struct { + u32 offset; + void *address; +} EXTERNAL_PATCHES[] = { +}; + +u32 INSTRUCTIONS = 407; +u32 PATCHES = 42; +u32 EXTERNAL_PATCHES_LEN = 0; diff --git a/drivers/scsi/sim710_u.h b/drivers/scsi/sim710_u.h new file mode 100644 index 000000000000..e660a847d0c3 --- /dev/null +++ b/drivers/scsi/sim710_u.h @@ -0,0 +1,67 @@ +#undef A_dsa_cmnd +#undef A_dsa_datain +#undef A_dsa_dataout +#undef A_dsa_msgin +#undef A_dsa_msgout +#undef A_dsa_select +#undef A_dsa_size +#undef A_dsa_status +#undef A_had_cmdout +#undef A_had_datain +#undef A_had_dataout +#undef A_had_extmsg +#undef A_had_msgin +#undef A_had_msgout +#undef A_had_select +#undef A_had_status +#undef A_int_bad_extmsg1a +#undef A_int_bad_extmsg1b +#undef A_int_bad_extmsg2a +#undef A_int_bad_extmsg2b +#undef A_int_bad_extmsg3a +#undef A_int_bad_extmsg3b +#undef A_int_bad_msg1 +#undef A_int_bad_msg2 +#undef A_int_bad_msg3 +#undef A_int_cmd_bad_phase +#undef A_int_cmd_complete +#undef A_int_data_bad_phase +#undef A_int_disc1 +#undef A_int_disc2 +#undef A_int_disc3 +#undef A_int_msg_sdtr1 +#undef A_int_msg_sdtr2 +#undef A_int_msg_sdtr3 +#undef A_int_no_msgout1 +#undef A_int_no_msgout2 +#undef A_int_no_msgout3 +#undef A_int_not_cmd_complete +#undef A_int_not_rej +#undef A_int_resel_not_msgin +#undef A_int_reselected +#undef A_int_sel_no_ident +#undef A_int_sel_not_cmd +#undef A_int_selected +#undef A_int_status_not_msgin +#undef A_msgin_buf +#undef A_reselected_identify +#undef Ent_do_select +#undef Ent_done_ident +#undef Ent_end_data_trans +#undef Ent_patch_input_data +#undef Ent_patch_new_dsa +#undef Ent_patch_output_data +#undef Ent_reselect +#undef Ent_resume_cmd +#undef Ent_resume_msgin1a +#undef Ent_resume_msgin1b +#undef Ent_resume_msgin2a +#undef Ent_resume_msgin2b +#undef Ent_resume_msgin3a +#undef Ent_resume_msgin3b +#undef Ent_resume_pmm +#undef Ent_resume_rej_ident +#undef Ent_wait_disc1 +#undef Ent_wait_disc2 +#undef Ent_wait_disc3 +#undef Ent_wait_disc_complete diff --git a/drivers/scsi/sym53c8xx.c b/drivers/scsi/sym53c8xx.c index 969b0ec37186..ed25bdefa76c 100644 --- a/drivers/scsi/sym53c8xx.c +++ b/drivers/scsi/sym53c8xx.c @@ -73,6 +73,7 @@ ** 53C895 (Wide, Fast 40, on-board rom BIOS) ** 53C895A (Wide, Fast 40, on-board rom BIOS) ** 53C896 (Wide, Fast 40 Dual, on-board rom BIOS) +** 53C1510D (Wide, Fast 40 Dual, on-board rom BIOS) ** ** Other features: ** Memory mapped IO diff --git a/drivers/scsi/sym53c8xx_defs.h b/drivers/scsi/sym53c8xx_defs.h index 01b6c82c9255..f45cd0824b31 100644 --- a/drivers/scsi/sym53c8xx_defs.h +++ b/drivers/scsi/sym53c8xx_defs.h @@ -388,6 +388,10 @@ #define PCI_DEVICE_ID_NCR_53C895A 0x12 #endif +#ifndef PCI_DEVICE_ID_NCR_53C1510D +#define PCI_DEVICE_ID_NCR_53C1510D 0xa +#endif + /* ** NCR53C8XX devices features table. */ @@ -492,6 +496,10 @@ typedef struct { {PCI_DEVICE_ID_NCR_53C895A, 0xff, "895a", 6, 31, 7, \ FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM|\ FE_RAM8K|FE_64BIT|FE_IO256|FE_NOPM|FE_LEDC}\ + , \ + {PCI_DEVICE_ID_NCR_53C1510D, 0xff, "1510D", 7, 31, 7, \ + FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM|\ + FE_IO256}\ } /* @@ -509,7 +517,8 @@ typedef struct { PCI_DEVICE_ID_NCR_53C885, \ PCI_DEVICE_ID_NCR_53C895, \ PCI_DEVICE_ID_NCR_53C896, \ - PCI_DEVICE_ID_NCR_53C895A \ + PCI_DEVICE_ID_NCR_53C895A, \ + PCI_DEVICE_ID_NCR_53C1510D \ } /* diff --git a/drivers/sound/esssolo1.c b/drivers/sound/esssolo1.c index d28733487916..c39fc95cc872 100644 --- a/drivers/sound/esssolo1.c +++ b/drivers/sound/esssolo1.c @@ -2097,14 +2097,14 @@ static struct initvol { s->gpbase = pcidev->base_address[4] & PCI_BASE_ADDRESS_IO_MASK; s->irq = pcidev->irq; if (check_region(s->iobase, IOBASE_EXTENT) || - check_region(s->sbbase, SBBASE_EXTENT) || + check_region(s->sbbase+4, SBBASE_EXTENT-4) || check_region(s->ddmabase, DDMABASE_EXTENT) || check_region(s->mpubase, MPUBASE_EXTENT)) { printk(KERN_ERR "solo1: io ports in use\n"); goto err_region; } request_region(s->iobase, IOBASE_EXTENT, "ESS Solo1"); - request_region(s->sbbase, SBBASE_EXTENT, "ESS Solo1"); + request_region(s->sbbase+4, SBBASE_EXTENT-4, "ESS Solo1"); /* allow OPL3 synth module */ request_region(s->ddmabase, DDMABASE_EXTENT, "ESS Solo1"); request_region(s->mpubase, MPUBASE_EXTENT, "ESS Solo1"); if (request_irq(s->irq, solo1_interrupt, SA_SHIRQ, "ESS Solo1", s)) { @@ -2176,7 +2176,7 @@ static struct initvol { free_irq(s->irq, s); err_irq: release_region(s->iobase, IOBASE_EXTENT); - release_region(s->sbbase, SBBASE_EXTENT); + release_region(s->sbbase+4, SBBASE_EXTENT-4); release_region(s->ddmabase, DDMABASE_EXTENT); release_region(s->mpubase, MPUBASE_EXTENT); err_region: @@ -2206,7 +2206,7 @@ static void __exit cleanup_solo1(void) pci_write_config_word(s->pcidev, 0x60, 0); /* turn off DDMA controller address space */ free_irq(s->irq, s); release_region(s->iobase, IOBASE_EXTENT); - release_region(s->sbbase, SBBASE_EXTENT); + release_region(s->sbbase+4, SBBASE_EXTENT-4); release_region(s->ddmabase, DDMABASE_EXTENT); release_region(s->mpubase, MPUBASE_EXTENT); unregister_sound_dsp(s->dev_audio); diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c index 795425201d2b..7439f2906a96 100644 --- a/fs/lockd/mon.c +++ b/fs/lockd/mon.c @@ -143,7 +143,7 @@ xdr_encode_mon(struct rpc_rqst *rqstp, u32 *p, struct nsm_args *argp) char buffer[20]; u32 addr = ntohl(argp->addr); - dprintk("nsm: xdr_encode_mon(%08lx, %ld, %ld, %ld)\n", + dprintk("nsm: xdr_encode_mon(%08x, %d, %d, %d)\n", htonl(argp->addr), htonl(argp->proc), htonl(argp->vers), htonl(argp->proc)); diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c index 0e59754f351d..142d593b22bb 100644 --- a/fs/lockd/svcproc.c +++ b/fs/lockd/svcproc.c @@ -43,7 +43,7 @@ nlmsvc_retrieve_args(struct svc_rqst *rqstp, struct nlm_args *argp, /* Obtain handle for client host */ if (rqstp->rq_client == NULL) { printk(KERN_NOTICE - "lockd: unauthenticated request from (%08lx:%d)\n", + "lockd: unauthenticated request from (%08x:%d)\n", ntohl(rqstp->rq_addr.sin_addr.s_addr), ntohs(rqstp->rq_addr.sin_port)); return nlm_lck_denied_nolocks; @@ -110,7 +110,7 @@ nlmsvc_proc_test(struct svc_rqst *rqstp, struct nlm_args *argp, /* Now check for conflicting locks */ resp->status = nlmsvc_testlock(file, &argp->lock, &resp->lock); - dprintk("lockd: TEST status %ld\n", ntohl(resp->status)); + dprintk("lockd: TEST status %d\n", ntohl(resp->status)); nlm_release_host(host); nlm_release_file(file); return rpc_success; @@ -153,7 +153,7 @@ nlmsvc_proc_lock(struct svc_rqst *rqstp, struct nlm_args *argp, resp->status = nlmsvc_lock(rqstp, file, &argp->lock, argp->block, &argp->cookie); - dprintk("lockd: LOCK status %ld\n", ntohl(resp->status)); + dprintk("lockd: LOCK status %d\n", ntohl(resp->status)); nlm_release_host(host); nlm_release_file(file); return rpc_success; @@ -183,7 +183,7 @@ nlmsvc_proc_cancel(struct svc_rqst *rqstp, struct nlm_args *argp, /* Try to cancel request. */ resp->status = nlmsvc_cancel_blocked(file, &argp->lock); - dprintk("lockd: CANCEL status %ld\n", ntohl(resp->status)); + dprintk("lockd: CANCEL status %d\n", ntohl(resp->status)); nlm_release_host(host); nlm_release_file(file); return rpc_success; @@ -216,7 +216,7 @@ nlmsvc_proc_unlock(struct svc_rqst *rqstp, struct nlm_args *argp, /* Now try to remove the lock */ resp->status = nlmsvc_unlock(file, &argp->lock); - dprintk("lockd: UNLOCK status %ld\n", ntohl(resp->status)); + dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status)); nlm_release_host(host); nlm_release_file(file); return rpc_success; @@ -234,7 +234,7 @@ nlmsvc_proc_granted(struct svc_rqst *rqstp, struct nlm_args *argp, dprintk("lockd: GRANTED called\n"); resp->status = nlmclnt_grant(&argp->lock); - dprintk("lockd: GRANTED status %ld\n", ntohl(resp->status)); + dprintk("lockd: GRANTED status %d\n", ntohl(resp->status)); return rpc_success; } @@ -340,7 +340,7 @@ nlmsvc_proc_share(struct svc_rqst *rqstp, struct nlm_args *argp, /* Now try to create the share */ resp->status = nlmsvc_share_file(host, file, argp); - dprintk("lockd: SHARE status %ld\n", ntohl(resp->status)); + dprintk("lockd: SHARE status %d\n", ntohl(resp->status)); nlm_release_host(host); nlm_release_file(file); return rpc_success; @@ -373,7 +373,7 @@ nlmsvc_proc_unshare(struct svc_rqst *rqstp, struct nlm_args *argp, /* Now try to lock the file */ resp->status = nlmsvc_unshare_file(host, file, argp); - dprintk("lockd: UNSHARE status %ld\n", ntohl(resp->status)); + dprintk("lockd: UNSHARE status %d\n", ntohl(resp->status)); nlm_release_host(host); nlm_release_file(file); return rpc_success; @@ -424,7 +424,7 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp, if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK) || ntohs(saddr.sin_port) >= 1024) { printk(KERN_WARNING - "lockd: rejected NSM callback from %08lx:%d\n", + "lockd: rejected NSM callback from %08x:%d\n", ntohl(rqstp->rq_addr.sin_addr.s_addr), ntohs(rqstp->rq_addr.sin_port)); return rpc_system_err; diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c index 4cac77aec7c7..c40507d02fcf 100644 --- a/fs/lockd/svcsubs.c +++ b/fs/lockd/svcsubs.c @@ -85,7 +85,7 @@ nlm_lookup_file(struct svc_rqst *rqstp, struct nlm_file **result, * the file. */ if ((nfserr = nlmsvc_ops->fopen(rqstp, fh, &file->f_file)) != 0) { - dprintk("lockd: open failed (nfserr %ld)\n", ntohl(nfserr)); + dprintk("lockd: open failed (nfserr %d)\n", ntohl(nfserr)); goto out_free; } diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index eb644935c7e8..4abea6f647a7 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c @@ -685,7 +685,7 @@ exp_procfs_exports(char *buffer, char **start, off_t offset, if (first++) len += sprintf(buffer+len, "%s", " "); if (tmp->h_client != clp) len += sprintf(buffer+len, "("); - len += sprintf(buffer+len, "%ld.%ld.%ld.%ld", + len += sprintf(buffer+len, "%d.%d.%d.%d", htonl(addr.s_addr) >> 24 & 0xff, htonl(addr.s_addr) >> 16 & 0xff, htonl(addr.s_addr) >> 8 & 0xff, diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 97d61a4a6d75..2dcf3e354189 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c @@ -1065,7 +1065,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) error = nfserr_perm; if (!rqstp->rq_secure && EX_SECURE(exp)) { printk(KERN_WARNING - "nfsd: request from insecure port (%08lx:%d)!\n", + "nfsd: request from insecure port (%08x:%d)!\n", ntohl(rqstp->rq_addr.sin_addr.s_addr), ntohs(rqstp->rq_addr.sin_port)); goto out; diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index 7c3e24817b94..87de16aad5ed 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -140,7 +140,7 @@ nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp, if ((avail << 2) < argp->count) { printk(KERN_NOTICE - "oversized read request from %08lx:%d (%d bytes)\n", + "oversized read request from %08x:%d (%d bytes)\n", ntohl(rqstp->rq_addr.sin_addr.s_addr), ntohs(rqstp->rq_addr.sin_port), argp->count); diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 4ef61fe45fe7..ab577897e62b 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1259,7 +1259,7 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t offset, *p++ = htonl(eof); /* end of directory */ *countp = (caddr_t) p - (caddr_t) buffer; - dprintk("nfsd: readdir result %d bytes, eof %d offset %ld\n", + dprintk("nfsd: readdir result %d bytes, eof %d offset %d\n", *countp, eof, cd.offset? ntohl(*cd.offset) : -1); err = 0; diff --git a/fs/qnx4/dir.c b/fs/qnx4/dir.c index ea6b70332fea..17fd71895f23 100644 --- a/fs/qnx4/dir.c +++ b/fs/qnx4/dir.c @@ -43,7 +43,7 @@ static int qnx4_readdir(struct file *filp, void *dirent, filldir_t filldir) bh = bread(inode->i_dev, blknum, QNX4_BLOCK_SIZE); if(bh==NULL) { - printk(KERN_ERR "qnx4_readdir: bread failed (%d)\n", blknum); + printk(KERN_ERR "qnx4_readdir: bread failed (%ld)\n", blknum); break; } i = (filp->f_pos - (((filp->f_pos >> 6) >> 3) << 9)) & 0x3f; diff --git a/include/asm-sparc/head.h b/include/asm-sparc/head.h index 99158444911d..86b2c90786fa 100644 --- a/include/asm-sparc/head.h +++ b/include/asm-sparc/head.h @@ -1,4 +1,4 @@ -/* $Id: head.h,v 1.36 1999/04/20 13:22:42 anton Exp $ */ +/* $Id: head.h,v 1.36.2.1 1999/09/22 11:37:45 jj Exp $ */ #ifndef __SPARC_HEAD_H #define __SPARC_HEAD_H @@ -53,6 +53,12 @@ b linux_sparc_syscall; \ or %l7, %lo(C_LABEL(sunos_sys_table)), %l7; +#define SUNOS_NO_SYSCALL_TRAP \ + b sunos_syscall; \ + rd %psr, %l0; \ + nop; \ + nop; + /* Software trap for Slowaris system calls. */ #define SOLARIS_SYSCALL_TRAP \ b solaris_syscall; \ diff --git a/include/asm-sparc/ipc.h b/include/asm-sparc/ipc.h index ea6733264fb3..d462d5bea57d 100644 --- a/include/asm-sparc/ipc.h +++ b/include/asm-sparc/ipc.h @@ -23,6 +23,9 @@ struct ipc_kludge { #define SHMGET 23 #define SHMCTL 24 +/* Used by the DIPC package, try and avoid reusing it */ +#define DIPC 25 + #define IPCCALL(version,op) ((version)<<16 | (op)) #endif diff --git a/include/asm-sparc/openpromio.h b/include/asm-sparc/openpromio.h index 8989909decbd..bebb788ac753 100644 --- a/include/asm-sparc/openpromio.h +++ b/include/asm-sparc/openpromio.h @@ -29,6 +29,10 @@ struct openpromio #define OPROMGETCONS 0x20004F0A #define OPROMGETFBNAME 0x20004F0B #define OPROMGETBOOTARGS 0x20004F0C +/* Linux extensions */ /* Arguments in oprom_array: */ +#define OPROMSETCUR 0x20004FF0 /* int node - Sets current node */ +#define OPROMPCI2NODE 0x20004FF1 /* int pci_bus, pci_devfn - Sets current node to PCI device's node */ +#define OPROMPATH2NODE 0x20004FF2 /* char path[] - Set current node from fully qualified PROM path */ /* * Return values from OPROMGETCONS: diff --git a/include/asm-sparc64/ipc.h b/include/asm-sparc64/ipc.h index 3e14f7c9fc33..87fe443d54a3 100644 --- a/include/asm-sparc64/ipc.h +++ b/include/asm-sparc64/ipc.h @@ -23,6 +23,9 @@ struct ipc_kludge { #define SHMGET 23 #define SHMCTL 24 +/* Used by the DIPC package, try and avoid reusing it */ +#define DIPC 25 + /* We don't need to maintain backward compatibility on 64bit, we've started fresh */ #define IPCCALL(version,op) (op) diff --git a/include/asm-sparc64/openpromio.h b/include/asm-sparc64/openpromio.h index 0361c668c82b..37420b761c59 100644 --- a/include/asm-sparc64/openpromio.h +++ b/include/asm-sparc64/openpromio.h @@ -29,6 +29,10 @@ struct openpromio #define OPROMGETCONS 0x20004F0A #define OPROMGETFBNAME 0x20004F0B #define OPROMGETBOOTARGS 0x20004F0C +/* Linux extensions */ /* Arguments in oprom_array: */ +#define OPROMSETCUR 0x20004FF0 /* int node - Sets current node */ +#define OPROMPCI2NODE 0x20004FF1 /* int pci_bus, pci_devfn - Sets current node to PCI device's node */ +#define OPROMPATH2NODE 0x20004FF2 /* char path[] - Set current node from fully qualified PROM path */ /* * Return values from OPROMGETCONS: diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h index 676c415c2b6a..6f6978fea426 100644 --- a/include/asm-sparc64/ttable.h +++ b/include/asm-sparc64/ttable.h @@ -1,4 +1,4 @@ -/* $Id: ttable.h,v 1.11.2.1 1999/08/19 01:11:20 davem Exp $ */ +/* $Id: ttable.h,v 1.11.2.2 1999/09/22 11:37:47 jj Exp $ */ #ifndef _SPARC64_TTABLE_H #define _SPARC64_TTABLE_H @@ -107,7 +107,11 @@ ba,pt %xcc, utrap_ill; \ mov lvl, %o1; +#ifdef CONFIG_SUNOS_EMUL #define SUNOS_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sunos_sys_table) +#else +#define SUNOS_SYSCALL_TRAP TRAP(sunos_syscall) +#endif #define LINUX_32BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sys_call_table32) #define LINUX_64BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall, sys_call_table64) #define GETCC_TRAP TRAP(getcc) diff --git a/include/linux/cyclades.h b/include/linux/cyclades.h index f1043fdff26c..008254e6e5e1 100644 --- a/include/linux/cyclades.h +++ b/include/linux/cyclades.h @@ -1,9 +1,9 @@ /* $Revision: 2.6 $$Date: 1998/08/10 16:57:01 $ * linux/include/linux/cyclades.h * - * This file is maintained by Ivan Passos , - * Marcio Saito and - * Randolph Bentson . + * This file was initially written by + * Randolph Bentson and is maintained by + * Ivan Passos . * * This file contains the general definitions for the cyclades.c driver *$Log: cyclades.h,v $ @@ -317,6 +317,7 @@ struct FIRM_ID { #define C_IN_RXOFL 0x00010000 /* RX buffer overflow */ #define C_IN_IOCTLW 0x00020000 /* I/O control w/ wait */ #define C_IN_MRTS 0x00040000 /* modem RTS drop */ +#define C_IN_ICHAR 0x00080000 /* flow control */ @@ -373,6 +374,8 @@ struct FIRM_ID { #define C_CM_TXLOWWM 0x61 /* Tx buffer low water mark */ #define C_CM_RXHIWM 0x62 /* Rx buffer high water mark */ #define C_CM_RXNNDT 0x63 /* rx no new data timeout */ +#define C_CM_TXFEMPTY 0x64 +#define C_CM_ICHAR 0x65 #define C_CM_MDCD 0x70 /* modem DCD change */ #define C_CM_MDSR 0x71 /* modem DSR change */ #define C_CM_MRI 0x72 /* modem RI change */ @@ -410,6 +413,8 @@ struct CH_CTRL { uclong hw_overflow; /* hw overflow counter */ uclong sw_overflow; /* sw overflow counter */ uclong comm_error; /* frame/parity error counter */ + uclong ichar; + uclong filler[7]; }; @@ -490,7 +495,25 @@ struct ZFW_CTRL { /****************** ****************** *******************/ #endif +/* Per card data structure */ +struct cyclades_card { + long base_addr; + long ctl_addr; + int irq; + int num_chips; /* 0 if card absent, -1 if Z/PCI, else Y */ + int first_line; /* minor number of first channel on card */ + int bus_index; /* address shift - 0 for ISA, 1 for PCI */ + int intr_enabled; /* FW Interrupt flag - 0 disabled, 1 enabled */ +#ifdef __KERNEL__ + spinlock_t card_lock; +#else + uclong filler; +#endif +}; +struct cyclades_chip { + int filler; +}; #ifdef __KERNEL__ @@ -508,20 +531,13 @@ struct ZFW_CTRL { #define cy_readw(port) readw(port) #define cy_readl(port) readl(port) -/* Per card data structure */ - -struct cyclades_card { - long base_addr; - long ctl_addr; - int irq; - int num_chips; /* 0 if card absent, -1 if Z/PCI, else Y */ - int first_line; /* minor number of first channel on card */ - int bus_index; /* address shift - 0 for ISA, 1 for PCI */ - int intr_enabled; /* FW Interrupt flag - 0 disabled, 1 enabled */ -}; - -struct cyclades_chip { - int filler; +/* + * Statistics counters + */ +struct cyclades_icount { + __u32 cts, dsr, rng, dcd, tx, rx; + __u32 frame, parity, overrun, brk; + __u32 buf_overrun; }; /* @@ -568,16 +584,18 @@ struct cyclades_port { int xmit_cnt; int default_threshold; int default_timeout; - struct tq_struct tqueue; + unsigned long jiffies[3]; + unsigned long rflush_count; struct termios normal_termios; struct termios callout_termios; + struct cyclades_monitor mon; + struct cyclades_idle_stats idle_stats; + struct cyclades_icount icount; + struct tq_struct tqueue; struct wait_queue *open_wait; struct wait_queue *close_wait; struct wait_queue *shutdown_wait; - struct cyclades_monitor mon; - unsigned long jiffies[3]; - unsigned long rflush_count; - struct cyclades_idle_stats idle_stats; + struct wait_queue *delta_msr_wait; }; /* @@ -590,6 +608,8 @@ struct cyclades_port { #define Cy_EVENT_BREAK 3 #define Cy_EVENT_OPEN_WAKEUP 4 #define Cy_EVENT_SHUTDOWN_WAKEUP 5 +#define Cy_EVENT_DELTA_WAKEUP 6 +#define Cy_EVENT_Z_RX_FULL 7 #define CLOSING_WAIT_DELAY 30*HZ #define CY_CLOSING_WAIT_NONE 65535 @@ -768,6 +788,7 @@ struct cyclades_port { #define CyRTPR (0x21*2) #define CyMSVR1 (0x6C*2) #define CyMSVR2 (0x6D*2) +#define CyANY_DELTA (0xF0) #define CyDSR (0x80) #define CyCTS (0x40) #define CyRI (0x20) diff --git a/include/linux/pci.h b/include/linux/pci.h index a656235f418a..8f5eda0c6c34 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -302,6 +302,7 @@ #define PCI_DEVICE_ID_NCR_53C825 0x0003 #define PCI_DEVICE_ID_NCR_53C815 0x0004 #define PCI_DEVICE_ID_NCR_53C860 0x0006 +#define PCI_DEVICE_ID_NCR_53C1510D 0x000a #define PCI_DEVICE_ID_NCR_53C896 0x000b #define PCI_DEVICE_ID_NCR_53C895 0x000c #define PCI_DEVICE_ID_NCR_53C885 0x000d diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 9d0d94e2e556..e1b0a89363e3 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -194,6 +194,7 @@ enum scsi_directory_inos { PROC_SCSI_AMIGA7XX, PROC_SCSI_MVME16x, PROC_SCSI_BVME6000, + PROC_SCSI_SIM710, PROC_SCSI_A3000, PROC_SCSI_A2091, PROC_SCSI_GVP11, diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 8de134307aa5..bb76e715bdd1 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -99,8 +99,7 @@ extern __inline__ int DQUOT_TRANSFER(struct dentry *dentry, struct iattr *iattr) int error = -EDQUOT; if (dentry->d_inode->i_sb->dq_op) { - if (IS_QUOTAINIT(dentry->d_inode) == 0) - dentry->d_inode->i_sb->dq_op->initialize(dentry->d_inode, -1); + dentry->d_inode->i_sb->dq_op->initialize(dentry->d_inode, -1); error = dentry->d_inode->i_sb->dq_op->transfer(dentry, iattr, current->fsuid); } else { error = notify_change(dentry, iattr); diff --git a/init/main.c b/init/main.c index f316a4746e1e..ed3643f87d9e 100644 --- a/init/main.c +++ b/init/main.c @@ -272,6 +272,7 @@ extern void stram_swap_setup (char *str, int *ints); extern void wd33c93_setup (char *str, int *ints); extern void gvp11_setup (char *str, int *ints); extern void ncr53c7xx_setup (char *str, int *ints); +extern void sim710_setup (char *str, int *ints); #ifdef CONFIG_MAC_SCSI extern void mac_scsi_setup (char *str, int *ints); #endif @@ -824,6 +825,9 @@ static struct kernel_param cooked_params[] __initdata = { || defined(CONFIG_BLZ603EPLUS_SCSI) { "53c7xx=", ncr53c7xx_setup }, #endif +#if defined(CONFIG_SCSI_SIM710) + { "sim710=", sim710_setup }, +#endif #if defined(CONFIG_A3000_SCSI) || defined(CONFIG_A2091_SCSI) \ || defined(CONFIG_GVP11_SCSI) { "wd33c93=", wd33c93_setup }, diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 4994e718ef16..78c54be8e415 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -3,7 +3,7 @@ * * Alan Cox, * - * Version: $Id: icmp.c,v 1.52.2.2 1999/06/20 21:27:39 davem Exp $ + * Version: $Id: icmp.c,v 1.52.2.3 1999/09/22 16:33:02 davem Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -955,7 +955,7 @@ static void icmp_address_reply(struct icmphdr *icmph, struct sk_buff *skb, int l return; } if (sysctl_ip_always_defrag == 0 && net_ratelimit()) - printk(KERN_INFO "Wrong address mask %08lX from %08lX/%s\n", + printk(KERN_INFO "Wrong address mask %08X from %08X/%s\n", ntohl(mask), ntohl(rt->rt_src), dev->name); } diff --git a/net/ipv4/ip_fw.c b/net/ipv4/ip_fw.c index 5e2b1170d592..6319b89e73ba 100644 --- a/net/ipv4/ip_fw.c +++ b/net/ipv4/ip_fw.c @@ -422,7 +422,7 @@ static void dump_packet(const struct iphdr *ip, printk("%d ",f->ipfw.fw_redirpt); } - printk("%s PROTO=%d %ld.%ld.%ld.%ld:%hu %ld.%ld.%ld.%ld:%hu" + printk("%s PROTO=%d %d.%d.%d.%d:%hu %d.%d.%d.%d:%hu" " L=%hu S=0x%2.2hX I=%hu F=0x%4.4hX T=%hu", ifname, ip->protocol, (ntohl(ip->saddr)>>24)&0xFF, @@ -1542,7 +1542,7 @@ static int dump_rule(char *buffer, len=sprintf(buffer, "%9s " /* Chain name */ - "%08lX/%08lX->%08lX/%08lX " /* Source & Destination IPs */ + "%08X/%08X->%08X/%08X " /* Source & Destination IPs */ "%.16s " /* Interface */ "%X %X " /* fw_flg and fw_invflg fields */ "%u " /* Protocol */ diff --git a/net/ipv4/ip_masq.c b/net/ipv4/ip_masq.c index 847bc919bffd..6d0588c005bd 100644 --- a/net/ipv4/ip_masq.c +++ b/net/ipv4/ip_masq.c @@ -2284,7 +2284,7 @@ static int ip_msqhst_procinfo(char *buffer, char **start, off_t offset, * nor cli() 8) */ - sprintf(temp,"%s %08lX:%04X %08lX:%04X %04X %08X %6d %6d %7lu", + sprintf(temp,"%s %08X:%04X %08X:%04X %04X %08X %6d %6d %7lu", masq_proto_name(ms->protocol), ntohl(ms->saddr), ntohs(ms->sport), ntohl(ms->daddr), ntohs(ms->dport), diff --git a/net/ipv4/ip_masq_autofw.c b/net/ipv4/ip_masq_autofw.c index d2a1729c5386..3030144165f5 100644 --- a/net/ipv4/ip_masq_autofw.c +++ b/net/ipv4/ip_masq_autofw.c @@ -2,7 +2,7 @@ * IP_MASQ_AUTOFW auto forwarding module * * - * $Id: ip_masq_autofw.c,v 1.3 1998/08/29 23:51:10 davem Exp $ + * $Id: ip_masq_autofw.c,v 1.3.2.1 1999/08/13 18:26:20 davem Exp $ * * Author: Richard Lynch * @@ -179,13 +179,13 @@ static __inline__ int ip_autofw_add(struct ip_autofw_user * af) { struct ip_autofw * newaf; newaf = kmalloc( sizeof(struct ip_autofw), GFP_KERNEL ); - init_timer(&newaf->timer); if ( newaf == NULL ) { printk("ip_autofw_add: malloc said no\n"); return( ENOMEM ); } + init_timer(&newaf->timer); MOD_INC_USE_COUNT; memcpy(newaf, af, sizeof(struct ip_autofw_user)); diff --git a/net/ipv4/ip_masq_mfw.c b/net/ipv4/ip_masq_mfw.c index 6adf189a27c5..d28f610a44ed 100644 --- a/net/ipv4/ip_masq_mfw.c +++ b/net/ipv4/ip_masq_mfw.c @@ -3,7 +3,7 @@ * * Does (reverse-masq) forwarding based on skb->fwmark value * - * $Id: ip_masq_mfw.c,v 1.3.2.1 1999/07/02 10:10:03 davem Exp $ + * $Id: ip_masq_mfw.c,v 1.3.2.3 1999/09/22 16:33:26 davem Exp $ * * Author: Juan Jose Ciarlante * based on Steven Clarke's portfw diff --git a/net/ipv4/ip_masq_portfw.c b/net/ipv4/ip_masq_portfw.c index d745e8923d1a..c4b1ef4c88e0 100644 --- a/net/ipv4/ip_masq_portfw.c +++ b/net/ipv4/ip_masq_portfw.c @@ -2,7 +2,7 @@ * IP_MASQ_PORTFW masquerading module * * - * $Id: ip_masq_portfw.c,v 1.3.2.1 1999/07/02 10:10:02 davem Exp $ + * $Id: ip_masq_portfw.c,v 1.3.2.2 1999/08/13 18:26:29 davem Exp $ * * Author: Steven Clarke * @@ -423,8 +423,6 @@ static struct ip_masq * portfw_in_create(const struct sk_buff *skb, const struct raddr, rport, iph->saddr, portp[0], 0); - ip_masq_listen(ms); - if (!ms || atomic_read(&mmod_self->mmod_nent) <= 1 /* || ip_masq_nlocks(&portfw_lock) != 1 */ ) /* @@ -432,6 +430,8 @@ static struct ip_masq * portfw_in_create(const struct sk_buff *skb, const struct */ goto out; + ip_masq_listen(ms); + /* * Entry created, lock==1. * if pref_cnt == 0, move diff --git a/net/ipv4/ip_masq_user.c b/net/ipv4/ip_masq_user.c index 5129744195f5..f369f03ddee6 100644 --- a/net/ipv4/ip_masq_user.c +++ b/net/ipv4/ip_masq_user.c @@ -2,7 +2,7 @@ * IP_MASQ_USER user space control module * * - * $Id: ip_masq_user.c,v 1.1.2.1 1999/08/07 10:56:33 davem Exp $ + * $Id: ip_masq_user.c,v 1.1.2.2 1999/08/13 18:26:33 davem Exp $ */ #include diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 4a9cfd20f2b4..c8f416ee3839 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -5,7 +5,7 @@ * * The Internet Protocol (IP) output module. * - * Version: $Id: ip_output.c,v 1.67 1999/03/25 00:43:00 davem Exp $ + * Version: $Id: ip_output.c,v 1.67.2.1 1999/09/07 02:25:23 davem Exp $ * * Authors: Ross Biro, * Fred N. van Kempen, diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 06eb5fe58cd1..b308995b68c2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -717,8 +717,8 @@ void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw, reject_redirect: #ifdef CONFIG_IP_ROUTE_VERBOSE if (IN_DEV_LOG_MARTIANS(in_dev) && net_ratelimit()) - printk(KERN_INFO "Redirect from %lX/%s to %lX ignored." - "Path = %lX -> %lX, tos %02x\n", + printk(KERN_INFO "Redirect from %X/%s to %X ignored." + "Path = %X -> %X, tos %02x\n", ntohl(old_gw), dev->name, ntohl(new_gw), ntohl(saddr), ntohl(daddr), tos); #endif diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 5c9374637d9a..235b36d15a89 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -1,7 +1,7 @@ /* * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem. * - * $Id: sysctl_net_ipv4.c,v 1.38.2.1 1999/08/08 08:43:14 davem Exp $ + * $Id: sysctl_net_ipv4.c,v 1.38.2.2 1999/09/22 16:33:30 davem Exp $ * * Begun April 1, 1996, Mike Shaver. * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS] diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index b158ccf8e97d..904f8b5d3117 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1867,7 +1867,7 @@ do_rewrite: /* Ouch!, this should not happen. */ if (!sk->saddr || !sk->rcv_saddr) { printk(KERN_WARNING "tcp_v4_rebuild_header(): not valid sock addrs: " - "saddr=%08lX rcv_saddr=%08lX\n", + "saddr=%08X rcv_saddr=%08X\n", ntohl(sk->saddr), ntohl(sk->rcv_saddr)); return 0; diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 2353c2e272e5..143b6153fc2c 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c @@ -353,7 +353,7 @@ err_bad_rpc: goto sendit; err_bad_auth: - dprintk("svc: authentication failed (%ld)\n", ntohl(auth_stat)); + dprintk("svc: authentication failed (%d)\n", ntohl(auth_stat)); serv->sv_stats->rpcbadauth++; resp->buf[-1] = xdr_one; /* REJECT */ svc_putlong(resp, xdr_one); /* AUTH_ERROR */ diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index d2248ad74075..f250e34e24a8 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -918,7 +918,7 @@ svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin) int error; int type; - dprintk("svc: svc_create_socket(%s, %d, %08lx:%d)\n", + dprintk("svc: svc_create_socket(%s, %d, %08x:%d)\n", serv->sv_program->pg_name, protocol, ntohl(sin->sin_addr.s_addr), ntohs(sin->sin_port)); diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 1e5ad01c36b7..8f20e82707a2 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -1445,7 +1445,7 @@ xprt_create_socket(int proto, struct sockaddr_in *sap, struct rpc_timeout *to) struct socket *sock; int type, err; - dprintk("RPC: xprt_create_socket(%08lx, %s %d)\n", + dprintk("RPC: xprt_create_socket(%08x, %s %d)\n", sap? ntohl(sap->sin_addr.s_addr) : 0, (proto == IPPROTO_UDP)? "udp" : "tcp", proto); -- 2.39.5