summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/man/man4/Makefile2
-rw-r--r--share/man/man4/fatm.4106
-rw-r--r--share/man/man4/natm.41
-rw-r--r--share/man/man4/natmip.41
-rw-r--r--sys/conf/NOTES7
-rw-r--r--sys/conf/files1
-rw-r--r--sys/dev/fatm/firmware.h2393
-rw-r--r--sys/dev/fatm/if_fatm.c3083
-rw-r--r--sys/dev/fatm/if_fatm_rate.h294
-rw-r--r--sys/dev/fatm/if_fatmreg.h499
-rw-r--r--sys/dev/fatm/if_fatmvar.h390
-rw-r--r--sys/modules/Makefile1
-rw-r--r--sys/modules/fatm/Makefile19
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>
OpenPOWER on IntegriCloud