diff options
author | harti <harti@FreeBSD.org> | 2003-06-23 14:46:12 +0000 |
---|---|---|
committer | harti <harti@FreeBSD.org> | 2003-06-23 14:46:12 +0000 |
commit | c1fe1ae28e833cf74f590e714bd3af3e243ed4ae (patch) | |
tree | b0e6e8378df894dbda8022943e32b7199fe5c28d | |
parent | 2b26d4422f5f6254f34998250f00cdac8285e47a (diff) | |
download | FreeBSD-src-c1fe1ae28e833cf74f590e714bd3af3e243ed4ae.zip FreeBSD-src-c1fe1ae28e833cf74f590e714bd3af3e243ed4ae.tar.gz |
This is a driver for Fore PCA200E cards that uses busdma and works on
little endian and big endian and with 32 and 64 bit pointers. It already
has the hooks to be used for HARP, NATM and ngATM.
-rw-r--r-- | share/man/man4/Makefile | 2 | ||||
-rw-r--r-- | share/man/man4/fatm.4 | 106 | ||||
-rw-r--r-- | share/man/man4/natm.4 | 1 | ||||
-rw-r--r-- | share/man/man4/natmip.4 | 1 | ||||
-rw-r--r-- | sys/conf/NOTES | 7 | ||||
-rw-r--r-- | sys/conf/files | 1 | ||||
-rw-r--r-- | sys/dev/fatm/firmware.h | 2393 | ||||
-rw-r--r-- | sys/dev/fatm/if_fatm.c | 3083 | ||||
-rw-r--r-- | sys/dev/fatm/if_fatm_rate.h | 294 | ||||
-rw-r--r-- | sys/dev/fatm/if_fatmreg.h | 499 | ||||
-rw-r--r-- | sys/dev/fatm/if_fatmvar.h | 390 | ||||
-rw-r--r-- | sys/modules/Makefile | 1 | ||||
-rw-r--r-- | sys/modules/fatm/Makefile | 19 |
13 files changed, 6795 insertions, 2 deletions
diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index bbc101b..220e8b1 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -53,6 +53,7 @@ MAN= aac.4 \ exca.4 \ faith.4 \ fast_ipsec.4 \ + fatm.4 \ fd.4 \ fdc.4 \ firewire.4 \ @@ -291,6 +292,7 @@ MLINKS+=ef.4 if_ef.4 MLINKS+=em.4 if_em.4 MLINKS+=en.4 if_en.4 MLINKS+=faith.4 if_faith.4 +MLINKS+=fatm.4 if_fatm.4 MLINKS+=fd.4 stderr.4 fd.4 stdin.4 fd.4 stdout.4 MLINKS+=fpa.4 fea.4 MLINKS+=fwe.4 if_fwp.4 diff --git a/share/man/man4/fatm.4 b/share/man/man4/fatm.4 new file mode 100644 index 0000000..a389f2e --- /dev/null +++ b/share/man/man4/fatm.4 @@ -0,0 +1,106 @@ +.\" +.\" Copyright (c) 2001-2003 +.\" Fraunhofer Institute for Open Communication Systems (FhG Fokus). +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" Author: Hartmut Brandt <harti@freebsd.org> +.\" +.\" $FreeBSD$ +.\" +.\" fatm(4) man page +.\" +.Dd May 15, 2003 +.Dt FATM 4 +.Os FreeBSD +.Sh NAME +.Nm fatm +.Nd Device driver for Fore PCA200E ATM interfaces +.Sh SYNOPSIS +.Cd device fatm +.Cd device utopia +.Cd options atm +.Cd options NATM +.Sh DESCRIPTION +The +.Nm +device driver supports the FORE (now Marconi) PCA200E ATM interface cards. +The driver interfaces with the +.Xr natm 4 +framework, +.Xr netgraph 4 +and HARP. +It provides only PVC services. Signalling, ATMARP, ILMI and other +higher layer protocols are implemented using +.Xr netgraph 4 +or HARP. +.Pp +For configuring the card for IP see +.Xr natmip 4 . +The following sysctls are recognized by the driver additionally to those +handled by +.Xr utopia 4 : +.Bl -tag -width XXX +.It Cm hw.atm.fatmN.stats +Returns a device specific statistic list of +.Dv uint32_t +statistic counters. +.It Cm hw.atm.fatmN.istats +Returns a list of +.Dv uint32_t +with internal driver statistics. +.It Cm hw.atm.fatmN.retry_tx +If this is set packets are stuffed back into the interface's send queue when +the cards transmit queue is found to be full. They are transmitted later. +If this is not set the packets are dropped. It may be useful to set this +if only UBR traffic is sent. +.It Cm hw.atm.fatmN.debug +.Em (only if debugging enabled) +These are debugging flags. See +.Fn if_fatmvar.h +for the possible flags. +.El +.Pp +The driver supports the media options +.Ar sdh , +.Ar noscramb +and +.Ar unassigned +(see +.Xr utopia 4 ). +.Sh DIAGNOSTICS +.Bd -literal +fatm0: <FORE PCA200E> mem 0xd5800000-0xd59fffff irq 9 at device 9.0 on pci0 +.Ed +.Sh SEE ALSO +.Xr natm 4 , +.Xr natmip 4 , +.Xr utopia 4 +.Sh BUGS +These cards can CBR shape a single VCC only. It is currently possible to +request more than one CBR connection. In this case all the timing will be +wrong. See +.Xr hatm 4 +for a better card. +.Sh AUTHORS +.An Harti Brandt Aq harti@freebsd.org . diff --git a/share/man/man4/natm.4 b/share/man/man4/natm.4 index 712c2f7..622ccce 100644 --- a/share/man/man4/natm.4 +++ b/share/man/man4/natm.4 @@ -87,6 +87,7 @@ the services exported. .Sh SEE ALSO .Xr en 4 , .Xr hatm 4 , +.Xr fatm 4 , .Xr natmip 4 .Sh AUTHORS .An Chuck Cranor diff --git a/share/man/man4/natmip.4 b/share/man/man4/natmip.4 index e64acc8..2fbbb00 100644 --- a/share/man/man4/natmip.4 +++ b/share/man/man4/natmip.4 @@ -106,6 +106,7 @@ route_host2="-iface 128.252.200.2 -link en0:3.0.0.cb" .Sh SEE ALSO .Xr en 4 , .Xr hatm 4 , +.Xr fatm 4 , .Xr natm 4 .Sh AUTHORS .An Chuck Cranor diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 9d98a96..4328825 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -1677,13 +1677,15 @@ options MSIZE=512 # mbuf size in bytes # The `hatm' device provides support for Fore/Marconi HE155 and HE622 # ATM PCI cards. # +# The `fatm' device provides support for Fore PCA200E ATM PCI cards. +# # atm device provides generic atm functions and is required for # atm devices. # NATM enables the netnatm protocol family that can be used to # bypass TCP/IP. # -# utopia provides the access to the ATM PHY chips and is required for en -# and hatm +# utopia provides the access to the ATM PHY chips and is required for en, +# hatm and fatm. # # the current driver supports only PVC operations (no atm-arp, no multicast). # for more details, please read the original documents at @@ -1691,6 +1693,7 @@ options MSIZE=512 # mbuf size in bytes # device atm device en +device fatm #Fore PCA200E device hatm #Fore/Marconi HE155/622 device utopia #ATM PHY driver options NATM #native ATM diff --git a/sys/conf/files b/sys/conf/files index 94adcbb..5dc1174 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -392,6 +392,7 @@ dev/ex/if_ex_isa.c optional ex isa dev/ex/if_ex_pccard.c optional ex card #dev/ex/if_ex_pccard.c optional ex pccard dev/exca/exca.c optional cbb +dev/fatm/if_fatm.c optional fatm pci dev/fe/if_fe.c optional fe dev/fe/if_fe_pccard.c optional fe card dev/fe/if_fe_pccard.c optional fe pccard diff --git a/sys/dev/fatm/firmware.h b/sys/dev/fatm/firmware.h new file mode 100644 index 0000000..6e9caf2 --- /dev/null +++ b/sys/dev/fatm/firmware.h @@ -0,0 +1,2393 @@ +/* + * (Copyright Notice) + * + * Copyright (c) 1995-2000 FORE Systems, Inc., as an unpublished work. + * + * This notice does not imply unrestricted or public access to these + * materials which are a trade secret of FORE Systems, Inc. or its + * subsidiaries or affiliates (together referred to as "FORE"), and + * which may not be reproduced, used, sold or transferred to any third + * party without FORE's prior written consent. All rights reserved. + * + * U.S. Government Restricted Rights. + * If you are licensing the Software on behalf of the U.S. Government + * ("Government"), the following provisions apply to you. If the + * software is supplied to the Department of Defense ("DoD"), it is + * classified as "Commercial Computer Software" under paragraph + * 252.227-7014 of the DoD Supplement to the Federal Acquisition + * Regulations ("DFARS") (or any successor regulations) and the + * Government is acquiring only the license rights granted herein (the + * license rights customarily provided to non-Government users). If + * the Software is supplied to any unit or agency of the Government + * other than the DoD, it is classified as "Restricted Computer + * Software" and the Government's rights in the Software are defined + * in paragraph 52.227-19 of the Federal Acquisition Regulations + * ("FAR") (or any successor regulations) or, in the cases of NASA, + * in paragraph 18.52.227-86 of the NASA Supplement to the FAR (or + * any successor regulations). + * + * FORE Systems is a registered trademark, and ForeRunner, ForeRunnerLE, + * and ForeThought are trademarks of FORE Systems, Inc. All other + * brands or product names are trademarks or registered trademarks of + * their respective holders. + * + * (End Copyright Notice) + * + * This is a binary copy of the PCA200E firmware version 4.1.12 + * + * phk got permission from Fore to put firmware images into our tree. + * + * $FreeBSD$ + */ + +static uint32_t firmware[] = { + 0x65726f66, 0x00000100, 0x00005140, 0x000056c0, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00004d40, + 0x00000400, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000003, 0x00000002, 0x00000001, + 0x00000000, 0x00000000, 0x00032d50, 0x00000000, + 0xff80ff01, 0x00000030, 0x7eff7e01, 0x00000070, + 0x0000ff01, 0x00000000, 0x00000000, 0x00000000, + 0x00000f01, 0x00000000, 0xa7a7e701, 0x00000020, + 0x03030b01, 0x00000000, 0x03030b01, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xdf6fdf01, 0x00000000, 0x00007f01, 0x00000000, + 0x0000ff01, 0x00000000, 0x0000ff01, 0x00000000, + 0x7f417f01, 0x00000000, 0x07070701, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xfb00fb01, 0x00000000, 0xf0f0ff01, 0x00000000, + 0x0000ff01, 0x00000000, 0x0000ff01, 0x00000000, + 0x00000f01, 0x00000000, 0x0000ff01, 0x00000000, + 0x0000ff01, 0x00000000, 0x00000f01, 0x00000000, + 0x7f017f01, 0x00000000, 0x01010101, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x8100ad01, 0x00000000, 0x0000af01, 0x00000000, + 0x00000000, 0x00000000, 0xffafff01, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x0000ff01, 0x00000000, + 0x00ffff01, 0x00000000, 0x0000ff01, 0x00000000, + 0x0000ff01, 0x00000000, 0x0000ff01, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x07030701, 0x00000000, 0x7f7e7f01, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xffffff01, 0x00000000, + 0xffffff01, 0x00000090, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0xffffff01, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x7f7fff01, 0x00000004, 0xe0e0fe01, 0x00000000, + 0xffffff01, 0x00000000, 0xffffff01, 0x00000000, + 0x0000ff01, 0x00000000, 0x00ffff01, 0x00000000, + 0x0000ff01, 0x00000000, 0x0000ff01, 0x00000000, + 0x00000301, 0x00000000, 0xffffff01, 0x000000fc, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x9f9fff01, 0x00000004, 0xffffff01, 0x00000000, + 0xffffff01, 0x0000006a, 0xcfcede01, 0x00000000, + 0x0000ff01, 0x00000000, 0x0000ff01, 0x00000000, + 0x00000701, 0x00000000, 0xffffff01, 0x00000008, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x051f0501, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, + 0x8c803000, 0x0003dd50, 0x3287c00c, 0x5c081610, + 0x09000004, 0x66003e80, 0x8c000000, 0x5cf01e00, + 0x8c803000, 0x0000e400, 0x8c883000, 0x0000ed50, + 0x92f41000, 0x59840804, 0x34845ff8, 0x8c803000, + 0x3b001000, 0x0900833c, 0x09008cec, 0x09007ff4, + 0x09006960, 0x09007b3c, 0x90303000, 0x0000e400, + 0x3201a028, 0x5d201610, 0x8c801400, 0x00000000, + 0x8c883000, 0x00005730, 0x59840111, 0x59318010, + 0x86019000, 0x5d801604, 0x09000008, 0x08006b74, + 0x59084810, 0x0900260c, 0x09002238, 0x90a03000, + 0x50001444, 0x5990de08, 0x58248094, 0x8c811000, + 0x090020f0, 0x58a01988, 0x3a250042, 0x3125000e, + 0x3a01201a, 0x080000d4, 0x58901989, 0x3a24804e, + 0x080000c8, 0x00000000, 0x90a83000, 0x0000518c, + 0x5c901e0d, 0x82903000, 0x0000e46c, 0x5ca01e05, + 0x080000a4, 0x00000000, 0x90a83000, 0x0000518c, + 0x5c901e09, 0x82903000, 0x0000e46c, 0x5ca01e04, + 0x08000084, 0x00000000, 0x88a03000, 0x88000402, + 0x5c901e08, 0x5a052f01, 0x82903000, 0x0000e46c, + 0x1200001a, 0x90a83000, 0x0000518c, 0x5ca01e06, + 0x08000054, 0x00000000, 0x3015202a, 0x30052016, + 0x90a83000, 0x0000518c, 0x5ca01e16, 0x08000038, + 0x90a83000, 0x0000518c, 0x59a1d81f, 0x08000028, + 0x3005201a, 0x90a83000, 0x0000518c, 0x59a5d81f, + 0x08000014, 0x00000000, 0x90a83000, 0x0000518c, + 0x8ca00046, 0x92a560b0, 0x09002388, 0x09002ab4, + 0x09001ee0, 0x0b0020a4, 0x58901989, 0x3d24804e, + 0x090045f0, 0x3d04201e, 0x90a83000, 0x0000e470, + 0x8ca03000, 0xdead0014, 0x92a55000, 0x09006ac4, + 0x5c801e00, 0x8c8fe040, 0x0b004710, 0x3a04201e, + 0x90a7e040, 0x90a83000, 0x0000518c, 0x8c90007f, + 0x58a48094, 0x08000010, 0x90a83000, 0x0000518c, + 0x59a01901, 0x92a560b4, 0x8ca03000, 0x00000330, + 0x92a03000, 0x0000e404, 0x090021a8, 0x090051c4, + 0x09005530, 0x5c801e01, 0x090069d8, 0x0a000000, + 0x90803000, 0x0000e408, 0x90a41000, 0x8ce8007f, + 0x58a74094, 0x3a05230a, 0x59a50902, 0x344d21ee, + 0x90a03914, 0x00005920, 0x84051000, 0x00000000, + 0x00005948, 0x00005b2c, 0x00005958, 0x00005a28, + 0x00005968, 0x000059f0, 0x00005a08, 0x00005af8, + 0x00005a30, 0x00005a90, 0x09002a58, 0x5c981610, + 0x080001e0, 0x00000000, 0x09002d18, 0x5c981610, + 0x080001d0, 0x00000000, 0x90a03000, 0x50001444, + 0x5a052f13, 0x8c980002, 0x10000022, 0x58a50993, + 0x92f03000, 0x000056a4, 0x92a03000, 0x50001444, + 0x08000014, 0x00000000, 0x5ca01e01, 0x92a03000, + 0x000056a4, 0x90ac2004, 0x8c803000, 0x20000060, + 0x59a6581f, 0x8c903000, 0x000055d0, 0x5c881e0e, + 0x92a83000, 0x20000054, 0x92a03000, 0x20000060, + 0x598c4901, 0xb0a49000, 0x5a003091, 0x8c94a010, + 0xb2a41000, 0x15ffffec, 0x08000148, 0x00000000, + 0x0b004a18, 0x5a003090, 0x8c980002, 0x15000136, + 0x5c981e0a, 0x0800012c, 0x09004ae8, 0x90a03000, + 0x0000e408, 0x908d2004, 0x5c801e10, 0x8c903000, + 0x0000e4b0, 0x090014ec, 0x5c981e02, 0x08000104, + 0x90a03000, 0x0000e408, 0x90a52004, 0x92a03000, + 0x20000040, 0x90a03000, 0xf001e100, 0x92a03000, + 0x30000060, 0x90a03000, 0xf001e104, 0x92a03000, + 0x30000060, 0x90a03000, 0xf001e064, 0x92a03000, + 0x30000060, 0x90a03000, 0xf001e068, 0x5c981e02, + 0x92a03000, 0x30000060, 0x080000a8, 0x00000000, + 0x90a03000, 0x0000e408, 0x90a52004, 0x59a99014, + 0x8ce83000, 0x000ffff0, 0x92a83000, 0x000002fc, + 0x59af4595, 0x8ce83000, 0x000ff000, 0x59a74614, + 0x8ce83000, 0x0ff00000, 0x58a74094, 0x8ce83000, + 0x000ffff0, 0x92a03000, 0x000002f8, 0x58af4095, + 0x58a50415, 0x92a83000, 0x000002f4, 0x92a03000, + 0x000002f0, 0x0800003c, 0x90a03000, 0x0000e408, + 0x90a51000, 0x8ce83000, 0xd05ed05e, 0x3da74022, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead000d, + 0x5c801e00, 0x92a55000, 0x09006798, 0x5c981e08, + 0x90a83000, 0x0000e408, 0x90a55000, 0x303d2096, + 0x90a03000, 0x0000e40c, 0x90bd6010, 0x8cb56020, + 0x5a052016, 0x92f55000, 0x1600000e, 0x90b03000, + 0x0000e410, 0x90a03000, 0x0000e474, 0x92b83000, + 0x20000038, 0x92983000, 0x30000060, 0x90a51000, + 0x5a003094, 0x92b03000, 0x0000e408, 0x12000042, + 0x90a83000, 0x0000e478, 0x90a55000, 0x59a05014, + 0x92a55000, 0x90a83000, 0x00005160, 0x8ce801ff, + 0x59a85015, 0x58a74095, 0x58a50988, 0x92a83000, + 0x00005160, 0x92a03000, 0x20000004, 0x0a000000, + 0x90a03000, 0x0000e40c, 0x90bd6010, 0x8cb56020, + 0x5a052016, 0x92f55000, 0x1600000e, 0x90b03000, + 0x0000e410, 0x92b83000, 0x20000038, 0x92b03000, + 0x0000e408, 0x92983000, 0x30000060, 0x0a000000, + 0x98242018, 0x90a83000, 0x0000e48c, 0x59a14104, + 0x5a056014, 0x8c341000, 0x14000012, 0x5c801e01, + 0x0a000000, 0x00000000, 0x90a83000, 0x00000350, + 0x3a05603a, 0x90a03000, 0x00000368, 0x59ad4901, + 0x92a83000, 0x00000350, 0x8cb51d95, 0x90a59000, + 0x59aa1005, 0x92a15000, 0x92ac201c, 0x9085a004, + 0x0a000000, 0x00000000, 0x8c803000, 0x00000350, + 0x09005cd0, 0x90a83000, 0x00000350, 0x3a056036, + 0x90a03000, 0x00000368, 0x59ad4901, 0x92a83000, + 0x00000350, 0x8cb51d95, 0x90a59000, 0x59aa1005, + 0x92a15000, 0x92a9a01c, 0x9085a004, 0x0a000000, + 0x90a03000, 0x00005690, 0x59a05014, 0x8c800001, + 0x92a03000, 0x00005690, 0x0a000000, 0x00000000, + 0x98242018, 0x90a83000, 0x0000e48c, 0x59a14104, + 0x5a056014, 0x8c341000, 0x14000012, 0x5c801e01, + 0x0a000000, 0x00000000, 0x90a83000, 0x00000380, + 0x3a05603a, 0x90a03000, 0x00000398, 0x59ad4901, + 0x92a83000, 0x00000380, 0x8cb51d95, 0x90a59000, + 0x59aa1005, 0x92a15000, 0x92ac201c, 0x9085a004, + 0x0a000000, 0x00000000, 0x8c803000, 0x00000380, + 0x09005c00, 0x90a83000, 0x00000380, 0x3a056036, + 0x90a03000, 0x00000398, 0x59ad4901, 0x92a83000, + 0x00000380, 0x8cb51d95, 0x90a59000, 0x59aa1005, + 0x92a15000, 0x92a9a01c, 0x9085a004, 0x0a000000, + 0x90a03000, 0x00005694, 0x59a05014, 0x8c800001, + 0x92a03000, 0x00005694, 0x0a000000, 0x00000000, + 0x98242018, 0x90a83000, 0x0000e48c, 0x59a14104, + 0x5a056014, 0x8c341000, 0x14000012, 0x5c801e01, + 0x0a000000, 0x00000000, 0x90a83000, 0x000003b0, + 0x3a05603a, 0x90a03000, 0x000003c8, 0x59ad4901, + 0x92a83000, 0x000003b0, 0x8cb51d95, 0x90a59000, + 0x59aa1005, 0x92a15000, 0x92ac201c, 0x9085a004, + 0x0a000000, 0x00000000, 0x8c803000, 0x000003b0, + 0x09005b30, 0x90a83000, 0x000003b0, 0x3a056036, + 0x90a03000, 0x000003c8, 0x59ad4901, 0x92a83000, + 0x000003b0, 0x8cb51d95, 0x90a59000, 0x59aa1005, + 0x92a15000, 0x92a9a01c, 0x9085a004, 0x0a000000, + 0x90a03000, 0x00005698, 0x59a05014, 0x8c800001, + 0x92a03000, 0x00005698, 0x0a000000, 0x00000000, + 0x98242018, 0x90a83000, 0x0000e48c, 0x59a14104, + 0x5a056014, 0x8c341000, 0x14000012, 0x5c801e01, + 0x0a000000, 0x00000000, 0x90a83000, 0x0000e420, + 0x3a05603a, 0x90a03000, 0x0000e438, 0x59ad4901, + 0x92a83000, 0x0000e420, 0x8cb51d95, 0x90a59000, + 0x59aa1005, 0x92a15000, 0x92ac201c, 0x9085a004, + 0x0a000000, 0x00000000, 0x8c803000, 0x0000e420, + 0x09005a60, 0x90a83000, 0x0000e420, 0x3a056036, + 0x90a03000, 0x0000e438, 0x59ad4901, 0x92a83000, + 0x0000e420, 0x8cb51d95, 0x90a59000, 0x59aa1005, + 0x92a15000, 0x92a9a01c, 0x9085a004, 0x0a000000, + 0x90a03000, 0x0000569c, 0x59a05014, 0x8c800001, + 0x92a03000, 0x0000569c, 0x0a000000, 0x00000000, + 0x8c086040, 0xb2c7e070, 0x5cc01610, 0x8c803000, + 0x00000350, 0x598c581f, 0x090060e8, 0x8c803000, + 0x00000380, 0x598c581f, 0x090060d8, 0x8c803000, + 0x000003b0, 0x598c581f, 0x090060c8, 0x8c803000, + 0x0000e420, 0x598c581f, 0x090060b8, 0x8ca03000, + 0x00005690, 0x92a03000, 0x00000378, 0x8ca03000, + 0x00005694, 0x92a03000, 0x000003a8, 0x8ca03000, + 0x00005698, 0x92a03000, 0x000003d8, 0x8ca03000, + 0x0000569c, 0x92a03000, 0x0000e448, 0x90a62078, + 0x92a03000, 0x00000360, 0x90ae2088, 0x92a83000, + 0x00000390, 0x90b62098, 0x92b03000, 0x000003c0, + 0x90be20a8, 0x8c262040, 0x5a003094, 0x92b83000, + 0x0000e430, 0x1500001e, 0x3d05601a, 0x3d05a016, + 0x3d05e012, 0x5c801e08, 0xb0c7e070, 0x0a000000, + 0x90a92034, 0x92a83000, 0x00000364, 0x90b12044, + 0x92b03000, 0x00000394, 0x90b92054, 0x92b83000, + 0x000003c4, 0x90a03000, 0x00000360, 0x90812064, + 0x5a003094, 0x92803000, 0x0000e434, 0x1200000e, + 0x8cc8003f, 0x3eae5fb2, 0x90a03000, 0x00000390, + 0x3a05200e, 0x8cc8003f, 0x3eb65f9e, 0x90a03000, + 0x000003c0, 0x3a05200e, 0x8cc8003f, 0x3ebe5f8a, + 0x90a03000, 0x0000e430, 0x3a05200e, 0x8cc8003f, + 0x3e865f76, 0x90a03000, 0x00000360, 0x3a052026, + 0x90a03000, 0x00000390, 0x3a05201a, 0x90a83000, + 0x00000364, 0x90a03000, 0x00000394, 0x39ad1f4a, + 0x90a03000, 0x000003c0, 0x3a052026, 0x90a03000, + 0x0000e430, 0x3a05201a, 0x90a83000, 0x000003c4, + 0x90a03000, 0x0000e434, 0x39ad1f1e, 0x90a03000, + 0x00000360, 0x3d05202e, 0x90a83000, 0x00000394, + 0x8ca03000, 0x00005ce0, 0x92a03000, 0x0000e450, + 0x92a83000, 0x00000364, 0x08000018, 0x00000000, + 0x8ca03000, 0x00005c10, 0x92a03000, 0x0000e450, + 0x90a03000, 0x000003c0, 0x3d05202a, 0x90a83000, + 0x0000e434, 0x8ca03000, 0x00005e80, 0x92a03000, + 0x0000e454, 0x92a83000, 0x000003c4, 0x08000014, + 0x8ca03000, 0x00005db0, 0x92a03000, 0x0000e454, + 0x90b9203c, 0x92b83000, 0x0000035c, 0x9081204c, + 0x92803000, 0x0000038c, 0x9091205c, 0x92903000, + 0x000003bc, 0x90e83000, 0x00000360, 0x9099206c, + 0x5a00309d, 0x92983000, 0x0000e42c, 0x1200000a, + 0x3b05fe56, 0x5927d81f, 0x31b91e4e, 0x58a0d097, + 0x3d053e46, 0x90883000, 0x00000390, 0x3a04600a, + 0x3b043e36, 0x31811e32, 0x58a0d090, 0x3d053e2a, + 0x90b03000, 0x000003c0, 0x3a05a00a, 0x3b04be1a, + 0x31911e16, 0x58a0d092, 0x3d053e0e, 0x90a83000, + 0x0000e430, 0x3a05600a, 0x3b04fdfe, 0x31991dfa, + 0x58a0d093, 0x3d053df2, 0x3a07600a, 0x3cedddea, + 0x3a04600a, 0x3c8c1de2, 0x3a05a00a, 0x3cb49dda, + 0x3a05600a, 0x3cacddd2, 0x90683000, 0x00000390, + 0xb0803000, 0x00000380, 0x90183000, 0x00000360, + 0xb0a03000, 0x00000350, 0x90783000, 0x0000e430, + 0xb0403000, 0x0000e420, 0x90703000, 0x000003c0, + 0xb0203000, 0x000003b0, 0x59e8c117, 0x5960cd01, + 0x8caf5000, 0x5cb0160c, 0x92a03000, 0x00000350, + 0x92e83000, 0x00000354, 0x92b83000, 0x0000035c, + 0x92603000, 0x00000358, 0x59a34113, 0x596b4d01, + 0x8c8d1000, 0x5c90160d, 0x92803000, 0x00000380, + 0x92a03000, 0x00000384, 0x92683000, 0x00000388, + 0x92983000, 0x0000038c, 0x59a38107, 0x59738d01, + 0x8c2d1000, 0x5c30160e, 0x92203000, 0x000003b0, + 0x92a03000, 0x000003b4, 0x92703000, 0x000003b8, + 0x92383000, 0x000003bc, 0x59a3c10b, 0x597bcd01, + 0x8c4d1000, 0x5c50160f, 0x92403000, 0x0000e420, + 0x92a03000, 0x0000e424, 0x5a003083, 0x92783000, + 0x0000e428, 0x8c803000, 0x00000350, 0x5c201e00, + 0x92583000, 0x0000e42c, 0x12000062, 0x908e2070, + 0x5cd01610, 0x8cd83000, 0x00000338, 0x92803000, + 0x00000330, 0x92d83000, 0x00000334, 0x090026e4, + 0x5a023090, 0x8c200001, 0x12fffc8e, 0x90a03000, + 0x0000036c, 0x92a6200c, 0x90803000, 0x00000360, + 0x59840e03, 0x09003a4c, 0x5a003090, 0x92803000, + 0x00000368, 0x12fffc62, 0x90a03000, 0x00000390, + 0x5a003094, 0x8c803000, 0x00000390, 0x1200007e, + 0x59cc0910, 0x8ca03984, 0x00000000, 0x8ca83000, + 0x00000330, 0x92cfe060, 0x8cb57c14, 0x00000008, + 0x92b7e064, 0x90cfe060, 0x908e2080, 0x59a54014, + 0x59840910, 0x92cd1000, 0x92b52004, 0x09002654, + 0x5a023090, 0x8c212001, 0x12fffbfe, 0x90a03000, + 0x0000039c, 0x92a62010, 0x90803000, 0x00000390, + 0x59840e03, 0x090039bc, 0x5a003090, 0x92803000, + 0x00000398, 0x12fffbd2, 0x90a03000, 0x000003c0, + 0x5a003094, 0x8c803000, 0x000003c0, 0x1200007e, + 0x59cc0910, 0x8ca03984, 0x00000000, 0x8ca83000, + 0x00000330, 0x92cfe050, 0x8cb57c14, 0x00000008, + 0x92b7e054, 0x90cfe050, 0x908e2090, 0x59a54014, + 0x59840910, 0x92cd1000, 0x92b52004, 0x090025c4, + 0x5a023090, 0x8c212001, 0x12fffb6e, 0x90a03000, + 0x000003cc, 0x92a62014, 0x90803000, 0x000003c0, + 0x59840e03, 0x0900392c, 0x5a003090, 0x92803000, + 0x000003c8, 0x12fffb42, 0x90a03000, 0x0000e430, + 0x5a003094, 0x8c803000, 0x0000e430, 0x1200007e, + 0x59cc0910, 0x8ca03984, 0x00000000, 0x8ca83000, + 0x00000330, 0x92cfe040, 0x8cb57c14, 0x00000008, + 0x92b7e044, 0x90cfe040, 0x908e20a0, 0x59a54014, + 0x59840910, 0x92cd1000, 0x92b52004, 0x09002534, + 0x5a023090, 0x8c212001, 0x12fffade, 0x90a03000, + 0x0000e43c, 0x92a62018, 0x90803000, 0x0000e430, + 0x59840e03, 0x0900389c, 0x5a003090, 0x92803000, + 0x0000e438, 0x12fffab2, 0x8ca03000, 0x00000330, + 0x5c801e02, 0x92a53d84, 0xfffffffc, 0xb0c7e070, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c201610, 0x92803000, 0x0000e468, 0x59a40901, + 0x8c2c5000, 0x70814090, 0x92f03000, 0x00000308, + 0x92f03000, 0x00000304, 0x92a03000, 0x0000030c, + 0x09003830, 0x5a003090, 0x92803000, 0x0000e460, + 0x15000012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x8c803904, 0x00000000, 0x09003808, 0x5a003090, + 0x92803000, 0x00000300, 0x15000012, 0x5c801e08, + 0x0a000000, 0x00000000, 0x8cb00000, 0x5a012096, + 0x90b83000, 0x0000e460, 0x13000062, 0x5a012f00, + 0x8c880000, 0x1000001e, 0x5cb01e01, 0x5a012096, + 0x59a44017, 0x59b94017, 0x92a41000, 0x1300003e, + 0x90a83000, 0x00000300, 0x59a44017, 0x92a55d16, + 0x90a83000, 0x00000300, 0x59b94017, 0x59a44017, + 0x92a57d16, 0x00000004, 0x59b09016, 0x5a012096, + 0x59b94017, 0x14ffffcc, 0x59810e02, 0x09003774, + 0x5a003090, 0x92803000, 0x0000e464, 0x1500000e, + 0x5c801e08, 0x0a000000, 0x8cb00000, 0x3bb1003e, + 0x30012016, 0x5cb01e01, 0x5a012096, 0x92f41000, + 0x1300002a, 0x90a03000, 0x0000e464, 0x92f51d16, + 0x90a03000, 0x0000e464, 0x92f53d16, 0x00000004, + 0x59b09016, 0x3cb11fe0, 0x5c801e02, 0x0a000000, + 0x90a83000, 0x00000304, 0x90a03000, 0x00000300, + 0x8ca51d15, 0x90951000, 0x5a003092, 0x8c2c1000, + 0x5c201611, 0x12000036, 0x92f51000, 0x90a03000, + 0x00000304, 0x90a83000, 0x0000e468, 0x928c9000, + 0x59861010, 0x8cb4a008, 0x92941000, 0x92b42004, + 0x0800005c, 0x00000000, 0x90a03000, 0x00005154, + 0x3b05206a, 0x090001bc, 0x90a83000, 0x00000304, + 0x90a03000, 0x00000300, 0x8ca51d15, 0x90951000, + 0x3a04a04a, 0x92f51000, 0x90a03000, 0x00000304, + 0x90a83000, 0x0000e468, 0x92249000, 0x59b61005, + 0x8cbca008, 0x92959000, 0x92bda004, 0x59ad4901, + 0x8ca52001, 0x58a54094, 0x8c800001, 0x92a03000, + 0x00000304, 0x0a000000, 0x90a03000, 0x000056a0, + 0x59a05014, 0x8c800000, 0x92a03000, 0x000056a0, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x90883000, 0x0000e48c, 0x5c201610, 0x09002f10, + 0x90b03000, 0x0000e484, 0x90803000, 0x00000308, + 0x90a03000, 0x00000308, 0x90a83000, 0x0000e468, + 0x90b83000, 0x00000300, 0x59a05014, 0x8cb03a16, + 0x00000010, 0x59ad4901, 0x92b11000, 0x58a54094, + 0x9225dd10, 0x92a03000, 0x00000308, 0x0a000000, + 0x8cf03000, 0x00006898, 0x5c88161e, 0x8cf00000, + 0x90a83000, 0x00005158, 0x90b83000, 0x0000e464, + 0x90a03000, 0x0000e468, 0x90b03000, 0x00005154, + 0x9085dd15, 0x59a50901, 0x8cad6001, 0x58ad0095, + 0x59b58901, 0x92a83000, 0x00005158, 0x92b03000, + 0x00005154, 0x84045000, 0x0a000000, 0x00000000, + 0x8cf03000, 0x0000690c, 0x5c90161e, 0x8cf00000, + 0x90a03000, 0x000056a0, 0x90b83000, 0x0000515c, + 0x90883000, 0x0000e464, 0x90a83000, 0x0000e468, + 0x90b03000, 0x00005154, 0x59a05014, 0x92a03000, + 0x000056a0, 0x59ad4901, 0x8ca5e001, 0x58a54094, + 0x92845d17, 0x59b05016, 0x92a03000, 0x0000515c, + 0x92b03000, 0x00005154, 0x84049000, 0x0a000000, + 0x8c403000, 0x00005158, 0x8c383000, 0x00000310, + 0x8c483000, 0x20000004, 0x8c303000, 0x00000308, + 0x90883000, 0x00000310, 0x90a45000, 0x3a05216e, + 0x90a21000, 0x90b03000, 0x0000e464, 0x90a83000, + 0x0000e468, 0x90259d14, 0x59ad4901, 0x8ca52001, + 0x58a54094, 0x92a21000, 0x59a91004, 0x90b55000, + 0x90a03000, 0x00005154, 0x8c803000, 0x0000ffff, + 0x58840096, 0x92855000, 0x908c5000, 0x59a50901, + 0x92a03000, 0x00005154, 0x5c901604, 0x8c803890, + 0x00000009, 0x59840c03, 0x592d8d90, 0x09000564, + 0x90a1d000, 0x90a83000, 0x00000314, 0x59b21014, + 0x90bd2004, 0x5a056016, 0x92f51000, 0x1600000e, + 0x90b03000, 0x00000318, 0x90a03000, 0x0000e474, + 0x92b83000, 0x20000038, 0x58a94981, 0x92a83000, + 0x30000060, 0x90a51000, 0x5a003094, 0x92b1d000, + 0x1200003e, 0x90a83000, 0x0000e478, 0x90a55000, + 0x59a05014, 0x92a55000, 0x90a83000, 0x00005160, + 0x8c9801ff, 0x59a85015, 0x58a4c095, 0x92a83000, + 0x00005160, 0x58a50988, 0x92a25000, 0x90883000, + 0x0000e48c, 0x5c801604, 0x09002cb4, 0x90a03000, + 0x0000e484, 0x90803000, 0x00000308, 0x90b83000, + 0x00000300, 0x90b03000, 0x0000e468, 0x90a83000, + 0x00005154, 0x8ca03a14, 0x00000010, 0x92a11000, + 0x90a19000, 0x5a003095, 0x9225dd10, 0x59b58901, + 0x8ca52001, 0x58a58094, 0x92a19000, 0x11fffe94, + 0x0a000000, 0x00000000, 0x0a000000, 0x00000000, + 0x90a42058, 0x5a013094, 0x8cec9000, 0x5c301613, + 0x1200001a, 0x3425200e, 0x3a0520d2, 0x08000100, + 0x3a2d206a, 0x080000f8, 0x3d14e032, 0x90a03000, + 0x00005634, 0x90a83000, 0x00005648, 0x598d0011, + 0x8cad6001, 0x92883000, 0x00005634, 0x92a83000, + 0x00005648, 0x080000c8, 0x90a03000, 0x00005640, + 0x90a83000, 0x00005650, 0x598d0011, 0x8cad6001, + 0x92883000, 0x00005640, 0x92a83000, 0x00005650, + 0x0800009c, 0x00000000, 0x3d14e032, 0x90a03000, + 0x00005664, 0x90a83000, 0x00005674, 0x598d0011, + 0x8cad6001, 0x92883000, 0x00005664, 0x92a83000, + 0x00005674, 0x08000068, 0x90a03000, 0x00005668, + 0x90a83000, 0x00005680, 0x598d0011, 0x8cad6001, + 0x92883000, 0x00005668, 0x92a83000, 0x00005680, + 0x0800003c, 0x00000000, 0x3d14e022, 0x90a03000, + 0x00005624, 0x598d0011, 0x92883000, 0x00005624, + 0x0800001c, 0x00000000, 0x90a03000, 0x00005628, + 0x598d0011, 0x92883000, 0x00005628, 0x98242018, + 0x59a14104, 0x59a50908, 0x59a50c03, 0x92a12004, + 0x90a42058, 0x598a1004, 0x5a003094, 0xb0a42030, + 0x12000016, 0x3e954012, 0x598c1004, 0x59ec8115, + 0x92a9200c, 0x3ced801a, 0x59ef4116, 0x92b46004, + 0x5a05a09d, 0x8c8c6008, 0x13fffff0, 0x3b07600a, + 0x92ec6004, 0x90a03000, 0x00005154, 0x3b05200a, + 0x09fffce0, 0x90883000, 0x00000310, 0x90a45000, + 0x3d05207a, 0x90812004, 0x90903000, 0x0000515c, + 0x90883000, 0x0000e464, 0x90a83000, 0x0000515c, + 0x90b03000, 0x0000e468, 0x90b83000, 0x00005154, + 0x59a18e10, 0x58a40394, 0x92a12004, 0x92245d12, + 0x90a03000, 0x000056a0, 0x59b58901, 0x8cad6001, + 0x58ad8095, 0x8cbde001, 0x92a83000, 0x0000515c, + 0x92b83000, 0x00005154, 0x59a05014, 0x92a03000, + 0x000056a0, 0x0a000000, 0x90812004, 0x908c5000, + 0x5c901604, 0x8c803890, 0x00000009, 0x59840d83, + 0x09000240, 0x90a03000, 0x00000310, 0x90a83000, + 0x00000314, 0x59b21014, 0x90bd2004, 0x5a056016, + 0x92f51000, 0x1600000e, 0x90b03000, 0x00000318, + 0x5a023086, 0x92b83000, 0x20000038, 0x58a18981, + 0x92b03000, 0x00000310, 0x92a03000, 0x30000060, + 0x15000022, 0x90a59000, 0x3d052066, 0x90a03000, + 0x0000e474, 0x90a51000, 0x3a052056, 0x08000014, + 0x90a03000, 0x0000e474, 0x90a51000, 0x3a052042, + 0x90a83000, 0x0000e478, 0x90a55000, 0x59a05014, + 0x92a55000, 0x90a83000, 0x00005160, 0x8c3801ff, + 0x59a85015, 0x58a1c095, 0x58a50988, 0x92a83000, + 0x00005160, 0x92a03000, 0x20000004, 0x90883000, + 0x0000e48c, 0x5c801604, 0x09002964, 0x90b03000, + 0x0000e484, 0x90803000, 0x00000308, 0x90a03000, + 0x00000308, 0x90a83000, 0x0000e468, 0x90b83000, + 0x00000300, 0x59a05014, 0x8cb03a16, 0x00000010, + 0x59ad4901, 0x92b11000, 0x58a54094, 0x9225dd10, + 0x92a03000, 0x00000308, 0x0a000000, 0x65944490, + 0x0a000000, 0x66003805, 0x0a000000, 0x5c801621, + 0x0a000000, 0x5c083610, 0x5c801610, 0x5c801610, + 0x5c801610, 0x5c801610, 0x5c801610, 0x5c801610, + 0x5c801610, 0x5c801610, 0x0a000000, 0x5c003610, + 0x0a000000, 0x5c801620, 0x0a000000, 0x8c203000, + 0x001f0000, 0x592c0e10, 0x65290284, 0x5c801605, + 0x0a000000, 0x65801290, 0x0a000000, 0x8c203000, + 0xffffffff, 0x61244010, 0x5c801604, 0x0a000000, + 0x61944010, 0x5c801612, 0x0a000000, 0x61244110, + 0x5c801604, 0x0a000000, 0x00000000, 0x00000000, + 0x5c981e00, 0x92883000, 0x20000030, 0x5a042093, + 0x8ca03990, 0x00000000, 0x92a03000, 0x20000060, + 0x13000052, 0x8ce83000, 0x10000008, 0x8c883000, + 0x30000000, 0x90a75000, 0x343d2016, 0x8ca83000, + 0x10000008, 0x90a55000, 0x333d3ffc, 0xb0a45000, + 0xb2a49000, 0xb0a45000, 0x59985013, 0x8c94a010, + 0x5a042093, 0xb2a49000, 0x59941012, 0x14ffffc8, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c981e00, 0x92883000, 0x20000054, 0x5a042093, + 0x8ca03990, 0x00000000, 0x92a03000, 0x20000060, + 0x13000032, 0x8c883000, 0x30000060, 0xb0a49000, + 0x59941012, 0x8c9ce001, 0x5a042093, 0xb2a45000, + 0xb0a49000, 0x59941012, 0xb2a45000, 0x14ffffe0, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5a00b090, 0x92883000, 0x20000054, 0x5c981610, + 0x8c8c9000, 0x92803000, 0x20000060, 0x1200002a, + 0x3c142012, 0x3a0c2032, 0x08000040, 0x00000000, + 0x3d1c203a, 0x90a49000, 0x59891012, 0x92a03000, + 0x20000060, 0x90a45000, 0x59891011, 0x92a03000, + 0x20000060, 0x90a45000, 0x92a03000, 0x20000060, + 0x0a000000, 0x00000000, 0x58a3d092, 0x3a452032, + 0x34452012, 0x3a252016, 0x0800004c, 0x00000000, + 0x3a652032, 0x08000040, 0x90a49000, 0x59891012, + 0x599c0901, 0x92a03000, 0x20000060, 0x90a45000, + 0x59891011, 0x599cc901, 0x92a03000, 0x20000060, + 0x90a45000, 0x59891011, 0x599cc901, 0x92a03000, + 0x20000060, 0x3b1ce026, 0x8c803000, 0x20000060, + 0x599cc904, 0xb0a45000, 0x5a00f093, 0x8c8c6010, + 0xb2a41000, 0x11ffffec, 0x3b04e026, 0x8ca83000, + 0x20000060, 0x599cc901, 0x90a45000, 0x5a003093, + 0x8c8c6004, 0x92a55000, 0x11ffffec, 0x0a000000, + 0x8cb000ff, 0x58858090, 0x8ca80000, 0x8c883000, + 0x04c4b3ff, 0x8cb83000, 0x10000004, 0x92803000, + 0x20000004, 0x90a5d000, 0x58a58094, 0x3aa40026, + 0x59a85015, 0x3eac5ff0, 0x90a83000, 0x0000e470, + 0x8ca03000, 0xdead0006, 0x92a55000, 0x08005284, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8cb800ff, 0x5ca81e00, 0x8c883000, 0x04c4b3ff, + 0x8c803000, 0x10000004, 0x80b03000, 0x00005160, + 0x90a41000, 0x58a5c094, 0x3aa5802a, 0x59a85015, + 0x3eac5ff0, 0x90a83000, 0x0000e470, 0x8ca03000, + 0xdead0007, 0x92a55000, 0x08005228, 0x00000000, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8cf03000, 0x000071a0, 0x5c80161e, 0x8cf00000, + 0x90a03000, 0x0000e474, 0x90a51000, 0x3a052042, + 0x90a83000, 0x0000e478, 0x90a55000, 0x59a05014, + 0x92a55000, 0x90a83000, 0x00005160, 0x8cb001ff, + 0x59a85015, 0x58a58095, 0x58a50988, 0x92a83000, + 0x00005160, 0x92a03000, 0x20000004, 0x84041000, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c281610, 0x59314901, 0x8c200000, 0x8c403000, + 0x00002710, 0x59398e02, 0x09fffc6c, 0x58840105, + 0x09fffc5c, 0x5ca01604, 0x5a022094, 0x8c212001, + 0x1600009e, 0x34f9a096, 0x90a1f400, 0x000071f8, + 0x84051000, 0x00000000, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x00007278, 0x00007278, + 0x00007278, 0x00007278, 0x090050d8, 0x09fffbb8, + 0x58814090, 0x3d043f44, 0x5c801e01, 0x0a000000, + 0x8c086040, 0xb2807400, 0xffffffc0, 0xb2a07400, + 0xffffffd0, 0xb2c07400, 0xffffffe0, 0xb2e07400, + 0xfffffff0, 0x90a03000, 0x0000516c, 0x3d052022, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0001, + 0x92a55000, 0x0900507c, 0x09004fe8, 0x90a03000, + 0x10000000, 0x8c8800d2, 0x58a44094, 0x8c880028, + 0x58a44394, 0x8c200000, 0x8c283000, 0x00002710, + 0x92a03000, 0x10000000, 0x09fffb2c, 0x58840e00, + 0x09fffb1c, 0x5ca01604, 0x5a016094, 0x8c212001, + 0x1600000a, 0x0900502c, 0x09fffb0c, 0x37043fdc, + 0x90a83000, 0x00005178, 0x90a03000, 0x00005174, + 0x5a003095, 0x8ca52001, 0x92a03000, 0x00005174, + 0x1200005a, 0x90a03000, 0x0000e474, 0x90a51000, + 0x3a052052, 0x90a83000, 0x0000e478, 0x90a55000, + 0x59a05014, 0x92a55000, 0x90a83000, 0x00005160, + 0x8c8801ff, 0x59a85015, 0x58a44095, 0x58a50988, + 0x92a83000, 0x00005160, 0x92a03000, 0x20000004, + 0x08000010, 0x00000000, 0x92f03000, 0x0000516c, + 0xb0807400, 0xffffffc0, 0xb0a07400, 0xffffffd0, + 0xb0c07400, 0xffffffe0, 0xb0e07400, 0xfffffff0, + 0x5c083603, 0x0a000000, 0x00000000, 0x00000000, + 0x8c086040, 0xb2807400, 0xffffffc0, 0xb2a07400, + 0xffffffd0, 0xb2c07400, 0xffffffe0, 0xb2e07400, + 0xfffffff0, 0x90a03000, 0x50001444, 0x3025200e, + 0x3085200a, 0x0900039c, 0x90a03000, 0x50001444, + 0x302d200e, 0x308d200a, 0x090003a8, 0x90a03000, + 0x50001444, 0x3035200e, 0x3095200a, 0x090003b4, + 0x90a03000, 0x50000c44, 0x3015200e, 0x301d200a, + 0x090003c0, 0x5c201e00, 0x8c283000, 0x00002710, + 0x09fff9d4, 0x58840e04, 0x09fff9c4, 0x5ca01604, + 0x5a016094, 0x8c212001, 0x1600000a, 0x09004ed4, + 0x09fff9b4, 0x37243fdc, 0xb0807400, 0xffffffc0, + 0xb0a07400, 0xffffffd0, 0xb0c07400, 0xffffffe0, + 0xb0e07400, 0xfffffff0, 0x5c083603, 0x0a000000, + 0x8c086040, 0xb2807400, 0xffffffc0, 0xb2a07400, + 0xffffffd0, 0xb2c07400, 0xffffffe0, 0xb2e07400, + 0xfffffff0, 0x90a03000, 0x00005184, 0x3d052022, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0002, + 0x92a55000, 0x09004e5c, 0x09004dc8, 0x5c201e00, + 0x8c283000, 0x00002710, 0x09000438, 0x09fff928, + 0x58840e05, 0x09fff918, 0x5ca01604, 0x5a016094, + 0x8c212001, 0x1600000a, 0x09004e28, 0x09fff908, + 0x372c3fdc, 0xb0807400, 0xffffffc0, 0xb0a07400, + 0xffffffd0, 0xb0c07400, 0xffffffe0, 0xb0e07400, + 0xfffffff0, 0x5c083603, 0x0a000000, 0x00000000, + 0x8c086040, 0xb2807400, 0xffffffc0, 0xb2a07400, + 0xffffffd0, 0xb2c07400, 0xffffffe0, 0xb2e07400, + 0xfffffff0, 0x90a03000, 0x00005168, 0x3d052022, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0003, + 0x92a55000, 0x09004dac, 0x09004d18, 0x90a03000, + 0x10000000, 0x8c8800d2, 0x58a44094, 0x58a50980, + 0x8c200000, 0x8c283000, 0x00002710, 0x92a03000, + 0x10000000, 0x09fff860, 0x58840e02, 0x09fff850, + 0x5ca01604, 0x5a016094, 0x8c212001, 0x1600000a, + 0x09004d60, 0x09fff840, 0x37143fdc, 0xb0807400, + 0xffffffc0, 0xb0a07400, 0xffffffd0, 0xb0c07400, + 0xffffffe0, 0xb0e07400, 0xfffffff0, 0x5c083603, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8c086040, 0xb2807400, 0xffffffc0, 0xb2a07400, + 0xffffffd0, 0xb2c07400, 0xffffffe0, 0xb2e07400, + 0xfffffff0, 0x90a03000, 0x00005164, 0x3d052022, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0004, + 0x92a55000, 0x09004cdc, 0x09004c48, 0xb0807400, + 0xffffffc0, 0xb0a07400, 0xffffffd0, 0xb0c07400, + 0xffffffe0, 0xb0e07400, 0xfffffff0, 0x5c083603, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x09fff744, 0x90242004, 0x902c2010, 0x5c801e00, + 0x8c403000, 0x00003201, 0x09fff73c, 0x5c801e00, + 0x8c480004, 0x09fff758, 0x8c583000, 0x00005820, + 0x9259201c, 0x9a412010, 0x8ca03000, 0x00007290, + 0x92a1604c, 0x8ca03000, 0x00007560, 0x8ca83000, + 0x00007630, 0x8cb03000, 0x000073e0, 0x8c800401, + 0x5c881e00, 0x8c900000, 0x92a1608c, 0x92a960cc, + 0x92b1610c, 0x09fff6c8, 0x5c801e00, 0x09fff700, + 0x8c800fff, 0x09fff6d0, 0x5c801e01, 0x08fff700, + 0x09fff6b4, 0x90242004, 0x902c2010, 0x5c801e00, + 0x09fff6b4, 0x5c801e00, 0x09fff6d4, 0x8ca00054, + 0x92a12014, 0x8ca03000, 0x00005800, 0x8ca83000, + 0x000073e0, 0x8cb03000, 0x000074b0, 0x8c800401, + 0x5c881e00, 0x8c900000, 0x92a1201c, 0x92a9610c, + 0x92b1614c, 0x09fff658, 0x5c801e00, 0x09fff690, + 0x8c800fff, 0x09fff660, 0x5c801e01, 0x08fff690, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0010, + 0x92a55000, 0x09004b8c, 0x5c801e01, 0x08004af4, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0011, + 0x92a55000, 0x09004b6c, 0x5c801e01, 0x08004ad4, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0012, + 0x92a55000, 0x09004b4c, 0x5c801e01, 0x08004ab4, + 0x90a83000, 0x0000e470, 0x8ca03000, 0xdead0013, + 0x92a55000, 0x09004b2c, 0x5c801e01, 0x08004a94, + 0x8cf03000, 0x00007854, 0x5c88161e, 0x8cf00000, + 0x8ca000ff, 0x58850090, 0x92803000, 0x50001c08, + 0x84045000, 0x0a000000, 0x00000000, 0x00000000, + 0x58b01988, 0x5a05a090, 0x5da01e00, 0x1200003e, + 0x31858012, 0x3a04201e, 0x08000058, 0x00000000, + 0x58e81989, 0x3a87403e, 0x08000048, 0x00000000, + 0x8ca03000, 0xca61b882, 0x8ca83000, 0x3ed27476, + 0x08000030, 0x00000000, 0x8ca03000, 0xfc8b99de, + 0x8ca83000, 0x3eca5d3b, 0x08000018, 0x00000000, + 0x8ca03000, 0x9d7ab6d8, 0x8ca83000, 0x3ec7c262, + 0x5c901e00, 0x8c983000, 0x4177d784, 0x5d801614, + 0x090068a0, 0x090062c0, 0x8ca000ff, 0x58850090, + 0x92803000, 0x50001c08, 0x0a000000, 0x00000000, + 0x8cf03000, 0x00007930, 0x5c80161e, 0x8cf00000, + 0x90a03000, 0x50001c04, 0x92f03000, 0x00005184, + 0x58a50e01, 0x92a03000, 0x50001c04, 0x84041000, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x90a03000, 0x00005184, 0x3d05200a, 0x09004974, + 0x90a83000, 0x50001c04, 0x58ad4989, 0x3055600a, + 0x58ad498a, 0x90a03000, 0x0000517c, 0x92a83000, + 0x50001c04, 0x59a05014, 0x92a03000, 0x0000517c, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c20161e, 0x90803000, 0x0000518c, 0x5988de06, + 0x090046b0, 0x5ca01610, 0x90a03000, 0x10000000, + 0x8ca800d2, 0x58a54094, 0x58ad0980, 0x92a83000, + 0x10000000, 0x90a03000, 0x0000518c, 0x59af1014, + 0x92a83000, 0x0000e474, 0x90a03000, 0x0000518c, + 0x8cad2020, 0x92a83000, 0x0000e478, 0x90a03000, + 0x0000518c, 0x8cad2030, 0x92a83000, 0x0000e470, + 0x90a03000, 0x0000518c, 0x8cad202c, 0x92a83000, + 0x0000e47c, 0x5ca01e01, 0x92a03000, 0x0000e480, + 0x90a03000, 0x0000518c, 0x8ca83000, 0x0000b800, + 0x92ad2028, 0x90a03000, 0x0000518c, 0x8ca83000, + 0x00032d50, 0x92ad2024, 0x90a03000, 0x0000518c, + 0x8ca83000, 0x0004010c, 0x92ad2034, 0x90a03000, + 0x0000518c, 0x90a83000, 0x00005190, 0x90b56010, + 0x59ad8e10, 0x92ad2038, 0x0a000000, 0x00000000, + 0x59084810, 0x8c279000, 0x90a03000, 0x00005190, + 0x8ca83000, 0xce11feed, 0x92ad2008, 0x90a83000, + 0x0000e470, 0x90a03000, 0x0000e470, 0x90a83000, + 0x0000e470, 0x90b55000, 0x59ad8901, 0x92ad1000, + 0x90a51000, 0x90a03000, 0x0000518c, 0x90ad2040, + 0x8cb0007f, 0x58a58095, 0x5a003094, 0x120000de, + 0x5a007094, 0x1200000e, 0x080000d8, 0x00000000, + 0x90803000, 0x0000518c, 0x09000c28, 0x5ca01610, + 0x92a7e040, 0x90a03000, 0x0000518c, 0x90afe040, + 0x58b54981, 0x92b52044, 0x90a03000, 0x0000518c, + 0x90ad2040, 0x58881987, 0x58a44095, 0x5a003094, + 0x12000060, 0x90a03000, 0x0000e474, 0x90ad1000, + 0x5a003095, 0x1200004c, 0x90a03000, 0x0000e478, + 0x90a83000, 0x0000e478, 0x90b55000, 0x59a85016, + 0x92ad1000, 0x90a03000, 0x00005160, 0x59a85014, + 0x8ca55000, 0x92a03000, 0x00005160, 0x8ca800ff, + 0x58a54094, 0x58ad0988, 0x92a83000, 0x20000004, + 0x90a03000, 0x0000518c, 0x5ca81e00, 0x92ad2040, + 0x90a7e040, 0x5a00b094, 0x15000008, 0x0a000000, + 0x08000010, 0x00000000, 0x08000008, 0x00000000, + 0x08000010, 0x00000000, 0x08000010, 0x00000000, + 0x08fffecc, 0x00000000, 0x0a000000, 0x00000000, + 0x59084810, 0x8ca79000, 0x90a83000, 0x50000c44, + 0x58b54980, 0x92b03000, 0x50000c44, 0x90a83000, + 0x50000c44, 0x58b54e00, 0x92b03000, 0x50000c44, + 0x90a83000, 0x50000c44, 0x58b54e02, 0x92b03000, + 0x50000c44, 0x5ca81e00, 0x92a83000, 0x50001048, + 0x5ca81e01, 0x92a83000, 0x50001044, 0x5ca81e00, + 0x92afe040, 0x90afe040, 0x5a00f015, 0x1600000e, + 0x08000080, 0x00000000, 0x90afe040, 0x5cb01615, + 0x8ca83916, 0x00000000, 0x8cb03000, 0x50001010, + 0x59ad8015, 0x8cb00000, 0x59ad8015, 0x8cb55000, + 0x5ca81e0f, 0x92ad9000, 0x90afe040, 0x5cb01615, + 0x8ca83916, 0x00000000, 0x8cb03000, 0x50001000, + 0x59ad8015, 0x8cb00000, 0x59ad8015, 0x8cb55000, + 0x5ca81e00, 0x92ad9000, 0x90b7e040, 0x59a85016, + 0x8cb55000, 0x92b7e040, 0x08ffff7c, 0x00000000, + 0x90a83000, 0x50001c04, 0x58b54982, 0x92b03000, + 0x50001c04, 0x90a83000, 0x50001444, 0x58b54e01, + 0x92b03000, 0x50001444, 0x8ca801f4, 0x92a83000, + 0x50001430, 0x90a83000, 0x50001444, 0x58b54987, + 0x92b03000, 0x50001444, 0x90a83000, 0x50001444, + 0x58b54986, 0x92b03000, 0x50001444, 0x90a83000, + 0x50001444, 0x58b54e04, 0x92b03000, 0x50001444, + 0x90a83000, 0x50001444, 0x58b54e05, 0x92b03000, + 0x50001444, 0x0a000000, 0x00000000, 0x00000000, + 0x59084810, 0x8c279000, 0x5ca01e00, 0x92a03000, + 0x10000000, 0x90a03000, 0x10000000, 0x8ca800d2, + 0x58a54094, 0x58ad0981, 0x92a83000, 0x10000000, + 0x90a03000, 0x10000000, 0x8ca800d0, 0x58a54094, + 0x92a03000, 0x10000000, 0x90a03000, 0x10000000, + 0x8ca800d2, 0x58a54094, 0x58ad0980, 0x92a83000, + 0x10000000, 0x90a03000, 0x10000000, 0x8ca800d2, + 0x58a54094, 0x8ca80028, 0x58a54394, 0x92a03000, + 0x10000000, 0x5c801e0a, 0x0b002780, 0x5ca01610, + 0x90a03000, 0x50001c04, 0x58ad0983, 0x92a83000, + 0x50001c04, 0x5984d81f, 0x0b002760, 0x5ca01610, + 0x90a03000, 0x50001c04, 0x59a8de0b, 0x58a54394, + 0x8ca83000, 0x00001838, 0x5a056094, 0x12000010, + 0x5c801e01, 0x0900448c, 0x5ca01610, 0x90a03000, + 0x50000c44, 0x5a003094, 0x12000010, 0x5c801e01, + 0x09004470, 0x5ca01610, 0x90a03000, 0x50001444, + 0x59a8de08, 0x58a54394, 0x59a8de08, 0x5a056094, + 0x12000010, 0x5c801e01, 0x09004448, 0x5ca01610, + 0x90a03000, 0x50000c44, 0x58ad0981, 0x92a83000, + 0x50000c44, 0x90a03000, 0x50000c44, 0x58ad0980, + 0x92a83000, 0x50000c44, 0x90a03000, 0x50001444, + 0x58ad0982, 0x92a83000, 0x50001444, 0x90a03000, + 0x50001444, 0x58ad0980, 0x92a83000, 0x50001444, + 0x90a03000, 0x50001444, 0x58ad0e0a, 0x92a83000, + 0x50001444, 0x90a03000, 0x50001c04, 0x58ad0985, + 0x92a83000, 0x50001c04, 0x90a03000, 0x50001c04, + 0x58ad0984, 0x92a83000, 0x50001c04, 0x90a03000, + 0x50001c04, 0x58ad0e03, 0x92a83000, 0x50001c04, + 0x8c803000, 0x00041eb0, 0x0b002640, 0x5ca01610, + 0x8ca00000, 0x92a7e040, 0x90a7e040, 0x5a00f014, + 0x1600000a, 0x080000a4, 0x90a7e040, 0x5ca81614, + 0x8ca03915, 0x00000000, 0x8ca83000, 0x90000c00, + 0x59a54014, 0x8cb00000, 0x59ad8014, 0x8ca55000, + 0x90afe040, 0x5cb01615, 0x59ad8e0a, 0x90b03000, + 0x00005188, 0x59ad4016, 0x92ad1000, 0x90a7e040, + 0x5ca81614, 0x8ca03915, 0x00000000, 0x8ca83000, + 0x90000c10, 0x59a54014, 0x8cb00000, 0x59ad8014, + 0x8ca55000, 0x90afe040, 0x5cb01615, 0x59ad8e0a, + 0x90b03000, 0x00005188, 0x59ad4016, 0x92ad1000, + 0x90afe040, 0x59a05015, 0x8cad1000, 0x92afe040, + 0x08ffff58, 0x00000000, 0x90a03000, 0x0000e480, + 0x5a007094, 0x1500006c, 0x90a03000, 0x00005188, + 0x58a8198d, 0x59a54014, 0x92a03000, 0x90001400, + 0x90a03000, 0x00005188, 0x58a8198d, 0x59a54014, + 0x92a03000, 0x90001410, 0x90a03000, 0x00005188, + 0x58a8198c, 0x59a54014, 0x92a03000, 0x90001800, + 0x90a03000, 0x00005188, 0x58a8198c, 0x59a54014, + 0x92a03000, 0x90001810, 0x08000168, 0x00000000, + 0x5ca01e00, 0x92a7e040, 0x90a7e040, 0x5a00f014, + 0x1600000a, 0x0800014c, 0x90a7e040, 0x5ca81614, + 0x8ca03915, 0x00000000, 0x8ca83000, 0x90001400, + 0x59a54014, 0x8cb00000, 0x59ad8014, 0x8ca55000, + 0x90afe040, 0x59b0de0b, 0x70ad8095, 0x58b0198d, + 0x59ad8015, 0x90b03000, 0x00005188, 0x59ad4016, + 0x92ad1000, 0x90a7e040, 0x5ca81614, 0x8ca03915, + 0x00000000, 0x8ca83000, 0x90001410, 0x59a54014, + 0x8cb00000, 0x59ad8014, 0x8ca55000, 0x90afe040, + 0x59b0de0b, 0x70ad8095, 0x58b0198d, 0x59ad8015, + 0x90b03000, 0x00005188, 0x59ad4016, 0x92ad1000, + 0x90a7e040, 0x5ca81614, 0x8ca03915, 0x00000000, + 0x8ca83000, 0x90001800, 0x59a54014, 0x8cb00000, + 0x59ad8014, 0x8ca55000, 0x90afe040, 0x5cb01615, + 0x59ad8e0a, 0x58b0198c, 0x59ad8015, 0x90b03000, + 0x00005188, 0x59ad4016, 0x92ad1000, 0x90a7e040, + 0x5ca81614, 0x8ca03915, 0x00000000, 0x8ca83000, + 0x90001810, 0x59a54014, 0x8cb00000, 0x59ad8014, + 0x8ca55000, 0x90afe040, 0x5cb01615, 0x59ad8e0a, + 0x58b0198c, 0x59ad8015, 0x90b03000, 0x00005188, + 0x59ad4016, 0x92ad1000, 0x90afe040, 0x59a05015, + 0x8cad1000, 0x92afe040, 0x08fffeb0, 0x00000000, + 0x5ca01e01, 0x92a03000, 0x50001044, 0x5ca01e00, + 0x92a7e040, 0x90a7e040, 0x5a00f014, 0x1600000e, + 0x08000080, 0x00000000, 0x90a7e040, 0x5ca81614, + 0x8ca03915, 0x00000000, 0x8ca83000, 0x50001010, + 0x59a54014, 0x8ca80000, 0x59a54014, 0x8cad1000, + 0x5ca01e0f, 0x92a55000, 0x90a7e040, 0x5ca81614, + 0x8ca03915, 0x00000000, 0x8ca83000, 0x50001000, + 0x59a54014, 0x8ca80000, 0x59a54014, 0x8cad1000, + 0x5ca01e00, 0x92a55000, 0x90afe040, 0x59a05015, + 0x8cad1000, 0x92afe040, 0x08ffff7c, 0x00000000, + 0x90a03000, 0x50000c44, 0x58ad0e01, 0x92a83000, + 0x50000c44, 0x90a03000, 0x50000c44, 0x58ad0e00, + 0x92a83000, 0x50000c44, 0x90a03000, 0x50001444, + 0x58ad0e02, 0x92a83000, 0x50001444, 0x90a03000, + 0x50001444, 0x58ad0e00, 0x92a83000, 0x50001444, + 0x90a03000, 0x50001444, 0x58ad098a, 0x92a83000, + 0x50001444, 0x90a03000, 0x50001c04, 0x58ad0e05, + 0x92a83000, 0x50001c04, 0x90a03000, 0x50001c04, + 0x58ad0e04, 0x92a83000, 0x50001c04, 0x90a03000, + 0x50001444, 0x58ad0993, 0x92a83000, 0x50001444, + 0x5c801e00, 0x0a000000, 0x0a000000, 0x00000000, + 0x5ca0161e, 0x8ca80000, 0x92a83000, 0x50001044, + 0x5ca81e1f, 0x92a83000, 0x50001048, 0x80a83000, + 0x0000e46c, 0x92a83000, 0x50001000, 0x5ca81e01, + 0x92a83000, 0x50001010, 0x80a83000, 0x0000e46c, + 0x92a83000, 0x50001004, 0x5ca81e01, 0x92a83000, + 0x50001014, 0x80a83000, 0x0000e46c, 0x92a83000, + 0x50001008, 0x5ca81e01, 0x92a83000, 0x50001018, + 0x80a83000, 0x0000e46c, 0x92a83000, 0x5000100c, + 0x5ca81e01, 0x92a83000, 0x5000101c, 0x0a000000, + 0x90bc1000, 0x908c1000, 0x90a42004, 0x90b03000, + 0x000002f4, 0x90903000, 0x000002f8, 0x90983000, + 0x000002fc, 0x90a83000, 0x000002f0, 0x8c303000, + 0x0000ff00, 0x59a50e04, 0x58b58094, 0x58a48094, + 0x59a50413, 0x58b50396, 0x58ad4096, 0x5a003095, + 0x58b98097, 0x59edcc08, 0x8c303000, 0x00ff0000, + 0x58898091, 0x598c4c10, 0x12000012, 0x5c801e0a, + 0x0a000000, 0x00000000, 0x5a003091, 0x59b58c04, + 0x12000012, 0x3a0c6076, 0x08ffffe4, 0x00000000, + 0x90a03000, 0x00000390, 0x3a053fd6, 0x90a03000, + 0x00000360, 0x3a05201a, 0x90a03000, 0x0000e490, + 0x3d052022, 0x34fda00a, 0x3d75a01a, 0x8c883000, + 0x00005ce0, 0x8cb83000, 0x00000380, 0x08000014, + 0x8cb83000, 0x00000350, 0x90883000, 0x0000e450, + 0x8c903000, 0x00005ce0, 0x8c983000, 0x00000380, + 0x08000068, 0x00000000, 0x90a03000, 0x0000e430, + 0x3a053f6e, 0x90a03000, 0x000003c0, 0x3a05201a, + 0x90a03000, 0x0000e490, 0x3d0d2022, 0x34fda00a, + 0x3d75a01a, 0x8c883000, 0x00005e80, 0x8cb83000, + 0x0000e420, 0x08000014, 0x8cb83000, 0x000003b0, + 0x90883000, 0x0000e454, 0x8c903000, 0x00005e80, + 0x8c983000, 0x0000e420, 0x90a83000, 0x0000e4a0, + 0x5a01309d, 0x59a58e07, 0x59254014, 0x120000a6, + 0x3c276012, 0x3a076016, 0x08fffef4, 0x00000000, + 0x3a2f60d2, 0x08fffee8, 0x90a42008, 0x5984581f, + 0x70ad0590, 0x3d05600a, 0x5ca81e01, 0x90a12010, + 0x8c303000, 0x0000b700, 0x5a01a094, 0x92a92054, + 0x12000032, 0x592d1004, 0x90895000, 0x3c8d401e, + 0x70940091, 0x8c811000, 0x5c981e02, 0x09ffe544, + 0x92f15000, 0x92f12024, 0x5c801e02, 0x0a000000, + 0x9289203c, 0x92912040, 0x90a5e014, 0x74a50590, + 0x92a1202c, 0x8ca83000, 0x0000b7b0, 0x90a4e014, + 0x92a92010, 0x74a50590, 0x8c941000, 0x08000084, + 0x90a12010, 0x8c303000, 0x0000b700, 0x3da19e52, + 0x9289203c, 0x92912040, 0x90a5e014, 0x5993581f, + 0x74a50592, 0x92a1202c, 0x90a4e014, 0x74a50592, + 0x8ca83000, 0x0000b780, 0x5c281e04, 0x08000040, + 0x90a12010, 0x8c303000, 0x0000b700, 0x3da19e12, + 0x92992040, 0x92b9203c, 0x90a5e014, 0x5994581f, + 0x74a50592, 0x92a1202c, 0x90a4e014, 0x74a50592, + 0x8ca83000, 0x0000b250, 0x5c281e00, 0x92a92010, + 0x92a12030, 0x9081202c, 0x8c892030, 0xb0a45000, + 0x70840092, 0x92e92058, 0x59840105, 0x8cac1000, + 0x70950092, 0x92846004, 0x5cb01612, 0x8c800002, + 0x92a45000, 0x92946008, 0x92bc600c, 0x0a000000, + 0x90a42004, 0x90b03000, 0x000002f4, 0x90b83000, + 0x000002f8, 0x90803000, 0x000002fc, 0x90a83000, + 0x000002f0, 0x59a50e04, 0x58b58094, 0x58a5c094, + 0x59a50410, 0x58b50396, 0x58ad4096, 0x3a05600e, + 0x5c801e0a, 0x0a000000, 0x90a03000, 0x0000e4a0, + 0x59b58c04, 0x59ad8e07, 0x59250015, 0x90a12010, + 0x8c283000, 0x0000b700, 0x3da14012, 0x5c801e0a, + 0x0a000000, 0x00000000, 0x90892014, 0x3b046016, + 0x5c801604, 0x8c900000, 0x5c981e08, 0x09ffe3b4, + 0x5c801604, 0x58881987, 0x09003948, 0x58a0199f, + 0x92292010, 0x5c801e02, 0x92a12044, 0x0a000000, + 0x90b42060, 0x90ac2060, 0x8c542040, 0x5c481610, + 0x8ca83995, 0x00000020, 0x58a7d095, 0x5a003094, + 0x92b03000, 0x0000e494, 0x92a83000, 0x0000e498, + 0x12000012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x90a4205c, 0x59bd0e03, 0x8cade020, 0x58a7d095, + 0x5a003094, 0x92a83000, 0x0000e48c, 0x1200000e, + 0x5c801e08, 0x0a000000, 0x90a42058, 0x58a0d094, + 0x3a052012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x90942050, 0x90ac2054, 0x90b42058, 0x909c2058, + 0x90ec2058, 0x90242070, 0x902c2078, 0x90342080, + 0x903c2088, 0x90442090, 0x5962581f, 0x70930092, + 0x8ca5e028, 0x70a58094, 0x90b42098, 0x90bc20a0, + 0x908c20a8, 0x8cac9d95, 0x59ad0015, 0x8c9d5d13, + 0x8cecdd1d, 0x8c275d84, 0x8c291d85, 0x8c315d86, + 0x8c399d87, 0x8c41dd88, 0x8cb21d96, 0x8c583000, + 0x0003cd4f, 0x8c603000, 0x00032d50, 0x8cbd9d97, + 0x59a2c10c, 0x8c8ddd91, 0x368d0012, 0x5c801e08, + 0x0a000000, 0x00000000, 0x090000b8, 0x3d44200e, + 0x5c801e08, 0x0a000000, 0x8c825000, 0x09000124, + 0x3d442012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x8c825000, 0x0900018c, 0x3d442012, 0x5c801e08, + 0x0a000000, 0x00000000, 0x8c825000, 0x09ffd6d4, + 0x3d442012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x90826058, 0x90883000, 0x0000e48c, 0x09ffdd04, + 0x3d442012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x8c829000, 0x09000afc, 0x3d442012, 0x5c801e08, + 0x0a000000, 0x00000000, 0x8c800000, 0x09ffe7b4, + 0x90a2a024, 0x5c801e02, 0x92a03000, 0x0000e490, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c201610, 0x90a12050, 0x59850e05, 0x92a03000, + 0x0000e49c, 0x090014fc, 0x5a003090, 0x92803000, + 0x0000e408, 0x1500000e, 0x5c801e08, 0x0a000000, + 0x90b03000, 0x0000e49c, 0x92811000, 0x92803000, + 0x0000e410, 0x5ca81e00, 0x59a58e05, 0x5a05a095, + 0x8ca53c10, 0xffffffe0, 0x92a03000, 0x0000e40c, + 0x1300001a, 0x59a85015, 0x92f41000, 0x5a05a095, + 0x8c842020, 0x14fffff0, 0x5c801e02, 0x0a000000, + 0x5c281610, 0x90216058, 0x59310e03, 0x8c819000, + 0x09001480, 0x5a003090, 0x92803000, 0x00000310, + 0x15000012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x92816008, 0x5ca81e00, 0x92803000, 0x00000318, + 0x5a012095, 0x8ca1bc10, 0xfffffff8, 0x92a03000, + 0x00000314, 0x1300001a, 0x59a85015, 0x92f41000, + 0x5a012095, 0x8c842008, 0x14fffff0, 0x5c801e02, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c281610, 0x90216054, 0x59310e03, 0x8c819000, + 0x09001400, 0x5a003090, 0x92803000, 0x00000320, + 0x15000012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x92816004, 0x5ca81e00, 0x92803000, 0x0000031c, + 0x5a012095, 0x8ca1bc10, 0xfffffff8, 0x92a03000, + 0x00000324, 0x1300001a, 0x59a85015, 0x92f41000, + 0x5a012095, 0x8c842008, 0x14fffff0, 0x5c801e02, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c201611, 0x8c303984, 0x00000000, 0x5c281610, + 0x8c819000, 0x0900137c, 0x5a003090, 0x9281601c, + 0x15000012, 0x5c801e08, 0x0a000000, 0x00000000, + 0x8ca9bc10, 0xfffffff8, 0x8ca16020, 0x5cb01e00, + 0x92851000, 0x5a012096, 0x92ad2004, 0x13000016, + 0x90a1601c, 0x92f51d96, 0x59b05016, 0x3cb11ff4, + 0x5c801e02, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf03000, 0x00008b4c, 0x5c90161e, 0x8cf00000, + 0x59840901, 0x59b81901, 0x3a85c052, 0x598c4e08, + 0x8ca80000, 0x58a05110, 0x8cb47c15, 0x40000850, + 0x5a003094, 0x8ca47c15, 0x40000860, 0x1200001a, + 0x59840901, 0x5a05e090, 0x92f59000, 0x92f51000, + 0x1200001a, 0x59840902, 0x5a05e090, 0x92f59000, + 0x92f51000, 0x15fffff0, 0x84049000, 0x0a000000, + 0x5c601614, 0x8c180030, 0x74a48583, 0x8c559000, + 0x90b03000, 0x00005620, 0x5c581613, 0x598ace08, + 0x8cb80000, 0x5c681615, 0x8cac7c17, 0x40000840, + 0x59a58014, 0x92a03000, 0x00005620, 0x92855000, + 0x98a29000, 0x5990d012, 0x8c200000, 0x5a00308c, + 0x8c347c17, 0x70000040, 0x594c8d82, 0x8c800000, + 0x5c381614, 0x592d4d82, 0x150000d2, 0x3b0260c6, + 0x5947de02, 0x8ce83000, 0x20000030, 0x8c983000, + 0x20000060, 0x8c903000, 0x20000004, 0x8c883000, + 0x10000008, 0x3d016016, 0x5952100a, 0x98a29000, + 0x592d4d82, 0x8c3d1000, 0x59a20104, 0x5a052085, + 0x8cb15000, 0x1600000a, 0x5cb01614, 0x923f5000, + 0x90a03000, 0x00005160, 0x59258004, 0x8ca800ff, + 0x5a02f084, 0x8c39dd16, 0x594a4116, 0x92b4d000, + 0x59294116, 0x8ca52001, 0x58ad4094, 0x92a03000, + 0x00005160, 0x92ac9000, 0x16000036, 0x80a45000, + 0x335d202a, 0x8c803000, 0x10000008, 0xb0a19000, + 0xb0a19000, 0xb0a19000, 0x80a41000, 0x5a02f014, + 0x5921090c, 0x11ffffe8, 0x3c593fd4, 0x3c027f6a, + 0x0a000000, 0x00000000, 0x3b0260d6, 0x8c783000, + 0x20000004, 0x8c703000, 0x10000008, 0x3d016016, + 0x5952100a, 0x98a29000, 0x592d4d82, 0x8c3d1000, + 0x591fde02, 0x59a0c104, 0x5a052085, 0x8cb15000, + 0x1600000a, 0x5cb01614, 0x92383000, 0x20000030, + 0x90a03000, 0x00005160, 0x59258004, 0x8ca800ff, + 0x5a02f084, 0x92b03000, 0x20000060, 0x594a4116, + 0x8c39dd16, 0x59294116, 0x8ca52001, 0x58ad4094, + 0x92a03000, 0x00005160, 0x92abd000, 0x1600004e, + 0x80a39000, 0x335d2042, 0x8c403000, 0x10000008, + 0x59805010, 0xb0a19000, 0x5a032090, 0xb0a19000, + 0x5921090c, 0xb0a19000, 0x15000016, 0x5c80160d, + 0x8c8ad000, 0x0bfffda4, 0x5c801e00, 0x80a21000, + 0x345d3fd0, 0x3c593fbc, 0x3c027f44, 0x5c80160d, + 0x8c8ad000, 0x08fffd7c, 0x00000000, 0x00000000, + 0x92883000, 0x20000040, 0x59ac0e08, 0x8cb80000, + 0x8cb57c17, 0x600004f0, 0xb0259000, 0x59a41011, + 0x92a03000, 0x20000040, 0xb0259000, 0x8c846020, + 0x8cad7c17, 0x600004fc, 0x92803000, 0x20000038, + 0x59811010, 0x90a55000, 0x92803000, 0x20000038, + 0x59811010, 0x90a55000, 0x0a000000, 0x00000000, + 0x8cf03000, 0x00008e0c, 0x5c90161e, 0x8cf00000, + 0x59840e08, 0x8ca80000, 0x8c843400, 0x400004c0, + 0x90a41000, 0x59a85015, 0x5a02b095, 0x92a45000, + 0x59891011, 0x16ffffec, 0x84049000, 0x0a000000, + 0x8cf03000, 0x00008e4c, 0x5c90161e, 0x8cf00000, + 0x59840e08, 0x8ca80000, 0x8c843400, 0x400004c0, + 0x90a41000, 0x59a85015, 0x5a02b095, 0x92a45000, + 0x59891011, 0x16ffffec, 0x84049000, 0x0a000000, + 0x8cf03000, 0x00008e84, 0x5c88161e, 0x8cf00000, + 0x59840e08, 0x8c843400, 0x400004c0, 0xb0a41000, + 0xb0a41000, 0x90a41000, 0x90a41000, 0x90a41000, + 0x84045000, 0x0a000000, 0x00000000, 0x00000000, + 0x8c086070, 0x92c7e0a0, 0x5c381610, 0xb0a1e020, + 0x5c781612, 0x8c680000, 0x9021e014, 0x5a03e00d, + 0x9029e044, 0x5c701611, 0x8cc03000, 0x400004c0, + 0x5c481616, 0x8c455000, 0x130004c6, 0x8c583000, + 0x00005640, 0x5962c904, 0x8c183000, 0x5000144c, + 0x90a61000, 0x8c503000, 0x0000ffff, 0x58328094, + 0x3d3140aa, 0x3d02204a, 0x8ce805d2, 0x36274016, + 0x5c801e00, 0x0bffff54, 0x080001f4, 0x00000000, + 0x9089e040, 0x5c801607, 0x86045000, 0x5a007090, + 0x8c4c1000, 0x15000016, 0x5c801e00, 0x0bffff2c, + 0x080001cc, 0x00000000, 0x9041e030, 0x92483000, + 0x20000044, 0xb0a03000, 0x600004f0, 0xb0a03000, + 0x600004f0, 0x8c4a602c, 0x5a003089, 0x8c212001, + 0x59420901, 0x90a03000, 0x600004fc, 0x90a03000, + 0x600004fc, 0x90a03000, 0x600004fc, 0x12000182, + 0x8ce83000, 0x00003fff, 0x8ca16400, 0x582f4094, + 0x080003f4, 0x00000000, 0x59a18c0e, 0x3a0d205e, + 0x310d2012, 0x3a1521ae, 0x3a1d2292, 0x080003c4, + 0x5c801e00, 0x0bfffea4, 0x3a012022, 0x5c801607, + 0x8c891000, 0x5c901e00, 0x8c980008, 0x09ffdae4, + 0x08000014, 0x00000000, 0x90a2d000, 0x59a05014, + 0x92a2d000, 0x5828199f, 0x8c400000, 0x5c201e00, + 0x08000394, 0x00000000, 0x3d012022, 0x5c801e00, + 0x0bfffe58, 0x90a2d000, 0x59a05014, 0x5828199f, + 0x8c400000, 0x0800036c, 0x58a1498e, 0x5a052086, + 0x8c212001, 0x12000026, 0x5c801607, 0x8c891000, + 0x5c901e00, 0x8c980008, 0x09ffda78, 0x5c801e00, + 0x0bfffe18, 0x080001c4, 0x5c801e00, 0x8c8fe040, + 0x0bfffd88, 0x9080d000, 0x59a40c1c, 0x9097fd14, + 0x0000003c, 0x90a9e048, 0x8ce83000, 0x00ff0000, + 0x58a74092, 0x5a052095, 0x592c0c1a, 0x15000032, + 0x58a0d092, 0x8ce8002c, 0x70af4084, 0x90a03914, + 0x000051a0, 0x59294904, 0x58328092, 0x59a50006, + 0x8cad7c05, 0xffffffd0, 0x3aa5403a, 0x90a31000, + 0x5c801607, 0x8c900000, 0x5c981e08, 0x8ca52001, + 0x5c881604, 0x8c200000, 0x5c401e00, 0x5828199f, + 0x92a31000, 0x09ffd9dc, 0x080002ac, 0x00000000, + 0x3d022042, 0x9089e03c, 0x5c801607, 0x86045000, + 0x5a007090, 0x8c4c1000, 0x1500002a, 0x5c801607, + 0x8c891000, 0x5c901e00, 0x8c980008, 0x09ffd9a4, + 0x5c201e00, 0x5828199f, 0x0800026c, 0x00000000, + 0x3a01601a, 0x5980d005, 0x8c8a5000, 0x59840c02, + 0x8c97e040, 0x09ffde3c, 0x5c801607, 0x8c891000, + 0x5c901606, 0x8c980002, 0x080000bc, 0x00000000, + 0x3a01201a, 0x5c801e00, 0x0bfffd00, 0x5c801607, + 0x8c891000, 0x08000098, 0x5c801607, 0x8c8b9000, + 0x09ffd580, 0x3d04201e, 0x5c801e00, 0x0bfffcdc, + 0x90a2d000, 0x59a05014, 0x5828199f, 0x080001f4, + 0x9089e03c, 0x5c801607, 0x86045000, 0x5a007090, + 0x8c4c1000, 0x15000026, 0x9081e018, 0x09ffd634, + 0x5c801e00, 0x0bfffca4, 0x90a2d000, 0x59a05014, + 0x5828199f, 0x080001bc, 0x90a61000, 0x5c801e00, + 0x8c8a5000, 0x8ce83000, 0x00ff0000, 0x58a74094, + 0x92a1e048, 0x09fffb8c, 0x5a003090, 0x8c4c1000, + 0x1500002a, 0x5c801607, 0x8c880000, 0x5c901e00, + 0x8c980008, 0x09ffd8ac, 0x5c201e00, 0x8c400000, + 0x5828199f, 0x08000170, 0x90a9e02c, 0x8ce83000, + 0x00003fff, 0x8ca1a400, 0x582f4094, 0x8c200001, + 0x59454901, 0x08000150, 0x3a012026, 0x5c801607, + 0x8c900000, 0x5c981e08, 0x8c891000, 0x5c201e00, + 0x8c400000, 0x5828199f, 0x09ffd858, 0x5c801e00, + 0x8c8fe070, 0x0bfffbb4, 0x9080d000, 0x59340c1a, + 0x3a01a116, 0x59a40c1c, 0x9097fd14, 0x0000006c, + 0x90a7e070, 0x8ca83000, 0x00ff0000, 0x58b54092, + 0x58a54094, 0x3db50022, 0x58a0d092, 0x90b03914, + 0x000051a0, 0x58228092, 0x59a98908, 0x59a58004, + 0x3aa54022, 0x90a31000, 0x59a05014, 0x8c200000, + 0x5c401e00, 0x5828199f, 0x92a31000, 0x080000b8, + 0x59a21016, 0x8c81d000, 0x5c88160e, 0x59318114, + 0x09ffd410, 0x3d04201e, 0x90a2d000, 0x59a05014, + 0x8c200000, 0x5c401e00, 0x5828199f, 0x08000084, + 0x9089e03c, 0x5c801607, 0x86045000, 0x5a007090, + 0x8c4c1000, 0x1500002e, 0x90a2d000, 0x9081e018, + 0x59a05014, 0x8c200000, 0x5c401e00, 0x5828199f, + 0x92a2d000, 0x09ffd4ac, 0x0800004c, 0x00000000, + 0x5980d006, 0x8c8a5000, 0x59840c02, 0x8c97e074, + 0x09ffdc20, 0x5c801607, 0x8c880001, 0x5c901604, + 0x8c980002, 0x09ffd74c, 0x5c201e00, 0x08000018, + 0x5c801e00, 0x0bfffae4, 0x90a2d000, 0x59a05014, + 0x92a2d000, 0x5968500d, 0x346bdb58, 0x9221e014, + 0x9249e028, 0x9241e024, 0x9229e044, 0x90c7e0a0, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8ca03000, 0x0000ed50, 0x5a003094, 0x9024200c, + 0x92a03000, 0x0000e4a0, 0x15000012, 0x5c801e08, + 0x0a000000, 0x00000000, 0x8c851000, 0x59890e07, + 0x09002c70, 0x5ca81e00, 0x5a012095, 0x59a10901, + 0x92f03000, 0x0000e488, 0x92a03000, 0x0000e484, + 0x1300005e, 0x90b03000, 0x0000e4a0, 0x5a012f00, + 0x8c803000, 0x0000b700, 0x58b8199f, 0x8ca59000, + 0x1000001e, 0x9285a010, 0x5ca81e01, 0x92bda044, + 0x5a012095, 0x8ca5a080, 0x13000026, 0x92852010, + 0x92bd2044, 0x92852090, 0x59a89015, 0x92bd20c4, + 0x5a012095, 0x8ca52100, 0x14ffffe4, 0x5c801e02, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x90a4205c, 0x5c501611, 0x5a05208a, 0x8c241000, + 0x5c381612, 0x90342028, 0x1200002e, 0x592d1010, + 0x90895000, 0x3b04601e, 0x59ec581f, 0x70974091, + 0x8c980002, 0x09ffd60c, 0x92f15000, 0x92f12024, + 0x9251205c, 0x3b01e1e6, 0x594d1004, 0x8c412024, + 0x90a12024, 0x3d0520de, 0x90a12014, 0x3d0520b6, + 0x5c801604, 0x8c8a9000, 0x09ffd218, 0x3a0421c6, + 0x90a92054, 0x90a1202c, 0x3ead001a, 0x90892040, + 0x5c801604, 0x86045000, 0x90a12030, 0x08000014, + 0x9089203c, 0x5c801604, 0x86045000, 0x90a1202c, + 0x5c301610, 0x92a12024, 0x3d0c2088, 0x90a03000, + 0x00005628, 0x90812018, 0x59a50007, 0x92a03000, + 0x00005628, 0x09ffd2ac, 0x708b1087, 0x8c800000, + 0x0b001328, 0x92f12024, 0x0a000000, 0x00000000, + 0x90892014, 0x5c801604, 0x8c900000, 0x5c981e08, + 0x09ffd550, 0x5c801e00, 0x708b1085, 0x8c280000, + 0x0b0012f8, 0x92f21000, 0x92f12014, 0x080000bc, + 0x90892040, 0x5c801604, 0x86045000, 0x5a007090, + 0x8c341000, 0x1200012e, 0x90a12030, 0x92a12024, + 0x90b12014, 0x90a92054, 0x59a58007, 0x5a056094, + 0x8c29d000, 0x1400000a, 0x592d4116, 0x90a12024, + 0x5a052085, 0x5939c105, 0x16000056, 0x90892024, + 0x5c801e00, 0x8c919000, 0x8c992050, 0x09000fc4, + 0x90a21000, 0x90a92014, 0x90892040, 0x5c801604, + 0x59ad0015, 0x59294114, 0x92a92014, 0x86045000, + 0x5a007090, 0x8c341000, 0x12ffff4a, 0x90a12030, + 0x5a052085, 0x92a21000, 0x11ffffb4, 0x3a01601e, + 0x5c801e00, 0x8c895000, 0x5c901606, 0x8c992050, + 0x09000f70, 0x5c301610, 0x90a25000, 0x90a92054, + 0x598d0005, 0x5a056091, 0x928a5000, 0x15000026, + 0x59ec581f, 0x70974091, 0x8c811000, 0x5c981e02, + 0x09ffd450, 0x92f25000, 0x92f12024, 0x08000028, + 0x8ca12020, 0xb0851000, 0x92352008, 0x59ac4105, + 0x8c8d5000, 0x5c901606, 0x92851000, 0x92ad2004, + 0x929d200c, 0x3c01fe2c, 0x0a000000, 0x00000000, + 0x90a03000, 0x00005628, 0x708b1087, 0x8c800000, + 0x59a50007, 0x92a03000, 0x00005628, 0x080011a4, + 0x90a03000, 0x00005628, 0x708b1087, 0x8c800000, + 0x59a50007, 0x92a03000, 0x00005628, 0x0b00118c, + 0x90892014, 0x5c801604, 0x8c900000, 0x5c981e02, + 0x09ffd3c0, 0x92f12014, 0x0a000000, 0x5c201e00, + 0x92241000, 0x598c4984, 0x59811010, 0x3e247ff4, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8c086050, 0xb2c7e070, 0x92e7e080, 0x5cd81615, + 0x8caca003, 0x58e8d215, 0x8c659000, 0x5973581f, + 0x8cb76033, 0x70b5858e, 0x90a83000, 0x00005644, + 0x90b83000, 0x00005630, 0x59a85015, 0x92a83000, + 0x00005644, 0x59b5c016, 0x92b03000, 0x00005630, + 0x90ab2004, 0x5cc81613, 0x8cd51000, 0x5c181e00, + 0x8c7f6008, 0x593fde02, 0x9297e040, 0x595f4d82, + 0x90531000, 0x594d4d82, 0x5a01e089, 0x8c8a5000, + 0x1600000a, 0x5c881607, 0x92503000, 0x20000030, + 0x92883000, 0x20000060, 0x90b03000, 0x00005160, + 0x90b83000, 0x000051b0, 0x8c283000, 0x20000030, + 0x90a83000, 0x000051b4, 0x5c401611, 0x8c683000, + 0x20000004, 0x8c2000ff, 0x8ce03000, 0xffff0000, + 0x8cc003ff, 0x8c316030, 0x5a03a00f, 0x8c529d11, + 0x595ac111, 0x8cb5a001, 0x594a4111, 0x92b03000, + 0x00005160, 0x58b10096, 0x8cbde001, 0x58af0095, + 0x8ce03000, 0x00fffffc, 0x58af4395, 0x92b03000, + 0x20000004, 0x58be0097, 0x8cad7400, 0x00010000, + 0x58b70095, 0x8cc03000, 0x00ff0000, 0x58c60095, + 0x92b83000, 0x000051b0, 0x92c7e050, 0x92b03000, + 0x000051b4, 0x11000126, 0x5a00308b, 0x5942c011, + 0x16000046, 0x5962100c, 0x90a32004, 0x90531000, + 0x90a83000, 0x00005160, 0x92515000, 0x594d0d82, + 0x8cad6001, 0x595ac109, 0x92499000, 0x58a10095, + 0x92a83000, 0x00005160, 0x5a00308b, 0x92a35000, + 0x11ffffc4, 0x59b4ce08, 0x9285b400, 0x40000840, + 0x90a03000, 0x000051b0, 0x90a83000, 0x000051b4, + 0x59e0de0e, 0x58a70394, 0x92a03000, 0x50000c4c, + 0x92adb400, 0x400000c0, 0x80a03000, 0x10000008, + 0x5a022094, 0x8cb03000, 0x10000008, 0x8ca800ff, + 0x12000012, 0x80a59000, 0x58a54094, 0x3da21ff8, + 0x3a02201e, 0x59a4ce08, 0x8cad3400, 0x700000c0, + 0x5a420b81, 0x90a55000, 0x15fffff8, 0x90e7e050, + 0x59c3581f, 0x59a6010f, 0x8ca80000, 0x59b50c02, + 0x59a4ce08, 0x5a05a015, 0x8ca53400, 0x400000c0, + 0x5894839c, 0x92951000, 0x13000016, 0x59a85015, + 0x5a05a015, 0x92f51000, 0x14fffff4, 0x599cce08, + 0x59a3ce1a, 0x92a4f400, 0x400000c0, 0xb0c7e070, + 0x90e7e080, 0x0a000000, 0x3c4c6066, 0x5962100c, + 0x90ab2004, 0x59b1c108, 0x90531000, 0x594d4d82, + 0x5a05a089, 0x8c8a5000, 0x1600000a, 0x5c881616, + 0x92515000, 0x90b03000, 0x00005160, 0x59444008, + 0x5a027088, 0x8c529d11, 0x594a4111, 0x92899000, + 0x595ac111, 0x8cb5a001, 0x58a90096, 0x92b03000, + 0x00005160, 0x92ab5000, 0x16ffffa4, 0x90b83000, + 0x000051b0, 0x59b4ce08, 0x9285b400, 0x40000840, + 0x90a83000, 0x000051b4, 0x586dc98f, 0x92683000, + 0x50000c4c, 0x92adb400, 0x400000c0, 0x80a83000, + 0x10000008, 0x5a027015, 0x8cb83000, 0x10000008, + 0x8cb000ff, 0x11000012, 0x80add000, 0x58ad8095, + 0x334d7ff8, 0x59b4ce08, 0x8cb80000, 0x8cadbc17, + 0x700000c0, 0xb0255000, 0xb0255000, 0x98855000, + 0x8ca83000, 0xb0000000, 0x8cb5bc17, 0x400000c0, + 0x5a003094, 0x92ad9000, 0x5942090a, 0x8c7bf400, + 0xffffffd4, 0x15000126, 0x3d02e00e, 0x59c3581f, + 0x367e026a, 0x3b02e076, 0x3d026016, 0x5962100c, + 0x90a32004, 0x90531000, 0x594d0d82, 0x59e7de02, + 0x59a70108, 0x5a052089, 0x8c8a5000, 0x1600000a, + 0x5c881614, 0x92503000, 0x20000030, 0x90a03000, + 0x00005160, 0x8ca800ff, 0x594a4111, 0x92883000, + 0x20000060, 0x59444008, 0x8c529d11, 0x595ac111, + 0x8ca52001, 0x58ad4094, 0x92a03000, 0x00005160, + 0x92a83000, 0x20000004, 0x3b522092, 0x59ecce08, + 0x8c203000, 0x10000008, 0x8c9000ff, 0x8c383000, + 0x00003fff, 0x8c303000, 0x50000c4c, 0x8c2f7400, + 0x700000c0, 0x80a11000, 0x58a48094, 0x3355205a, + 0x5ca01e00, 0x59850005, 0x8c8f7c14, 0x400000c0, + 0x8ca36400, 0x5869c094, 0x92699000, 0xb0a41000, + 0xb0a41000, 0x98a41000, 0x90a41000, 0x8cb03000, + 0xb0000000, 0x92b45000, 0x80a11000, 0x58a48094, + 0x5a02b014, 0x5942090b, 0x8c7bf400, 0xffffffd4, + 0x11ffffc0, 0x3c523fa0, 0x3d02fefe, 0x59c3581f, + 0x317e1ef6, 0x08000154, 0x3d02e00e, 0x59e3581f, + 0x367f0132, 0x3b02e076, 0x3d026016, 0x5962100c, + 0x90a32004, 0x90531000, 0x594d0d82, 0x59c7de02, + 0x59a60108, 0x5a052089, 0x8c8a5000, 0x1600000a, + 0x5c881614, 0x92503000, 0x20000030, 0x90a03000, + 0x00005160, 0x8ca800ff, 0x594a4111, 0x92883000, + 0x20000060, 0x59444008, 0x8c529d11, 0x595ac111, + 0x8ca52001, 0x58ad4094, 0x92a03000, 0x00005160, + 0x92a83000, 0x20000004, 0x3b5220ae, 0x593e4e08, + 0x8c703000, 0x10000008, 0x8c3000ff, 0x8ce9f400, + 0x700000c0, 0x80a39000, 0x58a18094, 0x33552086, + 0x5ca01e00, 0x5925001d, 0x8c29fc14, 0x400000c0, + 0x59185003, 0x3d1e801e, 0x5c80161b, 0x8c8e5000, + 0x92efe060, 0x0bffee74, 0x5c181e00, 0x90efe060, + 0x8ce03000, 0x00003fff, 0x8ca36400, 0x586f0094, + 0x92683000, 0x50000c4c, 0xb0a11000, 0xb0a11000, + 0x98a11000, 0x90a11000, 0x8cb03000, 0xb0000000, + 0x92b15000, 0x80a39000, 0x58a18094, 0x5a02b014, + 0x5942090b, 0x8c7bf400, 0xffffffd4, 0x11ffff94, + 0x3c523f74, 0x3d02fee2, 0x59c3581f, 0x317e1ed8, + 0x59185003, 0x3d1e8016, 0x5c80161b, 0x8c8e5000, + 0x0bffedf8, 0x5c181e00, 0x8ce03000, 0x00003fff, + 0x8ca36400, 0x58a70094, 0x58a5098e, 0x92a03000, + 0x50000c4c, 0x80a03000, 0x10000008, 0x5a022094, + 0x8cb03000, 0x10000008, 0x8ca800ff, 0x13000012, + 0x80a59000, 0x58a54094, 0x3ca21ff8, 0x80a03000, + 0x10000008, 0x5a003094, 0x8cb83000, 0x10000008, + 0x8cb000ff, 0x12000022, 0x59a64e08, 0x8cad3400, + 0x700000c0, 0x90a55000, 0x80a5d000, 0x58a58094, + 0x3d053ff4, 0x59c3581f, 0x90e7e050, 0x59a6010f, + 0x90c7e040, 0x59b50c02, 0x59b81901, 0x59b58901, + 0x59a64e08, 0x5a05e096, 0x8ca53400, 0x400000c0, + 0x58ae039c, 0x92ad1000, 0x12000016, 0x59b58901, + 0x5a05e096, 0x92f51000, 0x15fffff4, 0x59ae4e08, + 0x5a00309a, 0x59a3ce1a, 0x92a57400, 0x400000c0, + 0x1200001a, 0x59185003, 0x3d1e8012, 0x5c80161b, + 0x8c8e5000, 0x0bffed04, 0xb0c7e070, 0x90e7e080, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x90a03000, 0x000051bc, 0x598c1010, 0x5990de0e, + 0x59ad0011, 0x5a04a095, 0x90203000, 0x000051b8, + 0x16000012, 0x5c801e00, 0x0a000000, 0x00000000, + 0x59a10011, 0x8c811000, 0x92a03000, 0x000051b8, + 0x92a83000, 0x000051bc, 0x09002208, 0x5983d004, + 0x5883d210, 0x0a000000, 0x00000000, 0x00000000, + 0x5c901e00, 0x8c880000, 0x58981987, 0x8c803000, + 0x88000400, 0x8cb83000, 0x000051c0, 0x80a5d000, + 0x3a052022, 0x90a41000, 0x80ade003, 0x80b5e004, + 0x59a50c08, 0x58a54094, 0x3aa5800a, 0x59905012, + 0x8c8c6001, 0x5a04e091, 0x8c842004, 0x59ba1017, + 0x16ffffcc, 0x3a04a00e, 0x5c801e00, 0x0a000000, + 0x8c500000, 0x5c201e00, 0x09000178, 0x5c481e00, + 0x8c280000, 0x5c301e00, 0x8c400000, 0x8ca03000, + 0x000055f0, 0x92f03000, 0x000055f8, 0x5c381e00, + 0x9a451000, 0x5c801e01, 0xb2203000, 0x000055e0, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8cf03000, 0x00009f90, 0x5c98161e, 0x8cf00000, + 0x58b81987, 0x3685c00e, 0x5c801e00, 0x8404d000, + 0x8ca83990, 0x000051c0, 0x80a55000, 0x3d05200e, + 0x5c801e00, 0x8404d000, 0x80a56002, 0x8cb03910, + 0x88000400, 0x588d0091, 0x5a003092, 0x59a44e08, + 0x92a59000, 0x12000026, 0x90a59000, 0x80ad6001, + 0x59a50c08, 0x58a54094, 0x3aa44012, 0x5c801e00, + 0x8404d000, 0x00000000, 0x5c801e01, 0x8404d000, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8cf03000, 0x00009ff8, 0x5c90161e, 0x8cf00000, + 0x58b01987, 0x3685800e, 0x5c801e00, 0x84049000, + 0x8ca83990, 0x000051c0, 0x80a55000, 0x3d05200e, + 0x5c801e00, 0x84049000, 0x90a03910, 0x88000400, + 0x80ad6001, 0x59a50c08, 0x58a54094, 0x8c800001, + 0x82a45000, 0x84049000, 0x0a000000, 0x00000000, + 0x5ca01e00, 0x8cb00000, 0x5cb81e00, 0x8ca80000, + 0x5c881e00, 0x8c900000, 0xb2a03000, 0x000055e0, + 0x5c801e00, 0x8ca03000, 0x000055f0, 0x92f03000, + 0x000055f8, 0x9a851000, 0x0a000000, 0x00000000, + 0x59084810, 0x80a03000, 0x00005380, 0x5c901e01, + 0x5a003094, 0x8297e040, 0x1200001e, 0x80a03000, + 0x00005382, 0x58a05094, 0x59a50e08, 0x92a03000, + 0x880004e0, 0x8c8003e8, 0x0b0004f0, 0x80a03000, + 0x00005250, 0x5a003094, 0x8c8fe040, 0x12000022, + 0x90a03000, 0x88000448, 0x80a83000, 0x00005251, + 0x59a50c08, 0x58a54094, 0x82a45000, 0x80a03000, + 0x00005258, 0x3a052022, 0x90a03000, 0x8800044c, + 0x80a83000, 0x00005259, 0x59a50c08, 0x58a54094, + 0x82a7e041, 0x80a7e041, 0x80a83000, 0x00005290, + 0x80b7e040, 0x90b83000, 0x000055e0, 0x5a003095, + 0x59a50e08, 0x58a58394, 0x59a5c014, 0x92a03000, + 0x000055e0, 0x12000022, 0x90a03000, 0x88000468, + 0x80a83000, 0x00005291, 0x59a50c08, 0x58a54094, + 0x82a45000, 0x80a03000, 0x00005298, 0x3a052022, + 0x90a03000, 0x8800046c, 0x80a83000, 0x00005299, + 0x59a50c08, 0x58a54094, 0x82a7e042, 0x80a03000, + 0x000052a0, 0x3a052022, 0x90a03000, 0x88000470, + 0x80a83000, 0x000052a1, 0x59a50c08, 0x58a54094, + 0x82a7e041, 0x80a7e041, 0x80afe042, 0x80b03000, + 0x000052a8, 0x80bfe040, 0x90803000, 0x000055e8, + 0x59a50e10, 0x5a003096, 0x59ad4e08, 0x58a54394, + 0x58a5c394, 0x59a40014, 0x92a03000, 0x000055e8, + 0x12000022, 0x90a03000, 0x88000474, 0x80a83000, + 0x000052a9, 0x59a50c08, 0x58a54094, 0x82a45000, + 0x80a03000, 0x000052b0, 0x3a052022, 0x90a03000, + 0x88000478, 0x80a83000, 0x000052b1, 0x59a50c08, + 0x58a54094, 0x82a7e042, 0x80a03000, 0x000052b8, + 0x3a052022, 0x90a03000, 0x8800047c, 0x80a83000, + 0x000052b9, 0x59a50c08, 0x58a54094, 0x82a7e041, + 0x80a7e041, 0x80afe042, 0x80b03000, 0x00005380, + 0x80bfe040, 0x90803000, 0x000055ec, 0x59a50e10, + 0x5a003096, 0x59ad4e08, 0x58a54394, 0x58a5c394, + 0x59a40014, 0x92a03000, 0x000055ec, 0x12000022, + 0x90a03000, 0x880004e0, 0x80a83000, 0x00005381, + 0x59a50c08, 0x58a54094, 0x82a45000, 0x80a03000, + 0x00005388, 0x3a052022, 0x90a03000, 0x880004e4, + 0x80a83000, 0x00005389, 0x59a50c08, 0x58a54094, + 0x82a7e041, 0x80a7e041, 0x80a83000, 0x00005390, + 0x80b7e040, 0x90b83000, 0x000055e4, 0x5a003095, + 0x59a50e08, 0x58a58394, 0x59a5c014, 0x92a03000, + 0x000055e4, 0x12000022, 0x90a03000, 0x880004e8, + 0x80a83000, 0x00005391, 0x59a50c08, 0x58a54094, + 0x82a45000, 0x80a03000, 0x00005398, 0x3a052022, + 0x90a03000, 0x880004ec, 0x80a83000, 0x00005399, + 0x59a50c08, 0x58a54094, 0x82a7e041, 0x80a7e041, + 0x80a83000, 0x00005468, 0x80bc5000, 0x90b03000, + 0x000055f0, 0x5a003095, 0x59a50e08, 0x58a5c394, + 0x59a58014, 0x92a03000, 0x000055f0, 0x1200001e, + 0x80a03000, 0x0000546a, 0x58a50097, 0x59a50e08, + 0x92a03000, 0x88000554, 0x8c8003e8, 0x0b0001fc, + 0x80a03000, 0x00005460, 0x3a052022, 0x90a03000, + 0x88000550, 0x80a83000, 0x00005461, 0x59a50c08, + 0x58a54094, 0x82a7e041, 0x80a7e041, 0x80a83000, + 0x00005468, 0x90b03000, 0x000055f4, 0x5a003095, + 0x59a58014, 0x92a03000, 0x000055f4, 0x12000022, + 0x90a03000, 0x88000554, 0x80a83000, 0x00005469, + 0x59a50c08, 0x58a54094, 0x82a7e041, 0x80a7e041, + 0x90a83000, 0x000055f8, 0x59a54014, 0x92a03000, + 0x000055f8, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf03000, 0x0000a4e4, 0x5c98161e, 0x8cf00000, + 0x59084810, 0x90a41000, 0x90ac1000, 0x8c903000, + 0x0000ff00, 0x90b41000, 0x58a48094, 0x59850c08, + 0x58901987, 0x5a04a010, 0x59bd4c10, 0x59b58c18, + 0x1100008e, 0x8ca83990, 0x000051c0, 0x80a55000, + 0x3a05207e, 0x90a03910, 0x88000400, 0x80ad6001, + 0x59a50c08, 0x58a54094, 0x58901987, 0x5a04a010, + 0x58a50116, 0x58ad8097, 0x58a54394, 0x8ca800ff, + 0x588d4094, 0x82a07400, 0xfffffff0, 0x11000042, + 0x8cb83990, 0x000051c0, 0x80a5d000, 0x3a052032, + 0x80ade002, 0x8cb03910, 0x88000400, 0x58ad4091, + 0x59a54e08, 0x92a59000, 0x90a59000, 0x80b5e001, + 0x59a50c08, 0x58a58094, 0x3aa54012, 0x5c801e00, + 0x59084910, 0x8404d000, 0x5c801e01, 0x59084910, + 0x8404d000, 0x0a000000, 0x00000000, 0x00000000, + 0x5c801e00, 0x58981987, 0x59901901, 0x8c8800ff, + 0x8ca83000, 0x0000e4b0, 0x8cb83000, 0x88000400, + 0x8cb03000, 0x000051c0, 0x80a59000, 0x3d05200e, + 0x92955000, 0x08000014, 0x90a5d000, 0x59a50c08, + 0x58a44094, 0x92a55000, 0x59805010, 0x5a04e090, + 0x8cad6004, 0x59b91017, 0x8cb5a008, 0x16ffffcc, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8cf03000, 0x0000a590, 0x5c88161e, 0x8cf00000, + 0x5a003090, 0x59840901, 0x14000016, 0x5ca01610, + 0x5a003094, 0x59840901, 0x13fffff4, 0x84045000, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x90acd000, 0x59a44e04, 0x8c883911, 0x00000000, + 0x59ed0111, 0x8c40007f, 0x5a02201d, 0x92a83000, + 0x50001440, 0x160000c6, 0x59a40e08, 0x8c303000, + 0x20000054, 0x8c283000, 0x20000060, 0x58201987, + 0x8c8d3400, 0x60000470, 0x92919000, 0x92215000, + 0xb0a45000, 0xb0a45000, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0xb0a45000, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0xb0a45000, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0xb0a45000, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0xb0a45000, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0xb0a45000, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0xb0a45000, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0x8c94a200, 0x8c40007f, 0x8cef7400, + 0xffffff80, 0x5a02201d, 0xb0a45000, 0xb0a45000, + 0xb0a45000, 0x11ffff64, 0x8c40003f, 0x36ea006e, + 0x92903000, 0x20000054, 0x58a81986, 0x92a83000, + 0x20000060, 0x59a40e08, 0x8ca53400, 0x60000470, + 0xb0251000, 0xb0251000, 0xb0251000, 0xb0251000, + 0xb0251000, 0xb0251000, 0xb0251000, 0xb0251000, + 0xb0251000, 0xb0251000, 0xb0251000, 0xb0251000, + 0xb0251000, 0x8c94a100, 0x59ef4115, 0xb0251000, + 0xb0251000, 0xb0a51000, 0x33ff604e, 0x92903000, + 0x20000054, 0x59a8581f, 0x92a83000, 0x20000060, + 0x59a40e08, 0x8ca53400, 0x60000470, 0xb0251000, + 0xb0251000, 0xb0251000, 0xb0251000, 0xb0251000, + 0x8c94a080, 0x59ef4115, 0xb0251000, 0xb0251000, + 0xb0a51000, 0x33bf603a, 0x92903000, 0x20000050, + 0x59a40e08, 0x8ca53400, 0x60000470, 0xb0251000, + 0xb0251000, 0xb0251000, 0x8c94a060, 0x59ef4918, + 0xb0251000, 0xb0251000, 0xb0a51000, 0x335f602e, + 0x59a40e08, 0x92903000, 0x20000048, 0x8ca53400, + 0x60000470, 0x8c94a030, 0x59ef490c, 0xb0251000, + 0xb0251000, 0xb0a51000, 0x331f6032, 0x59a40e08, + 0x8c203000, 0x20000040, 0x8c8d3400, 0x60000470, + 0x59ef4904, 0x92911000, 0x5a00f01d, 0x8c94a010, + 0xb0a45000, 0x11ffffec, 0x3a076032, 0x59840e08, + 0x8ca83000, 0x20000038, 0x8c843400, 0x6000047c, + 0x59ef4901, 0x92955000, 0x5a00309d, 0x8c94a004, + 0x90a41000, 0x15ffffec, 0x90a03000, 0x50001440, + 0x5c801612, 0x92a4d000, 0x0a000000, 0x00000000, + 0x8cf03000, 0x0000a85c, 0x5c90161e, 0x8cf00000, + 0x598c4e08, 0x8c8c7400, 0x40000440, 0xb0a45000, + 0xb2a41000, 0xb0a45000, 0x59841010, 0xb2a41000, + 0xb0a45000, 0xb2a42010, 0x84049000, 0x0a000000, + 0x8cf03000, 0x0000a894, 0x5c90161e, 0x8cf00000, + 0x3a046022, 0x59840e08, 0x8c843400, 0x40000440, + 0x598c4904, 0x5a003091, 0xb0a41000, 0x15fffff4, + 0x84049000, 0x0a000000, 0x00000000, 0x00000000, + 0x09bc0008, 0x033e04dd, 0x01f2026e, 0x0163019e, + 0x01140137, 0x00e200f8, 0x00bf00cf, 0x00a500b1, + 0x0092009b, 0x00820089, 0x0076007c, 0x006b0070, + 0x00630067, 0x005b005f, 0x00550058, 0x004f0052, + 0x004b004d, 0x00460048, 0x00420044, 0x003f0041, + 0x003c003d, 0x0039003a, 0x00360038, 0x00340035, + 0x00320033, 0x00300031, 0x002e002f, 0x002c002d, + 0x002b002c, 0x0029002a, 0x00280029, 0x00270027, + 0x00250026, 0x00240025, 0x00230024, 0x00220023, + 0x00210022, 0x00200021, 0x001f0020, 0x001f001f, + 0x001e001e, 0x001d001d, 0x001c001d, 0x001c001c, + 0x001b001b, 0x001a001b, 0x001a001a, 0x0019001a, + 0x00190019, 0x00180018, 0x00180018, 0x00170017, + 0x00170017, 0x00160017, 0x00160016, 0x00150016, + 0x00150015, 0x00150015, 0x00140014, 0x00140014, + 0x00140014, 0x00130013, 0x00130013, 0x00130013, + 0x00120012, 0x00120012, 0x00120012, 0x00110012, + 0x00110011, 0x00110011, 0x00110011, 0x00100011, + 0x00100010, 0x00100010, 0x00100010, 0x00100010, + 0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f, + 0x000e000f, 0x000e000e, 0x000e000e, 0x000e000e, + 0x000e000e, 0x000e000e, 0x000d000d, 0x000d000d, + 0x000d000d, 0x000d000d, 0x000d000d, 0x000d000d, + 0x000c000d, 0x000c000c, 0x000c000c, 0x000c000c, + 0x000c000c, 0x000c000c, 0x000c000c, 0x000c000c, + 0x000b000b, 0x000b000b, 0x000b000b, 0x000b000b, + 0x000b000b, 0x000b000b, 0x000b000b, 0x000b000b, + 0x000a000b, 0x000a000a, 0x000a000a, 0x000a000a, + 0x000a000a, 0x000a000a, 0x000a000a, 0x000a000a, + 0x000a000a, 0x000a000a, 0x000a000a, 0x00090009, + 0x00090009, 0x00090009, 0x00090009, 0x00090009, + 0x00090009, 0x00090009, 0x00090009, 0x00080009, + 0x8c203000, 0x0000b200, 0x8c283000, 0x50000c20, + 0x5c301e00, 0x5c381e00, 0xb2200050, 0x8c283000, + 0x50000c24, 0xb2200090, 0x8c283000, 0x50000c28, + 0xb22000d0, 0x8c283000, 0x50000c2c, 0xb2200110, + 0x5c201e00, 0x5c281e00, 0x8c400050, 0x8c480090, + 0x8c5000d0, 0x8c580110, 0xb2222010, 0xb2226010, + 0xb222a010, 0xb222e010, 0x8c203000, 0x40000840, + 0x8c283000, 0x70000040, 0xb2222020, 0x8c203000, + 0x40000940, 0x8c283000, 0x70000140, 0xb2226020, + 0x8c203000, 0x40000a40, 0x8c283000, 0x70000240, + 0xb222a020, 0x8c203000, 0x40000b40, 0x8c283000, + 0x70000340, 0xb222e020, 0x5c281e00, 0x8c203000, + 0x50001000, 0xb2222030, 0x8c203000, 0x50001004, + 0xb2226030, 0x8c203000, 0x50001008, 0xb222a030, + 0x8c203000, 0x5000100c, 0xb222e030, 0x8c400150, + 0x8c203000, 0x0000aeb0, 0x8c2a2008, 0x9a222000, + 0x5c381605, 0x8c203000, 0x00000350, 0x90312010, + 0x3201a012, 0x5929c808, 0x9a21d000, 0x5939c808, + 0x8c203000, 0x00000380, 0x90312010, 0x3201a012, + 0x5929c808, 0x9a21d000, 0x5939c808, 0x8c203000, + 0x000003b0, 0x90312010, 0x3201a012, 0x5929c808, + 0x9a21d000, 0x5939c808, 0x8c203000, 0x0000e420, + 0x90312010, 0x3201a00e, 0x9221d000, 0x5939c808, + 0x5939c904, 0x8c2a2008, 0x9229d000, 0x5c201e00, + 0x5c281e00, 0x5c301e00, 0x5c381e00, 0xb2222030, + 0x8c4001d0, 0x8c203000, 0x0000b010, 0x90283000, + 0x00000320, 0x90303000, 0x00000324, 0xb2222000, + 0x5c201e00, 0x5c301e00, 0xb2222010, 0xb2222020, + 0x8c400210, 0x8c203000, 0x0000b7e0, 0xb2222000, + 0x8c200000, 0x9222203c, 0x8c400190, 0x8c203000, + 0x0000b900, 0xb2222000, 0x8c400250, 0x8c200050, + 0x92221000, 0x59420804, 0x92221000, 0x59420804, + 0x92221000, 0x59420804, 0x92221000, 0x59420804, + 0x8c200150, 0x92221000, 0x59420804, 0x8c2001d0, + 0x92221000, 0x59420804, 0x8c200210, 0x92221000, + 0x59420804, 0x8c200190, 0x92221000, 0x8c203000, + 0x0fffc000, 0x92203000, 0x000002f0, 0x8c203000, + 0x00003ff0, 0x92203000, 0x000002f4, 0x8c200000, + 0x92203000, 0x000002f8, 0x8c200006, 0x92203000, + 0x000002fc, 0x8c280200, 0x8c300020, 0x8c383000, + 0x0002ed50, 0x92380284, 0x5c201607, 0x59394004, + 0x923921f0, 0x59b58901, 0x3505bff0, 0x5c381e00, + 0x923921f0, 0x8c403000, 0x000002c0, 0x8c38000c, + 0x92403000, 0x0000032c, 0x8c300090, 0x92322008, + 0x592a0007, 0x922a1000, 0x5c401605, 0x8c3000d0, + 0x92322008, 0x592a0007, 0x922a1000, 0x5c401605, + 0x8c300110, 0x92322008, 0x92f22000, 0x92f03000, + 0x00000328, 0x0a000000, 0x00000000, 0x00000000, + 0x90203000, 0x00000328, 0x8c283000, 0x00000328, + 0x3201205e, 0x90312004, 0x32818010, 0x5c281604, + 0x90211000, 0x08ffffec, 0x90311000, 0x90383000, + 0x0000032c, 0x92315000, 0x92391000, 0x92203000, + 0x0000032c, 0x8c180250, 0x90292008, 0x8c3000d0, + 0x5918c804, 0x34298010, 0x5918c804, 0x32298008, + 0x5918c804, 0x8c300050, 0x9230d000, 0x0a000000, + 0x8c180250, 0x8c283000, 0x40000440, 0x8c303000, + 0x40000880, 0x8c383000, 0x50001440, 0x8c403000, + 0x60000440, 0x8c480fff, 0x90503000, 0x00005660, + 0x8c583000, 0x10000008, 0x8c603000, 0x50000c40, + 0x8c683000, 0x30000000, 0x8c703000, 0x30000060, + 0x8c780000, 0x5cf01e00, 0x90883000, 0x0000e470, + 0x8c803000, 0x000fffff, 0x92845000, 0x90845000, + 0x58840090, 0x59840901, 0x92845000, 0x35043ff2, + 0x9082d000, 0x3204200c, 0x90835000, 0x08fffff4, + 0x9020d000, 0xb0a11000, 0x84051000, 0x00000000, + 0x3203e02c, 0x8c780000, 0x90883000, 0x0000e478, + 0x8c780000, 0x90945000, 0x58801988, 0x8c94a001, + 0x92945000, 0x92803000, 0x20000004, 0x98c55000, + 0x5918c804, 0x9096201c, 0x92c92004, 0x90849000, + 0x35042040, 0x32ae5fae, 0x98c65000, 0x9096201c, + 0x90849000, 0x3504202c, 0x32ae5f9a, 0x98c65000, + 0x9096201c, 0x90849000, 0x35042018, 0x32ae5f86, + 0x98c65000, 0x9096201c, 0x90849000, 0x32043f74, + 0x98e61000, 0x31e75f6e, 0x8cd00000, 0x90de200c, + 0x8cc80078, 0x59e7411c, 0x31df1f5a, 0x8ce8389b, + 0x00000000, 0x92803000, 0x20000030, 0x59d6801d, + 0x92e83000, 0x20000060, 0x59ce411d, 0x90a4a004, + 0x5ca81e02, 0x98b62020, 0x92f49000, 0x59948808, + 0x92a03000, 0x20000038, 0x3695c008, 0x5c901616, + 0x90849000, 0x92ab9000, 0x59e7011b, 0x3204200c, + 0x31df000a, 0x36ee5fb0, 0x9296201c, 0x90de1000, + 0x90ce2018, 0x598e8c01, 0x8ce65d9b, 0x598c401b, + 0x928e1000, 0x8082d000, 0x31443ffe, 0x59d68908, + 0xb0835000, 0x5a06a800, 0xb0a35000, 0x59ef0808, + 0x9a871000, 0x59e74808, 0x9a975000, 0x59ef0808, + 0x9aa71000, 0x59e74808, 0x9ab75000, 0x15ffffc8, + 0x08fffea0, 0x00000000, 0x00000000, 0x00000000, + 0x98d55000, 0x90c80284, 0x5918c804, 0x8cc00078, + 0x3206be80, 0x32067e7e, 0x5cb81e00, 0x589bd09a, + 0x5897d21a, 0x59d4ce03, 0x31d60046, 0x59bdc01a, + 0x92f55000, 0x92903000, 0x20000030, 0x92d03000, + 0x20000060, 0x59aa1015, 0x92de61f4, 0x59c6011a, + 0x92d65000, 0x36ad8008, 0x90a92014, 0x98d55000, + 0x90ce61f0, 0x3206a008, 0x35067fb4, 0x8ca03000, + 0x0000b010, 0xb2a11000, 0x90a00284, 0x90b51000, + 0x8082d000, 0x34859ffa, 0x59bdc116, 0x8ce51000, + 0xb0835000, 0x59ef0810, 0xb0c35000, 0x59b58908, + 0xb2871000, 0x59e74810, 0xb2c75000, 0x3505bfe6, + 0x888d200a, 0x8c9000ff, 0x80852007, 0x588c8091, + 0x598c4e01, 0x90d521f0, 0x8c8c7400, 0x0000a8a0, + 0x5884088f, 0x888c5000, 0x92f521f0, 0x8a8d200a, + 0x352c20ee, 0x8c900050, 0x3244607c, 0x90b03000, + 0x00000328, 0x90ad1000, 0x909da004, 0x3205a012, + 0x32acc060, 0x90b59000, 0x08fffff0, 0x90b03000, + 0x0000032c, 0x3205a052, 0x92ada004, 0x90859000, + 0x90883000, 0x00000328, 0x92803000, 0x0000032c, + 0x928d9000, 0x92b03000, 0x00000328, 0x8c900250, + 0x908da008, 0x8c8000d0, 0x59948804, 0x348c0010, + 0x59948804, 0x328c0008, 0x59948804, 0x928c9000, + 0x9095a008, 0x90c03000, 0x00005670, 0x9084a018, + 0x59c60801, 0x92c03000, 0x00005670, 0x3504202c, + 0x8c803000, 0x0000bfc8, 0x92a4a018, 0x8c880050, + 0x9284a000, 0x358c802a, 0x8c803000, 0x0000bfc0, + 0x9284a000, 0x08000018, 0x908c21f0, 0x3204600c, + 0x5c801611, 0x08fffff4, 0x92a421f0, 0x5ca0161a, + 0x3505febc, 0x92a00284, 0x08fffcc8, 0x8c900210, + 0x9084a03c, 0x35043fd6, 0x8c983000, 0x0000b7f0, + 0x92a4a03c, 0x929ca000, 0x08ffffd4, 0x00000000, + 0x90883000, 0x1000000c, 0x8c900030, 0x348c85d6, + 0x98c19000, 0xb0a03000, 0x000002f0, 0x58ce4089, + 0x320665c2, 0x58850098, 0x58958098, 0x350424ee, + 0x588d4098, 0x59948417, 0x588c8391, 0x8cd83991, + 0x0000ed50, 0x9896e010, 0x371e252a, 0x84049000, + 0xb0803000, 0x00000300, 0x8c841d11, 0x90941000, + 0x3504a01c, 0x90803000, 0x000056a0, 0x59840801, + 0x92803000, 0x000056a0, 0x08000428, 0x90e6e03c, + 0x598c4801, 0x92c49000, 0x588cc091, 0x92f41000, + 0x8c9ca008, 0x90871000, 0x92883000, 0x00000304, + 0x9296e018, 0x929ee01c, 0x35042028, 0x5c80161c, + 0x090006a0, 0x90871000, 0x35042018, 0x90872028, + 0x908c1000, 0x598c4801, 0x928c1000, 0x080003b4, + 0x908f2018, 0x59840901, 0x8c8c5d90, 0x909ee01c, + 0x90945000, 0x90b46004, 0x90bee034, 0x92871000, + 0x9294d000, 0x599cc808, 0x929ee01c, 0x59a5cc02, + 0x8c903000, 0x0000ba70, 0x5c981619, 0x8cb83000, + 0xffffffff, 0x59864e04, 0x9a96e010, 0x598e4e02, + 0x08000768, 0x00000000, 0x00000000, 0x00000000, + 0x9081d000, 0x8c883000, 0xc704dd7b, 0x358c0196, + 0x90803000, 0x00005664, 0x90a6e014, 0x8c983000, + 0x0000ffff, 0x90883000, 0x00005674, 0x59840014, + 0x8c8c6001, 0x92803000, 0x00005664, 0x92883000, + 0x00005674, 0x5894c092, 0x9886e018, 0xa0a6e030, + 0x598c4110, 0x598c4908, 0x598c4c03, 0x928c2004, + 0x59a4080c, 0x8c9c5000, 0x36954028, 0x92ad1000, + 0x59948115, 0x8ca52008, 0x36958018, 0x92b51000, + 0x59948116, 0x8ca52008, 0x599cc901, 0x08ffffec, + 0x92951000, 0x320ce014, 0x8ca52008, 0x92f51000, + 0x08000008, 0x00000000, 0x90983000, 0x00000310, + 0x598c4802, 0x9094d000, 0x3504a024, 0x90a03000, + 0x0000e478, 0x8ca80001, 0x58b01988, 0x92ad1000, + 0x92b03000, 0x20000004, 0x08ffffdc, 0x598c4c01, + 0xb0a03000, 0x00000300, 0x59ad8801, 0x92851d16, + 0x58b54097, 0x92b03000, 0x00000308, 0x5a8c4b01, + 0xb0a41000, 0x59840810, 0x92903000, 0x20000040, + 0x59948810, 0xb2a39000, 0x15ffffe4, 0x90883000, + 0x00000314, 0x9084e004, 0x92f4d000, 0x599cc808, + 0x5a04e011, 0x1300000c, 0x90983000, 0x00000318, + 0x5c881e02, 0x92803000, 0x20000038, 0x928b9000, + 0x92983000, 0x00000310, 0x8c7be001, 0x3123e028, + 0x8c780000, 0x90883000, 0x0000e478, 0x58801988, + 0x90945000, 0x8c94a001, 0x92803000, 0x20000004, + 0x92945000, 0x5a066800, 0x92f6e014, 0x8c803000, + 0x0000b250, 0x9286e010, 0x15fffd8a, 0x08fffd34, + 0x8c983000, 0x0000ffff, 0x5894c092, 0x908ee014, + 0x59948c02, 0x8c803a11, 0x00000000, 0x598c4e02, + 0x59840111, 0x3394000c, 0x5984090c, 0x3194001a, + 0x90803000, 0x0000566c, 0x59840801, 0x92803000, + 0x0000566c, 0x90883000, 0x00005678, 0x5ce81e00, + 0x598c4801, 0x92883000, 0x00005678, 0x08000004, + 0x90803000, 0x00005668, 0x90a6e014, 0x59840014, + 0x92803000, 0x00005668, 0x9886e018, 0x598c4110, + 0x598c4908, 0x598c4c03, 0x928c2004, 0x598c4804, + 0x90983000, 0x00000310, 0x598c4c01, 0xb0a03000, + 0x00000300, 0x59ad8801, 0x92851d16, 0x58b54097, + 0x92b03000, 0x00000308, 0x9094d000, 0x3504a024, + 0x90a03000, 0x0000e478, 0x8ca80001, 0x58b01988, + 0x92ad1000, 0x92b03000, 0x20000004, 0x08ffffdc, + 0x5a8c4b01, 0x92903000, 0x20000040, 0x59948810, + 0xb0a41000, 0x59840810, 0xb2a39000, 0x15ffffe4, + 0x90883000, 0x00000314, 0x9084e004, 0x92f4d000, + 0x599cc808, 0x5a04e011, 0x1300000c, 0x90983000, + 0x00000318, 0x5c881e0a, 0x92983000, 0x00000310, + 0x92803000, 0x20000038, 0x928b9000, 0x8c7be001, + 0x3123e028, 0x8c780000, 0x90883000, 0x0000e478, + 0x58801988, 0x90945000, 0x8c94a001, 0x92945000, + 0x92803000, 0x20000004, 0x92f6e014, 0x8c803000, + 0x0000b6c0, 0x300e200c, 0x8c803000, 0x0000b250, + 0x9286e010, 0x31276012, 0x59ef4904, 0xb0815000, + 0x36277ff8, 0x32076010, 0x90815000, 0x59ef4901, + 0x08fffff4, 0x32067b8c, 0x08fffbd8, 0x00000000, + 0xb0803000, 0x00000300, 0x908ee018, 0x928c1d12, + 0x59948801, 0x5894c092, 0x92903000, 0x00000308, + 0x8c803000, 0x0000b6c0, 0x92f6e014, 0x9286e010, + 0x08000010, 0x00000000, 0x00000000, 0x00000000, + 0x90803000, 0x00005668, 0x59840019, 0x92803000, + 0x00005668, 0x300e207c, 0x8c883000, 0x0000b250, + 0x90803000, 0x00005680, 0x928ee010, 0x8c842001, + 0x92803000, 0x00005680, 0x08000058, 0x00000000, + 0x90803000, 0x00005614, 0x59840019, 0x92803000, + 0x00005614, 0x0800003c, 0x8ca03000, 0x0ff00000, + 0x58a50098, 0x8c803000, 0x00005608, 0x58a58114, + 0x3505200c, 0x8c803000, 0x00005610, 0x908c1000, + 0x598c4019, 0x928c1000, 0x08000008, 0x00000000, + 0xb0815000, 0x5a066801, 0xb0815000, 0x59ce4901, + 0xb0815000, 0x14ffffec, 0x08fffa98, 0x00000000, + 0x08ffffe0, 0x00000000, 0x00000000, 0x00000000, + 0x5c80161b, 0x5c881618, 0x5c901619, 0xb2a00020, + 0xb2c00030, 0xb2e00040, 0x09ffd6f8, 0xb0e00040, + 0xb0c00030, 0xb0a00020, 0x08fffa58, 0x00000000, + 0x5c80161b, 0x5c881618, 0x5c901619, 0xb2a00020, + 0xb2c00030, 0xb2e00040, 0x09ffdca8, 0xb0e00040, + 0xb0c00030, 0xb0a00020, 0x08fffa28, 0x00000000, + 0x5918c804, 0x08fff6bc, 0x00000000, 0x00000000, + 0x90a03000, 0x50001000, 0xb2a00020, 0xb2c00030, + 0xb2e00040, 0x8c803000, 0x50000c20, 0x908c1000, + 0x35047ffe, 0x9081203c, 0x80bc2007, 0x58bdc88f, + 0x808c2006, 0x88942004, 0x5c981e00, 0x88c4200a, + 0x8ca00000, 0x5ca81e00, 0x92c03000, 0x50001000, + 0x8cb42010, 0x90842000, 0x3225e00c, 0x09ffd304, + 0x08000008, 0x09ffdecc, 0x8c803000, 0x50000c20, + 0x908c1000, 0x35047ffe, 0xb0e00040, 0xb0c00030, + 0xb0a00020, 0x92a03000, 0x50001000, 0x9099203c, + 0x908ce1f4, 0x5c901e02, 0x92883000, 0x20000038, + 0x92939000, 0x9084e004, 0x8c883000, 0xf0000000, + 0x58840091, 0x32042032, 0x8c7be001, 0x3123e028, + 0x8c780000, 0x90883000, 0x0000e478, 0x58801988, + 0x90945000, 0x8c94a001, 0x92945000, 0x92803000, + 0x20000004, 0x9094e1f0, 0x90880284, 0x5a04a800, + 0x928ce1f0, 0x92980284, 0x9291203c, 0x15fffef6, + 0x8c803000, 0x0000b7e0, 0x92812000, 0x08fffee4, + 0x90903000, 0x0000e470, 0x90803000, 0x0000e408, + 0x909c9000, 0x8c180250, 0x599cc801, 0x908c1000, + 0x929c9000, 0x3204757c, 0x92503000, 0x00005660, + 0xb2c00030, 0xb2e00040, 0x09ff9fb8, 0xb0e00040, + 0xb0c00030, 0x08fff55c, 0x00000000, 0x00000000, + 0x9024201c, 0x5c181610, 0x90811000, 0x320420cc, + 0x8c600078, 0x9830e000, 0x8c400000, 0x9028e00c, + 0x5931c106, 0x312980b6, 0x8c383885, 0x00000000, + 0x92803000, 0x20000030, 0x59420007, 0x92383000, + 0x20000060, 0x59630107, 0x90492004, 0x9850e020, + 0x92f11000, 0x59210808, 0x92483000, 0x20000038, + 0x3622c008, 0x5c20160a, 0x5c581e02, 0x90811000, + 0x92583000, 0x30000060, 0x59318105, 0x3431400e, + 0x3204200a, 0x363b1fac, 0x9220e01c, 0x9028d000, + 0x9030e018, 0x593a0c01, 0x8c319d85, 0x5939c005, + 0x9238d000, 0x8c203000, 0x10000008, 0x8c483000, + 0x30000000, 0x80811000, 0x31243ffe, 0x59420904, + 0xb0625000, 0x9a619000, 0x59318808, 0x9a719000, + 0x59318808, 0x35023fe0, 0x0a000000, 0x00000000, + 0x90183000, 0x0000e474, 0x90283000, 0x0000e478, + 0x8c300001, 0x58381988, 0x9020d000, 0x3001201a, + 0x92f03000, 0x20000004, 0x92315000, 0x92383000, + 0x20000004, 0x0a000000, 0x00000000, 0x00000000, + 0xb0a6d000, 0x599cc019, 0x8c883919, 0x00000000, + 0x929ee014, 0x59864e04, 0x92b9d000, 0x59e40111, + 0x370e2132, 0x5cc81e00, 0x8ce80000, 0x36e50010, + 0x59ef0114, 0x3205208e, 0x8ce51000, 0x8ca80030, + 0x59a5011c, 0x5cb81615, 0x33e54008, 0x5cb8161c, + 0x5995ce02, 0x92b03000, 0x20000054, 0x598d4117, + 0x92b83000, 0x20000060, 0x8c803000, 0x0000bae8, + 0x59b58012, 0x84041c11, 0xb0821000, 0xb0821000, + 0xb0821000, 0xb0821000, 0xb0821000, 0xb0821000, + 0xb0821000, 0xb0821000, 0xb0821000, 0xb0821000, + 0xb0821000, 0x59e70117, 0xb0821000, 0x34073f98, + 0x35076012, 0x90b9d000, 0xb2a6e000, 0x08fff6d4, + 0x9096e01c, 0x908ee018, 0x90803000, 0x0000e48c, + 0x59948111, 0x339419ec, 0x90e6e040, 0x908ee014, + 0x8c900555, 0x90871000, 0x318c99da, 0x35042028, + 0x5c80161c, 0x09fffdec, 0x90871000, 0x35042018, + 0x90872028, 0x908c1000, 0x598c4801, 0x928c1000, + 0x08fff9b0, 0x908f2018, 0x59840901, 0x8c8c5d90, + 0x909ee01c, 0x90945000, 0x90b46004, 0x90bee038, + 0x92871000, 0x9294d000, 0x599cc808, 0x929ee01c, + 0x59a5cc02, 0x8ce75000, 0x08fffee0, 0x00000000, + 0x59ce4901, 0x8ce80000, 0x36652108, 0x5cb81e0a, + 0x8ce80000, 0x36bd0010, 0x59edc114, 0x8cbd1000, + 0x32052052, 0x8c903897, 0x00000000, 0x92b03000, + 0x20000054, 0x59b48016, 0x92b83000, 0x20000060, + 0x3125e016, 0x5a05e808, 0xb0821000, 0x59bdc904, + 0x16fffff4, 0x310de01a, 0x90821000, 0x3115e012, + 0x90821000, 0x311de00a, 0x90821000, 0x32076090, + 0x9096e01c, 0x908ee018, 0x90803000, 0x0000e48c, + 0x59948111, 0x3494000c, 0x59ef4802, 0x08fff8e4, + 0x90e6e040, 0x90871000, 0x3504202c, 0x5c80161c, + 0x09fffcf0, 0x90871000, 0x3504201c, 0x90872028, + 0x908c1000, 0x598c4801, 0x928c1000, 0x59ef4802, + 0x08fff8b0, 0x908f2018, 0x59840901, 0x8c8c5d90, + 0x909ee01c, 0x90945000, 0x90b46004, 0x90bee038, + 0x92871000, 0x9294d000, 0x599cc808, 0x929ee01c, + 0x59a5cc02, 0x5cb8161d, 0x08ffff18, 0x98915000, + 0x08fff670, 0x00000000, 0x00000000, 0x00000000, + 0x92b03000, 0x20000048, 0xb0821000, 0xb0821000, + 0xb0821000, 0x08fff64c, 0x00000000, 0x00000000, + 0x90955000, 0x8c98004a, 0x8c800054, 0x3394d506, + 0xb0c12020, 0x8ce00000, 0x59a40112, 0x92d61000, + 0x8c883914, 0x00000000, 0x59850e04, 0x92db1000, + 0x8cd80078, 0x59ec0111, 0x8ca00000, 0x59ef411b, + 0x34bec030, 0x8c90391b, 0x00000000, 0x59e7001b, + 0x92b03000, 0x20000030, 0x59bdc11b, 0x92d83000, + 0x20000060, 0x59b58012, 0x90a2d000, 0x0800004c, + 0x3205e01e, 0x92b03000, 0x20000030, 0x59dec117, + 0x92b83000, 0x20000060, 0x59e70017, 0x98812010, + 0x5a840b80, 0x90a2d000, 0x1200006c, 0x98b45000, + 0x8c8c6008, 0x59bdc803, 0x9a812010, 0x59bdcc02, + 0x3506ff90, 0x90a2d000, 0x36652028, 0x90a2d000, + 0x8cd80078, 0x35073ff4, 0x36df5f74, 0x90db1000, + 0x9ab12008, 0x92d9202c, 0x08fff438, 0x00000000, + 0xb0865000, 0x59a5090c, 0x8c52a001, 0xb0865000, + 0x59e7090c, 0xb0865000, 0x36653fe8, 0x90a2d000, + 0x08ffffb8, 0x36652014, 0x90a2d000, 0x36673ff8, + 0x32a7002e, 0x08fffff0, 0xb0865000, 0x59e7090c, + 0xb0865000, 0x8c52a001, 0x59a5090c, 0xb0865000, + 0x36653fe8, 0x90a2d000, 0x08ffffcc, 0x58d68b82, + 0x33572030, 0xb0865000, 0x8ca03000, 0x4fffffff, + 0xb0865000, 0x58a50099, 0xa0865000, 0x92f51000, + 0x8c52a001, 0x5ca01e0a, 0x92d61000, 0x08000038, + 0x59a2911c, 0x92d61000, 0x3127201a, 0x59e70904, + 0xb0865000, 0x3127200e, 0x59e70904, 0xb0865000, + 0x3117200e, 0x59e70902, 0x98865000, 0x310f200a, + 0x90865000, 0x59a50e02, 0x8c903000, 0x4fffffff, + 0x598a9e02, 0x8c803000, 0x0000bec0, 0x598c4114, + 0x58a64092, 0x59844010, 0x90992018, 0x84041000, + 0x92f51000, 0x92f51000, 0x92f51000, 0x92f51000, + 0x92f51000, 0x92f51000, 0x92f51000, 0x92f51000, + 0x92f51000, 0x92f51000, 0x8884e004, 0x59528801, + 0x92851000, 0x90831000, 0x908ce1f4, 0x58801510, + 0x92883000, 0x20000038, 0x5c901e02, 0x92851000, + 0x92939000, 0x9084e004, 0x8c883000, 0xf0000000, + 0x58840091, 0x32042032, 0x8c7be001, 0x3123e028, + 0x8c780000, 0x90883000, 0x0000e478, 0x90945000, + 0x8c94a001, 0x58801988, 0x92945000, 0x92803000, + 0x20000004, 0x9094e1f0, 0x90880284, 0x5a04a800, + 0x92980284, 0x928ce1f0, 0x15000034, 0x90903000, + 0x0000e470, 0x8c803000, 0x0000c020, 0x909c9000, + 0x8c883000, 0x00200000, 0x92f12018, 0x598c4013, + 0x92812000, 0x92892008, 0x08fff268, 0x888ca00a, + 0x8884e00a, 0x32844034, 0x8c803000, 0x0000bfc0, + 0x92912018, 0x92812000, 0x08fff248, 0x00000000, + 0x90855000, 0x3504323c, 0x8c803000, 0x0000bcf0, + 0x90912018, 0x92812000, 0x90992030, 0x888ca00a, + 0x90e4a000, 0x59e81901, 0x928cd000, 0x8c880018, + 0x8084a006, 0x598c4012, 0x98b4a010, 0x59840901, + 0x8cbde003, 0x92912018, 0x59bdcc02, 0x9a812010, + 0x9ae12028, 0x9ab12008, 0x08fffcd8, 0x00000000, + 0x90903000, 0x0000e470, 0x909c9000, 0x359d91d4, + 0x90812028, 0x09ffed6c, 0x8c803000, 0x0000b200, + 0x92812000, 0x08fff1bc, 0x00000000, 0x00000000, + 0x5c901611, 0x8c880000, 0x08000308, 0x00000000, + 0x090016a0, 0x0900000c, 0x080011e8, 0x00000000, + 0x09000580, 0x0b000154, 0x09000378, 0x080003c4, + 0x0000c080, 0x00000000, 0x00000000, 0x00000000, + 0x0000d7f0, 0x0000d810, 0x0000d830, 0x0000d850, + 0x0000d870, 0x0000d890, 0x0000d8b0, 0x0000d8d0, + 0x0000d8f0, 0x0000d910, 0x0000d930, 0x0000d7f0, + 0x5a003091, 0x8c201400, 0x00000000, 0x8ca03000, + 0x0000c0cc, 0x59210114, 0x1200000a, 0x335c2026, + 0x85f13400, 0x0000d7d8, 0x5999981f, 0x8cecd000, + 0x92ec1000, 0x8c813400, 0x0000c260, 0x0a000000, + 0x8ca13400, 0x0000c2a0, 0x5a052091, 0x8c903910, + 0x0000e6c0, 0x90bc9000, 0x5c801610, 0x15000016, + 0x8c893400, 0x0000d7f0, 0x08000034, 0x00000000, + 0x8ca13400, 0x0000c280, 0x3d8d0026, 0x8ca13400, + 0x0000c080, 0x90a93d10, 0x0000c090, 0x90b51000, + 0x59ad0015, 0x59ad4116, 0x8c8d6000, 0x8ca13400, + 0x0000d7f0, 0x5a052097, 0x928c9000, 0x5c801610, + 0x15000012, 0x8cb93400, 0x0000c2a0, 0x08000030, + 0x8ca13400, 0x0000c080, 0x90a93d10, 0x0000c090, + 0x90b51000, 0x59ad0015, 0x59ad4116, 0x8cad6000, + 0x3dbd400e, 0x8cb93400, 0x0000c280, 0x5c801617, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x00000094, 0x5c98161e, 0x8cf00000, + 0x5c881e00, 0x8ca01400, 0x00000000, 0x8ca83000, + 0x0000c1dc, 0x59a50115, 0x8cbd3400, 0x0000c080, + 0x8c900000, 0x8cb03000, 0x0000e6c0, 0x8ca53400, + 0x0000c090, 0x9085d000, 0x90ad1000, 0x59adc015, + 0x59ad4110, 0x59ac8015, 0x92ad9000, 0x90ad2004, + 0x59adc015, 0x59ad4110, 0x59ac8015, 0x92ada004, + 0x90ad2008, 0x5988d011, 0x5a02f091, 0x59adc015, + 0x59ad4110, 0x59ac8015, 0x92ada008, 0x59b31016, + 0x8ca5200c, 0x16ffffb4, 0x8404d000, 0x0a000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x8cf00000, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x8cf00000, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x8cf00000, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x5c381610, 0x0b0014b4, 0x5c281610, 0x0b0014ec, + 0x59321005, 0x0800001c, 0x9221600c, 0x5c801606, + 0x0b0016f8, 0x90817d04, 0x00000010, 0x86041000, + 0x5c801606, 0x0b0016a4, 0x90a1600c, 0x59250901, + 0x3e013fd8, 0x59821005, 0x0b0016d0, 0x5c801605, + 0x0b001688, 0x90216004, 0x3a012022, 0x90a12020, + 0x5c801605, 0x92a16004, 0x0b0016b0, 0x5c801604, + 0x09000390, 0x08ffffd8, 0x5c801607, 0x0b00172c, + 0x5c801607, 0x0800118c, 0x00000000, 0x00000000, + 0x5c801e0a, 0x090002ec, 0x5c801e01, 0x08001174, + 0x8cf01400, 0x00000084, 0x5a04a807, 0x8cef9000, + 0x5899d210, 0x8cf00000, 0x59a44e18, 0x8cb41000, + 0x59ad0c08, 0x1300004e, 0x5a042013, 0x8c9ce007, + 0x58a54394, 0x1200001c, 0x5a04e016, 0x828d9000, + 0x59948901, 0x8cb5a001, 0x15fffff0, 0x333ca02a, + 0x59ad0c10, 0x58a54394, 0x5ca81614, 0x5a04a80f, + 0x9aa59000, 0x59948908, 0x8cb5a008, 0x14fffff0, + 0x3304a018, 0x5a04a801, 0x828d9000, 0x59948901, + 0x8cb5a001, 0x15fffff0, 0x84075000, 0x0a000000, + 0x8c800090, 0x0b001324, 0x5a003090, 0x8c241000, + 0x5c801610, 0x15000016, 0x0b0013d0, 0x90841000, + 0x0a000000, 0x00000000, 0x92f42004, 0x0b00155c, + 0x92f1200c, 0x59821004, 0x0b001550, 0x5c801e00, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5c281618, 0x8c086040, 0x92cfe070, 0x9ad7e078, + 0x5981de04, 0x0b0012e4, 0x5a003090, 0x8c241000, + 0x5c801610, 0x1500001e, 0x0b001370, 0x90841000, + 0x5cc01605, 0x90cfe070, 0x98d7e078, 0x0a000000, + 0x5880198a, 0x0900044c, 0x92811000, 0x5c401610, + 0x8c480000, 0x92812008, 0x5c501610, 0x8c800000, + 0x5c581e01, 0x92492004, 0x9259200c, 0x0b00154c, + 0x59a41004, 0x92851000, 0x5cc01610, 0x8c81201c, + 0x92f12018, 0x58c8198a, 0x8cd00000, 0x92f7e044, + 0x92cd2004, 0x92f7e048, 0x0b0014a0, 0x92f7e04c, + 0x9837e048, 0x5c801e01, 0x92f12024, 0x9a312028, + 0x0b001508, 0x92812034, 0x09001118, 0x8ca12030, + 0x5a003090, 0x98651000, 0x5c801610, 0x1200000e, + 0x8c600042, 0x08000008, 0x5c601e02, 0x5870198a, + 0x8c780000, 0x8c812040, 0x92f7e060, 0xb2651000, + 0x92f7e050, 0x92f7e064, 0x0b001440, 0x5c901e06, + 0x8c3c9000, 0x923fe054, 0x9837e060, 0x9897e050, + 0x5c801e02, 0x9a312048, 0x9a912050, 0x0b00149c, + 0x92812058, 0x090010ac, 0x5a003090, 0x8ca00000, + 0x5c801610, 0x1500000a, 0x58a0198a, 0x92a1205c, + 0x92f12060, 0x8c812064, 0x0b0013f0, 0x0b0011ec, + 0x0b001408, 0x0b0011e4, 0x90a42004, 0x92a12020, + 0x0b0011f8, 0x92812044, 0x0b0011f0, 0x8c842024, + 0x92812068, 0x0b0011c4, 0x5c201610, 0x0b0011dc, + 0x8c842048, 0x92812004, 0x0b0011b0, 0x0b00140c, + 0x5c801e00, 0x5cc01605, 0x90cfe070, 0x98d7e078, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x5980de05, 0x0b001164, 0x3d042012, 0x5c801e03, + 0x0a000000, 0x00000000, 0x8ca42030, 0x5c881e01, + 0x8c945000, 0x92f41000, 0x92a42008, 0x92942010, + 0x5c801e00, 0x0a000000, 0x00000000, 0x00000000, + 0x0000c630, 0x00000000, 0x00000000, 0x00000000, + 0x59084810, 0x5a033010, 0x8c881400, 0x00000000, + 0x8ca03000, 0x0000c650, 0x598c4114, 0x11000046, + 0x59ac0e02, 0x8cb47400, 0x0000c630, 0x90bd9000, + 0x90a47c15, 0x0000c090, 0x8cad7400, 0x0000e6c0, + 0x908d5000, 0x59a58014, 0x59a50117, 0x8ca52000, + 0x92a55000, 0x86045000, 0x5c801e00, 0x0a000000, + 0x85f47400, 0x0000d7d8, 0x5991981f, 0x8c9c9000, + 0x929c1000, 0x59801901, 0x0a000000, 0x00000000, + 0x5c201610, 0x090000bc, 0x90812010, 0x09000f14, + 0x90812018, 0x3a04200a, 0x09000198, 0x90812008, + 0x3a042012, 0x90a1200c, 0x371d200a, 0x09000744, + 0x90a1201c, 0x3a05200e, 0x59871004, 0x0b0012bc, + 0x0b001098, 0x3a24006e, 0x0b001090, 0x8c842024, + 0x3a240062, 0x0b001084, 0x8c842048, 0x3d24001e, + 0x08000050, 0x00000000, 0x90a12020, 0x92a55000, + 0x09000700, 0x08000034, 0x0b001040, 0x0b00125c, + 0x0b001038, 0x59a91010, 0x08000018, 0x00000000, + 0x90855000, 0x3a811fd6, 0x90a55000, 0x8cad2020, + 0x90a55000, 0x3d053fec, 0x0b001010, 0x0b00126c, + 0x5c801e00, 0x0a000000, 0x00000000, 0x00000000, + 0x5a003090, 0x8c241000, 0x5c301e00, 0x15000016, + 0x090000f0, 0x5c801e00, 0x0a000000, 0x00000000, + 0x90a4200c, 0x8ce80083, 0x58a74094, 0x3d05201e, + 0x0b001028, 0x5ce81e09, 0x8c9f5000, 0x929c1000, + 0x59801901, 0x0a000000, 0x59871010, 0x0b0011cc, + 0x592a1004, 0x90895000, 0x3a046086, 0x90911000, + 0x3a94407e, 0x90a1200c, 0x5a052f09, 0x90812010, + 0x5c801610, 0x10000036, 0x59948111, 0x09000ec4, + 0x90a11000, 0x90a95000, 0x59a50115, 0x3a85003a, + 0x90a1200c, 0x59301901, 0x58a50985, 0x92a1200c, + 0x08000024, 0x00000000, 0x90891000, 0x90912004, + 0x0b001128, 0x59881110, 0x90812010, 0x5c901e01, + 0x09000e10, 0x90a1200c, 0x90a92008, 0x92f12004, + 0x58a50e09, 0x92a1200c, 0x92a91000, 0x59871004, + 0x0b001178, 0x5c801606, 0x0a000000, 0x00000000, + 0x08000e20, 0x00000000, 0x00000000, 0x00000000, + 0x0b000ef8, 0x0b001114, 0x0b000ef0, 0x90242004, + 0x5a003084, 0x8c280000, 0x5c801610, 0x12000022, + 0x5c801604, 0x09fffedc, 0x59901901, 0x3a84800a, + 0x59285005, 0x90212020, 0x3d013fe8, 0x0b000ebc, + 0x0b001118, 0x5c801605, 0x0a000000, 0x00000000, + 0x3d042012, 0x5c801e00, 0x0a000000, 0x00000000, + 0x90203000, 0x0000e6f0, 0x5983d010, 0x5a003084, + 0x582bd210, 0x8ca80000, 0x1200001e, 0x08000010, + 0x5ca81604, 0x90212004, 0x3a01200e, 0x90a1200c, + 0x34a15ff0, 0x3a01205e, 0x5a003095, 0x90a12004, + 0x5c801610, 0x15000016, 0x92a03000, 0x0000e6f0, + 0x0800000c, 0x00000000, 0x92a56004, 0x90a9200c, + 0x8ca16020, 0x8c903000, 0xffffffff, 0x5c981612, + 0x5a056014, 0x92992004, 0x5c801610, 0x1100000e, + 0x5d801604, 0x0900044c, 0x59841004, 0x0a000000, + 0x90a83000, 0x0000e6f4, 0x3a0560da, 0x90a56004, + 0x8c983000, 0xffffffff, 0x3aa4c0ca, 0x90a5600c, + 0x59294114, 0x8c815000, 0x09000b78, 0x3a042106, + 0x8c903000, 0xffffffff, 0x3a8480fa, 0x90203000, + 0x0000e6f0, 0x90a03000, 0x0000e6f4, 0x5a003084, + 0x8ca80000, 0x5c801610, 0x1200001a, 0x3a250016, + 0x5ca81604, 0x90212004, 0x3a01200a, 0x3d251ff4, + 0x3d012022, 0x0b000df4, 0x5991d81f, 0x8c9c9000, + 0x929c1000, 0x5c801e04, 0x09fffc48, 0x08fffed8, + 0x5a003095, 0x90a12004, 0x5c801610, 0x15000016, + 0x92a03000, 0x0000e6f0, 0x0800000c, 0x00000000, + 0x92a56004, 0xb0a11000, 0x59841004, 0x8ca83000, + 0xffffffff, 0x598dc005, 0x8cbc5000, 0x9aa11000, + 0x92b12008, 0x9289200c, 0x0a000000, 0x00000000, + 0x59841005, 0x09000abc, 0x3a04204a, 0x8c983000, + 0xffffffff, 0x3a84c03e, 0x922c200c, 0x90a03000, + 0x0000e6f4, 0x8c403000, 0xacdbadcb, 0x8c483000, + 0xffffffff, 0x5c581605, 0x9a441000, 0x92803000, + 0x0000e6f4, 0x92a42008, 0x59841010, 0x0a000000, + 0x08fffe34, 0x00000000, 0x00000000, 0x00000000, + 0x5a003090, 0x8c441000, 0x5c801610, 0x1500000e, + 0x5c801611, 0x08fffe0c, 0x3d046012, 0x09000364, + 0x5c801e00, 0x0a000000, 0x592c0910, 0x90a15000, + 0x8c983000, 0xacdbadcb, 0x3da4c01a, 0x90a43400, + 0xfffffff4, 0x8ce83000, 0xffffffff, 0x3aa7401e, + 0x0b000cd8, 0x59e9d81f, 0x8c9f5000, 0x929c1000, + 0x080001b4, 0x00000000, 0x90a1600c, 0x598bd011, + 0x5833d211, 0x59398114, 0x3c01e01a, 0x5c801605, + 0x8c899000, 0x0900027c, 0x5c801608, 0x0a000000, + 0x90a03000, 0x0000e6f4, 0x3d2d0032, 0x5c801607, + 0x090009c0, 0x3a042106, 0x8c983000, 0xffffffff, + 0x3a84c0fa, 0x90a1600c, 0x5c801608, 0x59a50007, + 0x92a1600c, 0x0a000000, 0x90a1600c, 0x8c253c05, + 0x00000010, 0x90a12004, 0x8ce83000, 0xffffffff, + 0x3aa740ca, 0x90b83000, 0x0000e6f0, 0x5a012097, + 0x8c800000, 0x5c801610, 0x1200001a, 0x3a05e016, + 0x5c801617, 0x90bde004, 0x3ab9000a, 0x3d05fff4, + 0x3d05e01a, 0x0b000c14, 0x59e9d81f, 0x8c9f5000, + 0x929c1000, 0x080000f0, 0x5a003090, 0x90a5e004, + 0x5c801610, 0x15000016, 0x92a03000, 0x0000e6f0, + 0x0800000c, 0x00000000, 0x92a42004, 0x90a1600c, + 0x90a83000, 0x0000e6f4, 0x90b5e00c, 0x5a05e095, + 0x8ca53c16, 0x00000010, 0x92a1600c, 0x5c801610, + 0x15000012, 0x92283000, 0x0000e6f4, 0x08000010, + 0x90a1600c, 0x922d3c05, 0x00000018, 0x90a1600c, + 0x34a1801a, 0x5c801605, 0x8c899000, 0x09000164, + 0x59841005, 0x0a000000, 0x90216008, 0x3a01210e, + 0x90a12004, 0x8c983000, 0xffffffff, 0x3aa4c0fe, + 0x90a1600c, 0x90a9200c, 0x8ca53c15, 0x00000010, + 0x34a180ea, 0x90b83000, 0x0000e6f0, 0x5a012097, + 0x8c800000, 0x5c801610, 0x1200001a, 0x3a05e016, + 0x5c801617, 0x90bde004, 0x3ab9000a, 0x3d05fff4, + 0x3d05e022, 0x0b000b24, 0x5999d81f, 0x8cecd000, + 0x92ec1000, 0x5c801e04, 0x09fff978, 0x08fffe04, + 0x90a1200c, 0x90a83000, 0x0000e6f4, 0x90b1600c, + 0x5a016095, 0x8ca53c16, 0x00000010, 0x92a1200c, + 0x5c801610, 0x15000016, 0x92203000, 0x0000e6f4, + 0x08000014, 0x00000000, 0x90a1600c, 0x92253c05, + 0x00000018, 0x5a003090, 0x90a12004, 0x5c801610, + 0x15000012, 0x92a03000, 0x0000e6f0, 0x08000008, + 0x92a42004, 0x8c983000, 0xffffffff, 0x5ce81613, + 0x8c812010, 0x92e92004, 0x59918107, 0x8c8a1000, + 0x0b0002d4, 0x5c801604, 0x8c899000, 0x09000054, + 0x59841004, 0x0a000000, 0x5c801606, 0x09fffb64, + 0x5a003090, 0x8c241000, 0x5c801610, 0x12000026, + 0x59918107, 0x8c8a1000, 0x0b00029c, 0x5c801608, + 0x090000a0, 0x5c801604, 0x0a000000, 0x00000000, + 0x08fffd30, 0x00000000, 0x00000000, 0x00000000, + 0x90ac200c, 0x8ca46020, 0x31a54076, 0x8cb47c10, + 0x00000010, 0x9285a008, 0x90a83000, 0x0000e6f4, + 0x8c903000, 0xacdbadcb, 0x5c981612, 0x929d9000, + 0x8c903000, 0xffffffff, 0x5c981612, 0x90a4200c, + 0x929da004, 0x5a042095, 0x59a50910, 0x59a50111, + 0x92a5a00c, 0x928c200c, 0x15000012, 0x92b03000, + 0x0000e6f4, 0x08000010, 0x90a5a00c, 0x92b53c16, + 0x00000018, 0x59841016, 0x08000008, 0x0a000000, + 0x3d04200a, 0x0a000000, 0x598c0910, 0x90a45000, + 0x8ce83000, 0xacdbadcb, 0x3da74122, 0x90a43400, + 0xfffffff4, 0x8c983000, 0xffffffff, 0x3da4c10e, + 0x90a83000, 0x0000e6f0, 0x3a056162, 0x90a03000, + 0x0000e6f4, 0x3a8d00be, 0x90a4600c, 0x8c853c11, + 0x00000010, 0x90a42004, 0x8ce83000, 0xffffffff, + 0x3aa740a2, 0x5a042095, 0x8c900000, 0x5cb81615, + 0x1200001a, 0x3a056016, 0x5c901617, 0x90bde004, + 0x3abc000a, 0x3d05fff4, 0x3d05e01a, 0x0b00091c, + 0x59e9d81f, 0x8c9f5000, 0x929c1000, 0x080000ac, + 0x90a4600c, 0x90a83000, 0x0000e6f4, 0x90b4200c, + 0x5a042095, 0x8ca53c16, 0x00000010, 0x92a4600c, + 0x5c801610, 0x15000016, 0x92883000, 0x0000e6f4, + 0x08000014, 0x00000000, 0x90a4600c, 0x928d3c11, + 0x00000018, 0x3d04a016, 0x90a5e004, 0x92a03000, + 0x0000e6f0, 0x0800000c, 0x90a5e004, 0x92a4a004, + 0x90846008, 0x3a042096, 0x90a42004, 0x8c983000, + 0xffffffff, 0x3aa4c086, 0x90b83000, 0x0000e6f0, + 0x3abc0016, 0x3a05e012, 0x90bde004, 0x3abc000a, + 0x3d05fff8, 0x3d05e01e, 0x0b000870, 0x5999d81f, + 0x8cecd000, 0x92ec1000, 0x5c801e04, 0x08fff6c4, + 0x90a4200c, 0x90a83000, 0x0000e6f4, 0x90b4600c, + 0x5a046095, 0x8ca53c16, 0x00000010, 0x92a4200c, + 0x5c801610, 0x15000016, 0x92803000, 0x0000e6f4, + 0x0a000000, 0x00000000, 0x90a4200c, 0x92853c10, + 0x00000018, 0x0a000000, 0x90a03000, 0x0000e6f0, + 0x92883000, 0x0000e6f0, 0x92a46004, 0x0a000000, + 0x70844090, 0x3d04200e, 0x5c801e00, 0x0a000000, + 0x09fff8e0, 0x5a003090, 0x8c241000, 0x5c801610, + 0x12000016, 0x90943400, 0xfffffffc, 0x5c881e00, + 0x0bfff358, 0x5c801604, 0x0a000000, 0x8cf01400, + 0x000000dc, 0x3b04a222, 0x5a046010, 0x8cef9000, + 0x59ac4012, 0x120000c6, 0x5a042115, 0x5898d211, + 0x11000102, 0x5a046013, 0x90b4d000, 0x58a0d210, + 0x8c9ce004, 0x150000b2, 0x5a052010, 0x59a50904, + 0x1200006c, 0x59a50808, 0x8c8c1000, 0x5cb81616, + 0x8cf00020, 0x5a948b80, 0x12000082, 0x59f78808, + 0x82bc5000, 0x59bdcc08, 0x8c8c6001, 0x358d1fe8, + 0x90bcd000, 0x5a013092, 0x8c9ce004, 0x5d8d841e, + 0x1400003e, 0x5cb01617, 0x90bcd000, 0x59948984, + 0x928d1000, 0x59a50804, 0x08ffffdc, 0x59948984, + 0x90b4d000, 0x599cc804, 0x928d1000, 0x5a013092, + 0x59a50804, 0x8c8d9000, 0x13ffffe4, 0x3a04a01e, + 0x59948981, 0x828d1000, 0x5a04a880, 0x8ca52001, + 0x598c4c08, 0x15ffffec, 0x5cf01e00, 0x84075000, + 0x0a000000, 0x5a052010, 0x90bcd000, 0x588c4883, + 0x59f44e03, 0x12ffff80, 0x588c4394, 0x5a046010, + 0x8ca52004, 0x5dad841e, 0x8c8c1000, 0x1100000e, + 0x5cb01617, 0x8c9ce004, 0x5cb81615, 0x08ffff38, + 0x58b8d215, 0x5a056017, 0x599dc904, 0x598c0012, + 0x58a0d211, 0x150000b6, 0x5a052011, 0x90bcd000, + 0x599cc904, 0x12000070, 0x5cb01617, 0x8cf00020, + 0x5a948b80, 0x12ffff86, 0x59b58e88, 0x8c8c7400, + 0xffffffff, 0x5a052011, 0x82b45000, 0x59f78908, + 0x15ffffe0, 0x90b4d000, 0x5a013092, 0x8c9cf400, + 0xfffffffc, 0x5d8d841e, 0x8cbd9000, 0x59a50904, + 0x14000036, 0x90b4d000, 0x59948984, 0x928d1000, + 0x08ffffd8, 0x59948984, 0x90bcd000, 0x599cc904, + 0x928d1000, 0x5a013092, 0x59a50904, 0x8c8dd000, + 0x13ffffe4, 0x3a04bf16, 0x598c4e88, 0x8ca52004, + 0x59a50981, 0x5a042094, 0x828d1000, 0x598c4e88, + 0x15fffff0, 0x08fffef4, 0x5a052011, 0x90bdd000, + 0x58ad4883, 0x90b4d000, 0x59f54e03, 0x12ffff7c, + 0x58ad4394, 0x5a056011, 0x5dad841e, 0x14000010, + 0x5cb81616, 0x12000008, 0x599cc904, 0x5cb01615, + 0x08ffff30, 0x5ce8161e, 0x08fffeb0, 0x00000000, + 0x59084810, 0x8c803000, 0x0000e700, 0x5888198a, + 0x8ce800f2, 0x6600301d, 0x3e042024, 0x5c201e00, + 0x8c283000, 0x000056b0, 0x8ca7e040, 0x5c301e00, + 0x92f7e048, 0x9a251000, 0x08000014, 0x8c87e040, + 0x8c883000, 0x0000e700, 0x09000018, 0xb087e040, + 0x92903000, 0x0000ebd0, 0x0a000000, 0x00000000, + 0x5c401610, 0x5c201611, 0x5c801604, 0x0b0001dc, + 0x5c301e00, 0x8c383000, 0x0000eb00, 0x9a321000, + 0xc0a11000, 0x5a052880, 0x592c0801, 0x59294004, + 0x120000a4, 0x08000098, 0xc0a11000, 0x5998581f, + 0x3aa4c010, 0x3a4d200c, 0x3a6d2008, 0x3d552010, + 0x59205004, 0xc0a11000, 0x3d053fe0, 0xc0a11000, + 0x3a052064, 0x90aa1000, 0x59a05015, 0x92203915, + 0x0000eb00, 0x92a21000, 0xc0a11000, 0x3a052038, + 0x5990581f, 0x3aa48030, 0x3a4d202c, 0x3a6d2028, + 0x3a552024, 0x59205004, 0xc0a11000, 0x3a052018, + 0x5998581f, 0x3aa4c010, 0x3a4d200c, 0x3a6d2008, + 0x3d553fe4, 0xc0a11000, 0x3a05200c, 0x82f11000, + 0x59205004, 0xc0a11000, 0x3a05200c, 0x90a21000, + 0x3b953f84, 0x90a21000, 0x92f03914, 0x0000eb00, + 0xc0a15000, 0x5a052880, 0x5c201e00, 0x120000cc, + 0x92283000, 0x0000eb50, 0x5c801605, 0x0b0000ec, + 0x59294801, 0x59294010, 0xc0a15000, 0x5a052880, + 0x5c201e01, 0x120000a4, 0x8c303000, 0x0000eb54, + 0x92299000, 0x5c801605, 0x0b0000c0, 0x59294801, + 0x59294010, 0xc0a15000, 0x5a052880, 0x59205004, + 0x12000078, 0x9229a004, 0x5c801605, 0x0b00009c, + 0x59294801, 0x59294010, 0xc0a15000, 0x5a052880, + 0x59205004, 0x12000054, 0x9229a008, 0x5c801605, + 0x0b000078, 0x59294801, 0x59294010, 0xc0a15000, + 0x5a052880, 0x59205004, 0x12000030, 0x9229a00c, + 0x5c801605, 0x0b000054, 0x59294801, 0x59294010, + 0xc0a15000, 0x59341006, 0x5a003094, 0x59205004, + 0x12000008, 0x3be13f6c, 0x8c983000, 0x0000eb50, + 0x92f03904, 0x0000eb50, 0x5c901613, 0x92922008, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x00000030, 0x5c88161e, 0x5cf01e00, + 0xc0a41000, 0x5ca81e00, 0x0800000c, 0xc0a41000, + 0x59a85015, 0x5a003094, 0x59805010, 0x15fffff0, + 0x5c801615, 0x84045000, 0x0a000000, 0x00000000, + 0x8ce80101, 0x6600301d, 0x0a000000, 0x00000000, + 0x8cf01400, 0x00000020, 0x5c80161e, 0x5cf01e00, + 0x8ca03000, 0x0003cd50, 0x5ca81614, 0x92a83000, + 0x0000ebe0, 0x84041000, 0x0a000000, 0x00000000, + 0x5a003090, 0x90a83000, 0x0000ebe0, 0x1500000c, + 0x5c801615, 0x0a000000, 0x59a3d015, 0x58a3d214, + 0x8ca52000, 0x5a052015, 0x8cb43c14, 0xffffffff, + 0x11000014, 0x34b50010, 0x8c903000, 0x0003dd4f, + 0x36b48020, 0x0b000284, 0x5c901e0c, 0x5c881612, + 0x928c1000, 0x8c803000, 0xffffffff, 0x0a000000, + 0x59a85016, 0x33ad800c, 0x8ca83000, 0x0003dd4f, + 0x5c801614, 0x92a83000, 0x0000ebe0, 0x0a000000, + 0x8c883000, 0x0003cd50, 0x34844014, 0x59a40901, + 0x8c903000, 0x0003dd4f, 0x36a4801c, 0x0b00022c, + 0x5c901e0c, 0x5c881612, 0x928c1000, 0x59801901, + 0x0a000000, 0x92803000, 0x0000ebe0, 0x5c801e00, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8ce800ea, 0x6600301d, 0x5a003090, 0x5c201610, + 0x12000014, 0x0b0001e4, 0x92241000, 0x59801901, + 0x0a000000, 0x5c801e00, 0x0a000000, 0x00000000, + 0x59084810, 0x8c8fe040, 0x8ce800eb, 0x6600301d, + 0x5a003090, 0x5c201610, 0x12000014, 0x0b0001ac, + 0x92241000, 0x59801901, 0x0a000000, 0x9087e040, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x59084810, 0x8c9fe040, 0x8ce800e9, 0x6600301d, + 0x5a003090, 0x5c201610, 0x12000014, 0x0b00016c, + 0x92241000, 0x59801901, 0x0a000000, 0x9087e040, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x8ce800ef, 0x6600301d, 0x5a003090, 0x5c201610, + 0x12000014, 0x0b000134, 0x92241000, 0x59801901, + 0x0a000000, 0x5c801e00, 0x0a000000, 0x00000000, + 0x59084810, 0x8c9fe040, 0x8ce800e8, 0x6600301d, + 0x5a003090, 0x5c201610, 0x12000014, 0x0b0000fc, + 0x92241000, 0x59801901, 0x0a000000, 0x9087e040, + 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + 0x08fffde0, 0x00000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x8c803000, 0x0000ebf0, 0x84045000, 0x0a000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x8c803000, 0x0000ec80, 0x84045000, 0x0a000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x8c803000, 0x0000ecf0, 0x84045000, 0x0a000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x8c803000, 0x0000ebf0, 0x84045000, 0x0a000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x8c803000, 0x0000ec80, 0x84045000, 0x0a000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x8c803000, 0x0000ecf0, 0x84045000, 0x0a000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x8c803000, 0x0000ecf0, 0x84045000, 0x0a000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x00000010, 0x5c88161e, 0x5cf01e00, + 0x5c801612, 0x84045000, 0x0a000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c88161e, 0x5cf01e00, + 0x84045000, 0x0a000000, 0x00000000, 0x00000000, + 0x08fffcf0, 0x00000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x8cf01400, 0x00000014, 0x5c88161e, 0x5cf01e00, + 0x59a81901, 0x64840295, 0x84045000, 0x0a000000, + 0x8cf01400, 0x0000000c, 0x5c80161e, 0x5cf01e00, + 0x84041000, 0x0a000000, 0x00000000, 0x00000000, + 0x5a003090, 0x8c200413, 0x14000056, 0x5c281610, + 0x64601085, 0x10000042, 0x5965110c, 0x5a00308c, + 0x14000012, 0x5989460c, 0x5c801e00, 0x08000014, + 0x5968110c, 0x5989440d, 0x8c6b2020, 0x5981460d, + 0x588c4e14, 0x5921010c, 0x59210e14, 0x588c4384, + 0x0a000000, 0x5d801e00, 0x08fffff8, 0x59281110, + 0x64601085, 0x5965110c, 0x5a00308c, 0x14000012, + 0x5989460c, 0x5c801e00, 0x08000014, 0x5968110c, + 0x5989440d, 0x8c6b2020, 0x5981460d, 0x588c4e14, + 0x5921010c, 0x59210e14, 0x588c4384, 0x588c499f, + 0x08ffffb0, 0x59244e01, 0x8c603000, 0xffe00000, + 0x5a032004, 0x1100006a, 0x59210c15, 0x592c4e0a, + 0x5829499e, 0x58294e1f, 0x59640c16, 0x582b0385, + 0x5a003091, 0x8c60041d, 0x14000026, 0x5a032004, + 0x59230104, 0x1100000e, 0x59814404, 0x0a000000, + 0x59801901, 0x58840e1f, 0x08fffff4, 0x5a032004, + 0x59230104, 0x11000012, 0x59294404, 0x59801105, + 0x08ffffdc, 0x59805e1f, 0x08ffffd4, 0x5c801e00, + 0x08ffffcc, 0x59244e01, 0x8c603000, 0xffe00000, + 0x5a032004, 0x11000042, 0x59210c15, 0x592c4e0b, + 0x5829499f, 0x59640c15, 0x582b0385, 0x5a003091, + 0x14000026, 0x8c60041e, 0x5a032004, 0x11000012, + 0x59230104, 0x59814404, 0x0a000000, 0x59801901, + 0x08fffff8, 0x5c801e00, 0x08fffff0, 0x59244e01, + 0x8c603000, 0xffdfffff, 0x5a01200c, 0x5a003104, + 0x16000052, 0x59210c15, 0x8c600380, 0x5921010c, + 0x8c6000ff, 0x5a032004, 0x1300002e, 0x59210e17, + 0x592c4e0c, 0x59294c09, 0x58214384, 0x592c0c1d, + 0x5a042f1c, 0x5b810005, 0x5a046f1f, 0x58840f9f, + 0x0a000000, 0x5a003084, 0x14000030, 0x08000018, + 0x1200002a, 0x8c603000, 0xffe00000, 0x5a032004, + 0x11000012, 0x8c803000, 0x7f800000, 0x08ffffcc, + 0x59801901, 0x08ffffcc, 0x5c801e00, 0x08ffffbc, + 0x59540c1f, 0x59528e1f, 0x59240e01, 0x8c603000, + 0xfeffffff, 0x5a01200c, 0x5a003104, 0x1600003a, + 0x59210c18, 0x8c603000, 0xfffffc80, 0x5921010c, + 0x59210e14, 0x592c0e09, 0x59294c0c, 0x58894384, + 0x59840e1d, 0x588a8391, 0x0a000000, 0x5d801e00, + 0x08fffff4, 0x12fffffa, 0x8c603000, 0xff000000, + 0x5a01200c, 0x14000016, 0x8c883000, 0x7ff00000, + 0x5c801e00, 0x08ffffd0, 0x59801901, 0x59881901, + 0x08ffffc8, 0x59548c0f, 0x59528e1f, 0x59248e11, + 0x59210c11, 0x5a046f1f, 0x1000005a, 0x8c603000, + 0x00003c00, 0x5921010c, 0x8c6007ff, 0x5a032004, + 0x1300002e, 0x588c4e1f, 0x593c4c0b, 0x59344e15, + 0x59210e14, 0x58890387, 0x5a042f0a, 0x59840c0b, + 0x5b840006, 0x588c438a, 0x0a000000, 0x11000022, + 0x8c883000, 0x7ff00000, 0x5c801e00, 0x08ffffe8, + 0x588c4390, 0x5a003011, 0x12ffffdc, 0x59801901, + 0x59881901, 0x08ffffd4, 0x5854481f, 0x08000008, + 0x58544e1f, 0x59244e01, 0x8c603000, 0xffe00000, + 0x5a032004, 0x1100000a, 0x5c88160a, 0x0a000000, + 0x589cc81f, 0x59244e01, 0x592cce01, 0x59605e15, + 0x596b0004, 0x5a03200d, 0x1600019a, 0x596b0005, + 0x5a03200d, 0x1600018e, 0x593c4e0b, 0x59640c15, + 0x59340e0b, 0x5839c38c, 0x5839c99f, 0x594cce0b, + 0x59648c15, 0x59448e0b, 0x584a438c, 0x584a499f, + 0x59210c15, 0x59294c15, 0x59544c1f, 0x59528e1f, + 0x5a016004, 0x8c680020, 0x14000034, 0x59610105, + 0x5a03600c, 0x14000010, 0x5c401609, 0x5c481e00, + 0x5963010d, 0x5942040c, 0x596b410c, 0x596a460d, + 0x594a440c, 0x5842038d, 0x08000034, 0x59614104, + 0x5a03600c, 0x14000010, 0x5c301607, 0x5c381e00, + 0x5963010d, 0x5931840c, 0x596b410c, 0x5969c60d, + 0x5939c40c, 0x5831838d, 0x5c201605, 0x5864c311, + 0x5a032f1f, 0x1200003e, 0x5b318008, 0x5b39c009, + 0x10000096, 0x59318c01, 0x5961ce1f, 0x5939cc01, + 0x5831838c, 0x59210801, 0x8c6007ff, 0x5a032004, + 0x14000074, 0x5c20160c, 0x5d301e00, 0x08000068, + 0x5b318108, 0x5b39c109, 0x12000016, 0x5a003800, + 0x5b301106, 0x5b381107, 0x5852881f, 0x64601087, + 0x12000020, 0x64601086, 0x10000066, 0x5967d10c, + 0x5939860c, 0x5c301e00, 0x8c632020, 0x0800001c, + 0x5969840c, 0x596b4c01, 0x5967d10c, 0x5939c60c, + 0x5931860c, 0x5839c38d, 0x5921010c, 0x5a003084, + 0x14000036, 0x5a01af0a, 0x5839ce1f, 0x59818c0b, + 0x5969ce15, 0x5989cc0b, 0x59210e14, 0x58890391, + 0x5b84000d, 0x5b8c400a, 0x0a000000, 0x5d801e00, + 0x08fffff8, 0x5c801e00, 0x5c88160a, 0x08ffffec, + 0x8c603000, 0xffe00000, 0x5a01200c, 0x12000046, + 0x1400005a, 0x5a01600c, 0x12000032, 0x1400004e, + 0x586c0384, 0x5a00300d, 0x12000016, 0x586c8385, + 0x5a00300d, 0x15fffe46, 0x08ffffb0, 0x586c8385, + 0x5a00300d, 0x12000032, 0x5d801612, 0x08ffff9c, + 0x5a01600c, 0x14000016, 0x11ffff92, 0x5864c311, + 0x5a00308c, 0x13ffff86, 0x59801901, 0x59881901, + 0x08ffff78, 0x588cc091, 0x5c801e00, 0x08ffff6c, + 0x581cc311, 0x5918cc1f, 0x5918ce1f, 0x59244e01, + 0x592cce01, 0x59605e15, 0x596b0004, 0x5a03200d, + 0x160000ee, 0x596b0005, 0x5a03200d, 0x160000e2, + 0x593c4e0b, 0x5939cc01, 0x59340e0a, 0x596c0c16, + 0x5839c38d, 0x5839c99e, 0x594cce0b, 0x59448e0b, + 0x596c8c15, 0x584a438d, 0x584a499f, 0x59210c15, + 0x59294c15, 0x67518089, 0x5c68160a, 0x5c601e00, + 0x67630089, 0x5c50160d, 0x596a0c01, 0x5c601e00, + 0x67630089, 0x6763400b, 0x5a003800, 0x5b52810d, + 0x5b5ac900, 0x5b52810d, 0x5b5ac900, 0x5a02ef1f, + 0x12000010, 0x5b52800a, 0x5b5ac00b, 0x59210901, + 0x8c2123ff, 0x59210105, 0x8c6007fe, 0x5a01200c, + 0x1400002e, 0x5a02af0a, 0x59828c0b, 0x596ace15, + 0x598acc0b, 0x588c4e14, 0x59210e14, 0x58890391, + 0x5b84000d, 0x5b8c4003, 0x0a000000, 0x5a003084, + 0x14000010, 0x59230801, 0x5d501e00, 0x08ffffc8, + 0x5c201e00, 0x5d501e00, 0x08ffffbc, 0x8c603000, + 0xffe00000, 0x5a01200c, 0x1200005a, 0x1400005e, + 0x5a01600c, 0x12000042, 0x14000052, 0x586c0384, + 0x5a00300d, 0x12000026, 0x586c8385, 0x5a00300d, + 0x15fffef2, 0x8c883000, 0x7ff00000, 0x5c801e00, + 0x588c4383, 0x08ffff94, 0x586c8385, 0x5a00300d, + 0x1200001a, 0x5d801e00, 0x588c4383, 0x08ffff7c, + 0x5a01600c, 0x11ffffd2, 0x59801901, 0x59881901, + 0x08ffff68, 0x00000000, 0x00000000, 0x00000000, + 0x581cc311, 0x5918cc1f, 0x5918ce1f, 0x59244e01, + 0x592cce01, 0x59605e15, 0x596b0004, 0x5a03200d, + 0x160000d6, 0x596b0005, 0x5a03200d, 0x160000ca, + 0x593c4e0b, 0x59340e0b, 0x596c0c15, 0x5839c38d, + 0x594cce0b, 0x59448e0b, 0x596c8c15, 0x584a438d, + 0x5839c99f, 0x584a499f, 0x59210c15, 0x59294c15, + 0x67624007, 0x67524006, 0x5a007800, 0x5b62c00c, + 0x5b68100d, 0x67720007, 0x5b73800a, 0x5b63c00c, + 0x5b68100d, 0x5a036f1f, 0x12000010, 0x5b63000c, + 0x5b6b400d, 0x59210901, 0x8c217c04, 0xfffffc02, + 0x8c5007fe, 0x5a01200a, 0x1400002e, 0x5a032f0a, + 0x59830c0b, 0x59534e15, 0x598b4c0b, 0x588c4e14, + 0x59210e14, 0x58890391, 0x5b84000a, 0x5b8c4003, + 0x0a000000, 0x5a003084, 0x14000010, 0x59228801, + 0x5d601e00, 0x08ffffc8, 0x5c201e00, 0x5d601e00, + 0x08ffffbc, 0x5918cc1f, 0x5918ce1f, 0x8c603000, + 0xffe00000, 0x5a01200c, 0x1200003a, 0x14000046, + 0x5a01600c, 0x1400003e, 0x12000046, 0x586c0384, + 0x5a00300d, 0x12000012, 0x586c8385, 0x5a00300d, + 0x15ffff02, 0x5d801e00, 0x588c4383, 0x08ffff94, + 0x5a01600c, 0x1400000e, 0x5a003005, 0x1500001e, + 0x59801901, 0x59881901, 0x08ffff78, 0x586c0384, + 0x5a00300d, 0x12ffffee, 0x8c883000, 0x7ff00000, + 0x588c4383, 0x5c801e00, 0x08ffff58, 0x00000000, + 0x59244e01, 0x5934ce01, 0x8c603000, 0xffe00000, + 0x5a01200c, 0x1600007e, 0x5a01a00c, 0x160000c6, + 0x58318384, 0x5a003006, 0x12000062, 0x59644d9f, + 0x583c4e1f, 0x58330310, 0x583b0307, 0x5a003800, + 0x5b31810c, 0x5b39c900, 0x5964cd9f, 0x584cce1f, + 0x58430312, 0x584b0309, 0x5a003800, 0x5b42010c, + 0x5b4a4900, 0x5a026087, 0x59801901, 0x14000022, + 0x5c801e01, 0x1100001a, 0x5a022006, 0x11000012, + 0x59801901, 0x1400000a, 0x5c801e00, 0x0a000000, + 0x5a01200c, 0x1200001e, 0x5c801e03, 0x08fffff0, + 0x5c801e01, 0x08ffffe8, 0x59801901, 0x08ffffe0, + 0x5a01a00c, 0x14ffffe6, 0x1100001e, 0x5864c311, + 0x5a00308c, 0x13ffffc6, 0x5a046f1f, 0x10ffffd6, + 0x08ffffd8, 0x5a003091, 0x14ffffd0, 0x08ffffc4, + 0x5a01a00c, 0x14ffffb6, 0x5a04ef1f, 0x12ffffb6, + 0x08ffffb8, 0x0a000000, +}; +#define FIRMWARE_SIZE 37560 diff --git a/sys/dev/fatm/if_fatm.c b/sys/dev/fatm/if_fatm.c new file mode 100644 index 0000000..933f748 --- /dev/null +++ b/sys/dev/fatm/if_fatm.c @@ -0,0 +1,3083 @@ +/* + * Copyright (c) 2001-2003 + * Fraunhofer Institute for Open Communication Systems (FhG Fokus). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Hartmut Brandt <harti@freebsd.org> + * + * Fore PCA200E driver for NATM + */ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" +#include "opt_natm.h" + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <sys/bus.h> +#include <sys/errno.h> +#include <sys/conf.h> +#include <sys/module.h> +#include <sys/queue.h> +#include <sys/syslog.h> +#include <sys/endian.h> +#include <sys/sysctl.h> +#include <sys/condvar.h> + +#include <sys/sockio.h> +#include <sys/mbuf.h> +#include <sys/socket.h> + +#include <net/if.h> +#include <net/if_media.h> +#include <net/if_atm.h> +#include <net/route.h> +#ifdef INET +#include <netinet/in.h> +#include <netinet/if_atm.h> +#endif + +#include <machine/bus.h> +#include <machine/resource.h> +#include <sys/bus.h> +#include <sys/rman.h> +#include <pci/pcireg.h> +#include <pci/pcivar.h> + +#include <dev/utopia/utopia.h> + +#include <dev/fatm/if_fatmreg.h> +#include <dev/fatm/if_fatmvar.h> + +#include <dev/fatm/firmware.h> + +devclass_t fatm_devclass; + +static const struct { + uint16_t vid; + uint16_t did; + const char *name; +} fatm_devs[] = { + { 0x1127, 0x300, + "FORE PCA200E" }, + { 0, 0, NULL } +}; + +static const struct rate { + uint32_t ratio; + uint32_t cell_rate; +} rate_table[] = { +#include <dev/fatm/if_fatm_rate.h> +}; +#define RATE_TABLE_SIZE (sizeof(rate_table) / sizeof(rate_table[0])) + +SYSCTL_DECL(_hw_atm); + +MODULE_DEPEND(fatm, utopia, 1, 1, 1); + +static int fatm_utopia_readregs(struct ifatm *, u_int, uint8_t *, u_int *); +static int fatm_utopia_writereg(struct ifatm *, u_int, u_int, u_int); + +static const struct utopia_methods fatm_utopia_methods = { + fatm_utopia_readregs, + fatm_utopia_writereg +}; + +#define VC_OK(SC, VPI, VCI) \ + (((VPI) & ~((1 << (SC)->ifatm.mib.vpi_bits) - 1)) == 0 && \ + (VCI) != 0 && ((VCI) & ~((1 << (SC)->ifatm.mib.vci_bits) - 1)) == 0) + +/* + * Probing is easy: step trough the list of known vendor and device + * ids and compare. If one is found - it's our. + */ +static int +fatm_probe(device_t dev) +{ + int i; + + for (i = 0; fatm_devs[i].name; i++) + if (pci_get_vendor(dev) == fatm_devs[i].vid && + pci_get_device(dev) == fatm_devs[i].did) { + device_set_desc(dev, fatm_devs[i].name); + return (0); + } + return (ENXIO); +} + +/* + * Function called at completion of a SUNI writeregs/readregs command. + * This is called from the interrupt handler while holding the softc lock. + * We use the queue entry as the randevouze point. + */ +static void +fatm_utopia_writeregs_complete(struct fatm_softc *sc, struct cmdqueue *q) +{ + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if(H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.suni_reg_errors++; + q->error = EIO; + } + wakeup(q); +} + +/* + * Write a SUNI register. The bits that are 1 in mask are written from val + * into register reg. We wait for the command to complete by sleeping on + * the register memory. + * + * We assume, that we already hold the softc mutex. + */ +static int +fatm_utopia_writereg(struct ifatm *ifatm, u_int reg, u_int mask, u_int val) +{ + int error; + struct cmdqueue *q; + struct fatm_softc *sc; + + sc = ifatm->ifnet.if_softc; + FATM_CHECKLOCK(sc); + if (!(ifatm->ifnet.if_flags & IFF_RUNNING)) + return (EIO); + + /* get queue element and fill it */ + q = GET_QUEUE(sc->cmdqueue, struct cmdqueue, sc->cmdqueue.head); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (!(H_GETSTAT(q->q.statp) & FATM_STAT_FREE)) { + sc->istats.cmd_queue_full++; + return (EIO); + } + NEXT_QUEUE_ENTRY(sc->cmdqueue.head, FATM_CMD_QLEN); + + q->error = 0; + q->cb = fatm_utopia_writeregs_complete; + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + WRITE4(sc, q->q.card + FATMOC_GETOC3_BUF, 0); + BARRIER_W(sc); + WRITE4(sc, q->q.card + FATMOC_OP, + FATM_MAKE_SETOC3(reg, val, mask) | FATM_OP_INTERRUPT_SEL); + BARRIER_W(sc); + + /* + * Wait for the command to complete + */ + error = msleep(q, &sc->mtx, PZERO | PCATCH, "fatm_setreg", hz); + + switch(error) { + + case EWOULDBLOCK: + error = EIO; + break; + + case ERESTART: + error = EINTR; + break; + + case 0: + error = q->error; + break; + } + + return (error); +} + +/* + * Function called at completion of a SUNI readregs command. + * This is called from the interrupt handler while holding the softc lock. + * We use reg_mem as the randevouze point. + */ +static void +fatm_utopia_readregs_complete(struct fatm_softc *sc, struct cmdqueue *q) +{ + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.suni_reg_errors++; + q->error = EIO; + } + wakeup(&sc->reg_mem); +} + +/* + * Read SUNI registers + * + * We use a preallocated buffer to read the registers. Therefor we need + * to protect against multiple threads trying to read registers. We do this + * with a condition variable and a flag. We wait for the command to complete by sleeping on + * the register memory. + * + * We assume, that we already hold the softc mutex. + */ +static int +fatm_utopia_readregs_internal(struct fatm_softc *sc) +{ + int error, i; + uint32_t *ptr; + struct cmdqueue *q; + + /* get the buffer */ + for (;;) { + if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) + return (EIO); + if (!(sc->flags & FATM_REGS_INUSE)) + break; + cv_wait(&sc->cv_regs, &sc->mtx); + } + sc->flags |= FATM_REGS_INUSE; + + q = GET_QUEUE(sc->cmdqueue, struct cmdqueue, sc->cmdqueue.head); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (!(H_GETSTAT(q->q.statp) & FATM_STAT_FREE)) { + sc->istats.cmd_queue_full++; + return (EIO); + } + NEXT_QUEUE_ENTRY(sc->cmdqueue.head, FATM_CMD_QLEN); + + q->error = 0; + q->cb = fatm_utopia_readregs_complete; + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + bus_dmamap_sync(sc->reg_mem.dmat, sc->reg_mem.map, BUS_DMASYNC_PREREAD); + + WRITE4(sc, q->q.card + FATMOC_GETOC3_BUF, sc->reg_mem.paddr); + BARRIER_W(sc); + WRITE4(sc, q->q.card + FATMOC_OP, + FATM_OP_OC3_GET_REG | FATM_OP_INTERRUPT_SEL); + BARRIER_W(sc); + + /* + * Wait for the command to complete + */ + error = msleep(&sc->reg_mem, &sc->mtx, PZERO | PCATCH, + "fatm_getreg", hz); + + switch(error) { + + case EWOULDBLOCK: + error = EIO; + break; + + case ERESTART: + error = EINTR; + break; + + case 0: + bus_dmamap_sync(sc->reg_mem.dmat, sc->reg_mem.map, + BUS_DMASYNC_POSTREAD); + error = q->error; + break; + } + + if (error != 0) { + /* declare buffer to be free */ + sc->flags &= ~FATM_REGS_INUSE; + cv_signal(&sc->cv_regs); + return (error); + } + + /* swap if needed */ + ptr = (uint32_t *)sc->reg_mem.mem; + for (i = 0; i < FATM_NREGS; i++) + ptr[i] = le32toh(ptr[i]) & 0xff; + + return (0); +} + +/* + * Read SUNI registers for the SUNI module. + * + * We assume, that we already hold the mutex. + */ +static int +fatm_utopia_readregs(struct ifatm *ifatm, u_int reg, uint8_t *valp, u_int *np) +{ + int err; + int i; + struct fatm_softc *sc; + + if (reg >= FATM_NREGS) + return (EINVAL); + if (reg + *np > FATM_NREGS) + *np = FATM_NREGS - reg; + sc = ifatm->ifnet.if_softc; + FATM_CHECKLOCK(sc); + + err = fatm_utopia_readregs_internal(sc); + if (err != 0) + return (err); + + for (i = 0; i < *np; i++) + valp[i] = ((uint32_t *)sc->reg_mem.mem)[reg + i]; + + /* declare buffer to be free */ + sc->flags &= ~FATM_REGS_INUSE; + cv_signal(&sc->cv_regs); + + return (0); +} + +/* + * Check whether the hard is beating. We remember the last heart beat and + * compare it to the current one. If it appears stuck for 10 times, we have + * a problem. + * + * Assume we hold the lock. + */ +static void +fatm_check_heartbeat(struct fatm_softc *sc) +{ + uint32_t h; + + FATM_CHECKLOCK(sc); + + h = READ4(sc, FATMO_HEARTBEAT); + DBG(sc, BEAT, ("heartbeat %08x", h)); + + if (sc->stop_cnt == 10) + return; + + if (h == sc->heartbeat) { + if (++sc->stop_cnt == 10) { + log(LOG_ERR, "i960 stopped???\n"); + WRITE4(sc, FATMO_HIMR, 1); + } + return; + } + + sc->stop_cnt = 0; + sc->heartbeat = h; +} + +/* + * Ensure that the heart is still beating. + */ +static void +fatm_watchdog(struct ifnet *ifp) +{ + struct fatm_softc *sc = ifp->if_softc; + + FATM_LOCK(sc); + if (ifp->if_flags & IFF_RUNNING) { + fatm_check_heartbeat(sc); + ifp->if_timer = 5; + } + FATM_UNLOCK(sc); +} + +/* + * Hard reset the i960 on the board. This is done by initializing registers, + * clearing interrupts and waiting for the selftest to finish. Not sure, + * whether all these barriers are actually needed. + * + * Assumes that we hold the lock. + */ +static int +fatm_reset(struct fatm_softc *sc) +{ + int w; + uint32_t val; + + FATM_CHECKLOCK(sc); + + WRITE4(sc, FATMO_APP_BASE, FATMO_COMMON_ORIGIN); + BARRIER_W(sc); + + WRITE4(sc, FATMO_UART_TO_960, XMIT_READY); + BARRIER_W(sc); + + WRITE4(sc, FATMO_UART_TO_HOST, XMIT_READY); + BARRIER_W(sc); + + WRITE4(sc, FATMO_BOOT_STATUS, COLD_START); + BARRIER_W(sc); + + WRITE1(sc, FATMO_HCR, FATM_HCR_RESET); + BARRIER_W(sc); + + DELAY(1000); + + WRITE1(sc, FATMO_HCR, 0); + BARRIER_RW(sc); + + DELAY(1000); + + for (w = 100; w; w--) { + BARRIER_R(sc); + val = READ4(sc, FATMO_BOOT_STATUS); + switch (val) { + case SELF_TEST_OK: + return (0); + case SELF_TEST_FAIL: + return (EIO); + } + DELAY(1000); + } + return (EIO); +} + +/* + * Stop the card. Must be called WITH the lock held + * Reset, free transmit and receive buffers. Wakeup everybody that may sleep. + */ +static void +fatm_stop(struct fatm_softc *sc) +{ + int i; + struct cmdqueue *q; + struct rbuf *rb; + struct txqueue *tx; + uint32_t stat; + + FATM_CHECKLOCK(sc); + + /* Stop the board */ + utopia_stop(&sc->utopia); + (void)fatm_reset(sc); + + /* stop watchdog */ + sc->ifatm.ifnet.if_timer = 0; + + if (sc->ifatm.ifnet.if_flags & IFF_RUNNING) { + sc->ifatm.ifnet.if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); + + /* + * Collect transmit mbufs, partial receive mbufs and + * supplied mbufs + */ + for (i = 0; i < FATM_TX_QLEN; i++) { + tx = GET_QUEUE(sc->txqueue, struct txqueue, i); + if (tx->m) { + bus_dmamap_unload(sc->tx_tag, tx->map); + m_freem(tx->m); + tx->m = NULL; + } + } + + /* Collect supplied mbufs */ + while ((rb = LIST_FIRST(&sc->rbuf_used)) != NULL) { + LIST_REMOVE(rb, link); + bus_dmamap_unload(sc->rbuf_tag, rb->map); + m_free(rb->m); + rb->m = NULL; + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + } + + /* Unwait any waiters */ + wakeup(&sc->sadi_mem); + + /* wakeup all threads waiting for STAT or REG buffers */ + cv_broadcast(&sc->cv_stat); + cv_broadcast(&sc->cv_regs); + + sc->flags &= ~(FATM_STAT_INUSE | FATM_REGS_INUSE); + + /* wakeup all threads waiting on commands */ + for (i = 0; i < FATM_CMD_QLEN; i++) { + q = GET_QUEUE(sc->cmdqueue, struct cmdqueue, i); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if ((stat = H_GETSTAT(q->q.statp)) != FATM_STAT_FREE) { + H_SETSTAT(q->q.statp, stat | FATM_STAT_ERROR); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + wakeup(q); + } + } + utopia_reset_media(&sc->utopia); + } + sc->small_cnt = sc->large_cnt = 0; + + /* Reset vcc info */ + if (sc->vccs != NULL) + for (i = 0; i <= FORE_MAX_VCC; i++) + sc->vccs[i].flags = 0; + + sc->open_vccs = 0; +} + +/* + * Load the firmware into the board and save the entry point. + */ +static uint32_t +firmware_load(struct fatm_softc *sc) +{ + struct firmware *fw = (struct firmware *)firmware; + + DBG(sc, INIT, ("loading - entry=%x", fw->entry)); + bus_space_write_region_4(sc->memt, sc->memh, fw->offset, firmware, + sizeof(firmware) / sizeof(firmware[0])); + BARRIER_RW(sc); + + return (fw->entry); +} + +/* + * Read a character from the virtual UART. The availability of a character + * is signaled by a non-null value of the 32 bit register. The eating of + * the character by us is signalled to the card by setting that register + * to zero. + */ +static int +rx_getc(struct fatm_softc *sc) +{ + int w = 50; + int c; + + while (w--) { + c = READ4(sc, FATMO_UART_TO_HOST); + BARRIER_RW(sc); + if (c != 0) { + WRITE4(sc, FATMO_UART_TO_HOST, 0); + DBGC(sc, UART, ("%c", c & 0xff)); + return (c & 0xff); + } + DELAY(1000); + } + return (-1); +} + +/* + * Eat up characters from the board and stuff them in the bit-bucket. + */ +static void +rx_flush(struct fatm_softc *sc) +{ + int w = 10000; + + while (w-- && rx_getc(sc) >= 0) + ; +} + +/* + * Write a character to the card. The UART is available if the register + * is zero. + */ +static int +tx_putc(struct fatm_softc *sc, u_char c) +{ + int w = 10; + int c1; + + while (w--) { + c1 = READ4(sc, FATMO_UART_TO_960); + BARRIER_RW(sc); + if (c1 == 0) { + WRITE4(sc, FATMO_UART_TO_960, c | CHAR_AVAIL); + DBGC(sc, UART, ("%c", c & 0xff)); + return (0); + } + DELAY(1000); + } + return (-1); +} + +/* + * Start the firmware. This is doing by issuing a 'go' command with + * the hex entry address of the firmware. Then we wait for the self-test to + * succeed. + */ +static int +fatm_start_firmware(struct fatm_softc *sc, uint32_t start) +{ + static char hex[] = "0123456789abcdef"; + u_int w, val; + + DBG(sc, INIT, ("starting")); + rx_flush(sc); + tx_putc(sc, '\r'); + DELAY(1000); + + rx_flush(sc); + + tx_putc(sc, 'g'); + (void)rx_getc(sc); + tx_putc(sc, 'o'); + (void)rx_getc(sc); + tx_putc(sc, ' '); + (void)rx_getc(sc); + + tx_putc(sc, hex[(start >> 12) & 0xf]); + (void)rx_getc(sc); + tx_putc(sc, hex[(start >> 8) & 0xf]); + (void)rx_getc(sc); + tx_putc(sc, hex[(start >> 4) & 0xf]); + (void)rx_getc(sc); + tx_putc(sc, hex[(start >> 0) & 0xf]); + (void)rx_getc(sc); + + tx_putc(sc, '\r'); + rx_flush(sc); + + for (w = 100; w; w--) { + BARRIER_R(sc); + val = READ4(sc, FATMO_BOOT_STATUS); + switch (val) { + case CP_RUNNING: + return (0); + case SELF_TEST_FAIL: + return (EIO); + } + DELAY(1000); + } + return (EIO); +} + +/* + * Initialize one card and host queue. + */ +static void +init_card_queue(struct fatm_softc *sc, struct fqueue *queue, int qlen, + size_t qel_size, size_t desc_size, cardoff_t off, + u_char **statpp, uint32_t *cardstat, u_char *descp, uint32_t carddesc) +{ + struct fqelem *el = queue->chunk; + + while (qlen--) { + el->card = off; + off += 8; /* size of card entry */ + + el->statp = (uint32_t *)(*statpp); + (*statpp) += sizeof(uint32_t); + H_SETSTAT(el->statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, el->statp); + + WRITE4(sc, el->card + FATMOS_STATP, (*cardstat)); + (*cardstat) += sizeof(uint32_t); + + el->ioblk = descp; + descp += desc_size; + el->card_ioblk = carddesc; + carddesc += desc_size; + + el = (struct fqelem *)((u_char *)el + qel_size); + } + queue->tail = queue->head = 0; +} + +/* + * Issue the initialize operation to the card, wait for completion and + * initialize the on-board and host queue structures with offsets and + * addresses. + */ +static int +fatm_init_cmd(struct fatm_softc *sc) +{ + int w, c; + u_char *statp; + uint32_t card_stat; + u_int cnt; + struct fqelem *el; + cardoff_t off; + + DBG(sc, INIT, ("command")); + WRITE4(sc, FATMO_ISTAT, 0); + WRITE4(sc, FATMO_IMASK, 1); + WRITE4(sc, FATMO_HLOGGER, 0); + + WRITE4(sc, FATMO_INIT + FATMOI_RECEIVE_TRESHOLD, 0); + WRITE4(sc, FATMO_INIT + FATMOI_NUM_CONNECT, FORE_MAX_VCC); + WRITE4(sc, FATMO_INIT + FATMOI_CQUEUE_LEN, FATM_CMD_QLEN); + WRITE4(sc, FATMO_INIT + FATMOI_TQUEUE_LEN, FATM_TX_QLEN); + WRITE4(sc, FATMO_INIT + FATMOI_RQUEUE_LEN, FATM_RX_QLEN); + WRITE4(sc, FATMO_INIT + FATMOI_RPD_EXTENSION, RPD_EXTENSIONS); + WRITE4(sc, FATMO_INIT + FATMOI_TPD_EXTENSION, TPD_EXTENSIONS); + + /* + * initialize buffer descriptors + */ + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B1 + FATMOB_QUEUE_LENGTH, + SMALL_SUPPLY_QLEN); + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B1 + FATMOB_BUFFER_SIZE, + SMALL_BUFFER_LEN); + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B1 + FATMOB_POOL_SIZE, + SMALL_POOL_SIZE); + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B1 + FATMOB_SUPPLY_BLKSIZE, + SMALL_SUPPLY_BLKSIZE); + + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B1 + FATMOB_QUEUE_LENGTH, + LARGE_SUPPLY_QLEN); + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B1 + FATMOB_BUFFER_SIZE, + LARGE_BUFFER_LEN); + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B1 + FATMOB_POOL_SIZE, + LARGE_POOL_SIZE); + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B1 + FATMOB_SUPPLY_BLKSIZE, + LARGE_SUPPLY_BLKSIZE); + + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B2 + FATMOB_QUEUE_LENGTH, 0); + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B2 + FATMOB_BUFFER_SIZE, 0); + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B2 + FATMOB_POOL_SIZE, 0); + WRITE4(sc, FATMO_INIT + FATMOI_SMALL_B2 + FATMOB_SUPPLY_BLKSIZE, 0); + + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B2 + FATMOB_QUEUE_LENGTH, 0); + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B2 + FATMOB_BUFFER_SIZE, 0); + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B2 + FATMOB_POOL_SIZE, 0); + WRITE4(sc, FATMO_INIT + FATMOI_LARGE_B2 + FATMOB_SUPPLY_BLKSIZE, 0); + + /* + * Start the command + */ + BARRIER_W(sc); + WRITE4(sc, FATMO_INIT + FATMOI_STATUS, FATM_STAT_PENDING); + BARRIER_W(sc); + WRITE4(sc, FATMO_INIT + FATMOI_OP, FATM_OP_INITIALIZE); + BARRIER_W(sc); + + /* + * Busy wait for completion + */ + w = 100; + while (w--) { + c = READ4(sc, FATMO_INIT + FATMOI_STATUS); + BARRIER_R(sc); + if (c & FATM_STAT_COMPLETE) + break; + DELAY(1000); + } + + if (c & FATM_STAT_ERROR) + return (EIO); + + /* + * Initialize the queues + */ + statp = sc->stat_mem.mem; + card_stat = sc->stat_mem.paddr; + + /* + * Command queue. This is special in that it's on the card. + */ + el = sc->cmdqueue.chunk; + off = READ4(sc, FATMO_COMMAND_QUEUE); + DBG(sc, INIT, ("cmd queue=%x", off)); + for (cnt = 0; cnt < FATM_CMD_QLEN; cnt++) { + el = &((struct cmdqueue *)sc->cmdqueue.chunk + cnt)->q; + + el->card = off; + off += 32; /* size of card structure */ + + el->statp = (uint32_t *)statp; + statp += sizeof(uint32_t); + H_SETSTAT(el->statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, el->statp); + + WRITE4(sc, el->card + FATMOC_STATP, card_stat); + card_stat += sizeof(uint32_t); + } + sc->cmdqueue.tail = sc->cmdqueue.head = 0; + + /* + * Now the other queues. These are in memory + */ + init_card_queue(sc, &sc->txqueue, FATM_TX_QLEN, + sizeof(struct txqueue), TPD_SIZE, + READ4(sc, FATMO_TRANSMIT_QUEUE), + &statp, &card_stat, sc->txq_mem.mem, sc->txq_mem.paddr); + + init_card_queue(sc, &sc->rxqueue, FATM_RX_QLEN, + sizeof(struct rxqueue), RPD_SIZE, + READ4(sc, FATMO_RECEIVE_QUEUE), + &statp, &card_stat, sc->rxq_mem.mem, sc->rxq_mem.paddr); + + init_card_queue(sc, &sc->s1queue, SMALL_SUPPLY_QLEN, + sizeof(struct supqueue), BSUP_BLK2SIZE(SMALL_SUPPLY_BLKSIZE), + READ4(sc, FATMO_SMALL_B1_QUEUE), + &statp, &card_stat, sc->s1q_mem.mem, sc->s1q_mem.paddr); + + init_card_queue(sc, &sc->l1queue, LARGE_SUPPLY_QLEN, + sizeof(struct supqueue), BSUP_BLK2SIZE(LARGE_SUPPLY_BLKSIZE), + READ4(sc, FATMO_LARGE_B1_QUEUE), + &statp, &card_stat, sc->l1q_mem.mem, sc->l1q_mem.paddr); + + sc->txcnt = 0; + + return (0); +} + +/* + * Read PROM. Called only from attach code. Here we spin because the interrupt + * handler is not yet set up. + */ +static int +fatm_getprom(struct fatm_softc *sc) +{ + int i; + struct prom *prom; + struct cmdqueue *q; + + DBG(sc, INIT, ("reading prom")); + q = GET_QUEUE(sc->cmdqueue, struct cmdqueue, sc->cmdqueue.head); + NEXT_QUEUE_ENTRY(sc->cmdqueue.head, FATM_CMD_QLEN); + + q->error = 0; + q->cb = NULL;; + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + bus_dmamap_sync(sc->prom_mem.dmat, sc->prom_mem.map, + BUS_DMASYNC_PREREAD); + + WRITE4(sc, q->q.card + FATMOC_GPROM_BUF, sc->prom_mem.paddr); + BARRIER_W(sc); + WRITE4(sc, q->q.card + FATMOC_OP, FATM_OP_GET_PROM_DATA); + BARRIER_W(sc); + + for (i = 0; i < 1000; i++) { + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & + (FATM_STAT_COMPLETE | FATM_STAT_ERROR)) + break; + DELAY(1000); + } + if (i == 1000) { + if_printf(&sc->ifatm.ifnet, "getprom timeout\n"); + return (EIO); + } + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + if_printf(&sc->ifatm.ifnet, "getprom error\n"); + return (EIO); + } + H_SETSTAT(q->q.statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + NEXT_QUEUE_ENTRY(sc->cmdqueue.tail, FATM_CMD_QLEN); + + bus_dmamap_sync(sc->prom_mem.dmat, sc->prom_mem.map, + BUS_DMASYNC_POSTREAD); + + +#ifdef notdef + { + u_int i; + + printf("PROM: "); + u_char *ptr = (u_char *)sc->prom_mem.mem; + for (i = 0; i < sizeof(struct prom); i++) + printf("%02x ", *ptr++); + printf("\n"); + } +#endif + + prom = (struct prom *)sc->prom_mem.mem; + + bcopy(prom->mac + 2, sc->ifatm.mib.esi, 6); + sc->ifatm.mib.serial = le32toh(prom->serial); + sc->ifatm.mib.hw_version = le32toh(prom->version); + sc->ifatm.mib.sw_version = READ4(sc, FATMO_FIRMWARE_RELEASE); + + if_printf(&sc->ifatm.ifnet, "ESI=%02x:%02x:%02x:%02x:%02x:%02x " + "serial=%u hw=0x%x sw=0x%x\n", sc->ifatm.mib.esi[0], + sc->ifatm.mib.esi[1], sc->ifatm.mib.esi[2], sc->ifatm.mib.esi[3], + sc->ifatm.mib.esi[4], sc->ifatm.mib.esi[5], sc->ifatm.mib.serial, + sc->ifatm.mib.hw_version, sc->ifatm.mib.sw_version); + + return (0); +} + +/* + * This is the callback function for bus_dmamap_load. We assume, that we + * have a 32-bit bus and so have always one segment. + */ +static void +dmaload_helper(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + bus_addr_t *ptr = (bus_addr_t *)arg; + + if (error != 0) { + printf("%s: error=%d\n", __func__, error); + return; + } + KASSERT(nsegs == 1, ("too many DMA segments")); + KASSERT(segs[0].ds_addr <= 0xffffffff, ("DMA address too large %lx", + (u_long)segs[0].ds_addr)); + + *ptr = segs[0].ds_addr; +} + +/* + * Allocate a chunk of DMA-able memory and map it. + */ +static int +alloc_dma_memory(struct fatm_softc *sc, const char *nm, struct fatm_mem *mem) +{ + int error; + + mem->mem = NULL; + + if (bus_dma_tag_create(sc->parent_dmat, mem->align, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, + NULL, NULL, + mem->size, 1, + BUS_SPACE_MAXSIZE_32BIT, BUS_DMA_ALLOCNOW, &mem->dmat)) { + if_printf(&sc->ifatm.ifnet, "could not allocate %s DMA tag\n", + nm); + return (ENOMEM); + } + + error = bus_dmamem_alloc(mem->dmat, &mem->mem, 0, &mem->map); + if (error) { + if_printf(&sc->ifatm.ifnet, "could not allocate %s DMA memory: " + "%d\n", nm, error); + bus_dma_tag_destroy(mem->dmat); + mem->mem = NULL; + return (error); + } + + error = bus_dmamap_load(mem->dmat, mem->map, mem->mem, mem->size, + dmaload_helper, &mem->paddr, BUS_DMA_NOWAIT); + if (error) { + if_printf(&sc->ifatm.ifnet, "could not load %s DMA memory: " + "%d\n", nm, error); + bus_dmamem_free(mem->dmat, mem->mem, mem->map); + bus_dma_tag_destroy(mem->dmat); + mem->mem = NULL; + return (error); + } + + DBG(sc, DMA, ("DMA %s V/P/S/Z %p/%lx/%x/%x", nm, mem->mem, + (u_long)mem->paddr, mem->size, mem->align)); + + return (0); +} + +#ifdef TEST_DMA_SYNC +static int +alloc_dma_memoryX(struct fatm_softc *sc, const char *nm, struct fatm_mem *mem) +{ + int error; + + mem->mem = NULL; + + if (bus_dma_tag_create(NULL, mem->align, 0, + BUS_SPACE_MAXADDR_24BIT, BUS_SPACE_MAXADDR, + NULL, NULL, mem->size, 1, mem->size, + BUS_DMA_ALLOCNOW, &mem->dmat)) { + if_printf(&sc->ifatm.ifnet, "could not allocate %s DMA tag\n", + nm); + return (ENOMEM); + } + + mem->mem = contigmalloc(mem->size, M_DEVBUF, M_WAITOK, + BUS_SPACE_MAXADDR_24BIT, BUS_SPACE_MAXADDR_32BIT, mem->align, 0); + + error = bus_dmamap_create(mem->dmat, 0, &mem->map); + if (error) { + if_printf(&sc->ifatm.ifnet, "could not allocate %s DMA map: " + "%d\n", nm, error); + contigfree(mem->mem, mem->size, M_DEVBUF); + bus_dma_tag_destroy(mem->dmat); + mem->mem = NULL; + return (error); + } + + error = bus_dmamap_load(mem->dmat, mem->map, mem->mem, mem->size, + dmaload_helper, &mem->paddr, BUS_DMA_NOWAIT); + if (error) { + if_printf(&sc->ifatm.ifnet, "could not load %s DMA memory: " + "%d\n", nm, error); + bus_dmamap_destroy(mem->dmat, mem->map); + contigfree(mem->mem, mem->size, M_DEVBUF); + bus_dma_tag_destroy(mem->dmat); + mem->mem = NULL; + return (error); + } + + DBG(sc, DMA, ("DMAX %s V/P/S/Z %p/%lx/%x/%x", nm, mem->mem, + (u_long)mem->paddr, mem->size, mem->align)); + + printf("DMAX: %s V/P/S/Z %p/%lx/%x/%x", nm, mem->mem, + (u_long)mem->paddr, mem->size, mem->align); + + return (0); +} +#endif /* TEST_DMA_SYNC */ + +/* + * Destroy all resources of an dma-able memory chunk + */ +static void +destroy_dma_memory(struct fatm_mem *mem) +{ + if (mem->mem != NULL) { + bus_dmamap_unload(mem->dmat, mem->map); + bus_dmamem_free(mem->dmat, mem->mem, mem->map); + bus_dma_tag_destroy(mem->dmat); + mem->mem = NULL; + } +} +#ifdef TEST_DMA_SYNC +static void +destroy_dma_memoryX(struct fatm_mem *mem) +{ + if (mem->mem != NULL) { + bus_dmamap_unload(mem->dmat, mem->map); + bus_dmamap_destroy(mem->dmat, mem->map); + contigfree(mem->mem, mem->size, M_DEVBUF); + bus_dma_tag_destroy(mem->dmat); + mem->mem = NULL; + } +} +#endif /* TEST_DMA_SYNC */ + +/* + * Try to supply buffers to the card if there are free entries in the queues + */ +static void +fatm_supply_small_buffers(struct fatm_softc *sc) +{ + int nblocks, nbufs; + struct supqueue *q; + struct rbd *bd; + int i, j, error, cnt; + struct mbuf *m; + struct rbuf *rb; + bus_addr_t phys; + + nbufs = max(4 * sc->open_vccs, 32); + nbufs = min(nbufs, SMALL_POOL_SIZE); + nbufs -= sc->small_cnt; + + nblocks = (nbufs + SMALL_SUPPLY_BLKSIZE - 1) / SMALL_SUPPLY_BLKSIZE; + for (cnt = 0; cnt < nblocks; cnt++) { + q = GET_QUEUE(sc->s1queue, struct supqueue, sc->s1queue.head); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) != FATM_STAT_FREE) + break; + + bd = (struct rbd *)q->q.ioblk; + + for (i = 0; i < SMALL_SUPPLY_BLKSIZE; i++) { + if ((rb = LIST_FIRST(&sc->rbuf_free)) == NULL) { + if_printf(&sc->ifatm.ifnet, "out of rbufs\n"); + break; + } + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) { + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + break; + } + MH_ALIGN(m, SMALL_BUFFER_LEN); + error = bus_dmamap_load(sc->rbuf_tag, rb->map, + m->m_data, SMALL_BUFFER_LEN, dmaload_helper, + &phys, BUS_DMA_NOWAIT); + if (error) { + if_printf(&sc->ifatm.ifnet, + "dmamap_load mbuf failed %d", error); + m_freem(m); + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + break; + } + bus_dmamap_sync(sc->rbuf_tag, rb->map, + BUS_DMASYNC_PREREAD); + + LIST_REMOVE(rb, link); + LIST_INSERT_HEAD(&sc->rbuf_used, rb, link); + + rb->m = m; + bd[i].handle = rb - sc->rbufs; + H_SETDESC(bd[i].buffer, phys); + } + + if (i < SMALL_SUPPLY_BLKSIZE) { + for (j = 0; j < i; j++) { + rb = sc->rbufs + bd[j].handle; + bus_dmamap_unload(sc->rbuf_tag, rb->map); + m_free(rb->m); + rb->m = NULL; + + LIST_REMOVE(rb, link); + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + } + break; + } + H_SYNCQ_PREWRITE(&sc->s1q_mem, bd, + sizeof(struct rbd) * SMALL_SUPPLY_BLKSIZE); + + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + WRITE4(sc, q->q.card, q->q.card_ioblk); + BARRIER_W(sc); + + sc->small_cnt += SMALL_SUPPLY_BLKSIZE; + + NEXT_QUEUE_ENTRY(sc->s1queue.head, SMALL_SUPPLY_QLEN); + } +} + +/* + * Try to supply buffers to the card if there are free entries in the queues + * We assume that all buffers are within the address space accessible by the + * card (32-bit), so we don't need bounce buffers. + */ +static void +fatm_supply_large_buffers(struct fatm_softc *sc) +{ + int nbufs, nblocks, cnt; + struct supqueue *q; + struct rbd *bd; + int i, j, error; + struct mbuf *m; + struct rbuf *rb; + bus_addr_t phys; + + nbufs = max(4 * sc->open_vccs, 32); + nbufs = min(nbufs, LARGE_POOL_SIZE); + nbufs -= sc->large_cnt; + + nblocks = (nbufs + LARGE_SUPPLY_BLKSIZE - 1) / LARGE_SUPPLY_BLKSIZE; + + for (cnt = 0; cnt < nblocks; cnt++) { + q = GET_QUEUE(sc->l1queue, struct supqueue, sc->l1queue.head); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) != FATM_STAT_FREE) + break; + + bd = (struct rbd *)q->q.ioblk; + + for (i = 0; i < LARGE_SUPPLY_BLKSIZE; i++) { + if ((rb = LIST_FIRST(&sc->rbuf_free)) == NULL) { + if_printf(&sc->ifatm.ifnet, "out of rbufs\n"); + break; + } + if ((m = m_getcl(M_DONTWAIT, MT_DATA, + M_PKTHDR)) == NULL) { + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + break; + } + /* No MEXT_ALIGN */ + m->m_data += MCLBYTES - LARGE_BUFFER_LEN; + error = bus_dmamap_load(sc->rbuf_tag, rb->map, + m->m_data, LARGE_BUFFER_LEN, dmaload_helper, + &phys, BUS_DMA_NOWAIT); + if (error) { + if_printf(&sc->ifatm.ifnet, + "dmamap_load mbuf failed %d", error); + m_freem(m); + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + break; + } + + bus_dmamap_sync(sc->rbuf_tag, rb->map, + BUS_DMASYNC_PREREAD); + + LIST_REMOVE(rb, link); + LIST_INSERT_HEAD(&sc->rbuf_used, rb, link); + + rb->m = m; + bd[i].handle = rb - sc->rbufs; + H_SETDESC(bd[i].buffer, phys); + } + + if (i < LARGE_SUPPLY_BLKSIZE) { + for (j = 0; j < i; j++) { + rb = sc->rbufs + bd[j].handle; + bus_dmamap_unload(sc->rbuf_tag, rb->map); + m_free(rb->m); + rb->m = NULL; + + LIST_REMOVE(rb, link); + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + } + break; + } + H_SYNCQ_PREWRITE(&sc->l1q_mem, bd, + sizeof(struct rbd) * LARGE_SUPPLY_BLKSIZE); + + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + WRITE4(sc, q->q.card, q->q.card_ioblk); + BARRIER_W(sc); + + sc->large_cnt += LARGE_SUPPLY_BLKSIZE; + + NEXT_QUEUE_ENTRY(sc->l1queue.head, LARGE_SUPPLY_QLEN); + } +} + + +/* + * Actually start the card. The lock must be held here. + * Reset, load the firmware, start it, initializes queues, read the PROM + * and supply receive buffers to the card. + */ +static void +fatm_init_locked(struct fatm_softc *sc) +{ + struct rxqueue *q; + int i, c; + uint32_t start; + + DBG(sc, INIT, ("initialize")); + if (sc->ifatm.ifnet.if_flags & IFF_RUNNING) + fatm_stop(sc); + + /* + * Hard reset the board + */ + if (fatm_reset(sc)) + return; + + start = firmware_load(sc); + if (fatm_start_firmware(sc, start) || fatm_init_cmd(sc) || + fatm_getprom(sc)) { + fatm_reset(sc); + return; + } + + /* + * Handle media + */ + c = READ4(sc, FATMO_MEDIA_TYPE); + switch (c) { + + case FORE_MT_TAXI_100: + sc->ifatm.mib.media = IFM_ATM_TAXI_100; + sc->ifatm.mib.pcr = 227273; + break; + + case FORE_MT_TAXI_140: + sc->ifatm.mib.media = IFM_ATM_TAXI_140; + sc->ifatm.mib.pcr = 318181; + break; + + case FORE_MT_UTP_SONET: + sc->ifatm.mib.media = IFM_ATM_UTP_155; + sc->ifatm.mib.pcr = 353207; + break; + + case FORE_MT_MM_OC3_ST: + case FORE_MT_MM_OC3_SC: + sc->ifatm.mib.media = IFM_ATM_MM_155; + sc->ifatm.mib.pcr = 353207; + break; + + case FORE_MT_SM_OC3_ST: + case FORE_MT_SM_OC3_SC: + sc->ifatm.mib.media = IFM_ATM_SM_155; + sc->ifatm.mib.pcr = 353207; + break; + + default: + log(LOG_ERR, "fatm: unknown media type %d\n", c); + sc->ifatm.mib.media = IFM_ATM_UNKNOWN; + sc->ifatm.mib.pcr = 353207; + break; + } + sc->ifatm.ifnet.if_baudrate = 53 * 8 * sc->ifatm.mib.pcr; + utopia_init_media(&sc->utopia); + + /* + * Initialize the RBDs + */ + for (i = 0; i < FATM_RX_QLEN; i++) { + q = GET_QUEUE(sc->rxqueue, struct rxqueue, i); + WRITE4(sc, q->q.card + 0, q->q.card_ioblk); + } + BARRIER_W(sc); + + /* + * Supply buffers to the card + */ + fatm_supply_small_buffers(sc); + fatm_supply_large_buffers(sc); + + /* + * Now set flags, that we are ready + */ + sc->ifatm.ifnet.if_flags |= IFF_RUNNING; + + /* + * Start the watchdog timer + */ + sc->ifatm.ifnet.if_timer = 5; + + /* start SUNI */ + utopia_start(&sc->utopia); + + DBG(sc, INIT, ("done")); +} + +/* + * This is the exported as initialisation function. + */ +static void +fatm_init(void *p) +{ + struct fatm_softc *sc = p; + + FATM_LOCK(sc); + fatm_init_locked(sc); + FATM_UNLOCK(sc); +} + +/************************************************************/ +/* + * The INTERRUPT handling + */ +/* + * Check the command queue. If a command was completed, call the completion + * function for that command. + */ +static void +fatm_intr_drain_cmd(struct fatm_softc *sc) +{ + struct cmdqueue *q; + int stat; + + /* + * Drain command queue + */ + for (;;) { + q = GET_QUEUE(sc->cmdqueue, struct cmdqueue, sc->cmdqueue.tail); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + stat = H_GETSTAT(q->q.statp); + + if (stat != FATM_STAT_COMPLETE && + stat != (FATM_STAT_COMPLETE | FATM_STAT_ERROR) && + stat != FATM_STAT_ERROR) + break; + + (*q->cb)(sc, q); + + H_SETSTAT(q->q.statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + NEXT_QUEUE_ENTRY(sc->cmdqueue.tail, FATM_CMD_QLEN); + } +} + +/* + * Drain the small buffer supply queue. + */ +static void +fatm_intr_drain_small_buffers(struct fatm_softc *sc) +{ + struct supqueue *q; + int stat; + + for (;;) { + q = GET_QUEUE(sc->s1queue, struct supqueue, sc->s1queue.tail); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + stat = H_GETSTAT(q->q.statp); + + if ((stat & FATM_STAT_COMPLETE) == 0) + break; + if (stat & FATM_STAT_ERROR) + log(LOG_ERR, "%s: status %x\n", __func__, stat); + + H_SETSTAT(q->q.statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + NEXT_QUEUE_ENTRY(sc->s1queue.tail, SMALL_SUPPLY_QLEN); + } +} + +/* + * Drain the large buffer supply queue. + */ +static void +fatm_intr_drain_large_buffers(struct fatm_softc *sc) +{ + struct supqueue *q; + int stat; + + for (;;) { + q = GET_QUEUE(sc->l1queue, struct supqueue, sc->l1queue.tail); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + stat = H_GETSTAT(q->q.statp); + + if ((stat & FATM_STAT_COMPLETE) == 0) + break; + if (stat & FATM_STAT_ERROR) + log(LOG_ERR, "%s status %x\n", __func__, stat); + + H_SETSTAT(q->q.statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + NEXT_QUEUE_ENTRY(sc->l1queue.tail, LARGE_SUPPLY_QLEN); + } +} + +/* + * Check the receive queue. Send any received PDU up the protocol stack + * (except when there was an error or the VCI appears to be closed. In this + * case discard the PDU). + */ +static void +fatm_intr_drain_rx(struct fatm_softc *sc) +{ + struct rxqueue *q; + int stat, mlen, drop; + u_int i; + uint32_t h; + struct mbuf *last, *m0; + struct rpd *rpd; + struct rbuf *rb; + u_int vci, vpi, pt; + struct atm_pseudohdr aph; + struct ifnet *ifp; + + for (;;) { + q = GET_QUEUE(sc->rxqueue, struct rxqueue, sc->rxqueue.tail); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + stat = H_GETSTAT(q->q.statp); + + if ((stat & FATM_STAT_COMPLETE) == 0) + break; + + rpd = (struct rpd *)q->q.ioblk; + H_SYNCQ_POSTREAD(&sc->rxq_mem, rpd, RPD_SIZE); + + rpd->nseg = le32toh(rpd->nseg); + drop = 0; + mlen = 0; + m0 = last = 0; + for (i = 0; i < rpd->nseg; i++) { + rb = sc->rbufs + rpd->segment[i].handle; + if (m0 == NULL) { + m0 = last = rb->m; + } else { + last->m_next = rb->m; + last = rb->m; + } + last->m_next = NULL; + if (last->m_flags & M_EXT) + sc->large_cnt--; + else + sc->small_cnt--; + bus_dmamap_sync(sc->rbuf_tag, rb->map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->rbuf_tag, rb->map); + rb->m = NULL; + + LIST_REMOVE(rb, link); + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + + last->m_len = le32toh(rpd->segment[i].length); + mlen += last->m_len; + } + + m0->m_pkthdr.len = mlen; + m0->m_pkthdr.rcvif = &sc->ifatm.ifnet; + + h = le32toh(rpd->atm_header); + vpi = (h >> 20) & 0xff; + vci = (h >> 4 ) & 0xffff; + pt = (h >> 1 ) & 0x7; + + /* + * Locate the VCC this packet belongs to + */ + if (!VC_OK(sc, vpi, vci)) + drop = 1; + else if ((sc->vccs[vci].flags & FATM_VCC_OPEN) == 0) { + sc->istats.rx_closed++; + drop = 1; + } + + DBG(sc, RCV, ("RCV: vc=%u.%u pt=%u mlen=%d %s", vpi, vci, + pt, mlen, drop ? "dropped" : "")); + + if (drop) { + m_freem(m0); + } else { + ATM_PH_FLAGS(&aph) = sc->vccs[vci].flags & 0xff; + ATM_PH_VPI(&aph) = vpi; + ATM_PH_SETVCI(&aph, vci); + + ifp = &sc->ifatm.ifnet; + ifp->if_ipackets++; + + atm_input(ifp, &aph, m0, sc->vccs[vci].rxhand); + } + + H_SETSTAT(q->q.statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + WRITE4(sc, q->q.card, q->q.card_ioblk); + BARRIER_W(sc); + + NEXT_QUEUE_ENTRY(sc->rxqueue.tail, FATM_RX_QLEN); + } +} + +/* + * Check the transmit queue. Free the mbuf chains that we were transmitting. + */ +static void +fatm_intr_drain_tx(struct fatm_softc *sc) +{ + struct txqueue *q; + int stat; + + /* + * Drain tx queue + */ + for (;;) { + q = GET_QUEUE(sc->txqueue, struct txqueue, sc->txqueue.tail); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + stat = H_GETSTAT(q->q.statp); + + if (stat != FATM_STAT_COMPLETE && + stat != (FATM_STAT_COMPLETE | FATM_STAT_ERROR) && + stat != FATM_STAT_ERROR) + break; + + H_SETSTAT(q->q.statp, FATM_STAT_FREE); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + bus_dmamap_sync(sc->tx_tag, q->map, BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->tx_tag, q->map); + + m_freem(q->m); + q->m = NULL; + sc->txcnt--; + + NEXT_QUEUE_ENTRY(sc->txqueue.tail, FATM_TX_QLEN); + } +} + +/* + * Interrupt handler + */ +static void +fatm_intr(void *p) +{ + struct fatm_softc *sc = (struct fatm_softc *)p; + + FATM_LOCK(sc); + if (!READ4(sc, FATMO_PSR)) { + FATM_UNLOCK(sc); + return; + } + WRITE4(sc, FATMO_HCR, FATM_HCR_CLRIRQ); + + if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) { + FATM_UNLOCK(sc); + return; + } + fatm_intr_drain_cmd(sc); + fatm_intr_drain_rx(sc); + fatm_intr_drain_tx(sc); + fatm_intr_drain_small_buffers(sc); + fatm_intr_drain_large_buffers(sc); + fatm_supply_small_buffers(sc); + fatm_supply_large_buffers(sc); + + FATM_UNLOCK(sc); + + if (sc->retry_tx && _IF_QLEN(&sc->ifatm.ifnet.if_snd)) + (*sc->ifatm.ifnet.if_start)(&sc->ifatm.ifnet); +} + +/* + * Get device statistics. This must be called with the softc locked. + * We use a preallocated buffer, so we need to protect this buffer. + * We do this by using a condition variable and a flag. If the flag is set + * the buffer is in use by one thread (one thread is executing a GETSTAT + * card command). In this case all other threads that are trying to get + * statistics block on that condition variable. When the thread finishes + * using the buffer it resets the flag and signals the condition variable. This + * will wakeup the next thread that is waiting for the buffer. If the interface + * is stopped the stopping function will broadcast the cv. All threads will + * find that the interface has been stopped and return. + * + * Aquiring of the buffer is done by the fatm_getstat() function. The freeing + * must be done by the caller when he has finished using the buffer. + */ +static void +fatm_getstat_complete(struct fatm_softc *sc, struct cmdqueue *q) +{ + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.get_stat_errors++; + q->error = EIO; + } + wakeup(&sc->sadi_mem); +} +static int +fatm_getstat(struct fatm_softc *sc) +{ + int error; + struct cmdqueue *q; + + /* + * Wait until either the interface is stopped or we can get the + * statistics buffer + */ + for (;;) { + if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) + return (EIO); + if (!(sc->flags & FATM_STAT_INUSE)) + break; + cv_wait(&sc->cv_stat, &sc->mtx); + } + sc->flags |= FATM_STAT_INUSE; + + q = GET_QUEUE(sc->cmdqueue, struct cmdqueue, sc->cmdqueue.head); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (!(H_GETSTAT(q->q.statp) & FATM_STAT_FREE)) { + sc->istats.cmd_queue_full++; + return (EIO); + } + NEXT_QUEUE_ENTRY(sc->cmdqueue.head, FATM_CMD_QLEN); + + q->error = 0; + q->cb = fatm_getstat_complete; + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + bus_dmamap_sync(sc->sadi_mem.dmat, sc->sadi_mem.map, + BUS_DMASYNC_PREREAD); + + WRITE4(sc, q->q.card + FATMOC_GSTAT_BUF, + sc->sadi_mem.paddr); + BARRIER_W(sc); + WRITE4(sc, q->q.card + FATMOC_OP, + FATM_OP_REQUEST_STATS | FATM_OP_INTERRUPT_SEL); + BARRIER_W(sc); + + /* + * Wait for the command to complete + */ + error = msleep(&sc->sadi_mem, &sc->mtx, PZERO | PCATCH, + "fatm_stat", hz); + + switch (error) { + + case EWOULDBLOCK: + error = EIO; + break; + + case ERESTART: + error = EINTR; + break; + + case 0: + bus_dmamap_sync(sc->sadi_mem.dmat, sc->sadi_mem.map, + BUS_DMASYNC_POSTREAD); + error = q->error; + break; + } + + /* + * Swap statistics + */ + if (q->error == 0) { + u_int i; + uint32_t *p = (uint32_t *)sc->sadi_mem.mem; + + for (i = 0; i < sizeof(struct fatm_stats) / sizeof(uint32_t); + i++, p++) + *p = be32toh(*p); + } + + return (error); +} + +/* + * Create a copy of a single mbuf. It can have either internal or + * external data, it may have a packet header. External data is really + * copied, so the new buffer is writeable. + */ +static struct mbuf * +copy_mbuf(struct mbuf *m) +{ + struct mbuf *new; + + MGET(new, M_DONTWAIT, MT_DATA); + if (new == NULL) + return (NULL); + + if (m->m_flags & M_PKTHDR) { + M_MOVE_PKTHDR(new, m); + if (m->m_len > MHLEN) { + MCLGET(new, M_TRYWAIT); + if ((m->m_flags & M_EXT) == 0) { + m_free(new); + return (NULL); + } + } + } else { + if (m->m_len > MLEN) { + MCLGET(new, M_TRYWAIT); + if ((m->m_flags & M_EXT) == 0) { + m_free(new); + return (NULL); + } + } + } + + bcopy(m->m_data, new->m_data, m->m_len); + new->m_len = m->m_len; + new->m_flags &= ~M_RDONLY; + + return (new); +} + +/* + * All segments must have a four byte aligned buffer address and a four + * byte aligned length. Step through an mbuf chain and check these conditions. + * If the buffer address is not aligned and this is a normal mbuf, move + * the data down. Else make a copy of the mbuf with aligned data. + * If the buffer length is not aligned steel data from the next mbuf. + * We don't need to check whether this has more than one external reference, + * because steeling data doesn't change the external cluster. + * If the last mbuf is not aligned, fill with zeroes. + * + * Return packet length (well we should have this in the packet header), + * but be careful not to count the zero fill at the end. + * + * If fixing fails free the chain and zero the pointer. + * + * We assume, that aligning the virtual address also aligns the mapped bus + * address. + */ +static u_int +fatm_fix_chain(struct fatm_softc *sc, struct mbuf **mp) +{ + struct mbuf *m = *mp, *prev = NULL, *next, *new; + u_int mlen = 0, fill = 0; + int first, off; + u_char *d, *cp; + + do { + next = m->m_next; + + if ((uintptr_t)mtod(m, void *) % 4 != 0 || + (m->m_len % 4 != 0 && next)) { + /* + * Needs fixing + */ + first = (m == *mp); + + d = mtod(m, u_char *); + if ((off = (uintptr_t)(void *)d % 4) != 0) { + if (!(m->m_flags & M_EXT) || !MEXT_IS_REF(m)) { + sc->istats.fix_addr_copy++; + bcopy(d, d - off, m->m_len); + m->m_data = (caddr_t)(d - off); + } else { + if ((new = copy_mbuf(m)) == NULL) { + sc->istats.fix_addr_noext++; + goto fail; + } + sc->istats.fix_addr_ext++; + if (prev) + prev->m_next = new; + new->m_next = next; + m_free(m); + m = new; + } + } + + if ((off = m->m_len % 4) != 0) { + if ((m->m_flags & M_EXT) && MEXT_IS_REF(m)) { + if ((new = copy_mbuf(m)) == NULL) { + sc->istats.fix_len_noext++; + goto fail; + } + sc->istats.fix_len_copy++; + if (prev) + prev->m_next = new; + new->m_next = next; + m_free(m); + m = new; + } else + sc->istats.fix_len++; + d = mtod(m, u_char *) + m->m_len; + off = 4 - off; + while (off) { + if (next == NULL) { + *d++ = 0; + fill++; + } else if (next->m_len == 0) { + sc->istats.fix_empty++; + next = m_free(next); + continue; + } else { + cp = mtod(next, u_char *); + *d++ = *cp++; + next->m_len--; + next->m_data = (caddr_t)cp; + } + off--; + m->m_len++; + } + } + + if (first) + *mp = m; + } + + mlen += m->m_len; + prev = m; + } while ((m = next) != NULL); + + return (mlen - fill); + + fail: + m_freem(*mp); + *mp = NULL; + return (0); +} + +/* + * The helper function is used to load the computed physical addresses + * into the transmit descriptor. + */ +static void +fatm_tpd_load(void *varg, bus_dma_segment_t *segs, int nsegs, + bus_size_t mapsize, int error) +{ + struct tpd *tpd = varg; + + if (error) + return; + + KASSERT(nsegs <= TPD_EXTENSIONS + TXD_FIXED, ("too many segments")); + + tpd->spec = 0; + while (nsegs--) { + H_SETDESC(tpd->segment[tpd->spec].buffer, segs->ds_addr); + H_SETDESC(tpd->segment[tpd->spec].length, segs->ds_len); + tpd->spec++; + segs++; + } +} + +/* + * Start output. + * + * Note, that we update the internal statistics without the lock here. + */ +static int +fatm_tx(struct fatm_softc *sc, struct mbuf *m, u_int vpi, u_int vci, u_int mlen) +{ + struct txqueue *q; + u_int nblks; + int error, aal, nsegs; + struct tpd *tpd; + + /* + * Get a queue element. + * If there isn't one - try to drain the transmit queue + * We used to sleep here if that doesn't help, but we + * should not sleep here, because we are called with locks. + */ + q = GET_QUEUE(sc->txqueue, struct txqueue, sc->txqueue.head); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) != FATM_STAT_FREE) { + fatm_intr_drain_tx(sc); + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) != FATM_STAT_FREE) { + if (sc->retry_tx) { + sc->istats.tx_retry++; + IF_PREPEND(&sc->ifatm.ifnet.if_snd, m); + return (1); + } + sc->istats.tx_queue_full++; + m_freem(m); + return (0); + } + sc->istats.tx_queue_almost_full++; + } + + tpd = q->q.ioblk; + + m->m_data += sizeof(struct atm_pseudohdr); + m->m_len -= sizeof(struct atm_pseudohdr); + + /* map the mbuf */ + error = bus_dmamap_load_mbuf(sc->tx_tag, q->map, m, + fatm_tpd_load, tpd, BUS_DMA_NOWAIT); + if(error) { + sc->ifatm.ifnet.if_oerrors++; + if_printf(&sc->ifatm.ifnet, "mbuf loaded error=%d\n", error); + m_freem(m); + return (0); + } + nsegs = tpd->spec; + + bus_dmamap_sync(sc->tx_tag, q->map, BUS_DMASYNC_PREWRITE); + + /* + * OK. Now go and do it. + */ + aal = (sc->vccs[vci].aal == ATMIO_AAL_5) ? 5 : 0; + + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + q->m = m; + + /* + * If the transmit queue is almost full, schedule a + * transmit interrupt so that transmit descriptors can + * be recycled. + */ + H_SETDESC(tpd->spec, TDX_MKSPEC((sc->txcnt >= + (4 * FATM_TX_QLEN) / 5), aal, nsegs, mlen)); + H_SETDESC(tpd->atm_header, TDX_MKHDR(vpi, vci, 0, 0)); + + if (sc->vccs[vci].traffic == ATMIO_TRAFFIC_UBR) + H_SETDESC(tpd->stream, 0); + else { + u_int i; + + for (i = 0; i < RATE_TABLE_SIZE; i++) + if (rate_table[i].cell_rate < sc->vccs[vci].pcr) + break; + if (i > 0) + i--; + H_SETDESC(tpd->stream, rate_table[i].ratio); + } + H_SYNCQ_PREWRITE(&sc->txq_mem, tpd, TPD_SIZE); + + nblks = TDX_SEGS2BLKS(nsegs); + + DBG(sc, XMIT, ("XMIT: mlen=%d spec=0x%x nsegs=%d blocks=%d", + mlen, le32toh(tpd->spec), nsegs, nblks)); + + WRITE4(sc, q->q.card + 0, q->q.card_ioblk | nblks); + BARRIER_W(sc); + + sc->txcnt++; + sc->ifatm.ifnet.if_opackets++; + + NEXT_QUEUE_ENTRY(sc->txqueue.head, FATM_TX_QLEN); + + return (0); +} + +static void +fatm_start(struct ifnet *ifp) +{ + struct atm_pseudohdr aph; + struct fatm_softc *sc; + struct mbuf *m; + u_int mlen, vpi, vci; + + sc = (struct fatm_softc *)ifp->if_softc; + + while (1) { + IF_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) + break; + + /* + * Loop through the mbuf chain and compute the total length + * of the packet. Check that all data pointer are + * 4 byte aligned. If they are not, call fatm_mfix to + * fix that problem. This comes more or less from the + * en driver. + */ + mlen = fatm_fix_chain(sc, &m); + if (m == NULL) + continue; + + if (m->m_len < sizeof(struct atm_pseudohdr) && + (m = m_pullup(m, sizeof(struct atm_pseudohdr))) == NULL) + continue; + + aph = *mtod(m, struct atm_pseudohdr *); + mlen -= sizeof(struct atm_pseudohdr); + + if (mlen == 0) { + m_freem(m); + continue; + } + if (mlen > FATM_MAXPDU) { + sc->istats.tx_pdu2big++; + m_freem(m); + continue; + } + + vci = ATM_PH_VCI(&aph); + vpi = ATM_PH_VPI(&aph); + + /* + * From here on we need the softc + */ + FATM_LOCK(sc); + if (!(ifp->if_flags & IFF_RUNNING)) { + FATM_UNLOCK(sc); + m_freem(m); + break; + } + if (!VC_OK(sc, vpi, vci) || + !(sc->vccs[vci].flags & FATM_VCC_OPEN)) { + FATM_UNLOCK(sc); + m_freem(m); + continue; + } + if (fatm_tx(sc, m, vpi, vci, mlen)) { + FATM_UNLOCK(sc); + break; + } + FATM_UNLOCK(sc); + } +} + +/* + * Return a table of all currently open VCCs. + */ +static struct atmio_vcctable * +get_vccs(struct fatm_softc *sc, int flags) +{ + struct atmio_vcctable *vccs; + struct atmio_vcc *v; + u_int i, alloc; + + alloc = 10; + vccs = NULL; + for (;;) { + vccs = reallocf(vccs, + sizeof(*vccs) + alloc * sizeof(vccs->vccs[0]), + M_DEVBUF, flags); + if (vccs == NULL) + return (NULL); + + vccs->count = 0; + FATM_LOCK(sc); + v = vccs->vccs; + for (i = 0; i < (1U << sc->ifatm.mib.vci_bits); i++) { + if (sc->vccs[i].flags & FATM_VCC_OPEN) { + if (vccs->count++ == alloc) { + alloc *= 2; + break; + } + v->vpi = 0; + v->vci = i; + v->flags = sc->vccs[i].flags; + v->aal = sc->vccs[i].aal; + v->traffic = sc->vccs[i].traffic; + bzero(&v->tparam, sizeof(v->tparam)); + v->tparam.pcr = sc->vccs[i].pcr; + v++; + } + } + if (i == (1U << sc->ifatm.mib.vci_bits)) + break; + FATM_UNLOCK(sc); + } + FATM_UNLOCK(sc); + return (vccs); +} + +/* + * VCC managment + * + * This may seem complicated. The reason for this is, that we need an + * asynchronuous open/close for the NATM VCCs because our ioctl handler + * is called with the radix node head of the routing table locked. Therefor + * we cannot sleep there and wait for the open/close to succeed. For this + * reason we just initiate the operation from the ioctl. + */ + +/* + * Command the card to open/close a VC. + * Return the queue entry for waiting if we are succesful. + */ +static struct cmdqueue * +fatm_start_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, uint32_t cmd, + u_int mtu, void (*func)(struct fatm_softc *, struct cmdqueue *)) +{ + struct cmdqueue *q; + + q = GET_QUEUE(sc->cmdqueue, struct cmdqueue, sc->cmdqueue.head); + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (!(H_GETSTAT(q->q.statp) & FATM_STAT_FREE)) { + sc->istats.cmd_queue_full++; + return (NULL); + } + NEXT_QUEUE_ENTRY(sc->cmdqueue.head, FATM_CMD_QLEN); + + q->error = 0; + q->cb = func; + H_SETSTAT(q->q.statp, FATM_STAT_PENDING); + H_SYNCSTAT_PREWRITE(sc, q->q.statp); + + WRITE4(sc, q->q.card + FATMOC_ACTIN_VPVC, MKVPVC(vpi, vci)); + BARRIER_W(sc); + WRITE4(sc, q->q.card + FATMOC_ACTIN_MTU, mtu); + BARRIER_W(sc); + WRITE4(sc, q->q.card + FATMOC_OP, cmd); + BARRIER_W(sc); + + return (q); +} + +/* + * Start to open a VCC. This just initiates the operation. + */ +static int +fatm_start_open_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, u_int aal, + u_int traffic, u_int pcr, u_int flags, void *rxhand, + void (*func)(struct fatm_softc *, struct cmdqueue *), struct cmdqueue **qp) +{ + int error; + uint32_t cmd; + struct cmdqueue *q; + + error = 0; + + if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) + return (EIO); + if (!VC_OK(sc, vpi, vci) || + (aal != ATMIO_AAL_0 && aal != ATMIO_AAL_5) || + (traffic != ATMIO_TRAFFIC_UBR && traffic != ATMIO_TRAFFIC_CBR)) + return (EINVAL); + if (sc->vccs[vci].flags & FATM_VCC_BUSY) + return (EBUSY); + + /* Command and buffer strategy */ + cmd = FATM_OP_ACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL | (0 << 16); + if (aal == ATMIO_AAL_0) + cmd |= (0 << 8); + else + cmd |= (5 << 8); + + if ((q = fatm_start_vcc(sc, vpi, vci, cmd, 1, func)) == NULL) + return (EIO); + if (qp != NULL) + *qp = q; + + sc->vccs[vci].aal = aal; + sc->vccs[vci].flags = flags | FATM_VCC_TRY_OPEN; + sc->vccs[vci].rxhand = rxhand; + sc->vccs[vci].pcr = pcr; + sc->vccs[vci].traffic = traffic; + + return (0); +} + +/* + * Initiate closing a VCC + */ +static int +fatm_start_close_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, + void (*func)(struct fatm_softc *, struct cmdqueue *), struct cmdqueue **qp) +{ + int error; + struct cmdqueue *q; + + error = 0; + + if (!(sc->ifatm.ifnet.if_flags & IFF_RUNNING)) + return (EIO); + if (!VC_OK(sc, vpi, vci)) + return (EINVAL); + if (!(sc->vccs[vci].flags & (FATM_VCC_OPEN | FATM_VCC_TRY_OPEN))) + return (ENOENT); + + if ((q = fatm_start_vcc(sc, vpi, vci, + FATM_OP_DEACTIVATE_VCIN | FATM_OP_INTERRUPT_SEL, 1, func)) == NULL) + return (EIO); + + if (qp != NULL) + *qp = q; + + sc->vccs[vci].flags &= ~(FATM_VCC_OPEN | FATM_VCC_TRY_OPEN); + sc->vccs[vci].flags |= FATM_VCC_TRY_CLOSE; + + return (0); +} + +/* + * Wait on the queue entry until the VCC is opened/closed. + */ +static int +fatm_waitvcc(struct fatm_softc *sc, struct cmdqueue *q) +{ + int error; + + /* + * Wait for the command to complete + */ + error = msleep(q, &sc->mtx, PZERO | PCATCH, "fatm_vci", hz); + + if (error != 0) + return (error); + return (q->error); +} + +/* + * The VC has been opened/closed and somebody has been waiting for this. + * Wake him up. + */ +static void +fatm_cmd_complete(struct fatm_softc *sc, struct cmdqueue *q) +{ + + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.get_stat_errors++; + q->error = EIO; + } + wakeup(q); +} + +/* + * Open a vcc and wait for completion + */ +static int +fatm_open_vcc(struct fatm_softc *sc, u_int vpi, u_int vci, u_int flags, + u_int aal, u_int traffic, u_int pcr, void *rxhand) +{ + int error; + struct cmdqueue *q; + + error = 0; + + FATM_LOCK(sc); + error = fatm_start_open_vcc(sc, vpi, vci, aal, traffic, pcr, + flags, rxhand, fatm_cmd_complete, &q); + if (error != 0) { + FATM_UNLOCK(sc); + return (error); + } + error = fatm_waitvcc(sc, q); + + if (error == 0) { + sc->vccs[vci].flags &= ~FATM_VCC_TRY_OPEN; + sc->vccs[vci].flags |= FATM_VCC_OPEN; + sc->open_vccs++; + +#ifdef notyet + /* inform management if this is not an NG + * VCC or it's an NG PVC. */ + if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) || + (sc->vccs[vci].flags & ATMIO_FLAG_PVC)) + atm_message(&sc->ifatm.ifnet, + ATM_MSG_VCC_CHANGED, + (1 << 24) | (0 << 16) | vci); +#endif + } else + bzero(&sc->vccs[vci], sizeof(sc->vccs[vci])); + + FATM_UNLOCK(sc); + return (error); +} + +/* + * Close a VCC synchronuosly + */ +static int +fatm_close_vcc(struct fatm_softc *sc, u_int vpi, u_int vci) +{ + int error; + struct cmdqueue *q; + + error = 0; + + FATM_LOCK(sc); + error = fatm_start_close_vcc(sc, vpi, vci, fatm_cmd_complete, &q); + if (error != 0) { + FATM_UNLOCK(sc); + return (error); + } + error = fatm_waitvcc(sc, q); + + if (error == 0) { +#ifdef notyet + /* inform management of this is not an NG + * VCC or it's an NG PVC. */ + if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) || + (sc->vccs[vci].flags & ATMIO_FLAG_PVC)) + atm_message(&sc->ifatm.ifnet, + ATM_MSG_VCC_CHANGED, + (0 << 24) | (0 << 16) | vci); +#endif + + bzero(&sc->vccs[vci], sizeof(sc->vccs[vci])); + sc->open_vccs--; + } + + FATM_UNLOCK(sc); + return (error); +} + +/* + * The VC has been opened. + */ +static void +fatm_open_complete(struct fatm_softc *sc, struct cmdqueue *q) +{ + u_int vci; + + vci = GETVCI(READ4(sc, q->q.card + FATMOC_ACTIN_VPVC)); + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.get_stat_errors++; + bzero(&sc->vccs[vci], sizeof(sc->vccs[vci])); + if_printf(&sc->ifatm.ifnet, "opening VCI %u failed\n", vci); + return; + } + + sc->vccs[vci].flags &= ~FATM_VCC_TRY_OPEN; + sc->vccs[vci].flags |= FATM_VCC_OPEN; + sc->open_vccs++; + +#ifdef notyet + /* inform management if this is not an NG + * VCC or it's an NG PVC. */ + if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) || + (sc->vccs[vci].flags & ATMIO_FLAG_PVC)) + atm_message(&sc->ifatm.ifnet, ATM_MSG_VCC_CHANGED, + (1 << 24) | (0 << 16) | vci); +#endif +} + +/* + * The VC has been closed. + */ +static void +fatm_close_complete(struct fatm_softc *sc, struct cmdqueue *q) +{ + u_int vci; + + vci = GETVCI(READ4(sc, q->q.card + FATMOC_ACTIN_VPVC)); + H_SYNCSTAT_POSTREAD(sc, q->q.statp); + if (H_GETSTAT(q->q.statp) & FATM_STAT_ERROR) { + sc->istats.get_stat_errors++; + /* keep the VCC in that state */ + if_printf(&sc->ifatm.ifnet, "closing VCI %u failed\n", vci); + return; + } + +#ifdef notyet + /* inform management of this is not an NG + * VCC or it's an NG PVC. */ + if (!(sc->vccs[vci].flags & ATMIO_FLAG_NG) || + (sc->vccs[vci].flags & ATMIO_FLAG_PVC)) + atm_message(&sc->ifatm.ifnet, ATM_MSG_VCC_CHANGED, + (0 << 24) | (0 << 16) | vci); +#endif + + bzero(&sc->vccs[vci], sizeof(sc->vccs[vci])); + sc->open_vccs--; +} + +/* + * Open a vcc but don't wait. + */ +static int +fatm_open_vcc_nowait(struct fatm_softc *sc, u_int vpi, u_int vci, u_int flags, + u_int aal, void *rxhand) +{ + int error; + + FATM_LOCK(sc); + error = fatm_start_open_vcc(sc, vpi, vci, aal, ATMIO_TRAFFIC_UBR, 0, + flags, rxhand, fatm_open_complete, NULL); + FATM_UNLOCK(sc); + return (error); +} + +/* + * Close a VCC but don't wait + */ +static int +fatm_close_vcc_nowait(struct fatm_softc *sc, u_int vpi, u_int vci) +{ + int error; + + FATM_LOCK(sc); + error = fatm_start_close_vcc(sc, vpi, vci, fatm_close_complete, NULL); + FATM_UNLOCK(sc); + return (error); +} + +/* + * IOCTL handler + */ +static int +fatm_ioctl(struct ifnet *ifp, u_long cmd, caddr_t arg) +{ + int error; + struct fatm_softc *sc = ifp->if_softc; + struct ifaddr *ifa = (struct ifaddr *)arg; + struct ifreq *ifr = (struct ifreq *)arg; + struct atmio_closevcc *cl = (struct atmio_closevcc *)arg; + struct atmio_openvcc *op = (struct atmio_openvcc *)arg; + struct atm_pseudoioctl *pa = (struct atm_pseudoioctl *)arg; + struct atmio_vcctable *vtab; + + error = 0; + switch (cmd) { + + case SIOCATMENA: /* internal NATM use */ + error = fatm_open_vcc_nowait(sc, ATM_PH_VPI(&pa->aph), + ATM_PH_VCI(&pa->aph), ATM_PH_FLAGS(&pa->aph), + (ATM_PH_FLAGS(&pa->aph) & ATM_PH_AAL5) ? ATMIO_AAL_5 : + ATMIO_AAL_0, pa->rxhand); + break; + + case SIOCATMDIS: /* internal NATM use */ + error = fatm_close_vcc_nowait(sc, ATM_PH_VPI(&pa->aph), + ATM_PH_VCI(&pa->aph)); + break; + + case SIOCATMOPENVCC: + error = fatm_open_vcc(sc, op->param.vpi, op->param.vci, + op->param.flags, op->param.aal, op->param.traffic, + op->param.tparam.pcr, op->rxhand); + break; + + case SIOCATMCLOSEVCC: + error = fatm_close_vcc(sc, cl->vpi, cl->vci); + break; + + case SIOCSIFADDR: + FATM_LOCK(sc); + ifp->if_flags |= IFF_UP; + if (!(ifp->if_flags & IFF_RUNNING)) + fatm_init_locked(sc); + switch (ifa->ifa_addr->sa_family) { +#ifdef INET + case AF_INET: + case AF_INET6: + ifa->ifa_rtrequest = atm_rtrequest; + break; +#endif + default: + break; + } + FATM_UNLOCK(sc); + break; + + case SIOCSIFFLAGS: + FATM_LOCK(sc); + if (ifp->if_flags & IFF_UP) { + if (!(ifp->if_flags & IFF_RUNNING)) { + fatm_init_locked(sc); + } + } else { + if (ifp->if_flags & IFF_RUNNING) { + fatm_stop(sc); + } + } + FATM_UNLOCK(sc); + break; + + case SIOCGIFMEDIA: + case SIOCSIFMEDIA: + if (ifp->if_flags & IFF_RUNNING) + error = ifmedia_ioctl(ifp, ifr, &sc->media, cmd); + else + error = EINVAL; + break; + + case SIOCATMGVCCS: + /* return vcc table */ + vtab = get_vccs(sc, M_WAITOK); + if (vtab == NULL) { + error = ENOMEM; + break; + } + error = copyout(vtab, ifr->ifr_data, sizeof(*vtab) + + vtab->count * sizeof(vtab->vccs[0])); + free(vtab, M_DEVBUF); + break; + + case SIOCATMGETVCCS: /* internal netgraph use */ + vtab = get_vccs(sc, M_NOWAIT); + if (vtab == NULL) { + error = ENOMEM; + break; + } + *(void **)arg = vtab; + break; + + default: + DBG(sc, IOCTL, ("+++ cmd=%08lx arg=%p", cmd, arg)); + error = EINVAL; + break; + } + + return (error); +} + +/* + * Detach from the interface and free all resources allocated during + * initialisation and later. + */ +static int +fatm_detach(device_t dev) +{ + u_int i; + struct rbuf *rb; + struct fatm_softc *sc; + struct txqueue *tx; + + sc = (struct fatm_softc *)device_get_softc(dev); + + if (device_is_alive(dev)) { + FATM_LOCK(sc); + fatm_stop(sc); + utopia_detach(&sc->utopia); + FATM_UNLOCK(sc); + atm_ifdetach(&sc->ifatm.ifnet); /* XXX race */ + } + + if (sc->ih != NULL) + bus_teardown_intr(dev, sc->irqres, sc->ih); + + while ((rb = LIST_FIRST(&sc->rbuf_used)) != NULL) { + if_printf(&sc->ifatm.ifnet, "rbuf %p still in use!\n", rb); + bus_dmamap_unload(sc->rbuf_tag, rb->map); + m_freem(rb->m); + LIST_REMOVE(rb, link); + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + } + + if (sc->txqueue.chunk != NULL) { + for (i = 0; i < FATM_TX_QLEN; i++) { + tx = GET_QUEUE(sc->txqueue, struct txqueue, i); + bus_dmamap_destroy(sc->tx_tag, tx->map); + } + } + + while ((rb = LIST_FIRST(&sc->rbuf_free)) != NULL) { + bus_dmamap_destroy(sc->rbuf_tag, rb->map); + LIST_REMOVE(rb, link); + } + + free(sc->rbufs, M_DEVBUF); + free(sc->vccs, M_DEVBUF); + + free(sc->l1queue.chunk, M_DEVBUF); + free(sc->s1queue.chunk, M_DEVBUF); + free(sc->rxqueue.chunk, M_DEVBUF); + free(sc->txqueue.chunk, M_DEVBUF); + free(sc->cmdqueue.chunk, M_DEVBUF); + + destroy_dma_memory(&sc->reg_mem); + destroy_dma_memory(&sc->sadi_mem); + destroy_dma_memory(&sc->prom_mem); +#ifdef TEST_DMA_SYNC + destroy_dma_memoryX(&sc->s1q_mem); + destroy_dma_memoryX(&sc->l1q_mem); + destroy_dma_memoryX(&sc->rxq_mem); + destroy_dma_memoryX(&sc->txq_mem); + destroy_dma_memoryX(&sc->stat_mem); +#endif + + if (sc->tx_tag != NULL) + if (bus_dma_tag_destroy(sc->tx_tag)) + printf("tx DMA tag busy!\n"); + + if (sc->rbuf_tag != NULL) + if (bus_dma_tag_destroy(sc->rbuf_tag)) + printf("rbuf DMA tag busy!\n"); + + if (sc->parent_dmat != NULL) + if (bus_dma_tag_destroy(sc->parent_dmat)) + printf("parent DMA tag busy!\n"); + + if (sc->irqres != NULL) + bus_release_resource(dev, SYS_RES_IRQ, sc->irqid, sc->irqres); + + if (sc->memres != NULL) + bus_release_resource(dev, SYS_RES_MEMORY, + sc->memid, sc->memres); + + (void)sysctl_ctx_free(&sc->sysctl_ctx); + + cv_destroy(&sc->cv_stat); + cv_destroy(&sc->cv_regs); + + mtx_destroy(&sc->mtx); + + return (0); +} + +/* + * Sysctl handler + */ +static int +fatm_sysctl_istats(SYSCTL_HANDLER_ARGS) +{ + struct fatm_softc *sc = arg1; + u_long *ret; + int error; + + ret = malloc(sizeof(sc->istats), M_TEMP, M_WAITOK); + + FATM_LOCK(sc); + bcopy(&sc->istats, ret, sizeof(sc->istats)); + FATM_UNLOCK(sc); + + error = SYSCTL_OUT(req, ret, sizeof(sc->istats)); + free(ret, M_TEMP); + + return (error); +} + +/* + * Sysctl handler for card statistics + */ +static int +fatm_sysctl_stats(SYSCTL_HANDLER_ARGS) +{ + struct fatm_softc *sc = arg1; + int error; + const struct fatm_stats *s; + u_long *ret; + u_int i; + + ret = malloc(sizeof(u_long) * FATM_NSTATS, M_TEMP, M_WAITOK); + + FATM_LOCK(sc); + + if ((error = fatm_getstat(sc)) == 0) { + s = sc->sadi_mem.mem; + i = 0; + ret[i++] = s->phy_4b5b.crc_header_errors; + ret[i++] = s->phy_4b5b.framing_errors; + ret[i++] = s->phy_oc3.section_bip8_errors; + ret[i++] = s->phy_oc3.path_bip8_errors; + ret[i++] = s->phy_oc3.line_bip24_errors; + ret[i++] = s->phy_oc3.line_febe_errors; + ret[i++] = s->phy_oc3.path_febe_errors; + ret[i++] = s->phy_oc3.corr_hcs_errors; + ret[i++] = s->phy_oc3.ucorr_hcs_errors; + ret[i++] = s->atm.cells_transmitted; + ret[i++] = s->atm.cells_received; + ret[i++] = s->atm.vpi_bad_range; + ret[i++] = s->atm.vpi_no_conn; + ret[i++] = s->atm.vci_bad_range; + ret[i++] = s->atm.vci_no_conn; + ret[i++] = s->aal0.cells_transmitted; + ret[i++] = s->aal0.cells_received; + ret[i++] = s->aal0.cells_dropped; + ret[i++] = s->aal4.cells_transmitted; + ret[i++] = s->aal4.cells_received; + ret[i++] = s->aal4.cells_crc_errors; + ret[i++] = s->aal4.cels_protocol_errors; + ret[i++] = s->aal4.cells_dropped; + ret[i++] = s->aal4.cspdus_transmitted; + ret[i++] = s->aal4.cspdus_received; + ret[i++] = s->aal4.cspdus_protocol_errors; + ret[i++] = s->aal4.cspdus_dropped; + ret[i++] = s->aal5.cells_transmitted; + ret[i++] = s->aal5.cells_received; + ret[i++] = s->aal5.congestion_experienced; + ret[i++] = s->aal5.cells_dropped; + ret[i++] = s->aal5.cspdus_transmitted; + ret[i++] = s->aal5.cspdus_received; + ret[i++] = s->aal5.cspdus_crc_errors; + ret[i++] = s->aal5.cspdus_protocol_errors; + ret[i++] = s->aal5.cspdus_dropped; + ret[i++] = s->aux.small_b1_failed; + ret[i++] = s->aux.large_b1_failed; + ret[i++] = s->aux.small_b2_failed; + ret[i++] = s->aux.large_b2_failed; + ret[i++] = s->aux.rpd_alloc_failed; + ret[i++] = s->aux.receive_carrier; + } + /* declare the buffer free */ + sc->flags &= ~FATM_STAT_INUSE; + cv_signal(&sc->cv_stat); + + FATM_UNLOCK(sc); + + if (error == 0) + error = SYSCTL_OUT(req, ret, sizeof(u_long) * FATM_NSTATS); + free(ret, M_TEMP); + + return (error); +} + +#define MAXDMASEGS 32 /* maximum number of receive descriptors */ + +/* + * Attach to the device. + * + * We assume, that there is a global lock (Giant in this case) that protects + * multiple threads from entering this function. This makes sense, doesn't it? + */ +static int +fatm_attach(device_t dev) +{ + struct ifnet *ifp; + struct fatm_softc *sc; + int unit; + uint16_t cfg; + int error = 0; + struct rbuf *rb; + u_int i; + struct txqueue *tx; + + sc = device_get_softc(dev); + unit = device_get_unit(dev); + + sc->ifatm.mib.device = ATM_DEVICE_PCA200E; + sc->ifatm.mib.serial = 0; + sc->ifatm.mib.hw_version = 0; + sc->ifatm.mib.sw_version = 0; + sc->ifatm.mib.vpi_bits = 0; + sc->ifatm.mib.vci_bits = FORE_VCIBITS; + sc->ifatm.mib.max_vpcs = 0; + sc->ifatm.mib.max_vccs = FORE_MAX_VCC; + sc->ifatm.mib.media = IFM_ATM_UNKNOWN; + sc->ifatm.phy = &sc->utopia; + + LIST_INIT(&sc->rbuf_free); + LIST_INIT(&sc->rbuf_used); + + /* + * Initialize mutex and condition variables. + */ + mtx_init(&sc->mtx, device_get_nameunit(dev), + MTX_NETWORK_LOCK, MTX_DEF); + + cv_init(&sc->cv_stat, "fatm_stat"); + cv_init(&sc->cv_regs, "fatm_regs"); + + sysctl_ctx_init(&sc->sysctl_ctx); + + /* + * Make the sysctl tree + */ + if ((sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctx, + SYSCTL_STATIC_CHILDREN(_hw_atm), OID_AUTO, + device_get_nameunit(dev), CTLFLAG_RD, 0, "")) == NULL) + goto fail; + + if (SYSCTL_ADD_PROC(&sc->sysctl_ctx, SYSCTL_CHILDREN(sc->sysctl_tree), + OID_AUTO, "istats", CTLFLAG_RD, sc, 0, fatm_sysctl_istats, + "LU", "internal statistics") == NULL) + goto fail; + + if (SYSCTL_ADD_PROC(&sc->sysctl_ctx, SYSCTL_CHILDREN(sc->sysctl_tree), + OID_AUTO, "stats", CTLFLAG_RD, sc, 0, fatm_sysctl_stats, + "LU", "card statistics") == NULL) + goto fail; + + if (SYSCTL_ADD_INT(&sc->sysctl_ctx, SYSCTL_CHILDREN(sc->sysctl_tree), + OID_AUTO, "retry_tx", CTLFLAG_RW, &sc->retry_tx, 0, + "retry flag") == NULL) + goto fail; + +#ifdef FATM_DEBUG + if (SYSCTL_ADD_UINT(&sc->sysctl_ctx, SYSCTL_CHILDREN(sc->sysctl_tree), + OID_AUTO, "debug", CTLFLAG_RW, &sc->debug, 0, "debug flags") + == NULL) + goto fail; + sc->debug = FATM_DEBUG; +#endif + + /* + * Network subsystem stuff + */ + ifp = &sc->ifatm.ifnet; + ifp->if_softc = sc; + ifp->if_unit = unit; + ifp->if_name = "fatm"; + ifp->if_flags = IFF_SIMPLEX; + ifp->if_ioctl = fatm_ioctl; + ifp->if_start = fatm_start; + ifp->if_watchdog = fatm_watchdog; + ifp->if_init = fatm_init; + ifp->if_linkmib = &sc->ifatm.mib; + ifp->if_linkmiblen = sizeof(sc->ifatm.mib); + + /* + * Enable memory and bustmaster + */ + cfg = pci_read_config(dev, PCIR_COMMAND, 2); + cfg |= PCIM_CMD_MEMEN | PCIM_CMD_BUSMASTEREN; + pci_write_config(dev, PCIR_COMMAND, cfg, 2); + + /* + * Map memory + */ + cfg = pci_read_config(dev, PCIR_COMMAND, 2); + if (!(cfg & PCIM_CMD_MEMEN)) { + if_printf(ifp, "failed to enable memory mapping\n"); + error = ENXIO; + goto fail; + } + sc->memid = 0x10; + sc->memres = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->memid, + 0, ~0, 1, RF_ACTIVE); + if (sc->memres == NULL) { + if_printf(ifp, "could not map memory\n"); + error = ENXIO; + goto fail; + } + sc->memh = rman_get_bushandle(sc->memres); + sc->memt = rman_get_bustag(sc->memres); + + /* + * Convert endianess of slave access + */ + cfg = pci_read_config(dev, FATM_PCIR_MCTL, 1); + cfg |= FATM_PCIM_SWAB; + pci_write_config(dev, FATM_PCIR_MCTL, cfg, 1); + + /* + * Allocate interrupt (activate at the end) + */ + sc->irqid = 0; + sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irqid, + 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE); + if (sc->irqres == NULL) { + if_printf(ifp, "could not allocate irq\n"); + error = ENXIO; + goto fail; + } + + /* + * Allocate the parent DMA tag. This is used simply to hold overall + * restrictions for the controller (and PCI bus) and is never used + * to do anything. + */ + if (bus_dma_tag_create(NULL, 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, + NULL, NULL, + BUS_SPACE_MAXSIZE_32BIT, MAXDMASEGS, + BUS_SPACE_MAXSIZE_32BIT, 0, &sc->parent_dmat)) { + if_printf(ifp, "could not allocate parent DMA tag\n"); + error = ENOMEM; + goto fail; + } + + /* + * Allocate the receive buffer DMA tag. This tag must map a maximum of + * a mbuf cluster. + */ + if (bus_dma_tag_create(sc->parent_dmat, 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, + NULL, NULL, + MCLBYTES, 1, MCLBYTES, 0, &sc->rbuf_tag)) { + if_printf(ifp, "could not allocate rbuf DMA tag\n"); + error = ENOMEM; + goto fail; + } + + /* + * Allocate the transmission DMA tag. + */ + if (bus_dma_tag_create(sc->parent_dmat, 1, 0, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, + NULL, NULL, + FATM_MAXPDU, TPD_EXTENSIONS + TXD_FIXED, MCLBYTES, 0, + &sc->tx_tag)) { + if_printf(ifp, "could not allocate tx DMA tag\n"); + error = ENOMEM; + goto fail; + } + + /* + * Allocate DMAable memory. + */ + sc->stat_mem.size = sizeof(uint32_t) * (FATM_CMD_QLEN + FATM_TX_QLEN + + FATM_RX_QLEN + SMALL_SUPPLY_QLEN + LARGE_SUPPLY_QLEN); + sc->stat_mem.align = 4; + + sc->txq_mem.size = FATM_TX_QLEN * TPD_SIZE; + sc->txq_mem.align = 32; + + sc->rxq_mem.size = FATM_RX_QLEN * RPD_SIZE; + sc->rxq_mem.align = 32; + + sc->s1q_mem.size = SMALL_SUPPLY_QLEN * + BSUP_BLK2SIZE(SMALL_SUPPLY_BLKSIZE); + sc->s1q_mem.align = 32; + + sc->l1q_mem.size = LARGE_SUPPLY_QLEN * + BSUP_BLK2SIZE(LARGE_SUPPLY_BLKSIZE); + sc->l1q_mem.align = 32; + +#ifdef TEST_DMA_SYNC + if ((error = alloc_dma_memoryX(sc, "STATUS", &sc->stat_mem)) != 0 || + (error = alloc_dma_memoryX(sc, "TXQ", &sc->txq_mem)) != 0 || + (error = alloc_dma_memoryX(sc, "RXQ", &sc->rxq_mem)) != 0 || + (error = alloc_dma_memoryX(sc, "S1Q", &sc->s1q_mem)) != 0 || + (error = alloc_dma_memoryX(sc, "L1Q", &sc->l1q_mem)) != 0) + goto fail; +#else + if ((error = alloc_dma_memory(sc, "STATUS", &sc->stat_mem)) != 0 || + (error = alloc_dma_memory(sc, "TXQ", &sc->txq_mem)) != 0 || + (error = alloc_dma_memory(sc, "RXQ", &sc->rxq_mem)) != 0 || + (error = alloc_dma_memory(sc, "S1Q", &sc->s1q_mem)) != 0 || + (error = alloc_dma_memory(sc, "L1Q", &sc->l1q_mem)) != 0) + goto fail; +#endif + + sc->prom_mem.size = sizeof(struct prom); + sc->prom_mem.align = 32; + if ((error = alloc_dma_memory(sc, "PROM", &sc->prom_mem)) != 0) + goto fail; + + sc->sadi_mem.size = sizeof(struct fatm_stats); + sc->sadi_mem.align = 32; + if ((error = alloc_dma_memory(sc, "STATISTICS", &sc->sadi_mem)) != 0) + goto fail; + + sc->reg_mem.size = sizeof(uint32_t) * FATM_NREGS; + sc->reg_mem.align = 32; + if ((error = alloc_dma_memory(sc, "REGISTERS", &sc->reg_mem)) != 0) + goto fail; + + /* + * Allocate queues + */ + sc->cmdqueue.chunk = malloc(FATM_CMD_QLEN * sizeof(struct cmdqueue), + M_DEVBUF, M_ZERO | M_WAITOK); + sc->txqueue.chunk = malloc(FATM_TX_QLEN * sizeof(struct txqueue), + M_DEVBUF, M_ZERO | M_WAITOK); + sc->rxqueue.chunk = malloc(FATM_RX_QLEN * sizeof(struct rxqueue), + M_DEVBUF, M_ZERO | M_WAITOK); + sc->s1queue.chunk = malloc(SMALL_SUPPLY_QLEN * sizeof(struct supqueue), + M_DEVBUF, M_ZERO | M_WAITOK); + sc->l1queue.chunk = malloc(LARGE_SUPPLY_QLEN * sizeof(struct supqueue), + M_DEVBUF, M_ZERO | M_WAITOK); + + sc->vccs = malloc((FORE_MAX_VCC + 1) * sizeof(struct card_vcc), + M_DEVBUF, M_ZERO | M_WAITOK); + + /* + * Allocate memory for the receive buffer headers. The total number + * of headers should probably also include the maximum number of + * buffers on the receive queue. + */ + sc->rbuf_total = SMALL_POOL_SIZE + LARGE_POOL_SIZE; + sc->rbufs = malloc(sc->rbuf_total * sizeof(struct rbuf), + M_DEVBUF, M_ZERO | M_WAITOK); + + /* + * Put all rbuf headers on the free list and create DMA maps. + */ + for (rb = sc->rbufs, i = 0; i < sc->rbuf_total; i++, rb++) { + if ((error = bus_dmamap_create(sc->rbuf_tag, 0, &rb->map))) { + if_printf(&sc->ifatm.ifnet, "creating rx map: %d\n", + error); + goto fail; + } + LIST_INSERT_HEAD(&sc->rbuf_free, rb, link); + } + + /* + * Create dma maps for transmission. In case of an error, free the + * allocated DMA maps, because on some architectures maps are NULL + * and we cannot distinguish between a failure and a NULL map in + * the detach routine. + */ + for (i = 0; i < FATM_TX_QLEN; i++) { + tx = GET_QUEUE(sc->txqueue, struct txqueue, i); + if ((error = bus_dmamap_create(sc->tx_tag, 0, &tx->map))) { + if_printf(&sc->ifatm.ifnet, "creating tx map: %d\n", + error); + while (i > 0) { + tx = GET_QUEUE(sc->txqueue, struct txqueue, + i - 1); + bus_dmamap_destroy(sc->tx_tag, tx->map); + i--; + } + goto fail; + } + } + + utopia_attach(&sc->utopia, &sc->ifatm, &sc->media, &sc->mtx, + &sc->sysctl_ctx, SYSCTL_CHILDREN(sc->sysctl_tree), + &fatm_utopia_methods); + sc->utopia.flags |= UTP_FL_NORESET | UTP_FL_POLL_CARRIER; + + /* + * Attach the interface + */ + atm_ifattach(ifp); + ifp->if_snd.ifq_maxlen = 512; + + error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_NET, + fatm_intr, sc, &sc->ih); + if (error) { + if_printf(ifp, "couldn't setup irq\n"); + goto fail; + } + + fail: + if (error) + fatm_detach(dev); + + return (error); +} + +#if defined(FATM_DEBUG) && 0 +static void +dump_s1_queue(struct fatm_softc *sc) +{ + int i; + struct supqueue *q; + + for(i = 0; i < SMALL_SUPPLY_QLEN; i++) { + q = GET_QUEUE(sc->s1queue, struct supqueue, i); + printf("%2d: card=%x(%x,%x) stat=%x\n", i, + q->q.card, + READ4(sc, q->q.card), + READ4(sc, q->q.card + 4), + *q->q.statp); + } +} +#endif + +/* + * Driver infrastructure. + */ +static device_method_t fatm_methods[] = { + DEVMETHOD(device_probe, fatm_probe), + DEVMETHOD(device_attach, fatm_attach), + DEVMETHOD(device_detach, fatm_detach), + { 0, 0 } +}; +static driver_t fatm_driver = { + "fatm", + fatm_methods, + sizeof(struct fatm_softc), +}; + +DRIVER_MODULE(fatm, pci, fatm_driver, fatm_devclass, 0, 0); diff --git a/sys/dev/fatm/if_fatm_rate.h b/sys/dev/fatm/if_fatm_rate.h new file mode 100644 index 0000000..45b885a --- /dev/null +++ b/sys/dev/fatm/if_fatm_rate.h @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2001-2003 + * Fraunhofer Institute for Open Communication Systems (FhG Fokus). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Hartmut Brandt <harti@freebsd.org> + * + * Fore PCA200E driver for NATM + * + * This has been generated with: + * + * awk </dev/null 'BEGIN { period=255; linerate=353053; \ + * printf "{ 0x00000000, %u },\n", linerate; \ + * for(i=period-1; i>0; i--) printf "{ 0x%08x, %u },\n", \ + * (i * 65536) + (period - i), i * linerate/period; }' + * + * $FreeBSD$ + */ +{ 0x00000000, 353053 }, +{ 0x00fe0001, 351668 }, +{ 0x00fd0002, 350283 }, +{ 0x00fc0003, 348899 }, +{ 0x00fb0004, 347514 }, +{ 0x00fa0005, 346130 }, +{ 0x00f90006, 344745 }, +{ 0x00f80007, 343361 }, +{ 0x00f70008, 341976 }, +{ 0x00f60009, 340592 }, +{ 0x00f5000a, 339207 }, +{ 0x00f4000b, 337823 }, +{ 0x00f3000c, 336438 }, +{ 0x00f2000d, 335054 }, +{ 0x00f1000e, 333669 }, +{ 0x00f0000f, 332285 }, +{ 0x00ef0010, 330900 }, +{ 0x00ee0011, 329516 }, +{ 0x00ed0012, 328131 }, +{ 0x00ec0013, 326747 }, +{ 0x00eb0014, 325362 }, +{ 0x00ea0015, 323978 }, +{ 0x00e90016, 322593 }, +{ 0x00e80017, 321209 }, +{ 0x00e70018, 319824 }, +{ 0x00e60019, 318439 }, +{ 0x00e5001a, 317055 }, +{ 0x00e4001b, 315670 }, +{ 0x00e3001c, 314286 }, +{ 0x00e2001d, 312901 }, +{ 0x00e1001e, 311517 }, +{ 0x00e0001f, 310132 }, +{ 0x00df0020, 308748 }, +{ 0x00de0021, 307363 }, +{ 0x00dd0022, 305979 }, +{ 0x00dc0023, 304594 }, +{ 0x00db0024, 303210 }, +{ 0x00da0025, 301825 }, +{ 0x00d90026, 300441 }, +{ 0x00d80027, 299056 }, +{ 0x00d70028, 297672 }, +{ 0x00d60029, 296287 }, +{ 0x00d5002a, 294903 }, +{ 0x00d4002b, 293518 }, +{ 0x00d3002c, 292134 }, +{ 0x00d2002d, 290749 }, +{ 0x00d1002e, 289365 }, +{ 0x00d0002f, 287980 }, +{ 0x00cf0030, 286595 }, +{ 0x00ce0031, 285211 }, +{ 0x00cd0032, 283826 }, +{ 0x00cc0033, 282442 }, +{ 0x00cb0034, 281057 }, +{ 0x00ca0035, 279673 }, +{ 0x00c90036, 278288 }, +{ 0x00c80037, 276904 }, +{ 0x00c70038, 275519 }, +{ 0x00c60039, 274135 }, +{ 0x00c5003a, 272750 }, +{ 0x00c4003b, 271366 }, +{ 0x00c3003c, 269981 }, +{ 0x00c2003d, 268597 }, +{ 0x00c1003e, 267212 }, +{ 0x00c0003f, 265828 }, +{ 0x00bf0040, 264443 }, +{ 0x00be0041, 263059 }, +{ 0x00bd0042, 261674 }, +{ 0x00bc0043, 260290 }, +{ 0x00bb0044, 258905 }, +{ 0x00ba0045, 257521 }, +{ 0x00b90046, 256136 }, +{ 0x00b80047, 254751 }, +{ 0x00b70048, 253367 }, +{ 0x00b60049, 251982 }, +{ 0x00b5004a, 250598 }, +{ 0x00b4004b, 249213 }, +{ 0x00b3004c, 247829 }, +{ 0x00b2004d, 246444 }, +{ 0x00b1004e, 245060 }, +{ 0x00b0004f, 243675 }, +{ 0x00af0050, 242291 }, +{ 0x00ae0051, 240906 }, +{ 0x00ad0052, 239522 }, +{ 0x00ac0053, 238137 }, +{ 0x00ab0054, 236753 }, +{ 0x00aa0055, 235368 }, +{ 0x00a90056, 233984 }, +{ 0x00a80057, 232599 }, +{ 0x00a70058, 231215 }, +{ 0x00a60059, 229830 }, +{ 0x00a5005a, 228446 }, +{ 0x00a4005b, 227061 }, +{ 0x00a3005c, 225677 }, +{ 0x00a2005d, 224292 }, +{ 0x00a1005e, 222907 }, +{ 0x00a0005f, 221523 }, +{ 0x009f0060, 220138 }, +{ 0x009e0061, 218754 }, +{ 0x009d0062, 217369 }, +{ 0x009c0063, 215985 }, +{ 0x009b0064, 214600 }, +{ 0x009a0065, 213216 }, +{ 0x00990066, 211831 }, +{ 0x00980067, 210447 }, +{ 0x00970068, 209062 }, +{ 0x00960069, 207678 }, +{ 0x0095006a, 206293 }, +{ 0x0094006b, 204909 }, +{ 0x0093006c, 203524 }, +{ 0x0092006d, 202140 }, +{ 0x0091006e, 200755 }, +{ 0x0090006f, 199371 }, +{ 0x008f0070, 197986 }, +{ 0x008e0071, 196602 }, +{ 0x008d0072, 195217 }, +{ 0x008c0073, 193833 }, +{ 0x008b0074, 192448 }, +{ 0x008a0075, 191063 }, +{ 0x00890076, 189679 }, +{ 0x00880077, 188294 }, +{ 0x00870078, 186910 }, +{ 0x00860079, 185525 }, +{ 0x0085007a, 184141 }, +{ 0x0084007b, 182756 }, +{ 0x0083007c, 181372 }, +{ 0x0082007d, 179987 }, +{ 0x0081007e, 178603 }, +{ 0x0080007f, 177218 }, +{ 0x007f0080, 175834 }, +{ 0x007e0081, 174449 }, +{ 0x007d0082, 173065 }, +{ 0x007c0083, 171680 }, +{ 0x007b0084, 170296 }, +{ 0x007a0085, 168911 }, +{ 0x00790086, 167527 }, +{ 0x00780087, 166142 }, +{ 0x00770088, 164758 }, +{ 0x00760089, 163373 }, +{ 0x0075008a, 161989 }, +{ 0x0074008b, 160604 }, +{ 0x0073008c, 159219 }, +{ 0x0072008d, 157835 }, +{ 0x0071008e, 156450 }, +{ 0x0070008f, 155066 }, +{ 0x006f0090, 153681 }, +{ 0x006e0091, 152297 }, +{ 0x006d0092, 150912 }, +{ 0x006c0093, 149528 }, +{ 0x006b0094, 148143 }, +{ 0x006a0095, 146759 }, +{ 0x00690096, 145374 }, +{ 0x00680097, 143990 }, +{ 0x00670098, 142605 }, +{ 0x00660099, 141221 }, +{ 0x0065009a, 139836 }, +{ 0x0064009b, 138452 }, +{ 0x0063009c, 137067 }, +{ 0x0062009d, 135683 }, +{ 0x0061009e, 134298 }, +{ 0x0060009f, 132914 }, +{ 0x005f00a0, 131529 }, +{ 0x005e00a1, 130145 }, +{ 0x005d00a2, 128760 }, +{ 0x005c00a3, 127375 }, +{ 0x005b00a4, 125991 }, +{ 0x005a00a5, 124606 }, +{ 0x005900a6, 123222 }, +{ 0x005800a7, 121837 }, +{ 0x005700a8, 120453 }, +{ 0x005600a9, 119068 }, +{ 0x005500aa, 117684 }, +{ 0x005400ab, 116299 }, +{ 0x005300ac, 114915 }, +{ 0x005200ad, 113530 }, +{ 0x005100ae, 112146 }, +{ 0x005000af, 110761 }, +{ 0x004f00b0, 109377 }, +{ 0x004e00b1, 107992 }, +{ 0x004d00b2, 106608 }, +{ 0x004c00b3, 105223 }, +{ 0x004b00b4, 103839 }, +{ 0x004a00b5, 102454 }, +{ 0x004900b6, 101070 }, +{ 0x004800b7, 99685 }, +{ 0x004700b8, 98301 }, +{ 0x004600b9, 96916 }, +{ 0x004500ba, 95531 }, +{ 0x004400bb, 94147 }, +{ 0x004300bc, 92762 }, +{ 0x004200bd, 91378 }, +{ 0x004100be, 89993 }, +{ 0x004000bf, 88609 }, +{ 0x003f00c0, 87224 }, +{ 0x003e00c1, 85840 }, +{ 0x003d00c2, 84455 }, +{ 0x003c00c3, 83071 }, +{ 0x003b00c4, 81686 }, +{ 0x003a00c5, 80302 }, +{ 0x003900c6, 78917 }, +{ 0x003800c7, 77533 }, +{ 0x003700c8, 76148 }, +{ 0x003600c9, 74764 }, +{ 0x003500ca, 73379 }, +{ 0x003400cb, 71995 }, +{ 0x003300cc, 70610 }, +{ 0x003200cd, 69226 }, +{ 0x003100ce, 67841 }, +{ 0x003000cf, 66457 }, +{ 0x002f00d0, 65072 }, +{ 0x002e00d1, 63687 }, +{ 0x002d00d2, 62303 }, +{ 0x002c00d3, 60918 }, +{ 0x002b00d4, 59534 }, +{ 0x002a00d5, 58149 }, +{ 0x002900d6, 56765 }, +{ 0x002800d7, 55380 }, +{ 0x002700d8, 53996 }, +{ 0x002600d9, 52611 }, +{ 0x002500da, 51227 }, +{ 0x002400db, 49842 }, +{ 0x002300dc, 48458 }, +{ 0x002200dd, 47073 }, +{ 0x002100de, 45689 }, +{ 0x002000df, 44304 }, +{ 0x001f00e0, 42920 }, +{ 0x001e00e1, 41535 }, +{ 0x001d00e2, 40151 }, +{ 0x001c00e3, 38766 }, +{ 0x001b00e4, 37382 }, +{ 0x001a00e5, 35997 }, +{ 0x001900e6, 34613 }, +{ 0x001800e7, 33228 }, +{ 0x001700e8, 31843 }, +{ 0x001600e9, 30459 }, +{ 0x001500ea, 29074 }, +{ 0x001400eb, 27690 }, +{ 0x001300ec, 26305 }, +{ 0x001200ed, 24921 }, +{ 0x001100ee, 23536 }, +{ 0x001000ef, 22152 }, +{ 0x000f00f0, 20767 }, +{ 0x000e00f1, 19383 }, +{ 0x000d00f2, 17998 }, +{ 0x000c00f3, 16614 }, +{ 0x000b00f4, 15229 }, +{ 0x000a00f5, 13845 }, +{ 0x000900f6, 12460 }, +{ 0x000800f7, 11076 }, +{ 0x000700f8, 9691 }, +{ 0x000600f9, 8307 }, +{ 0x000500fa, 6922 }, +{ 0x000400fb, 5538 }, +{ 0x000300fc, 4153 }, +{ 0x000200fd, 2769 }, +{ 0x000100fe, 1384 }, diff --git a/sys/dev/fatm/if_fatmreg.h b/sys/dev/fatm/if_fatmreg.h new file mode 100644 index 0000000..0b4a403 --- /dev/null +++ b/sys/dev/fatm/if_fatmreg.h @@ -0,0 +1,499 @@ +/* + * Copyright (c) 2001-2003 + * Fraunhofer Institute for Open Communication Systems (FhG Fokus). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Hartmut Brandt <harti@freebsd.org> + * + * $FreeBSD$ + * + * Fore PCA200E hardware definitions. + */ + +/* + * Fore implements some additional PCI registers. One of them is the + * master control register. One of the bits allow to automatically byte + * swap accesses to the on-board RAM. + */ +#define FATM_PCIR_MCTL 0x41 +#define FATM_PCIM_SWAB 0x100 + +/* + * Operations codes for commands. + */ +enum { + FATM_OP_INITIALIZE = 0x01, /* Initialize the card */ + FATM_OP_ACTIVATE_VCIN = 0x02, /* Start reassembly on a channel */ + FATM_OP_ACTIVATE_VCOUT = 0x03, /* (not used) */ + FATM_OP_DEACTIVATE_VCIN = 0x04, /* Stop reassembly on a channel */ + FATM_OP_DEACTIVATE_VCOUT= 0x05, /* (not used) */ + FATM_OP_REQUEST_STATS = 0x06, /* Get statistics */ + FATM_OP_OC3_SET_REG = 0x07, /* Set OC3 chip register */ + FATM_OP_OC3_GET_REG = 0x08, /* Get OC3 chip registers */ + FATM_OP_ZERO_STATS = 0x09, /* Zero out statistics */ + FATM_OP_GET_PROM_DATA = 0x0a, /* Return expansion ROM data */ + FATM_OP_SETVPI_BITS = 0x0b, /* (not used, not implemented) */ + + FATM_OP_INTERRUPT_SEL = 0x80, /* Request interrupt on completion */ +}; + +/* + * Status word definitions. Before initiating an operation the host sets the + * status word to PENDING. The card sets it to COMPLETE upon completion of + * the transmit/receive or command. An unused queue entry contains FREE. + * The ERROR can be ored into the COMPLETE. Note, that there are circumstances + * when ERROR is set without COMPLETE beeing set (when you try to activate + * a bad VCI like, for example, VCI 0). + */ +enum { + FATM_STAT_PENDING = 0x01, + FATM_STAT_COMPLETE = 0x02, + FATM_STAT_FREE = 0x04, + FATM_STAT_ERROR = 0x08, +}; + +/* + * On board queue offsets. There are two fundamentally different queue types: + * the command queue and all other queues. The command queue has 32 byte + * entries on the card which contain the operation code, parameters and the + * DMA pointer to the status word. All other queues have 8 byte entries, which + * contain a DMA pointer to the i/o block, that contains the parameters, and + * a DMA pointer to the status word. + */ +#define FATMOC_OP 0 /* cmd queue: offset to op code */ +#define FATMOC_PARAM 4 /* cmd queue: offset to parameters */ +#define FATMOC_STATP 16 /* cmd queue: offset to status ptr */ +#define FATMOC_END 32 /* cmd queue: element size */ + +#define FATMOC_ACTIN_VPVC (FATMOC_PARAM + 0) +#define FATMOC_ACTIN_MTU (FATMOC_PARAM + 4) +#define FATMOC_DEACTIN_VPVC (FATMOC_PARAM + 0) +#define FATMOC_GETOC3_BUF (FATMOC_PARAM + 0) +#define FATMOC_GSTAT_BUF (FATMOC_PARAM + 0) +#define FATMOC_GPROM_BUF (FATMOC_PARAM + 0) + +#define FATMOS_IOBLK 0 /* other queues: offset to ioblk ptr */ +#define FATMOS_STATP 4 /* other queues: offset to status ptr */ + +#define FATM_MAKE_SETOC3(REG,VAL,MASK) \ + (FATM_OP_OC3_SET_REG | (((REG) & 0xff) << 8) | \ + (((VAL) & 0xff) << 16) | (((MASK) & 0xff) << 24)) +#define FATM_NREGS 128 + + +/* + * On board memory layout. + * + * The card contains up to 2MByte memory that is mapped at virtual offset 0. + * It is followed by three registers. The memory contains two areas at + * fixed addresses: the mon960 area that is used for communication with + * the card's operating system and the common block that is used by the + * firmware to communicate with the driver. + */ +#define FATM_RAM_SIZE (256 * 1024) /* normal RAM size */ + +#define FATMO_RAM (0x0) /* virtual RAM start */ +#define FATMO_MON960 (0x400) /* mon960 communication area */ +#define FATMO_COMMON_ORIGIN (0x4d40) /* firmware comm. area */ + +#define FATMO_HCR (0x100000) /* host control registers */ +#define FATMO_HIMR (0x100004) /* host interrupt mask */ +#define FATMO_PSR (0x100008) /* PCI control register */ + +#define FATMO_END (0x200000) /* end of mapped area */ + +/* + * The mon960 area contains two cells that are used as a virtual serial + * interface, a status word, the base for loading the application (i.e. + * firmware) and a version number. + */ +#define FATMO_UART_TO_960 (FATMO_MON960 + 0) +#define FATMO_UART_TO_HOST (FATMO_MON960 + 4) +#define FATMO_BOOT_STATUS (FATMO_MON960 + 8) +#define FATMO_APP_BASE (FATMO_MON960 + 12) +#define FATMO_VERSION (FATMO_MON960 + 16) + + +/* + * The host control register allows to hold the i960 or send it interrupts. + * The bits have different meaning on read and write. + */ +#define FATM_HCR_RESET 0x01 /* (W) reset the card */ +#define FATM_HCR_LOCK_HOLD 0x02 /* (W) hold the i960 */ +#define FATM_HCR_I960FAIL 0x04 /* (R) internal self-test failed */ +#define FATM_HCR_INTR2 0x04 /* (W) assert i960 interrupt 2 */ +#define FATM_HCR_HOLDA 0x08 /* (R) hold ack from i960 */ +#define FATM_HCR_INTR1 0x08 /* (W) assert i960 interrupt 1 */ +#define FATM_HCR_OFIFO 0x10 /* (R) DMA request FIFO full */ +#define FATM_HCR_CLRIRQ 0x10 /* (W) clear interrupt request */ +#define FATM_HCR_ESP_HOLD 0x20 /* (R) SAR chip holds i960 */ +#define FATM_HCR_IFIFO 0x40 /* (R) input FIFO full */ +#define FATM_HCR_TESTMODE 0x80 /* (R) board is in test mode */ + +/* + * The mon960 area contains a virtual UART and a status word. + * The UART uses a simple protocol: a zero means, that there is no + * character available from the i960 or that one can write the next + * character to the i960. This character has to be ored with 0x1000000 + * to signal to the i960 that there is a new character. + * The cold_start values must be written to the status word, the others + * denote certain stages of initializing. + */ +#define XMIT_READY 0 +#define CHAR_AVAIL 0x1000000 + +#define COLD_START 0xc01dc01d +#define SELF_TEST_OK 0x02201958 +#define SELF_TEST_FAIL 0xadbadbad +#define CP_RUNNING 0xce11feed +#define MON906_TOO_BIG 0x10aded00 + +/* + * The firmware communication area contains a big structure most of which + * is used only during initialisation. + */ +/* + * These are the offsets to the onboard queues that are valid after the + * initialisation command has completed. + */ +#define FATMO_COMMAND_QUEUE (FATMO_COMMON_ORIGIN + 0) +#define FATMO_TRANSMIT_QUEUE (FATMO_COMMON_ORIGIN + 4) +#define FATMO_RECEIVE_QUEUE (FATMO_COMMON_ORIGIN + 8) +#define FATMO_SMALL_B1_QUEUE (FATMO_COMMON_ORIGIN + 12) +#define FATMO_LARGE_B1_QUEUE (FATMO_COMMON_ORIGIN + 16) +#define FATMO_SMALL_B2_QUEUE (FATMO_COMMON_ORIGIN + 20) +#define FATMO_LARGE_B2_QUEUE (FATMO_COMMON_ORIGIN + 24) + +/* + * If the interrupt mask is set to 1, interrupts to the host are queued, but + * inhbited. The istat variable is set, when this card has posted an interrupt. + */ +#define FATMO_IMASK (FATMO_COMMON_ORIGIN + 28) +#define FATMO_ISTAT (FATMO_COMMON_ORIGIN + 32) + +/* + * This is the offset and the size of the queue area. Could be used to + * dynamically compute queue sizes. + */ +#define FATMO_HEAP_BASE (FATMO_COMMON_ORIGIN + 36) +#define FATMO_HEAP_SIZE (FATMO_COMMON_ORIGIN + 40) + +#define FATMO_HLOGGER (FATMO_COMMON_ORIGIN + 44) + +/* + * The heartbeat variable is incremented in each loop of the normal processing. + * If it is stuck this means, that the card had a fatal error. In this case + * it may set the word to a number of values of the form 0xdeadXXXX where + * XXXX is an error code. + */ +#define FATMO_HEARTBEAT (FATMO_COMMON_ORIGIN + 48) + +#define FATMO_FIRMWARE_RELEASE (FATMO_COMMON_ORIGIN + 52) +#define FATMO_MON960_RELEASE (FATMO_COMMON_ORIGIN + 56) +#define FATMO_TQ_PLEN (FATMO_COMMON_ORIGIN + 60) + +/* + * At this offset the init command block is located. The init command cannot + * use the normal queue mechanism because it is used to initialize the + * queues. For this reason it is located at this fixed offset. + */ +#define FATMO_INIT (FATMO_COMMON_ORIGIN + 64) + +/* + * physical media type + */ +#define FATMO_MEDIA_TYPE (FATMO_COMMON_ORIGIN + 176) +#define FATMO_OC3_REVISION (FATMO_COMMON_ORIGIN + 180) + +/* + * End of the common block + */ +#define FATMO_COMMON_END (FATMO_COMMON_ORIGIN + 184) + +/* + * The INITIALIZE command block. This is embedded into the above common + * block. The offsets are from the beginning of the command block. + */ +#define FATMOI_OP 0 /* operation code */ +#define FATMOI_STATUS 4 /* status word */ +#define FATMOI_RECEIVE_TRESHOLD 8 /* when to start interrupting */ +#define FATMOI_NUM_CONNECT 12 /* max number of VCIs */ +#define FATMOI_CQUEUE_LEN 16 /* length of command queue */ +#define FATMOI_TQUEUE_LEN 20 /* length of transmit queue */ +#define FATMOI_RQUEUE_LEN 24 /* length of receive queue */ +#define FATMOI_RPD_EXTENSION 28 /* additional 32 byte blocks */ +#define FATMOI_TPD_EXTENSION 32 /* additional 32 byte blocks */ +#define FATMOI_CONLESS_VPVC 36 /* (not used) */ +#define FATMOI_SMALL_B1 48 /* small buffer 1 pool */ +#define FATMOI_LARGE_B1 64 /* small buffer 2 pool */ +#define FATMOI_SMALL_B2 80 /* large buffer 1 pool */ +#define FATMOI_LARGE_B2 96 /* large buffer 2 pool */ +#define FATMOI_END 112 /* size of init block */ + +/* + * Each of the four buffer schemes is initialized with a block that + * contains four words: + */ +#define FATMOB_QUEUE_LENGTH 0 /* supply queue length */ +#define FATMOB_BUFFER_SIZE 4 /* size of each buffer */ +#define FATMOB_POOL_SIZE 8 /* size of on-board pool */ +#define FATMOB_SUPPLY_BLKSIZE 12 /* number of buffers/supply */ + +/* + * The fore firmware is a binary file, that starts with a header. The + * header contains the offset to where the file must be loaded and the + * entry for execution. The header must also be loaded onto the card! + */ +struct firmware { + uint32_t id; /* "FORE" */ + uint32_t version; /* firmware version */ + uint32_t offset; /* load offset */ + uint32_t entry; /* entry point */ +}; +#define FATM_FWID 0x65726f66 /* "FORE" */ +#define FATM_FWVERSION 0x100 /* supported version */ + +/* + * PDUs to be transmitted are described by Transmit PDU Descriptors. + * These descriptors are held in host memory, but referenced from the ioblk + * member of the queue structure on the card. The card DMAs the descriptor + * and than gather-DMAs the PDU transmitting it on-the-fly. Tpds are variable + * length in blocks of 32 byte (8 words). The minimum length is one block, + * maximum 15. The number of blocks beyond 1 is configured during the + * initialisation command (tpd_extension). + * Each gather-DMA segment is described by a segment descriptor. The buffer + * address and the length must be a multiple of four. + * Tpd must also be 4 byte aligned. + * Because of the minimum length of 32 byte, the first blocks contains already + * 2 segement descriptors. Each extension block holds four descriptors. + */ +#define TXD_FIXED 2 +#define SEGS_PER_BLOCK 4 /* segment descriptors per extension block */ +struct txseg { + uint32_t buffer; /* DMA buffer address */ + uint32_t length; /* and length */ +}; +struct tpd { + uint32_t atm_header; /* header for the transmitted cells */ + uint32_t spec; /* PDU description */ + uint32_t stream; /* traffic shaping word */ + uint32_t pad[1]; + struct txseg segment[TXD_FIXED]; +}; + +#define TDX_MKSPEC(INTR,AAL,NSEG,LEN) \ + (((INTR) << 28) | ((AAL) << 24) | ((NSEG) << 16) | (LEN)) +#define TDX_MKSTR(DATA,IDLE) \ + (((DATA) << 16) | (IDLE)) +#define TDX_MKHDR(VPI,VCI,PT,CLP) \ + (((VPI) << 20) | ((VCI) << 4) | ((PT) << 1) | (CLP)) +#define TDX_SEGS2BLKS(SEGS) \ + (1 + ((SEGS)-TXD_FIXED+SEGS_PER_BLOCK-1)/SEGS_PER_BLOCK) + +/* + * We want probably support scatter transmission, so we use the maximum + * transmit descriptor extension that is possible. Because the size of the + * Tpd is encoded in 32-byte blocks in a 4-bit field, the maximum extension + * is 14 such blocks. The value for the init command is the number of + * additional descriptor entries NOT the number of 32 byte blocks. + */ +#define TPD_EXTENSION_BLOCKS 14 +#define TPD_EXTENSIONS (TPD_EXTENSION_BLOCKS * 4) +#define TPD_SIZE ((size_t)((TPD_EXTENSION_BLOCKS+1) * 32)) + +/* + * Received PDUs are handed from the card to the host by means of Receive + * PDU descriptors. Each segment describes on part of the PDU. The buffer + * handle is a 32 bit value that is supplied by the host and passed + * transparently back to the host by the card. It is used to locate the buffer. + * The length field is the number of actual bytes in that buffer. + */ +#define RXD_FIXED 3 +struct rxseg { + uint32_t handle; /* buffer handle */ + uint32_t length; /* number of bytes */ +}; +struct rpd { + uint32_t atm_header; + uint32_t nseg; + struct rxseg segment[RXD_FIXED]; +}; + +/* + * PDUs received are stored in buffers supplied to the card. We use only + * buffer scheme 1: small buffers are normal mbuf's which can hold three + * cells in their default size (256 byte) and mbuf clusters which can + * hold 42 cells (2 kbyte). + * The number of receive segments can be computed from these sizes: + */ +#define FATM_MAXPDU 65535 +#define MAXPDU_CELLS ((FATM_MAXPDU+47)/48) + +#define SMALL_BUFFER_CELLS (MHLEN/48) +#define LARGE_BUFFER_CELLS (MCLBYTES/48) + +#define SMALL_BUFFER_LEN (SMALL_BUFFER_CELLS * 48) +#define LARGE_BUFFER_LEN (LARGE_BUFFER_CELLS * 48) + +/* + * The card first alloctes a small buffer and the switches to large + * buffers. So the number of large buffers needed to store the maximum + * PDU is: + */ +#define MAX_LARGE_BUFFERS ((MAXPDU_CELLS - SMALL_BUFFER_CELLS \ + + LARGE_BUFFER_CELLS - 1) \ + / LARGE_BUFFER_CELLS) \ + +/* + * From this we get the number of extension blocks for the Rpds as: + */ +#define RPD_EXTENSION_BLOCKS ((MAX_LARGE_BUFFERS + 1 - RXD_FIXED \ + + SEGS_PER_BLOCK - 1) \ + / SEGS_PER_BLOCK) +#define RPD_EXTENSIONS (RPD_EXTENSION_BLOCKS * 4) +#define RPD_SIZE ((size_t)((RPD_EXTENSION_BLOCKS+1) * 32)) + +/* + * Buffers are supplied to the card prior receiving by the supply queues. + * We use two queues: scheme 1 small buffers and scheme 1 large buffers. + * The queues and on-card pools are initialized by the initialize command. + * Buffers are supplied in chunks. Each chunk can contain from 4 to 124 + * buffers in multiples of four. The chunk sizes are configured by the + * initialize command. Each buffer in a chunk is described by a Receive + * Buffer Descriptor that is held in host memory and given as the ioblk + * to the card. + */ +#define BSUP_BLK2SIZE(CHUNK) (8 * (CHUNK)) + +struct rbd { + uint32_t handle; + uint32_t buffer; /* DMA address for card */ +}; + +/* + * The PCA200E has an expansion ROM that contains version information and + * the FORE-assigned MAC address. It can be read via the get_prom_data + * operation. + */ +struct prom { + uint32_t version; + uint32_t serial; + uint8_t mac[8]; +}; + +/* + * The media type member of the firmware communication block contains a + * code that describes the physical medium and physical protocol. + */ +#define FORE_MT_TAXI_100 0x04 +#define FORE_MT_TAXI_140 0x05 +#define FORE_MT_UTP_SONET 0x06 +#define FORE_MT_MM_OC3_ST 0x16 +#define FORE_MT_MM_OC3_SC 0x26 +#define FORE_MT_SM_OC3_ST 0x36 +#define FORE_MT_SM_OC3_SC 0x46 + +/* + * Assorted constants + */ +#define FORE_MAX_VCC 1024 /* max. number of VCIs supported */ +#define FORE_VCIBITS 10 + +#define FATM_STATE_TIMEOUT 500 /* msec */ + +/* + * Statistics as delivered by the FORE cards + */ +struct fatm_stats { + struct { + uint32_t crc_header_errors; + uint32_t framing_errors; + uint32_t pad[2]; + } phy_4b5b; + + struct { + uint32_t section_bip8_errors; + uint32_t path_bip8_errors; + uint32_t line_bip24_errors; + uint32_t line_febe_errors; + uint32_t path_febe_errors; + uint32_t corr_hcs_errors; + uint32_t ucorr_hcs_errors; + uint32_t pad[1]; + } phy_oc3; + + struct { + uint32_t cells_transmitted; + uint32_t cells_received; + uint32_t vpi_bad_range; + uint32_t vpi_no_conn; + uint32_t vci_bad_range; + uint32_t vci_no_conn; + uint32_t pad[2]; + } atm; + + struct { + uint32_t cells_transmitted; + uint32_t cells_received; + uint32_t cells_dropped; + uint32_t pad[1]; + } aal0; + + struct { + uint32_t cells_transmitted; + uint32_t cells_received; + uint32_t cells_crc_errors; + uint32_t cels_protocol_errors; + uint32_t cells_dropped; + uint32_t cspdus_transmitted; + uint32_t cspdus_received; + uint32_t cspdus_protocol_errors; + uint32_t cspdus_dropped; + uint32_t pad[3]; + } aal4; + + struct { + uint32_t cells_transmitted; + uint32_t cells_received; + uint32_t congestion_experienced; + uint32_t cells_dropped; + uint32_t cspdus_transmitted; + uint32_t cspdus_received; + uint32_t cspdus_crc_errors; + uint32_t cspdus_protocol_errors; + uint32_t cspdus_dropped; + uint32_t pad[3]; + } aal5; + + struct { + uint32_t small_b1_failed; + uint32_t large_b1_failed; + uint32_t small_b2_failed; + uint32_t large_b2_failed; + uint32_t rpd_alloc_failed; + uint32_t receive_carrier; + uint32_t pad[2]; + } aux; +}; +#define FATM_NSTATS 42 diff --git a/sys/dev/fatm/if_fatmvar.h b/sys/dev/fatm/if_fatmvar.h new file mode 100644 index 0000000..002eeb2 --- /dev/null +++ b/sys/dev/fatm/if_fatmvar.h @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2001-2003 + * Fraunhofer Institute for Open Communication Systems (FhG Fokus). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Hartmut Brandt <harti@freebsd.org> + * + * $FreeBSD$ + * + * Fore PCA200E driver definitions. + */ +/* + * Debug statistics of the PCA200 driver + */ +struct istats { + uint32_t cmd_queue_full; + uint32_t get_stat_errors; + uint32_t clr_stat_errors; + uint32_t get_prom_errors; + uint32_t suni_reg_errors; + uint32_t tx_queue_full; + uint32_t tx_queue_almost_full; + uint32_t tx_pdu2big; + uint32_t tx_too_many_segs; + uint32_t tx_retry; + uint32_t fix_empty; + uint32_t fix_addr_copy; + uint32_t fix_addr_noext; + uint32_t fix_addr_ext; + uint32_t fix_len_noext; + uint32_t fix_len_copy; + uint32_t fix_len; + uint32_t rx_badvc; + uint32_t rx_closed; +}; + +/* + * Addresses on the on-board RAM are expressed as offsets to the + * start of that RAM. + */ +typedef uint32_t cardoff_t; + +/* + * The card uses a number of queues for communication with the host. + * Parts of the queue are located on the card (pointers to the status + * word and the ioblk and the command blocks), the rest in host memory. + * Each of these queues forms a ring, where the head and tail pointers are + * managed * either by the card or the host. For the receive queue the + * head is managed by the card (and not used altogether by the host) and the + * tail by the host - for all other queues its the other way around. + * The host resident parts of the queue entries contain pointers to + * the host resident status and the host resident ioblk (the latter not for + * the command queue) as well as DMA addresses for supply to the card. + */ +struct fqelem { + cardoff_t card; /* corresponding element on card */ + bus_addr_t card_ioblk; /* ioblk address to supply to card */ + volatile uint32_t *statp; /* host status pointer */ + void *ioblk; /* host ioblk (not for commands) */ +}; + +struct fqueue { + struct fqelem *chunk; /* pointer to the element array */ + int head; /* queue head */ + int tail; /* queue tail */ +}; + +/* + * Queue manipulation macros + */ +#define NEXT_QUEUE_ENTRY(HEAD,LEN) ((HEAD) = ((HEAD) + 1) % LEN) +#define GET_QUEUE(Q,TYPE,IDX) (&((TYPE *)(Q).chunk)[(IDX)]) + +/* + * Now define structures for the different queues. Each of these structures + * must start with a struct fqelem. + */ +struct txqueue { /* transmit queue element */ + struct fqelem q; + struct mbuf *m; /* the chain we are transmitting */ + bus_dmamap_t map; /* map for the packet */ +}; + +struct rxqueue { /* receive queue element */ + struct fqelem q; +}; + +struct supqueue { /* supply queue element */ + struct fqelem q; +}; + +struct cmdqueue; +struct fatm_softc; + +typedef void (*completion_cb)(struct fatm_softc *, struct cmdqueue *); + +struct cmdqueue { /* command queue element */ + struct fqelem q; + completion_cb cb; /* call on command completion */ + int error; /* set if error occured */ +}; + +/* + * Card-DMA-able memory is managed by means of the bus_dma* functions. + * To allocate a chunk of memory with a specific size and alignment one + * has to: + * 1. create a DMA tag + * 2. allocate the memory + * 3. load the memory into a map. + * This finally gives the physical address that can be given to the card. + * The card can DMA the entire 32-bit space without boundaries. We assume, + * that all the allocations can be mapped in one contiguous segment. This + * may be wrong in the future if we have more than 32 bit addresses. + * Allocation is done at attach time and managed by the following structure. + * + * This could be done easier with the NetBSD bus_dma* functions. They appear + * to be more useful and consistent. + */ +struct fatm_mem { + u_int size; /* size */ + u_int align; /* alignment */ + bus_dma_tag_t dmat; /* DMA tag */ + void *mem; /* memory block */ + bus_addr_t paddr; /* pysical address */ + bus_dmamap_t map; /* map */ +}; + +/* + * Each of these structures describes one receive buffer while the buffer + * is on the card or in the receive return queue. These structures are + * allocated at initialisation time together with the DMA maps. The handle that + * is given to the card is the index into the array of these structures. + */ +struct rbuf { + struct mbuf *m; /* the mbuf while we are on the card */ + bus_dmamap_t map; /* the map */ + LIST_ENTRY(rbuf) link; /* the free list link */ +}; +LIST_HEAD(rbuf_list, rbuf); + +/* + * The driver maintains a list of all open VCCs. Because we + * use only VPI=0 and a maximum VCI of 1024, the list is rather an array + * than a list. We also store the atm pseudoheader flags here and the + * rxhand (aka. protocol block). + */ +struct card_vcc { + void *rxhand; + uint32_t pcr; + uint32_t flags; + uint8_t aal; + uint8_t traffic; +}; + +#define FATM_VCC_OPEN 0x00010000 /* is open */ +#define FATM_VCC_TRY_OPEN 0x00020000 /* is currently opening */ +#define FATM_VCC_TRY_CLOSE 0x00040000 /* is currently closing */ +#define FATM_VCC_BUSY 0x00070000 /* one of the above */ + +/* + * Finally the softc structure + */ +struct fatm_softc { + struct ifatm ifatm; /* common part */ + struct mtx mtx; /* lock this structure */ + struct ifmedia media; /* media */ + + int init_state; /* initialisation step */ + int memid; /* resource id for card memory */ + struct resource *memres; /* resource for card memory */ + bus_space_handle_t memh; /* handle for card memory */ + bus_space_tag_t memt; /* tag for card memory */ + int irqid; /* resource id for interrupt */ + struct resource *irqres; /* resource for interrupt */ + void *ih; /* interrupt handler */ + + bus_dma_tag_t parent_dmat; /* parent DMA tag */ + struct fatm_mem stat_mem; /* memory for status blocks */ + struct fatm_mem txq_mem; /* TX descriptor queue */ + struct fatm_mem rxq_mem; /* RX descriptor queue */ + struct fatm_mem s1q_mem; /* Small buffer 1 queue */ + struct fatm_mem l1q_mem; /* Large buffer 1 queue */ + struct fatm_mem prom_mem; /* PROM memory */ + + struct fqueue txqueue; /* transmission queue */ + struct fqueue rxqueue; /* receive queue */ + struct fqueue s1queue; /* SMALL S1 queue */ + struct fqueue l1queue; /* LARGE S1 queue */ + struct fqueue cmdqueue; /* command queue */ + + /* fields for access to the SUNI registers */ + struct fatm_mem reg_mem; /* DMAable memory for readregs */ + struct cv cv_regs; /* to serialize access to reg_mem */ + + /* fields for access to statistics */ + struct fatm_mem sadi_mem; /* sadistics memory */ + struct cv cv_stat; /* to serialize access to sadi_mem */ + + u_int flags; +#define FATM_STAT_INUSE 0x0001 +#define FATM_REGS_INUSE 0x0002 + u_int txcnt; /* number of used transmit desc */ + int retry_tx; /* keep mbufs in queue if full */ + + struct card_vcc *vccs; /* table of vccs */ + int open_vccs; /* number of vccs in use */ + int small_cnt; /* number of buffers owned by card */ + int large_cnt; /* number of buffers owned by card */ + + /* receiving */ + struct rbuf *rbufs; /* rbuf array */ + struct rbuf_list rbuf_free; /* free rbufs list */ + struct rbuf_list rbuf_used; /* used rbufs list */ + u_int rbuf_total; /* total number of buffs */ + bus_dma_tag_t rbuf_tag; /* tag for rbuf mapping */ + + /* transmission */ + bus_dma_tag_t tx_tag; /* transmission tag */ + + uint32_t heartbeat; /* last heartbeat */ + u_int stop_cnt; /* how many times checked */ + + struct istats istats; /* internal statistics */ + + /* SUNI state */ + struct utopia utopia; + + /* sysctl support */ + struct sysctl_ctx_list sysctl_ctx; + struct sysctl_oid *sysctl_tree; + +#ifdef FATM_DEBUG + /* debugging */ + u_int debug; +#endif +}; + +#ifndef FATM_DEBUG +#define FATM_LOCK(SC) mtx_lock(&(SC)->mtx) +#define FATM_UNLOCK(SC) mtx_unlock(&(SC)->mtx) +#else +#define FATM_LOCK(SC) do { \ + DBG(SC, LOCK, ("locking in line %d", __LINE__)); \ + mtx_lock(&(SC)->mtx); \ + } while (0) +#define FATM_UNLOCK(SC) do { \ + DBG(SC, LOCK, ("unlocking in line %d", __LINE__)); \ + mtx_unlock(&(SC)->mtx); \ + } while (0) +#endif +#define FATM_CHECKLOCK(SC) mtx_assert(&sc->mtx, MA_OWNED) + +/* + * Macros to access host memory fields that are also access by the card. + * These fields need to little-endian always. + */ +#define H_GETSTAT(STATP) (le32toh(*(STATP))) +#define H_SETSTAT(STATP, S) do { *(STATP) = htole32(S); } while (0) +#define H_SETDESC(DESC, D) do { (DESC) = htole32(D); } while (0) + +#ifdef notyet +#define H_SYNCSTAT_POSTREAD(SC, P) \ + bus_dmamap_sync_size((SC)->stat_mem.dmat, \ + (SC)->stat_mem.map, \ + (volatile char *)(P) - (volatile char *)(SC)->stat_mem.mem, \ + sizeof(volatile uint32_t), BUS_DMASYNC_POSTREAD) + +#define H_SYNCSTAT_PREWRITE(SC, P) \ + bus_dmamap_sync_size((SC)->stat_mem.dmat, \ + (SC)->stat_mem.map, \ + (volatile char *)(P) - (volatile char *)(SC)->stat_mem.mem, \ + sizeof(volatile uint32_t), BUS_DMASYNC_PREWRITE) + +#define H_SYNCQ_PREWRITE(M, P, SZ) \ + bus_dmamap_sync_size((M)->dmat, (M)->map, \ + (volatile char *)(P) - (volatile char *)(M)->mem, (SZ), \ + BUS_DMASYNC_PREWRITE) + +#define H_SYNCQ_POSTREAD(M, P, SZ) \ + bus_dmamap_sync_size((M)->dmat, (M)->map, \ + (volatile char *)(P) - (volatile char *)(M)->mem, (SZ), \ + BUS_DMASYNC_POSTREAD) +#else +#define H_SYNCSTAT_POSTREAD(SC, P) do { } while (0) +#define H_SYNCSTAT_PREWRITE(SC, P) do { } while (0) +#define H_SYNCQ_PREWRITE(M, P, SZ) do { } while (0) +#define H_SYNCQ_POSTREAD(M, P, SZ) do { } while (0) +#endif + +/* + * Macros to manipulate VPVCs + */ +#define MKVPVC(VPI,VCI) (((VPI) << 16) | (VCI)) +#define GETVPI(VPVC) (((VPVC) >> 16) & 0xff) +#define GETVCI(VPVC) ((VPVC) & 0xffff) + +/* + * These macros encapsulate the bus_space functions for better readabiliy. + */ +#define WRITE4(SC, OFF, VAL) bus_space_write_4(SC->memt, SC->memh, OFF, VAL) +#define WRITE1(SC, OFF, VAL) bus_space_write_1(SC->memt, SC->memh, OFF, VAL) + +#define READ4(SC, OFF) bus_space_read_4(SC->memt, SC->memh, OFF) +#define READ1(SC, OFF) bus_space_read_1(SC->memt, SC->memh, OFF) + +#define BARRIER_R(SC) \ + bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ + BUS_SPACE_BARRIER_READ) +#define BARRIER_W(SC) \ + bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ + BUS_SPACE_BARRIER_WRITE) +#define BARRIER_RW(SC) \ + bus_space_barrier(SC->memt, SC->memh, 0, FATMO_END, \ + BUS_SPACE_BARRIER_WRITE|BUS_SPACE_BARRIER_READ) + +#ifdef FATM_DEBUG +#define DBG(SC, FL, PRINT) do { \ + if ((SC)->debug & DBG_##FL) { \ + if_printf(&(SC)->ifatm.ifnet, "%s: ", __func__); \ + printf PRINT; \ + printf("\n"); \ + } \ + } while (0) +#define DBGC(SC, FL, PRINT) do { \ + if ((SC)->debug & DBG_##FL) \ + printf PRINT; \ + } while (0) + +enum { + DBG_RCV = 0x0001, + DBG_XMIT = 0x0002, + DBG_VCC = 0x0004, + DBG_IOCTL = 0x0008, + DBG_ATTACH = 0x0010, + DBG_INIT = 0x0020, + DBG_DMA = 0x0040, + DBG_BEAT = 0x0080, + DBG_UART = 0x0100, + DBG_LOCK = 0x0200, + + DBG_ALL = 0xffff +}; + +#else +#define DBG(SC, FL, PRINT) +#define DBGC(SC, FL, PRINT) +#endif + +/* + * Configuration. + * + * This section contains tunable parameters and dependend defines. + */ +#define FATM_CMD_QLEN 16 /* command queue length */ +#ifndef TEST_DMA_SYNC +#define FATM_TX_QLEN 128 /* transmit queue length */ +#define FATM_RX_QLEN 64 /* receive queue length */ +#else +#define FATM_TX_QLEN 8 /* transmit queue length */ +#define FATM_RX_QLEN 8 /* receive queue length */ +#endif + +#define SMALL_SUPPLY_QLEN 16 +#define SMALL_POOL_SIZE 256 +#define SMALL_SUPPLY_BLKSIZE 8 + +#define LARGE_SUPPLY_QLEN 16 +#define LARGE_POOL_SIZE 128 +#define LARGE_SUPPLY_BLKSIZE 8 diff --git a/sys/modules/Makefile b/sys/modules/Makefile index e0aaf6d..5d9d89e 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -30,6 +30,7 @@ SUBDIR= accf_data \ digi \ dummynet \ en \ + fatm \ fdc \ fdescfs \ firewire \ diff --git a/sys/modules/fatm/Makefile b/sys/modules/fatm/Makefile new file mode 100644 index 0000000..f1c5940 --- /dev/null +++ b/sys/modules/fatm/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ +# +# Author: Harti Brandt <harti@freebsd.org> +# +.PATH: ${.CURDIR}/../../dev/fatm + +KMOD= if_fatm +SRCS= if_fatm.c device_if.h bus_if.h pci_if.h opt_inet.h opt_natm.h + +# CFLAGS+= -DFATM_DEBUG=0 -DINVARIANT_SUPPORT -DINVARIANTS -g +# LDFLAGS+= -g + +opt_inet.h: + echo "#define INET 1" > opt_inet.h + +opt_natm.h: + echo "#define NATM 1" > opt_natm.h + +.include <bsd.kmod.mk> |