diff options
-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> |